From bd9092199bdb7e2ab522be84b949c8ab6beac732 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Fri, 7 Mar 2014 10:55:12 +0100 Subject: [PATCH] Adding float-no-zero branch hosted build --- float-no-zero/apidoc/global.html | 452 + float-no-zero/apidoc/index.html | 169 + float-no-zero/apidoc/ol.Attribution.html | 219 + float-no-zero/apidoc/ol.BrowserFeature.html | 465 + float-no-zero/apidoc/ol.Collection.html | 3584 ++ .../apidoc/ol.DeviceOrientation.html | 2798 ++ float-no-zero/apidoc/ol.Feature.html | 2985 ++ float-no-zero/apidoc/ol.FeatureOverlay.html | 1067 + float-no-zero/apidoc/ol.Geolocation.html | 3467 ++ float-no-zero/apidoc/ol.Kinetic.html | 252 + float-no-zero/apidoc/ol.Map.html | 5639 +++ float-no-zero/apidoc/ol.MapBrowserEvent.html | 304 + float-no-zero/apidoc/ol.Object.html | 2045 + float-no-zero/apidoc/ol.Observable.html | 951 + float-no-zero/apidoc/ol.Overlay.html | 3016 ++ float-no-zero/apidoc/ol.View2D.html | 1700 + float-no-zero/apidoc/ol.animation.html | 678 + .../apidoc/ol.control.Attribution.html | 2306 + float-no-zero/apidoc/ol.control.Control.html | 2284 + .../apidoc/ol.control.FullScreen.html | 2306 + float-no-zero/apidoc/ol.control.Logo.html | 2306 + .../apidoc/ol.control.MousePosition.html | 2764 ++ .../apidoc/ol.control.ScaleLine.html | 2544 ++ float-no-zero/apidoc/ol.control.Zoom.html | 2305 + .../apidoc/ol.control.ZoomSlider.html | 2305 + .../apidoc/ol.control.ZoomToExtent.html | 2305 + float-no-zero/apidoc/ol.control.html | 539 + float-no-zero/apidoc/ol.dom.Input.html | 2548 ++ float-no-zero/apidoc/ol.events.condition.html | 995 + float-no-zero/apidoc/ol.feature_.html | 249 + float-no-zero/apidoc/ol.format.Feature.html | 155 + float-no-zero/apidoc/ol.format.GPX.html | 155 + float-no-zero/apidoc/ol.format.GeoJSON.html | 213 + float-no-zero/apidoc/ol.format.IGC.html | 213 + float-no-zero/apidoc/ol.format.KML.html | 360 + float-no-zero/apidoc/ol.format.TopoJSON.html | 213 + float-no-zero/apidoc/ol.geom.Circle.html | 2182 + float-no-zero/apidoc/ol.geom.Geometry.html | 1205 + .../apidoc/ol.geom.GeometryCollection.html | 1471 + float-no-zero/apidoc/ol.geom.LineString.html | 2080 + float-no-zero/apidoc/ol.geom.LinearRing.html | 1898 + .../apidoc/ol.geom.MultiLineString.html | 2117 + float-no-zero/apidoc/ol.geom.MultiPoint.html | 1898 + .../apidoc/ol.geom.MultiPolygon.html | 2070 + float-no-zero/apidoc/ol.geom.Point.html | 1812 + float-no-zero/apidoc/ol.geom.Polygon.html | 2070 + .../apidoc/ol.geom.SimpleGeometry.html | 1473 + float-no-zero/apidoc/ol.geom.html | 765 + float-no-zero/apidoc/ol.html | 1519 + .../ol.interaction.DoubleClickZoom.html | 219 + .../apidoc/ol.interaction.DragAndDrop.html | 215 + .../apidoc/ol.interaction.DragBox.html | 309 + .../apidoc/ol.interaction.DragPan.html | 219 + .../apidoc/ol.interaction.DragRotate.html | 221 + .../ol.interaction.DragRotateAndZoom.html | 222 + .../apidoc/ol.interaction.DragZoom.html | 326 + float-no-zero/apidoc/ol.interaction.Draw.html | 209 + .../apidoc/ol.interaction.KeyboardPan.html | 227 + .../apidoc/ol.interaction.KeyboardZoom.html | 227 + .../apidoc/ol.interaction.Modify.html | 205 + .../apidoc/ol.interaction.MouseWheelZoom.html | 219 + .../apidoc/ol.interaction.Select.html | 295 + .../apidoc/ol.interaction.TouchPan.html | 220 + .../apidoc/ol.interaction.TouchRotate.html | 220 + .../apidoc/ol.interaction.TouchZoom.html | 220 + float-no-zero/apidoc/ol.interaction.html | 342 + float-no-zero/apidoc/ol.layer.Group.html | 461 + float-no-zero/apidoc/ol.layer.Image.html | 306 + float-no-zero/apidoc/ol.layer.Layer.html | 444 + float-no-zero/apidoc/ol.layer.Tile.html | 748 + float-no-zero/apidoc/ol.layer.Vector.html | 835 + float-no-zero/apidoc/ol.layer.html | 149 + .../apidoc/ol.parser.ogc.WMSCapabilities.html | 213 + float-no-zero/apidoc/ol.proj.Projection.html | 479 + float-no-zero/apidoc/ol.proj.html | 1524 + float-no-zero/apidoc/ol.source.BingMaps.html | 260 + float-no-zero/apidoc/ol.source.GPX.html | 2320 + float-no-zero/apidoc/ol.source.GeoJSON.html | 2320 + float-no-zero/apidoc/ol.source.IGC.html | 2320 + .../apidoc/ol.source.ImageCanvas.html | 205 + .../apidoc/ol.source.ImageStatic.html | 205 + .../apidoc/ol.source.ImageVector.html | 223 + float-no-zero/apidoc/ol.source.ImageWMS.html | 756 + float-no-zero/apidoc/ol.source.KML.html | 2320 + float-no-zero/apidoc/ol.source.MapGuide.html | 205 + float-no-zero/apidoc/ol.source.MapQuest.html | 342 + float-no-zero/apidoc/ol.source.OSM.html | 448 + float-no-zero/apidoc/ol.source.OSMXML.html | 2320 + float-no-zero/apidoc/ol.source.Source.html | 1197 + float-no-zero/apidoc/ol.source.Stamen.html | 332 + float-no-zero/apidoc/ol.source.Tile.html | 1293 + float-no-zero/apidoc/ol.source.TileDebug.html | 1298 + float-no-zero/apidoc/ol.source.TileJSON.html | 205 + float-no-zero/apidoc/ol.source.TileWMS.html | 641 + float-no-zero/apidoc/ol.source.TopoJSON.html | 2320 + float-no-zero/apidoc/ol.source.Vector.html | 2275 + .../apidoc/ol.source.VectorFile.html | 2320 + float-no-zero/apidoc/ol.source.WMTS.html | 574 + float-no-zero/apidoc/ol.source.XYZ.html | 321 + float-no-zero/apidoc/ol.source.Zoomify.html | 215 + float-no-zero/apidoc/ol.source.html | 520 + float-no-zero/apidoc/ol.style.Circle.html | 663 + float-no-zero/apidoc/ol.style.Fill.html | 306 + float-no-zero/apidoc/ol.style.Icon.html | 494 + float-no-zero/apidoc/ol.style.Image.html | 379 + float-no-zero/apidoc/ol.style.Stroke.html | 748 + float-no-zero/apidoc/ol.style.Style.html | 650 + float-no-zero/apidoc/ol.style.Text.html | 923 + .../apidoc/ol.tilegrid.TileGrid.html | 649 + float-no-zero/apidoc/ol.tilegrid.WMTS.html | 761 + float-no-zero/apidoc/ol.tilegrid.XYZ.html | 675 + float-no-zero/apidoc/ol.tilegrid.Zoomify.html | 685 + float-no-zero/apidoc/ol.tilegrid.html | 146 + float-no-zero/apidoc/ol.webgl.Context.html | 450 + float-no-zero/apidoc/olx.animation.html | 842 + float-no-zero/apidoc/olx.control.html | 1974 + float-no-zero/apidoc/olx.format.html | 837 + float-no-zero/apidoc/olx.html | 2275 + float-no-zero/apidoc/olx.interaction.html | 2714 ++ float-no-zero/apidoc/olx.layer.html | 1762 + float-no-zero/apidoc/olx.parser.html | 130 + float-no-zero/apidoc/olx.render.html | 130 + float-no-zero/apidoc/olx.source.html | 6786 +++ float-no-zero/apidoc/olx.style.html | 1476 + float-no-zero/apidoc/olx.tilegrid.html | 799 + .../scripts/prettify/Apache-License-2.0.txt | 202 + .../apidoc/scripts/prettify/lang-css.js | 2 + .../apidoc/scripts/prettify/prettify.js | 28 + float-no-zero/apidoc/styles/jsdoc-default.css | 285 + float-no-zero/apidoc/styles/ol.css | 39 + .../apidoc/styles/prettify-jsdoc.css | 111 + .../apidoc/styles/prettify-tomorrow.css | 132 + float-no-zero/build/ol-deps.js | 1142 + float-no-zero/build/ol-simple.js | 1800 + float-no-zero/build/ol-whitespace.js | 38137 ++++++++++++++++ float-no-zero/build/ol.js | 555 + .../closure/goog/a11y/aria/announcer.js | 108 + .../closure/goog/a11y/aria/aria.js | 362 + .../closure/goog/a11y/aria/attributes.js | 389 + .../closure/goog/a11y/aria/datatables.js | 68 + .../closure/goog/a11y/aria/roles.js | 216 + .../closure/goog/array/array.js | 1507 + .../closure/goog/asserts/asserts.js | 293 + .../closure/goog/async/animationdelay.js | 270 + .../closure/goog/async/conditionaldelay.js | 235 + .../closure/goog/async/delay.js | 177 + .../closure/goog/async/nexttick.js | 174 + .../closure/goog/async/throttle.js | 189 + .../closure-library/closure/goog/base.js | 1593 + .../closure/goog/bootstrap/nodejs.js | 91 + .../closure/goog/bootstrap/webworkers.js | 37 + .../closure/goog/color/alpha.js | 467 + .../closure/goog/color/color.js | 773 + .../closure/goog/color/names.js | 176 + .../closure-library/closure/goog/crypt/aes.js | 1027 + .../closure/goog/crypt/arc4.js | 162 + .../closure/goog/crypt/base64.js | 272 + .../closure/goog/crypt/basen.js | 242 + .../closure/goog/crypt/blobhasher.js | 284 + .../closure/goog/crypt/blockcipher.js | 52 + .../closure-library/closure/goog/crypt/cbc.js | 150 + .../closure/goog/crypt/cbc_test.js | 100 + .../closure/goog/crypt/crypt.js | 155 + .../closure/goog/crypt/hash.js | 62 + .../closure/goog/crypt/hash32.js | 184 + .../closure/goog/crypt/hashtester.js | 243 + .../closure/goog/crypt/hmac.js | 162 + .../closure-library/closure/goog/crypt/md5.js | 429 + .../closure/goog/crypt/pbkdf2.js | 127 + .../closure/goog/crypt/sha1.js | 275 + .../closure/goog/crypt/sha2.js | 275 + .../closure/goog/crypt/sha224.js | 53 + .../closure/goog/crypt/sha256.js | 53 + .../closure/goog/cssom/cssom.js | 449 + .../closure/goog/cssom/iframe/style.js | 1023 + .../closure/goog/datasource/datamanager.js | 559 + .../closure/goog/datasource/datasource.js | 656 + .../closure/goog/datasource/expr.js | 544 + .../closure/goog/datasource/fastdatanode.js | 811 + .../closure/goog/datasource/jsdatasource.js | 460 + .../closure/goog/datasource/jsondatasource.js | 148 + .../goog/datasource/jsxmlhttpdatasource.js | 195 + .../closure/goog/datasource/xmldatasource.js | 415 + .../closure-library/closure/goog/date/date.js | 1718 + .../closure/goog/date/datelike.js | 27 + .../closure/goog/date/daterange.js | 413 + .../closure/goog/date/relative.js | 465 + .../closure/goog/date/utcdatetime.js | 179 + .../closure-library/closure/goog/db/cursor.js | 214 + .../closure-library/closure/goog/db/db.js | 182 + .../closure-library/closure/goog/db/error.js | 359 + .../closure-library/closure/goog/db/index.js | 245 + .../closure/goog/db/indexeddb.js | 337 + .../closure/goog/db/keyrange.js | 117 + .../closure/goog/db/objectstore.js | 399 + .../closure/goog/db/transaction.js | 218 + .../closure/goog/debug/console.js | 207 + .../closure/goog/debug/debug.js | 501 + .../closure/goog/debug/debugwindow.js | 615 + .../closure/goog/debug/devcss/devcss.js | 444 + .../closure/goog/debug/devcss/devcssrunner.js | 26 + .../closure/goog/debug/divconsole.js | 141 + .../closure/goog/debug/entrypointregistry.js | 158 + .../closure/goog/debug/error.js | 51 + .../closure/goog/debug/errorhandler.js | 363 + .../closure/goog/debug/errorhandlerweakdep.js | 38 + .../closure/goog/debug/errorreporter.js | 376 + .../closure/goog/debug/fancywindow.js | 362 + .../closure/goog/debug/formatter.js | 316 + .../closure/goog/debug/fpsdisplay.js | 162 + .../closure/goog/debug/gcdiagnostics.js | 143 + .../closure/goog/debug/logbuffer.js | 147 + .../closure/goog/debug/logger.js | 853 + .../closure/goog/debug/logrecord.js | 271 + .../closure/goog/debug/logrecordserializer.js | 121 + .../closure/goog/debug/reflect.js | 178 + .../goog/debug/relativetimeprovider.js | 83 + .../closure/goog/debug/tracer.js | 724 + .../goog/demos/autocompleteremotedata.js | 18 + .../goog/demos/autocompleterichremotedata.js | 33 + .../closure/goog/demos/editor/deps.js | 21 + .../goog/demos/editor/equationeditor.js | 40 + .../closure/goog/demos/editor/helloworld.js | 81 + .../goog/demos/editor/helloworlddialog.js | 171 + .../demos/editor/helloworlddialogplugin.js | 116 + .../closure/goog/demos/graphics/tigerdata.js | 2841 ++ .../closure/goog/demos/samplecomponent.js | 197 + .../closure/goog/demos/tree/testdata.js | 260 + .../closure/goog/demos/xpc/xpcdemo.js | 307 + .../closure/goog/disposable/disposable.js | 294 + .../closure/goog/disposable/idisposable.js | 45 + .../closure-library/closure/goog/dom/a11y.js | 169 + .../closure/goog/dom/abstractmultirange.js | 77 + .../closure/goog/dom/abstractrange.js | 528 + .../closure/goog/dom/annotate.js | 355 + .../closure/goog/dom/browserfeature.js | 67 + .../goog/dom/browserrange/abstractrange.js | 352 + .../goog/dom/browserrange/browserrange.js | 150 + .../goog/dom/browserrange/geckorange.js | 86 + .../closure/goog/dom/browserrange/ierange.js | 952 + .../goog/dom/browserrange/operarange.js | 83 + .../closure/goog/dom/browserrange/w3crange.js | 365 + .../goog/dom/browserrange/webkitrange.js | 112 + .../goog/dom/bufferedviewportsizemonitor.js | 202 + .../dom/bufferedviewportsizemonitor_test.js | 130 + .../closure/goog/dom/classes.js | 227 + .../closure/goog/dom/classes_test.js | 231 + .../closure/goog/dom/classlist.js | 271 + .../closure/goog/dom/classlist_test.js | 244 + .../closure/goog/dom/controlrange.js | 505 + .../closure/goog/dom/dataset.js | 135 + .../closure-library/closure/goog/dom/dom.js | 2700 ++ .../closure/goog/dom/dom_test.js | 1421 + .../closure/goog/dom/fontsizemonitor.js | 159 + .../closure-library/closure/goog/dom/forms.js | 414 + .../closure/goog/dom/fullscreen.js | 124 + .../closure/goog/dom/iframe.js | 163 + .../closure-library/closure/goog/dom/iter.js | 127 + .../closure/goog/dom/multirange.js | 519 + .../closure/goog/dom/nodeiterator.js | 86 + .../closure/goog/dom/nodeoffset.js | 112 + .../goog/dom/pattern/abstractpattern.js | 60 + .../closure/goog/dom/pattern/allchildren.js | 75 + .../goog/dom/pattern/callback/callback.js | 82 + .../goog/dom/pattern/callback/counter.js | 72 + .../closure/goog/dom/pattern/callback/test.js | 77 + .../closure/goog/dom/pattern/childmatches.js | 154 + .../closure/goog/dom/pattern/endtag.js | 53 + .../closure/goog/dom/pattern/fulltag.js | 93 + .../closure/goog/dom/pattern/matcher.js | 150 + .../closure/goog/dom/pattern/nodetype.js | 58 + .../closure/goog/dom/pattern/pattern.js | 93 + .../closure/goog/dom/pattern/repeat.js | 190 + .../closure/goog/dom/pattern/sequence.js | 141 + .../closure/goog/dom/pattern/starttag.js | 53 + .../closure/goog/dom/pattern/tag.js | 150 + .../closure/goog/dom/pattern/text.js | 70 + .../closure-library/closure/goog/dom/range.js | 226 + .../closure/goog/dom/rangeendpoint.js | 32 + .../closure/goog/dom/savedcaretrange.js | 215 + .../closure/goog/dom/savedrange.js | 74 + .../closure/goog/dom/selection.js | 470 + .../closure/goog/dom/tagiterator.js | 367 + .../closure/goog/dom/tagname.js | 159 + .../closure/goog/dom/textrange.js | 630 + .../closure/goog/dom/textrangeiterator.js | 244 + .../closure/goog/dom/vendor.js | 62 + .../closure/goog/dom/viewportsizemonitor.js | 180 + .../closure-library/closure/goog/dom/xml.js | 204 + .../closure/goog/editor/browserfeature.js | 273 + .../closure/goog/editor/clicktoeditwrapper.js | 435 + .../closure/goog/editor/command.js | 76 + .../goog/editor/contenteditablefield.js | 110 + .../closure/goog/editor/defines.js | 34 + .../closure/goog/editor/field.js | 2725 ++ .../closure/goog/editor/field_test.js | 1278 + .../closure/goog/editor/focus.js | 32 + .../closure/goog/editor/icontent.js | 296 + .../closure/goog/editor/link.js | 359 + .../closure/goog/editor/node.js | 483 + .../closure/goog/editor/plugin.js | 463 + .../editor/plugins/abstractbubbleplugin.js | 630 + .../editor/plugins/abstractdialogplugin.js | 334 + .../goog/editor/plugins/abstracttabhandler.js | 78 + .../goog/editor/plugins/basictextformatter.js | 1750 + .../closure/goog/editor/plugins/blockquote.js | 479 + .../closure/goog/editor/plugins/emoticons.js | 88 + .../goog/editor/plugins/enterhandler.js | 767 + .../editor/plugins/equationeditorbubble.js | 153 + .../editor/plugins/equationeditorplugin.js | 215 + .../goog/editor/plugins/firststrong.js | 326 + .../goog/editor/plugins/headerformatter.js | 95 + .../closure/goog/editor/plugins/linkbubble.js | 562 + .../goog/editor/plugins/linkdialogplugin.js | 437 + .../goog/editor/plugins/linkshortcutplugin.js | 63 + .../goog/editor/plugins/listtabhandler.js | 66 + .../closure/goog/editor/plugins/loremipsum.js | 188 + .../goog/editor/plugins/removeformatting.js | 779 + .../goog/editor/plugins/spacestabhandler.js | 93 + .../goog/editor/plugins/tableeditor.js | 472 + .../goog/editor/plugins/tagonenterhandler.js | 742 + .../closure/goog/editor/plugins/undoredo.js | 1015 + .../goog/editor/plugins/undoredomanager.js | 337 + .../goog/editor/plugins/undoredostate.js | 86 + .../closure/goog/editor/range.js | 632 + .../closure/goog/editor/seamlessfield.js | 738 + .../closure/goog/editor/seamlessfield_test.js | 472 + .../closure/goog/editor/style.js | 222 + .../closure/goog/editor/table.js | 567 + .../closure/goog/events/actioneventwrapper.js | 136 + .../closure/goog/events/actionhandler.js | 181 + .../closure/goog/events/browserevent.js | 411 + .../closure/goog/events/browserfeature.js | 85 + .../closure/goog/events/event.js | 154 + .../closure/goog/events/eventhandler.js | 291 + .../closure/goog/events/events.js | 1095 + .../closure/goog/events/eventtarget.js | 401 + .../closure/goog/events/eventtargettester.js | 1028 + .../closure/goog/events/eventtype.js | 165 + .../closure/goog/events/eventwrapper.js | 66 + .../closure/goog/events/filedrophandler.js | 221 + .../closure/goog/events/focushandler.js | 106 + .../closure/goog/events/imehandler.js | 363 + .../closure/goog/events/inputhandler.js | 213 + .../closure/goog/events/keycodes.js | 377 + .../closure/goog/events/keyhandler.js | 556 + .../closure/goog/events/keynames.js | 132 + .../closure/goog/events/listenable.js | 323 + .../closure/goog/events/listener.js | 131 + .../closure/goog/events/listenermap.js | 299 + .../closure/goog/events/listenermap_test.js | 116 + .../closure/goog/events/mousewheelhandler.js | 295 + .../closure/goog/events/onlinehandler.js | 162 + .../closure/goog/events/pastehandler.js | 515 + .../closure/goog/format/emailaddress.js | 332 + .../closure/goog/format/format.js | 491 + .../closure/goog/format/htmlprettyprinter.js | 407 + .../closure/goog/format/jsonprettyprinter.js | 413 + .../closure-library/closure/goog/fs/entry.js | 272 + .../closure/goog/fs/entryimpl.js | 399 + .../closure-library/closure/goog/fs/error.js | 102 + .../closure/goog/fs/filereader.js | 288 + .../closure/goog/fs/filesaver.js | 176 + .../closure/goog/fs/filesystem.js | 41 + .../closure/goog/fs/filesystemimpl.js | 64 + .../closure/goog/fs/filewriter.js | 110 + .../closure-library/closure/goog/fs/fs.js | 253 + .../closure/goog/fs/progressevent.js | 68 + .../closure/goog/functions/functions.js | 255 + .../closure/goog/fx/abstractdragdrop.js | 1517 + .../closure/goog/fx/anim/anim.js | 210 + .../closure/goog/fx/animation.js | 530 + .../closure/goog/fx/animationqueue.js | 307 + .../closure/goog/fx/css3/fx.js | 62 + .../closure/goog/fx/css3/transition.js | 196 + .../closure/goog/fx/cssspriteanimation.js | 113 + .../closure-library/closure/goog/fx/dom.js | 653 + .../closure/goog/fx/dragdrop.js | 50 + .../closure/goog/fx/dragdropgroup.js | 109 + .../closure/goog/fx/dragger.js | 795 + .../closure/goog/fx/draglistgroup.js | 1301 + .../closure/goog/fx/dragscrollsupport.js | 299 + .../closure-library/closure/goog/fx/easing.js | 50 + .../closure-library/closure/goog/fx/fx.js | 32 + .../closure/goog/fx/transition.js | 75 + .../closure/goog/fx/transitionbase.js | 237 + .../closure/goog/gears/basestore.js | 521 + .../closure/goog/gears/database.js | 934 + .../closure/goog/gears/gears.js | 228 + .../closure/goog/gears/httprequest.js | 80 + .../closure/goog/gears/loggerclient.js | 130 + .../closure/goog/gears/loggerserver.js | 157 + .../closure/goog/gears/logstore.js | 478 + .../goog/gears/managedresourcestore.js | 555 + .../closure/goog/gears/multipartformdata.js | 204 + .../closure/goog/gears/statustype.js | 37 + .../closure/goog/gears/urlcapture.js | 370 + .../closure/goog/gears/worker.js | 200 + .../closure/goog/gears/workerchannel.js | 205 + .../closure/goog/gears/workerpool.js | 240 + .../closure/goog/graphics/abstractgraphics.js | 441 + .../closure/goog/graphics/affinetransform.js | 587 + .../closure/goog/graphics/canvaselement.js | 792 + .../closure/goog/graphics/canvasgraphics.js | 665 + .../closure/goog/graphics/element.js | 151 + .../closure/goog/graphics/ellipseelement.js | 64 + .../closure/goog/graphics/ext/coordinates.js | 159 + .../closure/goog/graphics/ext/element.js | 968 + .../closure/goog/graphics/ext/ellipse.js | 59 + .../closure/goog/graphics/ext/ext.js | 29 + .../closure/goog/graphics/ext/graphics.js | 215 + .../closure/goog/graphics/ext/group.js | 215 + .../closure/goog/graphics/ext/image.js | 63 + .../closure/goog/graphics/ext/path.js | 142 + .../closure/goog/graphics/ext/rectangle.js | 54 + .../closure/goog/graphics/ext/shape.js | 146 + .../goog/graphics/ext/strokeandfillelement.js | 70 + .../closure/goog/graphics/fill.js | 46 + .../closure/goog/graphics/font.js | 63 + .../closure/goog/graphics/graphics.js | 135 + .../closure/goog/graphics/groupelement.js | 59 + .../closure/goog/graphics/imageelement.js | 70 + .../closure/goog/graphics/lineargradient.js | 174 + .../closure/goog/graphics/path.js | 512 + .../closure/goog/graphics/pathelement.js | 55 + .../closure/goog/graphics/paths.js | 86 + .../closure/goog/graphics/rectelement.js | 64 + .../closure/goog/graphics/solidfill.js | 74 + .../closure/goog/graphics/stroke.js | 67 + .../goog/graphics/strokeandfillelement.js | 115 + .../closure/goog/graphics/svgelement.js | 279 + .../closure/goog/graphics/svggraphics.js | 857 + .../closure/goog/graphics/textelement.js | 56 + .../closure/goog/graphics/vmlelement.js | 433 + .../closure/goog/graphics/vmlgraphics.js | 893 + .../closure/goog/history/event.js | 54 + .../closure/goog/history/eventtype.js | 30 + .../closure/goog/history/history.js | 998 + .../closure/goog/history/history_test.js | 54 + .../closure/goog/history/html5history.js | 303 + .../closure-library/closure/goog/i18n/bidi.js | 806 + .../closure/goog/i18n/bidiformatter.js | 490 + .../closure/goog/i18n/charlistdecompressor.js | 157 + .../closure/goog/i18n/charpickerdata.js | 3185 ++ .../closure/goog/i18n/collation.js | 58 + .../goog/i18n/compactnumberformatsymbols.js | 7973 ++++ .../i18n/compactnumberformatsymbols_ext.js | 27549 +++++++++++ .../closure/goog/i18n/currency.js | 424 + .../closure/goog/i18n/currencycodemap.js | 210 + .../closure/goog/i18n/datetimeformat.js | 673 + .../closure/goog/i18n/datetimeparse.js | 1129 + .../closure/goog/i18n/datetimepatterns.js | 1854 + .../closure/goog/i18n/datetimepatternsext.js | 10947 +++++ .../closure/goog/i18n/datetimesymbols.js | 3713 ++ .../closure/goog/i18n/datetimesymbolsext.js | 21152 +++++++++ .../closure/goog/i18n/graphemebreak.js | 214 + .../closure/goog/i18n/messageformat.js | 771 + .../closure-library/closure/goog/i18n/mime.js | 111 + .../closure/goog/i18n/numberformat.js | 1228 + .../closure/goog/i18n/numberformatsymbols.js | 3416 ++ .../goog/i18n/numberformatsymbolsext.js | 11887 +++++ .../closure/goog/i18n/ordinalrules.js | 589 + .../closure/goog/i18n/pluralrules.js | 859 + .../closure/goog/i18n/timezone.js | 340 + .../closure/goog/i18n/uchar.js | 1368 + .../goog/i18n/uchar/localnamefetcher.js | 73 + .../closure/goog/i18n/uchar/namefetcher.js | 70 + .../goog/i18n/uchar/remotenamefetcher.js | 281 + .../closure-library/closure/goog/iter/iter.js | 702 + .../closure/goog/json/evaljsonprocessor.js | 66 + .../closure-library/closure/goog/json/json.js | 349 + .../closure/goog/json/nativejsonprocessor.js | 73 + .../closure/goog/json/processor.js | 33 + .../closure/goog/labs/classdef/classdef.js | 162 + .../closure/goog/labs/events/touch.js | 82 + .../closure/goog/labs/events/touch_test.js | 96 + .../closure/goog/labs/format/csv.js | 391 + .../closure/goog/labs/format/csv_test.js | 169 + .../closure/goog/labs/mock/mock.js | 733 + .../closure/goog/labs/net/image.js | 93 + .../closure/goog/labs/net/image_test.js | 128 + .../closure/goog/labs/net/webchannel.js | 188 + .../labs/net/webchannel/basetestchannel.js | 639 + .../goog/labs/net/webchannel/channel.js | 195 + .../goog/labs/net/webchannel/requeststats.js | 391 + .../labs/net/webchannel/webchannelbase.js | 2171 + .../net/webchannel/webchannelbase_test.js | 1400 + .../net/webchannel/webchannelbasetransport.js | 274 + .../labs/net/webchannel/webchanneldebug.js | 298 + .../labs/net/webchannel/webchannelrequest.js | 1291 + .../goog/labs/net/webchanneltransport.js | 74 + .../labs/net/webchanneltransportfactory.js | 35 + .../closure/goog/labs/net/xhr.js | 449 + .../closure/goog/labs/object/object.js | 46 + .../closure/goog/labs/observe/notice.js | 63 + .../closure/goog/labs/observe/observable.js | 77 + .../goog/labs/observe/observableset.js | 180 + .../goog/labs/observe/observationset.js | 156 + .../closure/goog/labs/observe/observer.js | 100 + .../goog/labs/observe/simpleobservable.js | 129 + .../closure/goog/labs/structs/map.js | 339 + .../closure/goog/labs/structs/map_perf.js | 201 + .../closure/goog/labs/structs/multimap.js | 279 + .../goog/labs/style/pixeldensitymonitor.js | 178 + .../labs/style/pixeldensitymonitor_test.js | 146 + .../closure/goog/labs/testing/assertthat.js | 59 + .../goog/labs/testing/decoratormatcher.js | 94 + .../goog/labs/testing/dictionarymatcher.js | 266 + .../closure/goog/labs/testing/logicmatcher.js | 206 + .../closure/goog/labs/testing/matcher.js | 51 + .../goog/labs/testing/numbermatcher.js | 334 + .../goog/labs/testing/objectmatcher.js | 306 + .../goog/labs/testing/stringmatcher.js | 402 + .../closure/goog/labs/useragent/browser.js | 189 + .../goog/labs/useragent/browser_test.js | 193 + .../closure/goog/labs/useragent/device.js | 64 + .../goog/labs/useragent/device_test.js | 88 + .../closure/goog/labs/useragent/engine.js | 144 + .../goog/labs/useragent/engine_test.js | 164 + .../closure/goog/labs/useragent/platform.js | 193 + .../goog/labs/useragent/platform_test.js | 256 + .../goog/labs/useragent/test_agents.js | 272 + .../closure/goog/labs/useragent/util.js | 89 + .../closure/goog/labs/useragent/util_test.js | 60 + .../closure/goog/locale/countries.js | 291 + .../goog/locale/defaultlocalenameconstants.js | 907 + .../closure/goog/locale/genericfontnames.js | 73 + .../goog/locale/genericfontnamesdata.js | 327 + .../closure/goog/locale/locale.js | 403 + .../goog/locale/nativenameconstants.js | 1354 + .../closure/goog/locale/scriptToLanguages.js | 482 + .../closure/goog/locale/timezonedetection.js | 117 + .../goog/locale/timezonefingerprint.js | 248 + .../closure/goog/locale/timezonelist.js | 131 + .../closure-library/closure/goog/log/log.js | 183 + .../closure/goog/log/log_test.js | 169 + .../closure/goog/math/bezier.js | 311 + .../closure-library/closure/goog/math/box.js | 369 + .../closure/goog/math/coordinate.js | 233 + .../closure/goog/math/coordinate3.js | 169 + .../closure/goog/math/exponentialbackoff.js | 103 + .../closure/goog/math/integer.js | 737 + .../goog/math/interpolator/interpolator1.js | 64 + .../closure/goog/math/interpolator/linear1.js | 82 + .../closure/goog/math/interpolator/pchip1.js | 81 + .../closure/goog/math/interpolator/spline1.js | 202 + .../closure-library/closure/goog/math/line.js | 177 + .../closure-library/closure/goog/math/long.js | 802 + .../closure-library/closure/goog/math/math.js | 387 + .../closure/goog/math/matrix.js | 675 + .../closure/goog/math/range.js | 144 + .../closure/goog/math/rangeset.js | 394 + .../closure-library/closure/goog/math/rect.js | 463 + .../closure-library/closure/goog/math/size.js | 206 + .../closure-library/closure/goog/math/tdma.js | 73 + .../closure-library/closure/goog/math/vec2.js | 283 + .../closure-library/closure/goog/math/vec3.js | 308 + .../closure/goog/memoize/memoize.js | 102 + .../closure/goog/messaging/abstractchannel.js | 210 + .../closure/goog/messaging/bufferedchannel.js | 287 + .../closure/goog/messaging/deferredchannel.js | 98 + .../closure/goog/messaging/loggerclient.js | 131 + .../closure/goog/messaging/loggerserver.js | 98 + .../closure/goog/messaging/messagechannel.js | 116 + .../closure/goog/messaging/messaging.js | 34 + .../closure/goog/messaging/multichannel.js | 302 + .../closure/goog/messaging/portcaller.js | 151 + .../closure/goog/messaging/portchannel.js | 401 + .../closure/goog/messaging/portnetwork.js | 78 + .../closure/goog/messaging/portoperator.js | 197 + .../goog/messaging/respondingchannel.js | 236 + .../messaging/testdata/portchannel_worker.js | 37 + .../messaging/testdata/portnetwork_worker1.js | 32 + .../messaging/testdata/portnetwork_worker2.js | 32 + .../goog/module/abstractmoduleloader.js | 56 + .../closure/goog/module/basemodule.js | 45 + .../closure/goog/module/loader.js | 269 + .../closure/goog/module/module.js | 166 + .../closure/goog/module/moduleinfo.js | 335 + .../closure/goog/module/moduleloadcallback.js | 84 + .../closure/goog/module/moduleloader.js | 462 + .../closure/goog/module/moduleloader_test.js | 438 + .../closure/goog/module/modulemanager.js | 1370 + .../closure/goog/module/testdata/modA_1.js | 23 + .../closure/goog/module/testdata/modA_2.js | 27 + .../closure/goog/module/testdata/modB_1.js | 31 + .../closure/goog/net/browserchannel.js | 2757 ++ .../closure/goog/net/browsertestchannel.js | 618 + .../closure/goog/net/bulkloader.js | 181 + .../closure/goog/net/bulkloaderhelper.js | 127 + .../closure/goog/net/channeldebug.js | 300 + .../closure/goog/net/channelrequest.js | 1312 + .../closure/goog/net/cookies.js | 370 + .../closure/goog/net/crossdomainrpc.js | 849 + .../closure/goog/net/errorcode.js | 130 + .../closure/goog/net/eventtype.js | 37 + .../closure/goog/net/filedownloader.js | 743 + .../closure/goog/net/httpstatus.js | 111 + .../closure/goog/net/iframeio.js | 1355 + .../closure/goog/net/iframeloadmonitor.js | 200 + .../closure/goog/net/imageloader.js | 292 + .../closure/goog/net/ipaddress.js | 511 + .../closure/goog/net/jsloader.js | 366 + .../closure-library/closure/goog/net/jsonp.js | 338 + .../closure/goog/net/mockiframeio.js | 319 + .../goog/net/multiiframeloadmonitor.js | 117 + .../closure/goog/net/networkstatusmonitor.js | 47 + .../closure/goog/net/networktester.js | 383 + .../goog/net/testdata/jsloader_test1.js | 23 + .../goog/net/testdata/jsloader_test2.js | 23 + .../goog/net/testdata/jsloader_test3.js | 23 + .../goog/net/testdata/jsloader_test4.js | 23 + .../closure/goog/net/tmpnetwork.js | 164 + .../closure/goog/net/websocket.js | 505 + .../closure/goog/net/wrapperxmlhttpfactory.js | 68 + .../closure-library/closure/goog/net/xhrio.js | 1191 + .../closure/goog/net/xhriopool.js | 80 + .../closure/goog/net/xhrmanager.js | 787 + .../closure/goog/net/xmlhttp.js | 228 + .../closure/goog/net/xmlhttpfactory.js | 64 + .../closure/goog/net/xpc/crosspagechannel.js | 805 + .../goog/net/xpc/crosspagechannelrole.js | 30 + .../net/xpc/frameelementmethodtransport.js | 254 + .../goog/net/xpc/iframepollingtransport.js | 921 + .../goog/net/xpc/iframerelaytransport.js | 394 + .../goog/net/xpc/nativemessagingtransport.js | 649 + .../closure/goog/net/xpc/nixtransport.js | 479 + .../closure/goog/net/xpc/relay.js | 72 + .../closure/goog/net/xpc/transport.js | 105 + .../closure/goog/net/xpc/xpc.js | 293 + .../closure/goog/object/object.js | 635 + .../goog/positioning/absoluteposition.js | 74 + .../goog/positioning/abstractposition.js | 48 + .../goog/positioning/anchoredposition.js | 92 + .../positioning/anchoredviewportposition.js | 191 + .../goog/positioning/clientposition.js | 88 + .../goog/positioning/clientposition_test.js | 122 + .../goog/positioning/menuanchoredposition.js | 71 + .../closure/goog/positioning/positioning.js | 557 + .../goog/positioning/positioning_test.js | 1168 + .../positioning/viewportclientposition.js | 121 + .../goog/positioning/viewportposition.js | 64 + .../closure/goog/proto/proto.js | 44 + .../closure/goog/proto/serializer.js | 69 + .../closure/goog/proto2/descriptor.js | 200 + .../closure/goog/proto2/fielddescriptor.js | 291 + .../closure/goog/proto2/lazydeserializer.js | 70 + .../closure/goog/proto2/message.js | 840 + .../closure/goog/proto2/objectserializer.js | 159 + .../closure/goog/proto2/package_test.pb.js | 166 + .../closure/goog/proto2/pbliteserializer.js | 193 + .../closure/goog/proto2/serializer.js | 174 + .../closure/goog/proto2/test.pb.js | 2876 ++ .../goog/proto2/textformatserializer.js | 995 + .../goog/proto2/textformatserializer_test.js | 629 + .../closure/goog/proto2/util.js | 54 + .../closure/goog/pubsub/pubsub.js | 326 + .../closure/goog/reflect/reflect.js | 77 + .../closure/goog/result/deferredadaptor.js | 57 + .../closure/goog/result/dependentresult.js | 44 + .../closure/goog/result/result_interface.js | 109 + .../closure/goog/result/resultutil.js | 550 + .../closure/goog/result/simpleresult.js | 217 + .../closure-library/closure/goog/soy/data.js | 132 + .../closure/goog/soy/renderer.js | 266 + .../closure-library/closure/goog/soy/soy.js | 205 + .../closure/goog/soy/soy_test.js | 175 + .../closure/goog/spell/spellcheck.js | 475 + .../closure/goog/stats/basicstat.js | 271 + .../goog/storage/collectablestorage.js | 100 + .../closure/goog/storage/encryptedstorage.js | 201 + .../closure/goog/storage/errorcode.js | 30 + .../closure/goog/storage/expiringstorage.js | 142 + .../goog/storage/mechanism/errorcode.js | 31 + .../mechanism/errorhandlingmechanism.js | 128 + .../storage/mechanism/html5localstorage.js | 45 + .../storage/mechanism/html5sessionstorage.js | 46 + .../goog/storage/mechanism/html5webstorage.js | 176 + .../goog/storage/mechanism/ieuserdata.js | 283 + .../storage/mechanism/iterablemechanism.js | 86 + .../mechanism/iterablemechanismtester.js | 117 + .../goog/storage/mechanism/mechanism.js | 56 + .../storage/mechanism/mechanismfactory.js | 113 + .../mechanism/mechanismseparationtester.js | 91 + .../mechanism/mechanismsharingtester.js | 87 + .../goog/storage/mechanism/mechanismtester.js | 200 + .../storage/mechanism/prefixedmechanism.js | 97 + .../closure/goog/storage/richstorage.js | 149 + .../closure/goog/storage/storage.js | 111 + .../closure/goog/storage/storage_test.js | 60 + .../closure/goog/string/linkify.js | 236 + .../closure/goog/string/newlines.js | 153 + .../closure/goog/string/newlines_test.js | 87 + .../closure/goog/string/parser.js | 38 + .../closure/goog/string/path.js | 169 + .../closure/goog/string/string.js | 1378 + .../closure/goog/string/string_test.js | 1173 + .../closure/goog/string/stringbuffer.js | 103 + .../closure/goog/string/stringformat.js | 251 + .../closure/goog/string/stringifier.js | 38 + .../closure/goog/structs/avltree.js | 835 + .../closure/goog/structs/circularbuffer.js | 223 + .../closure/goog/structs/collection.js | 55 + .../closure/goog/structs/heap.js | 333 + .../closure/goog/structs/inversionmap.js | 159 + .../closure/goog/structs/linkedmap.js | 473 + .../closure/goog/structs/map.js | 449 + .../closure/goog/structs/node.js | 74 + .../closure/goog/structs/pool.js | 381 + .../closure/goog/structs/prioritypool.js | 184 + .../closure/goog/structs/priorityqueue.js | 64 + .../closure/goog/structs/quadtree.js | 571 + .../closure/goog/structs/queue.js | 157 + .../closure/goog/structs/set.js | 274 + .../closure/goog/structs/simplepool.js | 205 + .../closure/goog/structs/stringset.js | 403 + .../closure/goog/structs/structs.js | 351 + .../closure/goog/structs/treenode.js | 428 + .../closure/goog/structs/trie.js | 368 + .../closure/goog/style/bidi.js | 182 + .../closure/goog/style/cursor.js | 115 + .../closure/goog/style/style.js | 2087 + .../closure/goog/style/style_test.js | 2602 ++ .../goog/style/stylescrollbartester.js | 78 + .../closure/goog/style/transition.js | 138 + .../closure/goog/testing/asserts.js | 1243 + .../closure/goog/testing/async/mockcontrol.js | 174 + .../closure/goog/testing/asynctestcase.js | 824 + .../closure/goog/testing/benchmark.js | 88 + .../goog/testing/continuationtestcase.js | 689 + .../closure/goog/testing/deferredtestcase.js | 155 + .../closure/goog/testing/dom.js | 608 + .../closure/goog/testing/editor/dom.js | 293 + .../closure/goog/testing/editor/fieldmock.js | 99 + .../closure/goog/testing/editor/testhelper.js | 176 + .../goog/testing/events/eventobserver.js | 86 + .../closure/goog/testing/events/events.js | 713 + .../closure/goog/testing/events/matchers.js | 41 + .../goog/testing/events/onlinehandler.js | 64 + .../closure/goog/testing/expectedfailures.js | 236 + .../closure/goog/testing/fs/blob.js | 116 + .../closure/goog/testing/fs/entry.js | 621 + .../closure/goog/testing/fs/file.js | 52 + .../closure/goog/testing/fs/filereader.js | 272 + .../closure/goog/testing/fs/filesystem.js | 63 + .../closure/goog/testing/fs/filewriter.js | 261 + .../closure/goog/testing/fs/fs.js | 147 + .../closure/goog/testing/fs/progressevent.js | 81 + .../closure/goog/testing/functionmock.js | 177 + .../closure/goog/testing/graphics.js | 64 + .../closure/goog/testing/i18n/asserts.js | 77 + .../closure/goog/testing/i18n/asserts_test.js | 67 + .../closure/goog/testing/jsunit.js | 156 + .../closure/goog/testing/loosemock.js | 240 + .../testing/messaging/mockmessagechannel.js | 79 + .../testing/messaging/mockmessageevent.js | 100 + .../goog/testing/messaging/mockmessageport.js | 85 + .../goog/testing/messaging/mockportnetwork.js | 65 + .../closure/goog/testing/mock.js | 619 + .../closure/goog/testing/mockclassfactory.js | 578 + .../closure/goog/testing/mockclock.js | 520 + .../closure/goog/testing/mockcontrol.js | 219 + .../closure/goog/testing/mockinterface.js | 45 + .../closure/goog/testing/mockmatchers.js | 395 + .../closure/goog/testing/mockrandom.js | 126 + .../closure/goog/testing/mockrange.js | 66 + .../closure/goog/testing/mockstorage.js | 107 + .../closure/goog/testing/mockuseragent.js | 141 + .../closure/goog/testing/multitestrunner.js | 1439 + .../closure/goog/testing/net/xhrio.js | 709 + .../closure/goog/testing/net/xhriopool.js | 64 + .../goog/testing/objectpropertystring.js | 67 + .../closure/goog/testing/performancetable.js | 190 + .../closure/goog/testing/performancetimer.js | 405 + .../closure/goog/testing/propertyreplacer.js | 243 + .../closure/goog/testing/proto2/proto2.js | 127 + .../closure/goog/testing/pseudorandom.js | 179 + .../closure/goog/testing/recordfunction.js | 201 + .../closure/goog/testing/shardingtestcase.js | 122 + .../closure/goog/testing/singleton.js | 46 + .../closure/goog/testing/stacktrace.js | 555 + .../goog/testing/storage/fakemechanism.js | 66 + .../closure/goog/testing/strictmock.js | 128 + .../goog/testing/style/layoutasserts.js | 310 + .../closure/goog/testing/style/style.js | 101 + .../closure/goog/testing/testcase.js | 1233 + .../closure/goog/testing/testqueue.js | 66 + .../closure/goog/testing/testrunner.js | 399 + .../goog/testing/ui/rendererasserts.js | 56 + .../goog/testing/ui/rendererharness.js | 176 + .../closure/goog/testing/ui/style.js | 137 + .../closure/goog/timer/timer.js | 291 + .../closure/goog/tweak/entries.js | 997 + .../closure/goog/tweak/registry.js | 310 + .../closure/goog/tweak/testhelpers.js | 119 + .../closure/goog/tweak/tweak.js | 301 + .../closure/goog/tweak/tweakui.js | 817 + .../closure/goog/ui/abstractspellchecker.js | 1138 + .../closure-library/closure/goog/ui/ac/ac.js | 50 + .../closure/goog/ui/ac/arraymatcher.js | 162 + .../closure/goog/ui/ac/autocomplete.js | 919 + .../closure/goog/ui/ac/inputhandler.js | 1308 + .../closure/goog/ui/ac/remote.js | 114 + .../closure/goog/ui/ac/remotearraymatcher.js | 271 + .../closure/goog/ui/ac/renderer.js | 1023 + .../closure/goog/ui/ac/renderoptions.js | 80 + .../closure/goog/ui/ac/richinputhandler.js | 58 + .../closure/goog/ui/ac/richremote.js | 107 + .../goog/ui/ac/richremotearraymatcher.js | 125 + .../closure/goog/ui/activitymonitor.js | 347 + .../closure/goog/ui/advancedtooltip.js | 366 + .../closure/goog/ui/animatedzippy.js | 199 + .../closure/goog/ui/attachablemenu.js | 473 + .../closure/goog/ui/bidiinput.js | 178 + .../closure-library/closure/goog/ui/bubble.js | 472 + .../closure-library/closure/goog/ui/button.js | 213 + .../closure/goog/ui/buttonrenderer.js | 214 + .../closure/goog/ui/buttonside.js | 41 + .../closure/goog/ui/charcounter.js | 199 + .../closure/goog/ui/charpicker.js | 880 + .../closure/goog/ui/checkbox.js | 269 + .../closure/goog/ui/checkboxmenuitem.js | 53 + .../closure/goog/ui/checkboxrenderer.js | 171 + .../closure/goog/ui/colorbutton.js | 58 + .../closure/goog/ui/colorbuttonrenderer.js | 72 + .../closure/goog/ui/colormenubutton.js | 215 + .../goog/ui/colormenubuttonrenderer.js | 144 + .../closure/goog/ui/colorpalette.js | 177 + .../closure/goog/ui/colorpicker.js | 344 + .../closure/goog/ui/colorsplitbehavior.js | 60 + .../closure/goog/ui/combobox.js | 961 + .../closure/goog/ui/component.js | 1300 + .../closure/goog/ui/container.js | 1322 + .../closure/goog/ui/containerrenderer.js | 371 + .../closure/goog/ui/containerscroller.js | 222 + .../closure/goog/ui/control.js | 1387 + .../closure/goog/ui/controlcontent.js | 28 + .../closure/goog/ui/controlrenderer.js | 855 + .../closure/goog/ui/cookieeditor.js | 183 + .../closure/goog/ui/css3buttonrenderer.js | 152 + .../closure/goog/ui/css3menubuttonrenderer.js | 147 + .../closure/goog/ui/cssnames.js | 29 + .../closure/goog/ui/custombutton.js | 58 + .../closure/goog/ui/custombuttonrenderer.js | 267 + .../closure/goog/ui/customcolorpalette.js | 139 + .../closure/goog/ui/datepicker.js | 1369 + .../closure/goog/ui/datepickerrenderer.js | 55 + .../closure/goog/ui/decorate.js | 38 + .../goog/ui/defaultdatepickerrenderer.js | 202 + .../closure-library/closure/goog/ui/dialog.js | 1556 + .../closure/goog/ui/dimensionpicker.js | 305 + .../goog/ui/dimensionpickerrenderer.js | 416 + .../closure/goog/ui/dragdropdetector.js | 642 + .../closure/goog/ui/drilldownrow.js | 486 + .../closure/goog/ui/editor/abstractdialog.js | 440 + .../closure/goog/ui/editor/bubble.js | 525 + .../closure/goog/ui/editor/defaulttoolbar.js | 1065 + .../goog/ui/editor/equationeditordialog.js | 123 + .../goog/ui/editor/equationeditorokevent.js | 49 + .../closure/goog/ui/editor/linkdialog.js | 1064 + .../closure/goog/ui/editor/messages.js | 123 + .../closure/goog/ui/editor/tabpane.js | 198 + .../goog/ui/editor/toolbarcontroller.js | 295 + .../closure/goog/ui/editor/toolbarfactory.js | 440 + .../closure/goog/ui/emoji/emoji.js | 72 + .../closure/goog/ui/emoji/emojipalette.js | 288 + .../goog/ui/emoji/emojipaletterenderer.js | 208 + .../closure/goog/ui/emoji/emojipicker.js | 804 + .../closure/goog/ui/emoji/popupemojipicker.js | 410 + .../emoji/progressiveemojipaletterenderer.js | 98 + .../closure/goog/ui/emoji/spriteinfo.js | 212 + .../closure/goog/ui/equation/arrowpalette.js | 47 + .../closure/goog/ui/equation/changeevent.js | 37 + .../goog/ui/equation/comparisonpalette.js | 56 + .../closure/goog/ui/equation/editorpane.js | 93 + .../goog/ui/equation/equationeditor.js | 220 + .../goog/ui/equation/equationeditordialog.js | 137 + .../closure/goog/ui/equation/greekpalette.js | 75 + .../closure/goog/ui/equation/imagerenderer.js | 190 + .../closure/goog/ui/equation/mathpalette.js | 55 + .../closure/goog/ui/equation/menupalette.js | 86 + .../closure/goog/ui/equation/palette.js | 288 + .../goog/ui/equation/palettemanager.js | 203 + .../closure/goog/ui/equation/symbolpalette.js | 74 + .../closure/goog/ui/equation/texeditor.js | 141 + .../closure/goog/ui/equation/texpane.js | 444 + .../closure/goog/ui/filteredmenu.js | 575 + .../goog/ui/filterobservingmenuitem.js | 97 + .../ui/filterobservingmenuitemrenderer.js | 62 + .../closure/goog/ui/flatbuttonrenderer.js | 146 + .../closure/goog/ui/flatmenubuttonrenderer.js | 238 + .../closure/goog/ui/formpost.js | 109 + .../closure-library/closure/goog/ui/gauge.js | 1011 + .../closure/goog/ui/gaugetheme.js | 169 + .../closure/goog/ui/hovercard.js | 456 + .../closure/goog/ui/hsvapalette.js | 298 + .../closure/goog/ui/hsvpalette.js | 505 + .../closure/goog/ui/idgenerator.js | 57 + .../closure/goog/ui/idletimer.js | 299 + .../closure/goog/ui/iframemask.js | 257 + .../goog/ui/imagelessbuttonrenderer.js | 204 + .../goog/ui/imagelessmenubuttonrenderer.js | 207 + .../closure/goog/ui/inputdatepicker.js | 305 + .../closure/goog/ui/itemevent.js | 50 + .../goog/ui/keyboardshortcuthandler.js | 1017 + .../closure/goog/ui/labelinput.js | 592 + .../closure/goog/ui/linkbuttonrenderer.js | 67 + .../closure/goog/ui/media/flashobject.js | 631 + .../closure/goog/ui/media/flickr.js | 308 + .../closure/goog/ui/media/googlevideo.js | 281 + .../closure/goog/ui/media/media.js | 285 + .../closure/goog/ui/media/mediamodel.js | 960 + .../closure/goog/ui/media/mp3.js | 228 + .../closure/goog/ui/media/photo.js | 142 + .../closure/goog/ui/media/picasa.js | 321 + .../closure/goog/ui/media/vimeo.js | 276 + .../closure/goog/ui/media/youtube.js | 357 + .../closure-library/closure/goog/ui/menu.js | 476 + .../closure/goog/ui/menubar.js | 44 + .../closure/goog/ui/menubardecorator.js | 35 + .../closure/goog/ui/menubarrenderer.js | 74 + .../closure/goog/ui/menubase.js | 190 + .../closure/goog/ui/menubutton.js | 903 + .../closure/goog/ui/menubuttonrenderer.js | 266 + .../closure/goog/ui/menuheader.js | 62 + .../closure/goog/ui/menuheaderrenderer.js | 54 + .../closure/goog/ui/menuitem.js | 233 + .../closure/goog/ui/menuitemrenderer.js | 358 + .../closure/goog/ui/menurenderer.js | 123 + .../closure/goog/ui/menuseparator.js | 51 + .../closure/goog/ui/menuseparatorrenderer.js | 113 + .../closure/goog/ui/mockactivitymonitor.js | 71 + .../goog/ui/mockactivitymonitor_test.js | 94 + .../closure/goog/ui/modalpopup.js | 698 + .../closure/goog/ui/nativebuttonrenderer.js | 207 + .../closure/goog/ui/offlineinstalldialog.js | 1089 + .../closure/goog/ui/offlinestatuscard.js | 580 + .../closure/goog/ui/offlinestatuscomponent.js | 540 + .../closure-library/closure/goog/ui/option.js | 68 + .../closure/goog/ui/palette.js | 598 + .../closure/goog/ui/paletterenderer.js | 372 + .../closure/goog/ui/plaintextspellchecker.js | 672 + .../closure-library/closure/goog/ui/popup.js | 344 + .../closure/goog/ui/popupbase.js | 822 + .../closure/goog/ui/popupcolorpicker.js | 441 + .../closure/goog/ui/popupdatepicker.js | 273 + .../closure/goog/ui/popupmenu.js | 557 + .../closure/goog/ui/progressbar.js | 401 + .../closure-library/closure/goog/ui/prompt.js | 405 + .../closure/goog/ui/rangemodel.js | 302 + .../closure/goog/ui/ratings.js | 451 + .../closure/goog/ui/registry.js | 167 + .../closure/goog/ui/richtextspellchecker.js | 626 + .../closure/goog/ui/roundedpanel.js | 625 + .../closure/goog/ui/roundedtabrenderer.js | 197 + .../closure/goog/ui/scrollfloater.js | 585 + .../closure-library/closure/goog/ui/select.js | 434 + .../closure/goog/ui/selectionmenubutton.js | 299 + .../closure/goog/ui/selectionmodel.js | 300 + .../closure/goog/ui/separator.js | 80 + .../closure/goog/ui/serverchart.js | 1837 + .../closure-library/closure/goog/ui/slider.js | 126 + .../closure/goog/ui/sliderbase.js | 1592 + .../closure/goog/ui/splitbehavior.js | 340 + .../closure/goog/ui/splitpane.js | 898 + .../goog/ui/style/app/buttonrenderer.js | 201 + .../goog/ui/style/app/menubuttonrenderer.js | 233 + .../style/app/primaryactionbuttonrenderer.js | 88 + .../closure/goog/ui/submenu.js | 667 + .../closure/goog/ui/submenurenderer.js | 233 + .../closure-library/closure/goog/ui/tab.js | 102 + .../closure-library/closure/goog/ui/tabbar.js | 394 + .../closure/goog/ui/tabbarrenderer.js | 175 + .../closure/goog/ui/tablesorter.js | 325 + .../closure/goog/ui/tabpane.js | 675 + .../closure/goog/ui/tabrenderer.js | 153 + .../closure/goog/ui/textarea.js | 577 + .../closure/goog/ui/textarearenderer.js | 169 + .../closure/goog/ui/togglebutton.js | 58 + .../closure/goog/ui/toolbar.js | 46 + .../closure/goog/ui/toolbarbutton.js | 55 + .../closure/goog/ui/toolbarbuttonrenderer.js | 57 + .../closure/goog/ui/toolbarcolormenubutton.js | 58 + .../goog/ui/toolbarcolormenubuttonrenderer.js | 98 + .../closure/goog/ui/toolbarmenubutton.js | 57 + .../goog/ui/toolbarmenubuttonrenderer.js | 57 + .../closure/goog/ui/toolbarrenderer.js | 99 + .../closure/goog/ui/toolbarselect.js | 56 + .../closure/goog/ui/toolbarseparator.js | 53 + .../goog/ui/toolbarseparatorrenderer.js | 91 + .../closure/goog/ui/toolbartogglebutton.js | 54 + .../closure/goog/ui/tooltip.js | 999 + .../closure/goog/ui/tree/basenode.js | 1458 + .../closure/goog/ui/tree/treecontrol.js | 663 + .../closure/goog/ui/tree/treenode.js | 107 + .../closure/goog/ui/tree/typeahead.js | 332 + .../closure/goog/ui/tristatemenuitem.js | 184 + .../goog/ui/tristatemenuitemrenderer.js | 84 + .../closure/goog/ui/twothumbslider.js | 157 + .../closure-library/closure/goog/ui/zippy.js | 445 + .../closure-library/closure/goog/uri/uri.js | 1502 + .../closure/goog/uri/uri_test.js | 1048 + .../closure-library/closure/goog/uri/utils.js | 1053 + .../closure/goog/useragent/adobereader.js | 90 + .../closure/goog/useragent/flash.js | 153 + .../closure/goog/useragent/iphoto.js | 87 + .../closure/goog/useragent/jscript.js | 95 + .../closure/goog/useragent/picasa.js | 112 + .../closure/goog/useragent/platform.js | 82 + .../closure/goog/useragent/product.js | 253 + .../goog/useragent/product_isversion.js | 140 + .../closure/goog/useragent/useragent.js | 599 + .../closure/goog/vec/float32array.js | 110 + .../closure/goog/vec/float64array.js | 117 + .../closure-library/closure/goog/vec/mat3.js | 1211 + .../closure-library/closure/goog/vec/mat3d.js | 1039 + .../closure-library/closure/goog/vec/mat3f.js | 1039 + .../closure-library/closure/goog/vec/mat4.js | 1822 + .../closure-library/closure/goog/vec/mat4d.js | 1769 + .../closure-library/closure/goog/vec/mat4f.js | 1769 + .../closure/goog/vec/matrix3.js | 720 + .../closure/goog/vec/matrix4.js | 1405 + .../closure/goog/vec/quaternion.js | 458 + .../closure-library/closure/goog/vec/ray.js | 94 + .../closure-library/closure/goog/vec/vec.js | 73 + .../closure-library/closure/goog/vec/vec2.js | 376 + .../closure-library/closure/goog/vec/vec2d.js | 325 + .../closure-library/closure/goog/vec/vec2f.js | 325 + .../closure-library/closure/goog/vec/vec3.js | 474 + .../closure-library/closure/goog/vec/vec3d.js | 358 + .../closure-library/closure/goog/vec/vec3f.js | 358 + .../closure-library/closure/goog/vec/vec4.js | 406 + .../closure-library/closure/goog/vec/vec4d.js | 293 + .../closure-library/closure/goog/vec/vec4f.js | 293 + .../closure/goog/webgl/webgl.js | 2194 + .../closure/goog/window/window.js | 225 + .../third_party/closure/goog/base.js | 2 + .../goog/caja/string/html/htmlparser.js | 611 + .../goog/caja/string/html/htmlsanitizer.js | 605 + .../closure/goog/dojo/dom/query.js | 1543 + .../closure/goog/dojo/dom/query_test.js | 158 + .../goog/jpeg_encoder/jpeg_encoder_basic.js | 751 + .../goog/loremipsum/text/loremipsum.js | 712 + .../closure/goog/mochikit/async/deferred.js | 764 + .../goog/mochikit/async/deferredlist.js | 205 + .../third_party/closure/goog/osapi/osapi.js | 95 + .../closure-library/third_party_manifest.txt | 10 + float-no-zero/css/ol.css | 1 + float-no-zero/examples/Jugl.js | 8 + float-no-zero/examples/accessible-require.js | 4 + float-no-zero/examples/accessible.html | 61 + float-no-zero/examples/accessible.js | 13 + float-no-zero/examples/animation-require.js | 7 + float-no-zero/examples/animation.html | 64 + float-no-zero/examples/animation.js | 133 + float-no-zero/examples/bind-input-require.js | 6 + float-no-zero/examples/bind-input.html | 89 + float-no-zero/examples/bind-input.js | 57 + float-no-zero/examples/bing-maps-require.js | 4 + float-no-zero/examples/bing-maps.html | 59 + float-no-zero/examples/bing-maps.js | 37 + .../examples/brightness-contrast-require.js | 5 + .../examples/brightness-contrast.html | 74 + float-no-zero/examples/brightness-contrast.js | 68 + .../examples/canvas-tiles-require.js | 7 + float-no-zero/examples/canvas-tiles.html | 52 + float-no-zero/examples/canvas-tiles.js | 22 + .../examples/custom-controls-require.js | 7 + float-no-zero/examples/custom-controls.html | 91 + float-no-zero/examples/custom-controls.js | 71 + float-no-zero/examples/d3-require.js | 9 + float-no-zero/examples/d3.html | 54 + float-no-zero/examples/d3.js | 84 + .../examples/data/IGNWMTSCapabilities.xml | 1 + .../examples/data/WMTSCapabilities.xml | 374 + .../examples/data/geojson/countries.geojson | 181 + .../examples/data/gml/topp-states-wfs.xml | 2 + .../examples/data/gpx/fells_loop.gpx | 1077 + float-no-zero/examples/data/icon.png | Bin 0 -> 2532 bytes .../examples/data/igc/Clement-Latour.igc | 15585 +++++++ .../examples/data/igc/Damien-de-Baenst.igc | 3319 ++ .../examples/data/igc/Sylvain-Dhonneur.igc | 16374 +++++++ float-no-zero/examples/data/igc/Tom-Payne.igc | 9879 ++++ .../examples/data/igc/Ulrich-Prinz.igc | 4611 ++ .../examples/data/kml/2012-02-10.kml | 9391 ++++ .../data/kml/2012_Earthquakes_Mag5.kml | 10758 +++++ float-no-zero/examples/data/kml/timezones.kml | 1608 + float-no-zero/examples/data/ogcsample.xml | 284 + float-no-zero/examples/data/osm/map.osm | 2223 + float-no-zero/examples/data/sld/countries.sld | 43 + float-no-zero/examples/data/topojson/us.json | 1 + .../examples/data/topojson/world-110m.json | 1 + .../examples/device-orientation-require.js | 6 + .../examples/device-orientation.html | 58 + float-no-zero/examples/device-orientation.js | 39 + .../drag-and-drop-image-vector-require.js | 18 + .../examples/drag-and-drop-image-vector.html | 56 + .../examples/drag-and-drop-image-vector.js | 134 + .../examples/drag-and-drop-require.js | 17 + float-no-zero/examples/drag-and-drop.html | 56 + float-no-zero/examples/drag-and-drop.js | 132 + .../examples/drag-rotate-and-zoom-require.js | 6 + .../examples/drag-rotate-and-zoom.html | 52 + .../examples/drag-rotate-and-zoom.js | 16 + .../examples/draw-features-require.js | 12 + float-no-zero/examples/draw-features.html | 60 + float-no-zero/examples/draw-features.js | 57 + .../examples/dynamic-data-require.js | 8 + float-no-zero/examples/dynamic-data.html | 51 + float-no-zero/examples/dynamic-data.js | 43 + float-no-zero/examples/epsg-4326-require.js | 6 + float-no-zero/examples/epsg-4326.html | 51 + float-no-zero/examples/epsg-4326.js | 29 + float-no-zero/examples/example-list.js | 1 + float-no-zero/examples/example-list.xml | 1 + float-no-zero/examples/export-map-require.js | 4 + float-no-zero/examples/export-map.html | 56 + float-no-zero/examples/export-map.js | 31 + float-no-zero/examples/fractal-require.js | 6 + float-no-zero/examples/fractal.html | 64 + float-no-zero/examples/fractal.js | 118 + ...ull-screen-drag-rotate-and-zoom-require.js | 8 + .../full-screen-drag-rotate-and-zoom.html | 64 + .../full-screen-drag-rotate-and-zoom.js | 24 + float-no-zero/examples/full-screen-require.js | 6 + float-no-zero/examples/full-screen.html | 67 + float-no-zero/examples/full-screen.js | 21 + float-no-zero/examples/geojson-require.js | 12 + float-no-zero/examples/geojson.html | 51 + float-no-zero/examples/geojson.js | 182 + float-no-zero/examples/geolocation-require.js | 7 + float-no-zero/examples/geolocation.html | 71 + float-no-zero/examples/geolocation.js | 49 + .../examples/getfeatureinfo-require.js | 4 + float-no-zero/examples/getfeatureinfo.html | 57 + float-no-zero/examples/getfeatureinfo.js | 35 + float-no-zero/examples/google-map-require.js | 10 + float-no-zero/examples/google-map.html | 65 + float-no-zero/examples/google-map.js | 51 + float-no-zero/examples/gpx-require.js | 10 + float-no-zero/examples/gpx.html | 56 + float-no-zero/examples/gpx.js | 81 + .../examples/heatmap-earthquakes-require.js | 6 + .../examples/heatmap-earthquakes.html | 52 + float-no-zero/examples/heatmap-earthquakes.js | 32 + .../examples/hue-saturation-require.js | 6 + float-no-zero/examples/hue-saturation.html | 74 + float-no-zero/examples/hue-saturation.js | 71 + float-no-zero/examples/icon-require.js | 11 + float-no-zero/examples/icon.html | 62 + float-no-zero/examples/icon.js | 85 + float-no-zero/examples/igc-require.js | 15 + float-no-zero/examples/igc.html | 57 + float-no-zero/examples/igc.js | 169 + .../examples/image-filter-require.js | 5 + float-no-zero/examples/image-filter.html | 65 + float-no-zero/examples/image-filter.js | 141 + .../examples/image-vector-layer-require.js | 11 + .../examples/image-vector-layer.html | 59 + float-no-zero/examples/image-vector-layer.js | 78 + float-no-zero/examples/index.html | 209 + float-no-zero/examples/jquery.min.js | 4 + .../examples/kml-earthquakes-require.js | 10 + float-no-zero/examples/kml-earthquakes.html | 75 + float-no-zero/examples/kml-earthquakes.js | 82 + float-no-zero/examples/kml-require.js | 6 + .../examples/kml-timezones-require.js | 9 + float-no-zero/examples/kml-timezones.html | 63 + float-no-zero/examples/kml-timezones.js | 90 + float-no-zero/examples/kml.html | 56 + float-no-zero/examples/kml.js | 51 + .../examples/layer-clipping-require.js | 4 + .../examples/layer-clipping-webgl-require.js | 5 + .../examples/layer-clipping-webgl.html | 56 + .../examples/layer-clipping-webgl.js | 96 + float-no-zero/examples/layer-clipping.html | 51 + float-no-zero/examples/layer-clipping.js | 36 + float-no-zero/examples/layer-group-require.js | 8 + float-no-zero/examples/layer-group.html | 126 + float-no-zero/examples/layer-group.js | 54 + float-no-zero/examples/layer-spy-require.js | 5 + float-no-zero/examples/layer-spy.html | 60 + float-no-zero/examples/layer-spy.js | 61 + float-no-zero/examples/layer-swipe-require.js | 5 + float-no-zero/examples/layer-swipe.html | 52 + float-no-zero/examples/layer-swipe.js | 40 + float-no-zero/examples/loader.js | 78 + .../localized-openstreetmap-require.js | 5 + .../examples/localized-openstreetmap.html | 51 + .../examples/localized-openstreetmap.js | 44 + .../examples/mapguide-untiled-require.js | 4 + float-no-zero/examples/mapguide-untiled.html | 51 + float-no-zero/examples/mapguide-untiled.js | 34 + float-no-zero/examples/mapquest-require.js | 6 + float-no-zero/examples/mapquest.html | 56 + float-no-zero/examples/mapquest.js | 43 + .../examples/min-max-resolution-require.js | 5 + .../examples/min-max-resolution.html | 60 + float-no-zero/examples/min-max-resolution.js | 27 + .../examples/mobile-full-screen-require.js | 5 + .../examples/mobile-full-screen.html | 29 + float-no-zero/examples/mobile-full-screen.js | 27 + .../examples/modify-features-require.js | 13 + float-no-zero/examples/modify-features.html | 57 + float-no-zero/examples/modify-features.js | 261 + .../examples/mouse-position-require.js | 9 + float-no-zero/examples/mouse-position.html | 59 + float-no-zero/examples/mouse-position.js | 42 + float-no-zero/examples/moveend-require.js | 6 + float-no-zero/examples/moveend.html | 54 + float-no-zero/examples/moveend.js | 37 + .../examples/navigation-controls-require.js | 6 + .../examples/navigation-controls.html | 56 + float-no-zero/examples/navigation-controls.js | 21 + float-no-zero/examples/overlay-require.js | 7 + float-no-zero/examples/overlay.html | 85 + float-no-zero/examples/overlay.js | 55 + float-no-zero/examples/popup-require.js | 7 + float-no-zero/examples/popup.html | 106 + float-no-zero/examples/popup.js | 64 + float-no-zero/examples/preload-require.js | 4 + float-no-zero/examples/preload.html | 55 + float-no-zero/examples/preload.js | 32 + float-no-zero/examples/rotation-require.js | 4 + float-no-zero/examples/rotation.html | 52 + float-no-zero/examples/rotation.js | 14 + float-no-zero/examples/rtree-require.js | 11 + float-no-zero/examples/rtree.html | 51 + float-no-zero/examples/rtree.js | 91 + float-no-zero/examples/scale-line-require.js | 7 + float-no-zero/examples/scale-line.html | 56 + float-no-zero/examples/scale-line.js | 22 + .../examples/select-features-require.js | 11 + float-no-zero/examples/select-features.html | 52 + float-no-zero/examples/select-features.js | 37 + .../semi-transparent-layer-require.js | 6 + .../examples/semi-transparent-layer.html | 51 + .../examples/semi-transparent-layer.js | 19 + .../examples/side-by-side-require.js | 5 + float-no-zero/examples/side-by-side.html | 63 + float-no-zero/examples/side-by-side.js | 35 + float-no-zero/examples/simple-require.js | 4 + float-no-zero/examples/simple.html | 51 + float-no-zero/examples/simple.js | 13 + float-no-zero/examples/stamen-require.js | 5 + float-no-zero/examples/stamen.html | 51 + float-no-zero/examples/stamen.js | 21 + .../examples/static-image-require.js | 7 + float-no-zero/examples/static-image.html | 51 + float-no-zero/examples/static-image.js | 33 + .../examples/synthetic-lines-require.js | 8 + float-no-zero/examples/synthetic-lines.html | 110 + float-no-zero/examples/synthetic-lines.js | 51 + .../examples/synthetic-points-require.js | 12 + float-no-zero/examples/synthetic-points.html | 52 + float-no-zero/examples/synthetic-points.js | 124 + float-no-zero/examples/teleport-require.js | 4 + float-no-zero/examples/teleport.html | 61 + float-no-zero/examples/teleport.js | 21 + float-no-zero/examples/tilejson-require.js | 4 + float-no-zero/examples/tilejson.html | 51 + float-no-zero/examples/tilejson.js | 16 + float-no-zero/examples/topojson-require.js | 9 + float-no-zero/examples/topojson.html | 53 + float-no-zero/examples/topojson.js | 36 + .../examples/vector-layer-require.js | 11 + float-no-zero/examples/vector-layer.html | 56 + float-no-zero/examples/vector-layer.js | 115 + float-no-zero/examples/vector-osm-require.js | 10 + float-no-zero/examples/vector-osm.html | 56 + float-no-zero/examples/vector-osm.js | 112 + .../examples/wms-capabilities-require.js | 1 + float-no-zero/examples/wms-capabilities.html | 49 + float-no-zero/examples/wms-capabilities.js | 18 + .../examples/wms-custom-proj-require.js | 8 + float-no-zero/examples/wms-custom-proj.html | 53 + float-no-zero/examples/wms-custom-proj.js | 58 + .../examples/wms-image-custom-proj-require.js | 6 + .../examples/wms-image-custom-proj.html | 54 + .../examples/wms-image-custom-proj.js | 53 + float-no-zero/examples/wms-image-require.js | 6 + float-no-zero/examples/wms-image.html | 51 + float-no-zero/examples/wms-image.js | 22 + float-no-zero/examples/wms-no-proj-require.js | 8 + float-no-zero/examples/wms-no-proj.html | 51 + float-no-zero/examples/wms-no-proj.js | 51 + float-no-zero/examples/wms-tiled-require.js | 5 + float-no-zero/examples/wms-tiled.html | 51 + float-no-zero/examples/wms-tiled.js | 22 + float-no-zero/examples/wmts-require.js | 8 + float-no-zero/examples/wmts.html | 51 + float-no-zero/examples/wmts.js | 43 + float-no-zero/examples/xyz-esri-require.js | 6 + float-no-zero/examples/xyz-esri.html | 51 + float-no-zero/examples/xyz-esri.js | 22 + float-no-zero/examples/zoomify-require.js | 6 + float-no-zero/examples/zoomify.html | 51 + float-no-zero/examples/zoomify.js | 43 + float-no-zero/examples/zoomslider-require.js | 5 + float-no-zero/examples/zoomslider.html | 116 + float-no-zero/examples/zoomslider.js | 29 + float-no-zero/ol/ol/animation.exports | 4 + float-no-zero/ol/ol/animation.js | 154 + float-no-zero/ol/ol/animation.jsdoc | 12 + float-no-zero/ol/ol/array.js | 104 + float-no-zero/ol/ol/attribution.exports | 1 + float-no-zero/ol/ol/attribution.js | 74 + float-no-zero/ol/ol/binary.js | 174 + float-no-zero/ol/ol/browserfeature.exports | 7 + float-no-zero/ol/ol/browserfeature.js | 188 + float-no-zero/ol/ol/browserfeature.jsdoc | 3 + float-no-zero/ol/ol/canvasfunction.js | 17 + float-no-zero/ol/ol/centerconstraint.js | 43 + float-no-zero/ol/ol/collection.exports | 13 + float-no-zero/ol/ol/collection.js | 254 + float-no-zero/ol/ol/color/color.exports | 2 + float-no-zero/ol/ol/color/color.js | 354 + float-no-zero/ol/ol/color/colormatrix.js | 205 + float-no-zero/ol/ol/constraints.js | 35 + float-no-zero/ol/ol/control.jsdoc | 3 + .../ol/ol/control/attributioncontrol.exports | 2 + .../ol/ol/control/attributioncontrol.js | 189 + float-no-zero/ol/ol/control/control.exports | 3 + float-no-zero/ol/ol/control/control.js | 108 + .../ol/ol/control/controldefaults.exports | 1 + .../ol/ol/control/controldefaults.js | 46 + .../ol/ol/control/fullscreencontrol.exports | 1 + .../ol/ol/control/fullscreencontrol.js | 131 + .../ol/ol/control/logocontrol.exports | 2 + float-no-zero/ol/ol/control/logocontrol.js | 121 + .../ol/control/mousepositioncontrol.exports | 2 + .../ol/ol/control/mousepositioncontrol.js | 260 + .../ol/ol/control/scalelinecontrol.exports | 2 + .../ol/ol/control/scalelinecontrol.js | 329 + .../ol/ol/control/zoomcontrol.exports | 2 + float-no-zero/ol/ol/control/zoomcontrol.js | 131 + .../ol/ol/control/zoomslidercontrol.exports | 1 + .../ol/ol/control/zoomslidercontrol.js | 304 + .../ol/ol/control/zoomtoextentcontrol.exports | 1 + .../ol/ol/control/zoomtoextentcontrol.js | 84 + float-no-zero/ol/ol/coordinate.exports | 6 + float-no-zero/ol/ol/coordinate.js | 251 + float-no-zero/ol/ol/css.js | 19 + float-no-zero/ol/ol/deviceorientation.exports | 1 + float-no-zero/ol/ol/deviceorientation.js | 249 + float-no-zero/ol/ol/dom/dom.js | 282 + float-no-zero/ol/ol/dom/input.exports | 1 + float-no-zero/ol/ol/dom/input.js | 145 + float-no-zero/ol/ol/easing.exports | 7 + float-no-zero/ol/ol/easing.js | 83 + .../ol/ol/ellipsoid/bessel1841ellipsoid.js | 10 + float-no-zero/ol/ol/ellipsoid/ellipsoid.js | 185 + .../ol/ol/ellipsoid/wgs84ellipsoid.js | 10 + float-no-zero/ol/ol/events/condition.exports | 7 + float-no-zero/ol/ol/events/condition.js | 122 + float-no-zero/ol/ol/events/condition.jsdoc | 3 + float-no-zero/ol/ol/extent.exports | 18 + float-no-zero/ol/ol/extent.js | 766 + float-no-zero/ol/ol/feature.exports | 8 + float-no-zero/ol/ol/feature.js | 340 + float-no-zero/ol/ol/feature.jsdoc | 3 + float-no-zero/ol/ol/featureoverlay.exports | 9 + float-no-zero/ol/ol/featureoverlay.js | 275 + .../ol/ol/format/binaryfeatureformat.js | 111 + float-no-zero/ol/ol/format/featureformat.js | 72 + float-no-zero/ol/ol/format/format.js | 12 + .../ol/ol/format/geojsonformat.exports | 8 + float-no-zero/ol/ol/format/geojsonformat.js | 438 + float-no-zero/ol/ol/format/gmlformat.js | 1632 + float-no-zero/ol/ol/format/gpxformat.exports | 3 + float-no-zero/ol/ol/format/gpxformat.js | 783 + float-no-zero/ol/ol/format/igcformat.exports | 3 + float-no-zero/ol/ol/format/igcformat.js | 177 + .../ol/ol/format/jsonfeatureformat.js | 155 + float-no-zero/ol/ol/format/kmlformat.exports | 6 + float-no-zero/ol/ol/format/kmlformat.js | 1589 + float-no-zero/ol/ol/format/osmxmlformat.js | 213 + float-no-zero/ol/ol/format/polylineformat.js | 327 + .../ol/ol/format/textfeatureformat.js | 151 + .../ol/ol/format/topojsonformat.exports | 3 + float-no-zero/ol/ol/format/topojsonformat.js | 386 + .../ol/ol/format/xmlfeatureformat.js | 226 + float-no-zero/ol/ol/format/xsdformat.js | 174 + float-no-zero/ol/ol/framestate.js | 52 + float-no-zero/ol/ol/geolocation.exports | 1 + float-no-zero/ol/ol/geolocation.js | 373 + float-no-zero/ol/ol/geom/circle.exports | 11 + float-no-zero/ol/ol/geom/circle.js | 215 + float-no-zero/ol/ol/geom/closestgeom.js | 219 + float-no-zero/ol/ol/geom/flatgeom.js | 933 + float-no-zero/ol/ol/geom/geom.jsdoc | 3 + float-no-zero/ol/ol/geom/geometry.exports | 3 + float-no-zero/ol/ol/geom/geometry.js | 198 + .../ol/ol/geom/geometrycollection.exports | 7 + .../ol/ol/geom/geometrycollection.js | 263 + float-no-zero/ol/ol/geom/linearring.exports | 6 + float-no-zero/ol/ol/geom/linearring.js | 144 + float-no-zero/ol/ol/geom/linestring.exports | 7 + float-no-zero/ol/ol/geom/linestring.js | 194 + .../ol/ol/geom/multilinestring.exports | 7 + float-no-zero/ol/ol/geom/multilinestring.js | 252 + float-no-zero/ol/ol/geom/multipoint.exports | 6 + float-no-zero/ol/ol/geom/multipoint.js | 125 + float-no-zero/ol/ol/geom/multipolygon.exports | 8 + float-no-zero/ol/ol/geom/multipolygon.js | 304 + float-no-zero/ol/ol/geom/point.exports | 5 + float-no-zero/ol/ol/geom/point.js | 115 + float-no-zero/ol/ol/geom/polygon.exports | 8 + float-no-zero/ol/ol/geom/polygon.js | 263 + .../ol/ol/geom/simplegeometry.exports | 7 + float-no-zero/ol/ol/geom/simplegeometry.js | 266 + float-no-zero/ol/ol/geom/simplifygeom.js | 400 + float-no-zero/ol/ol/image.js | 139 + float-no-zero/ol/ol/imagebase.js | 127 + float-no-zero/ol/ol/imagecanvas.js | 38 + float-no-zero/ol/ol/imagetile.exports | 1 + float-no-zero/ol/ol/imagetile.js | 160 + float-no-zero/ol/ol/imageurlfunction.js | 46 + .../ol/ol/interaction/doubleclickzoom.exports | 1 + .../interaction/doubleclickzoominteraction.js | 61 + .../draganddropinteraction.exports | 1 + .../ol/interaction/draganddropinteraction.js | 208 + .../ol/interaction/dragboxinteraction.exports | 2 + .../ol/ol/interaction/dragboxinteraction.js | 160 + .../ol/ol/interaction/draginteraction.js | 145 + .../ol/ol/interaction/dragpan.exports | 1 + .../ol/ol/interaction/dragpaninteraction.js | 146 + .../ol/ol/interaction/dragrotate.exports | 1 + .../ol/interaction/dragrotateandzoom.exports | 1 + .../dragrotateandzoominteraction.js | 135 + .../ol/interaction/dragrotateinteraction.js | 101 + .../interaction/dragzoominteraction.exports | 1 + .../ol/ol/interaction/dragzoominteraction.js | 66 + .../ol/ol/interaction/drawinteraction.exports | 1 + .../ol/ol/interaction/drawinteraction.js | 570 + .../ol/ol/interaction/interaction.js | 216 + .../ol/ol/interaction/interaction.jsdoc | 3 + .../interaction/interactiondefaults.exports | 1 + .../ol/ol/interaction/interactiondefaults.js | 110 + .../ol/ol/interaction/keyboardpan.exports | 1 + .../ol/interaction/keyboardpaninteraction.js | 102 + .../ol/ol/interaction/keyboardzoom.exports | 1 + .../ol/interaction/keyboardzoominteraction.js | 81 + .../ol/interaction/modifyinteraction.exports | 1 + .../ol/ol/interaction/modifyinteraction.js | 633 + .../ol/ol/interaction/mousewheelzoom.exports | 1 + .../interaction/mousewheelzoominteraction.js | 125 + .../ol/interaction/selectinteraction.exports | 3 + .../ol/ol/interaction/selectinteraction.js | 148 + .../ol/ol/interaction/touchinteraction.js | 151 + .../ol/ol/interaction/touchpan.exports | 1 + .../ol/ol/interaction/touchpaninteraction.js | 142 + .../ol/ol/interaction/touchrotate.exports | 1 + .../ol/interaction/touchrotateinteraction.js | 155 + .../ol/ol/interaction/touchzoom.exports | 1 + .../ol/ol/interaction/touchzoominteraction.js | 137 + float-no-zero/ol/ol/iview.js | 34 + float-no-zero/ol/ol/iview2d.js | 68 + float-no-zero/ol/ol/iview3d.js | 17 + float-no-zero/ol/ol/kinetic.exports | 1 + float-no-zero/ol/ol/kinetic.js | 152 + .../ol/ol/layer/heatmaplayer.exports | 1 + float-no-zero/ol/ol/layer/heatmaplayer.js | 195 + float-no-zero/ol/ol/layer/imagelayer.exports | 1 + float-no-zero/ol/ol/layer/imagelayer.js | 16 + float-no-zero/ol/ol/layer/layer.exports | 2 + float-no-zero/ol/ol/layer/layer.js | 93 + float-no-zero/ol/ol/layer/layer.jsdoc | 3 + float-no-zero/ol/ol/layer/layerbase.js | 355 + float-no-zero/ol/ol/layer/layergroup.exports | 1 + float-no-zero/ol/ol/layer/layergroup.js | 224 + float-no-zero/ol/ol/layer/tilelayer.exports | 1 + float-no-zero/ol/ol/layer/tilelayer.js | 83 + float-no-zero/ol/ol/layer/vectorlayer.exports | 4 + float-no-zero/ol/ol/layer/vectorlayer.js | 118 + float-no-zero/ol/ol/map.exports | 23 + float-no-zero/ol/ol/map.js | 1472 + float-no-zero/ol/ol/mapbrowserevent.exports | 2 + float-no-zero/ol/ol/mapbrowserevent.js | 515 + float-no-zero/ol/ol/mapevent.js | 40 + float-no-zero/ol/ol/math.js | 69 + float-no-zero/ol/ol/object.exports | 9 + float-no-zero/ol/ol/object.js | 470 + float-no-zero/ol/ol/observable.exports | 6 + float-no-zero/ol/ol/observable.js | 95 + float-no-zero/ol/ol/ol.exports | 1 + float-no-zero/ol/ol/ol.js | 15 + float-no-zero/ol/ol/overlay.exports | 1 + float-no-zero/ol/ol/overlay.js | 400 + .../ol/ol/parser/ogc/exceptionreportparser.js | 96 + .../ol/ol/parser/ogc/versionedparser.js | 121 + .../parser/ogc/wmscapabilitiesparser.exports | 2 + .../ol/ol/parser/ogc/wmscapabilitiesparser.js | 69 + .../ol/parser/ogc/wmscapabilitiesparser_v1.js | 317 + .../ogc/wmscapabilitiesparser_v1_0_0.js | 66 + .../parser/ogc/wmscapabilitiesparser_v1_1.js | 101 + .../ogc/wmscapabilitiesparser_v1_1_0.js | 29 + .../ogc/wmscapabilitiesparser_v1_1_1.js | 25 + .../ogc/wmscapabilitiesparser_v1_1_1_WMSC.js | 48 + .../ogc/wmscapabilitiesparser_v1_3_0.js | 114 + float-no-zero/ol/ol/parser/parser.js | 9 + float-no-zero/ol/ol/parser/xmlparser.js | 296 + float-no-zero/ol/ol/pixel.js | 7 + float-no-zero/ol/ol/proj/chprojection.js | 468 + float-no-zero/ol/ol/proj/common.js | 23 + .../ol/ol/proj/epsg3857projection.js | 144 + .../ol/ol/proj/epsg4326projection.js | 58 + float-no-zero/ol/ol/proj/proj.exports | 16 + float-no-zero/ol/ol/proj/proj.js | 725 + float-no-zero/ol/ol/proj/proj.jsdoc | 3 + float-no-zero/ol/ol/render/box.js | 160 + float-no-zero/ol/ol/render/canvas/canvas.js | 98 + .../ol/render/canvas/canvasimmediate.exports | 12 + .../ol/ol/render/canvas/canvasimmediate.js | 907 + .../ol/ol/render/canvas/canvasreplay.js | 1961 + float-no-zero/ol/ol/render/ireplay.js | 58 + float-no-zero/ol/ol/render/ivectorcontext.js | 152 + float-no-zero/ol/ol/render/renderevent.js | 57 + float-no-zero/ol/ol/render/vector.js | 317 + .../ol/ol/render/webgl/webglimmediate.js | 121 + .../canvas/canvasimagelayerrenderer.js | 136 + .../ol/renderer/canvas/canvaslayerrenderer.js | 165 + .../ol/renderer/canvas/canvasmaprenderer.js | 183 + .../canvas/canvastilelayerrenderer.js | 401 + .../canvas/canvasvectorlayerrenderer.js | 290 + .../ol/renderer/dom/domimagelayerrenderer.js | 143 + .../ol/ol/renderer/dom/domlayerrenderer.js | 35 + .../ol/ol/renderer/dom/dommaprenderer.js | 153 + .../ol/renderer/dom/domtilelayerrenderer.js | 463 + float-no-zero/ol/ol/renderer/layerrenderer.js | 296 + float-no-zero/ol/ol/renderer/maprenderer.js | 229 + .../renderer/webgl/webglimagelayerrenderer.js | 202 + .../ol/renderer/webgl/webgllayerrenderer.js | 289 + .../ol/ol/renderer/webgl/webglmapcolor.glsl | 32 + .../ol/renderer/webgl/webglmapcolorshader.js | 129 + .../ol/ol/renderer/webgl/webglmapdefault.glsl | 30 + .../renderer/webgl/webglmapdefaultshader.js | 123 + .../ol/ol/renderer/webgl/webglmaprenderer.js | 522 + .../ol/ol/renderer/webgl/webgltilelayer.glsl | 25 + .../renderer/webgl/webgltilelayerrenderer.js | 327 + .../ol/renderer/webgl/webgltilelayershader.js | 111 + float-no-zero/ol/ol/resolutionconstraint.js | 76 + float-no-zero/ol/ol/rotationconstraint.js | 87 + float-no-zero/ol/ol/size.js | 21 + float-no-zero/ol/ol/source.jsdoc | 3 + .../ol/ol/source/bingmapssource.exports | 2 + float-no-zero/ol/ol/source/bingmapssource.js | 159 + .../ol/ol/source/debugtilesource.exports | 1 + float-no-zero/ol/ol/source/debugtilesource.js | 137 + .../ol/ol/source/geojsonsource.exports | 1 + float-no-zero/ol/ol/source/geojsonsource.js | 33 + float-no-zero/ol/ol/source/gpxsource.exports | 1 + float-no-zero/ol/ol/source/gpxsource.js | 32 + float-no-zero/ol/ol/source/igcsource.exports | 1 + float-no-zero/ol/ol/source/igcsource.js | 29 + .../ol/ol/source/imagecanvassource.exports | 1 + .../ol/ol/source/imagecanvassource.js | 88 + float-no-zero/ol/ol/source/imagesource.js | 86 + .../ol/ol/source/imagestaticsource.exports | 1 + .../ol/ol/source/imagestaticsource.js | 56 + .../ol/ol/source/imagevectorsource.exports | 1 + .../ol/ol/source/imagevectorsource.js | 237 + .../ol/ol/source/imagewmssource.exports | 5 + float-no-zero/ol/ol/source/imagewmssource.js | 344 + float-no-zero/ol/ol/source/kmlsource.exports | 1 + float-no-zero/ol/ol/source/kmlsource.js | 34 + .../ol/ol/source/mapguidesource.exports | 1 + float-no-zero/ol/ol/source/mapguidesource.js | 176 + .../ol/ol/source/mapquestsource.exports | 1 + float-no-zero/ol/ol/source/mapquestsource.js | 78 + float-no-zero/ol/ol/source/osmsource.exports | 3 + float-no-zero/ol/ol/source/osmsource.js | 75 + .../ol/ol/source/osmxmlsource.exports | 1 + float-no-zero/ol/ol/source/osmxmlsource.js | 31 + float-no-zero/ol/ol/source/source.exports | 2 + float-no-zero/ol/ol/source/source.js | 179 + .../ol/ol/source/stamensource.exports | 1 + float-no-zero/ol/ol/source/stamensource.js | 126 + float-no-zero/ol/ol/source/tileimagesource.js | 164 + .../ol/ol/source/tilejsonsource.exports | 1 + float-no-zero/ol/ol/source/tilejsonsource.js | 120 + float-no-zero/ol/ol/source/tilesource.exports | 2 + float-no-zero/ol/ol/source/tilesource.js | 194 + .../ol/ol/source/tilewmssource.exports | 4 + float-no-zero/ol/ol/source/tilewmssource.js | 397 + .../ol/ol/source/topojsonsource.exports | 1 + float-no-zero/ol/ol/source/topojsonsource.js | 32 + .../ol/ol/source/vectorfilesource.exports | 1 + .../ol/ol/source/vectorfilesource.js | 167 + .../ol/ol/source/vectorsource.exports | 10 + float-no-zero/ol/ol/source/vectorsource.js | 372 + float-no-zero/ol/ol/source/wmssource.js | 19 + float-no-zero/ol/ol/source/wmtssource.exports | 4 + float-no-zero/ol/ol/source/wmtssource.js | 331 + float-no-zero/ol/ol/source/xyzsource.exports | 2 + float-no-zero/ol/ol/source/xyzsource.js | 84 + .../ol/ol/source/zoomifysource.exports | 1 + float-no-zero/ol/ol/source/zoomifysource.js | 184 + float-no-zero/ol/ol/sphere/normal.js | 11 + float-no-zero/ol/ol/sphere/sphere.js | 187 + float-no-zero/ol/ol/sphere/wgs84sphere.js | 11 + float-no-zero/ol/ol/structs/buffer.js | 263 + float-no-zero/ol/ol/structs/integerset.js | 330 + float-no-zero/ol/ol/structs/lrucache.js | 248 + float-no-zero/ol/ol/structs/priorityqueue.js | 291 + float-no-zero/ol/ol/structs/rbush.js | 723 + float-no-zero/ol/ol/style/circlestyle.exports | 7 + float-no-zero/ol/ol/style/circlestyle.js | 230 + float-no-zero/ol/ol/style/fillstyle.exports | 2 + float-no-zero/ol/ol/style/fillstyle.js | 28 + float-no-zero/ol/ol/style/iconstyle.exports | 5 + float-no-zero/ol/ol/style/iconstyle.js | 539 + float-no-zero/ol/ol/style/imagestyle.exports | 3 + float-no-zero/ol/ol/style/imagestyle.js | 160 + float-no-zero/ol/ol/style/strokestyle.exports | 7 + float-no-zero/ol/ol/style/strokestyle.js | 98 + float-no-zero/ol/ol/style/style.exports | 6 + float-no-zero/ol/ol/style/style.js | 87 + float-no-zero/ol/ol/style/textstyle.exports | 9 + float-no-zero/ol/ol/style/textstyle.js | 124 + float-no-zero/ol/ol/tile.exports | 1 + float-no-zero/ol/ol/tile.js | 93 + float-no-zero/ol/ol/tilecache.js | 78 + float-no-zero/ol/ol/tilecoord.exports | 1 + float-no-zero/ol/ol/tilecoord.js | 170 + float-no-zero/ol/ol/tilegrid.jsdoc | 3 + float-no-zero/ol/ol/tilegrid/tilegrid.exports | 5 + float-no-zero/ol/ol/tilegrid/tilegrid.js | 439 + .../ol/ol/tilegrid/wmtstilegrid.exports | 2 + float-no-zero/ol/ol/tilegrid/wmtstilegrid.js | 110 + .../ol/ol/tilegrid/xyztilegrid.exports | 1 + float-no-zero/ol/ol/tilegrid/xyztilegrid.js | 129 + .../ol/ol/tilegrid/zoomifytilegrid.exports | 1 + .../ol/ol/tilegrid/zoomifytilegrid.js | 79 + float-no-zero/ol/ol/tileloadfunction.js | 11 + float-no-zero/ol/ol/tilequeue.js | 94 + float-no-zero/ol/ol/tilerange.js | 169 + float-no-zero/ol/ol/tileurlfunction.js | 155 + float-no-zero/ol/ol/transformfunction.js | 13 + float-no-zero/ol/ol/vec/mat4.js | 82 + float-no-zero/ol/ol/view.js | 87 + float-no-zero/ol/ol/view2d.exports | 8 + float-no-zero/ol/ol/view2d.js | 594 + float-no-zero/ol/ol/webgl/context.exports | 3 + float-no-zero/ol/ol/webgl/context.js | 266 + float-no-zero/ol/ol/webgl/shader.js | 84 + float-no-zero/ol/ol/webgl/shader.mustache | 103 + float-no-zero/ol/ol/webgl/webgl.js | 44 + float-no-zero/ol/ol/xml.js | 710 + .../bootstrap/css/bootstrap-responsive.css | 1109 + .../css/bootstrap-responsive.min.css | 9 + .../resources/bootstrap/css/bootstrap.css | 6158 +++ .../resources/bootstrap/css/bootstrap.min.css | 9 + .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../bootstrap/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes .../resources/bootstrap/js/bootstrap.js | 2276 + .../resources/bootstrap/js/bootstrap.min.js | 6 + float-no-zero/resources/display-frame-rate.js | 39 + float-no-zero/resources/example-behaviour.js | 86 + float-no-zero/resources/layout.css | 27 + .../resources/logo-32x32-optimized.png | Bin 0 -> 1116 bytes float-no-zero/resources/logo-32x32.png | Bin 0 -> 1205 bytes float-no-zero/resources/logo.png | Bin 0 -> 1365 bytes float-no-zero/resources/textured_paper.jpeg | Bin 0 -> 3445 bytes 1664 files changed, 731463 insertions(+) create mode 100644 float-no-zero/apidoc/global.html create mode 100644 float-no-zero/apidoc/index.html create mode 100644 float-no-zero/apidoc/ol.Attribution.html create mode 100644 float-no-zero/apidoc/ol.BrowserFeature.html create mode 100644 float-no-zero/apidoc/ol.Collection.html create mode 100644 float-no-zero/apidoc/ol.DeviceOrientation.html create mode 100644 float-no-zero/apidoc/ol.Feature.html create mode 100644 float-no-zero/apidoc/ol.FeatureOverlay.html create mode 100644 float-no-zero/apidoc/ol.Geolocation.html create mode 100644 float-no-zero/apidoc/ol.Kinetic.html create mode 100644 float-no-zero/apidoc/ol.Map.html create mode 100644 float-no-zero/apidoc/ol.MapBrowserEvent.html create mode 100644 float-no-zero/apidoc/ol.Object.html create mode 100644 float-no-zero/apidoc/ol.Observable.html create mode 100644 float-no-zero/apidoc/ol.Overlay.html create mode 100644 float-no-zero/apidoc/ol.View2D.html create mode 100644 float-no-zero/apidoc/ol.animation.html create mode 100644 float-no-zero/apidoc/ol.control.Attribution.html create mode 100644 float-no-zero/apidoc/ol.control.Control.html create mode 100644 float-no-zero/apidoc/ol.control.FullScreen.html create mode 100644 float-no-zero/apidoc/ol.control.Logo.html create mode 100644 float-no-zero/apidoc/ol.control.MousePosition.html create mode 100644 float-no-zero/apidoc/ol.control.ScaleLine.html create mode 100644 float-no-zero/apidoc/ol.control.Zoom.html create mode 100644 float-no-zero/apidoc/ol.control.ZoomSlider.html create mode 100644 float-no-zero/apidoc/ol.control.ZoomToExtent.html create mode 100644 float-no-zero/apidoc/ol.control.html create mode 100644 float-no-zero/apidoc/ol.dom.Input.html create mode 100644 float-no-zero/apidoc/ol.events.condition.html create mode 100644 float-no-zero/apidoc/ol.feature_.html create mode 100644 float-no-zero/apidoc/ol.format.Feature.html create mode 100644 float-no-zero/apidoc/ol.format.GPX.html create mode 100644 float-no-zero/apidoc/ol.format.GeoJSON.html create mode 100644 float-no-zero/apidoc/ol.format.IGC.html create mode 100644 float-no-zero/apidoc/ol.format.KML.html create mode 100644 float-no-zero/apidoc/ol.format.TopoJSON.html create mode 100644 float-no-zero/apidoc/ol.geom.Circle.html create mode 100644 float-no-zero/apidoc/ol.geom.Geometry.html create mode 100644 float-no-zero/apidoc/ol.geom.GeometryCollection.html create mode 100644 float-no-zero/apidoc/ol.geom.LineString.html create mode 100644 float-no-zero/apidoc/ol.geom.LinearRing.html create mode 100644 float-no-zero/apidoc/ol.geom.MultiLineString.html create mode 100644 float-no-zero/apidoc/ol.geom.MultiPoint.html create mode 100644 float-no-zero/apidoc/ol.geom.MultiPolygon.html create mode 100644 float-no-zero/apidoc/ol.geom.Point.html create mode 100644 float-no-zero/apidoc/ol.geom.Polygon.html create mode 100644 float-no-zero/apidoc/ol.geom.SimpleGeometry.html create mode 100644 float-no-zero/apidoc/ol.geom.html create mode 100644 float-no-zero/apidoc/ol.html create mode 100644 float-no-zero/apidoc/ol.interaction.DoubleClickZoom.html create mode 100644 float-no-zero/apidoc/ol.interaction.DragAndDrop.html create mode 100644 float-no-zero/apidoc/ol.interaction.DragBox.html create mode 100644 float-no-zero/apidoc/ol.interaction.DragPan.html create mode 100644 float-no-zero/apidoc/ol.interaction.DragRotate.html create mode 100644 float-no-zero/apidoc/ol.interaction.DragRotateAndZoom.html create mode 100644 float-no-zero/apidoc/ol.interaction.DragZoom.html create mode 100644 float-no-zero/apidoc/ol.interaction.Draw.html create mode 100644 float-no-zero/apidoc/ol.interaction.KeyboardPan.html create mode 100644 float-no-zero/apidoc/ol.interaction.KeyboardZoom.html create mode 100644 float-no-zero/apidoc/ol.interaction.Modify.html create mode 100644 float-no-zero/apidoc/ol.interaction.MouseWheelZoom.html create mode 100644 float-no-zero/apidoc/ol.interaction.Select.html create mode 100644 float-no-zero/apidoc/ol.interaction.TouchPan.html create mode 100644 float-no-zero/apidoc/ol.interaction.TouchRotate.html create mode 100644 float-no-zero/apidoc/ol.interaction.TouchZoom.html create mode 100644 float-no-zero/apidoc/ol.interaction.html create mode 100644 float-no-zero/apidoc/ol.layer.Group.html create mode 100644 float-no-zero/apidoc/ol.layer.Image.html create mode 100644 float-no-zero/apidoc/ol.layer.Layer.html create mode 100644 float-no-zero/apidoc/ol.layer.Tile.html create mode 100644 float-no-zero/apidoc/ol.layer.Vector.html create mode 100644 float-no-zero/apidoc/ol.layer.html create mode 100644 float-no-zero/apidoc/ol.parser.ogc.WMSCapabilities.html create mode 100644 float-no-zero/apidoc/ol.proj.Projection.html create mode 100644 float-no-zero/apidoc/ol.proj.html create mode 100644 float-no-zero/apidoc/ol.source.BingMaps.html create mode 100644 float-no-zero/apidoc/ol.source.GPX.html create mode 100644 float-no-zero/apidoc/ol.source.GeoJSON.html create mode 100644 float-no-zero/apidoc/ol.source.IGC.html create mode 100644 float-no-zero/apidoc/ol.source.ImageCanvas.html create mode 100644 float-no-zero/apidoc/ol.source.ImageStatic.html create mode 100644 float-no-zero/apidoc/ol.source.ImageVector.html create mode 100644 float-no-zero/apidoc/ol.source.ImageWMS.html create mode 100644 float-no-zero/apidoc/ol.source.KML.html create mode 100644 float-no-zero/apidoc/ol.source.MapGuide.html create mode 100644 float-no-zero/apidoc/ol.source.MapQuest.html create mode 100644 float-no-zero/apidoc/ol.source.OSM.html create mode 100644 float-no-zero/apidoc/ol.source.OSMXML.html create mode 100644 float-no-zero/apidoc/ol.source.Source.html create mode 100644 float-no-zero/apidoc/ol.source.Stamen.html create mode 100644 float-no-zero/apidoc/ol.source.Tile.html create mode 100644 float-no-zero/apidoc/ol.source.TileDebug.html create mode 100644 float-no-zero/apidoc/ol.source.TileJSON.html create mode 100644 float-no-zero/apidoc/ol.source.TileWMS.html create mode 100644 float-no-zero/apidoc/ol.source.TopoJSON.html create mode 100644 float-no-zero/apidoc/ol.source.Vector.html create mode 100644 float-no-zero/apidoc/ol.source.VectorFile.html create mode 100644 float-no-zero/apidoc/ol.source.WMTS.html create mode 100644 float-no-zero/apidoc/ol.source.XYZ.html create mode 100644 float-no-zero/apidoc/ol.source.Zoomify.html create mode 100644 float-no-zero/apidoc/ol.source.html create mode 100644 float-no-zero/apidoc/ol.style.Circle.html create mode 100644 float-no-zero/apidoc/ol.style.Fill.html create mode 100644 float-no-zero/apidoc/ol.style.Icon.html create mode 100644 float-no-zero/apidoc/ol.style.Image.html create mode 100644 float-no-zero/apidoc/ol.style.Stroke.html create mode 100644 float-no-zero/apidoc/ol.style.Style.html create mode 100644 float-no-zero/apidoc/ol.style.Text.html create mode 100644 float-no-zero/apidoc/ol.tilegrid.TileGrid.html create mode 100644 float-no-zero/apidoc/ol.tilegrid.WMTS.html create mode 100644 float-no-zero/apidoc/ol.tilegrid.XYZ.html create mode 100644 float-no-zero/apidoc/ol.tilegrid.Zoomify.html create mode 100644 float-no-zero/apidoc/ol.tilegrid.html create mode 100644 float-no-zero/apidoc/ol.webgl.Context.html create mode 100644 float-no-zero/apidoc/olx.animation.html create mode 100644 float-no-zero/apidoc/olx.control.html create mode 100644 float-no-zero/apidoc/olx.format.html create mode 100644 float-no-zero/apidoc/olx.html create mode 100644 float-no-zero/apidoc/olx.interaction.html create mode 100644 float-no-zero/apidoc/olx.layer.html create mode 100644 float-no-zero/apidoc/olx.parser.html create mode 100644 float-no-zero/apidoc/olx.render.html create mode 100644 float-no-zero/apidoc/olx.source.html create mode 100644 float-no-zero/apidoc/olx.style.html create mode 100644 float-no-zero/apidoc/olx.tilegrid.html create mode 100644 float-no-zero/apidoc/scripts/prettify/Apache-License-2.0.txt create mode 100644 float-no-zero/apidoc/scripts/prettify/lang-css.js create mode 100644 float-no-zero/apidoc/scripts/prettify/prettify.js create mode 100644 float-no-zero/apidoc/styles/jsdoc-default.css create mode 100644 float-no-zero/apidoc/styles/ol.css create mode 100644 float-no-zero/apidoc/styles/prettify-jsdoc.css create mode 100644 float-no-zero/apidoc/styles/prettify-tomorrow.css create mode 100644 float-no-zero/build/ol-deps.js create mode 100644 float-no-zero/build/ol-simple.js create mode 100644 float-no-zero/build/ol-whitespace.js create mode 100644 float-no-zero/build/ol.js create mode 100644 float-no-zero/closure-library/closure/goog/a11y/aria/announcer.js create mode 100644 float-no-zero/closure-library/closure/goog/a11y/aria/aria.js create mode 100644 float-no-zero/closure-library/closure/goog/a11y/aria/attributes.js create mode 100644 float-no-zero/closure-library/closure/goog/a11y/aria/datatables.js create mode 100644 float-no-zero/closure-library/closure/goog/a11y/aria/roles.js create mode 100644 float-no-zero/closure-library/closure/goog/array/array.js create mode 100644 float-no-zero/closure-library/closure/goog/asserts/asserts.js create mode 100644 float-no-zero/closure-library/closure/goog/async/animationdelay.js create mode 100644 float-no-zero/closure-library/closure/goog/async/conditionaldelay.js create mode 100644 float-no-zero/closure-library/closure/goog/async/delay.js create mode 100644 float-no-zero/closure-library/closure/goog/async/nexttick.js create mode 100644 float-no-zero/closure-library/closure/goog/async/throttle.js create mode 100644 float-no-zero/closure-library/closure/goog/base.js create mode 100644 float-no-zero/closure-library/closure/goog/bootstrap/nodejs.js create mode 100644 float-no-zero/closure-library/closure/goog/bootstrap/webworkers.js create mode 100644 float-no-zero/closure-library/closure/goog/color/alpha.js create mode 100644 float-no-zero/closure-library/closure/goog/color/color.js create mode 100644 float-no-zero/closure-library/closure/goog/color/names.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/aes.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/arc4.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/base64.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/basen.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/blobhasher.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/blockcipher.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/cbc.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/cbc_test.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/crypt.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/hash.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/hash32.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/hashtester.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/hmac.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/md5.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/pbkdf2.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/sha1.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/sha2.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/sha224.js create mode 100644 float-no-zero/closure-library/closure/goog/crypt/sha256.js create mode 100644 float-no-zero/closure-library/closure/goog/cssom/cssom.js create mode 100644 float-no-zero/closure-library/closure/goog/cssom/iframe/style.js create mode 100644 float-no-zero/closure-library/closure/goog/datasource/datamanager.js create mode 100644 float-no-zero/closure-library/closure/goog/datasource/datasource.js create mode 100644 float-no-zero/closure-library/closure/goog/datasource/expr.js create mode 100644 float-no-zero/closure-library/closure/goog/datasource/fastdatanode.js create mode 100644 float-no-zero/closure-library/closure/goog/datasource/jsdatasource.js create mode 100644 float-no-zero/closure-library/closure/goog/datasource/jsondatasource.js create mode 100644 float-no-zero/closure-library/closure/goog/datasource/jsxmlhttpdatasource.js create mode 100644 float-no-zero/closure-library/closure/goog/datasource/xmldatasource.js create mode 100644 float-no-zero/closure-library/closure/goog/date/date.js create mode 100644 float-no-zero/closure-library/closure/goog/date/datelike.js create mode 100644 float-no-zero/closure-library/closure/goog/date/daterange.js create mode 100644 float-no-zero/closure-library/closure/goog/date/relative.js create mode 100644 float-no-zero/closure-library/closure/goog/date/utcdatetime.js create mode 100644 float-no-zero/closure-library/closure/goog/db/cursor.js create mode 100644 float-no-zero/closure-library/closure/goog/db/db.js create mode 100644 float-no-zero/closure-library/closure/goog/db/error.js create mode 100644 float-no-zero/closure-library/closure/goog/db/index.js create mode 100644 float-no-zero/closure-library/closure/goog/db/indexeddb.js create mode 100644 float-no-zero/closure-library/closure/goog/db/keyrange.js create mode 100644 float-no-zero/closure-library/closure/goog/db/objectstore.js create mode 100644 float-no-zero/closure-library/closure/goog/db/transaction.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/console.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/debug.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/debugwindow.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/devcss/devcss.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/devcss/devcssrunner.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/divconsole.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/entrypointregistry.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/error.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/errorhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/errorhandlerweakdep.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/errorreporter.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/fancywindow.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/formatter.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/fpsdisplay.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/gcdiagnostics.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/logbuffer.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/logger.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/logrecord.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/logrecordserializer.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/reflect.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/relativetimeprovider.js create mode 100644 float-no-zero/closure-library/closure/goog/debug/tracer.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/autocompleteremotedata.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/autocompleterichremotedata.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/editor/deps.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/editor/equationeditor.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/editor/helloworld.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/editor/helloworlddialog.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/editor/helloworlddialogplugin.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/graphics/tigerdata.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/samplecomponent.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/tree/testdata.js create mode 100644 float-no-zero/closure-library/closure/goog/demos/xpc/xpcdemo.js create mode 100644 float-no-zero/closure-library/closure/goog/disposable/disposable.js create mode 100644 float-no-zero/closure-library/closure/goog/disposable/idisposable.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/a11y.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/abstractmultirange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/abstractrange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/annotate.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/browserfeature.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/browserrange/abstractrange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/browserrange/browserrange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/browserrange/geckorange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/browserrange/ierange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/browserrange/operarange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/browserrange/w3crange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/browserrange/webkitrange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/bufferedviewportsizemonitor.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/bufferedviewportsizemonitor_test.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/classes.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/classes_test.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/classlist.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/classlist_test.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/controlrange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/dataset.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/dom.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/dom_test.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/fontsizemonitor.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/forms.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/fullscreen.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/iframe.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/iter.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/multirange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/nodeiterator.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/nodeoffset.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/abstractpattern.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/allchildren.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/callback/callback.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/callback/counter.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/callback/test.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/childmatches.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/endtag.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/fulltag.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/matcher.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/nodetype.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/pattern.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/repeat.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/sequence.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/starttag.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/tag.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/pattern/text.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/range.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/rangeendpoint.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/savedcaretrange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/savedrange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/selection.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/tagiterator.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/tagname.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/textrange.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/textrangeiterator.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/vendor.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/viewportsizemonitor.js create mode 100644 float-no-zero/closure-library/closure/goog/dom/xml.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/browserfeature.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/clicktoeditwrapper.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/command.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/contenteditablefield.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/defines.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/field.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/field_test.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/focus.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/icontent.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/link.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/node.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugin.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/abstractbubbleplugin.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/abstractdialogplugin.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/abstracttabhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/basictextformatter.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/blockquote.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/emoticons.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/enterhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/equationeditorbubble.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/equationeditorplugin.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/firststrong.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/headerformatter.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/linkbubble.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/linkdialogplugin.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/linkshortcutplugin.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/listtabhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/loremipsum.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/removeformatting.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/spacestabhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/tableeditor.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/tagonenterhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/undoredo.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/undoredomanager.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/plugins/undoredostate.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/range.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/seamlessfield.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/seamlessfield_test.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/style.js create mode 100644 float-no-zero/closure-library/closure/goog/editor/table.js create mode 100644 float-no-zero/closure-library/closure/goog/events/actioneventwrapper.js create mode 100644 float-no-zero/closure-library/closure/goog/events/actionhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/events/browserevent.js create mode 100644 float-no-zero/closure-library/closure/goog/events/browserfeature.js create mode 100644 float-no-zero/closure-library/closure/goog/events/event.js create mode 100644 float-no-zero/closure-library/closure/goog/events/eventhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/events/events.js create mode 100644 float-no-zero/closure-library/closure/goog/events/eventtarget.js create mode 100644 float-no-zero/closure-library/closure/goog/events/eventtargettester.js create mode 100644 float-no-zero/closure-library/closure/goog/events/eventtype.js create mode 100644 float-no-zero/closure-library/closure/goog/events/eventwrapper.js create mode 100644 float-no-zero/closure-library/closure/goog/events/filedrophandler.js create mode 100644 float-no-zero/closure-library/closure/goog/events/focushandler.js create mode 100644 float-no-zero/closure-library/closure/goog/events/imehandler.js create mode 100644 float-no-zero/closure-library/closure/goog/events/inputhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/events/keycodes.js create mode 100644 float-no-zero/closure-library/closure/goog/events/keyhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/events/keynames.js create mode 100644 float-no-zero/closure-library/closure/goog/events/listenable.js create mode 100644 float-no-zero/closure-library/closure/goog/events/listener.js create mode 100644 float-no-zero/closure-library/closure/goog/events/listenermap.js create mode 100644 float-no-zero/closure-library/closure/goog/events/listenermap_test.js create mode 100644 float-no-zero/closure-library/closure/goog/events/mousewheelhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/events/onlinehandler.js create mode 100644 float-no-zero/closure-library/closure/goog/events/pastehandler.js create mode 100644 float-no-zero/closure-library/closure/goog/format/emailaddress.js create mode 100644 float-no-zero/closure-library/closure/goog/format/format.js create mode 100644 float-no-zero/closure-library/closure/goog/format/htmlprettyprinter.js create mode 100644 float-no-zero/closure-library/closure/goog/format/jsonprettyprinter.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/entry.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/entryimpl.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/error.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/filereader.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/filesaver.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/filesystem.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/filesystemimpl.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/filewriter.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/fs.js create mode 100644 float-no-zero/closure-library/closure/goog/fs/progressevent.js create mode 100644 float-no-zero/closure-library/closure/goog/functions/functions.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/abstractdragdrop.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/anim/anim.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/animation.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/animationqueue.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/css3/fx.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/css3/transition.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/cssspriteanimation.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/dom.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/dragdrop.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/dragdropgroup.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/dragger.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/draglistgroup.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/dragscrollsupport.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/easing.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/fx.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/transition.js create mode 100644 float-no-zero/closure-library/closure/goog/fx/transitionbase.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/basestore.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/database.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/gears.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/httprequest.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/loggerclient.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/loggerserver.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/logstore.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/managedresourcestore.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/multipartformdata.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/statustype.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/urlcapture.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/worker.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/workerchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/gears/workerpool.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/abstractgraphics.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/affinetransform.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/canvaselement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/canvasgraphics.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/element.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ellipseelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/coordinates.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/element.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/ellipse.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/ext.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/graphics.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/group.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/image.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/path.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/rectangle.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/shape.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/ext/strokeandfillelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/fill.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/font.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/graphics.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/groupelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/imageelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/lineargradient.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/path.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/pathelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/paths.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/rectelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/solidfill.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/stroke.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/strokeandfillelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/svgelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/svggraphics.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/textelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/vmlelement.js create mode 100644 float-no-zero/closure-library/closure/goog/graphics/vmlgraphics.js create mode 100644 float-no-zero/closure-library/closure/goog/history/event.js create mode 100644 float-no-zero/closure-library/closure/goog/history/eventtype.js create mode 100644 float-no-zero/closure-library/closure/goog/history/history.js create mode 100644 float-no-zero/closure-library/closure/goog/history/history_test.js create mode 100644 float-no-zero/closure-library/closure/goog/history/html5history.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/bidi.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/bidiformatter.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/charlistdecompressor.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/charpickerdata.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/collation.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/compactnumberformatsymbols.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/compactnumberformatsymbols_ext.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/currency.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/currencycodemap.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/datetimeformat.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/datetimeparse.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/datetimepatterns.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/datetimepatternsext.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/datetimesymbols.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/datetimesymbolsext.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/graphemebreak.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/messageformat.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/mime.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/numberformat.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/numberformatsymbols.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/numberformatsymbolsext.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/ordinalrules.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/pluralrules.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/timezone.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/uchar.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/uchar/localnamefetcher.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/uchar/namefetcher.js create mode 100644 float-no-zero/closure-library/closure/goog/i18n/uchar/remotenamefetcher.js create mode 100644 float-no-zero/closure-library/closure/goog/iter/iter.js create mode 100644 float-no-zero/closure-library/closure/goog/json/evaljsonprocessor.js create mode 100644 float-no-zero/closure-library/closure/goog/json/json.js create mode 100644 float-no-zero/closure-library/closure/goog/json/nativejsonprocessor.js create mode 100644 float-no-zero/closure-library/closure/goog/json/processor.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/classdef/classdef.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/events/touch.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/events/touch_test.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/format/csv.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/format/csv_test.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/mock/mock.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/image.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/image_test.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchannel/basetestchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchannel/channel.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchannel/requeststats.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchannel/webchannelbase.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchannel/webchannelbase_test.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchannel/webchannelbasetransport.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchannel/webchanneldebug.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchannel/webchannelrequest.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchanneltransport.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/webchanneltransportfactory.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/net/xhr.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/object/object.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/observe/notice.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/observe/observable.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/observe/observableset.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/observe/observationset.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/observe/observer.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/observe/simpleobservable.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/structs/map.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/structs/map_perf.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/structs/multimap.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/style/pixeldensitymonitor.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/style/pixeldensitymonitor_test.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/testing/assertthat.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/testing/decoratormatcher.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/testing/dictionarymatcher.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/testing/logicmatcher.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/testing/matcher.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/testing/numbermatcher.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/testing/objectmatcher.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/testing/stringmatcher.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/browser.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/browser_test.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/device.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/device_test.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/engine.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/engine_test.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/platform.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/platform_test.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/test_agents.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/util.js create mode 100644 float-no-zero/closure-library/closure/goog/labs/useragent/util_test.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/countries.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/defaultlocalenameconstants.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/genericfontnames.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/genericfontnamesdata.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/locale.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/nativenameconstants.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/scriptToLanguages.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/timezonedetection.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/timezonefingerprint.js create mode 100644 float-no-zero/closure-library/closure/goog/locale/timezonelist.js create mode 100644 float-no-zero/closure-library/closure/goog/log/log.js create mode 100644 float-no-zero/closure-library/closure/goog/log/log_test.js create mode 100644 float-no-zero/closure-library/closure/goog/math/bezier.js create mode 100644 float-no-zero/closure-library/closure/goog/math/box.js create mode 100644 float-no-zero/closure-library/closure/goog/math/coordinate.js create mode 100644 float-no-zero/closure-library/closure/goog/math/coordinate3.js create mode 100644 float-no-zero/closure-library/closure/goog/math/exponentialbackoff.js create mode 100644 float-no-zero/closure-library/closure/goog/math/integer.js create mode 100644 float-no-zero/closure-library/closure/goog/math/interpolator/interpolator1.js create mode 100644 float-no-zero/closure-library/closure/goog/math/interpolator/linear1.js create mode 100644 float-no-zero/closure-library/closure/goog/math/interpolator/pchip1.js create mode 100644 float-no-zero/closure-library/closure/goog/math/interpolator/spline1.js create mode 100644 float-no-zero/closure-library/closure/goog/math/line.js create mode 100644 float-no-zero/closure-library/closure/goog/math/long.js create mode 100644 float-no-zero/closure-library/closure/goog/math/math.js create mode 100644 float-no-zero/closure-library/closure/goog/math/matrix.js create mode 100644 float-no-zero/closure-library/closure/goog/math/range.js create mode 100644 float-no-zero/closure-library/closure/goog/math/rangeset.js create mode 100644 float-no-zero/closure-library/closure/goog/math/rect.js create mode 100644 float-no-zero/closure-library/closure/goog/math/size.js create mode 100644 float-no-zero/closure-library/closure/goog/math/tdma.js create mode 100644 float-no-zero/closure-library/closure/goog/math/vec2.js create mode 100644 float-no-zero/closure-library/closure/goog/math/vec3.js create mode 100644 float-no-zero/closure-library/closure/goog/memoize/memoize.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/abstractchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/bufferedchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/deferredchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/loggerclient.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/loggerserver.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/messagechannel.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/messaging.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/multichannel.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/portcaller.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/portchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/portnetwork.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/portoperator.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/respondingchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/testdata/portchannel_worker.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/testdata/portnetwork_worker1.js create mode 100644 float-no-zero/closure-library/closure/goog/messaging/testdata/portnetwork_worker2.js create mode 100644 float-no-zero/closure-library/closure/goog/module/abstractmoduleloader.js create mode 100644 float-no-zero/closure-library/closure/goog/module/basemodule.js create mode 100644 float-no-zero/closure-library/closure/goog/module/loader.js create mode 100644 float-no-zero/closure-library/closure/goog/module/module.js create mode 100644 float-no-zero/closure-library/closure/goog/module/moduleinfo.js create mode 100644 float-no-zero/closure-library/closure/goog/module/moduleloadcallback.js create mode 100644 float-no-zero/closure-library/closure/goog/module/moduleloader.js create mode 100644 float-no-zero/closure-library/closure/goog/module/moduleloader_test.js create mode 100644 float-no-zero/closure-library/closure/goog/module/modulemanager.js create mode 100644 float-no-zero/closure-library/closure/goog/module/testdata/modA_1.js create mode 100644 float-no-zero/closure-library/closure/goog/module/testdata/modA_2.js create mode 100644 float-no-zero/closure-library/closure/goog/module/testdata/modB_1.js create mode 100644 float-no-zero/closure-library/closure/goog/net/browserchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/net/browsertestchannel.js create mode 100644 float-no-zero/closure-library/closure/goog/net/bulkloader.js create mode 100644 float-no-zero/closure-library/closure/goog/net/bulkloaderhelper.js create mode 100644 float-no-zero/closure-library/closure/goog/net/channeldebug.js create mode 100644 float-no-zero/closure-library/closure/goog/net/channelrequest.js create mode 100644 float-no-zero/closure-library/closure/goog/net/cookies.js create mode 100644 float-no-zero/closure-library/closure/goog/net/crossdomainrpc.js create mode 100644 float-no-zero/closure-library/closure/goog/net/errorcode.js create mode 100644 float-no-zero/closure-library/closure/goog/net/eventtype.js create mode 100644 float-no-zero/closure-library/closure/goog/net/filedownloader.js create mode 100644 float-no-zero/closure-library/closure/goog/net/httpstatus.js create mode 100644 float-no-zero/closure-library/closure/goog/net/iframeio.js create mode 100644 float-no-zero/closure-library/closure/goog/net/iframeloadmonitor.js create mode 100644 float-no-zero/closure-library/closure/goog/net/imageloader.js create mode 100644 float-no-zero/closure-library/closure/goog/net/ipaddress.js create mode 100644 float-no-zero/closure-library/closure/goog/net/jsloader.js create mode 100644 float-no-zero/closure-library/closure/goog/net/jsonp.js create mode 100644 float-no-zero/closure-library/closure/goog/net/mockiframeio.js create mode 100644 float-no-zero/closure-library/closure/goog/net/multiiframeloadmonitor.js create mode 100644 float-no-zero/closure-library/closure/goog/net/networkstatusmonitor.js create mode 100644 float-no-zero/closure-library/closure/goog/net/networktester.js create mode 100644 float-no-zero/closure-library/closure/goog/net/testdata/jsloader_test1.js create mode 100644 float-no-zero/closure-library/closure/goog/net/testdata/jsloader_test2.js create mode 100644 float-no-zero/closure-library/closure/goog/net/testdata/jsloader_test3.js create mode 100644 float-no-zero/closure-library/closure/goog/net/testdata/jsloader_test4.js create mode 100644 float-no-zero/closure-library/closure/goog/net/tmpnetwork.js create mode 100644 float-no-zero/closure-library/closure/goog/net/websocket.js create mode 100644 float-no-zero/closure-library/closure/goog/net/wrapperxmlhttpfactory.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xhrio.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xhriopool.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xhrmanager.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xmlhttp.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xmlhttpfactory.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/crosspagechannel.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/crosspagechannelrole.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/frameelementmethodtransport.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/iframepollingtransport.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/iframerelaytransport.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/nativemessagingtransport.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/nixtransport.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/relay.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/transport.js create mode 100644 float-no-zero/closure-library/closure/goog/net/xpc/xpc.js create mode 100644 float-no-zero/closure-library/closure/goog/object/object.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/absoluteposition.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/abstractposition.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/anchoredposition.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/anchoredviewportposition.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/clientposition.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/clientposition_test.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/menuanchoredposition.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/positioning.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/positioning_test.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/viewportclientposition.js create mode 100644 float-no-zero/closure-library/closure/goog/positioning/viewportposition.js create mode 100644 float-no-zero/closure-library/closure/goog/proto/proto.js create mode 100644 float-no-zero/closure-library/closure/goog/proto/serializer.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/descriptor.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/fielddescriptor.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/lazydeserializer.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/message.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/objectserializer.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/package_test.pb.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/pbliteserializer.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/serializer.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/test.pb.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/textformatserializer.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/textformatserializer_test.js create mode 100644 float-no-zero/closure-library/closure/goog/proto2/util.js create mode 100644 float-no-zero/closure-library/closure/goog/pubsub/pubsub.js create mode 100644 float-no-zero/closure-library/closure/goog/reflect/reflect.js create mode 100644 float-no-zero/closure-library/closure/goog/result/deferredadaptor.js create mode 100644 float-no-zero/closure-library/closure/goog/result/dependentresult.js create mode 100644 float-no-zero/closure-library/closure/goog/result/result_interface.js create mode 100644 float-no-zero/closure-library/closure/goog/result/resultutil.js create mode 100644 float-no-zero/closure-library/closure/goog/result/simpleresult.js create mode 100644 float-no-zero/closure-library/closure/goog/soy/data.js create mode 100644 float-no-zero/closure-library/closure/goog/soy/renderer.js create mode 100644 float-no-zero/closure-library/closure/goog/soy/soy.js create mode 100644 float-no-zero/closure-library/closure/goog/soy/soy_test.js create mode 100644 float-no-zero/closure-library/closure/goog/spell/spellcheck.js create mode 100644 float-no-zero/closure-library/closure/goog/stats/basicstat.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/collectablestorage.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/encryptedstorage.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/errorcode.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/expiringstorage.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/errorcode.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/errorhandlingmechanism.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/html5localstorage.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/html5sessionstorage.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/html5webstorage.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/ieuserdata.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/iterablemechanism.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/iterablemechanismtester.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/mechanism.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/mechanismfactory.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/mechanismseparationtester.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/mechanismsharingtester.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/mechanismtester.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/mechanism/prefixedmechanism.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/richstorage.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/storage.js create mode 100644 float-no-zero/closure-library/closure/goog/storage/storage_test.js create mode 100644 float-no-zero/closure-library/closure/goog/string/linkify.js create mode 100644 float-no-zero/closure-library/closure/goog/string/newlines.js create mode 100644 float-no-zero/closure-library/closure/goog/string/newlines_test.js create mode 100644 float-no-zero/closure-library/closure/goog/string/parser.js create mode 100644 float-no-zero/closure-library/closure/goog/string/path.js create mode 100644 float-no-zero/closure-library/closure/goog/string/string.js create mode 100644 float-no-zero/closure-library/closure/goog/string/string_test.js create mode 100644 float-no-zero/closure-library/closure/goog/string/stringbuffer.js create mode 100644 float-no-zero/closure-library/closure/goog/string/stringformat.js create mode 100644 float-no-zero/closure-library/closure/goog/string/stringifier.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/avltree.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/circularbuffer.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/collection.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/heap.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/inversionmap.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/linkedmap.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/map.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/node.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/pool.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/prioritypool.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/priorityqueue.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/quadtree.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/queue.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/set.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/simplepool.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/stringset.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/structs.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/treenode.js create mode 100644 float-no-zero/closure-library/closure/goog/structs/trie.js create mode 100644 float-no-zero/closure-library/closure/goog/style/bidi.js create mode 100644 float-no-zero/closure-library/closure/goog/style/cursor.js create mode 100644 float-no-zero/closure-library/closure/goog/style/style.js create mode 100644 float-no-zero/closure-library/closure/goog/style/style_test.js create mode 100644 float-no-zero/closure-library/closure/goog/style/stylescrollbartester.js create mode 100644 float-no-zero/closure-library/closure/goog/style/transition.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/asserts.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/async/mockcontrol.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/asynctestcase.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/benchmark.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/continuationtestcase.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/deferredtestcase.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/dom.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/editor/dom.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/editor/fieldmock.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/editor/testhelper.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/events/eventobserver.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/events/events.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/events/matchers.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/events/onlinehandler.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/expectedfailures.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/fs/blob.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/fs/entry.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/fs/file.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/fs/filereader.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/fs/filesystem.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/fs/filewriter.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/fs/fs.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/fs/progressevent.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/functionmock.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/graphics.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/i18n/asserts.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/i18n/asserts_test.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/jsunit.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/loosemock.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/messaging/mockmessagechannel.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/messaging/mockmessageevent.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/messaging/mockmessageport.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/messaging/mockportnetwork.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mock.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mockclassfactory.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mockclock.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mockcontrol.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mockinterface.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mockmatchers.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mockrandom.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mockrange.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mockstorage.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/mockuseragent.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/multitestrunner.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/net/xhrio.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/net/xhriopool.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/objectpropertystring.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/performancetable.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/performancetimer.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/propertyreplacer.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/proto2/proto2.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/pseudorandom.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/recordfunction.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/shardingtestcase.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/singleton.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/stacktrace.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/storage/fakemechanism.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/strictmock.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/style/layoutasserts.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/style/style.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/testcase.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/testqueue.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/testrunner.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/ui/rendererasserts.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/ui/rendererharness.js create mode 100644 float-no-zero/closure-library/closure/goog/testing/ui/style.js create mode 100644 float-no-zero/closure-library/closure/goog/timer/timer.js create mode 100644 float-no-zero/closure-library/closure/goog/tweak/entries.js create mode 100644 float-no-zero/closure-library/closure/goog/tweak/registry.js create mode 100644 float-no-zero/closure-library/closure/goog/tweak/testhelpers.js create mode 100644 float-no-zero/closure-library/closure/goog/tweak/tweak.js create mode 100644 float-no-zero/closure-library/closure/goog/tweak/tweakui.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/abstractspellchecker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/ac.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/arraymatcher.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/autocomplete.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/inputhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/remote.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/remotearraymatcher.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/renderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/renderoptions.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/richinputhandler.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/richremote.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ac/richremotearraymatcher.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/activitymonitor.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/advancedtooltip.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/animatedzippy.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/attachablemenu.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/bidiinput.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/bubble.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/button.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/buttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/buttonside.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/charcounter.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/charpicker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/checkbox.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/checkboxmenuitem.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/checkboxrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/colorbutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/colorbuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/colormenubutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/colormenubuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/colorpalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/colorpicker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/colorsplitbehavior.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/combobox.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/component.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/container.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/containerrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/containerscroller.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/control.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/controlcontent.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/controlrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/cookieeditor.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/css3buttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/css3menubuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/cssnames.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/custombutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/custombuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/customcolorpalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/datepicker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/datepickerrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/decorate.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/defaultdatepickerrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/dialog.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/dimensionpicker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/dimensionpickerrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/dragdropdetector.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/drilldownrow.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/abstractdialog.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/bubble.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/defaulttoolbar.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/equationeditordialog.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/equationeditorokevent.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/linkdialog.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/messages.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/tabpane.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/toolbarcontroller.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/editor/toolbarfactory.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/emoji/emoji.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/emoji/emojipalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/emoji/emojipaletterenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/emoji/emojipicker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/emoji/popupemojipicker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/emoji/progressiveemojipaletterenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/emoji/spriteinfo.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/arrowpalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/changeevent.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/comparisonpalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/editorpane.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/equationeditor.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/equationeditordialog.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/greekpalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/imagerenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/mathpalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/menupalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/palette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/palettemanager.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/symbolpalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/texeditor.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/equation/texpane.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/filteredmenu.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/filterobservingmenuitem.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/filterobservingmenuitemrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/flatbuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/flatmenubuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/formpost.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/gauge.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/gaugetheme.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/hovercard.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/hsvapalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/hsvpalette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/idgenerator.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/idletimer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/iframemask.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/imagelessbuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/imagelessmenubuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/inputdatepicker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/itemevent.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/keyboardshortcuthandler.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/labelinput.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/linkbuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/flashobject.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/flickr.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/googlevideo.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/media.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/mediamodel.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/mp3.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/photo.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/picasa.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/vimeo.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/media/youtube.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menu.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menubar.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menubardecorator.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menubarrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menubase.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menubutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menubuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menuheader.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menuheaderrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menuitem.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menuitemrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menurenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menuseparator.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/menuseparatorrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/mockactivitymonitor.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/mockactivitymonitor_test.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/modalpopup.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/nativebuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/offlineinstalldialog.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/offlinestatuscard.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/offlinestatuscomponent.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/option.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/palette.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/paletterenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/plaintextspellchecker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/popup.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/popupbase.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/popupcolorpicker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/popupdatepicker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/popupmenu.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/progressbar.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/prompt.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/rangemodel.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/ratings.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/registry.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/richtextspellchecker.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/roundedpanel.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/roundedtabrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/scrollfloater.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/select.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/selectionmenubutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/selectionmodel.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/separator.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/serverchart.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/slider.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/sliderbase.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/splitbehavior.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/splitpane.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/style/app/buttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/style/app/menubuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/style/app/primaryactionbuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/submenu.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/submenurenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tab.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tabbar.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tabbarrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tablesorter.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tabpane.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tabrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/textarea.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/textarearenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/togglebutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbar.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarbutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarbuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarcolormenubutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarcolormenubuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarmenubutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarmenubuttonrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarselect.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarseparator.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbarseparatorrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/toolbartogglebutton.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tooltip.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tree/basenode.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tree/treecontrol.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tree/treenode.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tree/typeahead.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tristatemenuitem.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/tristatemenuitemrenderer.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/twothumbslider.js create mode 100644 float-no-zero/closure-library/closure/goog/ui/zippy.js create mode 100644 float-no-zero/closure-library/closure/goog/uri/uri.js create mode 100644 float-no-zero/closure-library/closure/goog/uri/uri_test.js create mode 100644 float-no-zero/closure-library/closure/goog/uri/utils.js create mode 100644 float-no-zero/closure-library/closure/goog/useragent/adobereader.js create mode 100644 float-no-zero/closure-library/closure/goog/useragent/flash.js create mode 100644 float-no-zero/closure-library/closure/goog/useragent/iphoto.js create mode 100644 float-no-zero/closure-library/closure/goog/useragent/jscript.js create mode 100644 float-no-zero/closure-library/closure/goog/useragent/picasa.js create mode 100644 float-no-zero/closure-library/closure/goog/useragent/platform.js create mode 100644 float-no-zero/closure-library/closure/goog/useragent/product.js create mode 100644 float-no-zero/closure-library/closure/goog/useragent/product_isversion.js create mode 100644 float-no-zero/closure-library/closure/goog/useragent/useragent.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/float32array.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/float64array.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/mat3.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/mat3d.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/mat3f.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/mat4.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/mat4d.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/mat4f.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/matrix3.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/matrix4.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/quaternion.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/ray.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec2.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec2d.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec2f.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec3.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec3d.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec3f.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec4.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec4d.js create mode 100644 float-no-zero/closure-library/closure/goog/vec/vec4f.js create mode 100644 float-no-zero/closure-library/closure/goog/webgl/webgl.js create mode 100644 float-no-zero/closure-library/closure/goog/window/window.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/base.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/caja/string/html/htmlparser.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/caja/string/html/htmlsanitizer.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/dojo/dom/query.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/dojo/dom/query_test.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/jpeg_encoder/jpeg_encoder_basic.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/loremipsum/text/loremipsum.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/mochikit/async/deferred.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/mochikit/async/deferredlist.js create mode 100644 float-no-zero/closure-library/third_party/closure/goog/osapi/osapi.js create mode 100644 float-no-zero/closure-library/third_party_manifest.txt create mode 100644 float-no-zero/css/ol.css create mode 100644 float-no-zero/examples/Jugl.js create mode 100644 float-no-zero/examples/accessible-require.js create mode 100644 float-no-zero/examples/accessible.html create mode 100644 float-no-zero/examples/accessible.js create mode 100644 float-no-zero/examples/animation-require.js create mode 100644 float-no-zero/examples/animation.html create mode 100644 float-no-zero/examples/animation.js create mode 100644 float-no-zero/examples/bind-input-require.js create mode 100644 float-no-zero/examples/bind-input.html create mode 100644 float-no-zero/examples/bind-input.js create mode 100644 float-no-zero/examples/bing-maps-require.js create mode 100644 float-no-zero/examples/bing-maps.html create mode 100644 float-no-zero/examples/bing-maps.js create mode 100644 float-no-zero/examples/brightness-contrast-require.js create mode 100644 float-no-zero/examples/brightness-contrast.html create mode 100644 float-no-zero/examples/brightness-contrast.js create mode 100644 float-no-zero/examples/canvas-tiles-require.js create mode 100644 float-no-zero/examples/canvas-tiles.html create mode 100644 float-no-zero/examples/canvas-tiles.js create mode 100644 float-no-zero/examples/custom-controls-require.js create mode 100644 float-no-zero/examples/custom-controls.html create mode 100644 float-no-zero/examples/custom-controls.js create mode 100644 float-no-zero/examples/d3-require.js create mode 100644 float-no-zero/examples/d3.html create mode 100644 float-no-zero/examples/d3.js create mode 100644 float-no-zero/examples/data/IGNWMTSCapabilities.xml create mode 100644 float-no-zero/examples/data/WMTSCapabilities.xml create mode 100644 float-no-zero/examples/data/geojson/countries.geojson create mode 100644 float-no-zero/examples/data/gml/topp-states-wfs.xml create mode 100644 float-no-zero/examples/data/gpx/fells_loop.gpx create mode 100644 float-no-zero/examples/data/icon.png create mode 100644 float-no-zero/examples/data/igc/Clement-Latour.igc create mode 100644 float-no-zero/examples/data/igc/Damien-de-Baenst.igc create mode 100644 float-no-zero/examples/data/igc/Sylvain-Dhonneur.igc create mode 100644 float-no-zero/examples/data/igc/Tom-Payne.igc create mode 100644 float-no-zero/examples/data/igc/Ulrich-Prinz.igc create mode 100644 float-no-zero/examples/data/kml/2012-02-10.kml create mode 100644 float-no-zero/examples/data/kml/2012_Earthquakes_Mag5.kml create mode 100644 float-no-zero/examples/data/kml/timezones.kml create mode 100644 float-no-zero/examples/data/ogcsample.xml create mode 100644 float-no-zero/examples/data/osm/map.osm create mode 100644 float-no-zero/examples/data/sld/countries.sld create mode 100644 float-no-zero/examples/data/topojson/us.json create mode 100644 float-no-zero/examples/data/topojson/world-110m.json create mode 100644 float-no-zero/examples/device-orientation-require.js create mode 100644 float-no-zero/examples/device-orientation.html create mode 100644 float-no-zero/examples/device-orientation.js create mode 100644 float-no-zero/examples/drag-and-drop-image-vector-require.js create mode 100644 float-no-zero/examples/drag-and-drop-image-vector.html create mode 100644 float-no-zero/examples/drag-and-drop-image-vector.js create mode 100644 float-no-zero/examples/drag-and-drop-require.js create mode 100644 float-no-zero/examples/drag-and-drop.html create mode 100644 float-no-zero/examples/drag-and-drop.js create mode 100644 float-no-zero/examples/drag-rotate-and-zoom-require.js create mode 100644 float-no-zero/examples/drag-rotate-and-zoom.html create mode 100644 float-no-zero/examples/drag-rotate-and-zoom.js create mode 100644 float-no-zero/examples/draw-features-require.js create mode 100644 float-no-zero/examples/draw-features.html create mode 100644 float-no-zero/examples/draw-features.js create mode 100644 float-no-zero/examples/dynamic-data-require.js create mode 100644 float-no-zero/examples/dynamic-data.html create mode 100644 float-no-zero/examples/dynamic-data.js create mode 100644 float-no-zero/examples/epsg-4326-require.js create mode 100644 float-no-zero/examples/epsg-4326.html create mode 100644 float-no-zero/examples/epsg-4326.js create mode 100644 float-no-zero/examples/example-list.js create mode 100644 float-no-zero/examples/example-list.xml create mode 100644 float-no-zero/examples/export-map-require.js create mode 100644 float-no-zero/examples/export-map.html create mode 100644 float-no-zero/examples/export-map.js create mode 100644 float-no-zero/examples/fractal-require.js create mode 100644 float-no-zero/examples/fractal.html create mode 100644 float-no-zero/examples/fractal.js create mode 100644 float-no-zero/examples/full-screen-drag-rotate-and-zoom-require.js create mode 100644 float-no-zero/examples/full-screen-drag-rotate-and-zoom.html create mode 100644 float-no-zero/examples/full-screen-drag-rotate-and-zoom.js create mode 100644 float-no-zero/examples/full-screen-require.js create mode 100644 float-no-zero/examples/full-screen.html create mode 100644 float-no-zero/examples/full-screen.js create mode 100644 float-no-zero/examples/geojson-require.js create mode 100644 float-no-zero/examples/geojson.html create mode 100644 float-no-zero/examples/geojson.js create mode 100644 float-no-zero/examples/geolocation-require.js create mode 100644 float-no-zero/examples/geolocation.html create mode 100644 float-no-zero/examples/geolocation.js create mode 100644 float-no-zero/examples/getfeatureinfo-require.js create mode 100644 float-no-zero/examples/getfeatureinfo.html create mode 100644 float-no-zero/examples/getfeatureinfo.js create mode 100644 float-no-zero/examples/google-map-require.js create mode 100644 float-no-zero/examples/google-map.html create mode 100644 float-no-zero/examples/google-map.js create mode 100644 float-no-zero/examples/gpx-require.js create mode 100644 float-no-zero/examples/gpx.html create mode 100644 float-no-zero/examples/gpx.js create mode 100644 float-no-zero/examples/heatmap-earthquakes-require.js create mode 100644 float-no-zero/examples/heatmap-earthquakes.html create mode 100644 float-no-zero/examples/heatmap-earthquakes.js create mode 100644 float-no-zero/examples/hue-saturation-require.js create mode 100644 float-no-zero/examples/hue-saturation.html create mode 100644 float-no-zero/examples/hue-saturation.js create mode 100644 float-no-zero/examples/icon-require.js create mode 100644 float-no-zero/examples/icon.html create mode 100644 float-no-zero/examples/icon.js create mode 100644 float-no-zero/examples/igc-require.js create mode 100644 float-no-zero/examples/igc.html create mode 100644 float-no-zero/examples/igc.js create mode 100644 float-no-zero/examples/image-filter-require.js create mode 100644 float-no-zero/examples/image-filter.html create mode 100644 float-no-zero/examples/image-filter.js create mode 100644 float-no-zero/examples/image-vector-layer-require.js create mode 100644 float-no-zero/examples/image-vector-layer.html create mode 100644 float-no-zero/examples/image-vector-layer.js create mode 100644 float-no-zero/examples/index.html create mode 100644 float-no-zero/examples/jquery.min.js create mode 100644 float-no-zero/examples/kml-earthquakes-require.js create mode 100644 float-no-zero/examples/kml-earthquakes.html create mode 100644 float-no-zero/examples/kml-earthquakes.js create mode 100644 float-no-zero/examples/kml-require.js create mode 100644 float-no-zero/examples/kml-timezones-require.js create mode 100644 float-no-zero/examples/kml-timezones.html create mode 100644 float-no-zero/examples/kml-timezones.js create mode 100644 float-no-zero/examples/kml.html create mode 100644 float-no-zero/examples/kml.js create mode 100644 float-no-zero/examples/layer-clipping-require.js create mode 100644 float-no-zero/examples/layer-clipping-webgl-require.js create mode 100644 float-no-zero/examples/layer-clipping-webgl.html create mode 100644 float-no-zero/examples/layer-clipping-webgl.js create mode 100644 float-no-zero/examples/layer-clipping.html create mode 100644 float-no-zero/examples/layer-clipping.js create mode 100644 float-no-zero/examples/layer-group-require.js create mode 100644 float-no-zero/examples/layer-group.html create mode 100644 float-no-zero/examples/layer-group.js create mode 100644 float-no-zero/examples/layer-spy-require.js create mode 100644 float-no-zero/examples/layer-spy.html create mode 100644 float-no-zero/examples/layer-spy.js create mode 100644 float-no-zero/examples/layer-swipe-require.js create mode 100644 float-no-zero/examples/layer-swipe.html create mode 100644 float-no-zero/examples/layer-swipe.js create mode 100644 float-no-zero/examples/loader.js create mode 100644 float-no-zero/examples/localized-openstreetmap-require.js create mode 100644 float-no-zero/examples/localized-openstreetmap.html create mode 100644 float-no-zero/examples/localized-openstreetmap.js create mode 100644 float-no-zero/examples/mapguide-untiled-require.js create mode 100644 float-no-zero/examples/mapguide-untiled.html create mode 100644 float-no-zero/examples/mapguide-untiled.js create mode 100644 float-no-zero/examples/mapquest-require.js create mode 100644 float-no-zero/examples/mapquest.html create mode 100644 float-no-zero/examples/mapquest.js create mode 100644 float-no-zero/examples/min-max-resolution-require.js create mode 100644 float-no-zero/examples/min-max-resolution.html create mode 100644 float-no-zero/examples/min-max-resolution.js create mode 100644 float-no-zero/examples/mobile-full-screen-require.js create mode 100644 float-no-zero/examples/mobile-full-screen.html create mode 100644 float-no-zero/examples/mobile-full-screen.js create mode 100644 float-no-zero/examples/modify-features-require.js create mode 100644 float-no-zero/examples/modify-features.html create mode 100644 float-no-zero/examples/modify-features.js create mode 100644 float-no-zero/examples/mouse-position-require.js create mode 100644 float-no-zero/examples/mouse-position.html create mode 100644 float-no-zero/examples/mouse-position.js create mode 100644 float-no-zero/examples/moveend-require.js create mode 100644 float-no-zero/examples/moveend.html create mode 100644 float-no-zero/examples/moveend.js create mode 100644 float-no-zero/examples/navigation-controls-require.js create mode 100644 float-no-zero/examples/navigation-controls.html create mode 100644 float-no-zero/examples/navigation-controls.js create mode 100644 float-no-zero/examples/overlay-require.js create mode 100644 float-no-zero/examples/overlay.html create mode 100644 float-no-zero/examples/overlay.js create mode 100644 float-no-zero/examples/popup-require.js create mode 100644 float-no-zero/examples/popup.html create mode 100644 float-no-zero/examples/popup.js create mode 100644 float-no-zero/examples/preload-require.js create mode 100644 float-no-zero/examples/preload.html create mode 100644 float-no-zero/examples/preload.js create mode 100644 float-no-zero/examples/rotation-require.js create mode 100644 float-no-zero/examples/rotation.html create mode 100644 float-no-zero/examples/rotation.js create mode 100644 float-no-zero/examples/rtree-require.js create mode 100644 float-no-zero/examples/rtree.html create mode 100644 float-no-zero/examples/rtree.js create mode 100644 float-no-zero/examples/scale-line-require.js create mode 100644 float-no-zero/examples/scale-line.html create mode 100644 float-no-zero/examples/scale-line.js create mode 100644 float-no-zero/examples/select-features-require.js create mode 100644 float-no-zero/examples/select-features.html create mode 100644 float-no-zero/examples/select-features.js create mode 100644 float-no-zero/examples/semi-transparent-layer-require.js create mode 100644 float-no-zero/examples/semi-transparent-layer.html create mode 100644 float-no-zero/examples/semi-transparent-layer.js create mode 100644 float-no-zero/examples/side-by-side-require.js create mode 100644 float-no-zero/examples/side-by-side.html create mode 100644 float-no-zero/examples/side-by-side.js create mode 100644 float-no-zero/examples/simple-require.js create mode 100644 float-no-zero/examples/simple.html create mode 100644 float-no-zero/examples/simple.js create mode 100644 float-no-zero/examples/stamen-require.js create mode 100644 float-no-zero/examples/stamen.html create mode 100644 float-no-zero/examples/stamen.js create mode 100644 float-no-zero/examples/static-image-require.js create mode 100644 float-no-zero/examples/static-image.html create mode 100644 float-no-zero/examples/static-image.js create mode 100644 float-no-zero/examples/synthetic-lines-require.js create mode 100644 float-no-zero/examples/synthetic-lines.html create mode 100644 float-no-zero/examples/synthetic-lines.js create mode 100644 float-no-zero/examples/synthetic-points-require.js create mode 100644 float-no-zero/examples/synthetic-points.html create mode 100644 float-no-zero/examples/synthetic-points.js create mode 100644 float-no-zero/examples/teleport-require.js create mode 100644 float-no-zero/examples/teleport.html create mode 100644 float-no-zero/examples/teleport.js create mode 100644 float-no-zero/examples/tilejson-require.js create mode 100644 float-no-zero/examples/tilejson.html create mode 100644 float-no-zero/examples/tilejson.js create mode 100644 float-no-zero/examples/topojson-require.js create mode 100644 float-no-zero/examples/topojson.html create mode 100644 float-no-zero/examples/topojson.js create mode 100644 float-no-zero/examples/vector-layer-require.js create mode 100644 float-no-zero/examples/vector-layer.html create mode 100644 float-no-zero/examples/vector-layer.js create mode 100644 float-no-zero/examples/vector-osm-require.js create mode 100644 float-no-zero/examples/vector-osm.html create mode 100644 float-no-zero/examples/vector-osm.js create mode 100644 float-no-zero/examples/wms-capabilities-require.js create mode 100644 float-no-zero/examples/wms-capabilities.html create mode 100644 float-no-zero/examples/wms-capabilities.js create mode 100644 float-no-zero/examples/wms-custom-proj-require.js create mode 100644 float-no-zero/examples/wms-custom-proj.html create mode 100644 float-no-zero/examples/wms-custom-proj.js create mode 100644 float-no-zero/examples/wms-image-custom-proj-require.js create mode 100644 float-no-zero/examples/wms-image-custom-proj.html create mode 100644 float-no-zero/examples/wms-image-custom-proj.js create mode 100644 float-no-zero/examples/wms-image-require.js create mode 100644 float-no-zero/examples/wms-image.html create mode 100644 float-no-zero/examples/wms-image.js create mode 100644 float-no-zero/examples/wms-no-proj-require.js create mode 100644 float-no-zero/examples/wms-no-proj.html create mode 100644 float-no-zero/examples/wms-no-proj.js create mode 100644 float-no-zero/examples/wms-tiled-require.js create mode 100644 float-no-zero/examples/wms-tiled.html create mode 100644 float-no-zero/examples/wms-tiled.js create mode 100644 float-no-zero/examples/wmts-require.js create mode 100644 float-no-zero/examples/wmts.html create mode 100644 float-no-zero/examples/wmts.js create mode 100644 float-no-zero/examples/xyz-esri-require.js create mode 100644 float-no-zero/examples/xyz-esri.html create mode 100644 float-no-zero/examples/xyz-esri.js create mode 100644 float-no-zero/examples/zoomify-require.js create mode 100644 float-no-zero/examples/zoomify.html create mode 100644 float-no-zero/examples/zoomify.js create mode 100644 float-no-zero/examples/zoomslider-require.js create mode 100644 float-no-zero/examples/zoomslider.html create mode 100644 float-no-zero/examples/zoomslider.js create mode 100644 float-no-zero/ol/ol/animation.exports create mode 100644 float-no-zero/ol/ol/animation.js create mode 100644 float-no-zero/ol/ol/animation.jsdoc create mode 100644 float-no-zero/ol/ol/array.js create mode 100644 float-no-zero/ol/ol/attribution.exports create mode 100644 float-no-zero/ol/ol/attribution.js create mode 100644 float-no-zero/ol/ol/binary.js create mode 100644 float-no-zero/ol/ol/browserfeature.exports create mode 100644 float-no-zero/ol/ol/browserfeature.js create mode 100644 float-no-zero/ol/ol/browserfeature.jsdoc create mode 100644 float-no-zero/ol/ol/canvasfunction.js create mode 100644 float-no-zero/ol/ol/centerconstraint.js create mode 100644 float-no-zero/ol/ol/collection.exports create mode 100644 float-no-zero/ol/ol/collection.js create mode 100644 float-no-zero/ol/ol/color/color.exports create mode 100644 float-no-zero/ol/ol/color/color.js create mode 100644 float-no-zero/ol/ol/color/colormatrix.js create mode 100644 float-no-zero/ol/ol/constraints.js create mode 100644 float-no-zero/ol/ol/control.jsdoc create mode 100644 float-no-zero/ol/ol/control/attributioncontrol.exports create mode 100644 float-no-zero/ol/ol/control/attributioncontrol.js create mode 100644 float-no-zero/ol/ol/control/control.exports create mode 100644 float-no-zero/ol/ol/control/control.js create mode 100644 float-no-zero/ol/ol/control/controldefaults.exports create mode 100644 float-no-zero/ol/ol/control/controldefaults.js create mode 100644 float-no-zero/ol/ol/control/fullscreencontrol.exports create mode 100644 float-no-zero/ol/ol/control/fullscreencontrol.js create mode 100644 float-no-zero/ol/ol/control/logocontrol.exports create mode 100644 float-no-zero/ol/ol/control/logocontrol.js create mode 100644 float-no-zero/ol/ol/control/mousepositioncontrol.exports create mode 100644 float-no-zero/ol/ol/control/mousepositioncontrol.js create mode 100644 float-no-zero/ol/ol/control/scalelinecontrol.exports create mode 100644 float-no-zero/ol/ol/control/scalelinecontrol.js create mode 100644 float-no-zero/ol/ol/control/zoomcontrol.exports create mode 100644 float-no-zero/ol/ol/control/zoomcontrol.js create mode 100644 float-no-zero/ol/ol/control/zoomslidercontrol.exports create mode 100644 float-no-zero/ol/ol/control/zoomslidercontrol.js create mode 100644 float-no-zero/ol/ol/control/zoomtoextentcontrol.exports create mode 100644 float-no-zero/ol/ol/control/zoomtoextentcontrol.js create mode 100644 float-no-zero/ol/ol/coordinate.exports create mode 100644 float-no-zero/ol/ol/coordinate.js create mode 100644 float-no-zero/ol/ol/css.js create mode 100644 float-no-zero/ol/ol/deviceorientation.exports create mode 100644 float-no-zero/ol/ol/deviceorientation.js create mode 100644 float-no-zero/ol/ol/dom/dom.js create mode 100644 float-no-zero/ol/ol/dom/input.exports create mode 100644 float-no-zero/ol/ol/dom/input.js create mode 100644 float-no-zero/ol/ol/easing.exports create mode 100644 float-no-zero/ol/ol/easing.js create mode 100644 float-no-zero/ol/ol/ellipsoid/bessel1841ellipsoid.js create mode 100644 float-no-zero/ol/ol/ellipsoid/ellipsoid.js create mode 100644 float-no-zero/ol/ol/ellipsoid/wgs84ellipsoid.js create mode 100644 float-no-zero/ol/ol/events/condition.exports create mode 100644 float-no-zero/ol/ol/events/condition.js create mode 100644 float-no-zero/ol/ol/events/condition.jsdoc create mode 100644 float-no-zero/ol/ol/extent.exports create mode 100644 float-no-zero/ol/ol/extent.js create mode 100644 float-no-zero/ol/ol/feature.exports create mode 100644 float-no-zero/ol/ol/feature.js create mode 100644 float-no-zero/ol/ol/feature.jsdoc create mode 100644 float-no-zero/ol/ol/featureoverlay.exports create mode 100644 float-no-zero/ol/ol/featureoverlay.js create mode 100644 float-no-zero/ol/ol/format/binaryfeatureformat.js create mode 100644 float-no-zero/ol/ol/format/featureformat.js create mode 100644 float-no-zero/ol/ol/format/format.js create mode 100644 float-no-zero/ol/ol/format/geojsonformat.exports create mode 100644 float-no-zero/ol/ol/format/geojsonformat.js create mode 100644 float-no-zero/ol/ol/format/gmlformat.js create mode 100644 float-no-zero/ol/ol/format/gpxformat.exports create mode 100644 float-no-zero/ol/ol/format/gpxformat.js create mode 100644 float-no-zero/ol/ol/format/igcformat.exports create mode 100644 float-no-zero/ol/ol/format/igcformat.js create mode 100644 float-no-zero/ol/ol/format/jsonfeatureformat.js create mode 100644 float-no-zero/ol/ol/format/kmlformat.exports create mode 100644 float-no-zero/ol/ol/format/kmlformat.js create mode 100644 float-no-zero/ol/ol/format/osmxmlformat.js create mode 100644 float-no-zero/ol/ol/format/polylineformat.js create mode 100644 float-no-zero/ol/ol/format/textfeatureformat.js create mode 100644 float-no-zero/ol/ol/format/topojsonformat.exports create mode 100644 float-no-zero/ol/ol/format/topojsonformat.js create mode 100644 float-no-zero/ol/ol/format/xmlfeatureformat.js create mode 100644 float-no-zero/ol/ol/format/xsdformat.js create mode 100644 float-no-zero/ol/ol/framestate.js create mode 100644 float-no-zero/ol/ol/geolocation.exports create mode 100644 float-no-zero/ol/ol/geolocation.js create mode 100644 float-no-zero/ol/ol/geom/circle.exports create mode 100644 float-no-zero/ol/ol/geom/circle.js create mode 100644 float-no-zero/ol/ol/geom/closestgeom.js create mode 100644 float-no-zero/ol/ol/geom/flatgeom.js create mode 100644 float-no-zero/ol/ol/geom/geom.jsdoc create mode 100644 float-no-zero/ol/ol/geom/geometry.exports create mode 100644 float-no-zero/ol/ol/geom/geometry.js create mode 100644 float-no-zero/ol/ol/geom/geometrycollection.exports create mode 100644 float-no-zero/ol/ol/geom/geometrycollection.js create mode 100644 float-no-zero/ol/ol/geom/linearring.exports create mode 100644 float-no-zero/ol/ol/geom/linearring.js create mode 100644 float-no-zero/ol/ol/geom/linestring.exports create mode 100644 float-no-zero/ol/ol/geom/linestring.js create mode 100644 float-no-zero/ol/ol/geom/multilinestring.exports create mode 100644 float-no-zero/ol/ol/geom/multilinestring.js create mode 100644 float-no-zero/ol/ol/geom/multipoint.exports create mode 100644 float-no-zero/ol/ol/geom/multipoint.js create mode 100644 float-no-zero/ol/ol/geom/multipolygon.exports create mode 100644 float-no-zero/ol/ol/geom/multipolygon.js create mode 100644 float-no-zero/ol/ol/geom/point.exports create mode 100644 float-no-zero/ol/ol/geom/point.js create mode 100644 float-no-zero/ol/ol/geom/polygon.exports create mode 100644 float-no-zero/ol/ol/geom/polygon.js create mode 100644 float-no-zero/ol/ol/geom/simplegeometry.exports create mode 100644 float-no-zero/ol/ol/geom/simplegeometry.js create mode 100644 float-no-zero/ol/ol/geom/simplifygeom.js create mode 100644 float-no-zero/ol/ol/image.js create mode 100644 float-no-zero/ol/ol/imagebase.js create mode 100644 float-no-zero/ol/ol/imagecanvas.js create mode 100644 float-no-zero/ol/ol/imagetile.exports create mode 100644 float-no-zero/ol/ol/imagetile.js create mode 100644 float-no-zero/ol/ol/imageurlfunction.js create mode 100644 float-no-zero/ol/ol/interaction/doubleclickzoom.exports create mode 100644 float-no-zero/ol/ol/interaction/doubleclickzoominteraction.js create mode 100644 float-no-zero/ol/ol/interaction/draganddropinteraction.exports create mode 100644 float-no-zero/ol/ol/interaction/draganddropinteraction.js create mode 100644 float-no-zero/ol/ol/interaction/dragboxinteraction.exports create mode 100644 float-no-zero/ol/ol/interaction/dragboxinteraction.js create mode 100644 float-no-zero/ol/ol/interaction/draginteraction.js create mode 100644 float-no-zero/ol/ol/interaction/dragpan.exports create mode 100644 float-no-zero/ol/ol/interaction/dragpaninteraction.js create mode 100644 float-no-zero/ol/ol/interaction/dragrotate.exports create mode 100644 float-no-zero/ol/ol/interaction/dragrotateandzoom.exports create mode 100644 float-no-zero/ol/ol/interaction/dragrotateandzoominteraction.js create mode 100644 float-no-zero/ol/ol/interaction/dragrotateinteraction.js create mode 100644 float-no-zero/ol/ol/interaction/dragzoominteraction.exports create mode 100644 float-no-zero/ol/ol/interaction/dragzoominteraction.js create mode 100644 float-no-zero/ol/ol/interaction/drawinteraction.exports create mode 100644 float-no-zero/ol/ol/interaction/drawinteraction.js create mode 100644 float-no-zero/ol/ol/interaction/interaction.js create mode 100644 float-no-zero/ol/ol/interaction/interaction.jsdoc create mode 100644 float-no-zero/ol/ol/interaction/interactiondefaults.exports create mode 100644 float-no-zero/ol/ol/interaction/interactiondefaults.js create mode 100644 float-no-zero/ol/ol/interaction/keyboardpan.exports create mode 100644 float-no-zero/ol/ol/interaction/keyboardpaninteraction.js create mode 100644 float-no-zero/ol/ol/interaction/keyboardzoom.exports create mode 100644 float-no-zero/ol/ol/interaction/keyboardzoominteraction.js create mode 100644 float-no-zero/ol/ol/interaction/modifyinteraction.exports create mode 100644 float-no-zero/ol/ol/interaction/modifyinteraction.js create mode 100644 float-no-zero/ol/ol/interaction/mousewheelzoom.exports create mode 100644 float-no-zero/ol/ol/interaction/mousewheelzoominteraction.js create mode 100644 float-no-zero/ol/ol/interaction/selectinteraction.exports create mode 100644 float-no-zero/ol/ol/interaction/selectinteraction.js create mode 100644 float-no-zero/ol/ol/interaction/touchinteraction.js create mode 100644 float-no-zero/ol/ol/interaction/touchpan.exports create mode 100644 float-no-zero/ol/ol/interaction/touchpaninteraction.js create mode 100644 float-no-zero/ol/ol/interaction/touchrotate.exports create mode 100644 float-no-zero/ol/ol/interaction/touchrotateinteraction.js create mode 100644 float-no-zero/ol/ol/interaction/touchzoom.exports create mode 100644 float-no-zero/ol/ol/interaction/touchzoominteraction.js create mode 100644 float-no-zero/ol/ol/iview.js create mode 100644 float-no-zero/ol/ol/iview2d.js create mode 100644 float-no-zero/ol/ol/iview3d.js create mode 100644 float-no-zero/ol/ol/kinetic.exports create mode 100644 float-no-zero/ol/ol/kinetic.js create mode 100644 float-no-zero/ol/ol/layer/heatmaplayer.exports create mode 100644 float-no-zero/ol/ol/layer/heatmaplayer.js create mode 100644 float-no-zero/ol/ol/layer/imagelayer.exports create mode 100644 float-no-zero/ol/ol/layer/imagelayer.js create mode 100644 float-no-zero/ol/ol/layer/layer.exports create mode 100644 float-no-zero/ol/ol/layer/layer.js create mode 100644 float-no-zero/ol/ol/layer/layer.jsdoc create mode 100644 float-no-zero/ol/ol/layer/layerbase.js create mode 100644 float-no-zero/ol/ol/layer/layergroup.exports create mode 100644 float-no-zero/ol/ol/layer/layergroup.js create mode 100644 float-no-zero/ol/ol/layer/tilelayer.exports create mode 100644 float-no-zero/ol/ol/layer/tilelayer.js create mode 100644 float-no-zero/ol/ol/layer/vectorlayer.exports create mode 100644 float-no-zero/ol/ol/layer/vectorlayer.js create mode 100644 float-no-zero/ol/ol/map.exports create mode 100644 float-no-zero/ol/ol/map.js create mode 100644 float-no-zero/ol/ol/mapbrowserevent.exports create mode 100644 float-no-zero/ol/ol/mapbrowserevent.js create mode 100644 float-no-zero/ol/ol/mapevent.js create mode 100644 float-no-zero/ol/ol/math.js create mode 100644 float-no-zero/ol/ol/object.exports create mode 100644 float-no-zero/ol/ol/object.js create mode 100644 float-no-zero/ol/ol/observable.exports create mode 100644 float-no-zero/ol/ol/observable.js create mode 100644 float-no-zero/ol/ol/ol.exports create mode 100644 float-no-zero/ol/ol/ol.js create mode 100644 float-no-zero/ol/ol/overlay.exports create mode 100644 float-no-zero/ol/ol/overlay.js create mode 100644 float-no-zero/ol/ol/parser/ogc/exceptionreportparser.js create mode 100644 float-no-zero/ol/ol/parser/ogc/versionedparser.js create mode 100644 float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser.exports create mode 100644 float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser.js create mode 100644 float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1.js create mode 100644 float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_0_0.js create mode 100644 float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1.js create mode 100644 float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_0.js create mode 100644 float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_1.js create mode 100644 float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_1_WMSC.js create mode 100644 float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_3_0.js create mode 100644 float-no-zero/ol/ol/parser/parser.js create mode 100644 float-no-zero/ol/ol/parser/xmlparser.js create mode 100644 float-no-zero/ol/ol/pixel.js create mode 100644 float-no-zero/ol/ol/proj/chprojection.js create mode 100644 float-no-zero/ol/ol/proj/common.js create mode 100644 float-no-zero/ol/ol/proj/epsg3857projection.js create mode 100644 float-no-zero/ol/ol/proj/epsg4326projection.js create mode 100644 float-no-zero/ol/ol/proj/proj.exports create mode 100644 float-no-zero/ol/ol/proj/proj.js create mode 100644 float-no-zero/ol/ol/proj/proj.jsdoc create mode 100644 float-no-zero/ol/ol/render/box.js create mode 100644 float-no-zero/ol/ol/render/canvas/canvas.js create mode 100644 float-no-zero/ol/ol/render/canvas/canvasimmediate.exports create mode 100644 float-no-zero/ol/ol/render/canvas/canvasimmediate.js create mode 100644 float-no-zero/ol/ol/render/canvas/canvasreplay.js create mode 100644 float-no-zero/ol/ol/render/ireplay.js create mode 100644 float-no-zero/ol/ol/render/ivectorcontext.js create mode 100644 float-no-zero/ol/ol/render/renderevent.js create mode 100644 float-no-zero/ol/ol/render/vector.js create mode 100644 float-no-zero/ol/ol/render/webgl/webglimmediate.js create mode 100644 float-no-zero/ol/ol/renderer/canvas/canvasimagelayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/canvas/canvaslayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/canvas/canvasmaprenderer.js create mode 100644 float-no-zero/ol/ol/renderer/canvas/canvastilelayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/canvas/canvasvectorlayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/dom/domimagelayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/dom/domlayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/dom/dommaprenderer.js create mode 100644 float-no-zero/ol/ol/renderer/dom/domtilelayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/layerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/maprenderer.js create mode 100644 float-no-zero/ol/ol/renderer/webgl/webglimagelayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/webgl/webgllayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/webgl/webglmapcolor.glsl create mode 100644 float-no-zero/ol/ol/renderer/webgl/webglmapcolorshader.js create mode 100644 float-no-zero/ol/ol/renderer/webgl/webglmapdefault.glsl create mode 100644 float-no-zero/ol/ol/renderer/webgl/webglmapdefaultshader.js create mode 100644 float-no-zero/ol/ol/renderer/webgl/webglmaprenderer.js create mode 100644 float-no-zero/ol/ol/renderer/webgl/webgltilelayer.glsl create mode 100644 float-no-zero/ol/ol/renderer/webgl/webgltilelayerrenderer.js create mode 100644 float-no-zero/ol/ol/renderer/webgl/webgltilelayershader.js create mode 100644 float-no-zero/ol/ol/resolutionconstraint.js create mode 100644 float-no-zero/ol/ol/rotationconstraint.js create mode 100644 float-no-zero/ol/ol/size.js create mode 100644 float-no-zero/ol/ol/source.jsdoc create mode 100644 float-no-zero/ol/ol/source/bingmapssource.exports create mode 100644 float-no-zero/ol/ol/source/bingmapssource.js create mode 100644 float-no-zero/ol/ol/source/debugtilesource.exports create mode 100644 float-no-zero/ol/ol/source/debugtilesource.js create mode 100644 float-no-zero/ol/ol/source/geojsonsource.exports create mode 100644 float-no-zero/ol/ol/source/geojsonsource.js create mode 100644 float-no-zero/ol/ol/source/gpxsource.exports create mode 100644 float-no-zero/ol/ol/source/gpxsource.js create mode 100644 float-no-zero/ol/ol/source/igcsource.exports create mode 100644 float-no-zero/ol/ol/source/igcsource.js create mode 100644 float-no-zero/ol/ol/source/imagecanvassource.exports create mode 100644 float-no-zero/ol/ol/source/imagecanvassource.js create mode 100644 float-no-zero/ol/ol/source/imagesource.js create mode 100644 float-no-zero/ol/ol/source/imagestaticsource.exports create mode 100644 float-no-zero/ol/ol/source/imagestaticsource.js create mode 100644 float-no-zero/ol/ol/source/imagevectorsource.exports create mode 100644 float-no-zero/ol/ol/source/imagevectorsource.js create mode 100644 float-no-zero/ol/ol/source/imagewmssource.exports create mode 100644 float-no-zero/ol/ol/source/imagewmssource.js create mode 100644 float-no-zero/ol/ol/source/kmlsource.exports create mode 100644 float-no-zero/ol/ol/source/kmlsource.js create mode 100644 float-no-zero/ol/ol/source/mapguidesource.exports create mode 100644 float-no-zero/ol/ol/source/mapguidesource.js create mode 100644 float-no-zero/ol/ol/source/mapquestsource.exports create mode 100644 float-no-zero/ol/ol/source/mapquestsource.js create mode 100644 float-no-zero/ol/ol/source/osmsource.exports create mode 100644 float-no-zero/ol/ol/source/osmsource.js create mode 100644 float-no-zero/ol/ol/source/osmxmlsource.exports create mode 100644 float-no-zero/ol/ol/source/osmxmlsource.js create mode 100644 float-no-zero/ol/ol/source/source.exports create mode 100644 float-no-zero/ol/ol/source/source.js create mode 100644 float-no-zero/ol/ol/source/stamensource.exports create mode 100644 float-no-zero/ol/ol/source/stamensource.js create mode 100644 float-no-zero/ol/ol/source/tileimagesource.js create mode 100644 float-no-zero/ol/ol/source/tilejsonsource.exports create mode 100644 float-no-zero/ol/ol/source/tilejsonsource.js create mode 100644 float-no-zero/ol/ol/source/tilesource.exports create mode 100644 float-no-zero/ol/ol/source/tilesource.js create mode 100644 float-no-zero/ol/ol/source/tilewmssource.exports create mode 100644 float-no-zero/ol/ol/source/tilewmssource.js create mode 100644 float-no-zero/ol/ol/source/topojsonsource.exports create mode 100644 float-no-zero/ol/ol/source/topojsonsource.js create mode 100644 float-no-zero/ol/ol/source/vectorfilesource.exports create mode 100644 float-no-zero/ol/ol/source/vectorfilesource.js create mode 100644 float-no-zero/ol/ol/source/vectorsource.exports create mode 100644 float-no-zero/ol/ol/source/vectorsource.js create mode 100644 float-no-zero/ol/ol/source/wmssource.js create mode 100644 float-no-zero/ol/ol/source/wmtssource.exports create mode 100644 float-no-zero/ol/ol/source/wmtssource.js create mode 100644 float-no-zero/ol/ol/source/xyzsource.exports create mode 100644 float-no-zero/ol/ol/source/xyzsource.js create mode 100644 float-no-zero/ol/ol/source/zoomifysource.exports create mode 100644 float-no-zero/ol/ol/source/zoomifysource.js create mode 100644 float-no-zero/ol/ol/sphere/normal.js create mode 100644 float-no-zero/ol/ol/sphere/sphere.js create mode 100644 float-no-zero/ol/ol/sphere/wgs84sphere.js create mode 100644 float-no-zero/ol/ol/structs/buffer.js create mode 100644 float-no-zero/ol/ol/structs/integerset.js create mode 100644 float-no-zero/ol/ol/structs/lrucache.js create mode 100644 float-no-zero/ol/ol/structs/priorityqueue.js create mode 100644 float-no-zero/ol/ol/structs/rbush.js create mode 100644 float-no-zero/ol/ol/style/circlestyle.exports create mode 100644 float-no-zero/ol/ol/style/circlestyle.js create mode 100644 float-no-zero/ol/ol/style/fillstyle.exports create mode 100644 float-no-zero/ol/ol/style/fillstyle.js create mode 100644 float-no-zero/ol/ol/style/iconstyle.exports create mode 100644 float-no-zero/ol/ol/style/iconstyle.js create mode 100644 float-no-zero/ol/ol/style/imagestyle.exports create mode 100644 float-no-zero/ol/ol/style/imagestyle.js create mode 100644 float-no-zero/ol/ol/style/strokestyle.exports create mode 100644 float-no-zero/ol/ol/style/strokestyle.js create mode 100644 float-no-zero/ol/ol/style/style.exports create mode 100644 float-no-zero/ol/ol/style/style.js create mode 100644 float-no-zero/ol/ol/style/textstyle.exports create mode 100644 float-no-zero/ol/ol/style/textstyle.js create mode 100644 float-no-zero/ol/ol/tile.exports create mode 100644 float-no-zero/ol/ol/tile.js create mode 100644 float-no-zero/ol/ol/tilecache.js create mode 100644 float-no-zero/ol/ol/tilecoord.exports create mode 100644 float-no-zero/ol/ol/tilecoord.js create mode 100644 float-no-zero/ol/ol/tilegrid.jsdoc create mode 100644 float-no-zero/ol/ol/tilegrid/tilegrid.exports create mode 100644 float-no-zero/ol/ol/tilegrid/tilegrid.js create mode 100644 float-no-zero/ol/ol/tilegrid/wmtstilegrid.exports create mode 100644 float-no-zero/ol/ol/tilegrid/wmtstilegrid.js create mode 100644 float-no-zero/ol/ol/tilegrid/xyztilegrid.exports create mode 100644 float-no-zero/ol/ol/tilegrid/xyztilegrid.js create mode 100644 float-no-zero/ol/ol/tilegrid/zoomifytilegrid.exports create mode 100644 float-no-zero/ol/ol/tilegrid/zoomifytilegrid.js create mode 100644 float-no-zero/ol/ol/tileloadfunction.js create mode 100644 float-no-zero/ol/ol/tilequeue.js create mode 100644 float-no-zero/ol/ol/tilerange.js create mode 100644 float-no-zero/ol/ol/tileurlfunction.js create mode 100644 float-no-zero/ol/ol/transformfunction.js create mode 100644 float-no-zero/ol/ol/vec/mat4.js create mode 100644 float-no-zero/ol/ol/view.js create mode 100644 float-no-zero/ol/ol/view2d.exports create mode 100644 float-no-zero/ol/ol/view2d.js create mode 100644 float-no-zero/ol/ol/webgl/context.exports create mode 100644 float-no-zero/ol/ol/webgl/context.js create mode 100644 float-no-zero/ol/ol/webgl/shader.js create mode 100644 float-no-zero/ol/ol/webgl/shader.mustache create mode 100644 float-no-zero/ol/ol/webgl/webgl.js create mode 100644 float-no-zero/ol/ol/xml.js create mode 100644 float-no-zero/resources/bootstrap/css/bootstrap-responsive.css create mode 100644 float-no-zero/resources/bootstrap/css/bootstrap-responsive.min.css create mode 100644 float-no-zero/resources/bootstrap/css/bootstrap.css create mode 100644 float-no-zero/resources/bootstrap/css/bootstrap.min.css create mode 100644 float-no-zero/resources/bootstrap/img/glyphicons-halflings-white.png create mode 100644 float-no-zero/resources/bootstrap/img/glyphicons-halflings.png create mode 100644 float-no-zero/resources/bootstrap/js/bootstrap.js create mode 100644 float-no-zero/resources/bootstrap/js/bootstrap.min.js create mode 100644 float-no-zero/resources/display-frame-rate.js create mode 100644 float-no-zero/resources/example-behaviour.js create mode 100644 float-no-zero/resources/layout.css create mode 100644 float-no-zero/resources/logo-32x32-optimized.png create mode 100644 float-no-zero/resources/logo-32x32.png create mode 100644 float-no-zero/resources/logo.png create mode 100644 float-no-zero/resources/textured_paper.jpeg diff --git a/float-no-zero/apidoc/global.html b/float-no-zero/apidoc/global.html new file mode 100644 index 0000000000..dd6a19ca9e --- /dev/null +++ b/float-no-zero/apidoc/global.html @@ -0,0 +1,452 @@ + + + + + OpenLayers 3 API Documentation - Global + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ grid +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilejsonsource.js, line 33
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+

+ number +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • gpxformat.js, line 274
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+

+ number +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • gpxformat.js, line 305
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+

+ number +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • gpxformat.js, line 611
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+

+ number +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • gpxformat.js, line 642
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/index.html b/float-no-zero/apidoc/index.html new file mode 100644 index 0000000000..165af0487a --- /dev/null +++ b/float-no-zero/apidoc/index.html @@ -0,0 +1,169 @@ + + + + + OpenLayers 3 API Documentation - Index + + + + + + + + + + + + + + + + +
+ + + + + + +

+ + + + + + + + + + + + + + +
+

Finding your way around

+

See the class list to the right and especially take a look at ol.Map and ol.layer.Layer because those are the central objects.

+

In general every use of OpenLayers starts by initializing a map, then adding the required layers. Controls and interactions can be added to change the behavior of the map.

+

Projections

+

A ol.proj.Projection defines which point on earth is represented by a pair of coordinates. +Coordinates within OpenLayers can be used in various projections where some common projections are always supported, +others can be used via Proj4js.

+

Maps and Layers

+

A map in OpenLayers is essentially a staple of layers that is viewed from the top. Layers are responsible for retrieving data and displaying it.

+

Contributing

+

See CONTRIBUTING.md for instructions +on building and testing OpenLayers. The file does also describe how to commit your changes to OpenLayers.

+
+ + + + + + + + +
+ +
+

+ src/googx/dom/fullscreen.js +

+ +
+ +
+
+ + + + +

Functions for managing full screen status of the DOM.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • fullscreen.js, line 15
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.Attribution.html b/float-no-zero/apidoc/ol.Attribution.html new file mode 100644 index 0000000000..3052080674 --- /dev/null +++ b/float-no-zero/apidoc/ol.Attribution.html @@ -0,0 +1,219 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.Attribution + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.Attribution +

+ +
+ +
+
+ + + + +
+

new Attribution

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Create a new attribution to be associated with a layer source.

+

Example:

+
source: new ol.source.OSM({
+  attributions: [
+  new ol.Attribution({
+    html: 'All maps © ' +
+        '<a href="http://www.opencyclemap.org/">OpenCycleMap</a>'
+  }),
+  ol.source.OSM.DATA_ATTRIBUTION
+],
+..
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.AttributionOptions + + + +

Attribution options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • attribution.js, line 27
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.BrowserFeature.html b/float-no-zero/apidoc/ol.BrowserFeature.html new file mode 100644 index 0000000000..76a89cf816 --- /dev/null +++ b/float-no-zero/apidoc/ol.BrowserFeature.html @@ -0,0 +1,465 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.BrowserFeature + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.BrowserFeature +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • browserfeature.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Members

+ +
+ +
+

<static, constant> DEVICE_PIXEL_RATIO :number

+ + +
Stability: experimental
+ + + + +
+
+ +
+

The ratio between physical pixels and device-independent pixels +(dips) on the device (window.devicePixelRatio).

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • browserfeature.js, line 73
+ + + + + + + +
+ + + +
+ + + +
+

<static, constant> HAS_CANVAS :boolean

+ + +
Stability: experimental
+ + + + +
+
+ +
+

True if browser supports Canvas.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • browserfeature.js, line 98
+ + + + + + + +
+ + + +
+ + + +
+

<static, constant> HAS_DEVICE_ORIENTATION :boolean

+ + +
Stability: experimental
+ + + + +
+
+ +
+

Indicates if DeviceOrientation is supported in the user's browser.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • browserfeature.js, line 131
+ + + + + + + +
+ + + +
+ + + +
+

<static, constant> HAS_GEOLOCATION :boolean

+ + +
Stability: experimental
+ + + + +
+
+ +
+

Is HTML5 geolocation supported in the current browser?

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • browserfeature.js, line 150
+ + + + + + + +
+ + + +
+ + + +
+

<static, constant> HAS_TOUCH :boolean

+ + +
Stability: experimental
+ + + + +
+
+ +
+

True if browser supports touch events.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • browserfeature.js, line 159
+ + + + + + + +
+ + + +
+ + + +
+

<static, constant> HAS_WEBGL :boolean

+ + +
Stability: experimental
+ + + + +
+
+ +
+

True if browser supports WebGL.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • browserfeature.js, line 171
+ + + + + + + +
+ + + +
+ +
+ + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.Collection.html b/float-no-zero/apidoc/ol.Collection.html new file mode 100644 index 0000000000..b085451ddf --- /dev/null +++ b/float-no-zero/apidoc/ol.Collection.html @@ -0,0 +1,3584 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.Collection + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.Collection +

+ +
+ +
+
+ + + + +
+

new Collection

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

A mutable MVC Array.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
array + + +Array + + + + + + <optional>
+ + + +

Array.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 64
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
length + + +number + + + + nochange:lengththe length of the array
+
+ + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

clear

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove all elements from the collection.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 84
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

extend

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arr + + +Array + + + +

Array.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 96
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

This collection.

+
+ + + +
+
+ Type +
+
+ +ol.Collection + + +
+
+ + + + +
+ + + +
+

forEach

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Iterate over each element, calling the provided callback.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
f + + +function + + + + + + + +

The function to call + for every element. This function takes 3 arguments (the element, the + index and the array). The return value is ignored.

this + + +S + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 114
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getArray

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get a reference to the underlying Array object. Warning: if the array +is mutated, no events will be dispatched by the collection, and the +collection's "length" property won't be in sync with the actual length +of the array.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 127
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Array.

+
+ + + +
+
+ Type +
+
+ +Array + + +
+
+ + + + +
+ + + +
+

getAt

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the element at the provided index.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
index + + +number + + + +

Index.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 138
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Element.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getLength

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the length of this collection.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 148
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Length.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

insertAt

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Insert an element at the provided index.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
index + + +number + + + +

Index.

elem + + +* + + + +

Element.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 159
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

pop

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the last element of the collection.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 172
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Element.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

push

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Insert the provided element at the end of the collection.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
elem + + +* + + + +

Element.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 183
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Length.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

remove

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes the first occurence of elem from the collection.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
elem + + +* + + + +

Element.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The removed element or undefined if elem was not found.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

removeAt

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the element at the provided index.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
index + + +number + + + +

Index.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 214
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setAt

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the element at the provided index.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
index + + +number + + + +

Index.

elem + + +* + + + +

Element.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • collection.js, line 230
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.DeviceOrientation.html b/float-no-zero/apidoc/ol.DeviceOrientation.html new file mode 100644 index 0000000000..3541376c4b --- /dev/null +++ b/float-no-zero/apidoc/ol.DeviceOrientation.html @@ -0,0 +1,2798 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.DeviceOrientation + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.DeviceOrientation +

+ +
+ +
+
+ + + + +
+

new DeviceOrientation

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The ol.DeviceOrientation class provides access to DeviceOrientation +information and events, see the HTML 5 DeviceOrientation Specification for more details.

+

Many new computers, and especially mobile phones +and tablets, provide hardware support for device orientation. Web +developers targetting mobile devices will be especially interested in this +class.

+

Device orientation data are relative to a common starting point. For mobile +devices, the starting point is to lay your phone face up on a table with the +top of the phone pointing north. This represents the zero state. All +angles are then relative to this state. For computers, it is the same except +the screen is open at 90 degrees.

+

Device orientation is reported as three angles - alpha, beta, and +gamma - relative to the starting position along the three planar axes X, Y +and Z. The X axis runs from the left edge to the right edge through the +middle of the device. Similarly, the Y axis runs from the bottom to the top +of the device through the middle. The Z axis runs from the back to the front +through the middle. In the starting position, the X axis points to the +right, the Y axis points away from you and the Z axis points straight up +from the device lying flat.

+

The three angles representing the device orientation are relative to the +three axes. alpha indicates how much the device has been rotated around the +Z axis, which is commonly interpreted as the compass heading (see note +below). beta indicates how much the device has been rotated around the X +axis, or how much it is tilted from front to back. gamma indicates how +much the device has been rotated around the Y axis, or how much it is tilted +from left to right.

+

For most browsers, the alpha value returns the compass heading so if the +device points north, it will be 0. With Safari on iOS, the 0 value of +alpha is calculated from when device orientation was first requested. +ol.DeviceOrientation provides the heading property which normalizes this +behavior across all browsers for you.

+

It is important to note that the HTML 5 DeviceOrientation specification +indicates that alpha, beta and gamma are in degrees while the +equivalent properties in ol.DeviceOrientation are in radians for consistency +with all other uses of angles throughout OpenLayers.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.DeviceOrientationOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • deviceorientation.js, line 84
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
alpha + + +number + + + + nochange:alphathe euler angle in radians of the + device from the standard X axis
beta + + +number + + + + nochange:betathe euler angle in radians of the + device from the planar Z axis
gamma + + +number + + + + nochange:gammathe euler angle in radians of the + device from the planar X axis
heading + + +number + + + + nochange:headingthe euler angle in radians of the + device from the planar Y axis
tracking + + +boolean + + + + yeschange:trackingthe status of tracking changes to alpha, + beta and gamma. If true, changes are tracked and reported immediately.
+
+ + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getAlpha

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • deviceorientation.js, line 151
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The alpha value of the DeviceOrientation, +in radians.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getBeta

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • deviceorientation.js, line 166
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The beta value of the DeviceOrientation, +in radians.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getGamma

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • deviceorientation.js, line 181
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The gamma value of the DeviceOrientation, +in radians.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getHeading

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • deviceorientation.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The heading of the device relative to +north, in radians, normalizing for different browser behavior.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

getTracking

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Are we tracking the device's orientation?

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • deviceorientation.js, line 211
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The current tracking state, true if tracking is on.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setTracking

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Enable or disable tracking of DeviceOrientation events.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
tracking + + +boolean + + + +

True to enable and false to disable tracking.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • deviceorientation.js, line 243
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.Feature.html b/float-no-zero/apidoc/ol.Feature.html new file mode 100644 index 0000000000..639b71e62e --- /dev/null +++ b/float-no-zero/apidoc/ol.Feature.html @@ -0,0 +1,2985 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.Feature + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.Feature +

+ +
+ +
+
+ + + + +
+

new Feature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
geometryOrValues + + +ol.geom.Geometry +| + +Object.<string, *>= + + + +

Values or geometry.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 24
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getGeometry

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 84
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Geometry.

+
+ + + +
+
+ Type +
+
+ +ol.geom.Geometry +| + +undefined + + +
+
+ + + + +
+ + + +
+

getGeometryName

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 107
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Geometry property name.

+
+ + + +
+
+ Type +
+
+ +string + + +
+
+ + + + +
+ + + +
+

getId

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 98
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Id.

+
+ + + +
+
+ Type +
+
+ +number +| + +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

getStyle

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 117
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

User provided style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.FeatureStyleFunction + + +
+
+ + + + +
+ + + +
+

getStyleFunction

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 126
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Style function.

+
+ + + +
+
+ Type +
+
+ +ol.feature.FeatureStyleFunction +| + +undefined + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setGeometry

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
geometry + + +ol.geom.Geometry +| + +undefined + + + +

Geometry.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 160
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setGeometryName

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + +string + + + +

Geometry property name.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 194
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setId

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
id + + +number +| + +string +| + +undefined + + + +

Id.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 185
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setStyle

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
style + + +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.FeatureStyleFunction + + + +

Feature style.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 174
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.FeatureOverlay.html b/float-no-zero/apidoc/ol.FeatureOverlay.html new file mode 100644 index 0000000000..3d6050c7dd --- /dev/null +++ b/float-no-zero/apidoc/ol.FeatureOverlay.html @@ -0,0 +1,1067 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.FeatureOverlay + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.FeatureOverlay +

+ +
+ +
+
+ + + + +
+

new FeatureOverlay

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.FeatureOverlayOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureoverlay.js, line 21
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

addFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureoverlay.js, line 90
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureoverlay.js, line 99
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features collection.

+
+ + + +
+
+ Type +
+
+ +ol.Collection + + +
+
+ + + + +
+ + + +
+

getStyle

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Get the style for features. This returns whatever was passed to the style +option at construction or to the setStyle method.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureoverlay.js, line 264
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Overlay style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction + + +
+
+ + + + +
+ + + +
+

getStyleFunction

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Get the style function.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureoverlay.js, line 273
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Style function.

+
+ + + +
+
+ Type +
+
+ +ol.feature.StyleFunction +| + +undefined + + +
+
+ + + + +
+ + + +
+

removeFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureoverlay.js, line 170
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +ol.Collection + + + +

Features collection.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureoverlay.js, line 189
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureoverlay.js, line 227
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setStyle

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the style for features. This can be a single style object, an array +of styles, or a function that takes a feature and resolution and returns +an array of styles.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
style + + +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction + + + +

Overlay style.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureoverlay.js, line 251
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.Geolocation.html b/float-no-zero/apidoc/ol.Geolocation.html new file mode 100644 index 0000000000..db579a75b2 --- /dev/null +++ b/float-no-zero/apidoc/ol.Geolocation.html @@ -0,0 +1,3467 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.Geolocation + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.Geolocation +

+ +
+ +
+
+ + + + +
+

new Geolocation

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Helper class for providing HTML5 Geolocation capabilities. +The Geolocation API +is used to locate a user's position.

+

Example:

+
var geolocation = new ol.Geolocation();
+// take the projection to use from the map's view
+geolocation.bindTo('projection', map.getView());
+// listen to changes in position
+geolocation.on('change:position', function(evt) {
+  window.console.log(geolocation.getPosition());
+});
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.GeolocationOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 70
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
accuracy + + +number + + + + nochange:accuracythe accuracy of the position + measurement in meters
altitude + + +number + + + + nochange:altitudethe altitude of the position in + meters above mean sea level
altitudeAccuracy + + +number + + + + nochange:altitudeaccuracythe accuracy of the + altitude measurement in meters
heading + + +number + + + + nochange:headingthe heading of the device in + radians from north
position + + +ol.Coordinate + + + + nochange:positionthe current position of + the device reported in the current projection
projection + + +ol.proj.Projection + + + + nochange:projectionthe projection to + report the position in
speed + + +number + + + + nochange:speedthe instantaneous speed of the + device in meters per second
tracking + + +number + + + + yeschange:trackingtrack the device's position.
trackingOptions + + +GeolocationPositionOptions + + + + yeschange:trackingoptionsPositionOptions + as defined by the HTML5 Geolocation spec at + http://dev.w3.org/geo/api/spec-source.html
+
+ + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getAccuracy

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the accuracy of the position in meters.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 200
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Position accuracy in meters.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getAltitude

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the altitude associated with the position.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 215
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The altitude in meters above the mean sea level.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getAltitudeAccuracy

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the altitude accuracy of the position.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 230
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Altitude accuracy in meters.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getHeading

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the heading as radians clockwise from North.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 245
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Heading.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getPosition

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the position of the device.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 260
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

position.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate +| + +undefined + + +
+
+ + + + +
+ + + +
+

getProjection

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the projection associated with the position.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 275
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

projection.

+
+ + + +
+
+ Type +
+
+ +ol.proj.Projection +| + +undefined + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

getSpeed

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the speed in meters per second.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 290
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Speed.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getTracking

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Are we tracking the user's position?

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 305
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

tracking.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
+ + + +
+

getTrackingOptions

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the tracking options.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 322
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + +
Returns:
+ + +
+

HTML 5 Gelocation +tracking options.

+
+ + + +
+
+ Type +
+
+ +GeolocationPositionOptions +| + +undefined + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setProjection

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the projection to use for transforming the coordinates.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
projection + + +ol.proj.Projection + + + +

Projection.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 337
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setTracking

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Enable/disable tracking.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
tracking + + +boolean + + + +

Enable or disable tracking.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 351
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setTrackingOptions

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the tracking options.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +GeolocationPositionOptions + + + +

HTML 5 Geolocation +tracking options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geolocation.js, line 367
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.Kinetic.html b/float-no-zero/apidoc/ol.Kinetic.html new file mode 100644 index 0000000000..019cc74f5c --- /dev/null +++ b/float-no-zero/apidoc/ol.Kinetic.html @@ -0,0 +1,252 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.Kinetic + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.Kinetic +

+ +
+ +
+
+ + + + +
+

new Kinetic

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
decay + + +number + + + +

Rate of decay (must be negative).

minVelocity + + +number + + + +

Minimum velocity (pixels/millisecond).

delay + + +number + + + +

Delay to consider to calculate the kinetic + initial values (milliseconds).

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • kinetic.js, line 19
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.Map.html b/float-no-zero/apidoc/ol.Map.html new file mode 100644 index 0000000000..ca683cff12 --- /dev/null +++ b/float-no-zero/apidoc/ol.Map.html @@ -0,0 +1,5639 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.Map + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.Map +

+ +

The map is the core component of OpenLayers. In its minimal configuration it +needs a view, one or more layers, and a target container:

+
var map = new ol.Map({
+  view: new ol.View2D({
+    center: [0, 0],
+    zoom: 1
+  }),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.MapQuestOSM()
+    })
+  ],
+  target: 'map'
+});
+

The above snippet creates a map with a MapQuest OSM layer on a 2D view and +renders it to a DOM element with the id map.

+ +
+ +
+
+ + + + +
+

new Map

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.MapOptions + + + +

Map options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 168
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
layergroup + + +ol.layer.LayerGroup + + + + yeschange:layergroupa layer group containing + the layers in this map.
size + + +ol.Size + + + + yeschange:sizethe size in pixels of the map in the DOM
target + + +string +| + +Element + + + + yeschange:targetthe Element or id of the Element + that the map is rendered in.
view + + +ol.IView + + + + yeschange:viewthe view that controls this map
+
+ + + + + + +

Methods

+ +
+ +
+

addControl

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Add the given control to the map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
control + + +ol.control.Control + + + +

Control.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 460
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addInteraction

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Add the given interaction to the map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
interaction + + +ol.interaction.Interaction + + + +

Interaction to add.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 471
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addLayer

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Adds the given layer to the top of this map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
layer + + +ol.layer.Base + + + +

Layer.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 483
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addOverlay

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Add the given overlay to the map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
overlay + + +ol.Overlay + + + +

Overlay.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 495
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

beforeRender

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Add functions to be called before rendering. This can be used for attaching +animations before updating the map's view. The ol.animation +namespace provides several static methods for creating prerender functions.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
var_args + + +ol.PreRenderFunction + + + +

Any number of pre-render functions.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 509
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

forEachFeatureAtPixel

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
pixel + + +ol.Pixel + + + + + + + +

Pixel.

callback + + +function + + + + + + + +

Feature + callback.

this + + +S + + + + + + <optional>
+ + + +

Value to use as this when executing callback.

layerFilter + + +function + + + + + + + +

Layer + filter function, only layers which are visible and for which this + function returns true will be tested for features. By default, all + visible layers will be tested.

this2 + + +U + + + + + + <optional>
+ + + +

Value to use as this when executing layerFilter.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 547
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Callback result.

+
+ + + +
+
+ Type +
+
+ +T +| + +undefined + + +
+
+ + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getControls

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 636
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Controls.

+
+ + + +
+
+ Type +
+
+ +ol.Collection + + +
+
+ + + + +
+ + + +
+

getCoordinateFromPixel

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
pixel + + +ol.Pixel + + + +

Pixel.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 621
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getEventCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Returns the geographical coordinate for a browser event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
event + + +Event + + + +

Event.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 569
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getEventPixel

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Returns the map pixel position for a browser event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
event + + +Event + + + +

Event.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 580
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Pixel.

+
+ + + +
+
+ Type +
+
+ +ol.Pixel + + +
+
+ + + + +
+ + + +
+

getInteractions

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets the collection of +ol.interaction.Interaction instances +associated with this map. Modifying this collection +changes the interactions associated with the map.

+

Interactions are used for e.g. pan, zoom and rotate.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 660
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Interactions.

+
+ + + +
+
+ Type +
+
+ +ol.Collection + + +
+
+ + + + +
+ + + +
+

getLayerGroup

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the layergroup associated with this map.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 670
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

LayerGroup.

+
+ + + +
+
+ Type +
+
+ +ol.layer.Group + + +
+
+ + + + +
+ + + +
+

getLayers

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the collection of layers associated with this map.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 685
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layers.

+
+ + + +
+
+ Type +
+
+ +ol.Collection +| + +undefined + + +
+
+ + + + +
+ + + +
+

getOverlays

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 645
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Overlays.

+
+ + + +
+
+ Type +
+
+ +ol.Collection + + +
+
+ + + + +
+ + + +
+

getPixelFromCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 699
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Pixel.

+
+ + + +
+
+ Type +
+
+ +ol.Pixel + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

getSize

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the size of this map.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 715
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Size.

+
+ + + +
+
+ Type +
+
+ +ol.Size +| + +undefined + + +
+
+ + + + +
+ + + +
+

getTarget

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the target in which this map is rendered. +Note that this returns what is entered as an option or in setTarget: +if that was an element, it returns an element; if a string, it returns that.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 607
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Target.

+
+ + + +
+
+ Type +
+
+ +Element +| + +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

getView

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the view associated with this map. This can be a 2D or 3D view. A 2D +view manages properties such as center and resolution.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 730
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

View.

+
+ + + +
+
+ Type +
+
+ +ol.View +| + +undefined + + +
+
+ + + + +
+ + + +
+

getViewport

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 743
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Viewport.

+
+ + + +
+
+ Type +
+
+ +Element + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

removeControl

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the given control from the map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
control + + +ol.control.Control + + + +

Control.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1072
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The removed control of undefined + if the control was not found.

+
+ + + +
+
+ Type +
+
+ +ol.control.Control +| + +undefined + + +
+
+ + + + +
+ + + +
+

removeInteraction

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Remove the given interaction from the map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
interaction + + +ol.interaction.Interaction + + + +

Interaction to remove.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1088
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The removed interaction (or + undefined if the interaction was not found).

+
+ + + +
+
+ Type +
+
+ +ol.interaction.Interaction +| + +undefined + + +
+
+ + + + +
+ + + +
+

removeLayer

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes the given layer from the map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
layer + + +ol.layer.Base + + + +

Layer.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1106
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The removed layer or undefined if the + layer was not found.

+
+ + + +
+
+ Type +
+
+ +ol.layer.Base +| + +undefined + + +
+
+ + + + +
+ + + +
+

removeOverlay

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the given overlay from the map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
overlay + + +ol.Overlay + + + +

Overlay.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1120
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

The removed overlay of undefined + if the overlay was not found.

+
+ + + +
+
+ Type +
+
+ +ol.Overlay +| + +undefined + + +
+
+ + + + +
+ + + +
+

render

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Request that renderFrame_ be called some time in the future.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1058
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

renderSync

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Render.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1050
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setLayerGroup

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets the layergroup of this map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
layerGroup + + +ol.layer.Group + + + +

Layergroup.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1245
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setSize

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the size of this map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
size + + +ol.Size +| + +undefined + + + +

Size.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1259
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setTarget

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the target element to render this map into.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
target + + +Element +| + +string +| + +undefined + + + +

Target.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1273
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setView

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the view for this map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
view + + +ol.IView + + + +

View.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1287
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

updateSize

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Force a recalculation of the map viewport size. This should be called when +third-party code changes the size of the map viewport.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 1301
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.MapBrowserEvent.html b/float-no-zero/apidoc/ol.MapBrowserEvent.html new file mode 100644 index 0000000000..0b2d06210f --- /dev/null +++ b/float-no-zero/apidoc/ol.MapBrowserEvent.html @@ -0,0 +1,304 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.MapBrowserEvent + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.MapBrowserEvent +

+ +
+ +
+
+ + + + +
+

new MapBrowserEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string + + + + + + + +

Event type.

map + + +ol.Map + + + + + + + +

Map.

browserEvent + + +goog.events.BrowserEvent + + + + + + + +

Browser event.

frameState + + +ol.FrameState + + + + + + <optional>
+ + + + <nullable>
+ +

Frame state.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • mapbrowserevent.js, line 29
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.Object.html b/float-no-zero/apidoc/ol.Object.html new file mode 100644 index 0000000000..aefc286885 --- /dev/null +++ b/float-no-zero/apidoc/ol.Object.html @@ -0,0 +1,2045 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.Object + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.Object +

+ +
+ +
+
+ + + + +
+

new Object

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Base class implementing KVO (Key Value Observing).

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
values + + +Object.<string, *>= + + + + + + <optional>
+ + + +

Values.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • object.js, line 105
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.Observable.html b/float-no-zero/apidoc/ol.Observable.html new file mode 100644 index 0000000000..5cbec43594 --- /dev/null +++ b/float-no-zero/apidoc/ol.Observable.html @@ -0,0 +1,951 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.Observable + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.Observable +

+ +
+ +
+
+ + + + +
+

new Observable

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

An event target providing convenient methods for listener registration +and unregistration.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • observable.js, line 18
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.Overlay.html b/float-no-zero/apidoc/ol.Overlay.html new file mode 100644 index 0000000000..b5d5e0dbd9 --- /dev/null +++ b/float-no-zero/apidoc/ol.Overlay.html @@ -0,0 +1,3016 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.Overlay + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.Overlay +

+ +
+ +
+
+ + + + +
+

new Overlay

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

An element to show on top of the map, such as for a popup.

+

Example:

+
var popup = new ol.Overlay({
+  element: document.getElementById('popup')
+});
+popup.setPosition(coordinate);
+map.addOverlay(popup);
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.OverlayOptions + + + +

Overlay options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 67
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
element + + +Element + + + + yeschange:elementthe Element containing the overlay
map + + +ol.Map + + + + yeschange:mapthe map that the overlay is part of
position + + +ol.Coordinate + + + + yeschange:positionthe spatial point that the overlay + is anchored at
positioning + + +ol.OverlayPositioning + + + + yeschange:positioninghow the overlay is + positioned relative to its point on the map
+
+ + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getElement

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the DOM element of this overlay.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 150
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Element.

+
+ + + +
+
+ Type +
+
+ +Element +| + +undefined + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this overlay.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 165
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map +| + +undefined + + +
+
+ + + + +
+ + + +
+

getPosition

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the current position of this overlay.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 180
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Position.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate +| + +undefined + + +
+
+ + + + +
+ + + +
+

getPositioning

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the current positioning of this overlay.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 195
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Positioning.

+
+ + + +
+
+ Type +
+
+ +ol.OverlayPositioning +| + +undefined + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setElement

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the DOM element to be associated with this overlay.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
element + + +Element +| + +undefined + + + +

Element.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 272
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the map to be associated with this overlay.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map +| + +undefined + + + +

Map.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 286
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setPosition

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the position for this overlay.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
position + + +ol.Coordinate +| + +undefined + + + +

Position.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 300
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setPositioning

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the positioning for this overlay.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
positioning + + +ol.OverlayPositioning +| + +undefined + + + +

Positioning.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 314
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.View2D.html b/float-no-zero/apidoc/ol.View2D.html new file mode 100644 index 0000000000..e5a31d67e5 --- /dev/null +++ b/float-no-zero/apidoc/ol.View2D.html @@ -0,0 +1,1700 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.View2D + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.View2D +

+ +

An ol.View2D object represents a simple 2D view of the map.

+

This is the object to act upon to change the center, resolution, +and rotation of the map.

+

The view states

+

An ol.View2D is determined by three states: center, resolution, +and rotation. To each state corresponds a getter and a setter. E.g. +getCenter and setCenter for the center state.

+

An ol.View2D has a projection. The projection determines the +coordinate system of the center, and its units determine the units of the +resolution (projection units per pixel). The default projection is +Spherical Mercator (EPSG:3857).

+

The constraints

+

setCenter, setResolution and setRotation can be used to change the +states of the view. Any value can be passed to the setters. And the value +that is passed to a setter will effectively be the value set in the view, +and returned by the corresponding getter.

+

But an ol.View2D object also has a resolution constraint and a +rotation constraint. There's currently no center constraint, but +this may change in the future.

+

As said above no constraints are applied when the setters are used to set +new states for the view. Applying constraints is done explicitly through +the use of the constrain* functions (constrainResolution and +constrainRotation).

+

The main users of the constraints are the interactions and the +controls. For example, double-clicking on the map changes the view to +the "next" resolution. And releasing the fingers after pinch-zooming +snaps to the closest resolution (with an animation).

+

So the resolution constraint snaps to specific resolutions. It is +determined by the following options: resolutions, maxResolution, +maxZoom, and zoomFactor. If resolutions is set, the other three +options are ignored. See ol.View2DOptions for more information.

+

The rotation constaint is currently not configurable. It snaps the +rotation value to zero when approaching the horizontal.

+ +
+ +
+
+ + + + +
+

new View2D

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.View2DOptions + + + + + + <optional>
+ + + +

View2D options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 95
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
center + + +ol.Coordinate + + + + yeschange:centerthe center of the view
projection + + +ol.proj.Projection + + + + yeschange:projectionthe projection of the view
resolution + + +number + + + + yeschange:resolutionthe resolution of the view
rotation + + +number + + + + yeschange:rotationthe rotation of the view
+
+ + + + + + +

Methods

+ +
+ +
+

calculateExtent

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Calculate the extent for the given size in pixels, based on the current +resolution and the current center.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
size + + +ol.Size + + + +

Box pixel size.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 242
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

constrainResolution

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the constrained the resolution of this view.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
resolution + + +number +| + +undefined + + + + + + + +

Resolution.

delta + + +number + + + + + + <optional>
+ + + +

Delta. Default is 0.

direction + + +number + + + + + + <optional>
+ + + +

Direction. Default is 0.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 201
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Constrained resolution.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

constrainRotation

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the constrained rotation of this view.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
rotation + + +number +| + +undefined + + + + + + + +

Rotation.

delta + + +number + + + + + + <optional>
+ + + +

Delta. Default is 0.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 216
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Constrained rotation.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

fitExtent

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Fit the given extent based on the given map size.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
extent + + +ol.Extent + + + +

Extent.

size + + +ol.Size + + + +

Box pixel size.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 419
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getZoom

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the current zoom level. Return undefined if the current +resolution is undefined or not a "constrained resolution".

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 393
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Zoom.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

setCenter

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the center of the current view.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
center + + +ol.Coordinate +| + +undefined + + + +

Center.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 447
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setProjection

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the projection of this view. +Warning! This code is not yet implemented. Function should not be used.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
projection + + +ol.proj.Projection +| + +undefined + + + +

Projection.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 462
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setResolution

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the resolution for this view.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
resolution + + +number +| + +undefined + + + +

Resolution.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 476
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setRotation

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the rotation for this view.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
rotation + + +number +| + +undefined + + + +

Rotation.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 490
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setZoom

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Zoom to a specific zoom level.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
zoom + + +number + + + +

Zoom level.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • view2d.js, line 504
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.animation.html b/float-no-zero/apidoc/ol.animation.html new file mode 100644 index 0000000000..cb6bf377e5 --- /dev/null +++ b/float-no-zero/apidoc/ol.animation.html @@ -0,0 +1,678 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.animation + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.animation +

+ +
+ +
+
+ + + + +

The {ol.animation} static methods are designed to be used with the ol.Map#beforeRender method. For example:

+
var map = new ol.Map({ ... });
+var zoom = ol.animation.zoom({
+  resolution: map.getView().getResolution()
+});
+map.beforeRender(zoom);
+map.getView().setResolution(map.getView().getResolution() * 2);
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • animation.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

<static> bounce

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.animation.BounceOptions + + + +

Bounce options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • animation.js, line 15
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Pre-render function.

+
+ + + +
+
+ Type +
+
+ +ol.PreRenderFunction + + +
+
+ + + + +
+ + + +
+

<static> pan

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.animation.PanOptions + + + +

Pan options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • animation.js, line 50
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Pre-render function.

+
+ + + +
+
+ Type +
+
+ +ol.PreRenderFunction + + +
+
+ + + + +
+ + + +
+

<static> rotate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.animation.RotateOptions + + + +

Rotate options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • animation.js, line 89
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Pre-render function.

+
+ + + +
+
+ Type +
+
+ +ol.PreRenderFunction + + +
+
+ + + + +
+ + + +
+

<static> zoom

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.animation.ZoomOptions + + + +

Zoom options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • animation.js, line 126
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Pre-render function.

+
+ + + +
+
+ Type +
+
+ +ol.PreRenderFunction + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.Attribution.html b/float-no-zero/apidoc/ol.control.Attribution.html new file mode 100644 index 0000000000..b114cf99dc --- /dev/null +++ b/float-no-zero/apidoc/ol.control.Attribution.html @@ -0,0 +1,2306 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.control.Attribution + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.control. + + ol.control.Attribution +

+ +
+ +
+
+ + + + +
+

new Attribution

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Create a new attribution control to show all the attributions associated +with the layer sources in the map. A default map has this control included. +By default it will show in the bottom right portion of the map, but it can +be changed by using a css selector for .ol-attribution.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.control.AttributionOptions + + + + + + <optional>
+ + + +

Attribution options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • attributioncontrol.js, line 27
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this control.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 68
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the control from its current map and attach it to the new map. +Subclasses may set up event handlers to get notified about changes to +the map here.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 89
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.Control.html b/float-no-zero/apidoc/ol.control.Control.html new file mode 100644 index 0000000000..13af3e770d --- /dev/null +++ b/float-no-zero/apidoc/ol.control.Control.html @@ -0,0 +1,2284 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.control.Control + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.control. + + ol.control.Control +

+ +
+ +
+
+ + + + +
+

new Control

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Something to be painted over the map to provide a means for interaction +(buttons) or to show annotations (status bars).

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.control.ControlOptions + + + +

Control options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • control.js, line 21
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this control.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • control.js, line 68
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the control from its current map and attach it to the new map. +Subclasses may set up event handlers to get notified about changes to +the map here.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • control.js, line 89
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.FullScreen.html b/float-no-zero/apidoc/ol.control.FullScreen.html new file mode 100644 index 0000000000..0c78b0e0f9 --- /dev/null +++ b/float-no-zero/apidoc/ol.control.FullScreen.html @@ -0,0 +1,2306 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.control.FullScreen + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.control. + + ol.control.FullScreen +

+ +
+ +
+
+ + + + +
+

new FullScreen

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Provides a button that when clicked fills up the full screen with the map. +When in full screen mode, a close button is shown to exit full screen mode. +The Fullscreen API is used to +toggle the map in full screen mode.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.control.FullScreenOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • fullscreencontrol.js, line 28
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this control.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 68
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the control from its current map and attach it to the new map. +Subclasses may set up event handlers to get notified about changes to +the map here.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 89
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.Logo.html b/float-no-zero/apidoc/ol.control.Logo.html new file mode 100644 index 0000000000..cbab325540 --- /dev/null +++ b/float-no-zero/apidoc/ol.control.Logo.html @@ -0,0 +1,2306 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.control.Logo + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.control. + + ol.control.Logo +

+ +
+ +
+
+ + + + +
+ + + +
Stability: experimental
+ + + + +
+
+ + +
+

Shows a logo for all the layer sources in the map that have a logo +associated with them, such as Bing. This control is part of a default map. +By default it will show in the bottom-left portion of the map, but it can +be styled by using a css selector for .ol-logo.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.control.LogoOptions + + + + + + <optional>
+ + + +

Logo options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • logocontrol.js, line 23
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this control.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 68
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the control from its current map and attach it to the new map. +Subclasses may set up event handlers to get notified about changes to +the map here.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 89
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.MousePosition.html b/float-no-zero/apidoc/ol.control.MousePosition.html new file mode 100644 index 0000000000..deb6cbf75f --- /dev/null +++ b/float-no-zero/apidoc/ol.control.MousePosition.html @@ -0,0 +1,2764 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.control.MousePosition + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.control. + + ol.control.MousePosition +

+ +
+ +
+
+ + + + +
+

new MousePosition

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Create a new control to show the position of the mouse in the map's +projection (or any other supplied projection). By default the control is +shown in the top right corner of the map but this can be changed by using +a css selector .ol-mouse-position.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.control.MousePositionOptions + + + + + + <optional>
+ + + +

Mouse position + options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • mousepositioncontrol.js, line 47
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
projection + + +ol.proj.Projection + + + + yeschange:projectionthe projection to report + mouse position in
coordinateFormat + + +ol.CoordinateFormatType + + + + yeschange:coordinateformatthe format to + render the current position in
+
+ + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getCoordinateFormat

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • mousepositioncontrol.js, line 138
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

projection.

+
+ + + +
+
+ Type +
+
+ +ol.CoordinateFormatType +| + +undefined + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this control.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 68
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map + + +
+
+ + + + +
+ + + +
+

getProjection

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • mousepositioncontrol.js, line 152
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

projection.

+
+ + + +
+
+ Type +
+
+ +ol.proj.Projection +| + +undefined + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setCoordinateFormat

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
format + + +ol.CoordinateFormatType + + + +

Coordinate format.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • mousepositioncontrol.js, line 206
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the control from its current map and attach it to the new map. +Subclasses may set up event handlers to get notified about changes to +the map here.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 89
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setProjection

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
projection + + +ol.proj.Projection + + + +

Projection.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • mousepositioncontrol.js, line 219
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.ScaleLine.html b/float-no-zero/apidoc/ol.control.ScaleLine.html new file mode 100644 index 0000000000..5cbcdbdd6f --- /dev/null +++ b/float-no-zero/apidoc/ol.control.ScaleLine.html @@ -0,0 +1,2544 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.control.ScaleLine + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.control. + + ol.control.ScaleLine +

+ +
+ +
+
+ + + + +
+

new ScaleLine

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Create a control to help users estimate distances on a map. +By default it will show in the bottom left portion of the map, but it can +be changed by using a css selector for .ol-scale-line.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.control.ScaleLineOptions + + + + + + <optional>
+ + + +

Scale line options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • scalelinecontrol.js, line 57
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
units + + +ol.control.ScaleLineUnits + + + + yeschange:unitsthe units to use in the + scale line
+
+ + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this control.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 68
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

getUnits

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • scalelinecontrol.js, line 144
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

units.

+
+ + + +
+
+ Type +
+
+ +ol.control.ScaleLineUnits +| + +undefined + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the control from its current map and attach it to the new map. +Subclasses may set up event handlers to get notified about changes to +the map here.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 89
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setUnits

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
units + + +ol.control.ScaleLineUnits + + + +

Units.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • scalelinecontrol.js, line 180
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.Zoom.html b/float-no-zero/apidoc/ol.control.Zoom.html new file mode 100644 index 0000000000..d9bb54b2a6 --- /dev/null +++ b/float-no-zero/apidoc/ol.control.Zoom.html @@ -0,0 +1,2305 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.control.Zoom + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.control. + + ol.control.Zoom +

+ +
+ +
+
+ + + + +
+

new Zoom

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Create a new control with 2 buttons, one for zoom in and one for zoom out. +This control is part of the default controls of a map. To style this control +use css selectors .ol-zoom-in and .ol-zoom-out.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.control.ZoomOptions + + + + + + <optional>
+ + + +

Zoom options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • zoomcontrol.js, line 27
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this control.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 68
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the control from its current map and attach it to the new map. +Subclasses may set up event handlers to get notified about changes to +the map here.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 89
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.ZoomSlider.html b/float-no-zero/apidoc/ol.control.ZoomSlider.html new file mode 100644 index 0000000000..12f2a7f21c --- /dev/null +++ b/float-no-zero/apidoc/ol.control.ZoomSlider.html @@ -0,0 +1,2305 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.control.ZoomSlider + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.control. + + ol.control.ZoomSlider +

+ +
+ +
+
+ + + + +
+

new ZoomSlider

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

A slider type of control for zooming.

+

Example:

+
map.addControl(new ol.control.ZoomSlider());
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.control.ZoomSliderOptions + + + + + + <optional>
+ + + +

Zoom slider options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • zoomslidercontrol.js, line 43
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this control.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 68
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the control from its current map and attach it to the new map. +Subclasses may set up event handlers to get notified about changes to +the map here.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 89
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.ZoomToExtent.html b/float-no-zero/apidoc/ol.control.ZoomToExtent.html new file mode 100644 index 0000000000..26b8da4331 --- /dev/null +++ b/float-no-zero/apidoc/ol.control.ZoomToExtent.html @@ -0,0 +1,2305 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.control.ZoomToExtent + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.control. + + ol.control.ZoomToExtent +

+ +
+ +
+
+ + + + +
+

new ZoomToExtent

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Create a control that adds a button, which, when pressed, changes +the map view to a specific extent. To style this control use the +css selector .ol-zoom-extent.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.control.ZoomToExtentOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • zoomtoextentcontrol.js, line 24
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the map associated with this control.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 68
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Map.

+
+ + + +
+
+ Type +
+
+ +ol.Map + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setMap

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Remove the control from its current map and attach it to the new map. +Subclasses may set up event handlers to get notified about changes to +the map here.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
map + + +ol.Map + + + +

Map.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • control.js, line 89
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.control.html b/float-no-zero/apidoc/ol.control.html new file mode 100644 index 0000000000..ea88e15fa8 --- /dev/null +++ b/float-no-zero/apidoc/ol.control.html @@ -0,0 +1,539 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.control + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.control +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • control.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + +

Classes

+ +
+
ol.control.Attribution
+
+ +
ol.control.Control
+
+ +
ol.control.FullScreen
+
+ +
ol.control.Logo
+
+ +
ol.control.MousePosition
+
+ +
ol.control.ScaleLine
+
+ +
ol.control.Zoom
+
+ +
ol.control.ZoomSlider
+
+ +
ol.control.ZoomToExtent
+
+
+ + + + + + + +

Members

+ +
+ +
+

<static> ScaleLineUnits :string

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
DEGREES + + +string + + + + + + degrees + +
IMPERIAL + + +string + + + + + + imperial + +
NAUTICAL + + +string + + + + + + nautical + +
METRIC + + +string + + + + + + metric + +
US + + +string + + + + + + us + +
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • scalelinecontrol.js, line 35
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

<static> defaults

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.control.DefaultsOptions + + + + + + <optional>
+ + + +

Defaults options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • controldefaults.js, line 14
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Controls.

+
+ + + +
+
+ Type +
+
+ +ol.Collection + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.dom.Input.html b/float-no-zero/apidoc/ol.dom.Input.html new file mode 100644 index 0000000000..b71ff0110d --- /dev/null +++ b/float-no-zero/apidoc/ol.dom.Input.html @@ -0,0 +1,2548 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.dom.Input + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.dom.Input +

+ +
+ +
+
+ + + + +
+

new Input

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Helper class for binding HTML input to an ol.Object.

+

Example:

+
// bind a checkbox with id 'visible' to a layer's visibility
+var visible = new ol.dom.Input(document.getElementById('visible'));
+visible.bindTo('checked', layer, 'visible');
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
target + + +Element + + + +

Target element.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • input.js, line 36
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
value + + +string + + + + yeschange:valuethe value of the Input
checked + + +boolean + + + + yeschange:checkedthe checked state of the Input
+
+ + + + + + +

Methods

+ +
+ +
+

bindTo

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

The bindTo method allows you to set up a two-way binding between a +source and target object. The method returns an +ol.ObjectAccessor with a transform method that lets you transform +values on the way from the source to the target and on the way back.

+

For example, if you had two map views (sourceView and targetView) +and you wanted the target view to have double the resolution of the +source view, you could transform the resolution on the way to and +from the target with the following:

+
sourceView.bindTo('resolution', targetView)
+  .transform(
+    function(sourceResolution) {
+      // from sourceView.resolution to targetView.resolution
+      return 2 * sourceResolution;
+    },
+    function(targetResolution) {
+      // from targetView.resolution to sourceView.resolution
+      return targetResolution / 2;
+    }
+  );
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
key + + +string + + + + + + + +

Key name.

target + + +ol.Object + + + + + + + +

Target.

targetKey + + +string + + + + + + <optional>
+ + + +

Target key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 232
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +ol.ObjectAccessor + + +
+
+ + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

get

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Gets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 289
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Value.

+
+ + + +
+
+ Type +
+
+ +* + + +
+
+ + + + +
+ + + +
+

getChecked

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

If the input is a checkbox, return whether or not the checbox is checked.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • input.js, line 64
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

checked.

+
+ + + +
+
+ Type +
+
+ +boolean +| + +undefined + + +
+
+ + + + +
+ + + +
+

getProperties

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get an object of all property names and values.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 348
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Object.

+
+ + + +
+
+ Type +
+
+ +Object.<string, *> + + +
+
+ + + + +
+ + + +
+

getValue

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the value of the input.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • input.js, line 78
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

input value.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

notify

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Notify all observers of a change on this property. This notifies both +objects that are bound to the object's property as well as the object +that it is bound to.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 368
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

set

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a value.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

value + + +* + + + +

Value.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 399
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setChecked

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set whether or not a checkbox is checked.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
checked + + +boolean + + + +

Checked.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • input.js, line 106
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValue

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets the value of the input.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
value + + +string + + + +

Value.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • input.js, line 92
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setValues

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Sets a collection of key-value pairs.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
values + + +Object.<string, *> + + + +

Values.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 428
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbind

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes a binding. Unbinding will set the unbound property to the current + value. The object will not be notified, as the value has not changed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Key name.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 442
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unbindAll

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes all bindings.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • object.js, line 466
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.events.condition.html b/float-no-zero/apidoc/ol.events.condition.html new file mode 100644 index 0000000000..585f04d96e --- /dev/null +++ b/float-no-zero/apidoc/ol.events.condition.html @@ -0,0 +1,995 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.events.condition + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.events.condition +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • condition.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Members

+ +
+ +
+

<static> always

+ + +
Stability: experimental
+ + + + +
+
+ +
+

Always true.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • condition.js, line 54
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

<static> altKeyOnly

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
mapBrowserEvent + + +ol.MapBrowserEvent + + + +

Map browser event.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • condition.js, line 25
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

True if only the alt key is pressed.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
+ + + +
+

<static> altShiftKeysOnly

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
mapBrowserEvent + + +ol.MapBrowserEvent + + + +

Map browser event.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • condition.js, line 39
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

True if only the alt and shift keys are pressed.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
+ + + +
+

<static> noModifierKeys

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
mapBrowserEvent + + +ol.MapBrowserEvent + + + +

Map browser event.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • condition.js, line 72
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

True only if there no modifier keys are pressed.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
+ + + +
+

<static> platformModifierKeyOnly

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
mapBrowserEvent + + +ol.MapBrowserEvent + + + +

Map browser event.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • condition.js, line 86
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

True if only the platform modifier key is pressed.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
+ + + +
+

<static> shiftKeyOnly

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
mapBrowserEvent + + +ol.MapBrowserEvent + + + +

Map browser event.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • condition.js, line 100
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

True if only the shift key is pressed.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
+ + + +
+

<static> targetNotEditable

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
mapBrowserEvent + + +ol.MapBrowserEvent + + + +

Map browser event.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • condition.js, line 114
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

True only if the target element is not editable.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.feature_.html b/float-no-zero/apidoc/ol.feature_.html new file mode 100644 index 0000000000..96cf5291f1 --- /dev/null +++ b/float-no-zero/apidoc/ol.feature_.html @@ -0,0 +1,249 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.feature + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.feature +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +

TypeDefs

+ +
+ +
+

FeatureStyleFunction

+ + +
Stability: experimental
+ + + + +
+
+ +
+

A function that takes a {number} representing the view's resolution. It +returns an Array of ol.style.Style. This way individual features +can be styled. The this keyword inside the function references the +ol.Feature to be styled.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 215
+ + + + + + + +
+ + + +
+ + + +
+

StyleFunction

+ + +
Stability: experimental
+ + + + +
+
+ +
+

A function that takes an ol.Feature and a {number} representing +the view's resolution. The function should return an array of +ol.style.Style. This way e.g. a vector layer can be styled.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • feature.js, line 258
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.format.Feature.html b/float-no-zero/apidoc/ol.format.Feature.html new file mode 100644 index 0000000000..a075b52dcd --- /dev/null +++ b/float-no-zero/apidoc/ol.format.Feature.html @@ -0,0 +1,155 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.format.Feature + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.format.Feature +

+ +
+ +
+
+ + + + +
+

new Feature

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • featureformat.js, line 10
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.format.GPX.html b/float-no-zero/apidoc/ol.format.GPX.html new file mode 100644 index 0000000000..1fccbcf426 --- /dev/null +++ b/float-no-zero/apidoc/ol.format.GPX.html @@ -0,0 +1,155 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.format.GPX + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.format.GPX +

+ +
+ +
+
+ + + + +
+

new GPX

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • gpxformat.js, line 24
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.format.GeoJSON.html b/float-no-zero/apidoc/ol.format.GeoJSON.html new file mode 100644 index 0000000000..77c130606c --- /dev/null +++ b/float-no-zero/apidoc/ol.format.GeoJSON.html @@ -0,0 +1,213 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.format.GeoJSON + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.format.GeoJSON +

+ +
+ +
+
+ + + + +
+

new GeoJSON

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.format.GeoJSONOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geojsonformat.js, line 29
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.format.IGC.html b/float-no-zero/apidoc/ol.format.IGC.html new file mode 100644 index 0000000000..d13bc87809 --- /dev/null +++ b/float-no-zero/apidoc/ol.format.IGC.html @@ -0,0 +1,213 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.format.IGC + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.format.IGC +

+ +
+ +
+
+ + + + +
+

new IGC

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.format.IGCOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • igcformat.js, line 30
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.format.KML.html b/float-no-zero/apidoc/ol.format.KML.html new file mode 100644 index 0000000000..258bfc7b47 --- /dev/null +++ b/float-no-zero/apidoc/ol.format.KML.html @@ -0,0 +1,360 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.format.KML + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.format.KML +

+ +
+ +
+
+ + + + +
+

new KML

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.format.KMLOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • kmlformat.js, line 58
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

readName

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
source + + +Document +| + +Node +| + +string + + + +

Souce.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • kmlformat.js, line 1512
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Name.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.format.TopoJSON.html b/float-no-zero/apidoc/ol.format.TopoJSON.html new file mode 100644 index 0000000000..11309747bd --- /dev/null +++ b/float-no-zero/apidoc/ol.format.TopoJSON.html @@ -0,0 +1,213 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.format.TopoJSON + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.format.TopoJSON +

+ +
+ +
+
+ + + + +
+

new TopoJSON

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.format.TopoJSONOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • topojsonformat.js, line 24
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.Circle.html b/float-no-zero/apidoc/ol.geom.Circle.html new file mode 100644 index 0000000000..a73f2f549d --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.Circle.html @@ -0,0 +1,2182 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.Circle + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.Circle +

+ +
+ +
+
+ + + + +
+

new Circle

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
center + + +ol.geom.RawPoint + + + + + + + +

Center.

radius + + +number + + + + + + <optional>
+ + + +

Radius.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circle.js, line 19
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getCenter

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circle.js, line 83
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Center.

+
+ + + +
+
+ Type +
+
+ +ol.geom.RawPoint + + +
+
+ + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getFirstCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

First coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLastCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Last point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLayout

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 130
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layout.

+
+ + + +
+
+ Type +
+
+ +ol.geom.GeometryLayout + + +
+
+ + + + +
+ + + +
+

getRadius

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circle.js, line 110
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Radius.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

setCenter

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
center + + +ol.geom.RawPoint + + + +

Center.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circle.js, line 146
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setCenterAndRadius

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
center + + +ol.geom.RawPoint + + + + + + + +

Center.

radius + + +number + + + + + + + +

Radius.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circle.js, line 166
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setRadius

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
radius + + +number + + + +

Radius.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circle.js, line 205
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.Geometry.html b/float-no-zero/apidoc/ol.geom.Geometry.html new file mode 100644 index 0000000000..156c45dbaf --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.Geometry.html @@ -0,0 +1,1205 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.Geometry + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.Geometry +

+ +
+ +
+
+ + + + +
+

new Geometry

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 42
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.GeometryCollection.html b/float-no-zero/apidoc/ol.geom.GeometryCollection.html new file mode 100644 index 0000000000..a6a3b4b433 --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.GeometryCollection.html @@ -0,0 +1,1471 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.GeometryCollection + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.GeometryCollection +

+ +
+ +
+
+ + + + +
+

new GeometryCollection

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
geometries + + +Array.<ol.geom.Geometry>= + + + + + + <optional>
+ + + +

Geometries.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geometrycollection.js, line 20
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getGeometries

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geometrycollection.js, line 149
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Geometries.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.geom.Geometry> + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

setGeometries

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
geometries + + +Array.<ol.geom.Geometry> + + + +

Geometries.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geometrycollection.js, line 227
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.LineString.html b/float-no-zero/apidoc/ol.geom.LineString.html new file mode 100644 index 0000000000..15adb54e8a --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.LineString.html @@ -0,0 +1,2080 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.LineString + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.LineString +

+ +
+ +
+
+ + + + +
+

new LineString

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawLineString + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • linestring.js, line 19
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getCoordinateAtM

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Returns the coordinate at m using linear interpolation, or null if no +such coordinate exists.

+

opt_extrapolate controls extrapolation beyond the range of Ms in the +MultiLineString. If opt_extrapolate is true then Ms less than the first +M will return the first coordinate and Ms greater than the last M will +return the last coordinate.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
m + + +number + + + + + + + +

M.

extrapolate + + +boolean + + + + + + <optional>
+ + + +

Extrapolate.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • linestring.js, line 96
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • linestring.js, line 111
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinates.

+
+ + + +
+
+ Type +
+
+ +ol.geom.RawLineString + + +
+
+ + + + +
+ + + +
+

getFirstCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

First coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLastCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Last point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLayout

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 130
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layout.

+
+ + + +
+
+ Type +
+
+ +ol.geom.GeometryLayout + + +
+
+ + + + +
+ + + +
+

getLength

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • linestring.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Length.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

setCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawLineString + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • linestring.js, line 170
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.LinearRing.html b/float-no-zero/apidoc/ol.geom.LinearRing.html new file mode 100644 index 0000000000..0d62cc26fc --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.LinearRing.html @@ -0,0 +1,1898 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.LinearRing + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.LinearRing +

+ +
+ +
+
+ + + + +
+

new LinearRing

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawLinearRing + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • linearring.js, line 19
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getArea

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • linearring.js, line 75
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Area.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • linearring.js, line 85
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinates.

+
+ + + +
+
+ Type +
+
+ +ol.geom.RawLinearRing + + +
+
+ + + + +
+ + + +
+

getFirstCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

First coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLastCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Last point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLayout

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 130
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layout.

+
+ + + +
+
+ Type +
+
+ +ol.geom.GeometryLayout + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

setCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawLinearRing + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • linearring.js, line 120
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.MultiLineString.html b/float-no-zero/apidoc/ol.geom.MultiLineString.html new file mode 100644 index 0000000000..aadd0e799a --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.MultiLineString.html @@ -0,0 +1,2117 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.MultiLineString + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.MultiLineString +

+ +
+ +
+
+ + + + +
+

new MultiLineString

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawMultiLineString + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multilinestring.js, line 22
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getCoordinateAtM

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Returns the coordinate at m using linear interpolation, or null if no +such coordinate exists.

+

opt_extrapolate controls extrapolation beyond the range of Ms in the +MultiLineString. If opt_extrapolate is true then Ms less than the first +M will return the first coordinate and Ms greater than the last M will +return the last coordinate.

+

opt_interpolate controls interpolation between consecutive LineStrings +within the MultiLineString. If opt_interpolate is true the coordinates +will be linearly interpolated between the last coordinate of one LineString +and the first coordinate of the next LineString. If opt_interpolate is +false then the function will return null for Ms falling between +LineStrings.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
m + + +number + + + + + + + +

M.

extrapolate + + +boolean + + + + + + <optional>
+ + + +

Extrapolate.

interpolate + + +boolean + + + + + + <optional>
+ + + +

Interpolate.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multilinestring.js, line 102
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multilinestring.js, line 120
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinates.

+
+ + + +
+
+ Type +
+
+ +ol.geom.RawMultiLineString + + +
+
+ + + + +
+ + + +
+

getFirstCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

First coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLastCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Last point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLayout

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 130
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layout.

+
+ + + +
+
+ Type +
+
+ +ol.geom.GeometryLayout + + +
+
+ + + + +
+ + + +
+

getLineStrings

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multilinestring.js, line 138
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

LineStrings.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.geom.LineString> + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

setCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawMultiLineString + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multilinestring.js, line 201
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.MultiPoint.html b/float-no-zero/apidoc/ol.geom.MultiPoint.html new file mode 100644 index 0000000000..905174518d --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.MultiPoint.html @@ -0,0 +1,1898 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.MultiPoint + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.MultiPoint +

+ +
+ +
+
+ + + + +
+

new MultiPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawMultiPoint + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipoint.js, line 18
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipoint.js, line 66
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinates.

+
+ + + +
+
+ Type +
+
+ +ol.geom.RawMultiPoint + + +
+
+ + + + +
+ + + +
+

getFirstCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

First coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLastCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Last point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLayout

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 130
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layout.

+
+ + + +
+
+ Type +
+
+ +ol.geom.GeometryLayout + + +
+
+ + + + +
+ + + +
+

getPoints

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipoint.js, line 76
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Points.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.geom.Point> + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

setCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawMultiPoint + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipoint.js, line 101
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.MultiPolygon.html b/float-no-zero/apidoc/ol.geom.MultiPolygon.html new file mode 100644 index 0000000000..129a92b007 --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.MultiPolygon.html @@ -0,0 +1,2070 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.MultiPolygon + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.MultiPolygon +

+ +
+ +
+
+ + + + +
+

new MultiPolygon

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawMultiPolygon + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipolygon.js, line 23
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getArea

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipolygon.js, line 119
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Area.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipolygon.js, line 129
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinates.

+
+ + + +
+
+ Type +
+
+ +ol.geom.RawMultiPolygon + + +
+
+ + + + +
+ + + +
+

getFirstCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

First coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getInteriorPoints

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipolygon.js, line 162
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Interior points.

+
+ + + +
+
+ Type +
+
+ +ol.geom.MultiPoint + + +
+
+ + + + +
+ + + +
+

getLastCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Last point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLayout

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 130
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layout.

+
+ + + +
+
+ Type +
+
+ +ol.geom.GeometryLayout + + +
+
+ + + + +
+ + + +
+

getPolygons

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipolygon.js, line 212
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Polygons.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.geom.Polygon> + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

setCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawMultiPolygon + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • multipolygon.js, line 245
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.Point.html b/float-no-zero/apidoc/ol.geom.Point.html new file mode 100644 index 0000000000..16f32834f4 --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.Point.html @@ -0,0 +1,1812 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.Point + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.Point +

+ +
+ +
+
+ + + + +
+

new Point

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawPoint + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • point.js, line 18
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • point.js, line 61
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinates.

+
+ + + +
+
+ Type +
+
+ +ol.geom.RawPoint + + +
+
+ + + + +
+ + + +
+

getFirstCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

First coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLastCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Last point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLayout

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 130
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layout.

+
+ + + +
+
+ Type +
+
+ +ol.geom.GeometryLayout + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

setCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawPoint + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • point.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.Polygon.html b/float-no-zero/apidoc/ol.geom.Polygon.html new file mode 100644 index 0000000000..2be92f600a --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.Polygon.html @@ -0,0 +1,2070 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.Polygon + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.Polygon +

+ +
+ +
+
+ + + + +
+

new Polygon

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawPolygon + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • polygon.js, line 21
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getArea

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • polygon.js, line 117
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Area.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • polygon.js, line 127
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Coordinates.

+
+ + + +
+
+ Type +
+
+ +ol.geom.RawPolygon + + +
+
+ + + + +
+ + + +
+

getFirstCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

First coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getInteriorPoint

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • polygon.js, line 159
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Interior point.

+
+ + + +
+
+ Type +
+
+ +ol.geom.Point + + +
+
+ + + + +
+ + + +
+

getLastCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Last point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLayout

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 130
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layout.

+
+ + + +
+
+ Type +
+
+ +ol.geom.GeometryLayout + + +
+
+ + + + +
+ + + +
+

getLinearRings

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • polygon.js, line 168
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Linear rings.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.geom.LinearRing> + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

setCoordinates

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
coordinates + + +ol.geom.RawPolygon + + + + + + + +

Coordinates.

layout + + +ol.geom.GeometryLayout + + + + + + <optional>
+ + + +

Layout.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • polygon.js, line 237
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.SimpleGeometry.html b/float-no-zero/apidoc/ol.geom.SimpleGeometry.html new file mode 100644 index 0000000000..67252ae139 --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.SimpleGeometry.html @@ -0,0 +1,1473 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.geom.SimpleGeometry + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.geom. + + ol.geom.SimpleGeometry +

+ +
+ +
+
+ + + + +
+

new SimpleGeometry

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 17
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

getType

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 148
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getClosestPoint

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
point + + +ol.Coordinate + + + + + + + +

Point.

closestPoint + + +ol.Coordinate + + + + + + <optional>
+ + + +

Closest point.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 103
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getFirstCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

First coordinate.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLastCoordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 121
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Last point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getLayout

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • simplegeometry.js, line 130
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layout.

+
+ + + +
+
+ Type +
+
+ +ol.geom.GeometryLayout + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.geom.html b/float-no-zero/apidoc/ol.geom.html new file mode 100644 index 0000000000..ff7fbae6e5 --- /dev/null +++ b/float-no-zero/apidoc/ol.geom.html @@ -0,0 +1,765 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.geom + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.geom +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geom.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + +

Classes

+ +
+
ol.geom.Circle
+
+ +
ol.geom.Geometry
+
+ +
ol.geom.GeometryCollection
+
+ +
ol.geom.LinearRing
+
+ +
ol.geom.LineString
+
+ +
ol.geom.MultiLineString
+
+ +
ol.geom.MultiPoint
+
+ +
ol.geom.MultiPolygon
+
+ +
ol.geom.Point
+
+ +
ol.geom.Polygon
+
+ +
ol.geom.SimpleGeometry
+
+
+ + + + + + + +

Members

+ +
+ +
+

<static> GeometryLayout :string

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
XY + + +string + + + + + + XY + +
XYZ + + +string + + + + + + XYZ + +
XYM + + +string + + + + + + XYM + +
XYZM + + +string + + + + + + XYZM + +
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 28
+ + + + + + + +
+ + + +
+ + + +
+

<static> GeometryType :string

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
POINT + + +string + + + + + + Point + +
LINE_STRING + + +string + + + + + + LineString + +
LINEAR_RING + + +string + + + + + + LinearRing + +
POLYGON + + +string + + + + + + Polygon + +
MULTI_POINT + + +string + + + + + + MultiPoint + +
MULTI_LINE_STRING + + +string + + + + + + MultiLineString + +
MULTI_POLYGON + + +string + + + + + + MultiPolygon + +
GEOMETRY_COLLECTION + + +string + + + + + + GeometryCollection + +
CIRCLE + + +string + + + + + + Circle + +
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 12
+ + + + + + + +
+ + + +
+ +
+ + + + + +

TypeDefs

+ +
+ +
+

RawPoint

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geometry.js, line 161
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.html b/float-no-zero/apidoc/ol.html new file mode 100644 index 0000000000..4cc9ee0849 --- /dev/null +++ b/float-no-zero/apidoc/ol.html @@ -0,0 +1,1519 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • ol.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + +

Classes

+ +
+
ol.Attribution
+
+ +
ol.Collection
+
+ +
ol.DeviceOrientation
+
+ +
ol.Feature
+
+ +
ol.FeatureOverlay
+
+ +
ol.Geolocation
+
+ +
ol.Kinetic
+
+ +
ol.Map
+
+ +
ol.MapBrowserEvent
+
+ +
ol.Object
+
+ +
ol.Observable
+
+ +
ol.Overlay
+
+ +
ol.View2D
+
+
+ + + +

Namespaces

+ +
+
ol.animation
+
+ +
ol.BrowserFeature
+
+ +
ol.control
+
+ +
ol.feature
+
+ +
ol.geom
+
+ +
ol.interaction
+
+ +
ol.layer
+
+ +
ol.proj
+
+ +
ol.source
+
+ +
ol.tilegrid
+
+
+ + + + + +

Members

+ +
+ +
+

<static> Coordinate

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • coordinate.js, line 24
+ + + + + + + +
+ + + +
+ + + +
+

<static> inherits

+ + +
Stability: experimental
+ + + + +
+
+ +
+

ol.inherits is an alias to the goog.inherits function. It is exported +for use in non-compiled application code. See ol.exports.

+

FIXME: We use a new line to fake the linter. Without the new line the +linter complains with:

+

"Missing newline between constructor and goog.inherits"

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • ol.js, line 14
+ + + + + + + +
+ + + +
+ + + +
+

<static> OverlayPositioning :string

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
BOTTOM_LEFT + + +string + + + + + + bottom-left + +
BOTTOM_CENTER + + +string + + + + + + bottom-center + +
BOTTOM_RIGHT + + +string + + + + + + bottom-right + +
CENTER_LEFT + + +string + + + + + + center-left + +
CENTER_CENTER + + +string + + + + + + center-center + +
CENTER_RIGHT + + +string + + + + + + center-right + +
TOP_LEFT + + +string + + + + + + top-left + +
TOP_CENTER + + +string + + + + + + top-center + +
TOP_RIGHT + + +string + + + + + + top-right + +
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • overlay.js, line 31
+ + + + + + + +
+ + + +
+ + + +
+

<static> RendererHint :string

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
CANVAS + + +string + + + + + + canvas + +
DOM + + +string + + + + + + dom + +
WEBGL + + +string + + + + + + webgl + +
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • map.js, line 107
+ + + + + + + +
+ + + +
+ + + +
+

<static> Size

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • size.js, line 10
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

<static> IView

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Interface for views.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • iview.js, line 12
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + +

TypeDefs

+ +
+ +
+

CanvasFunctionType

+ + +
Stability: experimental
+ + + + +
+
+ +
+

A function returning the canvas element ({HTMLCanvasElement}) +used by the source as an image. The arguments passed to the function are: +ol.Extent the image extent, {number} the image resolution, +{number} the device pixel ratio, ol.Size the image size, and +ol.proj.Projection the image projection. The canvas returned by +this function is cached by the source. The this keyword inside the function +references the ol.source.ImageCanvas.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • canvasfunction.js, line 17
+ + + + + + + +
+ + + +
+ + + +
+

Color

+ + +
Stability: not documented
+ + + + +
+
+ +
+

A color represented as a short array [red, green, blue, alpha]. +red, green, and blue should be integers in the range 0..255 inclusive. +alpha should be a float in the range 0..1 inclusive.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • color.js, line 30
+ + + + + + + +
+ + + +
+ + + +
+

Coordinate

+ + +
Stability: experimental
+ + + + +
+
+ +
+

An array of numbers representing a coordinate.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • coordinate.js, line 19
+ + + + + + + +
+ + + +
+ + + +
+

CoordinateFormatType

+ + +
Stability: experimental
+ + + + +
+
+ +
+

A function that takes a ol.Coordinate and transforms it into a +{string}.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • coordinate.js, line 16
+ + + + + + + +
+ + + +
+ + + +
+

Extent

+ + +
Stability: experimental
+ + + + +
+
+ +
+

An array of numbers representing an extent: [minx, miny, maxx, maxy].

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • extent.js, line 15
+ + + + + + + +
+ + + +
+ + + +
+

Pixel

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • pixel.js, line 7
+ + + + + + + +
+ + + +
+ + + +
+

Size

+ + +
Stability: experimental
+ + + + +
+
+ +
+

An array of numbers representing a size: [width, height].

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • size.js, line 5
+ + + + + + + +
+ + + +
+ + + +
+

TileLoadFunctionType

+ + +
Stability: experimental
+ + + + +
+
+ +
+

A function that takes an ol.ImageTile for the image tile and a +{string} for the src as arguments.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tileloadfunction.js, line 11
+ + + + + + + +
+ + + +
+ + + +
+

TileUrlFunctionType

+ + +
Stability: experimental
+ + + + +
+
+ +
+

A function that takes an ol.TileCoord for the tile coordinate, +a {number} representing the pixel ratio and an ol.proj.Projection +for the projection as arguments and returns a {string} or +undefined representing the tile URL. The this keyword inside the function +references the ol.source.TileImage.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tileurlfunction.js, line 20
+ + + + + + + +
+ + + +
+ + + +
+

TransformFunction

+ + +
Stability: experimental
+ + + + +
+
+ +
+

A transform function accepts an array of input coordinate values, an optional +output array, and an optional dimension (default should be 2). The function +transforms the input coordinate values, populates the output array, and +returns the output array.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • transformfunction.js, line 13
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.DoubleClickZoom.html b/float-no-zero/apidoc/ol.interaction.DoubleClickZoom.html new file mode 100644 index 0000000000..00b3f30b99 --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.DoubleClickZoom.html @@ -0,0 +1,219 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.DoubleClickZoom + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.DoubleClickZoom +

+ +
+ +
+
+ + + + +
+

new DoubleClickZoom

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to zoom by double-clicking on the map.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.DoubleClickZoomOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • doubleclickzoominteraction.js, line 20
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.DragAndDrop.html b/float-no-zero/apidoc/ol.interaction.DragAndDrop.html new file mode 100644 index 0000000000..e3b7fbffaa --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.DragAndDrop.html @@ -0,0 +1,215 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.DragAndDrop + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.DragAndDrop +

+ +
+ +
+
+ + + + +
+

new DragAndDrop

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.DragAndDropOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • draganddropinteraction.js, line 24
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.DragBox.html b/float-no-zero/apidoc/ol.interaction.DragBox.html new file mode 100644 index 0000000000..3b3f496c3c --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.DragBox.html @@ -0,0 +1,309 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.DragBox + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.DragBox +

+ +
+ +
+
+ + + + +
+

new DragBox

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.DragBoxOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • dragboxinteraction.js, line 70
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getGeometry

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Returns geometry of last drawn box.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • dragboxinteraction.js, line 117
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Geometry.

+
+ + + +
+
+ Type +
+
+ +ol.geom.Geometry + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.DragPan.html b/float-no-zero/apidoc/ol.interaction.DragPan.html new file mode 100644 index 0000000000..80ac2aa53b --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.DragPan.html @@ -0,0 +1,219 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.DragPan + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.DragPan +

+ +
+ +
+
+ + + + +
+

new DragPan

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to pan the map by clickng and dragging.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.DragPanOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • dragpaninteraction.js, line 24
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.DragRotate.html b/float-no-zero/apidoc/ol.interaction.DragRotate.html new file mode 100644 index 0000000000..25c5ee85ce --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.DragRotate.html @@ -0,0 +1,221 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.DragRotate + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.DragRotate +

+ +
+ +
+
+ + + + +
+

new DragRotate

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Allows the user to rotate the map by clicking and dragging on the map, +normally combined with an ol.events.condition that limits +it to when the alt and shift keys are held down.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.DragRotateOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • dragrotateinteraction.js, line 26
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.DragRotateAndZoom.html b/float-no-zero/apidoc/ol.interaction.DragRotateAndZoom.html new file mode 100644 index 0000000000..384a2724fb --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.DragRotateAndZoom.html @@ -0,0 +1,222 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.DragRotateAndZoom + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.DragRotateAndZoom +

+ +
+ +
+
+ + + + +
+

new DragRotateAndZoom

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to zoom and rotate the map by clicking and dragging +on the map. By default, this interaction is limited to when the shift +key is held down.

+

This interaction is not included in the default interactions.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.DragRotateAndZoomOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • dragrotateandzoominteraction.js, line 32
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.DragZoom.html b/float-no-zero/apidoc/ol.interaction.DragZoom.html new file mode 100644 index 0000000000..9e1155342e --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.DragZoom.html @@ -0,0 +1,326 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.DragZoom + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.DragZoom +

+ +
+ +
+
+ + + + +
+

new DragZoom

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to zoom the map by clicking and dragging on the map, +normally combined with an ol.events.condition that limits +it to when the shift key is held down.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.DragZoomOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • dragzoominteraction.js, line 28
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getGeometry

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Returns geometry of last drawn box.

+
+ + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • dragboxinteraction.js, line 117
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Geometry.

+
+ + + +
+
+ Type +
+
+ +ol.geom.Geometry + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.Draw.html b/float-no-zero/apidoc/ol.interaction.Draw.html new file mode 100644 index 0000000000..105b67016b --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.Draw.html @@ -0,0 +1,209 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.Draw + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.Draw +

+ +
+ +
+
+ + + + +
+

new Draw

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Interaction that allows drawing geometries

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.interaction.DrawOptions + + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • drawinteraction.js, line 66
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.KeyboardPan.html b/float-no-zero/apidoc/ol.interaction.KeyboardPan.html new file mode 100644 index 0000000000..c868caa861 --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.KeyboardPan.html @@ -0,0 +1,227 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.KeyboardPan + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.KeyboardPan +

+ +
+ +
+
+ + + + +
+

new KeyboardPan

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to pan the map using keyboard arrows. +Note that, although this interaction is by default included in maps, +the keys can only be used when browser focus is on the element to which +the keyboard events are attached. By default, this is the map div, +though you can change this with the keyboardTargetElement in +ol.Map. document never loses focus but, for any other element, +focus will have to be on, and returned to, this element if the keys are to +function. +See also ol.interaction.KeyboardZoom.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.KeyboardPanOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • keyboardpaninteraction.js, line 38
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.KeyboardZoom.html b/float-no-zero/apidoc/ol.interaction.KeyboardZoom.html new file mode 100644 index 0000000000..bf32e84daa --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.KeyboardZoom.html @@ -0,0 +1,227 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.KeyboardZoom + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.KeyboardZoom +

+ +
+ +
+
+ + + + +
+

new KeyboardZoom

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to zoom the map using keyboard + and -. +Note that, although this interaction is by default included in maps, +the keys can only be used when browser focus is on the element to which +the keyboard events are attached. By default, this is the map div, +though you can change this with the keyboardTargetElement in +ol.Map. document never loses focus but, for any other element, +focus will have to be on, and returned to, this element if the keys are to +function. +See also ol.interaction.KeyboardPan.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.KeyboardZoomOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • keyboardzoominteraction.js, line 28
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.Modify.html b/float-no-zero/apidoc/ol.interaction.Modify.html new file mode 100644 index 0000000000..920316a441 --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.Modify.html @@ -0,0 +1,205 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.Modify + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.Modify +

+ +
+ +
+
+ + + + +
+

new Modify

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.interaction.ModifyOptions + + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • modifyinteraction.js, line 40
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.MouseWheelZoom.html b/float-no-zero/apidoc/ol.interaction.MouseWheelZoom.html new file mode 100644 index 0000000000..2d2b8a6c18 --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.MouseWheelZoom.html @@ -0,0 +1,219 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.MouseWheelZoom + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.MouseWheelZoom +

+ +
+ +
+
+ + + + +
+

new MouseWheelZoom

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to zoom the map by scrolling the mouse wheel.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.MouseWheelZoomOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • mousewheelzoominteraction.js, line 33
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.Select.html b/float-no-zero/apidoc/ol.interaction.Select.html new file mode 100644 index 0000000000..a240256159 --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.Select.html @@ -0,0 +1,295 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.Select + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.Select +

+ +
+ +
+
+ + + + +
+

new Select

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.interaction.SelectOptions + + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • selectinteraction.js, line 17
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • selectinteraction.js, line 84
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features collection.

+
+ + + +
+
+ Type +
+
+ +ol.Collection + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.TouchPan.html b/float-no-zero/apidoc/ol.interaction.TouchPan.html new file mode 100644 index 0000000000..3edbd2e1f9 --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.TouchPan.html @@ -0,0 +1,220 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.TouchPan + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.TouchPan +

+ +
+ +
+
+ + + + +
+

new TouchPan

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to pan the map by touching and dragging +on a touch screen.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.TouchPanOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • touchpaninteraction.js, line 22
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.TouchRotate.html b/float-no-zero/apidoc/ol.interaction.TouchRotate.html new file mode 100644 index 0000000000..44887c1ddc --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.TouchRotate.html @@ -0,0 +1,220 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.TouchRotate + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.TouchRotate +

+ +
+ +
+
+ + + + +
+

new TouchRotate

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to rotate the map by twisting with two fingers +on a touch screen.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.TouchRotateOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • touchrotateinteraction.js, line 27
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.TouchZoom.html b/float-no-zero/apidoc/ol.interaction.TouchZoom.html new file mode 100644 index 0000000000..a49745e3fd --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.TouchZoom.html @@ -0,0 +1,220 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.interaction.TouchZoom + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.interaction. + + ol.interaction.TouchZoom +

+ +
+ +
+
+ + + + +
+

new TouchZoom

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Allows the user to zoom the map by pinching with two fingers +on a touch screen.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.TouchZoomOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • touchzoominteraction.js, line 21
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.interaction.html b/float-no-zero/apidoc/ol.interaction.html new file mode 100644 index 0000000000..cecda9cbc0 --- /dev/null +++ b/float-no-zero/apidoc/ol.interaction.html @@ -0,0 +1,342 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.interaction + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.interaction +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • interaction.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + +

Classes

+ +
+
ol.interaction.DoubleClickZoom
+
+ +
ol.interaction.DragAndDrop
+
+ +
ol.interaction.DragBox
+
+ +
ol.interaction.DragPan
+
+ +
ol.interaction.DragRotate
+
+ +
ol.interaction.DragRotateAndZoom
+
+ +
ol.interaction.DragZoom
+
+ +
ol.interaction.Draw
+
+ +
ol.interaction.KeyboardPan
+
+ +
ol.interaction.KeyboardZoom
+
+ +
ol.interaction.Modify
+
+ +
ol.interaction.MouseWheelZoom
+
+ +
ol.interaction.Select
+
+ +
ol.interaction.TouchPan
+
+ +
ol.interaction.TouchRotate
+
+ +
ol.interaction.TouchZoom
+
+
+ + + + + + + + + +

Methods

+ +
+ +
+

<static> defaults

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

This method is a convenience method to create a set of interactions +to be used with an ol.Map. Specific interactions can be excluded by +setting the appropriate option to false in the constructor options, +but the order of the interactions is fixed. If you want to specify a +different order for interactions, you will need to create your own +ol.interaction instances and insert them into an +ol.Collection in the order you want before creating your ol.Map +instance.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.interaction.DefaultsOptions + + + + + + <optional>
+ + + +

Defaults options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • interactiondefaults.js, line 31
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

A collection of interactions to be used with +the ol.Map constructor's interactions option.

+
+ + + +
+
+ Type +
+
+ +ol.Collection + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.layer.Group.html b/float-no-zero/apidoc/ol.layer.Group.html new file mode 100644 index 0000000000..59b4dbf763 --- /dev/null +++ b/float-no-zero/apidoc/ol.layer.Group.html @@ -0,0 +1,461 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.layer.Group + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.layer. + + ol.layer.Group +

+ +
+ +
+
+ + + + +
+

new Group

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.layer.GroupOptions + + + + + + <optional>
+ + + +

Layer options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • layergroup.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
layers + + +ol.Collection + + + + yeschange:layerscollection of layers that are part + of this group
+
+ + + + + + +

Methods

+ +
+ +
+

getLayers

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • layergroup.js, line 148
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Collection of layers.

+
+ + + +
+
+ Type +
+
+ +ol.Collection +| + +undefined + + +
+
+ + + + +
+ + + +
+

setLayers

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
layers + + +ol.Collection +| + +undefined + + + +

Collection of layers.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • layergroup.js, line 162
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.layer.Image.html b/float-no-zero/apidoc/ol.layer.Image.html new file mode 100644 index 0000000000..7c0af42ddd --- /dev/null +++ b/float-no-zero/apidoc/ol.layer.Image.html @@ -0,0 +1,306 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.layer.Image + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.layer. + + ol.layer.Image +

+ +
+ +
+
+ + + + +
+

new Image

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.layer.LayerOptions + + + +

Layer options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagelayer.js, line 13
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getSource

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • layer.js, line 75
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Source.

+
+ + + +
+
+ Type +
+
+ +ol.source.Source + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.layer.Layer.html b/float-no-zero/apidoc/ol.layer.Layer.html new file mode 100644 index 0000000000..37ab0f42d2 --- /dev/null +++ b/float-no-zero/apidoc/ol.layer.Layer.html @@ -0,0 +1,444 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.layer.Layer + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.layer. + + ol.layer.Layer +

+ +
+ +
+
+ + + + +
+

new Layer

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.layer.LayerOptions + + + +

Layer options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • layer.js, line 26
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
brightness + + +number + + + + yeschange:brightnessthe brightness of the layer
contrast + + +number + + + + yeschange:contrastthe contrast of the layer
hue + + +number + + + + yeschange:huethe hue of the layer
opacity + + +number + + + + yeschange:opacitythe opacity of the layer
saturation + + +number + + + + yeschange:saturationthe saturation of the layer
visible + + +boolean + + + + yeschange:visiblethe visiblity of the layer
maxResolution + + +number + + + + yeschange:maxresolutionthe maximum resolution of the layer
minResolution + + +number + + + + yeschange:minresolutionthe minimum resolution of the layer
+
+ + + + + + +

Methods

+ +
+ +
+

getSource

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • layer.js, line 75
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Source.

+
+ + + +
+
+ Type +
+
+ +ol.source.Source + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.layer.Tile.html b/float-no-zero/apidoc/ol.layer.Tile.html new file mode 100644 index 0000000000..66ed86b194 --- /dev/null +++ b/float-no-zero/apidoc/ol.layer.Tile.html @@ -0,0 +1,748 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.layer.Tile + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.layer. + + ol.layer.Tile +

+ +
+ +
+
+ + + + +
+

new Tile

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.layer.TileOptions + + + +

Tile layer options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilelayer.js, line 23
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + +

Observable Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSettableEventDescription
preload + + +number + + + + yeschange:preloadthe level to preload tiles up to
+
+ + + + + + +

Methods

+ +
+ +
+

getPreload

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilelayer.js, line 34
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Preload.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getSource

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • layer.js, line 75
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Source.

+
+ + + +
+
+ Type +
+
+ +ol.source.Source + + +
+
+ + + + +
+ + + +
+

getUseInterimTilesOnError

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilelayer.js, line 61
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Use interim tiles on error.

+
+ + + +
+
+ Type +
+
+ +boolean +| + +undefined + + +
+
+ + + + +
+ + + +
+

setPreload

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
preload + + +number + + + +

Preload.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilelayer.js, line 48
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setUseInterimTilesOnError

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
useInterimTilesOnError + + +boolean +| + +undefined + + + +

Use interim tiles on error.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilelayer.js, line 75
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.layer.Vector.html b/float-no-zero/apidoc/ol.layer.Vector.html new file mode 100644 index 0000000000..d5edf327d5 --- /dev/null +++ b/float-no-zero/apidoc/ol.layer.Vector.html @@ -0,0 +1,835 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.layer.Vector + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.layer. + + ol.layer.Vector +

+ +
+ +
+
+ + + + +
+

new Vector

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.layer.VectorOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorlayer.js, line 23
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getRenderGeometryFunctions

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorlayer.js, line 59
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Render geometry functions.

+
+ + + +
+
+ Type +
+
+ +ol.Collection +| + +undefined + + +
+
+ + + + +
+ + + +
+

getSource

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • layer.js, line 75
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Source.

+
+ + + +
+
+ Type +
+
+ +ol.source.Source + + +
+
+ + + + +
+ + + +
+

getStyle

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Get the style for features. This returns whatever was passed to the style +option at construction or to the setStyle method.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorlayer.js, line 75
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layer style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction + + +
+
+ + + + +
+ + + +
+

getStyleFunction

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the style function.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorlayer.js, line 85
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Layer style function.

+
+ + + +
+
+ Type +
+
+ +ol.feature.StyleFunction +| + +undefined + + +
+
+ + + + +
+ + + +
+

setRenderGeometryFunctions

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
renderGeometryFunctions + + +ol.Collection +| + +undefined + + + +

Render geometry + functions.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorlayer.js, line 95
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

setStyle

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Set the style for features. This can be a single style object, an array +of styles, or a function that takes a feature and resolution and returns +an array of styles.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
style + + +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction + + + +

Layer style.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorlayer.js, line 114
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.layer.html b/float-no-zero/apidoc/ol.layer.html new file mode 100644 index 0000000000..e918385273 --- /dev/null +++ b/float-no-zero/apidoc/ol.layer.html @@ -0,0 +1,149 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.layer + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.layer +

+ +
+ + + +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.parser.ogc.WMSCapabilities.html b/float-no-zero/apidoc/ol.parser.ogc.WMSCapabilities.html new file mode 100644 index 0000000000..bb331ceabe --- /dev/null +++ b/float-no-zero/apidoc/ol.parser.ogc.WMSCapabilities.html @@ -0,0 +1,213 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.parser.ogc.WMSCapabilities + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.parser.ogc.WMSCapabilities +

+ +
+ +
+
+ + + + +
+

new WMSCapabilities

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +Object + + + + + + <optional>
+ + + +

Options which will be set on this object.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • wmscapabilitiesparser.js, line 48
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.proj.Projection.html b/float-no-zero/apidoc/ol.proj.Projection.html new file mode 100644 index 0000000000..bcd29944fd --- /dev/null +++ b/float-no-zero/apidoc/ol.proj.Projection.html @@ -0,0 +1,479 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.proj.Projection + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.proj. + + ol.proj.Projection +

+ +
+ +
+
+ + + + +
+

new Projection

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.ProjectionOptions + + + +

Projection options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 68
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getCode

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Get the code for this projection, e.g. 'EPSG:4326'.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 114
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Code.

+
+ + + +
+
+ Type +
+
+ +string + + +
+
+ + + + +
+ + + +
+

getExtent

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Get the validity extent for this projection.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 123
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getUnits

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Get the units of this projection.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 145
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Units.

+
+ + + +
+
+ Type +
+
+ +ol.proj.Units + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.proj.html b/float-no-zero/apidoc/ol.proj.html new file mode 100644 index 0000000000..0113e27c18 --- /dev/null +++ b/float-no-zero/apidoc/ol.proj.html @@ -0,0 +1,1524 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.proj + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.proj +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + +

Classes

+ +
+
ol.proj.Projection
+
+
+ + + + + + + +

Members

+ +
+ +
+

<static> ProjectionLike

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 35
+ + + + + + + +
+ + + +
+ + + +
+

<static> Units :string

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
DEGREES + + +string + + + + + + degrees + +
FEET + + +string + + + + + + ft + +
METERS + + +string + + + + + + m + +
PIXELS + + +string + + + + + + pixels + +
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 42
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

<static> addProjection

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
projection + + +ol.proj.Projection + + + +

Projection.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 376
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

<static> configureProj4jsProjection

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.Proj4jsProjectionOptions + + + +

Proj4js projection options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 721
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Proj4js projection.

+
+ + + +
+
+ Type +
+
+ +ol.proj.Projection + + +
+
+ + + + +
+ + + +
+

<static> get

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
projectionLike + + +ol.proj.ProjectionLike + + + +

Either a code string which is + a combination of authority and identifier such as "EPSG:4326", or an + existing projection object, or undefined.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 474
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Projection.

+
+ + + +
+
+ Type +
+
+ +ol.proj.Projection + + +
+
+ + + + +
+ + + +
+

<static> getTransform

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Given the projection-like objects this method searches for a transformation +function to convert a coordinates array from the source projection to the +destination projection.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
source + + +ol.proj.ProjectionLike + + + +

Source.

destination + + +ol.proj.ProjectionLike + + + +

Destination.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 556
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Transform.

+
+ + + +
+
+ Type +
+
+ +ol.TransformFunction + + +
+
+ + + + +
+ + + +
+

<static> getTransformFromProjections

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Searches a function that can be used to convert coordinates from the source +projection to the destination projection.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
sourceProjection + + +ol.proj.Projection + + + +

Source projection.

destinationProjection + + +ol.proj.Projection + + + +

Destination projection.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 573
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Transform.

+
+ + + +
+
+ Type +
+
+ +ol.TransformFunction + + +
+
+ + + + +
+ + + +
+

<static> transform

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
point + + +ol.Coordinate + + + +

Point.

source + + +ol.proj.ProjectionLike + + + +

Source.

destination + + +ol.proj.ProjectionLike + + + +

Destination.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 693
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

<static> transformWithProjections

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Transforms the given point to the destination projection.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
point + + +ol.Coordinate + + + +

Point.

sourceProjection + + +ol.proj.Projection + + + +

Source projection.

destinationProjection + + +ol.proj.Projection + + + +

Destination projection.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 708
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Point.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ +
+ + + +

TypeDefs

+ +
+ +
+

ProjectionLike

+ + +
Stability: experimental
+ + + + +
+
+ +
+

A projection as ol.proj.Projection, SRS identifier string or +undefined.

+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • proj.js, line 29
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.BingMaps.html b/float-no-zero/apidoc/ol.source.BingMaps.html new file mode 100644 index 0000000000..87b85178ff --- /dev/null +++ b/float-no-zero/apidoc/ol.source.BingMaps.html @@ -0,0 +1,260 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.BingMaps + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.BingMaps +

+ +
+ +
+
+ + + + +
+

new BingMaps

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.BingMapsOptions + + + +

Bing Maps options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • bingmapssource.js, line 24
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Members

+ +
+ +
+

<static, constant> TOS_ATTRIBUTION :ol.Attribution

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • bingmapssource.js, line 56
+ + + + + + + +
+ + + +
+ +
+ + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.GPX.html b/float-no-zero/apidoc/ol.source.GPX.html new file mode 100644 index 0000000000..bcb97c1837 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.GPX.html @@ -0,0 +1,2320 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.GPX + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.GPX +

+ +
+ +
+
+ + + + +
+

new GPX

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.GPXOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • gpxsource.js, line 14
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

addFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 77
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +Array.<ol.Feature> + + + +

Features.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 109
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

forEachFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 150
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

forEachFeatureInExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
extent + + +ol.Extent + + + + + + + +

Extent.

f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 186
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

getClosestFeatureToCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 235
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest feature.

+
+ + + +
+
+ Type +
+
+ +ol.Feature + + +
+
+ + + + +
+ + + +
+

getExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 281
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getFeaturesAtCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 211
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

removeFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 326
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.GeoJSON.html b/float-no-zero/apidoc/ol.source.GeoJSON.html new file mode 100644 index 0000000000..79809f7ee6 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.GeoJSON.html @@ -0,0 +1,2320 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.GeoJSON + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.GeoJSON +

+ +
+ +
+
+ + + + +
+

new GeoJSON

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.GeoJSONOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • geojsonsource.js, line 14
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

addFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 77
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +Array.<ol.Feature> + + + +

Features.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 109
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

forEachFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 150
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

forEachFeatureInExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
extent + + +ol.Extent + + + + + + + +

Extent.

f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 186
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

getClosestFeatureToCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 235
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest feature.

+
+ + + +
+
+ Type +
+
+ +ol.Feature + + +
+
+ + + + +
+ + + +
+

getExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 281
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getFeaturesAtCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 211
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

removeFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 326
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.IGC.html b/float-no-zero/apidoc/ol.source.IGC.html new file mode 100644 index 0000000000..0490a781f1 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.IGC.html @@ -0,0 +1,2320 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.IGC + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.IGC +

+ +
+ +
+
+ + + + +
+

new IGC

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.IGCOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • igcsource.js, line 14
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

addFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 77
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +Array.<ol.Feature> + + + +

Features.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 109
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

forEachFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 150
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

forEachFeatureInExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
extent + + +ol.Extent + + + + + + + +

Extent.

f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 186
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

getClosestFeatureToCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 235
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest feature.

+
+ + + +
+
+ Type +
+
+ +ol.Feature + + +
+
+ + + + +
+ + + +
+

getExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 281
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getFeaturesAtCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 211
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

removeFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 326
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.ImageCanvas.html b/float-no-zero/apidoc/ol.source.ImageCanvas.html new file mode 100644 index 0000000000..111629902c --- /dev/null +++ b/float-no-zero/apidoc/ol.source.ImageCanvas.html @@ -0,0 +1,205 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.ImageCanvas + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.ImageCanvas +

+ +
+ +
+
+ + + + +
+

new ImageCanvas

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.ImageCanvasOptions + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagecanvassource.js, line 16
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.ImageStatic.html b/float-no-zero/apidoc/ol.source.ImageStatic.html new file mode 100644 index 0000000000..f4e617d846 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.ImageStatic.html @@ -0,0 +1,205 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.ImageStatic + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.ImageStatic +

+ +
+ +
+
+ + + + +
+

new ImageStatic

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.ImageStaticOptions + + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagestaticsource.js, line 16
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.ImageVector.html b/float-no-zero/apidoc/ol.source.ImageVector.html new file mode 100644 index 0000000000..f9510b9271 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.ImageVector.html @@ -0,0 +1,223 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.ImageVector + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.ImageVector +

+ +
+ +
+
+ + + + +
+

new ImageVector

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

An image source whose images are canvas elements into which vector features +read from a vector source (ol.source.Vector) are drawn. An +ol.source.ImageVector object is to be used as the source of an image +layer (ol.layer.Image). Image layers are rotated, scaled, and translated, +as opposed to being re-rendered, during animations and interactions. So, like +any other image layer, an image layer configured with an +ol.source.ImageVector will exhibit this behaviour. This is in contrast to a +vector layer, where vector features are re-drawn during animations and +interactions.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.ImageVectorOptions + + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagevectorsource.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.ImageWMS.html b/float-no-zero/apidoc/ol.source.ImageWMS.html new file mode 100644 index 0000000000..69c5634b64 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.ImageWMS.html @@ -0,0 +1,756 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.ImageWMS + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.ImageWMS +

+ +
+ +
+
+ + + + +
+

new ImageWMS

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.ImageWMSOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagewmssource.js, line 24
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getGetFeatureInfoUrl

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Return the GetFeatureInfo URL for the passed coordinate, resolution, and +projection. Return undefined if the GetFeatureInfo URL cannot be +constructed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

resolution + + +number + + + +

Resolution.

projection + + +ol.proj.Projection + + + +

Projection.

params + + +Object + + + +

GetFeatureInfo params. INFO_FORMAT at least should + be provided. If QUERY_LAYERS is not provided then the layers specified + in the LAYERS parameter will be used. VERSION should not be + specified here.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagewmssource.js, line 128
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

GetFeatureInfo URL.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

getParams

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Get the user-provided params, i.e. those passed to the constructor through +the "params" option, and possibly updated using the updateParams method.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagewmssource.js, line 177
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Params.

+
+ + + +
+
+ Type +
+
+ +Object + + +
+
+ + + + +
+ + + +
+

setUrl

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
url + + +string +| + +undefined + + + +

URL.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagewmssource.js, line 316
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

updateParams

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Update the user-provided params.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
params + + +Object + + + +

Params.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagewmssource.js, line 329
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.KML.html b/float-no-zero/apidoc/ol.source.KML.html new file mode 100644 index 0000000000..9af5de8634 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.KML.html @@ -0,0 +1,2320 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.KML + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.KML +

+ +
+ +
+
+ + + + +
+

new KML

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.KMLOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • kmlsource.js, line 14
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

addFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 77
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +Array.<ol.Feature> + + + +

Features.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 109
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

forEachFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 150
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

forEachFeatureInExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
extent + + +ol.Extent + + + + + + + +

Extent.

f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 186
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

getClosestFeatureToCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 235
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest feature.

+
+ + + +
+
+ Type +
+
+ +ol.Feature + + +
+
+ + + + +
+ + + +
+

getExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 281
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getFeaturesAtCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 211
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

removeFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 326
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.MapGuide.html b/float-no-zero/apidoc/ol.source.MapGuide.html new file mode 100644 index 0000000000..997072d598 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.MapGuide.html @@ -0,0 +1,205 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.MapGuide + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.MapGuide +

+ +
+ +
+
+ + + + +
+

new MapGuide

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.MapGuideOptions + + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • mapguidesource.js, line 17
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.MapQuest.html b/float-no-zero/apidoc/ol.source.MapQuest.html new file mode 100644 index 0000000000..0845a38392 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.MapQuest.html @@ -0,0 +1,342 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.MapQuest + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.MapQuest +

+ +
+ +
+
+ + + + +
+

new MapQuest

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.MapQuestOptions + + + + + + <optional>
+ + + +

MapQuest options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • mapquestsource.js, line 16
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

setUrl

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
url + + +string + + + +

URL.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • xyzsource.js, line 73
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.OSM.html b/float-no-zero/apidoc/ol.source.OSM.html new file mode 100644 index 0000000000..4f74cc99a5 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.OSM.html @@ -0,0 +1,448 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.OSM + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.OSM +

+ +
+ +
+
+ + + + +
+

new OSM

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.OSMOptions + + + + + + <optional>
+ + + +

Open Street Map options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • osmsource.js, line 14
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + +

Members

+ +
+ +
+

<static, constant> DATA_ATTRIBUTION :ol.Attribution

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • osmsource.js, line 48
+ + + + + + + +
+ + + +
+ + + +
+

<static, constant> TILE_ATTRIBUTION :ol.Attribution

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • osmsource.js, line 60
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

setUrl

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
url + + +string + + + +

URL.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • xyzsource.js, line 73
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.OSMXML.html b/float-no-zero/apidoc/ol.source.OSMXML.html new file mode 100644 index 0000000000..0613ca17a5 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.OSMXML.html @@ -0,0 +1,2320 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.OSMXML + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.OSMXML +

+ +
+ +
+
+ + + + +
+

new OSMXML

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.OSMXMLOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • osmxmlsource.js, line 13
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

addFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 77
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +Array.<ol.Feature> + + + +

Features.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 109
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

forEachFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 150
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

forEachFeatureInExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
extent + + +ol.Extent + + + + + + + +

Extent.

f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 186
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

getClosestFeatureToCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 235
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest feature.

+
+ + + +
+
+ Type +
+
+ +ol.Feature + + +
+
+ + + + +
+ + + +
+

getExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 281
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getFeaturesAtCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 211
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

removeFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 326
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.Source.html b/float-no-zero/apidoc/ol.source.Source.html new file mode 100644 index 0000000000..47a8835e17 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.Source.html @@ -0,0 +1,1197 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.Source + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.Source +

+ +
+ +
+
+ + + + +
+

new Source

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +ol.source.SourceOptions + + + +

Source options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • source.js, line 39
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getExtent

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • source.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.Stamen.html b/float-no-zero/apidoc/ol.source.Stamen.html new file mode 100644 index 0000000000..9b96b43a21 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.Stamen.html @@ -0,0 +1,332 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.Stamen + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.Stamen +

+ +
+ +
+
+ + + + +
+

new Stamen

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.StamenOptions + + + +

Stamen options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • stamensource.js, line 86
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

setUrl

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
url + + +string + + + +

URL.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • xyzsource.js, line 73
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.Tile.html b/float-no-zero/apidoc/ol.source.Tile.html new file mode 100644 index 0000000000..a506d7dcc2 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.Tile.html @@ -0,0 +1,1293 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.Tile + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.Tile +

+ +
+ +
+
+ + + + +
+

new Tile

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +ol.source.TileOptions + + + +

Tile source options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilesource.js, line 33
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getExtent

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

getTileGrid

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilesource.js, line 157
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Tile grid.

+
+ + + +
+
+ Type +
+
+ +ol.tilegrid.TileGrid + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.TileDebug.html b/float-no-zero/apidoc/ol.source.TileDebug.html new file mode 100644 index 0000000000..1fcd65df18 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.TileDebug.html @@ -0,0 +1,1298 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.TileDebug + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.TileDebug +

+ +
+ +
+
+ + + + +
+

new TileDebug

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.TileDebugOptions + + + +

Debug tile options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • debugtilesource.js, line 90
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

getExtent

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 105
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

getTileGrid

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilesource.js, line 157
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Tile grid.

+
+ + + +
+
+ Type +
+
+ +ol.tilegrid.TileGrid + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.TileJSON.html b/float-no-zero/apidoc/ol.source.TileJSON.html new file mode 100644 index 0000000000..5e46832a13 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.TileJSON.html @@ -0,0 +1,205 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.TileJSON + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.TileJSON +

+ +
+ +
+
+ + + + +
+

new TileJSON

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.TileJSONOptions + + + +

TileJSON options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilejsonsource.js, line 46
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.TileWMS.html b/float-no-zero/apidoc/ol.source.TileWMS.html new file mode 100644 index 0000000000..b0b9f4b48c --- /dev/null +++ b/float-no-zero/apidoc/ol.source.TileWMS.html @@ -0,0 +1,641 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.TileWMS + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.TileWMS +

+ +
+ +
+
+ + + + +
+

new TileWMS

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.TileWMSOptions + + + + + + <optional>
+ + + +

Tile WMS options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilewmssource.js, line 28
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getGetFeatureInfoUrl

+ + +
Stability: not documented
+ + + + +
+
+ + +
+

Return the GetFeatureInfo URL for the passed coordinate, resolution, and +projection. Return undefined if the GetFeatureInfo URL cannot be +constructed.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

resolution + + +number + + + +

Resolution.

projection + + +ol.proj.Projection + + + +

Projection.

params + + +Object + + + +

GetFeatureInfo params. INFO_FORMAT at least should + be provided. If QUERY_LAYERS is not provided then the layers specified + in the LAYERS parameter will be used. VERSION should not be + specified here.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilewmssource.js, line 128
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

GetFeatureInfo URL.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

getParams

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the user-provided params, i.e. those passed to the constructor through +the "params" option, and possibly updated using the updateParams method.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilewmssource.js, line 210
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Params.

+
+ + + +
+
+ Type +
+
+ +Object + + +
+
+ + + + +
+ + + +
+

updateParams

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Update the user-provided params.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
params + + +Object + + + +

Params.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilewmssource.js, line 382
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.TopoJSON.html b/float-no-zero/apidoc/ol.source.TopoJSON.html new file mode 100644 index 0000000000..a59b5972e6 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.TopoJSON.html @@ -0,0 +1,2320 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.TopoJSON + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.TopoJSON +

+ +
+ +
+
+ + + + +
+

new TopoJSON

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.TopoJSONOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • topojsonsource.js, line 14
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

addFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 77
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +Array.<ol.Feature> + + + +

Features.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 109
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

forEachFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 150
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

forEachFeatureInExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
extent + + +ol.Extent + + + + + + + +

Extent.

f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 186
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

getClosestFeatureToCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 235
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest feature.

+
+ + + +
+
+ Type +
+
+ +ol.Feature + + +
+
+ + + + +
+ + + +
+

getExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 281
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getFeaturesAtCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 211
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

removeFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 326
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.Vector.html b/float-no-zero/apidoc/ol.source.Vector.html new file mode 100644 index 0000000000..2936c61585 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.Vector.html @@ -0,0 +1,2275 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.Vector + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.Vector +

+ +
+ +
+
+ + + + +
+

new Vector

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.VectorOptions + + + + + + <optional>
+ + + +

Vector source options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

addFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 77
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +Array.<ol.Feature> + + + +

Features.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 109
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

forEachFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 150
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

forEachFeatureInExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
extent + + +ol.Extent + + + + + + + +

Extent.

f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 186
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

getClosestFeatureToCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 235
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest feature.

+
+ + + +
+
+ Type +
+
+ +ol.Feature + + +
+
+ + + + +
+ + + +
+

getExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 281
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getFeaturesAtCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 211
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

removeFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 326
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.VectorFile.html b/float-no-zero/apidoc/ol.source.VectorFile.html new file mode 100644 index 0000000000..3afac7421c --- /dev/null +++ b/float-no-zero/apidoc/ol.source.VectorFile.html @@ -0,0 +1,2320 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.VectorFile + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.VectorFile +

+ +
+ +
+
+ + + + +
+

new VectorFile

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.VectorFileOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • vectorfilesource.js, line 28
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

addFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 77
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

addFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +Array.<ol.Feature> + + + +

Features.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 109
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

dispatchChangeEvent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 35
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

forEachFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 150
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

forEachFeatureInExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
extent + + +ol.Extent + + + + + + + +

Extent.

f + + +function + + + + + + + +

Callback.

this + + +T + + + + + + <optional>
+ + + +

The object to use as this in f.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 186
+ + + + + + + +
+ + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +S +| + +undefined + + +
+
+ + + + +
+ + + +
+

getClosestFeatureToCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 235
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Closest feature.

+
+ + + +
+
+ Type +
+
+ +ol.Feature + + +
+
+ + + + +
+ + + +
+

getExtent

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 281
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Extent.

+
+ + + +
+
+ Type +
+
+ +ol.Extent + + +
+
+ + + + +
+ + + +
+

getFeatures

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 196
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getFeaturesAtCoordinate

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
coordinate + + +ol.Coordinate + + + +

Coordinate.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 211
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Features.

+
+ + + +
+
+ Type +
+
+ +Array.<ol.Feature> + + +
+
+ + + + +
+ + + +
+

getState

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • source.js, line 135
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

State.

+
+ + + +
+
+ Type +
+
+ +ol.source.State + + +
+
+ + + + +
+ + + +
+

on

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 58
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

once

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Listen once for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 71
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Unique key for the listener.

+
+ + + +
+
+ Type +
+
+ +goog.events.Key + + +
+
+ + + + +
+ + + +
+

removeFeature

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
feature + + +ol.Feature + + + +

Feature.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • vectorsource.js, line 326
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

un

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Unlisten for a certain type of event.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
type + + +string +| + +Array.<string> + + + + + + + +

The event type or array of event types.

listener + + +function + + + + + + + +

The listener function.

this + + +Object + + + + + + <optional>
+ + + +

The object to use as this in listener.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 83
+ + + + + + + +
+ + + + + + + + + +
+ + + +
+

unByKey

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Removes an event listener using the key returned by on() or once().

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +goog.events.Key + + + +

Key.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • observable.js, line 93
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.WMTS.html b/float-no-zero/apidoc/ol.source.WMTS.html new file mode 100644 index 0000000000..7b53849233 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.WMTS.html @@ -0,0 +1,574 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.WMTS + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.WMTS +

+ +
+ +
+
+ + + + +
+

new WMTS

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.WMTSOptions + + + +

WMTS options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • wmtssource.js, line 34
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

<static> optionsFromCapabilities

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
wmtsCap + + +Object + + + +

An object representing the capabilities document.

layer + + +string + + + +

The layer identifier.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • wmtssource.js, line 244
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

WMTS source options object.

+
+ + + +
+
+ Type +
+
+ +olx.source.WMTSOptions + + +
+
+ + + + +
+ + + +
+

getDimensions

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Get the dimensions, i.e. those passed to the constructor through the +"dimensions" option, and possibly updated using the updateDimensions +method.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • wmtssource.js, line 200
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Dimensions.

+
+ + + +
+
+ Type +
+
+ +Object + + +
+
+ + + + +
+ + + +
+

updateDimensions

+ + +
Stability: experimental
+ + + + +
+
+ + +
+

Update the dimensions.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
dimensions + + +Object + + + +

Dimensions.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • wmtssource.js, line 231
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.XYZ.html b/float-no-zero/apidoc/ol.source.XYZ.html new file mode 100644 index 0000000000..58a6d2d208 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.XYZ.html @@ -0,0 +1,321 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.XYZ + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.XYZ +

+ +
+ +
+
+ + + + +
+

new XYZ

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.source.XYZOptions + + + +

XYZ options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • xyzsource.js, line 18
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

setUrl

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
url + + +string + + + +

URL.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • xyzsource.js, line 73
+ + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.Zoomify.html b/float-no-zero/apidoc/ol.source.Zoomify.html new file mode 100644 index 0000000000..d4768e6b46 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.Zoomify.html @@ -0,0 +1,215 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.source.Zoomify + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.source. + + ol.source.Zoomify +

+ +
+ +
+
+ + + + +
+

new Zoomify

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.source.ZoomifyOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • zoomifysource.js, line 32
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.source.html b/float-no-zero/apidoc/ol.source.html new file mode 100644 index 0000000000..6481dee1a4 --- /dev/null +++ b/float-no-zero/apidoc/ol.source.html @@ -0,0 +1,520 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.source + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.source +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • source.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + +

Classes

+ +
+
ol.source.BingMaps
+
+ +
ol.source.GeoJSON
+
+ +
ol.source.GPX
+
+ +
ol.source.IGC
+
+ +
ol.source.ImageCanvas
+
+ +
ol.source.ImageStatic
+
+ +
ol.source.ImageVector
+
+ +
ol.source.ImageWMS
+
+ +
ol.source.KML
+
+ +
ol.source.MapGuide
+
+ +
ol.source.MapQuest
+
+ +
ol.source.OSM
+
+ +
ol.source.OSMXML
+
+ +
ol.source.Source
+
+ +
ol.source.Stamen
+
+ +
ol.source.Tile
+
+ +
ol.source.TileDebug
+
+ +
ol.source.TileJSON
+
+ +
ol.source.TileWMS
+
+ +
ol.source.TopoJSON
+
+ +
ol.source.Vector
+
+ +
ol.source.VectorFile
+
+ +
ol.source.WMTS
+
+ +
ol.source.XYZ
+
+ +
ol.source.Zoomify
+
+
+ + + + + + + +

Members

+ +
+ +
+

<static> State :number

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
LOADING + + +number + + + + + + 0 + +
READY + + +number + + + + + + 1 + +
ERROR + + +number + + + + + + 2 + +
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • source.js, line 14
+ + + + + + + +
+ + + +
+ + + +
+

<static> WMTSRequestEncoding :string

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
KVP + + +string + + + + + + KVP + +
REST + + +string + + + + + + REST + +
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • wmtssource.js, line 21
+ + + + + + + +
+ + + +
+ +
+ + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.style.Circle.html b/float-no-zero/apidoc/ol.style.Circle.html new file mode 100644 index 0000000000..17d855ed79 --- /dev/null +++ b/float-no-zero/apidoc/ol.style.Circle.html @@ -0,0 +1,663 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.style.Circle + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.style.Circle +

+ +
+ +
+
+ + + + +
+

new Circle

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.style.CircleOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circlestyle.js, line 22
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getFill

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circlestyle.js, line 94
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Fill style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Fill + + +
+
+ + + + +
+ + + +
+

getRadius

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circlestyle.js, line 126
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Radius.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getRotation

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • imagestyle.js, line 87
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Rotation.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getScale

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • imagestyle.js, line 95
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Scale.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getStroke

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • circlestyle.js, line 142
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Stroke style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Stroke + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.style.Fill.html b/float-no-zero/apidoc/ol.style.Fill.html new file mode 100644 index 0000000000..cef912c8c6 --- /dev/null +++ b/float-no-zero/apidoc/ol.style.Fill.html @@ -0,0 +1,306 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.style.Fill + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.style.Fill +

+ +
+ +
+
+ + + + +
+

new Fill

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.style.FillOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • fillstyle.js, line 11
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getColor

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • fillstyle.js, line 26
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Color.

+
+ + + +
+
+ Type +
+
+ +ol.Color +| + +string + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.style.Icon.html b/float-no-zero/apidoc/ol.style.Icon.html new file mode 100644 index 0000000000..9cbd496725 --- /dev/null +++ b/float-no-zero/apidoc/ol.style.Icon.html @@ -0,0 +1,494 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.style.Icon + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.style.Icon +

+ +
+ +
+
+ + + + +
+

new Icon

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.style.IconOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • iconstyle.js, line 45
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getRotation

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • imagestyle.js, line 87
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Rotation.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getScale

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • imagestyle.js, line 95
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Scale.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getSrc

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • iconstyle.js, line 194
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Image src.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.style.Image.html b/float-no-zero/apidoc/ol.style.Image.html new file mode 100644 index 0000000000..a0736626eb --- /dev/null +++ b/float-no-zero/apidoc/ol.style.Image.html @@ -0,0 +1,379 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.style.Image + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.style.Image +

+ +
+ +
+
+ + + + +
+

new Image

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +ol.style.ImageOptions + + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagestyle.js, line 33
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getRotation

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagestyle.js, line 87
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Rotation.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getScale

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • imagestyle.js, line 95
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Scale.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.style.Stroke.html b/float-no-zero/apidoc/ol.style.Stroke.html new file mode 100644 index 0000000000..f1c41e62b0 --- /dev/null +++ b/float-no-zero/apidoc/ol.style.Stroke.html @@ -0,0 +1,748 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.style.Stroke + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.style.Stroke +

+ +
+ +
+
+ + + + +
+

new Stroke

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.style.StrokeOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • strokestyle.js, line 11
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getColor

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • strokestyle.js, line 56
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Color.

+
+ + + +
+
+ Type +
+
+ +ol.Color +| + +string + + +
+
+ + + + +
+ + + +
+

getLineCap

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • strokestyle.js, line 64
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Line cap.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

getLineDash

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • strokestyle.js, line 72
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Line dash.

+
+ + + +
+
+ Type +
+
+ +Array.<number> + + +
+
+ + + + +
+ + + +
+

getLineJoin

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • strokestyle.js, line 80
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Line join.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

getMiterLimit

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • strokestyle.js, line 88
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Miter limit.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getWidth

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • strokestyle.js, line 96
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Width.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.style.Style.html b/float-no-zero/apidoc/ol.style.Style.html new file mode 100644 index 0000000000..a3a536ab65 --- /dev/null +++ b/float-no-zero/apidoc/ol.style.Style.html @@ -0,0 +1,650 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.style.Style + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.style.Style +

+ +
+ +
+
+ + + + +
+

new Style

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.style.StyleOptions + + + + + + <optional>
+ + + +

Style options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • style.js, line 13
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getFill

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • style.js, line 53
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Fill style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Fill + + +
+
+ + + + +
+ + + +
+

getImage

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • style.js, line 61
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Image style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Image + + +
+
+ + + + +
+ + + +
+

getStroke

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • style.js, line 69
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Stroke style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Stroke + + +
+
+ + + + +
+ + + +
+

getText

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • style.js, line 77
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Text style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Text + + +
+
+ + + + +
+ + + +
+

getZIndex

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • style.js, line 85
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

ZIndex.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.style.Text.html b/float-no-zero/apidoc/ol.style.Text.html new file mode 100644 index 0000000000..aeb3a5edfd --- /dev/null +++ b/float-no-zero/apidoc/ol.style.Text.html @@ -0,0 +1,923 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.style.Text + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.style.Text +

+ +
+ +
+
+ + + + +
+

new Text

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.style.TextOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • textstyle.js, line 9
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getFill

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • textstyle.js, line 74
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Fill style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Fill + + +
+
+ + + + +
+ + + +
+

getFont

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • textstyle.js, line 66
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Font.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

getRotation

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • textstyle.js, line 82
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Rotation.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getScale

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • textstyle.js, line 90
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Scale.

+
+ + + +
+
+ Type +
+
+ +number +| + +undefined + + +
+
+ + + + +
+ + + +
+

getStroke

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • textstyle.js, line 98
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Stroke style.

+
+ + + +
+
+ Type +
+
+ +ol.style.Stroke + + +
+
+ + + + +
+ + + +
+

getText

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • textstyle.js, line 106
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Text.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

getTextAlign

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • textstyle.js, line 114
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Text align.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ + + +
+

getTextBaseline

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • textstyle.js, line 122
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Text baseline.

+
+ + + +
+
+ Type +
+
+ +string +| + +undefined + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.tilegrid.TileGrid.html b/float-no-zero/apidoc/ol.tilegrid.TileGrid.html new file mode 100644 index 0000000000..032c250da1 --- /dev/null +++ b/float-no-zero/apidoc/ol.tilegrid.TileGrid.html @@ -0,0 +1,649 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.tilegrid.TileGrid + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.tilegrid. + + ol.tilegrid.TileGrid +

+ +
+ +
+
+ + + + +
+

new TileGrid

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.tilegrid.TileGridOptions + + + +

Tile grid options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 34
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getMinZoom

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 153
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Min zoom.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getOrigin

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
z + + +number + + + +

Z.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 163
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Origin.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getResolutions

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 188
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Resolutions.

+
+ + + +
+
+ Type +
+
+ +Array.<number> + + +
+
+ + + + +
+ + + +
+

getTileSize

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
z + + +number + + + +

Z.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 377
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Tile size.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.tilegrid.WMTS.html b/float-no-zero/apidoc/ol.tilegrid.WMTS.html new file mode 100644 index 0000000000..0beb5e2d80 --- /dev/null +++ b/float-no-zero/apidoc/ol.tilegrid.WMTS.html @@ -0,0 +1,761 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.tilegrid.WMTS + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.tilegrid. + + ol.tilegrid.WMTS +

+ +
+ +
+
+ + + + +
+

new WMTS

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.tilegrid.WMTSOptions + + + +

WMTS options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • wmtstilegrid.js, line 17
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getMatrixIds

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • wmtstilegrid.js, line 55
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

MatrixIds.

+
+ + + +
+
+ Type +
+
+ +Array.<string> + + +
+
+ + + + +
+ + + +
+

getMinZoom

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 153
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Min zoom.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getOrigin

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
z + + +number + + + +

Z.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 163
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Origin.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getResolutions

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 188
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Resolutions.

+
+ + + +
+
+ Type +
+
+ +Array.<number> + + +
+
+ + + + +
+ + + +
+

getTileSize

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
z + + +number + + + +

Z.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 377
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Tile size.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.tilegrid.XYZ.html b/float-no-zero/apidoc/ol.tilegrid.XYZ.html new file mode 100644 index 0000000000..90171dc3a0 --- /dev/null +++ b/float-no-zero/apidoc/ol.tilegrid.XYZ.html @@ -0,0 +1,675 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.tilegrid.XYZ + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.tilegrid. + + ol.tilegrid.XYZ +

+ +
+ +
+
+ + + + +
+

new XYZ

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +olx.tilegrid.XYZOptions + + + +

XYZ options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • xyztilegrid.js, line 19
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getMinZoom

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 153
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Min zoom.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getOrigin

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
z + + +number + + + +

Z.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 163
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Origin.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getResolutions

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 188
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Resolutions.

+
+ + + +
+
+ Type +
+
+ +Array.<number> + + +
+
+ + + + +
+ + + +
+

getTileSize

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
z + + +number + + + +

Z.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 377
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Tile size.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.tilegrid.Zoomify.html b/float-no-zero/apidoc/ol.tilegrid.Zoomify.html new file mode 100644 index 0000000000..43359b41dc --- /dev/null +++ b/float-no-zero/apidoc/ol.tilegrid.Zoomify.html @@ -0,0 +1,685 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.tilegrid.Zoomify + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.tilegrid. + + ol.tilegrid.Zoomify +

+ +
+ +
+
+ + + + +
+

new Zoomify

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
options + + +olx.tilegrid.ZoomifyOptions + + + + + + <optional>
+ + + +

Options.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • zoomifytilegrid.js, line 16
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getMinZoom

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 153
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Min zoom.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ + + +
+

getOrigin

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
z + + +number + + + +

Z.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 163
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Origin.

+
+ + + +
+
+ Type +
+
+ +ol.Coordinate + + +
+
+ + + + +
+ + + +
+

getResolutions

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 188
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Resolutions.

+
+ + + +
+
+ Type +
+
+ +Array.<number> + + +
+
+ + + + +
+ + + +
+

getTileSize

+ + +
Stability: experimental
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
z + + +number + + + +

Z.

+ + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
  • tilegrid.js, line 377
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Tile size.

+
+ + + +
+
+ Type +
+
+ +number + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.tilegrid.html b/float-no-zero/apidoc/ol.tilegrid.html new file mode 100644 index 0000000000..5f7911c2dd --- /dev/null +++ b/float-no-zero/apidoc/ol.tilegrid.html @@ -0,0 +1,146 @@ + + + + + OpenLayers 3 API Documentation - Namespace: ol.tilegrid + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol. + + ol.tilegrid +

+ +
+ + + +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/ol.webgl.Context.html b/float-no-zero/apidoc/ol.webgl.Context.html new file mode 100644 index 0000000000..704c90a513 --- /dev/null +++ b/float-no-zero/apidoc/ol.webgl.Context.html @@ -0,0 +1,450 @@ + + + + + OpenLayers 3 API Documentation - Class: ol.webgl.Context + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ ol.webgl.Context +

+ +
+ +
+
+ + + + +
+

new Context

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
canvas + + +HTMLCanvasElement + + + +

Canvas.

gl + + +WebGLRenderingContext + + + +

GL.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • context.js, line 27
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + +

Methods

+ +
+ +
+

getGL

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • context.js, line 163
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

GL.

+
+ + + +
+
+ Type +
+
+ +WebGLRenderingContext + + +
+
+ + + + +
+ + + +
+

useProgram

+ + +
Stability: not documented
+ + + + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
program + + +WebGLProgram + + + +

Program.

+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • context.js, line 250
+ + + + + + + +
+ + + + + + + +
Returns:
+ + +
+

Changed.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.animation.html b/float-no-zero/apidoc/olx.animation.html new file mode 100644 index 0000000000..387f252e14 --- /dev/null +++ b/float-no-zero/apidoc/olx.animation.html @@ -0,0 +1,842 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.animation + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.animation +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 3
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +

TypeDefs

+ +
+ +
+

BounceOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
resolution + + +number + + + +

The resolution to start the bounce from, typically map.getView().getResolution().

start + + +number +| + +undefined + + + +

The start time of the animation. Default is immediately.

duration + + +number +| + +undefined + + + +

The duration of the animation in milliseconds. Default is 1000.

easing + + +function + + + +

The easing function to use. Default is ol.easing.upAndDown

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 19
+ + + + + + + +
+ + + +
+ + + +
+

PanOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
source + + +ol.Coordinate + + + +

The location to start panning from, typically map.getView().getCenter().

start + + +number +| + +undefined + + + +

The start time of the animation. Default is immediately.

duration + + +number +| + +undefined + + + +

The duration of the animation in milliseconds. Default is 1000.

easing + + +function + + + +

The easing function to use. Default is ol.easing.inAndOut

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 21
+ + + + + + + +
+ + + +
+ + + +
+

RotateOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
rotation + + +number + + + +

The rotation to apply, in radians.

start + + +number +| + +undefined + + + +

The start time of the animation. Default is immediately.

duration + + +number +| + +undefined + + + +

The duration of the animation in milliseconds. Default is 1000.

easing + + +function + + + +

The easing function to use. Default is ol.easing.inAndOut

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 23
+ + + + + + + +
+ + + +
+ + + +
+

ZoomOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
resolution + + +number + + + +

number The resolution to begin zooming from, typically map.getView().getResolution().

start + + +number +| + +undefined + + + +

The start time of the animation. Default is immediately.

duration + + +number +| + +undefined + + + +

The duration of the animation in milliseconds. Default is 1000.

easing + + +function + + + +

Easing function.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 25
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.control.html b/float-no-zero/apidoc/olx.control.html new file mode 100644 index 0000000000..f5ffc690dd --- /dev/null +++ b/float-no-zero/apidoc/olx.control.html @@ -0,0 +1,1974 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.control + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.control +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 5
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +

TypeDefs

+ +
+ +
+

AttributionOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
className + + +string +| + +undefined + + + +

CSS class name. Default is ol-attribution.

target + + +Element +| + +undefined + + + +

Target.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 27
+ + + + + + + +
+ + + +
+ + + +
+

ControlOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
element + + +Element +| + +undefined + + + +

The element is the control's container + element. This only needs to be specified if you're developing a custom + control.

target + + +Element +| + +string +| + +undefined + + + +

Specify a target if you want the + control to be rendered outside of the map's viewport.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 29
+ + + + + + + +
+ + + +
+ + + +
+

DefaultsOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attribution + + +boolean +| + +undefined + + + +

Attribution. Default is true.

attributionOptions + + +olx.control.AttributionOptions +| + +undefined + + + +

Attribution options.

logo + + +boolean +| + +undefined + + + +

Logo. Default is true.

logoOptions + + +olx.control.LogoOptions +| + +undefined + + + +

Logo options.

zoom + + +boolean +| + +undefined + + + +

Zoom. Default is true.

zoomOptions + + +olx.control.ZoomOptions +| + +undefined + + + +

Zoom options.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 31
+ + + + + + + +
+ + + +
+ + + +
+

FullScreenOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
className + + +string +| + +undefined + + + +

CSS class name. Default is ol-full-screen.

tipLabel + + +string +| + +undefined + + + +

Text label to use for the button tip. Default is Toggle full-screen

keys + + +boolean +| + +undefined + + + +

Full keyboard access.

target + + +Element +| + +undefined + + + +

Target.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 33
+ + + + + + + +
+ + + +
+ + + +
+

LogoOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
className + + +string +| + +undefined + + + +

CSS class name. Default is ol-logo.

target + + +Element +| + +undefined + + + +

Target.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 35
+ + + + + + + +
+ + + +
+ + + +
+

MousePositionOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
className + + +string +| + +undefined + + + +

CSS class name. Default is ol-mouse-position.

coordinateFormat + + +ol.CoordinateFormatType +| + +undefined + + + +

Coordinate + format.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

target + + +Element +| + +undefined + + + +

Target.

undefinedHTML + + +string +| + +undefined + + + +

Markup for undefined coordinates. + Default is `` (empty string).

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 37
+ + + + + + + +
+ + + +
+ + + +
+

ScaleLineOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
className + + +string +| + +undefined + + + +

CSS Class name. Default is ol-scale-line.

minWidth + + +number +| + +undefined + + + +

Minimum width in pixels. Default is 64.

target + + +Element +| + +undefined + + + +

Target.

units + + +ol.control.ScaleLineUnits +| + +string +| + +undefined + + + +

Units. + Default is metric.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 39
+ + + + + + + +
+ + + +
+ + + +
+

ZoomOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
duration + + +number +| + +undefined + + + +

Animation duration in milliseconds. Default is 250.

className + + +string +| + +undefined + + + +

CSS class name. Default is ol-zoom.

zoomInLabel + + +string +| + +undefined + + + +

Text label to use for the zoom-in button. Default is +

zoomOutLabel + + +string +| + +undefined + + + +

Text label to use for the zoom-out button. Default is -

zoomInTipLabel + + +string +| + +undefined + + + +

Text label to use for the button tip. Default is Zoom in

zoomOutTipLabel + + +string +| + +undefined + + + +

Text label to use for the button tip. Default is Zoom out

delta + + +number +| + +undefined + + + +

The zoom delta applied on each click.

target + + +Element +| + +undefined + + + +

Target.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 41
+ + + + + + + +
+ + + +
+ + + +
+

ZoomSliderOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
className + + +string +| + +undefined + + + +

CSS class name.

maxResolution + + +number +| + +undefined + + + +

Maximum resolution.

minResolution + + +number +| + +undefined + + + +

Minimum resolution.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 43
+ + + + + + + +
+ + + +
+ + + +
+

ZoomToExtentOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
className + + +string +| + +undefined + + + +

Class name. Default is ol-zoom-extent.

target + + +Element +| + +undefined + + + +

Target.

tipLabel + + +string +| + +undefined + + + +

Text label to use for the button tip. Default is Zoom to extent

extent + + +ol.Extent +| + +undefined + + + +

The extent to zoom to. If + undefined the validity extent of the view projection is used.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 45
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.format.html b/float-no-zero/apidoc/olx.format.html new file mode 100644 index 0000000000..1ab1c89ec4 --- /dev/null +++ b/float-no-zero/apidoc/olx.format.html @@ -0,0 +1,837 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.format + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.format +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 7
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +

TypeDefs

+ +
+ +
+

GeoJSONOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
defaultProjection + + +ol.proj.ProjectionLike + + + +

Default projection.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 47
+ + + + + + + +
+ + + +
+ + + +
+

GMLOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
featureNS + + +string + + + +

Feature namespace.

featureType + + +string + + + +

Feature type to parse.

srsName + + +string + + + +

srsName to use when writing geometries.

surface + + +boolean +| + +undefined + + + +

Write gml:Surface instead of + gml:Polygon elements. This also affects the elements in multi-part + geometries. Default is `false´.

curve + + +boolean +| + +undefined + + + +

Write gml:Curve instead of + gml:LineString elements. This also affects the elements in multi-part + geometries. Default is `false´.

multiCurve + + +boolean +| + +undefined + + + +

Write gml:MultiCurve instead of + gml:MultiLineString. Since the latter is deprecated in GML 3, the + default is `true´.

multiSurface + + +boolean +| + +undefined + + + +

Write gml:multiSurface instead + of gml:MultiPolygon. Since the latter is deprecated in GML 3, the + default is `true´.

schemaLocation + + +string +| + +undefined + + + +

Optional schemaLocation to use + when writing out the GML, this will override the default provided.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 55
+ + + + + + + +
+ + + +
+ + + +
+

IGCOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
altitudeMode + + +ol.format.IGCZ +| + +undefined + + + +

Altitude mode. + Possible values are barometric, gps, and none. Default is none.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 51
+ + + + + + + +
+ + + +
+ + + +
+

KMLOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
defaultStyle + + +Array.<ol.style.Style> +| + +undefined + + + +

Default style. The default + default style is the same as Google Earth.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 53
+ + + + + + + +
+ + + +
+ + + +
+

TopoJSONOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
defaultProjection + + +ol.proj.ProjectionLike + + + +

Default projection.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 49
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.html b/float-no-zero/apidoc/olx.html new file mode 100644 index 0000000000..9178050663 --- /dev/null +++ b/float-no-zero/apidoc/olx.html @@ -0,0 +1,2275 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 1
+ + + + + + + +
+ + + + +
+ + + + + + + + + + +

Namespaces

+ +
+
olx.animation
+
+ +
olx.control
+
+ +
olx.format
+
+ +
olx.interaction
+
+ +
olx.layer
+
+ +
olx.parser
+
+ +
olx.render
+
+ +
olx.source
+
+ +
olx.style
+
+ +
olx.tilegrid
+
+
+ + + + + + + + + +

TypeDefs

+ +
+ +
+

AttributionOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
html + + +string + + + +

HTML markup for this attribution.

tileRanges + + +Object.<string, Array.<ol.TileRange>> +| + +undefined + + + +

Tile ranges (FOR INTERNAL USE ONLY).

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 1
+ + + + + + + +
+ + + +
+ + + +
+

DeviceOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
loadTilesWhileAnimating + + +boolean +| + +undefined + + + +

When set to false, no tiles will be loaded while animating, which improves responsiveness on devices with slow memory. Default is true.

loadTilesWhileInteracting + + +boolean +| + +undefined + + + +

When set to false, no tiles will be loaded while interacting, which improves responsiveness on devices with slow memory. Default is true.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 3
+ + + + + + + +
+ + + +
+ + + +
+

DeviceOrientationOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
tracking + + +boolean +| + +undefined + + + +

Start tracking. Default is false.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 5
+ + + + + + + +
+ + + +
+ + + +
+

FeatureOverlayOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +Array.<ol.Feature> +| + +ol.Collection +| + +undefined + + + +

Features.

map + + +ol.Map +| + +undefined + + + +

Map.

style + + +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction +| + +undefined + + + +

Feature style.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 101
+ + + + + + + +
+ + + +
+ + + +
+

GeolocationOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
tracking + + +boolean +| + +undefined + + + +

Start Tracking. Default is false.

trackingOptions + + +GeolocationPositionOptions +| + +undefined + + + +

Tracking options.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 7
+ + + + + + + +
+ + + +
+ + + +
+

MapOptions

+ + +
Stability: experimental
+ + + + +
+
+ +
+

Object literal with config options for the map.

+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
controls + + +ol.Collection +| + +Array.<ol.control.Control> +| + +undefined + + + +

Controls initially added to the map.

deviceOptions + + +olx.DeviceOptions +| + +undefined + + + +

Device options for the map.

pixelRatio + + +number +| + +undefined + + + +

The ratio between physical + pixels and device-independent pixels (dips) on the device. If undefined + then it gets set by using window.devicePixelRatio.

interactions + + +ol.Collection +| + +Array.<ol.interaction.Interaction> +| + +undefined + + + +

Interactions that are initially added to the map.

keyboardEventTarget + + +Element +| + +Document +| + +string +| + +undefined + + + +

The element to listen to keyboard events on. + This determines when the KeyboardPan and KeyboardZoom interactions trigger. For example, if + this option is set to document the keyboard interactions will always trigger. If this option + is not specified, the element the library listens to keyboard events on is the map target (i.e. + the user-provided div for the map). If this is not document the target element needs to be + focused for key events to be emitted, requiring that the target element has a tabindex + attribute.

layers + + +Array.<ol.layer.Base> +| + +ol.Collection +| + +undefined + + + +

Layers.

ol3Logo + + +boolean +| + +undefined + + + +

Show ol3 logo. Default is true.

overlays + + +ol.Collection +| + +Array.<ol.Overlay> +| + +undefined + + + +

Overlays initially added to the map.

renderer + + +ol.RendererHint +| + +Array.<(ol.RendererHint|string)> +| + +string +| + +undefined + + + +

Renderer.

target + + +Element +| + +string +| + +undefined + + + +

The container for the map.

view + + +ol.IView +| + +undefined + + + +

The map's view. Currently + ol.View2D is available as view.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 9
+ + + + + + + +
+ + + +
+ + + +
+

OverlayOptions

+ + +
Stability: experimental
+ + + + +
+
+ +
+

Object literal with config options for the overlay.

+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
element + + +Element +| + +undefined + + + +

The overlay element.

position + + +ol.Coordinate +| + +undefined + + + +

The overlay position in map + projection.

positioning + + +ol.OverlayPositioning +| + +string +| + +undefined + + + +

Positioning.

stopEvent + + +boolean +| + +undefined + + + +

Whether event propagation to the map + viewport should be stopped. Default is true. If true the overlay is + placed in the same container as that of the controls + (ol-overlaycontainer-stopevent).

insertFirst + + +boolean +| + +undefined + + + +

Whether the overlay is inserted + first in the overlay container, or appended. Default is true. If the + overlay is placed in the same container as that of the controls (see + the stopEvent option) you will probably set insertFirst to true + so the overlay is displayed below the controls.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 11
+ + + + + + + +
+ + + +
+ + + +
+

Proj4jsProjectionOptions

+ + +
Stability: experimental
+ + + + +
+
+ +
+

Object literal with config options for the Proj4js projection.

+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
code + + +string + + + +

The SRS identifier code, e.g. EPSG:31256.

extent + + +ol.Extent +| + +undefined + + + +

The validity extent for the SRS.

global + + +boolean +| + +undefined + + + +

Whether the projection is valid for the + whole globe. Default is false.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 13
+ + + + + + + +
+ + + +
+ + + +
+

ProjectionOptions

+ + +
Stability: experimental
+ + + + +
+
+ +
+

Object literal with config options for the projection.

+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
code + + +string + + + +

The SRS identifier code, e.g. EPSG:4326.

units + + +ol.proj.Units +| + +string + + + +

Units.

extent + + +ol.Extent +| + +undefined + + + +

The validity extent for the SRS.

axisOrientation + + +string +| + +undefined + + + +

The axis orientation as + specified in Proj4. The default is enu.

global + + +boolean +| + +undefined + + + +

Whether the projection is valid for the + whole globe. Default is false.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 15
+ + + + + + + +
+ + + +
+ + + +
+

View2DOptions

+ + +
Stability: experimental
+ + + + +
+
+ +
+

Object literal with config options for the view.

+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
center + + +ol.Coordinate +| + +undefined + + + +

The initial center for the view. + The coordinate system for the center is specified with the projection + option. Default is undefined, and layer sources will not be fetched if + this is not set.

constrainRotation + + +boolean +| + +number +| + +undefined + + + +

Rotation constraint. + false means no constraint. true means no constraint, but snap to + zero near zero. A number constraints the rotation to that number of + values. For example, 4 will constrain the rotation to 0, 90, 180, and + 270 degrees. The default is true.

enableRotation + + +boolean +| + +undefined + + + +

Enable rotation. Default is + true.

extent + + +ol.Extent +| + +undefined + + + +

The extent that constrains the center, + in other words, center cannot be set outside this extent. + Default is undefined.

maxResolution + + +number +| + +undefined + + + +

The maximum resolution used to + determine the resolution constraint. It is used together with maxZoom + and zoomFactor. If unspecified it is calculated in such a way that the + projection's validity extent fits in a 256x256 px tile. If the projection + is Spherical Mercator (the default) then maxResolution defaults to + 40075016.68557849 / 256 = 156543.03392804097.

maxZoom + + +number +| + +undefined + + + +

The maximum zoom level used to determine + the resolution constraint. It is used together with maxResolution and + zoomFactor. Default is 28.

projection + + +ol.proj.ProjectionLike + + + +

The projection. Default is + EPSG:3857 (Spherical Mercator).

resolution + + +number +| + +undefined + + + +

The initial resolution for the view. + The units are projection units per pixel (e.g. meters per pixel). + An alternative to setting this is to set zoom. Default is undefined, + and layer sources will not be fetched if neither this nor zoom are + defined.

resolutions + + +Array.<number> +| + +undefined + + + +

Resolutions to determine the + resolution constraint. If set the maxResolution, maxZoom and + zoomFactor options are ignored.

rotation + + +number +| + +undefined + + + +

The initial rotation for the view + in radians (positive rotation clockwise). Default is 0.

zoom + + +number +| + +undefined + + + +

Only used if resolution is not defined. + Zoom level used to calculate the initial resolution for the view. + The initial resolution is determined using the + ol.View2D#constrainResolution method.

zoomFactor + + +number +| + +undefined + + + +

The zoom factor used to determine the + resolution constraint. Used together with maxResolution and maxZoom. + Default is 2.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 17
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.interaction.html b/float-no-zero/apidoc/olx.interaction.html new file mode 100644 index 0000000000..c003564295 --- /dev/null +++ b/float-no-zero/apidoc/olx.interaction.html @@ -0,0 +1,2714 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.interaction + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.interaction +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 9
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +

TypeDefs

+ +
+ +
+

DefaultsOptions

+ + +
Stability: experimental
+ + + + +
+
+ +
+

Interactions for the map. Default is true for all options.

+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
altShiftDragRotate + + +boolean +| + +undefined + + + +

Whether Alt-Shift-drag + rotate is desired. Default is true.

doubleClickZoom + + +boolean +| + +undefined + + + +

Whether double click zoom is + desired. Default is true.

dragPan + + +boolean +| + +undefined + + + +

Whether drag-pan is desired. Default is true.

keyboard + + +boolean +| + +undefined + + + +

Whether keyboard interaction is + desired. Default is true.

mouseWheelZoom + + +boolean +| + +undefined + + + +

Whether mousewheel zoom is + desired. Default is true.

shiftDragZoom + + +boolean +| + +undefined + + + +

Whether Shift-drag zoom is + desired. Default is true.

touchPan + + +boolean +| + +undefined + + + +

Whether touch pan is + desired. Default is true.

touchRotate + + +boolean +| + +undefined + + + +

Whether touch rotate is desired. Default is true.

touchZoom + + +boolean +| + +undefined + + + +

Whether touch zoom is desired. Default is true.

zoomDelta + + +number +| + +undefined + + + +

Zoom delta.

zoomDuration + + +number +| + +undefined + + + +

Zoom duration.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 71
+ + + + + + + +
+ + + +
+ + + +
+

DoubleClickZoomOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
duration + + +number +| + +undefined + + + +

Animation duration in milliseconds. Default is 250.

delta + + +number +| + +undefined + + + +

The zoom delta applied on each double + click, default is 1.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 57
+ + + + + + + +
+ + + +
+ + + +
+

DragAndDropOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
formatConstructors + + +Array.<function(new:ol.format.Feature)> +| + +undefined + + + +

Format constructors.

reprojectTo + + +ol.proj.ProjectionLike + + + +

Target projection. By + default, the map's view's projection is used.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 59
+ + + + + + + +
+ + + +
+ + + +
+

DragBoxOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
condition + + +ol.events.ConditionType +| + +undefined + + + +

A conditional + modifier (i.e. Shift key) that determines if the interaction is active + or not, default is always.

style + + +ol.style.Style + + + +

Style for the box.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 67
+ + + + + + + +
+ + + +
+ + + +
+

DragPanOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
kinetic + + +ol.Kinetic +| + +undefined + + + +

Kinetic inertia to apply to the pan.

condition + + +ol.events.ConditionType +| + +undefined + + + +

A conditional + modifier (i.e. Shift key) that determines if the interaction is active + or not, default is no modifiers.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 61
+ + + + + + + +
+ + + +
+ + + +
+

DragRotateAndZoomOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
condition + + +ol.events.ConditionType +| + +undefined + + + +

A conditional + modifier (i.e. Shift key) that determines if the interaction is active + or not, default is shify key.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 65
+ + + + + + + +
+ + + +
+ + + +
+

DragRotateOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
condition + + +ol.events.ConditionType +| + +undefined + + + +

A conditional + modifier (i.e. Shift key) that determines if the interaction is active + or not, default is both shift and alt keys.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 63
+ + + + + + + +
+ + + +
+ + + +
+

DragZoomOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
condition + + +ol.events.ConditionType +| + +undefined + + + +

A conditional + modifier (i.e. Shift key) that determines if the interaction is active + or not, default is shift key.

style + + +ol.style.Style + + + +

Style for the box.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 69
+ + + + + + + +
+ + + +
+ + + +
+

DrawOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
features + + +ol.Collection +| + +undefined + + + +

Destination collection for the drawn features.

source + + +ol.source.Vector +| + +undefined + + + +

Destination source for the drawn features.

snapTolerance + + +number +| + +undefined + + + +

Pixel distance for snapping to the + drawing finish (default is 12).

type + + +ol.geom.GeometryType + + + +

Drawing type ('Point', 'LineString', + 'Polygon', 'MultiPoint', 'MultiLineString', or 'MultiPolygon').

style + + +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction +| + +undefined + + + +

Style for sketch features.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 73
+ + + + + + + +
+ + + +
+ + + +
+

KeyboardPanOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
condition + + +ol.events.ConditionType +| + +undefined + + + +

A conditional + modifier (i.e. Shift key) that determines if the interaction is active + or not, default is no modifiers.

pixelDelta + + +number +| + +undefined + + + +

Pixel The amount to pan on each key + press. Default is 128 pixels.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 75
+ + + + + + + +
+ + + +
+ + + +
+

KeyboardZoomOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
duration + + +number +| + +undefined + + + +

Animation duration in milliseconds. Default is 100.

condition + + +ol.events.ConditionType +| + +undefined + + + +

A conditional + modifier (i.e. Shift key) that determines if the interaction is active + or not, default is no modifiers.

delta + + +number +| + +undefined + + + +

The amount to zoom on each key press. Default is 1.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 77
+ + + + + + + +
+ + + +
+ + + +
+

ModifyOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
pixelTolerance + + +number +| + +undefined + + + +

Pixel tolerance for considering + the pointer close enough to a vertex for editing. Default is 20 pixels.

style + + +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction +| + +undefined + + + +

FeatureOverlay style.

features + + +ol.Collection + + + +

The features the interaction works on.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 85
+ + + + + + + +
+ + + +
+ + + +
+

MouseWheelZoomOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
duration + + +number +| + +undefined + + + +

Animation duration in milliseconds. Default is 250.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 79
+ + + + + + + +
+ + + +
+ + + +
+

SelectOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
addCondition + + +ol.events.ConditionType +| + +undefined + + + +

A conditional + modifier (e.g. shift key) that determines if the selection is added to + the current selection. By default, a shift-click adds to the current + selection.

condition + + +ol.events.ConditionType +| + +undefined + + + +

A conditional + modifier (e.g. shift key) that determines if the interaction is active + (i.e. selection occurs) or not. By default, a click with no modifier keys + toggles the selection.

layerFilter + + +function + + + +

Filter + function to restrict selection to a subset of layers.

layer + + +ol.layer.Layer +| + +undefined + + + +

Layer. The single layer from which + features should be selected.

layers + + +Array.<ol.layer.Layer> +| + +undefined + + + +

Layers. Zero or more + layers from which features should be selected.

style + + +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction +| + +undefined + + + +

FeatureOverlay style.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 81
+ + + + + + + +
+ + + +
+ + + +
+

TouchPanOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
kinetic + + +ol.Kinetic +| + +undefined + + + +

Kinetic inertia to apply to the + pan.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 83
+ + + + + + + +
+ + + +
+ + + +
+

TouchRotateOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
threshold + + +number +| + +undefined + + + +

Minimal angle in radians to start a rotation. + Default is 0.3.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 87
+ + + + + + + +
+ + + +
+ + + +
+

TouchZoomOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
duration + + +number +| + +undefined + + + +

Animation duration in milliseconds. Default is 400.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 89
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.layer.html b/float-no-zero/apidoc/olx.layer.html new file mode 100644 index 0000000000..033b4251ab --- /dev/null +++ b/float-no-zero/apidoc/olx.layer.html @@ -0,0 +1,1762 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.layer + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.layer +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 11
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +

TypeDefs

+ +
+ +
+

BaseOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
brightness + + +number +| + +undefined + + + +

Brightness. Default is 0.

contrast + + +number +| + +undefined + + + +

Contrast. Default is 1.

hue + + +number +| + +undefined + + + +

Hue. Default is 0.

opacity + + +number +| + +undefined + + + +

Opacity (0, 1). Default is 1.

saturation + + +number +| + +undefined + + + +

Saturation. Default is 1.

visible + + +boolean +| + +undefined + + + +

Visibility. Default is true.

minResolution + + +number +| + +undefined + + + +

The minimum resolution + (inclusive) at which this layer will be visible.

maxResolution + + +number +| + +undefined + + + +

The maximum resolution + (exclusive) below which this layer will be visible.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 91
+ + + + + + + +
+ + + +
+ + + +
+

GroupOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
brightness + + +number +| + +undefined + + + +

Brightness. Default is 0.

contrast + + +number +| + +undefined + + + +

Contrast. Default is 1.

hue + + +number +| + +undefined + + + +

Hue. Default is 0.

opacity + + +number +| + +undefined + + + +

Opacity (0, 1). Default is 1.

saturation + + +number +| + +undefined + + + +

Saturation. Default is 1.

visible + + +boolean +| + +undefined + + + +

Visibility. Default is true.

minResolution + + +number +| + +undefined + + + +

The minimum resolution + (inclusive) at which this layer will be visible.

maxResolution + + +number +| + +undefined + + + +

The maximum resolution + (exclusive) below which this layer will be visible.

layers + + +Array.<ol.layer.Base> +| + +ol.Collection +| + +undefined + + + +

Child layers.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 95
+ + + + + + + +
+ + + +
+ + + +
+

LayerOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
brightness + + +number +| + +undefined + + + +

Brightness. Default is 0.

contrast + + +number +| + +undefined + + + +

Contrast. Default is 1.

hue + + +number +| + +undefined + + + +

Hue. Default is 0.

opacity + + +number +| + +undefined + + + +

Opacity (0, 1). Default is 1.

saturation + + +number +| + +undefined + + + +

Saturation. Default is 1.

source + + +ol.source.Source + + + +

Source for this layer.

visible + + +boolean +| + +undefined + + + +

Visibility. Default is true (visible).

minResolution + + +number +| + +undefined + + + +

The minimum resolution + (inclusive) at which this layer will be visible.

maxResolution + + +number +| + +undefined + + + +

The maximum resolution + (exclusive) below which this layer will be visible.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 93
+ + + + + + + +
+ + + +
+ + + +
+

TileOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
brightness + + +number +| + +undefined + + + +

Brightness. Default is 0.

contrast + + +number +| + +undefined + + + +

Contrast. Default is 1.

hue + + +number +| + +undefined + + + +

Hue. Default is 0.

opacity + + +number +| + +undefined + + + +

Opacity (0, 1). Default is 1.

preload + + +number +| + +undefined + + + +

Preload.

saturation + + +number +| + +undefined + + + +

Saturation. Default is 1.

source + + +ol.source.Source + + + +

Source for this layer.

visible + + +boolean +| + +undefined + + + +

Visibility. Default is true (visible).

minResolution + + +number +| + +undefined + + + +

The minimum resolution + (inclusive) at which this layer will be visible.

maxResolution + + +number +| + +undefined + + + +

The maximum resolution + (exclusive) below which this layer will be visible.

useInterimTilesOnError + + +boolean +| + +undefined + + + +

Use interim tiles on + error. Default is true.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 97
+ + + + + + + +
+ + + +
+ + + +
+

VectorOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
brightness + + +number +| + +undefined + + + +

Brightness.

contrast + + +number +| + +undefined + + + +

Contrast.

hue + + +number +| + +undefined + + + +

Hue.

minResolution + + +number +| + +undefined + + + +

The minimum resolution + (inclusive) at which this layer will be visible.

maxResolution + + +number +| + +undefined + + + +

The maximum resolution + (exclusive) below which this layer will be visible.

opacity + + +number +| + +undefined + + + +

Opacity. 0-1. Default is 1.

saturation + + +number +| + +undefined + + + +

Saturation.

source + + +ol.source.Vector + + + +

Source.

style + + +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction +| + +undefined + + + +

Layer style.

visible + + +boolean +| + +undefined + + + +

Visibility. Default is true (visible).

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 99
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.parser.html b/float-no-zero/apidoc/olx.parser.html new file mode 100644 index 0000000000..572b1b43e4 --- /dev/null +++ b/float-no-zero/apidoc/olx.parser.html @@ -0,0 +1,130 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.parser + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.parser +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 13
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.render.html b/float-no-zero/apidoc/olx.render.html new file mode 100644 index 0000000000..3b08279f35 --- /dev/null +++ b/float-no-zero/apidoc/olx.render.html @@ -0,0 +1,130 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.render + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.render +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 15
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.source.html b/float-no-zero/apidoc/olx.source.html new file mode 100644 index 0000000000..3a283c5222 --- /dev/null +++ b/float-no-zero/apidoc/olx.source.html @@ -0,0 +1,6786 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.source + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.source +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 17
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +

TypeDefs

+ +
+ +
+

BingMapsOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
culture + + +string +| + +undefined + + + +

Culture code. Default is en-us.

key + + +string + + + +

Bing Maps API key. Get yours at + http://bingmapsportal.com/.

imagerySet + + +string + + + +

Type of imagery.

tileLoadFunction + + +ol.TileLoadFunctionType +| + +undefined + + + +

Optional + function to load a tile given a URL.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 103
+ + + + + + + +
+ + + +
+ + + +
+

GeoJSONOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

defaultProjection + + +ol.proj.ProjectionLike + + + +

Default projection.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

logo + + +string +| + +undefined + + + +

Logo.

object + + +GeoJSONObject +| + +undefined + + + +

Object.

projection + + +ol.proj.ProjectionLike + + + +

Destination projection. If + provided, features will be transformed to this projection. If not + provided, features will not be transformed.

text + + +string +| + +undefined + + + +

Text.

url + + +string +| + +undefined + + + +

URL.

urls + + +Array.<string> +| + +undefined + + + +

URLs.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 105
+ + + + + + + +
+ + + +
+ + + +
+

GPXOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

doc + + +Document +| + +undefined + + + +

Document.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

logo + + +string +| + +undefined + + + +

Logo.

node + + +Node +| + +undefined + + + +

Node.

projection + + +ol.proj.ProjectionLike + + + +

Destination projection. If + provided, features will be transformed to this projection. If not + provided, features will not be transformed.

text + + +string +| + +undefined + + + +

Text.

url + + +string +| + +undefined + + + +

URL.

urls + + +Array.<string> +| + +undefined + + + +

URLs.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 107
+ + + + + + + +
+ + + +
+ + + +
+

IGCOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
altitudeMode + + +ol.format.IGCZ +| + +undefined + + + +

Altitude mode. + Possible values are barometric, gps, and none. Default is none.

projection + + +ol.proj.ProjectionLike + + + +

Destination projection. If + provided, features will be transformed to this projection. If not + provided, features will not be transformed.

text + + +string +| + +undefined + + + +

Text.

url + + +string +| + +undefined + + + +

URL.

urls + + +Array.<string> +| + +undefined + + + +

URLs.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 111
+ + + + + + + +
+ + + +
+ + + +
+

ImageCanvasOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

canvasFunction + + +ol.CanvasFunctionType + + + +

Canvas function. The function + returning the canvas element used by the source as an image. The arguments + passed to the function are: {ol.Extent} the image extent, {number} the + image resolution, {number} the device pixel ratio, {ol.Size} the image + size, and {ol.proj.Projection} the image projection. The canvas returned + by this function is cached by the source. If the value returned by the + function is later changed then dispatchChangeEvent should be called on + the source for the source to invalidate the current cached image.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

logo + + +string +| + +undefined + + + +

Logo.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

ratio + + +number +| + +undefined + + + +

Ratio. 1 means canvases are the size + of the map viewport, 2 means twice the size of the map viewport, and so + on. Default is 1.5.

resolutions + + +Array.<number> +| + +undefined + + + +

Resolutions. If specified, + new canvases will be created for these resolutions only.

state + + +ol.source.State +| + +string +| + +undefined + + + +

Source state.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 125
+ + + + + + + +
+ + + +
+ + + +
+

ImageStaticOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

crossOrigin + + +null +| + +string +| + +undefined + + + +

crossOrigin setting for image + requests.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

imageExtent + + +ol.Extent +| + +undefined + + + +

Extent of the image.

imageSize + + +ol.Size +| + +undefined + + + +

Size of the image.

logo + + +string +| + +undefined + + + +

Logo.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

url + + +string + + + +

Url.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 133
+ + + + + + + +
+ + + +
+ + + +
+

ImageVectorOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

logo + + +string +| + +undefined + + + +

Logo.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

ratio + + +number +| + +undefined + + + +

Ratio. 1 means canvases are the size + of the map viewport, 2 means twice the size of the map viewport, and so + on. Default is 1.5.

resolutions + + +Array.<number> +| + +undefined + + + +

Resolutions. If specified, + new canvases will be created for these resolutions only.

source + + +ol.source.Vector + + + +

The vector source from which the vector + features drawn in canvas elements are read.

style + + +ol.style.Style +| + +Array.<ol.style.Style> +| + +ol.feature.StyleFunction +| + +undefined + + + +

Style to use when rendering features to the canvas.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 127
+ + + + + + + +
+ + + +
+ + + +
+

ImageWMSOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

crossOrigin + + +null +| + +string +| + +undefined + + + +

crossOrigin setting for image + requests.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

hidpi + + +boolean +| + +undefined + + + +

Use the ol.Map#pixelRatio value when + requesting the image from the remote server. Default is true.

serverType + + +ol.source.wms.ServerType +| + +string +| + +undefined + + + +

The type of the remote WMS + server: mapserver, geoserver or qgis. Only needed if hidpi is true. + Default is undefined.

logo + + +string +| + +undefined + + + +

Logo.

params + + +Object.<string, *> + + + +

WMS request parameters. At least a + LAYERS param is required. STYLES is ` by default.VERSIONis1.3.0by default.WIDTH,HEIGHT,BBOXandCRS(SRS` for WMS + version < 1.3.0) will be set dynamically.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

ratio + + +number +| + +undefined + + + +

Ratio. 1 means image requests are the size + of the map viewport, 2 means twice the size of the map viewport, and so + on. Default is 1.5.

resolutions + + +Array.<number> +| + +undefined + + + +

Resolutions. If specified, + requests will be made for these resolutions only.

url + + +string +| + +undefined + + + +

WMS service URL.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 129
+ + + + + + + +
+ + + +
+ + + +
+

KMLOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

defaultStyle + + +Array.<ol.style.Style> +| + +undefined + + + +

Default style.

doc + + +Document +| + +undefined + + + +

Document.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

logo + + +string +| + +undefined + + + +

Logo.

node + + +Node +| + +undefined + + + +

Node.

projection + + +ol.proj.ProjectionLike + + + +

Destination projection. If + provided, features will be transformed to this projection. If not + provided, features will not be transformed.

text + + +string +| + +undefined + + + +

Text.

url + + +string +| + +undefined + + + +

URL.

urls + + +Array.<string> +| + +undefined + + + +

URLs.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 115
+ + + + + + + +
+ + + +
+ + + +
+

MapGuideOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
url + + +string +| + +undefined + + + +

The mapagent url.

displayDpi + + +number +| + +undefined + + + +

The display resolution. Default is 96.

metersPerUnit + + +number +| + +undefined + + + +

The meters-per-unit value. Default is 1.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

hidpi + + +boolean +| + +undefined + + + +

Use the ol.Map#pixelRatio value when + requesting the image from the remote server. Default is true.

useOverlay + + +boolean +| + +undefined + + + +

If true, will use + GETDYNAMICMAPOVERLAYIMAGE.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

ratio + + +number +| + +undefined + + + +

Ratio. 1 means image requests are the size + of the map viewport, 2 means twice the size of the map viewport, and so + on. Default is 1.

resolutions + + +Array.<number> +| + +undefined + + + +

Resolutions. If specified, + requests will be made for these resolutions only.

params + + +Object +| + +undefined + + + +

Additional parameters.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 113
+ + + + + + + +
+ + + +
+ + + +
+

MapQuestOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
layer + + +string + + + +

Layer.

tileLoadFunction + + +ol.TileLoadFunctionType +| + +undefined + + + +

Optional + function to load a tile given a URL.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 117
+ + + + + + + +
+ + + +
+ + + +
+

OSMOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

crossOrigin + + +null +| + +string +| + +undefined + + + +

crossOrigin setting for image + requests. Default is anonymous.

maxZoom + + +number +| + +undefined + + + +

Max zoom.

tileLoadFunction + + +ol.TileLoadFunctionType +| + +undefined + + + +

Optional + function to load a tile given a URL.

url + + +string +| + +undefined + + + +

URL template. Must include {x}, {y}, + and {z} placeholders. Default is + //{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 121
+ + + + + + + +
+ + + +
+ + + +
+

OSMXMLOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

defaultStyle + + +Array.<ol.style.Style> +| + +undefined + + + +

Default style.

doc + + +Document +| + +undefined + + + +

Document.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

logo + + +string +| + +undefined + + + +

Logo.

{Node|undefined| + +

node Node.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

reprojectTo + + +ol.proj.ProjectionLike + + + +

Re-project to.

text + + +string +| + +undefined + + + +

Text.

url + + +string +| + +undefined + + + +

URL.

urls + + +Array.<string> +| + +undefined + + + +

URLs.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 123
+ + + + + + + +
+ + + +
+ + + +
+

StamenOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
layer + + +string + + + +

Layer.

minZoom + + +number +| + +undefined + + + +

Minimum zoom.

maxZoom + + +number +| + +undefined + + + +

Maximum zoom.

opaque + + +boolean +| + +undefined + + + +

Whether the layer is opaque.

tileLoadFunction + + +ol.TileLoadFunctionType +| + +undefined + + + +

Optional + function to load a tile given a URL.

url + + +string +| + +undefined + + + +

URL template. Must include {x}, {y}, + and {z} placeholders.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 131
+ + + + + + + +
+ + + +
+ + + +
+

TileDebugOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
extent + + +ol.Extent +| + +undefined + + + +

Extent.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

tileGrid + + +ol.tilegrid.TileGrid +| + +undefined + + + +

Tile grid.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 119
+ + + + + + + +
+ + + +
+ + + +
+

TileJSONOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
crossOrigin + + +null +| + +string +| + +undefined + + + +

crossOrigin setting for image + requests.

tileLoadFunction + + +ol.TileLoadFunctionType +| + +undefined + + + +

Optional + function to load a tile given a URL.

url + + +string + + + +

URL to the TileJSON file.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 135
+ + + + + + + +
+ + + +
+ + + +
+

TileWMSOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

params + + +Object.<string, *> + + + +

WMS request parameters. At least a + LAYERS param is required. STYLES is ` by default.VERSIONis1.3.0by default.WIDTH,HEIGHT,BBOXandCRS(SRS` for WMS + version < 1.3.0) will be set dynamically.

crossOrigin + + +null +| + +string +| + +undefined + + + +

crossOrigin setting for image + requests.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

gutter + + +number +| + +undefined + + + +

The size in pixels of the + gutter around image tiles to ignore. By setting this property to a + non-zero value, images will be requested that are wider and taller than + the tile size by a value of 2 x gutter. Defaults to zero. Using a + non-zero value allows artifacts of rendering at tile edges to be ignored. If + you control the WMS service it is recommended to address "artifacts at tile + edges" issues by properly configuring the WMS service. For example, MapServer + has a tile_map_edge_buffer configuration parameter for this. See + http://mapserver.org/output/tile_mode.html.

hidpi + + +boolean +| + +undefined + + + +

Use the ol.Map#pixelRatio value when + requesting the image from the remote server. Default is true.

logo + + +string +| + +undefined + + + +

Logo.

tileGrid + + +ol.tilegrid.TileGrid +| + +undefined + + + +

Tile grid.

maxZoom + + +number +| + +undefined + + + +

Maximum zoom.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

serverType + + +ol.source.wms.ServerType +| + +string +| + +undefined + + + +

The type of the remote WMS + server: mapserver, geoserver or qgis. Only needed if hidpi is true. + Default is undefined.

tileLoadFunction + + +ol.TileLoadFunctionType +| + +undefined + + + +

Optional + function to load a tile given a URL.

url + + +string +| + +undefined + + + +

WMS service URL.

urls + + +Array.<string> +| + +undefined + + + +

WMS service urls. Use this instead + of url when the WMS supports multiple urls for GetMap requests.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 137
+ + + + + + + +
+ + + +
+ + + +
+

TopoJSONOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

defaultProjection + + +ol.proj.ProjectionLike + + + +

Default projection.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

logo + + +string +| + +undefined + + + +

Logo.

object + + +GeoJSONObject +| + +undefined + + + +

Object.

projection + + +ol.proj.ProjectionLike + + + +

Destination projection. If + provided, features will be transformed to this projection. If not + provided, features will not be transformed.

text + + +string +| + +undefined + + + +

Text.

url + + +string +| + +undefined + + + +

URL.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 109
+ + + + + + + +
+ + + +
+ + + +
+

VectorFileOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arrayBuffer + + +ArrayBuffer +| + +undefined + + + +

Array buffer.

attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

doc + + +Document +| + +undefined + + + +

Document.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

format + + +ol.format.Feature + + + +

Format.

logo + + +string +| + +undefined + + + +

Logo.

node + + +Node +| + +undefined + + + +

Node.

object + + +Object +| + +undefined + + + +

Object.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

text + + +string +| + +undefined + + + +

Text.

url + + +string +| + +undefined + + + +

URL.

urls + + +Array.<string> +| + +undefined + + + +

URLs.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 141
+ + + + + + + +
+ + + +
+ + + +
+

VectorOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

features + + +Array.<ol.Feature> +| + +undefined + + + +

Features.

logo + + +string +| + +undefined + + + +

Logo.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

state + + +ol.source.State +| + +string +| + +undefined + + + +

State.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 139
+ + + + + + + +
+ + + +
+ + + +
+

WMTSOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

crossOrigin + + +string +| + +null +| + +undefined + + + +

crossOrigin setting for image + requests.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

logo + + +string +| + +undefined + + + +

Logo.

tileGrid + + +ol.tilegrid.WMTS + + + +

Tile grid.

projection + + +ol.proj.ProjectionLike + + + +

Projection.

requestEncoding + + +ol.source.WMTSRequestEncoding +| + +undefined + + + +

Request + encoding.

layer + + +string + + + +

Layer.

style + + +string + + + +

Style.

version + + +string +| + +undefined + + + +

WMTS version. Default to 1.0.0.

format + + +string +| + +undefined + + + +

Format.

matrixSet + + +string + + + +

Matrix set.

dimensions + + +Object +| + +undefined + + + +

Dimensions.

url + + +string +| + +undefined + + + +

URL.

maxZoom + + +number +| + +undefined + + + +

Maximum zoom.

tileLoadFunction + + +ol.TileLoadFunctionType +| + +undefined + + + +

Optional + function to load a tile given a URL.

urls + + +Array.<string> +| + +undefined + + + +

Urls.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 143
+ + + + + + + +
+ + + +
+ + + +
+

XYZOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

crossOrigin + + +null +| + +string +| + +undefined + + + +

Cross origin setting for image + requests.

extent + + +ol.Extent +| + +undefined + + + +

Extent.

logo + + +string +| + +undefined + + + +

Logo.

projection + + +ol.proj.ProjectionLike + + + +

Projection. Default is EPSG:3857.

maxZoom + + +number +| + +undefined + + + +

Optional max zoom level. Default is 18.

minZoom + + +number +| + +undefined + + + +

Unsupported (TODO: remove this).

tileLoadFunction + + +ol.TileLoadFunctionType +| + +undefined + + + +

Optional + function to load a tile given a URL.

tileUrlFunction + + +ol.TileUrlFunctionType +| + +undefined + + + +

Optional + function to get tile URL given a tile coordinate and the projection. + Required if url or urls are not provided.

url + + +string +| + +undefined + + + +

URL template. Must include {x}, {y}, + and {z} placeholders.

urls + + +Array.<string> +| + +undefined + + + +

An array of URL templates.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 145
+ + + + + + + +
+ + + +
+ + + +
+

ZoomifyOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
attributions + + +Array.<ol.Attribution> +| + +undefined + + + +

Attributions.

crossOrigin + + +null +| + +string +| + +undefined + + + +

Cross origin setting for image + requests.

logo + + +string +| + +undefined + + + +

Logo.

url + + +string + + + +

Prefix of URL template.

tierSizeCalculation + + +string +| + +undefined + + + +

Tier size calculation method: default or truncated.

size + + +ol.Size + + + +

Size of the image.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 147
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.style.html b/float-no-zero/apidoc/olx.style.html new file mode 100644 index 0000000000..c1adfe7583 --- /dev/null +++ b/float-no-zero/apidoc/olx.style.html @@ -0,0 +1,1476 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.style + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.style +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 19
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +

TypeDefs

+ +
+ +
+

CircleOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
fill + + +ol.style.Fill +| + +undefined + + + +

Fill style.

radius + + +number + + + +

Circle radius.

stroke + + +ol.style.Stroke +| + +undefined + + + +

Stroke style.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 149
+ + + + + + + +
+ + + +
+ + + +
+

FillOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
color + + +ol.Color +| + +string +| + +undefined + + + +

Color.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 151
+ + + + + + + +
+ + + +
+ + + +
+

IconOptions

+ + +
Stability: not documented
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
anchor + + +Array.<number> +| + +undefined + + + +

Anchor. Default value is [0.5, 0.5] + (icon center).

anchorOrigin + + +ol.style.IconAnchorOrigin +| + +undefined + + + +

Origin of the anchor: bottom-left, bottom-right, top-left or top-right. Default is top-left.

anchorXUnits + + +ol.style.IconAnchorUnits +| + +undefined + + + +

Units in which the anchor x value is specified. + A value of 'fraction' indicates the x value is a fraction of the icon. + A value of 'pixels' indicates the x value in pixels. Default is + 'fraction'.

anchorYUnits + + +ol.style.IconAnchorUnits +| + +undefined + + + +

Units in which the anchor y value is specified. + A value of 'fraction' indicates the y value is a fraction of the icon. + A value of 'pixels' indicates the y value in pixels. Default is + 'fraction'.

crossOrigin + + +null +| + +string +| + +undefined + + + +

crossOrigin setting for image.

scale + + +number +| + +undefined + + + +

Scale.

rotateWithView + + +boolean +| + +undefined + + + +

Whether to rotate the icon with the view. Default is false.

rotation + + +number +| + +undefined + + + +

Rotation.

size + + +ol.Size +| + +undefined + + + +

Icon size in pixel.

src + + +string + + + +

Image source URI.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 153
+ + + + + + + +
+ + + +
+ + + +
+

StrokeOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
color + + +ol.Color +| + +string +| + +undefined + + + +

Color.

lineCap + + +string +| + +undefined + + + +

Line cap style: butt, round, or square. Default is round.

lineJoin + + +string +| + +undefined + + + +

Line join style: bevel, round, or miter. Default is round.

lineDash + + +Array.<number> +| + +undefined + + + +

Line dash pattern. Default is undefined (no dash).

miterLimit + + +number +| + +undefined + + + +

Miter limit. Default is 10.

width + + +number +| + +undefined + + + +

Width.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 155
+ + + + + + + +
+ + + +
+ + + +
+

StyleOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
fill + + +ol.style.Fill +| + +undefined + + + +

Fill style.

image + + +ol.style.Image +| + +undefined + + + +

Image style.

stroke + + +ol.style.Stroke +| + +undefined + + + +

Stroke style.

text + + +ol.style.Text +| + +undefined + + + +

Text style.

zIndex + + +number +| + +undefined + + + +

Z index.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 159
+ + + + + + + +
+ + + +
+ + + +
+

TextOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
font + + +string +| + +undefined + + + +

Font.

scale + + +number +| + +undefined + + + +

Scale.

rotation + + +number +| + +undefined + + + +

Rotation.

text + + +string +| + +undefined + + + +

Text.

textAlign + + +string +| + +undefined + + + +

Text alignment.

textBaseline + + +string +| + +undefined + + + +

Text base line.

fill + + +ol.style.Fill +| + +undefined + + + +

Fill style.

stroke + + +ol.style.Stroke +| + +undefined + + + +

Stroke style.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 157
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/olx.tilegrid.html b/float-no-zero/apidoc/olx.tilegrid.html new file mode 100644 index 0000000000..d1db9bcaba --- /dev/null +++ b/float-no-zero/apidoc/olx.tilegrid.html @@ -0,0 +1,799 @@ + + + + + OpenLayers 3 API Documentation - Namespace: olx.tilegrid + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+

+ olx. + + olx.tilegrid +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
  • olx.jsdoc, line 21
+ + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +

TypeDefs

+ +
+ +
+

TileGridOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
minZoom + + +number +| + +undefined + + + +

Minimum zoom.

origin + + +ol.Coordinate +| + +undefined + + + +

Origin.

origins + + +Array.<ol.Coordinate> +| + +undefined + + + +

Origins.

resolutions + + +!Array.<number> + + + +

Resolutions.

tileSize + + +number +| + +undefined + + + +

Tile size.

tileSizes + + +Array.<number> +| + +undefined + + + +

Tile sizes.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 161
+ + + + + + + +
+ + + +
+ + + +
+

WMTSOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
origin + + +ol.Coordinate +| + +undefined + + + +

Origin.

origins + + +Array.<ol.Coordinate> +| + +undefined + + + +

Origins.

resolutions + + +!Array.<number> + + + +

Resolutions.

matrixIds + + +!Array.<string> + + + +

matrix IDs.

tileSize + + +number +| + +undefined + + + +

Tile size.

tileSizes + + +Array.<number> +| + +undefined + + + +

Tile sizes.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 163
+ + + + + + + +
+ + + +
+ + + +
+

XYZOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
maxZoom + + +number + + + +

Maximum zoom.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 165
+ + + + + + + +
+ + + +
+ + + +
+

ZoomifyOptions

+ + +
Stability: experimental
+ + + + +
+
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
resolutions + + +!Array.<number> + + + +

Resolutions.

+ + + + + + + + + + + + + + + + + + + + +
Source:
+
  • objectliterals.jsdoc, line 167
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/float-no-zero/apidoc/scripts/prettify/Apache-License-2.0.txt b/float-no-zero/apidoc/scripts/prettify/Apache-License-2.0.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/float-no-zero/apidoc/scripts/prettify/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "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. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/float-no-zero/apidoc/scripts/prettify/lang-css.js b/float-no-zero/apidoc/scripts/prettify/lang-css.js new file mode 100644 index 0000000000..041e1f5906 --- /dev/null +++ b/float-no-zero/apidoc/scripts/prettify/lang-css.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", +/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/float-no-zero/apidoc/scripts/prettify/prettify.js b/float-no-zero/apidoc/scripts/prettify/prettify.js new file mode 100644 index 0000000000..eef5ad7e6a --- /dev/null +++ b/float-no-zero/apidoc/scripts/prettify/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p>>0);goog.uidCounter_=0;goog.getHashCode=goog.getUid;goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if(a.clone)return a.clone();var b="array"==b?[]:{},c;for(c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)}; +goog.bindJs_=function(a,b,c){if(!a)throw Error();if(2Math.abs(a[0])&&(b=1);Math.abs(a[2])>Math.abs(a[b])&&(b=2);return b}; +libtess.normal.computeNormal_=function(a,b){var c=[0,0,0],d=[0,0,0],e=[0,0,0],f=[0,0,0],g=[0,0,0];c[0]=c[1]=c[2]=-2*libtess.GLU_TESS_MAX_COORD;d[0]=d[1]=d[2]=2*libtess.GLU_TESS_MAX_COORD;var h=Array(3),k=Array(3),l,m,n=a.mesh.vHead;for(m=n.next;m!==n;m=m.next)for(l=0;3>l;++l){var p=m.coords[l];pc[l]&&(c[l]=p,h[l]=m)}l=0;c[1]-d[1]>c[0]-d[0]&&(l=1);c[2]-d[2]>c[l]-d[l]&&(l=2);if(d[l]>=c[l])b[0]=0,b[1]=0,b[2]=1;else{c=0;m=k[l];h=h[l];e[0]=m.coords[0]-h.coords[0];e[1]=m.coords[1]- +h.coords[1];e[2]=m.coords[2]-h.coords[2];for(m=n.next;m!==n;m=m.next)f[0]=m.coords[0]-h.coords[0],f[1]=m.coords[1]-h.coords[1],f[2]=m.coords[2]-h.coords[2],g[0]=e[1]*f[2]-e[2]*f[1],g[1]=e[2]*f[0]-e[0]*f[2],g[2]=e[0]*f[1]-e[1]*f[0],l=g[0]*g[0]+g[1]*g[1]+g[2]*g[2],l>c&&(c=l,b[0]=g[0],b[1]=g[1],b[2]=g[2]);0>=c&&(b[0]=b[1]=b[2]=0,b[libtess.normal.longAxis_(e)]=1)}}; +libtess.normal.checkOrientation_=function(a){for(var b=0,c=a.mesh.fHead,d=c.next;d!==c;d=d.next){var e=d.anEdge;if(!(0>=e.winding)){do b+=(e.org.s-e.dst().s)*(e.org.t+e.dst().t),e=e.lNext;while(e!==d.anEdge)}}if(0>b){b=a.mesh.vHead;for(c=b.next;c!==b;c=c.next)c.t=-c.t;a.tUnit[0]=-a.tUnit[0];a.tUnit[1]=-a.tUnit[1];a.tUnit[2]=-a.tUnit[2]}};libtess.render={};libtess.render.SIGN_INCONSISTENT_=2;libtess.render.renderMesh=function(a,b){a.lonelyTriList=null;var c;for(c=b.fHead.next;c!==b.fHead;c=c.next)c.marked=!1;for(c=b.fHead.next;c!==b.fHead;c=c.next)c.inside&&!c.marked&&(libtess.render.renderMaximumFaceGroup_(a,c),libtess.assert(c.marked));null!==a.lonelyTriList&&(libtess.render.renderLonelyTriangles_(a,a.lonelyTriList),a.lonelyTriList=null)}; +libtess.render.renderBoundary=function(a,b){for(var c=b.fHead.next;c!==b.fHead;c=c.next)if(c.inside){a.callBeginOrBeginData(libtess.primitiveType.GL_LINE_LOOP);var d=c.anEdge;do a.callVertexOrVertexData(d.org.data),d=d.lNext;while(d!==c.anEdge);a.callEndOrEndData()}}; +libtess.render.renderCache=function(a){if(3>a.cacheCount)return!0;var b=[0,0,0];b[0]=a.normal[0];b[1]=a.normal[1];b[2]=a.normal[2];0===b[0]&&(0===b[1]&&0===b[2])&&libtess.render.computeNormal_(a,b,!1);var c=libtess.render.computeNormal_(a,b,!0);if(c===libtess.render.SIGN_INCONSISTENT_)return!1;if(0===c)return!0;switch(a.windingRule){case libtess.windingRule.GLU_TESS_WINDING_POSITIVE:if(0>c)return!0;break;case libtess.windingRule.GLU_TESS_WINDING_NEGATIVE:if(0d.size&&(d=e),e=libtess.render.maximumFan_(c.lNext),e.size>d.size&&(d=e),e=libtess.render.maximumFan_(c.lPrev()),e.size>d.size&&(d=e),e=libtess.render.maximumStrip_(c),e.size>d.size&&(d=e),e=libtess.render.maximumStrip_(c.lNext),e.size>d.size&&(d=e),e=libtess.render.maximumStrip_(c.lPrev()),e.size>d.size&&(d=e));d.render(a, +d.eStart,d.size)};libtess.render.renderLonelyTriangles_=function(a,b){var c=-1,d=b;for(a.callBeginOrBeginData(libtess.primitiveType.GL_TRIANGLES);null!==d;d=d.trail){var e=d.anEdge;do{if(a.flagBoundary){var f=e.rFace().inside?0:1;c!==f&&(c=f,a.callEdgeFlagOrEdgeFlagData(!!c))}a.callVertexOrVertexData(e.org.data);e=e.lNext}while(e!==d.anEdge)}a.callEndOrEndData()}; +libtess.render.computeNormal_=function(a,b,c){c||(b[0]=b[1]=b[2]=0);for(var d=0+a.cacheCount,e=1,f=a.cache[0],g=a.cache[e],h=g.coords[0]-f.coords[0],k=g.coords[1]-f.coords[1],l=g.coords[2]-f.coords[2],m=0;++em)return libtess.render.SIGN_INCONSISTENT_;m=1}else{if(0this.max_&&(this.max_*=2,this.nodes_=libtess.PQNode.realloc(this.nodes_,this.max_+1),this.handles_=libtess.PQHandleElem.realloc(this.handles_,this.max_+1));var c;0===this.freeList_?c=b:(c=this.freeList_,this.freeList_=this.handles_[c].node);this.nodes_[b].handle=c;this.handles_[c].node=b;this.handles_[c].key=a;this.initialized_&&this.floatUp_(b);return c};libtess.PriorityQHeap.prototype.isEmpty=function(){return 0===this.size_}; +libtess.PriorityQHeap.prototype.minimum=function(){return this.handles_[this.nodes_[1].handle].key};libtess.PriorityQHeap.prototype.extractMin=function(){var a=this.nodes_,b=this.handles_,c=a[1].handle,d=b[c].key;0=d||this.leq_(c[b[d>>1].handle].key,c[b[d].handle].key)?this.floatDown_(d):this.floatUp_(d));c[a].key=null;c[a].node=this.freeList_;this.freeList_=a}; +libtess.PriorityQHeap.prototype.floatDown_=function(a){for(var b=this.nodes_,c=this.handles_,d=b[a].handle;;){var e=a<<1;ethis.size_||this.leq_(c[d].key,c[f].key)){b[a].handle=d;c[d].node=a;break}b[a].handle=f;c[f].node=a;a=e}}; +libtess.PriorityQHeap.prototype.floatUp_=function(a){for(var b=this.nodes_,c=this.handles_,d=b[a].handle;;){var e=a>>1,f=b[e].handle;if(0===e||this.leq_(c[f].key,c[d].key)){b[a].handle=d;c[d].node=a;break}b[a].handle=f;c[f].node=a;a=e}};libtess.PriorityQ=function(a){this.keys_=libtess.PriorityQ.prototype.PQKeyRealloc_(null,libtess.PriorityQ.INIT_SIZE_);this.order_=null;this.size_=0;this.max_=libtess.PriorityQ.INIT_SIZE_;this.initialized_=!1;this.leq_=a;this.heap_=new libtess.PriorityQHeap(this.leq_)};libtess.PriorityQ.INIT_SIZE_=32;libtess.PriorityQ.prototype.deleteQ=function(){this.heap_.deleteHeap();this.keys_=this.order_=this.heap_=null}; +libtess.PriorityQ.prototype.init=function(){this.order_=[];for(var a=0;a=this.max_&&(this.max_*=2,this.keys_=libtess.PriorityQ.prototype.PQKeyRealloc_(this.keys_,this.max_));this.keys_[b]=a;return-(b+1)};libtess.PriorityQ.prototype.PQKeyRealloc_=function(a,b){var c=Array(b),d=0;if(null!==a)for(;da?0:a;c=0>c?0:c;return a<=c?0===c?(b+d)/2:b+(d-b)*(a/(a+c)):d+(b-d)*(c/(a+c))}; +libtess.geom.edgeIntersect=function(a,b,c,d,e){var f,g;libtess.geom.vertLeq(a,b)||(f=a,a=b,b=f);libtess.geom.vertLeq(c,d)||(f=c,c=d,d=f);libtess.geom.vertLeq(a,c)||(f=a,a=c,c=f,f=b,b=d,d=f);libtess.geom.vertLeq(c,b)?libtess.geom.vertLeq(b,d)?(f=libtess.geom.edgeEval(a,c,b),g=libtess.geom.edgeEval(c,b,d),0>f+g&&(f=-f,g=-g),e.s=libtess.geom.interpolate_(f,c.s,g,b.s)):(f=libtess.geom.edgeSign(a,c,b),g=-libtess.geom.edgeSign(a,d,b),0>f+g&&(f=-f,g=-g),e.s=libtess.geom.interpolate_(f,c.s,g,d.s)):e.s=(c.s+ +b.s)/2;libtess.geom.transLeq(a,b)||(f=a,a=b,b=f);libtess.geom.transLeq(c,d)||(f=c,c=d,d=f);libtess.geom.transLeq(a,c)||(f=a,a=c,c=f,f=b,b=d,d=f);libtess.geom.transLeq(c,b)?libtess.geom.transLeq(b,d)?(f=libtess.geom.transEval(a,c,b),g=libtess.geom.transEval(c,b,d),0>f+g&&(f=-f,g=-g),e.t=libtess.geom.interpolate_(f,c.t,g,b.t)):(f=libtess.geom.transSign(a,c,b),g=-libtess.geom.transSign(a,d,b),0>f+g&&(f=-f,g=-g),e.t=libtess.geom.interpolate_(f,c.t,g,d.t)):e.t=(c.t+b.t)/2};libtess.sweep={};libtess.sweep.SENTINEL_COORD_=4*libtess.GLU_TESS_MAX_COORD;libtess.sweep.TOLERANCE_NONZERO_=!1; +libtess.sweep.computeInterior=function(a){a.fatalError=!1;libtess.sweep.removeDegenerateEdges_(a);libtess.sweep.initPriorityQ_(a);libtess.sweep.initEdgeDict_(a);for(var b;null!==(b=a.pq.extractMin());){for(;;){var c=a.pq.minimum();if(null===c||!libtess.geom.vertEq(c,b))break;c=a.pq.extractMin();libtess.sweep.spliceMergeVertices_(a,b.anEdge,c.anEdge)}libtess.sweep.sweepEvent_(a,b)}b=a.dict.getMin().getKey();a.event=b.eUp.org;libtess.sweepDebugEvent(a);libtess.sweep.doneEdgeDict_(a);libtess.sweep.donePriorityQ_(a); +libtess.sweep.removeDegenerateFaces_(a.mesh);a.mesh.checkMesh()};libtess.sweep.addWinding_=function(a,b){a.winding+=b.winding;a.sym.winding+=b.sym.winding}; +libtess.sweep.edgeLeq_=function(a,b,c){a=a.event;b=b.eUp;c=c.eUp;if(b.dst()===a)return c.dst()===a?libtess.geom.vertLeq(b.org,c.org)?0>=libtess.geom.edgeSign(c.dst(),b.org,c.org):0<=libtess.geom.edgeSign(b.dst(),c.org,b.org):0>=libtess.geom.edgeSign(c.dst(),a,c.org);if(c.dst()===a)return 0<=libtess.geom.edgeSign(b.dst(),a,b.org);b=libtess.geom.edgeEval(b.dst(),a,b.org);a=libtess.geom.edgeEval(c.dst(),a,c.org);return b>=a}; +libtess.sweep.deleteRegion_=function(a,b){b.fixUpperEdge&&libtess.assert(0===b.eUp.winding);b.eUp.activeRegion=null;a.dict.deleteNode(b.nodeUp);b.nodeUp=null};libtess.sweep.fixUpperEdge_=function(a,b){libtess.assert(a.fixUpperEdge);libtess.mesh.deleteEdge(a.eUp);a.fixUpperEdge=!1;a.eUp=b;b.activeRegion=a}; +libtess.sweep.topLeftRegion_=function(a){var b=a.eUp.org;do a=a.regionAbove();while(a.eUp.org===b);a.fixUpperEdge&&(b=libtess.mesh.connect(a.regionBelow().eUp.sym,a.eUp.lNext),libtess.sweep.fixUpperEdge_(a,b),a=a.regionAbove());return a};libtess.sweep.topRightRegion_=function(a){var b=a.eUp.dst();do a=a.regionAbove();while(a.eUp.dst()===b);return a};libtess.sweep.addRegionBelow_=function(a,b,c){var d=new libtess.ActiveRegion;d.eUp=c;d.nodeUp=a.dict.insertBefore(b.nodeUp,d);return c.activeRegion=d}; +libtess.sweep.isWindingInside_=function(a,b){switch(a.windingRule){case libtess.windingRule.GLU_TESS_WINDING_ODD:return 0!==(b&1);case libtess.windingRule.GLU_TESS_WINDING_NONZERO:return 0!==b;case libtess.windingRule.GLU_TESS_WINDING_POSITIVE:return 0b;case libtess.windingRule.GLU_TESS_WINDING_ABS_GEQ_TWO:return 2<=b||-2>=b}libtess.assert(!1);return!1}; +libtess.sweep.computeWinding_=function(a,b){b.windingNumber=b.regionAbove().windingNumber+b.eUp.winding;b.inside=libtess.sweep.isWindingInside_(a,b.windingNumber)};libtess.sweep.finishRegion_=function(a,b){var c=b.eUp,d=c.lFace;d.inside=b.inside;d.anEdge=c;libtess.sweep.deleteRegion_(a,b)}; +libtess.sweep.finishLeftRegions_=function(a,b,c){var d=b;for(b=b.eUp;d!==c;){d.fixUpperEdge=!1;var e=d.regionBelow(),f=e.eUp;if(f.org!==b.org){if(!e.fixUpperEdge){libtess.sweep.finishRegion_(a,d);break}f=libtess.mesh.connect(b.lPrev(),f.sym);libtess.sweep.fixUpperEdge_(e,f)}b.oNext!==f&&(libtess.mesh.meshSplice(f.oPrev(),f),libtess.mesh.meshSplice(b,f));libtess.sweep.finishRegion_(a,d);b=e.eUp;d=e}return b}; +libtess.sweep.addRightEdges_=function(a,b,c,d,e,f){var g=!0;do libtess.assert(libtess.geom.vertLeq(c.org,c.dst())),libtess.sweep.addRegionBelow_(a,b,c.sym),c=c.oNext;while(c!==d);null===e&&(e=b.regionBelow().eUp.rPrev());for(var h;;){h=b.regionBelow();c=h.eUp.sym;if(c.org!==e.org)break;c.oNext!==e&&(libtess.mesh.meshSplice(c.oPrev(),c),libtess.mesh.meshSplice(e.oPrev(),c));h.windingNumber=b.windingNumber-c.winding;h.inside=libtess.sweep.isWindingInside_(a,h.windingNumber);b.dirty=!0;!g&&libtess.sweep.checkForRightSplice_(a, +b)&&(libtess.sweep.addWinding_(c,e),libtess.sweep.deleteRegion_(a,b),libtess.mesh.deleteEdge(e));g=!1;b=h;e=c}b.dirty=!0;libtess.assert(b.windingNumber-c.winding===h.windingNumber);f&&libtess.sweep.walkDirtyRegions_(a,b)};libtess.sweep.callCombine_=function(a,b,c,d,e){var f=[b.coords[0],b.coords[1],b.coords[2]];b.data=null;b.data=a.callCombineOrCombineData(f,c,d);null===b.data&&(e?a.fatalError||(a.callErrorOrErrorData(libtess.errorType.GLU_TESS_NEED_COMBINE_CALLBACK),a.fatalError=!0):b.data=c[0])}; +libtess.sweep.spliceMergeVertices_=function(a,b,c){var d=[null,null,null,null];d[0]=b.org.data;d[1]=c.org.data;libtess.sweep.callCombine_(a,b.org,d,[0.5,0.5,0,0],!1);libtess.mesh.meshSplice(b,c)};libtess.sweep.vertexWeights_=function(a,b,c,d,e){var f=libtess.geom.vertL1dist(b,a),g=libtess.geom.vertL1dist(c,a),h=e+1;d[e]=0.5*g/(f+g);d[h]=0.5*f/(f+g);a.coords[0]+=d[e]*b.coords[0]+d[h]*c.coords[0];a.coords[1]+=d[e]*b.coords[1]+d[h]*c.coords[1];a.coords[2]+=d[e]*b.coords[2]+d[h]*c.coords[2]}; +libtess.sweep.getIntersectData_=function(a,b,c,d,e,f){var g=[0,0,0,0],h=[c.data,d.data,e.data,f.data];b.coords[0]=b.coords[1]=b.coords[2]=0;libtess.sweep.vertexWeights_(b,c,d,g,0);libtess.sweep.vertexWeights_(b,e,f,g,2);libtess.sweep.callCombine_(a,b,h,g,!0)}; +libtess.sweep.checkForRightSplice_=function(a,b){var c=b.regionBelow(),d=b.eUp,e=c.eUp;if(libtess.geom.vertLeq(d.org,e.org)){if(0libtess.geom.edgeSign(d.dst(),e.org,d.org))return!1;b.regionAbove().dirty=b.dirty=!0;libtess.mesh.splitEdge(d.sym); +libtess.mesh.meshSplice(e.oPrev(),d)}return!0}; +libtess.sweep.checkForLeftSplice_=function(a,b){var c=b.regionBelow(),d=b.eUp,e=c.eUp;libtess.assert(!libtess.geom.vertEq(d.dst(),e.dst()));if(libtess.geom.vertLeq(d.dst(),e.dst())){if(0>libtess.geom.edgeSign(d.dst(),e.dst(),d.org))return!1;b.regionAbove().dirty=b.dirty=!0;c=libtess.mesh.splitEdge(d);libtess.mesh.meshSplice(e.sym,c);c.lFace.inside=b.inside}else{if(0=libtess.geom.edgeSign(h,a.event,f));libtess.assert(0<=libtess.geom.edgeSign(k,a.event,g));libtess.assert(f!==a.event&&g!==a.event);libtess.assert(!b.fixUpperEdge&&!c.fixUpperEdge);if(f===g)return!1;var m=Math.min(f.t,h.t),n=Math.max(g.t,k.t);if(m>n)return!1;if(libtess.geom.vertLeq(f,g)){if(0libtess.geom.edgeSign(h,g,f))return!1;libtess.sweepDebugEvent(a);libtess.geom.edgeIntersect(h,f,k,g,l);libtess.assert(Math.min(f.t,h.t)<=l.t);libtess.assert(l.t<=Math.max(g.t,k.t));libtess.assert(Math.min(k.s,h.s)<=l.s);libtess.assert(l.s<=Math.max(g.s,f.s));libtess.geom.vertLeq(l,a.event)&&(l.s=a.event.s,l.t=a.event.t);m=libtess.geom.vertLeq(f,g)?f:g;libtess.geom.vertLeq(m,l)&&(l.s=m.s,l.t=m.t);if(libtess.geom.vertEq(l,f)||libtess.geom.vertEq(l,g))return libtess.sweep.checkForRightSplice_(a, +b),!1;if(!libtess.geom.vertEq(h,a.event)&&0<=libtess.geom.edgeSign(h,a.event,l)||!libtess.geom.vertEq(k,a.event)&&0>=libtess.geom.edgeSign(k,a.event,l)){if(k===a.event)return libtess.mesh.splitEdge(d.sym),libtess.mesh.meshSplice(e.sym,d),b=libtess.sweep.topLeftRegion_(b),d=b.regionBelow().eUp,libtess.sweep.finishLeftRegions_(a,b.regionBelow(),c),libtess.sweep.addRightEdges_(a,b,d.oPrev(),d,d,!0),!0;if(h===a.event)return libtess.mesh.splitEdge(e.sym),libtess.mesh.meshSplice(d.lNext,e.oPrev()),c=b, +b=libtess.sweep.topRightRegion_(b),f=b.regionBelow().eUp.rPrev(),c.eUp=e.oPrev(),e=libtess.sweep.finishLeftRegions_(a,c,null),libtess.sweep.addRightEdges_(a,b,e.oNext,d.rPrev(),f,!0),!0;0<=libtess.geom.edgeSign(h,a.event,l)&&(b.regionAbove().dirty=b.dirty=!0,libtess.mesh.splitEdge(d.sym),d.org.s=a.event.s,d.org.t=a.event.t);0>=libtess.geom.edgeSign(k,a.event,l)&&(b.dirty=c.dirty=!0,libtess.mesh.splitEdge(e.sym),e.org.s=a.event.s,e.org.t=a.event.t);return!1}libtess.mesh.splitEdge(d.sym);libtess.mesh.splitEdge(e.sym); +libtess.mesh.meshSplice(e.oPrev(),d);d.org.s=l.s;d.org.t=l.t;d.org.pqHandle=a.pq.insert(d.org);libtess.sweep.getIntersectData_(a,d.org,f,h,g,k);b.regionAbove().dirty=b.dirty=c.dirty=!0;return!1}; +libtess.sweep.walkDirtyRegions_=function(a,b){for(var c=b.regionBelow();;){for(;c.dirty;)b=c,c=c.regionBelow();if(!b.dirty&&(c=b,b=b.regionAbove(),null===b||!b.dirty))break;b.dirty=!1;var d=b.eUp,e=c.eUp;d.dst()!==e.dst()&&libtess.sweep.checkForLeftSplice_(a,b)&&(c.fixUpperEdge?(libtess.sweep.deleteRegion_(a,c),libtess.mesh.deleteEdge(e),c=b.regionBelow(),e=c.eUp):b.fixUpperEdge&&(libtess.sweep.deleteRegion_(a,b),libtess.mesh.deleteEdge(d),b=c.regionAbove(),d=b.eUp));if(d.org!==e.org)if(d.dst()=== +e.dst()||b.fixUpperEdge||c.fixUpperEdge||d.dst()!==a.event&&e.dst()!==a.event)libtess.sweep.checkForRightSplice_(a,b);else if(libtess.sweep.checkForIntersect_(a,b))break;d.org===e.org&&d.dst()===e.dst()&&(libtess.sweep.addWinding_(e,d),libtess.sweep.deleteRegion_(a,b),libtess.mesh.deleteEdge(d),b=c.regionAbove())}}; +libtess.sweep.connectRightVertex_=function(a,b,c){var d=c.oNext,e=b.regionBelow(),f=b.eUp,g=e.eUp,h=!1;f.dst()!==g.dst()&&libtess.sweep.checkForIntersect_(a,b);libtess.geom.vertEq(f.org,a.event)&&(libtess.mesh.meshSplice(d.oPrev(),f),b=libtess.sweep.topLeftRegion_(b),d=b.regionBelow().eUp,libtess.sweep.finishLeftRegions_(a,b.regionBelow(),e),h=!0);libtess.geom.vertEq(g.org,a.event)&&(libtess.mesh.meshSplice(c,g.oPrev()),c=libtess.sweep.finishLeftRegions_(a,e,null),h=!0);h?libtess.sweep.addRightEdges_(a, +b,c.oNext,d,d,!0):(d=libtess.geom.vertLeq(g.org,f.org)?g.oPrev():f,d=libtess.mesh.connect(c.lPrev(),d),libtess.sweep.addRightEdges_(a,b,d,d.oNext,d.oNext,!1),d.sym.activeRegion.fixUpperEdge=!0,libtess.sweep.walkDirtyRegions_(a,b))}; +libtess.sweep.connectLeftDegenerate_=function(a,b,c){var d=b.eUp;if(libtess.geom.vertEq(d.org,c))libtess.assert(libtess.sweep.TOLERANCE_NONZERO_),libtess.sweep.spliceMergeVertices_(a,d,c.anEdge);else if(libtess.geom.vertEq(d.dst(),c)){libtess.assert(libtess.sweep.TOLERANCE_NONZERO_);b=libtess.sweep.topRightRegion_(b);var d=b.regionBelow(),e=d.eUp.sym,f=e.oNext,g=f;d.fixUpperEdge&&(libtess.assert(f!==e),libtess.sweep.deleteRegion_(a,d),libtess.mesh.deleteEdge(e),e=f.oPrev());libtess.mesh.meshSplice(c.anEdge, +e);libtess.geom.edgeGoesLeft(f)||(f=null);libtess.sweep.addRightEdges_(a,b,e.oNext,g,f,!0)}else libtess.mesh.splitEdge(d.sym),b.fixUpperEdge&&(libtess.mesh.deleteEdge(d.oNext),b.fixUpperEdge=!1),libtess.mesh.meshSplice(c.anEdge,d),libtess.sweep.sweepEvent_(a,c)}; +libtess.sweep.connectLeftVertex_=function(a,b){var c=new libtess.ActiveRegion;c.eUp=b.anEdge.sym;var c=a.dict.search(c).getKey(),d=c.regionBelow(),e=c.eUp,f=d.eUp;0===libtess.geom.edgeSign(e.dst(),b,e.org)?libtess.sweep.connectLeftDegenerate_(a,c,b):(d=libtess.geom.vertLeq(f.dst(),e.dst())?c:d,c.inside||d.fixUpperEdge?(e=d===c?libtess.mesh.connect(b.anEdge.sym,e.lNext):libtess.mesh.connect(f.dNext(),b.anEdge).sym,d.fixUpperEdge?libtess.sweep.fixUpperEdge_(d,e):libtess.sweep.computeWinding_(a,libtess.sweep.addRegionBelow_(a, +c,e)),libtess.sweep.sweepEvent_(a,b)):libtess.sweep.addRightEdges_(a,c,b.anEdge,b.anEdge,null,!0))}; +libtess.sweep.sweepEvent_=function(a,b){a.event=b;libtess.sweepDebugEvent(a);for(var c=b.anEdge;null===c.activeRegion;)if(c=c.oNext,c===b.anEdge){libtess.sweep.connectLeftVertex_(a,b);return}var c=libtess.sweep.topLeftRegion_(c.activeRegion),d=c.regionBelow(),e=d.eUp,d=libtess.sweep.finishLeftRegions_(a,d,null);d.oNext===e?libtess.sweep.connectRightVertex_(a,c,d):libtess.sweep.addRightEdges_(a,c,d.oNext,e,e,!0)}; +libtess.sweep.addSentinel_=function(a,b){var c=new libtess.ActiveRegion,d=libtess.mesh.makeEdge(a.mesh);d.org.s=libtess.sweep.SENTINEL_COORD_;d.org.t=b;d.dst().s=-libtess.sweep.SENTINEL_COORD_;d.dst().t=b;a.event=d.dst();c.eUp=d;c.windingNumber=0;c.inside=!1;c.fixUpperEdge=!1;c.sentinel=!0;c.dirty=!1;c.nodeUp=a.dict.insert(c)}; +libtess.sweep.initEdgeDict_=function(a){a.dict=new libtess.Dict(a,libtess.sweep.edgeLeq_);libtess.sweep.addSentinel_(a,-libtess.sweep.SENTINEL_COORD_);libtess.sweep.addSentinel_(a,libtess.sweep.SENTINEL_COORD_)};libtess.sweep.doneEdgeDict_=function(a){for(var b=0,c;null!==(c=a.dict.getMin().getKey());)c.sentinel||(libtess.assert(c.fixUpperEdge),libtess.assert(1===++b)),libtess.assert(0===c.windingNumber),libtess.sweep.deleteRegion_(a,c);a.dict.deleteDict();a.dict=null}; +libtess.sweep.removeDegenerateEdges_=function(a){for(var b=a.mesh.eHead,c,d=b.next;d!==b;d=c){c=d.next;var e=d.lNext;libtess.geom.vertEq(d.org,d.dst())&&d.lNext.lNext!==d&&(libtess.sweep.spliceMergeVertices_(a,e,d),libtess.mesh.deleteEdge(d),d=e,e=d.lNext);if(e.lNext===d){if(e!==d){if(e===c||e===c.sym)c=c.next;libtess.mesh.deleteEdge(e)}if(d===c||d===c.sym)c=c.next;libtess.mesh.deleteEdge(d)}}}; +libtess.sweep.initPriorityQ_=function(a){var b=new libtess.PriorityQ(libtess.geom.vertLeq);a.pq=b;a=a.mesh.vHead;var c;for(c=a.next;c!==a;c=c.next)c.pqHandle=b.insert(c);b.init()};libtess.sweep.donePriorityQ_=function(a){a.pq.deleteQ();a.pq=null};libtess.sweep.removeDegenerateFaces_=function(a){for(var b,c=a.fHead.next;c!==a.fHead;c=b)b=c.next,c=c.anEdge,libtess.assert(c.lNext!==c),c.lNext.lNext===c&&(libtess.sweep.addWinding_(c.oNext,c),libtess.mesh.deleteEdge(c))};libtess.tessmono={}; +libtess.tessmono.tessellateMonoRegion_=function(a){a=a.anEdge;for(libtess.assert(a.lNext!==a&&a.lNext.lNext!==a);libtess.geom.vertLeq(a.dst(),a.org);a=a.lPrev());for(;libtess.geom.vertLeq(a.org,a.dst());a=a.lNext);for(var b=a.lPrev(),c;a.lNext!==b;)if(libtess.geom.vertLeq(a.dst(),b.org)){for(;b.lNext!==a&&(libtess.geom.edgeGoesLeft(b.lNext)||0>=libtess.geom.edgeSign(b.org,b.dst(),b.lNext.dst()));)c=libtess.mesh.connect(b.lNext,b),b=c.sym;b=b.lPrev()}else{for(;b.lNext!==a&&(libtess.geom.edgeGoesRight(a.lPrev())||0<= +libtess.geom.edgeSign(a.dst(),a.org,a.lPrev().org));)c=libtess.mesh.connect(a,a.lPrev()),a=c.sym;a=a.lNext}for(libtess.assert(b.lNext!==a);b.lNext.lNext!==a;)c=libtess.mesh.connect(b.lNext,b),b=c.sym};libtess.tessmono.tessellateInterior=function(a){for(var b,c=a.fHead.next;c!==a.fHead;c=b)b=c.next,c.inside&&libtess.tessmono.tessellateMonoRegion_(c)};libtess.tessmono.discardExterior=function(a){for(var b,c=a.fHead.next;c!==a.fHead;c=b)b=c.next,c.inside||libtess.mesh.zapFace(c)}; +libtess.tessmono.setWindingNumber=function(a,b,c){for(var d,e=a.eHead.next;e!==a.eHead;e=d)d=e.next,e.rFace().inside!==e.lFace.inside?e.winding=e.lFace.inside?b:-b:c?libtess.mesh.deleteEdge(e):e.winding=0};libtess.GluTesselator=function(){this.state=libtess.tessState.T_DORMANT;this.callError_=this.mesh=this.lastEdge_=null;this.normal=[0,0,0];this.sUnit=[0,0,0];this.tUnit=[0,0,0];this.relTolerance=libtess.GLU_TESS_DEFAULT_TOLERANCE;this.windingRule=libtess.windingRule.GLU_TESS_WINDING_ODD;this.fatalError=!1;this.callCombine_=this.event=this.pq=this.dict=null;this.boundaryOnly=this.flagBoundary=!1;this.polygonData_=this.callCombineData_=this.callErrorData_=this.callEndData_=this.callVertexData_=this.callEdgeFlagData_= +this.callBeginData_=this.callMesh_=this.callEnd_=this.callVertex_=this.callEdgeFlag_=this.callBegin_=this.lonelyTriList=null;this.emptyCache=!1;this.cacheCount=0;this.cache=Array(libtess.TESS_MAX_CACHE);for(var a=0;ab||1=this.relTolerance),this.relTolerance;case libtess.gluEnum.GLU_TESS_WINDING_RULE:return a=this.windingRule,libtess.assert(a===libtess.windingRule.GLU_TESS_WINDING_ODD||a===libtess.windingRule.GLU_TESS_WINDING_NONZERO||a===libtess.windingRule.GLU_TESS_WINDING_POSITIVE||a===libtess.windingRule.GLU_TESS_WINDING_NEGATIVE||a===libtess.windingRule.GLU_TESS_WINDING_ABS_GEQ_TWO), +a;case libtess.gluEnum.GLU_TESS_BOUNDARY_ONLY:return libtess.assert(!0===this.boundaryOnly||!1===this.boundaryOnly),this.boundaryOnly;default:this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_ENUM)}return!1};libtess.GluTesselator.prototype.gluTessNormal=function(a,b,c){this.normal[0]=a;this.normal[1]=b;this.normal[2]=c}; +libtess.GluTesselator.prototype.gluTessCallback=function(a,b){var c=b?b:null;switch(a){case libtess.gluEnum.GLU_TESS_BEGIN:this.callBegin_=c;break;case libtess.gluEnum.GLU_TESS_BEGIN_DATA:this.callBeginData_=c;break;case libtess.gluEnum.GLU_TESS_EDGE_FLAG:this.callEdgeFlag_=c;this.flagBoundary=!!c;break;case libtess.gluEnum.GLU_TESS_EDGE_FLAG_DATA:this.callEdgeFlagData_=c;this.flagBoundary=!!c;break;case libtess.gluEnum.GLU_TESS_VERTEX:this.callVertex_=c;break;case libtess.gluEnum.GLU_TESS_VERTEX_DATA:this.callVertexData_= +c;break;case libtess.gluEnum.GLU_TESS_END:this.callEnd_=c;break;case libtess.gluEnum.GLU_TESS_END_DATA:this.callEndData_=c;break;case libtess.gluEnum.GLU_TESS_ERROR:this.callError_=c;break;case libtess.gluEnum.GLU_TESS_ERROR_DATA:this.callErrorData_=c;break;case libtess.gluEnum.GLU_TESS_COMBINE:this.callCombine_=c;break;case libtess.gluEnum.GLU_TESS_COMBINE_DATA:this.callCombineData_=c;break;case libtess.gluEnum.GLU_TESS_MESH:this.callMesh_=c;break;default:this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_ENUM)}}; +libtess.GluTesselator.prototype.gluTessVertex=function(a,b){var c=!1,d=[0,0,0];this.requireState_(libtess.tessState.T_IN_CONTOUR);this.emptyCache&&(this.emptyCache_(),this.lastEdge_=null);for(var e=0;3>e;++e){var f=a[e];f<-libtess.GLU_TESS_MAX_COORD&&(f=-libtess.GLU_TESS_MAX_COORD,c=!0);f>libtess.GLU_TESS_MAX_COORD&&(f=libtess.GLU_TESS_MAX_COORD,c=!0);d[e]=f}c&&this.callErrorOrErrorData(libtess.errorType.GLU_TESS_COORD_TOO_LARGE);if(null===this.mesh){if(this.cacheCount=a||"\u0080"<=a&&"\ufffd">=a};goog.string.stripNewlines=function(a){return a.replace(/(\r\n|\r|\n)+/g," ")}; +goog.string.canonicalizeNewlines=function(a){return a.replace(/(\r\n|\r|\n)/g,"\n")};goog.string.normalizeWhitespace=function(a){return a.replace(/\xa0|\s/g," ")};goog.string.normalizeSpaces=function(a){return a.replace(/\xa0|[ \t]+/g," ")};goog.string.collapseBreakingSpaces=function(a){return a.replace(/[\t\r\n ]+/g," ").replace(/^[\t\r\n ]+|[\t\r\n ]+$/g,"")};goog.string.trim=function(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}; +goog.string.trimLeft=function(a){return a.replace(/^[\s\xa0]+/,"")};goog.string.trimRight=function(a){return a.replace(/[\s\xa0]+$/,"")};goog.string.caseInsensitiveCompare=function(a,b){var c=String(a).toLowerCase(),d=String(b).toLowerCase();return c/g;goog.string.quotRe_=/\"/g;goog.string.allRe_=/[&<>\"]/;goog.string.unescapeEntities=function(a){return goog.string.contains(a,"\x26")?"document"in goog.global?goog.string.unescapeEntitiesUsingDom_(a):goog.string.unescapePureXmlEntities_(a):a}; +goog.string.unescapeEntitiesUsingDom_=function(a){var b={"\x26amp;":"\x26","\x26lt;":"\x3c","\x26gt;":"\x3e","\x26quot;":'"'},c=document.createElement("div");return a.replace(goog.string.HTML_ENTITY_PATTERN_,function(a,e){var f=b[a];if(f)return f;if("#"==e.charAt(0)){var g=Number("0"+e.substr(1));isNaN(g)||(f=String.fromCharCode(g))}f||(c.innerHTML=a+" ",f=c.firstChild.nodeValue.slice(0,-1));return b[a]=f})}; +goog.string.unescapePureXmlEntities_=function(a){return a.replace(/&([^;]+);/g,function(a,c){switch(c){case "amp":return"\x26";case "lt":return"\x3c";case "gt":return"\x3e";case "quot":return'"';default:if("#"==c.charAt(0)){var d=Number("0"+c.substr(1));if(!isNaN(d))return String.fromCharCode(d)}return a}})};goog.string.HTML_ENTITY_PATTERN_=/&([^;\s<&]+);?/g;goog.string.whitespaceEscape=function(a,b){return goog.string.newLineToBr(a.replace(/ /g," \x26#160;"),b)}; +goog.string.stripQuotes=function(a,b){for(var c=b.length,d=0;db&&(a=a.substring(0,b-3)+"...");c&&(a=goog.string.htmlEscape(a));return a}; +goog.string.truncateMiddle=function(a,b,c,d){c&&(a=goog.string.unescapeEntities(a));if(d&&a.length>b){d>b&&(d=b);var e=a.length-d;a=a.substring(0,b-d)+"..."+a.substring(e)}else a.length>b&&(d=Math.floor(b/2),e=a.length-d,a=a.substring(0,d+b%2)+"..."+a.substring(e));c&&(a=goog.string.htmlEscape(a));return a};goog.string.specialEscapeChars_={"\x00":"\\0","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\x0B":"\\x0B",'"':'\\"',"\\":"\\\\"};goog.string.jsEscapeCache_={"'":"\\'"}; +goog.string.quote=function(a){a=String(a);if(a.quote)return a.quote();for(var b=['"'],c=0;ce?d:goog.string.escapeChar(d))}b.push('"');return b.join("")};goog.string.escapeString=function(a){for(var b=[],c=0;cc)b=a;else{if(256>c){if(b="\\x",16>c||256c&&(b+="0");b+=c.toString(16).toUpperCase()}return goog.string.jsEscapeCache_[a]=b};goog.string.toMap=function(a){for(var b={},c=0;cb?1:0};goog.string.HASHCODE_MAX_=4294967296;goog.string.hashCode=function(a){for(var b=0,c=0;cc?Math.max(0,a.length+c):c;if(goog.isString(a))return goog.isString(b)&&1==b.length?a.indexOf(b,c):-1;for(;cc&&(c=Math.max(0,a.length+c));if(goog.isString(a))return goog.isString(b)&&1==b.length?a.lastIndexOf(b,c):-1;for(;0<=c;c--)if(c in a&&a[c]===b)return c;return-1}; +goog.array.forEach=goog.NATIVE_ARRAY_PROTOTYPES&&goog.array.ARRAY_PROTOTYPE_.forEach?function(a,b,c){goog.array.ARRAY_PROTOTYPE_.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;fb?null:goog.isString(a)?a.charAt(b):a[b]};goog.array.findIndex=function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;fb?null:goog.isString(a)?a.charAt(b):a[b]}; +goog.array.findIndexRight=function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,d=d-1;0<=d;d--)if(d in e&&b.call(c,e[d],d,a))return d;return-1};goog.array.contains=function(a,b){return 0<=goog.array.indexOf(a,b)};goog.array.isEmpty=function(a){return 0==a.length};goog.array.clear=function(a){if(!goog.isArray(a))for(var b=a.length-1;0<=b;b--)delete a[b];a.length=0};goog.array.insert=function(a,b){goog.array.contains(a,b)||a.push(b)}; +goog.array.insertAt=function(a,b,c){goog.array.splice(a,c,0,b)};goog.array.insertArrayAt=function(a,b,c){goog.partial(goog.array.splice,a,c,0).apply(null,b)};goog.array.insertBefore=function(a,b,c){var d;2==arguments.length||0>(d=goog.array.indexOf(a,c))?a.push(b):goog.array.insertAt(a,b,d)};goog.array.remove=function(a,b){var c=goog.array.indexOf(a,b),d;(d=0<=c)&&goog.array.removeAt(a,c);return d};goog.array.removeAt=function(a,b){return 1==goog.array.ARRAY_PROTOTYPE_.splice.call(a,b,1).length}; +goog.array.removeIf=function(a,b,c){b=goog.array.findIndex(a,b,c);return 0<=b?(goog.array.removeAt(a,b),!0):!1};goog.array.concat=function(a){return goog.array.ARRAY_PROTOTYPE_.concat.apply(goog.array.ARRAY_PROTOTYPE_,arguments)};goog.array.toArray=function(a){var b=a.length;if(0=arguments.length?goog.array.ARRAY_PROTOTYPE_.slice.call(a,b):goog.array.ARRAY_PROTOTYPE_.slice.call(a,b,c)};goog.array.removeDuplicates=function(a,b){for(var c=b||a,d={},e=0,f=0;f>1,l;l=c?b.call(e,a[k],k,a):b(d,a[k]);0b?1:ac?(goog.array.insertAt(a,b,-(c+1)),!0):!1}; +goog.array.binaryRemove=function(a,b,c){b=goog.array.binarySearch(a,b,c);return 0<=b?goog.array.removeAt(a,b):!1};goog.array.bucket=function(a,b,c){for(var d={},e=0;ec*(f-e))return[];if(0f;a+=c)d.push(a);return d};goog.array.repeat=function(a,b){for(var c=[],d=0;db&&goog.array.ARRAY_PROTOTYPE_.push.apply(a,a.splice(0,-b)));return a};goog.array.moveItem=function(a,b,c){b=goog.array.ARRAY_PROTOTYPE_.splice.call(a,b,1);goog.array.ARRAY_PROTOTYPE_.splice.call(a,c,0,b[0])};goog.array.zip=function(a){if(!arguments.length)return[];for(var b=[],c=0;;c++){for(var d=[],e=0;e=f.length)return b;d.push(f[c])}b.push(d)}}; +goog.array.shuffle=function(a,b){for(var c=b||Math.random,d=a.length-1;0>=1}return new ol.TileCoord(b,c,d)}; +ol.TileCoord.createFromString=function(a){a=a.split("/");a=goog.array.map(a,function(a,c,d){return parseInt(a,10)});return new ol.TileCoord(a[0],a[1],a[2])};ol.TileCoord.createOrUpdate=function(a,b,c,d){return goog.isDef(d)?(d.z=a,d.x=b,d.y=c,d):new ol.TileCoord(a,b,c)};ol.TileCoord.getKeyZXY=function(a,b,c){return a+"/"+b+"/"+c};ol.TileCoord.prototype.getZXY=function(a){return goog.isDef(a)?(a[0]=this.z,a[1]=this.x,a[2]=this.y,a):[this.z,this.x,this.y]}; +ol.TileCoord.prototype.hash=function(){return(this.x<>=1;return a.join("")};ol.TileCoord.prototype.toString=function(){return ol.TileCoord.getKeyZXY(this.z,this.x,this.y)};ol.TileRange=function(a,b,c,d){this.minX=a;this.maxX=b;this.minY=c;this.maxY=d};ol.TileRange.boundingTileRange=function(a){var b=arguments[0],b=new ol.TileRange(b.x,b.x,b.y,b.y),c,d,e;c=1;for(d=arguments.length;cthis.maxX&&(this.maxX=a.maxX);a.minYthis.maxY&&(this.maxY=a.maxY)};ol.TileRange.prototype.getHeight=function(){return this.maxY-this.minY+1};ol.TileRange.prototype.getSize=function(){return[this.getWidth(),this.getHeight()]};ol.TileRange.prototype.getWidth=function(){return this.maxX-this.minX+1}; +ol.TileRange.prototype.intersects=function(a){return this.minX<=a.maxX&&this.maxX>=a.minX&&this.minY<=a.maxY&&this.maxY>=a.minY};ol.Attribution=function(a){this.html_=a.html;this.tileRanges_=goog.isDef(a.tileRanges)?a.tileRanges:null};ol.Attribution.prototype.getHTML=function(){return this.html_};ol.Attribution.prototype.intersectsAnyTileRange=function(a){if(goog.isNull(this.tileRanges_))return!0;var b,c,d,e;for(e in a)if(e in this.tileRanges_)for(d=a[e],b=0,c=this.tileRanges_[e].length;bparseFloat(a))?String(b):a}; +goog.userAgent.getDocumentMode_=function(){var a=goog.global.document;return a?a.documentMode:void 0};goog.userAgent.VERSION=goog.userAgent.determineVersion_();goog.userAgent.compare=function(a,b){return goog.string.compareVersions(a,b)};goog.userAgent.isVersionOrHigherCache_={}; +goog.userAgent.isVersionOrHigher=function(a){return goog.userAgent.ASSUME_ANY_VERSION||goog.userAgent.isVersionOrHigherCache_[a]||(goog.userAgent.isVersionOrHigherCache_[a]=0<=goog.string.compareVersions(goog.userAgent.VERSION,a))};goog.userAgent.isVersion=goog.userAgent.isVersionOrHigher;goog.userAgent.isDocumentModeOrHigher=function(a){return goog.userAgent.IE&&goog.userAgent.DOCUMENT_MODE>=a};goog.userAgent.isDocumentMode=goog.userAgent.isDocumentModeOrHigher; +goog.userAgent.DOCUMENT_MODE=function(){var a=goog.global.document;return a&&goog.userAgent.IE?goog.userAgent.getDocumentMode_()||("CSS1Compat"==a.compatMode?parseInt(goog.userAgent.VERSION,10):5):void 0}();goog.dom={};goog.dom.BrowserFeature={CAN_ADD_NAME_OR_TYPE_ATTRIBUTES:!goog.userAgent.IE||goog.userAgent.isDocumentModeOrHigher(9),CAN_USE_CHILDREN_ATTRIBUTE:!goog.userAgent.GECKO&&!goog.userAgent.IE||goog.userAgent.IE&&goog.userAgent.isDocumentModeOrHigher(9)||goog.userAgent.GECKO&&goog.userAgent.isVersionOrHigher("1.9.1"),CAN_USE_INNER_TEXT:goog.userAgent.IE&&!goog.userAgent.isVersionOrHigher("9"),CAN_USE_PARENT_ELEMENT_PROPERTY:goog.userAgent.IE||goog.userAgent.OPERA||goog.userAgent.WEBKIT,INNER_HTML_NEEDS_SCOPED_ELEMENT:goog.userAgent.IE};goog.dom.TagName={A:"A",ABBR:"ABBR",ACRONYM:"ACRONYM",ADDRESS:"ADDRESS",APPLET:"APPLET",AREA:"AREA",ARTICLE:"ARTICLE",ASIDE:"ASIDE",AUDIO:"AUDIO",B:"B",BASE:"BASE",BASEFONT:"BASEFONT",BDI:"BDI",BDO:"BDO",BIG:"BIG",BLOCKQUOTE:"BLOCKQUOTE",BODY:"BODY",BR:"BR",BUTTON:"BUTTON",CANVAS:"CANVAS",CAPTION:"CAPTION",CENTER:"CENTER",CITE:"CITE",CODE:"CODE",COL:"COL",COLGROUP:"COLGROUP",COMMAND:"COMMAND",DATA:"DATA",DATALIST:"DATALIST",DD:"DD",DEL:"DEL",DETAILS:"DETAILS",DFN:"DFN",DIALOG:"DIALOG",DIR:"DIR",DIV:"DIV", +DL:"DL",DT:"DT",EM:"EM",EMBED:"EMBED",FIELDSET:"FIELDSET",FIGCAPTION:"FIGCAPTION",FIGURE:"FIGURE",FONT:"FONT",FOOTER:"FOOTER",FORM:"FORM",FRAME:"FRAME",FRAMESET:"FRAMESET",H1:"H1",H2:"H2",H3:"H3",H4:"H4",H5:"H5",H6:"H6",HEAD:"HEAD",HEADER:"HEADER",HGROUP:"HGROUP",HR:"HR",HTML:"HTML",I:"I",IFRAME:"IFRAME",IMG:"IMG",INPUT:"INPUT",INS:"INS",ISINDEX:"ISINDEX",KBD:"KBD",KEYGEN:"KEYGEN",LABEL:"LABEL",LEGEND:"LEGEND",LI:"LI",LINK:"LINK",MAP:"MAP",MARK:"MARK",MATH:"MATH",MENU:"MENU",META:"META",METER:"METER", +NAV:"NAV",NOFRAMES:"NOFRAMES",NOSCRIPT:"NOSCRIPT",OBJECT:"OBJECT",OL:"OL",OPTGROUP:"OPTGROUP",OPTION:"OPTION",OUTPUT:"OUTPUT",P:"P",PARAM:"PARAM",PRE:"PRE",PROGRESS:"PROGRESS",Q:"Q",RP:"RP",RT:"RT",RUBY:"RUBY",S:"S",SAMP:"SAMP",SCRIPT:"SCRIPT",SECTION:"SECTION",SELECT:"SELECT",SMALL:"SMALL",SOURCE:"SOURCE",SPAN:"SPAN",STRIKE:"STRIKE",STRONG:"STRONG",STYLE:"STYLE",SUB:"SUB",SUMMARY:"SUMMARY",SUP:"SUP",SVG:"SVG",TABLE:"TABLE",TBODY:"TBODY",TD:"TD",TEXTAREA:"TEXTAREA",TFOOT:"TFOOT",TH:"TH",THEAD:"THEAD", +TIME:"TIME",TITLE:"TITLE",TR:"TR",TRACK:"TRACK",TT:"TT",U:"U",UL:"UL",VAR:"VAR",VIDEO:"VIDEO",WBR:"WBR"};goog.dom.classes={};goog.dom.classes.set=function(a,b){a.className=b};goog.dom.classes.get=function(a){a=a.className;return goog.isString(a)&&a.match(/\S+/g)||[]};goog.dom.classes.add=function(a,b){var c=goog.dom.classes.get(a),d=goog.array.slice(arguments,1),e=c.length+d.length;goog.dom.classes.add_(c,d);goog.dom.classes.set(a,c.join(" "));return c.length==e}; +goog.dom.classes.remove=function(a,b){var c=goog.dom.classes.get(a),d=goog.array.slice(arguments,1),e=goog.dom.classes.getDifference_(c,d);goog.dom.classes.set(a,e.join(" "));return e.length==c.length-d.length};goog.dom.classes.add_=function(a,b){for(var c=0;cc*b?c+b:c};goog.math.lerp=function(a,b,c){return a+c*(b-a)};goog.math.nearlyEquals=function(a,b,c){return Math.abs(a-b)<=(c||1E-6)};goog.math.standardAngle=function(a){return goog.math.modulo(a,360)}; +goog.math.toRadians=function(a){return a*Math.PI/180};goog.math.toDegrees=function(a){return 180*a/Math.PI};goog.math.angleDx=function(a,b){return b*Math.cos(goog.math.toRadians(a))};goog.math.angleDy=function(a,b){return b*Math.sin(goog.math.toRadians(a))};goog.math.angle=function(a,b,c,d){return goog.math.standardAngle(goog.math.toDegrees(Math.atan2(d-b,c-a)))};goog.math.angleDifference=function(a,b){var c=goog.math.standardAngle(b)-goog.math.standardAngle(a);180=c&&(c=360+c);return c}; +goog.math.sign=function(a){return 0==a?0:0>a?-1:1};goog.math.longestCommonSubsequence=function(a,b,c,d){c=c||function(a,b){return a==b};d=d||function(b,c){return a[b]};for(var e=a.length,f=b.length,g=[],h=0;hg[h][k-1]?h--:k--;return l}; +goog.math.sum=function(a){return goog.array.reduce(arguments,function(a,c){return a+c},0)};goog.math.average=function(a){return goog.math.sum.apply(null,arguments)/arguments.length};goog.math.standardDeviation=function(a){var b=arguments.length;if(2>b)return 0;var c=goog.math.average.apply(null,arguments),b=goog.math.sum.apply(null,goog.array.map(arguments,function(a){return Math.pow(a-c,2)}))/(b-1);return Math.sqrt(b)};goog.math.isInt=function(a){return isFinite(a)&&0==a%1}; +goog.math.isFiniteNumber=function(a){return isFinite(a)&&!isNaN(a)};goog.math.safeFloor=function(a,b){return Math.floor(a+(b||2E-15))};goog.math.safeCeil=function(a,b){return Math.ceil(a-(b||2E-15))};goog.math.Coordinate=function(a,b){this.x=goog.isDef(a)?a:0;this.y=goog.isDef(b)?b:0};goog.math.Coordinate.prototype.clone=function(){return new goog.math.Coordinate(this.x,this.y)};goog.DEBUG&&(goog.math.Coordinate.prototype.toString=function(){return"("+this.x+", "+this.y+")"});goog.math.Coordinate.equals=function(a,b){return a==b?!0:a&&b?a.x==b.x&&a.y==b.y:!1};goog.math.Coordinate.distance=function(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}; +goog.math.Coordinate.magnitude=function(a){return Math.sqrt(a.x*a.x+a.y*a.y)};goog.math.Coordinate.azimuth=function(a){return goog.math.angle(0,0,a.x,a.y)};goog.math.Coordinate.squaredDistance=function(a,b){var c=a.x-b.x,d=a.y-b.y;return c*c+d*d};goog.math.Coordinate.difference=function(a,b){return new goog.math.Coordinate(a.x-b.x,a.y-b.y)};goog.math.Coordinate.sum=function(a,b){return new goog.math.Coordinate(a.x+b.x,a.y+b.y)}; +goog.math.Coordinate.prototype.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};goog.math.Coordinate.prototype.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};goog.math.Coordinate.prototype.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};goog.math.Coordinate.prototype.translate=function(a,b){a instanceof goog.math.Coordinate?(this.x+=a.x,this.y+=a.y):(this.x+=a,goog.isNumber(b)&&(this.y+=b));return this}; +goog.math.Coordinate.prototype.scale=function(a,b){var c=goog.isNumber(b)?b:a;this.x*=a;this.y*=c;return this};goog.math.Size=function(a,b){this.width=a;this.height=b};goog.math.Size.equals=function(a,b){return a==b?!0:a&&b?a.width==b.width&&a.height==b.height:!1};goog.math.Size.prototype.clone=function(){return new goog.math.Size(this.width,this.height)};goog.DEBUG&&(goog.math.Size.prototype.toString=function(){return"("+this.width+" x "+this.height+")"});goog.math.Size.prototype.getLongest=function(){return Math.max(this.width,this.height)}; +goog.math.Size.prototype.getShortest=function(){return Math.min(this.width,this.height)};goog.math.Size.prototype.area=function(){return this.width*this.height};goog.math.Size.prototype.perimeter=function(){return 2*(this.width+this.height)};goog.math.Size.prototype.aspectRatio=function(){return this.width/this.height};goog.math.Size.prototype.isEmpty=function(){return!this.area()};goog.math.Size.prototype.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this}; +goog.math.Size.prototype.fitsInside=function(a){return this.width<=a.width&&this.height<=a.height};goog.math.Size.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};goog.math.Size.prototype.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};goog.math.Size.prototype.scale=function(a,b){var c=goog.isNumber(b)?b:a;this.width*=a;this.height*=c;return this}; +goog.math.Size.prototype.scaleToFit=function(a){a=this.aspectRatio()>a.aspectRatio()?a.width/this.width:a.height/this.height;return this.scale(a)};goog.object={};goog.object.forEach=function(a,b,c){for(var d in a)b.call(c,a[d],d,a)};goog.object.filter=function(a,b,c){var d={},e;for(e in a)b.call(c,a[e],e,a)&&(d[e]=a[e]);return d};goog.object.map=function(a,b,c){var d={},e;for(e in a)d[e]=b.call(c,a[e],e,a);return d};goog.object.some=function(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return!0;return!1};goog.object.every=function(a,b,c){for(var d in a)if(!b.call(c,a[d],d,a))return!1;return!0}; +goog.object.getCount=function(a){var b=0,c;for(c in a)b++;return b};goog.object.getAnyKey=function(a){for(var b in a)return b};goog.object.getAnyValue=function(a){for(var b in a)return a[b]};goog.object.contains=function(a,b){return goog.object.containsValue(a,b)};goog.object.getValues=function(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b};goog.object.getKeys=function(a){var b=[],c=0,d;for(d in a)b[c++]=d;return b}; +goog.object.getValueByKeys=function(a,b){for(var c=goog.isArrayLike(b),d=c?b:arguments,c=c?0:1;ca?b>e?b:e:ba):!1};goog.dom.setFocusableTabIndex=function(a,b){b?a.tabIndex=0:(a.tabIndex=-1,a.removeAttribute("tabIndex"))}; +goog.dom.getTextContent=function(a){if(goog.dom.BrowserFeature.CAN_USE_INNER_TEXT&&"innerText"in a)a=goog.string.canonicalizeNewlines(a.innerText);else{var b=[];goog.dom.getTextContent_(a,b,!0);a=b.join("")}a=a.replace(/ \xAD /g," ").replace(/\xAD/g,"");a=a.replace(/\u200B/g,"");goog.dom.BrowserFeature.CAN_USE_INNER_TEXT||(a=a.replace(/ +/g," "));" "!=a&&(a=a.replace(/^\s*/,""));return a};goog.dom.getRawTextContent=function(a){var b=[];goog.dom.getTextContent_(a,b,!1);return b.join("")}; +goog.dom.getTextContent_=function(a,b,c){if(!(a.nodeName in goog.dom.TAGS_TO_IGNORE_))if(a.nodeType==goog.dom.NodeType.TEXT)c?b.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in goog.dom.PREDEFINED_TAG_VALUES_)b.push(goog.dom.PREDEFINED_TAG_VALUES_[a.nodeName]);else for(a=a.firstChild;a;)goog.dom.getTextContent_(a,b,c),a=a.nextSibling};goog.dom.getNodeTextLength=function(a){return goog.dom.getTextContent(a).length}; +goog.dom.getNodeTextOffset=function(a,b){for(var c=b||goog.dom.getOwnerDocument(a).body,d=[];a&&a!=c;){for(var e=a;e=e.previousSibling;)d.unshift(goog.dom.getTextContent(e));a=a.parentNode}return goog.string.trimLeft(d.join("")).replace(/ +/g," ").length}; +goog.dom.getNodeAtOffset=function(a,b,c){a=[a];for(var d=0,e=null;0=a.keyCode)a.keyCode=-1}catch(b){}};goog.events.BrowserEvent.prototype.getBrowserEvent=function(){return this.event_};goog.events.BrowserEvent.prototype.disposeInternal=function(){};goog.events.Listenable=function(){};goog.events.Listenable.IMPLEMENTED_BY_PROP="closure_listenable_"+(1E6*Math.random()|0);goog.events.Listenable.addImplementation=function(a){a.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP]=!0};goog.events.Listenable.isImplementedBy=function(a){return!(!a||!a[goog.events.Listenable.IMPLEMENTED_BY_PROP])};goog.events.ListenableKey=function(){};goog.events.ListenableKey.counter_=0;goog.events.ListenableKey.reserveKey=function(){return++goog.events.ListenableKey.counter_};goog.events.Listener=function(a,b,c,d,e,f){goog.events.Listener.ENABLE_MONITORING&&(this.creationStack=Error().stack);this.listener=a;this.proxy=b;this.src=c;this.type=d;this.capture=!!e;this.handler=f;this.key=goog.events.ListenableKey.reserveKey();this.removed=this.callOnce=!1};goog.events.Listener.ENABLE_MONITORING=!1;goog.events.Listener.prototype.markAsRemoved=function(){this.removed=!0;this.handler=this.src=this.proxy=this.listener=null};goog.events.listeners_={};goog.events.listenerTree_={};goog.events.sources_={};goog.events.onString_="on";goog.events.onStringMap_={};goog.events.keySeparator_="_";goog.events.listen=function(a,b,c,d,e){if(goog.isArray(b)){for(var f=0;fa.keyCode||void 0!=a.returnValue};goog.events.uniqueIdCounter_=0;goog.events.getUniqueId=function(a){return a+"_"+goog.events.uniqueIdCounter_++};goog.events.LISTENER_WRAPPER_PROP_="__closure_events_fn_"+(1E9*Math.random()>>>0);goog.events.wrapListener_=function(a){return goog.isFunction(a)?a:a[goog.events.LISTENER_WRAPPER_PROP_]||(a[goog.events.LISTENER_WRAPPER_PROP_]=function(b){return a.handleEvent(b)})};goog.functions={};goog.functions.constant=function(a){return function(){return a}};goog.functions.FALSE=goog.functions.constant(!1);goog.functions.TRUE=goog.functions.constant(!0);goog.functions.NULL=goog.functions.constant(null);goog.functions.identity=function(a,b){return a};goog.functions.error=function(a){return function(){throw Error(a);}};goog.functions.fail=function(a){return function(){throw a;}}; +goog.functions.lock=function(a,b){b=b||0;return function(){return a.apply(this,Array.prototype.slice.call(arguments,0,b))}};goog.functions.withReturnValue=function(a,b){return goog.functions.sequence(a,goog.functions.constant(b))};goog.functions.compose=function(a,b){var c=arguments,d=c.length;return function(){var a;d&&(a=c[d-1].apply(this,arguments));for(var b=d-2;0<=b;b--)a=c[b].call(this,a);return a}}; +goog.functions.sequence=function(a){var b=arguments,c=b.length;return function(){for(var a,e=0;ec)for(c=1;cf?1:0.5,d=Math.floor(Math.log(b/d)/Math.log(a)+f),e=Math.max(d+e,0),goog.isDef(c)&&(e=Math.min(e,c)),b/Math.pow(a,e)}};ol.RotationConstraint={};ol.RotationConstraint.disable=function(a,b){if(goog.isDef(a))return 0};ol.RotationConstraint.none=function(a,b){if(goog.isDef(a))return a+b};ol.RotationConstraint.createSnapToN=function(a){var b=2*Math.PI/a;return function(a,d){if(goog.isDef(a))return a=Math.floor((a+d)/b+0.5)*b}};ol.RotationConstraint.createSnapToZero=function(a){var b=a||goog.math.toRadians(5);return function(a,d){if(goog.isDef(a))return Math.abs(a+d)<=b?0:a+d}};ol.Constraints=function(a,b,c){this.center=a;this.resolution=b;this.rotation=c};ol.coordinate={};ol.coordinate.add=function(a,b){a[0]+=b[0];a[1]+=b[1];return a};ol.coordinate.closestOnSegment=function(a,b){var c=a[0],d=a[1],e=b[0],f=b[1],g=e[0],e=e[1],h=f[0],f=f[1],k=h-g,l=f-e,c=0==k&&0==l?0:(k*(c-g)+l*(d-e))/(k*k+l*l||0);0>=c||(1<=c?(g=h,e=f):(g+=c*k,e+=c*l));return[g,e]};ol.coordinate.createStringXY=function(a){return function(b){return ol.coordinate.toStringXY(b,a)}}; +ol.coordinate.degreesToStringHDMS_=function(a,b){var c=goog.math.modulo(a+180,360)-180,d=Math.abs(Math.round(3600*c));return Math.floor(d/3600)+"\u00b0 "+Math.floor(d/60%60)+"\u2032 "+Math.floor(d%60)+"\u2033 "+b.charAt(0>c?1:0)};ol.coordinate.format=function(a,b,c){return goog.isDef(a)?b.replace("{x}",a[0].toFixed(c)).replace("{y}",a[1].toFixed(c)):""};ol.coordinate.equals=function(a,b){for(var c=!0,d=a.length-1;0<=d;--d)if(a[d]!=b[d]){c=!1;break}return c}; +ol.coordinate.rotate=function(a,b){var c=Math.cos(b),d=Math.sin(b),e=a[1]*c+a[0]*d;a[0]=a[0]*c-a[1]*d;a[1]=e;return a};ol.coordinate.scale=function(a,b){a[0]*=b;a[1]*=b;return a};ol.coordinate.squaredDistance=function(a,b){var c=a[0]-b[0],d=a[1]-b[1];return c*c+d*d};ol.coordinate.squaredDistanceToSegment=function(a,b){return ol.coordinate.squaredDistance(a,ol.coordinate.closestOnSegment(a,b))}; +ol.coordinate.toStringHDMS=function(a){return goog.isDef(a)?ol.coordinate.degreesToStringHDMS_(a[1],"NS")+" "+ol.coordinate.degreesToStringHDMS_(a[0],"EW"):""};ol.coordinate.toStringXY=function(a,b){return ol.coordinate.format(a,"{x}, {y}",b)};ol.coordinate.fromProjectedArray=function(a,b){var c=b.charAt(0);return"n"===c||"s"===c?[a[1],a[0]]:a};ol.DeviceOrientationProperty={ALPHA:"alpha",BETA:"beta",GAMMA:"gamma",HEADING:"heading",TRACKING:"tracking"};ol.DeviceOrientation=function(a){ol.Object.call(this);a=goog.isDef(a)?a:{};this.listenerKey_=null;goog.events.listen(this,ol.Object.getChangeEventType(ol.DeviceOrientationProperty.TRACKING),this.handleTrackingChanged_,!1,this);this.setTracking(goog.isDef(a.tracking)?a.tracking:!1)};goog.inherits(ol.DeviceOrientation,ol.Object); +ol.DeviceOrientation.prototype.disposeInternal=function(){this.setTracking(!1);ol.DeviceOrientation.superClass_.disposeInternal.call(this)}; +ol.DeviceOrientation.prototype.orientationChange_=function(a){a=a.getBrowserEvent();if(goog.isDefAndNotNull(a.alpha)){var b=goog.math.toRadians(a.alpha);this.set(ol.DeviceOrientationProperty.ALPHA,b);goog.isBoolean(a.absolute)&&a.absolute?this.set(ol.DeviceOrientationProperty.HEADING,b):goog.isDefAndNotNull(a.webkitCompassHeading)&&(goog.isDefAndNotNull(a.webkitCompassAccuracy)&&-1!=a.webkitCompassAccuracy)&&(b=goog.math.toRadians(a.webkitCompassHeading),this.set(ol.DeviceOrientationProperty.HEADING, +b))}goog.isDefAndNotNull(a.beta)&&this.set(ol.DeviceOrientationProperty.BETA,goog.math.toRadians(a.beta));goog.isDefAndNotNull(a.gamma)&&this.set(ol.DeviceOrientationProperty.GAMMA,goog.math.toRadians(a.gamma))};ol.DeviceOrientation.prototype.getAlpha=function(){return this.get(ol.DeviceOrientationProperty.ALPHA)};goog.exportProperty(ol.DeviceOrientation.prototype,"getAlpha",ol.DeviceOrientation.prototype.getAlpha);ol.DeviceOrientation.prototype.getBeta=function(){return this.get(ol.DeviceOrientationProperty.BETA)}; +goog.exportProperty(ol.DeviceOrientation.prototype,"getBeta",ol.DeviceOrientation.prototype.getBeta);ol.DeviceOrientation.prototype.getGamma=function(){return this.get(ol.DeviceOrientationProperty.GAMMA)};goog.exportProperty(ol.DeviceOrientation.prototype,"getGamma",ol.DeviceOrientation.prototype.getGamma);ol.DeviceOrientation.prototype.getHeading=function(){return this.get(ol.DeviceOrientationProperty.HEADING)};goog.exportProperty(ol.DeviceOrientation.prototype,"getHeading",ol.DeviceOrientation.prototype.getHeading); +ol.DeviceOrientation.prototype.getTracking=function(){return this.get(ol.DeviceOrientationProperty.TRACKING)};goog.exportProperty(ol.DeviceOrientation.prototype,"getTracking",ol.DeviceOrientation.prototype.getTracking); +ol.DeviceOrientation.prototype.handleTrackingChanged_=function(){if(ol.BrowserFeature.HAS_DEVICE_ORIENTATION){var a=this.getTracking();a&&goog.isNull(this.listenerKey_)?this.listenerKey_=goog.events.listen(goog.global,"deviceorientation",this.orientationChange_,!1,this):a||goog.isNull(this.listenerKey_)||(goog.events.unlistenByKey(this.listenerKey_),this.listenerKey_=null)}};ol.DeviceOrientation.prototype.setTracking=function(a){this.set(ol.DeviceOrientationProperty.TRACKING,a)}; +goog.exportProperty(ol.DeviceOrientation.prototype,"setTracking",ol.DeviceOrientation.prototype.setTracking);goog.vec={};goog.vec.Float32Array=function(a){this.length=a.length||a;for(var b=0;bgoog.vec.EPSILON?(b[2]=Math.atan2(a[2]*c,a[6]*c),b[1]=Math.atan2(d*c,a[10]),b[0]=Math.atan2(a[8]*c,-a[9]*c)):(b[0]=0,b[1]=Math.atan2(d*c,a[10]),b[2]=Math.atan2(a[1],a[0]));b[0]=(b[0]+2*Math.PI)%(2*Math.PI);b[2]=(b[2]+2*Math.PI)%(2*Math.PI);b[1]=(b[1]*c+2*Math.PI)%(2*Math.PI)*c;return b}; +goog.vec.Mat4.translate=function(a,b,c,d){return goog.vec.Mat4.setColumnValues(a,3,a[0]*b+a[4]*c+a[8]*d+a[12],a[1]*b+a[5]*c+a[9]*d+a[13],a[2]*b+a[6]*c+a[10]*d+a[14],a[3]*b+a[7]*c+a[11]*d+a[15])};goog.vec.Mat4.scale=function(a,b,c,d){return goog.vec.Mat4.setFromValues(a,a[0]*b,a[1]*b,a[2]*b,a[3]*b,a[4]*c,a[5]*c,a[6]*c,a[7]*c,a[8]*d,a[9]*d,a[10]*d,a[11]*d,a[12],a[13],a[14],a[15])}; +goog.vec.Mat4.rotate=function(a,b,c,d,e){var f=a[0],g=a[1],h=a[2],k=a[3],l=a[4],m=a[5],n=a[6],p=a[7],r=a[8],q=a[9],u=a[10],s=a[11],v=a[12],t=a[13],B=a[14],w=a[15],z=Math.cos(b),x=Math.sin(b),A=1-z;b=c*c*A+z;var C=c*d*A+e*x,G=c*e*A-d*x,H=c*d*A-e*x,E=d*d*A+z,y=d*e*A+c*x,D=c*e*A+d*x;c=d*e*A-c*x;e=e*e*A+z;return goog.vec.Mat4.setFromValues(a,f*b+l*C+r*G,g*b+m*C+q*G,h*b+n*C+u*G,k*b+p*C+s*G,f*H+l*E+r*y,g*H+m*E+q*y,h*H+n*E+u*y,k*H+p*E+s*y,f*D+l*c+r*e,g*D+m*c+q*e,h*D+n*c+u*e,k*D+p*c+s*e,v,t,B,w)}; +goog.vec.Mat4.rotateX=function(a,b){var c=a[4],d=a[5],e=a[6],f=a[7],g=a[8],h=a[9],k=a[10],l=a[11],m=Math.cos(b),n=Math.sin(b);a[4]=c*m+g*n;a[5]=d*m+h*n;a[6]=e*m+k*n;a[7]=f*m+l*n;a[8]=c*-n+g*m;a[9]=d*-n+h*m;a[10]=e*-n+k*m;a[11]=f*-n+l*m;return a};goog.vec.Mat4.rotateY=function(a,b){var c=a[0],d=a[1],e=a[2],f=a[3],g=a[8],h=a[9],k=a[10],l=a[11],m=Math.cos(b),n=Math.sin(b);a[0]=c*m+g*-n;a[1]=d*m+h*-n;a[2]=e*m+k*-n;a[3]=f*m+l*-n;a[8]=c*n+g*m;a[9]=d*n+h*m;a[10]=e*n+k*m;a[11]=f*n+l*m;return a}; +goog.vec.Mat4.rotateZ=function(a,b){var c=a[0],d=a[1],e=a[2],f=a[3],g=a[4],h=a[5],k=a[6],l=a[7],m=Math.cos(b),n=Math.sin(b);a[0]=c*m+g*n;a[1]=d*m+h*n;a[2]=e*m+k*n;a[3]=f*m+l*n;a[4]=c*-n+g*m;a[5]=d*-n+h*m;a[6]=e*-n+k*m;a[7]=f*-n+l*m;return a};goog.vec.Mat4.getTranslation=function(a,b){b[0]=a[12];b[1]=a[13];b[2]=a[14];return b};goog.vec.Mat4.tmpVec3_=[goog.vec.Vec3.createFloat64(),goog.vec.Vec3.createFloat64()];goog.vec.Mat4.tmpVec4_=[goog.vec.Vec4.createFloat64(),goog.vec.Vec4.createFloat64(),goog.vec.Vec4.createFloat64()]; +goog.vec.Mat4.tmpMat4_=[goog.vec.Mat4.createFloat64()];ol.extent={};ol.extent.Relationship={UNKNOWN:0,INTERSECTING:1,ABOVE:2,RIGHT:4,BELOW:8,LEFT:16};ol.extent.boundingExtent=function(a){for(var b=ol.extent.createEmpty(),c=0,d=a.length;cd&&(h|=ol.extent.Relationship.RIGHT);ge&&(h|=ol.extent.Relationship.ABOVE);h===ol.extent.Relationship.UNKNOWN&&(h=ol.extent.Relationship.INTERSECTING);return h}; +ol.extent.createEmpty=function(){return[Infinity,Infinity,-Infinity,-Infinity]};ol.extent.createOrUpdate=function(a,b,c,d,e){return goog.isDef(e)?(e[0]=a,e[1]=b,e[2]=c,e[3]=d,e):[a,b,c,d]};ol.extent.createOrUpdateEmpty=function(a){return ol.extent.createOrUpdate(Infinity,Infinity,-Infinity,-Infinity,a)};ol.extent.createOrUpdateFromCoordinate=function(a,b){var c=a[0],d=a[1];return ol.extent.createOrUpdate(c,d,c,d,b)}; +ol.extent.createOrUpdateFromCoordinates=function(a,b){var c=ol.extent.createOrUpdateEmpty(b);return ol.extent.extendCoordinates(c,a)};ol.extent.createOrUpdateFromFlatCoordinates=function(a,b,c,d,e){e=ol.extent.createOrUpdateEmpty(e);return ol.extent.extendFlatCoordinates(e,a,b,c,d)};ol.extent.createOrUpdateFromRings=function(a,b){var c=ol.extent.createOrUpdateEmpty(b);return ol.extent.extendRings(c,a)};ol.extent.empty=function(a){a[0]=a[1]=Infinity;a[2]=a[3]=-Infinity;return a}; +ol.extent.equals=function(a,b){return a[0]==b[0]&&a[2]==b[2]&&a[1]==b[1]&&a[3]==b[3]};ol.extent.extend=function(a,b){b[0]a[2]&&(a[2]=b[2]);b[1]a[3]&&(a[3]=b[3]);return a};ol.extent.extendCoordinate=function(a,b){b[0]a[2]&&(a[2]=b[0]);b[1]a[3]&&(a[3]=b[1])};ol.extent.extendCoordinates=function(a,b){var c,d;c=0;for(d=b.length;cg;++g)h=f[g],k=d[g],f[g]=a[0]+h*b-k*c,d[g]=a[1]+h*c+k*b;return ol.extent.boundingExtentXYs_(f,d,e)};ol.extent.getHeight=function(a){return a[3]-a[1]};ol.extent.getIntersectionArea=function(a,b){var c=Math.max(a[0],b[0]),d=Math.max(a[1],b[1]),e=Math.min(a[2],b[2]),f=Math.min(a[3],b[3]);return Math.max(0,e-c)*Math.max(0,f-d)}; +ol.extent.getMargin=function(a){return ol.extent.getWidth(a)+ol.extent.getHeight(a)};ol.extent.getSize=function(a){return[a[2]-a[0],a[3]-a[1]]};ol.extent.getTopLeft=function(a){return[a[0],a[3]]};ol.extent.getTopRight=function(a){return[a[2],a[3]]};ol.extent.getWidth=function(a){return a[2]-a[0]};ol.extent.intersects=function(a,b){return a[0]<=b[2]&&a[2]>=b[0]&&a[1]<=b[3]&&a[3]>=b[1]};ol.extent.isEmpty=function(a){return a[2]=g&&h<=k):f&ol.extent.Relationship.RIGHT&&!(e&ol.extent.Relationship.RIGHT)?(g=c-(l-k)*b,d=g>=h&&g<=a):f&ol.extent.Relationship.BELOW&& +!(e&ol.extent.Relationship.BELOW)?(h=l-(c-h)/b,d=h>=g&&h<=k):f&ol.extent.Relationship.LEFT&&!(e&ol.extent.Relationship.LEFT)&&(g=c-(l-g)*b,d=g>=h&&g<=a)}return d};ol.extent.touches=function(a,b){return ol.extent.intersects(a,b)&&(a[0]==b[2]||a[2]==b[0]||a[1]==b[3]||a[3]==b[1])};ol.extent.transform=function(a,b,c){a=[a[0],a[1],a[0],a[3],a[2],a[1],a[2],a[3]];b(a,a,2);return ol.extent.boundingExtentXYs_([a[0],a[2],a[4],a[6]],[a[1],a[3],a[5],a[7]],c)}; +ol.extent.transform2D=function(a,b,c){c=goog.isDef(c)?c:[];var d=goog.vec.Mat4.getElement(b,0,0),e=goog.vec.Mat4.getElement(b,1,0),f=goog.vec.Mat4.getElement(b,0,1),g=goog.vec.Mat4.getElement(b,1,1),h=goog.vec.Mat4.getElement(b,0,3);b=goog.vec.Mat4.getElement(b,1,3);var k=[0,2,0,2],l=[1,1,3,3],m=[],n=[],p,r,q;for(p=0;4>p;++p)r=a[k[p]],q=a[l[p]],m[p]=d*r+f*q+h,n[p]=e*r+g*q+b;c[0]=Math.min.apply(null,m);c[1]=Math.min.apply(null,n);c[2]=Math.max.apply(null,m);c[3]=Math.max.apply(null,n);return c};ol.TileState={IDLE:0,LOADING:1,LOADED:2,ERROR:3,EMPTY:4};ol.Tile=function(a,b){goog.events.EventTarget.call(this);this.tileCoord=a;this.state=b};goog.inherits(ol.Tile,goog.events.EventTarget);ol.Tile.prototype.dispatchChangeEvent=function(){this.dispatchEvent(goog.events.EventType.CHANGE)};ol.Tile.prototype.getKey=function(){return goog.getUid(this).toString()};ol.Tile.prototype.getTileCoord=function(){return this.tileCoord};ol.Tile.prototype.getState=function(){return this.state};ol.structs={};ol.structs.PriorityQueue=function(a,b){this.priorityFunction_=a;this.keyFunction_=b;this.elements_=[];this.priorities_=[];this.queuedElements_={}};ol.structs.PriorityQueue.DROP=Infinity;ol.structs.PriorityQueue.prototype.assertValid=function(){var a=this.elements_.length,b;for(b=0;b<(a>>1)-1;++b);};ol.structs.PriorityQueue.prototype.clear=function(){this.elements_.length=0;this.priorities_.length=0;goog.object.clear(this.queuedElements_)}; +ol.structs.PriorityQueue.prototype.dequeue=function(){var a=this.elements_,b=this.priorities_,c=a[0];1==a.length?(a.length=0,b.length=0):(a[0]=a.pop(),b[0]=b.pop(),this.siftUp_(0));a=this.keyFunction_(c);delete this.queuedElements_[a];return c};ol.structs.PriorityQueue.prototype.enqueue=function(a){var b=this.priorityFunction_(a);b!=ol.structs.PriorityQueue.DROP&&(this.elements_.push(a),this.priorities_.push(b),this.queuedElements_[this.keyFunction_(a)]=!0,this.siftDown_(0,this.elements_.length-1))}; +ol.structs.PriorityQueue.prototype.getCount=function(){return this.elements_.length};ol.structs.PriorityQueue.prototype.getLeftChildIndex_=function(a){return 2*a+1};ol.structs.PriorityQueue.prototype.getRightChildIndex_=function(a){return 2*a+2};ol.structs.PriorityQueue.prototype.getParentIndex_=function(a){return a-1>>1};ol.structs.PriorityQueue.prototype.heapify_=function(){var a;for(a=(this.elements_.length>>1)-1;0<=a;a--)this.siftUp_(a)}; +ol.structs.PriorityQueue.prototype.isEmpty=function(){return 0===this.elements_.length};ol.structs.PriorityQueue.prototype.isKeyQueued=function(a){return a in this.queuedElements_};ol.structs.PriorityQueue.prototype.isQueued=function(a){return this.isKeyQueued(this.keyFunction_(a))}; +ol.structs.PriorityQueue.prototype.siftUp_=function(a){for(var b=this.elements_,c=this.priorities_,d=b.length,e=b[a],f=c[a],g=a;a>1;){var h=this.getLeftChildIndex_(a),k=this.getRightChildIndex_(a),h=ka;){var g=this.getParentIndex_(b);if(d[g]>f)c[b]=c[g],d[b]=d[g],b=g;else break}c[b]=e;d[b]=f}; +ol.structs.PriorityQueue.prototype.reprioritize=function(){var a=this.priorityFunction_,b=this.elements_,c=this.priorities_,d=0,e=b.length,f,g,h;for(g=0;gthis.minResolution_)}return a}; +ol.View2D.prototype.fitExtent=function(a,b){if(!ol.extent.isEmpty(a)){this.setCenter(ol.extent.getCenter(a));var c=this.getResolutionForExtent(a,b),d=this.constrainResolution(c,0,0);da?ol.easing.inAndOut(2*a):1-ol.easing.inAndOut(2*(a-0.5))};ol.animation={};ol.animation.bounce=function(a){var b=a.resolution,c=goog.isDef(a.start)?a.start:goog.now(),d=goog.isDef(a.duration)?a.duration:1E3,e=goog.isDef(a.easing)?a.easing:ol.easing.upAndDown;return function(a,g){if(g.timec?(e=(e-g[-c-2])/(g[-c-1]-g[-c-2]),b+=(-c-2)*d,g=(1-e)*a[b]+e*a[b+d],h=(1-e)*a[b+1]+e*a[b+d+1]):(g=a[b+c*d],h=a[b+c*d+1])}return goog.isDefAndNotNull(f)? +(f.push(g,h),f):[g,h]};ol.geom.flat.lineStringCoordinateAtM=function(a,b,c,d,e,f){if(c==b)return null;if(e>1,ef!=m>f&&e<(l-h)*(f-k)/(m-k)+h&&(g=!g);h=l;k=m}return g}; +ol.geom.flat.linearRingIsClockwise=function(a,b,c,d){for(var e=0,f=a[c-d],g=a[c-d+1];bn&&(l=(l+m)/2,ol.geom.flat.linearRingsContainsXY(a,b,c,d,l,p)&&(q=l,n=u));l=m}isNaN(q)&&(q=e[f]);return goog.isDef(g)?(g.push(q,p),g):[q,p]}; +ol.geom.flat.linearRingsAreOriented=function(a,b,c,d){var e,f;e=0;for(f=c.length;ea||0!==this.simplifiedGeometryMaxMinSquaredTolerance&&a<=this.simplifiedGeometryMaxMinSquaredTolerance)return this;var b=a.toString();if(this.simplifiedGeometryCache.hasOwnProperty(b))return this.simplifiedGeometryCache[b];var c= +this.getSimplifiedGeometryInternal(a);if(c.getFlatCoordinates().lengthe&&(e=f);f=h;g=k}return e};ol.geom.closest.getsMaxSquaredDelta=function(a,b,c,d,e){var f,g;f=0;for(g=c.length;fh){for(;br&&(l=m,r=t)}r>e&&(k[(l-b)/d]=1,p+de&&(f[g++]=l,f[g++]=m,h=l,k=m);if(l!=h||m!=k)f[g++]=l,f[g++]=m;return g};ol.geom.simplify.snap=function(a,b){return b*Math.round(a/b)}; +ol.geom.simplify.quantize=function(a,b,c,d,e,f,g){if(b==c)return g;var h=ol.geom.simplify.snap(a[b],e),k=ol.geom.simplify.snap(a[b+1],e);b+=d;f[g++]=h;f[g++]=k;var l,m;do if(l=ol.geom.simplify.snap(a[b],e),m=ol.geom.simplify.snap(a[b+1],e),b+=d,b==c)return f[g++]=l,f[g++]=m,g;while(l==h&&m==k);for(;br&&ur)&&(0>q&&sq)||(f[g++]= +l,f[g++]=m,h=l,k=m);l=n;m=p}}f[g++]=l;f[g++]=m;return g};ol.geom.simplify.quantizes=function(a,b,c,d,e,f,g,h){var k,l;k=0;for(l=c.length;k=ol.DRAG_BOX_HYSTERESIS_PIXELS_SQUARED&&(this.onBoxEnd(a),this.dispatchEvent(new ol.DragBoxEvent(ol.DragBoxEventType.BOXEND,a.coordinate)))}; +ol.interaction.DragBox.prototype.handleDragStart=function(a){return a.browserEvent.isMouseActionButton()&&this.condition_(a)?(this.startPixel_=a.pixel,this.box_.setMap(a.map),this.box_.setPixels(this.startPixel_,this.startPixel_),this.dispatchEvent(new ol.DragBoxEvent(ol.DragBoxEventType.BOXSTART,a.coordinate)),!0):!1};goog.color={}; +goog.color.names={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",darkgreen:"#006400", +darkgrey:"#a9a9a9",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",green:"#008000",greenyellow:"#adff2f",grey:"#808080",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",lightgreen:"#90ee90",lightgrey:"#d3d3d3",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:"#9370db",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:"#db7093",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"};goog.color.parse=function(a){var b={};a=String(a);var c=goog.color.prependHashIfNecessaryHelper(a);if(goog.color.isValidHexColor_(c))return b.hex=goog.color.normalizeHex(c),b.type="hex",b;c=goog.color.isValidRgbColor_(a);if(c.length)return b.hex=goog.color.rgbArrayToHex(c),b.type="rgb",b;if(goog.color.names&&(c=goog.color.names[a.toLowerCase()]))return b.hex=c,b.type="named",b;throw Error(a+" is not a valid color string");}; +goog.color.isValidColor=function(a){var b=goog.color.prependHashIfNecessaryHelper(a);return!!(goog.color.isValidHexColor_(b)||goog.color.isValidRgbColor_(a).length||goog.color.names&&goog.color.names[a.toLowerCase()])};goog.color.parseRgb=function(a){var b=goog.color.isValidRgbColor_(a);if(!b.length)throw Error(a+" is not a valid RGB color");return b};goog.color.hexToRgbStyle=function(a){return goog.color.rgbStyle_(goog.color.hexToRgb(a))};goog.color.hexTripletRe_=/#(.)(.)(.)/; +goog.color.normalizeHex=function(a){if(!goog.color.isValidHexColor_(a))throw Error("'"+a+"' is not a valid hex color");4==a.length&&(a=a.replace(goog.color.hexTripletRe_,"#$1$1$2$2$3$3"));return a.toLowerCase()};goog.color.hexToRgb=function(a){a=goog.color.normalizeHex(a);var b=parseInt(a.substr(1,2),16),c=parseInt(a.substr(3,2),16);a=parseInt(a.substr(5,2),16);return[b,c,a]}; +goog.color.rgbToHex=function(a,b,c){a=Number(a);b=Number(b);c=Number(c);if(isNaN(a)||0>a||255b||255c||255=h?(d-e)/(2*h):(d-e)/(2-2*h));return[Math.round(f+360)%360,g,h]};goog.color.rgbArrayToHsl=function(a){return goog.color.rgbToHsl(a[0],a[1],a[2])};goog.color.hueToRgb_=function(a,b,c){0>c?c+=1:16*c?a+6*(b-a)*c:1>2*c?b:2>3*c?a+6*(b-a)*(2/3-c):a}; +goog.color.hslToRgb=function(a,b,c){var d=0,e=0,f=0;a/=360;if(0==b)d=e=f=255*c;else var g=f=0,g=0.5>c?c*(1+b):c+b-b*c,f=2*c-g,d=255*goog.color.hueToRgb_(f,g,a+1/3),e=255*goog.color.hueToRgb_(f,g,a),f=255*goog.color.hueToRgb_(f,g,a-1/3);return[Math.round(d),Math.round(e),Math.round(f)]};goog.color.hslArrayToRgb=function(a){return goog.color.hslToRgb(a[0],a[1],a[2])};goog.color.validHexColorRe_=/^#(?:[0-9a-f]{3}){1,2}$/i;goog.color.isValidHexColor_=function(a){return goog.color.validHexColorRe_.test(a)}; +goog.color.normalizedHexColorRe_=/^#[0-9a-f]{6}$/;goog.color.isNormalizedHexColor_=function(a){return goog.color.normalizedHexColorRe_.test(a)};goog.color.rgbColorRe_=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;goog.color.isValidRgbColor_=function(a){var b=a.match(goog.color.rgbColorRe_);if(b){a=Number(b[1]);var c=Number(b[2]),b=Number(b[3]);if(0<=a&&255>=a&&0<=c&&255>=c&&0<=b&&255>=b)return[a,c,b]}return[]}; +goog.color.prependZeroIfNecessaryHelper=function(a){return 1==a.length?"0"+a:a};goog.color.prependHashIfNecessaryHelper=function(a){return"#"==a.charAt(0)?a:"#"+a};goog.color.rgbStyle_=function(a){return"rgb("+a.join(",")+")"}; +goog.color.hsvToRgb=function(a,b,c){var d=0,e=0,f=0;if(0==b)f=e=d=c;else{var g=Math.floor(a/60),h=a/60-g;a=c*(1-b);var k=c*(1-b*h);b=c*(1-b*(1-h));switch(g){case 1:d=k;e=c;f=a;break;case 2:d=a;e=c;f=b;break;case 3:d=a;e=k;f=c;break;case 4:d=b;e=a;f=c;break;case 5:d=c;e=a;f=k;break;case 6:case 0:d=c,e=b,f=a}}return[Math.floor(d),Math.floor(e),Math.floor(f)]}; +goog.color.rgbToHsv=function(a,b,c){var d=Math.max(Math.max(a,b),c),e=Math.min(Math.min(a,b),c);if(e==d)e=a=0;else{var f=d-e,e=f/d;a=60*(a==d?(b-c)/f:b==d?2+(c-a)/f:4+(a-b)/f);0>a&&(a+=360);360=a[2]?a[1]*a[2]:a[1]*(1-a[2]);d=0.5>=b[2]?b[1]*b[2]:b[1]*(1-b[2]);return(a[2]-b[2])*(a[2]-b[2])+c*c+d*d-2*c*d*Math.cos(2*(a[0]/360-b[0]/360)*Math.PI)};goog.color.blend=function(a,b,c){c=goog.math.clamp(c,0,1);return[Math.round(c*a[0]+(1-c)*b[0]),Math.round(c*a[1]+(1-c)*b[1]),Math.round(c*a[2]+(1-c)*b[2])]};goog.color.darken=function(a,b){return goog.color.blend([0,0,0],a,b)}; +goog.color.lighten=function(a,b){return goog.color.blend([255,255,255],a,b)};goog.color.highContrast=function(a,b){for(var c=[],d=0;da[0]&&0<=a[1]&&256>a[1]&&0<=a[2]&&256>a[2]&&0<=a[3]&&1>=a[3]};ol.color.normalize=function(a,b){var c=goog.isDef(b)?b:[];c[0]=goog.math.clamp(a[0]+0.5|0,0,255);c[1]=goog.math.clamp(a[1]+0.5|0,0,255);c[2]=goog.math.clamp(a[2]+0.5|0,0,255);c[3]=goog.math.clamp(a[3],0,1);return c}; +ol.color.returnOrUpdate=function(a,b){return goog.isDef(b)?(b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3],b):a};ol.color.toString=function(a){var b=a[0];b!=(b|0)&&(b=b+0.5|0);var c=a[1];c!=(c|0)&&(c=c+0.5|0);var d=a[2];d!=(d|0)&&(d=d+0.5|0);return"rgba("+b+","+c+","+d+","+a[3]+")"};ol.color.transform=function(a,b,c){c=goog.isDef(c)?c:[];c=goog.vec.Mat4.multVec3(b,a,c);c[3]=a[3];return ol.color.normalize(c,c)}; +ol.color.stringOrColorEquals=function(a,b){if(a===b||a==b)return!0;goog.isString(a)&&(a=ol.color.fromString(a));goog.isString(b)&&(b=ol.color.fromString(b));return ol.color.equals(a,b)};ol.render.canvas={};ol.render.canvas.defaultFont="10px sans-serif";ol.render.canvas.defaultFillStyle=ol.color.fromString("black");ol.render.canvas.defaultLineCap="round";ol.render.canvas.defaultLineDash=[];ol.render.canvas.defaultLineJoin="round";ol.render.canvas.defaultMiterLimit=10;ol.render.canvas.defaultStrokeStyle=[0,0,0,1];ol.render.canvas.defaultTextAlign="center";ol.render.canvas.defaultTextBaseline="middle";ol.render.canvas.defaultLineWidth=1;ol.style={};ol.style.Fill=function(a){a=goog.isDef(a)?a:{};this.color_=goog.isDef(a.color)?a.color:null};ol.style.Fill.prototype.getColor=function(){return this.color_};ol.style.ImageState={IDLE:0,LOADING:1,LOADED:2,ERROR:3};ol.style.Image=function(a){this.opacity_=a.opacity;this.rotateWithView_=a.rotateWithView;this.rotation_=a.rotation;this.scale_=a.scale;this.snapToPixel_=a.snapToPixel};ol.style.Image.prototype.getOpacity=function(){return this.opacity_};ol.style.Image.prototype.getRotateWithView=function(){return this.rotateWithView_};ol.style.Image.prototype.getRotation=function(){return this.rotation_};ol.style.Image.prototype.getScale=function(){return this.scale_}; +ol.style.Image.prototype.getSnapToPixel=function(){return this.snapToPixel_};ol.style.Stroke=function(a){a=goog.isDef(a)?a:{};this.color_=goog.isDef(a.color)?a.color:null;this.lineCap_=a.lineCap;this.lineDash_=goog.isDef(a.lineDash)?a.lineDash:null;this.lineJoin_=a.lineJoin;this.miterLimit_=a.miterLimit;this.width_=a.width};ol.style.Stroke.prototype.getColor=function(){return this.color_};ol.style.Stroke.prototype.getLineCap=function(){return this.lineCap_};ol.style.Stroke.prototype.getLineDash=function(){return this.lineDash_};ol.style.Stroke.prototype.getLineJoin=function(){return this.lineJoin_}; +ol.style.Stroke.prototype.getMiterLimit=function(){return this.miterLimit_};ol.style.Stroke.prototype.getWidth=function(){return this.width_};ol.style.Circle=function(a){a=goog.isDef(a)?a:{};this.canvas_=goog.dom.createElement(goog.dom.TagName.CANVAS);this.hitDetectionCanvas_=null;this.fill_=goog.isDef(a.fill)?a.fill:null;this.radius_=a.radius;this.stroke_=goog.isDef(a.stroke)?a.stroke:null;a=this.render_();this.anchor_=[a/2,a/2];this.size_=[a,a];ol.style.Image.call(this,{opacity:1,rotateWithView:!1,rotation:0,scale:1,snapToPixel:void 0})};goog.inherits(ol.style.Circle,ol.style.Image);ol.style.Circle.prototype.getAnchor=function(){return this.anchor_}; +ol.style.Circle.prototype.getFill=function(){return this.fill_};ol.style.Circle.prototype.getHitDetectionImage=function(a){return this.hitDetectionCanvas_};ol.style.Circle.prototype.getImage=function(a){return this.canvas_};ol.style.Circle.prototype.getImageState=function(){return ol.style.ImageState.LOADED};ol.style.Circle.prototype.getRadius=function(){return this.radius_};ol.style.Circle.prototype.getSize=function(){return this.size_};ol.style.Circle.prototype.getStroke=function(){return this.stroke_}; +ol.style.Circle.prototype.listenImageChange=goog.nullFunction;ol.style.Circle.prototype.load=goog.nullFunction;ol.style.Circle.prototype.unlistenImageChange=goog.nullFunction; +ol.style.Circle.prototype.render_=function(){var a=this.canvas_,b,c;goog.isNull(this.stroke_)?c=0:(b=ol.color.asString(this.stroke_.getColor()),c=this.stroke_.getWidth(),goog.isDef(c)||(c=ol.render.canvas.defaultLineWidth));var d=2*(this.radius_+c)+1;a.height=d;a.width=d;var e=a.getContext("2d");e.arc(d/2,d/2,this.radius_,0,2*Math.PI,!0);goog.isNull(this.fill_)||(e.fillStyle=ol.color.asString(this.fill_.getColor()),e.fill());goog.isNull(this.stroke_)||(e.strokeStyle=b,e.lineWidth=c,e.stroke());goog.isNull(this.fill_)? +(a=this.hitDetectionCanvas_=goog.dom.createElement(goog.dom.TagName.CANVAS),a.height=d,a.width=d,e=a.getContext("2d"),e.arc(d/2,d/2,this.radius_,0,2*Math.PI,!0),e.fillStyle=ol.render.canvas.defaultFillStyle,e.fill(),goog.isNull(this.stroke_)||(e.strokeStyle=b,e.lineWidth=c,e.stroke())):this.hitDetectionCanvas_=a;return d};ol.style.Style=function(a){a=goog.isDef(a)?a:{};this.fill_=goog.isDef(a.fill)?a.fill:null;this.image_=goog.isDef(a.image)?a.image:null;this.stroke_=goog.isDef(a.stroke)?a.stroke:null;this.text_=goog.isDef(a.text)?a.text:null;this.zIndex_=a.zIndex};ol.style.Style.prototype.getFill=function(){return this.fill_};ol.style.Style.prototype.getImage=function(){return this.image_};ol.style.Style.prototype.getStroke=function(){return this.stroke_};ol.style.Style.prototype.getText=function(){return this.text_}; +ol.style.Style.prototype.getZIndex=function(){return this.zIndex_};ol.feature={};ol.Feature=function(a){ol.Object.call(this);this.id_=void 0;this.geometryName_="geometry";this.style_=null;this.styleFunction_=void 0;this.geometryChangeKey_=null;goog.events.listen(this,ol.Object.getChangeEventType(this.geometryName_),this.handleGeometryChanged_,!1,this);goog.isDefAndNotNull(a)?a instanceof ol.geom.Geometry?this.setGeometry(a):this.setValues(a):this.setGeometry(null)};goog.inherits(ol.Feature,ol.Object);ol.Feature.prototype.getGeometry=function(){return this.get(this.geometryName_)}; +goog.exportProperty(ol.Feature.prototype,"getGeometry",ol.Feature.prototype.getGeometry);ol.Feature.prototype.getId=function(){return this.id_};ol.Feature.prototype.getGeometryName=function(){return this.geometryName_};ol.Feature.prototype.getStyle=function(){return this.style_};ol.Feature.prototype.getStyleFunction=function(){return this.styleFunction_};ol.Feature.prototype.handleGeometryChange_=function(){this.dispatchChangeEvent()}; +ol.Feature.prototype.handleGeometryChanged_=function(){goog.isNull(this.geometryChangeKey_)||(goog.events.unlistenByKey(this.geometryChangeKey_),this.geometryChangeKey_=null);var a=this.getGeometry();goog.isDefAndNotNull(a)&&(this.geometryChangeKey_=goog.events.listen(a,goog.events.EventType.CHANGE,this.handleGeometryChange_,!1,this));this.dispatchChangeEvent()};ol.Feature.prototype.setGeometry=function(a){this.set(this.geometryName_,a)};goog.exportProperty(ol.Feature.prototype,"setGeometry",ol.Feature.prototype.setGeometry); +ol.Feature.prototype.setStyle=function(a){this.style_=a;this.styleFunction_=ol.feature.createFeatureStyleFunction(a);this.dispatchChangeEvent()};ol.Feature.prototype.setId=function(a){this.id_=a};ol.Feature.prototype.setGeometryName=function(a){goog.events.unlisten(this,ol.Object.getChangeEventType(this.geometryName_),this.handleGeometryChanged_,!1,this);this.geometryName_=a;goog.events.listen(this,ol.Object.getChangeEventType(this.geometryName_),this.handleGeometryChanged_,!1,this);this.handleGeometryChanged_()}; +ol.feature.defaultFeatureStyleFunction=function(){var a=new ol.style.Fill({color:"rgba(255,255,255,0.4)"}),b=new ol.style.Stroke({color:"#3399CC",width:1.25}),c=[new ol.style.Style({image:new ol.style.Circle({fill:a,stroke:b,radius:5}),fill:a,stroke:b})];return function(a){return c}}();ol.feature.defaultStyleFunction=function(a,b){var c=a.getStyleFunction();goog.isDef(c)||(c=ol.feature.defaultFeatureStyleFunction);return c.call(a,b)}; +ol.feature.createFeatureStyleFunction=function(a){goog.isFunction(a)||(a=goog.isArray(a)?a:[a],a=goog.functions.constant(a));return a};ol.feature.createStyleFunction=function(a){goog.isFunction(a)||(a=goog.isArray(a)?a:[a],a=goog.functions.constant(a));return a};ol.FeatureOverlay=function(a){a=goog.isDef(a)?a:{};this.style_=this.postComposeListenerKey_=this.map_=this.featureChangeListenerKeys_=this.featuresListenerKeys_=this.features_=null;this.styleFunction_=goog.isDef(a.style)?ol.feature.createStyleFunction(a.style):void 0;goog.isDef(a.features)?goog.isArray(a.features)?this.setFeatures(new ol.Collection(goog.array.clone(a.features))):this.setFeatures(a.features):this.setFeatures(new ol.Collection);goog.isDef(a.map)&&this.setMap(a.map)}; +ol.FeatureOverlay.prototype.addFeature=function(a){this.features_.push(a)};ol.FeatureOverlay.prototype.getFeatures=function(){return this.features_};ol.FeatureOverlay.prototype.handleFeatureChange_=function(){this.render_()};ol.FeatureOverlay.prototype.handleFeaturesAdd_=function(a){a=a.element;this.featureChangeListenerKeys_[goog.getUid(a).toString()]=goog.events.listen(a,goog.events.EventType.CHANGE,this.handleFeatureChange_,!1,this);this.render_()}; +ol.FeatureOverlay.prototype.handleFeaturesRemove_=function(a){a=goog.getUid(a.element).toString();goog.events.unlistenByKey(this.featureChangeListenerKeys_[a]);delete this.featureChangeListenerKeys_[a];this.render_()}; +ol.FeatureOverlay.prototype.handleMapPostCompose_=function(a){if(!goog.isNull(this.features_)&&goog.isDef(this.styleFunction_)){var b=a.frameState.view2DState.resolution,c=a.vectorContext,d,e,f;this.features_.forEach(function(a){f=this.styleFunction_(a,b);if(goog.isDefAndNotNull(f))for(e=f.length,d=0;d=a.length)throw goog.iter.StopIteration;if(b in a)return a[b++];b++}};return c}throw Error("Not implemented");}; +goog.iter.forEach=function(a,b,c){if(goog.isArrayLike(a))try{goog.array.forEach(a,b,c)}catch(d){if(d!==goog.iter.StopIteration)throw d;}else{a=goog.iter.toIterator(a);try{for(;;)b.call(c,a.next(),void 0,a)}catch(e){if(e!==goog.iter.StopIteration)throw e;}}};goog.iter.filter=function(a,b,c){var d=goog.iter.toIterator(a);a=new goog.iter.Iterator;a.next=function(){for(;;){var a=d.next();if(b.call(c,a,void 0,d))return a}};return a}; +goog.iter.range=function(a,b,c){var d=0,e=a,f=c||1;1=e||0>f&&d<=e)throw goog.iter.StopIteration;var a=d;d+=f;return a};return g};goog.iter.join=function(a,b){return goog.iter.toArray(a).join(b)};goog.iter.map=function(a,b,c){var d=goog.iter.toIterator(a);a=new goog.iter.Iterator;a.next=function(){for(;;){var a=d.next();return b.call(c,a,void 0,d)}};return a}; +goog.iter.reduce=function(a,b,c,d){var e=c;goog.iter.forEach(a,function(a){e=b.call(d,e,a)});return e};goog.iter.some=function(a,b,c){a=goog.iter.toIterator(a);try{for(;;)if(b.call(c,a.next(),void 0,a))return!0}catch(d){if(d!==goog.iter.StopIteration)throw d;}return!1};goog.iter.every=function(a,b,c){a=goog.iter.toIterator(a);try{for(;;)if(!b.call(c,a.next(),void 0,a))return!1}catch(d){if(d!==goog.iter.StopIteration)throw d;}return!0}; +goog.iter.chain=function(a){var b=arguments,c=b.length,d=0,e=new goog.iter.Iterator;e.next=function(){try{if(d>=c)throw goog.iter.StopIteration;return goog.iter.toIterator(b[d]).next()}catch(a){if(a!==goog.iter.StopIteration||d>=c)throw a;d++;return this.next()}};return e};goog.iter.dropWhile=function(a,b,c){var d=goog.iter.toIterator(a);a=new goog.iter.Iterator;var e=!0;a.next=function(){for(;;){var a=d.next();if(!e||!b.call(c,a,void 0,d))return e=!1,a}};return a}; +goog.iter.takeWhile=function(a,b,c){var d=goog.iter.toIterator(a);a=new goog.iter.Iterator;var e=!0;a.next=function(){for(;;)if(e){var a=d.next();if(b.call(c,a,void 0,d))return a;e=!1}else throw goog.iter.StopIteration;};return a};goog.iter.toArray=function(a){if(goog.isArrayLike(a))return goog.array.toArray(a);a=goog.iter.toIterator(a);var b=[];goog.iter.forEach(a,function(a){b.push(a)});return b}; +goog.iter.equals=function(a,b){a=goog.iter.toIterator(a);b=goog.iter.toIterator(b);var c,d;try{for(;;){c=d=!1;var e=a.next();c=!0;var f=b.next();d=!0;if(e!=f)break}}catch(g){if(g!==goog.iter.StopIteration)throw g;if(c&&!d)return!1;if(!d)try{b.next()}catch(h){if(h!==goog.iter.StopIteration)throw h;return!0}}return!1};goog.iter.nextOrValue=function(a,b){try{return goog.iter.toIterator(a).next()}catch(c){if(c!=goog.iter.StopIteration)throw c;return b}}; +goog.iter.product=function(a){if(goog.array.some(arguments,function(a){return!a.length})||!arguments.length)return new goog.iter.Iterator;var b=new goog.iter.Iterator,c=arguments,d=goog.array.repeat(0,c.length);b.next=function(){if(d){for(var a=goog.array.map(d,function(a,b){return c[b][a]}),b=d.length-1;0<=b;b--){if(d[b]2*this.count_&&this.cleanupKeysArray_(),!0):!1}; +goog.structs.Map.prototype.cleanupKeysArray_=function(){if(this.count_!=this.keys_.length){for(var a=0,b=0;a=c.length)throw goog.iter.StopIteration;var g=c[b++];return a?g:d[g]}};return g}; +goog.structs.Map.hasKey_=function(a,b){return Object.prototype.hasOwnProperty.call(a,b)};goog.uri={};goog.uri.utils={};goog.uri.utils.CharCode_={AMPERSAND:38,EQUAL:61,HASH:35,QUESTION:63};goog.uri.utils.buildFromEncodedParts=function(a,b,c,d,e,f,g){var h="";a&&(h+=a+":");c&&(h+="//",b&&(h+=b+"@"),h+=c,d&&(h+=":"+d));e&&(h+=e);f&&(h+="?"+f);g&&(h+="#"+g);return h};goog.uri.utils.splitRe_=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?\x3d[/#?]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#(.*))?$"); +goog.uri.utils.ComponentIndex={SCHEME:1,USER_INFO:2,DOMAIN:3,PORT:4,PATH:5,QUERY_DATA:6,FRAGMENT:7};goog.uri.utils.split=function(a){goog.uri.utils.phishingProtection_();return a.match(goog.uri.utils.splitRe_)};goog.uri.utils.needsPhishingProtection_=goog.userAgent.WEBKIT; +goog.uri.utils.phishingProtection_=function(){if(goog.uri.utils.needsPhishingProtection_){goog.uri.utils.needsPhishingProtection_=!1;var a=goog.global.location;if(a){var b=a.href;if(b&&(b=goog.uri.utils.getDomain(b))&&b!=a.hostname)throw goog.uri.utils.needsPhishingProtection_=!0,Error();}}};goog.uri.utils.decodeIfPossible_=function(a){return a&&decodeURIComponent(a)};goog.uri.utils.getComponentByIndex_=function(a,b){return goog.uri.utils.split(b)[a]||null}; +goog.uri.utils.getScheme=function(a){return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.SCHEME,a)};goog.uri.utils.getEffectiveScheme=function(a){a=goog.uri.utils.getScheme(a);!a&&self.location&&(a=self.location.protocol,a=a.substr(0,a.length-1));return a?a.toLowerCase():""};goog.uri.utils.getUserInfoEncoded=function(a){return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.USER_INFO,a)};goog.uri.utils.getUserInfo=function(a){return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getUserInfoEncoded(a))}; +goog.uri.utils.getDomainEncoded=function(a){return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.DOMAIN,a)};goog.uri.utils.getDomain=function(a){return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getDomainEncoded(a))};goog.uri.utils.getPort=function(a){return Number(goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PORT,a))||null};goog.uri.utils.getPathEncoded=function(a){return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PATH,a)}; +goog.uri.utils.getPath=function(a){return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getPathEncoded(a))};goog.uri.utils.getQueryData=function(a){return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.QUERY_DATA,a)};goog.uri.utils.getFragmentEncoded=function(a){var b=a.indexOf("#");return 0>b?null:a.substr(b+1)};goog.uri.utils.setFragmentEncoded=function(a,b){return goog.uri.utils.removeFragment(a)+(b?"#"+b:"")};goog.uri.utils.getFragment=function(a){return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getFragmentEncoded(a))}; +goog.uri.utils.getHost=function(a){a=goog.uri.utils.split(a);return goog.uri.utils.buildFromEncodedParts(a[goog.uri.utils.ComponentIndex.SCHEME],a[goog.uri.utils.ComponentIndex.USER_INFO],a[goog.uri.utils.ComponentIndex.DOMAIN],a[goog.uri.utils.ComponentIndex.PORT])};goog.uri.utils.getPathAndAfter=function(a){a=goog.uri.utils.split(a);return goog.uri.utils.buildFromEncodedParts(null,null,null,null,a[goog.uri.utils.ComponentIndex.PATH],a[goog.uri.utils.ComponentIndex.QUERY_DATA],a[goog.uri.utils.ComponentIndex.FRAGMENT])}; +goog.uri.utils.removeFragment=function(a){var b=a.indexOf("#");return 0>b?a:a.substr(0,b)};goog.uri.utils.haveSameDomain=function(a,b){var c=goog.uri.utils.split(a),d=goog.uri.utils.split(b);return c[goog.uri.utils.ComponentIndex.DOMAIN]==d[goog.uri.utils.ComponentIndex.DOMAIN]&&c[goog.uri.utils.ComponentIndex.SCHEME]==d[goog.uri.utils.ComponentIndex.SCHEME]&&c[goog.uri.utils.ComponentIndex.PORT]==d[goog.uri.utils.ComponentIndex.PORT]}; +goog.uri.utils.assertNoFragmentsOrQueries_=function(a){if(goog.DEBUG&&(0<=a.indexOf("#")||0<=a.indexOf("?")))throw Error("goog.uri.utils: Fragment or query identifiers are not supported: ["+a+"]");};goog.uri.utils.appendQueryData_=function(a){if(a[1]){var b=a[0],c=b.indexOf("#");0<=c&&(a.push(b.substr(c)),a[0]=b=b.substr(0,c));c=b.indexOf("?");0>c?a[1]="?":c==b.length-1&&(a[1]=void 0)}return a.join("")}; +goog.uri.utils.appendKeyValuePairs_=function(a,b,c){if(goog.isArray(b))for(var d=0;dd)return null;var e=a.indexOf("\x26",d);if(0>e||e>c)e=c;d+=b.length+1;return goog.string.urlDecode(a.substr(d,e-d))};goog.uri.utils.getParamValues=function(a,b){for(var c=a.search(goog.uri.utils.hashOrEndRe_),d=0,e,f=[];0<=(e=goog.uri.utils.findParam_(a,d,b,c));){d=a.indexOf("\x26",e);if(0>d||d>c)d=c;e+=b.length+1;f.push(goog.string.urlDecode(a.substr(e,d-e)))}return f}; +goog.uri.utils.trailingQueryPunctuationRe_=/[?&]($|#)/;goog.uri.utils.removeParam=function(a,b){for(var c=a.search(goog.uri.utils.hashOrEndRe_),d=0,e,f=[];0<=(e=goog.uri.utils.findParam_(a,d,b,c));)f.push(a.substring(d,e)),d=Math.min(a.indexOf("\x26",e)+1||c,c);f.push(a.substr(d));return f.join("").replace(goog.uri.utils.trailingQueryPunctuationRe_,"$1")};goog.uri.utils.setParam=function(a,b,c){return goog.uri.utils.appendParam(goog.uri.utils.removeParam(a,b),b,c)}; +goog.uri.utils.appendPath=function(a,b){goog.uri.utils.assertNoFragmentsOrQueries_(a);goog.string.endsWith(a,"/")&&(a=a.substr(0,a.length-1));goog.string.startsWith(b,"/")&&(b=b.substr(1));return goog.string.buildString(a,"/",b)};goog.uri.utils.StandardQueryParam={RANDOM:"zx"};goog.uri.utils.makeUnique=function(a){return goog.uri.utils.setParam(a,goog.uri.utils.StandardQueryParam.RANDOM,goog.string.getRandomString())};goog.Uri=function(a,b){var c;a instanceof goog.Uri?(this.ignoreCase_=goog.isDef(b)?b:a.getIgnoreCase(),this.setScheme(a.getScheme()),this.setUserInfo(a.getUserInfo()),this.setDomain(a.getDomain()),this.setPort(a.getPort()),this.setPath(a.getPath()),this.setQueryData(a.getQueryData().clone()),this.setFragment(a.getFragment())):a&&(c=goog.uri.utils.split(String(a)))?(this.ignoreCase_=!!b,this.setScheme(c[goog.uri.utils.ComponentIndex.SCHEME]||"",!0),this.setUserInfo(c[goog.uri.utils.ComponentIndex.USER_INFO]|| +"",!0),this.setDomain(c[goog.uri.utils.ComponentIndex.DOMAIN]||"",!0),this.setPort(c[goog.uri.utils.ComponentIndex.PORT]),this.setPath(c[goog.uri.utils.ComponentIndex.PATH]||"",!0),this.setQueryData(c[goog.uri.utils.ComponentIndex.QUERY_DATA]||"",!0),this.setFragment(c[goog.uri.utils.ComponentIndex.FRAGMENT]||"",!0)):(this.ignoreCase_=!!b,this.queryData_=new goog.Uri.QueryData(null,null,this.ignoreCase_))};goog.Uri.preserveParameterTypesCompatibilityFlag=!1;goog.Uri.RANDOM_PARAM=goog.uri.utils.StandardQueryParam.RANDOM; +goog.Uri.prototype.scheme_="";goog.Uri.prototype.userInfo_="";goog.Uri.prototype.domain_="";goog.Uri.prototype.port_=null;goog.Uri.prototype.path_="";goog.Uri.prototype.fragment_="";goog.Uri.prototype.isReadOnly_=!1;goog.Uri.prototype.ignoreCase_=!1; +goog.Uri.prototype.toString=function(){var a=[],b=this.getScheme();b&&a.push(goog.Uri.encodeSpecialChars_(b,goog.Uri.reDisallowedInSchemeOrUserInfo_),":");if(b=this.getDomain()){a.push("//");var c=this.getUserInfo();c&&a.push(goog.Uri.encodeSpecialChars_(c,goog.Uri.reDisallowedInSchemeOrUserInfo_),"@");a.push(goog.string.urlEncode(b));b=this.getPort();null!=b&&a.push(":",String(b))}if(b=this.getPath())this.hasDomain()&&"/"!=b.charAt(0)&&a.push("/"),a.push(goog.Uri.encodeSpecialChars_(b,"/"==b.charAt(0)? +goog.Uri.reDisallowedInAbsolutePath_:goog.Uri.reDisallowedInRelativePath_));(b=this.getEncodedQuery())&&a.push("?",b);(b=this.getFragment())&&a.push("#",goog.Uri.encodeSpecialChars_(b,goog.Uri.reDisallowedInFragment_));return a.join("")}; +goog.Uri.prototype.resolve=function(a){var b=this.clone(),c=a.hasScheme();c?b.setScheme(a.getScheme()):c=a.hasUserInfo();c?b.setUserInfo(a.getUserInfo()):c=a.hasDomain();c?b.setDomain(a.getDomain()):c=a.hasPort();var d=a.getPath();if(c)b.setPort(a.getPort());else if(c=a.hasPath()){if("/"!=d.charAt(0))if(this.hasDomain()&&!this.hasPath())d="/"+d;else{var e=b.getPath().lastIndexOf("/");-1!=e&&(d=b.getPath().substr(0,e+1)+d)}d=goog.Uri.removeDotSegments(d)}c?b.setPath(d):c=a.hasQuery();c?b.setQueryData(a.getDecodedQuery()): +c=a.hasFragment();c&&b.setFragment(a.getFragment());return b};goog.Uri.prototype.clone=function(){return new goog.Uri(this)};goog.Uri.prototype.getScheme=function(){return this.scheme_};goog.Uri.prototype.setScheme=function(a,b){this.enforceReadOnly();if(this.scheme_=b?goog.Uri.decodeOrEmpty_(a):a)this.scheme_=this.scheme_.replace(/:$/,"");return this};goog.Uri.prototype.hasScheme=function(){return!!this.scheme_};goog.Uri.prototype.getUserInfo=function(){return this.userInfo_}; +goog.Uri.prototype.setUserInfo=function(a,b){this.enforceReadOnly();this.userInfo_=b?goog.Uri.decodeOrEmpty_(a):a;return this};goog.Uri.prototype.hasUserInfo=function(){return!!this.userInfo_};goog.Uri.prototype.getDomain=function(){return this.domain_};goog.Uri.prototype.setDomain=function(a,b){this.enforceReadOnly();this.domain_=b?goog.Uri.decodeOrEmpty_(a):a;return this};goog.Uri.prototype.hasDomain=function(){return!!this.domain_};goog.Uri.prototype.getPort=function(){return this.port_}; +goog.Uri.prototype.setPort=function(a){this.enforceReadOnly();if(a){a=Number(a);if(isNaN(a)||0>a)throw Error("Bad port number "+a);this.port_=a}else this.port_=null;return this};goog.Uri.prototype.hasPort=function(){return null!=this.port_};goog.Uri.prototype.getPath=function(){return this.path_};goog.Uri.prototype.setPath=function(a,b){this.enforceReadOnly();this.path_=b?goog.Uri.decodeOrEmpty_(a):a;return this};goog.Uri.prototype.hasPath=function(){return!!this.path_}; +goog.Uri.prototype.hasQuery=function(){return""!==this.queryData_.toString()};goog.Uri.prototype.setQueryData=function(a,b){this.enforceReadOnly();a instanceof goog.Uri.QueryData?(this.queryData_=a,this.queryData_.setIgnoreCase(this.ignoreCase_)):(b||(a=goog.Uri.encodeSpecialChars_(a,goog.Uri.reDisallowedInQuery_)),this.queryData_=new goog.Uri.QueryData(a,null,this.ignoreCase_));return this};goog.Uri.prototype.setQuery=function(a,b){return this.setQueryData(a,b)}; +goog.Uri.prototype.getEncodedQuery=function(){return this.queryData_.toString()};goog.Uri.prototype.getDecodedQuery=function(){return this.queryData_.toDecodedString()};goog.Uri.prototype.getQueryData=function(){return this.queryData_};goog.Uri.prototype.getQuery=function(){return this.getEncodedQuery()};goog.Uri.prototype.setParameterValue=function(a,b){this.enforceReadOnly();this.queryData_.set(a,b);return this}; +goog.Uri.prototype.setParameterValues=function(a,b){this.enforceReadOnly();goog.isArray(b)||(b=[String(b)]);this.queryData_.setValues(a,b);return this};goog.Uri.prototype.getParameterValues=function(a){return this.queryData_.getValues(a)};goog.Uri.prototype.getParameterValue=function(a){return this.queryData_.get(a)};goog.Uri.prototype.getFragment=function(){return this.fragment_};goog.Uri.prototype.setFragment=function(a,b){this.enforceReadOnly();this.fragment_=b?goog.Uri.decodeOrEmpty_(a):a;return this}; +goog.Uri.prototype.hasFragment=function(){return!!this.fragment_};goog.Uri.prototype.hasSameDomainAs=function(a){return(!this.hasDomain()&&!a.hasDomain()||this.getDomain()==a.getDomain())&&(!this.hasPort()&&!a.hasPort()||this.getPort()==a.getPort())};goog.Uri.prototype.makeUnique=function(){this.enforceReadOnly();this.setParameterValue(goog.Uri.RANDOM_PARAM,goog.string.getRandomString());return this};goog.Uri.prototype.removeParameter=function(a){this.enforceReadOnly();this.queryData_.remove(a);return this}; +goog.Uri.prototype.setReadOnly=function(a){this.isReadOnly_=a;return this};goog.Uri.prototype.isReadOnly=function(){return this.isReadOnly_};goog.Uri.prototype.enforceReadOnly=function(){if(this.isReadOnly_)throw Error("Tried to modify a read-only Uri");};goog.Uri.prototype.setIgnoreCase=function(a){this.ignoreCase_=a;this.queryData_&&this.queryData_.setIgnoreCase(a);return this};goog.Uri.prototype.getIgnoreCase=function(){return this.ignoreCase_}; +goog.Uri.parse=function(a,b){return a instanceof goog.Uri?a.clone():new goog.Uri(a,b)};goog.Uri.create=function(a,b,c,d,e,f,g,h){h=new goog.Uri(null,h);a&&h.setScheme(a);b&&h.setUserInfo(b);c&&h.setDomain(c);d&&h.setPort(d);e&&h.setPath(e);f&&h.setQueryData(f);g&&h.setFragment(g);return h};goog.Uri.resolve=function(a,b){a instanceof goog.Uri||(a=goog.Uri.parse(a));b instanceof goog.Uri||(b=goog.Uri.parse(b));return a.resolve(b)}; +goog.Uri.removeDotSegments=function(a){if(".."==a||"."==a)return"";if(goog.string.contains(a,"./")||goog.string.contains(a,"/.")){var b=goog.string.startsWith(a,"/");a=a.split("/");for(var c=[],d=0;d>4&15).toString(16)+(a&15).toString(16)};goog.Uri.reDisallowedInSchemeOrUserInfo_=/[#\/\?@]/g;goog.Uri.reDisallowedInRelativePath_=/[\#\?:]/g;goog.Uri.reDisallowedInAbsolutePath_=/[\#\?]/g;goog.Uri.reDisallowedInQuery_=/[\#\?@]/g;goog.Uri.reDisallowedInFragment_=/#/g; +goog.Uri.haveSameDomain=function(a,b){var c=goog.uri.utils.split(a),d=goog.uri.utils.split(b);return c[goog.uri.utils.ComponentIndex.DOMAIN]==d[goog.uri.utils.ComponentIndex.DOMAIN]&&c[goog.uri.utils.ComponentIndex.PORT]==d[goog.uri.utils.ComponentIndex.PORT]};goog.Uri.QueryData=function(a,b,c){this.encodedQuery_=a||null;this.ignoreCase_=!!c}; +goog.Uri.QueryData.prototype.ensureKeyMapInitialized_=function(){if(!this.keyMap_&&(this.keyMap_=new goog.structs.Map,this.count_=0,this.encodedQuery_))for(var a=this.encodedQuery_.split("\x26"),b=0;bb)return!1;!(a instanceof goog.structs.Set)&&5=goog.events.KeyCodes.F1&&a.keyCode<=goog.events.KeyCodes.F12)return!1;switch(a.keyCode){case goog.events.KeyCodes.ALT:case goog.events.KeyCodes.CAPS_LOCK:case goog.events.KeyCodes.CONTEXT_MENU:case goog.events.KeyCodes.CTRL:case goog.events.KeyCodes.DOWN:case goog.events.KeyCodes.END:case goog.events.KeyCodes.ESC:case goog.events.KeyCodes.HOME:case goog.events.KeyCodes.INSERT:case goog.events.KeyCodes.LEFT:case goog.events.KeyCodes.MAC_FF_META:case goog.events.KeyCodes.META:case goog.events.KeyCodes.NUMLOCK:case goog.events.KeyCodes.NUM_CENTER:case goog.events.KeyCodes.PAGE_DOWN:case goog.events.KeyCodes.PAGE_UP:case goog.events.KeyCodes.PAUSE:case goog.events.KeyCodes.PHANTOM:case goog.events.KeyCodes.PRINT_SCREEN:case goog.events.KeyCodes.RIGHT:case goog.events.KeyCodes.SCROLL_LOCK:case goog.events.KeyCodes.SHIFT:case goog.events.KeyCodes.UP:case goog.events.KeyCodes.WIN_KEY:case goog.events.KeyCodes.WIN_KEY_RIGHT:return!1;case goog.events.KeyCodes.WIN_KEY_FF_LINUX:return!goog.userAgent.GECKO; +default:return a.keyCodegoog.events.KeyCodes.LAST_MEDIA_KEY}}; +goog.events.KeyCodes.firesKeyPressEvent=function(a,b,c,d,e){if(!(goog.userAgent.IE||goog.userAgent.WEBKIT&&goog.userAgent.isVersionOrHigher("525")))return!0;if(goog.userAgent.MAC&&e)return goog.events.KeyCodes.isCharacterKey(a);if(e&&!d||!c&&(b==goog.events.KeyCodes.CTRL||b==goog.events.KeyCodes.ALT||goog.userAgent.MAC&&b==goog.events.KeyCodes.META))return!1;if(goog.userAgent.WEBKIT&&d&&c)switch(a){case goog.events.KeyCodes.BACKSLASH:case goog.events.KeyCodes.OPEN_SQUARE_BRACKET:case goog.events.KeyCodes.CLOSE_SQUARE_BRACKET:case goog.events.KeyCodes.TILDE:case goog.events.KeyCodes.SEMICOLON:case goog.events.KeyCodes.DASH:case goog.events.KeyCodes.EQUALS:case goog.events.KeyCodes.COMMA:case goog.events.KeyCodes.PERIOD:case goog.events.KeyCodes.SLASH:case goog.events.KeyCodes.APOSTROPHE:case goog.events.KeyCodes.SINGLE_QUOTE:return!1}if(goog.userAgent.IE&& +d&&b==a)return!1;switch(a){case goog.events.KeyCodes.ENTER:return!(goog.userAgent.IE&&goog.userAgent.isDocumentModeOrHigher(9));case goog.events.KeyCodes.ESC:return!goog.userAgent.WEBKIT}return goog.events.KeyCodes.isCharacterKey(a)}; +goog.events.KeyCodes.isCharacterKey=function(a){if(a>=goog.events.KeyCodes.ZERO&&a<=goog.events.KeyCodes.NINE||a>=goog.events.KeyCodes.NUM_ZERO&&a<=goog.events.KeyCodes.NUM_MULTIPLY||a>=goog.events.KeyCodes.A&&a<=goog.events.KeyCodes.Z||goog.userAgent.WEBKIT&&0==a)return!0;switch(a){case goog.events.KeyCodes.SPACE:case goog.events.KeyCodes.QUESTION_MARK:case goog.events.KeyCodes.NUM_PLUS:case goog.events.KeyCodes.NUM_MINUS:case goog.events.KeyCodes.NUM_PERIOD:case goog.events.KeyCodes.NUM_DIVISION:case goog.events.KeyCodes.SEMICOLON:case goog.events.KeyCodes.FF_SEMICOLON:case goog.events.KeyCodes.DASH:case goog.events.KeyCodes.EQUALS:case goog.events.KeyCodes.FF_EQUALS:case goog.events.KeyCodes.COMMA:case goog.events.KeyCodes.PERIOD:case goog.events.KeyCodes.SLASH:case goog.events.KeyCodes.APOSTROPHE:case goog.events.KeyCodes.SINGLE_QUOTE:case goog.events.KeyCodes.OPEN_SQUARE_BRACKET:case goog.events.KeyCodes.BACKSLASH:case goog.events.KeyCodes.CLOSE_SQUARE_BRACKET:return!0; +default:return!1}};goog.events.KeyCodes.normalizeGeckoKeyCode=function(a){switch(a){case goog.events.KeyCodes.FF_EQUALS:return goog.events.KeyCodes.EQUALS;case goog.events.KeyCodes.FF_SEMICOLON:return goog.events.KeyCodes.SEMICOLON;case goog.events.KeyCodes.MAC_FF_META:return goog.events.KeyCodes.META;case goog.events.KeyCodes.WIN_KEY_FF_LINUX:return goog.events.KeyCodes.WIN_KEY;default:return a}};goog.events.KeyHandler=function(a,b){goog.events.EventTarget.call(this);a&&this.attach(a,b)};goog.inherits(goog.events.KeyHandler,goog.events.EventTarget);goog.events.KeyHandler.prototype.element_=null;goog.events.KeyHandler.prototype.keyPressKey_=null;goog.events.KeyHandler.prototype.keyDownKey_=null;goog.events.KeyHandler.prototype.keyUpKey_=null;goog.events.KeyHandler.prototype.lastKey_=-1;goog.events.KeyHandler.prototype.keyCode_=-1;goog.events.KeyHandler.prototype.altKey_=!1; +goog.events.KeyHandler.EventType={KEY:"key"}; +goog.events.KeyHandler.safariKey_={3:goog.events.KeyCodes.ENTER,12:goog.events.KeyCodes.NUMLOCK,63232:goog.events.KeyCodes.UP,63233:goog.events.KeyCodes.DOWN,63234:goog.events.KeyCodes.LEFT,63235:goog.events.KeyCodes.RIGHT,63236:goog.events.KeyCodes.F1,63237:goog.events.KeyCodes.F2,63238:goog.events.KeyCodes.F3,63239:goog.events.KeyCodes.F4,63240:goog.events.KeyCodes.F5,63241:goog.events.KeyCodes.F6,63242:goog.events.KeyCodes.F7,63243:goog.events.KeyCodes.F8,63244:goog.events.KeyCodes.F9,63245:goog.events.KeyCodes.F10, +63246:goog.events.KeyCodes.F11,63247:goog.events.KeyCodes.F12,63248:goog.events.KeyCodes.PRINT_SCREEN,63272:goog.events.KeyCodes.DELETE,63273:goog.events.KeyCodes.HOME,63275:goog.events.KeyCodes.END,63276:goog.events.KeyCodes.PAGE_UP,63277:goog.events.KeyCodes.PAGE_DOWN,63289:goog.events.KeyCodes.NUMLOCK,63302:goog.events.KeyCodes.INSERT}; +goog.events.KeyHandler.keyIdentifier_={Up:goog.events.KeyCodes.UP,Down:goog.events.KeyCodes.DOWN,Left:goog.events.KeyCodes.LEFT,Right:goog.events.KeyCodes.RIGHT,Enter:goog.events.KeyCodes.ENTER,F1:goog.events.KeyCodes.F1,F2:goog.events.KeyCodes.F2,F3:goog.events.KeyCodes.F3,F4:goog.events.KeyCodes.F4,F5:goog.events.KeyCodes.F5,F6:goog.events.KeyCodes.F6,F7:goog.events.KeyCodes.F7,F8:goog.events.KeyCodes.F8,F9:goog.events.KeyCodes.F9,F10:goog.events.KeyCodes.F10,F11:goog.events.KeyCodes.F11,F12:goog.events.KeyCodes.F12, +"U+007F":goog.events.KeyCodes.DELETE,Home:goog.events.KeyCodes.HOME,End:goog.events.KeyCodes.END,PageUp:goog.events.KeyCodes.PAGE_UP,PageDown:goog.events.KeyCodes.PAGE_DOWN,Insert:goog.events.KeyCodes.INSERT};goog.events.KeyHandler.USES_KEYDOWN_=goog.userAgent.IE||goog.userAgent.WEBKIT&&goog.userAgent.isVersionOrHigher("525");goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_=goog.userAgent.MAC&&goog.userAgent.GECKO; +goog.events.KeyHandler.prototype.handleKeyDown_=function(a){goog.userAgent.WEBKIT&&(this.lastKey_==goog.events.KeyCodes.CTRL&&!a.ctrlKey||this.lastKey_==goog.events.KeyCodes.ALT&&!a.altKey||goog.userAgent.MAC&&this.lastKey_==goog.events.KeyCodes.META&&!a.metaKey)&&(this.keyCode_=this.lastKey_=-1);-1==this.lastKey_&&(a.ctrlKey&&a.keyCode!=goog.events.KeyCodes.CTRL?this.lastKey_=goog.events.KeyCodes.CTRL:a.altKey&&a.keyCode!=goog.events.KeyCodes.ALT?this.lastKey_=goog.events.KeyCodes.ALT:a.metaKey&& +a.keyCode!=goog.events.KeyCodes.META&&(this.lastKey_=goog.events.KeyCodes.META));goog.events.KeyHandler.USES_KEYDOWN_&&!goog.events.KeyCodes.firesKeyPressEvent(a.keyCode,this.lastKey_,a.shiftKey,a.ctrlKey,a.altKey)?this.handleEvent(a):(this.keyCode_=goog.userAgent.GECKO?goog.events.KeyCodes.normalizeGeckoKeyCode(a.keyCode):a.keyCode,goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_&&(this.altKey_=a.altKey))};goog.events.KeyHandler.prototype.resetState=function(){this.keyCode_=this.lastKey_=-1}; +goog.events.KeyHandler.prototype.handleKeyup_=function(a){this.resetState();this.altKey_=a.altKey}; +goog.events.KeyHandler.prototype.handleEvent=function(a){var b=a.getBrowserEvent(),c,d,e=b.altKey;goog.userAgent.IE&&a.type==goog.events.EventType.KEYPRESS?(c=this.keyCode_,d=c!=goog.events.KeyCodes.ENTER&&c!=goog.events.KeyCodes.ESC?b.keyCode:0):goog.userAgent.WEBKIT&&a.type==goog.events.EventType.KEYPRESS?(c=this.keyCode_,d=0<=b.charCode&&63232>b.charCode&&goog.events.KeyCodes.isCharacterKey(c)?b.charCode:0):goog.userAgent.OPERA?(c=this.keyCode_,d=goog.events.KeyCodes.isCharacterKey(c)?b.keyCode: +0):(c=b.keyCode||this.keyCode_,d=b.charCode||0,goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_&&(e=this.altKey_),goog.userAgent.MAC&&(d==goog.events.KeyCodes.QUESTION_MARK&&c==goog.events.KeyCodes.WIN_KEY)&&(c=goog.events.KeyCodes.SLASH));var f=c,g=b.keyIdentifier;c?63232<=c&&c in goog.events.KeyHandler.safariKey_?f=goog.events.KeyHandler.safariKey_[c]:25==c&&a.shiftKey&&(f=9):g&&g in goog.events.KeyHandler.keyIdentifier_&&(f=goog.events.KeyHandler.keyIdentifier_[g]);a=f==this.lastKey_;this.lastKey_= +f;b=new goog.events.KeyEvent(f,d,a,b);b.altKey=e;this.dispatchEvent(b)};goog.events.KeyHandler.prototype.getElement=function(){return this.element_}; +goog.events.KeyHandler.prototype.attach=function(a,b){this.keyUpKey_&&this.detach();this.element_=a;this.keyPressKey_=goog.events.listen(this.element_,goog.events.EventType.KEYPRESS,this,b);this.keyDownKey_=goog.events.listen(this.element_,goog.events.EventType.KEYDOWN,this.handleKeyDown_,b,this);this.keyUpKey_=goog.events.listen(this.element_,goog.events.EventType.KEYUP,this.handleKeyup_,b,this)}; +goog.events.KeyHandler.prototype.detach=function(){this.keyPressKey_&&(goog.events.unlistenByKey(this.keyPressKey_),goog.events.unlistenByKey(this.keyDownKey_),goog.events.unlistenByKey(this.keyUpKey_),this.keyUpKey_=this.keyDownKey_=this.keyPressKey_=null);this.element_=null;this.keyCode_=this.lastKey_=-1};goog.events.KeyHandler.prototype.disposeInternal=function(){goog.events.KeyHandler.superClass_.disposeInternal.call(this);this.detach()}; +goog.events.KeyEvent=function(a,b,c,d){goog.events.BrowserEvent.call(this,d);this.type=goog.events.KeyHandler.EventType.KEY;this.keyCode=a;this.charCode=b;this.repeat=c};goog.inherits(goog.events.KeyEvent,goog.events.BrowserEvent);goog.dom.vendor={};goog.dom.vendor.getVendorJsPrefix=function(){return goog.userAgent.WEBKIT?"Webkit":goog.userAgent.GECKO?"Moz":goog.userAgent.IE?"ms":goog.userAgent.OPERA?"O":null};goog.dom.vendor.getVendorPrefix=function(){return goog.userAgent.WEBKIT?"-webkit":goog.userAgent.GECKO?"-moz":goog.userAgent.IE?"-ms":goog.userAgent.OPERA?"-o":null};goog.math.Box=function(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d};goog.math.Box.boundingBox=function(a){for(var b=new goog.math.Box(arguments[0].y,arguments[0].x,arguments[0].y,arguments[0].x),c=1;c=a.left&&b.right<=a.right&&b.top>=a.top&&b.bottom<=a.bottom:b.x>=a.left&&b.x<=a.right&&b.y>=a.top&&b.y<=a.bottom:!1};goog.math.Box.relativePositionX=function(a,b){return b.xa.right?b.x-a.right:0};goog.math.Box.relativePositionY=function(a,b){return b.ya.bottom?b.y-a.bottom:0}; +goog.math.Box.distance=function(a,b){var c=goog.math.Box.relativePositionX(a,b),d=goog.math.Box.relativePositionY(a,b);return Math.sqrt(c*c+d*d)};goog.math.Box.intersects=function(a,b){return a.left<=b.right&&b.left<=a.right&&a.top<=b.bottom&&b.top<=a.bottom};goog.math.Box.intersectsWithPadding=function(a,b,c){return a.left<=b.right+c&&b.left<=a.right+c&&a.top<=b.bottom+c&&b.top<=a.bottom+c}; +goog.math.Box.prototype.ceil=function(){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this};goog.math.Box.prototype.floor=function(){this.top=Math.floor(this.top);this.right=Math.floor(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.left);return this}; +goog.math.Box.prototype.round=function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this};goog.math.Box.prototype.translate=function(a,b){a instanceof goog.math.Coordinate?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,goog.isNumber(b)&&(this.top+=b,this.bottom+=b));return this}; +goog.math.Box.prototype.scale=function(a,b){var c=goog.isNumber(b)?b:a;this.left*=a;this.right*=a;this.top*=c;this.bottom*=c;return this};goog.math.Rect=function(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d};goog.math.Rect.prototype.clone=function(){return new goog.math.Rect(this.left,this.top,this.width,this.height)};goog.math.Rect.prototype.toBox=function(){return new goog.math.Box(this.top,this.left+this.width,this.top+this.height,this.left)};goog.math.Rect.createFromBox=function(a){return new goog.math.Rect(a.left,a.top,a.right-a.left,a.bottom-a.top)}; +goog.DEBUG&&(goog.math.Rect.prototype.toString=function(){return"("+this.left+", "+this.top+" - "+this.width+"w x "+this.height+"h)"});goog.math.Rect.equals=function(a,b){return a==b?!0:a&&b?a.left==b.left&&a.width==b.width&&a.top==b.top&&a.height==b.height:!1}; +goog.math.Rect.prototype.intersection=function(a){var b=Math.max(this.left,a.left),c=Math.min(this.left+this.width,a.left+a.width);if(b<=c){var d=Math.max(this.top,a.top);a=Math.min(this.top+this.height,a.top+a.height);if(d<=a)return this.left=b,this.top=d,this.width=c-b,this.height=a-d,!0}return!1}; +goog.math.Rect.intersection=function(a,b){var c=Math.max(a.left,b.left),d=Math.min(a.left+a.width,b.left+b.width);if(c<=d){var e=Math.max(a.top,b.top),f=Math.min(a.top+a.height,b.top+b.height);if(e<=f)return new goog.math.Rect(c,e,d-c,f-e)}return null};goog.math.Rect.intersects=function(a,b){return a.left<=b.left+b.width&&b.left<=a.left+a.width&&a.top<=b.top+b.height&&b.top<=a.top+a.height};goog.math.Rect.prototype.intersects=function(a){return goog.math.Rect.intersects(this,a)}; +goog.math.Rect.difference=function(a,b){var c=goog.math.Rect.intersection(a,b);if(!c||!c.height||!c.width)return[a.clone()];var c=[],d=a.top,e=a.height,f=a.left+a.width,g=a.top+a.height,h=b.left+b.width,k=b.top+b.height;b.top>a.top&&(c.push(new goog.math.Rect(a.left,a.top,a.width,b.top-a.top)),d=b.top,e-=b.top-a.top);ka.left&&c.push(new goog.math.Rect(a.left,d,b.left-a.left,e));h=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a.height:a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+this.height};goog.math.Rect.prototype.squaredDistance=function(a){var b=a.xa.clientWidth||a.scrollHeight>a.clientHeight||"fixed"==c||"absolute"==c||"relative"==c))return a;return null}; +goog.style.getVisibleRectForElement=function(a){for(var b=new goog.math.Box(0,Infinity,Infinity,0),c=goog.dom.getDomHelper(a),d=c.getDocument().body,e=c.getDocument().documentElement,f=c.getDocumentScrollElement();a=goog.style.getOffsetParent(a);)if(!(goog.userAgent.IE&&0==a.clientWidth||goog.userAgent.WEBKIT&&0==a.clientHeight&&a==d||a==d||a==e||"visible"==goog.style.getStyle_(a,"overflow"))){var g=goog.style.getPageOffset(a),h=goog.style.getClientLeftTop(a);g.x+=h.x;g.y+=h.y;b.top=Math.max(b.top, +g.y);b.right=Math.min(b.right,g.x+a.clientWidth);b.bottom=Math.min(b.bottom,g.y+a.clientHeight);b.left=Math.max(b.left,g.x)}d=f.scrollLeft;f=f.scrollTop;b.left=Math.max(b.left,d);b.top=Math.max(b.top,f);c=c.getViewportSize();b.right=Math.min(b.right,d+c.width);b.bottom=Math.min(b.bottom,f+c.height);return 0<=b.top&&0<=b.left&&b.bottom>b.top&&b.right>b.left?b:null}; +goog.style.getContainerOffsetToScrollInto=function(a,b,c){var d=goog.style.getPageOffset(a),e=goog.style.getPageOffset(b),f=goog.style.getBorderBox(b),g=d.x-e.x-f.left,d=d.y-e.y-f.top,e=b.clientWidth-a.offsetWidth;a=b.clientHeight-a.offsetHeight;f=b.scrollLeft;b=b.scrollTop;c?(f+=g-e/2,b+=d-a/2):(f+=Math.min(g,Math.max(g-e,0)),b+=Math.min(d,Math.max(d-a,0)));return new goog.math.Coordinate(f,b)}; +goog.style.scrollIntoContainerView=function(a,b,c){a=goog.style.getContainerOffsetToScrollInto(a,b,c);b.scrollLeft=a.x;b.scrollTop=a.y}; +goog.style.getClientLeftTop=function(a){if(goog.userAgent.GECKO&&!goog.userAgent.isVersionOrHigher("1.9")){var b=parseFloat(goog.style.getComputedStyle(a,"borderLeftWidth"));if(goog.style.isRightToLeft(a))var c=a.offsetWidth-a.clientWidth-b-parseFloat(goog.style.getComputedStyle(a,"borderRightWidth")),b=b+c;return new goog.math.Coordinate(b,parseFloat(goog.style.getComputedStyle(a,"borderTopWidth")))}return new goog.math.Coordinate(a.clientLeft,a.clientTop)}; +goog.style.getPageOffset=function(a){var b,c=goog.dom.getOwnerDocument(a),d=goog.style.getStyle_(a,"position"),e=!goog.style.GET_BOUNDING_CLIENT_RECT_ALWAYS_EXISTS&&goog.userAgent.GECKO&&c.getBoxObjectFor&&!a.getBoundingClientRect&&"absolute"==d&&(b=c.getBoxObjectFor(a))&&(0>b.screenX||0>b.screenY),f=new goog.math.Coordinate(0,0),g=goog.style.getClientViewportElement(c);if(a==g)return f;if(goog.style.GET_BOUNDING_CLIENT_RECT_ALWAYS_EXISTS||a.getBoundingClientRect)b=goog.style.getBoundingClientRect_(a), +a=goog.dom.getDomHelper(c).getDocumentScroll(),f.x=b.left+a.x,f.y=b.top+a.y;else if(c.getBoxObjectFor&&!e)b=c.getBoxObjectFor(a),a=c.getBoxObjectFor(g),f.x=b.screenX-a.screenX,f.y=b.screenY-a.screenY;else{b=a;do{f.x+=b.offsetLeft;f.y+=b.offsetTop;b!=a&&(f.x+=b.clientLeft||0,f.y+=b.clientTop||0);if(goog.userAgent.WEBKIT&&"fixed"==goog.style.getComputedPosition(b)){f.x+=c.body.scrollLeft;f.y+=c.body.scrollTop;break}b=b.offsetParent}while(b&&b!=a);if(goog.userAgent.OPERA||goog.userAgent.WEBKIT&&"absolute"== +d)f.y-=c.body.offsetTop;for(b=a;(b=goog.style.getOffsetParent(b))&&b!=c.body&&b!=g;)f.x-=b.scrollLeft,goog.userAgent.OPERA&&"TR"==b.tagName||(f.y-=b.scrollTop)}return f};goog.style.getPageOffsetLeft=function(a){return goog.style.getPageOffset(a).x};goog.style.getPageOffsetTop=function(a){return goog.style.getPageOffset(a).y}; +goog.style.getFramedPageOffset=function(a,b){var c=new goog.math.Coordinate(0,0),d=goog.dom.getWindow(goog.dom.getOwnerDocument(a)),e=a;do{var f=d==b?goog.style.getPageOffset(e):goog.style.getClientPositionForElement_(null);c.x+=f.x;c.y+=f.y}while(d&&d!=b&&(e=d.frameElement)&&(d=d.parent));return c}; +goog.style.translateRectForAnotherFrame=function(a,b,c){if(b.getDocument()!=c.getDocument()){var d=b.getDocument().body;c=goog.style.getFramedPageOffset(d,c.getWindow());c=goog.math.Coordinate.difference(c,goog.style.getPageOffset(d));goog.userAgent.IE&&!b.isCss1CompatMode()&&(c=goog.math.Coordinate.difference(c,b.getDocumentScroll()));a.left+=c.x;a.top+=c.y}}; +goog.style.getRelativePosition=function(a,b){var c=goog.style.getClientPosition(a),d=goog.style.getClientPosition(b);return new goog.math.Coordinate(c.x-d.x,c.y-d.y)}; +goog.style.getClientPositionForElement_=function(a){var b;if(goog.style.GET_BOUNDING_CLIENT_RECT_ALWAYS_EXISTS||a.getBoundingClientRect)b=goog.style.getBoundingClientRect_(a),b=new goog.math.Coordinate(b.left,b.top);else{b=goog.dom.getDomHelper(a).getDocumentScroll();var c=goog.style.getPageOffset(a);b=new goog.math.Coordinate(c.x-b.x,c.y-b.y)}return goog.userAgent.GECKO&&!goog.userAgent.isVersionOrHigher(12)?goog.math.Coordinate.sum(b,goog.style.getCssTranslation(a)):b}; +goog.style.getClientPosition=function(a){if(a.nodeType==goog.dom.NodeType.ELEMENT)return goog.style.getClientPositionForElement_(a);var b=goog.isFunction(a.getBrowserEvent),c=a;a.targetTouches?c=a.targetTouches[0]:b&&a.getBrowserEvent().targetTouches&&(c=a.getBrowserEvent().targetTouches[0]);return new goog.math.Coordinate(c.clientX,c.clientY)}; +goog.style.setPageOffset=function(a,b,c){var d=goog.style.getPageOffset(a);b instanceof goog.math.Coordinate&&(c=b.y,b=b.x);goog.style.setPosition(a,a.offsetLeft+(b-d.x),a.offsetTop+(c-d.y))};goog.style.setSize=function(a,b,c){if(b instanceof goog.math.Size)c=b.height,b=b.width;else if(void 0==c)throw Error("missing height argument");goog.style.setWidth(a,b);goog.style.setHeight(a,c)};goog.style.getPixelStyleValue_=function(a,b){"number"==typeof a&&(a=(b?Math.round(a):a)+"px");return a}; +goog.style.setHeight=function(a,b){a.style.height=goog.style.getPixelStyleValue_(b,!0)};goog.style.setWidth=function(a,b){a.style.width=goog.style.getPixelStyleValue_(b,!0)};goog.style.getSize=function(a){return goog.style.evaluateWithTemporaryDisplay_(goog.style.getSizeWithDisplay_,a)}; +goog.style.evaluateWithTemporaryDisplay_=function(a,b){if("none"!=goog.style.getStyle_(b,"display"))return a(b);var c=b.style,d=c.display,e=c.visibility,f=c.position;c.visibility="hidden";c.position="absolute";c.display="inline";var g=a(b);c.display=d;c.position=f;c.visibility=e;return g}; +goog.style.getSizeWithDisplay_=function(a){var b=a.offsetWidth,c=a.offsetHeight,d=goog.userAgent.WEBKIT&&!b&&!c;return goog.isDef(b)&&!d||!a.getBoundingClientRect?new goog.math.Size(b,c):(a=goog.style.getBoundingClientRect_(a),new goog.math.Size(a.right-a.left,a.bottom-a.top))};goog.style.getTransformedSize=function(a){if(!a.getBoundingClientRect)return null;a=goog.style.evaluateWithTemporaryDisplay_(goog.style.getBoundingClientRect_,a);return new goog.math.Size(a.right-a.left,a.bottom-a.top)}; +goog.style.getBounds=function(a){var b=goog.style.getPageOffset(a);a=goog.style.getSize(a);return new goog.math.Rect(b.x,b.y,a.width,a.height)};goog.style.toCamelCase=function(a){return goog.string.toCamelCase(String(a))};goog.style.toSelectorCase=function(a){return goog.string.toSelectorCase(a)}; +goog.style.getOpacity=function(a){var b=a.style;a="";"opacity"in b?a=b.opacity:"MozOpacity"in b?a=b.MozOpacity:"filter"in b&&(b=b.filter.match(/alpha\(opacity=([\d.]+)\)/))&&(a=String(b[1]/100));return""==a?a:Number(a)};goog.style.setOpacity=function(a,b){var c=a.style;"opacity"in c?c.opacity=b:"MozOpacity"in c?c.MozOpacity=b:"filter"in c&&(c.filter=""===b?"":"alpha(opacity\x3d"+100*b+")")}; +goog.style.setTransparentBackgroundImage=function(a,b){var c=a.style;goog.userAgent.IE&&!goog.userAgent.isVersionOrHigher("8")?c.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src\x3d"'+b+'", sizingMethod\x3d"crop")':(c.backgroundImage="url("+b+")",c.backgroundPosition="top left",c.backgroundRepeat="no-repeat")};goog.style.clearTransparentBackgroundImage=function(a){a=a.style;"filter"in a?a.filter="":a.backgroundImage="none"}; +goog.style.showElement=function(a,b){goog.style.setElementShown(a,b)};goog.style.setElementShown=function(a,b){a.style.display=b?"":"none"};goog.style.isElementShown=function(a){return"none"!=a.style.display}; +goog.style.installStyles=function(a,b){var c=goog.dom.getDomHelper(b),d=null;if(goog.userAgent.IE)d=c.getDocument().createStyleSheet(),goog.style.setStyles(d,a);else{var e=c.getElementsByTagNameAndClass("head")[0];e||(d=c.getElementsByTagNameAndClass("body")[0],e=c.createDom("head"),d.parentNode.insertBefore(e,d));d=c.createDom("style");goog.style.setStyles(d,a);c.appendChild(e,d)}return d};goog.style.uninstallStyles=function(a){goog.dom.removeNode(a.ownerNode||a.owningElement||a)}; +goog.style.setStyles=function(a,b){goog.userAgent.IE?a.cssText=b:a.innerHTML=b};goog.style.setPreWrap=function(a){a=a.style;goog.userAgent.IE&&!goog.userAgent.isVersionOrHigher("8")?(a.whiteSpace="pre",a.wordWrap="break-word"):a.whiteSpace=goog.userAgent.GECKO?"-moz-pre-wrap":"pre-wrap"}; +goog.style.setInlineBlock=function(a){a=a.style;a.position="relative";goog.userAgent.IE&&!goog.userAgent.isVersionOrHigher("8")?(a.zoom="1",a.display="inline"):a.display=goog.userAgent.GECKO?goog.userAgent.isVersionOrHigher("1.9a")?"inline-block":"-moz-inline-box":"inline-block"};goog.style.isRightToLeft=function(a){return"rtl"==goog.style.getStyle_(a,"direction")};goog.style.unselectableStyle_=goog.userAgent.GECKO?"MozUserSelect":goog.userAgent.WEBKIT?"WebkitUserSelect":null; +goog.style.isUnselectable=function(a){return goog.style.unselectableStyle_?"none"==a.style[goog.style.unselectableStyle_].toLowerCase():goog.userAgent.IE||goog.userAgent.OPERA?"on"==a.getAttribute("unselectable"):!1}; +goog.style.setUnselectable=function(a,b,c){c=c?null:a.getElementsByTagName("*");var d=goog.style.unselectableStyle_;if(d){if(b=b?"none":"",a.style[d]=b,c){a=0;for(var e;e=c[a];a++)e.style[d]=b}}else if(goog.userAgent.IE||goog.userAgent.OPERA)if(b=b?"on":"",a.setAttribute("unselectable",b),c)for(a=0;e=c[a];a++)e.setAttribute("unselectable",b)};goog.style.getBorderBoxSize=function(a){return new goog.math.Size(a.offsetWidth,a.offsetHeight)}; +goog.style.setBorderBoxSize=function(a,b){var c=goog.dom.getOwnerDocument(a),d=goog.dom.getDomHelper(c).isCss1CompatMode();if(!goog.userAgent.IE||d&&goog.userAgent.isVersionOrHigher("8"))goog.style.setBoxSizingSize_(a,b,"border-box");else if(c=a.style,d){var d=goog.style.getPaddingBox(a),e=goog.style.getBorderBox(a);c.pixelWidth=b.width-e.left-d.left-d.right-e.right;c.pixelHeight=b.height-e.top-d.top-d.bottom-e.bottom}else c.pixelWidth=b.width,c.pixelHeight=b.height}; +goog.style.getContentBoxSize=function(a){var b=goog.dom.getOwnerDocument(a),c=goog.userAgent.IE&&a.currentStyle;if(c&&goog.dom.getDomHelper(b).isCss1CompatMode()&&"auto"!=c.width&&"auto"!=c.height&&!c.boxSizing)return b=goog.style.getIePixelValue_(a,c.width,"width","pixelWidth"),a=goog.style.getIePixelValue_(a,c.height,"height","pixelHeight"),new goog.math.Size(b,a);c=goog.style.getBorderBoxSize(a);b=goog.style.getPaddingBox(a);a=goog.style.getBorderBox(a);return new goog.math.Size(c.width-a.left- +b.left-b.right-a.right,c.height-a.top-b.top-b.bottom-a.bottom)}; +goog.style.setContentBoxSize=function(a,b){var c=goog.dom.getOwnerDocument(a),d=goog.dom.getDomHelper(c).isCss1CompatMode();if(!goog.userAgent.IE||d&&goog.userAgent.isVersionOrHigher("8"))goog.style.setBoxSizingSize_(a,b,"content-box");else if(c=a.style,d)c.pixelWidth=b.width,c.pixelHeight=b.height;else{var d=goog.style.getPaddingBox(a),e=goog.style.getBorderBox(a);c.pixelWidth=b.width+e.left+d.left+d.right+e.right;c.pixelHeight=b.height+e.top+d.top+d.bottom+e.bottom}}; +goog.style.setBoxSizingSize_=function(a,b,c){a=a.style;goog.userAgent.GECKO?a.MozBoxSizing=c:goog.userAgent.WEBKIT?a.WebkitBoxSizing=c:a.boxSizing=c;a.width=Math.max(b.width,0)+"px";a.height=Math.max(b.height,0)+"px"};goog.style.getIePixelValue_=function(a,b,c,d){if(/^\d+px?$/.test(b))return parseInt(b,10);var e=a.style[c],f=a.runtimeStyle[c];a.runtimeStyle[c]=a.currentStyle[c];a.style[c]=b;b=a.style[d];a.style[c]=e;a.runtimeStyle[c]=f;return b}; +goog.style.getIePixelDistance_=function(a,b){var c=goog.style.getCascadedStyle(a,b);return c?goog.style.getIePixelValue_(a,c,"left","pixelLeft"):0}; +goog.style.getBox_=function(a,b){if(goog.userAgent.IE){var c=goog.style.getIePixelDistance_(a,b+"Left"),d=goog.style.getIePixelDistance_(a,b+"Right"),e=goog.style.getIePixelDistance_(a,b+"Top"),f=goog.style.getIePixelDistance_(a,b+"Bottom");return new goog.math.Box(e,d,f,c)}c=goog.style.getComputedStyle(a,b+"Left");d=goog.style.getComputedStyle(a,b+"Right");e=goog.style.getComputedStyle(a,b+"Top");f=goog.style.getComputedStyle(a,b+"Bottom");return new goog.math.Box(parseFloat(e),parseFloat(d),parseFloat(f), +parseFloat(c))};goog.style.getPaddingBox=function(a){return goog.style.getBox_(a,"padding")};goog.style.getMarginBox=function(a){return goog.style.getBox_(a,"margin")};goog.style.ieBorderWidthKeywords_={thin:2,medium:4,thick:6}; +goog.style.getIePixelBorder_=function(a,b){if("none"==goog.style.getCascadedStyle(a,b+"Style"))return 0;var c=goog.style.getCascadedStyle(a,b+"Width");return c in goog.style.ieBorderWidthKeywords_?goog.style.ieBorderWidthKeywords_[c]:goog.style.getIePixelValue_(a,c,"left","pixelLeft")}; +goog.style.getBorderBox=function(a){if(goog.userAgent.IE){var b=goog.style.getIePixelBorder_(a,"borderLeft"),c=goog.style.getIePixelBorder_(a,"borderRight"),d=goog.style.getIePixelBorder_(a,"borderTop");a=goog.style.getIePixelBorder_(a,"borderBottom");return new goog.math.Box(d,c,a,b)}b=goog.style.getComputedStyle(a,"borderLeftWidth");c=goog.style.getComputedStyle(a,"borderRightWidth");d=goog.style.getComputedStyle(a,"borderTopWidth");a=goog.style.getComputedStyle(a,"borderBottomWidth");return new goog.math.Box(parseFloat(d), +parseFloat(c),parseFloat(a),parseFloat(b))};goog.style.getFontFamily=function(a){var b=goog.dom.getOwnerDocument(a),c="";if(b.body.createTextRange){b=b.body.createTextRange();b.moveToElementText(a);try{c=b.queryCommandValue("FontName")}catch(d){c=""}}c||(c=goog.style.getStyle_(a,"fontFamily"));a=c.split(",");1d&&(d= +-3),goog.isDef(a.axis)&&a.axis===a.HORIZONTAL_AXIS?b=d:c=d;goog.isNumber(this.maxDeltaX_)&&(b=goog.math.clamp(b,-this.maxDeltaX_,this.maxDeltaX_));goog.isNumber(this.maxDeltaY_)&&(c=goog.math.clamp(c,-this.maxDeltaY_,this.maxDeltaY_));this.isRtl_&&(b=-b);b=new goog.events.MouseWheelEvent(d,a,b,c);this.dispatchEvent(b)};goog.events.MouseWheelHandler.smartScale_=function(a,b){return goog.userAgent.WEBKIT&&(goog.userAgent.MAC||goog.userAgent.LINUX)&&0!=a%b?a:a/b}; +goog.events.MouseWheelHandler.prototype.disposeInternal=function(){goog.events.MouseWheelHandler.superClass_.disposeInternal.call(this);goog.events.unlistenByKey(this.listenKey_);this.listenKey_=null};goog.events.MouseWheelEvent=function(a,b,c,d){goog.events.BrowserEvent.call(this,b);this.type=goog.events.MouseWheelHandler.EventType.MOUSEWHEEL;this.detail=a;this.deltaX=c;this.deltaY=d};goog.inherits(goog.events.MouseWheelEvent,goog.events.BrowserEvent);ol.control={};ol.control.Control=function(a){ol.Object.call(this);this.element=goog.isDef(a.element)?a.element:null;this.target_=goog.isDef(a.target)?goog.dom.getElement(a.target):null;this.map_=null;this.listenerKeys=[]};goog.inherits(ol.control.Control,ol.Object);ol.control.Control.prototype.disposeInternal=function(){goog.dom.removeNode(this.element);ol.control.Control.superClass_.disposeInternal.call(this)};ol.control.Control.prototype.getMap=function(){return this.map_}; +ol.control.Control.prototype.handleMapPostrender=goog.nullFunction; +ol.control.Control.prototype.setMap=function(a){goog.isNull(this.map_)||goog.dom.removeNode(this.element);goog.array.isEmpty(this.listenerKeys)||(goog.array.forEach(this.listenerKeys,goog.events.unlistenByKey),this.listenerKeys.length=0);this.map_=a;if(!goog.isNull(this.map_)){var b=goog.isNull(this.target_)?a.getOverlayContainerStopEvent():this.target_;goog.dom.appendChild(b,this.element);this.handleMapPostrender!==goog.nullFunction&&this.listenerKeys.push(goog.events.listen(a,ol.MapEventType.POSTRENDER, +this.handleMapPostrender,!1,this));a.render()}};ol.css={};ol.css.CLASS_UNSELECTABLE="ol-unselectable";ol.css.CLASS_UNSUPPORTED="ol-unsupported";ol.control.Attribution=function(a){a=goog.isDef(a)?a:{};this.ulElement_=goog.dom.createElement(goog.dom.TagName.UL);var b=goog.isDef(a.className)?a.className:"ol-attribution",b=goog.dom.createDom(goog.dom.TagName.DIV,{"class":b+" "+ol.css.CLASS_UNSELECTABLE},this.ulElement_);ol.control.Control.call(this,{element:b,target:a.target});this.renderedVisible_=!0;this.attributionElements_={};this.attributionElementRenderedVisible_={}};goog.inherits(ol.control.Attribution,ol.control.Control); +ol.control.Attribution.prototype.getSourceAttributions=function(a){var b,c,d,e,f,g,h,k,l,m=a.layersArray,n=goog.object.clone(a.attributions),p={};b=0;for(c=m.length;ba;)c-=3;if(0<=c){var a=this.points_[b+2]-this.points_[c+2],d=this.points_[b]-this.points_[c],b=this.points_[b+1]-this.points_[c+1];this.angle_=Math.atan2(b,d);this.initialVelocity_=Math.sqrt(d*d+b*b)/a;return this.initialVelocity_>this.minVelocity_}return!1}; +ol.Kinetic.prototype.pan=function(a){var b=this.decay_,c=this.initialVelocity_,d=this.minVelocity_,e=this.getDuration_();return ol.animation.pan({source:a,duration:e,easing:function(a){return c*(Math.exp(b*a*e)-1)/(d-c)}})};ol.Kinetic.prototype.getDuration_=function(){return Math.log(this.minVelocity_/this.initialVelocity_)/this.decay_};ol.Kinetic.prototype.getDistance=function(){return(this.minVelocity_-this.initialVelocity_)/this.decay_};ol.Kinetic.prototype.getAngle=function(){return this.angle_};ol.interaction.DoubleClickZoom=function(a){a=goog.isDef(a)?a:{};this.delta_=goog.isDef(a.delta)?a.delta:1;ol.interaction.Interaction.call(this);this.duration_=goog.isDef(a.duration)?a.duration:250};goog.inherits(ol.interaction.DoubleClickZoom,ol.interaction.Interaction); +ol.interaction.DoubleClickZoom.prototype.handleMapBrowserEvent=function(a){var b=!1,c=a.browserEvent;if(a.type==ol.MapBrowserEvent.EventType.DBLCLICK){var b=a.map,d=a.coordinate,c=c.shiftKey?-this.delta_:this.delta_,e=b.getView().getView2D();ol.interaction.Interaction.zoomByDelta(b,e,c,d,this.duration_);a.preventDefault();b=!0}return!b};ol.interaction.DragPan=function(a){ol.interaction.Drag.call(this);a=goog.isDef(a)?a:{};this.condition_=goog.isDef(a.condition)?a.condition:ol.events.condition.noModifierKeys;this.kinetic_=a.kinetic;this.kineticPreRenderFn_=null};goog.inherits(ol.interaction.DragPan,ol.interaction.Drag); +ol.interaction.DragPan.prototype.handleDrag=function(a){this.kinetic_&&this.kinetic_.update(a.browserEvent.clientX,a.browserEvent.clientY);a=a.map;var b=a.getView(),c=b.getView2DState(),d=[-c.resolution*this.deltaX,c.resolution*this.deltaY];ol.coordinate.rotate(d,c.rotation);ol.coordinate.add(d,this.startCenter);d=b.constrainCenter(d);a.render();b.setCenter(d)}; +ol.interaction.DragPan.prototype.handleDragEnd=function(a){a=a.map;var b=a.getView();b.setHint(ol.ViewHint.INTERACTING,-1);if(this.kinetic_&&this.kinetic_.end()){var b=b.getView2D(),c=b.getView2DState(),d=this.kinetic_.getDistance(),e=this.kinetic_.getAngle();this.kineticPreRenderFn_=this.kinetic_.pan(c.center);a.beforeRender(this.kineticPreRenderFn_);c=a.getPixelFromCoordinate(c.center);d=a.getCoordinateFromPixel([c[0]-d*Math.cos(e),c[1]-d*Math.sin(e)]);d=b.constrainCenter(d);b.setCenter(d)}a.render()}; +ol.interaction.DragPan.prototype.handleDragStart=function(a){var b=a.browserEvent;return b.isMouseActionButton()&&this.condition_(a)?(this.kinetic_&&(this.kinetic_.begin(),this.kinetic_.update(b.clientX,b.clientY)),a=a.map,a.getView().setHint(ol.ViewHint.INTERACTING,1),a.render(),!0):!1}; +ol.interaction.DragPan.prototype.handleDown=function(a){var b=a.map,c=b.getView();!goog.isNull(this.kineticPreRenderFn_)&&b.removePreRenderFunction(this.kineticPreRenderFn_)&&(b.render(),c.setCenter(a.frameState.view2DState.center),this.kineticPreRenderFn_=null)};ol.interaction.DRAGROTATE_ANIMATION_DURATION=250;ol.interaction.DragRotate=function(a){a=goog.isDef(a)?a:{};ol.interaction.Drag.call(this);this.condition_=goog.isDef(a.condition)?a.condition:ol.events.condition.altShiftKeysOnly;this.lastAngle_=void 0};goog.inherits(ol.interaction.DragRotate,ol.interaction.Drag); +ol.interaction.DragRotate.prototype.handleDrag=function(a){var b=a.map,c=b.getSize();a=a.pixel;c=Math.atan2(c[1]/2-a[1],a[0]-c[0]/2);if(goog.isDef(this.lastAngle_)){a=c-this.lastAngle_;var d=b.getView().getView2D(),e=d.getView2DState();b.render();ol.interaction.Interaction.rotateWithoutConstraints(b,d,e.rotation-a)}this.lastAngle_=c}; +ol.interaction.DragRotate.prototype.handleDragEnd=function(a){a=a.map;var b=a.getView();b.setHint(ol.ViewHint.INTERACTING,-1);var b=b.getView2D(),c=b.getView2DState();ol.interaction.Interaction.rotate(a,b,c.rotation,void 0,ol.interaction.DRAGROTATE_ANIMATION_DURATION)};ol.interaction.DragRotate.prototype.handleDragStart=function(a){return a.browserEvent.isMouseActionButton()&&this.condition_(a)?(a=a.map,a.getView().setHint(ol.ViewHint.INTERACTING,1),a.render(),this.lastAngle_=void 0,!0):!1};ol.interaction.DRAGZOOM_ANIMATION_DURATION=200;ol.interaction.DragZoom=function(a){var b=goog.isDef(a)?a:{};a=goog.isDef(b.condition)?b.condition:ol.events.condition.shiftKeyOnly;b=goog.isDef(b.style)?b.style:new ol.style.Style({stroke:new ol.style.Stroke({color:[0,0,255,1]})});ol.interaction.DragBox.call(this,{condition:a,style:b})};goog.inherits(ol.interaction.DragZoom,ol.interaction.DragBox); +ol.interaction.DragZoom.prototype.onBoxEnd=function(){var a=this.getMap(),b=a.getView().getView2D(),c=this.getGeometry().getExtent(),d=ol.extent.getCenter(c);ol.interaction.Interaction.zoom(a,b,b.getResolutionForExtent(c,a.getSize()),d,ol.interaction.DRAGZOOM_ANIMATION_DURATION)};ol.interaction.KEYBOARD_PAN_DURATION=100;ol.interaction.KeyboardPan=function(a){ol.interaction.Interaction.call(this);a=goog.isDef(a)?a:{};this.condition_=goog.isDef(a.condition)?a.condition:goog.functions.and(ol.events.condition.noModifierKeys,ol.events.condition.targetNotEditable);this.pixelDelta_=goog.isDef(a.pixelDelta)?a.pixelDelta:128};goog.inherits(ol.interaction.KeyboardPan,ol.interaction.Interaction); +ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent=function(a){var b=!1;if(a.type==goog.events.KeyHandler.EventType.KEY){var c=a.browserEvent.keyCode;if(this.condition_(a)&&(c==goog.events.KeyCodes.DOWN||c==goog.events.KeyCodes.LEFT||c==goog.events.KeyCodes.RIGHT||c==goog.events.KeyCodes.UP)){var b=a.map,d=b.getView(),e=d.getView2DState(),f=e.resolution*this.pixelDelta_,g=0,h=0;c==goog.events.KeyCodes.DOWN?h=-f:c==goog.events.KeyCodes.LEFT?g=-f:c==goog.events.KeyCodes.RIGHT?g=f:h=f;c=[g,h]; +ol.coordinate.rotate(c,e.rotation);ol.interaction.Interaction.pan(b,d,c,ol.interaction.KEYBOARD_PAN_DURATION);a.preventDefault();b=!0}}return!b};ol.interaction.KeyboardZoom=function(a){ol.interaction.Interaction.call(this);a=goog.isDef(a)?a:{};this.condition_=goog.isDef(a.condition)?a.condition:ol.events.condition.targetNotEditable;this.delta_=goog.isDef(a.delta)?a.delta:1;this.duration_=goog.isDef(a.duration)?a.duration:100};goog.inherits(ol.interaction.KeyboardZoom,ol.interaction.Interaction); +ol.interaction.KeyboardZoom.prototype.handleMapBrowserEvent=function(a){var b=!1;if(a.type==goog.events.KeyHandler.EventType.KEY){var c=a.browserEvent.charCode;if(this.condition_(a)&&(43==c||45==c)){b=a.map;c=43==c?this.delta_:-this.delta_;b.render();var d=b.getView().getView2D();ol.interaction.Interaction.zoomByDelta(b,d,c,void 0,this.duration_);a.preventDefault();b=!0}}return!b};ol.interaction.MOUSEWHEELZOOM_MAXDELTA=1;ol.interaction.MOUSEWHEELZOOM_TIMEOUT_DURATION=80;ol.interaction.MouseWheelZoom=function(a){a=goog.isDef(a)?a:{};ol.interaction.Interaction.call(this);this.delta_=0;this.duration_=goog.isDef(a.duration)?a.duration:250;this.lastAnchor_=null;this.timeoutId_=this.startTime_=void 0};goog.inherits(ol.interaction.MouseWheelZoom,ol.interaction.Interaction); +ol.interaction.MouseWheelZoom.prototype.handleMapBrowserEvent=function(a){var b=!1;if(a.type==goog.events.MouseWheelHandler.EventType.MOUSEWHEEL){var b=a.map,c=a.browserEvent;this.lastAnchor_=a.coordinate;this.delta_+=c.deltaY/3;goog.isDef(this.startTime_)||(this.startTime_=goog.now());c=Math.max(ol.interaction.MOUSEWHEELZOOM_TIMEOUT_DURATION-(goog.now()-this.startTime_),0);goog.global.clearTimeout(this.timeoutId_);this.timeoutId_=goog.global.setTimeout(goog.bind(this.doZoom_,this,b),c);a.preventDefault(); +b=!0}return!b};ol.interaction.MouseWheelZoom.prototype.doZoom_=function(a){var b=ol.interaction.MOUSEWHEELZOOM_MAXDELTA,b=goog.math.clamp(this.delta_,-b,b),c=a.getView().getView2D();a.render();ol.interaction.Interaction.zoomByDelta(a,c,-b,this.lastAnchor_,this.duration_);this.delta_=0;this.lastAnchor_=null;this.timeoutId_=this.startTime_=void 0};ol.interaction.Touch=function(){ol.interaction.Interaction.call(this);this.handled_=!1;this.trackedTouches_={};this.targetTouches=[]};goog.inherits(ol.interaction.Touch,ol.interaction.Interaction);ol.interaction.Touch.centroid=function(a){for(var b=a.length,c=0,d=0,e=0;ethis.threshold_&&(this.rotating_=!0));this.lastAngle_=c;a=a.map;c=goog.style.getClientPosition(a.getViewport());d=ol.interaction.Touch.centroid(this.targetTouches);d[0]-=c.x;d[1]-=c.y;this.anchor_=a.getCoordinateFromPixel(d); +this.rotating_&&(c=a.getView().getView2D(),d=c.getView2DState(),a.render(),ol.interaction.Interaction.rotateWithoutConstraints(a,c,d.rotation+b,this.anchor_))};ol.interaction.TouchRotate.prototype.handleTouchEnd=function(a){if(2>this.targetTouches.length){a=a.map;var b=a.getView().getView2D(),c=b.getView2DState();this.rotating_&&ol.interaction.Interaction.rotate(a,b,c.rotation,this.anchor_,ol.interaction.TOUCHROTATE_ANIMATION_DURATION);return!1}return!0}; +ol.interaction.TouchRotate.prototype.handleTouchStart=function(a){return 2<=this.targetTouches.length?(a=a.map,this.anchor_=null,this.lastAngle_=void 0,this.rotating_=!1,this.rotationDelta_=0,a.render(),!0):!1};ol.interaction.TouchZoom=function(a){a=goog.isDef(a)?a:{};ol.interaction.Touch.call(this);this.anchor_=null;this.duration_=goog.isDef(a.duration)?a.duration:400;this.lastDistance_=void 0;this.lastScaleDelta_=1};goog.inherits(ol.interaction.TouchZoom,ol.interaction.Touch); +ol.interaction.TouchZoom.prototype.handleTouchMove=function(a){var b=1,c=this.targetTouches[0],d=this.targetTouches[1],e=c.clientX-d.clientX,c=c.clientY-d.clientY,e=Math.sqrt(e*e+c*c);goog.isDef(this.lastDistance_)&&(b=this.lastDistance_/e);this.lastDistance_=e;1!=b&&(this.lastScaleDelta_=b);a=a.map;var e=a.getView().getView2D(),c=e.getView2DState(),d=goog.style.getClientPosition(a.getViewport()),f=ol.interaction.Touch.centroid(this.targetTouches);f[0]-=d.x;f[1]-=d.y;this.anchor_=a.getCoordinateFromPixel(f); +a.render();ol.interaction.Interaction.zoomWithoutConstraints(a,e,c.resolution*b,this.anchor_)};ol.interaction.TouchZoom.prototype.handleTouchEnd=function(a){if(2>this.targetTouches.length){a=a.map;var b=a.getView().getView2D(),c=b.getView2DState();ol.interaction.Interaction.zoom(a,b,c.resolution,this.anchor_,this.duration_,this.lastScaleDelta_-1);return!1}return!0}; +ol.interaction.TouchZoom.prototype.handleTouchStart=function(a){return 2<=this.targetTouches.length?(a=a.map,this.anchor_=null,this.lastDistance_=void 0,this.lastScaleDelta_=1,a.render(),!0):!1};ol.interaction.defaults=function(a){a=goog.isDef(a)?a:{};var b=new ol.Collection,c=new ol.Kinetic(-0.005,0.05,100);(goog.isDef(a.altShiftDragRotate)?a.altShiftDragRotate:1)&&b.push(new ol.interaction.DragRotate);(goog.isDef(a.doubleClickZoom)?a.doubleClickZoom:1)&&b.push(new ol.interaction.DoubleClickZoom({delta:a.zoomDelta,duration:a.zoomDuration}));(goog.isDef(a.touchPan)?a.touchPan:1)&&b.push(new ol.interaction.TouchPan({kinetic:c}));(goog.isDef(a.touchRotate)?a.touchRotate:1)&&b.push(new ol.interaction.TouchRotate); +(goog.isDef(a.touchZoom)?a.touchZoom:1)&&b.push(new ol.interaction.TouchZoom({duration:a.zoomDuration}));(goog.isDef(a.dragPan)?a.dragPan:1)&&b.push(new ol.interaction.DragPan({kinetic:c}));if(goog.isDef(a.keyboard)?a.keyboard:1)b.push(new ol.interaction.KeyboardPan),b.push(new ol.interaction.KeyboardZoom({delta:a.zoomDelta,duration:a.zoomDuration}));(goog.isDef(a.mouseWheelZoom)?a.mouseWheelZoom:1)&&b.push(new ol.interaction.MouseWheelZoom({duration:a.zoomDuration}));(goog.isDef(a.shiftDragZoom)? +a.shiftDragZoom:1)&&b.push(new ol.interaction.DragZoom);return b};ol.layer.GroupProperty={LAYERS:"layers"};ol.layer.Group=function(a){var b=goog.isDef(a)?a:{};a=goog.object.clone(b);delete a.layers;b=b.layers;ol.layer.Base.call(this,a);this.listenerKeys_=null;goog.events.listen(this,ol.Object.getChangeEventType(ol.layer.GroupProperty.LAYERS),this.handleLayersChanged_,!1,this);goog.isDef(b)?goog.isArray(b)&&(b=new ol.Collection(goog.array.clone(b))):b=new ol.Collection;this.setLayers(b)};goog.inherits(ol.layer.Group,ol.layer.Base); +ol.layer.Group.prototype.handleLayerChange_=function(){this.getVisible()&&this.dispatchChangeEvent()}; +ol.layer.Group.prototype.handleLayersChanged_=function(a){goog.isNull(this.listenerKeys_)||(goog.array.forEach(goog.object.getValues(this.listenerKeys_),goog.events.unlistenByKey),this.listenerKeys_=null);a=this.getLayers();if(goog.isDefAndNotNull(a)){this.listenerKeys_={add:goog.events.listen(a,ol.CollectionEventType.ADD,this.handleLayersAdd_,!1,this),remove:goog.events.listen(a,ol.CollectionEventType.REMOVE,this.handleLayersRemove_,!1,this)};a=a.getArray();var b,c,d;b=0;for(c=a.length;b=this.minZoom;){if(b.call(c,a,this.getTileRangeForExtentAndZ(e,a,d)))return!0;--a}return!1};ol.tilegrid.TileGrid.prototype.getMaxZoom=function(){return this.maxZoom};ol.tilegrid.TileGrid.prototype.getMinZoom=function(){return this.minZoom}; +ol.tilegrid.TileGrid.prototype.getOrigin=function(a){return goog.isNull(this.origin_)?this.origins_[a]:this.origin_};ol.tilegrid.TileGrid.prototype.getResolution=function(a){return this.resolutions_[a]};ol.tilegrid.TileGrid.prototype.getResolutions=function(){return this.resolutions_};ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange=function(a,b,c){return a.z=p;--t)for(q=c.getTileRangeForExtentAndZ(f,t),u=c.getResolution(t),s=q.minX;s<=q.maxX;++s)for(v=q.minY;v<=q.maxY;++v)g-t<=h?(r=b.getTile(t,s,v,d,e),r.getState()==ol.TileState.IDLE&&(n[r.tileCoord.toString()]=!0,a.isKeyQueued(r.getKey())||a.enqueue([r, +m,c.getTileCoordCenter(r.tileCoord),u])),goog.isDef(k)&&k.call(l,r)):b.useTile(t,s,v)};ol.style.IconAnchorOrigin={BOTTOM_LEFT:"bottom-left",BOTTOM_RIGHT:"bottom-right",TOP_LEFT:"top-left",TOP_RIGHT:"top-right"};ol.style.IconAnchorUnits={FRACTION:"fraction",PIXELS:"pixels"}; +ol.style.Icon=function(a){a=goog.isDef(a)?a:{};this.anchor_=goog.isDef(a.anchor)?a.anchor:[0.5,0.5];this.anchorOrigin_=goog.isDef(a.anchorOrigin)?a.anchorOrigin:ol.style.IconAnchorOrigin.TOP_LEFT;this.anchorXUnits_=goog.isDef(a.anchorXUnits)?a.anchorXUnits:ol.style.IconAnchorUnits.FRACTION;this.anchorYUnits_=goog.isDef(a.anchorYUnits)?a.anchorYUnits:ol.style.IconAnchorUnits.FRACTION;var b=goog.isDef(a.crossOrigin)?a.crossOrigin:null;this.iconImage_=ol.style.IconImage_.get(a.src,b);this.size_=goog.isDef(a.size)? +a.size:null;var b=goog.isDef(a.opacity)?a.opacity:1,c=goog.isDef(a.rotateWithView)?a.rotateWithView:!1,d=goog.isDef(a.rotation)?a.rotation:0;a=goog.isDef(a.scale)?a.scale:1;ol.style.Image.call(this,{opacity:b,rotation:d,scale:a,snapToPixel:void 0,rotateWithView:c})};goog.inherits(ol.style.Icon,ol.style.Image); +ol.style.Icon.prototype.getAnchor=function(){var a=this.anchor_,b=this.getSize();if(this.anchorXUnits_==ol.style.IconAnchorUnits.FRACTION||this.anchorYUnits_==ol.style.IconAnchorUnits.FRACTION){if(goog.isNull(b))return null;a=this.anchor_.slice();this.anchorXUnits_==ol.style.IconAnchorUnits.FRACTION&&(a[0]*=b[0]);this.anchorYUnits_==ol.style.IconAnchorUnits.FRACTION&&(a[1]*=b[1])}if(this.anchorOrigin_!=ol.style.IconAnchorOrigin.TOP_LEFT){if(goog.isNull(b))return null;a===this.anchor_&&(a=this.anchor_.slice()); +if(this.anchorOrigin_==ol.style.IconAnchorOrigin.TOP_RIGHT||this.anchorOrigin_==ol.style.IconAnchorOrigin.BOTTOM_RIGHT)a[0]=-a[0]+b[0];if(this.anchorOrigin_==ol.style.IconAnchorOrigin.BOTTOM_LEFT||this.anchorOrigin_==ol.style.IconAnchorOrigin.BOTTOM_RIGHT)a[1]+=b[1]}return a};ol.style.Icon.prototype.getImage=function(a){return this.iconImage_.getImage(a)};ol.style.Icon.prototype.getImageState=function(){return this.iconImage_.getImageState()};ol.style.Icon.prototype.getHitDetectionImage=function(a){return this.iconImage_.getHitDetectionImage(a)}; +ol.style.Icon.prototype.getSrc=function(){return this.iconImage_.getSrc()};ol.style.Icon.prototype.getSize=function(){return goog.isNull(this.size_)?this.iconImage_.getSize():this.size_};ol.style.Icon.prototype.listenImageChange=function(a,b){return goog.events.listen(this.iconImage_,goog.events.EventType.CHANGE,a,!1,b)};ol.style.Icon.prototype.load=function(){this.iconImage_.load()}; +ol.style.Icon.prototype.unlistenImageChange=function(a,b){goog.events.unlisten(this.iconImage_,goog.events.EventType.CHANGE,a,!1,b)};ol.style.IconImage_=function(a,b){goog.events.EventTarget.call(this);this.hitDetectionImage_=null;this.image_=new Image;goog.isNull(b)||(this.image_.crossOrigin=b);this.imageListenerKeys_=null;this.imageState_=ol.style.ImageState.IDLE;this.size_=null;this.src_=a;this.tainting_=!1};goog.inherits(ol.style.IconImage_,goog.events.EventTarget); +ol.style.IconImage_.get=function(a,b){var c=ol.style.IconImageCache.getInstance(),d=c.get(a,b);goog.isNull(d)&&(d=new ol.style.IconImage_(a,b),c.set(a,b,d));return d};ol.style.IconImage_.prototype.determineTainting_=function(){var a=goog.dom.createElement(goog.dom.TagName.CANVAS);a.width=1;a.height=1;a=a.getContext("2d");a.drawImage(this.image_,0,0);try{a.getImageData(0,0,1,1)}catch(b){this.tainting_=!0}};ol.style.IconImage_.prototype.dispatchChangeEvent_=function(){this.dispatchEvent(goog.events.EventType.CHANGE)}; +ol.style.IconImage_.prototype.handleImageError_=function(){this.imageState_=ol.style.ImageState.ERROR;this.unlistenImage_();this.dispatchChangeEvent_()};ol.style.IconImage_.prototype.handleImageLoad_=function(){this.imageState_=ol.style.ImageState.LOADED;this.size_=[this.image_.width,this.image_.height];this.unlistenImage_();this.determineTainting_();this.dispatchChangeEvent_()};ol.style.IconImage_.prototype.getImage=function(a){return this.image_};ol.style.IconImage_.prototype.getImageState=function(){return this.imageState_}; +ol.style.IconImage_.prototype.getHitDetectionImage=function(a){if(goog.isNull(this.hitDetectionImage_))if(this.tainting_){a=goog.dom.createElement(goog.dom.TagName.CANVAS);var b=this.size_[0],c=this.size_[1];a.width=b;a.height=c;a.getContext("2d").fillRect(0,0,b,c);this.hitDetectionImage_=a}else this.hitDetectionImage_=this.image_;return this.hitDetectionImage_};ol.style.IconImage_.prototype.getSize=function(){return this.size_};ol.style.IconImage_.prototype.getSrc=function(){return this.src_}; +ol.style.IconImage_.prototype.load=function(){if(this.imageState_==ol.style.ImageState.IDLE){this.imageState_=ol.style.ImageState.LOADING;this.imageListenerKeys_=[goog.events.listenOnce(this.image_,goog.events.EventType.ERROR,this.handleImageError_,!1,this),goog.events.listenOnce(this.image_,goog.events.EventType.LOAD,this.handleImageLoad_,!1,this)];try{this.image_.src=this.src_}catch(a){this.handleImageError_()}}}; +ol.style.IconImage_.prototype.unlistenImage_=function(){goog.array.forEach(this.imageListenerKeys_,goog.events.unlistenByKey);this.imageListenerKeys_=null};ol.style.IconImageCache=function(){this.cache_={};this.cacheSize_=0;this.maxCacheSize_=32};goog.addSingletonGetter(ol.style.IconImageCache);ol.style.IconImageCache.getKey=function(a,b){return b+":"+a};ol.style.IconImageCache.prototype.clear=function(){this.cache_={};this.cacheSize_=0}; +ol.style.IconImageCache.prototype.expire=function(){if(this.cacheSize_>this.maxCacheSize_){var a=0,b,c;for(b in this.cache_)c=this.cache_[b],0!==(a++&3)||goog.events.hasListener(c)||(delete this.cache_[b],--this.cacheSize_)}};ol.style.IconImageCache.prototype.get=function(a,b){var c=ol.style.IconImageCache.getKey(a,b);return c in this.cache_?this.cache_[c]:null};ol.style.IconImageCache.prototype.set=function(a,b,c){a=ol.style.IconImageCache.getKey(a,b);this.cache_[a]=c;++this.cacheSize_};ol.vec={};ol.vec.Mat4={};ol.vec.Mat4.makeTransform2D=function(a,b,c,d,e,f,g,h){goog.vec.Mat4.makeIdentity(a);0===b&&0===c||goog.vec.Mat4.translate(a,b,c,0);1==d&&1==e||goog.vec.Mat4.scale(a,d,e,1);0!==f&&goog.vec.Mat4.rotateZ(a,f);0===g&&0===h||goog.vec.Mat4.translate(a,g,h,0);return a}; +ol.vec.Mat4.equals2D=function(a,b){return goog.vec.Mat4.getElement(a,0,0)==goog.vec.Mat4.getElement(b,0,0)&&goog.vec.Mat4.getElement(a,1,0)==goog.vec.Mat4.getElement(b,1,0)&&goog.vec.Mat4.getElement(a,0,1)==goog.vec.Mat4.getElement(b,0,1)&&goog.vec.Mat4.getElement(a,1,1)==goog.vec.Mat4.getElement(b,1,1)&&goog.vec.Mat4.getElement(a,0,3)==goog.vec.Mat4.getElement(b,0,3)&&goog.vec.Mat4.getElement(a,1,3)==goog.vec.Mat4.getElement(b,1,3)}; +ol.vec.Mat4.multVec2=function(a,b,c){var d=goog.vec.Mat4.getElement(a,0,0),e=goog.vec.Mat4.getElement(a,1,0),f=goog.vec.Mat4.getElement(a,0,1),g=goog.vec.Mat4.getElement(a,1,1),h=goog.vec.Mat4.getElement(a,0,3);a=goog.vec.Mat4.getElement(a,1,3);var k=b[0];b=b[1];c[0]=d*k+f*b+h;c[1]=e*k+g*b+a;return c};ol.renderer.Map=function(a,b){goog.Disposable.call(this);this.map_=b;this.layerRenderers_={}};goog.inherits(ol.renderer.Map,goog.Disposable);ol.renderer.Map.prototype.calculateMatrices2D=function(a){var b=a.view2DState,c=a.coordinateToPixelMatrix;ol.vec.Mat4.makeTransform2D(c,a.size[0]/2,a.size[1]/2,1/b.resolution,-1/b.resolution,-b.rotation,-b.center[0],-b.center[1]);goog.vec.Mat4.invert(c,a.pixelToCoordinateMatrix)}; +ol.renderer.Map.prototype.createLayerRenderer=function(a){return new ol.renderer.Layer(this,a)};ol.renderer.Map.prototype.disposeInternal=function(){goog.object.forEach(this.layerRenderers_,function(a){goog.dispose(a)});ol.renderer.Map.superClass_.disposeInternal.call(this)}; +ol.renderer.Map.prototype.forEachFeatureAtPixel=function(a,b,c,d,e,f){var g=this.map_.getLayerGroup().getLayersArray(),h;for(h=g.length-1;0<=h;--h){var k=g[h];if(k.getVisible()&&e.call(f,k)&&(k=this.getLayerRenderer(k).forEachFeatureAtPixel(a,b,c,d)))return k}};ol.renderer.Map.prototype.getLayerRenderer=function(a){var b=goog.getUid(a).toString();if(b in this.layerRenderers_)return this.layerRenderers_[b];a=this.createLayerRenderer(a);return this.layerRenderers_[b]=a}; +ol.renderer.Map.prototype.getLayerRendererByKey=function(a){return this.layerRenderers_[a]};ol.renderer.Map.prototype.getLayerRenderers=function(){return this.layerRenderers_};ol.renderer.Map.prototype.getMap=function(){return this.map_};ol.renderer.Map.prototype.removeLayerRendererByKey_=function(a){var b=this.layerRenderers_[a];delete this.layerRenderers_[a];return b};ol.renderer.Map.prototype.renderFrame=goog.nullFunction; +ol.renderer.Map.prototype.removeUnusedLayerRenderers_=function(a,b){for(var c in this.layerRenderers_)!goog.isNull(b)&&c in b.layerStates||goog.dispose(this.removeLayerRendererByKey_(c))};ol.renderer.Map.prototype.scheduleExpireIconCache=function(a){a.postRenderFunctions.push(function(a,c){ol.style.IconImageCache.getInstance().expire()})}; +ol.renderer.Map.prototype.scheduleRemoveUnusedLayerRenderers=function(a){for(var b in this.layerRenderers_)if(!(b in a.layerStates)){a.postRenderFunctions.push(goog.bind(this.removeUnusedLayerRenderers_,this));break}};ol.layer.Image=function(a){ol.layer.Layer.call(this,a)};goog.inherits(ol.layer.Image,ol.layer.Layer);ol.layer.TileProperty={PRELOAD:"preload",USE_INTERIM_TILES_ON_ERROR:"useInterimTilesOnError"};ol.layer.Tile=function(a){ol.layer.Layer.call(this,a)};goog.inherits(ol.layer.Tile,ol.layer.Layer);ol.layer.Tile.prototype.getPreload=function(){return this.get(ol.layer.TileProperty.PRELOAD)};goog.exportProperty(ol.layer.Tile.prototype,"getPreload",ol.layer.Tile.prototype.getPreload);ol.layer.Tile.prototype.setPreload=function(a){this.set(ol.layer.TileProperty.PRELOAD,a)}; +goog.exportProperty(ol.layer.Tile.prototype,"setPreload",ol.layer.Tile.prototype.setPreload);ol.layer.Tile.prototype.getUseInterimTilesOnError=function(){return this.get(ol.layer.TileProperty.USE_INTERIM_TILES_ON_ERROR)};goog.exportProperty(ol.layer.Tile.prototype,"getUseInterimTilesOnError",ol.layer.Tile.prototype.getUseInterimTilesOnError);ol.layer.Tile.prototype.setUseInterimTilesOnError=function(a){this.set(ol.layer.TileProperty.USE_INTERIM_TILES_ON_ERROR,a)}; +goog.exportProperty(ol.layer.Tile.prototype,"setUseInterimTilesOnError",ol.layer.Tile.prototype.setUseInterimTilesOnError);ol.layer.VectorProperty={RENDER_GEOMETRY_FUNCTIONS:"renderGeometryFunctions"};ol.layer.Vector=function(a){a=goog.isDef(a)?a:{};var b=goog.object.clone(a);delete b.style;ol.layer.Layer.call(this,b);this.style_=null;this.styleFunction_=void 0;goog.isDef(a.style)&&this.setStyle(a.style)};goog.inherits(ol.layer.Vector,ol.layer.Layer);ol.layer.Vector.prototype.getRenderGeometryFunctions=function(){return this.get(ol.layer.VectorProperty.RENDER_GEOMETRY_FUNCTIONS)}; +goog.exportProperty(ol.layer.Vector.prototype,"getRenderGeometryFunctions",ol.layer.Vector.prototype.getRenderGeometryFunctions);ol.layer.Vector.prototype.getStyle=function(){return this.style_};ol.layer.Vector.prototype.getStyleFunction=function(){return this.styleFunction_};ol.layer.Vector.prototype.setRenderGeometryFunctions=function(a){this.set(ol.layer.VectorProperty.RENDER_GEOMETRY_FUNCTIONS,a)};goog.exportProperty(ol.layer.Vector.prototype,"setRenderGeometryFunctions",ol.layer.Vector.prototype.setRenderGeometryFunctions); +ol.layer.Vector.prototype.setStyle=function(a){this.style_=a;this.styleFunction_=ol.feature.createStyleFunction(a);this.dispatchChangeEvent()};ol.render.canvas.Immediate=function(a,b,c,d,e){this.callbacksByZIndex_={};this.context_=a;this.pixelRatio_=b;this.extent_=c;this.transform_=d;this.viewRotation_=e;this.image_=this.strokeState_=this.fillState_=this.contextTextState_=this.contextStrokeState_=this.contextFillState_=null;this.imageOpacity_=this.imageHeight_=this.imageAnchorY_=this.imageAnchorX_=0;this.imageRotateWithView_=!1;this.imageScale_=this.imageRotation_=0;this.imageSnapToPixel_=!1;this.imageWidth_=0;this.text_="";this.textScale_= +this.textRotation_=0;this.textState_=this.textStrokeState_=this.textFillState_=null;this.pixelCoordinates_=[];this.tmpLocalTransform_=goog.vec.Mat4.createNumber()}; +ol.render.canvas.Immediate.prototype.drawImages_=function(a,b,c,d){if(!goog.isNull(this.image_)){a=ol.geom.flat.transform2D(a,2,this.transform_,this.pixelCoordinates_);b=this.context_;c=this.tmpLocalTransform_;d=b.globalAlpha;1!=this.imageOpacity_&&(b.globalAlpha=d*this.imageOpacity_);var e=this.imageRotation_;this.imageRotateWithView_&&(e+=this.viewRotation_);var f,g;f=0;for(g=a.length;fa||0!==this.simplifiedGeometryMaxMinSquaredTolerance&&a=d;--f)ol.extent.extend(h,c[f].extent),k+=ol.extent.getMargin(h);return k};ol.structs.RBush.prototype.assertValid=function(){this.root_.assertValid(this.maxEntries_)}; +ol.structs.RBush.prototype.chooseSplitAxis_=function(a){var b=this.allDistMargin_(a,ol.structs.RBushNode.compareMinX),c=this.allDistMargin_(a,ol.structs.RBushNode.compareMinY);bthis.maxEntries_)this.split_(d,b);else break;for(;0<=b;--b)ol.extent.extend(d[b].extent,a);return c};ol.structs.RBush.prototype.isEmpty=function(){return 0===this.root_.children.length}; +ol.structs.RBush.prototype.remove=function(a){if(goog.DEBUG&&this.readers_)throw Error("cannot remove value while reading");var b=this.getKey_(a),c=this.valueExtent_[b];delete this.valueExtent_[b];return this.remove_(c,a)};ol.structs.RBush.prototype.remove_=function(a,b){var c=this.root_,d=[c];(c=c.remove(a,b,d))&&this.condense_(d);return c}; +ol.structs.RBush.prototype.split_=function(a,b){var c=a[b];this.chooseSplitAxis_(c);var d=this.chooseSplitIndex_(c),d=c.children.splice(d),d=new ol.structs.RBushNode(ol.extent.createEmpty(),c.height,d,null);c.updateExtent();d.updateExtent();b?a[b-1].children.push(d):this.splitRoot_(c,d)};ol.structs.RBush.prototype.splitRoot_=function(a,b){var c=a.height+1,d=ol.extent.extend(a.extent.slice(),b.extent);this.root_=new ol.structs.RBushNode(d,c,[a,b],null)}; +ol.structs.RBush.prototype.update=function(a,b){if(goog.DEBUG&&this.readers_)throw Error("cannot update value while reading");var c=this.getKey_(b),d=this.valueExtent_[c];ol.extent.equals(d,a)||(this.remove_(d,b),this.insert_(a,b,this.root_.height-1),this.valueExtent_[c]=ol.extent.clone(a,d))};ol.source.VectorEventType={ADDFEATURE:"addfeature",REMOVEFEATURE:"removefeature"};ol.source.Vector=function(a){a=goog.isDef(a)?a:{};ol.source.Source.call(this,{attributions:a.attributions,extent:a.extent,logo:a.logo,projection:a.projection,state:a.state});this.rBush_=new ol.structs.RBush;this.nullGeometryFeatures_={};this.featureChangeKeys_={};goog.isDef(a.features)&&this.addFeaturesInternal(a.features)};goog.inherits(ol.source.Vector,ol.source.Source); +ol.source.Vector.prototype.addFeature=function(a){this.addFeatureInternal(a);this.dispatchChangeEvent()}; +ol.source.Vector.prototype.addFeatureInternal=function(a){var b=goog.getUid(a).toString();this.featureChangeKeys_[b]=goog.events.listen(a,goog.events.EventType.CHANGE,this.handleFeatureChange_,!1,this);b=a.getGeometry();goog.isNull(b)?this.nullGeometryFeatures_[goog.getUid(a).toString()]=a:(b=b.getExtent(),this.rBush_.insert(b,a));this.dispatchEvent(new ol.source.VectorEvent(ol.source.VectorEventType.ADDFEATURE,a))};ol.source.Vector.prototype.addFeatures=function(a){this.addFeaturesInternal(a);this.dispatchChangeEvent()}; +ol.source.Vector.prototype.addFeaturesInternal=function(a){var b,c;b=0;for(c=a.length;b=h.maxResolution||ed;++d)e[d]=b[d].toFixed(c);c=e.join(",")}else c=b.join(",");ol.dom.setTransform(a,"matrix3d("+c+")")}else if(ol.dom.canUseCssTransform()){b=[goog.vec.Mat4.getElement(b,0,0),goog.vec.Mat4.getElement(b,1,0),goog.vec.Mat4.getElement(b,0,1),goog.vec.Mat4.getElement(b,1,1),goog.vec.Mat4.getElement(b,0,3),goog.vec.Mat4.getElement(b,1,3)];if(goog.isDef(c)){e=Array(6);for(d=0;6>d;++d)e[d]= +b[d].toFixed(c);c=e.join(",")}else c=b.join(",");ol.dom.setTransform(a,"matrix("+c+")")}else if(ol.dom.BrowserFeature.USE_MS_MATRIX_TRANSFORM){var e=goog.vec.Mat4.getElement(b,0,0),f=goog.vec.Mat4.getElement(b,0,1),g=goog.vec.Mat4.getElement(b,1,0),h=goog.vec.Mat4.getElement(b,1,1),k=goog.vec.Mat4.getElement(b,0,3);b=goog.vec.Mat4.getElement(b,1,3);var l;l='progid:DXImageTransform.Microsoft.Matrix(sizingMethod\x3d"auto expand",M11\x3d'+e.toFixed(c||20);l+=",M12\x3d"+f.toFixed(c||20);l+=",M21\x3d"+ +g.toFixed(c||20);l+=",M22\x3d"+h.toFixed(c||20);l+=")";ol.dom.setIEMatrix_(a,l);b/=h;d.style.left=Math.round(k/e)+"px";d.style.top=Math.round(b)+"px"}else a.style.left=Math.round(goog.vec.Mat4.getElement(b,0,3))+"px",a.style.top=Math.round(goog.vec.Mat4.getElement(b,1,3))+"px"};ol.renderer.dom={};ol.renderer.dom.Layer=function(a,b,c){ol.renderer.Layer.call(this,a,b);this.target=c};goog.inherits(ol.renderer.dom.Layer,ol.renderer.Layer);ol.renderer.dom.Layer.prototype.getTarget=function(){return this.target};ol.renderer.dom.ImageLayer=function(a,b){var c=goog.dom.createElement(goog.dom.TagName.DIV);c.style.position="absolute";ol.renderer.dom.Layer.call(this,a,b,c);this.image_=null;this.transform_=goog.vec.Mat4.createNumberIdentity()};goog.inherits(ol.renderer.dom.ImageLayer,ol.renderer.dom.Layer); +ol.renderer.dom.ImageLayer.prototype.forEachFeatureAtPixel=function(a,b,c,d){var e=this.getLayer();return e.getSource().forEachFeatureAtPixel(b.extent,b.view2DState.resolution,b.view2DState.rotation,a,function(a){return c.call(d,a,e)})}; +ol.renderer.dom.ImageLayer.prototype.prepareFrame=function(a,b){var c=a.view2DState,d=c.center,e=c.resolution,f=c.rotation,g=this.image_,h=this.getLayer().getSource(),k=a.viewHints;k[ol.ViewHint.ANIMATING]||k[ol.ViewHint.INTERACTING]||(c=h.getImage(a.extent,e,a.pixelRatio,c.projection),goog.isNull(c)||(k=c.getState(),k==ol.ImageState.IDLE?(goog.events.listenOnce(c,goog.events.EventType.CHANGE,this.handleImageChange,!1,this),c.load()):k==ol.ImageState.LOADED&&(g=c)));if(!goog.isNull(g)){var k=g.getExtent(), +l=g.getResolution(),c=goog.vec.Mat4.createNumber();ol.vec.Mat4.makeTransform2D(c,a.size[0]/2,a.size[1]/2,l/e,l/e,f,(k[0]-d[0])/l,(d[1]-k[3])/l);g!=this.image_&&(d=g.getImageElement(this),d.style.maxWidth="none",d.style.position="absolute",goog.dom.removeChildren(this.target),goog.dom.appendChild(this.target,d),this.image_=g);this.setTransform_(c);this.updateAttributions(a.attributions,g.getAttributions());this.updateLogos(a,h)}}; +ol.renderer.dom.ImageLayer.prototype.setTransform_=function(a){ol.vec.Mat4.equals2D(a,this.transform_)||(ol.dom.transformElement2D(this.target,a,6),goog.vec.Mat4.setFromArray(this.transform_,a))};ol.renderer.dom.TileLayer=function(a,b){var c=goog.dom.createElement(goog.dom.TagName.DIV);c.style.position="absolute";ol.dom.BrowserFeature.USE_MS_MATRIX_TRANSFORM&&(c.style.width="100%",c.style.height="100%");ol.renderer.dom.Layer.call(this,a,b,c);this.renderedVisible_=!0;this.renderedOpacity_=1;this.renderedRevision_=0;this.tileLayerZs_={}};goog.inherits(ol.renderer.dom.TileLayer,ol.renderer.dom.Layer); +ol.renderer.dom.TileLayer.prototype.prepareFrame=function(a,b){if(b.visible){var c=a.pixelRatio,d=a.view2DState,e=d.projection,f=this.getLayer(),g=f.getSource(),h=g.getTileGridForProjection(e),k=g.getGutter(),l=h.getZForResolution(d.resolution),m=h.getResolution(l),n=d.center,p;m==d.resolution?(n=this.snapCenterToPixel(n,m,a.size),p=ol.extent.getForView2DAndSize(n,m,d.rotation,a.size)):p=a.extent;var m=h.getTileRangeForExtentAndResolution(p,m),r={};r[l]={};var q=this.createGetTileIfLoadedFunction(function(a){return!goog.isNull(a)&& +a.getState()==ol.TileState.LOADED},g,c,e),u=goog.bind(g.findLoadedTiles,g,r,q),s=f.getUseInterimTilesOnError();goog.isDef(s)||(s=!0);var v=ol.extent.createEmpty(),q=new ol.TileRange(0,0,0,0),t,B,w,z;for(w=m.minX;w<=m.maxX;++w)for(z=m.minY;z<=m.maxY;++z)t=g.getTile(l,w,z,c,e),B=t.getState(),B==ol.TileState.LOADED?r[l][t.tileCoord.toString()]=t:B==ol.TileState.EMPTY||B==ol.TileState.ERROR&&!s||(B=h.forEachTileCoordParentTileRange(t.tileCoord,u,null,q,v),B||(t=h.getTileCoordChildTileRange(t.tileCoord, +q,v),goog.isNull(t)||u(l+1,t)));var x;if(this.renderedRevision_!=g.getRevision()){for(x in this.tileLayerZs_)s=this.tileLayerZs_[+x],goog.dom.removeNode(s.target);this.tileLayerZs_={};this.renderedRevision_=g.getRevision()}v=goog.array.map(goog.object.getKeys(r),Number);goog.array.sort(v);var u={},A;w=0;for(z=v.length;wx&&goog.dom.insertChildAt(this.target,s.target,0)}else a.viewHints[ol.ViewHint.ANIMATING]||a.viewHints[ol.ViewHint.INTERACTING]||s.removeTilesOutsideExtent(p,q);else goog.dom.removeNode(s.target),delete this.tileLayerZs_[x];b.opacity!=this.renderedOpacity_&&(ol.dom.setOpacity(this.target,b.opacity),this.renderedOpacity_=b.opacity);b.visible&&!this.renderedVisible_&&(goog.style.setElementShown(this.target,!0),this.renderedVisible_=!0);this.updateUsedTiles(a.usedTiles,g,l,m);this.manageTilePyramid(a, +g,h,c,e,p,l,f.getPreload());this.scheduleExpireCache(a,g);this.updateLogos(a,g)}else this.renderedVisible_&&(goog.style.setElementShown(this.target,!1),this.renderedVisible_=!1)}; +ol.renderer.dom.TileLayerZ_=function(a,b){this.target=goog.dom.createElement(goog.dom.TagName.DIV);this.target.style.position="absolute";this.target.style.width="100%";this.target.style.height="100%";ol.LEGACY_IE_SUPPORT&&ol.IS_LEGACY_IE&&(this.translateTarget_=goog.dom.createElement(goog.dom.TagName.DIV),this.translateTarget_.style.position="absolute",this.translateTarget_.style.width="100%",this.translateTarget_.style.height="100%",goog.dom.appendChild(this.target,this.translateTarget_));this.tileGrid_= +a;this.tileCoordOrigin_=b;this.origin_=ol.extent.getTopLeft(a.getTileCoordExtent(b));this.resolution_=a.getResolution(b.z);this.tiles_={};this.documentFragment_=null;this.transform_=goog.vec.Mat4.createNumberIdentity()}; +ol.renderer.dom.TileLayerZ_.prototype.addTile=function(a,b){var c=a.tileCoord,d=c.toString();if(!(d in this.tiles_)){var e=this.tileGrid_.getTileSize(c.z),f=a.getImage(this),g=f.style;g.maxWidth="none";var h,k;0a&&(-1==d||gb)break;if(ak?(f=65536*Math.floor(-k/65536),c[h]=-f,c[h+1]=k+f):(f=65536*Math.floor(k/65536),c[h]=f,c[h+1]=k-f)});this.split32DirtySet_.clear(); +return this.split32_};ol.structs.Buffer.prototype.getUsage=function(){return this.usage_};ol.structs.Buffer.prototype.markDirty=function(a,b){var c,d;c=0;for(d=this.dirtySets_.length;col.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK;){d=this.textureCache_.peekLast();if(goog.isNull(d))if(+this.textureCache_.peekLastKey()==b.index)break;else--this.textureCacheFrameMarkerCount_;else c.deleteTexture(d.texture);this.textureCache_.pop()}};ol.renderer.webgl.Map.prototype.getContext=function(){return this.context_}; +ol.renderer.webgl.Map.prototype.getGL=function(){return this.gl_};ol.renderer.webgl.Map.prototype.getTileTextureQueue=function(){return this.tileTextureQueue_};ol.renderer.webgl.Map.prototype.handleWebGLContextLost=function(a){a.preventDefault();this.textureCache_.clear();this.textureCacheFrameMarkerCount_=0;goog.object.forEach(this.getLayerRenderers(),function(a,c,d){a.handleWebGLContextLost()})};ol.renderer.webgl.Map.prototype.handleWebGLContextRestored=function(){this.initializeGL_();this.getMap().render()}; +ol.renderer.webgl.Map.prototype.initializeGL_=function(){var a=this.gl_;a.activeTexture(goog.webgl.TEXTURE0);a.blendFuncSeparate(goog.webgl.SRC_ALPHA,goog.webgl.ONE_MINUS_SRC_ALPHA,goog.webgl.ONE,goog.webgl.ONE_MINUS_SRC_ALPHA);a.disable(goog.webgl.CULL_FACE);a.disable(goog.webgl.DEPTH_TEST);a.disable(goog.webgl.SCISSOR_TEST);a.disable(goog.webgl.STENCIL_TEST)};ol.renderer.webgl.Map.prototype.isTileTextureLoaded=function(a){return this.textureCache_.containsKey(a.getKey())}; +ol.renderer.webgl.Map.prototype.renderFrame=function(a){var b=this.getContext(),c=this.getGL();if(c.isContextLost())return!1;if(goog.isNull(a))return this.renderedVisible_&&(goog.style.setElementShown(this.canvas_,!1),this.renderedVisible_=!1),!1;this.focus_=a.focus;this.textureCache_.set((-a.index).toString(),null);++this.textureCacheFrameMarkerCount_;var d=[],e=a.layersArray,f=a.view2DState.resolution,g,h,k,l;g=0;for(h=e.length;g=l.minResolution)&&d.push(k);g=0;for(h=d.length;gol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK&&a.postRenderFunctions.push(goog.bind(this.expireCache_,this));this.tileTextureQueue_.isEmpty()||(a.postRenderFunctions.push(this.loadNextTileTexture_), +a.animate=!0);this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE,a);this.scheduleRemoveUnusedLayerRenderers(a);this.scheduleExpireIconCache(a)};ol.OL3_URL="http://ol3js.org/";ol.OL3_LOGO_URL="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAHGAAABxgEXwfpGAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAhNQTFRF////AP//AICAgP//AFVVQECA////K1VVSbbbYL/fJ05idsTYJFtbbcjbJllmZszWWMTOIFhoHlNiZszTa9DdUcHNHlNlV8XRIVdiasrUHlZjIVZjaMnVH1RlIFRkH1RkH1ZlasvYasvXVsPQH1VkacnVa8vWIVZjIFRjVMPQa8rXIVVkXsXRsNveIFVkIFZlIVVj3eDeh6GmbMvXH1ZkIFRka8rWbMvXIFVkIFVjIFVkbMvWH1VjbMvWIFVlbcvWIFVla8vVIFVkbMvWbMvVH1VkbMvWIFVlbcvWIFVkbcvVbMvWjNPbIFVkU8LPwMzNIFVkbczWIFVkbsvWbMvXIFVkRnB8bcvW2+TkW8XRIFVkIlZlJVloJlpoKlxrLl9tMmJwOWd0Omh1RXF8TneCT3iDUHiDU8LPVMLPVcLPVcPQVsPPVsPQV8PQWMTQWsTQW8TQXMXSXsXRX4SNX8bSYMfTYcfTYsfTY8jUZcfSZsnUaIqTacrVasrVa8jTa8rWbI2VbMvWbcvWdJObdcvUdszUd8vVeJaee87Yfc3WgJyjhqGnitDYjaarldPZnrK2oNbborW5o9bbo9fbpLa6q9ndrL3ArtndscDDutzfu8fJwN7gwt7gxc/QyuHhy+HizeHi0NfX0+Pj19zb1+Tj2uXk29/e3uLg3+Lh3+bl4uXj4ufl4+fl5Ofl5ufl5ujm5+jmySDnBAAAAFp0Uk5TAAECAgMEBAYHCA0NDg4UGRogIiMmKSssLzU7PkJJT1JTVFliY2hrdHZ3foSFhYeJjY2QkpugqbG1tre5w8zQ09XY3uXn6+zx8vT09vf4+Pj5+fr6/P39/f3+gz7SsAAAAVVJREFUOMtjYKA7EBDnwCPLrObS1BRiLoJLnte6CQy8FLHLCzs2QUG4FjZ5GbcmBDDjxJBXDWxCBrb8aM4zbkIDzpLYnAcE9VXlJSWlZRU13koIeW57mGx5XjoMZEUqwxWYQaQbSzLSkYGfKFSe0QMsX5WbjgY0YS4MBplemI4BdGBW+DQ11eZiymfqQuXZIjqwyadPNoSZ4L+0FVM6e+oGI6g8a9iKNT3o8kVzNkzRg5lgl7p4wyRUL9Yt2jAxVh6mQCogae6GmflI8p0r13VFWTHBQ0rWPW7ahgWVcPm+9cuLoyy4kCJDzCm6d8PSFoh0zvQNC5OjDJhQopPPJqph1doJBUD5tnkbZiUEqaCnB3bTqLTFG1bPn71kw4b+GFdpLElKIzRxxgYgWNYc5SCENVHKeUaltHdXx0dZ8uBI1hJ2UUDgq82CM2MwKeibqAvSO7MCABq0wXEPiqWEAAAAAElFTkSuQmCC"; +ol.RendererHint={CANVAS:"canvas",DOM:"dom",WEBGL:"webgl"};ol.DEFAULT_RENDERER_HINTS=[ol.RendererHint.WEBGL,ol.RendererHint.CANVAS,ol.RendererHint.DOM];ol.MapProperty={LAYERGROUP:"layergroup",SIZE:"size",TARGET:"target",VIEW:"view"}; +ol.Map=function(a){ol.Object.call(this);var b=ol.Map.createOptionsInternal(a);this.pixelRatio_=goog.isDef(a.pixelRatio)?a.pixelRatio:ol.BrowserFeature.DEVICE_PIXEL_RATIO;this.ol3Logo_=b.ol3Logo;this.animationDelay_=new goog.async.AnimationDelay(this.renderFrame_,void 0,this);this.registerDisposable(this.animationDelay_);this.coordinateToPixelMatrix_=goog.vec.Mat4.createNumber();this.pixelToCoordinateMatrix_=goog.vec.Mat4.createNumber();this.frameIndex_=0;this.layerGroupPropertyListenerKeys_=this.viewPropertyListenerKey_= +this.frameState_=null;this.viewport_=goog.dom.createDom(goog.dom.TagName.DIV,"ol-viewport");this.viewport_.style.position="relative";this.viewport_.style.overflow="hidden";this.viewport_.style.width="100%";this.viewport_.style.height="100%";this.viewport_.style.msTouchAction="none";ol.BrowserFeature.HAS_TOUCH&&(this.viewport_.className="ol-touch");this.overlayContainer_=goog.dom.createDom(goog.dom.TagName.DIV,"ol-overlaycontainer");goog.dom.appendChild(this.viewport_,this.overlayContainer_);this.overlayContainerStopEvent_= +goog.dom.createDom(goog.dom.TagName.DIV,"ol-overlaycontainer-stopevent");goog.events.listen(this.overlayContainerStopEvent_,[goog.events.EventType.CLICK,goog.events.EventType.DBLCLICK,goog.events.EventType.MOUSEDOWN,goog.events.EventType.TOUCHSTART,goog.events.EventType.MSPOINTERDOWN],goog.events.Event.stopPropagation);goog.dom.appendChild(this.viewport_,this.overlayContainerStopEvent_);a=new ol.MapBrowserEventHandler(this);goog.events.listen(a,goog.object.getValues(ol.MapBrowserEvent.EventType), +this.handleMapBrowserEvent,!1,this);this.registerDisposable(a);this.keyboardEventTarget_=b.keyboardEventTarget;this.keyHandler_=new goog.events.KeyHandler;goog.events.listen(this.keyHandler_,goog.events.KeyHandler.EventType.KEY,this.handleBrowserEvent,!1,this);this.registerDisposable(this.keyHandler_);a=new goog.events.MouseWheelHandler(this.viewport_);goog.events.listen(a,goog.events.MouseWheelHandler.EventType.MOUSEWHEEL,this.handleBrowserEvent,!1,this);this.registerDisposable(a);this.controls_= +b.controls;this.deviceOptions_=b.deviceOptions;this.interactions_=b.interactions;this.overlays_=b.overlays;this.renderer_=new b.rendererConstructor(this.viewport_,this);this.registerDisposable(this.renderer_);this.viewportSizeMonitor_=new goog.dom.ViewportSizeMonitor;goog.events.listen(this.viewportSizeMonitor_,goog.events.EventType.RESIZE,this.updateSize,!1,this);this.focus_=null;this.preRenderFunctions_=[];this.postRenderFunctions_=[];this.tileQueue_=new ol.TileQueue(goog.bind(this.getTilePriority, +this),goog.bind(this.handleTileChange_,this));goog.events.listen(this,ol.Object.getChangeEventType(ol.MapProperty.LAYERGROUP),this.handleLayerGroupChanged_,!1,this);goog.events.listen(this,ol.Object.getChangeEventType(ol.MapProperty.VIEW),this.handleViewChanged_,!1,this);goog.events.listen(this,ol.Object.getChangeEventType(ol.MapProperty.SIZE),this.handleSizeChanged_,!1,this);goog.events.listen(this,ol.Object.getChangeEventType(ol.MapProperty.TARGET),this.handleTargetChanged_,!1,this);this.setValues(b.values); +this.controls_.forEach(function(a){a.setMap(this)},this);goog.events.listen(this.controls_,ol.CollectionEventType.ADD,function(a){a.element.setMap(this)},!1,this);goog.events.listen(this.controls_,ol.CollectionEventType.REMOVE,function(a){a.element.setMap(null)},!1,this);this.interactions_.forEach(function(a){a.setMap(this)},this);goog.events.listen(this.interactions_,ol.CollectionEventType.ADD,function(a){a.element.setMap(this)},!1,this);goog.events.listen(this.interactions_,ol.CollectionEventType.REMOVE, +function(a){a.element.setMap(null)},!1,this);this.overlays_.forEach(function(a){a.setMap(this)},this);goog.events.listen(this.overlays_,ol.CollectionEventType.ADD,function(a){a.element.setMap(this)},!1,this);goog.events.listen(this.overlays_,ol.CollectionEventType.REMOVE,function(a){a.element.setMap(null)},!1,this)};goog.inherits(ol.Map,ol.Object);ol.Map.prototype.addControl=function(a){this.getControls().push(a)};ol.Map.prototype.addInteraction=function(a){this.getInteractions().push(a)}; +ol.Map.prototype.addLayer=function(a){this.getLayerGroup().getLayers().push(a)};ol.Map.prototype.addOverlay=function(a){this.getOverlays().push(a)};ol.Map.prototype.beforeRender=function(a){this.render();Array.prototype.push.apply(this.preRenderFunctions_,arguments)};ol.Map.prototype.removePreRenderFunction=function(a){return goog.array.remove(this.preRenderFunctions_,a)};ol.Map.prototype.disposeInternal=function(){goog.dom.removeNode(this.viewport_);ol.Map.superClass_.disposeInternal.call(this)}; +ol.Map.prototype.forEachFeatureAtPixel=function(a,b,c,d,e){if(!goog.isNull(this.frameState_))return a=this.getCoordinateFromPixel(a),c=goog.isDef(c)?c:null,d=goog.isDef(d)?d:goog.functions.TRUE,e=goog.isDef(e)?e:null,this.renderer_.forEachFeatureAtPixel(a,this.frameState_,b,c,d,e)};ol.Map.prototype.getEventCoordinate=function(a){return this.getCoordinateFromPixel(this.getEventPixel(a))}; +ol.Map.prototype.getEventPixel=function(a){if(goog.isDef(a.changedTouches)){a=a.changedTouches.item(0);var b=goog.style.getClientPosition(this.viewport_);return[a.clientX-b.x,a.clientY-b.y]}a=goog.style.getRelativePosition(a,this.viewport_);return[a.x,a.y]};ol.Map.prototype.getTarget=function(){return this.get(ol.MapProperty.TARGET)};goog.exportProperty(ol.Map.prototype,"getTarget",ol.Map.prototype.getTarget); +ol.Map.prototype.getCoordinateFromPixel=function(a){var b=this.frameState_;if(goog.isNull(b))return null;a=a.slice();return ol.vec.Mat4.multVec2(b.pixelToCoordinateMatrix,a,a)};ol.Map.prototype.getControls=function(){return this.controls_};ol.Map.prototype.getOverlays=function(){return this.overlays_};ol.Map.prototype.getInteractions=function(){return this.interactions_};ol.Map.prototype.getLayerGroup=function(){return this.get(ol.MapProperty.LAYERGROUP)}; +goog.exportProperty(ol.Map.prototype,"getLayerGroup",ol.Map.prototype.getLayerGroup);ol.Map.prototype.getLayers=function(){var a=this.getLayerGroup();if(goog.isDef(a))return a.getLayers()};ol.Map.prototype.getPixelFromCoordinate=function(a){var b=this.frameState_;if(goog.isNull(b))return null;a=a.slice(0,2);return ol.vec.Mat4.multVec2(b.coordinateToPixelMatrix,a,a)};ol.Map.prototype.getSize=function(){return this.get(ol.MapProperty.SIZE)};goog.exportProperty(ol.Map.prototype,"getSize",ol.Map.prototype.getSize); +ol.Map.prototype.getView=function(){return this.get(ol.MapProperty.VIEW)};goog.exportProperty(ol.Map.prototype,"getView",ol.Map.prototype.getView);ol.Map.prototype.getViewport=function(){return this.viewport_};ol.Map.prototype.getOverlayContainer=function(){return this.overlayContainer_};ol.Map.prototype.getOverlayContainerStopEvent=function(){return this.overlayContainerStopEvent_}; +ol.Map.prototype.getTilePriority=function(a,b,c,d){var e=this.frameState_;if(goog.isNull(e)||!(b in e.wantedTiles)||!e.wantedTiles[b][a.tileCoord.toString()])return ol.structs.PriorityQueue.DROP;a=c[0]-e.focus[0];c=c[1]-e.focus[1];return 65536*Math.log(d)+Math.sqrt(a*a+c*c)/d};ol.Map.prototype.handleBrowserEvent=function(a,b){var c=new ol.MapBrowserEvent(b||a.type,this,a);this.handleMapBrowserEvent(c)}; +ol.Map.prototype.handleMapBrowserEvent=function(a){if(!goog.isNull(this.frameState_)){this.focus_=a.coordinate;a.frameState=this.frameState_;var b=this.getInteractions().getArray(),c;if(!1!==this.dispatchEvent(a))for(c=b.length-1;0<=c&&b[c].handleMapBrowserEvent(a);c--);}}; +ol.Map.prototype.handlePostRender=function(){var a=this.frameState_,b=this.tileQueue_;if(!b.isEmpty()){var c=16,d=c,e=0;if(!goog.isNull(a)){var e=a.viewHints,f=this.deviceOptions_;e[ol.ViewHint.ANIMATING]&&(c=!1===f.loadTilesWhileAnimating?0:8,d=2);e[ol.ViewHint.INTERACTING]&&(c=!1===f.loadTilesWhileInteracting?0:8,d=2);e=goog.object.getCount(a.wantedTiles)}c*=e;d*=e;b.getTilesLoading()=a[0]||0>=a[1])return!1;a=this.getView();return goog.isDef(a)&&a.isDef()?!0:!1};ol.Map.prototype.isRendered=function(){return!goog.isNull(this.frameState_)};ol.Map.prototype.renderSync=function(){this.animationDelay_.fire()}; +ol.Map.prototype.render=function(){this.animationDelay_.isActive()||this.animationDelay_.start()};ol.Map.prototype.removeControl=function(a){var b=this.getControls();if(goog.isDef(b.remove(a)))return a};ol.Map.prototype.removeInteraction=function(a){var b,c=this.getInteractions();goog.isDef(c.remove(a))&&(b=a);return b};ol.Map.prototype.removeLayer=function(a){return this.getLayerGroup().getLayers().remove(a)};ol.Map.prototype.removeOverlay=function(a){var b=this.getOverlays();if(goog.isDef(b.remove(a)))return a}; +ol.Map.prototype.renderFrame_=function(a){var b,c,d,e=this.getSize();b=this.getView();var f=goog.isDef(b)?this.getView().getView2D():void 0,g=null;if(goog.isDef(e)&&0this.minPointsPerRing_,e=[this.sketchRawPolygon_[0][0],this.sketchRawPolygon_[0][this.sketchRawPolygon_[0].length-2]]);if(d)for(var c=a.map,d=0,f=e.length;dthis.highWaterMark_};ol.TileCache.prototype.expireCache=function(a){for(var b,c;this.canExpireCache()&&!(b=this.peekLast(),c=b.tileCoord.z.toString(),c in a&&a[c].contains(b.tileCoord));)this.pop()}; +ol.TileCache.prototype.pruneTileRange=function(a){for(var b=this.getCount(),c;b--;)c=this.peekLastKey(),a.contains(ol.TileCoord.createFromString(c))?this.pop():this.get(c)};ol.TileUrlFunction={};ol.TileUrlFunction.createFromTemplate=function(a){return function(b,c,d){return goog.isNull(b)?void 0:a.replace("{z}",b.z.toString()).replace("{x}",b.x.toString()).replace("{y}",b.y.toString())}};ol.TileUrlFunction.createFromTemplates=function(a){return ol.TileUrlFunction.createFromTileUrlFunctions(goog.array.map(a,ol.TileUrlFunction.createFromTemplate))}; +ol.TileUrlFunction.createFromTileUrlFunctions=function(a){return 1===a.length?a[0]:function(b,c,d){if(!goog.isNull(b)){var e=goog.math.modulo(b.hash(),a.length);return a[e].call(this,b,c,d)}}};ol.TileUrlFunction.nullTileUrlFunction=function(a,b,c){};ol.TileUrlFunction.withTileCoordTransform=function(a,b){var c=new ol.TileCoord(0,0,0);return function(d,e,f){return goog.isNull(d)?void 0:b.call(this,a.call(this,d,f,c),e,f)}}; +ol.TileUrlFunction.expandUrl=function(a){var b=[],c=/\{(\d)-(\d)\}/.exec(a)||/\{([a-z])-([a-z])\}/.exec(a);if(c)for(var d=c[1].charCodeAt(0),e=c[2].charCodeAt(0);d<=e;++d)b.push(a.replace(c[0],String.fromCharCode(d)));else b.push(a);return b};ol.binary={};ol.binary.Buffer=function(a){this.data_=a};ol.binary.Buffer.prototype.getReader=function(){var a=this.data_;if(ol.BrowserFeature.HAS_ARRAY_BUFFER){var b;if(a instanceof ArrayBuffer)b=a;else if(goog.isString(a)){b=new ArrayBuffer(a.length);var c=new Uint8Array(b),d,e;d=0;for(e=a.length;db?(d="\u2032",a*=60):d="\u00b0":e==ol.control.ScaleLineUnits.IMPERIAL? +0.9144>b?(d="in",a/=0.0254):1609.344>b?(d="ft",a/=0.3048):(d="mi",a/=1609.344):e==ol.control.ScaleLineUnits.NAUTICAL?(a/=1852,d="nm"):e==ol.control.ScaleLineUnits.METRIC?1>b?(d="mm",a*=1E3):1E3>b?d="m":(d="km",a/=1E3):e==ol.control.ScaleLineUnits.US&&(0.9144>b?(d="in",a*=39.37):1609.344>b?(d="ft",a/=0.30480061):(d="mi",a/=1609.3472));for(var e=3*Math.floor(Math.log(this.minWidth_*a)/Math.log(10)),f,g;;){f=ol.control.ScaleLine.LEADING_DIGITS[e%3]*Math.pow(10,Math.floor(e/3));g=Math.round(f/a);if(g>= +this.minWidth_)break;++e}f+=d;this.renderedHTML_!=f&&(this.renderedHTML_=this.innerElement_.innerHTML=f);this.renderedWidth_!=g&&(this.innerElement_.style.width=g+"px",this.renderedWidth_=g);this.renderedVisible_||(goog.style.setElementShown(this.element_,!0),this.renderedVisible_=!0)}};goog.events.EventHandler=function(a){goog.Disposable.call(this);this.handler_=a;this.keys_={}};goog.inherits(goog.events.EventHandler,goog.Disposable);goog.events.EventHandler.typeArray_=[];goog.events.EventHandler.prototype.listen=function(a,b,c,d,e){goog.isArray(b)||(goog.events.EventHandler.typeArray_[0]=b,b=goog.events.EventHandler.typeArray_);for(var f=0;fthis.hysteresisDistanceSquared_)if(this.fireDragStart_(a))this.dragging_=!0;else{this.isDisposed()||this.endDrag(a); +return}}c=this.calculatePosition_(b,c);b=c.x;c=c.y;this.dragging_&&this.dispatchEvent(new goog.fx.DragEvent(goog.fx.Dragger.EventType.BEFOREDRAG,this,a.clientX,a.clientY,a,b,c))&&(this.doDrag(a,b,c,!1),a.preventDefault())}}; +goog.fx.Dragger.prototype.calculatePosition_=function(a,b){var c=goog.dom.getDomHelper(this.document_).getDocumentScroll();a+=c.x-this.pageScroll.x;b+=c.y-this.pageScroll.y;this.pageScroll=c;this.deltaX+=a;this.deltaY+=b;var c=this.limitX(this.deltaX),d=this.limitY(this.deltaY);return new goog.math.Coordinate(c,d)};goog.fx.Dragger.prototype.onScroll_=function(a){var b=this.calculatePosition_(0,0);a.clientX=this.clientX;a.clientY=this.clientY;this.doDrag(a,b.x,b.y,!0)}; +goog.fx.Dragger.prototype.doDrag=function(a,b,c,d){this.defaultAction(b,c);this.dispatchEvent(new goog.fx.DragEvent(goog.fx.Dragger.EventType.DRAG,this,a.clientX,a.clientY,a,b,c))};goog.fx.Dragger.prototype.limitX=function(a){var b=this.limits,c=isNaN(b.left)?null:b.left,b=isNaN(b.width)?0:b.width;return Math.min(null!=c?c+b:Infinity,Math.max(null!=c?c:-Infinity,a))}; +goog.fx.Dragger.prototype.limitY=function(a){var b=this.limits,c=isNaN(b.top)?null:b.top,b=isNaN(b.height)?0:b.height;return Math.min(null!=c?c+b:Infinity,Math.max(null!=c?c:-Infinity,a))};goog.fx.Dragger.prototype.defaultAction=function(a,b){this.useRightPositioningForRtl_&&this.isRightToLeft_()?this.target.style.right=a+"px":this.target.style.left=a+"px";this.target.style.top=b+"px"};goog.fx.Dragger.prototype.isDragging=function(){return this.dragging_}; +goog.fx.DragEvent=function(a,b,c,d,e,f,g,h){goog.events.Event.call(this,a);this.clientX=c;this.clientY=d;this.browserEvent=e;this.left=goog.isDef(f)?f:b.deltaX;this.top=goog.isDef(g)?g:b.deltaY;this.dragger=b;this.dragCanceled=!!h};goog.inherits(goog.fx.DragEvent,goog.events.Event);ol.control.ZOOMSLIDER_ANIMATION_DURATION=200; +ol.control.ZoomSlider=function(a){a=goog.isDef(a)?a:{};this.currentResolution_=void 0;this.direction_=ol.control.ZoomSlider.direction.VERTICAL;this.sliderInitialized_=!1;var b=goog.isDef(a.className)?a.className:"ol-zoomslider";a=goog.dom.createDom(goog.dom.TagName.DIV,[b+"-thumb",ol.css.CLASS_UNSELECTABLE]);b=goog.dom.createDom(goog.dom.TagName.DIV,[b,ol.css.CLASS_UNSELECTABLE],a);this.dragger_=new goog.fx.Dragger(a);this.registerDisposable(this.dragger_);goog.events.listen(this.dragger_,[goog.fx.Dragger.EventType.DRAG, +goog.fx.Dragger.EventType.END],this.handleSliderChange_,void 0,this);goog.events.listen(b,goog.events.EventType.CLICK,this.handleContainerClick_,!1,this);goog.events.listen(a,goog.events.EventType.CLICK,goog.events.Event.stopPropagation);ol.control.Control.call(this,{element:b})};goog.inherits(ol.control.ZoomSlider,ol.control.Control);ol.control.ZoomSlider.direction={VERTICAL:0,HORIZONTAL:1}; +ol.control.ZoomSlider.prototype.setMap=function(a){ol.control.ZoomSlider.superClass_.setMap.call(this,a);goog.isNull(a)||a.render()}; +ol.control.ZoomSlider.prototype.initSlider_=function(){var a=this.element,b=goog.dom.getFirstElementChild(a),a=goog.style.getContentBoxSize(a),c=goog.style.getBounds(b),d=goog.style.getMarginBox(b),e=goog.style.getBorderBox(b),b=a.width-d.left-d.right-e.left-e.right-c.width,c=a.height-d.top-d.bottom-e.top-e.bottom-c.height;a.width>a.height?(this.direction_=ol.control.ZoomSlider.direction.HORIZONTAL,a=new goog.math.Rect(0,0,b,0)):(this.direction_=ol.control.ZoomSlider.direction.VERTICAL,a=new goog.math.Rect(0, +0,0,c));this.dragger_.setLimits(a);this.sliderInitialized_=!0};ol.control.ZoomSlider.prototype.handleMapPostrender=function(a){goog.isNull(a.frameState)||(this.sliderInitialized_||this.initSlider_(),a=a.frameState.view2DState.resolution,a!==this.currentResolution_&&(this.currentResolution_=a,this.positionThumbForResolution_(a)))}; +ol.control.ZoomSlider.prototype.handleContainerClick_=function(a){var b=this.getMap(),c=b.getView().getView2D();a=this.amountDragged_(a.offsetX,a.offsetY);a=this.resolutionForAmount_(a);b.beforeRender(ol.animation.zoom({resolution:a,duration:ol.control.ZOOMSLIDER_ANIMATION_DURATION,easing:ol.easing.easeOut}));a=c.constrainResolution(a);c.setResolution(a)}; +ol.control.ZoomSlider.prototype.positionThumbForResolution_=function(a){a=this.amountForResolution_(a);var b=this.dragger_,c=goog.dom.getFirstElementChild(this.element);this.direction_==ol.control.ZoomSlider.direction.HORIZONTAL?goog.style.setPosition(c,b.limits.left+b.limits.width*a):goog.style.setPosition(c,b.limits.left,b.limits.top+b.limits.height*a)}; +ol.control.ZoomSlider.prototype.amountDragged_=function(a,b){var c=this.dragger_.limits,d=0;return d=this.direction_===ol.control.ZoomSlider.direction.HORIZONTAL?(a-c.left)/c.width:(b-c.top)/c.height};ol.control.ZoomSlider.prototype.resolutionForAmount_=function(a){a=-1*(goog.math.clamp(a,0,1)-1);return this.getMap().getView().getView2D().getResolutionForValueFunction()(a)}; +ol.control.ZoomSlider.prototype.amountForResolution_=function(a){return-1*(this.getMap().getView().getView2D().getValueForResolutionFunction()(a)-1)}; +ol.control.ZoomSlider.prototype.handleSliderChange_=function(a){var b=this.getMap(),c=b.getView().getView2D();a.type===goog.fx.Dragger.EventType.DRAG?(a=this.amountDragged_(a.left,a.top),a=this.resolutionForAmount_(a),a!==this.currentResolution_&&(this.currentResolution_=a,c.setResolution(a))):(b.beforeRender(ol.animation.zoom({resolution:this.currentResolution_,duration:ol.control.ZOOMSLIDER_ANIMATION_DURATION,easing:ol.easing.easeOut})),a=c.constrainResolution(this.currentResolution_),c.setResolution(a))};ol.control.ZoomToExtent=function(a){a=goog.isDef(a)?a:{};this.extent_=goog.isDef(a.extent)?a.extent:null;var b=goog.isDef(a.className)?a.className:"ol-zoom-extent",c=goog.isDef(a.tipLabel)?a.tipLabel:"Fit to extent",c=goog.dom.createDom(goog.dom.TagName.SPAN,{role:"tooltip"},c),b=goog.dom.createDom(goog.dom.TagName.DIV,{"class":b+" "+ol.css.CLASS_UNSELECTABLE}),d=goog.dom.createDom(goog.dom.TagName.BUTTON,{"class":"ol-has-tooltip"});goog.dom.appendChild(d,c);goog.dom.appendChild(b,d);goog.events.listen(d, +[goog.events.EventType.TOUCHEND,goog.events.EventType.CLICK],this.handleZoomToExtent_,!1,this);goog.events.listen(d,[goog.events.EventType.MOUSEOUT,goog.events.EventType.FOCUSOUT],function(){this.blur()},!1);ol.control.Control.call(this,{element:b,target:a.target})};goog.inherits(ol.control.ZoomToExtent,ol.control.Control); +ol.control.ZoomToExtent.prototype.handleZoomToExtent_=function(a){a.preventDefault();a=this.getMap();var b=a.getView().getView2D(),c=goog.isNull(this.extent_)?b.getProjection().getExtent():this.extent_;b.fitExtent(c,a.getSize())};ol.dom.InputProperty={VALUE:"value",CHECKED:"checked"};ol.dom.Input=function(a){ol.Object.call(this);this.target_=a;goog.events.listen(this.target_,[goog.events.EventType.CHANGE,goog.events.EventType.INPUT],this.handleInputChanged_,!1,this);goog.events.listen(this,ol.Object.getChangeEventType(ol.dom.InputProperty.VALUE),this.handleValueChanged_,!1,this);goog.events.listen(this,ol.Object.getChangeEventType(ol.dom.InputProperty.CHECKED),this.handleCheckedChanged_,!1,this)}; +goog.inherits(ol.dom.Input,ol.Object);ol.dom.Input.prototype.getChecked=function(){return this.get(ol.dom.InputProperty.CHECKED)};goog.exportProperty(ol.dom.Input.prototype,"getChecked",ol.dom.Input.prototype.getChecked);ol.dom.Input.prototype.getValue=function(){return this.get(ol.dom.InputProperty.VALUE)};goog.exportProperty(ol.dom.Input.prototype,"getValue",ol.dom.Input.prototype.getValue);ol.dom.Input.prototype.setValue=function(a){this.set(ol.dom.InputProperty.VALUE,a)}; +goog.exportProperty(ol.dom.Input.prototype,"setValue",ol.dom.Input.prototype.setValue);ol.dom.Input.prototype.setChecked=function(a){this.set(ol.dom.InputProperty.CHECKED,a)};goog.exportProperty(ol.dom.Input.prototype,"setChecked",ol.dom.Input.prototype.setChecked);ol.dom.Input.prototype.handleInputChanged_=function(a){a=this.target_;"checkbox"===a.type||"radio"===a.type?this.setChecked(a.checked):this.setValue(a.value)}; +ol.dom.Input.prototype.handleCheckedChanged_=function(a){this.target_.checked=this.getChecked()};ol.dom.Input.prototype.handleValueChanged_=function(a){this.target_.value=this.getValue()};ol.ellipsoid={};ol.ellipsoid.BESSEL1841=new ol.Ellipsoid(6377397.155,1/299.15281285);ol.ellipsoid.WGS84=new ol.Ellipsoid(6378137,1/298.257223563);ol.format={};ol.format.Feature=function(){};ol.format.FormatType={BINARY:"binary",JSON:"json",TEXT:"text",XML:"xml"};ol.format.BinaryFeature=function(){ol.format.Feature.call(this)};goog.inherits(ol.format.BinaryFeature,ol.format.Feature);ol.format.BinaryFeature.getBuffer_=function(a){return ol.BrowserFeature.HAS_ARRAY_BUFFER&&a instanceof ArrayBuffer?new ol.binary.Buffer(a):goog.isString(a)?new ol.binary.Buffer(a):null};ol.format.BinaryFeature.prototype.getType=function(){return ol.format.FormatType.BINARY};ol.format.BinaryFeature.prototype.readFeature=function(a){return this.readFeatureFromBuffer(ol.format.BinaryFeature.getBuffer_(a))}; +ol.format.BinaryFeature.prototype.readFeatures=function(a){return this.readFeaturesFromBuffer(ol.format.BinaryFeature.getBuffer_(a))};ol.format.BinaryFeature.prototype.readGeometry=function(a){return this.readGeometryFromBuffer(ol.format.BinaryFeature.getBuffer_(a))};ol.format.BinaryFeature.prototype.readProjection=function(a){return this.readProjectionFromBuffer(ol.format.BinaryFeature.getBuffer_(a))};goog.dom.xml={};goog.dom.xml.MAX_XML_SIZE_KB=2048;goog.dom.xml.MAX_ELEMENT_DEPTH=256; +goog.dom.xml.createDocument=function(a,b){if(b&&!a)throw Error("Can't create document with namespace and no root tag");if(document.implementation&&document.implementation.createDocument)return document.implementation.createDocument(b||"",a||"",null);if("undefined"!=typeof ActiveXObject){var c=goog.dom.xml.createMsXmlDocument_();if(c)return a&&c.appendChild(c.createNode(goog.dom.NodeType.ELEMENT,a,b||"")),c}throw Error("Your browser does not support creating new documents");}; +goog.dom.xml.loadXml=function(a){if("undefined"!=typeof DOMParser)return(new DOMParser).parseFromString(a,"application/xml");if("undefined"!=typeof ActiveXObject){var b=goog.dom.xml.createMsXmlDocument_();b.loadXML(a);return b}throw Error("Your browser does not support loading xml documents");}; +goog.dom.xml.serialize=function(a){if("undefined"!=typeof XMLSerializer)return(new XMLSerializer).serializeToString(a);if(a=a.xml)return a;throw Error("Your browser does not support serializing XML documents");}; +goog.dom.xml.selectSingleNode=function(a,b){if("undefined"!=typeof a.selectSingleNode){var c=goog.dom.getOwnerDocument(a);"undefined"!=typeof c.setProperty&&c.setProperty("SelectionLanguage","XPath");return a.selectSingleNode(b)}if(document.implementation.hasFeature("XPath","3.0")){var c=goog.dom.getOwnerDocument(a),d=c.createNSResolver(c.documentElement);return c.evaluate(b,a,d,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue}return null}; +goog.dom.xml.selectNodes=function(a,b){if("undefined"!=typeof a.selectNodes){var c=goog.dom.getOwnerDocument(a);"undefined"!=typeof c.setProperty&&c.setProperty("SelectionLanguage","XPath");return a.selectNodes(b)}if(document.implementation.hasFeature("XPath","3.0")){for(var c=goog.dom.getOwnerDocument(a),d=c.createNSResolver(c.documentElement),c=c.evaluate(b,a,d,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),d=[],e=c.snapshotLength,f=0;fb?e+="000":256>b?e+="00":4096>b&&(e+="0");return goog.json.Serializer.charToJsonCharCache_[a]=e+b.toString(16)}),'"')};goog.json.Serializer.prototype.serializeNumber_=function(a,b){b.push(isFinite(a)&&!isNaN(a)?a:"null")}; +goog.json.Serializer.prototype.serializeArray=function(a,b){var c=a.length;b.push("[");for(var d="",e=0;ed?~(d<<1):d<<1}return ol.format.Polyline.encodeUnsignedIntegers(a)}; +ol.format.Polyline.decodeSignedIntegers=function(a){a=ol.format.Polyline.decodeUnsignedIntegers(a);var b,c;b=0;for(c=a.length;b>1):d>>1}return a};ol.format.Polyline.encodeUnsignedIntegers=function(a){var b="",c,d;c=0;for(d=a.length;cg?(b.push(c),d=c=0):d+=5}return b}; +ol.format.Polyline.encodeUnsignedInteger=function(a){for(var b,c="";32<=a;)b=(32|a&31)+63,c+=String.fromCharCode(b),a>>=5;return c+=String.fromCharCode(a+63)};ol.format.Polyline.prototype.readFeatureFromText=function(a){a=this.readGeometryFromText(a);return new ol.Feature(a)};ol.format.Polyline.prototype.readFeaturesFromText=function(a){return[this.readFeatureFromText(a)]}; +ol.format.Polyline.prototype.readGeometryFromText=function(a){a=ol.format.Polyline.decodeFlatCoordinates(a,2);a=ol.geom.flat.inflateCoordinates(a,0,a.length,2);return new ol.geom.LineString(a)};ol.format.Polyline.prototype.readProjectionFromText=function(a){return ol.proj.get("EPSG:4326")};ol.format.Polyline.prototype.writeFeatureText=function(a){a=a.getGeometry();return goog.isDefAndNotNull(a)?this.writeGeometryText(a):""};ol.format.Polyline.prototype.writeFeaturesText=function(a){return this.writeFeatureText(a[0])}; +ol.format.Polyline.prototype.writeGeometryText=function(a){var b=a.getFlatCoordinates();a=a.getStride();return ol.format.Polyline.encodeFlatCoordinates(b,a)};ol.format.TopoJSON=function(a){a=goog.isDef(a)?a:{};ol.format.JSONFeature.call(this);this.defaultProjection_=ol.proj.get(a.defaultProjection||"EPSG:4326")};goog.inherits(ol.format.TopoJSON,ol.format.JSONFeature);ol.format.TopoJSON.EXTENSIONS_=[".topojson"];ol.format.TopoJSON.concatenateArcs_=function(a,b){var c=[],d,e,f;e=0;for(f=a.length;e=this.branches_&&this.cancel()}; +goog.async.Deferred.prototype.continue_=function(a,b){this.blocked_=!1;this.updateResult_(a,b)};goog.async.Deferred.prototype.updateResult_=function(a,b){this.fired_=!0;this.result_=b;this.hadError_=!a;this.fire_()};goog.async.Deferred.prototype.check_=function(){if(this.hasFired()){if(!this.silentlyCanceled_)throw new goog.async.Deferred.AlreadyCalledError(this);this.silentlyCanceled_=!1}}; +goog.async.Deferred.prototype.callback=function(a){this.check_();this.assertNotDeferred_(a);this.updateResult_(!0,a)};goog.async.Deferred.prototype.errback=function(a){this.check_();this.assertNotDeferred_(a);this.makeStackTraceLong_(a);this.updateResult_(!1,a)};goog.async.Deferred.prototype.makeStackTraceLong_=function(a){goog.async.Deferred.LONG_STACK_TRACES&&(this.constructorStack_&&goog.isObject(a)&&a.stack&&/^[^\n]+(\n [^\n]+)+/.test(a.stack))&&(a.stack=a.stack+"\nDEFERRED OPERATION:\n"+this.constructorStack_)}; +goog.async.Deferred.prototype.assertNotDeferred_=function(a){};goog.async.Deferred.prototype.addCallback=function(a,b){return this.addCallbacks(a,null,b)};goog.async.Deferred.prototype.addErrback=function(a,b){return this.addCallbacks(null,a,b)};goog.async.Deferred.prototype.addBoth=function(a,b){return this.addCallbacks(a,a,b)};goog.async.Deferred.prototype.addCallbacks=function(a,b,c){this.sequence_.push([a,b,c]);this.hasFired()&&this.fire_();return this}; +goog.async.Deferred.prototype.chainDeferred=function(a){this.addCallbacks(a.callback,a.errback,a);return this};goog.async.Deferred.prototype.awaitDeferred=function(a){return this.addCallback(goog.bind(a.branch,a))};goog.async.Deferred.prototype.branch=function(a){var b=new goog.async.Deferred;this.chainDeferred(b);a&&(b.parent_=this,this.branches_++);return b};goog.async.Deferred.prototype.hasFired=function(){return this.fired_}; +goog.async.Deferred.prototype.isError=function(a){return a instanceof Error};goog.async.Deferred.prototype.hasErrback_=function(){return goog.array.some(this.sequence_,function(a){return goog.isFunction(a[1])})}; +goog.async.Deferred.prototype.fire_=function(){this.unhandledExceptionTimeoutId_&&(this.hasFired()&&this.hasErrback_())&&(goog.global.clearTimeout(this.unhandledExceptionTimeoutId_),delete this.unhandledExceptionTimeoutId_);this.parent_&&(this.parent_.branches_--,delete this.parent_);for(var a=this.result_,b=!1,c=!1;this.sequence_.length&&!this.blocked_;){var d=this.sequence_.shift(),e=d[0],f=d[1],d=d[2];if(e=this.hadError_?f:e)try{var g=e.call(d||this.defaultScope_,a);goog.isDef(g)&&(this.hadError_= +this.hadError_&&(g==a||this.isError(g)),this.result_=a=g);a instanceof goog.async.Deferred&&(this.blocked_=c=!0)}catch(h){a=h,this.hadError_=!0,this.makeStackTraceLong_(a),this.hasErrback_()||(b=!0)}}this.result_=a;c?(a.addCallbacks(goog.bind(this.continue_,this,!0),goog.bind(this.continue_,this,!1)),a.blocking_=!0):!goog.async.Deferred.STRICT_ERRORS||(!this.isError(a)||a instanceof goog.async.Deferred.CanceledError)||(b=this.hadError_=!0);b&&(this.unhandledExceptionTimeoutId_=goog.global.setTimeout(goog.functions.fail(a), +0))};goog.async.Deferred.succeed=function(a){var b=new goog.async.Deferred;b.callback(a);return b};goog.async.Deferred.fail=function(a){var b=new goog.async.Deferred;b.errback(a);return b};goog.async.Deferred.canceled=function(){var a=new goog.async.Deferred;a.cancel();return a};goog.async.Deferred.when=function(a,b,c){return a instanceof goog.async.Deferred?a.branch(!0).addCallback(b,c):goog.async.Deferred.succeed(a).addCallback(b,c)}; +goog.async.Deferred.AlreadyCalledError=function(a){goog.debug.Error.call(this);this.deferred=a};goog.inherits(goog.async.Deferred.AlreadyCalledError,goog.debug.Error);goog.async.Deferred.AlreadyCalledError.prototype.message="Deferred has already fired";goog.async.Deferred.AlreadyCalledError.prototype.name="AlreadyCalledError";goog.async.Deferred.CanceledError=function(a){goog.debug.Error.call(this);this.deferred=a};goog.inherits(goog.async.Deferred.CanceledError,goog.debug.Error); +goog.async.Deferred.CanceledError.prototype.message="Deferred was canceled";goog.async.Deferred.CanceledError.prototype.name="CanceledError";goog.fs={};goog.fs.Error=function(a,b){goog.debug.Error.call(this,goog.string.subs("Error %s: %s",b,goog.fs.Error.getDebugMessage(a)));this.code=a};goog.inherits(goog.fs.Error,goog.debug.Error);goog.fs.Error.ErrorCode={NOT_FOUND:1,SECURITY:2,ABORT:3,NOT_READABLE:4,ENCODING:5,NO_MODIFICATION_ALLOWED:6,INVALID_STATE:7,SYNTAX:8,INVALID_MODIFICATION:9,QUOTA_EXCEEDED:10,TYPE_MISMATCH:11,PATH_EXISTS:12}; +goog.fs.Error.getDebugMessage=function(a){switch(a){case goog.fs.Error.ErrorCode.NOT_FOUND:return"File or directory not found";case goog.fs.Error.ErrorCode.SECURITY:return"Insecure or disallowed operation";case goog.fs.Error.ErrorCode.ABORT:return"Operation aborted";case goog.fs.Error.ErrorCode.NOT_READABLE:return"File or directory not readable";case goog.fs.Error.ErrorCode.ENCODING:return"Invalid encoding";case goog.fs.Error.ErrorCode.NO_MODIFICATION_ALLOWED:return"Cannot modify file or directory"; +case goog.fs.Error.ErrorCode.INVALID_STATE:return"Invalid state";case goog.fs.Error.ErrorCode.SYNTAX:return"Invalid line-ending specifier";case goog.fs.Error.ErrorCode.INVALID_MODIFICATION:return"Invalid modification";case goog.fs.Error.ErrorCode.QUOTA_EXCEEDED:return"Quota exceeded";case goog.fs.Error.ErrorCode.TYPE_MISMATCH:return"Invalid filetype";case goog.fs.Error.ErrorCode.PATH_EXISTS:return"File or directory already exists at specified path";default:return"Unrecognized error"}};goog.fs.ProgressEvent=function(a,b){goog.events.Event.call(this,a.type,b);this.event_=a};goog.inherits(goog.fs.ProgressEvent,goog.events.Event);goog.fs.ProgressEvent.prototype.isLengthComputable=function(){return this.event_.lengthComputable};goog.fs.ProgressEvent.prototype.getLoaded=function(){return this.event_.loaded};goog.fs.ProgressEvent.prototype.getTotal=function(){return this.event_.total};goog.fs.FileReader=function(){goog.events.EventTarget.call(this);this.reader_=new FileReader;this.reader_.onloadstart=goog.bind(this.dispatchProgressEvent_,this);this.reader_.onprogress=goog.bind(this.dispatchProgressEvent_,this);this.reader_.onload=goog.bind(this.dispatchProgressEvent_,this);this.reader_.onabort=goog.bind(this.dispatchProgressEvent_,this);this.reader_.onerror=goog.bind(this.dispatchProgressEvent_,this);this.reader_.onloadend=goog.bind(this.dispatchProgressEvent_,this)}; +goog.inherits(goog.fs.FileReader,goog.events.EventTarget);goog.fs.FileReader.ReadyState={INIT:0,LOADING:1,DONE:2};goog.fs.FileReader.EventType={LOAD_START:"loadstart",PROGRESS:"progress",LOAD:"load",ABORT:"abort",ERROR:"error",LOAD_END:"loadend"};goog.fs.FileReader.prototype.abort=function(){try{this.reader_.abort()}catch(a){throw new goog.fs.Error(a.code,"aborting read");}};goog.fs.FileReader.prototype.getReadyState=function(){return this.reader_.readyState}; +goog.fs.FileReader.prototype.getResult=function(){return this.reader_.result};goog.fs.FileReader.prototype.getError=function(){return this.reader_.error&&new goog.fs.Error(this.reader_.error.code,"reading file")};goog.fs.FileReader.prototype.dispatchProgressEvent_=function(a){this.dispatchEvent(new goog.fs.ProgressEvent(a,this))};goog.fs.FileReader.prototype.disposeInternal=function(){goog.fs.FileReader.superClass_.disposeInternal.call(this);delete this.reader_}; +goog.fs.FileReader.prototype.readAsBinaryString=function(a){this.reader_.readAsBinaryString(a)};goog.fs.FileReader.readAsBinaryString=function(a){var b=new goog.fs.FileReader,c=goog.fs.FileReader.createDeferred_(b);b.readAsBinaryString(a);return c};goog.fs.FileReader.prototype.readAsArrayBuffer=function(a){this.reader_.readAsArrayBuffer(a)};goog.fs.FileReader.readAsArrayBuffer=function(a){var b=new goog.fs.FileReader,c=goog.fs.FileReader.createDeferred_(b);b.readAsArrayBuffer(a);return c}; +goog.fs.FileReader.prototype.readAsText=function(a,b){this.reader_.readAsText(a,b)};goog.fs.FileReader.readAsText=function(a,b){var c=new goog.fs.FileReader,d=goog.fs.FileReader.createDeferred_(c);c.readAsText(a,b);return d};goog.fs.FileReader.prototype.readAsDataUrl=function(a){this.reader_.readAsDataURL(a)};goog.fs.FileReader.readAsDataUrl=function(a){var b=new goog.fs.FileReader,c=goog.fs.FileReader.createDeferred_(b);b.readAsDataUrl(a);return c}; +goog.fs.FileReader.createDeferred_=function(a){var b=new goog.async.Deferred;a.addEventListener(goog.fs.FileReader.EventType.LOAD_END,goog.partial(function(a,b,e){e=b.getResult();var f=b.getError();null==e||f?a.errback(f):a.callback(e);b.dispose()},b,a));return b};ol.interaction.DragAndDrop=function(a){a=goog.isDef(a)?a:{};ol.interaction.Interaction.call(this);this.formatConstructors_=goog.isDef(a.formatConstructors)?a.formatConstructors:[];this.reprojectTo_=goog.isDef(a.reprojectTo)?ol.proj.get(a.reprojectTo):null;this.fileDropHandler_=null;this.dropListenKey_=void 0};goog.inherits(ol.interaction.DragAndDrop,ol.interaction.Interaction); +ol.interaction.DragAndDrop.prototype.disposeInternal=function(){goog.isDef(this.dropListenKey_)&&goog.events.unlistenByKey(this.dropListenKey_);ol.interaction.DragAndDrop.superClass_.disposeInternal.call(this)};ol.interaction.DragAndDrop.prototype.handleDrop_=function(a){a=a.getBrowserEvent().dataTransfer.files;var b,c;b=0;for(c=a.length;b=Math.sqrt(Math.min(h,g))&&(f=h>g?d[1]:d[0]);this.createOrUpdateVertexFeature_(f);f={};f[goog.getUid(d)]=!0;k=1;for(h=e.length;kg&&++p.index}m={segment:[c[0],b],feature:d,geometry:e,depth:f,index:g};h.insert(ol.extent.boundingExtent(m.segment),m);this.dragSegments_.push([m,1]);c={segment:[b,c[1]],feature:d,geometry:e,depth:f,index:g+1};h.insert(ol.extent.boundingExtent(c.segment),c);this.dragSegments_.push([c,0])};ol.interaction.Select=function(a){ol.interaction.Interaction.call(this);this.condition_=goog.isDef(a.condition)?a.condition:ol.events.condition.singleClick;this.addCondition_=goog.isDef(a.addCondition)?a.addCondition:ol.events.condition.shiftKeyOnly;var b;if(goog.isDef(a.layerFilter))b=a.layerFilter;else if(goog.isDef(a.layer)){var c=a.layer;b=function(a){return a===c}}else if(goog.isDef(a.layers)){var d=a.layers;b=function(a){return-1!=goog.array.indexOf(d,a)}}else b=goog.functions.TRUE;this.layerFilter_= +b;this.featureOverlay_=new ol.FeatureOverlay({style:a.style})};goog.inherits(ol.interaction.Select,ol.interaction.Interaction);ol.interaction.Select.prototype.getFeatures=function(){return this.featureOverlay_.getFeatures()}; +ol.interaction.Select.prototype.handleMapBrowserEvent=function(a){if(!this.condition_(a))return!0;var b=this.addCondition_(a),c=a.map,d=this.featureOverlay_.getFeatures();b?c.forEachFeatureAtPixel(a.pixel,function(a,b){-1==goog.array.indexOf(d.getArray(),a)&&d.push(a)},void 0,this.layerFilter_):(a=c.forEachFeatureAtPixel(a.pixel,function(a,b){return a},void 0,this.layerFilter_),goog.isDef(a)?1==d.getLength()?d.getAt(0)!==a&&d.setAt(0,a):(1!=d.getLength()&&d.clear(),d.push(a)):0!==d.getLength()&&d.clear()); +return!1};ol.interaction.Select.prototype.setMap=function(a){ol.interaction.Select.superClass_.setMap.call(this,a);this.featureOverlay_.setMap(a)};ol.layer.HeatmapLayerProperty={GRADIENT:"gradient"}; +ol.layer.Heatmap=function(a){var b=goog.isDef(a)?a:{};ol.layer.Vector.call(this,b);this.gradient_=null;goog.events.listen(this,ol.Object.getChangeEventType(ol.layer.HeatmapLayerProperty.GRADIENT),this.handleGradientChanged_,!1,this);this.setGradient(goog.isDef(b.gradient)?b.gradient:ol.layer.Heatmap.DEFAULT_GRADIENT);a=goog.isDef(b.radius)?b.radius:8;var c=goog.isDef(b.blur)?b.blur:15,b=goog.isDef(b.shadow)?b.shadow:250;a=new ol.style.Style({image:ol.layer.Heatmap.createIcon_(a,c,b)});this.setStyle(a); +goog.events.listen(this,ol.render.EventType.RENDER,this.handleRender_,!1,this)};goog.inherits(ol.layer.Heatmap,ol.layer.Vector);ol.layer.Heatmap.DEFAULT_GRADIENT=["#00f","#0ff","#0f0","#ff0","#f00"]; +ol.layer.Heatmap.createGradient_=function(a){var b=goog.dom.createElement(goog.dom.TagName.CANVAS),c=b.getContext("2d");b.width=1;b.height=256;for(var b=c.createLinearGradient(0,0,1,256),d=1/a.length,e=0,f=a.length;eMath.abs(n-m))break;m=n}d[k]=goog.math.toDegrees(h);d[k+1]=goog.math.toDegrees(n)}return d};ol.proj.CH.translate_=function(a,b,c,d,e){var f=c.length;e=goog.isDef(e)?e:2;d=goog.isDef(d)?d:2n||m<=n)return null;a=a.y;return a<-m||-1=this.minZoom;--a)if(d.minX=d.maxX>>=1,d.minY=d.maxY>>=1,b.call(c,a,d))return!0;return!1};ol.source.BingMaps=function(a){ol.source.TileImage.call(this,{crossOrigin:"anonymous",opaque:!0,projection:ol.proj.get("EPSG:3857"),state:ol.source.State.LOADING,tileLoadFunction:a.tileLoadFunction});this.culture_=goog.isDef(a.culture)?a.culture:"en-us";var b=new goog.Uri("//dev.virtualearth.net/REST/v1/Imagery/Metadata/"+a.imagerySet);(new goog.net.Jsonp(b,"jsonp")).send({include:"ImageryProviders",key:a.key},goog.bind(this.handleImageryMetadataResponse,this))};goog.inherits(ol.source.BingMaps,ol.source.TileImage); +ol.source.BingMaps.TOS_ATTRIBUTION=new ol.Attribution({html:'\x3ca class\x3d"ol-attribution-bing-tos" target\x3d"_blank" href\x3d"http://www.microsoft.com/maps/product/terms.html"\x3eTerms of Use\x3c/a\x3e'}); +ol.source.BingMaps.prototype.handleImageryMetadataResponse=function(a){if(200!=a.statusCode||"OK"!=a.statusDescription||"ValidCredentials"!=a.authenticationResultCode||1!=a.resourceSets.length||1!=a.resourceSets[0].resources.length)this.setState(ol.source.State.ERROR);else{var b=a.brandLogoUri,c=a.resourceSets[0].resources[0],d=new ol.tilegrid.XYZ({minZoom:c.zoomMin,maxZoom:c.zoomMax,tileSize:c.imageWidth});this.tileGrid=d;var e=this.culture_;this.tileUrlFunction=ol.TileUrlFunction.withTileCoordTransform(d.createTileCoordTransform(), +ol.TileUrlFunction.createFromTileUrlFunctions(goog.array.map(c.imageUrlSubdomains,function(a){var b=c.imageUrl.replace("{subdomain}",a).replace("{culture}",e);return function(a,c,d){return goog.isNull(a)?void 0:b.replace("{quadkey}",a.quadKey())}})));if(c.imageryProviders){var f=ol.proj.getTransformFromProjections(ol.proj.get("EPSG:4326"),this.getProjection());a=goog.array.map(c.imageryProviders,function(a){var b=a.attribution,c={};goog.array.forEach(a.coverageAreas,function(a){var b=a.zoomMin,e= +a.zoomMax;a=a.bbox;a=ol.extent.transform([a[1],a[0],a[3],a[2]],f);var g,h;for(g=b;g<=e;++g)h=g.toString(),b=d.getTileRangeForExtentAndZ(a,g),h in c?c[h].push(b):c[h]=[b]});return new ol.Attribution({html:b,tileRanges:c})});a.push(ol.source.BingMaps.TOS_ATTRIBUTION);this.setAttributions(a)}this.setLogo(b);this.setState(ol.source.State.READY)}};goog.net.EventType={COMPLETE:"complete",SUCCESS:"success",ERROR:"error",ABORT:"abort",READY:"ready",READY_STATE_CHANGE:"readystatechange",TIMEOUT:"timeout",INCREMENTAL_DATA:"incrementaldata",PROGRESS:"progress"};goog.Timer=function(a,b){goog.events.EventTarget.call(this);this.interval_=a||1;this.timerObject_=b||goog.Timer.defaultTimerObject;this.boundTick_=goog.bind(this.tick_,this);this.last_=goog.now()};goog.inherits(goog.Timer,goog.events.EventTarget);goog.Timer.MAX_TIMEOUT_=2147483647;goog.Timer.prototype.enabled=!1;goog.Timer.defaultTimerObject=goog.global;goog.Timer.intervalScale=0.8;goog.Timer.prototype.timer_=null;goog.Timer.prototype.getInterval=function(){return this.interval_}; +goog.Timer.prototype.setInterval=function(a){this.interval_=a;this.timer_&&this.enabled?(this.stop(),this.start()):this.timer_&&this.stop()}; +goog.Timer.prototype.tick_=function(){if(this.enabled){var a=goog.now()-this.last_;0goog.Timer.MAX_TIMEOUT_?-1:goog.Timer.defaultTimerObject.setTimeout(a,b||0)};goog.Timer.clear=function(a){goog.Timer.defaultTimerObject.clearTimeout(a)};goog.net.ErrorCode={NO_ERROR:0,ACCESS_DENIED:1,FILE_NOT_FOUND:2,FF_SILENT_ERROR:3,CUSTOM_ERROR:4,EXCEPTION:5,HTTP_ERROR:6,ABORT:7,TIMEOUT:8,OFFLINE:9}; +goog.net.ErrorCode.getDebugMessage=function(a){switch(a){case goog.net.ErrorCode.NO_ERROR:return"No Error";case goog.net.ErrorCode.ACCESS_DENIED:return"Access denied to content document";case goog.net.ErrorCode.FILE_NOT_FOUND:return"File not found";case goog.net.ErrorCode.FF_SILENT_ERROR:return"Firefox silently errored";case goog.net.ErrorCode.CUSTOM_ERROR:return"Application custom error";case goog.net.ErrorCode.EXCEPTION:return"An exception occurred";case goog.net.ErrorCode.HTTP_ERROR:return"Http response at 400 or 500 level"; +case goog.net.ErrorCode.ABORT:return"Request was aborted";case goog.net.ErrorCode.TIMEOUT:return"Request timed out";case goog.net.ErrorCode.OFFLINE:return"The resource is not available offline";default:return"Unrecognized error code"}};goog.net.HttpStatus={CONTINUE:100,SWITCHING_PROTOCOLS:101,OK:200,CREATED:201,ACCEPTED:202,NON_AUTHORITATIVE_INFORMATION:203,NO_CONTENT:204,RESET_CONTENT:205,PARTIAL_CONTENT:206,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,FOUND:302,SEE_OTHER:303,NOT_MODIFIED:304,USE_PROXY:305,TEMPORARY_REDIRECT:307,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIMEOUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411, +PRECONDITION_FAILED:412,REQUEST_ENTITY_TOO_LARGE:413,REQUEST_URI_TOO_LONG:414,UNSUPPORTED_MEDIA_TYPE:415,REQUEST_RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,HTTP_VERSION_NOT_SUPPORTED:505,QUIRK_IE_NO_CONTENT:1223}; +goog.net.HttpStatus.isSuccess=function(a){switch(a){case goog.net.HttpStatus.OK:case goog.net.HttpStatus.CREATED:case goog.net.HttpStatus.ACCEPTED:case goog.net.HttpStatus.NO_CONTENT:case goog.net.HttpStatus.PARTIAL_CONTENT:case goog.net.HttpStatus.NOT_MODIFIED:case goog.net.HttpStatus.QUIRK_IE_NO_CONTENT:return!0;default:return!1}};goog.net.XmlHttpFactory=function(){};goog.net.XmlHttpFactory.prototype.cachedOptions_=null;goog.net.XmlHttpFactory.prototype.getOptions=function(){return this.cachedOptions_||(this.cachedOptions_=this.internalGetOptions())};goog.net.WrapperXmlHttpFactory=function(a,b){goog.net.XmlHttpFactory.call(this);this.xhrFactory_=a;this.optionsFactory_=b};goog.inherits(goog.net.WrapperXmlHttpFactory,goog.net.XmlHttpFactory);goog.net.WrapperXmlHttpFactory.prototype.createInstance=function(){return this.xhrFactory_()};goog.net.WrapperXmlHttpFactory.prototype.getOptions=function(){return this.optionsFactory_()};goog.net.XmlHttp=function(){return goog.net.XmlHttp.factory_.createInstance()};goog.net.XmlHttp.ASSUME_NATIVE_XHR=!1;goog.net.XmlHttp.getOptions=function(){return goog.net.XmlHttp.factory_.getOptions()};goog.net.XmlHttp.OptionType={USE_NULL_FUNCTION:0,LOCAL_REQUEST_ERROR:1};goog.net.XmlHttp.ReadyState={UNINITIALIZED:0,LOADING:1,LOADED:2,INTERACTIVE:3,COMPLETE:4};goog.net.XmlHttp.setFactory=function(a,b){goog.net.XmlHttp.setGlobalFactory(new goog.net.WrapperXmlHttpFactory(a,b))}; +goog.net.XmlHttp.setGlobalFactory=function(a){goog.net.XmlHttp.factory_=a};goog.net.DefaultXmlHttpFactory=function(){goog.net.XmlHttpFactory.call(this)};goog.inherits(goog.net.DefaultXmlHttpFactory,goog.net.XmlHttpFactory);goog.net.DefaultXmlHttpFactory.prototype.createInstance=function(){var a=this.getProgId_();return a?new ActiveXObject(a):new XMLHttpRequest}; +goog.net.DefaultXmlHttpFactory.prototype.internalGetOptions=function(){var a={};this.getProgId_()&&(a[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION]=!0,a[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR]=!0);return a}; +goog.net.DefaultXmlHttpFactory.prototype.getProgId_=function(){if(goog.net.XmlHttp.ASSUME_NATIVE_XHR)return"";if(!this.ieProgId_&&"undefined"==typeof XMLHttpRequest&&"undefined"!=typeof ActiveXObject){for(var a=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],b=0;bgoog.net.XmlHttp.ReadyState.LOADED?this.xhr_.status:-1}catch(a){return-1}};goog.net.XhrIo.prototype.getStatusText=function(){try{return this.getReadyState()>goog.net.XmlHttp.ReadyState.LOADED?this.xhr_.statusText:""}catch(a){return""}};goog.net.XhrIo.prototype.getLastUri=function(){return String(this.lastUri_)};goog.net.XhrIo.prototype.getResponseText=function(){try{return this.xhr_?this.xhr_.responseText:""}catch(a){return""}}; +goog.net.XhrIo.prototype.getResponseBody=function(){try{if(this.xhr_&&"responseBody"in this.xhr_)return this.xhr_.responseBody}catch(a){}return null};goog.net.XhrIo.prototype.getResponseXml=function(){try{return this.xhr_?this.xhr_.responseXML:null}catch(a){return null}};goog.net.XhrIo.prototype.getResponseJson=function(a){if(this.xhr_){var b=this.xhr_.responseText;a&&0==b.indexOf(a)&&(b=b.substring(a.length));return goog.json.parse(b)}}; +goog.net.XhrIo.prototype.getResponse=function(){try{if(!this.xhr_)return null;if("response"in this.xhr_)return this.xhr_.response;switch(this.responseType_){case goog.net.XhrIo.ResponseType.DEFAULT:case goog.net.XhrIo.ResponseType.TEXT:return this.xhr_.responseText;case goog.net.XhrIo.ResponseType.ARRAY_BUFFER:if("mozResponseArrayBuffer"in this.xhr_)return this.xhr_.mozResponseArrayBuffer}return null}catch(a){return null}}; +goog.net.XhrIo.prototype.getResponseHeader=function(a){return this.xhr_&&this.isComplete()?this.xhr_.getResponseHeader(a):void 0};goog.net.XhrIo.prototype.getAllResponseHeaders=function(){return this.xhr_&&this.isComplete()?this.xhr_.getAllResponseHeaders():""};goog.net.XhrIo.prototype.getLastErrorCode=function(){return this.lastErrorCode_};goog.net.XhrIo.prototype.getLastError=function(){return goog.isString(this.lastError_)?this.lastError_:String(this.lastError_)}; +goog.net.XhrIo.prototype.formatMsg_=function(a){return a+" ["+this.lastMethod_+" "+this.lastUri_+" "+this.getStatus()+"]"};ol.source.VectorFile=function(a){var b=goog.isDef(a)?a:{};ol.source.Vector.call(this,{attributions:b.attributions,extent:b.extent,logo:b.logo,projection:b.projection});this.format=b.format;goog.isDef(b.doc)&&this.readFeatures_(b.doc);goog.isDef(b.node)&&this.readFeatures_(b.node);goog.isDef(b.object)&&this.readFeatures_(b.object);goog.isDef(b.text)&&this.readFeatures_(b.text);goog.isDef(b.arrayBuffer)&&this.readFeatures_(b.arrayBuffer);if(goog.isDef(b.url)||goog.isDef(b.urls)){this.setState(ol.source.State.LOADING); +a=this.format.getType()==ol.format.FormatType.BINARY&&ol.BrowserFeature.HAS_ARRAY_BUFFER?goog.net.XhrIo.ResponseType.ARRAY_BUFFER:goog.net.XhrIo.ResponseType.TEXT;var c;goog.isDef(b.url)&&(c=new goog.net.XhrIo,c.setResponseType(a),goog.events.listen(c,goog.net.EventType.COMPLETE,goog.bind(this.handleXhrIo_,this)),c.send(b.url));if(goog.isDef(b.urls)){var b=b.urls,d,e;d=0;for(e=b.length;df*a?e*c/(f*d):a*c/(b*d)}; +ol.source.MapGuide.prototype.getUrl=function(a,b,c,d,e){e=ol.source.MapGuide.getScale(c,d,this.metersPerUnit_,this.displayDpi_);c=ol.extent.getCenter(c);d={OPERATION:this.useOverlay_?"GETDYNAMICMAPOVERLAYIMAGE":"GETMAPIMAGE",VERSION:"2.0.0",LOCALE:"en",CLIENTAGENT:"ol.source.MapGuide source",CLIP:"1",SETDISPLAYDPI:this.displayDpi_,SETDISPLAYWIDTH:Math.round(d[0]),SETDISPLAYHEIGHT:Math.round(d[1]),SETVIEWSCALE:e,SETVIEWCENTERX:c[0],SETVIEWCENTERY:c[1]};goog.object.extend(d,b);return goog.uri.utils.appendParamsFromMap(a, +d)};ol.source.XYZ=function(a){var b=a.projection||ol.proj.get("EPSG:3857"),c=goog.isDef(a.maxZoom)?a.maxZoom:18,c=new ol.tilegrid.XYZ({maxZoom:c});ol.source.TileImage.call(this,{attributions:a.attributions,crossOrigin:a.crossOrigin,extent:a.extent,logo:a.logo,projection:b,tileGrid:c,tileLoadFunction:a.tileLoadFunction,tileUrlFunction:ol.TileUrlFunction.nullTileUrlFunction});this.tileCoordTransform_=c.createTileCoordTransform({extent:a.extent});goog.isDef(a.tileUrlFunction)?this.setTileUrlFunction(a.tileUrlFunction): +goog.isDef(a.urls)?this.setUrls(a.urls):goog.isDef(a.url)&&this.setUrl(a.url)};goog.inherits(ol.source.XYZ,ol.source.TileImage);ol.source.XYZ.prototype.setTileUrlFunction=function(a){ol.source.XYZ.superClass_.setTileUrlFunction.call(this,ol.TileUrlFunction.withTileCoordTransform(this.tileCoordTransform_,a))};ol.source.XYZ.prototype.setUrl=function(a){this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates(ol.TileUrlFunction.expandUrl(a)))};ol.source.XYZ.prototype.setUrls=function(a){this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates(a))};ol.source.OSM=function(a){a=goog.isDef(a)?a:{};var b;b=goog.isDef(a.attributions)?a.attributions:ol.source.OSM.ATTRIBUTIONS;var c=goog.isDef(a.crossOrigin)?a.crossOrigin:"anonymous",d=goog.isDef(a.url)?a.url:"//{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png";ol.source.XYZ.call(this,{attributions:b,crossOrigin:c,opaque:!0,maxZoom:a.maxZoom,tileLoadFunction:a.tileLoadFunction,url:d})};goog.inherits(ol.source.OSM,ol.source.XYZ);ol.source.OSM.DATA_ATTRIBUTION=new ol.Attribution({html:'Data \x26copy; \x3ca href\x3d"http://www.openstreetmap.org/"\x3eOpenStreetMap\x3c/a\x3e contributors, \x3ca href\x3d"http://www.openstreetmap.org/copyright"\x3eODbL\x3c/a\x3e'}); +ol.source.OSM.TILE_ATTRIBUTION=new ol.Attribution({html:'Tiles \x26copy; \x3ca href\x3d"http://www.openstreetmap.org/"\x3eOpenStreetMap\x3c/a\x3e contributors, \x3ca href\x3d"http://creativecommons.org/licenses/by-sa/2.0/"\x3eCC BY-SA\x3c/a\x3e'});ol.source.OSM.ATTRIBUTIONS=[ol.source.OSM.TILE_ATTRIBUTION,ol.source.OSM.DATA_ATTRIBUTION];ol.source.MapQuest=function(a){a=goog.isDef(a)?a:{};var b=ol.source.MapQuestConfig[a.layer];ol.source.XYZ.call(this,{attributions:b.attributions,crossOrigin:"anonymous",logo:"//developer.mapquest.com/content/osm/mq_logo.png",maxZoom:b.maxZoom,opaque:!0,tileLoadFunction:a.tileLoadFunction,url:"//otile{1-4}.mqcdn.com/tiles/1.0.0/"+a.layer+"/{z}/{x}/{y}.jpg"})};goog.inherits(ol.source.MapQuest,ol.source.XYZ);ol.source.MapQuest.TILE_ATTRIBUTION=new ol.Attribution({html:'Tiles Courtesy of \x3ca href\x3d"http://www.mapquest.com/" target\x3d"_blank"\x3eMapQuest\x3c/a\x3e'}); +ol.source.MapQuestConfig={osm:{maxZoom:28,attributions:[ol.source.MapQuest.TILE_ATTRIBUTION,ol.source.OSM.DATA_ATTRIBUTION]},sat:{maxZoom:18,attributions:[ol.source.MapQuest.TILE_ATTRIBUTION,new ol.Attribution({html:"Portions Courtesy NASA/JPL-Caltech and U.S. Depart. of Agriculture, Farm Service Agency"})]},hyb:{maxZoom:18,attributions:[ol.source.MapQuest.TILE_ATTRIBUTION,ol.source.OSM.DATA_ATTRIBUTION]}};ol.source.OSMXML=function(a){a=goog.isDef(a)?a:{};ol.source.VectorFile.call(this,{attributions:a.attributions,doc:a.doc,extent:a.extent,format:new ol.format.OSMXML,logo:a.logo,node:a.node,projection:a.projection,reprojectTo:a.reprojectTo,text:a.text,url:a.url})};goog.inherits(ol.source.OSMXML,ol.source.VectorFile);ol.source.StamenLayerConfig={terrain:{extension:"jpg",opaque:!0},"terrain-background":{extension:"jpg",opaque:!0},"terrain-labels":{extension:"png",opaque:!1},"terrain-lines":{extension:"png",opaque:!1},"toner-background":{extension:"png",opaque:!0},toner:{extension:"png",opaque:!0},"toner-hybrid":{extension:"png",opaque:!1},"toner-labels":{extension:"png",opaque:!1},"toner-lines":{extension:"png",opaque:!1},"toner-lite":{extension:"png",opaque:!0},watercolor:{extension:"jpg",opaque:!0}}; +ol.source.StamenProviderConfig={terrain:{minZoom:4,maxZoom:18},toner:{minZoom:0,maxZoom:20},watercolor:{minZoom:3,maxZoom:16}}; +ol.source.Stamen=function(a){var b=a.layer.indexOf("-"),b=-1==b?a.layer:a.layer.slice(0,b),b=ol.source.StamenProviderConfig[b],c=ol.source.StamenLayerConfig[a.layer],d=goog.isDef(a.url)?a.url:"//{a-d}.tile.stamen.com/"+a.layer+"/{z}/{x}/{y}."+c.extension;ol.source.XYZ.call(this,{attributions:ol.source.Stamen.ATTRIBUTIONS,crossOrigin:"anonymous",maxZoom:b.maxZoom,opaque:c.opaque,tileLoadFunction:a.tileLoadFunction,url:d})};goog.inherits(ol.source.Stamen,ol.source.XYZ); +ol.source.Stamen.ATTRIBUTIONS=[new ol.Attribution({html:'Map tiles by \x3ca href\x3d"http://stamen.com/"\x3eStamen Design\x3c/a\x3e, under \x3ca href\x3d"http://creativecommons.org/licenses/by/3.0/"\x3eCC BY 3.0\x3c/a\x3e.'}),ol.source.OSM.DATA_ATTRIBUTION];ol.DebugTile_=function(a,b){ol.Tile.call(this,a,ol.TileState.LOADED);this.tileCoord_=a;this.tileSize_=b.getTileSize(a.z);this.canvasByContext_={}};goog.inherits(ol.DebugTile_,ol.Tile); +ol.DebugTile_.prototype.getImage=function(a){a=goog.isDef(a)?goog.getUid(a):-1;if(a in this.canvasByContext_)return this.canvasByContext_[a];var b=this.tileSize_,c=goog.dom.createElement(goog.dom.TagName.CANVAS);c.width=b;c.height=b;var d=c.getContext("2d");d.strokeStyle="black";d.strokeRect(0.5,0.5,b+0.5,b+0.5);d.fillStyle="black";d.textAlign="center";d.textBaseline="middle";d.font="24px sans-serif";d.fillText(this.tileCoord_.toString(),b/2,b/2);return this.canvasByContext_[a]=c}; +ol.source.TileDebug=function(a){ol.source.Tile.call(this,{extent:a.extent,opaque:!1,projection:a.projection,tileGrid:a.tileGrid});this.tileCache_=new ol.TileCache};goog.inherits(ol.source.TileDebug,ol.source.Tile);ol.source.TileDebug.prototype.canExpireCache=function(){return this.tileCache_.canExpireCache()};ol.source.TileDebug.prototype.expireCache=function(a){this.tileCache_.expireCache(a)}; +ol.source.TileDebug.prototype.getTile=function(a,b,c){var d=this.getKeyZXY(a,b,c);if(this.tileCache_.containsKey(d))return this.tileCache_.get(d);a=new ol.DebugTile_(new ol.TileCoord(a,b,c),this.tileGrid);this.tileCache_.set(d,a);return a};ol.tilejson={};ol.tilejson.grids_=[];var grid=function(a){ol.tilejson.grids_.push(a)};goog.exportSymbol("grid",grid);ol.source.TileJSON=function(a){ol.source.TileImage.call(this,{crossOrigin:a.crossOrigin,projection:ol.proj.get("EPSG:3857"),state:ol.source.State.LOADING,tileLoadFunction:a.tileLoadFunction});this.deferred_=goog.net.jsloader.load(a.url,{cleanupWhenDone:!0});this.deferred_.addCallback(this.handleTileJSONResponse,this)};goog.inherits(ol.source.TileJSON,ol.source.TileImage); +ol.source.TileJSON.prototype.handleTileJSONResponse=function(){var a=ol.tilejson.grids_.pop(),b=ol.proj.get("EPSG:4326"),c;if(goog.isDef(a.bounds)){var d=ol.proj.getTransformFromProjections(b,this.getProjection());c=ol.extent.transform(a.bounds,d);this.setExtent(c)}goog.isDef(a.scheme);var e=a.minzoom||0,d=a.maxzoom||22,f=new ol.tilegrid.XYZ({maxZoom:d,minZoom:e});this.tileGrid=f;this.tileUrlFunction=ol.TileUrlFunction.withTileCoordTransform(f.createTileCoordTransform({extent:c}),ol.TileUrlFunction.createFromTemplates(a.tiles)); +if(goog.isDef(a.attribution)){b=goog.isDef(c)?c:b.getExtent();c={};for(var g;e<=d;++e)g=e.toString(),c[g]=[f.getTileRangeForExtentAndZ(b,e)];this.setAttributions([new ol.Attribution({html:a.attribution,tileRanges:c})])}this.setState(ol.source.State.READY)};ol.source.TileWMS=function(a){a=goog.isDef(a)?a:{};var b=goog.isDef(a.params)?a.params:{},c=goog.object.get(b,"TRANSPARENT",!0);ol.source.TileImage.call(this,{attributions:a.attributions,crossOrigin:a.crossOrigin,extent:a.extent,logo:a.logo,opaque:!c,projection:a.projection,tileGrid:a.tileGrid,tileLoadFunction:a.tileLoadFunction,tileUrlFunction:goog.bind(this.tileUrlFunction_,this)});c=a.urls;!goog.isDef(c)&&goog.isDef(a.url)&&(c=ol.TileUrlFunction.expandUrl(a.url));this.urls_=c;this.gutter_=goog.isDef(a.gutter)? +a.gutter:0;this.params_=b;this.pixelRatio_=NaN;this.v13_=!0;this.serverType_=a.serverType;this.hidpi_=goog.isDef(a.hidpi)?a.hidpi:!0;this.coordKeyPrefix_="";this.resetCoordKeyPrefix_();this.tmpExtent_=ol.extent.createEmpty();this.updateV13_()};goog.inherits(ol.source.TileWMS,ol.source.TileImage); +ol.source.TileWMS.prototype.getGetFeatureInfoUrl=function(a,b,c,d){var e=this.pixelRatio_;if(!isNaN(this.pixelRatio_)){var f=this.getTileGrid();goog.isNull(f)&&(f=this.getTileGridForProjection(c));b=f.getTileCoordForCoordAndResolution(a,b);if(!(f.getResolutions().length<=b.z)){var g=f.getResolution(b.z),h=f.getTileCoordExtent(b,this.tmpExtent_),f=f.getTileSize(b.z),k=this.gutter_;0!==k&&(f+=2*k,h=ol.extent.buffer(h,g*k,h));1!=e&&(f=f*e+0.5|0);k={SERVICE:"WMS",VERSION:ol.source.wms.DEFAULT_VERSION, +REQUEST:"GetFeatureInfo",FORMAT:"image/png",TRANSPARENT:!0,QUERY_LAYERS:goog.object.get(this.params_,"LAYERS")};goog.object.extend(k,this.params_,d);d=Math.floor((h[3]-a[1])/(g/e));goog.object.set(k,this.v13_?"I":"X",Math.floor((a[0]-h[0])/(g/e)));goog.object.set(k,this.v13_?"J":"Y",d);return this.getRequestUrl_(b,f,h,e,c,k)}}};ol.source.TileWMS.prototype.getGutter=function(){return this.gutter_}; +ol.source.TileWMS.prototype.getKeyZXY=function(a,b,c){return this.coordKeyPrefix_+ol.source.TileWMS.superClass_.getKeyZXY.call(this,a,b,c)};ol.source.TileWMS.prototype.getParams=function(){return this.params_}; +ol.source.TileWMS.prototype.getRequestUrl_=function(a,b,c,d,e,f){var g=this.urls_;if(goog.isDef(g)&&!goog.array.isEmpty(g)){goog.object.set(f,"WIDTH",b);goog.object.set(f,"HEIGHT",b);f[this.v13_?"CRS":"SRS"]=e.getCode();"STYLES"in this.params_||goog.object.set(f,"STYLES",new String(""));if(1!=d)switch(this.serverType_){case ol.source.wms.ServerType.GEOSERVER:goog.object.set(f,"FORMAT_OPTIONS","dpi:"+(90*d+0.5|0));break;case ol.source.wms.ServerType.MAPSERVER:goog.object.set(f,"MAP_RESOLUTION",90* +d);break;case ol.source.wms.ServerType.CARMENTA_SERVER:case ol.source.wms.ServerType.QGIS:goog.object.set(f,"DPI",90*d)}b=e.getAxisOrientation();this.v13_&&"ne"==b.substr(0,2)&&(b=c[0],c[0]=c[1],c[1]=b,b=c[2],c[2]=c[3],c[3]=b);goog.object.set(f,"BBOX",c.join(","));1==g.length?g=g[0]:(a=goog.math.modulo(a.hash(),this.urls_.length),g=g[a]);return goog.uri.utils.appendParamsFromMap(g,f)}}; +ol.source.TileWMS.prototype.getTilePixelSize=function(a,b,c){a=ol.source.TileWMS.superClass_.getTilePixelSize.call(this,a,b,c);return 1!=b&&this.hidpi_&&goog.isDef(this.serverType_)?a*b+0.5|0:a};ol.source.TileWMS.prototype.resetCoordKeyPrefix_=function(){var a=0,b=[],c;for(c in this.params_)b[a++]=c+"-"+this.params_[c];this.coordKeyPrefix_=b.join("/")}; +ol.source.TileWMS.prototype.tileUrlFunction_=function(a,b,c){var d=this.getTileGrid();goog.isNull(d)&&(d=this.getTileGridForProjection(c));if(!(d.getResolutions().length<=a.z)){1==b||this.hidpi_&&goog.isDef(this.serverType_)||(b=1);var e=d.getResolution(a.z),f=d.getTileCoordExtent(a,this.tmpExtent_),d=d.getTileSize(a.z),g=this.gutter_;0!==g&&(d+=2*g,f=ol.extent.buffer(f,e*g,f));e=this.getExtent();if(goog.isNull(e)||ol.extent.intersects(f,e)&&!ol.extent.touches(f,e))return 1!=b&&(d=d*b+0.5|0),e={SERVICE:"WMS", +VERSION:ol.source.wms.DEFAULT_VERSION,REQUEST:"GetMap",FORMAT:"image/png",TRANSPARENT:!0},goog.object.extend(e,this.params_),this.pixelRatio_=b,this.getRequestUrl_(a,d,f,b,c,e)}};ol.source.TileWMS.prototype.updateParams=function(a){goog.object.extend(this.params_,a);this.resetCoordKeyPrefix_();this.updateV13_();this.dispatchChangeEvent()}; +ol.source.TileWMS.prototype.updateV13_=function(){var a=goog.object.get(this.params_,"VERSION",ol.source.wms.DEFAULT_VERSION);this.v13_=0<=goog.string.compareVersions(a,"1.3")};ol.source.TopoJSON=function(a){a=goog.isDef(a)?a:{};ol.source.VectorFile.call(this,{attributions:a.attributions,extent:a.extent,format:new ol.format.TopoJSON({defaultProjection:a.defaultProjection}),logo:a.logo,object:a.object,projection:a.projection,text:a.text,url:a.url})};goog.inherits(ol.source.TopoJSON,ol.source.VectorFile);ol.tilegrid.WMTS=function(a){this.matrixIds_=a.matrixIds;ol.tilegrid.TileGrid.call(this,{origin:a.origin,origins:a.origins,resolutions:a.resolutions,tileSize:a.tileSize,tileSizes:a.tileSizes})};goog.inherits(ol.tilegrid.WMTS,ol.tilegrid.TileGrid);ol.tilegrid.WMTS.prototype.getMatrixId=function(a){return this.matrixIds_[a]};ol.tilegrid.WMTS.prototype.getMatrixIds=function(){return this.matrixIds_}; +ol.tilegrid.WMTS.createFromCapabilitiesMatrixSet=function(a){var b=[],c=[],d=[],e=[],f=ol.proj.get(a.supportedCRS).getMetersPerUnit();goog.array.sort(a.matrixIds,function(a,b){return b.scaleDenominator-a.scaleDenominator});goog.array.forEach(a.matrixIds,function(a,h,k){c.push(a.identifier);d.push(a.topLeftCorner);b.push(2.8E-4*a.scaleDenominator/f);e.push(a.tileWidth)});return new ol.tilegrid.WMTS({origins:d,resolutions:b,matrixIds:c,tileSizes:e})};ol.source.WMTSRequestEncoding={KVP:"KVP",REST:"REST"}; +ol.source.WMTS=function(a){function b(a){a=e==ol.source.WMTSRequestEncoding.KVP?goog.uri.utils.appendParamsFromMap(a,g):a.replace(/\{(\w+?)\}/g,function(a,b){return b in g?g[b]:a});return function(b,c,d){if(!goog.isNull(b)){var g={TileMatrix:f.getMatrixId(b.z),TileCol:b.x,TileRow:b.y};goog.object.extend(g,this.dimensions_);b=a;return b=e==ol.source.WMTSRequestEncoding.KVP?goog.uri.utils.appendParamsFromMap(b,g):b.replace(/\{(\w+?)\}/g,function(a,b){return g[b]})}}}var c=goog.isDef(a.version)?a.version: +"1.0.0",d=goog.isDef(a.format)?a.format:"image/jpeg";this.dimensions_=a.dimensions||{};this.coordKeyPrefix_="";this.resetCoordKeyPrefix_();var e=goog.isDef(a.requestEncoding)?a.requestEncoding:ol.source.WMTSRequestEncoding.KVP,f=a.tileGrid,g={Layer:a.layer,style:a.style,Style:a.style,TileMatrixSet:a.matrixSet};e==ol.source.WMTSRequestEncoding.KVP&&goog.object.extend(g,{Service:"WMTS",Request:"GetTile",Version:c,Format:d});c=ol.TileUrlFunction.nullTileUrlFunction;d=a.urls;!goog.isDef(d)&&goog.isDef(a.url)&& +(d=ol.TileUrlFunction.expandUrl(a.url));goog.isDef(d)&&(c=ol.TileUrlFunction.createFromTileUrlFunctions(goog.array.map(d,b)));var h=ol.extent.createEmpty(),k=new ol.TileCoord(0,0,0),c=ol.TileUrlFunction.withTileCoordTransform(function(b,c,d){d=this.getTileGrid();if(d.getResolutions().length<=b.z)return null;var e=b.x,f=-b.y-1,g=d.getTileCoordExtent(b),u=c.getExtent(),s=goog.isDef(a.extent)?a.extent:u;!goog.isNull(s)&&(c.isGlobal()&&s[0]===u[0]&&s[2]===u[2])&&(c=Math.ceil((s[2]-s[0])/(g[2]-g[0])), +e=goog.math.modulo(e,c),k.z=b.z,k.x=e,k.y=b.y,g=d.getTileCoordExtent(k,h));return!ol.extent.intersects(g,s)||ol.extent.touches(g,s)?null:new ol.TileCoord(b.z,e,f)},c);ol.source.TileImage.call(this,{attributions:a.attributions,crossOrigin:a.crossOrigin,extent:a.extent,logo:a.logo,projection:a.projection,tileGrid:f,tileLoadFunction:a.tileLoadFunction,tileUrlFunction:c})};goog.inherits(ol.source.WMTS,ol.source.TileImage);ol.source.WMTS.prototype.getDimensions=function(){return this.dimensions_}; +ol.source.WMTS.prototype.getKeyZXY=function(a,b,c){return this.coordKeyPrefix_+ol.source.WMTS.superClass_.getKeyZXY.call(this,a,b,c)};ol.source.WMTS.prototype.resetCoordKeyPrefix_=function(){var a=0,b=[],c;for(c in this.dimensions_)b[a++]=c+"-"+this.dimensions_[c];this.coordKeyPrefix_=b.join("/")};ol.source.WMTS.prototype.updateDimensions=function(a){goog.object.extend(this.dimensions_,a);this.resetCoordKeyPrefix_();this.dispatchChangeEvent()}; +ol.source.WMTS.optionsFromCapabilities=function(a,b){var c=goog.array.find(a.contents.layers,function(a,c,d){return a.identifier==b}),d=c.tileMatrixSetLinks[0].tileMatrixSet,e=c.formats[0],f=goog.array.findIndex(c.styles,function(a,b,c){return a.isDefault});0>f&&(f=0);var f=c.styles[f].identifier,g={};goog.array.forEach(c.dimensions,function(a,b,c){b=a.identifier;c=a["default"];goog.isDef(c)||(c=a.values[0]);g[b]=c});var h=a.contents.tileMatrixSets[d],k=ol.tilegrid.WMTS.createFromCapabilitiesMatrixSet(h), +h=ol.proj.get(h.supportedCRS),l=a.operationsMetadata.GetTile.dcp.http.get,m,n;switch(goog.object.getKeys(l[0].constraints.GetEncoding.allowedValues)[0]){case "REST":case "RESTful":n=ol.source.WMTSRequestEncoding.REST;m=c.resourceUrls.tile[e];break;case "KVP":n=ol.source.WMTSRequestEncoding.KVP,m=[],goog.array.forEach(l,function(a,b,c){a.constraints.GetEncoding.allowedValues.hasOwnProperty(ol.source.WMTSRequestEncoding.KVP)&&m.push(a.url)})}return{urls:m,layer:b,matrixSet:d,format:e,projection:h,requestEncoding:n, +tileGrid:k,style:f,dimensions:g}};ol.tilegrid.Zoomify=function(a){var b=goog.isDef(a)?a:b;ol.tilegrid.TileGrid.call(this,{origin:[0,0],resolutions:b.resolutions})};goog.inherits(ol.tilegrid.Zoomify,ol.tilegrid.TileGrid); +ol.tilegrid.Zoomify.prototype.createTileCoordTransform=function(a){a=goog.isDef(a)?a:{};var b=this.minZoom,c=this.maxZoom,d=new ol.TileCoord(0,0,0),e=null;if(goog.isDef(a.extent)){var e=Array(c+1),f;for(f=0;f<=c;++f)e[f]=fm||l<=m)return null;a=a.y;return a<-l||-1g||e>g;)f.push([Math.ceil(d/g),Math.ceil(e/g)]),g+=g;break;case ol.source.ZoomifyTierSizeCalculation.TRUNCATED:for(c=d;c>g||e>g;)f.push([Math.ceil(c/g),Math.ceil(e/g)]),c>>=1,e>>=1}f.push([1,1]);f.reverse();for(var g=[1],h=[0], +e=1,c=f.length;e= 0;--i) { + var src = scripts[i].src; + var qmark = src.lastIndexOf("?"); + var l = qmark == -1 ? src.length : qmark; + if(src.substr(l - 7, 7) == "base.js") { + goog.basePath = src.substr(0, l - 7); + return + } + } + }; + goog.importScript_ = function(src) { + var importScript = goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_; + if(!goog.dependencies_.written[src] && importScript(src)) { + goog.dependencies_.written[src] = true + } + }; + goog.writeScriptTag_ = function(src) { + if(goog.inHtmlDocument_()) { + var doc = goog.global.document; + if(doc.readyState == "complete") { + var isDeps = /\bdeps.js$/.test(src); + if(isDeps) { + return false + }else { + throw Error('Cannot write "' + src + '" after document load'); + } + } + doc.write('\x3cscript type\x3d"text/javascript" src\x3d"' + src + '"\x3e\x3c/' + "script\x3e"); + return true + }else { + return false + } + }; + goog.writeScripts_ = function() { + var scripts = []; + var seenScript = {}; + var deps = goog.dependencies_; + function visitNode(path) { + if(path in deps.written) { + return + } + if(path in deps.visited) { + if(!(path in seenScript)) { + seenScript[path] = true; + scripts.push(path) + } + return + } + deps.visited[path] = true; + if(path in deps.requires) { + for(var requireName in deps.requires[path]) { + if(!goog.isProvided_(requireName)) { + if(requireName in deps.nameToPath) { + visitNode(deps.nameToPath[requireName]) + }else { + throw Error("Undefined nameToPath for " + requireName); + } + } + } + } + if(!(path in seenScript)) { + seenScript[path] = true; + scripts.push(path) + } + } + for(var path in goog.included_) { + if(!deps.written[path]) { + visitNode(path) + } + } + for(var i = 0;i < scripts.length;i++) { + if(scripts[i]) { + goog.importScript_(goog.basePath + scripts[i]) + }else { + throw Error("Undefined script input"); + } + } + }; + goog.getPathFromDeps_ = function(rule) { + if(rule in goog.dependencies_.nameToPath) { + return goog.dependencies_.nameToPath[rule] + }else { + return null + } + }; + goog.findBasePath_(); + if(!goog.global.CLOSURE_NO_DEPS) { + goog.importScript_(goog.basePath + "deps.js") + } +} +goog.typeOf = function(value) { + var s = typeof value; + if(s == "object") { + if(value) { + if(value instanceof Array) { + return"array" + }else { + if(value instanceof Object) { + return s + } + } + var className = Object.prototype.toString.call((value)); + if(className == "[object Window]") { + return"object" + } + if(className == "[object Array]" || typeof value.length == "number" && typeof value.splice != "undefined" && typeof value.propertyIsEnumerable != "undefined" && !value.propertyIsEnumerable("splice")) { + return"array" + } + if(className == "[object Function]" || typeof value.call != "undefined" && typeof value.propertyIsEnumerable != "undefined" && !value.propertyIsEnumerable("call")) { + return"function" + } + }else { + return"null" + } + }else { + if(s == "function" && typeof value.call == "undefined") { + return"object" + } + } + return s +}; +goog.isDef = function(val) { + return val !== undefined +}; +goog.isNull = function(val) { + return val === null +}; +goog.isDefAndNotNull = function(val) { + return val != null +}; +goog.isArray = function(val) { + return goog.typeOf(val) == "array" +}; +goog.isArrayLike = function(val) { + var type = goog.typeOf(val); + return type == "array" || type == "object" && typeof val.length == "number" +}; +goog.isDateLike = function(val) { + return goog.isObject(val) && typeof val.getFullYear == "function" +}; +goog.isString = function(val) { + return typeof val == "string" +}; +goog.isBoolean = function(val) { + return typeof val == "boolean" +}; +goog.isNumber = function(val) { + return typeof val == "number" +}; +goog.isFunction = function(val) { + return goog.typeOf(val) == "function" +}; +goog.isObject = function(val) { + var type = typeof val; + return type == "object" && val != null || type == "function" +}; +goog.getUid = function(obj) { + return obj[goog.UID_PROPERTY_] || (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_) +}; +goog.removeUid = function(obj) { + if("removeAttribute" in obj) { + obj.removeAttribute(goog.UID_PROPERTY_) + } + try { + delete obj[goog.UID_PROPERTY_] + }catch(ex) { + } +}; +goog.UID_PROPERTY_ = "closure_uid_" + (Math.random() * 1E9 >>> 0); +goog.uidCounter_ = 0; +goog.getHashCode = goog.getUid; +goog.removeHashCode = goog.removeUid; +goog.cloneObject = function(obj) { + var type = goog.typeOf(obj); + if(type == "object" || type == "array") { + if(obj.clone) { + return obj.clone() + } + var clone = type == "array" ? [] : {}; + for(var key in obj) { + clone[key] = goog.cloneObject(obj[key]) + } + return clone + } + return obj +}; +goog.bindNative_ = function(fn, selfObj, var_args) { + return(fn.call.apply(fn.bind, arguments)) +}; +goog.bindJs_ = function(fn, selfObj, var_args) { + if(!fn) { + throw new Error; + } + if(arguments.length > 2) { + var boundArgs = Array.prototype.slice.call(arguments, 2); + return function() { + var newArgs = Array.prototype.slice.call(arguments); + Array.prototype.unshift.apply(newArgs, boundArgs); + return fn.apply(selfObj, newArgs) + } + }else { + return function() { + return fn.apply(selfObj, arguments) + } + } +}; +goog.bind = function(fn, selfObj, var_args) { + if(Function.prototype.bind && Function.prototype.bind.toString().indexOf("native code") != -1) { + goog.bind = goog.bindNative_ + }else { + goog.bind = goog.bindJs_ + } + return goog.bind.apply(null, arguments) +}; +goog.partial = function(fn, var_args) { + var args = Array.prototype.slice.call(arguments, 1); + return function() { + var newArgs = Array.prototype.slice.call(arguments); + newArgs.unshift.apply(newArgs, args); + return fn.apply(this, newArgs) + } +}; +goog.mixin = function(target, source) { + for(var x in source) { + target[x] = source[x] + } +}; +goog.now = goog.TRUSTED_SITE && Date.now || function() { + return+new Date +}; +goog.globalEval = function(script) { + if(goog.global.execScript) { + goog.global.execScript(script, "JavaScript") + }else { + if(goog.global.eval) { + if(goog.evalWorksForGlobals_ == null) { + goog.global.eval("var _et_ \x3d 1;"); + if(typeof goog.global["_et_"] != "undefined") { + delete goog.global["_et_"]; + goog.evalWorksForGlobals_ = true + }else { + goog.evalWorksForGlobals_ = false + } + } + if(goog.evalWorksForGlobals_) { + goog.global.eval(script) + }else { + var doc = goog.global.document; + var scriptElt = doc.createElement("script"); + scriptElt.type = "text/javascript"; + scriptElt.defer = false; + scriptElt.appendChild(doc.createTextNode(script)); + doc.body.appendChild(scriptElt); + doc.body.removeChild(scriptElt) + } + }else { + throw Error("goog.globalEval not available"); + } + } +}; +goog.evalWorksForGlobals_ = null; +goog.cssNameMapping_; +goog.cssNameMappingStyle_; +goog.getCssName = function(className, opt_modifier) { + var getMapping = function(cssName) { + return goog.cssNameMapping_[cssName] || cssName + }; + var renameByParts = function(cssName) { + var parts = cssName.split("-"); + var mapped = []; + for(var i = 0;i < parts.length;i++) { + mapped.push(getMapping(parts[i])) + } + return mapped.join("-") + }; + var rename; + if(goog.cssNameMapping_) { + rename = goog.cssNameMappingStyle_ == "BY_WHOLE" ? getMapping : renameByParts + }else { + rename = function(a) { + return a + } + } + if(opt_modifier) { + return className + "-" + rename(opt_modifier) + }else { + return rename(className) + } +}; +goog.setCssNameMapping = function(mapping, opt_style) { + goog.cssNameMapping_ = mapping; + goog.cssNameMappingStyle_ = opt_style +}; +goog.global.CLOSURE_CSS_NAME_MAPPING; +if(!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING) { + goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING +} +goog.getMsg = function(str, opt_values) { + var values = opt_values || {}; + for(var key in values) { + var value = ("" + values[key]).replace(/\$/g, "$$$$"); + str = str.replace(new RegExp("\\{\\$" + key + "\\}", "gi"), value) + } + return str +}; +goog.getMsgWithFallback = function(a, b) { + return a +}; +goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) { + goog.exportPath_(publicPath, object, opt_objectToExportTo) +}; +goog.exportProperty = function(object, publicName, symbol) { + object[publicName] = symbol +}; +goog.inherits = function(childCtor, parentCtor) { + function tempCtor() { + } + tempCtor.prototype = parentCtor.prototype; + childCtor.superClass_ = parentCtor.prototype; + childCtor.prototype = new tempCtor; + childCtor.prototype.constructor = childCtor +}; +goog.base = function(me, opt_methodName, var_args) { + var caller = arguments.callee.caller; + if(goog.DEBUG) { + if(!caller) { + throw Error("arguments.caller not defined. goog.base() expects not " + "to be running in strict mode. See " + "http://www.ecma-international.org/ecma-262/5.1/#sec-C"); + } + } + if(caller.superClass_) { + return caller.superClass_.constructor.apply(me, Array.prototype.slice.call(arguments, 1)) + } + var args = Array.prototype.slice.call(arguments, 2); + var foundCaller = false; + for(var ctor = me.constructor;ctor;ctor = ctor.superClass_ && ctor.superClass_.constructor) { + if(ctor.prototype[opt_methodName] === caller) { + foundCaller = true + }else { + if(foundCaller) { + return ctor.prototype[opt_methodName].apply(me, args) + } + } + } + if(me[opt_methodName] === caller) { + return me.constructor.prototype[opt_methodName].apply(me, args) + }else { + throw Error("goog.base called from a method of one name " + "to a method of a different name"); + } +}; +goog.scope = function(fn) { + fn.call(goog.global) +}; +goog.addDependency("../build/src/internal/src/requireall.js", [], ["libtess", "libtess.ActiveRegion", "libtess.CachedVertex", "libtess.Dict", "libtess.DictNode", "libtess.FaceCount", "libtess.GluFace", "libtess.GluHalfEdge", "libtess.GluMesh", "libtess.GluTesselator", "libtess.GluVertex", "libtess.PQHandleElem", "libtess.PQNode", "libtess.PriorityQ", "libtess.PriorityQHeap", "libtess.geom", "libtess.mesh", "libtess.normal", "libtess.render", "libtess.sweep", "libtess.tessmono", "ol", "ol.Attribution", +"ol.BrowserFeature", "ol.CanvasFunctionType", "ol.CenterConstraint", "ol.CenterConstraintType", "ol.Collection", "ol.CollectionEvent", "ol.CollectionEventType", "ol.Constraints", "ol.Coordinate", "ol.CoordinateArray", "ol.CoordinateFormatType", "ol.DeviceOrientation", "ol.DeviceOrientationProperty", "ol.DragBoxEvent", "ol.DrawEvent", "ol.Ellipsoid", "ol.Extent", "ol.Feature", "ol.FeatureOverlay", "ol.FrameState", "ol.Geolocation", "ol.GeolocationProperty", "ol.IView", "ol.IView2D", "ol.IView3D", +"ol.Image", "ol.ImageBase", "ol.ImageCanvas", "ol.ImageState", "ol.ImageTile", "ol.ImageUrlFunction", "ol.ImageUrlFunctionType", "ol.Kinetic", "ol.Map", "ol.MapBrowserEvent", "ol.MapBrowserEvent.EventType", "ol.MapBrowserEventHandler", "ol.MapEvent", "ol.MapEventType", "ol.MapProperty", "ol.Object", "ol.ObjectEvent", "ol.ObjectEventType", "ol.Observable", "ol.Overlay", "ol.OverlayPositioning", "ol.OverlayProperty", "ol.Pixel", "ol.PostRenderFunction", "ol.PreRenderFunction", "ol.RendererHint", "ol.ResolutionConstraint", +"ol.ResolutionConstraintType", "ol.RotationConstraint", "ol.RotationConstraintType", "ol.Size", "ol.Sphere", "ol.Tile", "ol.TileCache", "ol.TileCoord", "ol.TileLoadFunctionType", "ol.TilePriorityFunction", "ol.TileQueue", "ol.TileRange", "ol.TileState", "ol.TileUrlFunction", "ol.TileUrlFunctionType", "ol.TransformFunction", "ol.View", "ol.View2D", "ol.View2DProperty", "ol.View2DState", "ol.ViewHint", "ol.animation", "ol.array", "ol.binary.Buffer", "ol.binary.IReader", "ol.color", "ol.color.Matrix", +"ol.control", "ol.control.Attribution", "ol.control.Control", "ol.control.FullScreen", "ol.control.Logo", "ol.control.MousePosition", "ol.control.ScaleLine", "ol.control.ScaleLineProperty", "ol.control.ScaleLineUnits", "ol.control.Zoom", "ol.control.ZoomSlider", "ol.control.ZoomToExtent", "ol.coordinate", "ol.css", "ol.dom", "ol.dom.BrowserFeature", "ol.dom.Input", "ol.dom.InputProperty", "ol.easing", "ol.ellipsoid.BESSEL1841", "ol.ellipsoid.WGS84", "ol.events.ConditionType", "ol.events.condition", +"ol.extent", "ol.extent.Relationship", "ol.feature", "ol.format.BinaryFeature", "ol.format.Feature", "ol.format.FormatType", "ol.format.GML", "ol.format.GPX", "ol.format.GPX.V1_1", "ol.format.GeoJSON", "ol.format.IGC", "ol.format.IGCZ", "ol.format.JSONFeature", "ol.format.KML", "ol.format.OSMXML", "ol.format.Polyline", "ol.format.TextFeature", "ol.format.TopoJSON", "ol.format.XMLFeature", "ol.format.XSD", "ol.geom.Circle", "ol.geom.Geometry", "ol.geom.GeometryCollection", "ol.geom.GeometryType", +"ol.geom.LineString", "ol.geom.LinearRing", "ol.geom.MultiLineString", "ol.geom.MultiPoint", "ol.geom.MultiPolygon", "ol.geom.Point", "ol.geom.Polygon", "ol.geom.SimpleGeometry", "ol.geom.closest", "ol.geom.flat", "ol.geom.simplify", "ol.interaction", "ol.interaction.DoubleClickZoom", "ol.interaction.Drag", "ol.interaction.DragAndDrop", "ol.interaction.DragAndDropEvent", "ol.interaction.DragBox", "ol.interaction.DragPan", "ol.interaction.DragRotate", "ol.interaction.DragRotateAndZoom", "ol.interaction.DragZoom", +"ol.interaction.Draw", "ol.interaction.Interaction", "ol.interaction.KeyboardPan", "ol.interaction.KeyboardZoom", "ol.interaction.Modify", "ol.interaction.MouseWheelZoom", "ol.interaction.Select", "ol.interaction.Touch", "ol.interaction.TouchPan", "ol.interaction.TouchRotate", "ol.interaction.TouchZoom", "ol.layer.Base", "ol.layer.Group", "ol.layer.Heatmap", "ol.layer.Image", "ol.layer.Layer", "ol.layer.LayerProperty", "ol.layer.LayerState", "ol.layer.Tile", "ol.layer.Vector", "ol.math", "ol.parser.Parser", +"ol.parser.XML", "ol.parser.ogc.ExceptionReport", "ol.parser.ogc.Versioned", "ol.parser.ogc.WMSCapabilities", "ol.parser.ogc.WMSCapabilities_v1", "ol.parser.ogc.WMSCapabilities_v1_0_0", "ol.parser.ogc.WMSCapabilities_v1_1", "ol.parser.ogc.WMSCapabilities_v1_1_0", "ol.parser.ogc.WMSCapabilities_v1_1_1", "ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC", "ol.parser.ogc.WMSCapabilities_v1_3_0", "ol.proj", "ol.proj.CH", "ol.proj.EPSG2056", "ol.proj.EPSG21781", "ol.proj.EPSG3857", "ol.proj.EPSG4326", "ol.proj.METERS_PER_UNIT", +"ol.proj.Projection", "ol.proj.ProjectionLike", "ol.proj.Units", "ol.proj.common", "ol.render.Box", "ol.render.Event", "ol.render.EventType", "ol.render.IReplayGroup", "ol.render.IVectorContext", "ol.render.canvas", "ol.render.canvas.Immediate", "ol.render.canvas.ReplayGroup", "ol.render.webgl.Immediate", "ol.renderer.Layer", "ol.renderer.Map", "ol.renderer.canvas.ImageLayer", "ol.renderer.canvas.Layer", "ol.renderer.canvas.Map", "ol.renderer.canvas.TileLayer", "ol.renderer.canvas.VectorLayer", "ol.renderer.dom.ImageLayer", +"ol.renderer.dom.Layer", "ol.renderer.dom.Map", "ol.renderer.dom.TileLayer", "ol.renderer.vector", "ol.renderer.webgl.ImageLayer", "ol.renderer.webgl.Layer", "ol.renderer.webgl.Map", "ol.renderer.webgl.TileLayer", "ol.renderer.webgl.map.shader.Color", "ol.renderer.webgl.map.shader.Default", "ol.renderer.webgl.tilelayer.shader", "ol.size", "ol.source.BingMaps", "ol.source.GPX", "ol.source.GeoJSON", "ol.source.IGC", "ol.source.Image", "ol.source.ImageCanvas", "ol.source.ImageStatic", "ol.source.ImageVector", +"ol.source.ImageWMS", "ol.source.KML", "ol.source.MapGuide", "ol.source.MapQuest", "ol.source.OSM", "ol.source.OSMXML", "ol.source.Source", "ol.source.Stamen", "ol.source.State", "ol.source.Tile", "ol.source.TileDebug", "ol.source.TileImage", "ol.source.TileJSON", "ol.source.TileOptions", "ol.source.TileWMS", "ol.source.TopoJSON", "ol.source.Vector", "ol.source.VectorEvent", "ol.source.VectorEventType", "ol.source.VectorFile", "ol.source.WMTS", "ol.source.WMTSRequestEncoding", "ol.source.XYZ", "ol.source.Zoomify", +"ol.source.wms", "ol.source.wms.ServerType", "ol.sphere.NORMAL", "ol.sphere.WGS84", "ol.structs.Buffer", "ol.structs.IntegerSet", "ol.structs.LRUCache", "ol.structs.PriorityQueue", "ol.structs.RBush", "ol.style.Circle", "ol.style.Fill", "ol.style.Icon", "ol.style.IconAnchorOrigin", "ol.style.IconAnchorUnits", "ol.style.IconImageCache", "ol.style.Image", "ol.style.ImageState", "ol.style.Stroke", "ol.style.Style", "ol.style.Text", "ol.tilegrid.TileGrid", "ol.tilegrid.WMTS", "ol.tilegrid.XYZ", "ol.tilegrid.Zoomify", +"ol.tilejson", "ol.vec.Mat4", "ol.webgl", "ol.webgl.Context", "ol.webgl.WebGLContextEventType", "ol.webgl.shader", "ol.xml"]); +goog.addDependency("../src/googx/dom/fullscreen.js", ["googx.dom.fullscreen", "googx.dom.fullscreen.EventType"], ["goog.dom", "goog.userAgent"]); +goog.addDependency("../src/libtess.js/dict/Dict.js", ["libtess.Dict"], ["libtess", "libtess.DictNode"]); +goog.addDependency("../src/libtess.js/dict/DictNode.js", ["libtess.DictNode"], ["libtess"]); +goog.addDependency("../src/libtess.js/geom.js", ["libtess.geom"], ["libtess"]); +goog.addDependency("../src/libtess.js/libtess.js", ["libtess"], []); +goog.addDependency("../src/libtess.js/libtess/CachedVertex.js", ["libtess.CachedVertex"], ["libtess"]); +goog.addDependency("../src/libtess.js/libtess/GluTesselator.js", ["libtess.GluTesselator"], ["libtess", "libtess.CachedVertex", "libtess.GluMesh", "libtess.mesh", "libtess.normal", "libtess.render", "libtess.sweep", "libtess.tessmono"]); +goog.addDependency("../src/libtess.js/mesh.js", ["libtess.mesh"], ["libtess", "libtess.GluFace", "libtess.GluHalfEdge", "libtess.GluVertex"]); +goog.addDependency("../src/libtess.js/mesh/GluFace.js", ["libtess.GluFace"], ["libtess"]); +goog.addDependency("../src/libtess.js/mesh/GluHalfEdge.js", ["libtess.GluHalfEdge"], ["libtess"]); +goog.addDependency("../src/libtess.js/mesh/GluMesh.js", ["libtess.GluMesh"], ["libtess", "libtess.GluFace", "libtess.GluHalfEdge", "libtess.GluVertex"]); +goog.addDependency("../src/libtess.js/mesh/GluVertex.js", ["libtess.GluVertex"], ["libtess"]); +goog.addDependency("../src/libtess.js/normal.js", ["libtess.normal"], ["libtess"]); +goog.addDependency("../src/libtess.js/priorityq/PQHandleElem.js", ["libtess.PQHandleElem"], ["libtess"]); +goog.addDependency("../src/libtess.js/priorityq/PQNode.js", ["libtess.PQNode"], ["libtess"]); +goog.addDependency("../src/libtess.js/priorityq/PriorityQ.js", ["libtess.PriorityQ"], ["libtess", "libtess.PriorityQHeap"]); +goog.addDependency("../src/libtess.js/priorityq/PriorityQHeap.js", ["libtess.PriorityQHeap"], ["libtess", "libtess.PQHandleElem", "libtess.PQNode"]); +goog.addDependency("../src/libtess.js/render.js", ["libtess.render"], ["libtess", "libtess.FaceCount"]); +goog.addDependency("../src/libtess.js/render/FaceCount.js", ["libtess.FaceCount"], ["libtess"]); +goog.addDependency("../src/libtess.js/sweep.js", ["libtess.sweep"], ["libtess", "libtess.ActiveRegion", "libtess.Dict", "libtess.GluVertex", "libtess.PriorityQ", "libtess.geom", "libtess.mesh"]); +goog.addDependency("../src/libtess.js/sweep/ActiveRegion.js", ["libtess.ActiveRegion"], ["libtess.DictNode"]); +goog.addDependency("../src/libtess.js/tessmono.js", ["libtess.tessmono"], ["libtess", "libtess.geom", "libtess.mesh"]); +goog.addDependency("../src/ol/animation.js", ["ol.animation"], ["ol.PreRenderFunction", "ol.ViewHint", "ol.easing"]); +goog.addDependency("../src/ol/array.js", ["ol.array"], ["goog.array", "goog.asserts"]); +goog.addDependency("../src/ol/attribution.js", ["ol.Attribution"], ["ol.TileRange"]); +goog.addDependency("../src/ol/binary.js", ["ol.binary.Buffer", "ol.binary.IReader"], ["goog.asserts", "goog.userAgent", "ol.BrowserFeature"]); +goog.addDependency("../src/ol/browserfeature.js", ["ol.BrowserFeature"], ["goog.dom", "goog.dom.TagName", "goog.userAgent", "ol.webgl"]); +goog.addDependency("../src/ol/canvasfunction.js", ["ol.CanvasFunctionType"], []); +goog.addDependency("../src/ol/centerconstraint.js", ["ol.CenterConstraint", "ol.CenterConstraintType"], ["goog.math"]); +goog.addDependency("../src/ol/collection.js", ["ol.Collection", "ol.CollectionEvent", "ol.CollectionEventType"], ["goog.array", "goog.events.Event", "ol.Object"]); +goog.addDependency("../src/ol/color/color.js", ["ol.color"], ["goog.array", "goog.asserts", "goog.color", "goog.color.names", "goog.math", "goog.vec.Mat4"]); +goog.addDependency("../src/ol/color/colormatrix.js", ["ol.color.Matrix"], ["goog.vec.Mat4"]); +goog.addDependency("../src/ol/constraints.js", ["ol.Constraints"], ["ol.CenterConstraintType", "ol.ResolutionConstraintType", "ol.RotationConstraintType"]); +goog.addDependency("../src/ol/control/attributioncontrol.js", ["ol.control.Attribution"], ["goog.array", "goog.dom", "goog.dom.TagName", "goog.object", "goog.style", "ol.Attribution", "ol.FrameState", "ol.control.Control", "ol.css"]); +goog.addDependency("../src/ol/control/control.js", ["ol.control.Control"], ["goog.array", "goog.dom", "goog.events", "ol.MapEventType", "ol.Object"]); +goog.addDependency("../src/ol/control/controldefaults.js", ["ol.control"], ["ol.Collection", "ol.control.Attribution", "ol.control.Logo", "ol.control.Zoom"]); +goog.addDependency("../src/ol/control/fullscreencontrol.js", ["ol.control.FullScreen"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.dom.classes", "goog.events", "goog.events.EventType", "googx.dom.fullscreen", "googx.dom.fullscreen.EventType", "ol.control.Control", "ol.css"]); +goog.addDependency("../src/ol/control/logocontrol.js", ["ol.control.Logo"], ["goog.dom", "goog.dom.TagName", "goog.object", "goog.style", "ol.FrameState", "ol.control.Control", "ol.css"]); +goog.addDependency("../src/ol/control/mousepositioncontrol.js", ["ol.control.MousePosition"], ["goog.array", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.EventType", "goog.style", "ol.CoordinateFormatType", "ol.Object", "ol.Pixel", "ol.TransformFunction", "ol.control.Control", "ol.proj", "ol.proj.Projection"]); +goog.addDependency("../src/ol/control/scalelinecontrol.js", ["ol.control.ScaleLine", "ol.control.ScaleLineProperty", "ol.control.ScaleLineUnits"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.math", "goog.style", "ol.Object", "ol.TransformFunction", "ol.View2DState", "ol.control.Control", "ol.css", "ol.proj", "ol.proj.Units", "ol.sphere.NORMAL"]); +goog.addDependency("../src/ol/control/zoomcontrol.js", ["ol.control.Zoom"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.EventType", "ol.View2D", "ol.animation", "ol.control.Control", "ol.css", "ol.easing"]); +goog.addDependency("../src/ol/control/zoomslidercontrol.js", ["ol.control.ZoomSlider"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.Event", "goog.events.EventType", "goog.fx.Dragger", "goog.fx.Dragger.EventType", "goog.math", "goog.math.Rect", "goog.style", "ol.animation", "ol.control.Control", "ol.css", "ol.easing"]); +goog.addDependency("../src/ol/control/zoomtoextentcontrol.js", ["ol.control.ZoomToExtent"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.EventType", "ol.control.Control", "ol.css"]); +goog.addDependency("../src/ol/coordinate.js", ["ol.Coordinate", "ol.CoordinateArray", "ol.CoordinateFormatType", "ol.coordinate"], ["goog.math"]); +goog.addDependency("../src/ol/css.js", ["ol.css"], []); +goog.addDependency("../src/ol/deviceorientation.js", ["ol.DeviceOrientation", "ol.DeviceOrientationProperty"], ["goog.events", "goog.math", "ol.BrowserFeature", "ol.Object"]); +goog.addDependency("../src/ol/dom/dom.js", ["ol.dom", "ol.dom.BrowserFeature"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.style", "goog.userAgent", "goog.vec.Mat4"]); +goog.addDependency("../src/ol/dom/input.js", ["ol.dom.Input", "ol.dom.InputProperty"], ["goog.asserts", "goog.events", "goog.events.EventType", "ol.Object"]); +goog.addDependency("../src/ol/easing.js", ["ol.easing"], ["goog.fx.easing"]); +goog.addDependency("../src/ol/ellipsoid/bessel1841ellipsoid.js", ["ol.ellipsoid.BESSEL1841"], ["ol.Ellipsoid"]); +goog.addDependency("../src/ol/ellipsoid/ellipsoid.js", ["ol.Ellipsoid"], ["goog.math", "ol.Coordinate"]); +goog.addDependency("../src/ol/ellipsoid/wgs84ellipsoid.js", ["ol.ellipsoid.WGS84"], ["ol.Ellipsoid"]); +goog.addDependency("../src/ol/events/condition.js", ["ol.events.ConditionType", "ol.events.condition"], ["goog.asserts", "goog.dom.TagName", "goog.functions", "ol.MapBrowserEvent.EventType"]); +goog.addDependency("../src/ol/extent.js", ["ol.Extent", "ol.extent", "ol.extent.Relationship"], ["goog.asserts", "goog.vec.Mat4", "ol.Coordinate", "ol.Size", "ol.TransformFunction"]); +goog.addDependency("../src/ol/feature.js", ["ol.Feature", "ol.feature"], ["goog.asserts", "goog.events", "goog.events.EventType", "goog.functions", "ol.Object", "ol.geom.Geometry", "ol.style.Circle", "ol.style.Fill", "ol.style.Stroke", "ol.style.Style"]); +goog.addDependency("../src/ol/featureoverlay.js", ["ol.FeatureOverlay"], ["goog.array", "goog.asserts", "goog.events", "goog.events.EventType", "goog.object", "ol.Collection", "ol.CollectionEventType", "ol.Feature", "ol.feature", "ol.render.EventType"]); +goog.addDependency("../src/ol/format/binaryfeatureformat.js", ["ol.format.BinaryFeature"], ["goog.asserts", "ol.BrowserFeature", "ol.binary.Buffer", "ol.format.Feature", "ol.format.FormatType", "ol.proj"]); +goog.addDependency("../src/ol/format/featureformat.js", ["ol.format.Feature"], ["goog.functions"]); +goog.addDependency("../src/ol/format/format.js", ["ol.format.FormatType"], []); +goog.addDependency("../src/ol/format/geojsonformat.js", ["ol.format.GeoJSON"], ["goog.array", "goog.asserts", "goog.object", "ol.Feature", "ol.format.JSONFeature", "ol.geom.GeometryCollection", "ol.geom.GeometryType", "ol.geom.LineString", "ol.geom.MultiLineString", "ol.geom.MultiPoint", "ol.geom.MultiPolygon", "ol.geom.Point", "ol.geom.Polygon", "ol.proj"]); +goog.addDependency("../src/ol/format/gmlformat.js", ["ol.format.GML"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.NodeType", "goog.object", "goog.string", "ol.Feature", "ol.extent", "ol.format.XMLFeature", "ol.format.XSD", "ol.geom.Geometry", "ol.geom.LineString", "ol.geom.LinearRing", "ol.geom.MultiLineString", "ol.geom.MultiPoint", "ol.geom.MultiPolygon", "ol.geom.Point", "ol.geom.Polygon", "ol.proj", "ol.xml"]); +goog.addDependency("../src/ol/format/gpxformat.js", ["ol.format.GPX", "ol.format.GPX.V1_1"], ["goog.array", "goog.asserts", "goog.dom.NodeType", "goog.object", "ol.Feature", "ol.format.XMLFeature", "ol.format.XSD", "ol.geom.LineString", "ol.geom.MultiLineString", "ol.geom.Point", "ol.proj", "ol.xml"]); +goog.addDependency("../src/ol/format/igcformat.js", ["ol.format.IGC", "ol.format.IGCZ"], ["goog.asserts", "goog.string", "goog.string.newlines", "ol.Feature", "ol.format.TextFeature", "ol.geom.LineString", "ol.proj"]); +goog.addDependency("../src/ol/format/jsonfeatureformat.js", ["ol.format.JSONFeature"], ["goog.asserts", "goog.json", "ol.format.Feature", "ol.format.FormatType"]); +goog.addDependency("../src/ol/format/kmlformat.js", ["ol.format.KML"], ["goog.Uri", "goog.array", "goog.asserts", "goog.dom.NodeType", "goog.math", "goog.object", "goog.string", "ol.Feature", "ol.feature", "ol.format.XMLFeature", "ol.format.XSD", "ol.geom.GeometryCollection", "ol.geom.GeometryType", "ol.geom.LineString", "ol.geom.MultiLineString", "ol.geom.MultiPoint", "ol.geom.MultiPolygon", "ol.geom.Point", "ol.geom.Polygon", "ol.proj", "ol.style.Fill", "ol.style.Icon", "ol.style.IconAnchorOrigin", +"ol.style.IconAnchorUnits", "ol.style.Image", "ol.style.Stroke", "ol.style.Style", "ol.xml"]); +goog.addDependency("../src/ol/format/osmxmlformat.js", ["ol.format.OSMXML"], ["goog.array", "goog.asserts", "goog.dom.NodeType", "goog.object", "ol.Feature", "ol.format.XMLFeature", "ol.geom.LineString", "ol.geom.Point", "ol.geom.Polygon", "ol.proj", "ol.xml"]); +goog.addDependency("../src/ol/format/polylineformat.js", ["ol.format.Polyline"], ["goog.asserts", "ol.Feature", "ol.format.TextFeature", "ol.geom.LineString", "ol.geom.flat", "ol.proj"]); +goog.addDependency("../src/ol/format/textfeatureformat.js", ["ol.format.TextFeature"], ["goog.asserts", "ol.format.Feature", "ol.format.FormatType"]); +goog.addDependency("../src/ol/format/topojsonformat.js", ["ol.format.TopoJSON"], ["goog.array", "goog.asserts", "goog.object", "ol.Feature", "ol.format.JSONFeature", "ol.geom.LineString", "ol.geom.MultiLineString", "ol.geom.MultiPoint", "ol.geom.MultiPolygon", "ol.geom.Point", "ol.geom.Polygon", "ol.proj"]); +goog.addDependency("../src/ol/format/xmlfeatureformat.js", ["ol.format.XMLFeature"], ["goog.array", "goog.asserts", "goog.dom.NodeType", "ol.format.Feature", "ol.format.FormatType", "ol.xml"]); +goog.addDependency("../src/ol/format/xsdformat.js", ["ol.format.XSD"], ["goog.asserts", "goog.string", "ol.xml"]); +goog.addDependency("../src/ol/framestate.js", ["ol.FrameState", "ol.PostRenderFunction", "ol.PreRenderFunction"], ["goog.vec.Mat4", "ol.Attribution", "ol.Extent", "ol.Size", "ol.TileQueue", "ol.TileRange", "ol.View2DState", "ol.layer.Layer", "ol.layer.LayerState"]); +goog.addDependency("../src/ol/geolocation.js", ["ol.Geolocation", "ol.GeolocationProperty"], ["goog.events", "goog.events.EventType", "goog.math", "ol.BrowserFeature", "ol.Coordinate", "ol.Object", "ol.proj"]); +goog.addDependency("../src/ol/geom/circle.js", ["ol.geom.Circle"], ["goog.asserts", "ol.extent", "ol.geom.GeometryType", "ol.geom.SimpleGeometry", "ol.geom.flat"]); +goog.addDependency("../src/ol/geom/closestgeom.js", ["ol.geom.closest"], ["goog.asserts", "ol.geom.flat"]); +goog.addDependency("../src/ol/geom/flatgeom.js", ["ol.geom.flat"], ["goog.array", "goog.asserts", "goog.math", "goog.vec.Mat4", "ol.extent"]); +goog.addDependency("../src/ol/geom/geometry.js", ["ol.geom.Geometry", "ol.geom.GeometryType"], ["goog.asserts", "goog.functions", "ol.Observable"]); +goog.addDependency("../src/ol/geom/geometrycollection.js", ["ol.geom.GeometryCollection"], ["goog.array", "goog.asserts", "goog.events", "goog.events.EventType", "goog.object", "ol.extent", "ol.geom.Geometry", "ol.geom.GeometryType"]); +goog.addDependency("../src/ol/geom/linearring.js", ["ol.geom.LinearRing"], ["ol.extent", "ol.geom.GeometryType", "ol.geom.SimpleGeometry", "ol.geom.closest", "ol.geom.flat", "ol.geom.simplify"]); +goog.addDependency("../src/ol/geom/linestring.js", ["ol.geom.LineString"], ["ol.extent", "ol.geom.GeometryType", "ol.geom.SimpleGeometry", "ol.geom.closest", "ol.geom.flat", "ol.geom.simplify"]); +goog.addDependency("../src/ol/geom/multilinestring.js", ["ol.geom.MultiLineString"], ["goog.array", "goog.asserts", "ol.extent", "ol.geom.GeometryType", "ol.geom.LineString", "ol.geom.SimpleGeometry", "ol.geom.closest", "ol.geom.flat", "ol.geom.simplify"]); +goog.addDependency("../src/ol/geom/multipoint.js", ["ol.geom.MultiPoint"], ["ol.extent", "ol.geom.GeometryType", "ol.geom.Point", "ol.geom.SimpleGeometry", "ol.geom.flat"]); +goog.addDependency("../src/ol/geom/multipolygon.js", ["ol.geom.MultiPolygon"], ["goog.array", "goog.asserts", "ol.extent", "ol.geom.GeometryType", "ol.geom.MultiPoint", "ol.geom.Polygon", "ol.geom.SimpleGeometry", "ol.geom.closest", "ol.geom.flat", "ol.geom.simplify"]); +goog.addDependency("../src/ol/geom/point.js", ["ol.geom.Point"], ["goog.asserts", "ol.extent", "ol.geom.GeometryType", "ol.geom.SimpleGeometry", "ol.geom.flat"]); +goog.addDependency("../src/ol/geom/polygon.js", ["ol.geom.Polygon"], ["ol.extent", "ol.geom.GeometryType", "ol.geom.LinearRing", "ol.geom.Point", "ol.geom.SimpleGeometry", "ol.geom.closest", "ol.geom.flat", "ol.geom.simplify"]); +goog.addDependency("../src/ol/geom/simplegeometry.js", ["ol.geom.SimpleGeometry"], ["goog.asserts", "goog.functions", "goog.object", "ol.extent", "ol.geom.Geometry", "ol.geom.flat"]); +goog.addDependency("../src/ol/geom/simplifygeom.js", ["ol.geom.simplify"], ["ol.geom.flat"]); +goog.addDependency("../src/ol/image.js", ["ol.Image"], ["goog.array", "goog.asserts", "goog.events", "goog.events.EventType", "goog.object", "ol.ImageBase", "ol.ImageState"]); +goog.addDependency("../src/ol/imagebase.js", ["ol.ImageBase", "ol.ImageState"], ["goog.events.EventTarget", "goog.events.EventType", "ol.Attribution", "ol.Extent"]); +goog.addDependency("../src/ol/imagecanvas.js", ["ol.ImageCanvas"], ["ol.ImageBase", "ol.ImageState"]); +goog.addDependency("../src/ol/imagetile.js", ["ol.ImageTile"], ["goog.array", "goog.asserts", "goog.events", "goog.events.EventType", "goog.object", "ol.Tile", "ol.TileCoord", "ol.TileLoadFunctionType", "ol.TileState"]); +goog.addDependency("../src/ol/imageurlfunction.js", ["ol.ImageUrlFunction", "ol.ImageUrlFunctionType"], ["ol.Size"]); +goog.addDependency("../src/ol/interaction/doubleclickzoominteraction.js", ["ol.interaction.DoubleClickZoom"], ["goog.asserts", "ol.MapBrowserEvent", "ol.MapBrowserEvent.EventType", "ol.interaction.Interaction"]); +goog.addDependency("../src/ol/interaction/draganddropinteraction.js", ["ol.interaction.DragAndDrop", "ol.interaction.DragAndDropEvent"], ["goog.array", "goog.asserts", "goog.events", "goog.events.Event", "goog.events.FileDropHandler", "goog.events.FileDropHandler.EventType", "goog.fs.FileReader", "goog.functions", "ol.interaction.Interaction", "ol.proj"]); +goog.addDependency("../src/ol/interaction/dragboxinteraction.js", ["ol.DragBoxEvent", "ol.interaction.DragBox"], ["goog.asserts", "goog.events.Event", "ol.events.ConditionType", "ol.events.condition", "ol.interaction.Drag", "ol.render.Box"]); +goog.addDependency("../src/ol/interaction/draginteraction.js", ["ol.interaction.Drag"], ["goog.asserts", "goog.events.BrowserEvent", "goog.functions", "ol.Coordinate", "ol.MapBrowserEvent", "ol.MapBrowserEvent.EventType", "ol.interaction.Interaction"]); +goog.addDependency("../src/ol/interaction/dragpaninteraction.js", ["ol.interaction.DragPan"], ["goog.asserts", "ol.Kinetic", "ol.PreRenderFunction", "ol.View2D", "ol.ViewHint", "ol.coordinate", "ol.events.ConditionType", "ol.events.condition", "ol.interaction.Drag"]); +goog.addDependency("../src/ol/interaction/dragrotateandzoominteraction.js", ["ol.interaction.DragRotateAndZoom"], ["goog.asserts", "goog.math.Vec2", "ol.ViewHint", "ol.events.ConditionType", "ol.events.condition", "ol.interaction.Drag", "ol.interaction.Interaction"]); +goog.addDependency("../src/ol/interaction/dragrotateinteraction.js", ["ol.interaction.DragRotate"], ["goog.asserts", "ol.ViewHint", "ol.events.ConditionType", "ol.events.condition", "ol.interaction.Drag", "ol.interaction.Interaction"]); +goog.addDependency("../src/ol/interaction/dragzoominteraction.js", ["ol.interaction.DragZoom"], ["goog.asserts", "ol.events.condition", "ol.extent", "ol.interaction.DragBox", "ol.interaction.Interaction", "ol.style.Stroke", "ol.style.Style"]); +goog.addDependency("../src/ol/interaction/drawinteraction.js", ["ol.DrawEvent", "ol.interaction.Draw"], ["goog.asserts", "goog.events.Event", "ol.Collection", "ol.Coordinate", "ol.Feature", "ol.FeatureOverlay", "ol.Map", "ol.MapBrowserEvent", "ol.MapBrowserEvent.EventType", "ol.geom.GeometryType", "ol.geom.LineString", "ol.geom.MultiLineString", "ol.geom.MultiPoint", "ol.geom.MultiPolygon", "ol.geom.Point", "ol.geom.Polygon", "ol.interaction.Interaction", "ol.source.Vector", "ol.style.Circle", "ol.style.Fill", +"ol.style.Stroke", "ol.style.Style"]); +goog.addDependency("../src/ol/interaction/interaction.js", ["ol.interaction.Interaction"], ["goog.asserts", "ol.MapBrowserEvent", "ol.Observable", "ol.View2D", "ol.animation", "ol.easing"]); +goog.addDependency("../src/ol/interaction/interactiondefaults.js", ["ol.interaction"], ["ol.Collection", "ol.Kinetic", "ol.interaction.DoubleClickZoom", "ol.interaction.DragPan", "ol.interaction.DragRotate", "ol.interaction.DragZoom", "ol.interaction.KeyboardPan", "ol.interaction.KeyboardZoom", "ol.interaction.MouseWheelZoom", "ol.interaction.TouchPan", "ol.interaction.TouchRotate", "ol.interaction.TouchZoom"]); +goog.addDependency("../src/ol/interaction/keyboardpaninteraction.js", ["ol.interaction.KeyboardPan"], ["goog.asserts", "goog.events.KeyCodes", "goog.events.KeyHandler.EventType", "goog.functions", "ol.View2D", "ol.coordinate", "ol.events.ConditionType", "ol.events.condition", "ol.interaction.Interaction"]); +goog.addDependency("../src/ol/interaction/keyboardzoominteraction.js", ["ol.interaction.KeyboardZoom"], ["goog.asserts", "goog.events.KeyHandler.EventType", "ol.events.ConditionType", "ol.events.condition", "ol.interaction.Interaction"]); +goog.addDependency("../src/ol/interaction/modifyinteraction.js", ["ol.interaction.Modify"], ["goog.array", "goog.asserts", "goog.events", "ol.Collection", "ol.CollectionEventType", "ol.Feature", "ol.FeatureOverlay", "ol.MapBrowserEvent.EventType", "ol.ViewHint", "ol.coordinate", "ol.extent", "ol.geom.GeometryType", "ol.geom.LineString", "ol.geom.MultiLineString", "ol.geom.MultiPoint", "ol.geom.MultiPolygon", "ol.geom.Point", "ol.geom.Polygon", "ol.interaction.Drag", "ol.structs.RBush"]); +goog.addDependency("../src/ol/interaction/mousewheelzoominteraction.js", ["ol.interaction.MouseWheelZoom"], ["goog.asserts", "goog.events.MouseWheelEvent", "goog.events.MouseWheelHandler.EventType", "goog.math", "ol.Coordinate", "ol.interaction.Interaction"]); +goog.addDependency("../src/ol/interaction/selectinteraction.js", ["ol.interaction.Select"], ["goog.array", "goog.functions", "ol.FeatureOverlay", "ol.events.condition", "ol.interaction.Interaction"]); +goog.addDependency("../src/ol/interaction/touchinteraction.js", ["ol.interaction.Touch"], ["goog.asserts", "goog.functions", "goog.object", "ol.MapBrowserEvent", "ol.MapBrowserEvent.EventType", "ol.Pixel", "ol.ViewHint", "ol.interaction.Interaction"]); +goog.addDependency("../src/ol/interaction/touchpaninteraction.js", ["ol.interaction.TouchPan"], ["goog.asserts", "ol.Kinetic", "ol.Pixel", "ol.PreRenderFunction", "ol.View2D", "ol.coordinate", "ol.interaction.Touch"]); +goog.addDependency("../src/ol/interaction/touchrotateinteraction.js", ["ol.interaction.TouchRotate"], ["goog.asserts", "goog.style", "ol.Coordinate", "ol.interaction.Interaction", "ol.interaction.Touch"]); +goog.addDependency("../src/ol/interaction/touchzoominteraction.js", ["ol.interaction.TouchZoom"], ["goog.asserts", "goog.style", "ol.Coordinate", "ol.interaction.Interaction", "ol.interaction.Touch"]); +goog.addDependency("../src/ol/iview.js", ["ol.IView"], ["ol.IView2D", "ol.IView3D"]); +goog.addDependency("../src/ol/iview2d.js", ["ol.IView2D", "ol.View2DState"], ["ol.Coordinate"]); +goog.addDependency("../src/ol/iview3d.js", ["ol.IView3D"], []); +goog.addDependency("../src/ol/kinetic.js", ["ol.Kinetic"], ["ol.Coordinate", "ol.PreRenderFunction", "ol.animation"]); +goog.addDependency("../src/ol/layer/heatmaplayer.js", ["ol.layer.Heatmap"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "ol.Object", "ol.layer.Vector", "ol.render.EventType", "ol.style.Icon", "ol.style.Style"]); +goog.addDependency("../src/ol/layer/imagelayer.js", ["ol.layer.Image"], ["ol.layer.Layer"]); +goog.addDependency("../src/ol/layer/layer.js", ["ol.layer.Layer"], ["goog.asserts", "goog.events", "goog.events.EventType", "goog.object", "ol.layer.Base", "ol.source.Source"]); +goog.addDependency("../src/ol/layer/layerbase.js", ["ol.layer.Base", "ol.layer.LayerProperty", "ol.layer.LayerState"], ["goog.events", "goog.math", "goog.object", "ol.Object", "ol.source.State"]); +goog.addDependency("../src/ol/layer/layergroup.js", ["ol.layer.Group"], ["goog.array", "goog.asserts", "goog.events", "goog.events.EventType", "goog.math", "goog.object", "ol.Collection", "ol.CollectionEvent", "ol.CollectionEventType", "ol.Object", "ol.ObjectEventType", "ol.layer.Base", "ol.source.State"]); +goog.addDependency("../src/ol/layer/tilelayer.js", ["ol.layer.Tile"], ["ol.layer.Layer"]); +goog.addDependency("../src/ol/layer/vectorlayer.js", ["ol.layer.Vector"], ["goog.object", "ol.feature", "ol.layer.Layer"]); +goog.addDependency("../src/ol/map.js", ["ol.Map", "ol.MapProperty", "ol.RendererHint"], ["goog.Uri.QueryData", "goog.array", "goog.asserts", "goog.async.AnimationDelay", "goog.async.nextTick", "goog.debug.Console", "goog.dom", "goog.dom.TagName", "goog.dom.ViewportSizeMonitor", "goog.events", "goog.events.BrowserEvent", "goog.events.Event", "goog.events.EventType", "goog.events.KeyHandler", "goog.events.KeyHandler.EventType", "goog.events.MouseWheelHandler", "goog.events.MouseWheelHandler.EventType", +"goog.log", "goog.log.Level", "goog.object", "goog.style", "goog.vec.Mat4", "ol.BrowserFeature", "ol.Collection", "ol.CollectionEventType", "ol.FrameState", "ol.IView", "ol.MapBrowserEvent", "ol.MapBrowserEvent.EventType", "ol.MapBrowserEventHandler", "ol.MapEvent", "ol.MapEventType", "ol.Object", "ol.ObjectEvent", "ol.ObjectEventType", "ol.Pixel", "ol.PostRenderFunction", "ol.PreRenderFunction", "ol.Size", "ol.Tile", "ol.TileQueue", "ol.View", "ol.View2D", "ol.ViewHint", "ol.control", "ol.extent", +"ol.interaction", "ol.layer.Base", "ol.layer.Group", "ol.proj", "ol.proj.common", "ol.renderer.Map", "ol.renderer.canvas.Map", "ol.renderer.dom.Map", "ol.renderer.webgl.Map", "ol.structs.PriorityQueue", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/mapbrowserevent.js", ["ol.MapBrowserEvent", "ol.MapBrowserEvent.EventType", "ol.MapBrowserEventHandler"], ["goog.array", "goog.asserts", "goog.events", "goog.events.BrowserEvent", "goog.events.EventTarget", "goog.events.EventType", "goog.object", "ol.Coordinate", "ol.FrameState", "ol.MapEvent", "ol.Pixel"]); +goog.addDependency("../src/ol/mapevent.js", ["ol.MapEvent", "ol.MapEventType"], ["goog.events.Event", "ol.FrameState"]); +goog.addDependency("../src/ol/math.js", ["ol.math"], ["goog.asserts"]); +goog.addDependency("../src/ol/object.js", ["ol.Object", "ol.ObjectEvent", "ol.ObjectEventType"], ["goog.array", "goog.events", "goog.events.Event", "goog.functions", "goog.object", "ol.Observable"]); +goog.addDependency("../src/ol/observable.js", ["ol.Observable"], ["goog.events", "goog.events.EventTarget", "goog.events.EventType"]); +goog.addDependency("../src/ol/ol.js", ["ol"], []); +goog.addDependency("../src/ol/overlay.js", ["ol.Overlay", "ol.OverlayPositioning", "ol.OverlayProperty"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.style", "ol.Coordinate", "ol.Map", "ol.MapEventType", "ol.Object"]); +goog.addDependency("../src/ol/parser/ogc/exceptionreportparser.js", ["ol.parser.ogc.ExceptionReport"], ["goog.dom.xml", "ol.parser.XML"]); +goog.addDependency("../src/ol/parser/ogc/versionedparser.js", ["ol.parser.ogc.Versioned"], ["goog.dom.xml", "ol.parser.ogc.ExceptionReport"]); +goog.addDependency("../src/ol/parser/ogc/wmscapabilitiesparser.js", ["ol.parser.ogc.WMSCapabilities"], ["ol.parser.ogc.Versioned", "ol.parser.ogc.WMSCapabilities_v1_0_0", "ol.parser.ogc.WMSCapabilities_v1_1_0", "ol.parser.ogc.WMSCapabilities_v1_1_1", "ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC", "ol.parser.ogc.WMSCapabilities_v1_3_0"]); +goog.addDependency("../src/ol/parser/ogc/wmscapabilitiesparser_v1.js", ["ol.parser.ogc.WMSCapabilities_v1"], ["goog.dom.xml", "goog.object", "ol.parser.XML"]); +goog.addDependency("../src/ol/parser/ogc/wmscapabilitiesparser_v1_0_0.js", ["ol.parser.ogc.WMSCapabilities_v1_0_0"], ["goog.object", "goog.string", "ol.parser.ogc.WMSCapabilities_v1_1_0"]); +goog.addDependency("../src/ol/parser/ogc/wmscapabilitiesparser_v1_1.js", ["ol.parser.ogc.WMSCapabilities_v1_1"], ["goog.object", "ol.parser.ogc.WMSCapabilities_v1"]); +goog.addDependency("../src/ol/parser/ogc/wmscapabilitiesparser_v1_1_0.js", ["ol.parser.ogc.WMSCapabilities_v1_1_0"], ["goog.object", "ol.parser.ogc.WMSCapabilities_v1_1"]); +goog.addDependency("../src/ol/parser/ogc/wmscapabilitiesparser_v1_1_1.js", ["ol.parser.ogc.WMSCapabilities_v1_1_1"], ["goog.object", "ol.parser.ogc.WMSCapabilities_v1_1"]); +goog.addDependency("../src/ol/parser/ogc/wmscapabilitiesparser_v1_1_1_WMSC.js", ["ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC"], ["goog.object", "ol.parser.ogc.WMSCapabilities_v1_1_1"]); +goog.addDependency("../src/ol/parser/ogc/wmscapabilitiesparser_v1_3_0.js", ["ol.parser.ogc.WMSCapabilities_v1_3_0"], ["goog.object", "ol.parser.ogc.WMSCapabilities_v1"]); +goog.addDependency("../src/ol/parser/parser.js", ["ol.parser.Parser"], []); +goog.addDependency("../src/ol/parser/xmlparser.js", ["ol.parser.XML"], ["goog.dom.xml", "ol.parser.Parser"]); +goog.addDependency("../src/ol/pixel.js", ["ol.Pixel"], []); +goog.addDependency("../src/ol/proj/chprojection.js", ["ol.proj.CH", "ol.proj.EPSG2056", "ol.proj.EPSG21781"], ["goog.asserts", "goog.math", "ol.ellipsoid.BESSEL1841", "ol.proj", "ol.proj.EPSG4326", "ol.proj.Projection", "ol.proj.Units"]); +goog.addDependency("../src/ol/proj/common.js", ["ol.proj.common"], ["ol.proj", "ol.proj.EPSG3857", "ol.proj.EPSG4326"]); +goog.addDependency("../src/ol/proj/epsg3857projection.js", ["ol.proj.EPSG3857"], ["goog.array", "goog.asserts", "ol.math", "ol.proj", "ol.proj.Projection", "ol.proj.Units"]); +goog.addDependency("../src/ol/proj/epsg4326projection.js", ["ol.proj.EPSG4326"], ["ol.proj", "ol.proj.Projection", "ol.proj.Units"]); +goog.addDependency("../src/ol/proj/proj.js", ["ol.proj", "ol.proj.METERS_PER_UNIT", "ol.proj.Projection", "ol.proj.ProjectionLike", "ol.proj.Units"], ["goog.array", "goog.asserts", "goog.object", "ol.Extent", "ol.TransformFunction", "ol.sphere.NORMAL"]); +goog.addDependency("../src/ol/render/box.js", ["ol.render.Box"], ["goog.Disposable", "goog.array", "goog.asserts", "goog.events", "ol.geom.Polygon", "ol.render.EventType"]); +goog.addDependency("../src/ol/render/canvas/canvas.js", ["ol.render.canvas"], ["ol.color"]); +goog.addDependency("../src/ol/render/canvas/canvasimmediate.js", ["ol.render.canvas.Immediate"], ["goog.array", "goog.asserts", "goog.object", "goog.vec.Mat4", "ol.BrowserFeature", "ol.color", "ol.extent", "ol.geom.flat", "ol.render.IVectorContext", "ol.render.canvas", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/render/canvas/canvasreplay.js", ["ol.render.canvas.ReplayGroup"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.TagName", "goog.object", "goog.vec.Mat4", "ol.BrowserFeature", "ol.array", "ol.color", "ol.extent", "ol.extent.Relationship", "ol.geom.flat", "ol.geom.simplify", "ol.render.IReplayGroup", "ol.render.IVectorContext", "ol.render.canvas", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/render/ireplay.js", ["ol.render.IReplayGroup"], ["goog.functions", "ol.render.IVectorContext"]); +goog.addDependency("../src/ol/render/ivectorcontext.js", ["ol.render.IVectorContext"], []); +goog.addDependency("../src/ol/render/renderevent.js", ["ol.render.Event", "ol.render.EventType"], ["goog.events.Event", "ol.render.IVectorContext"]); +goog.addDependency("../src/ol/render/vector.js", ["ol.renderer.vector"], ["goog.asserts", "ol.geom.Circle", "ol.geom.GeometryCollection", "ol.geom.LineString", "ol.geom.MultiLineString", "ol.geom.MultiPoint", "ol.geom.MultiPolygon", "ol.geom.Point", "ol.geom.Polygon", "ol.render.IReplayGroup", "ol.style.ImageState", "ol.style.Style"]); +goog.addDependency("../src/ol/render/webgl/webglimmediate.js", ["ol.render.webgl.Immediate"], []); +goog.addDependency("../src/ol/renderer/canvas/canvasimagelayerrenderer.js", ["ol.renderer.canvas.ImageLayer"], ["goog.asserts", "goog.events", "goog.events.EventType", "goog.vec.Mat4", "ol.ImageBase", "ol.ImageState", "ol.ViewHint", "ol.layer.Image", "ol.renderer.Map", "ol.renderer.canvas.Layer", "ol.source.Image", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/renderer/canvas/canvaslayerrenderer.js", ["ol.renderer.canvas.Layer"], ["goog.vec.Mat4", "ol.layer.Layer", "ol.render.Event", "ol.render.EventType", "ol.render.canvas.Immediate", "ol.renderer.Layer", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/renderer/canvas/canvasmaprenderer.js", ["ol.renderer.canvas.Map"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.style", "goog.vec.Mat4", "ol.css", "ol.layer.Image", "ol.layer.Tile", "ol.layer.Vector", "ol.render.Event", "ol.render.EventType", "ol.render.canvas.Immediate", "ol.renderer.Map", "ol.renderer.canvas.ImageLayer", "ol.renderer.canvas.Layer", "ol.renderer.canvas.TileLayer", "ol.renderer.canvas.VectorLayer", "ol.source.State", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/renderer/canvas/canvastilelayerrenderer.js", ["ol.renderer.canvas.TileLayer"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.TagName", "goog.object", "goog.vec.Mat4", "ol.Size", "ol.Tile", "ol.TileCoord", "ol.TileRange", "ol.TileState", "ol.extent", "ol.layer.Tile", "ol.renderer.Map", "ol.renderer.canvas.Layer", "ol.source.Tile", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/renderer/canvas/canvasvectorlayerrenderer.js", ["ol.renderer.canvas.VectorLayer"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.functions", "ol.ViewHint", "ol.extent", "ol.feature", "ol.layer.Vector", "ol.render.EventType", "ol.render.canvas.ReplayGroup", "ol.renderer.canvas.Layer", "ol.renderer.vector", "ol.source.Vector"]); +goog.addDependency("../src/ol/renderer/dom/domimagelayerrenderer.js", ["ol.renderer.dom.ImageLayer"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.EventType", "goog.vec.Mat4", "ol.ImageBase", "ol.ImageState", "ol.ViewHint", "ol.dom", "ol.layer.Image", "ol.renderer.dom.Layer", "ol.source.Image", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/renderer/dom/domlayerrenderer.js", ["ol.renderer.dom.Layer"], ["goog.dom", "ol.layer.Layer", "ol.renderer.Layer"]); +goog.addDependency("../src/ol/renderer/dom/dommaprenderer.js", ["ol.renderer.dom.Map"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.functions", "goog.style", "ol.css", "ol.layer.Image", "ol.layer.Tile", "ol.renderer.Map", "ol.renderer.dom.ImageLayer", "ol.renderer.dom.Layer", "ol.renderer.dom.TileLayer", "ol.source.State"]); +goog.addDependency("../src/ol/renderer/dom/domtilelayerrenderer.js", ["ol.renderer.dom.TileLayer"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.TagName", "goog.object", "goog.style", "goog.vec.Mat4", "ol.Coordinate", "ol.Tile", "ol.TileCoord", "ol.TileRange", "ol.TileState", "ol.ViewHint", "ol.dom", "ol.dom.BrowserFeature", "ol.extent", "ol.layer.Tile", "ol.renderer.dom.Layer", "ol.source.Tile", "ol.tilegrid.TileGrid", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/renderer/layerrenderer.js", ["ol.renderer.Layer"], ["goog.Disposable", "ol.FrameState", "ol.Image", "ol.ImageState", "ol.Tile", "ol.TileRange", "ol.TileState", "ol.layer.Layer", "ol.layer.LayerState", "ol.source.Source", "ol.source.State", "ol.source.Tile"]); +goog.addDependency("../src/ol/renderer/maprenderer.js", ["ol.renderer.Map"], ["goog.Disposable", "goog.asserts", "goog.dispose", "goog.object", "goog.vec.Mat4", "ol.FrameState", "ol.layer.Layer", "ol.renderer.Layer", "ol.style.IconImageCache", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/renderer/webgl/webglimagelayerrenderer.js", ["ol.renderer.webgl.ImageLayer"], ["goog.asserts", "goog.events", "goog.events.EventType", "goog.vec.Mat4", "goog.webgl", "ol.Coordinate", "ol.Extent", "ol.ImageBase", "ol.ImageState", "ol.ViewHint", "ol.layer.Image", "ol.renderer.webgl.Layer", "ol.source.Image"]); +goog.addDependency("../src/ol/renderer/webgl/webgllayerrenderer.js", ["ol.renderer.webgl.Layer"], ["goog.vec.Mat4", "goog.webgl", "ol.FrameState", "ol.color.Matrix", "ol.layer.Layer", "ol.render.Event", "ol.render.EventType", "ol.render.webgl.Immediate", "ol.renderer.Layer", "ol.renderer.webgl.map.shader.Color", "ol.renderer.webgl.map.shader.Default", "ol.structs.Buffer"]); +goog.addDependency("../src/ol/renderer/webgl/webglmapcolorshader.js", ["ol.renderer.webgl.map.shader.Color"], ["ol.webgl.shader"]); +goog.addDependency("../src/ol/renderer/webgl/webglmapdefaultshader.js", ["ol.renderer.webgl.map.shader.Default"], ["ol.webgl.shader"]); +goog.addDependency("../src/ol/renderer/webgl/webglmaprenderer.js", ["ol.renderer.webgl.Map"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.Event", "goog.log", "goog.log.Logger", "goog.object", "goog.style", "goog.webgl", "ol.FrameState", "ol.Tile", "ol.css", "ol.layer.Image", "ol.layer.Tile", "ol.render.Event", "ol.render.EventType", "ol.render.webgl.Immediate", "ol.renderer.Map", "ol.renderer.webgl.ImageLayer", "ol.renderer.webgl.Layer", "ol.renderer.webgl.TileLayer", +"ol.source.State", "ol.structs.LRUCache", "ol.structs.PriorityQueue", "ol.webgl", "ol.webgl.Context", "ol.webgl.WebGLContextEventType"]); +goog.addDependency("../src/ol/renderer/webgl/webgltilelayerrenderer.js", ["ol.renderer.webgl.TileLayer"], ["goog.array", "goog.asserts", "goog.object", "goog.vec.Mat4", "goog.vec.Vec4", "goog.webgl", "ol.Tile", "ol.TileRange", "ol.TileState", "ol.extent", "ol.layer.Tile", "ol.math", "ol.renderer.webgl.Layer", "ol.renderer.webgl.tilelayer.shader", "ol.source.Tile", "ol.structs.Buffer"]); +goog.addDependency("../src/ol/renderer/webgl/webgltilelayershader.js", ["ol.renderer.webgl.tilelayer.shader"], ["ol.webgl.shader"]); +goog.addDependency("../src/ol/resolutionconstraint.js", ["ol.ResolutionConstraint", "ol.ResolutionConstraintType"], ["goog.math", "ol.array"]); +goog.addDependency("../src/ol/rotationconstraint.js", ["ol.RotationConstraint", "ol.RotationConstraintType"], ["goog.math"]); +goog.addDependency("../src/ol/size.js", ["ol.Size", "ol.size"], []); +goog.addDependency("../src/ol/source/bingmapssource.js", ["ol.source.BingMaps"], ["goog.Uri", "goog.array", "goog.asserts", "goog.net.Jsonp", "ol.Attribution", "ol.TileRange", "ol.TileUrlFunction", "ol.extent", "ol.proj", "ol.source.State", "ol.source.TileImage", "ol.tilegrid.XYZ"]); +goog.addDependency("../src/ol/source/debugtilesource.js", ["ol.source.TileDebug"], ["goog.dom", "goog.dom.TagName", "ol.Tile", "ol.TileCache", "ol.TileCoord", "ol.TileState", "ol.source.Tile", "ol.tilegrid.TileGrid"]); +goog.addDependency("../src/ol/source/geojsonsource.js", ["ol.source.GeoJSON"], ["ol.format.GeoJSON", "ol.source.VectorFile"]); +goog.addDependency("../src/ol/source/gpxsource.js", ["ol.source.GPX"], ["ol.format.GPX", "ol.source.VectorFile"]); +goog.addDependency("../src/ol/source/igcsource.js", ["ol.source.IGC"], ["ol.format.IGC", "ol.source.VectorFile"]); +goog.addDependency("../src/ol/source/imagecanvassource.js", ["ol.source.ImageCanvas"], ["ol.CanvasFunctionType", "ol.ImageCanvas", "ol.extent", "ol.source.Image"]); +goog.addDependency("../src/ol/source/imagesource.js", ["ol.source.Image"], ["goog.array", "goog.asserts", "ol.Attribution", "ol.Extent", "ol.Image", "ol.array", "ol.source.Source"]); +goog.addDependency("../src/ol/source/imagestaticsource.js", ["ol.source.ImageStatic"], ["ol.Image", "ol.extent", "ol.proj", "ol.source.Image"]); +goog.addDependency("../src/ol/source/imagevectorsource.js", ["ol.source.ImageVector"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.EventType", "goog.vec.Mat4", "ol.extent", "ol.feature", "ol.render.canvas.ReplayGroup", "ol.renderer.vector", "ol.source.ImageCanvas", "ol.source.Vector", "ol.vec.Mat4"]); +goog.addDependency("../src/ol/source/imagewmssource.js", ["ol.source.ImageWMS"], ["goog.asserts", "goog.object", "goog.string", "goog.uri.utils", "ol.Image", "ol.extent", "ol.proj", "ol.source.Image", "ol.source.wms", "ol.source.wms.ServerType"]); +goog.addDependency("../src/ol/source/kmlsource.js", ["ol.source.KML"], ["ol.format.KML", "ol.source.VectorFile"]); +goog.addDependency("../src/ol/source/mapguidesource.js", ["ol.source.MapGuide"], ["goog.object", "goog.uri.utils", "ol.Image", "ol.ImageUrlFunction", "ol.extent", "ol.source.Image"]); +goog.addDependency("../src/ol/source/mapquestsource.js", ["ol.source.MapQuest"], ["goog.asserts", "ol.Attribution", "ol.source.OSM", "ol.source.XYZ"]); +goog.addDependency("../src/ol/source/osmsource.js", ["ol.source.OSM"], ["ol.Attribution", "ol.source.XYZ"]); +goog.addDependency("../src/ol/source/osmxmlsource.js", ["ol.source.OSMXML"], ["ol.format.OSMXML", "ol.source.VectorFile"]); +goog.addDependency("../src/ol/source/source.js", ["ol.source.Source", "ol.source.State"], ["goog.events.EventType", "ol.Attribution", "ol.Extent", "ol.Observable", "ol.proj"]); +goog.addDependency("../src/ol/source/stamensource.js", ["ol.source.Stamen"], ["goog.asserts", "ol.Attribution", "ol.source.OSM", "ol.source.XYZ"]); +goog.addDependency("../src/ol/source/tileimagesource.js", ["ol.source.TileImage"], ["goog.asserts", "ol.Attribution", "ol.Extent", "ol.ImageTile", "ol.Tile", "ol.TileCache", "ol.TileCoord", "ol.TileLoadFunctionType", "ol.TileState", "ol.TileUrlFunction", "ol.TileUrlFunctionType", "ol.source.Tile", "ol.tilegrid.TileGrid"]); +goog.addDependency("../src/ol/source/tilejsonsource.js", ["ol.source.TileJSON", "ol.tilejson"], ["goog.asserts", "goog.net.jsloader", "ol.Attribution", "ol.TileRange", "ol.TileUrlFunction", "ol.extent", "ol.proj", "ol.source.State", "ol.source.TileImage", "ol.tilegrid.XYZ"]); +goog.addDependency("../src/ol/source/tilesource.js", ["ol.source.Tile", "ol.source.TileOptions"], ["goog.functions", "ol.Attribution", "ol.Extent", "ol.Tile", "ol.TileCoord", "ol.TileRange", "ol.source.Source", "ol.tilegrid.TileGrid"]); +goog.addDependency("../src/ol/source/tilewmssource.js", ["ol.source.TileWMS"], ["goog.array", "goog.asserts", "goog.math", "goog.object", "goog.string", "goog.uri.utils", "ol.TileCoord", "ol.TileUrlFunction", "ol.extent", "ol.source.TileImage", "ol.source.wms", "ol.source.wms.ServerType"]); +goog.addDependency("../src/ol/source/topojsonsource.js", ["ol.source.TopoJSON"], ["ol.format.TopoJSON", "ol.source.VectorFile"]); +goog.addDependency("../src/ol/source/vectorfilesource.js", ["ol.source.VectorFile"], ["goog.asserts", "goog.dispose", "goog.events", "goog.net.EventType", "goog.net.XhrIo", "goog.net.XhrIo.ResponseType", "goog.userAgent", "ol.BrowserFeature", "ol.format.FormatType", "ol.proj", "ol.source.State", "ol.source.Vector", "ol.xml"]); +goog.addDependency("../src/ol/source/vectorsource.js", ["ol.source.Vector", "ol.source.VectorEvent", "ol.source.VectorEventType"], ["goog.array", "goog.asserts", "goog.events", "goog.events.Event", "goog.events.EventType", "goog.object", "ol.source.Source", "ol.structs.RBush"]); +goog.addDependency("../src/ol/source/wmssource.js", ["ol.source.wms", "ol.source.wms.ServerType"], []); +goog.addDependency("../src/ol/source/wmtssource.js", ["ol.source.WMTS", "ol.source.WMTSRequestEncoding"], ["goog.array", "goog.asserts", "goog.math", "goog.object", "goog.uri.utils", "ol.TileCoord", "ol.TileUrlFunction", "ol.TileUrlFunctionType", "ol.extent", "ol.proj", "ol.source.TileImage", "ol.tilegrid.WMTS"]); +goog.addDependency("../src/ol/source/xyzsource.js", ["ol.source.XYZ"], ["ol.Attribution", "ol.TileUrlFunction", "ol.TileUrlFunctionType", "ol.proj", "ol.source.TileImage", "ol.tilegrid.XYZ"]); +goog.addDependency("../src/ol/source/zoomifysource.js", ["ol.source.Zoomify"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.TagName", "ol.ImageTile", "ol.TileCoord", "ol.TileState", "ol.TileUrlFunction", "ol.proj", "ol.source.TileImage", "ol.tilegrid.Zoomify"]); +goog.addDependency("../src/ol/sphere/normal.js", ["ol.sphere.NORMAL"], ["ol.Sphere"]); +goog.addDependency("../src/ol/sphere/sphere.js", ["ol.Sphere"], ["goog.math"]); +goog.addDependency("../src/ol/sphere/wgs84sphere.js", ["ol.sphere.WGS84"], ["ol.Sphere"]); +goog.addDependency("../src/ol/structs/buffer.js", ["ol.structs.Buffer"], ["goog.array", "goog.asserts", "goog.webgl", "ol.structs.IntegerSet"]); +goog.addDependency("../src/ol/structs/integerset.js", ["ol.structs.IntegerSet"], ["goog.asserts"]); +goog.addDependency("../src/ol/structs/lrucache.js", ["ol.structs.LRUCache"], ["goog.asserts", "goog.object"]); +goog.addDependency("../src/ol/structs/priorityqueue.js", ["ol.structs.PriorityQueue"], ["goog.asserts", "goog.object"]); +goog.addDependency("../src/ol/structs/rbush.js", ["ol.structs.RBush"], ["goog.array", "goog.asserts", "goog.object", "ol.extent"]); +goog.addDependency("../src/ol/style/circlestyle.js", ["ol.style.Circle"], ["goog.dom", "goog.dom.TagName", "ol.color", "ol.render.canvas", "ol.style.Fill", "ol.style.Image", "ol.style.ImageState", "ol.style.Stroke"]); +goog.addDependency("../src/ol/style/fillstyle.js", ["ol.style.Fill"], ["ol.color"]); +goog.addDependency("../src/ol/style/iconstyle.js", ["ol.style.Icon", "ol.style.IconAnchorOrigin", "ol.style.IconAnchorUnits", "ol.style.IconImageCache"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.EventTarget", "goog.events.EventType", "ol.style.Image", "ol.style.ImageState"]); +goog.addDependency("../src/ol/style/imagestyle.js", ["ol.style.Image", "ol.style.ImageState"], ["goog.array"]); +goog.addDependency("../src/ol/style/strokestyle.js", ["ol.style.Stroke"], ["ol.color"]); +goog.addDependency("../src/ol/style/style.js", ["ol.style.Style"], ["ol.style.Fill", "ol.style.Image"]); +goog.addDependency("../src/ol/style/textstyle.js", ["ol.style.Text"], []); +goog.addDependency("../src/ol/tile.js", ["ol.Tile", "ol.TileState"], ["goog.events", "goog.events.EventTarget", "goog.events.EventType", "ol.TileCoord"]); +goog.addDependency("../src/ol/tilecache.js", ["ol.TileCache"], ["goog.asserts", "ol.Tile", "ol.TileCoord", "ol.TileRange", "ol.structs.LRUCache"]); +goog.addDependency("../src/ol/tilecoord.js", ["ol.TileCoord"], ["goog.array", "goog.asserts"]); +goog.addDependency("../src/ol/tilegrid/tilegrid.js", ["ol.tilegrid.TileGrid"], ["goog.array", "goog.asserts", "ol.Coordinate", "ol.TileCoord", "ol.TileRange", "ol.array", "ol.extent", "ol.proj.METERS_PER_UNIT", "ol.proj.Projection", "ol.proj.Units"]); +goog.addDependency("../src/ol/tilegrid/wmtstilegrid.js", ["ol.tilegrid.WMTS"], ["goog.array", "goog.asserts", "ol.proj", "ol.tilegrid.TileGrid"]); +goog.addDependency("../src/ol/tilegrid/xyztilegrid.js", ["ol.tilegrid.XYZ"], ["goog.math", "ol.TileCoord", "ol.TileRange", "ol.proj", "ol.proj.EPSG3857", "ol.tilegrid.TileGrid"]); +goog.addDependency("../src/ol/tilegrid/zoomifytilegrid.js", ["ol.tilegrid.Zoomify"], ["goog.math", "ol.TileCoord", "ol.proj", "ol.tilegrid.TileGrid"]); +goog.addDependency("../src/ol/tileloadfunction.js", ["ol.TileLoadFunctionType"], []); +goog.addDependency("../src/ol/tilequeue.js", ["ol.TilePriorityFunction", "ol.TileQueue"], ["goog.events", "goog.events.EventType", "ol.Coordinate", "ol.Tile", "ol.structs.PriorityQueue"]); +goog.addDependency("../src/ol/tilerange.js", ["ol.TileRange"], ["goog.asserts", "ol.Size", "ol.TileCoord"]); +goog.addDependency("../src/ol/tileurlfunction.js", ["ol.TileUrlFunction", "ol.TileUrlFunctionType"], ["goog.array", "goog.math", "ol.TileCoord"]); +goog.addDependency("../src/ol/transformfunction.js", ["ol.TransformFunction"], []); +goog.addDependency("../src/ol/vec/mat4.js", ["ol.vec.Mat4"], ["goog.vec.Mat4"]); +goog.addDependency("../src/ol/view.js", ["ol.View", "ol.ViewHint"], ["goog.array", "goog.asserts", "ol.IView", "ol.Object"]); +goog.addDependency("../src/ol/view2d.js", ["ol.View2D", "ol.View2DProperty"], ["goog.asserts", "ol.CenterConstraint", "ol.Constraints", "ol.IView2D", "ol.IView3D", "ol.ResolutionConstraint", "ol.RotationConstraint", "ol.RotationConstraintType", "ol.Size", "ol.View", "ol.coordinate", "ol.extent", "ol.proj", "ol.proj.METERS_PER_UNIT", "ol.proj.Projection", "ol.proj.Units"]); +goog.addDependency("../src/ol/webgl/context.js", ["ol.webgl.Context"], ["goog.asserts", "goog.events", "goog.log", "goog.object", "ol.structs.Buffer", "ol.structs.IntegerSet", "ol.webgl.WebGLContextEventType"]); +goog.addDependency("../src/ol/webgl/shader.js", ["ol.webgl.shader"], ["goog.functions", "goog.webgl", "ol.webgl"]); +goog.addDependency("../src/ol/webgl/webgl.js", ["ol.webgl", "ol.webgl.WebGLContextEventType"], []); +goog.addDependency("../src/ol/xml.js", ["ol.xml"], ["goog.array", "goog.asserts", "goog.dom.NodeType", "goog.dom.xml", "goog.object", "goog.userAgent"]); +goog.addDependency("/closure/goog/a11y/aria/announcer.js", ["goog.a11y.aria.Announcer"], ["goog.Disposable", "goog.a11y.aria", "goog.a11y.aria.LivePriority", "goog.a11y.aria.State", "goog.dom", "goog.object"]); +goog.addDependency("/closure/goog/a11y/aria/aria.js", ["goog.a11y.aria"], ["goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.a11y.aria.datatables", "goog.array", "goog.asserts", "goog.dom", "goog.dom.TagName", "goog.object", "goog.string"]); +goog.addDependency("/closure/goog/a11y/aria/attributes.js", ["goog.a11y.aria.AutoCompleteValues", "goog.a11y.aria.CheckedValues", "goog.a11y.aria.DropEffectValues", "goog.a11y.aria.ExpandedValues", "goog.a11y.aria.GrabbedValues", "goog.a11y.aria.InvalidValues", "goog.a11y.aria.LivePriority", "goog.a11y.aria.OrientationValues", "goog.a11y.aria.PressedValues", "goog.a11y.aria.RelevantValues", "goog.a11y.aria.SelectedValues", "goog.a11y.aria.SortValues", "goog.a11y.aria.State"], []); +goog.addDependency("/closure/goog/a11y/aria/datatables.js", ["goog.a11y.aria.datatables"], ["goog.a11y.aria.State", "goog.object"]); +goog.addDependency("/closure/goog/a11y/aria/roles.js", ["goog.a11y.aria.Role"], []); +goog.addDependency("/closure/goog/array/array.js", ["goog.array", "goog.array.ArrayLike"], ["goog.asserts"]); +goog.addDependency("/closure/goog/asserts/asserts.js", ["goog.asserts", "goog.asserts.AssertionError"], ["goog.debug.Error", "goog.string"]); +goog.addDependency("/closure/goog/async/animationdelay.js", ["goog.async.AnimationDelay"], ["goog.Disposable", "goog.events", "goog.functions"]); +goog.addDependency("/closure/goog/async/conditionaldelay.js", ["goog.async.ConditionalDelay"], ["goog.Disposable", "goog.async.Delay"]); +goog.addDependency("/closure/goog/async/delay.js", ["goog.Delay", "goog.async.Delay"], ["goog.Disposable", "goog.Timer"]); +goog.addDependency("/closure/goog/async/nexttick.js", ["goog.async.nextTick"], ["goog.debug.entryPointRegistry", "goog.functions"]); +goog.addDependency("/closure/goog/async/throttle.js", ["goog.Throttle", "goog.async.Throttle"], ["goog.Disposable", "goog.Timer"]); +goog.addDependency("/closure/goog/base.js", [], []); +goog.addDependency("/closure/goog/bootstrap/nodejs.js", [], []); +goog.addDependency("/closure/goog/bootstrap/webworkers.js", [], []); +goog.addDependency("/closure/goog/color/alpha.js", ["goog.color.alpha"], ["goog.color"]); +goog.addDependency("/closure/goog/color/color.js", ["goog.color"], ["goog.color.names", "goog.math"]); +goog.addDependency("/closure/goog/color/names.js", ["goog.color.names"], []); +goog.addDependency("/closure/goog/crypt/aes.js", ["goog.crypt.Aes"], ["goog.asserts", "goog.crypt.BlockCipher"]); +goog.addDependency("/closure/goog/crypt/arc4.js", ["goog.crypt.Arc4"], ["goog.asserts"]); +goog.addDependency("/closure/goog/crypt/base64.js", ["goog.crypt.base64"], ["goog.crypt", "goog.userAgent"]); +goog.addDependency("/closure/goog/crypt/basen.js", ["goog.crypt.baseN"], []); +goog.addDependency("/closure/goog/crypt/blobhasher.js", ["goog.crypt.BlobHasher", "goog.crypt.BlobHasher.EventType"], ["goog.asserts", "goog.crypt", "goog.crypt.Hash", "goog.events.EventTarget", "goog.fs", "goog.log"]); +goog.addDependency("/closure/goog/crypt/blockcipher.js", ["goog.crypt.BlockCipher"], []); +goog.addDependency("/closure/goog/crypt/cbc.js", ["goog.crypt.Cbc"], ["goog.array", "goog.crypt"]); +goog.addDependency("/closure/goog/crypt/cbc_test.js", ["goog.crypt.CbcTest"], ["goog.crypt", "goog.crypt.Aes", "goog.crypt.Cbc", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/crypt/crypt.js", ["goog.crypt"], ["goog.array"]); +goog.addDependency("/closure/goog/crypt/hash.js", ["goog.crypt.Hash"], []); +goog.addDependency("/closure/goog/crypt/hash32.js", ["goog.crypt.hash32"], ["goog.crypt"]); +goog.addDependency("/closure/goog/crypt/hashtester.js", ["goog.crypt.hashTester"], ["goog.array", "goog.crypt", "goog.testing.PerformanceTable", "goog.testing.PseudoRandom", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/crypt/hmac.js", ["goog.crypt.Hmac"], ["goog.asserts", "goog.crypt.Hash"]); +goog.addDependency("/closure/goog/crypt/md5.js", ["goog.crypt.Md5"], ["goog.crypt.Hash"]); +goog.addDependency("/closure/goog/crypt/pbkdf2.js", ["goog.crypt.pbkdf2"], ["goog.asserts", "goog.crypt", "goog.crypt.Hmac", "goog.crypt.Sha1"]); +goog.addDependency("/closure/goog/crypt/sha1.js", ["goog.crypt.Sha1"], ["goog.crypt.Hash"]); +goog.addDependency("/closure/goog/crypt/sha2.js", ["goog.crypt.Sha2"], ["goog.array", "goog.asserts", "goog.crypt.Hash"]); +goog.addDependency("/closure/goog/crypt/sha224.js", ["goog.crypt.Sha224"], ["goog.crypt.Sha2"]); +goog.addDependency("/closure/goog/crypt/sha256.js", ["goog.crypt.Sha256"], ["goog.crypt.Sha2"]); +goog.addDependency("/closure/goog/cssom/cssom.js", ["goog.cssom", "goog.cssom.CssRuleType"], ["goog.array", "goog.dom"]); +goog.addDependency("/closure/goog/cssom/iframe/style.js", ["goog.cssom.iframe.style"], ["goog.cssom", "goog.dom", "goog.dom.NodeType", "goog.dom.TagName", "goog.dom.classes", "goog.string", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/datasource/datamanager.js", ["goog.ds.DataManager"], ["goog.ds.BasicNodeList", "goog.ds.DataNode", "goog.ds.Expr", "goog.string", "goog.structs", "goog.structs.Map"]); +goog.addDependency("/closure/goog/datasource/datasource.js", ["goog.ds.BaseDataNode", "goog.ds.BasicNodeList", "goog.ds.DataNode", "goog.ds.DataNodeList", "goog.ds.EmptyNodeList", "goog.ds.LoadState", "goog.ds.SortedNodeList", "goog.ds.Util", "goog.ds.logger"], ["goog.array", "goog.log"]); +goog.addDependency("/closure/goog/datasource/expr.js", ["goog.ds.Expr"], ["goog.ds.BasicNodeList", "goog.ds.EmptyNodeList", "goog.string"]); +goog.addDependency("/closure/goog/datasource/fastdatanode.js", ["goog.ds.AbstractFastDataNode", "goog.ds.FastDataNode", "goog.ds.FastListNode", "goog.ds.PrimitiveFastDataNode"], ["goog.ds.DataManager", "goog.ds.EmptyNodeList", "goog.string"]); +goog.addDependency("/closure/goog/datasource/jsdatasource.js", ["goog.ds.JsDataSource", "goog.ds.JsPropertyDataSource"], ["goog.ds.BaseDataNode", "goog.ds.BasicNodeList", "goog.ds.DataManager", "goog.ds.EmptyNodeList", "goog.ds.LoadState"]); +goog.addDependency("/closure/goog/datasource/jsondatasource.js", ["goog.ds.JsonDataSource"], ["goog.Uri", "goog.dom", "goog.ds.DataManager", "goog.ds.JsDataSource", "goog.ds.LoadState", "goog.ds.logger"]); +goog.addDependency("/closure/goog/datasource/jsxmlhttpdatasource.js", ["goog.ds.JsXmlHttpDataSource"], ["goog.Uri", "goog.ds.DataManager", "goog.ds.FastDataNode", "goog.ds.LoadState", "goog.ds.logger", "goog.events", "goog.log", "goog.net.EventType", "goog.net.XhrIo"]); +goog.addDependency("/closure/goog/datasource/xmldatasource.js", ["goog.ds.XmlDataSource", "goog.ds.XmlHttpDataSource"], ["goog.Uri", "goog.dom.NodeType", "goog.dom.xml", "goog.ds.BasicNodeList", "goog.ds.DataManager", "goog.ds.LoadState", "goog.ds.logger", "goog.net.XhrIo", "goog.string"]); +goog.addDependency("/closure/goog/date/date.js", ["goog.date", "goog.date.Date", "goog.date.DateTime", "goog.date.Interval", "goog.date.month", "goog.date.weekDay"], ["goog.asserts", "goog.date.DateLike", "goog.i18n.DateTimeSymbols", "goog.string"]); +goog.addDependency("/closure/goog/date/datelike.js", ["goog.date.DateLike"], []); +goog.addDependency("/closure/goog/date/daterange.js", ["goog.date.DateRange", "goog.date.DateRange.Iterator", "goog.date.DateRange.StandardDateRangeKeys"], ["goog.date.Date", "goog.date.Interval", "goog.iter.Iterator", "goog.iter.StopIteration"]); +goog.addDependency("/closure/goog/date/relative.js", ["goog.date.relative"], ["goog.i18n.DateTimeFormat"]); +goog.addDependency("/closure/goog/date/utcdatetime.js", ["goog.date.UtcDateTime"], ["goog.date", "goog.date.Date", "goog.date.DateTime", "goog.date.Interval"]); +goog.addDependency("/closure/goog/db/cursor.js", ["goog.db.Cursor"], ["goog.async.Deferred", "goog.db.Error", "goog.debug", "goog.events.EventTarget"]); +goog.addDependency("/closure/goog/db/db.js", ["goog.db"], ["goog.async.Deferred", "goog.db.Error", "goog.db.IndexedDb", "goog.db.Transaction"]); +goog.addDependency("/closure/goog/db/error.js", ["goog.db.Error", "goog.db.Error.ErrorCode", "goog.db.Error.ErrorName", "goog.db.Error.VersionChangeBlockedError"], ["goog.debug.Error"]); +goog.addDependency("/closure/goog/db/index.js", ["goog.db.Index"], ["goog.async.Deferred", "goog.db.Cursor", "goog.db.Error", "goog.debug"]); +goog.addDependency("/closure/goog/db/indexeddb.js", ["goog.db.IndexedDb"], ["goog.async.Deferred", "goog.db.Error", "goog.db.Error.VersionChangeBlockedError", "goog.db.ObjectStore", "goog.db.Transaction", "goog.db.Transaction.TransactionMode", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventTarget"]); +goog.addDependency("/closure/goog/db/keyrange.js", ["goog.db.KeyRange"], []); +goog.addDependency("/closure/goog/db/objectstore.js", ["goog.db.ObjectStore"], ["goog.async.Deferred", "goog.db.Cursor", "goog.db.Error", "goog.db.Index", "goog.debug", "goog.events"]); +goog.addDependency("/closure/goog/db/transaction.js", ["goog.db.Transaction", "goog.db.Transaction.TransactionMode"], ["goog.async.Deferred", "goog.db.Error", "goog.db.ObjectStore", "goog.events.EventHandler", "goog.events.EventTarget"]); +goog.addDependency("/closure/goog/debug/console.js", ["goog.debug.Console"], ["goog.debug.LogManager", "goog.debug.Logger.Level", "goog.debug.TextFormatter"]); +goog.addDependency("/closure/goog/debug/debug.js", ["goog.debug"], ["goog.array", "goog.string", "goog.structs.Set", "goog.userAgent"]); +goog.addDependency("/closure/goog/debug/debugwindow.js", ["goog.debug.DebugWindow"], ["goog.debug.HtmlFormatter", "goog.debug.LogManager", "goog.debug.Logger", "goog.structs.CircularBuffer", "goog.userAgent"]); +goog.addDependency("/closure/goog/debug/devcss/devcss.js", ["goog.debug.DevCss", "goog.debug.DevCss.UserAgent"], ["goog.cssom", "goog.dom.classes", "goog.events", "goog.events.EventType", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/debug/devcss/devcssrunner.js", ["goog.debug.devCssRunner"], ["goog.debug.DevCss"]); +goog.addDependency("/closure/goog/debug/divconsole.js", ["goog.debug.DivConsole"], ["goog.debug.HtmlFormatter", "goog.debug.LogManager", "goog.style"]); +goog.addDependency("/closure/goog/debug/entrypointregistry.js", ["goog.debug.EntryPointMonitor", "goog.debug.entryPointRegistry"], ["goog.asserts"]); +goog.addDependency("/closure/goog/debug/error.js", ["goog.debug.Error"], []); +goog.addDependency("/closure/goog/debug/errorhandler.js", ["goog.debug.ErrorHandler", "goog.debug.ErrorHandler.ProtectedFunctionError"], ["goog.asserts", "goog.debug", "goog.debug.EntryPointMonitor", "goog.debug.Trace"]); +goog.addDependency("/closure/goog/debug/errorhandlerweakdep.js", ["goog.debug.errorHandlerWeakDep"], []); +goog.addDependency("/closure/goog/debug/errorreporter.js", ["goog.debug.ErrorReporter", "goog.debug.ErrorReporter.ExceptionEvent"], ["goog.asserts", "goog.debug", "goog.debug.ErrorHandler", "goog.debug.entryPointRegistry", "goog.events", "goog.events.Event", "goog.events.EventTarget", "goog.log", "goog.net.XhrIo", "goog.object", "goog.string", "goog.uri.utils", "goog.userAgent"]); +goog.addDependency("/closure/goog/debug/fancywindow.js", ["goog.debug.FancyWindow"], ["goog.debug.DebugWindow", "goog.debug.LogManager", "goog.debug.Logger", "goog.dom.DomHelper", "goog.object", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/debug/formatter.js", ["goog.debug.Formatter", "goog.debug.HtmlFormatter", "goog.debug.TextFormatter"], ["goog.debug.RelativeTimeProvider", "goog.string"]); +goog.addDependency("/closure/goog/debug/fpsdisplay.js", ["goog.debug.FpsDisplay"], ["goog.asserts", "goog.async.AnimationDelay", "goog.ui.Component"]); +goog.addDependency("/closure/goog/debug/gcdiagnostics.js", ["goog.debug.GcDiagnostics"], ["goog.debug.Trace", "goog.log", "goog.userAgent"]); +goog.addDependency("/closure/goog/debug/logbuffer.js", ["goog.debug.LogBuffer"], ["goog.asserts", "goog.debug.LogRecord"]); +goog.addDependency("/closure/goog/debug/logger.js", ["goog.debug.LogManager", "goog.debug.Logger", "goog.debug.Logger.Level"], ["goog.array", "goog.asserts", "goog.debug", "goog.debug.LogBuffer", "goog.debug.LogRecord"]); +goog.addDependency("/closure/goog/debug/logrecord.js", ["goog.debug.LogRecord"], []); +goog.addDependency("/closure/goog/debug/logrecordserializer.js", ["goog.debug.logRecordSerializer"], ["goog.debug.LogRecord", "goog.debug.Logger.Level", "goog.json", "goog.object"]); +goog.addDependency("/closure/goog/debug/reflect.js", ["goog.debug.reflect"], []); +goog.addDependency("/closure/goog/debug/relativetimeprovider.js", ["goog.debug.RelativeTimeProvider"], []); +goog.addDependency("/closure/goog/debug/tracer.js", ["goog.debug.Trace"], ["goog.array", "goog.iter", "goog.log", "goog.structs.Map", "goog.structs.SimplePool"]); +goog.addDependency("/closure/goog/demos/autocompleteremotedata.js", [], []); +goog.addDependency("/closure/goog/demos/autocompleterichremotedata.js", [], []); +goog.addDependency("/closure/goog/demos/editor/equationeditor.js", ["goog.demos.editor.EquationEditor"], ["goog.ui.equation.EquationEditorDialog"]); +goog.addDependency("/closure/goog/demos/editor/helloworld.js", ["goog.demos.editor.HelloWorld"], ["goog.dom", "goog.dom.TagName", "goog.editor.Plugin"]); +goog.addDependency("/closure/goog/demos/editor/helloworlddialog.js", ["goog.demos.editor.HelloWorldDialog", "goog.demos.editor.HelloWorldDialog.OkEvent"], ["goog.dom.TagName", "goog.events.Event", "goog.string", "goog.ui.editor.AbstractDialog"]); +goog.addDependency("/closure/goog/demos/editor/helloworlddialogplugin.js", ["goog.demos.editor.HelloWorldDialogPlugin", "goog.demos.editor.HelloWorldDialogPlugin.Command"], ["goog.demos.editor.HelloWorldDialog", "goog.dom.TagName", "goog.editor.plugins.AbstractDialogPlugin", "goog.editor.range", "goog.functions", "goog.ui.editor.AbstractDialog"]); +goog.addDependency("/closure/goog/demos/graphics/tigerdata.js", [], []); +goog.addDependency("/closure/goog/demos/samplecomponent.js", ["goog.demos.SampleComponent"], ["goog.dom", "goog.dom.classes", "goog.events.EventType", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.ui.Component"]); +goog.addDependency("/closure/goog/demos/tree/testdata.js", [], []); +goog.addDependency("/closure/goog/demos/xpc/xpcdemo.js", [], ["goog.Uri", "goog.dom", "goog.events", "goog.events.EventType", "goog.json", "goog.log", "goog.net.xpc.CfgFields", "goog.net.xpc.CrossPageChannel"]); +goog.addDependency("/closure/goog/disposable/disposable.js", ["goog.Disposable", "goog.dispose"], ["goog.disposable.IDisposable"]); +goog.addDependency("/closure/goog/disposable/idisposable.js", ["goog.disposable.IDisposable"], []); +goog.addDependency("/closure/goog/dom/a11y.js", ["goog.dom.a11y", "goog.dom.a11y.Announcer", "goog.dom.a11y.LivePriority", "goog.dom.a11y.Role", "goog.dom.a11y.State"], ["goog.a11y.aria", "goog.a11y.aria.Announcer", "goog.a11y.aria.LivePriority", "goog.a11y.aria.Role", "goog.a11y.aria.State"]); +goog.addDependency("/closure/goog/dom/abstractmultirange.js", ["goog.dom.AbstractMultiRange"], ["goog.array", "goog.dom", "goog.dom.AbstractRange"]); +goog.addDependency("/closure/goog/dom/abstractrange.js", ["goog.dom.AbstractRange", "goog.dom.RangeIterator", "goog.dom.RangeType"], ["goog.dom", "goog.dom.NodeType", "goog.dom.SavedCaretRange", "goog.dom.TagIterator", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/annotate.js", ["goog.dom.annotate"], ["goog.array", "goog.dom", "goog.dom.NodeType", "goog.string"]); +goog.addDependency("/closure/goog/dom/browserfeature.js", ["goog.dom.BrowserFeature"], ["goog.userAgent"]); +goog.addDependency("/closure/goog/dom/browserrange/abstractrange.js", ["goog.dom.browserrange.AbstractRange"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.NodeType", "goog.dom.RangeEndpoint", "goog.dom.TagName", "goog.dom.TextRangeIterator", "goog.iter", "goog.math.Coordinate", "goog.string", "goog.string.StringBuffer", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/browserrange/browserrange.js", ["goog.dom.browserrange", "goog.dom.browserrange.Error"], ["goog.dom", "goog.dom.NodeType", "goog.dom.browserrange.GeckoRange", "goog.dom.browserrange.IeRange", "goog.dom.browserrange.OperaRange", "goog.dom.browserrange.W3cRange", "goog.dom.browserrange.WebKitRange", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/browserrange/geckorange.js", ["goog.dom.browserrange.GeckoRange"], ["goog.dom.browserrange.W3cRange"]); +goog.addDependency("/closure/goog/dom/browserrange/ierange.js", ["goog.dom.browserrange.IeRange"], ["goog.array", "goog.dom", "goog.dom.NodeType", "goog.dom.RangeEndpoint", "goog.dom.TagName", "goog.dom.browserrange.AbstractRange", "goog.log", "goog.string"]); +goog.addDependency("/closure/goog/dom/browserrange/operarange.js", ["goog.dom.browserrange.OperaRange"], ["goog.dom.browserrange.W3cRange"]); +goog.addDependency("/closure/goog/dom/browserrange/w3crange.js", ["goog.dom.browserrange.W3cRange"], ["goog.dom", "goog.dom.NodeType", "goog.dom.RangeEndpoint", "goog.dom.browserrange.AbstractRange", "goog.string"]); +goog.addDependency("/closure/goog/dom/browserrange/webkitrange.js", ["goog.dom.browserrange.WebKitRange"], ["goog.dom.RangeEndpoint", "goog.dom.browserrange.W3cRange", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/bufferedviewportsizemonitor.js", ["goog.dom.BufferedViewportSizeMonitor"], ["goog.asserts", "goog.async.Delay", "goog.events", "goog.events.EventTarget", "goog.events.EventType"]); +goog.addDependency("/closure/goog/dom/bufferedviewportsizemonitor_test.js", ["goog.dom.BufferedViewportSizeMonitorTest"], ["goog.dom.BufferedViewportSizeMonitor", "goog.dom.ViewportSizeMonitor", "goog.events", "goog.events.EventType", "goog.math.Size", "goog.testing.MockClock", "goog.testing.events", "goog.testing.events.Event", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/dom/classes.js", ["goog.dom.classes"], ["goog.array"]); +goog.addDependency("/closure/goog/dom/classes_test.js", ["goog.dom.classes_test"], ["goog.dom", "goog.dom.classes", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/dom/classlist.js", ["goog.dom.classlist"], ["goog.array", "goog.asserts"]); +goog.addDependency("/closure/goog/dom/classlist_test.js", ["goog.dom.classlist_test"], ["goog.dom", "goog.dom.classlist", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/dom/controlrange.js", ["goog.dom.ControlRange", "goog.dom.ControlRangeIterator"], ["goog.array", "goog.dom", "goog.dom.AbstractMultiRange", "goog.dom.AbstractRange", "goog.dom.RangeIterator", "goog.dom.RangeType", "goog.dom.SavedRange", "goog.dom.TagWalkType", "goog.dom.TextRange", "goog.iter.StopIteration", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/dataset.js", ["goog.dom.dataset"], ["goog.string"]); +goog.addDependency("/closure/goog/dom/dom.js", ["goog.dom", "goog.dom.Appendable", "goog.dom.DomHelper", "goog.dom.NodeType"], ["goog.array", "goog.dom.BrowserFeature", "goog.dom.TagName", "goog.dom.classes", "goog.math.Coordinate", "goog.math.Size", "goog.object", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/dom_test.js", ["goog.dom.dom_test"], ["goog.dom", "goog.dom.BrowserFeature", "goog.dom.DomHelper", "goog.dom.NodeType", "goog.dom.TagName", "goog.object", "goog.string.Unicode", "goog.testing.asserts", "goog.userAgent", "goog.userAgent.product", "goog.userAgent.product.isVersion"]); +goog.addDependency("/closure/goog/dom/fontsizemonitor.js", ["goog.dom.FontSizeMonitor", "goog.dom.FontSizeMonitor.EventType"], ["goog.dom", "goog.events", "goog.events.EventTarget", "goog.events.EventType", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/forms.js", ["goog.dom.forms"], ["goog.structs.Map"]); +goog.addDependency("/closure/goog/dom/fullscreen.js", ["goog.dom.fullscreen", "goog.dom.fullscreen.EventType"], ["goog.dom", "goog.userAgent", "goog.userAgent.product"]); +goog.addDependency("/closure/goog/dom/iframe.js", ["goog.dom.iframe"], ["goog.dom", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/iter.js", ["goog.dom.iter.AncestorIterator", "goog.dom.iter.ChildIterator", "goog.dom.iter.SiblingIterator"], ["goog.iter.Iterator", "goog.iter.StopIteration"]); +goog.addDependency("/closure/goog/dom/multirange.js", ["goog.dom.MultiRange", "goog.dom.MultiRangeIterator"], ["goog.array", "goog.dom.AbstractMultiRange", "goog.dom.AbstractRange", "goog.dom.RangeIterator", "goog.dom.RangeType", "goog.dom.SavedRange", "goog.dom.TextRange", "goog.iter.StopIteration", "goog.log"]); +goog.addDependency("/closure/goog/dom/nodeiterator.js", ["goog.dom.NodeIterator"], ["goog.dom.TagIterator"]); +goog.addDependency("/closure/goog/dom/nodeoffset.js", ["goog.dom.NodeOffset"], ["goog.Disposable", "goog.dom.TagName"]); +goog.addDependency("/closure/goog/dom/pattern/abstractpattern.js", ["goog.dom.pattern.AbstractPattern"], ["goog.dom.pattern.MatchType"]); +goog.addDependency("/closure/goog/dom/pattern/allchildren.js", ["goog.dom.pattern.AllChildren"], ["goog.dom.pattern.AbstractPattern", "goog.dom.pattern.MatchType"]); +goog.addDependency("/closure/goog/dom/pattern/callback/callback.js", ["goog.dom.pattern.callback"], ["goog.dom", "goog.dom.TagWalkType", "goog.iter"]); +goog.addDependency("/closure/goog/dom/pattern/callback/counter.js", ["goog.dom.pattern.callback.Counter"], []); +goog.addDependency("/closure/goog/dom/pattern/callback/test.js", ["goog.dom.pattern.callback.Test"], ["goog.iter.StopIteration"]); +goog.addDependency("/closure/goog/dom/pattern/childmatches.js", ["goog.dom.pattern.ChildMatches"], ["goog.dom.pattern.AllChildren", "goog.dom.pattern.MatchType"]); +goog.addDependency("/closure/goog/dom/pattern/endtag.js", ["goog.dom.pattern.EndTag"], ["goog.dom.TagWalkType", "goog.dom.pattern.Tag"]); +goog.addDependency("/closure/goog/dom/pattern/fulltag.js", ["goog.dom.pattern.FullTag"], ["goog.dom.pattern.MatchType", "goog.dom.pattern.StartTag", "goog.dom.pattern.Tag"]); +goog.addDependency("/closure/goog/dom/pattern/matcher.js", ["goog.dom.pattern.Matcher"], ["goog.dom.TagIterator", "goog.dom.pattern.MatchType", "goog.iter"]); +goog.addDependency("/closure/goog/dom/pattern/nodetype.js", ["goog.dom.pattern.NodeType"], ["goog.dom.pattern.AbstractPattern", "goog.dom.pattern.MatchType"]); +goog.addDependency("/closure/goog/dom/pattern/pattern.js", ["goog.dom.pattern", "goog.dom.pattern.MatchType"], []); +goog.addDependency("/closure/goog/dom/pattern/repeat.js", ["goog.dom.pattern.Repeat"], ["goog.dom.NodeType", "goog.dom.pattern.AbstractPattern", "goog.dom.pattern.MatchType"]); +goog.addDependency("/closure/goog/dom/pattern/sequence.js", ["goog.dom.pattern.Sequence"], ["goog.dom.NodeType", "goog.dom.pattern.AbstractPattern", "goog.dom.pattern.MatchType"]); +goog.addDependency("/closure/goog/dom/pattern/starttag.js", ["goog.dom.pattern.StartTag"], ["goog.dom.TagWalkType", "goog.dom.pattern.Tag"]); +goog.addDependency("/closure/goog/dom/pattern/tag.js", ["goog.dom.pattern.Tag"], ["goog.dom.pattern", "goog.dom.pattern.AbstractPattern", "goog.dom.pattern.MatchType", "goog.object"]); +goog.addDependency("/closure/goog/dom/pattern/text.js", ["goog.dom.pattern.Text"], ["goog.dom.NodeType", "goog.dom.pattern", "goog.dom.pattern.AbstractPattern", "goog.dom.pattern.MatchType"]); +goog.addDependency("/closure/goog/dom/range.js", ["goog.dom.Range"], ["goog.dom", "goog.dom.AbstractRange", "goog.dom.ControlRange", "goog.dom.MultiRange", "goog.dom.NodeType", "goog.dom.TextRange", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/rangeendpoint.js", ["goog.dom.RangeEndpoint"], []); +goog.addDependency("/closure/goog/dom/savedcaretrange.js", ["goog.dom.SavedCaretRange"], ["goog.array", "goog.dom", "goog.dom.SavedRange", "goog.dom.TagName", "goog.string"]); +goog.addDependency("/closure/goog/dom/savedrange.js", ["goog.dom.SavedRange"], ["goog.Disposable", "goog.log"]); +goog.addDependency("/closure/goog/dom/selection.js", ["goog.dom.selection"], ["goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/tagiterator.js", ["goog.dom.TagIterator", "goog.dom.TagWalkType"], ["goog.dom.NodeType", "goog.iter.Iterator", "goog.iter.StopIteration"]); +goog.addDependency("/closure/goog/dom/tagname.js", ["goog.dom.TagName"], []); +goog.addDependency("/closure/goog/dom/textrange.js", ["goog.dom.TextRange"], ["goog.array", "goog.dom", "goog.dom.AbstractRange", "goog.dom.RangeType", "goog.dom.SavedRange", "goog.dom.TagName", "goog.dom.TextRangeIterator", "goog.dom.browserrange", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/dom/textrangeiterator.js", ["goog.dom.TextRangeIterator"], ["goog.array", "goog.dom.NodeType", "goog.dom.RangeIterator", "goog.dom.TagName", "goog.iter.StopIteration"]); +goog.addDependency("/closure/goog/dom/vendor.js", ["goog.dom.vendor"], ["goog.userAgent"]); +goog.addDependency("/closure/goog/dom/viewportsizemonitor.js", ["goog.dom.ViewportSizeMonitor"], ["goog.dom", "goog.events", "goog.events.EventTarget", "goog.events.EventType", "goog.math.Size"]); +goog.addDependency("/closure/goog/dom/xml.js", ["goog.dom.xml"], ["goog.dom", "goog.dom.NodeType"]); +goog.addDependency("/closure/goog/editor/browserfeature.js", ["goog.editor.BrowserFeature"], ["goog.editor.defines", "goog.userAgent", "goog.userAgent.product", "goog.userAgent.product.isVersion"]); +goog.addDependency("/closure/goog/editor/clicktoeditwrapper.js", ["goog.editor.ClickToEditWrapper"], ["goog.Disposable", "goog.asserts", "goog.dom", "goog.dom.Range", "goog.dom.TagName", "goog.editor.BrowserFeature", "goog.editor.Command", "goog.editor.Field.EventType", "goog.editor.range", "goog.events.BrowserEvent.MouseButton", "goog.events.EventHandler", "goog.events.EventType", "goog.log"]); +goog.addDependency("/closure/goog/editor/command.js", ["goog.editor.Command"], []); +goog.addDependency("/closure/goog/editor/contenteditablefield.js", ["goog.editor.ContentEditableField"], ["goog.asserts", "goog.editor.Field", "goog.log"]); +goog.addDependency("/closure/goog/editor/defines.js", ["goog.editor.defines"], []); +goog.addDependency("/closure/goog/editor/field.js", ["goog.editor.Field", "goog.editor.Field.EventType"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.array", "goog.asserts", "goog.async.Delay", "goog.dom", "goog.dom.Range", "goog.dom.TagName", "goog.editor.BrowserFeature", "goog.editor.Command", "goog.editor.Plugin", "goog.editor.icontent", "goog.editor.icontent.FieldFormatInfo", "goog.editor.icontent.FieldStyleInfo", "goog.editor.node", "goog.editor.range", "goog.events", "goog.events.EventHandler", +"goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.functions", "goog.log", "goog.string", "goog.string.Unicode", "goog.style", "goog.userAgent", "goog.userAgent.product"]); +goog.addDependency("/closure/goog/editor/field_test.js", ["goog.editor.field_test"], ["goog.dom", "goog.dom.Range", "goog.editor.BrowserFeature", "goog.editor.Field", "goog.editor.Plugin", "goog.editor.range", "goog.events", "goog.events.BrowserEvent", "goog.events.KeyCodes", "goog.functions", "goog.testing.LooseMock", "goog.testing.MockClock", "goog.testing.dom", "goog.testing.events", "goog.testing.events.Event", "goog.testing.recordFunction", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/focus.js", ["goog.editor.focus"], ["goog.dom.selection"]); +goog.addDependency("/closure/goog/editor/icontent.js", ["goog.editor.icontent", "goog.editor.icontent.FieldFormatInfo", "goog.editor.icontent.FieldStyleInfo"], ["goog.editor.BrowserFeature", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/link.js", ["goog.editor.Link"], ["goog.array", "goog.dom", "goog.dom.NodeType", "goog.dom.Range", "goog.editor.BrowserFeature", "goog.editor.Command", "goog.editor.node", "goog.editor.range", "goog.string", "goog.string.Unicode", "goog.uri.utils", "goog.uri.utils.ComponentIndex"]); +goog.addDependency("/closure/goog/editor/node.js", ["goog.editor.node"], ["goog.dom", "goog.dom.NodeType", "goog.dom.TagName", "goog.dom.iter.ChildIterator", "goog.dom.iter.SiblingIterator", "goog.iter", "goog.object", "goog.string", "goog.string.Unicode", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/plugin.js", ["goog.editor.Plugin"], ["goog.editor.Command", "goog.events.EventTarget", "goog.functions", "goog.log", "goog.object", "goog.reflect"]); +goog.addDependency("/closure/goog/editor/plugins/abstractbubbleplugin.js", ["goog.editor.plugins.AbstractBubblePlugin"], ["goog.dom", "goog.dom.NodeType", "goog.dom.Range", "goog.dom.TagName", "goog.editor.Plugin", "goog.editor.style", "goog.events", "goog.events.EventHandler", "goog.events.EventType", "goog.events.KeyCodes", "goog.events.actionEventWrapper", "goog.functions", "goog.string.Unicode", "goog.ui.Component.EventType", "goog.ui.editor.Bubble", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/plugins/abstractdialogplugin.js", ["goog.editor.plugins.AbstractDialogPlugin", "goog.editor.plugins.AbstractDialogPlugin.EventType"], ["goog.dom", "goog.dom.Range", "goog.editor.Field.EventType", "goog.editor.Plugin", "goog.editor.range", "goog.events", "goog.ui.editor.AbstractDialog.EventType"]); +goog.addDependency("/closure/goog/editor/plugins/abstracttabhandler.js", ["goog.editor.plugins.AbstractTabHandler"], ["goog.editor.Plugin", "goog.events.KeyCodes"]); +goog.addDependency("/closure/goog/editor/plugins/basictextformatter.js", ["goog.editor.plugins.BasicTextFormatter", "goog.editor.plugins.BasicTextFormatter.COMMAND"], ["goog.array", "goog.dom", "goog.dom.NodeType", "goog.dom.Range", "goog.dom.TagName", "goog.editor.BrowserFeature", "goog.editor.Command", "goog.editor.Link", "goog.editor.Plugin", "goog.editor.node", "goog.editor.range", "goog.editor.style", "goog.iter", "goog.iter.StopIteration", "goog.log", "goog.object", "goog.string", "goog.string.Unicode", +"goog.style", "goog.ui.editor.messages", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/plugins/blockquote.js", ["goog.editor.plugins.Blockquote"], ["goog.dom", "goog.dom.NodeType", "goog.dom.TagName", "goog.dom.classes", "goog.editor.BrowserFeature", "goog.editor.Command", "goog.editor.Plugin", "goog.editor.node", "goog.functions", "goog.log"]); +goog.addDependency("/closure/goog/editor/plugins/emoticons.js", ["goog.editor.plugins.Emoticons"], ["goog.dom.TagName", "goog.editor.Plugin", "goog.editor.range", "goog.functions", "goog.ui.emoji.Emoji", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/plugins/enterhandler.js", ["goog.editor.plugins.EnterHandler"], ["goog.dom", "goog.dom.NodeOffset", "goog.dom.NodeType", "goog.dom.Range", "goog.dom.TagName", "goog.editor.BrowserFeature", "goog.editor.Plugin", "goog.editor.node", "goog.editor.plugins.Blockquote", "goog.editor.range", "goog.editor.style", "goog.events.KeyCodes", "goog.functions", "goog.object", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/plugins/equationeditorbubble.js", ["goog.editor.plugins.equation.EquationBubble"], ["goog.dom", "goog.dom.TagName", "goog.editor.Command", "goog.editor.plugins.AbstractBubblePlugin", "goog.string.Unicode", "goog.ui.editor.Bubble", "goog.ui.equation.ImageRenderer"]); +goog.addDependency("/closure/goog/editor/plugins/equationeditorplugin.js", ["goog.editor.plugins.EquationEditorPlugin"], ["goog.dom", "goog.editor.Command", "goog.editor.plugins.AbstractDialogPlugin", "goog.editor.range", "goog.events", "goog.events.EventType", "goog.functions", "goog.log", "goog.ui.editor.AbstractDialog", "goog.ui.editor.EquationEditorDialog", "goog.ui.equation.ImageRenderer", "goog.ui.equation.PaletteManager"]); +goog.addDependency("/closure/goog/editor/plugins/firststrong.js", ["goog.editor.plugins.FirstStrong"], ["goog.dom.NodeType", "goog.dom.TagIterator", "goog.dom.TagName", "goog.editor.Command", "goog.editor.Plugin", "goog.editor.node", "goog.editor.range", "goog.i18n.bidi", "goog.i18n.uChar", "goog.iter", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/plugins/headerformatter.js", ["goog.editor.plugins.HeaderFormatter"], ["goog.editor.Command", "goog.editor.Plugin", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/plugins/linkbubble.js", ["goog.editor.plugins.LinkBubble", "goog.editor.plugins.LinkBubble.Action"], ["goog.array", "goog.dom", "goog.editor.BrowserFeature", "goog.editor.Command", "goog.editor.Link", "goog.editor.plugins.AbstractBubblePlugin", "goog.editor.range", "goog.string", "goog.style", "goog.ui.editor.messages", "goog.uri.utils", "goog.window"]); +goog.addDependency("/closure/goog/editor/plugins/linkdialogplugin.js", ["goog.editor.plugins.LinkDialogPlugin"], ["goog.array", "goog.dom", "goog.editor.Command", "goog.editor.plugins.AbstractDialogPlugin", "goog.events.EventHandler", "goog.functions", "goog.ui.editor.AbstractDialog.EventType", "goog.ui.editor.LinkDialog", "goog.ui.editor.LinkDialog.EventType", "goog.ui.editor.LinkDialog.OkEvent", "goog.uri.utils"]); +goog.addDependency("/closure/goog/editor/plugins/linkshortcutplugin.js", ["goog.editor.plugins.LinkShortcutPlugin"], ["goog.editor.Command", "goog.editor.Link", "goog.editor.Plugin", "goog.string"]); +goog.addDependency("/closure/goog/editor/plugins/listtabhandler.js", ["goog.editor.plugins.ListTabHandler"], ["goog.dom.TagName", "goog.editor.Command", "goog.editor.plugins.AbstractTabHandler"]); +goog.addDependency("/closure/goog/editor/plugins/loremipsum.js", ["goog.editor.plugins.LoremIpsum"], ["goog.asserts", "goog.dom", "goog.editor.Command", "goog.editor.Plugin", "goog.editor.node", "goog.functions"]); +goog.addDependency("/closure/goog/editor/plugins/removeformatting.js", ["goog.editor.plugins.RemoveFormatting"], ["goog.dom", "goog.dom.NodeType", "goog.dom.Range", "goog.dom.TagName", "goog.editor.BrowserFeature", "goog.editor.Plugin", "goog.editor.node", "goog.editor.range", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/plugins/spacestabhandler.js", ["goog.editor.plugins.SpacesTabHandler"], ["goog.dom", "goog.dom.TagName", "goog.editor.plugins.AbstractTabHandler", "goog.editor.range"]); +goog.addDependency("/closure/goog/editor/plugins/tableeditor.js", ["goog.editor.plugins.TableEditor"], ["goog.array", "goog.dom", "goog.dom.TagName", "goog.editor.Plugin", "goog.editor.Table", "goog.editor.node", "goog.editor.range", "goog.object"]); +goog.addDependency("/closure/goog/editor/plugins/tagonenterhandler.js", ["goog.editor.plugins.TagOnEnterHandler"], ["goog.dom", "goog.dom.NodeType", "goog.dom.Range", "goog.dom.TagName", "goog.editor.Command", "goog.editor.node", "goog.editor.plugins.EnterHandler", "goog.editor.range", "goog.editor.style", "goog.events.KeyCodes", "goog.string", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/plugins/undoredo.js", ["goog.editor.plugins.UndoRedo"], ["goog.dom", "goog.dom.NodeOffset", "goog.dom.Range", "goog.editor.BrowserFeature", "goog.editor.Command", "goog.editor.Field.EventType", "goog.editor.Plugin", "goog.editor.node", "goog.editor.plugins.UndoRedoManager", "goog.editor.plugins.UndoRedoState", "goog.events", "goog.events.EventHandler", "goog.log"]); +goog.addDependency("/closure/goog/editor/plugins/undoredomanager.js", ["goog.editor.plugins.UndoRedoManager", "goog.editor.plugins.UndoRedoManager.EventType"], ["goog.editor.plugins.UndoRedoState", "goog.events.EventTarget"]); +goog.addDependency("/closure/goog/editor/plugins/undoredostate.js", ["goog.editor.plugins.UndoRedoState"], ["goog.events.EventTarget"]); +goog.addDependency("/closure/goog/editor/range.js", ["goog.editor.range", "goog.editor.range.Point"], ["goog.array", "goog.dom", "goog.dom.NodeType", "goog.dom.Range", "goog.dom.RangeEndpoint", "goog.dom.SavedCaretRange", "goog.editor.node", "goog.editor.style", "goog.iter", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/seamlessfield.js", ["goog.editor.SeamlessField"], ["goog.cssom.iframe.style", "goog.dom", "goog.dom.Range", "goog.dom.TagName", "goog.editor.BrowserFeature", "goog.editor.Field", "goog.editor.icontent", "goog.editor.icontent.FieldFormatInfo", "goog.editor.icontent.FieldStyleInfo", "goog.editor.node", "goog.events", "goog.events.EventType", "goog.log", "goog.style"]); +goog.addDependency("/closure/goog/editor/seamlessfield_test.js", ["goog.editor.seamlessfield_test"], ["goog.dom", "goog.dom.DomHelper", "goog.dom.Range", "goog.editor.BrowserFeature", "goog.editor.Field", "goog.editor.SeamlessField", "goog.events", "goog.functions", "goog.style", "goog.testing.MockClock", "goog.testing.MockRange", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/editor/style.js", ["goog.editor.style"], ["goog.dom", "goog.dom.NodeType", "goog.editor.BrowserFeature", "goog.events.EventType", "goog.object", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/editor/table.js", ["goog.editor.Table", "goog.editor.TableCell", "goog.editor.TableRow"], ["goog.dom", "goog.dom.DomHelper", "goog.dom.NodeType", "goog.dom.TagName", "goog.log", "goog.string.Unicode", "goog.style"]); +goog.addDependency("/closure/goog/events/actioneventwrapper.js", ["goog.events.actionEventWrapper"], ["goog.events", "goog.events.EventHandler", "goog.events.EventType", "goog.events.EventWrapper", "goog.events.KeyCodes"]); +goog.addDependency("/closure/goog/events/actionhandler.js", ["goog.events.ActionEvent", "goog.events.ActionHandler", "goog.events.ActionHandler.EventType", "goog.events.BeforeActionEvent"], ["goog.events", "goog.events.BrowserEvent", "goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.userAgent"]); +goog.addDependency("/closure/goog/events/browserevent.js", ["goog.events.BrowserEvent", "goog.events.BrowserEvent.MouseButton"], ["goog.events.BrowserFeature", "goog.events.Event", "goog.events.EventType", "goog.reflect", "goog.userAgent"]); +goog.addDependency("/closure/goog/events/browserfeature.js", ["goog.events.BrowserFeature"], ["goog.userAgent"]); +goog.addDependency("/closure/goog/events/event.js", ["goog.events.Event", "goog.events.EventLike"], ["goog.Disposable"]); +goog.addDependency("/closure/goog/events/eventhandler.js", ["goog.events.EventHandler"], ["goog.Disposable", "goog.events", "goog.object"]); +goog.addDependency("/closure/goog/events/events.js", ["goog.events", "goog.events.Key", "goog.events.ListenableType"], ["goog.array", "goog.asserts", "goog.debug.entryPointRegistry", "goog.events.BrowserEvent", "goog.events.BrowserFeature", "goog.events.Listenable", "goog.events.Listener", "goog.object"]); +goog.addDependency("/closure/goog/events/eventtarget.js", ["goog.events.EventTarget"], ["goog.Disposable", "goog.array", "goog.asserts", "goog.events", "goog.events.Event", "goog.events.Listenable", "goog.events.ListenerMap", "goog.object"]); +goog.addDependency("/closure/goog/events/eventtargettester.js", ["goog.events.eventTargetTester", "goog.events.eventTargetTester.KeyType", "goog.events.eventTargetTester.UnlistenReturnType"], ["goog.array", "goog.events", "goog.events.Event", "goog.events.EventTarget", "goog.testing.asserts", "goog.testing.recordFunction"]); +goog.addDependency("/closure/goog/events/eventtype.js", ["goog.events.EventType"], ["goog.userAgent"]); +goog.addDependency("/closure/goog/events/eventwrapper.js", ["goog.events.EventWrapper"], []); +goog.addDependency("/closure/goog/events/filedrophandler.js", ["goog.events.FileDropHandler", "goog.events.FileDropHandler.EventType"], ["goog.array", "goog.dom", "goog.events", "goog.events.BrowserEvent", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.log"]); +goog.addDependency("/closure/goog/events/focushandler.js", ["goog.events.FocusHandler", "goog.events.FocusHandler.EventType"], ["goog.events", "goog.events.BrowserEvent", "goog.events.EventTarget", "goog.userAgent"]); +goog.addDependency("/closure/goog/events/imehandler.js", ["goog.events.ImeHandler", "goog.events.ImeHandler.Event", "goog.events.ImeHandler.EventType"], ["goog.events.Event", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.userAgent"]); +goog.addDependency("/closure/goog/events/inputhandler.js", ["goog.events.InputHandler", "goog.events.InputHandler.EventType"], ["goog.Timer", "goog.dom", "goog.events.BrowserEvent", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.KeyCodes", "goog.userAgent"]); +goog.addDependency("/closure/goog/events/keycodes.js", ["goog.events.KeyCodes"], ["goog.userAgent"]); +goog.addDependency("/closure/goog/events/keyhandler.js", ["goog.events.KeyEvent", "goog.events.KeyHandler", "goog.events.KeyHandler.EventType"], ["goog.events", "goog.events.BrowserEvent", "goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.userAgent"]); +goog.addDependency("/closure/goog/events/keynames.js", ["goog.events.KeyNames"], []); +goog.addDependency("/closure/goog/events/listenable.js", ["goog.events.Listenable", "goog.events.ListenableKey"], []); +goog.addDependency("/closure/goog/events/listener.js", ["goog.events.Listener"], ["goog.events.ListenableKey"]); +goog.addDependency("/closure/goog/events/listenermap.js", ["goog.events.ListenerMap"], ["goog.array", "goog.events.Listener", "goog.object"]); +goog.addDependency("/closure/goog/events/listenermap_test.js", ["goog.events.ListenerMapTest"], ["goog.dispose", "goog.events.EventTarget", "goog.events.ListenerMap", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/events/mousewheelhandler.js", ["goog.events.MouseWheelEvent", "goog.events.MouseWheelHandler", "goog.events.MouseWheelHandler.EventType"], ["goog.dom", "goog.events", "goog.events.BrowserEvent", "goog.events.EventTarget", "goog.math", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/events/onlinehandler.js", ["goog.events.OnlineHandler", "goog.events.OnlineHandler.EventType"], ["goog.Timer", "goog.events.BrowserFeature", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.net.NetworkStatusMonitor", "goog.userAgent"]); +goog.addDependency("/closure/goog/events/pastehandler.js", ["goog.events.PasteHandler", "goog.events.PasteHandler.EventType", "goog.events.PasteHandler.State"], ["goog.Timer", "goog.async.ConditionalDelay", "goog.events.BrowserEvent", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.log", "goog.userAgent"]); +goog.addDependency("/closure/goog/format/emailaddress.js", ["goog.format.EmailAddress"], ["goog.string"]); +goog.addDependency("/closure/goog/format/format.js", ["goog.format"], ["goog.i18n.GraphemeBreak", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/format/htmlprettyprinter.js", ["goog.format.HtmlPrettyPrinter", "goog.format.HtmlPrettyPrinter.Buffer"], ["goog.object", "goog.string.StringBuffer"]); +goog.addDependency("/closure/goog/format/jsonprettyprinter.js", ["goog.format.JsonPrettyPrinter", "goog.format.JsonPrettyPrinter.HtmlDelimiters", "goog.format.JsonPrettyPrinter.TextDelimiters"], ["goog.json", "goog.json.Serializer", "goog.string", "goog.string.StringBuffer", "goog.string.format"]); +goog.addDependency("/closure/goog/fs/entry.js", ["goog.fs.DirectoryEntry", "goog.fs.DirectoryEntry.Behavior", "goog.fs.Entry", "goog.fs.FileEntry"], []); +goog.addDependency("/closure/goog/fs/entryimpl.js", ["goog.fs.DirectoryEntryImpl", "goog.fs.EntryImpl", "goog.fs.FileEntryImpl"], ["goog.array", "goog.async.Deferred", "goog.fs.DirectoryEntry", "goog.fs.Entry", "goog.fs.Error", "goog.fs.FileEntry", "goog.fs.FileWriter", "goog.functions", "goog.string"]); +goog.addDependency("/closure/goog/fs/error.js", ["goog.fs.Error", "goog.fs.Error.ErrorCode"], ["goog.debug.Error", "goog.string"]); +goog.addDependency("/closure/goog/fs/filereader.js", ["goog.fs.FileReader", "goog.fs.FileReader.EventType", "goog.fs.FileReader.ReadyState"], ["goog.async.Deferred", "goog.events.Event", "goog.events.EventTarget", "goog.fs.Error", "goog.fs.ProgressEvent"]); +goog.addDependency("/closure/goog/fs/filesaver.js", ["goog.fs.FileSaver", "goog.fs.FileSaver.EventType", "goog.fs.FileSaver.ProgressEvent", "goog.fs.FileSaver.ReadyState"], ["goog.events.Event", "goog.events.EventTarget", "goog.fs.Error", "goog.fs.ProgressEvent"]); +goog.addDependency("/closure/goog/fs/filesystem.js", ["goog.fs.FileSystem"], []); +goog.addDependency("/closure/goog/fs/filesystemimpl.js", ["goog.fs.FileSystemImpl"], ["goog.fs.DirectoryEntryImpl", "goog.fs.FileSystem"]); +goog.addDependency("/closure/goog/fs/filewriter.js", ["goog.fs.FileWriter"], ["goog.fs.Error", "goog.fs.FileSaver"]); +goog.addDependency("/closure/goog/fs/fs.js", ["goog.fs"], ["goog.array", "goog.async.Deferred", "goog.fs.Error", "goog.fs.FileReader", "goog.fs.FileSystemImpl", "goog.userAgent"]); +goog.addDependency("/closure/goog/fs/progressevent.js", ["goog.fs.ProgressEvent"], ["goog.events.Event"]); +goog.addDependency("/closure/goog/functions/functions.js", ["goog.functions"], []); +goog.addDependency("/closure/goog/fx/abstractdragdrop.js", ["goog.fx.AbstractDragDrop", "goog.fx.AbstractDragDrop.EventType", "goog.fx.DragDropEvent", "goog.fx.DragDropItem"], ["goog.dom", "goog.dom.classes", "goog.events", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.fx.Dragger", "goog.fx.Dragger.EventType", "goog.math.Box", "goog.math.Coordinate", "goog.style"]); +goog.addDependency("/closure/goog/fx/anim/anim.js", ["goog.fx.anim", "goog.fx.anim.Animated"], ["goog.async.AnimationDelay", "goog.async.Delay", "goog.object"]); +goog.addDependency("/closure/goog/fx/animation.js", ["goog.fx.Animation", "goog.fx.Animation.EventType", "goog.fx.Animation.State", "goog.fx.AnimationEvent"], ["goog.array", "goog.events.Event", "goog.fx.Transition", "goog.fx.Transition.EventType", "goog.fx.TransitionBase.State", "goog.fx.anim", "goog.fx.anim.Animated"]); +goog.addDependency("/closure/goog/fx/animationqueue.js", ["goog.fx.AnimationParallelQueue", "goog.fx.AnimationQueue", "goog.fx.AnimationSerialQueue"], ["goog.array", "goog.asserts", "goog.events.EventHandler", "goog.fx.Transition.EventType", "goog.fx.TransitionBase", "goog.fx.TransitionBase.State"]); +goog.addDependency("/closure/goog/fx/css3/fx.js", ["goog.fx.css3"], ["goog.fx.css3.Transition"]); +goog.addDependency("/closure/goog/fx/css3/transition.js", ["goog.fx.css3.Transition"], ["goog.Timer", "goog.fx.TransitionBase", "goog.style", "goog.style.transition"]); +goog.addDependency("/closure/goog/fx/cssspriteanimation.js", ["goog.fx.CssSpriteAnimation"], ["goog.fx.Animation"]); +goog.addDependency("/closure/goog/fx/dom.js", ["goog.fx.dom", "goog.fx.dom.BgColorTransform", "goog.fx.dom.ColorTransform", "goog.fx.dom.Fade", "goog.fx.dom.FadeIn", "goog.fx.dom.FadeInAndShow", "goog.fx.dom.FadeOut", "goog.fx.dom.FadeOutAndHide", "goog.fx.dom.PredefinedEffect", "goog.fx.dom.Resize", "goog.fx.dom.ResizeHeight", "goog.fx.dom.ResizeWidth", "goog.fx.dom.Scroll", "goog.fx.dom.Slide", "goog.fx.dom.SlideFrom", "goog.fx.dom.Swipe"], ["goog.color", "goog.events", "goog.fx.Animation", "goog.fx.Transition.EventType", +"goog.style", "goog.style.bidi"]); +goog.addDependency("/closure/goog/fx/dragdrop.js", ["goog.fx.DragDrop"], ["goog.fx.AbstractDragDrop", "goog.fx.DragDropItem"]); +goog.addDependency("/closure/goog/fx/dragdropgroup.js", ["goog.fx.DragDropGroup"], ["goog.dom", "goog.fx.AbstractDragDrop", "goog.fx.DragDropItem"]); +goog.addDependency("/closure/goog/fx/dragger.js", ["goog.fx.DragEvent", "goog.fx.Dragger", "goog.fx.Dragger.EventType"], ["goog.dom", "goog.events", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.math.Coordinate", "goog.math.Rect", "goog.style", "goog.style.bidi", "goog.userAgent"]); +goog.addDependency("/closure/goog/fx/draglistgroup.js", ["goog.fx.DragListDirection", "goog.fx.DragListGroup", "goog.fx.DragListGroup.EventType", "goog.fx.DragListGroupEvent"], ["goog.asserts", "goog.dom", "goog.dom.NodeType", "goog.dom.classes", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.fx.Dragger", "goog.fx.Dragger.EventType", "goog.math.Coordinate", "goog.style"]); +goog.addDependency("/closure/goog/fx/dragscrollsupport.js", ["goog.fx.DragScrollSupport"], ["goog.Disposable", "goog.Timer", "goog.dom", "goog.events.EventHandler", "goog.events.EventType", "goog.math.Coordinate", "goog.style"]); +goog.addDependency("/closure/goog/fx/easing.js", ["goog.fx.easing"], []); +goog.addDependency("/closure/goog/fx/fx.js", ["goog.fx"], ["goog.asserts", "goog.fx.Animation", "goog.fx.Animation.EventType", "goog.fx.Animation.State", "goog.fx.AnimationEvent", "goog.fx.Transition.EventType", "goog.fx.easing"]); +goog.addDependency("/closure/goog/fx/transition.js", ["goog.fx.Transition", "goog.fx.Transition.EventType"], []); +goog.addDependency("/closure/goog/fx/transitionbase.js", ["goog.fx.TransitionBase", "goog.fx.TransitionBase.State"], ["goog.events.EventTarget", "goog.fx.Transition", "goog.fx.Transition.EventType"]); +goog.addDependency("/closure/goog/gears/basestore.js", ["goog.gears.BaseStore", "goog.gears.BaseStore.SchemaType"], ["goog.Disposable"]); +goog.addDependency("/closure/goog/gears/database.js", ["goog.gears.Database", "goog.gears.Database.EventType", "goog.gears.Database.TransactionEvent"], ["goog.array", "goog.debug", "goog.events.Event", "goog.events.EventTarget", "goog.gears", "goog.json", "goog.log"]); +goog.addDependency("/closure/goog/gears/gears.js", ["goog.gears"], ["goog.string"]); +goog.addDependency("/closure/goog/gears/httprequest.js", ["goog.gears.HttpRequest"], ["goog.Timer", "goog.gears", "goog.net.WrapperXmlHttpFactory", "goog.net.XmlHttp"]); +goog.addDependency("/closure/goog/gears/loggerclient.js", ["goog.gears.LoggerClient"], ["goog.Disposable", "goog.debug", "goog.debug.Logger"]); +goog.addDependency("/closure/goog/gears/loggerserver.js", ["goog.gears.LoggerServer"], ["goog.Disposable", "goog.gears.Worker.EventType", "goog.log", "goog.log.Level"]); +goog.addDependency("/closure/goog/gears/logstore.js", ["goog.gears.LogStore", "goog.gears.LogStore.Query"], ["goog.async.Delay", "goog.debug.LogManager", "goog.gears.BaseStore", "goog.gears.BaseStore.SchemaType", "goog.json", "goog.log", "goog.log.Level", "goog.log.LogRecord"]); +goog.addDependency("/closure/goog/gears/managedresourcestore.js", ["goog.gears.ManagedResourceStore", "goog.gears.ManagedResourceStore.EventType", "goog.gears.ManagedResourceStore.UpdateStatus", "goog.gears.ManagedResourceStoreEvent"], ["goog.events.Event", "goog.events.EventTarget", "goog.gears", "goog.log", "goog.string"]); +goog.addDependency("/closure/goog/gears/multipartformdata.js", ["goog.gears.MultipartFormData"], ["goog.asserts", "goog.gears", "goog.string"]); +goog.addDependency("/closure/goog/gears/statustype.js", ["goog.gears.StatusType"], []); +goog.addDependency("/closure/goog/gears/urlcapture.js", ["goog.gears.UrlCapture", "goog.gears.UrlCapture.Event", "goog.gears.UrlCapture.EventType"], ["goog.Uri", "goog.events.Event", "goog.events.EventTarget", "goog.gears", "goog.log"]); +goog.addDependency("/closure/goog/gears/worker.js", ["goog.gears.Worker", "goog.gears.Worker.EventType", "goog.gears.WorkerEvent"], ["goog.events.Event", "goog.events.EventTarget"]); +goog.addDependency("/closure/goog/gears/workerchannel.js", ["goog.gears.WorkerChannel"], ["goog.Disposable", "goog.debug", "goog.events", "goog.gears.Worker", "goog.gears.Worker.EventType", "goog.gears.WorkerEvent", "goog.json", "goog.log", "goog.messaging.AbstractChannel"]); +goog.addDependency("/closure/goog/gears/workerpool.js", ["goog.gears.WorkerPool", "goog.gears.WorkerPool.Event", "goog.gears.WorkerPool.EventType"], ["goog.events.Event", "goog.events.EventTarget", "goog.gears", "goog.gears.Worker"]); +goog.addDependency("/closure/goog/graphics/abstractgraphics.js", ["goog.graphics.AbstractGraphics"], ["goog.dom", "goog.graphics.Path", "goog.math.Coordinate", "goog.math.Size", "goog.style", "goog.ui.Component"]); +goog.addDependency("/closure/goog/graphics/affinetransform.js", ["goog.graphics.AffineTransform"], ["goog.math"]); +goog.addDependency("/closure/goog/graphics/canvaselement.js", ["goog.graphics.CanvasEllipseElement", "goog.graphics.CanvasGroupElement", "goog.graphics.CanvasImageElement", "goog.graphics.CanvasPathElement", "goog.graphics.CanvasRectElement", "goog.graphics.CanvasTextElement"], ["goog.array", "goog.dom", "goog.dom.TagName", "goog.graphics.EllipseElement", "goog.graphics.GroupElement", "goog.graphics.ImageElement", "goog.graphics.Path", "goog.graphics.PathElement", "goog.graphics.RectElement", "goog.graphics.TextElement", +"goog.math", "goog.string"]); +goog.addDependency("/closure/goog/graphics/canvasgraphics.js", ["goog.graphics.CanvasGraphics"], ["goog.events.EventType", "goog.graphics.AbstractGraphics", "goog.graphics.CanvasEllipseElement", "goog.graphics.CanvasGroupElement", "goog.graphics.CanvasImageElement", "goog.graphics.CanvasPathElement", "goog.graphics.CanvasRectElement", "goog.graphics.CanvasTextElement", "goog.graphics.SolidFill", "goog.math.Size", "goog.style"]); +goog.addDependency("/closure/goog/graphics/element.js", ["goog.graphics.Element"], ["goog.events", "goog.events.EventTarget", "goog.events.Listenable", "goog.graphics.AffineTransform", "goog.math"]); +goog.addDependency("/closure/goog/graphics/ellipseelement.js", ["goog.graphics.EllipseElement"], ["goog.graphics.StrokeAndFillElement"]); +goog.addDependency("/closure/goog/graphics/ext/coordinates.js", ["goog.graphics.ext.coordinates"], ["goog.string"]); +goog.addDependency("/closure/goog/graphics/ext/element.js", ["goog.graphics.ext.Element"], ["goog.events", "goog.events.EventTarget", "goog.functions", "goog.graphics", "goog.graphics.ext.coordinates"]); +goog.addDependency("/closure/goog/graphics/ext/ellipse.js", ["goog.graphics.ext.Ellipse"], ["goog.graphics.ext.StrokeAndFillElement"]); +goog.addDependency("/closure/goog/graphics/ext/ext.js", ["goog.graphics.ext"], ["goog.graphics.ext.Ellipse", "goog.graphics.ext.Graphics", "goog.graphics.ext.Group", "goog.graphics.ext.Image", "goog.graphics.ext.Rectangle", "goog.graphics.ext.Shape", "goog.graphics.ext.coordinates"]); +goog.addDependency("/closure/goog/graphics/ext/graphics.js", ["goog.graphics.ext.Graphics"], ["goog.events.EventType", "goog.graphics.ext.Group"]); +goog.addDependency("/closure/goog/graphics/ext/group.js", ["goog.graphics.ext.Group"], ["goog.graphics.ext.Element"]); +goog.addDependency("/closure/goog/graphics/ext/image.js", ["goog.graphics.ext.Image"], ["goog.graphics.ext.Element"]); +goog.addDependency("/closure/goog/graphics/ext/path.js", ["goog.graphics.ext.Path"], ["goog.graphics.AffineTransform", "goog.graphics.Path", "goog.math", "goog.math.Rect"]); +goog.addDependency("/closure/goog/graphics/ext/rectangle.js", ["goog.graphics.ext.Rectangle"], ["goog.graphics.ext.StrokeAndFillElement"]); +goog.addDependency("/closure/goog/graphics/ext/shape.js", ["goog.graphics.ext.Shape"], ["goog.graphics.ext.Path", "goog.graphics.ext.StrokeAndFillElement", "goog.math.Rect"]); +goog.addDependency("/closure/goog/graphics/ext/strokeandfillelement.js", ["goog.graphics.ext.StrokeAndFillElement"], ["goog.graphics.ext.Element"]); +goog.addDependency("/closure/goog/graphics/fill.js", ["goog.graphics.Fill"], []); +goog.addDependency("/closure/goog/graphics/font.js", ["goog.graphics.Font"], []); +goog.addDependency("/closure/goog/graphics/graphics.js", ["goog.graphics"], ["goog.graphics.CanvasGraphics", "goog.graphics.SvgGraphics", "goog.graphics.VmlGraphics", "goog.userAgent"]); +goog.addDependency("/closure/goog/graphics/groupelement.js", ["goog.graphics.GroupElement"], ["goog.graphics.Element"]); +goog.addDependency("/closure/goog/graphics/imageelement.js", ["goog.graphics.ImageElement"], ["goog.graphics.Element"]); +goog.addDependency("/closure/goog/graphics/lineargradient.js", ["goog.graphics.LinearGradient"], ["goog.asserts", "goog.graphics.Fill"]); +goog.addDependency("/closure/goog/graphics/path.js", ["goog.graphics.Path", "goog.graphics.Path.Segment"], ["goog.array", "goog.math"]); +goog.addDependency("/closure/goog/graphics/pathelement.js", ["goog.graphics.PathElement"], ["goog.graphics.StrokeAndFillElement"]); +goog.addDependency("/closure/goog/graphics/paths.js", ["goog.graphics.paths"], ["goog.graphics.Path", "goog.math.Coordinate"]); +goog.addDependency("/closure/goog/graphics/rectelement.js", ["goog.graphics.RectElement"], ["goog.graphics.StrokeAndFillElement"]); +goog.addDependency("/closure/goog/graphics/solidfill.js", ["goog.graphics.SolidFill"], ["goog.graphics.Fill"]); +goog.addDependency("/closure/goog/graphics/stroke.js", ["goog.graphics.Stroke"], []); +goog.addDependency("/closure/goog/graphics/strokeandfillelement.js", ["goog.graphics.StrokeAndFillElement"], ["goog.graphics.Element"]); +goog.addDependency("/closure/goog/graphics/svgelement.js", ["goog.graphics.SvgEllipseElement", "goog.graphics.SvgGroupElement", "goog.graphics.SvgImageElement", "goog.graphics.SvgPathElement", "goog.graphics.SvgRectElement", "goog.graphics.SvgTextElement"], ["goog.dom", "goog.graphics.EllipseElement", "goog.graphics.GroupElement", "goog.graphics.ImageElement", "goog.graphics.PathElement", "goog.graphics.RectElement", "goog.graphics.TextElement"]); +goog.addDependency("/closure/goog/graphics/svggraphics.js", ["goog.graphics.SvgGraphics"], ["goog.Timer", "goog.dom", "goog.events.EventHandler", "goog.events.EventType", "goog.graphics.AbstractGraphics", "goog.graphics.LinearGradient", "goog.graphics.Path", "goog.graphics.SolidFill", "goog.graphics.Stroke", "goog.graphics.SvgEllipseElement", "goog.graphics.SvgGroupElement", "goog.graphics.SvgImageElement", "goog.graphics.SvgPathElement", "goog.graphics.SvgRectElement", "goog.graphics.SvgTextElement", +"goog.math", "goog.math.Size", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/graphics/textelement.js", ["goog.graphics.TextElement"], ["goog.graphics.StrokeAndFillElement"]); +goog.addDependency("/closure/goog/graphics/vmlelement.js", ["goog.graphics.VmlEllipseElement", "goog.graphics.VmlGroupElement", "goog.graphics.VmlImageElement", "goog.graphics.VmlPathElement", "goog.graphics.VmlRectElement", "goog.graphics.VmlTextElement"], ["goog.dom", "goog.graphics.EllipseElement", "goog.graphics.GroupElement", "goog.graphics.ImageElement", "goog.graphics.PathElement", "goog.graphics.RectElement", "goog.graphics.TextElement"]); +goog.addDependency("/closure/goog/graphics/vmlgraphics.js", ["goog.graphics.VmlGraphics"], ["goog.array", "goog.events", "goog.events.EventHandler", "goog.events.EventType", "goog.graphics.AbstractGraphics", "goog.graphics.LinearGradient", "goog.graphics.Path", "goog.graphics.SolidFill", "goog.graphics.VmlEllipseElement", "goog.graphics.VmlGroupElement", "goog.graphics.VmlImageElement", "goog.graphics.VmlPathElement", "goog.graphics.VmlRectElement", "goog.graphics.VmlTextElement", "goog.math", "goog.math.Size", +"goog.string", "goog.style"]); +goog.addDependency("/closure/goog/history/event.js", ["goog.history.Event"], ["goog.events.Event", "goog.history.EventType"]); +goog.addDependency("/closure/goog/history/eventtype.js", ["goog.history.EventType"], []); +goog.addDependency("/closure/goog/history/history.js", ["goog.History", "goog.History.Event", "goog.History.EventType"], ["goog.Timer", "goog.dom", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.history.Event", "goog.history.EventType", "goog.memoize", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/history/history_test.js", ["goog.HistoryTest"], ["goog.History", "goog.testing.jsunit", "goog.userAgent"]); +goog.addDependency("/closure/goog/history/html5history.js", ["goog.history.Html5History", "goog.history.Html5History.TokenTransformer"], ["goog.asserts", "goog.events", "goog.events.EventTarget", "goog.events.EventType", "goog.history.Event", "goog.history.EventType"]); +goog.addDependency("/closure/goog/i18n/bidi.js", ["goog.i18n.bidi"], []); +goog.addDependency("/closure/goog/i18n/bidiformatter.js", ["goog.i18n.BidiFormatter"], ["goog.i18n.bidi", "goog.string"]); +goog.addDependency("/closure/goog/i18n/charlistdecompressor.js", ["goog.i18n.CharListDecompressor"], ["goog.array", "goog.i18n.uChar"]); +goog.addDependency("/closure/goog/i18n/charpickerdata.js", ["goog.i18n.CharPickerData"], []); +goog.addDependency("/closure/goog/i18n/collation.js", ["goog.i18n.collation"], []); +goog.addDependency("/closure/goog/i18n/compactnumberformatsymbols.js", ["goog.i18n.CompactNumberFormatSymbols", "goog.i18n.CompactNumberFormatSymbols_af", "goog.i18n.CompactNumberFormatSymbols_af_ZA", "goog.i18n.CompactNumberFormatSymbols_am", "goog.i18n.CompactNumberFormatSymbols_am_ET", "goog.i18n.CompactNumberFormatSymbols_ar", "goog.i18n.CompactNumberFormatSymbols_ar_001", "goog.i18n.CompactNumberFormatSymbols_ar_EG", "goog.i18n.CompactNumberFormatSymbols_bg", "goog.i18n.CompactNumberFormatSymbols_bg_BG", +"goog.i18n.CompactNumberFormatSymbols_bn", "goog.i18n.CompactNumberFormatSymbols_bn_BD", "goog.i18n.CompactNumberFormatSymbols_br", "goog.i18n.CompactNumberFormatSymbols_br_FR", "goog.i18n.CompactNumberFormatSymbols_ca", "goog.i18n.CompactNumberFormatSymbols_ca_AD", "goog.i18n.CompactNumberFormatSymbols_ca_ES", "goog.i18n.CompactNumberFormatSymbols_chr", "goog.i18n.CompactNumberFormatSymbols_chr_US", "goog.i18n.CompactNumberFormatSymbols_cs", "goog.i18n.CompactNumberFormatSymbols_cs_CZ", "goog.i18n.CompactNumberFormatSymbols_cy", +"goog.i18n.CompactNumberFormatSymbols_cy_GB", "goog.i18n.CompactNumberFormatSymbols_da", "goog.i18n.CompactNumberFormatSymbols_da_DK", "goog.i18n.CompactNumberFormatSymbols_de", "goog.i18n.CompactNumberFormatSymbols_de_AT", "goog.i18n.CompactNumberFormatSymbols_de_BE", "goog.i18n.CompactNumberFormatSymbols_de_CH", "goog.i18n.CompactNumberFormatSymbols_de_DE", "goog.i18n.CompactNumberFormatSymbols_de_LU", "goog.i18n.CompactNumberFormatSymbols_el", "goog.i18n.CompactNumberFormatSymbols_el_GR", "goog.i18n.CompactNumberFormatSymbols_en", +"goog.i18n.CompactNumberFormatSymbols_en_AS", "goog.i18n.CompactNumberFormatSymbols_en_AU", "goog.i18n.CompactNumberFormatSymbols_en_Dsrt_US", "goog.i18n.CompactNumberFormatSymbols_en_FM", "goog.i18n.CompactNumberFormatSymbols_en_GB", "goog.i18n.CompactNumberFormatSymbols_en_GU", "goog.i18n.CompactNumberFormatSymbols_en_IE", "goog.i18n.CompactNumberFormatSymbols_en_IN", "goog.i18n.CompactNumberFormatSymbols_en_MH", "goog.i18n.CompactNumberFormatSymbols_en_MP", "goog.i18n.CompactNumberFormatSymbols_en_PR", +"goog.i18n.CompactNumberFormatSymbols_en_PW", "goog.i18n.CompactNumberFormatSymbols_en_SG", "goog.i18n.CompactNumberFormatSymbols_en_TC", "goog.i18n.CompactNumberFormatSymbols_en_UM", "goog.i18n.CompactNumberFormatSymbols_en_US", "goog.i18n.CompactNumberFormatSymbols_en_VG", "goog.i18n.CompactNumberFormatSymbols_en_VI", "goog.i18n.CompactNumberFormatSymbols_en_ZA", "goog.i18n.CompactNumberFormatSymbols_es", "goog.i18n.CompactNumberFormatSymbols_es_419", "goog.i18n.CompactNumberFormatSymbols_es_EA", +"goog.i18n.CompactNumberFormatSymbols_es_ES", "goog.i18n.CompactNumberFormatSymbols_es_IC", "goog.i18n.CompactNumberFormatSymbols_et", "goog.i18n.CompactNumberFormatSymbols_et_EE", "goog.i18n.CompactNumberFormatSymbols_eu", "goog.i18n.CompactNumberFormatSymbols_eu_ES", "goog.i18n.CompactNumberFormatSymbols_fa", "goog.i18n.CompactNumberFormatSymbols_fa_IR", "goog.i18n.CompactNumberFormatSymbols_fi", "goog.i18n.CompactNumberFormatSymbols_fi_FI", "goog.i18n.CompactNumberFormatSymbols_fil", "goog.i18n.CompactNumberFormatSymbols_fil_PH", +"goog.i18n.CompactNumberFormatSymbols_fr", "goog.i18n.CompactNumberFormatSymbols_fr_BL", "goog.i18n.CompactNumberFormatSymbols_fr_CA", "goog.i18n.CompactNumberFormatSymbols_fr_FR", "goog.i18n.CompactNumberFormatSymbols_fr_GF", "goog.i18n.CompactNumberFormatSymbols_fr_GP", "goog.i18n.CompactNumberFormatSymbols_fr_MC", "goog.i18n.CompactNumberFormatSymbols_fr_MF", "goog.i18n.CompactNumberFormatSymbols_fr_MQ", "goog.i18n.CompactNumberFormatSymbols_fr_RE", "goog.i18n.CompactNumberFormatSymbols_fr_YT", +"goog.i18n.CompactNumberFormatSymbols_gl", "goog.i18n.CompactNumberFormatSymbols_gl_ES", "goog.i18n.CompactNumberFormatSymbols_gsw", "goog.i18n.CompactNumberFormatSymbols_gsw_CH", "goog.i18n.CompactNumberFormatSymbols_gu", "goog.i18n.CompactNumberFormatSymbols_gu_IN", "goog.i18n.CompactNumberFormatSymbols_haw", "goog.i18n.CompactNumberFormatSymbols_haw_US", "goog.i18n.CompactNumberFormatSymbols_he", "goog.i18n.CompactNumberFormatSymbols_he_IL", "goog.i18n.CompactNumberFormatSymbols_hi", "goog.i18n.CompactNumberFormatSymbols_hi_IN", +"goog.i18n.CompactNumberFormatSymbols_hr", "goog.i18n.CompactNumberFormatSymbols_hr_HR", "goog.i18n.CompactNumberFormatSymbols_hu", "goog.i18n.CompactNumberFormatSymbols_hu_HU", "goog.i18n.CompactNumberFormatSymbols_id", "goog.i18n.CompactNumberFormatSymbols_id_ID", "goog.i18n.CompactNumberFormatSymbols_in", "goog.i18n.CompactNumberFormatSymbols_is", "goog.i18n.CompactNumberFormatSymbols_is_IS", "goog.i18n.CompactNumberFormatSymbols_it", "goog.i18n.CompactNumberFormatSymbols_it_IT", "goog.i18n.CompactNumberFormatSymbols_it_SM", +"goog.i18n.CompactNumberFormatSymbols_iw", "goog.i18n.CompactNumberFormatSymbols_ja", "goog.i18n.CompactNumberFormatSymbols_ja_JP", "goog.i18n.CompactNumberFormatSymbols_kn", "goog.i18n.CompactNumberFormatSymbols_kn_IN", "goog.i18n.CompactNumberFormatSymbols_ko", "goog.i18n.CompactNumberFormatSymbols_ko_KR", "goog.i18n.CompactNumberFormatSymbols_ln", "goog.i18n.CompactNumberFormatSymbols_ln_CD", "goog.i18n.CompactNumberFormatSymbols_lt", "goog.i18n.CompactNumberFormatSymbols_lt_LT", "goog.i18n.CompactNumberFormatSymbols_lv", +"goog.i18n.CompactNumberFormatSymbols_lv_LV", "goog.i18n.CompactNumberFormatSymbols_ml", "goog.i18n.CompactNumberFormatSymbols_ml_IN", "goog.i18n.CompactNumberFormatSymbols_mr", "goog.i18n.CompactNumberFormatSymbols_mr_IN", "goog.i18n.CompactNumberFormatSymbols_ms", "goog.i18n.CompactNumberFormatSymbols_ms_Latn_MY", "goog.i18n.CompactNumberFormatSymbols_mt", "goog.i18n.CompactNumberFormatSymbols_mt_MT", "goog.i18n.CompactNumberFormatSymbols_nb", "goog.i18n.CompactNumberFormatSymbols_nb_NO", "goog.i18n.CompactNumberFormatSymbols_nl", +"goog.i18n.CompactNumberFormatSymbols_nl_NL", "goog.i18n.CompactNumberFormatSymbols_no", "goog.i18n.CompactNumberFormatSymbols_or", "goog.i18n.CompactNumberFormatSymbols_or_IN", "goog.i18n.CompactNumberFormatSymbols_pl", "goog.i18n.CompactNumberFormatSymbols_pl_PL", "goog.i18n.CompactNumberFormatSymbols_pt", "goog.i18n.CompactNumberFormatSymbols_pt_BR", "goog.i18n.CompactNumberFormatSymbols_pt_PT", "goog.i18n.CompactNumberFormatSymbols_ro", "goog.i18n.CompactNumberFormatSymbols_ro_RO", "goog.i18n.CompactNumberFormatSymbols_ru", +"goog.i18n.CompactNumberFormatSymbols_ru_RU", "goog.i18n.CompactNumberFormatSymbols_sk", "goog.i18n.CompactNumberFormatSymbols_sk_SK", "goog.i18n.CompactNumberFormatSymbols_sl", "goog.i18n.CompactNumberFormatSymbols_sl_SI", "goog.i18n.CompactNumberFormatSymbols_sq", "goog.i18n.CompactNumberFormatSymbols_sq_AL", "goog.i18n.CompactNumberFormatSymbols_sr", "goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS", "goog.i18n.CompactNumberFormatSymbols_sv", "goog.i18n.CompactNumberFormatSymbols_sv_SE", "goog.i18n.CompactNumberFormatSymbols_sw", +"goog.i18n.CompactNumberFormatSymbols_sw_TZ", "goog.i18n.CompactNumberFormatSymbols_ta", "goog.i18n.CompactNumberFormatSymbols_ta_IN", "goog.i18n.CompactNumberFormatSymbols_te", "goog.i18n.CompactNumberFormatSymbols_te_IN", "goog.i18n.CompactNumberFormatSymbols_th", "goog.i18n.CompactNumberFormatSymbols_th_TH", "goog.i18n.CompactNumberFormatSymbols_tl", "goog.i18n.CompactNumberFormatSymbols_tr", "goog.i18n.CompactNumberFormatSymbols_tr_TR", "goog.i18n.CompactNumberFormatSymbols_uk", "goog.i18n.CompactNumberFormatSymbols_uk_UA", +"goog.i18n.CompactNumberFormatSymbols_ur", "goog.i18n.CompactNumberFormatSymbols_ur_PK", "goog.i18n.CompactNumberFormatSymbols_vi", "goog.i18n.CompactNumberFormatSymbols_vi_VN", "goog.i18n.CompactNumberFormatSymbols_zh", "goog.i18n.CompactNumberFormatSymbols_zh_CN", "goog.i18n.CompactNumberFormatSymbols_zh_HK", "goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN", "goog.i18n.CompactNumberFormatSymbols_zh_TW", "goog.i18n.CompactNumberFormatSymbols_zu", "goog.i18n.CompactNumberFormatSymbols_zu_ZA"], []); +goog.addDependency("/closure/goog/i18n/compactnumberformatsymbols_ext.js", ["goog.i18n.CompactNumberFormatSymbolsExt", "goog.i18n.CompactNumberFormatSymbols_aa", "goog.i18n.CompactNumberFormatSymbols_aa_DJ", "goog.i18n.CompactNumberFormatSymbols_aa_ER", "goog.i18n.CompactNumberFormatSymbols_aa_ET", "goog.i18n.CompactNumberFormatSymbols_af_NA", "goog.i18n.CompactNumberFormatSymbols_agq", "goog.i18n.CompactNumberFormatSymbols_agq_CM", "goog.i18n.CompactNumberFormatSymbols_ak", "goog.i18n.CompactNumberFormatSymbols_ak_GH", +"goog.i18n.CompactNumberFormatSymbols_ar_AE", "goog.i18n.CompactNumberFormatSymbols_ar_BH", "goog.i18n.CompactNumberFormatSymbols_ar_DJ", "goog.i18n.CompactNumberFormatSymbols_ar_DZ", "goog.i18n.CompactNumberFormatSymbols_ar_EH", "goog.i18n.CompactNumberFormatSymbols_ar_ER", "goog.i18n.CompactNumberFormatSymbols_ar_IL", "goog.i18n.CompactNumberFormatSymbols_ar_IQ", "goog.i18n.CompactNumberFormatSymbols_ar_JO", "goog.i18n.CompactNumberFormatSymbols_ar_KM", "goog.i18n.CompactNumberFormatSymbols_ar_KW", +"goog.i18n.CompactNumberFormatSymbols_ar_LB", "goog.i18n.CompactNumberFormatSymbols_ar_LY", "goog.i18n.CompactNumberFormatSymbols_ar_MA", "goog.i18n.CompactNumberFormatSymbols_ar_MR", "goog.i18n.CompactNumberFormatSymbols_ar_OM", "goog.i18n.CompactNumberFormatSymbols_ar_PS", "goog.i18n.CompactNumberFormatSymbols_ar_QA", "goog.i18n.CompactNumberFormatSymbols_ar_SA", "goog.i18n.CompactNumberFormatSymbols_ar_SD", "goog.i18n.CompactNumberFormatSymbols_ar_SO", "goog.i18n.CompactNumberFormatSymbols_ar_SY", +"goog.i18n.CompactNumberFormatSymbols_ar_TD", "goog.i18n.CompactNumberFormatSymbols_ar_TN", "goog.i18n.CompactNumberFormatSymbols_ar_YE", "goog.i18n.CompactNumberFormatSymbols_as", "goog.i18n.CompactNumberFormatSymbols_as_IN", "goog.i18n.CompactNumberFormatSymbols_asa", "goog.i18n.CompactNumberFormatSymbols_asa_TZ", "goog.i18n.CompactNumberFormatSymbols_ast", "goog.i18n.CompactNumberFormatSymbols_ast_ES", "goog.i18n.CompactNumberFormatSymbols_az", "goog.i18n.CompactNumberFormatSymbols_az_Cyrl", "goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ", +"goog.i18n.CompactNumberFormatSymbols_az_Latn", "goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ", "goog.i18n.CompactNumberFormatSymbols_bas", "goog.i18n.CompactNumberFormatSymbols_bas_CM", "goog.i18n.CompactNumberFormatSymbols_be", "goog.i18n.CompactNumberFormatSymbols_be_BY", "goog.i18n.CompactNumberFormatSymbols_bem", "goog.i18n.CompactNumberFormatSymbols_bem_ZM", "goog.i18n.CompactNumberFormatSymbols_bez", "goog.i18n.CompactNumberFormatSymbols_bez_TZ", "goog.i18n.CompactNumberFormatSymbols_bm", +"goog.i18n.CompactNumberFormatSymbols_bm_ML", "goog.i18n.CompactNumberFormatSymbols_bn_IN", "goog.i18n.CompactNumberFormatSymbols_bo", "goog.i18n.CompactNumberFormatSymbols_bo_CN", "goog.i18n.CompactNumberFormatSymbols_bo_IN", "goog.i18n.CompactNumberFormatSymbols_brx", "goog.i18n.CompactNumberFormatSymbols_brx_IN", "goog.i18n.CompactNumberFormatSymbols_bs", "goog.i18n.CompactNumberFormatSymbols_bs_Cyrl", "goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA", "goog.i18n.CompactNumberFormatSymbols_bs_Latn", +"goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA", "goog.i18n.CompactNumberFormatSymbols_byn", "goog.i18n.CompactNumberFormatSymbols_byn_ER", "goog.i18n.CompactNumberFormatSymbols_cgg", "goog.i18n.CompactNumberFormatSymbols_cgg_UG", "goog.i18n.CompactNumberFormatSymbols_ckb", "goog.i18n.CompactNumberFormatSymbols_ckb_Arab", "goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IQ", "goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IR", "goog.i18n.CompactNumberFormatSymbols_ckb_IQ", "goog.i18n.CompactNumberFormatSymbols_ckb_IR", +"goog.i18n.CompactNumberFormatSymbols_ckb_Latn", "goog.i18n.CompactNumberFormatSymbols_ckb_Latn_IQ", "goog.i18n.CompactNumberFormatSymbols_dav", "goog.i18n.CompactNumberFormatSymbols_dav_KE", "goog.i18n.CompactNumberFormatSymbols_de_LI", "goog.i18n.CompactNumberFormatSymbols_dje", "goog.i18n.CompactNumberFormatSymbols_dje_NE", "goog.i18n.CompactNumberFormatSymbols_dua", "goog.i18n.CompactNumberFormatSymbols_dua_CM", "goog.i18n.CompactNumberFormatSymbols_dyo", "goog.i18n.CompactNumberFormatSymbols_dyo_SN", +"goog.i18n.CompactNumberFormatSymbols_dz", "goog.i18n.CompactNumberFormatSymbols_dz_BT", "goog.i18n.CompactNumberFormatSymbols_ebu", "goog.i18n.CompactNumberFormatSymbols_ebu_KE", "goog.i18n.CompactNumberFormatSymbols_ee", "goog.i18n.CompactNumberFormatSymbols_ee_GH", "goog.i18n.CompactNumberFormatSymbols_ee_TG", "goog.i18n.CompactNumberFormatSymbols_el_CY", "goog.i18n.CompactNumberFormatSymbols_en_150", "goog.i18n.CompactNumberFormatSymbols_en_AG", "goog.i18n.CompactNumberFormatSymbols_en_BB", "goog.i18n.CompactNumberFormatSymbols_en_BE", +"goog.i18n.CompactNumberFormatSymbols_en_BM", "goog.i18n.CompactNumberFormatSymbols_en_BS", "goog.i18n.CompactNumberFormatSymbols_en_BW", "goog.i18n.CompactNumberFormatSymbols_en_BZ", "goog.i18n.CompactNumberFormatSymbols_en_CA", "goog.i18n.CompactNumberFormatSymbols_en_CM", "goog.i18n.CompactNumberFormatSymbols_en_DM", "goog.i18n.CompactNumberFormatSymbols_en_Dsrt", "goog.i18n.CompactNumberFormatSymbols_en_FJ", "goog.i18n.CompactNumberFormatSymbols_en_GD", "goog.i18n.CompactNumberFormatSymbols_en_GG", +"goog.i18n.CompactNumberFormatSymbols_en_GH", "goog.i18n.CompactNumberFormatSymbols_en_GI", "goog.i18n.CompactNumberFormatSymbols_en_GM", "goog.i18n.CompactNumberFormatSymbols_en_GY", "goog.i18n.CompactNumberFormatSymbols_en_HK", "goog.i18n.CompactNumberFormatSymbols_en_IM", "goog.i18n.CompactNumberFormatSymbols_en_JE", "goog.i18n.CompactNumberFormatSymbols_en_JM", "goog.i18n.CompactNumberFormatSymbols_en_KE", "goog.i18n.CompactNumberFormatSymbols_en_KI", "goog.i18n.CompactNumberFormatSymbols_en_KN", +"goog.i18n.CompactNumberFormatSymbols_en_KY", "goog.i18n.CompactNumberFormatSymbols_en_LC", "goog.i18n.CompactNumberFormatSymbols_en_LR", "goog.i18n.CompactNumberFormatSymbols_en_LS", "goog.i18n.CompactNumberFormatSymbols_en_MG", "goog.i18n.CompactNumberFormatSymbols_en_MT", "goog.i18n.CompactNumberFormatSymbols_en_MU", "goog.i18n.CompactNumberFormatSymbols_en_MW", "goog.i18n.CompactNumberFormatSymbols_en_NA", "goog.i18n.CompactNumberFormatSymbols_en_NG", "goog.i18n.CompactNumberFormatSymbols_en_NZ", +"goog.i18n.CompactNumberFormatSymbols_en_PG", "goog.i18n.CompactNumberFormatSymbols_en_PH", "goog.i18n.CompactNumberFormatSymbols_en_PK", "goog.i18n.CompactNumberFormatSymbols_en_SB", "goog.i18n.CompactNumberFormatSymbols_en_SC", "goog.i18n.CompactNumberFormatSymbols_en_SL", "goog.i18n.CompactNumberFormatSymbols_en_SS", "goog.i18n.CompactNumberFormatSymbols_en_SZ", "goog.i18n.CompactNumberFormatSymbols_en_TO", "goog.i18n.CompactNumberFormatSymbols_en_TT", "goog.i18n.CompactNumberFormatSymbols_en_TZ", +"goog.i18n.CompactNumberFormatSymbols_en_UG", "goog.i18n.CompactNumberFormatSymbols_en_VC", "goog.i18n.CompactNumberFormatSymbols_en_VU", "goog.i18n.CompactNumberFormatSymbols_en_WS", "goog.i18n.CompactNumberFormatSymbols_en_ZM", "goog.i18n.CompactNumberFormatSymbols_en_ZW", "goog.i18n.CompactNumberFormatSymbols_eo", "goog.i18n.CompactNumberFormatSymbols_es_AR", "goog.i18n.CompactNumberFormatSymbols_es_BO", "goog.i18n.CompactNumberFormatSymbols_es_CL", "goog.i18n.CompactNumberFormatSymbols_es_CO", +"goog.i18n.CompactNumberFormatSymbols_es_CR", "goog.i18n.CompactNumberFormatSymbols_es_CU", "goog.i18n.CompactNumberFormatSymbols_es_DO", "goog.i18n.CompactNumberFormatSymbols_es_EC", "goog.i18n.CompactNumberFormatSymbols_es_GQ", "goog.i18n.CompactNumberFormatSymbols_es_GT", "goog.i18n.CompactNumberFormatSymbols_es_HN", "goog.i18n.CompactNumberFormatSymbols_es_MX", "goog.i18n.CompactNumberFormatSymbols_es_NI", "goog.i18n.CompactNumberFormatSymbols_es_PA", "goog.i18n.CompactNumberFormatSymbols_es_PE", +"goog.i18n.CompactNumberFormatSymbols_es_PH", "goog.i18n.CompactNumberFormatSymbols_es_PR", "goog.i18n.CompactNumberFormatSymbols_es_PY", "goog.i18n.CompactNumberFormatSymbols_es_SV", "goog.i18n.CompactNumberFormatSymbols_es_US", "goog.i18n.CompactNumberFormatSymbols_es_UY", "goog.i18n.CompactNumberFormatSymbols_es_VE", "goog.i18n.CompactNumberFormatSymbols_ewo", "goog.i18n.CompactNumberFormatSymbols_ewo_CM", "goog.i18n.CompactNumberFormatSymbols_fa_AF", "goog.i18n.CompactNumberFormatSymbols_ff", +"goog.i18n.CompactNumberFormatSymbols_ff_SN", "goog.i18n.CompactNumberFormatSymbols_fo", "goog.i18n.CompactNumberFormatSymbols_fo_FO", "goog.i18n.CompactNumberFormatSymbols_fr_BE", "goog.i18n.CompactNumberFormatSymbols_fr_BF", "goog.i18n.CompactNumberFormatSymbols_fr_BI", "goog.i18n.CompactNumberFormatSymbols_fr_BJ", "goog.i18n.CompactNumberFormatSymbols_fr_CD", "goog.i18n.CompactNumberFormatSymbols_fr_CF", "goog.i18n.CompactNumberFormatSymbols_fr_CG", "goog.i18n.CompactNumberFormatSymbols_fr_CH", +"goog.i18n.CompactNumberFormatSymbols_fr_CI", "goog.i18n.CompactNumberFormatSymbols_fr_CM", "goog.i18n.CompactNumberFormatSymbols_fr_DJ", "goog.i18n.CompactNumberFormatSymbols_fr_DZ", "goog.i18n.CompactNumberFormatSymbols_fr_GA", "goog.i18n.CompactNumberFormatSymbols_fr_GN", "goog.i18n.CompactNumberFormatSymbols_fr_GQ", "goog.i18n.CompactNumberFormatSymbols_fr_HT", "goog.i18n.CompactNumberFormatSymbols_fr_KM", "goog.i18n.CompactNumberFormatSymbols_fr_LU", "goog.i18n.CompactNumberFormatSymbols_fr_MA", +"goog.i18n.CompactNumberFormatSymbols_fr_MG", "goog.i18n.CompactNumberFormatSymbols_fr_ML", "goog.i18n.CompactNumberFormatSymbols_fr_MR", "goog.i18n.CompactNumberFormatSymbols_fr_MU", "goog.i18n.CompactNumberFormatSymbols_fr_NC", "goog.i18n.CompactNumberFormatSymbols_fr_NE", "goog.i18n.CompactNumberFormatSymbols_fr_PF", "goog.i18n.CompactNumberFormatSymbols_fr_RW", "goog.i18n.CompactNumberFormatSymbols_fr_SC", "goog.i18n.CompactNumberFormatSymbols_fr_SN", "goog.i18n.CompactNumberFormatSymbols_fr_SY", +"goog.i18n.CompactNumberFormatSymbols_fr_TD", "goog.i18n.CompactNumberFormatSymbols_fr_TG", "goog.i18n.CompactNumberFormatSymbols_fr_TN", "goog.i18n.CompactNumberFormatSymbols_fr_VU", "goog.i18n.CompactNumberFormatSymbols_fur", "goog.i18n.CompactNumberFormatSymbols_fur_IT", "goog.i18n.CompactNumberFormatSymbols_ga", "goog.i18n.CompactNumberFormatSymbols_ga_IE", "goog.i18n.CompactNumberFormatSymbols_gd", "goog.i18n.CompactNumberFormatSymbols_gd_GB", "goog.i18n.CompactNumberFormatSymbols_guz", "goog.i18n.CompactNumberFormatSymbols_guz_KE", +"goog.i18n.CompactNumberFormatSymbols_gv", "goog.i18n.CompactNumberFormatSymbols_gv_GB", "goog.i18n.CompactNumberFormatSymbols_ha", "goog.i18n.CompactNumberFormatSymbols_ha_Latn", "goog.i18n.CompactNumberFormatSymbols_ha_Latn_GH", "goog.i18n.CompactNumberFormatSymbols_ha_Latn_NE", "goog.i18n.CompactNumberFormatSymbols_ha_Latn_NG", "goog.i18n.CompactNumberFormatSymbols_hr_BA", "goog.i18n.CompactNumberFormatSymbols_hy", "goog.i18n.CompactNumberFormatSymbols_hy_AM", "goog.i18n.CompactNumberFormatSymbols_ia", +"goog.i18n.CompactNumberFormatSymbols_ia_FR", "goog.i18n.CompactNumberFormatSymbols_ig", "goog.i18n.CompactNumberFormatSymbols_ig_NG", "goog.i18n.CompactNumberFormatSymbols_ii", "goog.i18n.CompactNumberFormatSymbols_ii_CN", "goog.i18n.CompactNumberFormatSymbols_it_CH", "goog.i18n.CompactNumberFormatSymbols_jgo", "goog.i18n.CompactNumberFormatSymbols_jgo_CM", "goog.i18n.CompactNumberFormatSymbols_jmc", "goog.i18n.CompactNumberFormatSymbols_jmc_TZ", "goog.i18n.CompactNumberFormatSymbols_ka", "goog.i18n.CompactNumberFormatSymbols_ka_GE", +"goog.i18n.CompactNumberFormatSymbols_kab", "goog.i18n.CompactNumberFormatSymbols_kab_DZ", "goog.i18n.CompactNumberFormatSymbols_kam", "goog.i18n.CompactNumberFormatSymbols_kam_KE", "goog.i18n.CompactNumberFormatSymbols_kde", "goog.i18n.CompactNumberFormatSymbols_kde_TZ", "goog.i18n.CompactNumberFormatSymbols_kea", "goog.i18n.CompactNumberFormatSymbols_kea_CV", "goog.i18n.CompactNumberFormatSymbols_khq", "goog.i18n.CompactNumberFormatSymbols_khq_ML", "goog.i18n.CompactNumberFormatSymbols_ki", "goog.i18n.CompactNumberFormatSymbols_ki_KE", +"goog.i18n.CompactNumberFormatSymbols_kk", "goog.i18n.CompactNumberFormatSymbols_kk_Cyrl", "goog.i18n.CompactNumberFormatSymbols_kk_Cyrl_KZ", "goog.i18n.CompactNumberFormatSymbols_kkj", "goog.i18n.CompactNumberFormatSymbols_kkj_CM", "goog.i18n.CompactNumberFormatSymbols_kl", "goog.i18n.CompactNumberFormatSymbols_kl_GL", "goog.i18n.CompactNumberFormatSymbols_kln", "goog.i18n.CompactNumberFormatSymbols_kln_KE", "goog.i18n.CompactNumberFormatSymbols_km", "goog.i18n.CompactNumberFormatSymbols_km_KH", +"goog.i18n.CompactNumberFormatSymbols_ko_KP", "goog.i18n.CompactNumberFormatSymbols_kok", "goog.i18n.CompactNumberFormatSymbols_kok_IN", "goog.i18n.CompactNumberFormatSymbols_ks", "goog.i18n.CompactNumberFormatSymbols_ks_Arab", "goog.i18n.CompactNumberFormatSymbols_ks_Arab_IN", "goog.i18n.CompactNumberFormatSymbols_ksb", "goog.i18n.CompactNumberFormatSymbols_ksb_TZ", "goog.i18n.CompactNumberFormatSymbols_ksf", "goog.i18n.CompactNumberFormatSymbols_ksf_CM", "goog.i18n.CompactNumberFormatSymbols_ksh", +"goog.i18n.CompactNumberFormatSymbols_ksh_DE", "goog.i18n.CompactNumberFormatSymbols_kw", "goog.i18n.CompactNumberFormatSymbols_kw_GB", "goog.i18n.CompactNumberFormatSymbols_ky", "goog.i18n.CompactNumberFormatSymbols_ky_KG", "goog.i18n.CompactNumberFormatSymbols_lag", "goog.i18n.CompactNumberFormatSymbols_lag_TZ", "goog.i18n.CompactNumberFormatSymbols_lg", "goog.i18n.CompactNumberFormatSymbols_lg_UG", "goog.i18n.CompactNumberFormatSymbols_ln_AO", "goog.i18n.CompactNumberFormatSymbols_ln_CF", "goog.i18n.CompactNumberFormatSymbols_ln_CG", +"goog.i18n.CompactNumberFormatSymbols_lo", "goog.i18n.CompactNumberFormatSymbols_lo_LA", "goog.i18n.CompactNumberFormatSymbols_lu", "goog.i18n.CompactNumberFormatSymbols_lu_CD", "goog.i18n.CompactNumberFormatSymbols_luo", "goog.i18n.CompactNumberFormatSymbols_luo_KE", "goog.i18n.CompactNumberFormatSymbols_luy", "goog.i18n.CompactNumberFormatSymbols_luy_KE", "goog.i18n.CompactNumberFormatSymbols_mas", "goog.i18n.CompactNumberFormatSymbols_mas_KE", "goog.i18n.CompactNumberFormatSymbols_mas_TZ", "goog.i18n.CompactNumberFormatSymbols_mer", +"goog.i18n.CompactNumberFormatSymbols_mer_KE", "goog.i18n.CompactNumberFormatSymbols_mfe", "goog.i18n.CompactNumberFormatSymbols_mfe_MU", "goog.i18n.CompactNumberFormatSymbols_mg", "goog.i18n.CompactNumberFormatSymbols_mg_MG", "goog.i18n.CompactNumberFormatSymbols_mgh", "goog.i18n.CompactNumberFormatSymbols_mgh_MZ", "goog.i18n.CompactNumberFormatSymbols_mgo", "goog.i18n.CompactNumberFormatSymbols_mgo_CM", "goog.i18n.CompactNumberFormatSymbols_mk", "goog.i18n.CompactNumberFormatSymbols_mk_MK", "goog.i18n.CompactNumberFormatSymbols_mn", +"goog.i18n.CompactNumberFormatSymbols_mn_Cyrl", "goog.i18n.CompactNumberFormatSymbols_mn_Cyrl_MN", "goog.i18n.CompactNumberFormatSymbols_ms_Latn", "goog.i18n.CompactNumberFormatSymbols_ms_Latn_BN", "goog.i18n.CompactNumberFormatSymbols_ms_Latn_SG", "goog.i18n.CompactNumberFormatSymbols_mua", "goog.i18n.CompactNumberFormatSymbols_mua_CM", "goog.i18n.CompactNumberFormatSymbols_my", "goog.i18n.CompactNumberFormatSymbols_my_MM", "goog.i18n.CompactNumberFormatSymbols_naq", "goog.i18n.CompactNumberFormatSymbols_naq_NA", +"goog.i18n.CompactNumberFormatSymbols_nd", "goog.i18n.CompactNumberFormatSymbols_nd_ZW", "goog.i18n.CompactNumberFormatSymbols_ne", "goog.i18n.CompactNumberFormatSymbols_ne_IN", "goog.i18n.CompactNumberFormatSymbols_ne_NP", "goog.i18n.CompactNumberFormatSymbols_nl_AW", "goog.i18n.CompactNumberFormatSymbols_nl_BE", "goog.i18n.CompactNumberFormatSymbols_nl_CW", "goog.i18n.CompactNumberFormatSymbols_nl_SR", "goog.i18n.CompactNumberFormatSymbols_nl_SX", "goog.i18n.CompactNumberFormatSymbols_nmg", "goog.i18n.CompactNumberFormatSymbols_nmg_CM", +"goog.i18n.CompactNumberFormatSymbols_nn", "goog.i18n.CompactNumberFormatSymbols_nn_NO", "goog.i18n.CompactNumberFormatSymbols_nnh", "goog.i18n.CompactNumberFormatSymbols_nnh_CM", "goog.i18n.CompactNumberFormatSymbols_nr", "goog.i18n.CompactNumberFormatSymbols_nr_ZA", "goog.i18n.CompactNumberFormatSymbols_nso", "goog.i18n.CompactNumberFormatSymbols_nso_ZA", "goog.i18n.CompactNumberFormatSymbols_nus", "goog.i18n.CompactNumberFormatSymbols_nus_SD", "goog.i18n.CompactNumberFormatSymbols_nyn", "goog.i18n.CompactNumberFormatSymbols_nyn_UG", +"goog.i18n.CompactNumberFormatSymbols_om", "goog.i18n.CompactNumberFormatSymbols_om_ET", "goog.i18n.CompactNumberFormatSymbols_om_KE", "goog.i18n.CompactNumberFormatSymbols_os", "goog.i18n.CompactNumberFormatSymbols_os_GE", "goog.i18n.CompactNumberFormatSymbols_os_RU", "goog.i18n.CompactNumberFormatSymbols_pa", "goog.i18n.CompactNumberFormatSymbols_pa_Arab", "goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK", "goog.i18n.CompactNumberFormatSymbols_pa_Guru", "goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN", +"goog.i18n.CompactNumberFormatSymbols_ps", "goog.i18n.CompactNumberFormatSymbols_ps_AF", "goog.i18n.CompactNumberFormatSymbols_pt_AO", "goog.i18n.CompactNumberFormatSymbols_pt_CV", "goog.i18n.CompactNumberFormatSymbols_pt_GW", "goog.i18n.CompactNumberFormatSymbols_pt_MO", "goog.i18n.CompactNumberFormatSymbols_pt_MZ", "goog.i18n.CompactNumberFormatSymbols_pt_ST", "goog.i18n.CompactNumberFormatSymbols_pt_TL", "goog.i18n.CompactNumberFormatSymbols_rm", "goog.i18n.CompactNumberFormatSymbols_rm_CH", "goog.i18n.CompactNumberFormatSymbols_rn", +"goog.i18n.CompactNumberFormatSymbols_rn_BI", "goog.i18n.CompactNumberFormatSymbols_ro_MD", "goog.i18n.CompactNumberFormatSymbols_rof", "goog.i18n.CompactNumberFormatSymbols_rof_TZ", "goog.i18n.CompactNumberFormatSymbols_ru_BY", "goog.i18n.CompactNumberFormatSymbols_ru_KG", "goog.i18n.CompactNumberFormatSymbols_ru_KZ", "goog.i18n.CompactNumberFormatSymbols_ru_MD", "goog.i18n.CompactNumberFormatSymbols_ru_UA", "goog.i18n.CompactNumberFormatSymbols_rw", "goog.i18n.CompactNumberFormatSymbols_rw_RW", +"goog.i18n.CompactNumberFormatSymbols_rwk", "goog.i18n.CompactNumberFormatSymbols_rwk_TZ", "goog.i18n.CompactNumberFormatSymbols_sah", "goog.i18n.CompactNumberFormatSymbols_sah_RU", "goog.i18n.CompactNumberFormatSymbols_saq", "goog.i18n.CompactNumberFormatSymbols_saq_KE", "goog.i18n.CompactNumberFormatSymbols_sbp", "goog.i18n.CompactNumberFormatSymbols_sbp_TZ", "goog.i18n.CompactNumberFormatSymbols_se", "goog.i18n.CompactNumberFormatSymbols_se_FI", "goog.i18n.CompactNumberFormatSymbols_se_NO", "goog.i18n.CompactNumberFormatSymbols_seh", +"goog.i18n.CompactNumberFormatSymbols_seh_MZ", "goog.i18n.CompactNumberFormatSymbols_ses", "goog.i18n.CompactNumberFormatSymbols_ses_ML", "goog.i18n.CompactNumberFormatSymbols_sg", "goog.i18n.CompactNumberFormatSymbols_sg_CF", "goog.i18n.CompactNumberFormatSymbols_shi", "goog.i18n.CompactNumberFormatSymbols_shi_Latn", "goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA", "goog.i18n.CompactNumberFormatSymbols_shi_Tfng", "goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA", "goog.i18n.CompactNumberFormatSymbols_si", +"goog.i18n.CompactNumberFormatSymbols_si_LK", "goog.i18n.CompactNumberFormatSymbols_sn", "goog.i18n.CompactNumberFormatSymbols_sn_ZW", "goog.i18n.CompactNumberFormatSymbols_so", "goog.i18n.CompactNumberFormatSymbols_so_DJ", "goog.i18n.CompactNumberFormatSymbols_so_ET", "goog.i18n.CompactNumberFormatSymbols_so_KE", "goog.i18n.CompactNumberFormatSymbols_so_SO", "goog.i18n.CompactNumberFormatSymbols_sq_MK", "goog.i18n.CompactNumberFormatSymbols_sq_XK", "goog.i18n.CompactNumberFormatSymbols_sr_Cyrl", +"goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA", "goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME", "goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK", "goog.i18n.CompactNumberFormatSymbols_sr_Latn", "goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA", "goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME", "goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS", "goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK", "goog.i18n.CompactNumberFormatSymbols_ss", "goog.i18n.CompactNumberFormatSymbols_ss_SZ", "goog.i18n.CompactNumberFormatSymbols_ss_ZA", +"goog.i18n.CompactNumberFormatSymbols_ssy", "goog.i18n.CompactNumberFormatSymbols_ssy_ER", "goog.i18n.CompactNumberFormatSymbols_st", "goog.i18n.CompactNumberFormatSymbols_st_LS", "goog.i18n.CompactNumberFormatSymbols_st_ZA", "goog.i18n.CompactNumberFormatSymbols_sv_AX", "goog.i18n.CompactNumberFormatSymbols_sv_FI", "goog.i18n.CompactNumberFormatSymbols_sw_KE", "goog.i18n.CompactNumberFormatSymbols_sw_UG", "goog.i18n.CompactNumberFormatSymbols_swc", "goog.i18n.CompactNumberFormatSymbols_swc_CD", +"goog.i18n.CompactNumberFormatSymbols_ta_LK", "goog.i18n.CompactNumberFormatSymbols_ta_MY", "goog.i18n.CompactNumberFormatSymbols_ta_SG", "goog.i18n.CompactNumberFormatSymbols_teo", "goog.i18n.CompactNumberFormatSymbols_teo_KE", "goog.i18n.CompactNumberFormatSymbols_teo_UG", "goog.i18n.CompactNumberFormatSymbols_tg", "goog.i18n.CompactNumberFormatSymbols_tg_Cyrl", "goog.i18n.CompactNumberFormatSymbols_tg_Cyrl_TJ", "goog.i18n.CompactNumberFormatSymbols_ti", "goog.i18n.CompactNumberFormatSymbols_ti_ER", +"goog.i18n.CompactNumberFormatSymbols_ti_ET", "goog.i18n.CompactNumberFormatSymbols_tig", "goog.i18n.CompactNumberFormatSymbols_tig_ER", "goog.i18n.CompactNumberFormatSymbols_tn", "goog.i18n.CompactNumberFormatSymbols_tn_BW", "goog.i18n.CompactNumberFormatSymbols_tn_ZA", "goog.i18n.CompactNumberFormatSymbols_to", "goog.i18n.CompactNumberFormatSymbols_to_TO", "goog.i18n.CompactNumberFormatSymbols_tr_CY", "goog.i18n.CompactNumberFormatSymbols_ts", "goog.i18n.CompactNumberFormatSymbols_ts_ZA", "goog.i18n.CompactNumberFormatSymbols_twq", +"goog.i18n.CompactNumberFormatSymbols_twq_NE", "goog.i18n.CompactNumberFormatSymbols_tzm", "goog.i18n.CompactNumberFormatSymbols_tzm_Latn", "goog.i18n.CompactNumberFormatSymbols_tzm_Latn_MA", "goog.i18n.CompactNumberFormatSymbols_ur_IN", "goog.i18n.CompactNumberFormatSymbols_uz", "goog.i18n.CompactNumberFormatSymbols_uz_Arab", "goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF", "goog.i18n.CompactNumberFormatSymbols_uz_Cyrl", "goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ", "goog.i18n.CompactNumberFormatSymbols_uz_Latn", +"goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ", "goog.i18n.CompactNumberFormatSymbols_vai", "goog.i18n.CompactNumberFormatSymbols_vai_Latn", "goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR", "goog.i18n.CompactNumberFormatSymbols_vai_Vaii", "goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR", "goog.i18n.CompactNumberFormatSymbols_ve", "goog.i18n.CompactNumberFormatSymbols_ve_ZA", "goog.i18n.CompactNumberFormatSymbols_vo", "goog.i18n.CompactNumberFormatSymbols_vun", "goog.i18n.CompactNumberFormatSymbols_vun_TZ", +"goog.i18n.CompactNumberFormatSymbols_wae", "goog.i18n.CompactNumberFormatSymbols_wae_CH", "goog.i18n.CompactNumberFormatSymbols_wal", "goog.i18n.CompactNumberFormatSymbols_wal_ET", "goog.i18n.CompactNumberFormatSymbols_xh", "goog.i18n.CompactNumberFormatSymbols_xh_ZA", "goog.i18n.CompactNumberFormatSymbols_xog", "goog.i18n.CompactNumberFormatSymbols_xog_UG", "goog.i18n.CompactNumberFormatSymbols_yav", "goog.i18n.CompactNumberFormatSymbols_yav_CM", "goog.i18n.CompactNumberFormatSymbols_yo", "goog.i18n.CompactNumberFormatSymbols_yo_NG", +"goog.i18n.CompactNumberFormatSymbols_zh_Hans", "goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK", "goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO", "goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG", "goog.i18n.CompactNumberFormatSymbols_zh_Hant", "goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK", "goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO", "goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW"], []); +goog.addDependency("/closure/goog/i18n/currency.js", ["goog.i18n.currency", "goog.i18n.currency.CurrencyInfo", "goog.i18n.currency.CurrencyInfoTier2"], []); +goog.addDependency("/closure/goog/i18n/currencycodemap.js", ["goog.i18n.currencyCodeMap", "goog.i18n.currencyCodeMapTier2"], []); +goog.addDependency("/closure/goog/i18n/datetimeformat.js", ["goog.i18n.DateTimeFormat", "goog.i18n.DateTimeFormat.Format"], ["goog.asserts", "goog.i18n.DateTimeSymbols", "goog.i18n.TimeZone", "goog.string"]); +goog.addDependency("/closure/goog/i18n/datetimeparse.js", ["goog.i18n.DateTimeParse"], ["goog.i18n.DateTimeFormat", "goog.i18n.DateTimeSymbols"]); +goog.addDependency("/closure/goog/i18n/datetimepatterns.js", ["goog.i18n.DateTimePatterns", "goog.i18n.DateTimePatterns_af", "goog.i18n.DateTimePatterns_am", "goog.i18n.DateTimePatterns_ar", "goog.i18n.DateTimePatterns_bg", "goog.i18n.DateTimePatterns_bn", "goog.i18n.DateTimePatterns_br", "goog.i18n.DateTimePatterns_ca", "goog.i18n.DateTimePatterns_chr", "goog.i18n.DateTimePatterns_cs", "goog.i18n.DateTimePatterns_cy", "goog.i18n.DateTimePatterns_da", "goog.i18n.DateTimePatterns_de", "goog.i18n.DateTimePatterns_de_AT", +"goog.i18n.DateTimePatterns_de_CH", "goog.i18n.DateTimePatterns_el", "goog.i18n.DateTimePatterns_en", "goog.i18n.DateTimePatterns_en_AU", "goog.i18n.DateTimePatterns_en_GB", "goog.i18n.DateTimePatterns_en_IE", "goog.i18n.DateTimePatterns_en_IN", "goog.i18n.DateTimePatterns_en_SG", "goog.i18n.DateTimePatterns_en_US", "goog.i18n.DateTimePatterns_en_ZA", "goog.i18n.DateTimePatterns_es", "goog.i18n.DateTimePatterns_es_419", "goog.i18n.DateTimePatterns_es_ES", "goog.i18n.DateTimePatterns_et", "goog.i18n.DateTimePatterns_eu", +"goog.i18n.DateTimePatterns_fa", "goog.i18n.DateTimePatterns_fi", "goog.i18n.DateTimePatterns_fil", "goog.i18n.DateTimePatterns_fr", "goog.i18n.DateTimePatterns_fr_CA", "goog.i18n.DateTimePatterns_gl", "goog.i18n.DateTimePatterns_gsw", "goog.i18n.DateTimePatterns_gu", "goog.i18n.DateTimePatterns_haw", "goog.i18n.DateTimePatterns_he", "goog.i18n.DateTimePatterns_hi", "goog.i18n.DateTimePatterns_hr", "goog.i18n.DateTimePatterns_hu", "goog.i18n.DateTimePatterns_id", "goog.i18n.DateTimePatterns_in", +"goog.i18n.DateTimePatterns_is", "goog.i18n.DateTimePatterns_it", "goog.i18n.DateTimePatterns_iw", "goog.i18n.DateTimePatterns_ja", "goog.i18n.DateTimePatterns_kn", "goog.i18n.DateTimePatterns_ko", "goog.i18n.DateTimePatterns_ln", "goog.i18n.DateTimePatterns_lt", "goog.i18n.DateTimePatterns_lv", "goog.i18n.DateTimePatterns_ml", "goog.i18n.DateTimePatterns_mo", "goog.i18n.DateTimePatterns_mr", "goog.i18n.DateTimePatterns_ms", "goog.i18n.DateTimePatterns_mt", "goog.i18n.DateTimePatterns_nb", "goog.i18n.DateTimePatterns_nl", +"goog.i18n.DateTimePatterns_no", "goog.i18n.DateTimePatterns_or", "goog.i18n.DateTimePatterns_pl", "goog.i18n.DateTimePatterns_pt", "goog.i18n.DateTimePatterns_pt_BR", "goog.i18n.DateTimePatterns_pt_PT", "goog.i18n.DateTimePatterns_ro", "goog.i18n.DateTimePatterns_ru", "goog.i18n.DateTimePatterns_sk", "goog.i18n.DateTimePatterns_sl", "goog.i18n.DateTimePatterns_sq", "goog.i18n.DateTimePatterns_sr", "goog.i18n.DateTimePatterns_sv", "goog.i18n.DateTimePatterns_sw", "goog.i18n.DateTimePatterns_ta", +"goog.i18n.DateTimePatterns_te", "goog.i18n.DateTimePatterns_th", "goog.i18n.DateTimePatterns_tl", "goog.i18n.DateTimePatterns_tr", "goog.i18n.DateTimePatterns_uk", "goog.i18n.DateTimePatterns_ur", "goog.i18n.DateTimePatterns_vi", "goog.i18n.DateTimePatterns_zh", "goog.i18n.DateTimePatterns_zh_CN", "goog.i18n.DateTimePatterns_zh_HK", "goog.i18n.DateTimePatterns_zh_TW", "goog.i18n.DateTimePatterns_zu"], []); +goog.addDependency("/closure/goog/i18n/datetimepatternsext.js", ["goog.i18n.DateTimePatternsExt", "goog.i18n.DateTimePatterns_af_NA", "goog.i18n.DateTimePatterns_af_ZA", "goog.i18n.DateTimePatterns_agq", "goog.i18n.DateTimePatterns_agq_CM", "goog.i18n.DateTimePatterns_ak", "goog.i18n.DateTimePatterns_ak_GH", "goog.i18n.DateTimePatterns_am_ET", "goog.i18n.DateTimePatterns_ar_001", "goog.i18n.DateTimePatterns_ar_AE", "goog.i18n.DateTimePatterns_ar_BH", "goog.i18n.DateTimePatterns_ar_DJ", "goog.i18n.DateTimePatterns_ar_DZ", +"goog.i18n.DateTimePatterns_ar_EG", "goog.i18n.DateTimePatterns_ar_EH", "goog.i18n.DateTimePatterns_ar_ER", "goog.i18n.DateTimePatterns_ar_IL", "goog.i18n.DateTimePatterns_ar_IQ", "goog.i18n.DateTimePatterns_ar_JO", "goog.i18n.DateTimePatterns_ar_KM", "goog.i18n.DateTimePatterns_ar_KW", "goog.i18n.DateTimePatterns_ar_LB", "goog.i18n.DateTimePatterns_ar_LY", "goog.i18n.DateTimePatterns_ar_MA", "goog.i18n.DateTimePatterns_ar_MR", "goog.i18n.DateTimePatterns_ar_OM", "goog.i18n.DateTimePatterns_ar_PS", +"goog.i18n.DateTimePatterns_ar_QA", "goog.i18n.DateTimePatterns_ar_SA", "goog.i18n.DateTimePatterns_ar_SD", "goog.i18n.DateTimePatterns_ar_SO", "goog.i18n.DateTimePatterns_ar_SY", "goog.i18n.DateTimePatterns_ar_TD", "goog.i18n.DateTimePatterns_ar_TN", "goog.i18n.DateTimePatterns_ar_YE", "goog.i18n.DateTimePatterns_as", "goog.i18n.DateTimePatterns_as_IN", "goog.i18n.DateTimePatterns_asa", "goog.i18n.DateTimePatterns_asa_TZ", "goog.i18n.DateTimePatterns_az", "goog.i18n.DateTimePatterns_az_Cyrl", "goog.i18n.DateTimePatterns_az_Cyrl_AZ", +"goog.i18n.DateTimePatterns_az_Latn", "goog.i18n.DateTimePatterns_az_Latn_AZ", "goog.i18n.DateTimePatterns_bas", "goog.i18n.DateTimePatterns_bas_CM", "goog.i18n.DateTimePatterns_be", "goog.i18n.DateTimePatterns_be_BY", "goog.i18n.DateTimePatterns_bem", "goog.i18n.DateTimePatterns_bem_ZM", "goog.i18n.DateTimePatterns_bez", "goog.i18n.DateTimePatterns_bez_TZ", "goog.i18n.DateTimePatterns_bg_BG", "goog.i18n.DateTimePatterns_bm", "goog.i18n.DateTimePatterns_bm_ML", "goog.i18n.DateTimePatterns_bn_BD", +"goog.i18n.DateTimePatterns_bn_IN", "goog.i18n.DateTimePatterns_bo", "goog.i18n.DateTimePatterns_bo_CN", "goog.i18n.DateTimePatterns_bo_IN", "goog.i18n.DateTimePatterns_br_FR", "goog.i18n.DateTimePatterns_brx", "goog.i18n.DateTimePatterns_brx_IN", "goog.i18n.DateTimePatterns_bs", "goog.i18n.DateTimePatterns_bs_Cyrl", "goog.i18n.DateTimePatterns_bs_Cyrl_BA", "goog.i18n.DateTimePatterns_bs_Latn", "goog.i18n.DateTimePatterns_bs_Latn_BA", "goog.i18n.DateTimePatterns_ca_AD", "goog.i18n.DateTimePatterns_ca_ES", +"goog.i18n.DateTimePatterns_cgg", "goog.i18n.DateTimePatterns_cgg_UG", "goog.i18n.DateTimePatterns_chr_US", "goog.i18n.DateTimePatterns_cs_CZ", "goog.i18n.DateTimePatterns_cy_GB", "goog.i18n.DateTimePatterns_da_DK", "goog.i18n.DateTimePatterns_dav", "goog.i18n.DateTimePatterns_dav_KE", "goog.i18n.DateTimePatterns_de_BE", "goog.i18n.DateTimePatterns_de_DE", "goog.i18n.DateTimePatterns_de_LI", "goog.i18n.DateTimePatterns_de_LU", "goog.i18n.DateTimePatterns_dje", "goog.i18n.DateTimePatterns_dje_NE", +"goog.i18n.DateTimePatterns_dua", "goog.i18n.DateTimePatterns_dua_CM", "goog.i18n.DateTimePatterns_dyo", "goog.i18n.DateTimePatterns_dyo_SN", "goog.i18n.DateTimePatterns_dz", "goog.i18n.DateTimePatterns_dz_BT", "goog.i18n.DateTimePatterns_ebu", "goog.i18n.DateTimePatterns_ebu_KE", "goog.i18n.DateTimePatterns_ee", "goog.i18n.DateTimePatterns_ee_GH", "goog.i18n.DateTimePatterns_ee_TG", "goog.i18n.DateTimePatterns_el_CY", "goog.i18n.DateTimePatterns_el_GR", "goog.i18n.DateTimePatterns_en_150", "goog.i18n.DateTimePatterns_en_AG", +"goog.i18n.DateTimePatterns_en_AS", "goog.i18n.DateTimePatterns_en_BB", "goog.i18n.DateTimePatterns_en_BE", "goog.i18n.DateTimePatterns_en_BM", "goog.i18n.DateTimePatterns_en_BS", "goog.i18n.DateTimePatterns_en_BW", "goog.i18n.DateTimePatterns_en_BZ", "goog.i18n.DateTimePatterns_en_CA", "goog.i18n.DateTimePatterns_en_CM", "goog.i18n.DateTimePatterns_en_DM", "goog.i18n.DateTimePatterns_en_FJ", "goog.i18n.DateTimePatterns_en_FM", "goog.i18n.DateTimePatterns_en_GD", "goog.i18n.DateTimePatterns_en_GG", +"goog.i18n.DateTimePatterns_en_GH", "goog.i18n.DateTimePatterns_en_GI", "goog.i18n.DateTimePatterns_en_GM", "goog.i18n.DateTimePatterns_en_GU", "goog.i18n.DateTimePatterns_en_GY", "goog.i18n.DateTimePatterns_en_HK", "goog.i18n.DateTimePatterns_en_IM", "goog.i18n.DateTimePatterns_en_JE", "goog.i18n.DateTimePatterns_en_JM", "goog.i18n.DateTimePatterns_en_KE", "goog.i18n.DateTimePatterns_en_KI", "goog.i18n.DateTimePatterns_en_KN", "goog.i18n.DateTimePatterns_en_KY", "goog.i18n.DateTimePatterns_en_LC", +"goog.i18n.DateTimePatterns_en_LR", "goog.i18n.DateTimePatterns_en_LS", "goog.i18n.DateTimePatterns_en_MG", "goog.i18n.DateTimePatterns_en_MH", "goog.i18n.DateTimePatterns_en_MP", "goog.i18n.DateTimePatterns_en_MT", "goog.i18n.DateTimePatterns_en_MU", "goog.i18n.DateTimePatterns_en_MW", "goog.i18n.DateTimePatterns_en_NA", "goog.i18n.DateTimePatterns_en_NG", "goog.i18n.DateTimePatterns_en_NZ", "goog.i18n.DateTimePatterns_en_PG", "goog.i18n.DateTimePatterns_en_PH", "goog.i18n.DateTimePatterns_en_PK", +"goog.i18n.DateTimePatterns_en_PR", "goog.i18n.DateTimePatterns_en_PW", "goog.i18n.DateTimePatterns_en_SB", "goog.i18n.DateTimePatterns_en_SC", "goog.i18n.DateTimePatterns_en_SL", "goog.i18n.DateTimePatterns_en_SS", "goog.i18n.DateTimePatterns_en_SZ", "goog.i18n.DateTimePatterns_en_TC", "goog.i18n.DateTimePatterns_en_TO", "goog.i18n.DateTimePatterns_en_TT", "goog.i18n.DateTimePatterns_en_TZ", "goog.i18n.DateTimePatterns_en_UG", "goog.i18n.DateTimePatterns_en_UM", "goog.i18n.DateTimePatterns_en_US_POSIX", +"goog.i18n.DateTimePatterns_en_VC", "goog.i18n.DateTimePatterns_en_VG", "goog.i18n.DateTimePatterns_en_VI", "goog.i18n.DateTimePatterns_en_VU", "goog.i18n.DateTimePatterns_en_WS", "goog.i18n.DateTimePatterns_en_ZM", "goog.i18n.DateTimePatterns_en_ZW", "goog.i18n.DateTimePatterns_eo", "goog.i18n.DateTimePatterns_es_AR", "goog.i18n.DateTimePatterns_es_BO", "goog.i18n.DateTimePatterns_es_CL", "goog.i18n.DateTimePatterns_es_CO", "goog.i18n.DateTimePatterns_es_CR", "goog.i18n.DateTimePatterns_es_CU", +"goog.i18n.DateTimePatterns_es_DO", "goog.i18n.DateTimePatterns_es_EA", "goog.i18n.DateTimePatterns_es_EC", "goog.i18n.DateTimePatterns_es_GQ", "goog.i18n.DateTimePatterns_es_GT", "goog.i18n.DateTimePatterns_es_HN", "goog.i18n.DateTimePatterns_es_IC", "goog.i18n.DateTimePatterns_es_MX", "goog.i18n.DateTimePatterns_es_NI", "goog.i18n.DateTimePatterns_es_PA", "goog.i18n.DateTimePatterns_es_PE", "goog.i18n.DateTimePatterns_es_PH", "goog.i18n.DateTimePatterns_es_PR", "goog.i18n.DateTimePatterns_es_PY", +"goog.i18n.DateTimePatterns_es_SV", "goog.i18n.DateTimePatterns_es_US", "goog.i18n.DateTimePatterns_es_UY", "goog.i18n.DateTimePatterns_es_VE", "goog.i18n.DateTimePatterns_et_EE", "goog.i18n.DateTimePatterns_eu_ES", "goog.i18n.DateTimePatterns_ewo", "goog.i18n.DateTimePatterns_ewo_CM", "goog.i18n.DateTimePatterns_fa_AF", "goog.i18n.DateTimePatterns_fa_IR", "goog.i18n.DateTimePatterns_ff", "goog.i18n.DateTimePatterns_ff_SN", "goog.i18n.DateTimePatterns_fi_FI", "goog.i18n.DateTimePatterns_fil_PH", +"goog.i18n.DateTimePatterns_fo", "goog.i18n.DateTimePatterns_fo_FO", "goog.i18n.DateTimePatterns_fr_BE", "goog.i18n.DateTimePatterns_fr_BF", "goog.i18n.DateTimePatterns_fr_BI", "goog.i18n.DateTimePatterns_fr_BJ", "goog.i18n.DateTimePatterns_fr_BL", "goog.i18n.DateTimePatterns_fr_CD", "goog.i18n.DateTimePatterns_fr_CF", "goog.i18n.DateTimePatterns_fr_CG", "goog.i18n.DateTimePatterns_fr_CH", "goog.i18n.DateTimePatterns_fr_CI", "goog.i18n.DateTimePatterns_fr_CM", "goog.i18n.DateTimePatterns_fr_DJ", +"goog.i18n.DateTimePatterns_fr_DZ", "goog.i18n.DateTimePatterns_fr_FR", "goog.i18n.DateTimePatterns_fr_GA", "goog.i18n.DateTimePatterns_fr_GF", "goog.i18n.DateTimePatterns_fr_GN", "goog.i18n.DateTimePatterns_fr_GP", "goog.i18n.DateTimePatterns_fr_GQ", "goog.i18n.DateTimePatterns_fr_HT", "goog.i18n.DateTimePatterns_fr_KM", "goog.i18n.DateTimePatterns_fr_LU", "goog.i18n.DateTimePatterns_fr_MA", "goog.i18n.DateTimePatterns_fr_MC", "goog.i18n.DateTimePatterns_fr_MF", "goog.i18n.DateTimePatterns_fr_MG", +"goog.i18n.DateTimePatterns_fr_ML", "goog.i18n.DateTimePatterns_fr_MQ", "goog.i18n.DateTimePatterns_fr_MR", "goog.i18n.DateTimePatterns_fr_MU", "goog.i18n.DateTimePatterns_fr_NC", "goog.i18n.DateTimePatterns_fr_NE", "goog.i18n.DateTimePatterns_fr_PF", "goog.i18n.DateTimePatterns_fr_RE", "goog.i18n.DateTimePatterns_fr_RW", "goog.i18n.DateTimePatterns_fr_SC", "goog.i18n.DateTimePatterns_fr_SN", "goog.i18n.DateTimePatterns_fr_SY", "goog.i18n.DateTimePatterns_fr_TD", "goog.i18n.DateTimePatterns_fr_TG", +"goog.i18n.DateTimePatterns_fr_TN", "goog.i18n.DateTimePatterns_fr_VU", "goog.i18n.DateTimePatterns_fr_YT", "goog.i18n.DateTimePatterns_ga", "goog.i18n.DateTimePatterns_ga_IE", "goog.i18n.DateTimePatterns_gl_ES", "goog.i18n.DateTimePatterns_gsw_CH", "goog.i18n.DateTimePatterns_gu_IN", "goog.i18n.DateTimePatterns_guz", "goog.i18n.DateTimePatterns_guz_KE", "goog.i18n.DateTimePatterns_gv", "goog.i18n.DateTimePatterns_gv_GB", "goog.i18n.DateTimePatterns_ha", "goog.i18n.DateTimePatterns_ha_Latn", "goog.i18n.DateTimePatterns_ha_Latn_GH", +"goog.i18n.DateTimePatterns_ha_Latn_NE", "goog.i18n.DateTimePatterns_ha_Latn_NG", "goog.i18n.DateTimePatterns_haw_US", "goog.i18n.DateTimePatterns_he_IL", "goog.i18n.DateTimePatterns_hi_IN", "goog.i18n.DateTimePatterns_hr_BA", "goog.i18n.DateTimePatterns_hr_HR", "goog.i18n.DateTimePatterns_hu_HU", "goog.i18n.DateTimePatterns_hy", "goog.i18n.DateTimePatterns_hy_AM", "goog.i18n.DateTimePatterns_id_ID", "goog.i18n.DateTimePatterns_ig", "goog.i18n.DateTimePatterns_ig_NG", "goog.i18n.DateTimePatterns_ii", +"goog.i18n.DateTimePatterns_ii_CN", "goog.i18n.DateTimePatterns_is_IS", "goog.i18n.DateTimePatterns_it_CH", "goog.i18n.DateTimePatterns_it_IT", "goog.i18n.DateTimePatterns_it_SM", "goog.i18n.DateTimePatterns_ja_JP", "goog.i18n.DateTimePatterns_jgo", "goog.i18n.DateTimePatterns_jgo_CM", "goog.i18n.DateTimePatterns_jmc", "goog.i18n.DateTimePatterns_jmc_TZ", "goog.i18n.DateTimePatterns_ka", "goog.i18n.DateTimePatterns_ka_GE", "goog.i18n.DateTimePatterns_kab", "goog.i18n.DateTimePatterns_kab_DZ", "goog.i18n.DateTimePatterns_kam", +"goog.i18n.DateTimePatterns_kam_KE", "goog.i18n.DateTimePatterns_kde", "goog.i18n.DateTimePatterns_kde_TZ", "goog.i18n.DateTimePatterns_kea", "goog.i18n.DateTimePatterns_kea_CV", "goog.i18n.DateTimePatterns_khq", "goog.i18n.DateTimePatterns_khq_ML", "goog.i18n.DateTimePatterns_ki", "goog.i18n.DateTimePatterns_ki_KE", "goog.i18n.DateTimePatterns_kk", "goog.i18n.DateTimePatterns_kk_Cyrl", "goog.i18n.DateTimePatterns_kk_Cyrl_KZ", "goog.i18n.DateTimePatterns_kl", "goog.i18n.DateTimePatterns_kl_GL", "goog.i18n.DateTimePatterns_kln", +"goog.i18n.DateTimePatterns_kln_KE", "goog.i18n.DateTimePatterns_km", "goog.i18n.DateTimePatterns_km_KH", "goog.i18n.DateTimePatterns_kn_IN", "goog.i18n.DateTimePatterns_ko_KP", "goog.i18n.DateTimePatterns_ko_KR", "goog.i18n.DateTimePatterns_kok", "goog.i18n.DateTimePatterns_kok_IN", "goog.i18n.DateTimePatterns_ks", "goog.i18n.DateTimePatterns_ks_Arab", "goog.i18n.DateTimePatterns_ks_Arab_IN", "goog.i18n.DateTimePatterns_ksb", "goog.i18n.DateTimePatterns_ksb_TZ", "goog.i18n.DateTimePatterns_ksf", +"goog.i18n.DateTimePatterns_ksf_CM", "goog.i18n.DateTimePatterns_kw", "goog.i18n.DateTimePatterns_kw_GB", "goog.i18n.DateTimePatterns_lag", "goog.i18n.DateTimePatterns_lag_TZ", "goog.i18n.DateTimePatterns_lg", "goog.i18n.DateTimePatterns_lg_UG", "goog.i18n.DateTimePatterns_ln_AO", "goog.i18n.DateTimePatterns_ln_CD", "goog.i18n.DateTimePatterns_ln_CF", "goog.i18n.DateTimePatterns_ln_CG", "goog.i18n.DateTimePatterns_lo", "goog.i18n.DateTimePatterns_lo_LA", "goog.i18n.DateTimePatterns_lt_LT", "goog.i18n.DateTimePatterns_lu", +"goog.i18n.DateTimePatterns_lu_CD", "goog.i18n.DateTimePatterns_luo", "goog.i18n.DateTimePatterns_luo_KE", "goog.i18n.DateTimePatterns_luy", "goog.i18n.DateTimePatterns_luy_KE", "goog.i18n.DateTimePatterns_lv_LV", "goog.i18n.DateTimePatterns_mas", "goog.i18n.DateTimePatterns_mas_KE", "goog.i18n.DateTimePatterns_mas_TZ", "goog.i18n.DateTimePatterns_mer", "goog.i18n.DateTimePatterns_mer_KE", "goog.i18n.DateTimePatterns_mfe", "goog.i18n.DateTimePatterns_mfe_MU", "goog.i18n.DateTimePatterns_mg", "goog.i18n.DateTimePatterns_mg_MG", +"goog.i18n.DateTimePatterns_mgh", "goog.i18n.DateTimePatterns_mgh_MZ", "goog.i18n.DateTimePatterns_mgo", "goog.i18n.DateTimePatterns_mgo_CM", "goog.i18n.DateTimePatterns_mk", "goog.i18n.DateTimePatterns_mk_MK", "goog.i18n.DateTimePatterns_ml_IN", "goog.i18n.DateTimePatterns_mn", "goog.i18n.DateTimePatterns_mn_Cyrl", "goog.i18n.DateTimePatterns_mn_Cyrl_MN", "goog.i18n.DateTimePatterns_mr_IN", "goog.i18n.DateTimePatterns_ms_Latn", "goog.i18n.DateTimePatterns_ms_Latn_BN", "goog.i18n.DateTimePatterns_ms_Latn_MY", +"goog.i18n.DateTimePatterns_ms_Latn_SG", "goog.i18n.DateTimePatterns_mt_MT", "goog.i18n.DateTimePatterns_mua", "goog.i18n.DateTimePatterns_mua_CM", "goog.i18n.DateTimePatterns_my", "goog.i18n.DateTimePatterns_my_MM", "goog.i18n.DateTimePatterns_naq", "goog.i18n.DateTimePatterns_naq_NA", "goog.i18n.DateTimePatterns_nb_NO", "goog.i18n.DateTimePatterns_nd", "goog.i18n.DateTimePatterns_nd_ZW", "goog.i18n.DateTimePatterns_ne", "goog.i18n.DateTimePatterns_ne_IN", "goog.i18n.DateTimePatterns_ne_NP", "goog.i18n.DateTimePatterns_nl_AW", +"goog.i18n.DateTimePatterns_nl_BE", "goog.i18n.DateTimePatterns_nl_CW", "goog.i18n.DateTimePatterns_nl_NL", "goog.i18n.DateTimePatterns_nl_SR", "goog.i18n.DateTimePatterns_nl_SX", "goog.i18n.DateTimePatterns_nmg", "goog.i18n.DateTimePatterns_nmg_CM", "goog.i18n.DateTimePatterns_nn", "goog.i18n.DateTimePatterns_nn_NO", "goog.i18n.DateTimePatterns_nus", "goog.i18n.DateTimePatterns_nus_SD", "goog.i18n.DateTimePatterns_nyn", "goog.i18n.DateTimePatterns_nyn_UG", "goog.i18n.DateTimePatterns_om", "goog.i18n.DateTimePatterns_om_ET", +"goog.i18n.DateTimePatterns_om_KE", "goog.i18n.DateTimePatterns_or_IN", "goog.i18n.DateTimePatterns_pa", "goog.i18n.DateTimePatterns_pa_Arab", "goog.i18n.DateTimePatterns_pa_Arab_PK", "goog.i18n.DateTimePatterns_pa_Guru", "goog.i18n.DateTimePatterns_pa_Guru_IN", "goog.i18n.DateTimePatterns_pl_PL", "goog.i18n.DateTimePatterns_ps", "goog.i18n.DateTimePatterns_ps_AF", "goog.i18n.DateTimePatterns_pt_AO", "goog.i18n.DateTimePatterns_pt_CV", "goog.i18n.DateTimePatterns_pt_GW", "goog.i18n.DateTimePatterns_pt_MO", +"goog.i18n.DateTimePatterns_pt_MZ", "goog.i18n.DateTimePatterns_pt_ST", "goog.i18n.DateTimePatterns_pt_TL", "goog.i18n.DateTimePatterns_rm", "goog.i18n.DateTimePatterns_rm_CH", "goog.i18n.DateTimePatterns_rn", "goog.i18n.DateTimePatterns_rn_BI", "goog.i18n.DateTimePatterns_ro_MD", "goog.i18n.DateTimePatterns_ro_RO", "goog.i18n.DateTimePatterns_rof", "goog.i18n.DateTimePatterns_rof_TZ", "goog.i18n.DateTimePatterns_ru_BY", "goog.i18n.DateTimePatterns_ru_KG", "goog.i18n.DateTimePatterns_ru_KZ", "goog.i18n.DateTimePatterns_ru_MD", +"goog.i18n.DateTimePatterns_ru_RU", "goog.i18n.DateTimePatterns_ru_UA", "goog.i18n.DateTimePatterns_rw", "goog.i18n.DateTimePatterns_rw_RW", "goog.i18n.DateTimePatterns_rwk", "goog.i18n.DateTimePatterns_rwk_TZ", "goog.i18n.DateTimePatterns_saq", "goog.i18n.DateTimePatterns_saq_KE", "goog.i18n.DateTimePatterns_sbp", "goog.i18n.DateTimePatterns_sbp_TZ", "goog.i18n.DateTimePatterns_seh", "goog.i18n.DateTimePatterns_seh_MZ", "goog.i18n.DateTimePatterns_ses", "goog.i18n.DateTimePatterns_ses_ML", "goog.i18n.DateTimePatterns_sg", +"goog.i18n.DateTimePatterns_sg_CF", "goog.i18n.DateTimePatterns_shi", "goog.i18n.DateTimePatterns_shi_Latn", "goog.i18n.DateTimePatterns_shi_Latn_MA", "goog.i18n.DateTimePatterns_shi_Tfng", "goog.i18n.DateTimePatterns_shi_Tfng_MA", "goog.i18n.DateTimePatterns_si", "goog.i18n.DateTimePatterns_si_LK", "goog.i18n.DateTimePatterns_sk_SK", "goog.i18n.DateTimePatterns_sl_SI", "goog.i18n.DateTimePatterns_sn", "goog.i18n.DateTimePatterns_sn_ZW", "goog.i18n.DateTimePatterns_so", "goog.i18n.DateTimePatterns_so_DJ", +"goog.i18n.DateTimePatterns_so_ET", "goog.i18n.DateTimePatterns_so_KE", "goog.i18n.DateTimePatterns_so_SO", "goog.i18n.DateTimePatterns_sq_AL", "goog.i18n.DateTimePatterns_sq_MK", "goog.i18n.DateTimePatterns_sr_Cyrl", "goog.i18n.DateTimePatterns_sr_Cyrl_BA", "goog.i18n.DateTimePatterns_sr_Cyrl_ME", "goog.i18n.DateTimePatterns_sr_Cyrl_RS", "goog.i18n.DateTimePatterns_sr_Latn", "goog.i18n.DateTimePatterns_sr_Latn_BA", "goog.i18n.DateTimePatterns_sr_Latn_ME", "goog.i18n.DateTimePatterns_sr_Latn_RS", +"goog.i18n.DateTimePatterns_sv_AX", "goog.i18n.DateTimePatterns_sv_FI", "goog.i18n.DateTimePatterns_sv_SE", "goog.i18n.DateTimePatterns_sw_KE", "goog.i18n.DateTimePatterns_sw_TZ", "goog.i18n.DateTimePatterns_sw_UG", "goog.i18n.DateTimePatterns_swc", "goog.i18n.DateTimePatterns_swc_CD", "goog.i18n.DateTimePatterns_ta_IN", "goog.i18n.DateTimePatterns_ta_LK", "goog.i18n.DateTimePatterns_ta_MY", "goog.i18n.DateTimePatterns_ta_SG", "goog.i18n.DateTimePatterns_te_IN", "goog.i18n.DateTimePatterns_teo", +"goog.i18n.DateTimePatterns_teo_KE", "goog.i18n.DateTimePatterns_teo_UG", "goog.i18n.DateTimePatterns_th_TH", "goog.i18n.DateTimePatterns_ti", "goog.i18n.DateTimePatterns_ti_ER", "goog.i18n.DateTimePatterns_ti_ET", "goog.i18n.DateTimePatterns_to", "goog.i18n.DateTimePatterns_to_TO", "goog.i18n.DateTimePatterns_tr_CY", "goog.i18n.DateTimePatterns_tr_TR", "goog.i18n.DateTimePatterns_twq", "goog.i18n.DateTimePatterns_twq_NE", "goog.i18n.DateTimePatterns_tzm", "goog.i18n.DateTimePatterns_tzm_Latn", "goog.i18n.DateTimePatterns_tzm_Latn_MA", +"goog.i18n.DateTimePatterns_uk_UA", "goog.i18n.DateTimePatterns_ur_IN", "goog.i18n.DateTimePatterns_ur_PK", "goog.i18n.DateTimePatterns_uz", "goog.i18n.DateTimePatterns_uz_Arab", "goog.i18n.DateTimePatterns_uz_Arab_AF", "goog.i18n.DateTimePatterns_uz_Cyrl", "goog.i18n.DateTimePatterns_uz_Cyrl_UZ", "goog.i18n.DateTimePatterns_uz_Latn", "goog.i18n.DateTimePatterns_uz_Latn_UZ", "goog.i18n.DateTimePatterns_vai", "goog.i18n.DateTimePatterns_vai_Latn", "goog.i18n.DateTimePatterns_vai_Latn_LR", "goog.i18n.DateTimePatterns_vai_Vaii", +"goog.i18n.DateTimePatterns_vai_Vaii_LR", "goog.i18n.DateTimePatterns_vi_VN", "goog.i18n.DateTimePatterns_vun", "goog.i18n.DateTimePatterns_vun_TZ", "goog.i18n.DateTimePatterns_xog", "goog.i18n.DateTimePatterns_xog_UG", "goog.i18n.DateTimePatterns_yav", "goog.i18n.DateTimePatterns_yav_CM", "goog.i18n.DateTimePatterns_yo", "goog.i18n.DateTimePatterns_yo_NG", "goog.i18n.DateTimePatterns_zh_Hans", "goog.i18n.DateTimePatterns_zh_Hans_CN", "goog.i18n.DateTimePatterns_zh_Hans_HK", "goog.i18n.DateTimePatterns_zh_Hans_MO", +"goog.i18n.DateTimePatterns_zh_Hans_SG", "goog.i18n.DateTimePatterns_zh_Hant", "goog.i18n.DateTimePatterns_zh_Hant_HK", "goog.i18n.DateTimePatterns_zh_Hant_MO", "goog.i18n.DateTimePatterns_zh_Hant_TW", "goog.i18n.DateTimePatterns_zu_ZA"], ["goog.i18n.DateTimePatterns"]); +goog.addDependency("/closure/goog/i18n/datetimesymbols.js", ["goog.i18n.DateTimeSymbols", "goog.i18n.DateTimeSymbols_af", "goog.i18n.DateTimeSymbols_am", "goog.i18n.DateTimeSymbols_ar", "goog.i18n.DateTimeSymbols_bg", "goog.i18n.DateTimeSymbols_bn", "goog.i18n.DateTimeSymbols_br", "goog.i18n.DateTimeSymbols_ca", "goog.i18n.DateTimeSymbols_chr", "goog.i18n.DateTimeSymbols_cs", "goog.i18n.DateTimeSymbols_cy", "goog.i18n.DateTimeSymbols_da", "goog.i18n.DateTimeSymbols_de", "goog.i18n.DateTimeSymbols_de_AT", +"goog.i18n.DateTimeSymbols_de_CH", "goog.i18n.DateTimeSymbols_el", "goog.i18n.DateTimeSymbols_en", "goog.i18n.DateTimeSymbols_en_AU", "goog.i18n.DateTimeSymbols_en_GB", "goog.i18n.DateTimeSymbols_en_IE", "goog.i18n.DateTimeSymbols_en_IN", "goog.i18n.DateTimeSymbols_en_ISO", "goog.i18n.DateTimeSymbols_en_SG", "goog.i18n.DateTimeSymbols_en_US", "goog.i18n.DateTimeSymbols_en_ZA", "goog.i18n.DateTimeSymbols_es", "goog.i18n.DateTimeSymbols_es_419", "goog.i18n.DateTimeSymbols_es_ES", "goog.i18n.DateTimeSymbols_et", +"goog.i18n.DateTimeSymbols_eu", "goog.i18n.DateTimeSymbols_fa", "goog.i18n.DateTimeSymbols_fi", "goog.i18n.DateTimeSymbols_fil", "goog.i18n.DateTimeSymbols_fr", "goog.i18n.DateTimeSymbols_fr_CA", "goog.i18n.DateTimeSymbols_gl", "goog.i18n.DateTimeSymbols_gsw", "goog.i18n.DateTimeSymbols_gu", "goog.i18n.DateTimeSymbols_haw", "goog.i18n.DateTimeSymbols_he", "goog.i18n.DateTimeSymbols_hi", "goog.i18n.DateTimeSymbols_hr", "goog.i18n.DateTimeSymbols_hu", "goog.i18n.DateTimeSymbols_id", "goog.i18n.DateTimeSymbols_in", +"goog.i18n.DateTimeSymbols_is", "goog.i18n.DateTimeSymbols_it", "goog.i18n.DateTimeSymbols_iw", "goog.i18n.DateTimeSymbols_ja", "goog.i18n.DateTimeSymbols_kn", "goog.i18n.DateTimeSymbols_ko", "goog.i18n.DateTimeSymbols_ln", "goog.i18n.DateTimeSymbols_lt", "goog.i18n.DateTimeSymbols_lv", "goog.i18n.DateTimeSymbols_ml", "goog.i18n.DateTimeSymbols_mr", "goog.i18n.DateTimeSymbols_ms", "goog.i18n.DateTimeSymbols_mt", "goog.i18n.DateTimeSymbols_nb", "goog.i18n.DateTimeSymbols_nl", "goog.i18n.DateTimeSymbols_no", +"goog.i18n.DateTimeSymbols_or", "goog.i18n.DateTimeSymbols_pl", "goog.i18n.DateTimeSymbols_pt", "goog.i18n.DateTimeSymbols_pt_BR", "goog.i18n.DateTimeSymbols_pt_PT", "goog.i18n.DateTimeSymbols_ro", "goog.i18n.DateTimeSymbols_ru", "goog.i18n.DateTimeSymbols_sk", "goog.i18n.DateTimeSymbols_sl", "goog.i18n.DateTimeSymbols_sq", "goog.i18n.DateTimeSymbols_sr", "goog.i18n.DateTimeSymbols_sv", "goog.i18n.DateTimeSymbols_sw", "goog.i18n.DateTimeSymbols_ta", "goog.i18n.DateTimeSymbols_te", "goog.i18n.DateTimeSymbols_th", +"goog.i18n.DateTimeSymbols_tl", "goog.i18n.DateTimeSymbols_tr", "goog.i18n.DateTimeSymbols_uk", "goog.i18n.DateTimeSymbols_ur", "goog.i18n.DateTimeSymbols_vi", "goog.i18n.DateTimeSymbols_zh", "goog.i18n.DateTimeSymbols_zh_CN", "goog.i18n.DateTimeSymbols_zh_HK", "goog.i18n.DateTimeSymbols_zh_TW", "goog.i18n.DateTimeSymbols_zu"], []); +goog.addDependency("/closure/goog/i18n/datetimesymbolsext.js", ["goog.i18n.DateTimeSymbolsExt", "goog.i18n.DateTimeSymbols_aa", "goog.i18n.DateTimeSymbols_aa_DJ", "goog.i18n.DateTimeSymbols_aa_ER", "goog.i18n.DateTimeSymbols_aa_ET", "goog.i18n.DateTimeSymbols_af_NA", "goog.i18n.DateTimeSymbols_af_ZA", "goog.i18n.DateTimeSymbols_agq", "goog.i18n.DateTimeSymbols_agq_CM", "goog.i18n.DateTimeSymbols_ak", "goog.i18n.DateTimeSymbols_ak_GH", "goog.i18n.DateTimeSymbols_am_ET", "goog.i18n.DateTimeSymbols_ar_001", +"goog.i18n.DateTimeSymbols_ar_AE", "goog.i18n.DateTimeSymbols_ar_BH", "goog.i18n.DateTimeSymbols_ar_DJ", "goog.i18n.DateTimeSymbols_ar_DZ", "goog.i18n.DateTimeSymbols_ar_EG", "goog.i18n.DateTimeSymbols_ar_EH", "goog.i18n.DateTimeSymbols_ar_ER", "goog.i18n.DateTimeSymbols_ar_IL", "goog.i18n.DateTimeSymbols_ar_IQ", "goog.i18n.DateTimeSymbols_ar_JO", "goog.i18n.DateTimeSymbols_ar_KM", "goog.i18n.DateTimeSymbols_ar_KW", "goog.i18n.DateTimeSymbols_ar_LB", "goog.i18n.DateTimeSymbols_ar_LY", "goog.i18n.DateTimeSymbols_ar_MA", +"goog.i18n.DateTimeSymbols_ar_MR", "goog.i18n.DateTimeSymbols_ar_OM", "goog.i18n.DateTimeSymbols_ar_PS", "goog.i18n.DateTimeSymbols_ar_QA", "goog.i18n.DateTimeSymbols_ar_SA", "goog.i18n.DateTimeSymbols_ar_SD", "goog.i18n.DateTimeSymbols_ar_SO", "goog.i18n.DateTimeSymbols_ar_SY", "goog.i18n.DateTimeSymbols_ar_TD", "goog.i18n.DateTimeSymbols_ar_TN", "goog.i18n.DateTimeSymbols_ar_YE", "goog.i18n.DateTimeSymbols_as", "goog.i18n.DateTimeSymbols_as_IN", "goog.i18n.DateTimeSymbols_asa", "goog.i18n.DateTimeSymbols_asa_TZ", +"goog.i18n.DateTimeSymbols_ast", "goog.i18n.DateTimeSymbols_ast_ES", "goog.i18n.DateTimeSymbols_az", "goog.i18n.DateTimeSymbols_az_Cyrl", "goog.i18n.DateTimeSymbols_az_Cyrl_AZ", "goog.i18n.DateTimeSymbols_az_Latn", "goog.i18n.DateTimeSymbols_az_Latn_AZ", "goog.i18n.DateTimeSymbols_bas", "goog.i18n.DateTimeSymbols_bas_CM", "goog.i18n.DateTimeSymbols_be", "goog.i18n.DateTimeSymbols_be_BY", "goog.i18n.DateTimeSymbols_bem", "goog.i18n.DateTimeSymbols_bem_ZM", "goog.i18n.DateTimeSymbols_bez", "goog.i18n.DateTimeSymbols_bez_TZ", +"goog.i18n.DateTimeSymbols_bg_BG", "goog.i18n.DateTimeSymbols_bm", "goog.i18n.DateTimeSymbols_bm_ML", "goog.i18n.DateTimeSymbols_bn_BD", "goog.i18n.DateTimeSymbols_bn_IN", "goog.i18n.DateTimeSymbols_bo", "goog.i18n.DateTimeSymbols_bo_CN", "goog.i18n.DateTimeSymbols_bo_IN", "goog.i18n.DateTimeSymbols_br_FR", "goog.i18n.DateTimeSymbols_brx", "goog.i18n.DateTimeSymbols_brx_IN", "goog.i18n.DateTimeSymbols_bs", "goog.i18n.DateTimeSymbols_bs_Cyrl", "goog.i18n.DateTimeSymbols_bs_Cyrl_BA", "goog.i18n.DateTimeSymbols_bs_Latn", +"goog.i18n.DateTimeSymbols_bs_Latn_BA", "goog.i18n.DateTimeSymbols_byn", "goog.i18n.DateTimeSymbols_byn_ER", "goog.i18n.DateTimeSymbols_ca_AD", "goog.i18n.DateTimeSymbols_ca_ES", "goog.i18n.DateTimeSymbols_cgg", "goog.i18n.DateTimeSymbols_cgg_UG", "goog.i18n.DateTimeSymbols_chr_US", "goog.i18n.DateTimeSymbols_ckb", "goog.i18n.DateTimeSymbols_ckb_Arab", "goog.i18n.DateTimeSymbols_ckb_Arab_IQ", "goog.i18n.DateTimeSymbols_ckb_Arab_IR", "goog.i18n.DateTimeSymbols_ckb_IQ", "goog.i18n.DateTimeSymbols_ckb_IR", +"goog.i18n.DateTimeSymbols_ckb_Latn", "goog.i18n.DateTimeSymbols_ckb_Latn_IQ", "goog.i18n.DateTimeSymbols_cs_CZ", "goog.i18n.DateTimeSymbols_cy_GB", "goog.i18n.DateTimeSymbols_da_DK", "goog.i18n.DateTimeSymbols_dav", "goog.i18n.DateTimeSymbols_dav_KE", "goog.i18n.DateTimeSymbols_de_BE", "goog.i18n.DateTimeSymbols_de_DE", "goog.i18n.DateTimeSymbols_de_LI", "goog.i18n.DateTimeSymbols_de_LU", "goog.i18n.DateTimeSymbols_dje", "goog.i18n.DateTimeSymbols_dje_NE", "goog.i18n.DateTimeSymbols_dua", "goog.i18n.DateTimeSymbols_dua_CM", +"goog.i18n.DateTimeSymbols_dyo", "goog.i18n.DateTimeSymbols_dyo_SN", "goog.i18n.DateTimeSymbols_dz", "goog.i18n.DateTimeSymbols_dz_BT", "goog.i18n.DateTimeSymbols_ebu", "goog.i18n.DateTimeSymbols_ebu_KE", "goog.i18n.DateTimeSymbols_ee", "goog.i18n.DateTimeSymbols_ee_GH", "goog.i18n.DateTimeSymbols_ee_TG", "goog.i18n.DateTimeSymbols_el_CY", "goog.i18n.DateTimeSymbols_el_GR", "goog.i18n.DateTimeSymbols_en_150", "goog.i18n.DateTimeSymbols_en_AG", "goog.i18n.DateTimeSymbols_en_AS", "goog.i18n.DateTimeSymbols_en_BB", +"goog.i18n.DateTimeSymbols_en_BE", "goog.i18n.DateTimeSymbols_en_BM", "goog.i18n.DateTimeSymbols_en_BS", "goog.i18n.DateTimeSymbols_en_BW", "goog.i18n.DateTimeSymbols_en_BZ", "goog.i18n.DateTimeSymbols_en_CA", "goog.i18n.DateTimeSymbols_en_CM", "goog.i18n.DateTimeSymbols_en_DM", "goog.i18n.DateTimeSymbols_en_Dsrt", "goog.i18n.DateTimeSymbols_en_Dsrt_US", "goog.i18n.DateTimeSymbols_en_FJ", "goog.i18n.DateTimeSymbols_en_FM", "goog.i18n.DateTimeSymbols_en_GD", "goog.i18n.DateTimeSymbols_en_GG", "goog.i18n.DateTimeSymbols_en_GH", +"goog.i18n.DateTimeSymbols_en_GI", "goog.i18n.DateTimeSymbols_en_GM", "goog.i18n.DateTimeSymbols_en_GU", "goog.i18n.DateTimeSymbols_en_GY", "goog.i18n.DateTimeSymbols_en_HK", "goog.i18n.DateTimeSymbols_en_IM", "goog.i18n.DateTimeSymbols_en_JE", "goog.i18n.DateTimeSymbols_en_JM", "goog.i18n.DateTimeSymbols_en_KE", "goog.i18n.DateTimeSymbols_en_KI", "goog.i18n.DateTimeSymbols_en_KN", "goog.i18n.DateTimeSymbols_en_KY", "goog.i18n.DateTimeSymbols_en_LC", "goog.i18n.DateTimeSymbols_en_LR", "goog.i18n.DateTimeSymbols_en_LS", +"goog.i18n.DateTimeSymbols_en_MG", "goog.i18n.DateTimeSymbols_en_MH", "goog.i18n.DateTimeSymbols_en_MP", "goog.i18n.DateTimeSymbols_en_MT", "goog.i18n.DateTimeSymbols_en_MU", "goog.i18n.DateTimeSymbols_en_MW", "goog.i18n.DateTimeSymbols_en_NA", "goog.i18n.DateTimeSymbols_en_NG", "goog.i18n.DateTimeSymbols_en_NZ", "goog.i18n.DateTimeSymbols_en_PG", "goog.i18n.DateTimeSymbols_en_PH", "goog.i18n.DateTimeSymbols_en_PK", "goog.i18n.DateTimeSymbols_en_PR", "goog.i18n.DateTimeSymbols_en_PW", "goog.i18n.DateTimeSymbols_en_SB", +"goog.i18n.DateTimeSymbols_en_SC", "goog.i18n.DateTimeSymbols_en_SL", "goog.i18n.DateTimeSymbols_en_SS", "goog.i18n.DateTimeSymbols_en_SZ", "goog.i18n.DateTimeSymbols_en_TC", "goog.i18n.DateTimeSymbols_en_TO", "goog.i18n.DateTimeSymbols_en_TT", "goog.i18n.DateTimeSymbols_en_TZ", "goog.i18n.DateTimeSymbols_en_UG", "goog.i18n.DateTimeSymbols_en_UM", "goog.i18n.DateTimeSymbols_en_VC", "goog.i18n.DateTimeSymbols_en_VG", "goog.i18n.DateTimeSymbols_en_VI", "goog.i18n.DateTimeSymbols_en_VU", "goog.i18n.DateTimeSymbols_en_WS", +"goog.i18n.DateTimeSymbols_en_ZM", "goog.i18n.DateTimeSymbols_en_ZW", "goog.i18n.DateTimeSymbols_eo", "goog.i18n.DateTimeSymbols_es_AR", "goog.i18n.DateTimeSymbols_es_BO", "goog.i18n.DateTimeSymbols_es_CL", "goog.i18n.DateTimeSymbols_es_CO", "goog.i18n.DateTimeSymbols_es_CR", "goog.i18n.DateTimeSymbols_es_CU", "goog.i18n.DateTimeSymbols_es_DO", "goog.i18n.DateTimeSymbols_es_EA", "goog.i18n.DateTimeSymbols_es_EC", "goog.i18n.DateTimeSymbols_es_GQ", "goog.i18n.DateTimeSymbols_es_GT", "goog.i18n.DateTimeSymbols_es_HN", +"goog.i18n.DateTimeSymbols_es_IC", "goog.i18n.DateTimeSymbols_es_MX", "goog.i18n.DateTimeSymbols_es_NI", "goog.i18n.DateTimeSymbols_es_PA", "goog.i18n.DateTimeSymbols_es_PE", "goog.i18n.DateTimeSymbols_es_PH", "goog.i18n.DateTimeSymbols_es_PR", "goog.i18n.DateTimeSymbols_es_PY", "goog.i18n.DateTimeSymbols_es_SV", "goog.i18n.DateTimeSymbols_es_US", "goog.i18n.DateTimeSymbols_es_UY", "goog.i18n.DateTimeSymbols_es_VE", "goog.i18n.DateTimeSymbols_et_EE", "goog.i18n.DateTimeSymbols_eu_ES", "goog.i18n.DateTimeSymbols_ewo", +"goog.i18n.DateTimeSymbols_ewo_CM", "goog.i18n.DateTimeSymbols_fa_AF", "goog.i18n.DateTimeSymbols_fa_IR", "goog.i18n.DateTimeSymbols_ff", "goog.i18n.DateTimeSymbols_ff_SN", "goog.i18n.DateTimeSymbols_fi_FI", "goog.i18n.DateTimeSymbols_fil_PH", "goog.i18n.DateTimeSymbols_fo", "goog.i18n.DateTimeSymbols_fo_FO", "goog.i18n.DateTimeSymbols_fr_BE", "goog.i18n.DateTimeSymbols_fr_BF", "goog.i18n.DateTimeSymbols_fr_BI", "goog.i18n.DateTimeSymbols_fr_BJ", "goog.i18n.DateTimeSymbols_fr_BL", "goog.i18n.DateTimeSymbols_fr_CD", +"goog.i18n.DateTimeSymbols_fr_CF", "goog.i18n.DateTimeSymbols_fr_CG", "goog.i18n.DateTimeSymbols_fr_CH", "goog.i18n.DateTimeSymbols_fr_CI", "goog.i18n.DateTimeSymbols_fr_CM", "goog.i18n.DateTimeSymbols_fr_DJ", "goog.i18n.DateTimeSymbols_fr_DZ", "goog.i18n.DateTimeSymbols_fr_FR", "goog.i18n.DateTimeSymbols_fr_GA", "goog.i18n.DateTimeSymbols_fr_GF", "goog.i18n.DateTimeSymbols_fr_GN", "goog.i18n.DateTimeSymbols_fr_GP", "goog.i18n.DateTimeSymbols_fr_GQ", "goog.i18n.DateTimeSymbols_fr_HT", "goog.i18n.DateTimeSymbols_fr_KM", +"goog.i18n.DateTimeSymbols_fr_LU", "goog.i18n.DateTimeSymbols_fr_MA", "goog.i18n.DateTimeSymbols_fr_MC", "goog.i18n.DateTimeSymbols_fr_MF", "goog.i18n.DateTimeSymbols_fr_MG", "goog.i18n.DateTimeSymbols_fr_ML", "goog.i18n.DateTimeSymbols_fr_MQ", "goog.i18n.DateTimeSymbols_fr_MR", "goog.i18n.DateTimeSymbols_fr_MU", "goog.i18n.DateTimeSymbols_fr_NC", "goog.i18n.DateTimeSymbols_fr_NE", "goog.i18n.DateTimeSymbols_fr_PF", "goog.i18n.DateTimeSymbols_fr_RE", "goog.i18n.DateTimeSymbols_fr_RW", "goog.i18n.DateTimeSymbols_fr_SC", +"goog.i18n.DateTimeSymbols_fr_SN", "goog.i18n.DateTimeSymbols_fr_SY", "goog.i18n.DateTimeSymbols_fr_TD", "goog.i18n.DateTimeSymbols_fr_TG", "goog.i18n.DateTimeSymbols_fr_TN", "goog.i18n.DateTimeSymbols_fr_VU", "goog.i18n.DateTimeSymbols_fr_YT", "goog.i18n.DateTimeSymbols_fur", "goog.i18n.DateTimeSymbols_fur_IT", "goog.i18n.DateTimeSymbols_ga", "goog.i18n.DateTimeSymbols_ga_IE", "goog.i18n.DateTimeSymbols_gd", "goog.i18n.DateTimeSymbols_gd_GB", "goog.i18n.DateTimeSymbols_gl_ES", "goog.i18n.DateTimeSymbols_gsw_CH", +"goog.i18n.DateTimeSymbols_gu_IN", "goog.i18n.DateTimeSymbols_guz", "goog.i18n.DateTimeSymbols_guz_KE", "goog.i18n.DateTimeSymbols_gv", "goog.i18n.DateTimeSymbols_gv_GB", "goog.i18n.DateTimeSymbols_ha", "goog.i18n.DateTimeSymbols_ha_Latn", "goog.i18n.DateTimeSymbols_ha_Latn_GH", "goog.i18n.DateTimeSymbols_ha_Latn_NE", "goog.i18n.DateTimeSymbols_ha_Latn_NG", "goog.i18n.DateTimeSymbols_haw_US", "goog.i18n.DateTimeSymbols_he_IL", "goog.i18n.DateTimeSymbols_hi_IN", "goog.i18n.DateTimeSymbols_hr_BA", +"goog.i18n.DateTimeSymbols_hr_HR", "goog.i18n.DateTimeSymbols_hu_HU", "goog.i18n.DateTimeSymbols_hy", "goog.i18n.DateTimeSymbols_hy_AM", "goog.i18n.DateTimeSymbols_ia", "goog.i18n.DateTimeSymbols_ia_FR", "goog.i18n.DateTimeSymbols_id_ID", "goog.i18n.DateTimeSymbols_ig", "goog.i18n.DateTimeSymbols_ig_NG", "goog.i18n.DateTimeSymbols_ii", "goog.i18n.DateTimeSymbols_ii_CN", "goog.i18n.DateTimeSymbols_is_IS", "goog.i18n.DateTimeSymbols_it_CH", "goog.i18n.DateTimeSymbols_it_IT", "goog.i18n.DateTimeSymbols_it_SM", +"goog.i18n.DateTimeSymbols_ja_JP", "goog.i18n.DateTimeSymbols_jgo", "goog.i18n.DateTimeSymbols_jgo_CM", "goog.i18n.DateTimeSymbols_jmc", "goog.i18n.DateTimeSymbols_jmc_TZ", "goog.i18n.DateTimeSymbols_ka", "goog.i18n.DateTimeSymbols_ka_GE", "goog.i18n.DateTimeSymbols_kab", "goog.i18n.DateTimeSymbols_kab_DZ", "goog.i18n.DateTimeSymbols_kam", "goog.i18n.DateTimeSymbols_kam_KE", "goog.i18n.DateTimeSymbols_kde", "goog.i18n.DateTimeSymbols_kde_TZ", "goog.i18n.DateTimeSymbols_kea", "goog.i18n.DateTimeSymbols_kea_CV", +"goog.i18n.DateTimeSymbols_khq", "goog.i18n.DateTimeSymbols_khq_ML", "goog.i18n.DateTimeSymbols_ki", "goog.i18n.DateTimeSymbols_ki_KE", "goog.i18n.DateTimeSymbols_kk", "goog.i18n.DateTimeSymbols_kk_Cyrl", "goog.i18n.DateTimeSymbols_kk_Cyrl_KZ", "goog.i18n.DateTimeSymbols_kkj", "goog.i18n.DateTimeSymbols_kkj_CM", "goog.i18n.DateTimeSymbols_kl", "goog.i18n.DateTimeSymbols_kl_GL", "goog.i18n.DateTimeSymbols_kln", "goog.i18n.DateTimeSymbols_kln_KE", "goog.i18n.DateTimeSymbols_km", "goog.i18n.DateTimeSymbols_km_KH", +"goog.i18n.DateTimeSymbols_kn_IN", "goog.i18n.DateTimeSymbols_ko_KP", "goog.i18n.DateTimeSymbols_ko_KR", "goog.i18n.DateTimeSymbols_kok", "goog.i18n.DateTimeSymbols_kok_IN", "goog.i18n.DateTimeSymbols_ks", "goog.i18n.DateTimeSymbols_ks_Arab", "goog.i18n.DateTimeSymbols_ks_Arab_IN", "goog.i18n.DateTimeSymbols_ksb", "goog.i18n.DateTimeSymbols_ksb_TZ", "goog.i18n.DateTimeSymbols_ksf", "goog.i18n.DateTimeSymbols_ksf_CM", "goog.i18n.DateTimeSymbols_ksh", "goog.i18n.DateTimeSymbols_ksh_DE", "goog.i18n.DateTimeSymbols_kw", +"goog.i18n.DateTimeSymbols_kw_GB", "goog.i18n.DateTimeSymbols_ky", "goog.i18n.DateTimeSymbols_ky_KG", "goog.i18n.DateTimeSymbols_lag", "goog.i18n.DateTimeSymbols_lag_TZ", "goog.i18n.DateTimeSymbols_lg", "goog.i18n.DateTimeSymbols_lg_UG", "goog.i18n.DateTimeSymbols_ln_AO", "goog.i18n.DateTimeSymbols_ln_CD", "goog.i18n.DateTimeSymbols_ln_CF", "goog.i18n.DateTimeSymbols_ln_CG", "goog.i18n.DateTimeSymbols_lo", "goog.i18n.DateTimeSymbols_lo_LA", "goog.i18n.DateTimeSymbols_lt_LT", "goog.i18n.DateTimeSymbols_lu", +"goog.i18n.DateTimeSymbols_lu_CD", "goog.i18n.DateTimeSymbols_luo", "goog.i18n.DateTimeSymbols_luo_KE", "goog.i18n.DateTimeSymbols_luy", "goog.i18n.DateTimeSymbols_luy_KE", "goog.i18n.DateTimeSymbols_lv_LV", "goog.i18n.DateTimeSymbols_mas", "goog.i18n.DateTimeSymbols_mas_KE", "goog.i18n.DateTimeSymbols_mas_TZ", "goog.i18n.DateTimeSymbols_mer", "goog.i18n.DateTimeSymbols_mer_KE", "goog.i18n.DateTimeSymbols_mfe", "goog.i18n.DateTimeSymbols_mfe_MU", "goog.i18n.DateTimeSymbols_mg", "goog.i18n.DateTimeSymbols_mg_MG", +"goog.i18n.DateTimeSymbols_mgh", "goog.i18n.DateTimeSymbols_mgh_MZ", "goog.i18n.DateTimeSymbols_mgo", "goog.i18n.DateTimeSymbols_mgo_CM", "goog.i18n.DateTimeSymbols_mk", "goog.i18n.DateTimeSymbols_mk_MK", "goog.i18n.DateTimeSymbols_ml_IN", "goog.i18n.DateTimeSymbols_mn", "goog.i18n.DateTimeSymbols_mn_Cyrl", "goog.i18n.DateTimeSymbols_mn_Cyrl_MN", "goog.i18n.DateTimeSymbols_mr_IN", "goog.i18n.DateTimeSymbols_ms_Latn", "goog.i18n.DateTimeSymbols_ms_Latn_BN", "goog.i18n.DateTimeSymbols_ms_Latn_MY", +"goog.i18n.DateTimeSymbols_ms_Latn_SG", "goog.i18n.DateTimeSymbols_mt_MT", "goog.i18n.DateTimeSymbols_mua", "goog.i18n.DateTimeSymbols_mua_CM", "goog.i18n.DateTimeSymbols_my", "goog.i18n.DateTimeSymbols_my_MM", "goog.i18n.DateTimeSymbols_naq", "goog.i18n.DateTimeSymbols_naq_NA", "goog.i18n.DateTimeSymbols_nb_NO", "goog.i18n.DateTimeSymbols_nd", "goog.i18n.DateTimeSymbols_nd_ZW", "goog.i18n.DateTimeSymbols_ne", "goog.i18n.DateTimeSymbols_ne_IN", "goog.i18n.DateTimeSymbols_ne_NP", "goog.i18n.DateTimeSymbols_nl_AW", +"goog.i18n.DateTimeSymbols_nl_BE", "goog.i18n.DateTimeSymbols_nl_CW", "goog.i18n.DateTimeSymbols_nl_NL", "goog.i18n.DateTimeSymbols_nl_SR", "goog.i18n.DateTimeSymbols_nl_SX", "goog.i18n.DateTimeSymbols_nmg", "goog.i18n.DateTimeSymbols_nmg_CM", "goog.i18n.DateTimeSymbols_nn", "goog.i18n.DateTimeSymbols_nn_NO", "goog.i18n.DateTimeSymbols_nnh", "goog.i18n.DateTimeSymbols_nnh_CM", "goog.i18n.DateTimeSymbols_nr", "goog.i18n.DateTimeSymbols_nr_ZA", "goog.i18n.DateTimeSymbols_nso", "goog.i18n.DateTimeSymbols_nso_ZA", +"goog.i18n.DateTimeSymbols_nus", "goog.i18n.DateTimeSymbols_nus_SD", "goog.i18n.DateTimeSymbols_nyn", "goog.i18n.DateTimeSymbols_nyn_UG", "goog.i18n.DateTimeSymbols_om", "goog.i18n.DateTimeSymbols_om_ET", "goog.i18n.DateTimeSymbols_om_KE", "goog.i18n.DateTimeSymbols_or_IN", "goog.i18n.DateTimeSymbols_os", "goog.i18n.DateTimeSymbols_os_GE", "goog.i18n.DateTimeSymbols_os_RU", "goog.i18n.DateTimeSymbols_pa", "goog.i18n.DateTimeSymbols_pa_Arab", "goog.i18n.DateTimeSymbols_pa_Arab_PK", "goog.i18n.DateTimeSymbols_pa_Guru", +"goog.i18n.DateTimeSymbols_pa_Guru_IN", "goog.i18n.DateTimeSymbols_pl_PL", "goog.i18n.DateTimeSymbols_ps", "goog.i18n.DateTimeSymbols_ps_AF", "goog.i18n.DateTimeSymbols_pt_AO", "goog.i18n.DateTimeSymbols_pt_CV", "goog.i18n.DateTimeSymbols_pt_GW", "goog.i18n.DateTimeSymbols_pt_MO", "goog.i18n.DateTimeSymbols_pt_MZ", "goog.i18n.DateTimeSymbols_pt_ST", "goog.i18n.DateTimeSymbols_pt_TL", "goog.i18n.DateTimeSymbols_rm", "goog.i18n.DateTimeSymbols_rm_CH", "goog.i18n.DateTimeSymbols_rn", "goog.i18n.DateTimeSymbols_rn_BI", +"goog.i18n.DateTimeSymbols_ro_MD", "goog.i18n.DateTimeSymbols_ro_RO", "goog.i18n.DateTimeSymbols_rof", "goog.i18n.DateTimeSymbols_rof_TZ", "goog.i18n.DateTimeSymbols_ru_BY", "goog.i18n.DateTimeSymbols_ru_KG", "goog.i18n.DateTimeSymbols_ru_KZ", "goog.i18n.DateTimeSymbols_ru_MD", "goog.i18n.DateTimeSymbols_ru_RU", "goog.i18n.DateTimeSymbols_ru_UA", "goog.i18n.DateTimeSymbols_rw", "goog.i18n.DateTimeSymbols_rw_RW", "goog.i18n.DateTimeSymbols_rwk", "goog.i18n.DateTimeSymbols_rwk_TZ", "goog.i18n.DateTimeSymbols_sah", +"goog.i18n.DateTimeSymbols_sah_RU", "goog.i18n.DateTimeSymbols_saq", "goog.i18n.DateTimeSymbols_saq_KE", "goog.i18n.DateTimeSymbols_sbp", "goog.i18n.DateTimeSymbols_sbp_TZ", "goog.i18n.DateTimeSymbols_se", "goog.i18n.DateTimeSymbols_se_FI", "goog.i18n.DateTimeSymbols_se_NO", "goog.i18n.DateTimeSymbols_seh", "goog.i18n.DateTimeSymbols_seh_MZ", "goog.i18n.DateTimeSymbols_ses", "goog.i18n.DateTimeSymbols_ses_ML", "goog.i18n.DateTimeSymbols_sg", "goog.i18n.DateTimeSymbols_sg_CF", "goog.i18n.DateTimeSymbols_shi", +"goog.i18n.DateTimeSymbols_shi_Latn", "goog.i18n.DateTimeSymbols_shi_Latn_MA", "goog.i18n.DateTimeSymbols_shi_Tfng", "goog.i18n.DateTimeSymbols_shi_Tfng_MA", "goog.i18n.DateTimeSymbols_si", "goog.i18n.DateTimeSymbols_si_LK", "goog.i18n.DateTimeSymbols_sk_SK", "goog.i18n.DateTimeSymbols_sl_SI", "goog.i18n.DateTimeSymbols_sn", "goog.i18n.DateTimeSymbols_sn_ZW", "goog.i18n.DateTimeSymbols_so", "goog.i18n.DateTimeSymbols_so_DJ", "goog.i18n.DateTimeSymbols_so_ET", "goog.i18n.DateTimeSymbols_so_KE", "goog.i18n.DateTimeSymbols_so_SO", +"goog.i18n.DateTimeSymbols_sq_AL", "goog.i18n.DateTimeSymbols_sq_MK", "goog.i18n.DateTimeSymbols_sq_XK", "goog.i18n.DateTimeSymbols_sr_Cyrl", "goog.i18n.DateTimeSymbols_sr_Cyrl_BA", "goog.i18n.DateTimeSymbols_sr_Cyrl_ME", "goog.i18n.DateTimeSymbols_sr_Cyrl_RS", "goog.i18n.DateTimeSymbols_sr_Cyrl_XK", "goog.i18n.DateTimeSymbols_sr_Latn", "goog.i18n.DateTimeSymbols_sr_Latn_BA", "goog.i18n.DateTimeSymbols_sr_Latn_ME", "goog.i18n.DateTimeSymbols_sr_Latn_RS", "goog.i18n.DateTimeSymbols_sr_Latn_XK", "goog.i18n.DateTimeSymbols_ss", +"goog.i18n.DateTimeSymbols_ss_SZ", "goog.i18n.DateTimeSymbols_ss_ZA", "goog.i18n.DateTimeSymbols_ssy", "goog.i18n.DateTimeSymbols_ssy_ER", "goog.i18n.DateTimeSymbols_st", "goog.i18n.DateTimeSymbols_st_LS", "goog.i18n.DateTimeSymbols_st_ZA", "goog.i18n.DateTimeSymbols_sv_AX", "goog.i18n.DateTimeSymbols_sv_FI", "goog.i18n.DateTimeSymbols_sv_SE", "goog.i18n.DateTimeSymbols_sw_KE", "goog.i18n.DateTimeSymbols_sw_TZ", "goog.i18n.DateTimeSymbols_sw_UG", "goog.i18n.DateTimeSymbols_swc", "goog.i18n.DateTimeSymbols_swc_CD", +"goog.i18n.DateTimeSymbols_ta_IN", "goog.i18n.DateTimeSymbols_ta_LK", "goog.i18n.DateTimeSymbols_ta_MY", "goog.i18n.DateTimeSymbols_ta_SG", "goog.i18n.DateTimeSymbols_te_IN", "goog.i18n.DateTimeSymbols_teo", "goog.i18n.DateTimeSymbols_teo_KE", "goog.i18n.DateTimeSymbols_teo_UG", "goog.i18n.DateTimeSymbols_tg", "goog.i18n.DateTimeSymbols_tg_Cyrl", "goog.i18n.DateTimeSymbols_tg_Cyrl_TJ", "goog.i18n.DateTimeSymbols_th_TH", "goog.i18n.DateTimeSymbols_ti", "goog.i18n.DateTimeSymbols_ti_ER", "goog.i18n.DateTimeSymbols_ti_ET", +"goog.i18n.DateTimeSymbols_tig", "goog.i18n.DateTimeSymbols_tig_ER", "goog.i18n.DateTimeSymbols_tn", "goog.i18n.DateTimeSymbols_tn_BW", "goog.i18n.DateTimeSymbols_tn_ZA", "goog.i18n.DateTimeSymbols_to", "goog.i18n.DateTimeSymbols_to_TO", "goog.i18n.DateTimeSymbols_tr_CY", "goog.i18n.DateTimeSymbols_tr_TR", "goog.i18n.DateTimeSymbols_ts", "goog.i18n.DateTimeSymbols_ts_ZA", "goog.i18n.DateTimeSymbols_twq", "goog.i18n.DateTimeSymbols_twq_NE", "goog.i18n.DateTimeSymbols_tzm", "goog.i18n.DateTimeSymbols_tzm_Latn", +"goog.i18n.DateTimeSymbols_tzm_Latn_MA", "goog.i18n.DateTimeSymbols_uk_UA", "goog.i18n.DateTimeSymbols_ur_IN", "goog.i18n.DateTimeSymbols_ur_PK", "goog.i18n.DateTimeSymbols_uz", "goog.i18n.DateTimeSymbols_uz_Arab", "goog.i18n.DateTimeSymbols_uz_Arab_AF", "goog.i18n.DateTimeSymbols_uz_Cyrl", "goog.i18n.DateTimeSymbols_uz_Cyrl_UZ", "goog.i18n.DateTimeSymbols_uz_Latn", "goog.i18n.DateTimeSymbols_uz_Latn_UZ", "goog.i18n.DateTimeSymbols_vai", "goog.i18n.DateTimeSymbols_vai_Latn", "goog.i18n.DateTimeSymbols_vai_Latn_LR", +"goog.i18n.DateTimeSymbols_vai_Vaii", "goog.i18n.DateTimeSymbols_vai_Vaii_LR", "goog.i18n.DateTimeSymbols_ve", "goog.i18n.DateTimeSymbols_ve_ZA", "goog.i18n.DateTimeSymbols_vi_VN", "goog.i18n.DateTimeSymbols_vo", "goog.i18n.DateTimeSymbols_vun", "goog.i18n.DateTimeSymbols_vun_TZ", "goog.i18n.DateTimeSymbols_wae", "goog.i18n.DateTimeSymbols_wae_CH", "goog.i18n.DateTimeSymbols_wal", "goog.i18n.DateTimeSymbols_wal_ET", "goog.i18n.DateTimeSymbols_xh", "goog.i18n.DateTimeSymbols_xh_ZA", "goog.i18n.DateTimeSymbols_xog", +"goog.i18n.DateTimeSymbols_xog_UG", "goog.i18n.DateTimeSymbols_yav", "goog.i18n.DateTimeSymbols_yav_CM", "goog.i18n.DateTimeSymbols_yo", "goog.i18n.DateTimeSymbols_yo_NG", "goog.i18n.DateTimeSymbols_zh_Hans", "goog.i18n.DateTimeSymbols_zh_Hans_CN", "goog.i18n.DateTimeSymbols_zh_Hans_HK", "goog.i18n.DateTimeSymbols_zh_Hans_MO", "goog.i18n.DateTimeSymbols_zh_Hans_SG", "goog.i18n.DateTimeSymbols_zh_Hant", "goog.i18n.DateTimeSymbols_zh_Hant_HK", "goog.i18n.DateTimeSymbols_zh_Hant_MO", "goog.i18n.DateTimeSymbols_zh_Hant_TW", +"goog.i18n.DateTimeSymbols_zu_ZA"], ["goog.i18n.DateTimeSymbols"]); +goog.addDependency("/closure/goog/i18n/graphemebreak.js", ["goog.i18n.GraphemeBreak"], ["goog.structs.InversionMap"]); +goog.addDependency("/closure/goog/i18n/messageformat.js", ["goog.i18n.MessageFormat"], ["goog.asserts", "goog.i18n.NumberFormat", "goog.i18n.ordinalRules", "goog.i18n.pluralRules"]); +goog.addDependency("/closure/goog/i18n/mime.js", ["goog.i18n.mime", "goog.i18n.mime.encode"], ["goog.array"]); +goog.addDependency("/closure/goog/i18n/numberformat.js", ["goog.i18n.NumberFormat", "goog.i18n.NumberFormat.CurrencyStyle", "goog.i18n.NumberFormat.Format"], ["goog.asserts", "goog.i18n.CompactNumberFormatSymbols", "goog.i18n.NumberFormatSymbols", "goog.i18n.currency", "goog.math"]); +goog.addDependency("/closure/goog/i18n/numberformatsymbols.js", ["goog.i18n.NumberFormatSymbols", "goog.i18n.NumberFormatSymbols_af", "goog.i18n.NumberFormatSymbols_af_ZA", "goog.i18n.NumberFormatSymbols_am", "goog.i18n.NumberFormatSymbols_am_ET", "goog.i18n.NumberFormatSymbols_ar", "goog.i18n.NumberFormatSymbols_ar_001", "goog.i18n.NumberFormatSymbols_ar_EG", "goog.i18n.NumberFormatSymbols_bg", "goog.i18n.NumberFormatSymbols_bg_BG", "goog.i18n.NumberFormatSymbols_bn", "goog.i18n.NumberFormatSymbols_bn_BD", +"goog.i18n.NumberFormatSymbols_br", "goog.i18n.NumberFormatSymbols_br_FR", "goog.i18n.NumberFormatSymbols_ca", "goog.i18n.NumberFormatSymbols_ca_AD", "goog.i18n.NumberFormatSymbols_ca_ES", "goog.i18n.NumberFormatSymbols_chr", "goog.i18n.NumberFormatSymbols_chr_US", "goog.i18n.NumberFormatSymbols_cs", "goog.i18n.NumberFormatSymbols_cs_CZ", "goog.i18n.NumberFormatSymbols_cy", "goog.i18n.NumberFormatSymbols_cy_GB", "goog.i18n.NumberFormatSymbols_da", "goog.i18n.NumberFormatSymbols_da_DK", "goog.i18n.NumberFormatSymbols_de", +"goog.i18n.NumberFormatSymbols_de_AT", "goog.i18n.NumberFormatSymbols_de_BE", "goog.i18n.NumberFormatSymbols_de_CH", "goog.i18n.NumberFormatSymbols_de_DE", "goog.i18n.NumberFormatSymbols_de_LU", "goog.i18n.NumberFormatSymbols_el", "goog.i18n.NumberFormatSymbols_el_GR", "goog.i18n.NumberFormatSymbols_en", "goog.i18n.NumberFormatSymbols_en_AS", "goog.i18n.NumberFormatSymbols_en_AU", "goog.i18n.NumberFormatSymbols_en_Dsrt_US", "goog.i18n.NumberFormatSymbols_en_FM", "goog.i18n.NumberFormatSymbols_en_GB", +"goog.i18n.NumberFormatSymbols_en_GU", "goog.i18n.NumberFormatSymbols_en_IE", "goog.i18n.NumberFormatSymbols_en_IN", "goog.i18n.NumberFormatSymbols_en_MH", "goog.i18n.NumberFormatSymbols_en_MP", "goog.i18n.NumberFormatSymbols_en_PR", "goog.i18n.NumberFormatSymbols_en_PW", "goog.i18n.NumberFormatSymbols_en_SG", "goog.i18n.NumberFormatSymbols_en_TC", "goog.i18n.NumberFormatSymbols_en_UM", "goog.i18n.NumberFormatSymbols_en_US", "goog.i18n.NumberFormatSymbols_en_VG", "goog.i18n.NumberFormatSymbols_en_VI", +"goog.i18n.NumberFormatSymbols_en_ZA", "goog.i18n.NumberFormatSymbols_es", "goog.i18n.NumberFormatSymbols_es_419", "goog.i18n.NumberFormatSymbols_es_EA", "goog.i18n.NumberFormatSymbols_es_ES", "goog.i18n.NumberFormatSymbols_es_IC", "goog.i18n.NumberFormatSymbols_et", "goog.i18n.NumberFormatSymbols_et_EE", "goog.i18n.NumberFormatSymbols_eu", "goog.i18n.NumberFormatSymbols_eu_ES", "goog.i18n.NumberFormatSymbols_fa", "goog.i18n.NumberFormatSymbols_fa_IR", "goog.i18n.NumberFormatSymbols_fi", "goog.i18n.NumberFormatSymbols_fi_FI", +"goog.i18n.NumberFormatSymbols_fil", "goog.i18n.NumberFormatSymbols_fil_PH", "goog.i18n.NumberFormatSymbols_fr", "goog.i18n.NumberFormatSymbols_fr_BL", "goog.i18n.NumberFormatSymbols_fr_CA", "goog.i18n.NumberFormatSymbols_fr_FR", "goog.i18n.NumberFormatSymbols_fr_GF", "goog.i18n.NumberFormatSymbols_fr_GP", "goog.i18n.NumberFormatSymbols_fr_MC", "goog.i18n.NumberFormatSymbols_fr_MF", "goog.i18n.NumberFormatSymbols_fr_MQ", "goog.i18n.NumberFormatSymbols_fr_RE", "goog.i18n.NumberFormatSymbols_fr_YT", +"goog.i18n.NumberFormatSymbols_gl", "goog.i18n.NumberFormatSymbols_gl_ES", "goog.i18n.NumberFormatSymbols_gsw", "goog.i18n.NumberFormatSymbols_gsw_CH", "goog.i18n.NumberFormatSymbols_gu", "goog.i18n.NumberFormatSymbols_gu_IN", "goog.i18n.NumberFormatSymbols_haw", "goog.i18n.NumberFormatSymbols_haw_US", "goog.i18n.NumberFormatSymbols_he", "goog.i18n.NumberFormatSymbols_he_IL", "goog.i18n.NumberFormatSymbols_hi", "goog.i18n.NumberFormatSymbols_hi_IN", "goog.i18n.NumberFormatSymbols_hr", "goog.i18n.NumberFormatSymbols_hr_HR", +"goog.i18n.NumberFormatSymbols_hu", "goog.i18n.NumberFormatSymbols_hu_HU", "goog.i18n.NumberFormatSymbols_id", "goog.i18n.NumberFormatSymbols_id_ID", "goog.i18n.NumberFormatSymbols_in", "goog.i18n.NumberFormatSymbols_is", "goog.i18n.NumberFormatSymbols_is_IS", "goog.i18n.NumberFormatSymbols_it", "goog.i18n.NumberFormatSymbols_it_IT", "goog.i18n.NumberFormatSymbols_it_SM", "goog.i18n.NumberFormatSymbols_iw", "goog.i18n.NumberFormatSymbols_ja", "goog.i18n.NumberFormatSymbols_ja_JP", "goog.i18n.NumberFormatSymbols_kn", +"goog.i18n.NumberFormatSymbols_kn_IN", "goog.i18n.NumberFormatSymbols_ko", "goog.i18n.NumberFormatSymbols_ko_KR", "goog.i18n.NumberFormatSymbols_ln", "goog.i18n.NumberFormatSymbols_ln_CD", "goog.i18n.NumberFormatSymbols_lt", "goog.i18n.NumberFormatSymbols_lt_LT", "goog.i18n.NumberFormatSymbols_lv", "goog.i18n.NumberFormatSymbols_lv_LV", "goog.i18n.NumberFormatSymbols_ml", "goog.i18n.NumberFormatSymbols_ml_IN", "goog.i18n.NumberFormatSymbols_mr", "goog.i18n.NumberFormatSymbols_mr_IN", "goog.i18n.NumberFormatSymbols_ms", +"goog.i18n.NumberFormatSymbols_ms_Latn_MY", "goog.i18n.NumberFormatSymbols_mt", "goog.i18n.NumberFormatSymbols_mt_MT", "goog.i18n.NumberFormatSymbols_nb", "goog.i18n.NumberFormatSymbols_nb_NO", "goog.i18n.NumberFormatSymbols_nl", "goog.i18n.NumberFormatSymbols_nl_NL", "goog.i18n.NumberFormatSymbols_no", "goog.i18n.NumberFormatSymbols_or", "goog.i18n.NumberFormatSymbols_or_IN", "goog.i18n.NumberFormatSymbols_pl", "goog.i18n.NumberFormatSymbols_pl_PL", "goog.i18n.NumberFormatSymbols_pt", "goog.i18n.NumberFormatSymbols_pt_BR", +"goog.i18n.NumberFormatSymbols_pt_PT", "goog.i18n.NumberFormatSymbols_ro", "goog.i18n.NumberFormatSymbols_ro_RO", "goog.i18n.NumberFormatSymbols_ru", "goog.i18n.NumberFormatSymbols_ru_RU", "goog.i18n.NumberFormatSymbols_sk", "goog.i18n.NumberFormatSymbols_sk_SK", "goog.i18n.NumberFormatSymbols_sl", "goog.i18n.NumberFormatSymbols_sl_SI", "goog.i18n.NumberFormatSymbols_sq", "goog.i18n.NumberFormatSymbols_sq_AL", "goog.i18n.NumberFormatSymbols_sr", "goog.i18n.NumberFormatSymbols_sr_Cyrl_RS", "goog.i18n.NumberFormatSymbols_sv", +"goog.i18n.NumberFormatSymbols_sv_SE", "goog.i18n.NumberFormatSymbols_sw", "goog.i18n.NumberFormatSymbols_sw_TZ", "goog.i18n.NumberFormatSymbols_ta", "goog.i18n.NumberFormatSymbols_ta_IN", "goog.i18n.NumberFormatSymbols_te", "goog.i18n.NumberFormatSymbols_te_IN", "goog.i18n.NumberFormatSymbols_th", "goog.i18n.NumberFormatSymbols_th_TH", "goog.i18n.NumberFormatSymbols_tl", "goog.i18n.NumberFormatSymbols_tr", "goog.i18n.NumberFormatSymbols_tr_TR", "goog.i18n.NumberFormatSymbols_uk", "goog.i18n.NumberFormatSymbols_uk_UA", +"goog.i18n.NumberFormatSymbols_ur", "goog.i18n.NumberFormatSymbols_ur_PK", "goog.i18n.NumberFormatSymbols_vi", "goog.i18n.NumberFormatSymbols_vi_VN", "goog.i18n.NumberFormatSymbols_zh", "goog.i18n.NumberFormatSymbols_zh_CN", "goog.i18n.NumberFormatSymbols_zh_HK", "goog.i18n.NumberFormatSymbols_zh_Hans_CN", "goog.i18n.NumberFormatSymbols_zh_TW", "goog.i18n.NumberFormatSymbols_zu", "goog.i18n.NumberFormatSymbols_zu_ZA"], []); +goog.addDependency("/closure/goog/i18n/numberformatsymbolsext.js", ["goog.i18n.NumberFormatSymbolsExt", "goog.i18n.NumberFormatSymbols_aa", "goog.i18n.NumberFormatSymbols_aa_DJ", "goog.i18n.NumberFormatSymbols_aa_ER", "goog.i18n.NumberFormatSymbols_aa_ET", "goog.i18n.NumberFormatSymbols_af_NA", "goog.i18n.NumberFormatSymbols_agq", "goog.i18n.NumberFormatSymbols_agq_CM", "goog.i18n.NumberFormatSymbols_ak", "goog.i18n.NumberFormatSymbols_ak_GH", "goog.i18n.NumberFormatSymbols_ar_AE", "goog.i18n.NumberFormatSymbols_ar_BH", +"goog.i18n.NumberFormatSymbols_ar_DJ", "goog.i18n.NumberFormatSymbols_ar_DZ", "goog.i18n.NumberFormatSymbols_ar_EH", "goog.i18n.NumberFormatSymbols_ar_ER", "goog.i18n.NumberFormatSymbols_ar_IL", "goog.i18n.NumberFormatSymbols_ar_IQ", "goog.i18n.NumberFormatSymbols_ar_JO", "goog.i18n.NumberFormatSymbols_ar_KM", "goog.i18n.NumberFormatSymbols_ar_KW", "goog.i18n.NumberFormatSymbols_ar_LB", "goog.i18n.NumberFormatSymbols_ar_LY", "goog.i18n.NumberFormatSymbols_ar_MA", "goog.i18n.NumberFormatSymbols_ar_MR", +"goog.i18n.NumberFormatSymbols_ar_OM", "goog.i18n.NumberFormatSymbols_ar_PS", "goog.i18n.NumberFormatSymbols_ar_QA", "goog.i18n.NumberFormatSymbols_ar_SA", "goog.i18n.NumberFormatSymbols_ar_SD", "goog.i18n.NumberFormatSymbols_ar_SO", "goog.i18n.NumberFormatSymbols_ar_SY", "goog.i18n.NumberFormatSymbols_ar_TD", "goog.i18n.NumberFormatSymbols_ar_TN", "goog.i18n.NumberFormatSymbols_ar_YE", "goog.i18n.NumberFormatSymbols_as", "goog.i18n.NumberFormatSymbols_as_IN", "goog.i18n.NumberFormatSymbols_asa", +"goog.i18n.NumberFormatSymbols_asa_TZ", "goog.i18n.NumberFormatSymbols_ast", "goog.i18n.NumberFormatSymbols_ast_ES", "goog.i18n.NumberFormatSymbols_az", "goog.i18n.NumberFormatSymbols_az_Cyrl", "goog.i18n.NumberFormatSymbols_az_Cyrl_AZ", "goog.i18n.NumberFormatSymbols_az_Latn", "goog.i18n.NumberFormatSymbols_az_Latn_AZ", "goog.i18n.NumberFormatSymbols_bas", "goog.i18n.NumberFormatSymbols_bas_CM", "goog.i18n.NumberFormatSymbols_be", "goog.i18n.NumberFormatSymbols_be_BY", "goog.i18n.NumberFormatSymbols_bem", +"goog.i18n.NumberFormatSymbols_bem_ZM", "goog.i18n.NumberFormatSymbols_bez", "goog.i18n.NumberFormatSymbols_bez_TZ", "goog.i18n.NumberFormatSymbols_bm", "goog.i18n.NumberFormatSymbols_bm_ML", "goog.i18n.NumberFormatSymbols_bn_IN", "goog.i18n.NumberFormatSymbols_bo", "goog.i18n.NumberFormatSymbols_bo_CN", "goog.i18n.NumberFormatSymbols_bo_IN", "goog.i18n.NumberFormatSymbols_brx", "goog.i18n.NumberFormatSymbols_brx_IN", "goog.i18n.NumberFormatSymbols_bs", "goog.i18n.NumberFormatSymbols_bs_Cyrl", "goog.i18n.NumberFormatSymbols_bs_Cyrl_BA", +"goog.i18n.NumberFormatSymbols_bs_Latn", "goog.i18n.NumberFormatSymbols_bs_Latn_BA", "goog.i18n.NumberFormatSymbols_byn", "goog.i18n.NumberFormatSymbols_byn_ER", "goog.i18n.NumberFormatSymbols_cgg", "goog.i18n.NumberFormatSymbols_cgg_UG", "goog.i18n.NumberFormatSymbols_ckb", "goog.i18n.NumberFormatSymbols_ckb_Arab", "goog.i18n.NumberFormatSymbols_ckb_Arab_IQ", "goog.i18n.NumberFormatSymbols_ckb_Arab_IR", "goog.i18n.NumberFormatSymbols_ckb_IQ", "goog.i18n.NumberFormatSymbols_ckb_IR", "goog.i18n.NumberFormatSymbols_ckb_Latn", +"goog.i18n.NumberFormatSymbols_ckb_Latn_IQ", "goog.i18n.NumberFormatSymbols_dav", "goog.i18n.NumberFormatSymbols_dav_KE", "goog.i18n.NumberFormatSymbols_de_LI", "goog.i18n.NumberFormatSymbols_dje", "goog.i18n.NumberFormatSymbols_dje_NE", "goog.i18n.NumberFormatSymbols_dua", "goog.i18n.NumberFormatSymbols_dua_CM", "goog.i18n.NumberFormatSymbols_dyo", "goog.i18n.NumberFormatSymbols_dyo_SN", "goog.i18n.NumberFormatSymbols_dz", "goog.i18n.NumberFormatSymbols_dz_BT", "goog.i18n.NumberFormatSymbols_ebu", +"goog.i18n.NumberFormatSymbols_ebu_KE", "goog.i18n.NumberFormatSymbols_ee", "goog.i18n.NumberFormatSymbols_ee_GH", "goog.i18n.NumberFormatSymbols_ee_TG", "goog.i18n.NumberFormatSymbols_el_CY", "goog.i18n.NumberFormatSymbols_en_150", "goog.i18n.NumberFormatSymbols_en_AG", "goog.i18n.NumberFormatSymbols_en_BB", "goog.i18n.NumberFormatSymbols_en_BE", "goog.i18n.NumberFormatSymbols_en_BM", "goog.i18n.NumberFormatSymbols_en_BS", "goog.i18n.NumberFormatSymbols_en_BW", "goog.i18n.NumberFormatSymbols_en_BZ", +"goog.i18n.NumberFormatSymbols_en_CA", "goog.i18n.NumberFormatSymbols_en_CM", "goog.i18n.NumberFormatSymbols_en_DM", "goog.i18n.NumberFormatSymbols_en_Dsrt", "goog.i18n.NumberFormatSymbols_en_FJ", "goog.i18n.NumberFormatSymbols_en_GD", "goog.i18n.NumberFormatSymbols_en_GG", "goog.i18n.NumberFormatSymbols_en_GH", "goog.i18n.NumberFormatSymbols_en_GI", "goog.i18n.NumberFormatSymbols_en_GM", "goog.i18n.NumberFormatSymbols_en_GY", "goog.i18n.NumberFormatSymbols_en_HK", "goog.i18n.NumberFormatSymbols_en_IM", +"goog.i18n.NumberFormatSymbols_en_JE", "goog.i18n.NumberFormatSymbols_en_JM", "goog.i18n.NumberFormatSymbols_en_KE", "goog.i18n.NumberFormatSymbols_en_KI", "goog.i18n.NumberFormatSymbols_en_KN", "goog.i18n.NumberFormatSymbols_en_KY", "goog.i18n.NumberFormatSymbols_en_LC", "goog.i18n.NumberFormatSymbols_en_LR", "goog.i18n.NumberFormatSymbols_en_LS", "goog.i18n.NumberFormatSymbols_en_MG", "goog.i18n.NumberFormatSymbols_en_MT", "goog.i18n.NumberFormatSymbols_en_MU", "goog.i18n.NumberFormatSymbols_en_MW", +"goog.i18n.NumberFormatSymbols_en_NA", "goog.i18n.NumberFormatSymbols_en_NG", "goog.i18n.NumberFormatSymbols_en_NZ", "goog.i18n.NumberFormatSymbols_en_PG", "goog.i18n.NumberFormatSymbols_en_PH", "goog.i18n.NumberFormatSymbols_en_PK", "goog.i18n.NumberFormatSymbols_en_SB", "goog.i18n.NumberFormatSymbols_en_SC", "goog.i18n.NumberFormatSymbols_en_SL", "goog.i18n.NumberFormatSymbols_en_SS", "goog.i18n.NumberFormatSymbols_en_SZ", "goog.i18n.NumberFormatSymbols_en_TO", "goog.i18n.NumberFormatSymbols_en_TT", +"goog.i18n.NumberFormatSymbols_en_TZ", "goog.i18n.NumberFormatSymbols_en_UG", "goog.i18n.NumberFormatSymbols_en_VC", "goog.i18n.NumberFormatSymbols_en_VU", "goog.i18n.NumberFormatSymbols_en_WS", "goog.i18n.NumberFormatSymbols_en_ZM", "goog.i18n.NumberFormatSymbols_en_ZW", "goog.i18n.NumberFormatSymbols_eo", "goog.i18n.NumberFormatSymbols_es_AR", "goog.i18n.NumberFormatSymbols_es_BO", "goog.i18n.NumberFormatSymbols_es_CL", "goog.i18n.NumberFormatSymbols_es_CO", "goog.i18n.NumberFormatSymbols_es_CR", +"goog.i18n.NumberFormatSymbols_es_CU", "goog.i18n.NumberFormatSymbols_es_DO", "goog.i18n.NumberFormatSymbols_es_EC", "goog.i18n.NumberFormatSymbols_es_GQ", "goog.i18n.NumberFormatSymbols_es_GT", "goog.i18n.NumberFormatSymbols_es_HN", "goog.i18n.NumberFormatSymbols_es_MX", "goog.i18n.NumberFormatSymbols_es_NI", "goog.i18n.NumberFormatSymbols_es_PA", "goog.i18n.NumberFormatSymbols_es_PE", "goog.i18n.NumberFormatSymbols_es_PH", "goog.i18n.NumberFormatSymbols_es_PR", "goog.i18n.NumberFormatSymbols_es_PY", +"goog.i18n.NumberFormatSymbols_es_SV", "goog.i18n.NumberFormatSymbols_es_US", "goog.i18n.NumberFormatSymbols_es_UY", "goog.i18n.NumberFormatSymbols_es_VE", "goog.i18n.NumberFormatSymbols_ewo", "goog.i18n.NumberFormatSymbols_ewo_CM", "goog.i18n.NumberFormatSymbols_fa_AF", "goog.i18n.NumberFormatSymbols_ff", "goog.i18n.NumberFormatSymbols_ff_SN", "goog.i18n.NumberFormatSymbols_fo", "goog.i18n.NumberFormatSymbols_fo_FO", "goog.i18n.NumberFormatSymbols_fr_BE", "goog.i18n.NumberFormatSymbols_fr_BF", "goog.i18n.NumberFormatSymbols_fr_BI", +"goog.i18n.NumberFormatSymbols_fr_BJ", "goog.i18n.NumberFormatSymbols_fr_CD", "goog.i18n.NumberFormatSymbols_fr_CF", "goog.i18n.NumberFormatSymbols_fr_CG", "goog.i18n.NumberFormatSymbols_fr_CH", "goog.i18n.NumberFormatSymbols_fr_CI", "goog.i18n.NumberFormatSymbols_fr_CM", "goog.i18n.NumberFormatSymbols_fr_DJ", "goog.i18n.NumberFormatSymbols_fr_DZ", "goog.i18n.NumberFormatSymbols_fr_GA", "goog.i18n.NumberFormatSymbols_fr_GN", "goog.i18n.NumberFormatSymbols_fr_GQ", "goog.i18n.NumberFormatSymbols_fr_HT", +"goog.i18n.NumberFormatSymbols_fr_KM", "goog.i18n.NumberFormatSymbols_fr_LU", "goog.i18n.NumberFormatSymbols_fr_MA", "goog.i18n.NumberFormatSymbols_fr_MG", "goog.i18n.NumberFormatSymbols_fr_ML", "goog.i18n.NumberFormatSymbols_fr_MR", "goog.i18n.NumberFormatSymbols_fr_MU", "goog.i18n.NumberFormatSymbols_fr_NC", "goog.i18n.NumberFormatSymbols_fr_NE", "goog.i18n.NumberFormatSymbols_fr_PF", "goog.i18n.NumberFormatSymbols_fr_RW", "goog.i18n.NumberFormatSymbols_fr_SC", "goog.i18n.NumberFormatSymbols_fr_SN", +"goog.i18n.NumberFormatSymbols_fr_SY", "goog.i18n.NumberFormatSymbols_fr_TD", "goog.i18n.NumberFormatSymbols_fr_TG", "goog.i18n.NumberFormatSymbols_fr_TN", "goog.i18n.NumberFormatSymbols_fr_VU", "goog.i18n.NumberFormatSymbols_fur", "goog.i18n.NumberFormatSymbols_fur_IT", "goog.i18n.NumberFormatSymbols_ga", "goog.i18n.NumberFormatSymbols_ga_IE", "goog.i18n.NumberFormatSymbols_gd", "goog.i18n.NumberFormatSymbols_gd_GB", "goog.i18n.NumberFormatSymbols_guz", "goog.i18n.NumberFormatSymbols_guz_KE", "goog.i18n.NumberFormatSymbols_gv", +"goog.i18n.NumberFormatSymbols_gv_GB", "goog.i18n.NumberFormatSymbols_ha", "goog.i18n.NumberFormatSymbols_ha_Latn", "goog.i18n.NumberFormatSymbols_ha_Latn_GH", "goog.i18n.NumberFormatSymbols_ha_Latn_NE", "goog.i18n.NumberFormatSymbols_ha_Latn_NG", "goog.i18n.NumberFormatSymbols_hr_BA", "goog.i18n.NumberFormatSymbols_hy", "goog.i18n.NumberFormatSymbols_hy_AM", "goog.i18n.NumberFormatSymbols_ia", "goog.i18n.NumberFormatSymbols_ia_FR", "goog.i18n.NumberFormatSymbols_ig", "goog.i18n.NumberFormatSymbols_ig_NG", +"goog.i18n.NumberFormatSymbols_ii", "goog.i18n.NumberFormatSymbols_ii_CN", "goog.i18n.NumberFormatSymbols_it_CH", "goog.i18n.NumberFormatSymbols_jgo", "goog.i18n.NumberFormatSymbols_jgo_CM", "goog.i18n.NumberFormatSymbols_jmc", "goog.i18n.NumberFormatSymbols_jmc_TZ", "goog.i18n.NumberFormatSymbols_ka", "goog.i18n.NumberFormatSymbols_ka_GE", "goog.i18n.NumberFormatSymbols_kab", "goog.i18n.NumberFormatSymbols_kab_DZ", "goog.i18n.NumberFormatSymbols_kam", "goog.i18n.NumberFormatSymbols_kam_KE", "goog.i18n.NumberFormatSymbols_kde", +"goog.i18n.NumberFormatSymbols_kde_TZ", "goog.i18n.NumberFormatSymbols_kea", "goog.i18n.NumberFormatSymbols_kea_CV", "goog.i18n.NumberFormatSymbols_khq", "goog.i18n.NumberFormatSymbols_khq_ML", "goog.i18n.NumberFormatSymbols_ki", "goog.i18n.NumberFormatSymbols_ki_KE", "goog.i18n.NumberFormatSymbols_kk", "goog.i18n.NumberFormatSymbols_kk_Cyrl", "goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ", "goog.i18n.NumberFormatSymbols_kkj", "goog.i18n.NumberFormatSymbols_kkj_CM", "goog.i18n.NumberFormatSymbols_kl", +"goog.i18n.NumberFormatSymbols_kl_GL", "goog.i18n.NumberFormatSymbols_kln", "goog.i18n.NumberFormatSymbols_kln_KE", "goog.i18n.NumberFormatSymbols_km", "goog.i18n.NumberFormatSymbols_km_KH", "goog.i18n.NumberFormatSymbols_ko_KP", "goog.i18n.NumberFormatSymbols_kok", "goog.i18n.NumberFormatSymbols_kok_IN", "goog.i18n.NumberFormatSymbols_ks", "goog.i18n.NumberFormatSymbols_ks_Arab", "goog.i18n.NumberFormatSymbols_ks_Arab_IN", "goog.i18n.NumberFormatSymbols_ksb", "goog.i18n.NumberFormatSymbols_ksb_TZ", +"goog.i18n.NumberFormatSymbols_ksf", "goog.i18n.NumberFormatSymbols_ksf_CM", "goog.i18n.NumberFormatSymbols_ksh", "goog.i18n.NumberFormatSymbols_ksh_DE", "goog.i18n.NumberFormatSymbols_kw", "goog.i18n.NumberFormatSymbols_kw_GB", "goog.i18n.NumberFormatSymbols_ky", "goog.i18n.NumberFormatSymbols_ky_KG", "goog.i18n.NumberFormatSymbols_lag", "goog.i18n.NumberFormatSymbols_lag_TZ", "goog.i18n.NumberFormatSymbols_lg", "goog.i18n.NumberFormatSymbols_lg_UG", "goog.i18n.NumberFormatSymbols_ln_AO", "goog.i18n.NumberFormatSymbols_ln_CF", +"goog.i18n.NumberFormatSymbols_ln_CG", "goog.i18n.NumberFormatSymbols_lo", "goog.i18n.NumberFormatSymbols_lo_LA", "goog.i18n.NumberFormatSymbols_lu", "goog.i18n.NumberFormatSymbols_lu_CD", "goog.i18n.NumberFormatSymbols_luo", "goog.i18n.NumberFormatSymbols_luo_KE", "goog.i18n.NumberFormatSymbols_luy", "goog.i18n.NumberFormatSymbols_luy_KE", "goog.i18n.NumberFormatSymbols_mas", "goog.i18n.NumberFormatSymbols_mas_KE", "goog.i18n.NumberFormatSymbols_mas_TZ", "goog.i18n.NumberFormatSymbols_mer", "goog.i18n.NumberFormatSymbols_mer_KE", +"goog.i18n.NumberFormatSymbols_mfe", "goog.i18n.NumberFormatSymbols_mfe_MU", "goog.i18n.NumberFormatSymbols_mg", "goog.i18n.NumberFormatSymbols_mg_MG", "goog.i18n.NumberFormatSymbols_mgh", "goog.i18n.NumberFormatSymbols_mgh_MZ", "goog.i18n.NumberFormatSymbols_mgo", "goog.i18n.NumberFormatSymbols_mgo_CM", "goog.i18n.NumberFormatSymbols_mk", "goog.i18n.NumberFormatSymbols_mk_MK", "goog.i18n.NumberFormatSymbols_mn", "goog.i18n.NumberFormatSymbols_mn_Cyrl", "goog.i18n.NumberFormatSymbols_mn_Cyrl_MN", +"goog.i18n.NumberFormatSymbols_ms_Latn", "goog.i18n.NumberFormatSymbols_ms_Latn_BN", "goog.i18n.NumberFormatSymbols_ms_Latn_SG", "goog.i18n.NumberFormatSymbols_mua", "goog.i18n.NumberFormatSymbols_mua_CM", "goog.i18n.NumberFormatSymbols_my", "goog.i18n.NumberFormatSymbols_my_MM", "goog.i18n.NumberFormatSymbols_naq", "goog.i18n.NumberFormatSymbols_naq_NA", "goog.i18n.NumberFormatSymbols_nd", "goog.i18n.NumberFormatSymbols_nd_ZW", "goog.i18n.NumberFormatSymbols_ne", "goog.i18n.NumberFormatSymbols_ne_IN", +"goog.i18n.NumberFormatSymbols_ne_NP", "goog.i18n.NumberFormatSymbols_nl_AW", "goog.i18n.NumberFormatSymbols_nl_BE", "goog.i18n.NumberFormatSymbols_nl_CW", "goog.i18n.NumberFormatSymbols_nl_SR", "goog.i18n.NumberFormatSymbols_nl_SX", "goog.i18n.NumberFormatSymbols_nmg", "goog.i18n.NumberFormatSymbols_nmg_CM", "goog.i18n.NumberFormatSymbols_nn", "goog.i18n.NumberFormatSymbols_nn_NO", "goog.i18n.NumberFormatSymbols_nnh", "goog.i18n.NumberFormatSymbols_nnh_CM", "goog.i18n.NumberFormatSymbols_nr", "goog.i18n.NumberFormatSymbols_nr_ZA", +"goog.i18n.NumberFormatSymbols_nso", "goog.i18n.NumberFormatSymbols_nso_ZA", "goog.i18n.NumberFormatSymbols_nus", "goog.i18n.NumberFormatSymbols_nus_SD", "goog.i18n.NumberFormatSymbols_nyn", "goog.i18n.NumberFormatSymbols_nyn_UG", "goog.i18n.NumberFormatSymbols_om", "goog.i18n.NumberFormatSymbols_om_ET", "goog.i18n.NumberFormatSymbols_om_KE", "goog.i18n.NumberFormatSymbols_os", "goog.i18n.NumberFormatSymbols_os_GE", "goog.i18n.NumberFormatSymbols_os_RU", "goog.i18n.NumberFormatSymbols_pa", "goog.i18n.NumberFormatSymbols_pa_Arab", +"goog.i18n.NumberFormatSymbols_pa_Arab_PK", "goog.i18n.NumberFormatSymbols_pa_Guru", "goog.i18n.NumberFormatSymbols_pa_Guru_IN", "goog.i18n.NumberFormatSymbols_ps", "goog.i18n.NumberFormatSymbols_ps_AF", "goog.i18n.NumberFormatSymbols_pt_AO", "goog.i18n.NumberFormatSymbols_pt_CV", "goog.i18n.NumberFormatSymbols_pt_GW", "goog.i18n.NumberFormatSymbols_pt_MO", "goog.i18n.NumberFormatSymbols_pt_MZ", "goog.i18n.NumberFormatSymbols_pt_ST", "goog.i18n.NumberFormatSymbols_pt_TL", "goog.i18n.NumberFormatSymbols_rm", +"goog.i18n.NumberFormatSymbols_rm_CH", "goog.i18n.NumberFormatSymbols_rn", "goog.i18n.NumberFormatSymbols_rn_BI", "goog.i18n.NumberFormatSymbols_ro_MD", "goog.i18n.NumberFormatSymbols_rof", "goog.i18n.NumberFormatSymbols_rof_TZ", "goog.i18n.NumberFormatSymbols_ru_BY", "goog.i18n.NumberFormatSymbols_ru_KG", "goog.i18n.NumberFormatSymbols_ru_KZ", "goog.i18n.NumberFormatSymbols_ru_MD", "goog.i18n.NumberFormatSymbols_ru_UA", "goog.i18n.NumberFormatSymbols_rw", "goog.i18n.NumberFormatSymbols_rw_RW", "goog.i18n.NumberFormatSymbols_rwk", +"goog.i18n.NumberFormatSymbols_rwk_TZ", "goog.i18n.NumberFormatSymbols_sah", "goog.i18n.NumberFormatSymbols_sah_RU", "goog.i18n.NumberFormatSymbols_saq", "goog.i18n.NumberFormatSymbols_saq_KE", "goog.i18n.NumberFormatSymbols_sbp", "goog.i18n.NumberFormatSymbols_sbp_TZ", "goog.i18n.NumberFormatSymbols_se", "goog.i18n.NumberFormatSymbols_se_FI", "goog.i18n.NumberFormatSymbols_se_NO", "goog.i18n.NumberFormatSymbols_seh", "goog.i18n.NumberFormatSymbols_seh_MZ", "goog.i18n.NumberFormatSymbols_ses", "goog.i18n.NumberFormatSymbols_ses_ML", +"goog.i18n.NumberFormatSymbols_sg", "goog.i18n.NumberFormatSymbols_sg_CF", "goog.i18n.NumberFormatSymbols_shi", "goog.i18n.NumberFormatSymbols_shi_Latn", "goog.i18n.NumberFormatSymbols_shi_Latn_MA", "goog.i18n.NumberFormatSymbols_shi_Tfng", "goog.i18n.NumberFormatSymbols_shi_Tfng_MA", "goog.i18n.NumberFormatSymbols_si", "goog.i18n.NumberFormatSymbols_si_LK", "goog.i18n.NumberFormatSymbols_sn", "goog.i18n.NumberFormatSymbols_sn_ZW", "goog.i18n.NumberFormatSymbols_so", "goog.i18n.NumberFormatSymbols_so_DJ", +"goog.i18n.NumberFormatSymbols_so_ET", "goog.i18n.NumberFormatSymbols_so_KE", "goog.i18n.NumberFormatSymbols_so_SO", "goog.i18n.NumberFormatSymbols_sq_MK", "goog.i18n.NumberFormatSymbols_sq_XK", "goog.i18n.NumberFormatSymbols_sr_Cyrl", "goog.i18n.NumberFormatSymbols_sr_Cyrl_BA", "goog.i18n.NumberFormatSymbols_sr_Cyrl_ME", "goog.i18n.NumberFormatSymbols_sr_Cyrl_XK", "goog.i18n.NumberFormatSymbols_sr_Latn", "goog.i18n.NumberFormatSymbols_sr_Latn_BA", "goog.i18n.NumberFormatSymbols_sr_Latn_ME", "goog.i18n.NumberFormatSymbols_sr_Latn_RS", +"goog.i18n.NumberFormatSymbols_sr_Latn_XK", "goog.i18n.NumberFormatSymbols_ss", "goog.i18n.NumberFormatSymbols_ss_SZ", "goog.i18n.NumberFormatSymbols_ss_ZA", "goog.i18n.NumberFormatSymbols_ssy", "goog.i18n.NumberFormatSymbols_ssy_ER", "goog.i18n.NumberFormatSymbols_st", "goog.i18n.NumberFormatSymbols_st_LS", "goog.i18n.NumberFormatSymbols_st_ZA", "goog.i18n.NumberFormatSymbols_sv_AX", "goog.i18n.NumberFormatSymbols_sv_FI", "goog.i18n.NumberFormatSymbols_sw_KE", "goog.i18n.NumberFormatSymbols_sw_UG", +"goog.i18n.NumberFormatSymbols_swc", "goog.i18n.NumberFormatSymbols_swc_CD", "goog.i18n.NumberFormatSymbols_ta_LK", "goog.i18n.NumberFormatSymbols_ta_MY", "goog.i18n.NumberFormatSymbols_ta_SG", "goog.i18n.NumberFormatSymbols_teo", "goog.i18n.NumberFormatSymbols_teo_KE", "goog.i18n.NumberFormatSymbols_teo_UG", "goog.i18n.NumberFormatSymbols_tg", "goog.i18n.NumberFormatSymbols_tg_Cyrl", "goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ", "goog.i18n.NumberFormatSymbols_ti", "goog.i18n.NumberFormatSymbols_ti_ER", +"goog.i18n.NumberFormatSymbols_ti_ET", "goog.i18n.NumberFormatSymbols_tig", "goog.i18n.NumberFormatSymbols_tig_ER", "goog.i18n.NumberFormatSymbols_tn", "goog.i18n.NumberFormatSymbols_tn_BW", "goog.i18n.NumberFormatSymbols_tn_ZA", "goog.i18n.NumberFormatSymbols_to", "goog.i18n.NumberFormatSymbols_to_TO", "goog.i18n.NumberFormatSymbols_tr_CY", "goog.i18n.NumberFormatSymbols_ts", "goog.i18n.NumberFormatSymbols_ts_ZA", "goog.i18n.NumberFormatSymbols_twq", "goog.i18n.NumberFormatSymbols_twq_NE", "goog.i18n.NumberFormatSymbols_tzm", +"goog.i18n.NumberFormatSymbols_tzm_Latn", "goog.i18n.NumberFormatSymbols_tzm_Latn_MA", "goog.i18n.NumberFormatSymbols_ur_IN", "goog.i18n.NumberFormatSymbols_uz", "goog.i18n.NumberFormatSymbols_uz_Arab", "goog.i18n.NumberFormatSymbols_uz_Arab_AF", "goog.i18n.NumberFormatSymbols_uz_Cyrl", "goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ", "goog.i18n.NumberFormatSymbols_uz_Latn", "goog.i18n.NumberFormatSymbols_uz_Latn_UZ", "goog.i18n.NumberFormatSymbols_vai", "goog.i18n.NumberFormatSymbols_vai_Latn", "goog.i18n.NumberFormatSymbols_vai_Latn_LR", +"goog.i18n.NumberFormatSymbols_vai_Vaii", "goog.i18n.NumberFormatSymbols_vai_Vaii_LR", "goog.i18n.NumberFormatSymbols_ve", "goog.i18n.NumberFormatSymbols_ve_ZA", "goog.i18n.NumberFormatSymbols_vo", "goog.i18n.NumberFormatSymbols_vun", "goog.i18n.NumberFormatSymbols_vun_TZ", "goog.i18n.NumberFormatSymbols_wae", "goog.i18n.NumberFormatSymbols_wae_CH", "goog.i18n.NumberFormatSymbols_wal", "goog.i18n.NumberFormatSymbols_wal_ET", "goog.i18n.NumberFormatSymbols_xh", "goog.i18n.NumberFormatSymbols_xh_ZA", +"goog.i18n.NumberFormatSymbols_xog", "goog.i18n.NumberFormatSymbols_xog_UG", "goog.i18n.NumberFormatSymbols_yav", "goog.i18n.NumberFormatSymbols_yav_CM", "goog.i18n.NumberFormatSymbols_yo", "goog.i18n.NumberFormatSymbols_yo_NG", "goog.i18n.NumberFormatSymbols_zh_Hans", "goog.i18n.NumberFormatSymbols_zh_Hans_HK", "goog.i18n.NumberFormatSymbols_zh_Hans_MO", "goog.i18n.NumberFormatSymbols_zh_Hans_SG", "goog.i18n.NumberFormatSymbols_zh_Hant", "goog.i18n.NumberFormatSymbols_zh_Hant_HK", "goog.i18n.NumberFormatSymbols_zh_Hant_MO", +"goog.i18n.NumberFormatSymbols_zh_Hant_TW"], ["goog.i18n.NumberFormatSymbols"]); +goog.addDependency("/closure/goog/i18n/ordinalrules.js", ["goog.i18n.ordinalRules"], []); +goog.addDependency("/closure/goog/i18n/pluralrules.js", ["goog.i18n.pluralRules"], []); +goog.addDependency("/closure/goog/i18n/timezone.js", ["goog.i18n.TimeZone"], ["goog.array", "goog.date.DateLike", "goog.string"]); +goog.addDependency("/closure/goog/i18n/uchar.js", ["goog.i18n.uChar"], []); +goog.addDependency("/closure/goog/i18n/uchar/localnamefetcher.js", ["goog.i18n.uChar.LocalNameFetcher"], ["goog.i18n.uChar", "goog.i18n.uChar.NameFetcher", "goog.log"]); +goog.addDependency("/closure/goog/i18n/uchar/namefetcher.js", ["goog.i18n.uChar.NameFetcher"], []); +goog.addDependency("/closure/goog/i18n/uchar/remotenamefetcher.js", ["goog.i18n.uChar.RemoteNameFetcher"], ["goog.Disposable", "goog.Uri", "goog.i18n.uChar", "goog.i18n.uChar.NameFetcher", "goog.log", "goog.net.XhrIo", "goog.structs.Map"]); +goog.addDependency("/closure/goog/iter/iter.js", ["goog.iter", "goog.iter.Iterator", "goog.iter.StopIteration"], ["goog.array", "goog.asserts"]); +goog.addDependency("/closure/goog/json/evaljsonprocessor.js", ["goog.json.EvalJsonProcessor"], ["goog.json", "goog.json.Processor", "goog.json.Serializer"]); +goog.addDependency("/closure/goog/json/json.js", ["goog.json", "goog.json.Serializer"], []); +goog.addDependency("/closure/goog/json/nativejsonprocessor.js", ["goog.json.NativeJsonProcessor"], ["goog.asserts", "goog.json", "goog.json.Processor"]); +goog.addDependency("/closure/goog/json/processor.js", ["goog.json.Processor"], ["goog.string.Parser", "goog.string.Stringifier"]); +goog.addDependency("/closure/goog/labs/classdef/classdef.js", ["goog.labs.classdef"], []); +goog.addDependency("/closure/goog/labs/events/touch.js", ["goog.labs.events.touch", "goog.labs.events.touch.TouchData"], ["goog.array", "goog.asserts", "goog.events.EventType", "goog.string"]); +goog.addDependency("/closure/goog/labs/events/touch_test.js", ["goog.labs.events.touchTest"], ["goog.labs.events.touch", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/labs/format/csv.js", ["goog.labs.format.csv", "goog.labs.format.csv.ParseError", "goog.labs.format.csv.Token"], ["goog.array", "goog.asserts", "goog.debug.Error", "goog.object", "goog.string", "goog.string.newlines"]); +goog.addDependency("/closure/goog/labs/format/csv_test.js", ["goog.labs.format.csvTest"], ["goog.labs.format.csv", "goog.labs.format.csv.ParseError", "goog.object", "goog.testing.asserts", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/labs/mock/mock.js", ["goog.labs.mock"], ["goog.array", "goog.debug", "goog.debug.Error", "goog.functions", "goog.json"]); +goog.addDependency("/closure/goog/labs/net/image.js", ["goog.labs.net.image"], ["goog.events.EventHandler", "goog.events.EventType", "goog.net.EventType", "goog.result.SimpleResult", "goog.userAgent"]); +goog.addDependency("/closure/goog/labs/net/image_test.js", ["goog.labs.net.imageTest"], ["goog.events", "goog.labs.net.image", "goog.result", "goog.result.Result", "goog.string", "goog.testing.AsyncTestCase", "goog.testing.jsunit", "goog.testing.recordFunction"]); +goog.addDependency("/closure/goog/labs/net/webchannel.js", ["goog.net.WebChannel"], ["goog.events", "goog.events.Event"]); +goog.addDependency("/closure/goog/labs/net/webchannel/basetestchannel.js", ["goog.labs.net.webChannel.BaseTestChannel"], ["goog.json.EvalJsonProcessor", "goog.labs.net.webChannel.Channel", "goog.labs.net.webChannel.WebChannelRequest", "goog.labs.net.webChannel.requestStats", "goog.labs.net.webChannel.requestStats.ServerReachability", "goog.labs.net.webChannel.requestStats.Stat", "goog.net.tmpnetwork"]); +goog.addDependency("/closure/goog/labs/net/webchannel/channel.js", ["goog.labs.net.webChannel.Channel"], []); +goog.addDependency("/closure/goog/labs/net/webchannel/requeststats.js", ["goog.labs.net.webChannel.requestStats", "goog.labs.net.webChannel.requestStats.Event", "goog.labs.net.webChannel.requestStats.ServerReachability", "goog.labs.net.webChannel.requestStats.ServerReachabilityEvent", "goog.labs.net.webChannel.requestStats.Stat", "goog.labs.net.webChannel.requestStats.StatEvent", "goog.labs.net.webChannel.requestStats.TimingEvent"], ["goog.events.Event", "goog.events.EventTarget"]); +goog.addDependency("/closure/goog/labs/net/webchannel/webchannelbase.js", ["goog.labs.net.webChannel.WebChannelBase"], ["goog.Uri", "goog.array", "goog.asserts", "goog.debug.TextFormatter", "goog.json", "goog.json.EvalJsonProcessor", "goog.labs.net.webChannel.BaseTestChannel", "goog.labs.net.webChannel.Channel", "goog.labs.net.webChannel.WebChannelDebug", "goog.labs.net.webChannel.WebChannelRequest", "goog.labs.net.webChannel.requestStats", "goog.labs.net.webChannel.requestStats.Stat", "goog.log", +"goog.net.XhrIo", "goog.net.tmpnetwork", "goog.string", "goog.structs", "goog.structs.CircularBuffer"]); +goog.addDependency("/closure/goog/labs/net/webchannel/webchannelbase_test.js", ["goog.labs.net.webChannel.webChannelBaseTest"], ["goog.Timer", "goog.array", "goog.dom", "goog.functions", "goog.json", "goog.labs.net.webChannel.WebChannelBase", "goog.labs.net.webChannel.WebChannelDebug", "goog.labs.net.webChannel.WebChannelRequest", "goog.labs.net.webChannel.requestStats", "goog.labs.net.webChannel.requestStats.Stat", "goog.net.tmpnetwork", "goog.structs.Map", "goog.testing.MockClock", "goog.testing.PropertyReplacer", +"goog.testing.asserts", "goog.testing.jsunit", "goog.testing.recordFunction"]); +goog.addDependency("/closure/goog/labs/net/webchannel/webchannelbasetransport.js", ["goog.labs.net.webChannel.WebChannelBaseTransport"], ["goog.asserts", "goog.events.EventTarget", "goog.labs.net.webChannel.WebChannelBase", "goog.log", "goog.net.WebChannel", "goog.net.WebChannelTransport", "goog.string.path"]); +goog.addDependency("/closure/goog/labs/net/webchannel/webchanneldebug.js", ["goog.labs.net.webChannel.WebChannelDebug"], ["goog.json", "goog.log"]); +goog.addDependency("/closure/goog/labs/net/webchannel/webchannelrequest.js", ["goog.labs.net.webChannel.WebChannelRequest"], ["goog.Timer", "goog.async.Throttle", "goog.events.EventHandler", "goog.labs.net.webChannel.requestStats", "goog.labs.net.webChannel.requestStats.ServerReachability", "goog.labs.net.webChannel.requestStats.Stat", "goog.net.ErrorCode", "goog.net.EventType", "goog.net.XmlHttp", "goog.object", "goog.userAgent"]); +goog.addDependency("/closure/goog/labs/net/webchanneltransport.js", ["goog.net.WebChannelTransport"], []); +goog.addDependency("/closure/goog/labs/net/webchanneltransportfactory.js", ["goog.net.createWebChannelTransport"], ["goog.functions", "goog.labs.net.webChannel.WebChannelBaseTransport"]); +goog.addDependency("/closure/goog/labs/net/xhr.js", ["goog.labs.net.xhr", "goog.labs.net.xhr.Error", "goog.labs.net.xhr.HttpError", "goog.labs.net.xhr.TimeoutError"], ["goog.debug.Error", "goog.json", "goog.net.HttpStatus", "goog.net.XmlHttp", "goog.result", "goog.result.SimpleResult", "goog.string", "goog.uri.utils"]); +goog.addDependency("/closure/goog/labs/object/object.js", ["goog.labs.object"], []); +goog.addDependency("/closure/goog/labs/observe/notice.js", ["goog.labs.observe.Notice"], []); +goog.addDependency("/closure/goog/labs/observe/observable.js", ["goog.labs.observe.Observable"], ["goog.disposable.IDisposable"]); +goog.addDependency("/closure/goog/labs/observe/observableset.js", ["goog.labs.observe.ObservableSet"], ["goog.array", "goog.labs.observe.Observer"]); +goog.addDependency("/closure/goog/labs/observe/observationset.js", ["goog.labs.observe.ObservationSet"], ["goog.array", "goog.labs.observe.Observer"]); +goog.addDependency("/closure/goog/labs/observe/observer.js", ["goog.labs.observe.Observer"], []); +goog.addDependency("/closure/goog/labs/observe/simpleobservable.js", ["goog.labs.observe.SimpleObservable"], ["goog.Disposable", "goog.array", "goog.asserts", "goog.labs.observe.Notice", "goog.labs.observe.Observable", "goog.labs.observe.Observer", "goog.object"]); +goog.addDependency("/closure/goog/labs/structs/map.js", ["goog.labs.structs.Map"], ["goog.array", "goog.asserts", "goog.labs.object", "goog.object"]); +goog.addDependency("/closure/goog/labs/structs/map_perf.js", ["goog.labs.structs.mapPerf"], ["goog.dom", "goog.labs.structs.Map", "goog.structs.Map", "goog.testing.PerformanceTable", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/labs/structs/multimap.js", ["goog.labs.structs.Multimap"], ["goog.array", "goog.labs.object", "goog.labs.structs.Map"]); +goog.addDependency("/closure/goog/labs/style/pixeldensitymonitor.js", ["goog.labs.style.PixelDensityMonitor", "goog.labs.style.PixelDensityMonitor.Density", "goog.labs.style.PixelDensityMonitor.EventType"], ["goog.events", "goog.events.EventTarget"]); +goog.addDependency("/closure/goog/labs/style/pixeldensitymonitor_test.js", ["goog.labs.style.PixelDensityMonitorTest"], ["goog.array", "goog.dom.DomHelper", "goog.events", "goog.labs.style.PixelDensityMonitor", "goog.testing.MockControl", "goog.testing.jsunit", "goog.testing.recordFunction"]); +goog.addDependency("/closure/goog/labs/testing/assertthat.js", ["goog.labs.testing.MatcherError", "goog.labs.testing.assertThat"], ["goog.asserts", "goog.debug.Error", "goog.labs.testing.Matcher"]); +goog.addDependency("/closure/goog/labs/testing/decoratormatcher.js", ["goog.labs.testing.AnythingMatcher"], ["goog.labs.testing.Matcher"]); +goog.addDependency("/closure/goog/labs/testing/dictionarymatcher.js", ["goog.labs.testing.HasEntriesMatcher", "goog.labs.testing.HasEntryMatcher", "goog.labs.testing.HasKeyMatcher", "goog.labs.testing.HasValueMatcher"], ["goog.array", "goog.asserts", "goog.labs.testing.Matcher", "goog.string"]); +goog.addDependency("/closure/goog/labs/testing/logicmatcher.js", ["goog.labs.testing.AllOfMatcher", "goog.labs.testing.AnyOfMatcher", "goog.labs.testing.IsNotMatcher"], ["goog.array", "goog.labs.testing.Matcher"]); +goog.addDependency("/closure/goog/labs/testing/matcher.js", ["goog.labs.testing.Matcher"], []); +goog.addDependency("/closure/goog/labs/testing/numbermatcher.js", ["goog.labs.testing.CloseToMatcher", "goog.labs.testing.EqualToMatcher", "goog.labs.testing.GreaterThanEqualToMatcher", "goog.labs.testing.GreaterThanMatcher", "goog.labs.testing.LessThanEqualToMatcher", "goog.labs.testing.LessThanMatcher"], ["goog.asserts", "goog.labs.testing.Matcher"]); +goog.addDependency("/closure/goog/labs/testing/objectmatcher.js", ["goog.labs.testing.HasPropertyMatcher", "goog.labs.testing.InstanceOfMatcher", "goog.labs.testing.IsNullMatcher", "goog.labs.testing.IsNullOrUndefinedMatcher", "goog.labs.testing.IsUndefinedMatcher", "goog.labs.testing.ObjectEqualsMatcher"], ["goog.labs.testing.Matcher", "goog.string"]); +goog.addDependency("/closure/goog/labs/testing/stringmatcher.js", ["goog.labs.testing.ContainsStringMatcher", "goog.labs.testing.EndsWithMatcher", "goog.labs.testing.EqualToIgnoringCaseMatcher", "goog.labs.testing.EqualToIgnoringWhitespaceMatcher", "goog.labs.testing.EqualsMatcher", "goog.labs.testing.RegexMatcher", "goog.labs.testing.StartsWithMatcher", "goog.labs.testing.StringContainsInOrderMatcher"], ["goog.asserts", "goog.labs.testing.Matcher", "goog.string"]); +goog.addDependency("/closure/goog/labs/useragent/browser.js", ["goog.labs.userAgent.browser"], ["goog.asserts", "goog.labs.userAgent.util", "goog.memoize", "goog.string"]); +goog.addDependency("/closure/goog/labs/useragent/browser_test.js", ["goog.labs.userAgent.browserTest"], ["goog.labs.userAgent.browser", "goog.labs.userAgent.testAgents", "goog.testing.PropertyReplacer", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/labs/useragent/device.js", ["goog.labs.userAgent.device"], ["goog.labs.userAgent.util"]); +goog.addDependency("/closure/goog/labs/useragent/device_test.js", ["goog.labs.userAgent.deviceTest"], ["goog.labs.userAgent.device", "goog.labs.userAgent.testAgents", "goog.testing.PropertyReplacer", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/labs/useragent/engine.js", ["goog.labs.userAgent.engine"], ["goog.array", "goog.labs.userAgent.util", "goog.memoize", "goog.string"]); +goog.addDependency("/closure/goog/labs/useragent/engine_test.js", ["goog.labs.userAgent.engineTest"], ["goog.labs.userAgent.engine", "goog.labs.userAgent.testAgents", "goog.testing.PropertyReplacer", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/labs/useragent/platform.js", ["goog.labs.userAgent.platform"], ["goog.labs.userAgent.util", "goog.memoize", "goog.string"]); +goog.addDependency("/closure/goog/labs/useragent/platform_test.js", ["goog.labs.userAgent.platformTest"], ["goog.labs.userAgent.platform", "goog.labs.userAgent.testAgents", "goog.testing.PropertyReplacer", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/labs/useragent/test_agents.js", ["goog.labs.userAgent.testAgents"], []); +goog.addDependency("/closure/goog/labs/useragent/util.js", ["goog.labs.userAgent.util"], ["goog.memoize", "goog.string"]); +goog.addDependency("/closure/goog/labs/useragent/util_test.js", ["goog.labs.userAgent.utilTest"], ["goog.labs.userAgent.testAgents", "goog.labs.userAgent.util", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/locale/countries.js", ["goog.locale.countries"], []); +goog.addDependency("/closure/goog/locale/defaultlocalenameconstants.js", ["goog.locale.defaultLocaleNameConstants"], []); +goog.addDependency("/closure/goog/locale/genericfontnames.js", ["goog.locale.genericFontNames"], []); +goog.addDependency("/closure/goog/locale/genericfontnamesdata.js", ["goog.locale.genericFontNamesData"], []); +goog.addDependency("/closure/goog/locale/locale.js", ["goog.locale"], ["goog.locale.nativeNameConstants"]); +goog.addDependency("/closure/goog/locale/nativenameconstants.js", ["goog.locale.nativeNameConstants"], []); +goog.addDependency("/closure/goog/locale/scriptToLanguages.js", ["goog.locale.scriptToLanguages"], ["goog.locale"]); +goog.addDependency("/closure/goog/locale/timezonedetection.js", ["goog.locale.timeZoneDetection"], ["goog.locale", "goog.locale.TimeZoneFingerprint"]); +goog.addDependency("/closure/goog/locale/timezonefingerprint.js", ["goog.locale.TimeZoneFingerprint"], []); +goog.addDependency("/closure/goog/locale/timezonelist.js", ["goog.locale.TimeZoneList"], ["goog.locale"]); +goog.addDependency("/closure/goog/log/log.js", ["goog.log", "goog.log.Level", "goog.log.LogRecord", "goog.log.Logger"], ["goog.debug", "goog.debug.LogRecord", "goog.debug.Logger"]); +goog.addDependency("/closure/goog/log/log_test.js", ["goog.logTest"], ["goog.debug.LogManager", "goog.log", "goog.log.Level", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/math/bezier.js", ["goog.math.Bezier"], ["goog.math", "goog.math.Coordinate"]); +goog.addDependency("/closure/goog/math/box.js", ["goog.math.Box"], ["goog.math.Coordinate"]); +goog.addDependency("/closure/goog/math/coordinate.js", ["goog.math.Coordinate"], ["goog.math"]); +goog.addDependency("/closure/goog/math/coordinate3.js", ["goog.math.Coordinate3"], []); +goog.addDependency("/closure/goog/math/exponentialbackoff.js", ["goog.math.ExponentialBackoff"], ["goog.asserts"]); +goog.addDependency("/closure/goog/math/integer.js", ["goog.math.Integer"], []); +goog.addDependency("/closure/goog/math/interpolator/interpolator1.js", ["goog.math.interpolator.Interpolator1"], []); +goog.addDependency("/closure/goog/math/interpolator/linear1.js", ["goog.math.interpolator.Linear1"], ["goog.array", "goog.math", "goog.math.interpolator.Interpolator1"]); +goog.addDependency("/closure/goog/math/interpolator/pchip1.js", ["goog.math.interpolator.Pchip1"], ["goog.math", "goog.math.interpolator.Spline1"]); +goog.addDependency("/closure/goog/math/interpolator/spline1.js", ["goog.math.interpolator.Spline1"], ["goog.array", "goog.math", "goog.math.interpolator.Interpolator1", "goog.math.tdma"]); +goog.addDependency("/closure/goog/math/line.js", ["goog.math.Line"], ["goog.math", "goog.math.Coordinate"]); +goog.addDependency("/closure/goog/math/long.js", ["goog.math.Long"], []); +goog.addDependency("/closure/goog/math/math.js", ["goog.math"], ["goog.array", "goog.asserts"]); +goog.addDependency("/closure/goog/math/matrix.js", ["goog.math.Matrix"], ["goog.array", "goog.math", "goog.math.Size", "goog.string"]); +goog.addDependency("/closure/goog/math/range.js", ["goog.math.Range"], []); +goog.addDependency("/closure/goog/math/rangeset.js", ["goog.math.RangeSet"], ["goog.array", "goog.iter.Iterator", "goog.iter.StopIteration", "goog.math.Range"]); +goog.addDependency("/closure/goog/math/rect.js", ["goog.math.Rect"], ["goog.math.Box", "goog.math.Coordinate", "goog.math.Size"]); +goog.addDependency("/closure/goog/math/size.js", ["goog.math.Size"], []); +goog.addDependency("/closure/goog/math/tdma.js", ["goog.math.tdma"], []); +goog.addDependency("/closure/goog/math/vec2.js", ["goog.math.Vec2"], ["goog.math", "goog.math.Coordinate"]); +goog.addDependency("/closure/goog/math/vec3.js", ["goog.math.Vec3"], ["goog.math", "goog.math.Coordinate3"]); +goog.addDependency("/closure/goog/memoize/memoize.js", ["goog.memoize"], []); +goog.addDependency("/closure/goog/messaging/abstractchannel.js", ["goog.messaging.AbstractChannel"], ["goog.Disposable", "goog.debug", "goog.json", "goog.log", "goog.messaging.MessageChannel"]); +goog.addDependency("/closure/goog/messaging/bufferedchannel.js", ["goog.messaging.BufferedChannel"], ["goog.Timer", "goog.Uri", "goog.debug.Error", "goog.events", "goog.log", "goog.messaging.MessageChannel", "goog.messaging.MultiChannel"]); +goog.addDependency("/closure/goog/messaging/deferredchannel.js", ["goog.messaging.DeferredChannel"], ["goog.Disposable", "goog.async.Deferred", "goog.messaging.MessageChannel"]); +goog.addDependency("/closure/goog/messaging/loggerclient.js", ["goog.messaging.LoggerClient"], ["goog.Disposable", "goog.debug", "goog.debug.LogManager", "goog.debug.Logger"]); +goog.addDependency("/closure/goog/messaging/loggerserver.js", ["goog.messaging.LoggerServer"], ["goog.Disposable", "goog.log"]); +goog.addDependency("/closure/goog/messaging/messagechannel.js", ["goog.messaging.MessageChannel"], []); +goog.addDependency("/closure/goog/messaging/messaging.js", ["goog.messaging"], ["goog.messaging.MessageChannel"]); +goog.addDependency("/closure/goog/messaging/multichannel.js", ["goog.messaging.MultiChannel", "goog.messaging.MultiChannel.VirtualChannel"], ["goog.Disposable", "goog.events.EventHandler", "goog.log", "goog.messaging.MessageChannel", "goog.object"]); +goog.addDependency("/closure/goog/messaging/portcaller.js", ["goog.messaging.PortCaller"], ["goog.Disposable", "goog.async.Deferred", "goog.messaging.DeferredChannel", "goog.messaging.PortChannel", "goog.messaging.PortNetwork", "goog.object"]); +goog.addDependency("/closure/goog/messaging/portchannel.js", ["goog.messaging.PortChannel"], ["goog.Timer", "goog.array", "goog.async.Deferred", "goog.debug", "goog.dom", "goog.dom.DomHelper", "goog.events", "goog.events.EventType", "goog.json", "goog.log", "goog.messaging.AbstractChannel", "goog.messaging.DeferredChannel", "goog.object", "goog.string"]); +goog.addDependency("/closure/goog/messaging/portnetwork.js", ["goog.messaging.PortNetwork"], []); +goog.addDependency("/closure/goog/messaging/portoperator.js", ["goog.messaging.PortOperator"], ["goog.Disposable", "goog.asserts", "goog.log", "goog.messaging.PortChannel", "goog.messaging.PortNetwork", "goog.object"]); +goog.addDependency("/closure/goog/messaging/respondingchannel.js", ["goog.messaging.RespondingChannel"], ["goog.Disposable", "goog.log", "goog.messaging.MessageChannel", "goog.messaging.MultiChannel", "goog.messaging.MultiChannel.VirtualChannel"]); +goog.addDependency("/closure/goog/messaging/testdata/portchannel_worker.js", ["goog.messaging.testdata.portchannel_worker"], ["goog.messaging.PortChannel"]); +goog.addDependency("/closure/goog/messaging/testdata/portnetwork_worker1.js", ["goog.messaging.testdata.portnetwork_worker1"], ["goog.messaging.PortCaller", "goog.messaging.PortChannel"]); +goog.addDependency("/closure/goog/messaging/testdata/portnetwork_worker2.js", ["goog.messaging.testdata.portnetwork_worker2"], ["goog.messaging.PortCaller", "goog.messaging.PortChannel"]); +goog.addDependency("/closure/goog/module/abstractmoduleloader.js", ["goog.module.AbstractModuleLoader"], []); +goog.addDependency("/closure/goog/module/basemodule.js", ["goog.module.BaseModule"], ["goog.Disposable"]); +goog.addDependency("/closure/goog/module/loader.js", ["goog.module.Loader"], ["goog.Timer", "goog.array", "goog.dom", "goog.object"]); +goog.addDependency("/closure/goog/module/module.js", ["goog.module"], ["goog.array", "goog.module.Loader"]); +goog.addDependency("/closure/goog/module/moduleinfo.js", ["goog.module.ModuleInfo"], ["goog.Disposable", "goog.functions", "goog.module.BaseModule", "goog.module.ModuleLoadCallback"]); +goog.addDependency("/closure/goog/module/moduleloadcallback.js", ["goog.module.ModuleLoadCallback"], ["goog.debug.entryPointRegistry", "goog.debug.errorHandlerWeakDep"]); +goog.addDependency("/closure/goog/module/moduleloader.js", ["goog.module.ModuleLoader"], ["goog.Timer", "goog.array", "goog.events", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventTarget", "goog.log", "goog.module.AbstractModuleLoader", "goog.net.BulkLoader", "goog.net.EventType", "goog.net.jsloader", "goog.userAgent.product"]); +goog.addDependency("/closure/goog/module/moduleloader_test.js", ["goog.module.ModuleLoaderTest"], ["goog.array", "goog.dom", "goog.functions", "goog.module.ModuleLoader", "goog.module.ModuleManager", "goog.module.ModuleManager.CallbackType", "goog.object", "goog.testing.AsyncTestCase", "goog.testing.PropertyReplacer", "goog.testing.events.EventObserver", "goog.testing.jsunit", "goog.testing.recordFunction", "goog.userAgent.product"]); +goog.addDependency("/closure/goog/module/modulemanager.js", ["goog.module.ModuleManager", "goog.module.ModuleManager.CallbackType", "goog.module.ModuleManager.FailureType"], ["goog.Disposable", "goog.array", "goog.asserts", "goog.async.Deferred", "goog.debug.Trace", "goog.dispose", "goog.log", "goog.module.ModuleInfo", "goog.module.ModuleLoadCallback", "goog.object"]); +goog.addDependency("/closure/goog/module/testdata/modA_1.js", ["goog.module.testdata.modA_1"], []); +goog.addDependency("/closure/goog/module/testdata/modA_2.js", ["goog.module.testdata.modA_2"], ["goog.module.ModuleManager"]); +goog.addDependency("/closure/goog/module/testdata/modB_1.js", ["goog.module.testdata.modB_1"], ["goog.module.ModuleManager"]); +goog.addDependency("/closure/goog/net/browserchannel.js", ["goog.net.BrowserChannel", "goog.net.BrowserChannel.Error", "goog.net.BrowserChannel.Event", "goog.net.BrowserChannel.Handler", "goog.net.BrowserChannel.LogSaver", "goog.net.BrowserChannel.QueuedMap", "goog.net.BrowserChannel.ServerReachability", "goog.net.BrowserChannel.ServerReachabilityEvent", "goog.net.BrowserChannel.Stat", "goog.net.BrowserChannel.StatEvent", "goog.net.BrowserChannel.State", "goog.net.BrowserChannel.TimingEvent"], ["goog.Uri", +"goog.array", "goog.asserts", "goog.debug.TextFormatter", "goog.events.Event", "goog.events.EventTarget", "goog.json", "goog.json.EvalJsonProcessor", "goog.log", "goog.net.BrowserTestChannel", "goog.net.ChannelDebug", "goog.net.ChannelRequest", "goog.net.XhrIo", "goog.net.tmpnetwork", "goog.string", "goog.structs", "goog.structs.CircularBuffer"]); +goog.addDependency("/closure/goog/net/browsertestchannel.js", ["goog.net.BrowserTestChannel"], ["goog.json.EvalJsonProcessor", "goog.net.ChannelRequest", "goog.net.ChannelRequest.Error", "goog.net.tmpnetwork", "goog.string.Parser", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/bulkloader.js", ["goog.net.BulkLoader"], ["goog.events.EventHandler", "goog.events.EventTarget", "goog.log", "goog.net.BulkLoaderHelper", "goog.net.EventType", "goog.net.XhrIo"]); +goog.addDependency("/closure/goog/net/bulkloaderhelper.js", ["goog.net.BulkLoaderHelper"], ["goog.Disposable", "goog.log"]); +goog.addDependency("/closure/goog/net/channeldebug.js", ["goog.net.ChannelDebug"], ["goog.json", "goog.log"]); +goog.addDependency("/closure/goog/net/channelrequest.js", ["goog.net.ChannelRequest", "goog.net.ChannelRequest.Error"], ["goog.Timer", "goog.async.Throttle", "goog.events.EventHandler", "goog.net.ErrorCode", "goog.net.EventType", "goog.net.XmlHttp", "goog.object", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/cookies.js", ["goog.net.Cookies", "goog.net.cookies"], []); +goog.addDependency("/closure/goog/net/crossdomainrpc.js", ["goog.net.CrossDomainRpc"], ["goog.Uri", "goog.dom", "goog.events", "goog.events.EventTarget", "goog.events.EventType", "goog.json", "goog.log", "goog.net.EventType", "goog.net.HttpStatus", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/errorcode.js", ["goog.net.ErrorCode"], []); +goog.addDependency("/closure/goog/net/eventtype.js", ["goog.net.EventType"], []); +goog.addDependency("/closure/goog/net/filedownloader.js", ["goog.net.FileDownloader", "goog.net.FileDownloader.Error"], ["goog.Disposable", "goog.asserts", "goog.async.Deferred", "goog.crypt.hash32", "goog.debug.Error", "goog.events", "goog.events.EventHandler", "goog.fs", "goog.fs.DirectoryEntry", "goog.fs.Error", "goog.fs.FileSaver", "goog.net.EventType", "goog.net.XhrIo", "goog.net.XhrIoPool", "goog.object"]); +goog.addDependency("/closure/goog/net/httpstatus.js", ["goog.net.HttpStatus"], []); +goog.addDependency("/closure/goog/net/iframeio.js", ["goog.net.IframeIo", "goog.net.IframeIo.IncrementalDataEvent"], ["goog.Timer", "goog.Uri", "goog.debug", "goog.dom", "goog.events", "goog.events.Event", "goog.events.EventTarget", "goog.events.EventType", "goog.json", "goog.log", "goog.net.ErrorCode", "goog.net.EventType", "goog.reflect", "goog.string", "goog.structs", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/iframeloadmonitor.js", ["goog.net.IframeLoadMonitor"], ["goog.dom", "goog.events", "goog.events.EventTarget", "goog.events.EventType", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/imageloader.js", ["goog.net.ImageLoader"], ["goog.array", "goog.dom", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.net.EventType", "goog.object", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/ipaddress.js", ["goog.net.IpAddress", "goog.net.Ipv4Address", "goog.net.Ipv6Address"], ["goog.array", "goog.math.Integer", "goog.object", "goog.string"]); +goog.addDependency("/closure/goog/net/jsloader.js", ["goog.net.jsloader", "goog.net.jsloader.Error", "goog.net.jsloader.ErrorCode", "goog.net.jsloader.Options"], ["goog.array", "goog.async.Deferred", "goog.debug.Error", "goog.dom", "goog.dom.TagName"]); +goog.addDependency("/closure/goog/net/jsonp.js", ["goog.net.Jsonp"], ["goog.Uri", "goog.net.jsloader"]); +goog.addDependency("/closure/goog/net/mockiframeio.js", ["goog.net.MockIFrameIo"], ["goog.events.EventTarget", "goog.json", "goog.net.ErrorCode", "goog.net.EventType", "goog.net.IframeIo"]); +goog.addDependency("/closure/goog/net/multiiframeloadmonitor.js", ["goog.net.MultiIframeLoadMonitor"], ["goog.events", "goog.net.IframeLoadMonitor"]); +goog.addDependency("/closure/goog/net/networkstatusmonitor.js", ["goog.net.NetworkStatusMonitor"], ["goog.events.Listenable"]); +goog.addDependency("/closure/goog/net/networktester.js", ["goog.net.NetworkTester"], ["goog.Timer", "goog.Uri", "goog.log"]); +goog.addDependency("/closure/goog/net/testdata/jsloader_test1.js", ["goog.net.testdata.jsloader_test1"], []); +goog.addDependency("/closure/goog/net/testdata/jsloader_test2.js", ["goog.net.testdata.jsloader_test2"], []); +goog.addDependency("/closure/goog/net/testdata/jsloader_test3.js", ["goog.net.testdata.jsloader_test3"], []); +goog.addDependency("/closure/goog/net/testdata/jsloader_test4.js", ["goog.net.testdata.jsloader_test4"], []); +goog.addDependency("/closure/goog/net/tmpnetwork.js", ["goog.net.tmpnetwork"], ["goog.Uri", "goog.net.ChannelDebug"]); +goog.addDependency("/closure/goog/net/websocket.js", ["goog.net.WebSocket", "goog.net.WebSocket.ErrorEvent", "goog.net.WebSocket.EventType", "goog.net.WebSocket.MessageEvent"], ["goog.Timer", "goog.asserts", "goog.debug.entryPointRegistry", "goog.events", "goog.events.Event", "goog.events.EventTarget", "goog.log"]); +goog.addDependency("/closure/goog/net/wrapperxmlhttpfactory.js", ["goog.net.WrapperXmlHttpFactory"], ["goog.net.XmlHttpFactory"]); +goog.addDependency("/closure/goog/net/xhrio.js", ["goog.net.XhrIo", "goog.net.XhrIo.ResponseType"], ["goog.Timer", "goog.array", "goog.debug.entryPointRegistry", "goog.events.EventTarget", "goog.json", "goog.log", "goog.net.ErrorCode", "goog.net.EventType", "goog.net.HttpStatus", "goog.net.XmlHttp", "goog.object", "goog.string", "goog.structs", "goog.structs.Map", "goog.uri.utils", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/xhriopool.js", ["goog.net.XhrIoPool"], ["goog.net.XhrIo", "goog.structs", "goog.structs.PriorityPool"]); +goog.addDependency("/closure/goog/net/xhrmanager.js", ["goog.net.XhrManager", "goog.net.XhrManager.Event", "goog.net.XhrManager.Request"], ["goog.Disposable", "goog.events", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventTarget", "goog.net.ErrorCode", "goog.net.EventType", "goog.net.XhrIo", "goog.net.XhrIoPool", "goog.structs", "goog.structs.Map"]); +goog.addDependency("/closure/goog/net/xmlhttp.js", ["goog.net.DefaultXmlHttpFactory", "goog.net.XmlHttp", "goog.net.XmlHttp.OptionType", "goog.net.XmlHttp.ReadyState"], ["goog.net.WrapperXmlHttpFactory", "goog.net.XmlHttpFactory"]); +goog.addDependency("/closure/goog/net/xmlhttpfactory.js", ["goog.net.XmlHttpFactory"], []); +goog.addDependency("/closure/goog/net/xpc/crosspagechannel.js", ["goog.net.xpc.CrossPageChannel"], ["goog.Disposable", "goog.Uri", "goog.async.Deferred", "goog.async.Delay", "goog.dom", "goog.events", "goog.events.EventHandler", "goog.json", "goog.messaging.AbstractChannel", "goog.net.xpc", "goog.net.xpc.CrossPageChannelRole", "goog.net.xpc.FrameElementMethodTransport", "goog.net.xpc.IframePollingTransport", "goog.net.xpc.IframeRelayTransport", "goog.net.xpc.NativeMessagingTransport", "goog.net.xpc.NixTransport", +"goog.net.xpc.Transport", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/xpc/crosspagechannelrole.js", ["goog.net.xpc.CrossPageChannelRole"], []); +goog.addDependency("/closure/goog/net/xpc/frameelementmethodtransport.js", ["goog.net.xpc.FrameElementMethodTransport"], ["goog.net.xpc", "goog.net.xpc.CrossPageChannelRole", "goog.net.xpc.Transport"]); +goog.addDependency("/closure/goog/net/xpc/iframepollingtransport.js", ["goog.net.xpc.IframePollingTransport", "goog.net.xpc.IframePollingTransport.Receiver", "goog.net.xpc.IframePollingTransport.Sender"], ["goog.array", "goog.dom", "goog.net.xpc", "goog.net.xpc.CrossPageChannelRole", "goog.net.xpc.Transport", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/xpc/iframerelaytransport.js", ["goog.net.xpc.IframeRelayTransport"], ["goog.dom", "goog.events", "goog.net.xpc", "goog.net.xpc.Transport", "goog.userAgent"]); +goog.addDependency("/closure/goog/net/xpc/nativemessagingtransport.js", ["goog.net.xpc.NativeMessagingTransport"], ["goog.Timer", "goog.asserts", "goog.async.Deferred", "goog.events", "goog.events.EventHandler", "goog.net.xpc", "goog.net.xpc.CrossPageChannelRole", "goog.net.xpc.Transport"]); +goog.addDependency("/closure/goog/net/xpc/nixtransport.js", ["goog.net.xpc.NixTransport"], ["goog.net.xpc", "goog.net.xpc.CrossPageChannelRole", "goog.net.xpc.Transport", "goog.reflect"]); +goog.addDependency("/closure/goog/net/xpc/relay.js", ["goog.net.xpc.relay"], []); +goog.addDependency("/closure/goog/net/xpc/transport.js", ["goog.net.xpc.Transport"], ["goog.Disposable", "goog.dom", "goog.net.xpc"]); +goog.addDependency("/closure/goog/net/xpc/xpc.js", ["goog.net.xpc", "goog.net.xpc.CfgFields", "goog.net.xpc.ChannelStates", "goog.net.xpc.TransportNames", "goog.net.xpc.TransportTypes", "goog.net.xpc.UriCfgFields"], ["goog.log"]); +goog.addDependency("/closure/goog/object/object.js", ["goog.object"], []); +goog.addDependency("/closure/goog/positioning/absoluteposition.js", ["goog.positioning.AbsolutePosition"], ["goog.math.Box", "goog.math.Coordinate", "goog.math.Size", "goog.positioning", "goog.positioning.AbstractPosition"]); +goog.addDependency("/closure/goog/positioning/abstractposition.js", ["goog.positioning.AbstractPosition"], ["goog.math.Box", "goog.math.Size", "goog.positioning.Corner"]); +goog.addDependency("/closure/goog/positioning/anchoredposition.js", ["goog.positioning.AnchoredPosition"], ["goog.math.Box", "goog.positioning", "goog.positioning.AbstractPosition"]); +goog.addDependency("/closure/goog/positioning/anchoredviewportposition.js", ["goog.positioning.AnchoredViewportPosition"], ["goog.math.Box", "goog.positioning", "goog.positioning.AnchoredPosition", "goog.positioning.Corner", "goog.positioning.Overflow", "goog.positioning.OverflowStatus"]); +goog.addDependency("/closure/goog/positioning/clientposition.js", ["goog.positioning.ClientPosition"], ["goog.asserts", "goog.math.Box", "goog.math.Coordinate", "goog.math.Size", "goog.positioning", "goog.positioning.AbstractPosition", "goog.style"]); +goog.addDependency("/closure/goog/positioning/clientposition_test.js", ["goog.positioning.clientPositionTest"], ["goog.dom", "goog.positioning.ClientPosition", "goog.style", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/positioning/menuanchoredposition.js", ["goog.positioning.MenuAnchoredPosition"], ["goog.math.Box", "goog.math.Size", "goog.positioning", "goog.positioning.AnchoredViewportPosition", "goog.positioning.Corner", "goog.positioning.Overflow"]); +goog.addDependency("/closure/goog/positioning/positioning.js", ["goog.positioning", "goog.positioning.Corner", "goog.positioning.CornerBit", "goog.positioning.Overflow", "goog.positioning.OverflowStatus"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.math.Box", "goog.math.Coordinate", "goog.math.Size", "goog.style", "goog.style.bidi"]); +goog.addDependency("/closure/goog/positioning/positioning_test.js", ["goog.positioningTest"], ["goog.dom", "goog.dom.DomHelper", "goog.math.Box", "goog.math.Coordinate", "goog.math.Rect", "goog.math.Size", "goog.positioning", "goog.positioning.Corner", "goog.positioning.Overflow", "goog.positioning.OverflowStatus", "goog.style", "goog.testing.ExpectedFailures", "goog.testing.jsunit", "goog.userAgent", "goog.userAgent.product"]); +goog.addDependency("/closure/goog/positioning/viewportclientposition.js", ["goog.positioning.ViewportClientPosition"], ["goog.math.Box", "goog.math.Coordinate", "goog.math.Size", "goog.positioning.ClientPosition"]); +goog.addDependency("/closure/goog/positioning/viewportposition.js", ["goog.positioning.ViewportPosition"], ["goog.math.Box", "goog.math.Coordinate", "goog.math.Size", "goog.positioning.AbstractPosition"]); +goog.addDependency("/closure/goog/proto/proto.js", ["goog.proto"], ["goog.proto.Serializer"]); +goog.addDependency("/closure/goog/proto/serializer.js", ["goog.proto.Serializer"], ["goog.json.Serializer", "goog.string"]); +goog.addDependency("/closure/goog/proto2/descriptor.js", ["goog.proto2.Descriptor", "goog.proto2.Metadata"], ["goog.array", "goog.object", "goog.proto2.Util"]); +goog.addDependency("/closure/goog/proto2/fielddescriptor.js", ["goog.proto2.FieldDescriptor"], ["goog.proto2.Util", "goog.string"]); +goog.addDependency("/closure/goog/proto2/lazydeserializer.js", ["goog.proto2.LazyDeserializer"], ["goog.proto2.Message", "goog.proto2.Serializer", "goog.proto2.Util"]); +goog.addDependency("/closure/goog/proto2/message.js", ["goog.proto2.Message"], ["goog.proto2.Descriptor", "goog.proto2.FieldDescriptor", "goog.proto2.Util", "goog.string"]); +goog.addDependency("/closure/goog/proto2/objectserializer.js", ["goog.proto2.ObjectSerializer"], ["goog.proto2.Serializer", "goog.proto2.Util", "goog.string"]); +goog.addDependency("/closure/goog/proto2/package_test.pb.js", ["someprotopackage.TestPackageTypes"], ["goog.proto2.Message", "proto2.TestAllTypes"]); +goog.addDependency("/closure/goog/proto2/pbliteserializer.js", ["goog.proto2.PbLiteSerializer"], ["goog.proto2.LazyDeserializer", "goog.proto2.Util"]); +goog.addDependency("/closure/goog/proto2/serializer.js", ["goog.proto2.Serializer"], ["goog.proto2.Descriptor", "goog.proto2.FieldDescriptor", "goog.proto2.Message", "goog.proto2.Util"]); +goog.addDependency("/closure/goog/proto2/test.pb.js", ["proto2.TestAllTypes", "proto2.TestAllTypes.NestedEnum", "proto2.TestAllTypes.NestedMessage", "proto2.TestAllTypes.OptionalGroup", "proto2.TestAllTypes.RepeatedGroup"], ["goog.proto2.Message"]); +goog.addDependency("/closure/goog/proto2/textformatserializer.js", ["goog.proto2.TextFormatSerializer", "goog.proto2.TextFormatSerializer.Parser"], ["goog.array", "goog.asserts", "goog.json", "goog.proto2.Serializer", "goog.proto2.Util", "goog.string"]); +goog.addDependency("/closure/goog/proto2/textformatserializer_test.js", ["goog.proto2.TextFormatSerializerTest"], ["goog.proto2.TextFormatSerializer", "goog.testing.jsunit", "proto2.TestAllTypes"]); +goog.addDependency("/closure/goog/proto2/util.js", ["goog.proto2.Util"], ["goog.asserts"]); +goog.addDependency("/closure/goog/pubsub/pubsub.js", ["goog.pubsub.PubSub"], ["goog.Disposable", "goog.array"]); +goog.addDependency("/closure/goog/reflect/reflect.js", ["goog.reflect"], []); +goog.addDependency("/closure/goog/result/deferredadaptor.js", ["goog.result.DeferredAdaptor"], ["goog.async.Deferred", "goog.result", "goog.result.Result"]); +goog.addDependency("/closure/goog/result/dependentresult.js", ["goog.result.DependentResult"], ["goog.result.Result"]); +goog.addDependency("/closure/goog/result/result_interface.js", ["goog.result.Result"], []); +goog.addDependency("/closure/goog/result/resultutil.js", ["goog.result"], ["goog.array", "goog.result.DependentResult", "goog.result.Result", "goog.result.SimpleResult"]); +goog.addDependency("/closure/goog/result/simpleresult.js", ["goog.result.SimpleResult", "goog.result.SimpleResult.StateError"], ["goog.debug.Error", "goog.result.Result"]); +goog.addDependency("/closure/goog/soy/data.js", ["goog.soy.data", "goog.soy.data.SanitizedContent", "goog.soy.data.SanitizedContentKind"], []); +goog.addDependency("/closure/goog/soy/renderer.js", ["goog.soy.InjectedDataSupplier", "goog.soy.Renderer"], ["goog.asserts", "goog.dom", "goog.soy", "goog.soy.data.SanitizedContent", "goog.soy.data.SanitizedContentKind"]); +goog.addDependency("/closure/goog/soy/soy.js", ["goog.soy"], ["goog.asserts", "goog.dom", "goog.dom.NodeType", "goog.dom.TagName", "goog.soy.data", "goog.string"]); +goog.addDependency("/closure/goog/soy/soy_test.js", ["goog.soy.testHelper"], ["goog.dom", "goog.soy.data.SanitizedContent", "goog.soy.data.SanitizedContentKind", "goog.string", "goog.userAgent", "goog.dom.TagName"]); +goog.addDependency("/closure/goog/spell/spellcheck.js", ["goog.spell.SpellCheck", "goog.spell.SpellCheck.WordChangedEvent"], ["goog.Timer", "goog.events.EventTarget", "goog.structs.Set"]); +goog.addDependency("/closure/goog/stats/basicstat.js", ["goog.stats.BasicStat"], ["goog.array", "goog.iter", "goog.log", "goog.object", "goog.string.format", "goog.structs.CircularBuffer"]); +goog.addDependency("/closure/goog/storage/collectablestorage.js", ["goog.storage.CollectableStorage"], ["goog.array", "goog.asserts", "goog.iter", "goog.storage.ErrorCode", "goog.storage.ExpiringStorage", "goog.storage.RichStorage.Wrapper", "goog.storage.mechanism.IterableMechanism"]); +goog.addDependency("/closure/goog/storage/encryptedstorage.js", ["goog.storage.EncryptedStorage"], ["goog.crypt", "goog.crypt.Arc4", "goog.crypt.Sha1", "goog.crypt.base64", "goog.json", "goog.json.Serializer", "goog.storage.CollectableStorage", "goog.storage.ErrorCode", "goog.storage.RichStorage", "goog.storage.RichStorage.Wrapper", "goog.storage.mechanism.IterableMechanism"]); +goog.addDependency("/closure/goog/storage/errorcode.js", ["goog.storage.ErrorCode"], []); +goog.addDependency("/closure/goog/storage/expiringstorage.js", ["goog.storage.ExpiringStorage"], ["goog.storage.RichStorage", "goog.storage.RichStorage.Wrapper", "goog.storage.mechanism.Mechanism"]); +goog.addDependency("/closure/goog/storage/mechanism/errorcode.js", ["goog.storage.mechanism.ErrorCode"], []); +goog.addDependency("/closure/goog/storage/mechanism/errorhandlingmechanism.js", ["goog.storage.mechanism.ErrorHandlingMechanism"], ["goog.storage.mechanism.Mechanism"]); +goog.addDependency("/closure/goog/storage/mechanism/html5localstorage.js", ["goog.storage.mechanism.HTML5LocalStorage"], ["goog.storage.mechanism.HTML5WebStorage"]); +goog.addDependency("/closure/goog/storage/mechanism/html5sessionstorage.js", ["goog.storage.mechanism.HTML5SessionStorage"], ["goog.storage.mechanism.HTML5WebStorage"]); +goog.addDependency("/closure/goog/storage/mechanism/html5webstorage.js", ["goog.storage.mechanism.HTML5WebStorage"], ["goog.asserts", "goog.iter.Iterator", "goog.iter.StopIteration", "goog.storage.mechanism.ErrorCode", "goog.storage.mechanism.IterableMechanism"]); +goog.addDependency("/closure/goog/storage/mechanism/ieuserdata.js", ["goog.storage.mechanism.IEUserData"], ["goog.asserts", "goog.iter.Iterator", "goog.iter.StopIteration", "goog.storage.mechanism.ErrorCode", "goog.storage.mechanism.IterableMechanism", "goog.structs.Map", "goog.userAgent"]); +goog.addDependency("/closure/goog/storage/mechanism/iterablemechanism.js", ["goog.storage.mechanism.IterableMechanism"], ["goog.array", "goog.asserts", "goog.iter", "goog.iter.Iterator", "goog.storage.mechanism.Mechanism"]); +goog.addDependency("/closure/goog/storage/mechanism/iterablemechanismtester.js", ["goog.storage.mechanism.iterableMechanismTester"], ["goog.iter.Iterator", "goog.storage.mechanism.IterableMechanism", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/storage/mechanism/mechanism.js", ["goog.storage.mechanism.Mechanism"], []); +goog.addDependency("/closure/goog/storage/mechanism/mechanismfactory.js", ["goog.storage.mechanism.mechanismfactory"], ["goog.storage.mechanism.HTML5LocalStorage", "goog.storage.mechanism.HTML5SessionStorage", "goog.storage.mechanism.IEUserData", "goog.storage.mechanism.IterableMechanism", "goog.storage.mechanism.PrefixedMechanism"]); +goog.addDependency("/closure/goog/storage/mechanism/mechanismseparationtester.js", ["goog.storage.mechanism.mechanismSeparationTester"], ["goog.iter.Iterator", "goog.storage.mechanism.IterableMechanism", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/storage/mechanism/mechanismsharingtester.js", ["goog.storage.mechanism.mechanismSharingTester"], ["goog.iter.Iterator", "goog.storage.mechanism.IterableMechanism", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/storage/mechanism/mechanismtester.js", ["goog.storage.mechanism.mechanismTester"], ["goog.storage.mechanism.ErrorCode", "goog.storage.mechanism.HTML5LocalStorage", "goog.storage.mechanism.Mechanism", "goog.testing.asserts", "goog.userAgent.product", "goog.userAgent.product.isVersion"]); +goog.addDependency("/closure/goog/storage/mechanism/prefixedmechanism.js", ["goog.storage.mechanism.PrefixedMechanism"], ["goog.iter.Iterator", "goog.storage.mechanism.IterableMechanism"]); +goog.addDependency("/closure/goog/storage/richstorage.js", ["goog.storage.RichStorage", "goog.storage.RichStorage.Wrapper"], ["goog.storage.ErrorCode", "goog.storage.Storage", "goog.storage.mechanism.Mechanism"]); +goog.addDependency("/closure/goog/storage/storage.js", ["goog.storage.Storage"], ["goog.json", "goog.json.Serializer", "goog.storage.ErrorCode"]); +goog.addDependency("/closure/goog/storage/storage_test.js", ["goog.storage.storage_test"], ["goog.storage.Storage", "goog.structs.Map", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/string/linkify.js", ["goog.string.linkify"], ["goog.string"]); +goog.addDependency("/closure/goog/string/newlines.js", ["goog.string.newlines", "goog.string.newlines.Line"], ["goog.array"]); +goog.addDependency("/closure/goog/string/newlines_test.js", ["goog.string.newlinesTest"], ["goog.string.newlines", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/string/parser.js", ["goog.string.Parser"], []); +goog.addDependency("/closure/goog/string/path.js", ["goog.string.path"], ["goog.array", "goog.string"]); +goog.addDependency("/closure/goog/string/string.js", ["goog.string", "goog.string.Unicode"], []); +goog.addDependency("/closure/goog/string/string_test.js", ["goog.stringTest"], ["goog.functions", "goog.object", "goog.string", "goog.testing.PropertyReplacer", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/string/stringbuffer.js", ["goog.string.StringBuffer"], []); +goog.addDependency("/closure/goog/string/stringformat.js", ["goog.string.format"], ["goog.string"]); +goog.addDependency("/closure/goog/string/stringifier.js", ["goog.string.Stringifier"], []); +goog.addDependency("/closure/goog/structs/avltree.js", ["goog.structs.AvlTree", "goog.structs.AvlTree.Node"], ["goog.structs.Collection"]); +goog.addDependency("/closure/goog/structs/circularbuffer.js", ["goog.structs.CircularBuffer"], []); +goog.addDependency("/closure/goog/structs/collection.js", ["goog.structs.Collection"], []); +goog.addDependency("/closure/goog/structs/heap.js", ["goog.structs.Heap"], ["goog.array", "goog.object", "goog.structs.Node"]); +goog.addDependency("/closure/goog/structs/inversionmap.js", ["goog.structs.InversionMap"], ["goog.array"]); +goog.addDependency("/closure/goog/structs/linkedmap.js", ["goog.structs.LinkedMap"], ["goog.structs.Map"]); +goog.addDependency("/closure/goog/structs/map.js", ["goog.structs.Map"], ["goog.iter.Iterator", "goog.iter.StopIteration", "goog.object"]); +goog.addDependency("/closure/goog/structs/node.js", ["goog.structs.Node"], []); +goog.addDependency("/closure/goog/structs/pool.js", ["goog.structs.Pool"], ["goog.Disposable", "goog.structs.Queue", "goog.structs.Set"]); +goog.addDependency("/closure/goog/structs/prioritypool.js", ["goog.structs.PriorityPool"], ["goog.structs.Pool", "goog.structs.PriorityQueue"]); +goog.addDependency("/closure/goog/structs/priorityqueue.js", ["goog.structs.PriorityQueue"], ["goog.structs.Heap"]); +goog.addDependency("/closure/goog/structs/quadtree.js", ["goog.structs.QuadTree", "goog.structs.QuadTree.Node", "goog.structs.QuadTree.Point"], ["goog.math.Coordinate"]); +goog.addDependency("/closure/goog/structs/queue.js", ["goog.structs.Queue"], ["goog.array"]); +goog.addDependency("/closure/goog/structs/set.js", ["goog.structs.Set"], ["goog.structs", "goog.structs.Collection", "goog.structs.Map"]); +goog.addDependency("/closure/goog/structs/simplepool.js", ["goog.structs.SimplePool"], ["goog.Disposable"]); +goog.addDependency("/closure/goog/structs/stringset.js", ["goog.structs.StringSet"], ["goog.asserts", "goog.iter"]); +goog.addDependency("/closure/goog/structs/structs.js", ["goog.structs"], ["goog.array", "goog.object"]); +goog.addDependency("/closure/goog/structs/treenode.js", ["goog.structs.TreeNode"], ["goog.array", "goog.asserts", "goog.structs.Node"]); +goog.addDependency("/closure/goog/structs/trie.js", ["goog.structs.Trie"], ["goog.object", "goog.structs"]); +goog.addDependency("/closure/goog/style/bidi.js", ["goog.style.bidi"], ["goog.dom", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/style/cursor.js", ["goog.style.cursor"], ["goog.userAgent"]); +goog.addDependency("/closure/goog/style/style.js", ["goog.style"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.NodeType", "goog.dom.vendor", "goog.math.Box", "goog.math.Coordinate", "goog.math.Rect", "goog.math.Size", "goog.object", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/style/style_test.js", ["goog.style_test"], ["goog.array", "goog.color", "goog.dom", "goog.events.BrowserEvent", "goog.math.Box", "goog.math.Coordinate", "goog.math.Rect", "goog.math.Size", "goog.object", "goog.string", "goog.style", "goog.testing.ExpectedFailures", "goog.testing.PropertyReplacer", "goog.testing.asserts", "goog.testing.jsunit", "goog.userAgent", "goog.userAgent.product", "goog.userAgent.product.isVersion"]); +goog.addDependency("/closure/goog/style/stylescrollbartester.js", ["goog.styleScrollbarTester"], ["goog.dom", "goog.style", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/style/transition.js", ["goog.style.transition", "goog.style.transition.Css3Property"], ["goog.array", "goog.asserts", "goog.dom.vendor", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/testing/asserts.js", ["goog.testing.JsUnitException", "goog.testing.asserts"], ["goog.testing.stacktrace"]); +goog.addDependency("/closure/goog/testing/async/mockcontrol.js", ["goog.testing.async.MockControl"], ["goog.asserts", "goog.async.Deferred", "goog.debug", "goog.testing.asserts", "goog.testing.mockmatchers.IgnoreArgument"]); +goog.addDependency("/closure/goog/testing/asynctestcase.js", ["goog.testing.AsyncTestCase", "goog.testing.AsyncTestCase.ControlBreakingException"], ["goog.testing.TestCase", "goog.testing.TestCase.Test", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/testing/benchmark.js", ["goog.testing.benchmark"], ["goog.dom", "goog.dom.TagName", "goog.testing.PerformanceTable", "goog.testing.PerformanceTimer", "goog.testing.TestCase"]); +goog.addDependency("/closure/goog/testing/continuationtestcase.js", ["goog.testing.ContinuationTestCase", "goog.testing.ContinuationTestCase.Step", "goog.testing.ContinuationTestCase.Test"], ["goog.array", "goog.events.EventHandler", "goog.testing.TestCase", "goog.testing.TestCase.Test", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/testing/deferredtestcase.js", ["goog.testing.DeferredTestCase"], ["goog.async.Deferred", "goog.testing.AsyncTestCase", "goog.testing.TestCase"]); +goog.addDependency("/closure/goog/testing/dom.js", ["goog.testing.dom"], ["goog.dom", "goog.dom.NodeIterator", "goog.dom.NodeType", "goog.dom.TagIterator", "goog.dom.TagName", "goog.dom.classes", "goog.iter", "goog.object", "goog.string", "goog.style", "goog.testing.asserts", "goog.userAgent"]); +goog.addDependency("/closure/goog/testing/editor/dom.js", ["goog.testing.editor.dom"], ["goog.dom.NodeType", "goog.dom.TagIterator", "goog.dom.TagWalkType", "goog.iter", "goog.string", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/testing/editor/fieldmock.js", ["goog.testing.editor.FieldMock"], ["goog.dom", "goog.dom.Range", "goog.editor.Field", "goog.testing.LooseMock", "goog.testing.mockmatchers"]); +goog.addDependency("/closure/goog/testing/editor/testhelper.js", ["goog.testing.editor.TestHelper"], ["goog.Disposable", "goog.dom", "goog.dom.Range", "goog.editor.BrowserFeature", "goog.editor.node", "goog.editor.plugins.AbstractBubblePlugin", "goog.testing.dom"]); +goog.addDependency("/closure/goog/testing/events/eventobserver.js", ["goog.testing.events.EventObserver"], ["goog.array"]); +goog.addDependency("/closure/goog/testing/events/events.js", ["goog.testing.events", "goog.testing.events.Event"], ["goog.Disposable", "goog.asserts", "goog.dom.NodeType", "goog.events", "goog.events.BrowserEvent", "goog.events.BrowserFeature", "goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.object", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/testing/events/matchers.js", ["goog.testing.events.EventMatcher"], ["goog.events.Event", "goog.testing.mockmatchers.ArgumentMatcher"]); +goog.addDependency("/closure/goog/testing/events/onlinehandler.js", ["goog.testing.events.OnlineHandler"], ["goog.events.EventTarget", "goog.net.NetworkStatusMonitor"]); +goog.addDependency("/closure/goog/testing/expectedfailures.js", ["goog.testing.ExpectedFailures"], ["goog.debug.DivConsole", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.EventType", "goog.log", "goog.style", "goog.testing.JsUnitException", "goog.testing.TestCase", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/testing/fs/blob.js", ["goog.testing.fs.Blob"], ["goog.crypt.base64"]); +goog.addDependency("/closure/goog/testing/fs/entry.js", ["goog.testing.fs.DirectoryEntry", "goog.testing.fs.Entry", "goog.testing.fs.FileEntry"], ["goog.Timer", "goog.array", "goog.asserts", "goog.async.Deferred", "goog.fs.DirectoryEntry", "goog.fs.DirectoryEntryImpl", "goog.fs.Entry", "goog.fs.Error", "goog.fs.FileEntry", "goog.functions", "goog.object", "goog.string", "goog.testing.fs.File", "goog.testing.fs.FileWriter"]); +goog.addDependency("/closure/goog/testing/fs/file.js", ["goog.testing.fs.File"], ["goog.testing.fs.Blob"]); +goog.addDependency("/closure/goog/testing/fs/filereader.js", ["goog.testing.fs.FileReader"], ["goog.Timer", "goog.events.EventTarget", "goog.fs.Error", "goog.fs.FileReader.EventType", "goog.fs.FileReader.ReadyState", "goog.testing.fs.File", "goog.testing.fs.ProgressEvent"]); +goog.addDependency("/closure/goog/testing/fs/filesystem.js", ["goog.testing.fs.FileSystem"], ["goog.fs.FileSystem", "goog.testing.fs.DirectoryEntry"]); +goog.addDependency("/closure/goog/testing/fs/filewriter.js", ["goog.testing.fs.FileWriter"], ["goog.Timer", "goog.events.Event", "goog.events.EventTarget", "goog.fs.Error", "goog.fs.FileSaver.EventType", "goog.fs.FileSaver.ReadyState", "goog.string", "goog.testing.fs.File", "goog.testing.fs.ProgressEvent"]); +goog.addDependency("/closure/goog/testing/fs/fs.js", ["goog.testing.fs"], ["goog.Timer", "goog.array", "goog.async.Deferred", "goog.fs", "goog.testing.fs.Blob", "goog.testing.fs.FileSystem"]); +goog.addDependency("/closure/goog/testing/fs/progressevent.js", ["goog.testing.fs.ProgressEvent"], ["goog.events.Event"]); +goog.addDependency("/closure/goog/testing/functionmock.js", ["goog.testing", "goog.testing.FunctionMock", "goog.testing.GlobalFunctionMock", "goog.testing.MethodMock"], ["goog.object", "goog.testing.LooseMock", "goog.testing.Mock", "goog.testing.MockInterface", "goog.testing.PropertyReplacer", "goog.testing.StrictMock"]); +goog.addDependency("/closure/goog/testing/graphics.js", ["goog.testing.graphics"], ["goog.graphics.Path.Segment", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/testing/i18n/asserts.js", ["goog.testing.i18n.asserts"], ["goog.testing.jsunit"]); +goog.addDependency("/closure/goog/testing/i18n/asserts_test.js", ["goog.testing.i18n.assertsTest"], ["goog.testing.i18n.asserts", "goog.testing.ExpectedFailures"]); +goog.addDependency("/closure/goog/testing/jsunit.js", ["goog.testing.jsunit"], ["goog.testing.TestCase", "goog.testing.TestRunner"]); +goog.addDependency("/closure/goog/testing/loosemock.js", ["goog.testing.LooseExpectationCollection", "goog.testing.LooseMock"], ["goog.array", "goog.structs.Map", "goog.testing.Mock"]); +goog.addDependency("/closure/goog/testing/messaging/mockmessagechannel.js", ["goog.testing.messaging.MockMessageChannel"], ["goog.messaging.AbstractChannel", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/testing/messaging/mockmessageevent.js", ["goog.testing.messaging.MockMessageEvent"], ["goog.events.BrowserEvent", "goog.events.EventType", "goog.testing.events"]); +goog.addDependency("/closure/goog/testing/messaging/mockmessageport.js", ["goog.testing.messaging.MockMessagePort"], ["goog.events.EventTarget"]); +goog.addDependency("/closure/goog/testing/messaging/mockportnetwork.js", ["goog.testing.messaging.MockPortNetwork"], ["goog.messaging.PortNetwork", "goog.testing.messaging.MockMessageChannel"]); +goog.addDependency("/closure/goog/testing/mock.js", ["goog.testing.Mock", "goog.testing.MockExpectation"], ["goog.array", "goog.object", "goog.testing.JsUnitException", "goog.testing.MockInterface", "goog.testing.mockmatchers"]); +goog.addDependency("/closure/goog/testing/mockclassfactory.js", ["goog.testing.MockClassFactory", "goog.testing.MockClassRecord"], ["goog.array", "goog.object", "goog.testing.LooseMock", "goog.testing.StrictMock", "goog.testing.TestCase", "goog.testing.mockmatchers"]); +goog.addDependency("/closure/goog/testing/mockclock.js", ["goog.testing.MockClock"], ["goog.Disposable", "goog.testing.PropertyReplacer", "goog.testing.events", "goog.testing.events.Event"]); +goog.addDependency("/closure/goog/testing/mockcontrol.js", ["goog.testing.MockControl"], ["goog.array", "goog.testing", "goog.testing.LooseMock", "goog.testing.MockInterface", "goog.testing.StrictMock"]); +goog.addDependency("/closure/goog/testing/mockinterface.js", ["goog.testing.MockInterface"], []); +goog.addDependency("/closure/goog/testing/mockmatchers.js", ["goog.testing.mockmatchers", "goog.testing.mockmatchers.ArgumentMatcher", "goog.testing.mockmatchers.IgnoreArgument", "goog.testing.mockmatchers.InstanceOf", "goog.testing.mockmatchers.ObjectEquals", "goog.testing.mockmatchers.RegexpMatch", "goog.testing.mockmatchers.SaveArgument", "goog.testing.mockmatchers.TypeOf"], ["goog.array", "goog.dom", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/testing/mockrandom.js", ["goog.testing.MockRandom"], ["goog.Disposable"]); +goog.addDependency("/closure/goog/testing/mockrange.js", ["goog.testing.MockRange"], ["goog.dom.AbstractRange", "goog.testing.LooseMock"]); +goog.addDependency("/closure/goog/testing/mockstorage.js", ["goog.testing.MockStorage"], ["goog.structs.Map"]); +goog.addDependency("/closure/goog/testing/mockuseragent.js", ["goog.testing.MockUserAgent"], ["goog.Disposable", "goog.userAgent"]); +goog.addDependency("/closure/goog/testing/multitestrunner.js", ["goog.testing.MultiTestRunner", "goog.testing.MultiTestRunner.TestFrame"], ["goog.Timer", "goog.array", "goog.dom", "goog.dom.classes", "goog.events.EventHandler", "goog.functions", "goog.string", "goog.ui.Component", "goog.ui.ServerChart", "goog.ui.TableSorter"]); +goog.addDependency("/closure/goog/testing/net/xhrio.js", ["goog.testing.net.XhrIo"], ["goog.array", "goog.dom.xml", "goog.events", "goog.events.EventTarget", "goog.json", "goog.net.ErrorCode", "goog.net.EventType", "goog.net.HttpStatus", "goog.net.XhrIo", "goog.net.XmlHttp", "goog.object", "goog.structs.Map"]); +goog.addDependency("/closure/goog/testing/net/xhriopool.js", ["goog.testing.net.XhrIoPool"], ["goog.net.XhrIoPool", "goog.testing.net.XhrIo"]); +goog.addDependency("/closure/goog/testing/objectpropertystring.js", ["goog.testing.ObjectPropertyString"], []); +goog.addDependency("/closure/goog/testing/performancetable.js", ["goog.testing.PerformanceTable"], ["goog.dom", "goog.testing.PerformanceTimer"]); +goog.addDependency("/closure/goog/testing/performancetimer.js", ["goog.testing.PerformanceTimer", "goog.testing.PerformanceTimer.Task"], ["goog.array", "goog.async.Deferred", "goog.math"]); +goog.addDependency("/closure/goog/testing/propertyreplacer.js", ["goog.testing.PropertyReplacer"], ["goog.userAgent"]); +goog.addDependency("/closure/goog/testing/proto2/proto2.js", ["goog.testing.proto2"], ["goog.proto2.Message", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/testing/pseudorandom.js", ["goog.testing.PseudoRandom"], ["goog.Disposable"]); +goog.addDependency("/closure/goog/testing/recordfunction.js", ["goog.testing.FunctionCall", "goog.testing.recordConstructor", "goog.testing.recordFunction"], []); +goog.addDependency("/closure/goog/testing/shardingtestcase.js", ["goog.testing.ShardingTestCase"], ["goog.asserts", "goog.testing.TestCase"]); +goog.addDependency("/closure/goog/testing/singleton.js", ["goog.testing.singleton"], []); +goog.addDependency("/closure/goog/testing/stacktrace.js", ["goog.testing.stacktrace", "goog.testing.stacktrace.Frame"], []); +goog.addDependency("/closure/goog/testing/storage/fakemechanism.js", ["goog.testing.storage.FakeMechanism"], ["goog.storage.mechanism.IterableMechanism", "goog.structs.Map"]); +goog.addDependency("/closure/goog/testing/strictmock.js", ["goog.testing.StrictMock"], ["goog.array", "goog.testing.Mock"]); +goog.addDependency("/closure/goog/testing/style/layoutasserts.js", ["goog.testing.style.layoutasserts"], ["goog.style", "goog.testing.asserts", "goog.testing.style"]); +goog.addDependency("/closure/goog/testing/style/style.js", ["goog.testing.style"], ["goog.dom", "goog.math.Rect", "goog.style"]); +goog.addDependency("/closure/goog/testing/testcase.js", ["goog.testing.TestCase", "goog.testing.TestCase.Error", "goog.testing.TestCase.Order", "goog.testing.TestCase.Result", "goog.testing.TestCase.Test"], ["goog.object", "goog.testing.asserts", "goog.testing.stacktrace"]); +goog.addDependency("/closure/goog/testing/testqueue.js", ["goog.testing.TestQueue"], []); +goog.addDependency("/closure/goog/testing/testrunner.js", ["goog.testing.TestRunner"], ["goog.testing.TestCase"]); +goog.addDependency("/closure/goog/testing/ui/rendererasserts.js", ["goog.testing.ui.rendererasserts"], ["goog.testing.asserts"]); +goog.addDependency("/closure/goog/testing/ui/rendererharness.js", ["goog.testing.ui.RendererHarness"], ["goog.Disposable", "goog.dom.NodeType", "goog.testing.asserts", "goog.testing.dom"]); +goog.addDependency("/closure/goog/testing/ui/style.js", ["goog.testing.ui.style"], ["goog.array", "goog.dom", "goog.dom.classes", "goog.testing.asserts"]); +goog.addDependency("/closure/goog/timer/timer.js", ["goog.Timer"], ["goog.events.EventTarget"]); +goog.addDependency("/closure/goog/tweak/entries.js", ["goog.tweak.BaseEntry", "goog.tweak.BasePrimitiveSetting", "goog.tweak.BaseSetting", "goog.tweak.BooleanGroup", "goog.tweak.BooleanInGroupSetting", "goog.tweak.BooleanSetting", "goog.tweak.ButtonAction", "goog.tweak.NumericSetting", "goog.tweak.StringSetting"], ["goog.array", "goog.asserts", "goog.log", "goog.object"]); +goog.addDependency("/closure/goog/tweak/registry.js", ["goog.tweak.Registry"], ["goog.asserts", "goog.log", "goog.object", "goog.string", "goog.tweak.BaseEntry", "goog.uri.utils"]); +goog.addDependency("/closure/goog/tweak/testhelpers.js", ["goog.tweak.testhelpers"], ["goog.tweak", "goog.tweak.BooleanGroup", "goog.tweak.BooleanInGroupSetting", "goog.tweak.BooleanSetting", "goog.tweak.ButtonAction", "goog.tweak.NumericSetting", "goog.tweak.Registry", "goog.tweak.StringSetting"]); +goog.addDependency("/closure/goog/tweak/tweak.js", ["goog.tweak", "goog.tweak.ConfigParams"], ["goog.asserts", "goog.tweak.BaseSetting", "goog.tweak.BooleanGroup", "goog.tweak.BooleanInGroupSetting", "goog.tweak.BooleanSetting", "goog.tweak.ButtonAction", "goog.tweak.NumericSetting", "goog.tweak.Registry", "goog.tweak.StringSetting"]); +goog.addDependency("/closure/goog/tweak/tweakui.js", ["goog.tweak.EntriesPanel", "goog.tweak.TweakUi"], ["goog.array", "goog.asserts", "goog.dom.DomHelper", "goog.object", "goog.style", "goog.tweak", "goog.ui.Zippy", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/abstractspellchecker.js", ["goog.ui.AbstractSpellChecker", "goog.ui.AbstractSpellChecker.AsyncResult"], ["goog.a11y.aria", "goog.array", "goog.asserts", "goog.dom", "goog.dom.NodeType", "goog.dom.classes", "goog.dom.selection", "goog.events", "goog.events.Event", "goog.events.EventType", "goog.math.Coordinate", "goog.spell.SpellCheck", "goog.structs.Set", "goog.style", "goog.ui.Component", "goog.ui.MenuItem", "goog.ui.MenuSeparator", "goog.ui.PopupMenu"]); +goog.addDependency("/closure/goog/ui/ac/ac.js", ["goog.ui.ac"], ["goog.ui.ac.ArrayMatcher", "goog.ui.ac.AutoComplete", "goog.ui.ac.InputHandler", "goog.ui.ac.Renderer"]); +goog.addDependency("/closure/goog/ui/ac/arraymatcher.js", ["goog.ui.ac.ArrayMatcher"], ["goog.string"]); +goog.addDependency("/closure/goog/ui/ac/autocomplete.js", ["goog.ui.ac.AutoComplete", "goog.ui.ac.AutoComplete.EventType"], ["goog.array", "goog.asserts", "goog.events", "goog.events.EventTarget", "goog.object"]); +goog.addDependency("/closure/goog/ui/ac/inputhandler.js", ["goog.ui.ac.InputHandler"], ["goog.Disposable", "goog.Timer", "goog.a11y.aria", "goog.dom", "goog.dom.selection", "goog.events.EventHandler", "goog.events.EventType", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.string", "goog.userAgent", "goog.userAgent.product"]); +goog.addDependency("/closure/goog/ui/ac/remote.js", ["goog.ui.ac.Remote"], ["goog.ui.ac.AutoComplete", "goog.ui.ac.InputHandler", "goog.ui.ac.RemoteArrayMatcher", "goog.ui.ac.Renderer"]); +goog.addDependency("/closure/goog/ui/ac/remotearraymatcher.js", ["goog.ui.ac.RemoteArrayMatcher"], ["goog.Disposable", "goog.Uri", "goog.events", "goog.json", "goog.net.EventType", "goog.net.XhrIo"]); +goog.addDependency("/closure/goog/ui/ac/renderer.js", ["goog.ui.ac.Renderer", "goog.ui.ac.Renderer.CustomRenderer"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.array", "goog.dispose", "goog.dom", "goog.dom.NodeType", "goog.dom.classes", "goog.events", "goog.events.EventTarget", "goog.events.EventType", "goog.fx.dom.FadeInAndShow", "goog.fx.dom.FadeOutAndHide", "goog.positioning", "goog.positioning.Corner", "goog.positioning.Overflow", "goog.string", "goog.style", "goog.ui.IdGenerator", +"goog.ui.ac.AutoComplete"]); +goog.addDependency("/closure/goog/ui/ac/renderoptions.js", ["goog.ui.ac.RenderOptions"], []); +goog.addDependency("/closure/goog/ui/ac/richinputhandler.js", ["goog.ui.ac.RichInputHandler"], ["goog.ui.ac.InputHandler"]); +goog.addDependency("/closure/goog/ui/ac/richremote.js", ["goog.ui.ac.RichRemote"], ["goog.ui.ac.AutoComplete", "goog.ui.ac.Remote", "goog.ui.ac.Renderer", "goog.ui.ac.RichInputHandler", "goog.ui.ac.RichRemoteArrayMatcher"]); +goog.addDependency("/closure/goog/ui/ac/richremotearraymatcher.js", ["goog.ui.ac.RichRemoteArrayMatcher"], ["goog.json", "goog.ui.ac.RemoteArrayMatcher"]); +goog.addDependency("/closure/goog/ui/activitymonitor.js", ["goog.ui.ActivityMonitor"], ["goog.array", "goog.asserts", "goog.dom", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType"]); +goog.addDependency("/closure/goog/ui/advancedtooltip.js", ["goog.ui.AdvancedTooltip"], ["goog.events", "goog.events.EventType", "goog.math.Box", "goog.math.Coordinate", "goog.style", "goog.ui.Tooltip", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/animatedzippy.js", ["goog.ui.AnimatedZippy"], ["goog.dom", "goog.events", "goog.fx.Animation", "goog.fx.Transition", "goog.fx.easing", "goog.ui.Zippy", "goog.ui.ZippyEvent"]); +goog.addDependency("/closure/goog/ui/attachablemenu.js", ["goog.ui.AttachableMenu"], ["goog.a11y.aria", "goog.a11y.aria.State", "goog.array", "goog.asserts", "goog.dom", "goog.dom.classes", "goog.events.Event", "goog.events.KeyCodes", "goog.string", "goog.style", "goog.ui.ItemEvent", "goog.ui.MenuBase", "goog.ui.PopupBase", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/bidiinput.js", ["goog.ui.BidiInput"], ["goog.dom", "goog.events", "goog.events.InputHandler", "goog.i18n.bidi", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/bubble.js", ["goog.ui.Bubble"], ["goog.Timer", "goog.events", "goog.events.EventType", "goog.math.Box", "goog.positioning", "goog.positioning.AbsolutePosition", "goog.positioning.AnchoredPosition", "goog.positioning.Corner", "goog.positioning.CornerBit", "goog.style", "goog.ui.Component", "goog.ui.Popup"]); +goog.addDependency("/closure/goog/ui/button.js", ["goog.ui.Button", "goog.ui.Button.Side"], ["goog.events.EventType", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.ui.ButtonRenderer", "goog.ui.ButtonSide", "goog.ui.Component", "goog.ui.Control", "goog.ui.NativeButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/buttonrenderer.js", ["goog.ui.ButtonRenderer"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.asserts", "goog.ui.ButtonSide", "goog.ui.Component", "goog.ui.ControlRenderer"]); +goog.addDependency("/closure/goog/ui/buttonside.js", ["goog.ui.ButtonSide"], []); +goog.addDependency("/closure/goog/ui/charcounter.js", ["goog.ui.CharCounter", "goog.ui.CharCounter.Display"], ["goog.dom", "goog.events", "goog.events.EventTarget", "goog.events.InputHandler"]); +goog.addDependency("/closure/goog/ui/charpicker.js", ["goog.ui.CharPicker"], ["goog.a11y.aria", "goog.a11y.aria.State", "goog.array", "goog.asserts", "goog.dom.classes", "goog.events", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventType", "goog.events.InputHandler", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.i18n.CharListDecompressor", "goog.i18n.uChar", "goog.structs.Set", "goog.style", "goog.ui.Button", "goog.ui.Component", "goog.ui.ContainerScroller", "goog.ui.FlatButtonRenderer", +"goog.ui.HoverCard", "goog.ui.LabelInput", "goog.ui.Menu", "goog.ui.MenuButton", "goog.ui.MenuItem", "goog.ui.Tooltip"]); +goog.addDependency("/closure/goog/ui/checkbox.js", ["goog.ui.Checkbox", "goog.ui.Checkbox.State"], ["goog.a11y.aria", "goog.a11y.aria.State", "goog.asserts", "goog.events.EventType", "goog.events.KeyCodes", "goog.ui.CheckboxRenderer", "goog.ui.Component.EventType", "goog.ui.Component.State", "goog.ui.Control", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/checkboxmenuitem.js", ["goog.ui.CheckBoxMenuItem"], ["goog.ui.MenuItem", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/checkboxrenderer.js", ["goog.ui.CheckboxRenderer"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.array", "goog.asserts", "goog.dom.classes", "goog.object", "goog.ui.ControlRenderer"]); +goog.addDependency("/closure/goog/ui/colorbutton.js", ["goog.ui.ColorButton"], ["goog.ui.Button", "goog.ui.ColorButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/colorbuttonrenderer.js", ["goog.ui.ColorButtonRenderer"], ["goog.dom.classes", "goog.functions", "goog.ui.ColorMenuButtonRenderer"]); +goog.addDependency("/closure/goog/ui/colormenubutton.js", ["goog.ui.ColorMenuButton"], ["goog.array", "goog.object", "goog.ui.ColorMenuButtonRenderer", "goog.ui.ColorPalette", "goog.ui.Component", "goog.ui.Menu", "goog.ui.MenuButton", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/colormenubuttonrenderer.js", ["goog.ui.ColorMenuButtonRenderer"], ["goog.color", "goog.dom.classes", "goog.ui.MenuButtonRenderer", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/colorpalette.js", ["goog.ui.ColorPalette"], ["goog.array", "goog.color", "goog.style", "goog.ui.Palette", "goog.ui.PaletteRenderer"]); +goog.addDependency("/closure/goog/ui/colorpicker.js", ["goog.ui.ColorPicker", "goog.ui.ColorPicker.EventType"], ["goog.ui.ColorPalette", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/colorsplitbehavior.js", ["goog.ui.ColorSplitBehavior"], ["goog.ui.ColorMenuButton", "goog.ui.SplitBehavior"]); +goog.addDependency("/closure/goog/ui/combobox.js", ["goog.ui.ComboBox", "goog.ui.ComboBoxItem"], ["goog.Timer", "goog.dom", "goog.dom.classlist", "goog.events.EventType", "goog.events.InputHandler", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.log", "goog.positioning.Corner", "goog.positioning.MenuAnchoredPosition", "goog.string", "goog.style", "goog.ui.Component", "goog.ui.ItemEvent", "goog.ui.LabelInput", "goog.ui.Menu", "goog.ui.MenuItem", "goog.ui.MenuSeparator", "goog.ui.registry", +"goog.userAgent"]); +goog.addDependency("/closure/goog/ui/component.js", ["goog.ui.Component", "goog.ui.Component.Error", "goog.ui.Component.EventType", "goog.ui.Component.State"], ["goog.array", "goog.asserts", "goog.dom", "goog.dom.NodeType", "goog.events.EventHandler", "goog.events.EventTarget", "goog.object", "goog.style", "goog.ui.IdGenerator"]); +goog.addDependency("/closure/goog/ui/container.js", ["goog.ui.Container", "goog.ui.Container.EventType", "goog.ui.Container.Orientation"], ["goog.a11y.aria", "goog.a11y.aria.State", "goog.asserts", "goog.dom", "goog.events.EventType", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.object", "goog.style", "goog.ui.Component", "goog.ui.ContainerRenderer", "goog.ui.Control"]); +goog.addDependency("/closure/goog/ui/containerrenderer.js", ["goog.ui.ContainerRenderer"], ["goog.a11y.aria", "goog.array", "goog.asserts", "goog.dom.NodeType", "goog.dom.classes", "goog.string", "goog.style", "goog.ui.registry", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/containerscroller.js", ["goog.ui.ContainerScroller"], ["goog.Disposable", "goog.Timer", "goog.events.EventHandler", "goog.style", "goog.ui.Component", "goog.ui.Container"]); +goog.addDependency("/closure/goog/ui/control.js", ["goog.ui.Control"], ["goog.array", "goog.dom", "goog.events.Event", "goog.events.EventType", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.string", "goog.ui.Component", "goog.ui.ControlContent", "goog.ui.ControlRenderer", "goog.ui.decorate", "goog.ui.registry", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/controlcontent.js", ["goog.ui.ControlContent"], []); +goog.addDependency("/closure/goog/ui/controlrenderer.js", ["goog.ui.ControlRenderer"], ["goog.a11y.aria", "goog.a11y.aria.State", "goog.array", "goog.asserts", "goog.dom", "goog.dom.classes", "goog.object", "goog.style", "goog.ui.Component", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/cookieeditor.js", ["goog.ui.CookieEditor"], ["goog.asserts", "goog.dom", "goog.dom.TagName", "goog.events.EventType", "goog.net.cookies", "goog.string", "goog.style", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/css3buttonrenderer.js", ["goog.ui.Css3ButtonRenderer"], ["goog.dom.TagName", "goog.dom.classes", "goog.ui.Button", "goog.ui.ButtonRenderer", "goog.ui.Component", "goog.ui.INLINE_BLOCK_CLASSNAME", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/css3menubuttonrenderer.js", ["goog.ui.Css3MenuButtonRenderer"], ["goog.dom", "goog.dom.TagName", "goog.ui.INLINE_BLOCK_CLASSNAME", "goog.ui.MenuButton", "goog.ui.MenuButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/cssnames.js", ["goog.ui.INLINE_BLOCK_CLASSNAME"], []); +goog.addDependency("/closure/goog/ui/custombutton.js", ["goog.ui.CustomButton"], ["goog.ui.Button", "goog.ui.CustomButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/custombuttonrenderer.js", ["goog.ui.CustomButtonRenderer"], ["goog.a11y.aria.Role", "goog.dom.NodeType", "goog.dom.classes", "goog.string", "goog.ui.ButtonRenderer", "goog.ui.INLINE_BLOCK_CLASSNAME"]); +goog.addDependency("/closure/goog/ui/customcolorpalette.js", ["goog.ui.CustomColorPalette"], ["goog.color", "goog.dom", "goog.dom.classes", "goog.ui.ColorPalette", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/datepicker.js", ["goog.ui.DatePicker", "goog.ui.DatePicker.Events", "goog.ui.DatePickerEvent"], ["goog.a11y.aria", "goog.asserts", "goog.date", "goog.date.Date", "goog.date.Interval", "goog.dom", "goog.dom.NodeType", "goog.dom.classes", "goog.events.Event", "goog.events.EventType", "goog.events.KeyHandler", "goog.i18n.DateTimeFormat", "goog.i18n.DateTimeSymbols", "goog.string", "goog.style", "goog.ui.Component", "goog.ui.DefaultDatePickerRenderer", "goog.ui.IdGenerator"]); +goog.addDependency("/closure/goog/ui/datepickerrenderer.js", ["goog.ui.DatePickerRenderer"], []); +goog.addDependency("/closure/goog/ui/decorate.js", ["goog.ui.decorate"], ["goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/defaultdatepickerrenderer.js", ["goog.ui.DefaultDatePickerRenderer"], ["goog.dom", "goog.dom.TagName", "goog.ui.DatePickerRenderer"]); +goog.addDependency("/closure/goog/ui/dialog.js", ["goog.ui.Dialog", "goog.ui.Dialog.ButtonSet", "goog.ui.Dialog.ButtonSet.DefaultButtons", "goog.ui.Dialog.DefaultButtonCaptions", "goog.ui.Dialog.DefaultButtonKeys", "goog.ui.Dialog.Event", "goog.ui.Dialog.EventType"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.asserts", "goog.dom", "goog.dom.NodeType", "goog.dom.TagName", "goog.dom.classes", "goog.events", "goog.events.Event", "goog.events.EventType", "goog.events.KeyCodes", +"goog.fx.Dragger", "goog.math.Rect", "goog.structs", "goog.structs.Map", "goog.style", "goog.ui.ModalPopup", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/dimensionpicker.js", ["goog.ui.DimensionPicker"], ["goog.events.EventType", "goog.events.KeyCodes", "goog.math.Size", "goog.ui.Component", "goog.ui.Control", "goog.ui.DimensionPickerRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/dimensionpickerrenderer.js", ["goog.ui.DimensionPickerRenderer"], ["goog.a11y.aria", "goog.a11y.aria.State", "goog.dom", "goog.dom.TagName", "goog.i18n.bidi", "goog.style", "goog.ui.ControlRenderer", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/dragdropdetector.js", ["goog.ui.DragDropDetector", "goog.ui.DragDropDetector.EventType", "goog.ui.DragDropDetector.ImageDropEvent", "goog.ui.DragDropDetector.LinkDropEvent"], ["goog.dom", "goog.dom.TagName", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.math.Coordinate", "goog.string", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/drilldownrow.js", ["goog.ui.DrilldownRow"], ["goog.dom", "goog.dom.classes", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/editor/abstractdialog.js", ["goog.ui.editor.AbstractDialog", "goog.ui.editor.AbstractDialog.Builder", "goog.ui.editor.AbstractDialog.EventType"], ["goog.dom", "goog.dom.classes", "goog.events.EventTarget", "goog.string", "goog.ui.Dialog"]); +goog.addDependency("/closure/goog/ui/editor/bubble.js", ["goog.ui.editor.Bubble"], ["goog.dom", "goog.dom.TagName", "goog.dom.ViewportSizeMonitor", "goog.dom.classes", "goog.editor.style", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.log", "goog.math.Box", "goog.object", "goog.positioning", "goog.positioning.Corner", "goog.positioning.Overflow", "goog.positioning.OverflowStatus", "goog.string", "goog.style", "goog.ui.Component", "goog.ui.PopupBase", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/editor/defaulttoolbar.js", ["goog.ui.editor.ButtonDescriptor", "goog.ui.editor.DefaultToolbar"], ["goog.dom", "goog.dom.TagName", "goog.dom.classes", "goog.editor.Command", "goog.style", "goog.ui.editor.ToolbarFactory", "goog.ui.editor.messages", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/editor/equationeditordialog.js", ["goog.ui.editor.EquationEditorDialog"], ["goog.editor.Command", "goog.ui.Dialog", "goog.ui.editor.AbstractDialog", "goog.ui.editor.EquationEditorOkEvent", "goog.ui.equation.TexEditor"]); +goog.addDependency("/closure/goog/ui/editor/equationeditorokevent.js", ["goog.ui.editor.EquationEditorOkEvent"], ["goog.events.Event", "goog.ui.editor.AbstractDialog"]); +goog.addDependency("/closure/goog/ui/editor/linkdialog.js", ["goog.ui.editor.LinkDialog", "goog.ui.editor.LinkDialog.BeforeTestLinkEvent", "goog.ui.editor.LinkDialog.EventType", "goog.ui.editor.LinkDialog.OkEvent"], ["goog.dom", "goog.dom.TagName", "goog.editor.BrowserFeature", "goog.editor.Link", "goog.editor.focus", "goog.editor.node", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventType", "goog.events.InputHandler", "goog.string", "goog.style", "goog.ui.Button", "goog.ui.Component", +"goog.ui.LinkButtonRenderer", "goog.ui.editor.AbstractDialog", "goog.ui.editor.TabPane", "goog.ui.editor.messages", "goog.userAgent", "goog.window"]); +goog.addDependency("/closure/goog/ui/editor/messages.js", ["goog.ui.editor.messages"], []); +goog.addDependency("/closure/goog/ui/editor/tabpane.js", ["goog.ui.editor.TabPane"], ["goog.dom.TagName", "goog.dom.classes", "goog.events.EventHandler", "goog.events.EventType", "goog.style", "goog.ui.Component", "goog.ui.Control", "goog.ui.Tab", "goog.ui.TabBar"]); +goog.addDependency("/closure/goog/ui/editor/toolbarcontroller.js", ["goog.ui.editor.ToolbarController"], ["goog.editor.Field", "goog.events.EventHandler", "goog.events.EventTarget", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/editor/toolbarfactory.js", ["goog.ui.editor.ToolbarFactory"], ["goog.array", "goog.dom", "goog.dom.TagName", "goog.string", "goog.string.Unicode", "goog.style", "goog.ui.Component", "goog.ui.Container", "goog.ui.Option", "goog.ui.Toolbar", "goog.ui.ToolbarButton", "goog.ui.ToolbarColorMenuButton", "goog.ui.ToolbarMenuButton", "goog.ui.ToolbarRenderer", "goog.ui.ToolbarSelect", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/emoji/emoji.js", ["goog.ui.emoji.Emoji"], []); +goog.addDependency("/closure/goog/ui/emoji/emojipalette.js", ["goog.ui.emoji.EmojiPalette"], ["goog.events.EventType", "goog.net.ImageLoader", "goog.ui.Palette", "goog.ui.emoji.Emoji", "goog.ui.emoji.EmojiPaletteRenderer"]); +goog.addDependency("/closure/goog/ui/emoji/emojipaletterenderer.js", ["goog.ui.emoji.EmojiPaletteRenderer"], ["goog.a11y.aria", "goog.dom.NodeType", "goog.dom.classes", "goog.style", "goog.ui.PaletteRenderer", "goog.ui.emoji.Emoji"]); +goog.addDependency("/closure/goog/ui/emoji/emojipicker.js", ["goog.ui.emoji.EmojiPicker"], ["goog.log", "goog.style", "goog.ui.Component", "goog.ui.TabPane", "goog.ui.emoji.Emoji", "goog.ui.emoji.EmojiPalette", "goog.ui.emoji.EmojiPaletteRenderer", "goog.ui.emoji.ProgressiveEmojiPaletteRenderer"]); +goog.addDependency("/closure/goog/ui/emoji/popupemojipicker.js", ["goog.ui.emoji.PopupEmojiPicker"], ["goog.events.EventType", "goog.positioning.AnchoredPosition", "goog.positioning.Corner", "goog.ui.Component", "goog.ui.Popup", "goog.ui.emoji.EmojiPicker"]); +goog.addDependency("/closure/goog/ui/emoji/progressiveemojipaletterenderer.js", ["goog.ui.emoji.ProgressiveEmojiPaletteRenderer"], ["goog.style", "goog.ui.emoji.EmojiPaletteRenderer"]); +goog.addDependency("/closure/goog/ui/emoji/spriteinfo.js", ["goog.ui.emoji.SpriteInfo"], []); +goog.addDependency("/closure/goog/ui/equation/arrowpalette.js", ["goog.ui.equation.ArrowPalette"], ["goog.math.Size", "goog.ui.equation.Palette"]); +goog.addDependency("/closure/goog/ui/equation/changeevent.js", ["goog.ui.equation.ChangeEvent"], ["goog.events.Event"]); +goog.addDependency("/closure/goog/ui/equation/comparisonpalette.js", ["goog.ui.equation.ComparisonPalette"], ["goog.math.Size", "goog.ui.equation.Palette"]); +goog.addDependency("/closure/goog/ui/equation/editorpane.js", ["goog.ui.equation.EditorPane"], ["goog.style", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/equation/equationeditor.js", ["goog.ui.equation.EquationEditor"], ["goog.events", "goog.ui.Component", "goog.ui.TabBar", "goog.ui.equation.ImageRenderer", "goog.ui.equation.TexPane"]); +goog.addDependency("/closure/goog/ui/equation/equationeditordialog.js", ["goog.ui.equation.EquationEditorDialog"], ["goog.dom", "goog.dom.classes", "goog.ui.Dialog", "goog.ui.equation.EquationEditor", "goog.ui.equation.PaletteManager", "goog.ui.equation.TexEditor"]); +goog.addDependency("/closure/goog/ui/equation/greekpalette.js", ["goog.ui.equation.GreekPalette"], ["goog.math.Size", "goog.ui.equation.Palette"]); +goog.addDependency("/closure/goog/ui/equation/imagerenderer.js", ["goog.ui.equation.ImageRenderer"], ["goog.dom.TagName", "goog.dom.classes", "goog.string", "goog.uri.utils"]); +goog.addDependency("/closure/goog/ui/equation/mathpalette.js", ["goog.ui.equation.MathPalette"], ["goog.math.Size", "goog.ui.equation.Palette"]); +goog.addDependency("/closure/goog/ui/equation/menupalette.js", ["goog.ui.equation.MenuPalette", "goog.ui.equation.MenuPaletteRenderer"], ["goog.math.Size", "goog.ui.PaletteRenderer", "goog.ui.equation.Palette", "goog.ui.equation.PaletteRenderer"]); +goog.addDependency("/closure/goog/ui/equation/palette.js", ["goog.ui.equation.Palette", "goog.ui.equation.PaletteEvent", "goog.ui.equation.PaletteRenderer"], ["goog.dom", "goog.dom.TagName", "goog.events.Event", "goog.ui.Palette", "goog.ui.PaletteRenderer"]); +goog.addDependency("/closure/goog/ui/equation/palettemanager.js", ["goog.ui.equation.PaletteManager"], ["goog.Timer", "goog.events.EventHandler", "goog.events.EventTarget", "goog.ui.equation.ArrowPalette", "goog.ui.equation.ComparisonPalette", "goog.ui.equation.GreekPalette", "goog.ui.equation.MathPalette", "goog.ui.equation.MenuPalette", "goog.ui.equation.Palette", "goog.ui.equation.SymbolPalette"]); +goog.addDependency("/closure/goog/ui/equation/symbolpalette.js", ["goog.ui.equation.SymbolPalette"], ["goog.math.Size", "goog.ui.equation.Palette"]); +goog.addDependency("/closure/goog/ui/equation/texeditor.js", ["goog.ui.equation.TexEditor"], ["goog.ui.Component", "goog.ui.equation.ImageRenderer", "goog.ui.equation.TexPane"]); +goog.addDependency("/closure/goog/ui/equation/texpane.js", ["goog.ui.equation.TexPane"], ["goog.Timer", "goog.dom", "goog.dom.TagName", "goog.dom.selection", "goog.events", "goog.events.EventType", "goog.events.InputHandler", "goog.style", "goog.ui.equation.ChangeEvent", "goog.ui.equation.EditorPane", "goog.ui.equation.ImageRenderer", "goog.ui.equation.Palette", "goog.ui.equation.PaletteEvent"]); +goog.addDependency("/closure/goog/ui/filteredmenu.js", ["goog.ui.FilteredMenu"], ["goog.dom", "goog.events", "goog.events.EventType", "goog.events.InputHandler", "goog.events.KeyCodes", "goog.string", "goog.style", "goog.ui.Component", "goog.ui.FilterObservingMenuItem", "goog.ui.Menu", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/filterobservingmenuitem.js", ["goog.ui.FilterObservingMenuItem"], ["goog.ui.FilterObservingMenuItemRenderer", "goog.ui.MenuItem", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/filterobservingmenuitemrenderer.js", ["goog.ui.FilterObservingMenuItemRenderer"], ["goog.ui.MenuItemRenderer"]); +goog.addDependency("/closure/goog/ui/flatbuttonrenderer.js", ["goog.ui.FlatButtonRenderer"], ["goog.a11y.aria.Role", "goog.dom.classes", "goog.ui.Button", "goog.ui.ButtonRenderer", "goog.ui.INLINE_BLOCK_CLASSNAME", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/flatmenubuttonrenderer.js", ["goog.ui.FlatMenuButtonRenderer"], ["goog.a11y.aria", "goog.a11y.aria.State", "goog.asserts", "goog.dom", "goog.string", "goog.style", "goog.ui.Component", "goog.ui.FlatButtonRenderer", "goog.ui.INLINE_BLOCK_CLASSNAME", "goog.ui.Menu", "goog.ui.MenuButton", "goog.ui.MenuRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/formpost.js", ["goog.ui.FormPost"], ["goog.array", "goog.dom.TagName", "goog.string", "goog.string.StringBuffer", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/gauge.js", ["goog.ui.Gauge", "goog.ui.GaugeColoredRange"], ["goog.a11y.aria", "goog.asserts", "goog.events", "goog.fx.Animation", "goog.fx.Transition", "goog.fx.easing", "goog.graphics", "goog.graphics.Font", "goog.graphics.Path", "goog.graphics.SolidFill", "goog.math", "goog.ui.Component", "goog.ui.GaugeTheme"]); +goog.addDependency("/closure/goog/ui/gaugetheme.js", ["goog.ui.GaugeTheme"], ["goog.graphics.LinearGradient", "goog.graphics.SolidFill", "goog.graphics.Stroke"]); +goog.addDependency("/closure/goog/ui/hovercard.js", ["goog.ui.HoverCard", "goog.ui.HoverCard.EventType", "goog.ui.HoverCard.TriggerEvent"], ["goog.array", "goog.dom", "goog.events", "goog.events.Event", "goog.events.EventType", "goog.ui.AdvancedTooltip", "goog.ui.PopupBase", "goog.ui.Tooltip"]); +goog.addDependency("/closure/goog/ui/hsvapalette.js", ["goog.ui.HsvaPalette"], ["goog.array", "goog.color.alpha", "goog.dom", "goog.dom.TagName", "goog.events", "goog.events.EventType", "goog.style", "goog.ui.Component", "goog.ui.HsvPalette"]); +goog.addDependency("/closure/goog/ui/hsvpalette.js", ["goog.ui.HsvPalette"], ["goog.color", "goog.dom.TagName", "goog.events", "goog.events.EventType", "goog.events.InputHandler", "goog.style", "goog.style.bidi", "goog.ui.Component", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/idgenerator.js", ["goog.ui.IdGenerator"], []); +goog.addDependency("/closure/goog/ui/idletimer.js", ["goog.ui.IdleTimer"], ["goog.Timer", "goog.events", "goog.events.EventTarget", "goog.structs.Set", "goog.ui.ActivityMonitor"]); +goog.addDependency("/closure/goog/ui/iframemask.js", ["goog.ui.IframeMask"], ["goog.Disposable", "goog.Timer", "goog.dom", "goog.dom.iframe", "goog.events.EventHandler", "goog.style"]); +goog.addDependency("/closure/goog/ui/imagelessbuttonrenderer.js", ["goog.ui.ImagelessButtonRenderer"], ["goog.dom.classes", "goog.ui.Button", "goog.ui.Component", "goog.ui.CustomButtonRenderer", "goog.ui.INLINE_BLOCK_CLASSNAME", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/imagelessmenubuttonrenderer.js", ["goog.ui.ImagelessMenuButtonRenderer"], ["goog.dom", "goog.dom.TagName", "goog.dom.classes", "goog.ui.INLINE_BLOCK_CLASSNAME", "goog.ui.MenuButton", "goog.ui.MenuButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/inputdatepicker.js", ["goog.ui.InputDatePicker"], ["goog.date.DateTime", "goog.dom", "goog.string", "goog.ui.Component", "goog.ui.DatePicker", "goog.ui.PopupBase", "goog.ui.PopupDatePicker"]); +goog.addDependency("/closure/goog/ui/itemevent.js", ["goog.ui.ItemEvent"], ["goog.events.Event"]); +goog.addDependency("/closure/goog/ui/keyboardshortcuthandler.js", ["goog.ui.KeyboardShortcutEvent", "goog.ui.KeyboardShortcutHandler", "goog.ui.KeyboardShortcutHandler.EventType"], ["goog.Timer", "goog.events", "goog.events.Event", "goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.events.KeyNames", "goog.object", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/labelinput.js", ["goog.ui.LabelInput"], ["goog.Timer", "goog.a11y.aria", "goog.a11y.aria.State", "goog.asserts", "goog.dom", "goog.dom.classlist", "goog.events.EventHandler", "goog.events.EventType", "goog.ui.Component", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/linkbuttonrenderer.js", ["goog.ui.LinkButtonRenderer"], ["goog.ui.Button", "goog.ui.FlatButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/media/flashobject.js", ["goog.ui.media.FlashObject", "goog.ui.media.FlashObject.ScriptAccessLevel", "goog.ui.media.FlashObject.Wmodes"], ["goog.asserts", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventType", "goog.log", "goog.object", "goog.string", "goog.structs.Map", "goog.style", "goog.ui.Component", "goog.userAgent", "goog.userAgent.flash"]); +goog.addDependency("/closure/goog/ui/media/flickr.js", ["goog.ui.media.FlickrSet", "goog.ui.media.FlickrSetModel"], ["goog.ui.media.FlashObject", "goog.ui.media.Media", "goog.ui.media.MediaModel", "goog.ui.media.MediaRenderer"]); +goog.addDependency("/closure/goog/ui/media/googlevideo.js", ["goog.ui.media.GoogleVideo", "goog.ui.media.GoogleVideoModel"], ["goog.string", "goog.ui.media.FlashObject", "goog.ui.media.Media", "goog.ui.media.MediaModel", "goog.ui.media.MediaRenderer"]); +goog.addDependency("/closure/goog/ui/media/media.js", ["goog.ui.media.Media", "goog.ui.media.MediaRenderer"], ["goog.style", "goog.ui.Component", "goog.ui.Control", "goog.ui.ControlRenderer"]); +goog.addDependency("/closure/goog/ui/media/mediamodel.js", ["goog.ui.media.MediaModel", "goog.ui.media.MediaModel.Category", "goog.ui.media.MediaModel.Credit", "goog.ui.media.MediaModel.Credit.Role", "goog.ui.media.MediaModel.Credit.Scheme", "goog.ui.media.MediaModel.Medium", "goog.ui.media.MediaModel.MimeType", "goog.ui.media.MediaModel.Player", "goog.ui.media.MediaModel.SubTitle", "goog.ui.media.MediaModel.Thumbnail"], ["goog.array"]); +goog.addDependency("/closure/goog/ui/media/mp3.js", ["goog.ui.media.Mp3"], ["goog.string", "goog.ui.media.FlashObject", "goog.ui.media.Media", "goog.ui.media.MediaRenderer"]); +goog.addDependency("/closure/goog/ui/media/photo.js", ["goog.ui.media.Photo"], ["goog.ui.media.Media", "goog.ui.media.MediaRenderer"]); +goog.addDependency("/closure/goog/ui/media/picasa.js", ["goog.ui.media.PicasaAlbum", "goog.ui.media.PicasaAlbumModel"], ["goog.ui.media.FlashObject", "goog.ui.media.Media", "goog.ui.media.MediaModel", "goog.ui.media.MediaRenderer"]); +goog.addDependency("/closure/goog/ui/media/vimeo.js", ["goog.ui.media.Vimeo", "goog.ui.media.VimeoModel"], ["goog.string", "goog.ui.media.FlashObject", "goog.ui.media.Media", "goog.ui.media.MediaModel", "goog.ui.media.MediaRenderer"]); +goog.addDependency("/closure/goog/ui/media/youtube.js", ["goog.ui.media.Youtube", "goog.ui.media.YoutubeModel"], ["goog.string", "goog.ui.Component", "goog.ui.media.FlashObject", "goog.ui.media.Media", "goog.ui.media.MediaModel", "goog.ui.media.MediaRenderer"]); +goog.addDependency("/closure/goog/ui/menu.js", ["goog.ui.Menu", "goog.ui.Menu.EventType"], ["goog.math.Coordinate", "goog.string", "goog.style", "goog.ui.Component.EventType", "goog.ui.Component.State", "goog.ui.Container", "goog.ui.Container.Orientation", "goog.ui.MenuHeader", "goog.ui.MenuItem", "goog.ui.MenuRenderer", "goog.ui.MenuSeparator"]); +goog.addDependency("/closure/goog/ui/menubar.js", ["goog.ui.menuBar"], ["goog.ui.Container", "goog.ui.MenuBarRenderer"]); +goog.addDependency("/closure/goog/ui/menubardecorator.js", ["goog.ui.menuBarDecorator"], ["goog.ui.MenuBarRenderer", "goog.ui.menuBar", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/menubarrenderer.js", ["goog.ui.MenuBarRenderer"], ["goog.a11y.aria.Role", "goog.ui.Container", "goog.ui.ContainerRenderer"]); +goog.addDependency("/closure/goog/ui/menubase.js", ["goog.ui.MenuBase"], ["goog.events.EventHandler", "goog.events.EventType", "goog.events.KeyHandler", "goog.ui.Popup"]); +goog.addDependency("/closure/goog/ui/menubutton.js", ["goog.ui.MenuButton"], ["goog.Timer", "goog.a11y.aria", "goog.a11y.aria.State", "goog.asserts", "goog.dom", "goog.events.EventType", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.math.Box", "goog.math.Rect", "goog.positioning", "goog.positioning.Corner", "goog.positioning.MenuAnchoredPosition", "goog.positioning.Overflow", "goog.style", "goog.ui.Button", "goog.ui.Component", "goog.ui.Menu", "goog.ui.MenuButtonRenderer", "goog.ui.registry", +"goog.userAgent", "goog.userAgent.product"]); +goog.addDependency("/closure/goog/ui/menubuttonrenderer.js", ["goog.ui.MenuButtonRenderer"], ["goog.a11y.aria", "goog.a11y.aria.State", "goog.asserts", "goog.dom", "goog.string", "goog.style", "goog.ui.Component", "goog.ui.CustomButtonRenderer", "goog.ui.INLINE_BLOCK_CLASSNAME", "goog.ui.Menu", "goog.ui.MenuRenderer", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/menuheader.js", ["goog.ui.MenuHeader"], ["goog.ui.Component", "goog.ui.Control", "goog.ui.MenuHeaderRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/menuheaderrenderer.js", ["goog.ui.MenuHeaderRenderer"], ["goog.ui.ControlRenderer"]); +goog.addDependency("/closure/goog/ui/menuitem.js", ["goog.ui.MenuItem"], ["goog.array", "goog.dom", "goog.dom.classes", "goog.math.Coordinate", "goog.string", "goog.ui.Component", "goog.ui.Control", "goog.ui.MenuItemRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/menuitemrenderer.js", ["goog.ui.MenuItemRenderer"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.dom", "goog.dom.classes", "goog.ui.Component", "goog.ui.ControlRenderer"]); +goog.addDependency("/closure/goog/ui/menurenderer.js", ["goog.ui.MenuRenderer"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.asserts", "goog.dom", "goog.ui.ContainerRenderer", "goog.ui.Separator"]); +goog.addDependency("/closure/goog/ui/menuseparator.js", ["goog.ui.MenuSeparator"], ["goog.ui.MenuSeparatorRenderer", "goog.ui.Separator", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/menuseparatorrenderer.js", ["goog.ui.MenuSeparatorRenderer"], ["goog.dom", "goog.dom.classes", "goog.ui.ControlContent", "goog.ui.ControlRenderer"]); +goog.addDependency("/closure/goog/ui/mockactivitymonitor.js", ["goog.ui.MockActivityMonitor"], ["goog.events.EventType", "goog.ui.ActivityMonitor"]); +goog.addDependency("/closure/goog/ui/mockactivitymonitor_test.js", ["goog.ui.MockActivityMonitorTest"], ["goog.events", "goog.functions", "goog.testing.jsunit", "goog.testing.recordFunction", "goog.ui.ActivityMonitor", "goog.ui.MockActivityMonitor"]); +goog.addDependency("/closure/goog/ui/modalpopup.js", ["goog.ui.ModalPopup"], ["goog.Timer", "goog.a11y.aria", "goog.a11y.aria.State", "goog.asserts", "goog.dom", "goog.dom.NodeType", "goog.dom.TagName", "goog.dom.classes", "goog.dom.iframe", "goog.events", "goog.events.EventType", "goog.events.FocusHandler", "goog.fx.Transition", "goog.style", "goog.ui.Component", "goog.ui.PopupBase", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/nativebuttonrenderer.js", ["goog.ui.NativeButtonRenderer"], ["goog.dom.classes", "goog.events.EventType", "goog.ui.ButtonRenderer", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/offlineinstalldialog.js", ["goog.ui.OfflineInstallDialog", "goog.ui.OfflineInstallDialog.ButtonKeyType", "goog.ui.OfflineInstallDialog.EnableScreen", "goog.ui.OfflineInstallDialog.InstallScreen", "goog.ui.OfflineInstallDialog.InstallingGearsScreen", "goog.ui.OfflineInstallDialog.ScreenType", "goog.ui.OfflineInstallDialog.UpgradeScreen", "goog.ui.OfflineInstallDialogScreen"], ["goog.Disposable", "goog.dom.classes", "goog.gears", "goog.string", "goog.string.StringBuffer", +"goog.ui.Dialog", "goog.window"]); +goog.addDependency("/closure/goog/ui/offlinestatuscard.js", ["goog.ui.OfflineStatusCard", "goog.ui.OfflineStatusCard.EventType"], ["goog.dom", "goog.events.EventType", "goog.gears.StatusType", "goog.structs.Map", "goog.style", "goog.ui.Component", "goog.ui.ProgressBar"]); +goog.addDependency("/closure/goog/ui/offlinestatuscomponent.js", ["goog.ui.OfflineStatusComponent", "goog.ui.OfflineStatusComponent.StatusClassNames"], ["goog.dom.classes", "goog.events.EventType", "goog.gears.StatusType", "goog.positioning.AnchoredPosition", "goog.positioning.Corner", "goog.positioning.Overflow", "goog.ui.Component", "goog.ui.OfflineStatusCard", "goog.ui.Popup"]); +goog.addDependency("/closure/goog/ui/option.js", ["goog.ui.Option"], ["goog.ui.Component", "goog.ui.MenuItem", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/palette.js", ["goog.ui.Palette"], ["goog.array", "goog.dom", "goog.events", "goog.events.EventType", "goog.events.KeyCodes", "goog.math.Size", "goog.ui.Component", "goog.ui.Control", "goog.ui.PaletteRenderer", "goog.ui.SelectionModel"]); +goog.addDependency("/closure/goog/ui/paletterenderer.js", ["goog.ui.PaletteRenderer"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.array", "goog.dom", "goog.dom.NodeIterator", "goog.dom.NodeType", "goog.dom.TagName", "goog.dom.classes", "goog.iter", "goog.style", "goog.ui.ControlRenderer", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/plaintextspellchecker.js", ["goog.ui.PlainTextSpellChecker"], ["goog.Timer", "goog.a11y.aria", "goog.asserts", "goog.dom", "goog.events.EventHandler", "goog.events.EventType", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.spell.SpellCheck", "goog.style", "goog.ui.AbstractSpellChecker", "goog.ui.Component", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/popup.js", ["goog.ui.Popup", "goog.ui.Popup.AbsolutePosition", "goog.ui.Popup.AnchoredPosition", "goog.ui.Popup.AnchoredViewPortPosition", "goog.ui.Popup.ClientPosition", "goog.ui.Popup.Corner", "goog.ui.Popup.Overflow", "goog.ui.Popup.ViewPortClientPosition", "goog.ui.Popup.ViewPortPosition"], ["goog.math.Box", "goog.positioning.AbsolutePosition", "goog.positioning.AnchoredPosition", "goog.positioning.AnchoredViewportPosition", "goog.positioning.ClientPosition", +"goog.positioning.Corner", "goog.positioning.Overflow", "goog.positioning.ViewportClientPosition", "goog.positioning.ViewportPosition", "goog.style", "goog.ui.PopupBase"]); +goog.addDependency("/closure/goog/ui/popupbase.js", ["goog.ui.PopupBase", "goog.ui.PopupBase.EventType", "goog.ui.PopupBase.Type"], ["goog.Timer", "goog.dom", "goog.events", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.fx.Transition", "goog.style", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/popupcolorpicker.js", ["goog.ui.PopupColorPicker"], ["goog.dom.classes", "goog.events.EventType", "goog.positioning.AnchoredPosition", "goog.positioning.Corner", "goog.ui.ColorPicker", "goog.ui.Component", "goog.ui.Popup"]); +goog.addDependency("/closure/goog/ui/popupdatepicker.js", ["goog.ui.PopupDatePicker"], ["goog.events.EventType", "goog.positioning.AnchoredPosition", "goog.positioning.Corner", "goog.style", "goog.ui.Component", "goog.ui.DatePicker", "goog.ui.Popup", "goog.ui.PopupBase"]); +goog.addDependency("/closure/goog/ui/popupmenu.js", ["goog.ui.PopupMenu"], ["goog.events.EventType", "goog.positioning.AnchoredViewportPosition", "goog.positioning.Corner", "goog.positioning.MenuAnchoredPosition", "goog.positioning.ViewportClientPosition", "goog.structs", "goog.structs.Map", "goog.style", "goog.ui.Component.EventType", "goog.ui.Menu", "goog.ui.PopupBase", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/progressbar.js", ["goog.ui.ProgressBar", "goog.ui.ProgressBar.Orientation"], ["goog.a11y.aria", "goog.asserts", "goog.dom", "goog.dom.classes", "goog.events", "goog.events.EventType", "goog.ui.Component", "goog.ui.RangeModel", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/prompt.js", ["goog.ui.Prompt"], ["goog.Timer", "goog.dom", "goog.events", "goog.events.EventType", "goog.functions", "goog.ui.Component", "goog.ui.Dialog", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/rangemodel.js", ["goog.ui.RangeModel"], ["goog.events.EventTarget", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/ratings.js", ["goog.ui.Ratings", "goog.ui.Ratings.EventType"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.asserts", "goog.dom.classes", "goog.events.EventType", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/registry.js", ["goog.ui.registry"], ["goog.dom.classes"]); +goog.addDependency("/closure/goog/ui/richtextspellchecker.js", ["goog.ui.RichTextSpellChecker"], ["goog.Timer", "goog.dom", "goog.dom.NodeType", "goog.events", "goog.events.EventType", "goog.spell.SpellCheck", "goog.string.StringBuffer", "goog.ui.AbstractSpellChecker"]); +goog.addDependency("/closure/goog/ui/roundedpanel.js", ["goog.ui.BaseRoundedPanel", "goog.ui.CssRoundedPanel", "goog.ui.GraphicsRoundedPanel", "goog.ui.RoundedPanel", "goog.ui.RoundedPanel.Corner"], ["goog.dom", "goog.dom.classes", "goog.graphics", "goog.graphics.Path", "goog.graphics.SolidFill", "goog.graphics.Stroke", "goog.math", "goog.math.Coordinate", "goog.style", "goog.ui.Component", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/roundedtabrenderer.js", ["goog.ui.RoundedTabRenderer"], ["goog.dom", "goog.ui.Tab", "goog.ui.TabBar", "goog.ui.TabRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/scrollfloater.js", ["goog.ui.ScrollFloater", "goog.ui.ScrollFloater.EventType"], ["goog.array", "goog.dom", "goog.dom.classes", "goog.events.EventType", "goog.style", "goog.ui.Component", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/select.js", ["goog.ui.Select"], ["goog.a11y.aria.Role", "goog.events.EventType", "goog.ui.Component", "goog.ui.MenuButton", "goog.ui.MenuItem", "goog.ui.SelectionModel", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/selectionmenubutton.js", ["goog.ui.SelectionMenuButton", "goog.ui.SelectionMenuButton.SelectionState"], ["goog.events.EventType", "goog.style", "goog.ui.Component", "goog.ui.MenuButton", "goog.ui.MenuItem", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/selectionmodel.js", ["goog.ui.SelectionModel"], ["goog.array", "goog.events.EventTarget", "goog.events.EventType"]); +goog.addDependency("/closure/goog/ui/separator.js", ["goog.ui.Separator"], ["goog.a11y.aria", "goog.asserts", "goog.ui.Component", "goog.ui.Control", "goog.ui.MenuSeparatorRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/serverchart.js", ["goog.ui.ServerChart", "goog.ui.ServerChart.AxisDisplayType", "goog.ui.ServerChart.ChartType", "goog.ui.ServerChart.EncodingType", "goog.ui.ServerChart.Event", "goog.ui.ServerChart.LegendPosition", "goog.ui.ServerChart.MaximumValue", "goog.ui.ServerChart.MultiAxisAlignment", "goog.ui.ServerChart.MultiAxisType", "goog.ui.ServerChart.UriParam", "goog.ui.ServerChart.UriTooLongEvent"], ["goog.Uri", "goog.array", "goog.asserts", "goog.events.Event", +"goog.string", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/slider.js", ["goog.ui.Slider", "goog.ui.Slider.Orientation"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.dom", "goog.ui.SliderBase"]); +goog.addDependency("/closure/goog/ui/sliderbase.js", ["goog.ui.SliderBase", "goog.ui.SliderBase.AnimationFactory", "goog.ui.SliderBase.Orientation"], ["goog.Timer", "goog.a11y.aria", "goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.array", "goog.asserts", "goog.dom", "goog.dom.classes", "goog.events", "goog.events.EventType", "goog.events.KeyCodes", "goog.events.KeyHandler", "goog.events.MouseWheelHandler", "goog.fx.AnimationParallelQueue", "goog.fx.Dragger", "goog.fx.Transition", "goog.fx.dom.ResizeHeight", +"goog.fx.dom.ResizeWidth", "goog.fx.dom.Slide", "goog.math", "goog.math.Coordinate", "goog.style", "goog.style.bidi", "goog.ui.Component", "goog.ui.RangeModel"]); +goog.addDependency("/closure/goog/ui/splitbehavior.js", ["goog.ui.SplitBehavior", "goog.ui.SplitBehavior.DefaultHandlers"], ["goog.Disposable", "goog.dispose", "goog.dom", "goog.dom.NodeType", "goog.dom.classes", "goog.events.EventHandler", "goog.ui.ButtonSide", "goog.ui.Component", "goog.ui.decorate", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/splitpane.js", ["goog.ui.SplitPane", "goog.ui.SplitPane.Orientation"], ["goog.dom", "goog.dom.classes", "goog.events.EventType", "goog.fx.Dragger", "goog.math.Rect", "goog.math.Size", "goog.style", "goog.ui.Component", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/style/app/buttonrenderer.js", ["goog.ui.style.app.ButtonRenderer"], ["goog.dom.classes", "goog.ui.Button", "goog.ui.CustomButtonRenderer", "goog.ui.INLINE_BLOCK_CLASSNAME", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/style/app/menubuttonrenderer.js", ["goog.ui.style.app.MenuButtonRenderer"], ["goog.a11y.aria.Role", "goog.array", "goog.dom", "goog.style", "goog.ui.Menu", "goog.ui.MenuRenderer", "goog.ui.style.app.ButtonRenderer"]); +goog.addDependency("/closure/goog/ui/style/app/primaryactionbuttonrenderer.js", ["goog.ui.style.app.PrimaryActionButtonRenderer"], ["goog.ui.Button", "goog.ui.registry", "goog.ui.style.app.ButtonRenderer"]); +goog.addDependency("/closure/goog/ui/submenu.js", ["goog.ui.SubMenu"], ["goog.Timer", "goog.dom", "goog.dom.classes", "goog.events.KeyCodes", "goog.positioning.AnchoredViewportPosition", "goog.positioning.Corner", "goog.style", "goog.ui.Component", "goog.ui.Menu", "goog.ui.MenuItem", "goog.ui.SubMenuRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/submenurenderer.js", ["goog.ui.SubMenuRenderer"], ["goog.a11y.aria", "goog.a11y.aria.State", "goog.asserts", "goog.dom", "goog.dom.classes", "goog.style", "goog.ui.Menu", "goog.ui.MenuItemRenderer"]); +goog.addDependency("/closure/goog/ui/tab.js", ["goog.ui.Tab"], ["goog.ui.Component", "goog.ui.Control", "goog.ui.TabRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/tabbar.js", ["goog.ui.TabBar", "goog.ui.TabBar.Location"], ["goog.ui.Component.EventType", "goog.ui.Container", "goog.ui.Container.Orientation", "goog.ui.Tab", "goog.ui.TabBarRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/tabbarrenderer.js", ["goog.ui.TabBarRenderer"], ["goog.a11y.aria.Role", "goog.object", "goog.ui.ContainerRenderer"]); +goog.addDependency("/closure/goog/ui/tablesorter.js", ["goog.ui.TableSorter", "goog.ui.TableSorter.EventType"], ["goog.array", "goog.dom", "goog.dom.TagName", "goog.dom.classes", "goog.events.EventType", "goog.functions", "goog.ui.Component"]); +goog.addDependency("/closure/goog/ui/tabpane.js", ["goog.ui.TabPane", "goog.ui.TabPane.Events", "goog.ui.TabPane.TabLocation", "goog.ui.TabPane.TabPage", "goog.ui.TabPaneEvent"], ["goog.dom", "goog.dom.classes", "goog.events", "goog.events.Event", "goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.style"]); +goog.addDependency("/closure/goog/ui/tabrenderer.js", ["goog.ui.TabRenderer"], ["goog.a11y.aria.Role", "goog.ui.Component", "goog.ui.ControlRenderer"]); +goog.addDependency("/closure/goog/ui/textarea.js", ["goog.ui.Textarea", "goog.ui.Textarea.EventType"], ["goog.dom", "goog.events.EventType", "goog.style", "goog.ui.Control", "goog.ui.TextareaRenderer", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/textarearenderer.js", ["goog.ui.TextareaRenderer"], ["goog.dom.TagName", "goog.ui.Component", "goog.ui.ControlRenderer"]); +goog.addDependency("/closure/goog/ui/togglebutton.js", ["goog.ui.ToggleButton"], ["goog.ui.Button", "goog.ui.Component", "goog.ui.CustomButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/toolbar.js", ["goog.ui.Toolbar"], ["goog.ui.Container", "goog.ui.ToolbarRenderer"]); +goog.addDependency("/closure/goog/ui/toolbarbutton.js", ["goog.ui.ToolbarButton"], ["goog.ui.Button", "goog.ui.ToolbarButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/toolbarbuttonrenderer.js", ["goog.ui.ToolbarButtonRenderer"], ["goog.ui.CustomButtonRenderer"]); +goog.addDependency("/closure/goog/ui/toolbarcolormenubutton.js", ["goog.ui.ToolbarColorMenuButton"], ["goog.ui.ColorMenuButton", "goog.ui.ToolbarColorMenuButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/toolbarcolormenubuttonrenderer.js", ["goog.ui.ToolbarColorMenuButtonRenderer"], ["goog.dom.classes", "goog.ui.ColorMenuButtonRenderer", "goog.ui.MenuButtonRenderer", "goog.ui.ToolbarMenuButtonRenderer"]); +goog.addDependency("/closure/goog/ui/toolbarmenubutton.js", ["goog.ui.ToolbarMenuButton"], ["goog.ui.MenuButton", "goog.ui.ToolbarMenuButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/toolbarmenubuttonrenderer.js", ["goog.ui.ToolbarMenuButtonRenderer"], ["goog.ui.MenuButtonRenderer"]); +goog.addDependency("/closure/goog/ui/toolbarrenderer.js", ["goog.ui.ToolbarRenderer"], ["goog.a11y.aria.Role", "goog.ui.Container", "goog.ui.ContainerRenderer", "goog.ui.Separator", "goog.ui.ToolbarSeparatorRenderer"]); +goog.addDependency("/closure/goog/ui/toolbarselect.js", ["goog.ui.ToolbarSelect"], ["goog.ui.Select", "goog.ui.ToolbarMenuButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/toolbarseparator.js", ["goog.ui.ToolbarSeparator"], ["goog.ui.Separator", "goog.ui.ToolbarSeparatorRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/toolbarseparatorrenderer.js", ["goog.ui.ToolbarSeparatorRenderer"], ["goog.dom.classes", "goog.ui.INLINE_BLOCK_CLASSNAME", "goog.ui.MenuSeparatorRenderer"]); +goog.addDependency("/closure/goog/ui/toolbartogglebutton.js", ["goog.ui.ToolbarToggleButton"], ["goog.ui.ToggleButton", "goog.ui.ToolbarButtonRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/tooltip.js", ["goog.ui.Tooltip", "goog.ui.Tooltip.CursorTooltipPosition", "goog.ui.Tooltip.ElementTooltipPosition", "goog.ui.Tooltip.State"], ["goog.Timer", "goog.array", "goog.dom", "goog.events", "goog.events.EventType", "goog.math.Box", "goog.math.Coordinate", "goog.positioning", "goog.positioning.AnchoredPosition", "goog.positioning.Corner", "goog.positioning.Overflow", "goog.positioning.OverflowStatus", "goog.positioning.ViewportPosition", "goog.structs.Set", +"goog.style", "goog.ui.Popup", "goog.ui.PopupBase"]); +goog.addDependency("/closure/goog/ui/tree/basenode.js", ["goog.ui.tree.BaseNode", "goog.ui.tree.BaseNode.EventType"], ["goog.Timer", "goog.a11y.aria", "goog.asserts", "goog.events.KeyCodes", "goog.string", "goog.string.StringBuffer", "goog.style", "goog.ui.Component", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/tree/treecontrol.js", ["goog.ui.tree.TreeControl"], ["goog.a11y.aria", "goog.asserts", "goog.dom.classes", "goog.events.EventType", "goog.events.FocusHandler", "goog.events.KeyHandler", "goog.log", "goog.ui.tree.BaseNode", "goog.ui.tree.TreeNode", "goog.ui.tree.TypeAhead", "goog.userAgent"]); +goog.addDependency("/closure/goog/ui/tree/treenode.js", ["goog.ui.tree.TreeNode"], ["goog.ui.tree.BaseNode"]); +goog.addDependency("/closure/goog/ui/tree/typeahead.js", ["goog.ui.tree.TypeAhead", "goog.ui.tree.TypeAhead.Offset"], ["goog.array", "goog.events.KeyCodes", "goog.string", "goog.structs.Trie"]); +goog.addDependency("/closure/goog/ui/tristatemenuitem.js", ["goog.ui.TriStateMenuItem", "goog.ui.TriStateMenuItem.State"], ["goog.dom.classes", "goog.ui.Component", "goog.ui.MenuItem", "goog.ui.TriStateMenuItemRenderer", "goog.ui.registry"]); +goog.addDependency("/closure/goog/ui/tristatemenuitemrenderer.js", ["goog.ui.TriStateMenuItemRenderer"], ["goog.dom.classes", "goog.ui.MenuItemRenderer"]); +goog.addDependency("/closure/goog/ui/twothumbslider.js", ["goog.ui.TwoThumbSlider"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.dom", "goog.ui.SliderBase"]); +goog.addDependency("/closure/goog/ui/zippy.js", ["goog.ui.Zippy", "goog.ui.Zippy.Events", "goog.ui.ZippyEvent"], ["goog.a11y.aria", "goog.a11y.aria.Role", "goog.a11y.aria.State", "goog.dom", "goog.dom.classes", "goog.events.Event", "goog.events.EventHandler", "goog.events.EventTarget", "goog.events.EventType", "goog.events.KeyCodes", "goog.style"]); +goog.addDependency("/closure/goog/uri/uri.js", ["goog.Uri", "goog.Uri.QueryData"], ["goog.array", "goog.string", "goog.structs", "goog.structs.Map", "goog.uri.utils", "goog.uri.utils.ComponentIndex", "goog.uri.utils.StandardQueryParam"]); +goog.addDependency("/closure/goog/uri/uri_test.js", ["goog.UriTest"], ["goog.Uri", "goog.testing.jsunit"]); +goog.addDependency("/closure/goog/uri/utils.js", ["goog.uri.utils", "goog.uri.utils.ComponentIndex", "goog.uri.utils.QueryArray", "goog.uri.utils.QueryValue", "goog.uri.utils.StandardQueryParam"], ["goog.asserts", "goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/useragent/adobereader.js", ["goog.userAgent.adobeReader"], ["goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/useragent/flash.js", ["goog.userAgent.flash"], ["goog.string"]); +goog.addDependency("/closure/goog/useragent/iphoto.js", ["goog.userAgent.iphoto"], ["goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/useragent/jscript.js", ["goog.userAgent.jscript"], ["goog.string"]); +goog.addDependency("/closure/goog/useragent/picasa.js", ["goog.userAgent.picasa"], ["goog.string", "goog.userAgent"]); +goog.addDependency("/closure/goog/useragent/platform.js", ["goog.userAgent.platform"], ["goog.userAgent"]); +goog.addDependency("/closure/goog/useragent/product.js", ["goog.userAgent.product"], ["goog.userAgent"]); +goog.addDependency("/closure/goog/useragent/product_isversion.js", ["goog.userAgent.product.isVersion"], ["goog.userAgent.product"]); +goog.addDependency("/closure/goog/useragent/useragent.js", ["goog.userAgent"], ["goog.string"]); +goog.addDependency("/closure/goog/vec/float32array.js", ["goog.vec.Float32Array"], []); +goog.addDependency("/closure/goog/vec/float64array.js", ["goog.vec.Float64Array"], []); +goog.addDependency("/closure/goog/vec/mat3.js", ["goog.vec.Mat3"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/mat3d.js", ["goog.vec.mat3d", "goog.vec.mat3d.Type"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/mat3f.js", ["goog.vec.mat3f", "goog.vec.mat3f.Type"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/mat4.js", ["goog.vec.Mat4"], ["goog.vec", "goog.vec.Vec3", "goog.vec.Vec4"]); +goog.addDependency("/closure/goog/vec/mat4d.js", ["goog.vec.mat4d", "goog.vec.mat4d.Type"], ["goog.vec", "goog.vec.vec3d", "goog.vec.vec4d"]); +goog.addDependency("/closure/goog/vec/mat4f.js", ["goog.vec.mat4f", "goog.vec.mat4f.Type"], ["goog.vec", "goog.vec.vec3f", "goog.vec.vec4f"]); +goog.addDependency("/closure/goog/vec/matrix3.js", ["goog.vec.Matrix3"], []); +goog.addDependency("/closure/goog/vec/matrix4.js", ["goog.vec.Matrix4"], ["goog.vec", "goog.vec.Vec3", "goog.vec.Vec4"]); +goog.addDependency("/closure/goog/vec/quaternion.js", ["goog.vec.Quaternion"], ["goog.vec", "goog.vec.Vec3", "goog.vec.Vec4"]); +goog.addDependency("/closure/goog/vec/ray.js", ["goog.vec.Ray"], ["goog.vec.Vec3"]); +goog.addDependency("/closure/goog/vec/vec.js", ["goog.vec", "goog.vec.AnyType", "goog.vec.ArrayType", "goog.vec.Float32", "goog.vec.Float64", "goog.vec.Number"], ["goog.vec.Float32Array", "goog.vec.Float64Array"]); +goog.addDependency("/closure/goog/vec/vec2.js", ["goog.vec.Vec2"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/vec2d.js", ["goog.vec.vec2d", "goog.vec.vec2d.Type"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/vec2f.js", ["goog.vec.vec2f", "goog.vec.vec2f.Type"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/vec3.js", ["goog.vec.Vec3"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/vec3d.js", ["goog.vec.vec3d", "goog.vec.vec3d.Type"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/vec3f.js", ["goog.vec.vec3f", "goog.vec.vec3f.Type"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/vec4.js", ["goog.vec.Vec4"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/vec4d.js", ["goog.vec.vec4d", "goog.vec.vec4d.Type"], ["goog.vec"]); +goog.addDependency("/closure/goog/vec/vec4f.js", ["goog.vec.vec4f", "goog.vec.vec4f.Type"], ["goog.vec"]); +goog.addDependency("/closure/goog/webgl/webgl.js", ["goog.webgl"], []); +goog.addDependency("/closure/goog/window/window.js", ["goog.window"], ["goog.string", "goog.userAgent"]); +goog.addDependency("/soy/soyutils.js", [], []); +goog.addDependency("/soy/soyutils_usegoog.js", ["soy", "soy.StringBuilder", "soy.esc", "soydata", "soydata.SanitizedHtml", "soydata.SanitizedHtmlAttribute", "soydata.SanitizedJs", "soydata.SanitizedJsStrChars", "soydata.SanitizedUri", "soydata.VERY_UNSAFE"], ["goog.asserts", "goog.dom.DomHelper", "goog.format", "goog.i18n.BidiFormatter", "goog.i18n.bidi", "goog.soy", "goog.soy.data.SanitizedContentKind", "goog.string", "goog.string.StringBuffer"]); +goog.addDependency("/third_party/closure/goog/base.js", [], []); +goog.addDependency("/third_party/closure/goog/caja/string/html/htmlparser.js", ["goog.string.html.HtmlParser", "goog.string.html.HtmlParser.EFlags", "goog.string.html.HtmlParser.Elements", "goog.string.html.HtmlParser.Entities", "goog.string.html.HtmlSaxHandler"], []); +goog.addDependency("/third_party/closure/goog/caja/string/html/htmlsanitizer.js", ["goog.string.html.HtmlSanitizer", "goog.string.html.HtmlSanitizer.AttributeType", "goog.string.html.HtmlSanitizer.Attributes", "goog.string.html.htmlSanitize"], ["goog.string.StringBuffer", "goog.string.html.HtmlParser", "goog.string.html.HtmlParser.EFlags", "goog.string.html.HtmlParser.Elements", "goog.string.html.HtmlSaxHandler"]); +goog.addDependency("/third_party/closure/goog/dojo/dom/query.js", ["goog.dom.query"], ["goog.array", "goog.dom", "goog.functions", "goog.string", "goog.userAgent"]); +goog.addDependency("/third_party/closure/goog/dojo/dom/query_test.js", [], []); +goog.addDependency("/third_party/closure/goog/jpeg_encoder/jpeg_encoder_basic.js", ["goog.crypt.JpegEncoder"], ["goog.crypt.base64"]); +goog.addDependency("/third_party/closure/goog/loremipsum/text/loremipsum.js", ["goog.text.LoremIpsum"], ["goog.array", "goog.math", "goog.string", "goog.structs.Map", "goog.structs.Set"]); +goog.addDependency("/third_party/closure/goog/mochikit/async/deferred.js", ["goog.async.Deferred", "goog.async.Deferred.AlreadyCalledError", "goog.async.Deferred.CanceledError"], ["goog.array", "goog.asserts", "goog.debug.Error", "goog.functions"]); +goog.addDependency("/third_party/closure/goog/mochikit/async/deferredlist.js", ["goog.async.DeferredList"], ["goog.async.Deferred"]); +goog.addDependency("/third_party/closure/goog/osapi/osapi.js", ["goog.osapi"], []); +goog.provide("libtess"); +libtess.DEBUG = false; +libtess.assert = function(condition, opt_message) { + if(libtess.DEBUG && !condition) { + throw new Error("Assertion failed" + (opt_message ? ": " + opt_message : "")); + } +}; +libtess.sweepDebugEvent = function(tess) { +}; +libtess.GLU_TESS_MAX_COORD = 1E150; +libtess.TRUE_PROJECT = false; +libtess.TESS_MAX_CACHE = 100; +libtess.GLU_TESS_DEFAULT_TOLERANCE = 0; +libtess.tessState = {T_DORMANT:0, T_IN_POLYGON:1, T_IN_CONTOUR:2}; +libtess.windingRule = {GLU_TESS_WINDING_ODD:100130, GLU_TESS_WINDING_NONZERO:100131, GLU_TESS_WINDING_POSITIVE:100132, GLU_TESS_WINDING_NEGATIVE:100133, GLU_TESS_WINDING_ABS_GEQ_TWO:100134}; +libtess.primitiveType = {GL_LINE_LOOP:2, GL_TRIANGLES:4, GL_TRIANGLE_STRIP:5, GL_TRIANGLE_FAN:6}; +libtess.errorType = {GLU_TESS_MISSING_BEGIN_POLYGON:100151, GLU_TESS_MISSING_END_POLYGON:100153, GLU_TESS_MISSING_BEGIN_CONTOUR:100152, GLU_TESS_MISSING_END_CONTOUR:100154, GLU_TESS_COORD_TOO_LARGE:100155, GLU_TESS_NEED_COMBINE_CALLBACK:100156}; +libtess.gluEnum = {GLU_TESS_MESH:100112, GLU_TESS_TOLERANCE:100142, GLU_TESS_WINDING_RULE:100140, GLU_TESS_BOUNDARY_ONLY:100141, GLU_INVALID_ENUM:100900, GLU_INVALID_VALUE:100901, GLU_TESS_BEGIN:100100, GLU_TESS_VERTEX:100101, GLU_TESS_END:100102, GLU_TESS_ERROR:100103, GLU_TESS_EDGE_FLAG:100104, GLU_TESS_COMBINE:100105, GLU_TESS_BEGIN_DATA:100106, GLU_TESS_VERTEX_DATA:100107, GLU_TESS_END_DATA:100108, GLU_TESS_ERROR_DATA:100109, GLU_TESS_EDGE_FLAG_DATA:100110, GLU_TESS_COMBINE_DATA:100111}; +libtess.PQHandle; +libtess.PQKey; +goog.provide("libtess.DictNode"); +goog.require("libtess"); +libtess.DictNode = function() { + this.key = null; + this.next = null; + this.prev = null +}; +libtess.DictNode.prototype.getKey = function() { + return this.key +}; +libtess.DictNode.prototype.getSucc = function() { + return this.next +}; +libtess.DictNode.prototype.getPred = function() { + return this.prev +}; +goog.provide("libtess.ActiveRegion"); +goog.require("libtess.DictNode"); +libtess.ActiveRegion = function() { + this.eUp = null; + this.nodeUp = null; + this.windingNumber = 0; + this.inside = false; + this.sentinel = false; + this.dirty = false; + this.fixUpperEdge = false +}; +libtess.ActiveRegion.prototype.regionBelow = function() { + return(this.nodeUp.getPred().getKey()) +}; +libtess.ActiveRegion.prototype.regionAbove = function() { + return(this.nodeUp.getSucc().getKey()) +}; +goog.provide("libtess.CachedVertex"); +goog.require("libtess"); +libtess.CachedVertex = function() { + this.coords = [0, 0, 0]; + this.data = null +}; +goog.provide("libtess.Dict"); +goog.require("libtess"); +goog.require("libtess.DictNode"); +libtess.dictKey; +libtess.Dict = function(frame, leq) { + this.head = new libtess.DictNode; + this.head.next = this.head; + this.head.prev = this.head; + this.frame = frame; + this.leq_ = (leq) +}; +libtess.Dict.prototype.deleteDict = function() { +}; +libtess.Dict.prototype.insertBefore = function(node, key) { + do { + node = node.prev + }while(node.key !== null && !this.leq_(this.frame, node.key, key)); + var newNode = new libtess.DictNode; + newNode.key = key; + newNode.next = node.next; + node.next.prev = newNode; + newNode.prev = node; + node.next = newNode; + return newNode +}; +libtess.Dict.prototype.insert = function(key) { + return this.insertBefore(this.head, key) +}; +libtess.Dict.prototype.deleteNode = function(node) { + node.next.prev = node.prev; + node.prev.next = node.next +}; +libtess.Dict.prototype.search = function(key) { + var node = this.head; + do { + node = node.next + }while(node.key !== null && !this.leq_(this.frame, key, node.key)); + return node +}; +libtess.Dict.prototype.getMin = function() { + return this.head.next +}; +libtess.Dict.prototype.getMax = function() { + return this.head.prev +}; +goog.provide("libtess.FaceCount"); +goog.require("libtess"); +libtess.FaceCount = function(size, eStart, renderFunction) { + this.size = size; + this.eStart = eStart; + this.render = renderFunction +}; +goog.provide("libtess.GluFace"); +goog.require("libtess"); +libtess.GluFace = function(opt_nextFace, opt_prevFace) { + this.next = opt_nextFace || this; + this.prev = opt_prevFace || this; + this.anEdge = null; + this.data = null; + this.trail = null; + this.marked = false; + this.inside = false +}; +goog.provide("libtess.GluHalfEdge"); +goog.require("libtess"); +libtess.GluHalfEdge = function(opt_nextEdge) { + this.next = opt_nextEdge || this; + this.sym = null; + this.oNext = null; + this.lNext = null; + this.org = null; + this.lFace = null; + this.activeRegion = null; + this.winding = 0 +}; +libtess.GluHalfEdge.prototype.rFace = function() { + return this.sym.lFace +}; +libtess.GluHalfEdge.prototype.dst = function() { + return this.sym.org +}; +libtess.GluHalfEdge.prototype.oPrev = function() { + return this.sym.lNext +}; +libtess.GluHalfEdge.prototype.lPrev = function() { + return this.oNext.sym +}; +libtess.GluHalfEdge.prototype.dPrev = function() { + return this.lNext.sym +}; +libtess.GluHalfEdge.prototype.rPrev = function() { + return this.sym.oNext +}; +libtess.GluHalfEdge.prototype.dNext = function() { + return this.rPrev().sym +}; +libtess.GluHalfEdge.prototype.rNext = function() { + return this.oPrev().sym +}; +goog.provide("libtess.GluVertex"); +goog.require("libtess"); +libtess.GluVertex = function(opt_nextVertex, opt_prevVertex) { + this.next = opt_nextVertex || this; + this.prev = opt_prevVertex || this; + this.anEdge = null; + this.data = null; + this.coords = [0, 0, 0]; + this.s = 0; + this.t = 0; + this.pqHandle = null +}; +goog.provide("libtess.GluMesh"); +goog.require("libtess"); +goog.require("libtess.GluFace"); +goog.require("libtess.GluHalfEdge"); +goog.require("libtess.GluVertex"); +libtess.GluMesh = function() { + this.vHead = new libtess.GluVertex; + this.fHead = new libtess.GluFace; + this.eHead = new libtess.GluHalfEdge; + this.eHeadSym = new libtess.GluHalfEdge; + this.eHead.sym = this.eHeadSym; + this.eHeadSym.sym = this.eHead +}; +libtess.GluMesh.prototype.checkMesh = function() { + if(!libtess.DEBUG) { + return + } + var fHead = this.fHead; + var vHead = this.vHead; + var eHead = this.eHead; + var e; + var f; + var fPrev = fHead; + for(fPrev = fHead;(f = fPrev.next) !== fHead;fPrev = f) { + libtess.assert(f.prev === fPrev); + e = f.anEdge; + do { + libtess.assert(e.sym !== e); + libtess.assert(e.sym.sym === e); + libtess.assert(e.lNext.oNext.sym === e); + libtess.assert(e.oNext.sym.lNext === e); + libtess.assert(e.lFace === f); + e = e.lNext + }while(e !== f.anEdge) + } + libtess.assert(f.prev === fPrev && f.anEdge === null && f.data === null); + var v; + var vPrev = vHead; + for(vPrev = vHead;(v = vPrev.next) !== vHead;vPrev = v) { + libtess.assert(v.prev === vPrev); + e = v.anEdge; + do { + libtess.assert(e.sym !== e); + libtess.assert(e.sym.sym === e); + libtess.assert(e.lNext.oNext.sym === e); + libtess.assert(e.oNext.sym.lNext === e); + libtess.assert(e.org === v); + e = e.oNext + }while(e !== v.anEdge) + } + libtess.assert(v.prev === vPrev && v.anEdge === null && v.data === null); + var ePrev = eHead; + for(ePrev = eHead;(e = ePrev.next) !== eHead;ePrev = e) { + libtess.assert(e.sym.next === ePrev.sym); + libtess.assert(e.sym !== e); + libtess.assert(e.sym.sym === e); + libtess.assert(e.org !== null); + libtess.assert(e.dst() !== null); + libtess.assert(e.lNext.oNext.sym === e); + libtess.assert(e.oNext.sym.lNext === e) + } + libtess.assert(e.sym.next === ePrev.sym && e.sym === this.eHeadSym && e.sym.sym === e && e.org === null && e.dst() === null && e.lFace === null && e.rFace() === null) +}; +goog.provide("libtess.mesh"); +goog.require("libtess"); +goog.require("libtess.GluFace"); +goog.require("libtess.GluHalfEdge"); +goog.require("libtess.GluVertex"); +libtess.mesh.makeEdge = function(mesh) { + var e = libtess.mesh.makeEdgePair_(mesh.eHead); + libtess.mesh.makeVertex_(e, mesh.vHead); + libtess.mesh.makeVertex_(e.sym, mesh.vHead); + libtess.mesh.makeFace_(e, mesh.fHead); + return e +}; +libtess.mesh.meshSplice = function(eOrg, eDst) { + var joiningLoops = false; + var joiningVertices = false; + if(eOrg === eDst) { + return + } + if(eDst.org !== eOrg.org) { + joiningVertices = true; + libtess.mesh.killVertex_(eDst.org, eOrg.org) + } + if(eDst.lFace !== eOrg.lFace) { + joiningLoops = true; + libtess.mesh.killFace_(eDst.lFace, eOrg.lFace) + } + libtess.mesh.splice_(eDst, eOrg); + if(!joiningVertices) { + libtess.mesh.makeVertex_(eDst, eOrg.org); + eOrg.org.anEdge = eOrg + } + if(!joiningLoops) { + libtess.mesh.makeFace_(eDst, eOrg.lFace); + eOrg.lFace.anEdge = eOrg + } +}; +libtess.mesh.deleteEdge = function(eDel) { + var eDelSym = eDel.sym; + var joiningLoops = false; + if(eDel.lFace !== eDel.rFace()) { + joiningLoops = true; + libtess.mesh.killFace_(eDel.lFace, eDel.rFace()) + } + if(eDel.oNext === eDel) { + libtess.mesh.killVertex_(eDel.org, null) + }else { + eDel.rFace().anEdge = eDel.oPrev(); + eDel.org.anEdge = eDel.oNext; + libtess.mesh.splice_(eDel, eDel.oPrev()); + if(!joiningLoops) { + libtess.mesh.makeFace_(eDel, eDel.lFace) + } + } + if(eDelSym.oNext === eDelSym) { + libtess.mesh.killVertex_(eDelSym.org, null); + libtess.mesh.killFace_(eDelSym.lFace, null) + }else { + eDel.lFace.anEdge = eDelSym.oPrev(); + eDelSym.org.anEdge = eDelSym.oNext; + libtess.mesh.splice_(eDelSym, eDelSym.oPrev()) + } + libtess.mesh.killEdge_(eDel) +}; +libtess.mesh.addEdgeVertex = function(eOrg) { + var eNew = libtess.mesh.makeEdgePair_(eOrg); + var eNewSym = eNew.sym; + libtess.mesh.splice_(eNew, eOrg.lNext); + eNew.org = eOrg.dst(); + libtess.mesh.makeVertex_(eNewSym, eNew.org); + eNew.lFace = eNewSym.lFace = eOrg.lFace; + return eNew +}; +libtess.mesh.splitEdge = function(eOrg) { + var tempHalfEdge = libtess.mesh.addEdgeVertex(eOrg); + var eNew = tempHalfEdge.sym; + libtess.mesh.splice_(eOrg.sym, eOrg.sym.oPrev()); + libtess.mesh.splice_(eOrg.sym, eNew); + eOrg.sym.org = eNew.org; + eNew.dst().anEdge = eNew.sym; + eNew.sym.lFace = eOrg.rFace(); + eNew.winding = eOrg.winding; + eNew.sym.winding = eOrg.sym.winding; + return eNew +}; +libtess.mesh.connect = function(eOrg, eDst) { + var joiningLoops = false; + var eNew = libtess.mesh.makeEdgePair_(eOrg); + var eNewSym = eNew.sym; + if(eDst.lFace !== eOrg.lFace) { + joiningLoops = true; + libtess.mesh.killFace_(eDst.lFace, eOrg.lFace) + } + libtess.mesh.splice_(eNew, eOrg.lNext); + libtess.mesh.splice_(eNewSym, eDst); + eNew.org = eOrg.dst(); + eNewSym.org = eDst.org; + eNew.lFace = eNewSym.lFace = eOrg.lFace; + eOrg.lFace.anEdge = eNewSym; + if(!joiningLoops) { + libtess.mesh.makeFace_(eNew, eOrg.lFace) + } + return eNew +}; +libtess.mesh.zapFace = function(fZap) { + var eStart = fZap.anEdge; + var eNext = eStart.lNext; + var e; + do { + e = eNext; + eNext = e.lNext; + e.lFace = null; + if(e.rFace() === null) { + if(e.oNext === e) { + libtess.mesh.killVertex_(e.org, null) + }else { + e.org.anEdge = e.oNext; + libtess.mesh.splice_(e, e.oPrev()) + } + var eSym = e.sym; + if(eSym.oNext === eSym) { + libtess.mesh.killVertex_(eSym.org, null) + }else { + eSym.org.anEdge = eSym.oNext; + libtess.mesh.splice_(eSym, eSym.oPrev()) + } + libtess.mesh.killEdge_(e) + } + }while(e !== eStart); + var fPrev = fZap.prev; + var fNext = fZap.next; + fNext.prev = fPrev; + fPrev.next = fNext +}; +libtess.mesh.meshUnion = function(mesh1, mesh2) { + var f1 = mesh1.fHead; + var v1 = mesh1.vHead; + var e1 = mesh1.eHead; + var f2 = mesh2.fHead; + var v2 = mesh2.vHead; + var e2 = mesh2.eHead; + if(f2.next !== f2) { + f1.prev.next = f2.next; + f2.next.prev = f1.prev; + f2.prev.next = f1; + f1.prev = f2.prev + } + if(v2.next !== v2) { + v1.prev.next = v2.next; + v2.next.prev = v1.prev; + v2.prev.next = v1; + v1.prev = v2.prev + } + if(e2.next !== e2) { + e1.sym.next.sym.next = e2.next; + e2.next.sym.next = e1.sym.next; + e2.sym.next.sym.next = e1; + e1.sym.next = e2.sym.next + } + return mesh1 +}; +libtess.mesh.deleteMesh = function(mesh) { +}; +libtess.mesh.makeEdgePair_ = function(eNext) { + var e = new libtess.GluHalfEdge; + var eSym = new libtess.GluHalfEdge; + var ePrev = eNext.sym.next; + eSym.next = ePrev; + ePrev.sym.next = e; + e.next = eNext; + eNext.sym.next = eSym; + e.sym = eSym; + e.oNext = e; + e.lNext = eSym; + eSym.sym = e; + eSym.oNext = eSym; + eSym.lNext = e; + return e +}; +libtess.mesh.splice_ = function(a, b) { + var aONext = a.oNext; + var bONext = b.oNext; + aONext.sym.lNext = b; + bONext.sym.lNext = a; + a.oNext = bONext; + b.oNext = aONext +}; +libtess.mesh.makeVertex_ = function(eOrig, vNext) { + var vPrev = vNext.prev; + var vNew = new libtess.GluVertex(vNext, vPrev); + vPrev.next = vNew; + vNext.prev = vNew; + vNew.anEdge = eOrig; + var e = eOrig; + do { + e.org = vNew; + e = e.oNext + }while(e !== eOrig) +}; +libtess.mesh.makeFace_ = function(eOrig, fNext) { + var fPrev = fNext.prev; + var fNew = new libtess.GluFace(fNext, fPrev); + fPrev.next = fNew; + fNext.prev = fNew; + fNew.anEdge = eOrig; + fNew.inside = fNext.inside; + var e = eOrig; + do { + e.lFace = fNew; + e = e.lNext + }while(e !== eOrig) +}; +libtess.mesh.killEdge_ = function(eDel) { + var eNext = eDel.next; + var ePrev = eDel.sym.next; + eNext.sym.next = ePrev; + ePrev.sym.next = eNext +}; +libtess.mesh.killVertex_ = function(vDel, newOrg) { + var eStart = vDel.anEdge; + var e = eStart; + do { + e.org = newOrg; + e = e.oNext + }while(e !== eStart); + var vPrev = vDel.prev; + var vNext = vDel.next; + vNext.prev = vPrev; + vPrev.next = vNext +}; +libtess.mesh.killFace_ = function(fDel, newLFace) { + var eStart = fDel.anEdge; + var e = eStart; + do { + e.lFace = newLFace; + e = e.lNext + }while(e !== eStart); + var fPrev = fDel.prev; + var fNext = fDel.next; + fNext.prev = fPrev; + fPrev.next = fNext +}; +goog.provide("libtess.normal"); +goog.require("libtess"); +libtess.normal.S_UNIT_X_ = 1; +libtess.normal.S_UNIT_Y_ = 0; +libtess.normal.projectPolygon = function(tess) { + var computedNormal = false; + var norm = [0, 0, 0]; + norm[0] = tess.normal[0]; + norm[1] = tess.normal[1]; + norm[2] = tess.normal[2]; + if(norm[0] === 0 && norm[1] === 0 && norm[2] === 0) { + libtess.normal.computeNormal_(tess, norm); + computedNormal = true + } + var sUnit = tess.sUnit; + var tUnit = tess.tUnit; + var i = libtess.normal.longAxis_(norm); + if(libtess.TRUE_PROJECT) { + libtess.normal.normalize_(norm); + sUnit[i] = 0; + sUnit[(i + 1) % 3] = libtess.normal.S_UNIT_X_; + sUnit[(i + 2) % 3] = libtess.normal.S_UNIT_Y_; + var w = libtess.normal.dot_(sUnit, norm); + sUnit[0] -= w * norm[0]; + sUnit[1] -= w * norm[1]; + sUnit[2] -= w * norm[2]; + libtess.normal.normalize_(sUnit); + tUnit[0] = norm[1] * sUnit[2] - norm[2] * sUnit[1]; + tUnit[1] = norm[2] * sUnit[0] - norm[0] * sUnit[2]; + tUnit[2] = norm[0] * sUnit[1] - norm[1] * sUnit[0]; + libtess.normal.normalize_(tUnit) + }else { + sUnit[i] = 0; + sUnit[(i + 1) % 3] = libtess.normal.S_UNIT_X_; + sUnit[(i + 2) % 3] = libtess.normal.S_UNIT_Y_; + tUnit[i] = 0; + tUnit[(i + 1) % 3] = norm[i] > 0 ? -libtess.normal.S_UNIT_Y_ : libtess.normal.S_UNIT_Y_; + tUnit[(i + 2) % 3] = norm[i] > 0 ? libtess.normal.S_UNIT_X_ : -libtess.normal.S_UNIT_X_ + } + var vHead = tess.mesh.vHead; + for(var v = vHead.next;v !== vHead;v = v.next) { + v.s = libtess.normal.dot_(v.coords, sUnit); + v.t = libtess.normal.dot_(v.coords, tUnit) + } + if(computedNormal) { + libtess.normal.checkOrientation_(tess) + } +}; +libtess.normal.dot_ = function(u, v) { + return u[0] * v[0] + u[1] * v[1] + u[2] * v[2] +}; +libtess.normal.normalize_ = function(v) { + var len = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; + libtess.assert(len > 0); + len = Math.sqrt(len); + v[0] /= len; + v[1] /= len; + v[2] /= len +}; +libtess.normal.longAxis_ = function(v) { + var i = 0; + if(Math.abs(v[1]) > Math.abs(v[0])) { + i = 1 + } + if(Math.abs(v[2]) > Math.abs(v[i])) { + i = 2 + } + return i +}; +libtess.normal.computeNormal_ = function(tess, norm) { + var maxVal = [0, 0, 0]; + var minVal = [0, 0, 0]; + var d1 = [0, 0, 0]; + var d2 = [0, 0, 0]; + var tNorm = [0, 0, 0]; + maxVal[0] = maxVal[1] = maxVal[2] = -2 * libtess.GLU_TESS_MAX_COORD; + minVal[0] = minVal[1] = minVal[2] = 2 * libtess.GLU_TESS_MAX_COORD; + var maxVert = new Array(3); + var minVert = new Array(3); + var i; + var v; + var vHead = tess.mesh.vHead; + for(v = vHead.next;v !== vHead;v = v.next) { + for(i = 0;i < 3;++i) { + var c = v.coords[i]; + if(c < minVal[i]) { + minVal[i] = c; + minVert[i] = v + } + if(c > maxVal[i]) { + maxVal[i] = c; + maxVert[i] = v + } + } + } + i = 0; + if(maxVal[1] - minVal[1] > maxVal[0] - minVal[0]) { + i = 1 + } + if(maxVal[2] - minVal[2] > maxVal[i] - minVal[i]) { + i = 2 + } + if(minVal[i] >= maxVal[i]) { + norm[0] = 0; + norm[1] = 0; + norm[2] = 1; + return + } + var maxLen2 = 0; + var v1 = minVert[i]; + var v2 = maxVert[i]; + d1[0] = v1.coords[0] - v2.coords[0]; + d1[1] = v1.coords[1] - v2.coords[1]; + d1[2] = v1.coords[2] - v2.coords[2]; + for(v = vHead.next;v !== vHead;v = v.next) { + d2[0] = v.coords[0] - v2.coords[0]; + d2[1] = v.coords[1] - v2.coords[1]; + d2[2] = v.coords[2] - v2.coords[2]; + tNorm[0] = d1[1] * d2[2] - d1[2] * d2[1]; + tNorm[1] = d1[2] * d2[0] - d1[0] * d2[2]; + tNorm[2] = d1[0] * d2[1] - d1[1] * d2[0]; + var tLen2 = tNorm[0] * tNorm[0] + tNorm[1] * tNorm[1] + tNorm[2] * tNorm[2]; + if(tLen2 > maxLen2) { + maxLen2 = tLen2; + norm[0] = tNorm[0]; + norm[1] = tNorm[1]; + norm[2] = tNorm[2] + } + } + if(maxLen2 <= 0) { + norm[0] = norm[1] = norm[2] = 0; + norm[libtess.normal.longAxis_(d1)] = 1 + } +}; +libtess.normal.checkOrientation_ = function(tess) { + var area = 0; + var fHead = tess.mesh.fHead; + for(var f = fHead.next;f !== fHead;f = f.next) { + var e = f.anEdge; + if(e.winding <= 0) { + continue + } + do { + area += (e.org.s - e.dst().s) * (e.org.t + e.dst().t); + e = e.lNext + }while(e !== f.anEdge) + } + if(area < 0) { + var vHead = tess.mesh.vHead; + for(var v = vHead.next;v !== vHead;v = v.next) { + v.t = -v.t + } + tess.tUnit[0] = -tess.tUnit[0]; + tess.tUnit[1] = -tess.tUnit[1]; + tess.tUnit[2] = -tess.tUnit[2] + } +}; +goog.provide("libtess.render"); +goog.require("libtess"); +goog.require("libtess.FaceCount"); +libtess.render.SIGN_INCONSISTENT_ = 2; +libtess.render.renderMesh = function(tess, mesh) { + tess.lonelyTriList = null; + var f; + for(f = mesh.fHead.next;f !== mesh.fHead;f = f.next) { + f.marked = false + } + for(f = mesh.fHead.next;f !== mesh.fHead;f = f.next) { + if(f.inside && !f.marked) { + libtess.render.renderMaximumFaceGroup_(tess, f); + libtess.assert(f.marked) + } + } + if(tess.lonelyTriList !== null) { + libtess.render.renderLonelyTriangles_(tess, tess.lonelyTriList); + tess.lonelyTriList = null + } +}; +libtess.render.renderBoundary = function(tess, mesh) { + for(var f = mesh.fHead.next;f !== mesh.fHead;f = f.next) { + if(f.inside) { + tess.callBeginOrBeginData(libtess.primitiveType.GL_LINE_LOOP); + var e = f.anEdge; + do { + tess.callVertexOrVertexData(e.org.data); + e = e.lNext + }while(e !== f.anEdge); + tess.callEndOrEndData() + } + } +}; +libtess.render.renderCache = function(tess) { + if(tess.cacheCount < 3) { + return true + } + var norm = [0, 0, 0]; + norm[0] = tess.normal[0]; + norm[1] = tess.normal[1]; + norm[2] = tess.normal[2]; + if(norm[0] === 0 && norm[1] === 0 && norm[2] === 0) { + libtess.render.computeNormal_(tess, norm, false) + } + var sign = libtess.render.computeNormal_(tess, norm, true); + if(sign === libtess.render.SIGN_INCONSISTENT_) { + return false + } + if(sign === 0) { + return true + } + switch(tess.windingRule) { + case libtess.windingRule.GLU_TESS_WINDING_ODD: + ; + case libtess.windingRule.GLU_TESS_WINDING_NONZERO: + break; + case libtess.windingRule.GLU_TESS_WINDING_POSITIVE: + if(sign < 0) { + return true + } + break; + case libtess.windingRule.GLU_TESS_WINDING_NEGATIVE: + if(sign > 0) { + return true + } + break; + case libtess.windingRule.GLU_TESS_WINDING_ABS_GEQ_TWO: + return true + } + tess.callBeginOrBeginData(tess.boundaryOnly ? libtess.primitiveType.GL_LINE_LOOP : tess.cacheCount > 3 ? libtess.primitiveType.GL_TRIANGLE_FAN : libtess.primitiveType.GL_TRIANGLES); + var v0 = 0; + var vn = v0 + tess.cacheCount; + var vc; + tess.callVertexOrVertexData(tess.cache[v0].data); + if(sign > 0) { + for(vc = v0 + 1;vc < vn;++vc) { + tess.callVertexOrVertexData(tess.cache[vc].data) + } + }else { + for(vc = vn - 1;vc > v0;--vc) { + tess.callVertexOrVertexData(tess.cache[vc].data) + } + } + tess.callEndOrEndData(); + return true +}; +libtess.render.marked_ = function(f) { + return!f.inside || f.marked +}; +libtess.render.freeTrail_ = function(t) { + while(t !== null) { + t.marked = false; + t = t.trail + } +}; +libtess.render.maximumFan_ = function(eOrig) { + var newFace = new libtess.FaceCount(0, null, libtess.render.renderFan_); + var trail = null; + var e; + for(e = eOrig;!libtess.render.marked_(e.lFace);e = e.oNext) { + e.lFace.trail = trail; + trail = e.lFace; + e.lFace.marked = true; + ++newFace.size + } + for(e = eOrig;!libtess.render.marked_(e.rFace());e = e.oPrev()) { + e.rFace().trail = trail; + trail = e.rFace(); + e.rFace().marked = true; + ++newFace.size + } + newFace.eStart = e; + libtess.render.freeTrail_(trail); + return newFace +}; +libtess.render.maximumStrip_ = function(eOrig) { + var newFace = new libtess.FaceCount(0, null, libtess.render.renderStrip_); + var headSize = 0; + var tailSize = 0; + var trail = null; + var e; + var eTail; + var eHead; + for(e = eOrig;!libtess.render.marked_(e.lFace);++tailSize, e = e.oNext) { + e.lFace.trail = trail; + trail = e.lFace; + e.lFace.marked = true; + ++tailSize; + e = e.dPrev(); + if(libtess.render.marked_(e.lFace)) { + break + } + e.lFace.trail = trail; + trail = e.lFace; + e.lFace.marked = true + } + eTail = e; + for(e = eOrig;!libtess.render.marked_(e.rFace());++headSize, e = e.dNext()) { + e.rFace().trail = trail; + trail = e.rFace(); + e.rFace().marked = true; + ++headSize; + e = e.oPrev(); + if(libtess.render.marked_(e.rFace())) { + break + } + e.rFace().trail = trail; + trail = e.rFace(); + e.rFace().marked = true + } + eHead = e; + newFace.size = tailSize + headSize; + if((tailSize & 1) === 0) { + newFace.eStart = eTail.sym + }else { + if((headSize & 1) === 0) { + newFace.eStart = eHead + }else { + --newFace.size; + newFace.eStart = eHead.oNext + } + } + libtess.render.freeTrail_(trail); + return newFace +}; +libtess.render.renderFan_ = function(tess, e, size) { + tess.callBeginOrBeginData(libtess.primitiveType.GL_TRIANGLE_FAN); + tess.callVertexOrVertexData(e.org.data); + tess.callVertexOrVertexData(e.dst().data); + while(!libtess.render.marked_(e.lFace)) { + e.lFace.marked = true; + --size; + e = e.oNext; + tess.callVertexOrVertexData(e.dst().data) + } + libtess.assert(size === 0); + tess.callEndOrEndData() +}; +libtess.render.renderStrip_ = function(tess, e, size) { + tess.callBeginOrBeginData(libtess.primitiveType.GL_TRIANGLE_STRIP); + tess.callVertexOrVertexData(e.org.data); + tess.callVertexOrVertexData(e.dst().data); + while(!libtess.render.marked_(e.lFace)) { + e.lFace.marked = true; + --size; + e = e.dPrev(); + tess.callVertexOrVertexData(e.org.data); + if(libtess.render.marked_(e.lFace)) { + break + } + e.lFace.marked = true; + --size; + e = e.oNext; + tess.callVertexOrVertexData(e.dst().data) + } + libtess.assert(size === 0); + tess.callEndOrEndData() +}; +libtess.render.renderTriangle_ = function(tess, e, size) { + libtess.assert(size === 1); + e.lFace.trail = tess.lonelyTriList; + tess.lonelyTriList = e.lFace; + e.lFace.marked = true +}; +libtess.render.renderMaximumFaceGroup_ = function(tess, fOrig) { + var e = fOrig.anEdge; + var max = new libtess.FaceCount(1, e, libtess.render.renderTriangle_); + var newFace; + if(!tess.flagBoundary) { + newFace = libtess.render.maximumFan_(e); + if(newFace.size > max.size) { + max = newFace + } + newFace = libtess.render.maximumFan_(e.lNext); + if(newFace.size > max.size) { + max = newFace + } + newFace = libtess.render.maximumFan_(e.lPrev()); + if(newFace.size > max.size) { + max = newFace + } + newFace = libtess.render.maximumStrip_(e); + if(newFace.size > max.size) { + max = newFace + } + newFace = libtess.render.maximumStrip_(e.lNext); + if(newFace.size > max.size) { + max = newFace + } + newFace = libtess.render.maximumStrip_(e.lPrev()); + if(newFace.size > max.size) { + max = newFace + } + } + max.render(tess, max.eStart, max.size) +}; +libtess.render.renderLonelyTriangles_ = function(tess, head) { + var edgeState = -1; + var f = head; + tess.callBeginOrBeginData(libtess.primitiveType.GL_TRIANGLES); + for(;f !== null;f = f.trail) { + var e = f.anEdge; + do { + if(tess.flagBoundary) { + var newState = !e.rFace().inside ? 1 : 0; + if(edgeState !== newState) { + edgeState = newState; + tess.callEdgeFlagOrEdgeFlagData(!!edgeState) + } + } + tess.callVertexOrVertexData(e.org.data); + e = e.lNext + }while(e !== f.anEdge) + } + tess.callEndOrEndData() +}; +libtess.render.computeNormal_ = function(tess, norm, check) { + if(!check) { + norm[0] = norm[1] = norm[2] = 0 + } + var v0 = 0; + var vn = v0 + tess.cacheCount; + var vc = v0 + 1; + var vert0 = tess.cache[v0]; + var vertc = tess.cache[vc]; + var xc = vertc.coords[0] - vert0.coords[0]; + var yc = vertc.coords[1] - vert0.coords[1]; + var zc = vertc.coords[2] - vert0.coords[2]; + var sign = 0; + while(++vc < vn) { + vertc = tess.cache[vc]; + var xp = xc; + var yp = yc; + var zp = zc; + xc = vertc.coords[0] - vert0.coords[0]; + yc = vertc.coords[1] - vert0.coords[1]; + zc = vertc.coords[2] - vert0.coords[2]; + var n = [0, 0, 0]; + n[0] = yp * zc - zp * yc; + n[1] = zp * xc - xp * zc; + n[2] = xp * yc - yp * xc; + var dot = n[0] * norm[0] + n[1] * norm[1] + n[2] * norm[2]; + if(!check) { + if(dot >= 0) { + norm[0] += n[0]; + norm[1] += n[1]; + norm[2] += n[2] + }else { + norm[0] -= n[0]; + norm[1] -= n[1]; + norm[2] -= n[2] + } + }else { + if(dot !== 0) { + if(dot > 0) { + if(sign < 0) { + return libtess.render.SIGN_INCONSISTENT_ + } + sign = 1 + }else { + if(sign > 0) { + return libtess.render.SIGN_INCONSISTENT_ + } + sign = -1 + } + } + } + } + return sign +}; +goog.provide("libtess.PQHandleElem"); +goog.require("libtess"); +libtess.PQHandleElem = function() { + this.key = null; + this.node = 0 +}; +libtess.PQHandleElem.realloc = function(oldArray, size) { + var newArray = new Array(size); + var index = 0; + if(oldArray !== null) { + for(;index < oldArray.length;index++) { + newArray[index] = oldArray[index] + } + } + for(;index < size;index++) { + newArray[index] = new libtess.PQHandleElem + } + return newArray +}; +goog.provide("libtess.PQNode"); +goog.require("libtess"); +libtess.PQNode = function() { + this.handle = 0 +}; +libtess.PQNode.realloc = function(oldArray, size) { + var newArray = new Array(size); + var index = 0; + if(oldArray !== null) { + for(;index < oldArray.length;index++) { + newArray[index] = oldArray[index] + } + } + for(;index < size;index++) { + newArray[index] = new libtess.PQNode + } + return newArray +}; +goog.provide("libtess.PriorityQHeap"); +goog.require("libtess"); +goog.require("libtess.PQHandleElem"); +goog.require("libtess.PQNode"); +libtess.PriorityQHeap = function(leq) { + this.nodes_ = libtess.PQNode.realloc(null, libtess.PriorityQHeap.INIT_SIZE_ + 1); + this.handles_ = libtess.PQHandleElem.realloc(null, libtess.PriorityQHeap.INIT_SIZE_ + 1); + this.size_ = 0; + this.max_ = libtess.PriorityQHeap.INIT_SIZE_; + this.freeList_ = 0; + this.initialized_ = false; + this.leq_ = leq; + this.nodes_[1].handle = 1 +}; +libtess.PriorityQHeap.INIT_SIZE_ = 32; +libtess.PriorityQHeap.prototype.deleteHeap = function() { + this.handles_ = null; + this.nodes_ = null +}; +libtess.PriorityQHeap.prototype.init = function() { + for(var i = this.size_;i >= 1;--i) { + this.floatDown_(i) + } + this.initialized_ = true +}; +libtess.PriorityQHeap.prototype.insert = function(keyNew) { + var curr = ++this.size_; + if(curr * 2 > this.max_) { + this.max_ *= 2; + this.nodes_ = libtess.PQNode.realloc(this.nodes_, this.max_ + 1); + this.handles_ = libtess.PQHandleElem.realloc(this.handles_, this.max_ + 1) + } + var free; + if(this.freeList_ === 0) { + free = curr + }else { + free = this.freeList_; + this.freeList_ = this.handles_[free].node + } + this.nodes_[curr].handle = free; + this.handles_[free].node = curr; + this.handles_[free].key = keyNew; + if(this.initialized_) { + this.floatUp_(curr) + } + return free +}; +libtess.PriorityQHeap.prototype.isEmpty = function() { + return this.size_ === 0 +}; +libtess.PriorityQHeap.prototype.minimum = function() { + return this.handles_[this.nodes_[1].handle].key +}; +libtess.PriorityQHeap.prototype.extractMin = function() { + var n = this.nodes_; + var h = this.handles_; + var hMin = n[1].handle; + var min = h[hMin].key; + if(this.size_ > 0) { + n[1].handle = n[this.size_].handle; + h[n[1].handle].node = 1; + h[hMin].key = null; + h[hMin].node = this.freeList_; + this.freeList_ = hMin; + if(--this.size_ > 0) { + this.floatDown_(1) + } + } + return min +}; +libtess.PriorityQHeap.prototype.remove = function(hCurr) { + var n = this.nodes_; + var h = this.handles_; + libtess.assert(hCurr >= 1 && hCurr <= this.max_ && h[hCurr].key !== null); + var curr = h[hCurr].node; + n[curr].handle = n[this.size_].handle; + h[n[curr].handle].node = curr; + if(curr <= --this.size_) { + if(curr <= 1 || this.leq_(h[n[curr >> 1].handle].key, h[n[curr].handle].key)) { + this.floatDown_(curr) + }else { + this.floatUp_(curr) + } + } + h[hCurr].key = null; + h[hCurr].node = this.freeList_; + this.freeList_ = hCurr +}; +libtess.PriorityQHeap.prototype.floatDown_ = function(curr) { + var n = this.nodes_; + var h = this.handles_; + var hCurr = n[curr].handle; + for(;;) { + var child = curr << 1; + if(child < this.size_ && this.leq_(h[n[child + 1].handle].key, h[n[child].handle].key)) { + ++child + } + libtess.assert(child <= this.max_); + var hChild = n[child].handle; + if(child > this.size_ || this.leq_(h[hCurr].key, h[hChild].key)) { + n[curr].handle = hCurr; + h[hCurr].node = curr; + break + } + n[curr].handle = hChild; + h[hChild].node = curr; + curr = child + } +}; +libtess.PriorityQHeap.prototype.floatUp_ = function(curr) { + var n = this.nodes_; + var h = this.handles_; + var hCurr = n[curr].handle; + for(;;) { + var parent = curr >> 1; + var hParent = n[parent].handle; + if(parent === 0 || this.leq_(h[hParent].key, h[hCurr].key)) { + n[curr].handle = hCurr; + h[hCurr].node = curr; + break + } + n[curr].handle = hParent; + h[hParent].node = curr; + curr = parent + } +}; +goog.provide("libtess.PriorityQ"); +goog.require("libtess"); +goog.require("libtess.PriorityQHeap"); +libtess.PriorityQ = function(leq) { + this.keys_ = libtess.PriorityQ.prototype.PQKeyRealloc_(null, libtess.PriorityQ.INIT_SIZE_); + this.order_ = null; + this.size_ = 0; + this.max_ = libtess.PriorityQ.INIT_SIZE_; + this.initialized_ = false; + this.leq_ = (leq); + this.heap_ = new libtess.PriorityQHeap(this.leq_) +}; +libtess.PriorityQ.INIT_SIZE_ = 32; +libtess.PriorityQ.prototype.deleteQ = function() { + this.heap_.deleteHeap(); + this.heap_ = null; + this.order_ = null; + this.keys_ = null +}; +libtess.PriorityQ.prototype.init = function() { + this.order_ = []; + for(var i = 0;i < this.size_;i++) { + this.order_[i] = i + } + var comparator = function(keys, leq) { + return function(a, b) { + return leq(keys[a], keys[b]) ? 1 : -1 + } + }(this.keys_, this.leq_); + this.order_.sort(comparator); + this.max_ = this.size_; + this.initialized_ = true; + this.heap_.init(); + if(libtess.DEBUG) { + var p = 0; + var r = p + this.size_ - 1; + for(i = p;i < r;++i) { + libtess.assert(this.leq_(this.keys_[this.order_[i + 1]], this.keys_[this.order_[i]])) + } + } +}; +libtess.PriorityQ.prototype.insert = function(keyNew) { + if(this.initialized_) { + return this.heap_.insert(keyNew) + } + var curr = this.size_; + if(++this.size_ >= this.max_) { + this.max_ *= 2; + this.keys_ = libtess.PriorityQ.prototype.PQKeyRealloc_(this.keys_, this.max_) + } + this.keys_[curr] = keyNew; + return-(curr + 1) +}; +libtess.PriorityQ.prototype.PQKeyRealloc_ = function(oldArray, size) { + var newArray = new Array(size); + var index = 0; + if(oldArray !== null) { + for(;index < oldArray.length;index++) { + newArray[index] = oldArray[index] + } + } + for(;index < size;index++) { + newArray[index] = null + } + return newArray +}; +libtess.PriorityQ.prototype.keyLessThan_ = function(x, y) { + var keyX = this.keys_[x]; + var keyY = this.keys_[y]; + return!this.leq_(keyY, keyX) +}; +libtess.PriorityQ.prototype.keyGreaterThan_ = function(x, y) { + var keyX = this.keys_[x]; + var keyY = this.keys_[y]; + return!this.leq_(keyX, keyY) +}; +libtess.PriorityQ.prototype.extractMin = function() { + if(this.size_ === 0) { + return this.heap_.extractMin() + } + var sortMin = this.keys_[this.order_[this.size_ - 1]]; + if(!this.heap_.isEmpty()) { + var heapMin = this.heap_.minimum(); + if(this.leq_(heapMin, sortMin)) { + return this.heap_.extractMin() + } + } + do { + --this.size_ + }while(this.size_ > 0 && this.keys_[this.order_[this.size_ - 1]] === null); + return sortMin +}; +libtess.PriorityQ.prototype.minimum = function() { + if(this.size_ === 0) { + return this.heap_.minimum() + } + var sortMin = this.keys_[this.order_[this.size_ - 1]]; + if(!this.heap_.isEmpty()) { + var heapMin = this.heap_.minimum(); + if(this.leq_(heapMin, sortMin)) { + return heapMin + } + } + return sortMin +}; +libtess.PriorityQ.prototype.isEmpty = function() { + return this.size_ === 0 && this.heap_.isEmpty() +}; +libtess.PriorityQ.prototype.remove = function(curr) { + if(curr >= 0) { + this.heap_.remove(curr); + return + } + curr = -(curr + 1); + libtess.assert(curr < this.max_ && this.keys_[curr] !== null); + this.keys_[curr] = null; + while(this.size_ > 0 && this.keys_[this.order_[this.size_ - 1]] === null) { + --this.size_ + } +}; +goog.provide("libtess.geom"); +goog.require("libtess"); +libtess.geom.vertEq = function(u, v) { + return u.s === v.s && u.t === v.t +}; +libtess.geom.vertLeq = function(u, v) { + return u.s < v.s || u.s === v.s && u.t <= v.t +}; +libtess.geom.edgeEval = function(u, v, w) { + var gapL, gapR; + libtess.assert(libtess.geom.vertLeq(u, v) && libtess.geom.vertLeq(v, w)); + gapL = v.s - u.s; + gapR = w.s - v.s; + if(gapL + gapR > 0) { + if(gapL < gapR) { + return v.t - u.t + (u.t - w.t) * (gapL / (gapL + gapR)) + }else { + return v.t - w.t + (w.t - u.t) * (gapR / (gapL + gapR)) + } + } + return 0 +}; +libtess.geom.edgeSign = function(u, v, w) { + var gapL, gapR; + libtess.assert(libtess.geom.vertLeq(u, v) && libtess.geom.vertLeq(v, w)); + gapL = v.s - u.s; + gapR = w.s - v.s; + if(gapL + gapR > 0) { + return(v.t - w.t) * gapL + (v.t - u.t) * gapR + } + return 0 +}; +libtess.geom.transLeq = function(u, v) { + return u.t < v.t || u.t === v.t && u.s <= v.s +}; +libtess.geom.transEval = function(u, v, w) { + var gapL, gapR; + libtess.assert(libtess.geom.transLeq(u, v) && libtess.geom.transLeq(v, w)); + gapL = v.t - u.t; + gapR = w.t - v.t; + if(gapL + gapR > 0) { + if(gapL < gapR) { + return v.s - u.s + (u.s - w.s) * (gapL / (gapL + gapR)) + }else { + return v.s - w.s + (w.s - u.s) * (gapR / (gapL + gapR)) + } + } + return 0 +}; +libtess.geom.transSign = function(u, v, w) { + var gapL, gapR; + libtess.assert(libtess.geom.transLeq(u, v) && libtess.geom.transLeq(v, w)); + gapL = v.t - u.t; + gapR = w.t - v.t; + if(gapL + gapR > 0) { + return(v.s - w.s) * gapL + (v.s - u.s) * gapR + } + return 0 +}; +libtess.geom.edgeGoesLeft = function(e) { + return libtess.geom.vertLeq(e.dst(), e.org) +}; +libtess.geom.edgeGoesRight = function(e) { + return libtess.geom.vertLeq(e.org, e.dst()) +}; +libtess.geom.vertL1dist = function(u, v) { + return Math.abs(u.s - v.s) + Math.abs(u.t - v.t) +}; +libtess.geom.vertCCW = function(u, v, w) { + return u.s * (v.t - w.t) + v.s * (w.t - u.t) + w.s * (u.t - v.t) >= 0 +}; +libtess.geom.interpolate_ = function(a, x, b, y) { + a = a < 0 ? 0 : a; + b = b < 0 ? 0 : b; + if(a <= b) { + if(b === 0) { + return(x + y) / 2 + }else { + return x + (y - x) * (a / (a + b)) + } + }else { + return y + (x - y) * (b / (a + b)) + } +}; +libtess.geom.edgeIntersect = function(o1, d1, o2, d2, v) { + var z1, z2; + var tmp; + if(!libtess.geom.vertLeq(o1, d1)) { + tmp = o1; + o1 = d1; + d1 = tmp + } + if(!libtess.geom.vertLeq(o2, d2)) { + tmp = o2; + o2 = d2; + d2 = tmp + } + if(!libtess.geom.vertLeq(o1, o2)) { + tmp = o1; + o1 = o2; + o2 = tmp; + tmp = d1; + d1 = d2; + d2 = tmp + } + if(!libtess.geom.vertLeq(o2, d1)) { + v.s = (o2.s + d1.s) / 2 + }else { + if(libtess.geom.vertLeq(d1, d2)) { + z1 = libtess.geom.edgeEval(o1, o2, d1); + z2 = libtess.geom.edgeEval(o2, d1, d2); + if(z1 + z2 < 0) { + z1 = -z1; + z2 = -z2 + } + v.s = libtess.geom.interpolate_(z1, o2.s, z2, d1.s) + }else { + z1 = libtess.geom.edgeSign(o1, o2, d1); + z2 = -libtess.geom.edgeSign(o1, d2, d1); + if(z1 + z2 < 0) { + z1 = -z1; + z2 = -z2 + } + v.s = libtess.geom.interpolate_(z1, o2.s, z2, d2.s) + } + } + if(!libtess.geom.transLeq(o1, d1)) { + tmp = o1; + o1 = d1; + d1 = tmp + } + if(!libtess.geom.transLeq(o2, d2)) { + tmp = o2; + o2 = d2; + d2 = tmp + } + if(!libtess.geom.transLeq(o1, o2)) { + tmp = o1; + o1 = o2; + o2 = tmp; + tmp = d1; + d1 = d2; + d2 = tmp + } + if(!libtess.geom.transLeq(o2, d1)) { + v.t = (o2.t + d1.t) / 2 + }else { + if(libtess.geom.transLeq(d1, d2)) { + z1 = libtess.geom.transEval(o1, o2, d1); + z2 = libtess.geom.transEval(o2, d1, d2); + if(z1 + z2 < 0) { + z1 = -z1; + z2 = -z2 + } + v.t = libtess.geom.interpolate_(z1, o2.t, z2, d1.t) + }else { + z1 = libtess.geom.transSign(o1, o2, d1); + z2 = -libtess.geom.transSign(o1, d2, d1); + if(z1 + z2 < 0) { + z1 = -z1; + z2 = -z2 + } + v.t = libtess.geom.interpolate_(z1, o2.t, z2, d2.t) + } + } +}; +goog.provide("libtess.sweep"); +goog.require("libtess"); +goog.require("libtess.ActiveRegion"); +goog.require("libtess.Dict"); +goog.require("libtess.GluVertex"); +goog.require("libtess.PriorityQ"); +goog.require("libtess.geom"); +goog.require("libtess.mesh"); +libtess.sweep.SENTINEL_COORD_ = 4 * libtess.GLU_TESS_MAX_COORD; +libtess.sweep.TOLERANCE_NONZERO_ = false; +libtess.sweep.computeInterior = function(tess) { + tess.fatalError = false; + libtess.sweep.removeDegenerateEdges_(tess); + libtess.sweep.initPriorityQ_(tess); + libtess.sweep.initEdgeDict_(tess); + var v; + while((v = (tess.pq.extractMin())) !== null) { + for(;;) { + var vNext = (tess.pq.minimum()); + if(vNext === null || !libtess.geom.vertEq(vNext, v)) { + break + } + vNext = (tess.pq.extractMin()); + libtess.sweep.spliceMergeVertices_(tess, v.anEdge, vNext.anEdge) + } + libtess.sweep.sweepEvent_(tess, v) + } + var tmpReg = (tess.dict.getMin().getKey()); + tess.event = tmpReg.eUp.org; + libtess.sweepDebugEvent(tess); + libtess.sweep.doneEdgeDict_(tess); + libtess.sweep.donePriorityQ_(tess); + libtess.sweep.removeDegenerateFaces_(tess.mesh); + tess.mesh.checkMesh() +}; +libtess.sweep.addWinding_ = function(eDst, eSrc) { + eDst.winding += eSrc.winding; + eDst.sym.winding += eSrc.sym.winding +}; +libtess.sweep.edgeLeq_ = function(tess, reg1, reg2) { + var event = tess.event; + var e1 = reg1.eUp; + var e2 = reg2.eUp; + if(e1.dst() === event) { + if(e2.dst() === event) { + if(libtess.geom.vertLeq(e1.org, e2.org)) { + return libtess.geom.edgeSign(e2.dst(), e1.org, e2.org) <= 0 + } + return libtess.geom.edgeSign(e1.dst(), e2.org, e1.org) >= 0 + } + return libtess.geom.edgeSign(e2.dst(), event, e2.org) <= 0 + } + if(e2.dst() === event) { + return libtess.geom.edgeSign(e1.dst(), event, e1.org) >= 0 + } + var t1 = libtess.geom.edgeEval(e1.dst(), event, e1.org); + var t2 = libtess.geom.edgeEval(e2.dst(), event, e2.org); + return t1 >= t2 +}; +libtess.sweep.deleteRegion_ = function(tess, reg) { + if(reg.fixUpperEdge) { + libtess.assert(reg.eUp.winding === 0) + } + reg.eUp.activeRegion = null; + tess.dict.deleteNode(reg.nodeUp); + reg.nodeUp = null +}; +libtess.sweep.fixUpperEdge_ = function(reg, newEdge) { + libtess.assert(reg.fixUpperEdge); + libtess.mesh.deleteEdge(reg.eUp); + reg.fixUpperEdge = false; + reg.eUp = newEdge; + newEdge.activeRegion = reg +}; +libtess.sweep.topLeftRegion_ = function(reg) { + var org = reg.eUp.org; + do { + reg = reg.regionAbove() + }while(reg.eUp.org === org); + if(reg.fixUpperEdge) { + var e = libtess.mesh.connect(reg.regionBelow().eUp.sym, reg.eUp.lNext); + libtess.sweep.fixUpperEdge_(reg, e); + reg = reg.regionAbove() + } + return reg +}; +libtess.sweep.topRightRegion_ = function(reg) { + var dst = reg.eUp.dst(); + do { + reg = reg.regionAbove() + }while(reg.eUp.dst() === dst); + return reg +}; +libtess.sweep.addRegionBelow_ = function(tess, regAbove, eNewUp) { + var regNew = new libtess.ActiveRegion; + regNew.eUp = eNewUp; + regNew.nodeUp = tess.dict.insertBefore(regAbove.nodeUp, regNew); + eNewUp.activeRegion = regNew; + return regNew +}; +libtess.sweep.isWindingInside_ = function(tess, n) { + switch(tess.windingRule) { + case libtess.windingRule.GLU_TESS_WINDING_ODD: + return(n & 1) !== 0; + case libtess.windingRule.GLU_TESS_WINDING_NONZERO: + return n !== 0; + case libtess.windingRule.GLU_TESS_WINDING_POSITIVE: + return n > 0; + case libtess.windingRule.GLU_TESS_WINDING_NEGATIVE: + return n < 0; + case libtess.windingRule.GLU_TESS_WINDING_ABS_GEQ_TWO: + return n >= 2 || n <= -2 + } + libtess.assert(false); + return false +}; +libtess.sweep.computeWinding_ = function(tess, reg) { + reg.windingNumber = reg.regionAbove().windingNumber + reg.eUp.winding; + reg.inside = libtess.sweep.isWindingInside_(tess, reg.windingNumber) +}; +libtess.sweep.finishRegion_ = function(tess, reg) { + var e = reg.eUp; + var f = e.lFace; + f.inside = reg.inside; + f.anEdge = e; + libtess.sweep.deleteRegion_(tess, reg) +}; +libtess.sweep.finishLeftRegions_ = function(tess, regFirst, regLast) { + var regPrev = regFirst; + var ePrev = regFirst.eUp; + while(regPrev !== regLast) { + regPrev.fixUpperEdge = false; + var reg = regPrev.regionBelow(); + var e = reg.eUp; + if(e.org !== ePrev.org) { + if(!reg.fixUpperEdge) { + libtess.sweep.finishRegion_(tess, regPrev); + break + } + e = libtess.mesh.connect(ePrev.lPrev(), e.sym); + libtess.sweep.fixUpperEdge_(reg, e) + } + if(ePrev.oNext !== e) { + libtess.mesh.meshSplice(e.oPrev(), e); + libtess.mesh.meshSplice(ePrev, e) + } + libtess.sweep.finishRegion_(tess, regPrev); + ePrev = reg.eUp; + regPrev = reg + } + return ePrev +}; +libtess.sweep.addRightEdges_ = function(tess, regUp, eFirst, eLast, eTopLeft, cleanUp) { + var firstTime = true; + var e = eFirst; + do { + libtess.assert(libtess.geom.vertLeq(e.org, e.dst())); + libtess.sweep.addRegionBelow_(tess, regUp, e.sym); + e = e.oNext + }while(e !== eLast); + if(eTopLeft === null) { + eTopLeft = regUp.regionBelow().eUp.rPrev() + } + var regPrev = regUp; + var ePrev = eTopLeft; + var reg; + for(;;) { + reg = regPrev.regionBelow(); + e = reg.eUp.sym; + if(e.org !== ePrev.org) { + break + } + if(e.oNext !== ePrev) { + libtess.mesh.meshSplice(e.oPrev(), e); + libtess.mesh.meshSplice(ePrev.oPrev(), e) + } + reg.windingNumber = regPrev.windingNumber - e.winding; + reg.inside = libtess.sweep.isWindingInside_(tess, reg.windingNumber); + regPrev.dirty = true; + if(!firstTime && libtess.sweep.checkForRightSplice_(tess, regPrev)) { + libtess.sweep.addWinding_(e, ePrev); + libtess.sweep.deleteRegion_(tess, regPrev); + libtess.mesh.deleteEdge(ePrev) + } + firstTime = false; + regPrev = reg; + ePrev = e + } + regPrev.dirty = true; + libtess.assert(regPrev.windingNumber - e.winding === reg.windingNumber); + if(cleanUp) { + libtess.sweep.walkDirtyRegions_(tess, regPrev) + } +}; +libtess.sweep.callCombine_ = function(tess, isect, data, weights, needed) { + var coords = [isect.coords[0], isect.coords[1], isect.coords[2]]; + isect.data = null; + isect.data = tess.callCombineOrCombineData(coords, data, weights); + if(isect.data === null) { + if(!needed) { + isect.data = data[0] + }else { + if(!tess.fatalError) { + tess.callErrorOrErrorData(libtess.errorType.GLU_TESS_NEED_COMBINE_CALLBACK); + tess.fatalError = true + } + } + } +}; +libtess.sweep.spliceMergeVertices_ = function(tess, e1, e2) { + var data = [null, null, null, null]; + var weights = [0.5, 0.5, 0, 0]; + data[0] = e1.org.data; + data[1] = e2.org.data; + libtess.sweep.callCombine_(tess, e1.org, data, weights, false); + libtess.mesh.meshSplice(e1, e2) +}; +libtess.sweep.vertexWeights_ = function(isect, org, dst, weights, weightIndex) { + var t1 = libtess.geom.vertL1dist(org, isect); + var t2 = libtess.geom.vertL1dist(dst, isect); + var i0 = weightIndex; + var i1 = weightIndex + 1; + weights[i0] = 0.5 * t2 / (t1 + t2); + weights[i1] = 0.5 * t1 / (t1 + t2); + isect.coords[0] += weights[i0] * org.coords[0] + weights[i1] * dst.coords[0]; + isect.coords[1] += weights[i0] * org.coords[1] + weights[i1] * dst.coords[1]; + isect.coords[2] += weights[i0] * org.coords[2] + weights[i1] * dst.coords[2] +}; +libtess.sweep.getIntersectData_ = function(tess, isect, orgUp, dstUp, orgLo, dstLo) { + var weights = [0, 0, 0, 0]; + var data = [orgUp.data, dstUp.data, orgLo.data, dstLo.data]; + isect.coords[0] = isect.coords[1] = isect.coords[2] = 0; + libtess.sweep.vertexWeights_(isect, orgUp, dstUp, weights, 0); + libtess.sweep.vertexWeights_(isect, orgLo, dstLo, weights, 2); + libtess.sweep.callCombine_(tess, isect, data, weights, true) +}; +libtess.sweep.checkForRightSplice_ = function(tess, regUp) { + var regLo = regUp.regionBelow(); + var eUp = regUp.eUp; + var eLo = regLo.eUp; + if(libtess.geom.vertLeq(eUp.org, eLo.org)) { + if(libtess.geom.edgeSign(eLo.dst(), eUp.org, eLo.org) > 0) { + return false + } + if(!libtess.geom.vertEq(eUp.org, eLo.org)) { + libtess.mesh.splitEdge(eLo.sym); + libtess.mesh.meshSplice(eUp, eLo.oPrev()); + regUp.dirty = regLo.dirty = true + }else { + if(eUp.org !== eLo.org) { + tess.pq.remove((eUp.org.pqHandle)); + libtess.sweep.spliceMergeVertices_(tess, eLo.oPrev(), eUp) + } + } + }else { + if(libtess.geom.edgeSign(eUp.dst(), eLo.org, eUp.org) < 0) { + return false + } + regUp.regionAbove().dirty = regUp.dirty = true; + libtess.mesh.splitEdge(eUp.sym); + libtess.mesh.meshSplice(eLo.oPrev(), eUp) + } + return true +}; +libtess.sweep.checkForLeftSplice_ = function(tess, regUp) { + var regLo = regUp.regionBelow(); + var eUp = regUp.eUp; + var eLo = regLo.eUp; + var e; + libtess.assert(!libtess.geom.vertEq(eUp.dst(), eLo.dst())); + if(libtess.geom.vertLeq(eUp.dst(), eLo.dst())) { + if(libtess.geom.edgeSign(eUp.dst(), eLo.dst(), eUp.org) < 0) { + return false + } + regUp.regionAbove().dirty = regUp.dirty = true; + e = libtess.mesh.splitEdge(eUp); + libtess.mesh.meshSplice(eLo.sym, e); + e.lFace.inside = regUp.inside + }else { + if(libtess.geom.edgeSign(eLo.dst(), eUp.dst(), eLo.org) > 0) { + return false + } + regUp.dirty = regLo.dirty = true; + e = libtess.mesh.splitEdge(eLo); + libtess.mesh.meshSplice(eUp.lNext, eLo.sym); + e.rFace().inside = regUp.inside + } + return true +}; +libtess.sweep.checkForIntersect_ = function(tess, regUp) { + var regLo = regUp.regionBelow(); + var eUp = regUp.eUp; + var eLo = regLo.eUp; + var orgUp = eUp.org; + var orgLo = eLo.org; + var dstUp = eUp.dst(); + var dstLo = eLo.dst(); + var isect = new libtess.GluVertex; + libtess.assert(!libtess.geom.vertEq(dstLo, dstUp)); + libtess.assert(libtess.geom.edgeSign(dstUp, tess.event, orgUp) <= 0); + libtess.assert(libtess.geom.edgeSign(dstLo, tess.event, orgLo) >= 0); + libtess.assert(orgUp !== tess.event && orgLo !== tess.event); + libtess.assert(!regUp.fixUpperEdge && !regLo.fixUpperEdge); + if(orgUp === orgLo) { + return false + } + var tMinUp = Math.min(orgUp.t, dstUp.t); + var tMaxLo = Math.max(orgLo.t, dstLo.t); + if(tMinUp > tMaxLo) { + return false + } + if(libtess.geom.vertLeq(orgUp, orgLo)) { + if(libtess.geom.edgeSign(dstLo, orgUp, orgLo) > 0) { + return false + } + }else { + if(libtess.geom.edgeSign(dstUp, orgLo, orgUp) < 0) { + return false + } + } + libtess.sweepDebugEvent(tess); + libtess.geom.edgeIntersect(dstUp, orgUp, dstLo, orgLo, isect); + libtess.assert(Math.min(orgUp.t, dstUp.t) <= isect.t); + libtess.assert(isect.t <= Math.max(orgLo.t, dstLo.t)); + libtess.assert(Math.min(dstLo.s, dstUp.s) <= isect.s); + libtess.assert(isect.s <= Math.max(orgLo.s, orgUp.s)); + if(libtess.geom.vertLeq(isect, tess.event)) { + isect.s = tess.event.s; + isect.t = tess.event.t + } + var orgMin = libtess.geom.vertLeq(orgUp, orgLo) ? orgUp : orgLo; + if(libtess.geom.vertLeq(orgMin, isect)) { + isect.s = orgMin.s; + isect.t = orgMin.t + } + if(libtess.geom.vertEq(isect, orgUp) || libtess.geom.vertEq(isect, orgLo)) { + libtess.sweep.checkForRightSplice_(tess, regUp); + return false + } + if(!libtess.geom.vertEq(dstUp, tess.event) && libtess.geom.edgeSign(dstUp, tess.event, isect) >= 0 || !libtess.geom.vertEq(dstLo, tess.event) && libtess.geom.edgeSign(dstLo, tess.event, isect) <= 0) { + if(dstLo === tess.event) { + libtess.mesh.splitEdge(eUp.sym); + libtess.mesh.meshSplice(eLo.sym, eUp); + regUp = libtess.sweep.topLeftRegion_(regUp); + eUp = regUp.regionBelow().eUp; + libtess.sweep.finishLeftRegions_(tess, regUp.regionBelow(), regLo); + libtess.sweep.addRightEdges_(tess, regUp, eUp.oPrev(), eUp, eUp, true); + return true + } + if(dstUp === tess.event) { + libtess.mesh.splitEdge(eLo.sym); + libtess.mesh.meshSplice(eUp.lNext, eLo.oPrev()); + regLo = regUp; + regUp = libtess.sweep.topRightRegion_(regUp); + var e = regUp.regionBelow().eUp.rPrev(); + regLo.eUp = eLo.oPrev(); + eLo = libtess.sweep.finishLeftRegions_(tess, regLo, null); + libtess.sweep.addRightEdges_(tess, regUp, eLo.oNext, eUp.rPrev(), e, true); + return true + } + if(libtess.geom.edgeSign(dstUp, tess.event, isect) >= 0) { + regUp.regionAbove().dirty = regUp.dirty = true; + libtess.mesh.splitEdge(eUp.sym); + eUp.org.s = tess.event.s; + eUp.org.t = tess.event.t + } + if(libtess.geom.edgeSign(dstLo, tess.event, isect) <= 0) { + regUp.dirty = regLo.dirty = true; + libtess.mesh.splitEdge(eLo.sym); + eLo.org.s = tess.event.s; + eLo.org.t = tess.event.t + } + return false + } + libtess.mesh.splitEdge(eUp.sym); + libtess.mesh.splitEdge(eLo.sym); + libtess.mesh.meshSplice(eLo.oPrev(), eUp); + eUp.org.s = isect.s; + eUp.org.t = isect.t; + eUp.org.pqHandle = tess.pq.insert(eUp.org); + libtess.sweep.getIntersectData_(tess, eUp.org, orgUp, dstUp, orgLo, dstLo); + regUp.regionAbove().dirty = regUp.dirty = regLo.dirty = true; + return false +}; +libtess.sweep.walkDirtyRegions_ = function(tess, regUp) { + var regLo = regUp.regionBelow(); + for(;;) { + while(regLo.dirty) { + regUp = regLo; + regLo = regLo.regionBelow() + } + if(!regUp.dirty) { + regLo = regUp; + regUp = regUp.regionAbove(); + if(regUp === null || !regUp.dirty) { + return + } + } + regUp.dirty = false; + var eUp = regUp.eUp; + var eLo = regLo.eUp; + if(eUp.dst() !== eLo.dst()) { + if(libtess.sweep.checkForLeftSplice_(tess, regUp)) { + if(regLo.fixUpperEdge) { + libtess.sweep.deleteRegion_(tess, regLo); + libtess.mesh.deleteEdge(eLo); + regLo = regUp.regionBelow(); + eLo = regLo.eUp + }else { + if(regUp.fixUpperEdge) { + libtess.sweep.deleteRegion_(tess, regUp); + libtess.mesh.deleteEdge(eUp); + regUp = regLo.regionAbove(); + eUp = regUp.eUp + } + } + } + } + if(eUp.org !== eLo.org) { + if(eUp.dst() !== eLo.dst() && !regUp.fixUpperEdge && !regLo.fixUpperEdge && (eUp.dst() === tess.event || eLo.dst() === tess.event)) { + if(libtess.sweep.checkForIntersect_(tess, regUp)) { + return + } + }else { + libtess.sweep.checkForRightSplice_(tess, regUp) + } + } + if(eUp.org === eLo.org && eUp.dst() === eLo.dst()) { + libtess.sweep.addWinding_(eLo, eUp); + libtess.sweep.deleteRegion_(tess, regUp); + libtess.mesh.deleteEdge(eUp); + regUp = regLo.regionAbove() + } + } +}; +libtess.sweep.connectRightVertex_ = function(tess, regUp, eBottomLeft) { + var eTopLeft = eBottomLeft.oNext; + var regLo = regUp.regionBelow(); + var eUp = regUp.eUp; + var eLo = regLo.eUp; + var degenerate = false; + if(eUp.dst() !== eLo.dst()) { + libtess.sweep.checkForIntersect_(tess, regUp) + } + if(libtess.geom.vertEq(eUp.org, tess.event)) { + libtess.mesh.meshSplice(eTopLeft.oPrev(), eUp); + regUp = libtess.sweep.topLeftRegion_(regUp); + eTopLeft = regUp.regionBelow().eUp; + libtess.sweep.finishLeftRegions_(tess, regUp.regionBelow(), regLo); + degenerate = true + } + if(libtess.geom.vertEq(eLo.org, tess.event)) { + libtess.mesh.meshSplice(eBottomLeft, eLo.oPrev()); + eBottomLeft = libtess.sweep.finishLeftRegions_(tess, regLo, null); + degenerate = true + } + if(degenerate) { + libtess.sweep.addRightEdges_(tess, regUp, eBottomLeft.oNext, eTopLeft, eTopLeft, true); + return + } + var eNew; + if(libtess.geom.vertLeq(eLo.org, eUp.org)) { + eNew = eLo.oPrev() + }else { + eNew = eUp + } + eNew = libtess.mesh.connect(eBottomLeft.lPrev(), eNew); + libtess.sweep.addRightEdges_(tess, regUp, eNew, eNew.oNext, eNew.oNext, false); + eNew.sym.activeRegion.fixUpperEdge = true; + libtess.sweep.walkDirtyRegions_(tess, regUp) +}; +libtess.sweep.connectLeftDegenerate_ = function(tess, regUp, vEvent) { + var e = regUp.eUp; + if(libtess.geom.vertEq(e.org, vEvent)) { + libtess.assert(libtess.sweep.TOLERANCE_NONZERO_); + libtess.sweep.spliceMergeVertices_(tess, e, vEvent.anEdge); + return + } + if(!libtess.geom.vertEq(e.dst(), vEvent)) { + libtess.mesh.splitEdge(e.sym); + if(regUp.fixUpperEdge) { + libtess.mesh.deleteEdge(e.oNext); + regUp.fixUpperEdge = false + } + libtess.mesh.meshSplice(vEvent.anEdge, e); + libtess.sweep.sweepEvent_(tess, vEvent); + return + } + libtess.assert(libtess.sweep.TOLERANCE_NONZERO_); + regUp = libtess.sweep.topRightRegion_(regUp); + var reg = regUp.regionBelow(); + var eTopRight = reg.eUp.sym; + var eTopLeft = eTopRight.oNext; + var eLast = eTopLeft; + if(reg.fixUpperEdge) { + libtess.assert(eTopLeft !== eTopRight); + libtess.sweep.deleteRegion_(tess, reg); + libtess.mesh.deleteEdge(eTopRight); + eTopRight = eTopLeft.oPrev() + } + libtess.mesh.meshSplice(vEvent.anEdge, eTopRight); + if(!libtess.geom.edgeGoesLeft(eTopLeft)) { + eTopLeft = null + } + libtess.sweep.addRightEdges_(tess, regUp, eTopRight.oNext, eLast, eTopLeft, true) +}; +libtess.sweep.connectLeftVertex_ = function(tess, vEvent) { + var tmp = new libtess.ActiveRegion; + tmp.eUp = vEvent.anEdge.sym; + var regUp = (tess.dict.search(tmp).getKey()); + var regLo = regUp.regionBelow(); + var eUp = regUp.eUp; + var eLo = regLo.eUp; + if(libtess.geom.edgeSign(eUp.dst(), vEvent, eUp.org) === 0) { + libtess.sweep.connectLeftDegenerate_(tess, regUp, vEvent); + return + } + var reg = libtess.geom.vertLeq(eLo.dst(), eUp.dst()) ? regUp : regLo; + var eNew; + if(regUp.inside || reg.fixUpperEdge) { + if(reg === regUp) { + eNew = libtess.mesh.connect(vEvent.anEdge.sym, eUp.lNext) + }else { + var tempHalfEdge = libtess.mesh.connect(eLo.dNext(), vEvent.anEdge); + eNew = tempHalfEdge.sym + } + if(reg.fixUpperEdge) { + libtess.sweep.fixUpperEdge_(reg, eNew) + }else { + libtess.sweep.computeWinding_(tess, libtess.sweep.addRegionBelow_(tess, regUp, eNew)) + } + libtess.sweep.sweepEvent_(tess, vEvent) + }else { + libtess.sweep.addRightEdges_(tess, regUp, vEvent.anEdge, vEvent.anEdge, null, true) + } +}; +libtess.sweep.sweepEvent_ = function(tess, vEvent) { + tess.event = vEvent; + libtess.sweepDebugEvent(tess); + var e = vEvent.anEdge; + while(e.activeRegion === null) { + e = e.oNext; + if(e === vEvent.anEdge) { + libtess.sweep.connectLeftVertex_(tess, vEvent); + return + } + } + var regUp = libtess.sweep.topLeftRegion_(e.activeRegion); + var reg = regUp.regionBelow(); + var eTopLeft = reg.eUp; + var eBottomLeft = libtess.sweep.finishLeftRegions_(tess, reg, null); + if(eBottomLeft.oNext === eTopLeft) { + libtess.sweep.connectRightVertex_(tess, regUp, eBottomLeft) + }else { + libtess.sweep.addRightEdges_(tess, regUp, eBottomLeft.oNext, eTopLeft, eTopLeft, true) + } +}; +libtess.sweep.addSentinel_ = function(tess, t) { + var reg = new libtess.ActiveRegion; + var e = libtess.mesh.makeEdge(tess.mesh); + e.org.s = libtess.sweep.SENTINEL_COORD_; + e.org.t = t; + e.dst().s = -libtess.sweep.SENTINEL_COORD_; + e.dst().t = t; + tess.event = e.dst(); + reg.eUp = e; + reg.windingNumber = 0; + reg.inside = false; + reg.fixUpperEdge = false; + reg.sentinel = true; + reg.dirty = false; + reg.nodeUp = tess.dict.insert(reg) +}; +libtess.sweep.initEdgeDict_ = function(tess) { + tess.dict = new libtess.Dict(tess, (libtess.sweep.edgeLeq_)); + libtess.sweep.addSentinel_(tess, -libtess.sweep.SENTINEL_COORD_); + libtess.sweep.addSentinel_(tess, libtess.sweep.SENTINEL_COORD_) +}; +libtess.sweep.doneEdgeDict_ = function(tess) { + var fixedEdges = 0; + var reg; + while((reg = (tess.dict.getMin().getKey())) !== null) { + if(!reg.sentinel) { + libtess.assert(reg.fixUpperEdge); + libtess.assert(++fixedEdges === 1) + } + libtess.assert(reg.windingNumber === 0); + libtess.sweep.deleteRegion_(tess, reg) + } + tess.dict.deleteDict(); + tess.dict = null +}; +libtess.sweep.removeDegenerateEdges_ = function(tess) { + var eHead = tess.mesh.eHead; + var eNext; + for(var e = eHead.next;e !== eHead;e = eNext) { + eNext = e.next; + var eLNext = e.lNext; + if(libtess.geom.vertEq(e.org, e.dst()) && e.lNext.lNext !== e) { + libtess.sweep.spliceMergeVertices_(tess, eLNext, e); + libtess.mesh.deleteEdge(e); + e = eLNext; + eLNext = e.lNext + } + if(eLNext.lNext === e) { + if(eLNext !== e) { + if(eLNext === eNext || eLNext === eNext.sym) { + eNext = eNext.next + } + libtess.mesh.deleteEdge(eLNext) + } + if(e === eNext || e === eNext.sym) { + eNext = eNext.next + } + libtess.mesh.deleteEdge(e) + } + } +}; +libtess.sweep.initPriorityQ_ = function(tess) { + var pq = new libtess.PriorityQ((libtess.geom.vertLeq)); + tess.pq = pq; + var vHead = tess.mesh.vHead; + var v; + for(v = vHead.next;v !== vHead;v = v.next) { + v.pqHandle = pq.insert(v) + } + pq.init() +}; +libtess.sweep.donePriorityQ_ = function(tess) { + tess.pq.deleteQ(); + tess.pq = null +}; +libtess.sweep.removeDegenerateFaces_ = function(mesh) { + var fNext; + for(var f = mesh.fHead.next;f !== mesh.fHead;f = fNext) { + fNext = f.next; + var e = f.anEdge; + libtess.assert(e.lNext !== e); + if(e.lNext.lNext === e) { + libtess.sweep.addWinding_(e.oNext, e); + libtess.mesh.deleteEdge(e) + } + } +}; +goog.provide("libtess.tessmono"); +goog.require("libtess"); +goog.require("libtess.geom"); +goog.require("libtess.mesh"); +libtess.tessmono.tessellateMonoRegion_ = function(face) { + var up = face.anEdge; + libtess.assert(up.lNext !== up && up.lNext.lNext !== up); + for(;libtess.geom.vertLeq(up.dst(), up.org);up = up.lPrev()) { + } + for(;libtess.geom.vertLeq(up.org, up.dst());up = up.lNext) { + } + var lo = up.lPrev(); + var tempHalfEdge; + while(up.lNext !== lo) { + if(libtess.geom.vertLeq(up.dst(), lo.org)) { + while(lo.lNext !== up && (libtess.geom.edgeGoesLeft(lo.lNext) || libtess.geom.edgeSign(lo.org, lo.dst(), lo.lNext.dst()) <= 0)) { + tempHalfEdge = libtess.mesh.connect(lo.lNext, lo); + lo = tempHalfEdge.sym + } + lo = lo.lPrev() + }else { + while(lo.lNext !== up && (libtess.geom.edgeGoesRight(up.lPrev()) || libtess.geom.edgeSign(up.dst(), up.org, up.lPrev().org) >= 0)) { + tempHalfEdge = libtess.mesh.connect(up, up.lPrev()); + up = tempHalfEdge.sym + } + up = up.lNext + } + } + libtess.assert(lo.lNext !== up); + while(lo.lNext.lNext !== up) { + tempHalfEdge = libtess.mesh.connect(lo.lNext, lo); + lo = tempHalfEdge.sym + } +}; +libtess.tessmono.tessellateInterior = function(mesh) { + var next; + for(var f = mesh.fHead.next;f !== mesh.fHead;f = next) { + next = f.next; + if(f.inside) { + libtess.tessmono.tessellateMonoRegion_(f) + } + } +}; +libtess.tessmono.discardExterior = function(mesh) { + var next; + for(var f = mesh.fHead.next;f !== mesh.fHead;f = next) { + next = f.next; + if(!f.inside) { + libtess.mesh.zapFace(f) + } + } +}; +libtess.tessmono.setWindingNumber = function(mesh, value, keepOnlyBoundary) { + var eNext; + for(var e = mesh.eHead.next;e !== mesh.eHead;e = eNext) { + eNext = e.next; + if(e.rFace().inside !== e.lFace.inside) { + e.winding = e.lFace.inside ? value : -value + }else { + if(!keepOnlyBoundary) { + e.winding = 0 + }else { + libtess.mesh.deleteEdge(e) + } + } + } +}; +goog.provide("libtess.GluTesselator"); +goog.require("libtess"); +goog.require("libtess.CachedVertex"); +goog.require("libtess.GluMesh"); +goog.require("libtess.mesh"); +goog.require("libtess.normal"); +goog.require("libtess.render"); +goog.require("libtess.sweep"); +goog.require("libtess.tessmono"); +libtess.GluTesselator = function() { + this.state = libtess.tessState.T_DORMANT; + this.lastEdge_ = null; + this.mesh = null; + this.callError_ = null; + this.normal = [0, 0, 0]; + this.sUnit = [0, 0, 0]; + this.tUnit = [0, 0, 0]; + this.relTolerance = libtess.GLU_TESS_DEFAULT_TOLERANCE; + this.windingRule = libtess.windingRule.GLU_TESS_WINDING_ODD; + this.fatalError = false; + this.dict = null; + this.pq = null; + this.event = null; + this.callCombine_ = null; + this.flagBoundary = false; + this.boundaryOnly = false; + this.lonelyTriList = null; + this.callBegin_ = null; + this.callEdgeFlag_ = null; + this.callVertex_ = null; + this.callEnd_ = null; + this.callMesh_ = null; + this.callBeginData_ = null; + this.callEdgeFlagData_ = null; + this.callVertexData_ = null; + this.callEndData_ = null; + this.callErrorData_ = null; + this.callCombineData_ = null; + this.polygonData_ = null; + this.emptyCache = false; + this.cacheCount = 0; + this.cache = new Array(libtess.TESS_MAX_CACHE); + for(var i = 0;i < libtess.TESS_MAX_CACHE;i++) { + this.cache[i] = new libtess.CachedVertex + } +}; +libtess.GluTesselator.prototype.gluDeleteTess = function() { + this.requireState_(libtess.tessState.T_DORMANT) +}; +libtess.GluTesselator.prototype.gluTessProperty = function(which, value) { + switch(which) { + case libtess.gluEnum.GLU_TESS_TOLERANCE: + if(value < 0 || value > 1) { + break + } + this.relTolerance = (value); + return; + case libtess.gluEnum.GLU_TESS_WINDING_RULE: + var windingRule = (value); + switch(windingRule) { + case libtess.windingRule.GLU_TESS_WINDING_ODD: + ; + case libtess.windingRule.GLU_TESS_WINDING_NONZERO: + ; + case libtess.windingRule.GLU_TESS_WINDING_POSITIVE: + ; + case libtess.windingRule.GLU_TESS_WINDING_NEGATIVE: + ; + case libtess.windingRule.GLU_TESS_WINDING_ABS_GEQ_TWO: + this.windingRule = windingRule; + return; + default: + } + break; + case libtess.gluEnum.GLU_TESS_BOUNDARY_ONLY: + this.boundaryOnly = !!value; + return; + default: + this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_ENUM); + return + } + this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_VALUE) +}; +libtess.GluTesselator.prototype.gluGetTessProperty = function(which) { + switch(which) { + case libtess.gluEnum.GLU_TESS_TOLERANCE: + libtess.assert(0 <= this.relTolerance && this.relTolerance <= 1); + return this.relTolerance; + case libtess.gluEnum.GLU_TESS_WINDING_RULE: + var rule = this.windingRule; + libtess.assert(rule === libtess.windingRule.GLU_TESS_WINDING_ODD || rule === libtess.windingRule.GLU_TESS_WINDING_NONZERO || rule === libtess.windingRule.GLU_TESS_WINDING_POSITIVE || rule === libtess.windingRule.GLU_TESS_WINDING_NEGATIVE || rule === libtess.windingRule.GLU_TESS_WINDING_ABS_GEQ_TWO); + return rule; + case libtess.gluEnum.GLU_TESS_BOUNDARY_ONLY: + libtess.assert(this.boundaryOnly === true || this.boundaryOnly === false); + return this.boundaryOnly; + default: + this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_ENUM); + break + } + return false +}; +libtess.GluTesselator.prototype.gluTessNormal = function(x, y, z) { + this.normal[0] = x; + this.normal[1] = y; + this.normal[2] = z +}; +libtess.GluTesselator.prototype.gluTessCallback = function(which, opt_fn) { + var fn = !opt_fn ? null : opt_fn; + switch(which) { + case libtess.gluEnum.GLU_TESS_BEGIN: + this.callBegin_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_BEGIN_DATA: + this.callBeginData_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_EDGE_FLAG: + this.callEdgeFlag_ = (fn); + this.flagBoundary = !!fn; + return; + case libtess.gluEnum.GLU_TESS_EDGE_FLAG_DATA: + this.callEdgeFlagData_ = (fn); + this.flagBoundary = !!fn; + return; + case libtess.gluEnum.GLU_TESS_VERTEX: + this.callVertex_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_VERTEX_DATA: + this.callVertexData_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_END: + this.callEnd_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_END_DATA: + this.callEndData_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_ERROR: + this.callError_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_ERROR_DATA: + this.callErrorData_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_COMBINE: + this.callCombine_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_COMBINE_DATA: + this.callCombineData_ = (fn); + return; + case libtess.gluEnum.GLU_TESS_MESH: + this.callMesh_ = (fn); + return; + default: + this.callErrorOrErrorData(libtess.gluEnum.GLU_INVALID_ENUM); + return + } +}; +libtess.GluTesselator.prototype.gluTessVertex = function(coords, data) { + var tooLarge = false; + var clamped = [0, 0, 0]; + this.requireState_(libtess.tessState.T_IN_CONTOUR); + if(this.emptyCache) { + this.emptyCache_(); + this.lastEdge_ = null + } + for(var i = 0;i < 3;++i) { + var x = coords[i]; + if(x < -libtess.GLU_TESS_MAX_COORD) { + x = -libtess.GLU_TESS_MAX_COORD; + tooLarge = true + } + if(x > libtess.GLU_TESS_MAX_COORD) { + x = libtess.GLU_TESS_MAX_COORD; + tooLarge = true + } + clamped[i] = x + } + if(tooLarge) { + this.callErrorOrErrorData(libtess.errorType.GLU_TESS_COORD_TOO_LARGE) + } + if(this.mesh === null) { + if(this.cacheCount < libtess.TESS_MAX_CACHE) { + this.cacheVertex_(clamped, data); + return + } + this.emptyCache_() + } + this.addVertex_(clamped, data) +}; +libtess.GluTesselator.prototype.gluTessBeginPolygon = function(data) { + this.requireState_(libtess.tessState.T_DORMANT); + this.state = libtess.tessState.T_IN_POLYGON; + this.cacheCount = 0; + this.emptyCache = false; + this.mesh = null; + this.polygonData_ = data +}; +libtess.GluTesselator.prototype.gluTessBeginContour = function() { + this.requireState_(libtess.tessState.T_IN_POLYGON); + this.state = libtess.tessState.T_IN_CONTOUR; + this.lastEdge_ = null; + if(this.cacheCount > 0) { + this.emptyCache = true + } +}; +libtess.GluTesselator.prototype.gluTessEndContour = function() { + this.requireState_(libtess.tessState.T_IN_CONTOUR); + this.state = libtess.tessState.T_IN_POLYGON +}; +libtess.GluTesselator.prototype.gluTessEndPolygon = function() { + this.requireState_(libtess.tessState.T_IN_POLYGON); + this.state = libtess.tessState.T_DORMANT; + if(this.mesh === null) { + if(!this.flagBoundary && !this.callMesh_) { + if(libtess.render.renderCache(this)) { + this.polygonData_ = null; + return + } + } + this.emptyCache_() + } + libtess.normal.projectPolygon(this); + libtess.sweep.computeInterior(this); + if(!this.fatalError) { + if(this.boundaryOnly) { + libtess.tessmono.setWindingNumber(this.mesh, 1, true) + }else { + libtess.tessmono.tessellateInterior(this.mesh) + } + this.mesh.checkMesh(); + if(this.callBegin_ || this.callEnd_ || this.callVertex_ || this.callEdgeFlag_ || this.callBeginData_ || this.callEndData_ || this.callVertexData_ || this.callEdgeFlagData_) { + if(this.boundaryOnly) { + libtess.render.renderBoundary(this, this.mesh) + }else { + libtess.render.renderMesh(this, this.mesh) + } + } + if(this.callMesh_) { + libtess.tessmono.discardExterior(this.mesh); + this.callMesh_(this.mesh); + this.mesh = null; + this.polygonData_ = null; + return + } + } + libtess.mesh.deleteMesh(this.mesh); + this.polygonData_ = null; + this.mesh = null +}; +libtess.GluTesselator.prototype.makeDormant_ = function() { + if(this.mesh) { + libtess.mesh.deleteMesh(this.mesh) + } + this.state = libtess.tessState.T_DORMANT; + this.lastEdge_ = null; + this.mesh = null +}; +libtess.GluTesselator.prototype.requireState_ = function(state) { + if(this.state !== state) { + this.gotoState_(state) + } +}; +libtess.GluTesselator.prototype.gotoState_ = function(newState) { + while(this.state !== newState) { + if(this.state < newState) { + switch(this.state) { + case libtess.tessState.T_DORMANT: + this.callErrorOrErrorData(libtess.errorType.GLU_TESS_MISSING_BEGIN_POLYGON); + this.gluTessBeginPolygon(null); + break; + case libtess.tessState.T_IN_POLYGON: + this.callErrorOrErrorData(libtess.errorType.GLU_TESS_MISSING_BEGIN_CONTOUR); + this.gluTessBeginContour(); + break + } + }else { + switch(this.state) { + case libtess.tessState.T_IN_CONTOUR: + this.callErrorOrErrorData(libtess.errorType.GLU_TESS_MISSING_END_CONTOUR); + this.gluTessEndContour(); + break; + case libtess.tessState.T_IN_POLYGON: + this.callErrorOrErrorData(libtess.errorType.GLU_TESS_MISSING_END_POLYGON); + this.makeDormant_(); + break + } + } + } +}; +libtess.GluTesselator.prototype.addVertex_ = function(coords, data) { + var e = this.lastEdge_; + if(e === null) { + e = libtess.mesh.makeEdge(this.mesh); + libtess.mesh.meshSplice(e, e.sym) + }else { + libtess.mesh.splitEdge(e); + e = e.lNext + } + e.org.data = data; + e.org.coords[0] = coords[0]; + e.org.coords[1] = coords[1]; + e.org.coords[2] = coords[2]; + e.winding = 1; + e.sym.winding = -1; + this.lastEdge_ = e +}; +libtess.GluTesselator.prototype.cacheVertex_ = function(coords, data) { + var v = this.cache[this.cacheCount]; + v.data = data; + v.coords[0] = coords[0]; + v.coords[1] = coords[1]; + v.coords[2] = coords[2]; + ++this.cacheCount +}; +libtess.GluTesselator.prototype.emptyCache_ = function() { + this.mesh = new libtess.GluMesh; + for(var i = 0;i < this.cacheCount;i++) { + var v = this.cache[i]; + this.addVertex_(v.coords, v.data) + } + this.cacheCount = 0; + this.emptyCache = false +}; +libtess.GluTesselator.prototype.callBeginOrBeginData = function(type) { + if(this.callBeginData_) { + this.callBeginData_(type, this.polygonData_) + }else { + if(this.callBegin_) { + this.callBegin_(type) + } + } +}; +libtess.GluTesselator.prototype.callVertexOrVertexData = function(data) { + if(this.callVertexData_) { + this.callVertexData_(data, this.polygonData_) + }else { + if(this.callVertex_) { + this.callVertex_(data) + } + } +}; +libtess.GluTesselator.prototype.callEdgeFlagOrEdgeFlagData = function(flag) { + if(this.callEdgeFlagData_) { + this.callEdgeFlagData_(flag, this.polygonData_) + }else { + if(this.callEdgeFlag_) { + this.callEdgeFlag_(flag) + } + } +}; +libtess.GluTesselator.prototype.callEndOrEndData = function() { + if(this.callEndData_) { + this.callEndData_(this.polygonData_) + }else { + if(this.callEnd_) { + this.callEnd_() + } + } +}; +libtess.GluTesselator.prototype.callCombineOrCombineData = function(coords, data, weight) { + var interpData; + if(this.callCombineData_) { + interpData = this.callCombineData_(coords, data, weight, this.polygonData_) + }else { + if(this.callCombine_) { + interpData = this.callCombine_(coords, data, weight) + } + } + if(interpData === undefined) { + interpData = null + } + return interpData +}; +libtess.GluTesselator.prototype.callErrorOrErrorData = function(errno) { + if(this.callErrorData_) { + this.callErrorData_(errno, this.polygonData_) + }else { + if(this.callError_) { + this.callError_(errno) + } + } +}; +goog.provide("ol"); +ol.inherits = goog.inherits; +goog.provide("goog.debug.Error"); +goog.debug.Error = function(opt_msg) { + if(Error.captureStackTrace) { + Error.captureStackTrace(this, goog.debug.Error) + }else { + this.stack = (new Error).stack || "" + } + if(opt_msg) { + this.message = String(opt_msg) + } +}; +goog.inherits(goog.debug.Error, Error); +goog.debug.Error.prototype.name = "CustomError"; +goog.provide("goog.string"); +goog.provide("goog.string.Unicode"); +goog.string.Unicode = {NBSP:"\u00a0"}; +goog.string.startsWith = function(str, prefix) { + return str.lastIndexOf(prefix, 0) == 0 +}; +goog.string.endsWith = function(str, suffix) { + var l = str.length - suffix.length; + return l >= 0 && str.indexOf(suffix, l) == l +}; +goog.string.caseInsensitiveStartsWith = function(str, prefix) { + return goog.string.caseInsensitiveCompare(prefix, str.substr(0, prefix.length)) == 0 +}; +goog.string.caseInsensitiveEndsWith = function(str, suffix) { + return goog.string.caseInsensitiveCompare(suffix, str.substr(str.length - suffix.length, suffix.length)) == 0 +}; +goog.string.caseInsensitiveEquals = function(str1, str2) { + return str1.toLowerCase() == str2.toLowerCase() +}; +goog.string.subs = function(str, var_args) { + var splitParts = str.split("%s"); + var returnString = ""; + var subsArguments = Array.prototype.slice.call(arguments, 1); + while(subsArguments.length && splitParts.length > 1) { + returnString += splitParts.shift() + subsArguments.shift() + } + return returnString + splitParts.join("%s") +}; +goog.string.collapseWhitespace = function(str) { + return str.replace(/[\s\xa0]+/g, " ").replace(/^\s+|\s+$/g, "") +}; +goog.string.isEmpty = function(str) { + return/^[\s\xa0]*$/.test(str) +}; +goog.string.isEmptySafe = function(str) { + return goog.string.isEmpty(goog.string.makeSafe(str)) +}; +goog.string.isBreakingWhitespace = function(str) { + return!/[^\t\n\r ]/.test(str) +}; +goog.string.isAlpha = function(str) { + return!/[^a-zA-Z]/.test(str) +}; +goog.string.isNumeric = function(str) { + return!/[^0-9]/.test(str) +}; +goog.string.isAlphaNumeric = function(str) { + return!/[^a-zA-Z0-9]/.test(str) +}; +goog.string.isSpace = function(ch) { + return ch == " " +}; +goog.string.isUnicodeChar = function(ch) { + return ch.length == 1 && ch >= " " && ch <= "~" || ch >= "\u0080" && ch <= "\ufffd" +}; +goog.string.stripNewlines = function(str) { + return str.replace(/(\r\n|\r|\n)+/g, " ") +}; +goog.string.canonicalizeNewlines = function(str) { + return str.replace(/(\r\n|\r|\n)/g, "\n") +}; +goog.string.normalizeWhitespace = function(str) { + return str.replace(/\xa0|\s/g, " ") +}; +goog.string.normalizeSpaces = function(str) { + return str.replace(/\xa0|[ \t]+/g, " ") +}; +goog.string.collapseBreakingSpaces = function(str) { + return str.replace(/[\t\r\n ]+/g, " ").replace(/^[\t\r\n ]+|[\t\r\n ]+$/g, "") +}; +goog.string.trim = function(str) { + return str.replace(/^[\s\xa0]+|[\s\xa0]+$/g, "") +}; +goog.string.trimLeft = function(str) { + return str.replace(/^[\s\xa0]+/, "") +}; +goog.string.trimRight = function(str) { + return str.replace(/[\s\xa0]+$/, "") +}; +goog.string.caseInsensitiveCompare = function(str1, str2) { + var test1 = String(str1).toLowerCase(); + var test2 = String(str2).toLowerCase(); + if(test1 < test2) { + return-1 + }else { + if(test1 == test2) { + return 0 + }else { + return 1 + } + } +}; +goog.string.numerateCompareRegExp_ = /(\.\d+)|(\d+)|(\D+)/g; +goog.string.numerateCompare = function(str1, str2) { + if(str1 == str2) { + return 0 + } + if(!str1) { + return-1 + } + if(!str2) { + return 1 + } + var tokens1 = str1.toLowerCase().match(goog.string.numerateCompareRegExp_); + var tokens2 = str2.toLowerCase().match(goog.string.numerateCompareRegExp_); + var count = Math.min(tokens1.length, tokens2.length); + for(var i = 0;i < count;i++) { + var a = tokens1[i]; + var b = tokens2[i]; + if(a != b) { + var num1 = parseInt(a, 10); + if(!isNaN(num1)) { + var num2 = parseInt(b, 10); + if(!isNaN(num2) && num1 - num2) { + return num1 - num2 + } + } + return a < b ? -1 : 1 + } + } + if(tokens1.length != tokens2.length) { + return tokens1.length - tokens2.length + } + return str1 < str2 ? -1 : 1 +}; +goog.string.urlEncode = function(str) { + return encodeURIComponent(String(str)) +}; +goog.string.urlDecode = function(str) { + return decodeURIComponent(str.replace(/\+/g, " ")) +}; +goog.string.newLineToBr = function(str, opt_xml) { + return str.replace(/(\r\n|\r|\n)/g, opt_xml ? "\x3cbr /\x3e" : "\x3cbr\x3e") +}; +goog.string.htmlEscape = function(str, opt_isLikelyToContainHtmlChars) { + if(opt_isLikelyToContainHtmlChars) { + return str.replace(goog.string.amperRe_, "\x26amp;").replace(goog.string.ltRe_, "\x26lt;").replace(goog.string.gtRe_, "\x26gt;").replace(goog.string.quotRe_, "\x26quot;") + }else { + if(!goog.string.allRe_.test(str)) { + return str + } + if(str.indexOf("\x26") != -1) { + str = str.replace(goog.string.amperRe_, "\x26amp;") + } + if(str.indexOf("\x3c") != -1) { + str = str.replace(goog.string.ltRe_, "\x26lt;") + } + if(str.indexOf("\x3e") != -1) { + str = str.replace(goog.string.gtRe_, "\x26gt;") + } + if(str.indexOf('"') != -1) { + str = str.replace(goog.string.quotRe_, "\x26quot;") + } + return str + } +}; +goog.string.amperRe_ = /&/g; +goog.string.ltRe_ = //g; +goog.string.quotRe_ = /\"/g; +goog.string.allRe_ = /[&<>\"]/; +goog.string.unescapeEntities = function(str) { + if(goog.string.contains(str, "\x26")) { + if("document" in goog.global) { + return goog.string.unescapeEntitiesUsingDom_(str) + }else { + return goog.string.unescapePureXmlEntities_(str) + } + } + return str +}; +goog.string.unescapeEntitiesUsingDom_ = function(str) { + var seen = {"\x26amp;":"\x26", "\x26lt;":"\x3c", "\x26gt;":"\x3e", "\x26quot;":'"'}; + var div = document.createElement("div"); + return str.replace(goog.string.HTML_ENTITY_PATTERN_, function(s, entity) { + var value = seen[s]; + if(value) { + return value + } + if(entity.charAt(0) == "#") { + var n = Number("0" + entity.substr(1)); + if(!isNaN(n)) { + value = String.fromCharCode(n) + } + } + if(!value) { + div.innerHTML = s + " "; + value = div.firstChild.nodeValue.slice(0, -1) + } + return seen[s] = value + }) +}; +goog.string.unescapePureXmlEntities_ = function(str) { + return str.replace(/&([^;]+);/g, function(s, entity) { + switch(entity) { + case "amp": + return"\x26"; + case "lt": + return"\x3c"; + case "gt": + return"\x3e"; + case "quot": + return'"'; + default: + if(entity.charAt(0) == "#") { + var n = Number("0" + entity.substr(1)); + if(!isNaN(n)) { + return String.fromCharCode(n) + } + } + return s + } + }) +}; +goog.string.HTML_ENTITY_PATTERN_ = /&([^;\s<&]+);?/g; +goog.string.whitespaceEscape = function(str, opt_xml) { + return goog.string.newLineToBr(str.replace(/ /g, " \x26#160;"), opt_xml) +}; +goog.string.stripQuotes = function(str, quoteChars) { + var length = quoteChars.length; + for(var i = 0;i < length;i++) { + var quoteChar = length == 1 ? quoteChars : quoteChars.charAt(i); + if(str.charAt(0) == quoteChar && str.charAt(str.length - 1) == quoteChar) { + return str.substring(1, str.length - 1) + } + } + return str +}; +goog.string.truncate = function(str, chars, opt_protectEscapedCharacters) { + if(opt_protectEscapedCharacters) { + str = goog.string.unescapeEntities(str) + } + if(str.length > chars) { + str = str.substring(0, chars - 3) + "..." + } + if(opt_protectEscapedCharacters) { + str = goog.string.htmlEscape(str) + } + return str +}; +goog.string.truncateMiddle = function(str, chars, opt_protectEscapedCharacters, opt_trailingChars) { + if(opt_protectEscapedCharacters) { + str = goog.string.unescapeEntities(str) + } + if(opt_trailingChars && str.length > chars) { + if(opt_trailingChars > chars) { + opt_trailingChars = chars + } + var endPoint = str.length - opt_trailingChars; + var startPoint = chars - opt_trailingChars; + str = str.substring(0, startPoint) + "..." + str.substring(endPoint) + }else { + if(str.length > chars) { + var half = Math.floor(chars / 2); + var endPos = str.length - half; + half += chars % 2; + str = str.substring(0, half) + "..." + str.substring(endPos) + } + } + if(opt_protectEscapedCharacters) { + str = goog.string.htmlEscape(str) + } + return str +}; +goog.string.specialEscapeChars_ = {"\x00":"\\0", "\b":"\\b", "\f":"\\f", "\n":"\\n", "\r":"\\r", "\t":"\\t", "\x0B":"\\x0B", '"':'\\"', "\\":"\\\\"}; +goog.string.jsEscapeCache_ = {"'":"\\'"}; +goog.string.quote = function(s) { + s = String(s); + if(s.quote) { + return s.quote() + }else { + var sb = ['"']; + for(var i = 0;i < s.length;i++) { + var ch = s.charAt(i); + var cc = ch.charCodeAt(0); + sb[i + 1] = goog.string.specialEscapeChars_[ch] || (cc > 31 && cc < 127 ? ch : goog.string.escapeChar(ch)) + } + sb.push('"'); + return sb.join("") + } +}; +goog.string.escapeString = function(str) { + var sb = []; + for(var i = 0;i < str.length;i++) { + sb[i] = goog.string.escapeChar(str.charAt(i)) + } + return sb.join("") +}; +goog.string.escapeChar = function(c) { + if(c in goog.string.jsEscapeCache_) { + return goog.string.jsEscapeCache_[c] + } + if(c in goog.string.specialEscapeChars_) { + return goog.string.jsEscapeCache_[c] = goog.string.specialEscapeChars_[c] + } + var rv = c; + var cc = c.charCodeAt(0); + if(cc > 31 && cc < 127) { + rv = c + }else { + if(cc < 256) { + rv = "\\x"; + if(cc < 16 || cc > 256) { + rv += "0" + } + }else { + rv = "\\u"; + if(cc < 4096) { + rv += "0" + } + } + rv += cc.toString(16).toUpperCase() + } + return goog.string.jsEscapeCache_[c] = rv +}; +goog.string.toMap = function(s) { + var rv = {}; + for(var i = 0;i < s.length;i++) { + rv[s.charAt(i)] = true + } + return rv +}; +goog.string.contains = function(s, ss) { + return s.indexOf(ss) != -1 +}; +goog.string.countOf = function(s, ss) { + return s && ss ? s.split(ss).length - 1 : 0 +}; +goog.string.removeAt = function(s, index, stringLength) { + var resultStr = s; + if(index >= 0 && index < s.length && stringLength > 0) { + resultStr = s.substr(0, index) + s.substr(index + stringLength, s.length - index - stringLength) + } + return resultStr +}; +goog.string.remove = function(s, ss) { + var re = new RegExp(goog.string.regExpEscape(ss), ""); + return s.replace(re, "") +}; +goog.string.removeAll = function(s, ss) { + var re = new RegExp(goog.string.regExpEscape(ss), "g"); + return s.replace(re, "") +}; +goog.string.regExpEscape = function(s) { + return String(s).replace(/([-()\[\]{}+?*.$\^|,:# right) { + return 1 + } + } + return 0 +}; +goog.string.HASHCODE_MAX_ = 4294967296; +goog.string.hashCode = function(str) { + var result = 0; + for(var i = 0;i < str.length;++i) { + result = 31 * result + str.charCodeAt(i); + result %= goog.string.HASHCODE_MAX_ + } + return result +}; +goog.string.uniqueStringCounter_ = Math.random() * 2147483648 | 0; +goog.string.createUniqueString = function() { + return"goog_" + goog.string.uniqueStringCounter_++ +}; +goog.string.toNumber = function(str) { + var num = Number(str); + if(num == 0 && goog.string.isEmpty(str)) { + return NaN + } + return num +}; +goog.string.isLowerCamelCase = function(str) { + return/^[a-z]+([A-Z][a-z]*)*$/.test(str) +}; +goog.string.isUpperCamelCase = function(str) { + return/^([A-Z][a-z]*)+$/.test(str) +}; +goog.string.toCamelCase = function(str) { + return String(str).replace(/\-([a-z])/g, function(all, match) { + return match.toUpperCase() + }) +}; +goog.string.toSelectorCase = function(str) { + return String(str).replace(/([A-Z])/g, "-$1").toLowerCase() +}; +goog.string.toTitleCase = function(str, opt_delimiters) { + var delimiters = goog.isString(opt_delimiters) ? goog.string.regExpEscape(opt_delimiters) : "\\s"; + delimiters = delimiters ? "|[" + delimiters + "]+" : ""; + var regexp = new RegExp("(^" + delimiters + ")([a-z])", "g"); + return str.replace(regexp, function(all, p1, p2) { + return p1 + p2.toUpperCase() + }) +}; +goog.string.parseInt = function(value) { + if(isFinite(value)) { + value = String(value) + } + if(goog.isString(value)) { + return/^\s*-?0x/i.test(value) ? parseInt(value, 16) : parseInt(value, 10) + } + return NaN +}; +goog.string.splitLimit = function(str, separator, limit) { + var parts = str.split(separator); + var returnVal = []; + while(limit > 0 && parts.length) { + returnVal.push(parts.shift()); + limit-- + } + if(parts.length) { + returnVal.push(parts.join(separator)) + } + return returnVal +}; +goog.provide("goog.asserts"); +goog.provide("goog.asserts.AssertionError"); +goog.require("goog.debug.Error"); +goog.require("goog.string"); +goog.define("goog.asserts.ENABLE_ASSERTS", goog.DEBUG); +goog.asserts.AssertionError = function(messagePattern, messageArgs) { + messageArgs.unshift(messagePattern); + goog.debug.Error.call(this, goog.string.subs.apply(null, messageArgs)); + messageArgs.shift(); + this.messagePattern = messagePattern +}; +goog.inherits(goog.asserts.AssertionError, goog.debug.Error); +goog.asserts.AssertionError.prototype.name = "AssertionError"; +goog.asserts.doAssertFailure_ = function(defaultMessage, defaultArgs, givenMessage, givenArgs) { + var message = "Assertion failed"; + if(givenMessage) { + message += ": " + givenMessage; + var args = givenArgs + }else { + if(defaultMessage) { + message += ": " + defaultMessage; + args = defaultArgs + } + } + throw new goog.asserts.AssertionError("" + message, args || []); +}; +goog.asserts.assert = function(condition, opt_message, var_args) { + if(goog.asserts.ENABLE_ASSERTS && !condition) { + goog.asserts.doAssertFailure_("", null, opt_message, Array.prototype.slice.call(arguments, 2)) + } + return condition +}; +goog.asserts.fail = function(opt_message, var_args) { + if(goog.asserts.ENABLE_ASSERTS) { + throw new goog.asserts.AssertionError("Failure" + (opt_message ? ": " + opt_message : ""), Array.prototype.slice.call(arguments, 1)); + } +}; +goog.asserts.assertNumber = function(value, opt_message, var_args) { + if(goog.asserts.ENABLE_ASSERTS && !goog.isNumber(value)) { + goog.asserts.doAssertFailure_("Expected number but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)) + } + return(value) +}; +goog.asserts.assertString = function(value, opt_message, var_args) { + if(goog.asserts.ENABLE_ASSERTS && !goog.isString(value)) { + goog.asserts.doAssertFailure_("Expected string but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)) + } + return(value) +}; +goog.asserts.assertFunction = function(value, opt_message, var_args) { + if(goog.asserts.ENABLE_ASSERTS && !goog.isFunction(value)) { + goog.asserts.doAssertFailure_("Expected function but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)) + } + return(value) +}; +goog.asserts.assertObject = function(value, opt_message, var_args) { + if(goog.asserts.ENABLE_ASSERTS && !goog.isObject(value)) { + goog.asserts.doAssertFailure_("Expected object but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)) + } + return(value) +}; +goog.asserts.assertArray = function(value, opt_message, var_args) { + if(goog.asserts.ENABLE_ASSERTS && !goog.isArray(value)) { + goog.asserts.doAssertFailure_("Expected array but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)) + } + return(value) +}; +goog.asserts.assertBoolean = function(value, opt_message, var_args) { + if(goog.asserts.ENABLE_ASSERTS && !goog.isBoolean(value)) { + goog.asserts.doAssertFailure_("Expected boolean but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)) + } + return(value) +}; +goog.asserts.assertInstanceof = function(value, type, opt_message, var_args) { + if(goog.asserts.ENABLE_ASSERTS && !(value instanceof type)) { + goog.asserts.doAssertFailure_("instanceof check failed.", null, opt_message, Array.prototype.slice.call(arguments, 3)) + } + return value +}; +goog.asserts.assertObjectPrototypeIsIntact = function() { + for(var key in Object.prototype) { + goog.asserts.fail(key + " should not be enumerable in Object.prototype.") + } +}; +goog.provide("ol.Size"); +goog.provide("ol.size"); +ol.Size; +ol.size.equals = function(a, b) { + return a[0] == b[0] && a[1] == b[1] +}; +goog.provide("goog.array"); +goog.provide("goog.array.ArrayLike"); +goog.require("goog.asserts"); +goog.define("goog.NATIVE_ARRAY_PROTOTYPES", goog.TRUSTED_SITE); +goog.array.ArrayLike; +goog.array.peek = function(array) { + return array[array.length - 1] +}; +goog.array.ARRAY_PROTOTYPE_ = Array.prototype; +goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && goog.array.ARRAY_PROTOTYPE_.indexOf ? function(arr, obj, opt_fromIndex) { + goog.asserts.assert(arr.length != null); + return goog.array.ARRAY_PROTOTYPE_.indexOf.call(arr, obj, opt_fromIndex) +} : function(arr, obj, opt_fromIndex) { + var fromIndex = opt_fromIndex == null ? 0 : opt_fromIndex < 0 ? Math.max(0, arr.length + opt_fromIndex) : opt_fromIndex; + if(goog.isString(arr)) { + if(!goog.isString(obj) || obj.length != 1) { + return-1 + } + return arr.indexOf(obj, fromIndex) + } + for(var i = fromIndex;i < arr.length;i++) { + if(i in arr && arr[i] === obj) { + return i + } + } + return-1 +}; +goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && goog.array.ARRAY_PROTOTYPE_.lastIndexOf ? function(arr, obj, opt_fromIndex) { + goog.asserts.assert(arr.length != null); + var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex; + return goog.array.ARRAY_PROTOTYPE_.lastIndexOf.call(arr, obj, fromIndex) +} : function(arr, obj, opt_fromIndex) { + var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex; + if(fromIndex < 0) { + fromIndex = Math.max(0, arr.length + fromIndex) + } + if(goog.isString(arr)) { + if(!goog.isString(obj) || obj.length != 1) { + return-1 + } + return arr.lastIndexOf(obj, fromIndex) + } + for(var i = fromIndex;i >= 0;i--) { + if(i in arr && arr[i] === obj) { + return i + } + } + return-1 +}; +goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES && goog.array.ARRAY_PROTOTYPE_.forEach ? function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + goog.array.ARRAY_PROTOTYPE_.forEach.call(arr, f, opt_obj) +} : function(arr, f, opt_obj) { + var l = arr.length; + var arr2 = goog.isString(arr) ? arr.split("") : arr; + for(var i = 0;i < l;i++) { + if(i in arr2) { + f.call(opt_obj, arr2[i], i, arr) + } + } +}; +goog.array.forEachRight = function(arr, f, opt_obj) { + var l = arr.length; + var arr2 = goog.isString(arr) ? arr.split("") : arr; + for(var i = l - 1;i >= 0;--i) { + if(i in arr2) { + f.call(opt_obj, arr2[i], i, arr) + } + } +}; +goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES && goog.array.ARRAY_PROTOTYPE_.filter ? function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + return goog.array.ARRAY_PROTOTYPE_.filter.call(arr, f, opt_obj) +} : function(arr, f, opt_obj) { + var l = arr.length; + var res = []; + var resLength = 0; + var arr2 = goog.isString(arr) ? arr.split("") : arr; + for(var i = 0;i < l;i++) { + if(i in arr2) { + var val = arr2[i]; + if(f.call(opt_obj, val, i, arr)) { + res[resLength++] = val + } + } + } + return res +}; +goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && goog.array.ARRAY_PROTOTYPE_.map ? function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + return goog.array.ARRAY_PROTOTYPE_.map.call(arr, f, opt_obj) +} : function(arr, f, opt_obj) { + var l = arr.length; + var res = new Array(l); + var arr2 = goog.isString(arr) ? arr.split("") : arr; + for(var i = 0;i < l;i++) { + if(i in arr2) { + res[i] = f.call(opt_obj, arr2[i], i, arr) + } + } + return res +}; +goog.array.reduce = function(arr, f, val, opt_obj) { + if(arr.reduce) { + if(opt_obj) { + return arr.reduce(goog.bind(f, opt_obj), val) + }else { + return arr.reduce(f, val) + } + } + var rval = val; + goog.array.forEach(arr, function(val, index) { + rval = f.call(opt_obj, rval, val, index, arr) + }); + return rval +}; +goog.array.reduceRight = function(arr, f, val, opt_obj) { + if(arr.reduceRight) { + if(opt_obj) { + return arr.reduceRight(goog.bind(f, opt_obj), val) + }else { + return arr.reduceRight(f, val) + } + } + var rval = val; + goog.array.forEachRight(arr, function(val, index) { + rval = f.call(opt_obj, rval, val, index, arr) + }); + return rval +}; +goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && goog.array.ARRAY_PROTOTYPE_.some ? function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + return goog.array.ARRAY_PROTOTYPE_.some.call(arr, f, opt_obj) +} : function(arr, f, opt_obj) { + var l = arr.length; + var arr2 = goog.isString(arr) ? arr.split("") : arr; + for(var i = 0;i < l;i++) { + if(i in arr2 && f.call(opt_obj, arr2[i], i, arr)) { + return true + } + } + return false +}; +goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES && goog.array.ARRAY_PROTOTYPE_.every ? function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + return goog.array.ARRAY_PROTOTYPE_.every.call(arr, f, opt_obj) +} : function(arr, f, opt_obj) { + var l = arr.length; + var arr2 = goog.isString(arr) ? arr.split("") : arr; + for(var i = 0;i < l;i++) { + if(i in arr2 && !f.call(opt_obj, arr2[i], i, arr)) { + return false + } + } + return true +}; +goog.array.count = function(arr, f, opt_obj) { + var count = 0; + goog.array.forEach(arr, function(element, index, arr) { + if(f.call(opt_obj, element, index, arr)) { + ++count + } + }, opt_obj); + return count +}; +goog.array.find = function(arr, f, opt_obj) { + var i = goog.array.findIndex(arr, f, opt_obj); + return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i] +}; +goog.array.findIndex = function(arr, f, opt_obj) { + var l = arr.length; + var arr2 = goog.isString(arr) ? arr.split("") : arr; + for(var i = 0;i < l;i++) { + if(i in arr2 && f.call(opt_obj, arr2[i], i, arr)) { + return i + } + } + return-1 +}; +goog.array.findRight = function(arr, f, opt_obj) { + var i = goog.array.findIndexRight(arr, f, opt_obj); + return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i] +}; +goog.array.findIndexRight = function(arr, f, opt_obj) { + var l = arr.length; + var arr2 = goog.isString(arr) ? arr.split("") : arr; + for(var i = l - 1;i >= 0;i--) { + if(i in arr2 && f.call(opt_obj, arr2[i], i, arr)) { + return i + } + } + return-1 +}; +goog.array.contains = function(arr, obj) { + return goog.array.indexOf(arr, obj) >= 0 +}; +goog.array.isEmpty = function(arr) { + return arr.length == 0 +}; +goog.array.clear = function(arr) { + if(!goog.isArray(arr)) { + for(var i = arr.length - 1;i >= 0;i--) { + delete arr[i] + } + } + arr.length = 0 +}; +goog.array.insert = function(arr, obj) { + if(!goog.array.contains(arr, obj)) { + arr.push(obj) + } +}; +goog.array.insertAt = function(arr, obj, opt_i) { + goog.array.splice(arr, opt_i, 0, obj) +}; +goog.array.insertArrayAt = function(arr, elementsToAdd, opt_i) { + goog.partial(goog.array.splice, arr, opt_i, 0).apply(null, elementsToAdd) +}; +goog.array.insertBefore = function(arr, obj, opt_obj2) { + var i; + if(arguments.length == 2 || (i = goog.array.indexOf(arr, opt_obj2)) < 0) { + arr.push(obj) + }else { + goog.array.insertAt(arr, obj, i) + } +}; +goog.array.remove = function(arr, obj) { + var i = goog.array.indexOf(arr, obj); + var rv; + if(rv = i >= 0) { + goog.array.removeAt(arr, i) + } + return rv +}; +goog.array.removeAt = function(arr, i) { + goog.asserts.assert(arr.length != null); + return goog.array.ARRAY_PROTOTYPE_.splice.call(arr, i, 1).length == 1 +}; +goog.array.removeIf = function(arr, f, opt_obj) { + var i = goog.array.findIndex(arr, f, opt_obj); + if(i >= 0) { + goog.array.removeAt(arr, i); + return true + } + return false +}; +goog.array.concat = function(var_args) { + return goog.array.ARRAY_PROTOTYPE_.concat.apply(goog.array.ARRAY_PROTOTYPE_, arguments) +}; +goog.array.toArray = function(object) { + var length = object.length; + if(length > 0) { + var rv = new Array(length); + for(var i = 0;i < length;i++) { + rv[i] = object[i] + } + return rv + } + return[] +}; +goog.array.clone = goog.array.toArray; +goog.array.extend = function(arr1, var_args) { + for(var i = 1;i < arguments.length;i++) { + var arr2 = arguments[i]; + var isArrayLike; + if(goog.isArray(arr2) || (isArrayLike = goog.isArrayLike(arr2)) && Object.prototype.hasOwnProperty.call(arr2, "callee")) { + arr1.push.apply(arr1, arr2) + }else { + if(isArrayLike) { + var len1 = arr1.length; + var len2 = arr2.length; + for(var j = 0;j < len2;j++) { + arr1[len1 + j] = arr2[j] + } + }else { + arr1.push(arr2) + } + } + } +}; +goog.array.splice = function(arr, index, howMany, var_args) { + goog.asserts.assert(arr.length != null); + return goog.array.ARRAY_PROTOTYPE_.splice.apply(arr, goog.array.slice(arguments, 1)) +}; +goog.array.slice = function(arr, start, opt_end) { + goog.asserts.assert(arr.length != null); + if(arguments.length <= 2) { + return goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start) + }else { + return goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start, opt_end) + } +}; +goog.array.removeDuplicates = function(arr, opt_rv) { + var returnArray = opt_rv || arr; + var seen = {}, cursorInsert = 0, cursorRead = 0; + while(cursorRead < arr.length) { + var current = arr[cursorRead++]; + var key = goog.isObject(current) ? "o" + goog.getUid(current) : (typeof current).charAt(0) + current; + if(!Object.prototype.hasOwnProperty.call(seen, key)) { + seen[key] = true; + returnArray[cursorInsert++] = current + } + } + returnArray.length = cursorInsert +}; +goog.array.binarySearch = function(arr, target, opt_compareFn) { + return goog.array.binarySearch_(arr, opt_compareFn || goog.array.defaultCompare, false, target) +}; +goog.array.binarySelect = function(arr, evaluator, opt_obj) { + return goog.array.binarySearch_(arr, evaluator, true, undefined, opt_obj) +}; +goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target, opt_selfObj) { + var left = 0; + var right = arr.length; + var found; + while(left < right) { + var middle = left + right >> 1; + var compareResult; + if(isEvaluator) { + compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr) + }else { + compareResult = compareFn(opt_target, arr[middle]) + } + if(compareResult > 0) { + left = middle + 1 + }else { + right = middle; + found = !compareResult + } + } + return found ? left : ~left +}; +goog.array.sort = function(arr, opt_compareFn) { + goog.asserts.assert(arr.length != null); + goog.array.ARRAY_PROTOTYPE_.sort.call(arr, opt_compareFn || goog.array.defaultCompare) +}; +goog.array.stableSort = function(arr, opt_compareFn) { + for(var i = 0;i < arr.length;i++) { + arr[i] = {index:i, value:arr[i]} + } + var valueCompareFn = opt_compareFn || goog.array.defaultCompare; + function stableCompareFn(obj1, obj2) { + return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index + } + goog.array.sort(arr, stableCompareFn); + for(var i = 0;i < arr.length;i++) { + arr[i] = arr[i].value + } +}; +goog.array.sortObjectsByKey = function(arr, key, opt_compareFn) { + var compare = opt_compareFn || goog.array.defaultCompare; + goog.array.sort(arr, function(a, b) { + return compare(a[key], b[key]) + }) +}; +goog.array.isSorted = function(arr, opt_compareFn, opt_strict) { + var compare = opt_compareFn || goog.array.defaultCompare; + for(var i = 1;i < arr.length;i++) { + var compareResult = compare(arr[i - 1], arr[i]); + if(compareResult > 0 || compareResult == 0 && opt_strict) { + return false + } + } + return true +}; +goog.array.equals = function(arr1, arr2, opt_equalsFn) { + if(!goog.isArrayLike(arr1) || !goog.isArrayLike(arr2) || arr1.length != arr2.length) { + return false + } + var l = arr1.length; + var equalsFn = opt_equalsFn || goog.array.defaultCompareEquality; + for(var i = 0;i < l;i++) { + if(!equalsFn(arr1[i], arr2[i])) { + return false + } + } + return true +}; +goog.array.compare = function(arr1, arr2, opt_equalsFn) { + return goog.array.equals(arr1, arr2, opt_equalsFn) +}; +goog.array.compare3 = function(arr1, arr2, opt_compareFn) { + var compare = opt_compareFn || goog.array.defaultCompare; + var l = Math.min(arr1.length, arr2.length); + for(var i = 0;i < l;i++) { + var result = compare(arr1[i], arr2[i]); + if(result != 0) { + return result + } + } + return goog.array.defaultCompare(arr1.length, arr2.length) +}; +goog.array.defaultCompare = function(a, b) { + return a > b ? 1 : a < b ? -1 : 0 +}; +goog.array.defaultCompareEquality = function(a, b) { + return a === b +}; +goog.array.binaryInsert = function(array, value, opt_compareFn) { + var index = goog.array.binarySearch(array, value, opt_compareFn); + if(index < 0) { + goog.array.insertAt(array, value, -(index + 1)); + return true + } + return false +}; +goog.array.binaryRemove = function(array, value, opt_compareFn) { + var index = goog.array.binarySearch(array, value, opt_compareFn); + return index >= 0 ? goog.array.removeAt(array, index) : false +}; +goog.array.bucket = function(array, sorter, opt_obj) { + var buckets = {}; + for(var i = 0;i < array.length;i++) { + var value = array[i]; + var key = sorter.call(opt_obj, value, i, array); + if(goog.isDef(key)) { + var bucket = buckets[key] || (buckets[key] = []); + bucket.push(value) + } + } + return buckets +}; +goog.array.toObject = function(arr, keyFunc, opt_obj) { + var ret = {}; + goog.array.forEach(arr, function(element, index) { + ret[keyFunc.call(opt_obj, element, index, arr)] = element + }); + return ret +}; +goog.array.range = function(startOrEnd, opt_end, opt_step) { + var array = []; + var start = 0; + var end = startOrEnd; + var step = opt_step || 1; + if(opt_end !== undefined) { + start = startOrEnd; + end = opt_end + } + if(step * (end - start) < 0) { + return[] + } + if(step > 0) { + for(var i = start;i < end;i += step) { + array.push(i) + } + }else { + for(var i = start;i > end;i += step) { + array.push(i) + } + } + return array +}; +goog.array.repeat = function(value, n) { + var array = []; + for(var i = 0;i < n;i++) { + array[i] = value + } + return array +}; +goog.array.flatten = function(var_args) { + var result = []; + for(var i = 0;i < arguments.length;i++) { + var element = arguments[i]; + if(goog.isArray(element)) { + result.push.apply(result, goog.array.flatten.apply(null, element)) + }else { + result.push(element) + } + } + return result +}; +goog.array.rotate = function(array, n) { + goog.asserts.assert(array.length != null); + if(array.length) { + n %= array.length; + if(n > 0) { + goog.array.ARRAY_PROTOTYPE_.unshift.apply(array, array.splice(-n, n)) + }else { + if(n < 0) { + goog.array.ARRAY_PROTOTYPE_.push.apply(array, array.splice(0, -n)) + } + } + } + return array +}; +goog.array.moveItem = function(arr, fromIndex, toIndex) { + goog.asserts.assert(fromIndex >= 0 && fromIndex < arr.length); + goog.asserts.assert(toIndex >= 0 && toIndex < arr.length); + var removedItems = goog.array.ARRAY_PROTOTYPE_.splice.call(arr, fromIndex, 1); + goog.array.ARRAY_PROTOTYPE_.splice.call(arr, toIndex, 0, removedItems[0]) +}; +goog.array.zip = function(var_args) { + if(!arguments.length) { + return[] + } + var result = []; + for(var i = 0;true;i++) { + var value = []; + for(var j = 0;j < arguments.length;j++) { + var arr = arguments[j]; + if(i >= arr.length) { + return result + } + value.push(arr[i]) + } + result.push(value) + } +}; +goog.array.shuffle = function(arr, opt_randFn) { + var randFn = opt_randFn || Math.random; + for(var i = arr.length - 1;i > 0;i--) { + var j = Math.floor(randFn() * (i + 1)); + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp + } +}; +goog.provide("ol.TileCoord"); +goog.require("goog.array"); +goog.require("goog.asserts"); +ol.QuadKeyCharCode = {ZERO:"0".charCodeAt(0), ONE:"1".charCodeAt(0), TWO:"2".charCodeAt(0), THREE:"3".charCodeAt(0)}; +ol.TileCoord = function(z, x, y) { + this.z = z; + this.x = x; + this.y = y +}; +ol.TileCoord.createFromQuadKey = function(quadKey) { + var z = quadKey.length, x = 0, y = 0; + var mask = 1 << z - 1; + var i; + for(i = 0;i < z;++i) { + switch(quadKey.charCodeAt(i)) { + case ol.QuadKeyCharCode.ONE: + x += mask; + break; + case ol.QuadKeyCharCode.TWO: + y += mask; + break; + case ol.QuadKeyCharCode.THREE: + x += mask; + y += mask; + break + } + mask >>= 1 + } + return new ol.TileCoord(z, x, y) +}; +ol.TileCoord.createFromString = function(str) { + var v = str.split("/"); + v = goog.array.map(v, function(e, i, a) { + return parseInt(e, 10) + }); + return new ol.TileCoord(v[0], v[1], v[2]) +}; +ol.TileCoord.createOrUpdate = function(z, x, y, tileCoord) { + if(goog.isDef(tileCoord)) { + tileCoord.z = z; + tileCoord.x = x; + tileCoord.y = y; + return tileCoord + }else { + return new ol.TileCoord(z, x, y) + } +}; +ol.TileCoord.getKeyZXY = function(z, x, y) { + return z + "/" + x + "/" + y +}; +ol.TileCoord.prototype.getZXY = function(opt_result) { + if(goog.isDef(opt_result)) { + goog.asserts.assert(opt_result.length == 3); + opt_result[0] = this.z; + opt_result[1] = this.x; + opt_result[2] = this.y; + return opt_result + }else { + return[this.z, this.x, this.y] + } +}; +ol.TileCoord.prototype.hash = function() { + return(this.x << this.z) + this.y +}; +ol.TileCoord.prototype.quadKey = function() { + var digits = new Array(this.z); + var mask = 1 << this.z - 1; + var i, charCode; + for(i = 0;i < this.z;++i) { + charCode = ol.QuadKeyCharCode.ZERO; + if(this.x & mask) { + charCode += 1 + } + if(this.y & mask) { + charCode += 2 + } + digits[i] = String.fromCharCode(charCode); + mask >>= 1 + } + return digits.join("") +}; +ol.TileCoord.prototype.toString = function() { + return ol.TileCoord.getKeyZXY(this.z, this.x, this.y) +}; +goog.provide("ol.TileRange"); +goog.require("goog.asserts"); +goog.require("ol.Size"); +goog.require("ol.TileCoord"); +ol.TileRange = function(minX, maxX, minY, maxY) { + this.minX = minX; + this.maxX = maxX; + this.minY = minY; + this.maxY = maxY +}; +ol.TileRange.boundingTileRange = function(var_args) { + var tileCoord0 = (arguments[0]); + var tileRange = new ol.TileRange(tileCoord0.x, tileCoord0.x, tileCoord0.y, tileCoord0.y); + var i, ii, tileCoord; + for(i = 1, ii = arguments.length;i < ii;++i) { + tileCoord = (arguments[i]); + goog.asserts.assert(tileCoord.z == tileCoord0.z); + tileRange.minX = Math.min(tileRange.minX, tileCoord.x); + tileRange.maxX = Math.max(tileRange.maxX, tileCoord.x); + tileRange.minY = Math.min(tileRange.minY, tileCoord.y); + tileRange.maxY = Math.max(tileRange.maxY, tileCoord.y) + } + return tileRange +}; +ol.TileRange.createOrUpdate = function(minX, maxX, minY, maxY, tileRange) { + if(goog.isDef(tileRange)) { + tileRange.minX = minX; + tileRange.maxX = maxX; + tileRange.minY = minY; + tileRange.maxY = maxY; + return tileRange + }else { + return new ol.TileRange(minX, maxX, minY, maxY) + } +}; +ol.TileRange.prototype.contains = function(tileCoord) { + return this.minX <= tileCoord.x && tileCoord.x <= this.maxX && this.minY <= tileCoord.y && tileCoord.y <= this.maxY +}; +ol.TileRange.prototype.containsTileRange = function(tileRange) { + return this.minX <= tileRange.minX && tileRange.maxX <= this.maxX && this.minY <= tileRange.minY && tileRange.maxY <= this.maxY +}; +ol.TileRange.prototype.equals = function(tileRange) { + return this.minX == tileRange.minX && this.minY == tileRange.minY && this.maxX == tileRange.maxX && this.maxY == tileRange.maxY +}; +ol.TileRange.prototype.extend = function(tileRange) { + if(tileRange.minX < this.minX) { + this.minX = tileRange.minX + } + if(tileRange.maxX > this.maxX) { + this.maxX = tileRange.maxX + } + if(tileRange.minY < this.minY) { + this.minY = tileRange.minY + } + if(tileRange.maxY > this.maxY) { + this.maxY = tileRange.maxY + } +}; +ol.TileRange.prototype.getHeight = function() { + return this.maxY - this.minY + 1 +}; +ol.TileRange.prototype.getSize = function() { + return[this.getWidth(), this.getHeight()] +}; +ol.TileRange.prototype.getWidth = function() { + return this.maxX - this.minX + 1 +}; +ol.TileRange.prototype.intersects = function(tileRange) { + return this.minX <= tileRange.maxX && this.maxX >= tileRange.minX && this.minY <= tileRange.maxY && this.maxY >= tileRange.minY +}; +goog.provide("ol.Attribution"); +goog.require("ol.TileRange"); +ol.Attribution = function(options) { + this.html_ = options.html; + this.tileRanges_ = goog.isDef(options.tileRanges) ? options.tileRanges : null +}; +ol.Attribution.prototype.getHTML = function() { + return this.html_ +}; +ol.Attribution.prototype.intersectsAnyTileRange = function(tileRanges) { + if(goog.isNull(this.tileRanges_)) { + return true + } + var i, ii, tileRange, z; + for(z in tileRanges) { + if(!(z in this.tileRanges_)) { + continue + } + tileRange = tileRanges[z]; + for(i = 0, ii = this.tileRanges_[z].length;i < ii;++i) { + if(this.tileRanges_[z][i].intersects(tileRange)) { + return true + } + } + } + return false +}; +goog.provide("goog.userAgent"); +goog.require("goog.string"); +goog.define("goog.userAgent.ASSUME_IE", false); +goog.define("goog.userAgent.ASSUME_GECKO", false); +goog.define("goog.userAgent.ASSUME_WEBKIT", false); +goog.define("goog.userAgent.ASSUME_MOBILE_WEBKIT", false); +goog.define("goog.userAgent.ASSUME_OPERA", false); +goog.define("goog.userAgent.ASSUME_ANY_VERSION", false); +goog.userAgent.BROWSER_KNOWN_ = goog.userAgent.ASSUME_IE || goog.userAgent.ASSUME_GECKO || goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_OPERA; +goog.userAgent.getUserAgentString = function() { + return goog.global["navigator"] ? goog.global["navigator"].userAgent : null +}; +goog.userAgent.getNavigator = function() { + return goog.global["navigator"] +}; +goog.userAgent.init_ = function() { + goog.userAgent.detectedOpera_ = false; + goog.userAgent.detectedIe_ = false; + goog.userAgent.detectedWebkit_ = false; + goog.userAgent.detectedMobile_ = false; + goog.userAgent.detectedGecko_ = false; + var ua; + if(!goog.userAgent.BROWSER_KNOWN_ && (ua = goog.userAgent.getUserAgentString())) { + var navigator = goog.userAgent.getNavigator(); + goog.userAgent.detectedOpera_ = goog.string.startsWith(ua, "Opera"); + goog.userAgent.detectedIe_ = !goog.userAgent.detectedOpera_ && (goog.string.contains(ua, "MSIE") || goog.string.contains(ua, "Trident")); + goog.userAgent.detectedWebkit_ = !goog.userAgent.detectedOpera_ && goog.string.contains(ua, "WebKit"); + goog.userAgent.detectedMobile_ = goog.userAgent.detectedWebkit_ && goog.string.contains(ua, "Mobile"); + goog.userAgent.detectedGecko_ = !goog.userAgent.detectedOpera_ && !goog.userAgent.detectedWebkit_ && !goog.userAgent.detectedIe_ && navigator.product == "Gecko" + } +}; +if(!goog.userAgent.BROWSER_KNOWN_) { + goog.userAgent.init_() +} +goog.userAgent.OPERA = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_OPERA : goog.userAgent.detectedOpera_; +goog.userAgent.IE = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_IE : goog.userAgent.detectedIe_; +goog.userAgent.GECKO = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_GECKO : goog.userAgent.detectedGecko_; +goog.userAgent.WEBKIT = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_MOBILE_WEBKIT : goog.userAgent.detectedWebkit_; +goog.userAgent.MOBILE = goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.detectedMobile_; +goog.userAgent.SAFARI = goog.userAgent.WEBKIT; +goog.userAgent.determinePlatform_ = function() { + var navigator = goog.userAgent.getNavigator(); + return navigator && navigator.platform || "" +}; +goog.userAgent.PLATFORM = goog.userAgent.determinePlatform_(); +goog.define("goog.userAgent.ASSUME_MAC", false); +goog.define("goog.userAgent.ASSUME_WINDOWS", false); +goog.define("goog.userAgent.ASSUME_LINUX", false); +goog.define("goog.userAgent.ASSUME_X11", false); +goog.define("goog.userAgent.ASSUME_ANDROID", false); +goog.define("goog.userAgent.ASSUME_IPHONE", false); +goog.define("goog.userAgent.ASSUME_IPAD", false); +goog.userAgent.PLATFORM_KNOWN_ = goog.userAgent.ASSUME_MAC || goog.userAgent.ASSUME_WINDOWS || goog.userAgent.ASSUME_LINUX || goog.userAgent.ASSUME_X11 || goog.userAgent.ASSUME_ANDROID || goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD; +goog.userAgent.initPlatform_ = function() { + goog.userAgent.detectedMac_ = goog.string.contains(goog.userAgent.PLATFORM, "Mac"); + goog.userAgent.detectedWindows_ = goog.string.contains(goog.userAgent.PLATFORM, "Win"); + goog.userAgent.detectedLinux_ = goog.string.contains(goog.userAgent.PLATFORM, "Linux"); + goog.userAgent.detectedX11_ = !!goog.userAgent.getNavigator() && goog.string.contains(goog.userAgent.getNavigator()["appVersion"] || "", "X11"); + var ua = goog.userAgent.getUserAgentString(); + goog.userAgent.detectedAndroid_ = !!ua && goog.string.contains(ua, "Android"); + goog.userAgent.detectedIPhone_ = !!ua && goog.string.contains(ua, "iPhone"); + goog.userAgent.detectedIPad_ = !!ua && goog.string.contains(ua, "iPad") +}; +if(!goog.userAgent.PLATFORM_KNOWN_) { + goog.userAgent.initPlatform_() +} +goog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_MAC : goog.userAgent.detectedMac_; +goog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_WINDOWS : goog.userAgent.detectedWindows_; +goog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_LINUX : goog.userAgent.detectedLinux_; +goog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_X11 : goog.userAgent.detectedX11_; +goog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_ANDROID : goog.userAgent.detectedAndroid_; +goog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPHONE : goog.userAgent.detectedIPhone_; +goog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPAD : goog.userAgent.detectedIPad_; +goog.userAgent.determineVersion_ = function() { + var version = "", re; + if(goog.userAgent.OPERA && goog.global["opera"]) { + var operaVersion = goog.global["opera"].version; + version = typeof operaVersion == "function" ? operaVersion() : operaVersion + }else { + if(goog.userAgent.GECKO) { + re = /rv\:([^\);]+)(\)|;)/ + }else { + if(goog.userAgent.IE) { + re = /\b(?:MSIE|rv)\s+([^\);]+)(\)|;)/ + }else { + if(goog.userAgent.WEBKIT) { + re = /WebKit\/(\S+)/ + } + } + } + if(re) { + var arr = re.exec(goog.userAgent.getUserAgentString()); + version = arr ? arr[1] : "" + } + } + if(goog.userAgent.IE) { + var docMode = goog.userAgent.getDocumentMode_(); + if(docMode > parseFloat(version)) { + return String(docMode) + } + } + return version +}; +goog.userAgent.getDocumentMode_ = function() { + var doc = goog.global["document"]; + return doc ? doc["documentMode"] : undefined +}; +goog.userAgent.VERSION = goog.userAgent.determineVersion_(); +goog.userAgent.compare = function(v1, v2) { + return goog.string.compareVersions(v1, v2) +}; +goog.userAgent.isVersionOrHigherCache_ = {}; +goog.userAgent.isVersionOrHigher = function(version) { + return goog.userAgent.ASSUME_ANY_VERSION || goog.userAgent.isVersionOrHigherCache_[version] || (goog.userAgent.isVersionOrHigherCache_[version] = goog.string.compareVersions(goog.userAgent.VERSION, version) >= 0) +}; +goog.userAgent.isVersion = goog.userAgent.isVersionOrHigher; +goog.userAgent.isDocumentModeOrHigher = function(documentMode) { + return goog.userAgent.IE && goog.userAgent.DOCUMENT_MODE >= documentMode +}; +goog.userAgent.isDocumentMode = goog.userAgent.isDocumentModeOrHigher; +goog.userAgent.DOCUMENT_MODE = function() { + var doc = goog.global["document"]; + if(!doc || !goog.userAgent.IE) { + return undefined + } + var mode = goog.userAgent.getDocumentMode_(); + return mode || (doc["compatMode"] == "CSS1Compat" ? parseInt(goog.userAgent.VERSION, 10) : 5) +}(); +goog.provide("goog.dom.BrowserFeature"); +goog.require("goog.userAgent"); +goog.dom.BrowserFeature = {CAN_ADD_NAME_OR_TYPE_ATTRIBUTES:!goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9), CAN_USE_CHILDREN_ATTRIBUTE:!goog.userAgent.GECKO && !goog.userAgent.IE || goog.userAgent.IE && goog.userAgent.isDocumentModeOrHigher(9) || goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher("1.9.1"), CAN_USE_INNER_TEXT:goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("9"), CAN_USE_PARENT_ELEMENT_PROPERTY:goog.userAgent.IE || goog.userAgent.OPERA || goog.userAgent.WEBKIT, +INNER_HTML_NEEDS_SCOPED_ELEMENT:goog.userAgent.IE}; +goog.provide("goog.dom.TagName"); +goog.dom.TagName = {A:"A", ABBR:"ABBR", ACRONYM:"ACRONYM", ADDRESS:"ADDRESS", APPLET:"APPLET", AREA:"AREA", ARTICLE:"ARTICLE", ASIDE:"ASIDE", AUDIO:"AUDIO", B:"B", BASE:"BASE", BASEFONT:"BASEFONT", BDI:"BDI", BDO:"BDO", BIG:"BIG", BLOCKQUOTE:"BLOCKQUOTE", BODY:"BODY", BR:"BR", BUTTON:"BUTTON", CANVAS:"CANVAS", CAPTION:"CAPTION", CENTER:"CENTER", CITE:"CITE", CODE:"CODE", COL:"COL", COLGROUP:"COLGROUP", COMMAND:"COMMAND", DATA:"DATA", DATALIST:"DATALIST", DD:"DD", DEL:"DEL", DETAILS:"DETAILS", DFN:"DFN", +DIALOG:"DIALOG", DIR:"DIR", DIV:"DIV", DL:"DL", DT:"DT", EM:"EM", EMBED:"EMBED", FIELDSET:"FIELDSET", FIGCAPTION:"FIGCAPTION", FIGURE:"FIGURE", FONT:"FONT", FOOTER:"FOOTER", FORM:"FORM", FRAME:"FRAME", FRAMESET:"FRAMESET", H1:"H1", H2:"H2", H3:"H3", H4:"H4", H5:"H5", H6:"H6", HEAD:"HEAD", HEADER:"HEADER", HGROUP:"HGROUP", HR:"HR", HTML:"HTML", I:"I", IFRAME:"IFRAME", IMG:"IMG", INPUT:"INPUT", INS:"INS", ISINDEX:"ISINDEX", KBD:"KBD", KEYGEN:"KEYGEN", LABEL:"LABEL", LEGEND:"LEGEND", LI:"LI", LINK:"LINK", +MAP:"MAP", MARK:"MARK", MATH:"MATH", MENU:"MENU", META:"META", METER:"METER", NAV:"NAV", NOFRAMES:"NOFRAMES", NOSCRIPT:"NOSCRIPT", OBJECT:"OBJECT", OL:"OL", OPTGROUP:"OPTGROUP", OPTION:"OPTION", OUTPUT:"OUTPUT", P:"P", PARAM:"PARAM", PRE:"PRE", PROGRESS:"PROGRESS", Q:"Q", RP:"RP", RT:"RT", RUBY:"RUBY", S:"S", SAMP:"SAMP", SCRIPT:"SCRIPT", SECTION:"SECTION", SELECT:"SELECT", SMALL:"SMALL", SOURCE:"SOURCE", SPAN:"SPAN", STRIKE:"STRIKE", STRONG:"STRONG", STYLE:"STYLE", SUB:"SUB", SUMMARY:"SUMMARY", +SUP:"SUP", SVG:"SVG", TABLE:"TABLE", TBODY:"TBODY", TD:"TD", TEXTAREA:"TEXTAREA", TFOOT:"TFOOT", TH:"TH", THEAD:"THEAD", TIME:"TIME", TITLE:"TITLE", TR:"TR", TRACK:"TRACK", TT:"TT", U:"U", UL:"UL", VAR:"VAR", VIDEO:"VIDEO", WBR:"WBR"}; +goog.provide("goog.dom.classes"); +goog.require("goog.array"); +goog.dom.classes.set = function(element, className) { + element.className = className +}; +goog.dom.classes.get = function(element) { + var className = element.className; + return goog.isString(className) && className.match(/\S+/g) || [] +}; +goog.dom.classes.add = function(element, var_args) { + var classes = goog.dom.classes.get(element); + var args = goog.array.slice(arguments, 1); + var expectedCount = classes.length + args.length; + goog.dom.classes.add_(classes, args); + goog.dom.classes.set(element, classes.join(" ")); + return classes.length == expectedCount +}; +goog.dom.classes.remove = function(element, var_args) { + var classes = goog.dom.classes.get(element); + var args = goog.array.slice(arguments, 1); + var newClasses = goog.dom.classes.getDifference_(classes, args); + goog.dom.classes.set(element, newClasses.join(" ")); + return newClasses.length == classes.length - args.length +}; +goog.dom.classes.add_ = function(classes, args) { + for(var i = 0;i < args.length;i++) { + if(!goog.array.contains(classes, args[i])) { + classes.push(args[i]) + } + } +}; +goog.dom.classes.getDifference_ = function(arr1, arr2) { + return goog.array.filter(arr1, function(item) { + return!goog.array.contains(arr2, item) + }) +}; +goog.dom.classes.swap = function(element, fromClass, toClass) { + var classes = goog.dom.classes.get(element); + var removed = false; + for(var i = 0;i < classes.length;i++) { + if(classes[i] == fromClass) { + goog.array.splice(classes, i--, 1); + removed = true + } + } + if(removed) { + classes.push(toClass); + goog.dom.classes.set(element, classes.join(" ")) + } + return removed +}; +goog.dom.classes.addRemove = function(element, classesToRemove, classesToAdd) { + var classes = goog.dom.classes.get(element); + if(goog.isString(classesToRemove)) { + goog.array.remove(classes, classesToRemove) + }else { + if(goog.isArray(classesToRemove)) { + classes = goog.dom.classes.getDifference_(classes, classesToRemove) + } + } + if(goog.isString(classesToAdd) && !goog.array.contains(classes, classesToAdd)) { + classes.push(classesToAdd) + }else { + if(goog.isArray(classesToAdd)) { + goog.dom.classes.add_(classes, classesToAdd) + } + } + goog.dom.classes.set(element, classes.join(" ")) +}; +goog.dom.classes.has = function(element, className) { + return goog.array.contains(goog.dom.classes.get(element), className) +}; +goog.dom.classes.enable = function(element, className, enabled) { + if(enabled) { + goog.dom.classes.add(element, className) + }else { + goog.dom.classes.remove(element, className) + } +}; +goog.dom.classes.toggle = function(element, className) { + var add = !goog.dom.classes.has(element, className); + goog.dom.classes.enable(element, className, add); + return add +}; +goog.provide("goog.math"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.math.randomInt = function(a) { + return Math.floor(Math.random() * a) +}; +goog.math.uniformRandom = function(a, b) { + return a + Math.random() * (b - a) +}; +goog.math.clamp = function(value, min, max) { + return Math.min(Math.max(value, min), max) +}; +goog.math.modulo = function(a, b) { + var r = a % b; + return r * b < 0 ? r + b : r +}; +goog.math.lerp = function(a, b, x) { + return a + x * (b - a) +}; +goog.math.nearlyEquals = function(a, b, opt_tolerance) { + return Math.abs(a - b) <= (opt_tolerance || 1E-6) +}; +goog.math.standardAngle = function(angle) { + return goog.math.modulo(angle, 360) +}; +goog.math.toRadians = function(angleDegrees) { + return angleDegrees * Math.PI / 180 +}; +goog.math.toDegrees = function(angleRadians) { + return angleRadians * 180 / Math.PI +}; +goog.math.angleDx = function(degrees, radius) { + return radius * Math.cos(goog.math.toRadians(degrees)) +}; +goog.math.angleDy = function(degrees, radius) { + return radius * Math.sin(goog.math.toRadians(degrees)) +}; +goog.math.angle = function(x1, y1, x2, y2) { + return goog.math.standardAngle(goog.math.toDegrees(Math.atan2(y2 - y1, x2 - x1))) +}; +goog.math.angleDifference = function(startAngle, endAngle) { + var d = goog.math.standardAngle(endAngle) - goog.math.standardAngle(startAngle); + if(d > 180) { + d = d - 360 + }else { + if(d <= -180) { + d = 360 + d + } + } + return d +}; +goog.math.sign = function(x) { + return x == 0 ? 0 : x < 0 ? -1 : 1 +}; +goog.math.longestCommonSubsequence = function(array1, array2, opt_compareFn, opt_collectorFn) { + var compare = opt_compareFn || function(a, b) { + return a == b + }; + var collect = opt_collectorFn || function(i1, i2) { + return array1[i1] + }; + var length1 = array1.length; + var length2 = array2.length; + var arr = []; + for(var i = 0;i < length1 + 1;i++) { + arr[i] = []; + arr[i][0] = 0 + } + for(var j = 0;j < length2 + 1;j++) { + arr[0][j] = 0 + } + for(i = 1;i <= length1;i++) { + for(j = 1;j <= length2;j++) { + if(compare(array1[i - 1], array2[j - 1])) { + arr[i][j] = arr[i - 1][j - 1] + 1 + }else { + arr[i][j] = Math.max(arr[i - 1][j], arr[i][j - 1]) + } + } + } + var result = []; + var i = length1, j = length2; + while(i > 0 && j > 0) { + if(compare(array1[i - 1], array2[j - 1])) { + result.unshift(collect(i - 1, j - 1)); + i--; + j-- + }else { + if(arr[i - 1][j] > arr[i][j - 1]) { + i-- + }else { + j-- + } + } + } + return result +}; +goog.math.sum = function(var_args) { + return(goog.array.reduce(arguments, function(sum, value) { + return sum + value + }, 0)) +}; +goog.math.average = function(var_args) { + return goog.math.sum.apply(null, arguments) / arguments.length +}; +goog.math.standardDeviation = function(var_args) { + var sampleSize = arguments.length; + if(sampleSize < 2) { + return 0 + } + var mean = goog.math.average.apply(null, arguments); + var variance = goog.math.sum.apply(null, goog.array.map(arguments, function(val) { + return Math.pow(val - mean, 2) + })) / (sampleSize - 1); + return Math.sqrt(variance) +}; +goog.math.isInt = function(num) { + return isFinite(num) && num % 1 == 0 +}; +goog.math.isFiniteNumber = function(num) { + return isFinite(num) && !isNaN(num) +}; +goog.math.safeFloor = function(num, opt_epsilon) { + goog.asserts.assert(!goog.isDef(opt_epsilon) || opt_epsilon > 0); + return Math.floor(num + (opt_epsilon || 2E-15)) +}; +goog.math.safeCeil = function(num, opt_epsilon) { + goog.asserts.assert(!goog.isDef(opt_epsilon) || opt_epsilon > 0); + return Math.ceil(num - (opt_epsilon || 2E-15)) +}; +goog.provide("goog.math.Coordinate"); +goog.require("goog.math"); +goog.math.Coordinate = function(opt_x, opt_y) { + this.x = goog.isDef(opt_x) ? opt_x : 0; + this.y = goog.isDef(opt_y) ? opt_y : 0 +}; +goog.math.Coordinate.prototype.clone = function() { + return new goog.math.Coordinate(this.x, this.y) +}; +if(goog.DEBUG) { + goog.math.Coordinate.prototype.toString = function() { + return"(" + this.x + ", " + this.y + ")" + } +} +goog.math.Coordinate.equals = function(a, b) { + if(a == b) { + return true + } + if(!a || !b) { + return false + } + return a.x == b.x && a.y == b.y +}; +goog.math.Coordinate.distance = function(a, b) { + var dx = a.x - b.x; + var dy = a.y - b.y; + return Math.sqrt(dx * dx + dy * dy) +}; +goog.math.Coordinate.magnitude = function(a) { + return Math.sqrt(a.x * a.x + a.y * a.y) +}; +goog.math.Coordinate.azimuth = function(a) { + return goog.math.angle(0, 0, a.x, a.y) +}; +goog.math.Coordinate.squaredDistance = function(a, b) { + var dx = a.x - b.x; + var dy = a.y - b.y; + return dx * dx + dy * dy +}; +goog.math.Coordinate.difference = function(a, b) { + return new goog.math.Coordinate(a.x - b.x, a.y - b.y) +}; +goog.math.Coordinate.sum = function(a, b) { + return new goog.math.Coordinate(a.x + b.x, a.y + b.y) +}; +goog.math.Coordinate.prototype.ceil = function() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + return this +}; +goog.math.Coordinate.prototype.floor = function() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + return this +}; +goog.math.Coordinate.prototype.round = function() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this +}; +goog.math.Coordinate.prototype.translate = function(tx, opt_ty) { + if(tx instanceof goog.math.Coordinate) { + this.x += tx.x; + this.y += tx.y + }else { + this.x += tx; + if(goog.isNumber(opt_ty)) { + this.y += opt_ty + } + } + return this +}; +goog.math.Coordinate.prototype.scale = function(sx, opt_sy) { + var sy = goog.isNumber(opt_sy) ? opt_sy : sx; + this.x *= sx; + this.y *= sy; + return this +}; +goog.provide("goog.math.Size"); +goog.math.Size = function(width, height) { + this.width = width; + this.height = height +}; +goog.math.Size.equals = function(a, b) { + if(a == b) { + return true + } + if(!a || !b) { + return false + } + return a.width == b.width && a.height == b.height +}; +goog.math.Size.prototype.clone = function() { + return new goog.math.Size(this.width, this.height) +}; +if(goog.DEBUG) { + goog.math.Size.prototype.toString = function() { + return"(" + this.width + " x " + this.height + ")" + } +} +goog.math.Size.prototype.getLongest = function() { + return Math.max(this.width, this.height) +}; +goog.math.Size.prototype.getShortest = function() { + return Math.min(this.width, this.height) +}; +goog.math.Size.prototype.area = function() { + return this.width * this.height +}; +goog.math.Size.prototype.perimeter = function() { + return(this.width + this.height) * 2 +}; +goog.math.Size.prototype.aspectRatio = function() { + return this.width / this.height +}; +goog.math.Size.prototype.isEmpty = function() { + return!this.area() +}; +goog.math.Size.prototype.ceil = function() { + this.width = Math.ceil(this.width); + this.height = Math.ceil(this.height); + return this +}; +goog.math.Size.prototype.fitsInside = function(target) { + return this.width <= target.width && this.height <= target.height +}; +goog.math.Size.prototype.floor = function() { + this.width = Math.floor(this.width); + this.height = Math.floor(this.height); + return this +}; +goog.math.Size.prototype.round = function() { + this.width = Math.round(this.width); + this.height = Math.round(this.height); + return this +}; +goog.math.Size.prototype.scale = function(sx, opt_sy) { + var sy = goog.isNumber(opt_sy) ? opt_sy : sx; + this.width *= sx; + this.height *= sy; + return this +}; +goog.math.Size.prototype.scaleToFit = function(target) { + var s = this.aspectRatio() > target.aspectRatio() ? target.width / this.width : target.height / this.height; + return this.scale(s) +}; +goog.provide("goog.object"); +goog.object.forEach = function(obj, f, opt_obj) { + for(var key in obj) { + f.call(opt_obj, obj[key], key, obj) + } +}; +goog.object.filter = function(obj, f, opt_obj) { + var res = {}; + for(var key in obj) { + if(f.call(opt_obj, obj[key], key, obj)) { + res[key] = obj[key] + } + } + return res +}; +goog.object.map = function(obj, f, opt_obj) { + var res = {}; + for(var key in obj) { + res[key] = f.call(opt_obj, obj[key], key, obj) + } + return res +}; +goog.object.some = function(obj, f, opt_obj) { + for(var key in obj) { + if(f.call(opt_obj, obj[key], key, obj)) { + return true + } + } + return false +}; +goog.object.every = function(obj, f, opt_obj) { + for(var key in obj) { + if(!f.call(opt_obj, obj[key], key, obj)) { + return false + } + } + return true +}; +goog.object.getCount = function(obj) { + var rv = 0; + for(var key in obj) { + rv++ + } + return rv +}; +goog.object.getAnyKey = function(obj) { + for(var key in obj) { + return key + } +}; +goog.object.getAnyValue = function(obj) { + for(var key in obj) { + return obj[key] + } +}; +goog.object.contains = function(obj, val) { + return goog.object.containsValue(obj, val) +}; +goog.object.getValues = function(obj) { + var res = []; + var i = 0; + for(var key in obj) { + res[i++] = obj[key] + } + return res +}; +goog.object.getKeys = function(obj) { + var res = []; + var i = 0; + for(var key in obj) { + res[i++] = key + } + return res +}; +goog.object.getValueByKeys = function(obj, var_args) { + var isArrayLike = goog.isArrayLike(var_args); + var keys = isArrayLike ? var_args : arguments; + for(var i = isArrayLike ? 0 : 1;i < keys.length;i++) { + obj = obj[keys[i]]; + if(!goog.isDef(obj)) { + break + } + } + return obj +}; +goog.object.containsKey = function(obj, key) { + return key in obj +}; +goog.object.containsValue = function(obj, val) { + for(var key in obj) { + if(obj[key] == val) { + return true + } + } + return false +}; +goog.object.findKey = function(obj, f, opt_this) { + for(var key in obj) { + if(f.call(opt_this, obj[key], key, obj)) { + return key + } + } + return undefined +}; +goog.object.findValue = function(obj, f, opt_this) { + var key = goog.object.findKey(obj, f, opt_this); + return key && obj[key] +}; +goog.object.isEmpty = function(obj) { + for(var key in obj) { + return false + } + return true +}; +goog.object.clear = function(obj) { + for(var i in obj) { + delete obj[i] + } +}; +goog.object.remove = function(obj, key) { + var rv; + if(rv = key in obj) { + delete obj[key] + } + return rv +}; +goog.object.add = function(obj, key, val) { + if(key in obj) { + throw Error('The object already contains the key "' + key + '"'); + } + goog.object.set(obj, key, val) +}; +goog.object.get = function(obj, key, opt_val) { + if(key in obj) { + return obj[key] + } + return opt_val +}; +goog.object.set = function(obj, key, value) { + obj[key] = value +}; +goog.object.setIfUndefined = function(obj, key, value) { + return key in obj ? obj[key] : obj[key] = value +}; +goog.object.clone = function(obj) { + var res = {}; + for(var key in obj) { + res[key] = obj[key] + } + return res +}; +goog.object.unsafeClone = function(obj) { + var type = goog.typeOf(obj); + if(type == "object" || type == "array") { + if(obj.clone) { + return obj.clone() + } + var clone = type == "array" ? [] : {}; + for(var key in obj) { + clone[key] = goog.object.unsafeClone(obj[key]) + } + return clone + } + return obj +}; +goog.object.transpose = function(obj) { + var transposed = {}; + for(var key in obj) { + transposed[obj[key]] = key + } + return transposed +}; +goog.object.PROTOTYPE_FIELDS_ = ["constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf"]; +goog.object.extend = function(target, var_args) { + var key, source; + for(var i = 1;i < arguments.length;i++) { + source = arguments[i]; + for(key in source) { + target[key] = source[key] + } + for(var j = 0;j < goog.object.PROTOTYPE_FIELDS_.length;j++) { + key = goog.object.PROTOTYPE_FIELDS_[j]; + if(Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key] + } + } + } +}; +goog.object.create = function(var_args) { + var argLength = arguments.length; + if(argLength == 1 && goog.isArray(arguments[0])) { + return goog.object.create.apply(null, arguments[0]) + } + if(argLength % 2) { + throw Error("Uneven number of arguments"); + } + var rv = {}; + for(var i = 0;i < argLength;i += 2) { + rv[arguments[i]] = arguments[i + 1] + } + return rv +}; +goog.object.createSet = function(var_args) { + var argLength = arguments.length; + if(argLength == 1 && goog.isArray(arguments[0])) { + return goog.object.createSet.apply(null, arguments[0]) + } + var rv = {}; + for(var i = 0;i < argLength;i++) { + rv[arguments[i]] = true + } + return rv +}; +goog.object.createImmutableView = function(obj) { + var result = obj; + if(Object.isFrozen && !Object.isFrozen(obj)) { + result = Object.create(obj); + Object.freeze(result) + } + return result +}; +goog.object.isImmutableView = function(obj) { + return!!Object.isFrozen && Object.isFrozen(obj) +}; +goog.provide("goog.dom"); +goog.provide("goog.dom.Appendable"); +goog.provide("goog.dom.DomHelper"); +goog.provide("goog.dom.NodeType"); +goog.require("goog.array"); +goog.require("goog.dom.BrowserFeature"); +goog.require("goog.dom.TagName"); +goog.require("goog.dom.classes"); +goog.require("goog.math.Coordinate"); +goog.require("goog.math.Size"); +goog.require("goog.object"); +goog.require("goog.string"); +goog.require("goog.userAgent"); +goog.define("goog.dom.ASSUME_QUIRKS_MODE", false); +goog.define("goog.dom.ASSUME_STANDARDS_MODE", false); +goog.dom.COMPAT_MODE_KNOWN_ = goog.dom.ASSUME_QUIRKS_MODE || goog.dom.ASSUME_STANDARDS_MODE; +goog.dom.NodeType = {ELEMENT:1, ATTRIBUTE:2, TEXT:3, CDATA_SECTION:4, ENTITY_REFERENCE:5, ENTITY:6, PROCESSING_INSTRUCTION:7, COMMENT:8, DOCUMENT:9, DOCUMENT_TYPE:10, DOCUMENT_FRAGMENT:11, NOTATION:12}; +goog.dom.getDomHelper = function(opt_element) { + return opt_element ? new goog.dom.DomHelper(goog.dom.getOwnerDocument(opt_element)) : goog.dom.defaultDomHelper_ || (goog.dom.defaultDomHelper_ = new goog.dom.DomHelper) +}; +goog.dom.defaultDomHelper_; +goog.dom.getDocument = function() { + return document +}; +goog.dom.getElement = function(element) { + return goog.isString(element) ? document.getElementById(element) : element +}; +goog.dom.$ = goog.dom.getElement; +goog.dom.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) { + return goog.dom.getElementsByTagNameAndClass_(document, opt_tag, opt_class, opt_el) +}; +goog.dom.getElementsByClass = function(className, opt_el) { + var parent = opt_el || document; + if(goog.dom.canUseQuerySelector_(parent)) { + return parent.querySelectorAll("." + className) + }else { + if(parent.getElementsByClassName) { + return parent.getElementsByClassName(className) + } + } + return goog.dom.getElementsByTagNameAndClass_(document, "*", className, opt_el) +}; +goog.dom.getElementByClass = function(className, opt_el) { + var parent = opt_el || document; + var retVal = null; + if(goog.dom.canUseQuerySelector_(parent)) { + retVal = parent.querySelector("." + className) + }else { + retVal = goog.dom.getElementsByClass(className, opt_el)[0] + } + return retVal || null +}; +goog.dom.canUseQuerySelector_ = function(parent) { + return!!(parent.querySelectorAll && parent.querySelector) +}; +goog.dom.getElementsByTagNameAndClass_ = function(doc, opt_tag, opt_class, opt_el) { + var parent = opt_el || doc; + var tagName = opt_tag && opt_tag != "*" ? opt_tag.toUpperCase() : ""; + if(goog.dom.canUseQuerySelector_(parent) && (tagName || opt_class)) { + var query = tagName + (opt_class ? "." + opt_class : ""); + return parent.querySelectorAll(query) + } + if(opt_class && parent.getElementsByClassName) { + var els = parent.getElementsByClassName(opt_class); + if(tagName) { + var arrayLike = {}; + var len = 0; + for(var i = 0, el;el = els[i];i++) { + if(tagName == el.nodeName) { + arrayLike[len++] = el + } + } + arrayLike.length = len; + return arrayLike + }else { + return els + } + } + var els = parent.getElementsByTagName(tagName || "*"); + if(opt_class) { + var arrayLike = {}; + var len = 0; + for(var i = 0, el;el = els[i];i++) { + var className = el.className; + if(typeof className.split == "function" && goog.array.contains(className.split(/\s+/), opt_class)) { + arrayLike[len++] = el + } + } + arrayLike.length = len; + return arrayLike + }else { + return els + } +}; +goog.dom.$$ = goog.dom.getElementsByTagNameAndClass; +goog.dom.setProperties = function(element, properties) { + goog.object.forEach(properties, function(val, key) { + if(key == "style") { + element.style.cssText = val + }else { + if(key == "class") { + element.className = val + }else { + if(key == "for") { + element.htmlFor = val + }else { + if(key in goog.dom.DIRECT_ATTRIBUTE_MAP_) { + element.setAttribute(goog.dom.DIRECT_ATTRIBUTE_MAP_[key], val) + }else { + if(goog.string.startsWith(key, "aria-") || goog.string.startsWith(key, "data-")) { + element.setAttribute(key, val) + }else { + element[key] = val + } + } + } + } + } + }) +}; +goog.dom.DIRECT_ATTRIBUTE_MAP_ = {"cellpadding":"cellPadding", "cellspacing":"cellSpacing", "colspan":"colSpan", "frameborder":"frameBorder", "height":"height", "maxlength":"maxLength", "role":"role", "rowspan":"rowSpan", "type":"type", "usemap":"useMap", "valign":"vAlign", "width":"width"}; +goog.dom.getViewportSize = function(opt_window) { + return goog.dom.getViewportSize_(opt_window || window) +}; +goog.dom.getViewportSize_ = function(win) { + var doc = win.document; + var el = goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body; + return new goog.math.Size(el.clientWidth, el.clientHeight) +}; +goog.dom.getDocumentHeight = function() { + return goog.dom.getDocumentHeight_(window) +}; +goog.dom.getDocumentHeight_ = function(win) { + var doc = win.document; + var height = 0; + if(doc) { + var vh = goog.dom.getViewportSize_(win).height; + var body = doc.body; + var docEl = doc.documentElement; + if(goog.dom.isCss1CompatMode_(doc) && docEl.scrollHeight) { + height = docEl.scrollHeight != vh ? docEl.scrollHeight : docEl.offsetHeight + }else { + var sh = docEl.scrollHeight; + var oh = docEl.offsetHeight; + if(docEl.clientHeight != oh) { + sh = body.scrollHeight; + oh = body.offsetHeight + } + if(sh > vh) { + height = sh > oh ? sh : oh + }else { + height = sh < oh ? sh : oh + } + } + } + return height +}; +goog.dom.getPageScroll = function(opt_window) { + var win = opt_window || goog.global || window; + return goog.dom.getDomHelper(win.document).getDocumentScroll() +}; +goog.dom.getDocumentScroll = function() { + return goog.dom.getDocumentScroll_(document) +}; +goog.dom.getDocumentScroll_ = function(doc) { + var el = goog.dom.getDocumentScrollElement_(doc); + var win = goog.dom.getWindow_(doc); + if(goog.userAgent.IE && goog.userAgent.isVersionOrHigher("10") && win.pageYOffset != el.scrollTop) { + return new goog.math.Coordinate(el.scrollLeft, el.scrollTop) + } + return new goog.math.Coordinate(win.pageXOffset || el.scrollLeft, win.pageYOffset || el.scrollTop) +}; +goog.dom.getDocumentScrollElement = function() { + return goog.dom.getDocumentScrollElement_(document) +}; +goog.dom.getDocumentScrollElement_ = function(doc) { + return!goog.userAgent.WEBKIT && goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body +}; +goog.dom.getWindow = function(opt_doc) { + return opt_doc ? goog.dom.getWindow_(opt_doc) : window +}; +goog.dom.getWindow_ = function(doc) { + return doc.parentWindow || doc.defaultView +}; +goog.dom.createDom = function(tagName, opt_attributes, var_args) { + return goog.dom.createDom_(document, arguments) +}; +goog.dom.createDom_ = function(doc, args) { + var tagName = args[0]; + var attributes = args[1]; + if(!goog.dom.BrowserFeature.CAN_ADD_NAME_OR_TYPE_ATTRIBUTES && attributes && (attributes.name || attributes.type)) { + var tagNameArr = ["\x3c", tagName]; + if(attributes.name) { + tagNameArr.push(' name\x3d"', goog.string.htmlEscape(attributes.name), '"') + } + if(attributes.type) { + tagNameArr.push(' type\x3d"', goog.string.htmlEscape(attributes.type), '"'); + var clone = {}; + goog.object.extend(clone, attributes); + delete clone["type"]; + attributes = clone + } + tagNameArr.push("\x3e"); + tagName = tagNameArr.join("") + } + var element = doc.createElement(tagName); + if(attributes) { + if(goog.isString(attributes)) { + element.className = attributes + }else { + if(goog.isArray(attributes)) { + goog.dom.classes.add.apply(null, [element].concat(attributes)) + }else { + goog.dom.setProperties(element, attributes) + } + } + } + if(args.length > 2) { + goog.dom.append_(doc, element, args, 2) + } + return element +}; +goog.dom.append_ = function(doc, parent, args, startIndex) { + function childHandler(child) { + if(child) { + parent.appendChild(goog.isString(child) ? doc.createTextNode(child) : child) + } + } + for(var i = startIndex;i < args.length;i++) { + var arg = args[i]; + if(goog.isArrayLike(arg) && !goog.dom.isNodeLike(arg)) { + goog.array.forEach(goog.dom.isNodeList(arg) ? goog.array.toArray(arg) : arg, childHandler) + }else { + childHandler(arg) + } + } +}; +goog.dom.$dom = goog.dom.createDom; +goog.dom.createElement = function(name) { + return document.createElement(name) +}; +goog.dom.createTextNode = function(content) { + return document.createTextNode(String(content)) +}; +goog.dom.createTable = function(rows, columns, opt_fillWithNbsp) { + return goog.dom.createTable_(document, rows, columns, !!opt_fillWithNbsp) +}; +goog.dom.createTable_ = function(doc, rows, columns, fillWithNbsp) { + var rowHtml = ["\x3ctr\x3e"]; + for(var i = 0;i < columns;i++) { + rowHtml.push(fillWithNbsp ? "\x3ctd\x3e\x26nbsp;\x3c/td\x3e" : "\x3ctd\x3e\x3c/td\x3e") + } + rowHtml.push("\x3c/tr\x3e"); + rowHtml = rowHtml.join(""); + var totalHtml = ["\x3ctable\x3e"]; + for(i = 0;i < rows;i++) { + totalHtml.push(rowHtml) + } + totalHtml.push("\x3c/table\x3e"); + var elem = doc.createElement(goog.dom.TagName.DIV); + elem.innerHTML = totalHtml.join(""); + return(elem.removeChild(elem.firstChild)) +}; +goog.dom.htmlToDocumentFragment = function(htmlString) { + return goog.dom.htmlToDocumentFragment_(document, htmlString) +}; +goog.dom.htmlToDocumentFragment_ = function(doc, htmlString) { + var tempDiv = doc.createElement("div"); + if(goog.dom.BrowserFeature.INNER_HTML_NEEDS_SCOPED_ELEMENT) { + tempDiv.innerHTML = "\x3cbr\x3e" + htmlString; + tempDiv.removeChild(tempDiv.firstChild) + }else { + tempDiv.innerHTML = htmlString + } + if(tempDiv.childNodes.length == 1) { + return(tempDiv.removeChild(tempDiv.firstChild)) + }else { + var fragment = doc.createDocumentFragment(); + while(tempDiv.firstChild) { + fragment.appendChild(tempDiv.firstChild) + } + return fragment + } +}; +goog.dom.getCompatMode = function() { + return goog.dom.isCss1CompatMode() ? "CSS1Compat" : "BackCompat" +}; +goog.dom.isCss1CompatMode = function() { + return goog.dom.isCss1CompatMode_(document) +}; +goog.dom.isCss1CompatMode_ = function(doc) { + if(goog.dom.COMPAT_MODE_KNOWN_) { + return goog.dom.ASSUME_STANDARDS_MODE + } + return doc.compatMode == "CSS1Compat" +}; +goog.dom.canHaveChildren = function(node) { + if(node.nodeType != goog.dom.NodeType.ELEMENT) { + return false + } + switch(node.tagName) { + case goog.dom.TagName.APPLET: + ; + case goog.dom.TagName.AREA: + ; + case goog.dom.TagName.BASE: + ; + case goog.dom.TagName.BR: + ; + case goog.dom.TagName.COL: + ; + case goog.dom.TagName.COMMAND: + ; + case goog.dom.TagName.EMBED: + ; + case goog.dom.TagName.FRAME: + ; + case goog.dom.TagName.HR: + ; + case goog.dom.TagName.IMG: + ; + case goog.dom.TagName.INPUT: + ; + case goog.dom.TagName.IFRAME: + ; + case goog.dom.TagName.ISINDEX: + ; + case goog.dom.TagName.KEYGEN: + ; + case goog.dom.TagName.LINK: + ; + case goog.dom.TagName.NOFRAMES: + ; + case goog.dom.TagName.NOSCRIPT: + ; + case goog.dom.TagName.META: + ; + case goog.dom.TagName.OBJECT: + ; + case goog.dom.TagName.PARAM: + ; + case goog.dom.TagName.SCRIPT: + ; + case goog.dom.TagName.SOURCE: + ; + case goog.dom.TagName.STYLE: + ; + case goog.dom.TagName.TRACK: + ; + case goog.dom.TagName.WBR: + return false + } + return true +}; +goog.dom.appendChild = function(parent, child) { + parent.appendChild(child) +}; +goog.dom.append = function(parent, var_args) { + goog.dom.append_(goog.dom.getOwnerDocument(parent), parent, arguments, 1) +}; +goog.dom.removeChildren = function(node) { + var child; + while(child = node.firstChild) { + node.removeChild(child) + } +}; +goog.dom.insertSiblingBefore = function(newNode, refNode) { + if(refNode.parentNode) { + refNode.parentNode.insertBefore(newNode, refNode) + } +}; +goog.dom.insertSiblingAfter = function(newNode, refNode) { + if(refNode.parentNode) { + refNode.parentNode.insertBefore(newNode, refNode.nextSibling) + } +}; +goog.dom.insertChildAt = function(parent, child, index) { + parent.insertBefore(child, parent.childNodes[index] || null) +}; +goog.dom.removeNode = function(node) { + return node && node.parentNode ? node.parentNode.removeChild(node) : null +}; +goog.dom.replaceNode = function(newNode, oldNode) { + var parent = oldNode.parentNode; + if(parent) { + parent.replaceChild(newNode, oldNode) + } +}; +goog.dom.flattenElement = function(element) { + var child, parent = element.parentNode; + if(parent && parent.nodeType != goog.dom.NodeType.DOCUMENT_FRAGMENT) { + if(element.removeNode) { + return(element.removeNode(false)) + }else { + while(child = element.firstChild) { + parent.insertBefore(child, element) + } + return(goog.dom.removeNode(element)) + } + } +}; +goog.dom.getChildren = function(element) { + if(goog.dom.BrowserFeature.CAN_USE_CHILDREN_ATTRIBUTE && element.children != undefined) { + return element.children + } + return goog.array.filter(element.childNodes, function(node) { + return node.nodeType == goog.dom.NodeType.ELEMENT + }) +}; +goog.dom.getFirstElementChild = function(node) { + if(node.firstElementChild != undefined) { + return(node).firstElementChild + } + return goog.dom.getNextElementNode_(node.firstChild, true) +}; +goog.dom.getLastElementChild = function(node) { + if(node.lastElementChild != undefined) { + return(node).lastElementChild + } + return goog.dom.getNextElementNode_(node.lastChild, false) +}; +goog.dom.getNextElementSibling = function(node) { + if(node.nextElementSibling != undefined) { + return(node).nextElementSibling + } + return goog.dom.getNextElementNode_(node.nextSibling, true) +}; +goog.dom.getPreviousElementSibling = function(node) { + if(node.previousElementSibling != undefined) { + return(node).previousElementSibling + } + return goog.dom.getNextElementNode_(node.previousSibling, false) +}; +goog.dom.getNextElementNode_ = function(node, forward) { + while(node && node.nodeType != goog.dom.NodeType.ELEMENT) { + node = forward ? node.nextSibling : node.previousSibling + } + return(node) +}; +goog.dom.getNextNode = function(node) { + if(!node) { + return null + } + if(node.firstChild) { + return node.firstChild + } + while(node && !node.nextSibling) { + node = node.parentNode + } + return node ? node.nextSibling : null +}; +goog.dom.getPreviousNode = function(node) { + if(!node) { + return null + } + if(!node.previousSibling) { + return node.parentNode + } + node = node.previousSibling; + while(node && node.lastChild) { + node = node.lastChild + } + return node +}; +goog.dom.isNodeLike = function(obj) { + return goog.isObject(obj) && obj.nodeType > 0 +}; +goog.dom.isElement = function(obj) { + return goog.isObject(obj) && obj.nodeType == goog.dom.NodeType.ELEMENT +}; +goog.dom.isWindow = function(obj) { + return goog.isObject(obj) && obj["window"] == obj +}; +goog.dom.getParentElement = function(element) { + if(goog.dom.BrowserFeature.CAN_USE_PARENT_ELEMENT_PROPERTY) { + var isIe9 = goog.userAgent.IE && goog.userAgent.isVersionOrHigher("9") && !goog.userAgent.isVersionOrHigher("10"); + if(!(isIe9 && goog.global["SVGElement"] && element instanceof goog.global["SVGElement"])) { + return element.parentElement + } + } + var parent = element.parentNode; + return goog.dom.isElement(parent) ? (parent) : null +}; +goog.dom.contains = function(parent, descendant) { + if(parent.contains && descendant.nodeType == goog.dom.NodeType.ELEMENT) { + return parent == descendant || parent.contains(descendant) + } + if(typeof parent.compareDocumentPosition != "undefined") { + return parent == descendant || Boolean(parent.compareDocumentPosition(descendant) & 16) + } + while(descendant && parent != descendant) { + descendant = descendant.parentNode + } + return descendant == parent +}; +goog.dom.compareNodeOrder = function(node1, node2) { + if(node1 == node2) { + return 0 + } + if(node1.compareDocumentPosition) { + return node1.compareDocumentPosition(node2) & 2 ? 1 : -1 + } + if(goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) { + if(node1.nodeType == goog.dom.NodeType.DOCUMENT) { + return-1 + } + if(node2.nodeType == goog.dom.NodeType.DOCUMENT) { + return 1 + } + } + if("sourceIndex" in node1 || node1.parentNode && "sourceIndex" in node1.parentNode) { + var isElement1 = node1.nodeType == goog.dom.NodeType.ELEMENT; + var isElement2 = node2.nodeType == goog.dom.NodeType.ELEMENT; + if(isElement1 && isElement2) { + return node1.sourceIndex - node2.sourceIndex + }else { + var parent1 = node1.parentNode; + var parent2 = node2.parentNode; + if(parent1 == parent2) { + return goog.dom.compareSiblingOrder_(node1, node2) + } + if(!isElement1 && goog.dom.contains(parent1, node2)) { + return-1 * goog.dom.compareParentsDescendantNodeIe_(node1, node2) + } + if(!isElement2 && goog.dom.contains(parent2, node1)) { + return goog.dom.compareParentsDescendantNodeIe_(node2, node1) + } + return(isElement1 ? node1.sourceIndex : parent1.sourceIndex) - (isElement2 ? node2.sourceIndex : parent2.sourceIndex) + } + } + var doc = goog.dom.getOwnerDocument(node1); + var range1, range2; + range1 = doc.createRange(); + range1.selectNode(node1); + range1.collapse(true); + range2 = doc.createRange(); + range2.selectNode(node2); + range2.collapse(true); + return range1.compareBoundaryPoints(goog.global["Range"].START_TO_END, range2) +}; +goog.dom.compareParentsDescendantNodeIe_ = function(textNode, node) { + var parent = textNode.parentNode; + if(parent == node) { + return-1 + } + var sibling = node; + while(sibling.parentNode != parent) { + sibling = sibling.parentNode + } + return goog.dom.compareSiblingOrder_(sibling, textNode) +}; +goog.dom.compareSiblingOrder_ = function(node1, node2) { + var s = node2; + while(s = s.previousSibling) { + if(s == node1) { + return-1 + } + } + return 1 +}; +goog.dom.findCommonAncestor = function(var_args) { + var i, count = arguments.length; + if(!count) { + return null + }else { + if(count == 1) { + return arguments[0] + } + } + var paths = []; + var minLength = Infinity; + for(i = 0;i < count;i++) { + var ancestors = []; + var node = arguments[i]; + while(node) { + ancestors.unshift(node); + node = node.parentNode + } + paths.push(ancestors); + minLength = Math.min(minLength, ancestors.length) + } + var output = null; + for(i = 0;i < minLength;i++) { + var first = paths[0][i]; + for(var j = 1;j < count;j++) { + if(first != paths[j][i]) { + return output + } + } + output = first + } + return output +}; +goog.dom.getOwnerDocument = function(node) { + return(node.nodeType == goog.dom.NodeType.DOCUMENT ? node : node.ownerDocument || node.document) +}; +goog.dom.getFrameContentDocument = function(frame) { + var doc = frame.contentDocument || frame.contentWindow.document; + return doc +}; +goog.dom.getFrameContentWindow = function(frame) { + return frame.contentWindow || goog.dom.getWindow_(goog.dom.getFrameContentDocument(frame)) +}; +goog.dom.setTextContent = function(element, text) { + if("textContent" in element) { + element.textContent = text + }else { + if(element.firstChild && element.firstChild.nodeType == goog.dom.NodeType.TEXT) { + while(element.lastChild != element.firstChild) { + element.removeChild(element.lastChild) + } + element.firstChild.data = text + }else { + goog.dom.removeChildren(element); + var doc = goog.dom.getOwnerDocument(element); + element.appendChild(doc.createTextNode(String(text))) + } + } +}; +goog.dom.getOuterHtml = function(element) { + if("outerHTML" in element) { + return element.outerHTML + }else { + var doc = goog.dom.getOwnerDocument(element); + var div = doc.createElement("div"); + div.appendChild(element.cloneNode(true)); + return div.innerHTML + } +}; +goog.dom.findNode = function(root, p) { + var rv = []; + var found = goog.dom.findNodes_(root, p, rv, true); + return found ? rv[0] : undefined +}; +goog.dom.findNodes = function(root, p) { + var rv = []; + goog.dom.findNodes_(root, p, rv, false); + return rv +}; +goog.dom.findNodes_ = function(root, p, rv, findOne) { + if(root != null) { + var child = root.firstChild; + while(child) { + if(p(child)) { + rv.push(child); + if(findOne) { + return true + } + } + if(goog.dom.findNodes_(child, p, rv, findOne)) { + return true + } + child = child.nextSibling + } + } + return false +}; +goog.dom.TAGS_TO_IGNORE_ = {"SCRIPT":1, "STYLE":1, "HEAD":1, "IFRAME":1, "OBJECT":1}; +goog.dom.PREDEFINED_TAG_VALUES_ = {"IMG":" ", "BR":"\n"}; +goog.dom.isFocusableTabIndex = function(element) { + var attrNode = element.getAttributeNode("tabindex"); + if(attrNode && attrNode.specified) { + var index = element.tabIndex; + return goog.isNumber(index) && index >= 0 && index < 32768 + } + return false +}; +goog.dom.setFocusableTabIndex = function(element, enable) { + if(enable) { + element.tabIndex = 0 + }else { + element.tabIndex = -1; + element.removeAttribute("tabIndex") + } +}; +goog.dom.getTextContent = function(node) { + var textContent; + if(goog.dom.BrowserFeature.CAN_USE_INNER_TEXT && "innerText" in node) { + textContent = goog.string.canonicalizeNewlines(node.innerText) + }else { + var buf = []; + goog.dom.getTextContent_(node, buf, true); + textContent = buf.join("") + } + textContent = textContent.replace(/ \xAD /g, " ").replace(/\xAD/g, ""); + textContent = textContent.replace(/\u200B/g, ""); + if(!goog.dom.BrowserFeature.CAN_USE_INNER_TEXT) { + textContent = textContent.replace(/ +/g, " ") + } + if(textContent != " ") { + textContent = textContent.replace(/^\s*/, "") + } + return textContent +}; +goog.dom.getRawTextContent = function(node) { + var buf = []; + goog.dom.getTextContent_(node, buf, false); + return buf.join("") +}; +goog.dom.getTextContent_ = function(node, buf, normalizeWhitespace) { + if(node.nodeName in goog.dom.TAGS_TO_IGNORE_) { + }else { + if(node.nodeType == goog.dom.NodeType.TEXT) { + if(normalizeWhitespace) { + buf.push(String(node.nodeValue).replace(/(\r\n|\r|\n)/g, "")) + }else { + buf.push(node.nodeValue) + } + }else { + if(node.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) { + buf.push(goog.dom.PREDEFINED_TAG_VALUES_[node.nodeName]) + }else { + var child = node.firstChild; + while(child) { + goog.dom.getTextContent_(child, buf, normalizeWhitespace); + child = child.nextSibling + } + } + } + } +}; +goog.dom.getNodeTextLength = function(node) { + return goog.dom.getTextContent(node).length +}; +goog.dom.getNodeTextOffset = function(node, opt_offsetParent) { + var root = opt_offsetParent || goog.dom.getOwnerDocument(node).body; + var buf = []; + while(node && node != root) { + var cur = node; + while(cur = cur.previousSibling) { + buf.unshift(goog.dom.getTextContent(cur)) + } + node = node.parentNode + } + return goog.string.trimLeft(buf.join("")).replace(/ +/g, " ").length +}; +goog.dom.getNodeAtOffset = function(parent, offset, opt_result) { + var stack = [parent], pos = 0, cur = null; + while(stack.length > 0 && pos < offset) { + cur = stack.pop(); + if(cur.nodeName in goog.dom.TAGS_TO_IGNORE_) { + }else { + if(cur.nodeType == goog.dom.NodeType.TEXT) { + var text = cur.nodeValue.replace(/(\r\n|\r|\n)/g, "").replace(/ +/g, " "); + pos += text.length + }else { + if(cur.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) { + pos += goog.dom.PREDEFINED_TAG_VALUES_[cur.nodeName].length + }else { + for(var i = cur.childNodes.length - 1;i >= 0;i--) { + stack.push(cur.childNodes[i]) + } + } + } + } + } + if(goog.isObject(opt_result)) { + opt_result.remainder = cur ? cur.nodeValue.length + offset - pos - 1 : 0; + opt_result.node = cur + } + return cur +}; +goog.dom.isNodeList = function(val) { + if(val && typeof val.length == "number") { + if(goog.isObject(val)) { + return typeof val.item == "function" || typeof val.item == "string" + }else { + if(goog.isFunction(val)) { + return typeof val.item == "function" + } + } + } + return false +}; +goog.dom.getAncestorByTagNameAndClass = function(element, opt_tag, opt_class) { + if(!opt_tag && !opt_class) { + return null + } + var tagName = opt_tag ? opt_tag.toUpperCase() : null; + return(goog.dom.getAncestor(element, function(node) { + return(!tagName || node.nodeName == tagName) && (!opt_class || goog.dom.classes.has(node, opt_class)) + }, true)) +}; +goog.dom.getAncestorByClass = function(element, className) { + return goog.dom.getAncestorByTagNameAndClass(element, null, className) +}; +goog.dom.getAncestor = function(element, matcher, opt_includeNode, opt_maxSearchSteps) { + if(!opt_includeNode) { + element = element.parentNode + } + var ignoreSearchSteps = opt_maxSearchSteps == null; + var steps = 0; + while(element && (ignoreSearchSteps || steps <= opt_maxSearchSteps)) { + if(matcher(element)) { + return element + } + element = element.parentNode; + steps++ + } + return null +}; +goog.dom.getActiveElement = function(doc) { + try { + return doc && doc.activeElement + }catch(e) { + } + return null +}; +goog.dom.DomHelper = function(opt_document) { + this.document_ = opt_document || goog.global.document || document +}; +goog.dom.DomHelper.prototype.getDomHelper = goog.dom.getDomHelper; +goog.dom.DomHelper.prototype.setDocument = function(document) { + this.document_ = document +}; +goog.dom.DomHelper.prototype.getDocument = function() { + return this.document_ +}; +goog.dom.DomHelper.prototype.getElement = function(element) { + if(goog.isString(element)) { + return this.document_.getElementById(element) + }else { + return element + } +}; +goog.dom.DomHelper.prototype.$ = goog.dom.DomHelper.prototype.getElement; +goog.dom.DomHelper.prototype.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) { + return goog.dom.getElementsByTagNameAndClass_(this.document_, opt_tag, opt_class, opt_el) +}; +goog.dom.DomHelper.prototype.getElementsByClass = function(className, opt_el) { + var doc = opt_el || this.document_; + return goog.dom.getElementsByClass(className, doc) +}; +goog.dom.DomHelper.prototype.getElementByClass = function(className, opt_el) { + var doc = opt_el || this.document_; + return goog.dom.getElementByClass(className, doc) +}; +goog.dom.DomHelper.prototype.$$ = goog.dom.DomHelper.prototype.getElementsByTagNameAndClass; +goog.dom.DomHelper.prototype.setProperties = goog.dom.setProperties; +goog.dom.DomHelper.prototype.getViewportSize = function(opt_window) { + return goog.dom.getViewportSize(opt_window || this.getWindow()) +}; +goog.dom.DomHelper.prototype.getDocumentHeight = function() { + return goog.dom.getDocumentHeight_(this.getWindow()) +}; +goog.dom.Appendable; +goog.dom.DomHelper.prototype.createDom = function(tagName, opt_attributes, var_args) { + return goog.dom.createDom_(this.document_, arguments) +}; +goog.dom.DomHelper.prototype.$dom = goog.dom.DomHelper.prototype.createDom; +goog.dom.DomHelper.prototype.createElement = function(name) { + return this.document_.createElement(name) +}; +goog.dom.DomHelper.prototype.createTextNode = function(content) { + return this.document_.createTextNode(String(content)) +}; +goog.dom.DomHelper.prototype.createTable = function(rows, columns, opt_fillWithNbsp) { + return goog.dom.createTable_(this.document_, rows, columns, !!opt_fillWithNbsp) +}; +goog.dom.DomHelper.prototype.htmlToDocumentFragment = function(htmlString) { + return goog.dom.htmlToDocumentFragment_(this.document_, htmlString) +}; +goog.dom.DomHelper.prototype.getCompatMode = function() { + return this.isCss1CompatMode() ? "CSS1Compat" : "BackCompat" +}; +goog.dom.DomHelper.prototype.isCss1CompatMode = function() { + return goog.dom.isCss1CompatMode_(this.document_) +}; +goog.dom.DomHelper.prototype.getWindow = function() { + return goog.dom.getWindow_(this.document_) +}; +goog.dom.DomHelper.prototype.getDocumentScrollElement = function() { + return goog.dom.getDocumentScrollElement_(this.document_) +}; +goog.dom.DomHelper.prototype.getDocumentScroll = function() { + return goog.dom.getDocumentScroll_(this.document_) +}; +goog.dom.DomHelper.prototype.getActiveElement = function(opt_doc) { + return goog.dom.getActiveElement(opt_doc || this.document_) +}; +goog.dom.DomHelper.prototype.appendChild = goog.dom.appendChild; +goog.dom.DomHelper.prototype.append = goog.dom.append; +goog.dom.DomHelper.prototype.canHaveChildren = goog.dom.canHaveChildren; +goog.dom.DomHelper.prototype.removeChildren = goog.dom.removeChildren; +goog.dom.DomHelper.prototype.insertSiblingBefore = goog.dom.insertSiblingBefore; +goog.dom.DomHelper.prototype.insertSiblingAfter = goog.dom.insertSiblingAfter; +goog.dom.DomHelper.prototype.insertChildAt = goog.dom.insertChildAt; +goog.dom.DomHelper.prototype.removeNode = goog.dom.removeNode; +goog.dom.DomHelper.prototype.replaceNode = goog.dom.replaceNode; +goog.dom.DomHelper.prototype.flattenElement = goog.dom.flattenElement; +goog.dom.DomHelper.prototype.getChildren = goog.dom.getChildren; +goog.dom.DomHelper.prototype.getFirstElementChild = goog.dom.getFirstElementChild; +goog.dom.DomHelper.prototype.getLastElementChild = goog.dom.getLastElementChild; +goog.dom.DomHelper.prototype.getNextElementSibling = goog.dom.getNextElementSibling; +goog.dom.DomHelper.prototype.getPreviousElementSibling = goog.dom.getPreviousElementSibling; +goog.dom.DomHelper.prototype.getNextNode = goog.dom.getNextNode; +goog.dom.DomHelper.prototype.getPreviousNode = goog.dom.getPreviousNode; +goog.dom.DomHelper.prototype.isNodeLike = goog.dom.isNodeLike; +goog.dom.DomHelper.prototype.isElement = goog.dom.isElement; +goog.dom.DomHelper.prototype.isWindow = goog.dom.isWindow; +goog.dom.DomHelper.prototype.getParentElement = goog.dom.getParentElement; +goog.dom.DomHelper.prototype.contains = goog.dom.contains; +goog.dom.DomHelper.prototype.compareNodeOrder = goog.dom.compareNodeOrder; +goog.dom.DomHelper.prototype.findCommonAncestor = goog.dom.findCommonAncestor; +goog.dom.DomHelper.prototype.getOwnerDocument = goog.dom.getOwnerDocument; +goog.dom.DomHelper.prototype.getFrameContentDocument = goog.dom.getFrameContentDocument; +goog.dom.DomHelper.prototype.getFrameContentWindow = goog.dom.getFrameContentWindow; +goog.dom.DomHelper.prototype.setTextContent = goog.dom.setTextContent; +goog.dom.DomHelper.prototype.getOuterHtml = goog.dom.getOuterHtml; +goog.dom.DomHelper.prototype.findNode = goog.dom.findNode; +goog.dom.DomHelper.prototype.findNodes = goog.dom.findNodes; +goog.dom.DomHelper.prototype.isFocusableTabIndex = goog.dom.isFocusableTabIndex; +goog.dom.DomHelper.prototype.setFocusableTabIndex = goog.dom.setFocusableTabIndex; +goog.dom.DomHelper.prototype.getTextContent = goog.dom.getTextContent; +goog.dom.DomHelper.prototype.getNodeTextLength = goog.dom.getNodeTextLength; +goog.dom.DomHelper.prototype.getNodeTextOffset = goog.dom.getNodeTextOffset; +goog.dom.DomHelper.prototype.getNodeAtOffset = goog.dom.getNodeAtOffset; +goog.dom.DomHelper.prototype.isNodeList = goog.dom.isNodeList; +goog.dom.DomHelper.prototype.getAncestorByTagNameAndClass = goog.dom.getAncestorByTagNameAndClass; +goog.dom.DomHelper.prototype.getAncestorByClass = goog.dom.getAncestorByClass; +goog.dom.DomHelper.prototype.getAncestor = goog.dom.getAncestor; +goog.provide("ol.webgl"); +goog.provide("ol.webgl.WebGLContextEventType"); +ol.webgl.CONTEXT_IDS_ = ["experimental-webgl", "webgl", "webkit-3d", "moz-webgl"]; +ol.webgl.WebGLContextEventType = {LOST:"webglcontextlost", RESTORED:"webglcontextrestored"}; +ol.webgl.getContext = function(canvas, opt_attributes) { + var context, i, ii = ol.webgl.CONTEXT_IDS_.length; + for(i = 0;i < ii;++i) { + try { + context = canvas.getContext(ol.webgl.CONTEXT_IDS_[i], opt_attributes); + if(!goog.isNull(context)) { + return(context) + } + }catch(e) { + } + } + return null +}; +goog.provide("ol.BrowserFeature"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.userAgent"); +goog.require("ol.webgl"); +ol.ASSUME_TOUCH = false; +ol.ENABLE_CANVAS = true; +ol.ENABLE_DOM = true; +ol.ENABLE_IMAGE = true; +ol.ENABLE_TILE = true; +ol.ENABLE_VECTOR = true; +ol.ENABLE_WEBGL = true; +ol.LEGACY_IE_SUPPORT = false; +ol.IS_LEGACY_IE = goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("9.0") && goog.userAgent.VERSION !== ""; +ol.BrowserFeature.DEVICE_PIXEL_RATIO = goog.global.devicePixelRatio || 1; +ol.BrowserFeature.HAS_ARRAY_BUFFER = "ArrayBuffer" in goog.global; +ol.BrowserFeature.HAS_CANVAS_LINE_DASH = false; +ol.BrowserFeature.HAS_CANVAS = ol.ENABLE_CANVAS && function() { + if(!("HTMLCanvasElement" in goog.global)) { + return false + } + try { + var canvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + var context = (canvas.getContext("2d")); + if(goog.isNull(context)) { + return false + }else { + if(goog.isDef(context.setLineDash)) { + ol.BrowserFeature.HAS_CANVAS_LINE_DASH = true + } + return true + } + }catch(e) { + return false + } +}(); +ol.BrowserFeature.HAS_DEVICE_ORIENTATION = "DeviceOrientationEvent" in goog.global; +ol.BrowserFeature.HAS_DOM = ol.ENABLE_DOM; +ol.BrowserFeature.HAS_GEOLOCATION = "geolocation" in goog.global.navigator; +ol.BrowserFeature.HAS_TOUCH = ol.ASSUME_TOUCH || goog.global.document && "ontouchstart" in goog.global.document.documentElement || !!goog.global.navigator.msPointerEnabled; +ol.BrowserFeature.HAS_WEBGL = ol.ENABLE_WEBGL && function() { + if(!("WebGLRenderingContext" in goog.global)) { + return false + } + try { + var canvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + return!goog.isNull(ol.webgl.getContext(canvas, {failIfMajorPerformanceCaveat:true})) + }catch(e) { + return false + } +}(); +goog.provide("ol.CanvasFunctionType"); +ol.CanvasFunctionType; +goog.provide("ol.CenterConstraint"); +goog.provide("ol.CenterConstraintType"); +goog.require("goog.math"); +ol.CenterConstraintType; +ol.CenterConstraint.createExtent = function(extent) { + return function(center) { + if(goog.isDef(center)) { + return[goog.math.clamp(center[0], extent[0], extent[2]), goog.math.clamp(center[1], extent[1], extent[3])] + }else { + return undefined + } + } +}; +ol.CenterConstraint.none = function(center) { + return center +}; +goog.provide("goog.disposable.IDisposable"); +goog.disposable.IDisposable = function() { +}; +goog.disposable.IDisposable.prototype.dispose; +goog.disposable.IDisposable.prototype.isDisposed; +goog.provide("goog.Disposable"); +goog.provide("goog.dispose"); +goog.require("goog.disposable.IDisposable"); +goog.Disposable = function() { + if(goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) { + if(goog.Disposable.INCLUDE_STACK_ON_CREATION) { + this.creationStack = (new Error).stack + } + goog.Disposable.instances_[goog.getUid(this)] = this + } +}; +goog.Disposable.MonitoringMode = {OFF:0, PERMANENT:1, INTERACTIVE:2}; +goog.define("goog.Disposable.MONITORING_MODE", 0); +goog.define("goog.Disposable.INCLUDE_STACK_ON_CREATION", true); +goog.Disposable.instances_ = {}; +goog.Disposable.getUndisposedObjects = function() { + var ret = []; + for(var id in goog.Disposable.instances_) { + if(goog.Disposable.instances_.hasOwnProperty(id)) { + ret.push(goog.Disposable.instances_[Number(id)]) + } + } + return ret +}; +goog.Disposable.clearUndisposedObjects = function() { + goog.Disposable.instances_ = {} +}; +goog.Disposable.prototype.disposed_ = false; +goog.Disposable.prototype.onDisposeCallbacks_; +goog.Disposable.prototype.creationStack; +goog.Disposable.prototype.isDisposed = function() { + return this.disposed_ +}; +goog.Disposable.prototype.getDisposed = goog.Disposable.prototype.isDisposed; +goog.Disposable.prototype.dispose = function() { + if(!this.disposed_) { + this.disposed_ = true; + this.disposeInternal(); + if(goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) { + var uid = goog.getUid(this); + if(goog.Disposable.MONITORING_MODE == goog.Disposable.MonitoringMode.PERMANENT && !goog.Disposable.instances_.hasOwnProperty(uid)) { + throw Error(this + " did not call the goog.Disposable base " + "constructor or was disposed of after a clearUndisposedObjects " + "call"); + } + delete goog.Disposable.instances_[uid] + } + } +}; +goog.Disposable.prototype.registerDisposable = function(disposable) { + this.addOnDisposeCallback(goog.partial(goog.dispose, disposable)) +}; +goog.Disposable.prototype.addOnDisposeCallback = function(callback, opt_scope) { + if(!this.onDisposeCallbacks_) { + this.onDisposeCallbacks_ = [] + } + this.onDisposeCallbacks_.push(goog.bind(callback, opt_scope)) +}; +goog.Disposable.prototype.disposeInternal = function() { + if(this.onDisposeCallbacks_) { + while(this.onDisposeCallbacks_.length) { + this.onDisposeCallbacks_.shift()() + } + } +}; +goog.Disposable.isDisposed = function(obj) { + if(obj && typeof obj.isDisposed == "function") { + return obj.isDisposed() + } + return false +}; +goog.dispose = function(obj) { + if(obj && typeof obj.dispose == "function") { + obj.dispose() + } +}; +goog.disposeAll = function(var_args) { + for(var i = 0, len = arguments.length;i < len;++i) { + var disposable = arguments[i]; + if(goog.isArrayLike(disposable)) { + goog.disposeAll.apply(null, disposable) + }else { + goog.dispose(disposable) + } + } +}; +goog.provide("goog.events.Event"); +goog.provide("goog.events.EventLike"); +goog.require("goog.Disposable"); +goog.events.EventLike; +goog.events.Event = function(type, opt_target) { + this.type = type; + this.target = opt_target; + this.currentTarget = this.target +}; +goog.events.Event.prototype.disposeInternal = function() { +}; +goog.events.Event.prototype.dispose = function() { +}; +goog.events.Event.prototype.propagationStopped_ = false; +goog.events.Event.prototype.defaultPrevented = false; +goog.events.Event.prototype.returnValue_ = true; +goog.events.Event.prototype.stopPropagation = function() { + this.propagationStopped_ = true +}; +goog.events.Event.prototype.preventDefault = function() { + this.defaultPrevented = true; + this.returnValue_ = false +}; +goog.events.Event.stopPropagation = function(e) { + e.stopPropagation() +}; +goog.events.Event.preventDefault = function(e) { + e.preventDefault() +}; +goog.provide("goog.debug.EntryPointMonitor"); +goog.provide("goog.debug.entryPointRegistry"); +goog.require("goog.asserts"); +goog.debug.EntryPointMonitor = function() { +}; +goog.debug.EntryPointMonitor.prototype.wrap; +goog.debug.EntryPointMonitor.prototype.unwrap; +goog.debug.entryPointRegistry.refList_ = []; +goog.debug.entryPointRegistry.monitors_ = []; +goog.debug.entryPointRegistry.monitorsMayExist_ = false; +goog.debug.entryPointRegistry.register = function(callback) { + goog.debug.entryPointRegistry.refList_[goog.debug.entryPointRegistry.refList_.length] = callback; + if(goog.debug.entryPointRegistry.monitorsMayExist_) { + var monitors = goog.debug.entryPointRegistry.monitors_; + for(var i = 0;i < monitors.length;i++) { + callback(goog.bind(monitors[i].wrap, monitors[i])) + } + } +}; +goog.debug.entryPointRegistry.monitorAll = function(monitor) { + goog.debug.entryPointRegistry.monitorsMayExist_ = true; + var transformer = goog.bind(monitor.wrap, monitor); + for(var i = 0;i < goog.debug.entryPointRegistry.refList_.length;i++) { + goog.debug.entryPointRegistry.refList_[i](transformer) + } + goog.debug.entryPointRegistry.monitors_.push(monitor) +}; +goog.debug.entryPointRegistry.unmonitorAllIfPossible = function(monitor) { + var monitors = goog.debug.entryPointRegistry.monitors_; + goog.asserts.assert(monitor == monitors[monitors.length - 1], "Only the most recent monitor can be unwrapped."); + var transformer = goog.bind(monitor.unwrap, monitor); + for(var i = 0;i < goog.debug.entryPointRegistry.refList_.length;i++) { + goog.debug.entryPointRegistry.refList_[i](transformer) + } + monitors.length-- +}; +goog.provide("goog.events.BrowserFeature"); +goog.require("goog.userAgent"); +goog.events.BrowserFeature = {HAS_W3C_BUTTON:!goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9), HAS_W3C_EVENT_SUPPORT:!goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9), SET_KEY_CODE_TO_PREVENT_DEFAULT:goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("9"), HAS_NAVIGATOR_ONLINE_PROPERTY:!goog.userAgent.WEBKIT || goog.userAgent.isVersionOrHigher("528"), HAS_HTML5_NETWORK_EVENT_SUPPORT:goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher("1.9b") || goog.userAgent.IE && +goog.userAgent.isVersionOrHigher("8") || goog.userAgent.OPERA && goog.userAgent.isVersionOrHigher("9.5") || goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher("528"), HTML5_NETWORK_EVENTS_FIRE_ON_BODY:goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher("8") || goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("9"), TOUCH_ENABLED:"ontouchstart" in goog.global || !!(goog.global["document"] && document.documentElement && "ontouchstart" in document.documentElement) || !!(goog.global["navigator"] && +goog.global["navigator"]["msMaxTouchPoints"])}; +goog.provide("goog.events.EventType"); +goog.require("goog.userAgent"); +goog.events.EventType = {CLICK:"click", DBLCLICK:"dblclick", MOUSEDOWN:"mousedown", MOUSEUP:"mouseup", MOUSEOVER:"mouseover", MOUSEOUT:"mouseout", MOUSEMOVE:"mousemove", SELECTSTART:"selectstart", KEYPRESS:"keypress", KEYDOWN:"keydown", KEYUP:"keyup", BLUR:"blur", FOCUS:"focus", DEACTIVATE:"deactivate", FOCUSIN:goog.userAgent.IE ? "focusin" : "DOMFocusIn", FOCUSOUT:goog.userAgent.IE ? "focusout" : "DOMFocusOut", CHANGE:"change", SELECT:"select", SUBMIT:"submit", INPUT:"input", PROPERTYCHANGE:"propertychange", +DRAGSTART:"dragstart", DRAG:"drag", DRAGENTER:"dragenter", DRAGOVER:"dragover", DRAGLEAVE:"dragleave", DROP:"drop", DRAGEND:"dragend", TOUCHSTART:"touchstart", TOUCHMOVE:"touchmove", TOUCHEND:"touchend", TOUCHCANCEL:"touchcancel", BEFOREUNLOAD:"beforeunload", CONSOLEMESSAGE:"consolemessage", CONTEXTMENU:"contextmenu", DOMCONTENTLOADED:"DOMContentLoaded", ERROR:"error", HELP:"help", LOAD:"load", LOSECAPTURE:"losecapture", READYSTATECHANGE:"readystatechange", RESIZE:"resize", SCROLL:"scroll", UNLOAD:"unload", +HASHCHANGE:"hashchange", PAGEHIDE:"pagehide", PAGESHOW:"pageshow", POPSTATE:"popstate", COPY:"copy", PASTE:"paste", CUT:"cut", BEFORECOPY:"beforecopy", BEFORECUT:"beforecut", BEFOREPASTE:"beforepaste", ONLINE:"online", OFFLINE:"offline", MESSAGE:"message", CONNECT:"connect", TRANSITIONEND:goog.userAgent.WEBKIT ? "webkitTransitionEnd" : goog.userAgent.OPERA ? "oTransitionEnd" : "transitionend", MSGESTURECHANGE:"MSGestureChange", MSGESTUREEND:"MSGestureEnd", MSGESTUREHOLD:"MSGestureHold", MSGESTURESTART:"MSGestureStart", +MSGESTURETAP:"MSGestureTap", MSGOTPOINTERCAPTURE:"MSGotPointerCapture", MSINERTIASTART:"MSInertiaStart", MSLOSTPOINTERCAPTURE:"MSLostPointerCapture", MSPOINTERCANCEL:"MSPointerCancel", MSPOINTERDOWN:"MSPointerDown", MSPOINTERMOVE:"MSPointerMove", MSPOINTEROVER:"MSPointerOver", MSPOINTEROUT:"MSPointerOut", MSPOINTERUP:"MSPointerUp", TEXTINPUT:"textinput", COMPOSITIONSTART:"compositionstart", COMPOSITIONUPDATE:"compositionupdate", COMPOSITIONEND:"compositionend", EXIT:"exit", LOADABORT:"loadabort", +LOADCOMMIT:"loadcommit", LOADREDIRECT:"loadredirect", LOADSTART:"loadstart", LOADSTOP:"loadstop", RESPONSIVE:"responsive", SIZECHANGED:"sizechanged", UNRESPONSIVE:"unresponsive"}; +goog.provide("goog.reflect"); +goog.reflect.object = function(type, object) { + return object +}; +goog.reflect.sinkValue = function(x) { + goog.reflect.sinkValue[" "](x); + return x +}; +goog.reflect.sinkValue[" "] = goog.nullFunction; +goog.reflect.canAccessProperty = function(obj, prop) { + try { + goog.reflect.sinkValue(obj[prop]); + return true + }catch(e) { + } + return false +}; +goog.provide("goog.events.BrowserEvent"); +goog.provide("goog.events.BrowserEvent.MouseButton"); +goog.require("goog.events.BrowserFeature"); +goog.require("goog.events.Event"); +goog.require("goog.events.EventType"); +goog.require("goog.reflect"); +goog.require("goog.userAgent"); +goog.events.BrowserEvent = function(opt_e, opt_currentTarget) { + if(opt_e) { + this.init(opt_e, opt_currentTarget) + } +}; +goog.inherits(goog.events.BrowserEvent, goog.events.Event); +goog.events.BrowserEvent.MouseButton = {LEFT:0, MIDDLE:1, RIGHT:2}; +goog.events.BrowserEvent.IEButtonMap = [1, 4, 2]; +goog.events.BrowserEvent.prototype.target = null; +goog.events.BrowserEvent.prototype.currentTarget; +goog.events.BrowserEvent.prototype.relatedTarget = null; +goog.events.BrowserEvent.prototype.offsetX = 0; +goog.events.BrowserEvent.prototype.offsetY = 0; +goog.events.BrowserEvent.prototype.clientX = 0; +goog.events.BrowserEvent.prototype.clientY = 0; +goog.events.BrowserEvent.prototype.screenX = 0; +goog.events.BrowserEvent.prototype.screenY = 0; +goog.events.BrowserEvent.prototype.button = 0; +goog.events.BrowserEvent.prototype.keyCode = 0; +goog.events.BrowserEvent.prototype.charCode = 0; +goog.events.BrowserEvent.prototype.ctrlKey = false; +goog.events.BrowserEvent.prototype.altKey = false; +goog.events.BrowserEvent.prototype.shiftKey = false; +goog.events.BrowserEvent.prototype.metaKey = false; +goog.events.BrowserEvent.prototype.state; +goog.events.BrowserEvent.prototype.platformModifierKey = false; +goog.events.BrowserEvent.prototype.event_ = null; +goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) { + var type = this.type = e.type; + goog.events.Event.call(this, type); + this.target = (e.target) || e.srcElement; + this.currentTarget = (opt_currentTarget); + var relatedTarget = (e.relatedTarget); + if(relatedTarget) { + if(goog.userAgent.GECKO) { + if(!goog.reflect.canAccessProperty(relatedTarget, "nodeName")) { + relatedTarget = null + } + } + }else { + if(type == goog.events.EventType.MOUSEOVER) { + relatedTarget = e.fromElement + }else { + if(type == goog.events.EventType.MOUSEOUT) { + relatedTarget = e.toElement + } + } + } + this.relatedTarget = relatedTarget; + this.offsetX = goog.userAgent.WEBKIT || e.offsetX !== undefined ? e.offsetX : e.layerX; + this.offsetY = goog.userAgent.WEBKIT || e.offsetY !== undefined ? e.offsetY : e.layerY; + this.clientX = e.clientX !== undefined ? e.clientX : e.pageX; + this.clientY = e.clientY !== undefined ? e.clientY : e.pageY; + this.screenX = e.screenX || 0; + this.screenY = e.screenY || 0; + this.button = e.button; + this.keyCode = e.keyCode || 0; + this.charCode = e.charCode || (type == "keypress" ? e.keyCode : 0); + this.ctrlKey = e.ctrlKey; + this.altKey = e.altKey; + this.shiftKey = e.shiftKey; + this.metaKey = e.metaKey; + this.platformModifierKey = goog.userAgent.MAC ? e.metaKey : e.ctrlKey; + this.state = e.state; + this.event_ = e; + if(e.defaultPrevented) { + this.preventDefault() + } + delete this.propagationStopped_ +}; +goog.events.BrowserEvent.prototype.isButton = function(button) { + if(!goog.events.BrowserFeature.HAS_W3C_BUTTON) { + if(this.type == "click") { + return button == goog.events.BrowserEvent.MouseButton.LEFT + }else { + return!!(this.event_.button & goog.events.BrowserEvent.IEButtonMap[button]) + } + }else { + return this.event_.button == button + } +}; +goog.events.BrowserEvent.prototype.isMouseActionButton = function() { + return this.isButton(goog.events.BrowserEvent.MouseButton.LEFT) && !(goog.userAgent.WEBKIT && goog.userAgent.MAC && this.ctrlKey) +}; +goog.events.BrowserEvent.prototype.stopPropagation = function() { + goog.events.BrowserEvent.superClass_.stopPropagation.call(this); + if(this.event_.stopPropagation) { + this.event_.stopPropagation() + }else { + this.event_.cancelBubble = true + } +}; +goog.events.BrowserEvent.prototype.preventDefault = function() { + goog.events.BrowserEvent.superClass_.preventDefault.call(this); + var be = this.event_; + if(!be.preventDefault) { + be.returnValue = false; + if(goog.events.BrowserFeature.SET_KEY_CODE_TO_PREVENT_DEFAULT) { + try { + var VK_F1 = 112; + var VK_F12 = 123; + if(be.ctrlKey || be.keyCode >= VK_F1 && be.keyCode <= VK_F12) { + be.keyCode = -1 + } + }catch(ex) { + } + } + }else { + be.preventDefault() + } +}; +goog.events.BrowserEvent.prototype.getBrowserEvent = function() { + return this.event_ +}; +goog.events.BrowserEvent.prototype.disposeInternal = function() { +}; +goog.provide("goog.events.Listenable"); +goog.provide("goog.events.ListenableKey"); +goog.events.Listenable = function() { +}; +goog.events.Listenable.IMPLEMENTED_BY_PROP = "closure_listenable_" + (Math.random() * 1E6 | 0); +goog.events.Listenable.addImplementation = function(cls) { + cls.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP] = true +}; +goog.events.Listenable.isImplementedBy = function(obj) { + return!!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]) +}; +goog.events.Listenable.prototype.listen; +goog.events.Listenable.prototype.listenOnce; +goog.events.Listenable.prototype.unlisten; +goog.events.Listenable.prototype.unlistenByKey; +goog.events.Listenable.prototype.dispatchEvent; +goog.events.Listenable.prototype.removeAllListeners; +goog.events.Listenable.prototype.getParentEventTarget; +goog.events.Listenable.prototype.fireListeners; +goog.events.Listenable.prototype.getListeners; +goog.events.Listenable.prototype.getListener; +goog.events.Listenable.prototype.hasListener; +goog.events.ListenableKey = function() { +}; +goog.events.ListenableKey.counter_ = 0; +goog.events.ListenableKey.reserveKey = function() { + return++goog.events.ListenableKey.counter_ +}; +goog.events.ListenableKey.prototype.src; +goog.events.ListenableKey.prototype.type; +goog.events.ListenableKey.prototype.listener; +goog.events.ListenableKey.prototype.capture; +goog.events.ListenableKey.prototype.handler; +goog.events.ListenableKey.prototype.key; +goog.provide("goog.events.Listener"); +goog.require("goog.events.ListenableKey"); +goog.events.Listener = function(listener, proxy, src, type, capture, opt_handler) { + if(goog.events.Listener.ENABLE_MONITORING) { + this.creationStack = (new Error).stack + } + this.listener = listener; + this.proxy = proxy; + this.src = src; + this.type = type; + this.capture = !!capture; + this.handler = opt_handler; + this.key = goog.events.ListenableKey.reserveKey(); + this.callOnce = false; + this.removed = false +}; +goog.define("goog.events.Listener.ENABLE_MONITORING", false); +goog.events.Listener.prototype.creationStack; +goog.events.Listener.prototype.markAsRemoved = function() { + this.removed = true; + this.listener = null; + this.proxy = null; + this.src = null; + this.handler = null +}; +goog.provide("goog.events"); +goog.provide("goog.events.Key"); +goog.provide("goog.events.ListenableType"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.debug.entryPointRegistry"); +goog.require("goog.events.BrowserEvent"); +goog.require("goog.events.BrowserFeature"); +goog.require("goog.events.Listenable"); +goog.require("goog.events.Listener"); +goog.require("goog.object"); +goog.events.Key; +goog.events.ListenableType; +goog.events.listeners_ = {}; +goog.events.listenerTree_ = {}; +goog.events.sources_ = {}; +goog.events.onString_ = "on"; +goog.events.onStringMap_ = {}; +goog.events.keySeparator_ = "_"; +goog.events.listen = function(src, type, listener, opt_capt, opt_handler) { + if(goog.isArray(type)) { + for(var i = 0;i < type.length;i++) { + goog.events.listen(src, type[i], listener, opt_capt, opt_handler) + } + return null + } + listener = goog.events.wrapListener_(listener); + if(goog.events.Listenable.isImplementedBy(src)) { + return src.listen((type), listener, opt_capt, opt_handler) + }else { + return goog.events.listen_((src), type, listener, false, opt_capt, opt_handler) + } +}; +goog.events.listen_ = function(src, type, listener, callOnce, opt_capt, opt_handler) { + if(!type) { + throw Error("Invalid event type"); + } + var capture = !!opt_capt; + var map = goog.events.listenerTree_; + if(!(type in map)) { + map[type] = {count_:0} + } + map = map[type]; + if(!(capture in map)) { + map[capture] = {count_:0}; + map.count_++ + } + map = map[capture]; + var srcUid = goog.getUid(src); + var listenerArray, listenerObj; + if(!map[srcUid]) { + listenerArray = map[srcUid] = []; + map.count_++ + }else { + listenerArray = map[srcUid]; + for(var i = 0;i < listenerArray.length;i++) { + listenerObj = listenerArray[i]; + if(listenerObj.listener == listener && listenerObj.handler == opt_handler) { + if(listenerObj.removed) { + break + } + if(!callOnce) { + listenerArray[i].callOnce = false + } + return listenerArray[i] + } + } + } + var proxy = goog.events.getProxy(); + listenerObj = new goog.events.Listener(listener, proxy, src, type, capture, opt_handler); + listenerObj.callOnce = callOnce; + proxy.src = src; + proxy.listener = listenerObj; + listenerArray.push(listenerObj); + if(!goog.events.sources_[srcUid]) { + goog.events.sources_[srcUid] = [] + } + goog.events.sources_[srcUid].push(listenerObj); + if(src.addEventListener) { + src.addEventListener(type, proxy, capture) + }else { + src.attachEvent(goog.events.getOnString_(type), proxy) + } + var key = listenerObj.key; + goog.events.listeners_[key] = listenerObj; + return listenerObj +}; +goog.events.getProxy = function() { + var proxyCallbackFunction = goog.events.handleBrowserEvent_; + var f = goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT ? function(eventObject) { + return proxyCallbackFunction.call(f.src, f.listener, eventObject) + } : function(eventObject) { + var v = proxyCallbackFunction.call(f.src, f.listener, eventObject); + if(!v) { + return v + } + }; + return f +}; +goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) { + if(goog.isArray(type)) { + for(var i = 0;i < type.length;i++) { + goog.events.listenOnce(src, type[i], listener, opt_capt, opt_handler) + } + return null + } + var listenableKey; + listener = goog.events.wrapListener_(listener); + if(goog.events.Listenable.isImplementedBy(src)) { + listenableKey = src.listenOnce((type), listener, opt_capt, opt_handler) + }else { + listenableKey = goog.events.listen_((src), type, listener, true, opt_capt, opt_handler) + } + return listenableKey +}; +goog.events.listenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) { + wrapper.listen(src, listener, opt_capt, opt_handler) +}; +goog.events.unlisten = function(src, type, listener, opt_capt, opt_handler) { + if(goog.isArray(type)) { + for(var i = 0;i < type.length;i++) { + goog.events.unlisten(src, type[i], listener, opt_capt, opt_handler) + } + return null + } + listener = goog.events.wrapListener_(listener); + if(goog.events.Listenable.isImplementedBy(src)) { + return src.unlisten((type), listener, opt_capt, opt_handler) + } + var capture = !!opt_capt; + var listenerArray = goog.events.getListeners_(src, type, capture); + if(!listenerArray) { + return false + } + for(var i = 0;i < listenerArray.length;i++) { + if(listenerArray[i].listener == listener && listenerArray[i].capture == capture && listenerArray[i].handler == opt_handler) { + return goog.events.unlistenByKey(listenerArray[i]) + } + } + return false +}; +goog.events.unlistenByKey = function(key) { + if(goog.isNumber(key)) { + return false + } + var listener = (key); + if(!listener) { + return false + } + if(listener.removed) { + return false + } + var src = listener.src; + if(goog.events.Listenable.isImplementedBy(src)) { + return src.unlistenByKey(listener) + } + var type = listener.type; + var proxy = listener.proxy; + var capture = listener.capture; + if(src.removeEventListener) { + src.removeEventListener(type, proxy, capture) + }else { + if(src.detachEvent) { + src.detachEvent(goog.events.getOnString_(type), proxy) + } + } + var srcUid = goog.getUid(src); + if(goog.events.sources_[srcUid]) { + var sourcesArray = goog.events.sources_[srcUid]; + goog.array.remove(sourcesArray, listener); + if(sourcesArray.length == 0) { + delete goog.events.sources_[srcUid] + } + } + listener.markAsRemoved(); + var listenerArray = goog.events.listenerTree_[type][capture][srcUid]; + if(listenerArray) { + goog.array.remove(listenerArray, listener); + if(listenerArray.length == 0) { + delete goog.events.listenerTree_[type][capture][srcUid]; + goog.events.listenerTree_[type][capture].count_-- + } + if(goog.events.listenerTree_[type][capture].count_ == 0) { + delete goog.events.listenerTree_[type][capture]; + goog.events.listenerTree_[type].count_-- + } + if(goog.events.listenerTree_[type].count_ == 0) { + delete goog.events.listenerTree_[type] + } + } + delete goog.events.listeners_[listener.key]; + return true +}; +goog.events.unlistenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) { + wrapper.unlisten(src, listener, opt_capt, opt_handler) +}; +goog.events.removeAll = function(opt_obj, opt_type) { + var count = 0; + var noObj = opt_obj == null; + var noType = opt_type == null; + if(!noObj) { + if(opt_obj && goog.events.Listenable.isImplementedBy(opt_obj)) { + return opt_obj.removeAllListeners(opt_type) + } + var srcUid = goog.getUid((opt_obj)); + if(goog.events.sources_[srcUid]) { + var sourcesArray = goog.events.sources_[srcUid]; + for(var i = sourcesArray.length - 1;i >= 0;i--) { + var listener = sourcesArray[i]; + if(noType || opt_type == listener.type) { + goog.events.unlistenByKey(listener); + count++ + } + } + } + }else { + goog.object.forEach(goog.events.listeners_, function(listener) { + goog.events.unlistenByKey(listener); + count++ + }) + } + return count +}; +goog.events.removeAllNativeListeners = function() { + var count = 0; + goog.object.forEach(goog.events.listeners_, function(listener) { + goog.events.unlistenByKey(listener); + count++ + }); + return count +}; +goog.events.getListeners = function(obj, type, capture) { + if(goog.events.Listenable.isImplementedBy(obj)) { + return obj.getListeners(type, capture) + }else { + return goog.events.getListeners_(obj, type, capture) || [] + } +}; +goog.events.getListeners_ = function(obj, type, capture) { + var map = goog.events.listenerTree_; + if(type in map) { + map = map[type]; + if(capture in map) { + map = map[capture]; + var objUid = goog.getUid(obj); + if(map[objUid]) { + return map[objUid] + } + } + } + return null +}; +goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) { + var capture = !!opt_capt; + listener = goog.events.wrapListener_(listener); + if(goog.events.Listenable.isImplementedBy(src)) { + return src.getListener((type), listener, capture, opt_handler) + } + var listenerArray = goog.events.getListeners_(src, type, capture); + if(listenerArray) { + for(var i = 0;i < listenerArray.length;i++) { + if(!listenerArray[i].removed && listenerArray[i].listener == listener && listenerArray[i].capture == capture && listenerArray[i].handler == opt_handler) { + return listenerArray[i] + } + } + } + return null +}; +goog.events.hasListener = function(obj, opt_type, opt_capture) { + if(goog.events.Listenable.isImplementedBy(obj)) { + return obj.hasListener(opt_type, opt_capture) + } + var objUid = goog.getUid(obj); + var listeners = goog.events.sources_[objUid]; + if(listeners) { + var hasType = goog.isDef(opt_type); + var hasCapture = goog.isDef(opt_capture); + if(hasType && hasCapture) { + var map = goog.events.listenerTree_[opt_type]; + return!!map && !!map[opt_capture] && objUid in map[opt_capture] + }else { + if(!(hasType || hasCapture)) { + return true + }else { + return goog.array.some(listeners, function(listener) { + return hasType && listener.type == opt_type || hasCapture && listener.capture == opt_capture + }) + } + } + } + return false +}; +goog.events.expose = function(e) { + var str = []; + for(var key in e) { + if(e[key] && e[key].id) { + str.push(key + " \x3d " + e[key] + " (" + e[key].id + ")") + }else { + str.push(key + " \x3d " + e[key]) + } + } + return str.join("\n") +}; +goog.events.getOnString_ = function(type) { + if(type in goog.events.onStringMap_) { + return goog.events.onStringMap_[type] + } + return goog.events.onStringMap_[type] = goog.events.onString_ + type +}; +goog.events.fireListeners = function(obj, type, capture, eventObject) { + if(goog.events.Listenable.isImplementedBy(obj)) { + return obj.fireListeners(type, capture, eventObject) + } + var map = goog.events.listenerTree_; + if(type in map) { + map = map[type]; + if(capture in map) { + return goog.events.fireListeners_(map[capture], obj, type, capture, eventObject) + } + } + return true +}; +goog.events.fireListeners_ = function(map, obj, type, capture, eventObject) { + var retval = 1; + var objUid = goog.getUid(obj); + if(map[objUid]) { + var listenerArray = goog.array.clone(map[objUid]); + for(var i = 0;i < listenerArray.length;i++) { + var listener = listenerArray[i]; + if(listener && !listener.removed) { + retval &= goog.events.fireListener(listener, eventObject) !== false + } + } + } + return Boolean(retval) +}; +goog.events.fireListener = function(listener, eventObject) { + var listenerFn = listener.listener; + var listenerHandler = listener.handler || listener.src; + if(listener.callOnce) { + goog.events.unlistenByKey(listener) + } + return listenerFn.call(listenerHandler, eventObject) +}; +goog.events.getTotalListenerCount = function() { + return goog.object.getCount(goog.events.listeners_) +}; +goog.events.dispatchEvent = function(src, e) { + goog.asserts.assert(goog.events.Listenable.isImplementedBy(src), "Can not use goog.events.dispatchEvent with " + "non-goog.events.Listenable instance."); + return src.dispatchEvent(e) +}; +goog.events.protectBrowserEventEntryPoint = function(errorHandler) { + goog.events.handleBrowserEvent_ = errorHandler.protectEntryPoint(goog.events.handleBrowserEvent_) +}; +goog.events.handleBrowserEvent_ = function(listener, opt_evt) { + if(listener.removed) { + return true + } + var type = listener.type; + var map = goog.events.listenerTree_; + if(!(type in map)) { + return true + } + map = map[type]; + var retval, targetsMap; + if(!goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) { + var ieEvent = opt_evt || (goog.getObjectByName("window.event")); + var hasCapture = true in map; + var hasBubble = false in map; + if(hasCapture) { + if(goog.events.isMarkedIeEvent_(ieEvent)) { + return true + } + goog.events.markIeEvent_(ieEvent) + } + var evt = new goog.events.BrowserEvent; + evt.init(ieEvent, this); + retval = true; + try { + if(hasCapture) { + var ancestors = []; + for(var parent = evt.currentTarget;parent;parent = parent.parentNode) { + ancestors.push(parent) + } + targetsMap = map[true]; + for(var i = ancestors.length - 1;!evt.propagationStopped_ && i >= 0;i--) { + evt.currentTarget = ancestors[i]; + retval &= goog.events.fireListeners_(targetsMap, ancestors[i], type, true, evt) + } + if(hasBubble) { + targetsMap = map[false]; + for(var i = 0;!evt.propagationStopped_ && i < ancestors.length;i++) { + evt.currentTarget = ancestors[i]; + retval &= goog.events.fireListeners_(targetsMap, ancestors[i], type, false, evt) + } + } + }else { + retval = goog.events.fireListener(listener, evt) + } + }finally { + if(ancestors) { + ancestors.length = 0 + } + } + return retval + } + var be = new goog.events.BrowserEvent(opt_evt, (this)); + retval = goog.events.fireListener(listener, be); + return retval +}; +goog.events.markIeEvent_ = function(e) { + var useReturnValue = false; + if(e.keyCode == 0) { + try { + e.keyCode = -1; + return + }catch(ex) { + useReturnValue = true + } + } + if(useReturnValue || (e.returnValue) == undefined) { + e.returnValue = true + } +}; +goog.events.isMarkedIeEvent_ = function(e) { + return e.keyCode < 0 || e.returnValue != undefined +}; +goog.events.uniqueIdCounter_ = 0; +goog.events.getUniqueId = function(identifier) { + return identifier + "_" + goog.events.uniqueIdCounter_++ +}; +goog.events.LISTENER_WRAPPER_PROP_ = "__closure_events_fn_" + (Math.random() * 1E9 >>> 0); +goog.events.wrapListener_ = function(listener) { + goog.asserts.assert(listener, "Listener can not be null."); + if(goog.isFunction(listener)) { + return listener + } + goog.asserts.assert(listener.handleEvent, "An object listener must have handleEvent method."); + return listener[goog.events.LISTENER_WRAPPER_PROP_] || (listener[goog.events.LISTENER_WRAPPER_PROP_] = function(e) { + return listener.handleEvent(e) + }) +}; +goog.debug.entryPointRegistry.register(function(transformer) { + goog.events.handleBrowserEvent_ = transformer(goog.events.handleBrowserEvent_) +}); +goog.provide("goog.functions"); +goog.functions.constant = function(retValue) { + return function() { + return retValue + } +}; +goog.functions.FALSE = goog.functions.constant(false); +goog.functions.TRUE = goog.functions.constant(true); +goog.functions.NULL = goog.functions.constant(null); +goog.functions.identity = function(opt_returnValue, var_args) { + return opt_returnValue +}; +goog.functions.error = function(message) { + return function() { + throw Error(message); + } +}; +goog.functions.fail = function(err) { + return function() { + throw err; + } +}; +goog.functions.lock = function(f, opt_numArgs) { + opt_numArgs = opt_numArgs || 0; + return function() { + return f.apply(this, Array.prototype.slice.call(arguments, 0, opt_numArgs)) + } +}; +goog.functions.withReturnValue = function(f, retValue) { + return goog.functions.sequence(f, goog.functions.constant(retValue)) +}; +goog.functions.compose = function(fn, var_args) { + var functions = arguments; + var length = functions.length; + return function() { + var result; + if(length) { + result = functions[length - 1].apply(this, arguments) + } + for(var i = length - 2;i >= 0;i--) { + result = functions[i].call(this, result) + } + return result + } +}; +goog.functions.sequence = function(var_args) { + var functions = arguments; + var length = functions.length; + return function() { + var result; + for(var i = 0;i < length;i++) { + result = functions[i].apply(this, arguments) + } + return result + } +}; +goog.functions.and = function(var_args) { + var functions = arguments; + var length = functions.length; + return function() { + for(var i = 0;i < length;i++) { + if(!functions[i].apply(this, arguments)) { + return false + } + } + return true + } +}; +goog.functions.or = function(var_args) { + var functions = arguments; + var length = functions.length; + return function() { + for(var i = 0;i < length;i++) { + if(functions[i].apply(this, arguments)) { + return true + } + } + return false + } +}; +goog.functions.not = function(f) { + return function() { + return!f.apply(this, arguments) + } +}; +goog.functions.create = function(constructor, var_args) { + var temp = function() { + }; + temp.prototype = constructor.prototype; + var obj = new temp; + constructor.apply(obj, Array.prototype.slice.call(arguments, 1)); + return obj +}; +goog.provide("goog.events.ListenerMap"); +goog.require("goog.array"); +goog.require("goog.events.Listener"); +goog.require("goog.object"); +goog.events.ListenerMap = function(src) { + this.src = src; + this.listeners = {}; + this.typeCount_ = 0 +}; +goog.events.ListenerMap.prototype.getTypeCount = function() { + return this.typeCount_ +}; +goog.events.ListenerMap.prototype.getListenerCount = function() { + var count = 0; + for(var type in this.listeners) { + count += this.listeners[type].length + } + return count +}; +goog.events.ListenerMap.prototype.add = function(type, listener, callOnce, opt_useCapture, opt_listenerScope) { + var listenerArray = this.listeners[type]; + if(!listenerArray) { + listenerArray = this.listeners[type] = []; + this.typeCount_++ + } + var listenerObj; + var index = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, opt_useCapture, opt_listenerScope); + if(index > -1) { + listenerObj = listenerArray[index]; + if(!callOnce) { + listenerObj.callOnce = false + } + }else { + listenerObj = new goog.events.Listener(listener, null, this.src, type, !!opt_useCapture, opt_listenerScope); + listenerObj.callOnce = callOnce; + listenerArray.push(listenerObj) + } + return listenerObj +}; +goog.events.ListenerMap.prototype.remove = function(type, listener, opt_useCapture, opt_listenerScope) { + if(!(type in this.listeners)) { + return false + } + var listenerArray = this.listeners[type]; + var index = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, opt_useCapture, opt_listenerScope); + if(index > -1) { + var listenerObj = listenerArray[index]; + listenerObj.markAsRemoved(); + goog.array.removeAt(listenerArray, index); + if(listenerArray.length == 0) { + delete this.listeners[type]; + this.typeCount_-- + } + return true + } + return false +}; +goog.events.ListenerMap.prototype.removeByKey = function(listener) { + var type = listener.type; + if(!(type in this.listeners)) { + return false + } + var removed = goog.array.remove(this.listeners[type], listener); + if(removed) { + listener.markAsRemoved(); + if(this.listeners[type].length == 0) { + delete this.listeners[type]; + this.typeCount_-- + } + } + return removed +}; +goog.events.ListenerMap.prototype.removeAll = function(opt_type) { + var count = 0; + for(var type in this.listeners) { + if(!opt_type || type == opt_type) { + var listenerArray = this.listeners[type]; + for(var i = 0;i < listenerArray.length;i++) { + ++count; + listenerArray[i].removed = true + } + delete this.listeners[type]; + this.typeCount_-- + } + } + return count +}; +goog.events.ListenerMap.prototype.getListeners = function(type, capture) { + var listenerArray = this.listeners[type]; + var rv = []; + if(listenerArray) { + for(var i = 0;i < listenerArray.length;++i) { + var listenerObj = listenerArray[i]; + if(listenerObj.capture == capture) { + rv.push(listenerObj) + } + } + } + return rv +}; +goog.events.ListenerMap.prototype.getListener = function(type, listener, capture, opt_listenerScope) { + var listenerArray = this.listeners[type]; + var i = -1; + if(listenerArray) { + i = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, capture, opt_listenerScope) + } + return i > -1 ? listenerArray[i] : null +}; +goog.events.ListenerMap.prototype.hasListener = function(opt_type, opt_capture) { + var hasType = goog.isDef(opt_type); + var hasCapture = goog.isDef(opt_capture); + return goog.object.some(this.listeners, function(listenerArray, type) { + for(var i = 0;i < listenerArray.length;++i) { + if((!hasType || listenerArray[i].type == opt_type) && (!hasCapture || listenerArray[i].capture == opt_capture)) { + return true + } + } + return false + }) +}; +goog.events.ListenerMap.findListenerIndex_ = function(listenerArray, listener, opt_useCapture, opt_listenerScope) { + for(var i = 0;i < listenerArray.length;++i) { + var listenerObj = listenerArray[i]; + if(!listenerObj.removed && listenerObj.listener == listener && listenerObj.capture == !!opt_useCapture && listenerObj.handler == opt_listenerScope) { + return i + } + } + return-1 +}; +goog.provide("goog.events.EventTarget"); +goog.require("goog.Disposable"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.Event"); +goog.require("goog.events.Listenable"); +goog.require("goog.events.ListenerMap"); +goog.require("goog.object"); +goog.events.EventTarget = function() { + goog.Disposable.call(this); + this.eventTargetListeners_ = new goog.events.ListenerMap(this); + this.actualEventTarget_ = this +}; +goog.inherits(goog.events.EventTarget, goog.Disposable); +goog.events.Listenable.addImplementation(goog.events.EventTarget); +goog.events.EventTarget.MAX_ANCESTORS_ = 1E3; +goog.events.EventTarget.prototype.parentEventTarget_ = null; +goog.events.EventTarget.prototype.getParentEventTarget = function() { + return this.parentEventTarget_ +}; +goog.events.EventTarget.prototype.setParentEventTarget = function(parent) { + this.parentEventTarget_ = parent +}; +goog.events.EventTarget.prototype.addEventListener = function(type, handler, opt_capture, opt_handlerScope) { + goog.events.listen(this, type, handler, opt_capture, opt_handlerScope) +}; +goog.events.EventTarget.prototype.removeEventListener = function(type, handler, opt_capture, opt_handlerScope) { + goog.events.unlisten(this, type, handler, opt_capture, opt_handlerScope) +}; +goog.events.EventTarget.prototype.dispatchEvent = function(e) { + this.assertInitialized_(); + var ancestorsTree, ancestor = this.getParentEventTarget(); + if(ancestor) { + ancestorsTree = []; + var ancestorCount = 1; + for(;ancestor;ancestor = ancestor.getParentEventTarget()) { + ancestorsTree.push(ancestor); + goog.asserts.assert(++ancestorCount < goog.events.EventTarget.MAX_ANCESTORS_, "infinite loop") + } + } + return goog.events.EventTarget.dispatchEventInternal_(this.actualEventTarget_, e, ancestorsTree) +}; +goog.events.EventTarget.prototype.disposeInternal = function() { + goog.events.EventTarget.superClass_.disposeInternal.call(this); + this.removeAllListeners(); + this.parentEventTarget_ = null +}; +goog.events.EventTarget.prototype.listen = function(type, listener, opt_useCapture, opt_listenerScope) { + this.assertInitialized_(); + return this.eventTargetListeners_.add(type, listener, false, opt_useCapture, opt_listenerScope) +}; +goog.events.EventTarget.prototype.listenOnce = function(type, listener, opt_useCapture, opt_listenerScope) { + return this.eventTargetListeners_.add(type, listener, true, opt_useCapture, opt_listenerScope) +}; +goog.events.EventTarget.prototype.unlisten = function(type, listener, opt_useCapture, opt_listenerScope) { + return this.eventTargetListeners_.remove(type, listener, opt_useCapture, opt_listenerScope) +}; +goog.events.EventTarget.prototype.unlistenByKey = function(key) { + return this.eventTargetListeners_.removeByKey(key) +}; +goog.events.EventTarget.prototype.removeAllListeners = function(opt_type) { + if(!this.eventTargetListeners_) { + return 0 + } + return this.eventTargetListeners_.removeAll(opt_type) +}; +goog.events.EventTarget.prototype.fireListeners = function(type, capture, eventObject) { + var listenerArray = this.eventTargetListeners_.listeners[type]; + if(!listenerArray) { + return true + } + listenerArray = goog.array.clone(listenerArray); + var rv = true; + for(var i = 0;i < listenerArray.length;++i) { + var listener = listenerArray[i]; + if(listener && !listener.removed && listener.capture == capture) { + var listenerFn = listener.listener; + var listenerHandler = listener.handler || listener.src; + if(listener.callOnce) { + this.unlistenByKey(listener) + } + rv = listenerFn.call(listenerHandler, eventObject) !== false && rv + } + } + return rv && eventObject.returnValue_ != false +}; +goog.events.EventTarget.prototype.getListeners = function(type, capture) { + return this.eventTargetListeners_.getListeners(type, capture) +}; +goog.events.EventTarget.prototype.getListener = function(type, listener, capture, opt_listenerScope) { + return this.eventTargetListeners_.getListener(type, listener, capture, opt_listenerScope) +}; +goog.events.EventTarget.prototype.hasListener = function(opt_type, opt_capture) { + return this.eventTargetListeners_.hasListener(opt_type, opt_capture) +}; +goog.events.EventTarget.prototype.setTargetForTesting = function(target) { + this.actualEventTarget_ = target +}; +goog.events.EventTarget.prototype.assertInitialized_ = function() { + goog.asserts.assert(this.eventTargetListeners_, "Event target is not initialized. Did you call the superclass " + "(goog.events.EventTarget) constructor?") +}; +goog.events.EventTarget.dispatchEventInternal_ = function(target, e, opt_ancestorsTree) { + var type = e.type || (e); + if(goog.isString(e)) { + e = new goog.events.Event(e, target) + }else { + if(!(e instanceof goog.events.Event)) { + var oldEvent = e; + e = new goog.events.Event(type, target); + goog.object.extend(e, oldEvent) + }else { + e.target = e.target || target + } + } + var rv = true, currentTarget; + if(opt_ancestorsTree) { + for(var i = opt_ancestorsTree.length - 1;!e.propagationStopped_ && i >= 0;i--) { + currentTarget = e.currentTarget = opt_ancestorsTree[i]; + rv = currentTarget.fireListeners(type, true, e) && rv + } + } + if(!e.propagationStopped_) { + currentTarget = e.currentTarget = target; + rv = currentTarget.fireListeners(type, true, e) && rv; + if(!e.propagationStopped_) { + rv = currentTarget.fireListeners(type, false, e) && rv + } + } + if(opt_ancestorsTree) { + for(i = 0;!e.propagationStopped_ && i < opt_ancestorsTree.length;i++) { + currentTarget = e.currentTarget = opt_ancestorsTree[i]; + rv = currentTarget.fireListeners(type, false, e) && rv + } + } + return rv +}; +goog.provide("ol.Observable"); +goog.require("goog.events"); +goog.require("goog.events.EventTarget"); +goog.require("goog.events.EventType"); +ol.Observable = function() { + goog.base(this); + this.revision_ = 0 +}; +goog.inherits(ol.Observable, goog.events.EventTarget); +ol.Observable.prototype.dispatchChangeEvent = function() { + ++this.revision_; + this.dispatchEvent(goog.events.EventType.CHANGE) +}; +ol.Observable.prototype.getRevision = function() { + return this.revision_ +}; +ol.Observable.prototype.on = function(type, listener, opt_this) { + return goog.events.listen(this, type, listener, false, opt_this) +}; +ol.Observable.prototype.once = function(type, listener, opt_this) { + return goog.events.listenOnce(this, type, listener, false, opt_this) +}; +ol.Observable.prototype.un = function(type, listener, opt_this) { + goog.events.unlisten(this, type, listener, false, opt_this) +}; +ol.Observable.prototype.unByKey = function(key) { + goog.events.unlistenByKey(key) +}; +goog.provide("ol.Object"); +goog.provide("ol.ObjectEvent"); +goog.provide("ol.ObjectEventType"); +goog.require("goog.array"); +goog.require("goog.events"); +goog.require("goog.events.Event"); +goog.require("goog.functions"); +goog.require("goog.object"); +goog.require("ol.Observable"); +ol.ObjectEventType = {BEFOREPROPERTYCHANGE:"beforepropertychange", PROPERTYCHANGE:"propertychange"}; +ol.ObjectEvent = function(type, key) { + goog.base(this, type); + this.key = key +}; +goog.inherits(ol.ObjectEvent, goog.events.Event); +ol.ObjectAccessor = function(target, key) { + this.target = target; + this.key = key; + this.from = goog.functions.identity; + this.to = goog.functions.identity +}; +ol.ObjectAccessor.prototype.transform = function(from, to) { + this.from = from; + this.to = to; + this.target.notify(this.key) +}; +ol.Object = function(opt_values) { + goog.base(this); + this.values_ = {}; + this.accessors_ = {}; + this.beforeChangeListeners_ = {}; + this.listeners_ = {}; + if(goog.isDef(opt_values)) { + this.setValues(opt_values) + } +}; +goog.inherits(ol.Object, ol.Observable); +ol.Object.changeEventTypeCache_ = {}; +ol.Object.getterNameCache_ = {}; +ol.Object.setterNameCache_ = {}; +ol.Object.capitalize = function(str) { + return str.substr(0, 1).toUpperCase() + str.substr(1) +}; +ol.Object.getChangeEventType = function(key) { + return ol.Object.changeEventTypeCache_.hasOwnProperty(key) ? ol.Object.changeEventTypeCache_[key] : ol.Object.changeEventTypeCache_[key] = "change:" + key.toLowerCase() +}; +ol.Object.getGetterName = function(key) { + return ol.Object.getterNameCache_.hasOwnProperty(key) ? ol.Object.getterNameCache_[key] : ol.Object.getterNameCache_[key] = "get" + ol.Object.capitalize(key) +}; +ol.Object.getSetterName = function(key) { + return ol.Object.setterNameCache_.hasOwnProperty(key) ? ol.Object.setterNameCache_[key] : ol.Object.setterNameCache_[key] = "set" + ol.Object.capitalize(key) +}; +ol.Object.prototype.bindTo = function(key, target, opt_targetKey) { + var targetKey = opt_targetKey || key; + this.unbind(key); + var eventType = ol.Object.getChangeEventType(targetKey); + this.listeners_[key] = goog.events.listen(target, eventType, function() { + this.notifyInternal_(key) + }, undefined, this); + this.beforeChangeListeners_[key] = goog.events.listen(target, ol.ObjectEventType.BEFOREPROPERTYCHANGE, this.createBeforeChangeListener_(key, targetKey), undefined, this); + var accessor = new ol.ObjectAccessor(target, targetKey); + this.accessors_[key] = accessor; + this.notifyInternal_(key); + return accessor +}; +ol.Object.prototype.createBeforeChangeListener_ = function(key, targetKey) { + return function(event) { + if(event.key === targetKey) { + this.dispatchEvent(new ol.ObjectEvent(ol.ObjectEventType.BEFOREPROPERTYCHANGE, key)) + } + } +}; +ol.Object.prototype.get = function(key) { + var value; + var accessors = this.accessors_; + if(accessors.hasOwnProperty(key)) { + var accessor = accessors[key]; + var target = accessor.target; + var targetKey = accessor.key; + var getterName = ol.Object.getGetterName(targetKey); + var getter = (goog.object.get(target, getterName)); + if(goog.isDef(getter)) { + value = getter.call(target) + }else { + value = target.get(targetKey) + } + value = accessor.to(value) + }else { + if(this.values_.hasOwnProperty(key)) { + value = this.values_[key] + } + } + return value +}; +ol.Object.prototype.getKeys = function() { + var accessors = this.accessors_; + var keysObject; + if(goog.object.isEmpty(this.values_)) { + if(goog.object.isEmpty(accessors)) { + return[] + }else { + keysObject = accessors + } + }else { + if(goog.object.isEmpty(accessors)) { + keysObject = this.values_ + }else { + keysObject = {}; + var key; + for(key in this.values_) { + keysObject[key] = true + } + for(key in accessors) { + keysObject[key] = true + } + } + } + return goog.object.getKeys(keysObject) +}; +ol.Object.prototype.getProperties = function() { + var properties = {}; + var key; + for(key in this.values_) { + properties[key] = this.values_[key] + } + for(key in this.accessors_) { + properties[key] = this.get(key) + } + return properties +}; +ol.Object.prototype.notify = function(key) { + var accessors = this.accessors_; + if(accessors.hasOwnProperty(key)) { + var accessor = accessors[key]; + var target = accessor.target; + var targetKey = accessor.key; + target.notify(targetKey) + }else { + this.notifyInternal_(key) + } +}; +ol.Object.prototype.notifyInternal_ = function(key) { + var eventType = ol.Object.getChangeEventType(key); + this.dispatchEvent(eventType); + this.dispatchEvent(new ol.ObjectEvent(ol.ObjectEventType.PROPERTYCHANGE, key)) +}; +ol.Object.prototype.set = function(key, value) { + this.dispatchEvent(new ol.ObjectEvent(ol.ObjectEventType.BEFOREPROPERTYCHANGE, key)); + var accessors = this.accessors_; + if(accessors.hasOwnProperty(key)) { + var accessor = accessors[key]; + var target = accessor.target; + var targetKey = accessor.key; + value = accessor.from(value); + var setterName = ol.Object.getSetterName(targetKey); + var setter = (goog.object.get(target, setterName)); + if(goog.isDef(setter)) { + setter.call(target, value) + }else { + target.set(targetKey, value) + } + }else { + this.values_[key] = value; + this.notifyInternal_(key) + } +}; +ol.Object.prototype.setValues = function(values) { + var key; + for(key in values) { + this.set(key, values[key]) + } +}; +ol.Object.prototype.unbind = function(key) { + var listeners = this.listeners_; + var listener = listeners[key]; + if(listener) { + delete listeners[key]; + goog.events.unlistenByKey(listener); + var value = this.get(key); + delete this.accessors_[key]; + this.values_[key] = value + } + var listenerKey = this.beforeChangeListeners_[key]; + if(listenerKey) { + goog.events.unlistenByKey(listenerKey); + delete this.beforeChangeListeners_[key] + } +}; +ol.Object.prototype.unbindAll = function() { + for(var key in this.listeners_) { + this.unbind(key) + } +}; +goog.provide("ol.Collection"); +goog.provide("ol.CollectionEvent"); +goog.provide("ol.CollectionEventType"); +goog.require("goog.array"); +goog.require("goog.events.Event"); +goog.require("ol.Object"); +ol.CollectionEventType = {ADD:"add", REMOVE:"remove"}; +ol.CollectionEvent = function(type, opt_element, opt_target) { + goog.base(this, type, opt_target); + this.element = opt_element +}; +goog.inherits(ol.CollectionEvent, goog.events.Event); +ol.CollectionProperty = {LENGTH:"length"}; +ol.Collection = function(opt_array) { + goog.base(this); + this.array_ = opt_array || []; + this.updateLength_() +}; +goog.inherits(ol.Collection, ol.Object); +ol.Collection.prototype.clear = function() { + while(this.getLength() > 0) { + this.pop() + } +}; +ol.Collection.prototype.extend = function(arr) { + var i, ii; + for(i = 0, ii = arr.length;i < ii;++i) { + this.push(arr[i]) + } + return this +}; +ol.Collection.prototype.forEach = function(f, opt_this) { + goog.array.forEach(this.array_, f, opt_this) +}; +ol.Collection.prototype.getArray = function() { + return this.array_ +}; +ol.Collection.prototype.getAt = function(index) { + return this.array_[index] +}; +ol.Collection.prototype.getLength = function() { + return(this.get(ol.CollectionProperty.LENGTH)) +}; +ol.Collection.prototype.insertAt = function(index, elem) { + goog.array.insertAt(this.array_, elem, index); + this.updateLength_(); + this.dispatchEvent(new ol.CollectionEvent(ol.CollectionEventType.ADD, elem, this)) +}; +ol.Collection.prototype.pop = function() { + return this.removeAt(this.getLength() - 1) +}; +ol.Collection.prototype.push = function(elem) { + var n = this.array_.length; + this.insertAt(n, elem); + return n +}; +ol.Collection.prototype.remove = function(elem) { + var arr = this.array_; + var i, ii; + for(i = 0, ii = arr.length;i < ii;++i) { + if(arr[i] === elem) { + return this.removeAt(i) + } + } + return undefined +}; +ol.Collection.prototype.removeAt = function(index) { + var prev = this.array_[index]; + goog.array.removeAt(this.array_, index); + this.updateLength_(); + this.dispatchEvent(new ol.CollectionEvent(ol.CollectionEventType.REMOVE, prev, this)); + return prev +}; +ol.Collection.prototype.setAt = function(index, elem) { + var n = this.getLength(); + if(index < n) { + var prev = this.array_[index]; + this.array_[index] = elem; + this.dispatchEvent(new ol.CollectionEvent(ol.CollectionEventType.REMOVE, prev, this)); + this.dispatchEvent(new ol.CollectionEvent(ol.CollectionEventType.ADD, elem, this)) + }else { + var j; + for(j = n;j < index;++j) { + this.insertAt(j, undefined) + } + this.insertAt(index, elem) + } +}; +ol.Collection.prototype.updateLength_ = function() { + this.set(ol.CollectionProperty.LENGTH, this.array_.length) +}; +goog.provide("ol.array"); +goog.require("goog.array"); +goog.require("goog.asserts"); +ol.array.binaryFindNearest = function(arr, target) { + var index = goog.array.binarySearch(arr, target, function(a, b) { + return b - a + }); + if(index >= 0) { + return index + }else { + if(index == -1) { + return 0 + }else { + if(index == -arr.length - 1) { + return arr.length - 1 + }else { + var left = -index - 2; + var right = -index - 1; + if(arr[left] - target < target - arr[right]) { + return left + }else { + return right + } + } + } + } +}; +ol.array.linearFindNearest = function(arr, target, direction) { + var n = arr.length; + if(arr[0] <= target) { + return 0 + }else { + if(target <= arr[n - 1]) { + return n - 1 + }else { + var i; + if(direction > 0) { + for(i = 1;i < n;++i) { + if(arr[i] < target) { + return i - 1 + } + } + }else { + if(direction < 0) { + for(i = 1;i < n;++i) { + if(arr[i] <= target) { + return i + } + } + }else { + for(i = 1;i < n;++i) { + if(arr[i] == target) { + return i + }else { + if(arr[i] < target) { + if(arr[i - 1] - target < target - arr[i]) { + return i - 1 + }else { + return i + } + } + } + } + } + } + goog.asserts.fail(); + return n - 1 + } + } +}; +ol.array.reverseSubArray = function(arr, begin, end) { + goog.asserts.assert(begin >= 0); + goog.asserts.assert(end < arr.length); + while(begin < end) { + var tmp = arr[begin]; + arr[begin] = arr[end]; + arr[end] = tmp; + ++begin; + --end + } +}; +goog.provide("ol.ResolutionConstraint"); +goog.provide("ol.ResolutionConstraintType"); +goog.require("goog.math"); +goog.require("ol.array"); +ol.ResolutionConstraintType; +ol.ResolutionConstraint.createSnapToResolutions = function(resolutions) { + return function(resolution, delta, direction) { + if(goog.isDef(resolution)) { + var z = ol.array.linearFindNearest(resolutions, resolution, direction); + z = goog.math.clamp(z + delta, 0, resolutions.length - 1); + return resolutions[z] + }else { + return undefined + } + } +}; +ol.ResolutionConstraint.createSnapToPower = function(power, maxResolution, opt_maxLevel) { + return function(resolution, delta, direction) { + if(goog.isDef(resolution)) { + var offset; + if(direction > 0) { + offset = 0 + }else { + if(direction < 0) { + offset = 1 + }else { + offset = 0.5 + } + } + var oldLevel = Math.floor(Math.log(maxResolution / resolution) / Math.log(power) + offset); + var newLevel = Math.max(oldLevel + delta, 0); + if(goog.isDef(opt_maxLevel)) { + newLevel = Math.min(newLevel, opt_maxLevel) + } + return maxResolution / Math.pow(power, newLevel) + }else { + return undefined + } + } +}; +goog.provide("ol.RotationConstraint"); +goog.provide("ol.RotationConstraintType"); +goog.require("goog.math"); +ol.RotationConstraintType; +ol.RotationConstraint.disable = function(rotation, delta) { + if(goog.isDef(rotation)) { + return 0 + }else { + return undefined + } +}; +ol.RotationConstraint.none = function(rotation, delta) { + if(goog.isDef(rotation)) { + return rotation + delta + }else { + return undefined + } +}; +ol.RotationConstraint.createSnapToN = function(n) { + var theta = 2 * Math.PI / n; + return function(rotation, delta) { + if(goog.isDef(rotation)) { + rotation = Math.floor((rotation + delta) / theta + 0.5) * theta; + return rotation + }else { + return undefined + } + } +}; +ol.RotationConstraint.createSnapToZero = function(opt_tolerance) { + var tolerance = opt_tolerance || goog.math.toRadians(5); + return function(rotation, delta) { + if(goog.isDef(rotation)) { + if(Math.abs(rotation + delta) <= tolerance) { + return 0 + }else { + return rotation + delta + } + }else { + return undefined + } + } +}; +goog.provide("ol.Constraints"); +goog.require("ol.CenterConstraintType"); +goog.require("ol.ResolutionConstraintType"); +goog.require("ol.RotationConstraintType"); +ol.Constraints = function(centerConstraint, resolutionConstraint, rotationConstraint) { + this.center = centerConstraint; + this.resolution = resolutionConstraint; + this.rotation = rotationConstraint +}; +goog.provide("ol.Coordinate"); +goog.provide("ol.CoordinateArray"); +goog.provide("ol.CoordinateFormatType"); +goog.provide("ol.coordinate"); +goog.require("goog.math"); +ol.CoordinateFormatType; +ol.Coordinate; +ol.CoordinateArray; +ol.coordinate.add = function(coordinate, delta) { + coordinate[0] += delta[0]; + coordinate[1] += delta[1]; + return coordinate +}; +ol.coordinate.closestOnSegment = function(coordinate, segment) { + var x0 = coordinate[0]; + var y0 = coordinate[1]; + var start = segment[0]; + var end = segment[1]; + var x1 = start[0]; + var y1 = start[1]; + var x2 = end[0]; + var y2 = end[1]; + var dx = x2 - x1; + var dy = y2 - y1; + var along = dx == 0 && dy == 0 ? 0 : (dx * (x0 - x1) + dy * (y0 - y1)) / (dx * dx + dy * dy || 0); + var x, y; + if(along <= 0) { + x = x1; + y = y1 + }else { + if(along >= 1) { + x = x2; + y = y2 + }else { + x = x1 + along * dx; + y = y1 + along * dy + } + } + return[x, y] +}; +ol.coordinate.createStringXY = function(opt_fractionDigits) { + return function(coordinate) { + return ol.coordinate.toStringXY(coordinate, opt_fractionDigits) + } +}; +ol.coordinate.degreesToStringHDMS_ = function(degrees, hemispheres) { + var normalizedDegrees = goog.math.modulo(degrees + 180, 360) - 180; + var x = Math.abs(Math.round(3600 * normalizedDegrees)); + return Math.floor(x / 3600) + "\u00b0 " + Math.floor(x / 60 % 60) + "\u2032 " + Math.floor(x % 60) + "\u2033 " + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0) +}; +ol.coordinate.format = function(coordinate, template, opt_fractionDigits) { + if(goog.isDef(coordinate)) { + return template.replace("{x}", coordinate[0].toFixed(opt_fractionDigits)).replace("{y}", coordinate[1].toFixed(opt_fractionDigits)) + }else { + return"" + } +}; +ol.coordinate.equals = function(coordinate1, coordinate2) { + var equals = true; + for(var i = coordinate1.length - 1;i >= 0;--i) { + if(coordinate1[i] != coordinate2[i]) { + equals = false; + break + } + } + return equals +}; +ol.coordinate.rotate = function(coordinate, angle) { + var cosAngle = Math.cos(angle); + var sinAngle = Math.sin(angle); + var x = coordinate[0] * cosAngle - coordinate[1] * sinAngle; + var y = coordinate[1] * cosAngle + coordinate[0] * sinAngle; + coordinate[0] = x; + coordinate[1] = y; + return coordinate +}; +ol.coordinate.scale = function(coordinate, s) { + coordinate[0] *= s; + coordinate[1] *= s; + return coordinate +}; +ol.coordinate.squaredDistance = function(coord1, coord2) { + var dx = coord1[0] - coord2[0]; + var dy = coord1[1] - coord2[1]; + return dx * dx + dy * dy +}; +ol.coordinate.squaredDistanceToSegment = function(coordinate, segment) { + return ol.coordinate.squaredDistance(coordinate, ol.coordinate.closestOnSegment(coordinate, segment)) +}; +ol.coordinate.toStringHDMS = function(coordinate) { + if(goog.isDef(coordinate)) { + return ol.coordinate.degreesToStringHDMS_(coordinate[1], "NS") + " " + ol.coordinate.degreesToStringHDMS_(coordinate[0], "EW") + }else { + return"" + } +}; +ol.coordinate.toStringXY = function(coordinate, opt_fractionDigits) { + return ol.coordinate.format(coordinate, "{x}, {y}", opt_fractionDigits) +}; +ol.coordinate.fromProjectedArray = function(array, axis) { + var firstAxis = axis.charAt(0); + if(firstAxis === "n" || firstAxis === "s") { + return[array[1], array[0]] + }else { + return array + } +}; +goog.provide("ol.DeviceOrientation"); +goog.provide("ol.DeviceOrientationProperty"); +goog.require("goog.events"); +goog.require("goog.math"); +goog.require("ol.BrowserFeature"); +goog.require("ol.Object"); +ol.DeviceOrientationProperty = {ALPHA:"alpha", BETA:"beta", GAMMA:"gamma", HEADING:"heading", TRACKING:"tracking"}; +ol.DeviceOrientation = function(opt_options) { + goog.base(this); + var options = goog.isDef(opt_options) ? opt_options : {}; + this.listenerKey_ = null; + goog.events.listen(this, ol.Object.getChangeEventType(ol.DeviceOrientationProperty.TRACKING), this.handleTrackingChanged_, false, this); + this.setTracking(goog.isDef(options.tracking) ? options.tracking : false) +}; +goog.inherits(ol.DeviceOrientation, ol.Object); +ol.DeviceOrientation.prototype.disposeInternal = function() { + this.setTracking(false); + goog.base(this, "disposeInternal") +}; +ol.DeviceOrientation.prototype.orientationChange_ = function(browserEvent) { + var event = (browserEvent.getBrowserEvent()); + if(goog.isDefAndNotNull(event.alpha)) { + var alpha = goog.math.toRadians(event.alpha); + this.set(ol.DeviceOrientationProperty.ALPHA, alpha); + if(goog.isBoolean(event.absolute) && event.absolute) { + this.set(ol.DeviceOrientationProperty.HEADING, alpha) + }else { + if(goog.isDefAndNotNull(event.webkitCompassHeading) && goog.isDefAndNotNull(event.webkitCompassAccuracy) && event.webkitCompassAccuracy != -1) { + var heading = goog.math.toRadians(event.webkitCompassHeading); + this.set(ol.DeviceOrientationProperty.HEADING, heading) + } + } + } + if(goog.isDefAndNotNull(event.beta)) { + this.set(ol.DeviceOrientationProperty.BETA, goog.math.toRadians(event.beta)) + } + if(goog.isDefAndNotNull(event.gamma)) { + this.set(ol.DeviceOrientationProperty.GAMMA, goog.math.toRadians(event.gamma)) + } +}; +ol.DeviceOrientation.prototype.getAlpha = function() { + return(this.get(ol.DeviceOrientationProperty.ALPHA)) +}; +goog.exportProperty(ol.DeviceOrientation.prototype, "getAlpha", ol.DeviceOrientation.prototype.getAlpha); +ol.DeviceOrientation.prototype.getBeta = function() { + return(this.get(ol.DeviceOrientationProperty.BETA)) +}; +goog.exportProperty(ol.DeviceOrientation.prototype, "getBeta", ol.DeviceOrientation.prototype.getBeta); +ol.DeviceOrientation.prototype.getGamma = function() { + return(this.get(ol.DeviceOrientationProperty.GAMMA)) +}; +goog.exportProperty(ol.DeviceOrientation.prototype, "getGamma", ol.DeviceOrientation.prototype.getGamma); +ol.DeviceOrientation.prototype.getHeading = function() { + return(this.get(ol.DeviceOrientationProperty.HEADING)) +}; +goog.exportProperty(ol.DeviceOrientation.prototype, "getHeading", ol.DeviceOrientation.prototype.getHeading); +ol.DeviceOrientation.prototype.getTracking = function() { + return(this.get(ol.DeviceOrientationProperty.TRACKING)) +}; +goog.exportProperty(ol.DeviceOrientation.prototype, "getTracking", ol.DeviceOrientation.prototype.getTracking); +ol.DeviceOrientation.prototype.handleTrackingChanged_ = function() { + if(ol.BrowserFeature.HAS_DEVICE_ORIENTATION) { + var tracking = this.getTracking(); + if(tracking && goog.isNull(this.listenerKey_)) { + this.listenerKey_ = goog.events.listen(goog.global, "deviceorientation", this.orientationChange_, false, this) + }else { + if(!tracking && !goog.isNull(this.listenerKey_)) { + goog.events.unlistenByKey(this.listenerKey_); + this.listenerKey_ = null + } + } + } +}; +ol.DeviceOrientation.prototype.setTracking = function(tracking) { + this.set(ol.DeviceOrientationProperty.TRACKING, tracking) +}; +goog.exportProperty(ol.DeviceOrientation.prototype, "setTracking", ol.DeviceOrientation.prototype.setTracking); +goog.provide("goog.vec.Float32Array"); +goog.vec.Float32Array = function(p0) { + this.length = (p0.length || p0); + for(var i = 0;i < this.length;i++) { + this[i] = p0[i] || 0 + } +}; +goog.vec.Float32Array.BYTES_PER_ELEMENT = 4; +goog.vec.Float32Array.prototype.BYTES_PER_ELEMENT = 4; +goog.vec.Float32Array.prototype.set = function(values, opt_offset) { + opt_offset = opt_offset || 0; + for(var i = 0;i < values.length && opt_offset + i < this.length;i++) { + this[opt_offset + i] = values[i] + } +}; +goog.vec.Float32Array.prototype.toString = Array.prototype.join; +if(typeof Float32Array == "undefined") { + goog.exportProperty(goog.vec.Float32Array, "BYTES_PER_ELEMENT", goog.vec.Float32Array.BYTES_PER_ELEMENT); + goog.exportProperty(goog.vec.Float32Array.prototype, "BYTES_PER_ELEMENT", goog.vec.Float32Array.prototype.BYTES_PER_ELEMENT); + goog.exportProperty(goog.vec.Float32Array.prototype, "set", goog.vec.Float32Array.prototype.set); + goog.exportProperty(goog.vec.Float32Array.prototype, "toString", goog.vec.Float32Array.prototype.toString); + goog.exportSymbol("Float32Array", goog.vec.Float32Array) +} +;goog.provide("goog.vec.Float64Array"); +goog.vec.Float64Array = function(p0) { + this.length = (p0.length || p0); + for(var i = 0;i < this.length;i++) { + this[i] = p0[i] || 0 + } +}; +goog.vec.Float64Array.BYTES_PER_ELEMENT = 8; +goog.vec.Float64Array.prototype.BYTES_PER_ELEMENT = 8; +goog.vec.Float64Array.prototype.set = function(values, opt_offset) { + opt_offset = opt_offset || 0; + for(var i = 0;i < values.length && opt_offset + i < this.length;i++) { + this[opt_offset + i] = values[i] + } +}; +goog.vec.Float64Array.prototype.toString = Array.prototype.join; +if(typeof Float64Array == "undefined") { + try { + goog.exportProperty(goog.vec.Float64Array, "BYTES_PER_ELEMENT", goog.vec.Float64Array.BYTES_PER_ELEMENT) + }catch(float64ArrayError) { + } + goog.exportProperty(goog.vec.Float64Array.prototype, "BYTES_PER_ELEMENT", goog.vec.Float64Array.prototype.BYTES_PER_ELEMENT); + goog.exportProperty(goog.vec.Float64Array.prototype, "set", goog.vec.Float64Array.prototype.set); + goog.exportProperty(goog.vec.Float64Array.prototype, "toString", goog.vec.Float64Array.prototype.toString); + goog.exportSymbol("Float64Array", goog.vec.Float64Array) +} +;goog.provide("goog.vec"); +goog.provide("goog.vec.AnyType"); +goog.provide("goog.vec.ArrayType"); +goog.provide("goog.vec.Float32"); +goog.provide("goog.vec.Float64"); +goog.provide("goog.vec.Number"); +goog.require("goog.vec.Float32Array"); +goog.require("goog.vec.Float64Array"); +goog.vec.Float32; +goog.vec.Float64; +goog.vec.Number; +goog.vec.AnyType; +goog.vec.ArrayType; +goog.vec.EPSILON = 1E-6; +goog.provide("goog.vec.Vec3"); +goog.require("goog.vec"); +goog.vec.Vec3.Float32; +goog.vec.Vec3.Float64; +goog.vec.Vec3.Number; +goog.vec.Vec3.AnyType; +goog.vec.Vec3.Type; +goog.vec.Vec3.Vec3Like; +goog.vec.Vec3.createFloat32 = function() { + return new Float32Array(3) +}; +goog.vec.Vec3.createFloat64 = function() { + return new Float64Array(3) +}; +goog.vec.Vec3.createNumber = function() { + var a = new Array(3); + goog.vec.Vec3.setFromValues(a, 0, 0, 0); + return a +}; +goog.vec.Vec3.create = function() { + return new Float32Array(3) +}; +goog.vec.Vec3.createFloat32FromArray = function(vec) { + var newVec = goog.vec.Vec3.createFloat32(); + goog.vec.Vec3.setFromArray(newVec, vec); + return newVec +}; +goog.vec.Vec3.createFloat32FromValues = function(v0, v1, v2) { + var a = goog.vec.Vec3.createFloat32(); + goog.vec.Vec3.setFromValues(a, v0, v1, v2); + return a +}; +goog.vec.Vec3.cloneFloat32 = goog.vec.Vec3.createFloat32FromArray; +goog.vec.Vec3.createFloat64FromArray = function(vec) { + var newVec = goog.vec.Vec3.createFloat64(); + goog.vec.Vec3.setFromArray(newVec, vec); + return newVec +}; +goog.vec.Vec3.createFloat64FromValues = function(v0, v1, v2) { + var vec = goog.vec.Vec3.createFloat64(); + goog.vec.Vec3.setFromValues(vec, v0, v1, v2); + return vec +}; +goog.vec.Vec3.cloneFloat64 = goog.vec.Vec3.createFloat64FromArray; +goog.vec.Vec3.createFromArray = function(vec) { + var newVec = goog.vec.Vec3.create(); + goog.vec.Vec3.setFromArray(newVec, vec); + return newVec +}; +goog.vec.Vec3.createFromValues = function(v0, v1, v2) { + var vec = goog.vec.Vec3.create(); + goog.vec.Vec3.setFromValues(vec, v0, v1, v2); + return vec +}; +goog.vec.Vec3.clone = function(vec) { + var newVec = goog.vec.Vec3.create(); + goog.vec.Vec3.setFromArray(newVec, vec); + return newVec +}; +goog.vec.Vec3.setFromValues = function(vec, v0, v1, v2) { + vec[0] = v0; + vec[1] = v1; + vec[2] = v2; + return vec +}; +goog.vec.Vec3.setFromArray = function(vec, values) { + vec[0] = values[0]; + vec[1] = values[1]; + vec[2] = values[2]; + return vec +}; +goog.vec.Vec3.add = function(vec0, vec1, resultVec) { + resultVec[0] = vec0[0] + vec1[0]; + resultVec[1] = vec0[1] + vec1[1]; + resultVec[2] = vec0[2] + vec1[2]; + return resultVec +}; +goog.vec.Vec3.subtract = function(vec0, vec1, resultVec) { + resultVec[0] = vec0[0] - vec1[0]; + resultVec[1] = vec0[1] - vec1[1]; + resultVec[2] = vec0[2] - vec1[2]; + return resultVec +}; +goog.vec.Vec3.negate = function(vec0, resultVec) { + resultVec[0] = -vec0[0]; + resultVec[1] = -vec0[1]; + resultVec[2] = -vec0[2]; + return resultVec +}; +goog.vec.Vec3.scale = function(vec0, scalar, resultVec) { + resultVec[0] = vec0[0] * scalar; + resultVec[1] = vec0[1] * scalar; + resultVec[2] = vec0[2] * scalar; + return resultVec +}; +goog.vec.Vec3.magnitudeSquared = function(vec0) { + var x = vec0[0], y = vec0[1], z = vec0[2]; + return x * x + y * y + z * z +}; +goog.vec.Vec3.magnitude = function(vec0) { + var x = vec0[0], y = vec0[1], z = vec0[2]; + return Math.sqrt(x * x + y * y + z * z) +}; +goog.vec.Vec3.normalize = function(vec0, resultVec) { + var ilen = 1 / goog.vec.Vec3.magnitude(vec0); + resultVec[0] = vec0[0] * ilen; + resultVec[1] = vec0[1] * ilen; + resultVec[2] = vec0[2] * ilen; + return resultVec +}; +goog.vec.Vec3.dot = function(v0, v1) { + return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2] +}; +goog.vec.Vec3.cross = function(v0, v1, resultVec) { + var x0 = v0[0], y0 = v0[1], z0 = v0[2]; + var x1 = v1[0], y1 = v1[1], z1 = v1[2]; + resultVec[0] = y0 * z1 - z0 * y1; + resultVec[1] = z0 * x1 - x0 * z1; + resultVec[2] = x0 * y1 - y0 * x1; + return resultVec +}; +goog.vec.Vec3.distanceSquared = function(vec0, vec1) { + var x = vec0[0] - vec1[0]; + var y = vec0[1] - vec1[1]; + var z = vec0[2] - vec1[2]; + return x * x + y * y + z * z +}; +goog.vec.Vec3.distance = function(vec0, vec1) { + return Math.sqrt(goog.vec.Vec3.distanceSquared(vec0, vec1)) +}; +goog.vec.Vec3.direction = function(vec0, vec1, resultVec) { + var x = vec1[0] - vec0[0]; + var y = vec1[1] - vec0[1]; + var z = vec1[2] - vec0[2]; + var d = Math.sqrt(x * x + y * y + z * z); + if(d) { + d = 1 / d; + resultVec[0] = x * d; + resultVec[1] = y * d; + resultVec[2] = z * d + }else { + resultVec[0] = resultVec[1] = resultVec[2] = 0 + } + return resultVec +}; +goog.vec.Vec3.lerp = function(v0, v1, f, resultVec) { + var x = v0[0], y = v0[1], z = v0[2]; + resultVec[0] = (v1[0] - x) * f + x; + resultVec[1] = (v1[1] - y) * f + y; + resultVec[2] = (v1[2] - z) * f + z; + return resultVec +}; +goog.vec.Vec3.equals = function(v0, v1) { + return v0.length == v1.length && v0[0] == v1[0] && v0[1] == v1[1] && v0[2] == v1[2] +}; +goog.provide("goog.vec.Vec4"); +goog.require("goog.vec"); +goog.vec.Vec4.Float32; +goog.vec.Vec4.Float64; +goog.vec.Vec4.Number; +goog.vec.Vec4.AnyType; +goog.vec.Vec4.Type; +goog.vec.Vec4.Vec4Like; +goog.vec.Vec4.createFloat32 = function() { + return new Float32Array(4) +}; +goog.vec.Vec4.createFloat64 = function() { + return new Float64Array(4) +}; +goog.vec.Vec4.createNumber = function() { + var v = new Array(4); + goog.vec.Vec4.setFromValues(v, 0, 0, 0, 0); + return v +}; +goog.vec.Vec4.create = function() { + return new Float32Array(4) +}; +goog.vec.Vec4.createFromArray = function(vec) { + var newVec = goog.vec.Vec4.create(); + goog.vec.Vec4.setFromArray(newVec, vec); + return newVec +}; +goog.vec.Vec4.createFloat32FromArray = function(vec) { + var newVec = goog.vec.Vec4.createFloat32(); + goog.vec.Vec4.setFromArray(newVec, vec); + return newVec +}; +goog.vec.Vec4.createFloat32FromValues = function(v0, v1, v2, v3) { + var vec = goog.vec.Vec4.createFloat32(); + goog.vec.Vec4.setFromValues(vec, v0, v1, v2, v3); + return vec +}; +goog.vec.Vec4.cloneFloat32 = goog.vec.Vec4.createFloat32FromArray; +goog.vec.Vec4.createFloat64FromArray = function(vec) { + var newVec = goog.vec.Vec4.createFloat64(); + goog.vec.Vec4.setFromArray(newVec, vec); + return newVec +}; +goog.vec.Vec4.createFloat64FromValues = function(v0, v1, v2, v3) { + var vec = goog.vec.Vec4.createFloat64(); + goog.vec.Vec4.setFromValues(vec, v0, v1, v2, v3); + return vec +}; +goog.vec.Vec4.cloneFloat64 = goog.vec.Vec4.createFloat64FromArray; +goog.vec.Vec4.createFromValues = function(v0, v1, v2, v3) { + var vec = goog.vec.Vec4.create(); + goog.vec.Vec4.setFromValues(vec, v0, v1, v2, v3); + return vec +}; +goog.vec.Vec4.clone = goog.vec.Vec4.createFromArray; +goog.vec.Vec4.setFromValues = function(vec, v0, v1, v2, v3) { + vec[0] = v0; + vec[1] = v1; + vec[2] = v2; + vec[3] = v3; + return vec +}; +goog.vec.Vec4.setFromArray = function(vec, values) { + vec[0] = values[0]; + vec[1] = values[1]; + vec[2] = values[2]; + vec[3] = values[3]; + return vec +}; +goog.vec.Vec4.add = function(vec0, vec1, resultVec) { + resultVec[0] = vec0[0] + vec1[0]; + resultVec[1] = vec0[1] + vec1[1]; + resultVec[2] = vec0[2] + vec1[2]; + resultVec[3] = vec0[3] + vec1[3]; + return resultVec +}; +goog.vec.Vec4.subtract = function(vec0, vec1, resultVec) { + resultVec[0] = vec0[0] - vec1[0]; + resultVec[1] = vec0[1] - vec1[1]; + resultVec[2] = vec0[2] - vec1[2]; + resultVec[3] = vec0[3] - vec1[3]; + return resultVec +}; +goog.vec.Vec4.negate = function(vec0, resultVec) { + resultVec[0] = -vec0[0]; + resultVec[1] = -vec0[1]; + resultVec[2] = -vec0[2]; + resultVec[3] = -vec0[3]; + return resultVec +}; +goog.vec.Vec4.scale = function(vec0, scalar, resultVec) { + resultVec[0] = vec0[0] * scalar; + resultVec[1] = vec0[1] * scalar; + resultVec[2] = vec0[2] * scalar; + resultVec[3] = vec0[3] * scalar; + return resultVec +}; +goog.vec.Vec4.magnitudeSquared = function(vec0) { + var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3]; + return x * x + y * y + z * z + w * w +}; +goog.vec.Vec4.magnitude = function(vec0) { + var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3]; + return Math.sqrt(x * x + y * y + z * z + w * w) +}; +goog.vec.Vec4.normalize = function(vec0, resultVec) { + var ilen = 1 / goog.vec.Vec4.magnitude(vec0); + resultVec[0] = vec0[0] * ilen; + resultVec[1] = vec0[1] * ilen; + resultVec[2] = vec0[2] * ilen; + resultVec[3] = vec0[3] * ilen; + return resultVec +}; +goog.vec.Vec4.dot = function(v0, v1) { + return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2] + v0[3] * v1[3] +}; +goog.vec.Vec4.lerp = function(v0, v1, f, resultVec) { + var x = v0[0], y = v0[1], z = v0[2], w = v0[3]; + resultVec[0] = (v1[0] - x) * f + x; + resultVec[1] = (v1[1] - y) * f + y; + resultVec[2] = (v1[2] - z) * f + z; + resultVec[3] = (v1[3] - w) * f + w; + return resultVec +}; +goog.vec.Vec4.equals = function(v0, v1) { + return v0.length == v1.length && v0[0] == v1[0] && v0[1] == v1[1] && v0[2] == v1[2] && v0[3] == v1[3] +}; +goog.provide("goog.vec.Mat4"); +goog.require("goog.vec"); +goog.require("goog.vec.Vec3"); +goog.require("goog.vec.Vec4"); +goog.vec.Mat4.Float32; +goog.vec.Mat4.Float64; +goog.vec.Mat4.Number; +goog.vec.Mat4.AnyType; +goog.vec.Mat4.Type; +goog.vec.Mat4.Mat4Like; +goog.vec.Mat4.createFloat32 = function() { + return new Float32Array(16) +}; +goog.vec.Mat4.createFloat64 = function() { + return new Float64Array(16) +}; +goog.vec.Mat4.createNumber = function() { + var a = new Array(16); + goog.vec.Mat4.setFromValues(a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + return a +}; +goog.vec.Mat4.create = function() { + return goog.vec.Mat4.createFloat32() +}; +goog.vec.Mat4.createFloat32Identity = function() { + var mat = goog.vec.Mat4.createFloat32(); + mat[0] = mat[5] = mat[10] = mat[15] = 1; + return mat +}; +goog.vec.Mat4.createFloat64Identity = function() { + var mat = goog.vec.Mat4.createFloat64(); + mat[0] = mat[5] = mat[10] = mat[15] = 1; + return mat +}; +goog.vec.Mat4.createNumberIdentity = function() { + var a = new Array(16); + goog.vec.Mat4.setFromValues(a, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + return a +}; +goog.vec.Mat4.createIdentity = function() { + return goog.vec.Mat4.createFloat32Identity() +}; +goog.vec.Mat4.createFloat32FromArray = function(matrix) { + var newMatrix = goog.vec.Mat4.createFloat32(); + goog.vec.Mat4.setFromArray(newMatrix, matrix); + return newMatrix +}; +goog.vec.Mat4.createFloat32FromValues = function(v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23, v33) { + var newMatrix = goog.vec.Mat4.createFloat32(); + goog.vec.Mat4.setFromValues(newMatrix, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23, v33); + return newMatrix +}; +goog.vec.Mat4.cloneFloat32 = goog.vec.Mat4.createFloat32FromArray; +goog.vec.Mat4.createFloat64FromArray = function(matrix) { + var newMatrix = goog.vec.Mat4.createFloat64(); + goog.vec.Mat4.setFromArray(newMatrix, matrix); + return newMatrix +}; +goog.vec.Mat4.createFloat64FromValues = function(v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23, v33) { + var newMatrix = goog.vec.Mat4.createFloat64(); + goog.vec.Mat4.setFromValues(newMatrix, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23, v33); + return newMatrix +}; +goog.vec.Mat4.cloneFloat64 = goog.vec.Mat4.createFloat64FromArray; +goog.vec.Mat4.createFromArray = function(matrix) { + var newMatrix = goog.vec.Mat4.createFloat32(); + goog.vec.Mat4.setFromArray(newMatrix, matrix); + return newMatrix +}; +goog.vec.Mat4.createFromValues = function(v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23, v33) { + return goog.vec.Mat4.createFloat32FromValues(v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23, v33) +}; +goog.vec.Mat4.clone = goog.vec.Mat4.createFromArray; +goog.vec.Mat4.getElement = function(mat, row, column) { + return mat[row + column * 4] +}; +goog.vec.Mat4.setElement = function(mat, row, column, value) { + mat[row + column * 4] = value; + return mat +}; +goog.vec.Mat4.setFromValues = function(mat, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23, v33) { + mat[0] = v00; + mat[1] = v10; + mat[2] = v20; + mat[3] = v30; + mat[4] = v01; + mat[5] = v11; + mat[6] = v21; + mat[7] = v31; + mat[8] = v02; + mat[9] = v12; + mat[10] = v22; + mat[11] = v32; + mat[12] = v03; + mat[13] = v13; + mat[14] = v23; + mat[15] = v33; + return mat +}; +goog.vec.Mat4.setFromArray = function(mat, values) { + mat[0] = values[0]; + mat[1] = values[1]; + mat[2] = values[2]; + mat[3] = values[3]; + mat[4] = values[4]; + mat[5] = values[5]; + mat[6] = values[6]; + mat[7] = values[7]; + mat[8] = values[8]; + mat[9] = values[9]; + mat[10] = values[10]; + mat[11] = values[11]; + mat[12] = values[12]; + mat[13] = values[13]; + mat[14] = values[14]; + mat[15] = values[15]; + return mat +}; +goog.vec.Mat4.setFromRowMajorArray = function(mat, values) { + mat[0] = values[0]; + mat[1] = values[4]; + mat[2] = values[8]; + mat[3] = values[12]; + mat[4] = values[1]; + mat[5] = values[5]; + mat[6] = values[9]; + mat[7] = values[13]; + mat[8] = values[2]; + mat[9] = values[6]; + mat[10] = values[10]; + mat[11] = values[14]; + mat[12] = values[3]; + mat[13] = values[7]; + mat[14] = values[11]; + mat[15] = values[15]; + return mat +}; +goog.vec.Mat4.setDiagonalValues = function(mat, v00, v11, v22, v33) { + mat[0] = v00; + mat[5] = v11; + mat[10] = v22; + mat[15] = v33; + return mat +}; +goog.vec.Mat4.setDiagonal = function(mat, vec) { + mat[0] = vec[0]; + mat[5] = vec[1]; + mat[10] = vec[2]; + mat[15] = vec[3]; + return mat +}; +goog.vec.Mat4.getDiagonal = function(mat, vec, opt_diagonal) { + if(!opt_diagonal) { + vec[0] = mat[0]; + vec[1] = mat[5]; + vec[2] = mat[10]; + vec[3] = mat[15] + }else { + var offset = opt_diagonal > 0 ? 4 * opt_diagonal : -opt_diagonal; + for(var i = 0;i < 4 - Math.abs(opt_diagonal);i++) { + vec[i] = mat[offset + 5 * i] + } + } + return vec +}; +goog.vec.Mat4.setColumnValues = function(mat, column, v0, v1, v2, v3) { + var i = column * 4; + mat[i] = v0; + mat[i + 1] = v1; + mat[i + 2] = v2; + mat[i + 3] = v3; + return mat +}; +goog.vec.Mat4.setColumn = function(mat, column, vec) { + var i = column * 4; + mat[i] = vec[0]; + mat[i + 1] = vec[1]; + mat[i + 2] = vec[2]; + mat[i + 3] = vec[3]; + return mat +}; +goog.vec.Mat4.getColumn = function(mat, column, vec) { + var i = column * 4; + vec[0] = mat[i]; + vec[1] = mat[i + 1]; + vec[2] = mat[i + 2]; + vec[3] = mat[i + 3]; + return vec +}; +goog.vec.Mat4.setColumns = function(mat, vec0, vec1, vec2, vec3) { + goog.vec.Mat4.setColumn(mat, 0, vec0); + goog.vec.Mat4.setColumn(mat, 1, vec1); + goog.vec.Mat4.setColumn(mat, 2, vec2); + goog.vec.Mat4.setColumn(mat, 3, vec3); + return mat +}; +goog.vec.Mat4.getColumns = function(mat, vec0, vec1, vec2, vec3) { + goog.vec.Mat4.getColumn(mat, 0, vec0); + goog.vec.Mat4.getColumn(mat, 1, vec1); + goog.vec.Mat4.getColumn(mat, 2, vec2); + goog.vec.Mat4.getColumn(mat, 3, vec3) +}; +goog.vec.Mat4.setRowValues = function(mat, row, v0, v1, v2, v3) { + mat[row] = v0; + mat[row + 4] = v1; + mat[row + 8] = v2; + mat[row + 12] = v3; + return mat +}; +goog.vec.Mat4.setRow = function(mat, row, vec) { + mat[row] = vec[0]; + mat[row + 4] = vec[1]; + mat[row + 8] = vec[2]; + mat[row + 12] = vec[3]; + return mat +}; +goog.vec.Mat4.getRow = function(mat, row, vec) { + vec[0] = mat[row]; + vec[1] = mat[row + 4]; + vec[2] = mat[row + 8]; + vec[3] = mat[row + 12]; + return vec +}; +goog.vec.Mat4.setRows = function(mat, vec0, vec1, vec2, vec3) { + goog.vec.Mat4.setRow(mat, 0, vec0); + goog.vec.Mat4.setRow(mat, 1, vec1); + goog.vec.Mat4.setRow(mat, 2, vec2); + goog.vec.Mat4.setRow(mat, 3, vec3); + return mat +}; +goog.vec.Mat4.getRows = function(mat, vec0, vec1, vec2, vec3) { + goog.vec.Mat4.getRow(mat, 0, vec0); + goog.vec.Mat4.getRow(mat, 1, vec1); + goog.vec.Mat4.getRow(mat, 2, vec2); + goog.vec.Mat4.getRow(mat, 3, vec3) +}; +goog.vec.Mat4.makeZero = function(mat) { + mat[0] = 0; + mat[1] = 0; + mat[2] = 0; + mat[3] = 0; + mat[4] = 0; + mat[5] = 0; + mat[6] = 0; + mat[7] = 0; + mat[8] = 0; + mat[9] = 0; + mat[10] = 0; + mat[11] = 0; + mat[12] = 0; + mat[13] = 0; + mat[14] = 0; + mat[15] = 0; + return mat +}; +goog.vec.Mat4.makeIdentity = function(mat) { + mat[0] = 1; + mat[1] = 0; + mat[2] = 0; + mat[3] = 0; + mat[4] = 0; + mat[5] = 1; + mat[6] = 0; + mat[7] = 0; + mat[8] = 0; + mat[9] = 0; + mat[10] = 1; + mat[11] = 0; + mat[12] = 0; + mat[13] = 0; + mat[14] = 0; + mat[15] = 1; + return mat +}; +goog.vec.Mat4.addMat = function(mat0, mat1, resultMat) { + resultMat[0] = mat0[0] + mat1[0]; + resultMat[1] = mat0[1] + mat1[1]; + resultMat[2] = mat0[2] + mat1[2]; + resultMat[3] = mat0[3] + mat1[3]; + resultMat[4] = mat0[4] + mat1[4]; + resultMat[5] = mat0[5] + mat1[5]; + resultMat[6] = mat0[6] + mat1[6]; + resultMat[7] = mat0[7] + mat1[7]; + resultMat[8] = mat0[8] + mat1[8]; + resultMat[9] = mat0[9] + mat1[9]; + resultMat[10] = mat0[10] + mat1[10]; + resultMat[11] = mat0[11] + mat1[11]; + resultMat[12] = mat0[12] + mat1[12]; + resultMat[13] = mat0[13] + mat1[13]; + resultMat[14] = mat0[14] + mat1[14]; + resultMat[15] = mat0[15] + mat1[15]; + return resultMat +}; +goog.vec.Mat4.subMat = function(mat0, mat1, resultMat) { + resultMat[0] = mat0[0] - mat1[0]; + resultMat[1] = mat0[1] - mat1[1]; + resultMat[2] = mat0[2] - mat1[2]; + resultMat[3] = mat0[3] - mat1[3]; + resultMat[4] = mat0[4] - mat1[4]; + resultMat[5] = mat0[5] - mat1[5]; + resultMat[6] = mat0[6] - mat1[6]; + resultMat[7] = mat0[7] - mat1[7]; + resultMat[8] = mat0[8] - mat1[8]; + resultMat[9] = mat0[9] - mat1[9]; + resultMat[10] = mat0[10] - mat1[10]; + resultMat[11] = mat0[11] - mat1[11]; + resultMat[12] = mat0[12] - mat1[12]; + resultMat[13] = mat0[13] - mat1[13]; + resultMat[14] = mat0[14] - mat1[14]; + resultMat[15] = mat0[15] - mat1[15]; + return resultMat +}; +goog.vec.Mat4.multScalar = function(mat, scalar, resultMat) { + resultMat[0] = mat[0] * scalar; + resultMat[1] = mat[1] * scalar; + resultMat[2] = mat[2] * scalar; + resultMat[3] = mat[3] * scalar; + resultMat[4] = mat[4] * scalar; + resultMat[5] = mat[5] * scalar; + resultMat[6] = mat[6] * scalar; + resultMat[7] = mat[7] * scalar; + resultMat[8] = mat[8] * scalar; + resultMat[9] = mat[9] * scalar; + resultMat[10] = mat[10] * scalar; + resultMat[11] = mat[11] * scalar; + resultMat[12] = mat[12] * scalar; + resultMat[13] = mat[13] * scalar; + resultMat[14] = mat[14] * scalar; + resultMat[15] = mat[15] * scalar; + return resultMat +}; +goog.vec.Mat4.multMat = function(mat0, mat1, resultMat) { + var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2], a30 = mat0[3]; + var a01 = mat0[4], a11 = mat0[5], a21 = mat0[6], a31 = mat0[7]; + var a02 = mat0[8], a12 = mat0[9], a22 = mat0[10], a32 = mat0[11]; + var a03 = mat0[12], a13 = mat0[13], a23 = mat0[14], a33 = mat0[15]; + var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2], b30 = mat1[3]; + var b01 = mat1[4], b11 = mat1[5], b21 = mat1[6], b31 = mat1[7]; + var b02 = mat1[8], b12 = mat1[9], b22 = mat1[10], b32 = mat1[11]; + var b03 = mat1[12], b13 = mat1[13], b23 = mat1[14], b33 = mat1[15]; + resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30; + resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30; + resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30; + resultMat[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30; + resultMat[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31; + resultMat[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31; + resultMat[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31; + resultMat[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31; + resultMat[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32; + resultMat[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32; + resultMat[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32; + resultMat[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32; + resultMat[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33; + resultMat[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33; + resultMat[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33; + resultMat[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33; + return resultMat +}; +goog.vec.Mat4.transpose = function(mat, resultMat) { + if(resultMat == mat) { + var a10 = mat[1], a20 = mat[2], a30 = mat[3]; + var a21 = mat[6], a31 = mat[7]; + var a32 = mat[11]; + resultMat[1] = mat[4]; + resultMat[2] = mat[8]; + resultMat[3] = mat[12]; + resultMat[4] = a10; + resultMat[6] = mat[9]; + resultMat[7] = mat[13]; + resultMat[8] = a20; + resultMat[9] = a21; + resultMat[11] = mat[14]; + resultMat[12] = a30; + resultMat[13] = a31; + resultMat[14] = a32 + }else { + resultMat[0] = mat[0]; + resultMat[1] = mat[4]; + resultMat[2] = mat[8]; + resultMat[3] = mat[12]; + resultMat[4] = mat[1]; + resultMat[5] = mat[5]; + resultMat[6] = mat[9]; + resultMat[7] = mat[13]; + resultMat[8] = mat[2]; + resultMat[9] = mat[6]; + resultMat[10] = mat[10]; + resultMat[11] = mat[14]; + resultMat[12] = mat[3]; + resultMat[13] = mat[7]; + resultMat[14] = mat[11]; + resultMat[15] = mat[15] + } + return resultMat +}; +goog.vec.Mat4.determinant = function(mat) { + var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3]; + var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7]; + var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11]; + var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15]; + var a0 = m00 * m11 - m10 * m01; + var a1 = m00 * m21 - m20 * m01; + var a2 = m00 * m31 - m30 * m01; + var a3 = m10 * m21 - m20 * m11; + var a4 = m10 * m31 - m30 * m11; + var a5 = m20 * m31 - m30 * m21; + var b0 = m02 * m13 - m12 * m03; + var b1 = m02 * m23 - m22 * m03; + var b2 = m02 * m33 - m32 * m03; + var b3 = m12 * m23 - m22 * m13; + var b4 = m12 * m33 - m32 * m13; + var b5 = m22 * m33 - m32 * m23; + return a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0 +}; +goog.vec.Mat4.invert = function(mat, resultMat) { + var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3]; + var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7]; + var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11]; + var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15]; + var a0 = m00 * m11 - m10 * m01; + var a1 = m00 * m21 - m20 * m01; + var a2 = m00 * m31 - m30 * m01; + var a3 = m10 * m21 - m20 * m11; + var a4 = m10 * m31 - m30 * m11; + var a5 = m20 * m31 - m30 * m21; + var b0 = m02 * m13 - m12 * m03; + var b1 = m02 * m23 - m22 * m03; + var b2 = m02 * m33 - m32 * m03; + var b3 = m12 * m23 - m22 * m13; + var b4 = m12 * m33 - m32 * m13; + var b5 = m22 * m33 - m32 * m23; + var det = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0; + if(det == 0) { + return false + } + var idet = 1 / det; + resultMat[0] = (m11 * b5 - m21 * b4 + m31 * b3) * idet; + resultMat[1] = (-m10 * b5 + m20 * b4 - m30 * b3) * idet; + resultMat[2] = (m13 * a5 - m23 * a4 + m33 * a3) * idet; + resultMat[3] = (-m12 * a5 + m22 * a4 - m32 * a3) * idet; + resultMat[4] = (-m01 * b5 + m21 * b2 - m31 * b1) * idet; + resultMat[5] = (m00 * b5 - m20 * b2 + m30 * b1) * idet; + resultMat[6] = (-m03 * a5 + m23 * a2 - m33 * a1) * idet; + resultMat[7] = (m02 * a5 - m22 * a2 + m32 * a1) * idet; + resultMat[8] = (m01 * b4 - m11 * b2 + m31 * b0) * idet; + resultMat[9] = (-m00 * b4 + m10 * b2 - m30 * b0) * idet; + resultMat[10] = (m03 * a4 - m13 * a2 + m33 * a0) * idet; + resultMat[11] = (-m02 * a4 + m12 * a2 - m32 * a0) * idet; + resultMat[12] = (-m01 * b3 + m11 * b1 - m21 * b0) * idet; + resultMat[13] = (m00 * b3 - m10 * b1 + m20 * b0) * idet; + resultMat[14] = (-m03 * a3 + m13 * a1 - m23 * a0) * idet; + resultMat[15] = (m02 * a3 - m12 * a1 + m22 * a0) * idet; + return true +}; +goog.vec.Mat4.equals = function(mat0, mat1) { + return mat0.length == mat1.length && mat0[0] == mat1[0] && mat0[1] == mat1[1] && mat0[2] == mat1[2] && mat0[3] == mat1[3] && mat0[4] == mat1[4] && mat0[5] == mat1[5] && mat0[6] == mat1[6] && mat0[7] == mat1[7] && mat0[8] == mat1[8] && mat0[9] == mat1[9] && mat0[10] == mat1[10] && mat0[11] == mat1[11] && mat0[12] == mat1[12] && mat0[13] == mat1[13] && mat0[14] == mat1[14] && mat0[15] == mat1[15] +}; +goog.vec.Mat4.multVec3 = function(mat, vec, resultVec) { + var x = vec[0], y = vec[1], z = vec[2]; + resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + mat[12]; + resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + mat[13]; + resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + mat[14]; + return resultVec +}; +goog.vec.Mat4.multVec3NoTranslate = function(mat, vec, resultVec) { + var x = vec[0], y = vec[1], z = vec[2]; + resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8]; + resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9]; + resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10]; + return resultVec +}; +goog.vec.Mat4.multVec3Projective = function(mat, vec, resultVec) { + var x = vec[0], y = vec[1], z = vec[2]; + var invw = 1 / (x * mat[3] + y * mat[7] + z * mat[11] + mat[15]); + resultVec[0] = (x * mat[0] + y * mat[4] + z * mat[8] + mat[12]) * invw; + resultVec[1] = (x * mat[1] + y * mat[5] + z * mat[9] + mat[13]) * invw; + resultVec[2] = (x * mat[2] + y * mat[6] + z * mat[10] + mat[14]) * invw; + return resultVec +}; +goog.vec.Mat4.multVec4 = function(mat, vec, resultVec) { + var x = vec[0], y = vec[1], z = vec[2], w = vec[3]; + resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + w * mat[12]; + resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + w * mat[13]; + resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + w * mat[14]; + resultVec[3] = x * mat[3] + y * mat[7] + z * mat[11] + w * mat[15]; + return resultVec +}; +goog.vec.Mat4.makeTranslate = function(mat, x, y, z) { + goog.vec.Mat4.makeIdentity(mat); + return goog.vec.Mat4.setColumnValues(mat, 3, x, y, z, 1) +}; +goog.vec.Mat4.makeScale = function(mat, x, y, z) { + goog.vec.Mat4.makeIdentity(mat); + return goog.vec.Mat4.setDiagonalValues(mat, x, y, z, 1) +}; +goog.vec.Mat4.makeRotate = function(mat, angle, ax, ay, az) { + var c = Math.cos(angle); + var d = 1 - c; + var s = Math.sin(angle); + return goog.vec.Mat4.setFromValues(mat, ax * ax * d + c, ax * ay * d + az * s, ax * az * d - ay * s, 0, ax * ay * d - az * s, ay * ay * d + c, ay * az * d + ax * s, 0, ax * az * d + ay * s, ay * az * d - ax * s, az * az * d + c, 0, 0, 0, 0, 1) +}; +goog.vec.Mat4.makeRotateX = function(mat, angle) { + var c = Math.cos(angle); + var s = Math.sin(angle); + return goog.vec.Mat4.setFromValues(mat, 1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1) +}; +goog.vec.Mat4.makeRotateY = function(mat, angle) { + var c = Math.cos(angle); + var s = Math.sin(angle); + return goog.vec.Mat4.setFromValues(mat, c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1) +}; +goog.vec.Mat4.makeRotateZ = function(mat, angle) { + var c = Math.cos(angle); + var s = Math.sin(angle); + return goog.vec.Mat4.setFromValues(mat, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1) +}; +goog.vec.Mat4.makeFrustum = function(mat, left, right, bottom, top, near, far) { + var x = 2 * near / (right - left); + var y = 2 * near / (top - bottom); + var a = (right + left) / (right - left); + var b = (top + bottom) / (top - bottom); + var c = -(far + near) / (far - near); + var d = -(2 * far * near) / (far - near); + return goog.vec.Mat4.setFromValues(mat, x, 0, 0, 0, 0, y, 0, 0, a, b, c, -1, 0, 0, d, 0) +}; +goog.vec.Mat4.makePerspective = function(mat, fovy, aspect, near, far) { + var angle = fovy / 2; + var dz = far - near; + var sinAngle = Math.sin(angle); + if(dz == 0 || sinAngle == 0 || aspect == 0) { + return mat + } + var cot = Math.cos(angle) / sinAngle; + return goog.vec.Mat4.setFromValues(mat, cot / aspect, 0, 0, 0, 0, cot, 0, 0, 0, 0, -(far + near) / dz, -1, 0, 0, -(2 * near * far) / dz, 0) +}; +goog.vec.Mat4.makeOrtho = function(mat, left, right, bottom, top, near, far) { + var x = 2 / (right - left); + var y = 2 / (top - bottom); + var z = -2 / (far - near); + var a = -(right + left) / (right - left); + var b = -(top + bottom) / (top - bottom); + var c = -(far + near) / (far - near); + return goog.vec.Mat4.setFromValues(mat, x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, a, b, c, 1) +}; +goog.vec.Mat4.makeLookAt = function(mat, eyePt, centerPt, worldUpVec) { + var fwdVec = goog.vec.Mat4.tmpVec4_[0]; + goog.vec.Vec3.subtract(centerPt, eyePt, fwdVec); + goog.vec.Vec3.normalize(fwdVec, fwdVec); + fwdVec[3] = 0; + var sideVec = goog.vec.Mat4.tmpVec4_[1]; + goog.vec.Vec3.cross(fwdVec, worldUpVec, sideVec); + goog.vec.Vec3.normalize(sideVec, sideVec); + sideVec[3] = 0; + var upVec = goog.vec.Mat4.tmpVec4_[2]; + goog.vec.Vec3.cross(sideVec, fwdVec, upVec); + goog.vec.Vec3.normalize(upVec, upVec); + upVec[3] = 0; + goog.vec.Vec3.negate(fwdVec, fwdVec); + goog.vec.Mat4.setRow(mat, 0, sideVec); + goog.vec.Mat4.setRow(mat, 1, upVec); + goog.vec.Mat4.setRow(mat, 2, fwdVec); + goog.vec.Mat4.setRowValues(mat, 3, 0, 0, 0, 1); + goog.vec.Mat4.translate(mat, -eyePt[0], -eyePt[1], -eyePt[2]); + return mat +}; +goog.vec.Mat4.toLookAt = function(mat, eyePt, fwdVec, worldUpVec) { + var matInverse = goog.vec.Mat4.tmpMat4_[0]; + if(!goog.vec.Mat4.invert(mat, matInverse)) { + return false + } + if(eyePt) { + eyePt[0] = matInverse[12]; + eyePt[1] = matInverse[13]; + eyePt[2] = matInverse[14] + } + if(fwdVec || worldUpVec) { + if(!fwdVec) { + fwdVec = goog.vec.Mat4.tmpVec3_[0] + } + fwdVec[0] = -mat[2]; + fwdVec[1] = -mat[6]; + fwdVec[2] = -mat[10]; + goog.vec.Vec3.normalize(fwdVec, fwdVec) + } + if(worldUpVec) { + var side = goog.vec.Mat4.tmpVec3_[1]; + side[0] = mat[0]; + side[1] = mat[4]; + side[2] = mat[8]; + goog.vec.Vec3.cross(side, fwdVec, worldUpVec); + goog.vec.Vec3.normalize(worldUpVec, worldUpVec) + } + return true +}; +goog.vec.Mat4.makeEulerZXZ = function(mat, theta1, theta2, theta3) { + var c1 = Math.cos(theta1); + var s1 = Math.sin(theta1); + var c2 = Math.cos(theta2); + var s2 = Math.sin(theta2); + var c3 = Math.cos(theta3); + var s3 = Math.sin(theta3); + mat[0] = c1 * c3 - c2 * s1 * s3; + mat[1] = c2 * c1 * s3 + c3 * s1; + mat[2] = s3 * s2; + mat[3] = 0; + mat[4] = -c1 * s3 - c3 * c2 * s1; + mat[5] = c1 * c2 * c3 - s1 * s3; + mat[6] = c3 * s2; + mat[7] = 0; + mat[8] = s2 * s1; + mat[9] = -c1 * s2; + mat[10] = c2; + mat[11] = 0; + mat[12] = 0; + mat[13] = 0; + mat[14] = 0; + mat[15] = 1; + return mat +}; +goog.vec.Mat4.toEulerZXZ = function(mat, euler, opt_theta2IsNegative) { + var sinTheta2 = Math.sqrt(mat[2] * mat[2] + mat[6] * mat[6]); + var signTheta2 = opt_theta2IsNegative ? -1 : 1; + if(sinTheta2 > goog.vec.EPSILON) { + euler[2] = Math.atan2(mat[2] * signTheta2, mat[6] * signTheta2); + euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[10]); + euler[0] = Math.atan2(mat[8] * signTheta2, -mat[9] * signTheta2) + }else { + euler[0] = 0; + euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[10]); + euler[2] = Math.atan2(mat[1], mat[0]) + } + euler[0] = (euler[0] + Math.PI * 2) % (Math.PI * 2); + euler[2] = (euler[2] + Math.PI * 2) % (Math.PI * 2); + euler[1] = (euler[1] * signTheta2 + Math.PI * 2) % (Math.PI * 2) * signTheta2; + return euler +}; +goog.vec.Mat4.translate = function(mat, x, y, z) { + return goog.vec.Mat4.setColumnValues(mat, 3, mat[0] * x + mat[4] * y + mat[8] * z + mat[12], mat[1] * x + mat[5] * y + mat[9] * z + mat[13], mat[2] * x + mat[6] * y + mat[10] * z + mat[14], mat[3] * x + mat[7] * y + mat[11] * z + mat[15]) +}; +goog.vec.Mat4.scale = function(mat, x, y, z) { + return goog.vec.Mat4.setFromValues(mat, mat[0] * x, mat[1] * x, mat[2] * x, mat[3] * x, mat[4] * y, mat[5] * y, mat[6] * y, mat[7] * y, mat[8] * z, mat[9] * z, mat[10] * z, mat[11] * z, mat[12], mat[13], mat[14], mat[15]) +}; +goog.vec.Mat4.rotate = function(mat, angle, x, y, z) { + var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3]; + var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7]; + var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11]; + var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15]; + var cosAngle = Math.cos(angle); + var sinAngle = Math.sin(angle); + var diffCosAngle = 1 - cosAngle; + var r00 = x * x * diffCosAngle + cosAngle; + var r10 = x * y * diffCosAngle + z * sinAngle; + var r20 = x * z * diffCosAngle - y * sinAngle; + var r01 = x * y * diffCosAngle - z * sinAngle; + var r11 = y * y * diffCosAngle + cosAngle; + var r21 = y * z * diffCosAngle + x * sinAngle; + var r02 = x * z * diffCosAngle + y * sinAngle; + var r12 = y * z * diffCosAngle - x * sinAngle; + var r22 = z * z * diffCosAngle + cosAngle; + return goog.vec.Mat4.setFromValues(mat, m00 * r00 + m01 * r10 + m02 * r20, m10 * r00 + m11 * r10 + m12 * r20, m20 * r00 + m21 * r10 + m22 * r20, m30 * r00 + m31 * r10 + m32 * r20, m00 * r01 + m01 * r11 + m02 * r21, m10 * r01 + m11 * r11 + m12 * r21, m20 * r01 + m21 * r11 + m22 * r21, m30 * r01 + m31 * r11 + m32 * r21, m00 * r02 + m01 * r12 + m02 * r22, m10 * r02 + m11 * r12 + m12 * r22, m20 * r02 + m21 * r12 + m22 * r22, m30 * r02 + m31 * r12 + m32 * r22, m03, m13, m23, m33) +}; +goog.vec.Mat4.rotateX = function(mat, angle) { + var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7]; + var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11]; + var c = Math.cos(angle); + var s = Math.sin(angle); + mat[4] = m01 * c + m02 * s; + mat[5] = m11 * c + m12 * s; + mat[6] = m21 * c + m22 * s; + mat[7] = m31 * c + m32 * s; + mat[8] = m01 * -s + m02 * c; + mat[9] = m11 * -s + m12 * c; + mat[10] = m21 * -s + m22 * c; + mat[11] = m31 * -s + m32 * c; + return mat +}; +goog.vec.Mat4.rotateY = function(mat, angle) { + var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3]; + var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11]; + var c = Math.cos(angle); + var s = Math.sin(angle); + mat[0] = m00 * c + m02 * -s; + mat[1] = m10 * c + m12 * -s; + mat[2] = m20 * c + m22 * -s; + mat[3] = m30 * c + m32 * -s; + mat[8] = m00 * s + m02 * c; + mat[9] = m10 * s + m12 * c; + mat[10] = m20 * s + m22 * c; + mat[11] = m30 * s + m32 * c; + return mat +}; +goog.vec.Mat4.rotateZ = function(mat, angle) { + var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3]; + var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7]; + var c = Math.cos(angle); + var s = Math.sin(angle); + mat[0] = m00 * c + m01 * s; + mat[1] = m10 * c + m11 * s; + mat[2] = m20 * c + m21 * s; + mat[3] = m30 * c + m31 * s; + mat[4] = m00 * -s + m01 * c; + mat[5] = m10 * -s + m11 * c; + mat[6] = m20 * -s + m21 * c; + mat[7] = m30 * -s + m31 * c; + return mat +}; +goog.vec.Mat4.getTranslation = function(mat, translation) { + translation[0] = mat[12]; + translation[1] = mat[13]; + translation[2] = mat[14]; + return translation +}; +goog.vec.Mat4.tmpVec3_ = [goog.vec.Vec3.createFloat64(), goog.vec.Vec3.createFloat64()]; +goog.vec.Mat4.tmpVec4_ = [goog.vec.Vec4.createFloat64(), goog.vec.Vec4.createFloat64(), goog.vec.Vec4.createFloat64()]; +goog.vec.Mat4.tmpMat4_ = [goog.vec.Mat4.createFloat64()]; +goog.provide("ol.TransformFunction"); +ol.TransformFunction; +goog.provide("ol.Extent"); +goog.provide("ol.extent"); +goog.provide("ol.extent.Relationship"); +goog.require("goog.asserts"); +goog.require("goog.vec.Mat4"); +goog.require("ol.Coordinate"); +goog.require("ol.Size"); +goog.require("ol.TransformFunction"); +ol.Extent; +ol.extent.Relationship = {UNKNOWN:0, INTERSECTING:1, ABOVE:2, RIGHT:4, BELOW:8, LEFT:16}; +ol.extent.boundingExtent = function(coordinates) { + var extent = ol.extent.createEmpty(); + for(var i = 0, ii = coordinates.length;i < ii;++i) { + ol.extent.extendCoordinate(extent, coordinates[i]) + } + return extent +}; +ol.extent.boundingExtentXYs_ = function(xs, ys, opt_extent) { + goog.asserts.assert(xs.length > 0); + goog.asserts.assert(ys.length > 0); + var minX = Math.min.apply(null, xs); + var minY = Math.min.apply(null, ys); + var maxX = Math.max.apply(null, xs); + var maxY = Math.max.apply(null, ys); + return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent) +}; +ol.extent.buffer = function(extent, value, opt_extent) { + if(goog.isDef(opt_extent)) { + opt_extent[0] = extent[0] - value; + opt_extent[1] = extent[1] - value; + opt_extent[2] = extent[2] + value; + opt_extent[3] = extent[3] + value; + return opt_extent + }else { + return[extent[0] - value, extent[1] - value, extent[2] + value, extent[3] + value] + } +}; +ol.extent.clone = function(extent, opt_extent) { + if(goog.isDef(opt_extent)) { + opt_extent[0] = extent[0]; + opt_extent[1] = extent[1]; + opt_extent[2] = extent[2]; + opt_extent[3] = extent[3]; + return opt_extent + }else { + return extent.slice() + } +}; +ol.extent.closestSquaredDistanceXY = function(extent, x, y) { + var dx, dy; + if(x < extent[0]) { + dx = extent[0] - x + }else { + if(extent[2] < x) { + dx = x - extent[2] + }else { + dx = 0 + } + } + if(y < extent[1]) { + dy = extent[1] - y + }else { + if(extent[3] < y) { + dy = y - extent[3] + }else { + dy = 0 + } + } + return dx * dx + dy * dy +}; +ol.extent.containsCoordinate = function(extent, coordinate) { + return extent[0] <= coordinate[0] && coordinate[0] <= extent[2] && extent[1] <= coordinate[1] && coordinate[1] <= extent[3] +}; +ol.extent.containsExtent = function(extent1, extent2) { + return extent1[0] <= extent2[0] && extent2[2] <= extent1[2] && extent1[1] <= extent2[1] && extent2[3] <= extent1[3] +}; +ol.extent.coordinateRelationship = function(extent, coordinate) { + var minX = extent[0]; + var minY = extent[1]; + var maxX = extent[2]; + var maxY = extent[3]; + var x = coordinate[0]; + var y = coordinate[1]; + var relationship = ol.extent.Relationship.UNKNOWN; + if(x < minX) { + relationship = relationship | ol.extent.Relationship.LEFT + }else { + if(x > maxX) { + relationship = relationship | ol.extent.Relationship.RIGHT + } + } + if(y < minY) { + relationship = relationship | ol.extent.Relationship.BELOW + }else { + if(y > maxY) { + relationship = relationship | ol.extent.Relationship.ABOVE + } + } + if(relationship === ol.extent.Relationship.UNKNOWN) { + relationship = ol.extent.Relationship.INTERSECTING + } + return relationship +}; +ol.extent.createEmpty = function() { + return[Infinity, Infinity, -Infinity, -Infinity] +}; +ol.extent.createOrUpdate = function(minX, minY, maxX, maxY, opt_extent) { + if(goog.isDef(opt_extent)) { + opt_extent[0] = minX; + opt_extent[1] = minY; + opt_extent[2] = maxX; + opt_extent[3] = maxY; + return opt_extent + }else { + return[minX, minY, maxX, maxY] + } +}; +ol.extent.createOrUpdateEmpty = function(opt_extent) { + return ol.extent.createOrUpdate(Infinity, Infinity, -Infinity, -Infinity, opt_extent) +}; +ol.extent.createOrUpdateFromCoordinate = function(coordinate, opt_extent) { + var x = coordinate[0]; + var y = coordinate[1]; + return ol.extent.createOrUpdate(x, y, x, y, opt_extent) +}; +ol.extent.createOrUpdateFromCoordinates = function(coordinates, opt_extent) { + var extent = ol.extent.createOrUpdateEmpty(opt_extent); + return ol.extent.extendCoordinates(extent, coordinates) +}; +ol.extent.createOrUpdateFromFlatCoordinates = function(flatCoordinates, offset, end, stride, opt_extent) { + var extent = ol.extent.createOrUpdateEmpty(opt_extent); + return ol.extent.extendFlatCoordinates(extent, flatCoordinates, offset, end, stride) +}; +ol.extent.createOrUpdateFromRings = function(rings, opt_extent) { + var extent = ol.extent.createOrUpdateEmpty(opt_extent); + return ol.extent.extendRings(extent, rings) +}; +ol.extent.empty = function(extent) { + extent[0] = extent[1] = Infinity; + extent[2] = extent[3] = -Infinity; + return extent +}; +ol.extent.equals = function(extent1, extent2) { + return extent1[0] == extent2[0] && extent1[2] == extent2[2] && extent1[1] == extent2[1] && extent1[3] == extent2[3] +}; +ol.extent.extend = function(extent1, extent2) { + if(extent2[0] < extent1[0]) { + extent1[0] = extent2[0] + } + if(extent2[2] > extent1[2]) { + extent1[2] = extent2[2] + } + if(extent2[1] < extent1[1]) { + extent1[1] = extent2[1] + } + if(extent2[3] > extent1[3]) { + extent1[3] = extent2[3] + } + return extent1 +}; +ol.extent.extendCoordinate = function(extent, coordinate) { + if(coordinate[0] < extent[0]) { + extent[0] = coordinate[0] + } + if(coordinate[0] > extent[2]) { + extent[2] = coordinate[0] + } + if(coordinate[1] < extent[1]) { + extent[1] = coordinate[1] + } + if(coordinate[1] > extent[3]) { + extent[3] = coordinate[1] + } +}; +ol.extent.extendCoordinates = function(extent, coordinates) { + var i, ii; + for(i = 0, ii = coordinates.length;i < ii;++i) { + ol.extent.extendCoordinate(extent, coordinates[i]) + } + return extent +}; +ol.extent.extendFlatCoordinates = function(extent, flatCoordinates, offset, end, stride) { + for(;offset < end;offset += stride) { + ol.extent.extendXY(extent, flatCoordinates[offset], flatCoordinates[offset + 1]) + } + return extent +}; +ol.extent.extendRings = function(extent, rings) { + var i, ii; + for(i = 0, ii = rings.length;i < ii;++i) { + ol.extent.extendCoordinates(extent, rings[i]) + } + return extent +}; +ol.extent.extendXY = function(extent, x, y) { + extent[0] = Math.min(extent[0], x); + extent[1] = Math.min(extent[1], y); + extent[2] = Math.max(extent[2], x); + extent[3] = Math.max(extent[3], y) +}; +ol.extent.getArea = function(extent) { + return ol.extent.getWidth(extent) * ol.extent.getHeight(extent) +}; +ol.extent.getBottomLeft = function(extent) { + return[extent[0], extent[1]] +}; +ol.extent.getBottomRight = function(extent) { + return[extent[2], extent[1]] +}; +ol.extent.getCenter = function(extent) { + return[(extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2] +}; +ol.extent.getEnlargedArea = function(extent1, extent2) { + var minX = Math.min(extent1[0], extent2[0]); + var minY = Math.min(extent1[1], extent2[1]); + var maxX = Math.max(extent1[2], extent2[2]); + var maxY = Math.max(extent1[3], extent2[3]); + return(maxX - minX) * (maxY - minY) +}; +ol.extent.getForView2DAndSize = function(center, resolution, rotation, size, opt_extent) { + var dx = resolution * size[0] / 2; + var dy = resolution * size[1] / 2; + var cosRotation = Math.cos(rotation); + var sinRotation = Math.sin(rotation); + var xs = [-dx, -dx, dx, dx]; + var ys = [-dy, dy, -dy, dy]; + var i, x, y; + for(i = 0;i < 4;++i) { + x = xs[i]; + y = ys[i]; + xs[i] = center[0] + x * cosRotation - y * sinRotation; + ys[i] = center[1] + x * sinRotation + y * cosRotation + } + return ol.extent.boundingExtentXYs_(xs, ys, opt_extent) +}; +ol.extent.getHeight = function(extent) { + return extent[3] - extent[1] +}; +ol.extent.getIntersectionArea = function(extent1, extent2) { + var minX = Math.max(extent1[0], extent2[0]); + var minY = Math.max(extent1[1], extent2[1]); + var maxX = Math.min(extent1[2], extent2[2]); + var maxY = Math.min(extent1[3], extent2[3]); + return Math.max(0, maxX - minX) * Math.max(0, maxY - minY) +}; +ol.extent.getMargin = function(extent) { + return ol.extent.getWidth(extent) + ol.extent.getHeight(extent) +}; +ol.extent.getSize = function(extent) { + return[extent[2] - extent[0], extent[3] - extent[1]] +}; +ol.extent.getTopLeft = function(extent) { + return[extent[0], extent[3]] +}; +ol.extent.getTopRight = function(extent) { + return[extent[2], extent[3]] +}; +ol.extent.getWidth = function(extent) { + return extent[2] - extent[0] +}; +ol.extent.intersects = function(extent1, extent2) { + return extent1[0] <= extent2[2] && extent1[2] >= extent2[0] && extent1[1] <= extent2[3] && extent1[3] >= extent2[1] +}; +ol.extent.isEmpty = function(extent) { + return extent[2] < extent[0] || extent[3] < extent[1] +}; +ol.extent.normalize = function(extent, coordinate) { + return[(coordinate[0] - extent[0]) / (extent[2] - extent[0]), (coordinate[1] - extent[1]) / (extent[3] - extent[1])] +}; +ol.extent.returnOrUpdate = function(extent, opt_extent) { + if(goog.isDef(opt_extent)) { + opt_extent[0] = extent[0]; + opt_extent[1] = extent[1]; + opt_extent[2] = extent[2]; + opt_extent[3] = extent[3]; + return opt_extent + }else { + return extent + } +}; +ol.extent.scaleFromCenter = function(extent, value) { + var deltaX = (extent[2] - extent[0]) / 2 * (value - 1); + var deltaY = (extent[3] - extent[1]) / 2 * (value - 1); + extent[0] -= deltaX; + extent[2] += deltaX; + extent[1] -= deltaY; + extent[3] += deltaY +}; +ol.extent.segmentIntersects = function(extent, start, end) { + var intersects = false; + var startRel = ol.extent.coordinateRelationship(extent, start); + var endRel = ol.extent.coordinateRelationship(extent, end); + if(startRel === ol.extent.Relationship.INTERSECTING || endRel === ol.extent.Relationship.INTERSECTING) { + intersects = true + }else { + var minX = extent[0]; + var minY = extent[1]; + var maxX = extent[2]; + var maxY = extent[3]; + var startX = start[0]; + var startY = start[1]; + var endX = end[0]; + var endY = end[1]; + var slope = (endY - startY) / (endX - startX); + var x, y; + if(!!(endRel & ol.extent.Relationship.ABOVE) && !(startRel & ol.extent.Relationship.ABOVE)) { + x = endX - (endY - maxY) / slope; + intersects = x >= minX && x <= maxX + }else { + if(!!(endRel & ol.extent.Relationship.RIGHT) && !(startRel & ol.extent.Relationship.RIGHT)) { + y = endY - (endX - maxX) * slope; + intersects = y >= minY && y <= maxY + }else { + if(!!(endRel & ol.extent.Relationship.BELOW) && !(startRel & ol.extent.Relationship.BELOW)) { + x = endX - (endY - minY) / slope; + intersects = x >= minX && x <= maxX + }else { + if(!!(endRel & ol.extent.Relationship.LEFT) && !(startRel & ol.extent.Relationship.LEFT)) { + y = endY - (endX - minX) * slope; + intersects = y >= minY && y <= maxY + } + } + } + } + } + return intersects +}; +ol.extent.touches = function(extent1, extent2) { + var intersects = ol.extent.intersects(extent1, extent2); + return intersects && (extent1[0] == extent2[2] || extent1[2] == extent2[0] || extent1[1] == extent2[3] || extent1[3] == extent2[1]) +}; +ol.extent.transform = function(extent, transformFn, opt_extent) { + var coordinates = [extent[0], extent[1], extent[0], extent[3], extent[2], extent[1], extent[2], extent[3]]; + transformFn(coordinates, coordinates, 2); + var xs = [coordinates[0], coordinates[2], coordinates[4], coordinates[6]]; + var ys = [coordinates[1], coordinates[3], coordinates[5], coordinates[7]]; + return ol.extent.boundingExtentXYs_(xs, ys, opt_extent) +}; +ol.extent.transform2D = function(extent, transform, opt_extent) { + var dest = goog.isDef(opt_extent) ? opt_extent : []; + var m00 = goog.vec.Mat4.getElement(transform, 0, 0); + var m10 = goog.vec.Mat4.getElement(transform, 1, 0); + var m01 = goog.vec.Mat4.getElement(transform, 0, 1); + var m11 = goog.vec.Mat4.getElement(transform, 1, 1); + var m03 = goog.vec.Mat4.getElement(transform, 0, 3); + var m13 = goog.vec.Mat4.getElement(transform, 1, 3); + var xi = [0, 2, 0, 2]; + var yi = [1, 1, 3, 3]; + var xs = []; + var ys = []; + var i, x, y; + for(i = 0;i < 4;++i) { + x = extent[xi[i]]; + y = extent[yi[i]]; + xs[i] = m00 * x + m01 * y + m03; + ys[i] = m10 * x + m11 * y + m13 + } + dest[0] = Math.min.apply(null, xs); + dest[1] = Math.min.apply(null, ys); + dest[2] = Math.max.apply(null, xs); + dest[3] = Math.max.apply(null, ys); + return dest +}; +goog.provide("ol.Tile"); +goog.provide("ol.TileState"); +goog.require("goog.events"); +goog.require("goog.events.EventTarget"); +goog.require("goog.events.EventType"); +goog.require("ol.TileCoord"); +ol.TileState = {IDLE:0, LOADING:1, LOADED:2, ERROR:3, EMPTY:4}; +ol.Tile = function(tileCoord, state) { + goog.base(this); + this.tileCoord = tileCoord; + this.state = state +}; +goog.inherits(ol.Tile, goog.events.EventTarget); +ol.Tile.prototype.dispatchChangeEvent = function() { + this.dispatchEvent(goog.events.EventType.CHANGE) +}; +ol.Tile.prototype.getImage = goog.abstractMethod; +ol.Tile.prototype.getKey = function() { + return goog.getUid(this).toString() +}; +ol.Tile.prototype.getTileCoord = function() { + return this.tileCoord +}; +ol.Tile.prototype.getState = function() { + return this.state +}; +ol.Tile.prototype.load = goog.abstractMethod; +goog.provide("ol.structs.PriorityQueue"); +goog.require("goog.asserts"); +goog.require("goog.object"); +ol.structs.PriorityQueue = function(priorityFunction, keyFunction) { + this.priorityFunction_ = priorityFunction; + this.keyFunction_ = keyFunction; + this.elements_ = []; + this.priorities_ = []; + this.queuedElements_ = {} +}; +ol.structs.PriorityQueue.DROP = Infinity; +ol.structs.PriorityQueue.prototype.assertValid = function() { + var elements = this.elements_; + var priorities = this.priorities_; + var n = elements.length; + goog.asserts.assert(priorities.length == n); + var i, priority; + for(i = 0;i < (n >> 1) - 1;++i) { + priority = priorities[i]; + goog.asserts.assert(priority <= priorities[this.getLeftChildIndex_(i)]); + goog.asserts.assert(priority <= priorities[this.getRightChildIndex_(i)]) + } +}; +ol.structs.PriorityQueue.prototype.clear = function() { + this.elements_.length = 0; + this.priorities_.length = 0; + goog.object.clear(this.queuedElements_) +}; +ol.structs.PriorityQueue.prototype.dequeue = function() { + var elements = this.elements_; + goog.asserts.assert(elements.length > 0); + var priorities = this.priorities_; + var element = elements[0]; + if(elements.length == 1) { + elements.length = 0; + priorities.length = 0 + }else { + elements[0] = elements.pop(); + priorities[0] = priorities.pop(); + this.siftUp_(0) + } + var elementKey = this.keyFunction_(element); + goog.asserts.assert(elementKey in this.queuedElements_); + delete this.queuedElements_[elementKey]; + return element +}; +ol.structs.PriorityQueue.prototype.enqueue = function(element) { + goog.asserts.assert(!(this.keyFunction_(element) in this.queuedElements_)); + var priority = this.priorityFunction_(element); + if(priority != ol.structs.PriorityQueue.DROP) { + this.elements_.push(element); + this.priorities_.push(priority); + this.queuedElements_[this.keyFunction_(element)] = true; + this.siftDown_(0, this.elements_.length - 1) + } +}; +ol.structs.PriorityQueue.prototype.getCount = function() { + return this.elements_.length +}; +ol.structs.PriorityQueue.prototype.getLeftChildIndex_ = function(index) { + return index * 2 + 1 +}; +ol.structs.PriorityQueue.prototype.getRightChildIndex_ = function(index) { + return index * 2 + 2 +}; +ol.structs.PriorityQueue.prototype.getParentIndex_ = function(index) { + return index - 1 >> 1 +}; +ol.structs.PriorityQueue.prototype.heapify_ = function() { + var i; + for(i = (this.elements_.length >> 1) - 1;i >= 0;i--) { + this.siftUp_(i) + } +}; +ol.structs.PriorityQueue.prototype.isEmpty = function() { + return this.elements_.length === 0 +}; +ol.structs.PriorityQueue.prototype.isKeyQueued = function(key) { + return key in this.queuedElements_ +}; +ol.structs.PriorityQueue.prototype.isQueued = function(element) { + return this.isKeyQueued(this.keyFunction_(element)) +}; +ol.structs.PriorityQueue.prototype.siftUp_ = function(index) { + var elements = this.elements_; + var priorities = this.priorities_; + var count = elements.length; + var element = elements[index]; + var priority = priorities[index]; + var startIndex = index; + while(index < count >> 1) { + var lIndex = this.getLeftChildIndex_(index); + var rIndex = this.getRightChildIndex_(index); + var smallerChildIndex = rIndex < count && priorities[rIndex] < priorities[lIndex] ? rIndex : lIndex; + elements[index] = elements[smallerChildIndex]; + priorities[index] = priorities[smallerChildIndex]; + index = smallerChildIndex + } + elements[index] = element; + priorities[index] = priority; + this.siftDown_(startIndex, index) +}; +ol.structs.PriorityQueue.prototype.siftDown_ = function(startIndex, index) { + var elements = this.elements_; + var priorities = this.priorities_; + var element = elements[index]; + var priority = priorities[index]; + while(index > startIndex) { + var parentIndex = this.getParentIndex_(index); + if(priorities[parentIndex] > priority) { + elements[index] = elements[parentIndex]; + priorities[index] = priorities[parentIndex]; + index = parentIndex + }else { + break + } + } + elements[index] = element; + priorities[index] = priority +}; +ol.structs.PriorityQueue.prototype.reprioritize = function() { + var priorityFunction = this.priorityFunction_; + var elements = this.elements_; + var priorities = this.priorities_; + var index = 0; + var n = elements.length; + var element, i, priority; + for(i = 0;i < n;++i) { + element = elements[i]; + priority = priorityFunction(element); + if(priority == ol.structs.PriorityQueue.DROP) { + delete this.queuedElements_[this.keyFunction_(element)] + }else { + priorities[index] = priority; + elements[index++] = element + } + } + elements.length = index; + priorities.length = index; + this.heapify_() +}; +goog.provide("ol.TilePriorityFunction"); +goog.provide("ol.TileQueue"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("ol.Coordinate"); +goog.require("ol.Tile"); +goog.require("ol.structs.PriorityQueue"); +ol.TilePriorityFunction; +ol.TileQueue = function(tilePriorityFunction, tileChangeCallback) { + goog.base(this, function(element) { + return tilePriorityFunction.apply(null, element) + }, function(element) { + return(element[0]).getKey() + }); + this.tileChangeCallback_ = tileChangeCallback; + this.tilesLoading_ = 0 +}; +goog.inherits(ol.TileQueue, ol.structs.PriorityQueue); +ol.TileQueue.prototype.getTilesLoading = function() { + return this.tilesLoading_ +}; +ol.TileQueue.prototype.handleTileChange = function() { + --this.tilesLoading_; + this.tileChangeCallback_() +}; +ol.TileQueue.prototype.loadMoreTiles = function(maxTotalLoading, maxNewLoads) { + var newLoads = Math.min(maxTotalLoading - this.getTilesLoading(), maxNewLoads, this.getCount()); + var i, tile; + for(i = 0;i < newLoads;++i) { + tile = (this.dequeue()[0]); + goog.events.listenOnce(tile, goog.events.EventType.CHANGE, this.handleTileChange, false, this); + tile.load() + } + this.tilesLoading_ += newLoads +}; +goog.provide("ol.IView2D"); +goog.provide("ol.View2DState"); +goog.require("ol.Coordinate"); +ol.View2DState; +ol.IView2D = function() { +}; +ol.IView2D.prototype.getCenter = function() { +}; +ol.IView2D.prototype.getProjection = function() { +}; +ol.IView2D.prototype.getResolution = function() { +}; +ol.IView2D.prototype.getRotation = function() { +}; +ol.IView2D.prototype.getView2DState = function() { +}; +ol.IView2D.prototype.isDef = function() { +}; +/* + + Latitude/longitude spherical geodesy formulae taken from + http://www.movable-type.co.uk/scripts/latlong.html + Licenced under CC-BY-3.0. +*/ +goog.provide("ol.Sphere"); +goog.require("goog.math"); +ol.Sphere = function(radius) { + this.radius = radius +}; +ol.Sphere.prototype.cosineDistance = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + return this.radius * Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(deltaLon)) +}; +ol.Sphere.prototype.crossTrackDistance = function(c1, c2, c3) { + var d13 = this.cosineDistance(c1, c2); + var theta12 = goog.math.toRadians(this.initialBearing(c1, c2)); + var theta13 = goog.math.toRadians(this.initialBearing(c1, c3)); + return this.radius * Math.asin(Math.sin(d13 / this.radius) * Math.sin(theta13 - theta12)) +}; +ol.Sphere.prototype.equirectangularDistance = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + var x = deltaLon * Math.cos((lat1 + lat2) / 2); + var y = lat2 - lat1; + return this.radius * Math.sqrt(x * x + y * y) +}; +ol.Sphere.prototype.finalBearing = function(c1, c2) { + return(this.initialBearing(c2, c1) + 180) % 360 +}; +ol.Sphere.prototype.haversineDistance = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLatBy2 = (lat2 - lat1) / 2; + var deltaLonBy2 = goog.math.toRadians(c2[0] - c1[0]) / 2; + var a = Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) + Math.sin(deltaLonBy2) * Math.sin(deltaLonBy2) * Math.cos(lat1) * Math.cos(lat2); + return 2 * this.radius * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) +}; +ol.Sphere.prototype.initialBearing = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + var y = Math.sin(deltaLon) * Math.cos(lat2); + var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(deltaLon); + return goog.math.toDegrees(Math.atan2(y, x)) +}; +ol.Sphere.prototype.maximumLatitude = function(bearing, latitude) { + return Math.cos(Math.abs(Math.sin(goog.math.toRadians(bearing)) * Math.cos(goog.math.toRadians(latitude)))) +}; +ol.Sphere.prototype.midpoint = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var lon1 = goog.math.toRadians(c1[0]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + var Bx = Math.cos(lat2) * Math.cos(deltaLon); + var By = Math.cos(lat2) * Math.sin(deltaLon); + var cosLat1PlusBx = Math.cos(lat1) + Bx; + var lat = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt(cosLat1PlusBx * cosLat1PlusBx + By * By)); + var lon = lon1 + Math.atan2(By, cosLat1PlusBx); + return[goog.math.toDegrees(lon), goog.math.toDegrees(lat)] +}; +ol.Sphere.prototype.offset = function(c1, distance, bearing) { + var lat1 = goog.math.toRadians(c1[1]); + var lon1 = goog.math.toRadians(c1[0]); + var dByR = distance / this.radius; + var lat = Math.asin(Math.sin(lat1) * Math.cos(dByR) + Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing)); + var lon = lon1 + Math.atan2(Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1), Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat)); + return[goog.math.toDegrees(lon), goog.math.toDegrees(lat)] +}; +goog.provide("ol.sphere.NORMAL"); +goog.require("ol.Sphere"); +ol.sphere.NORMAL = new ol.Sphere(6370997); +goog.provide("ol.proj"); +goog.provide("ol.proj.METERS_PER_UNIT"); +goog.provide("ol.proj.Projection"); +goog.provide("ol.proj.ProjectionLike"); +goog.provide("ol.proj.Units"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.object"); +goog.require("ol.Extent"); +goog.require("ol.TransformFunction"); +goog.require("ol.sphere.NORMAL"); +ol.ENABLE_PROJ4JS = true; +ol.HAVE_PROJ4JS = ol.ENABLE_PROJ4JS && typeof Proj4js == "object"; +ol.proj.ProjectionLike; +ol.proj.Units = {DEGREES:"degrees", FEET:"ft", METERS:"m", PIXELS:"pixels"}; +ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] = 2 * Math.PI * ol.sphere.NORMAL.radius / 360; +ol.proj.METERS_PER_UNIT[ol.proj.Units.FEET] = 0.3048; +ol.proj.METERS_PER_UNIT[ol.proj.Units.METERS] = 1; +ol.proj.Projection = function(options) { + this.code_ = options.code; + this.units_ = (options.units); + this.extent_ = goog.isDef(options.extent) ? options.extent : null; + this.axisOrientation_ = goog.isDef(options.axisOrientation) ? options.axisOrientation : "enu"; + this.global_ = goog.isDef(options.global) ? options.global : false; + this.defaultTileGrid_ = null +}; +ol.proj.Projection.prototype.getCode = function() { + return this.code_ +}; +ol.proj.Projection.prototype.getExtent = function() { + return this.extent_ +}; +ol.proj.Projection.prototype.getPointResolution = goog.abstractMethod; +ol.proj.Projection.prototype.getUnits = function() { + return this.units_ +}; +ol.proj.Projection.prototype.getMetersPerUnit = function() { + return ol.proj.METERS_PER_UNIT[this.units_] +}; +ol.proj.Projection.prototype.getAxisOrientation = function() { + return this.axisOrientation_ +}; +ol.proj.Projection.prototype.isGlobal = function() { + return this.global_ +}; +ol.proj.Projection.prototype.getDefaultTileGrid = function() { + return this.defaultTileGrid_ +}; +ol.proj.Projection.prototype.setDefaultTileGrid = function(tileGrid) { + this.defaultTileGrid_ = tileGrid +}; +ol.Proj4jsProjection_ = function(proj4jsProj, options) { + var units = (proj4jsProj.units); + var config = ({units:units, axisOrientation:proj4jsProj.axis}); + goog.object.extend(config, options); + goog.base(this, config); + this.proj4jsProj_ = proj4jsProj; + this.toEPSG4326_ = null +}; +goog.inherits(ol.Proj4jsProjection_, ol.proj.Projection); +ol.Proj4jsProjection_.prototype.getMetersPerUnit = function() { + var metersPerUnit = this.proj4jsProj_.to_meter; + if(!goog.isDef(metersPerUnit)) { + metersPerUnit = ol.proj.METERS_PER_UNIT[this.units_] + } + return metersPerUnit +}; +ol.Proj4jsProjection_.prototype.getPointResolution = function(resolution, point) { + if(this.getUnits() == ol.proj.Units.DEGREES) { + return resolution + }else { + if(goog.isNull(this.toEPSG4326_)) { + this.toEPSG4326_ = ol.proj.getTransformFromProjections(this, ol.proj.getProj4jsProjectionFromCode_({code:"EPSG:4326", extent:null})) + } + var vertices = [point[0] - resolution / 2, point[1], point[0] + resolution / 2, point[1], point[0], point[1] - resolution / 2, point[0], point[1] + resolution / 2]; + vertices = this.toEPSG4326_(vertices, vertices, 2); + var width = ol.sphere.NORMAL.haversineDistance(vertices.slice(0, 2), vertices.slice(2, 4)); + var height = ol.sphere.NORMAL.haversineDistance(vertices.slice(4, 6), vertices.slice(6, 8)); + var pointResolution = (width + height) / 2; + if(this.getUnits() == ol.proj.Units.FEET) { + pointResolution /= 0.3048 + } + return pointResolution + } +}; +ol.Proj4jsProjection_.prototype.getProj4jsProj = function() { + return this.proj4jsProj_ +}; +ol.proj.proj4jsProjections_ = {}; +ol.proj.projections_ = {}; +ol.proj.transforms_ = {}; +ol.proj.addEquivalentProjections = function(projections) { + ol.proj.addProjections(projections); + goog.array.forEach(projections, function(source) { + goog.array.forEach(projections, function(destination) { + if(source !== destination) { + ol.proj.addTransform(source, destination, ol.proj.cloneTransform) + } + }) + }) +}; +ol.proj.addEquivalentTransforms = function(projections1, projections2, forwardTransform, inverseTransform) { + goog.array.forEach(projections1, function(projection1) { + goog.array.forEach(projections2, function(projection2) { + ol.proj.addTransform(projection1, projection2, forwardTransform); + ol.proj.addTransform(projection2, projection1, inverseTransform) + }) + }) +}; +ol.proj.addProj4jsProjection_ = function(proj4jsProjection) { + var proj4jsProjections = ol.proj.proj4jsProjections_; + var code = proj4jsProjection.getCode(); + goog.asserts.assert(!goog.object.containsKey(proj4jsProjections, code)); + proj4jsProjections[code] = proj4jsProjection +}; +ol.proj.addProjection = function(projection) { + var projections = ol.proj.projections_; + var code = projection.getCode(); + projections[code] = projection; + ol.proj.addTransform(projection, projection, ol.proj.cloneTransform) +}; +ol.proj.addProjections = function(projections) { + goog.array.forEach(projections, function(projection) { + ol.proj.addProjection(projection) + }) +}; +ol.proj.clearAllProjections = function() { + if(ol.ENABLE_PROJ4JS) { + ol.proj.proj4jsProjections_ = {} + } + ol.proj.projections_ = {}; + ol.proj.transforms_ = {} +}; +ol.proj.createProjection = function(projection, defaultCode) { + if(!goog.isDefAndNotNull(projection)) { + return ol.proj.get(defaultCode) + }else { + if(goog.isString(projection)) { + return ol.proj.get(projection) + }else { + goog.asserts.assertInstanceof(projection, ol.proj.Projection); + return projection + } + } +}; +ol.proj.addTransform = function(source, destination, transformFn) { + var sourceCode = source.getCode(); + var destinationCode = destination.getCode(); + var transforms = ol.proj.transforms_; + if(!goog.object.containsKey(transforms, sourceCode)) { + transforms[sourceCode] = {} + } + transforms[sourceCode][destinationCode] = transformFn +}; +ol.proj.removeTransform = function(source, destination) { + var sourceCode = source.getCode(); + var destinationCode = destination.getCode(); + var transforms = ol.proj.transforms_; + goog.asserts.assert(sourceCode in transforms); + goog.asserts.assert(destinationCode in transforms[sourceCode]); + var transform = transforms[sourceCode][destinationCode]; + delete transforms[sourceCode][destinationCode]; + var keys = goog.object.getKeys(transforms[sourceCode]); + if(keys.length === 0) { + delete transforms[sourceCode] + } + return transform +}; +ol.proj.get = function(projectionLike) { + var projection; + if(projectionLike instanceof ol.proj.Projection) { + projection = projectionLike + }else { + if(goog.isString(projectionLike)) { + var code = projectionLike; + projection = ol.proj.projections_[code]; + if(ol.HAVE_PROJ4JS && !goog.isDef(projection)) { + projection = ol.proj.getProj4jsProjectionFromCode_({code:code, extent:null}) + } + if(!goog.isDef(projection)) { + goog.asserts.assert(goog.isDef(projection)); + projection = null + } + }else { + projection = null + } + } + return projection +}; +ol.proj.getProj4jsProjectionFromCode_ = function(options) { + var code = options.code; + var proj4jsProjections = ol.proj.proj4jsProjections_; + var proj4jsProjection = proj4jsProjections[code]; + if(!goog.isDef(proj4jsProjection)) { + var proj4jsProj = new Proj4js.Proj(code); + var srsCode = proj4jsProj.srsCode; + proj4jsProjection = proj4jsProjections[srsCode]; + if(!goog.isDef(proj4jsProjection)) { + var config = (goog.object.clone(options)); + config.code = srsCode; + proj4jsProjection = new ol.Proj4jsProjection_(proj4jsProj, config); + proj4jsProjections[srsCode] = proj4jsProjection + } + proj4jsProjections[code] = proj4jsProjection + } + return proj4jsProjection +}; +ol.proj.equivalent = function(projection1, projection2) { + if(projection1 === projection2) { + return true + }else { + if(projection1.getUnits() != projection2.getUnits()) { + return false + }else { + var transformFn = ol.proj.getTransformFromProjections(projection1, projection2); + return transformFn === ol.proj.cloneTransform + } + } +}; +ol.proj.getTransform = function(source, destination) { + var sourceProjection = ol.proj.get(source); + var destinationProjection = ol.proj.get(destination); + return ol.proj.getTransformFromProjections(sourceProjection, destinationProjection) +}; +ol.proj.getTransformFromProjections = function(sourceProjection, destinationProjection) { + var transforms = ol.proj.transforms_; + var sourceCode = sourceProjection.getCode(); + var destinationCode = destinationProjection.getCode(); + var transform; + if(goog.object.containsKey(transforms, sourceCode) && goog.object.containsKey(transforms[sourceCode], destinationCode)) { + transform = transforms[sourceCode][destinationCode] + } + if(ol.HAVE_PROJ4JS && !goog.isDef(transform)) { + var proj4jsSource; + if(sourceProjection instanceof ol.Proj4jsProjection_) { + proj4jsSource = sourceProjection + }else { + proj4jsSource = ol.proj.getProj4jsProjectionFromCode_({code:sourceCode, extent:null}) + } + var sourceProj4jsProj = proj4jsSource.getProj4jsProj(); + var proj4jsDestination; + if(destinationProjection instanceof ol.Proj4jsProjection_) { + proj4jsDestination = destinationProjection + }else { + proj4jsDestination = ol.proj.getProj4jsProjectionFromCode_({code:destinationCode, extent:null}) + } + var destinationProj4jsProj = proj4jsDestination.getProj4jsProj(); + transform = function(input, opt_output, opt_dimension) { + var length = input.length, dimension = opt_dimension > 1 ? opt_dimension : 2, output = opt_output; + if(!goog.isDef(output)) { + if(dimension > 2) { + output = input.slice() + }else { + output = new Array(length) + } + } + goog.asserts.assert(output.length % dimension === 0); + var proj4jsPoint; + for(var i = 0;i < length;i += dimension) { + proj4jsPoint = new Proj4js.Point(input[i], input[i + 1]); + proj4jsPoint = Proj4js.transform(sourceProj4jsProj, destinationProj4jsProj, proj4jsPoint); + output[i] = proj4jsPoint.x; + output[i + 1] = proj4jsPoint.y + } + return output + }; + ol.proj.addTransform(sourceProjection, destinationProjection, transform) + } + if(!goog.isDef(transform)) { + goog.asserts.assert(goog.isDef(transform)); + transform = ol.proj.identityTransform + } + return transform +}; +ol.proj.identityTransform = function(input, opt_output, opt_dimension) { + if(goog.isDef(opt_output) && input !== opt_output) { + goog.asserts.fail("This should not be used internally."); + for(var i = 0, ii = input.length;i < ii;++i) { + opt_output[i] = input[i] + } + input = opt_output + } + return input +}; +ol.proj.cloneTransform = function(input, opt_output, opt_dimension) { + var output; + if(goog.isDef(opt_output)) { + for(var i = 0, ii = input.length;i < ii;++i) { + opt_output[i] = input[i] + } + output = opt_output + }else { + output = input.slice() + } + return output +}; +ol.proj.transform = function(point, source, destination) { + var transformFn = ol.proj.getTransform(source, destination); + return transformFn(point) +}; +ol.proj.transformWithProjections = function(point, sourceProjection, destinationProjection) { + var transformFn = ol.proj.getTransformFromProjections(sourceProjection, destinationProjection); + return transformFn(point) +}; +ol.proj.configureProj4jsProjection = function(options) { + goog.asserts.assert(!goog.object.containsKey(ol.proj.proj4jsProjections_, options.code)); + return ol.proj.getProj4jsProjectionFromCode_(options) +}; +goog.provide("ol.source.Source"); +goog.provide("ol.source.State"); +goog.require("goog.events.EventType"); +goog.require("ol.Attribution"); +goog.require("ol.Extent"); +goog.require("ol.Observable"); +goog.require("ol.proj"); +ol.source.State = {LOADING:0, READY:1, ERROR:2}; +ol.source.SourceOptions; +ol.source.Source = function(options) { + goog.base(this); + this.projection_ = ol.proj.get(options.projection); + this.extent_ = goog.isDef(options.extent) ? options.extent : goog.isDef(options.projection) ? this.projection_.getExtent() : null; + this.attributions_ = goog.isDef(options.attributions) ? options.attributions : null; + this.logo_ = options.logo; + this.state_ = goog.isDef(options.state) ? (options.state) : ol.source.State.READY +}; +goog.inherits(ol.source.Source, ol.Observable); +ol.source.Source.prototype.forEachFeatureAtPixel = goog.nullFunction; +ol.source.Source.prototype.getAttributions = function() { + return this.attributions_ +}; +ol.source.Source.prototype.getExtent = function() { + return this.extent_ +}; +ol.source.Source.prototype.getLogo = function() { + return this.logo_ +}; +ol.source.Source.prototype.getProjection = function() { + return this.projection_ +}; +ol.source.Source.prototype.getResolutions = goog.abstractMethod; +ol.source.Source.prototype.getState = function() { + return this.state_ +}; +ol.source.Source.prototype.setAttributions = function(attributions) { + this.attributions_ = attributions +}; +ol.source.Source.prototype.setExtent = function(extent) { + this.extent_ = extent +}; +ol.source.Source.prototype.setLogo = function(logo) { + this.logo_ = logo +}; +ol.source.Source.prototype.setState = function(state) { + this.state_ = state; + this.dispatchChangeEvent() +}; +ol.source.Source.prototype.setProjection = function(projection) { + this.projection_ = projection +}; +goog.provide("ol.layer.Base"); +goog.provide("ol.layer.LayerProperty"); +goog.provide("ol.layer.LayerState"); +goog.require("goog.events"); +goog.require("goog.math"); +goog.require("goog.object"); +goog.require("ol.Object"); +goog.require("ol.source.State"); +ol.layer.LayerProperty = {BRIGHTNESS:"brightness", CONTRAST:"contrast", HUE:"hue", OPACITY:"opacity", SATURATION:"saturation", VISIBLE:"visible", MAX_RESOLUTION:"maxResolution", MIN_RESOLUTION:"minResolution"}; +ol.layer.LayerState; +ol.layer.Base = function(options) { + goog.base(this); + var values = goog.object.clone(options); + values.brightness = goog.isDef(values.brightness) ? values.brightness : 0; + values.contrast = goog.isDef(values.contrast) ? values.contrast : 1; + values.hue = goog.isDef(values.hue) ? values.hue : 0; + values.opacity = goog.isDef(values.opacity) ? values.opacity : 1; + values.saturation = goog.isDef(values.saturation) ? values.saturation : 1; + values.visible = goog.isDef(values.visible) ? values.visible : true; + values.maxResolution = goog.isDef(values.maxResolution) ? values.maxResolution : Infinity; + values.minResolution = goog.isDef(values.minResolution) ? values.minResolution : 0; + this.setValues(values) +}; +goog.inherits(ol.layer.Base, ol.Object); +ol.layer.Base.prototype.getBrightness = function() { + return(this.get(ol.layer.LayerProperty.BRIGHTNESS)) +}; +goog.exportProperty(ol.layer.Base.prototype, "getBrightness", ol.layer.Base.prototype.getBrightness); +ol.layer.Base.prototype.getContrast = function() { + return(this.get(ol.layer.LayerProperty.CONTRAST)) +}; +goog.exportProperty(ol.layer.Base.prototype, "getContrast", ol.layer.Base.prototype.getContrast); +ol.layer.Base.prototype.getHue = function() { + return(this.get(ol.layer.LayerProperty.HUE)) +}; +goog.exportProperty(ol.layer.Base.prototype, "getHue", ol.layer.Base.prototype.getHue); +ol.layer.Base.prototype.getLayerState = function() { + var brightness = this.getBrightness(); + var contrast = this.getContrast(); + var hue = this.getHue(); + var opacity = this.getOpacity(); + var saturation = this.getSaturation(); + var sourceState = this.getSourceState(); + var visible = this.getVisible(); + var maxResolution = this.getMaxResolution(); + var minResolution = this.getMinResolution(); + return{brightness:goog.isDef(brightness) ? goog.math.clamp(brightness, -1, 1) : 0, contrast:goog.isDef(contrast) ? Math.max(contrast, 0) : 1, hue:goog.isDef(hue) ? hue : 0, opacity:goog.isDef(opacity) ? goog.math.clamp(opacity, 0, 1) : 1, saturation:goog.isDef(saturation) ? Math.max(saturation, 0) : 1, sourceState:sourceState, visible:goog.isDef(visible) ? !!visible : true, maxResolution:goog.isDef(maxResolution) ? maxResolution : Infinity, minResolution:goog.isDef(minResolution) ? Math.max(minResolution, + 0) : 0} +}; +ol.layer.Base.prototype.getLayersArray = goog.abstractMethod; +ol.layer.Base.prototype.getLayerStatesArray = goog.abstractMethod; +ol.layer.Base.prototype.getMaxResolution = function() { + return(this.get(ol.layer.LayerProperty.MAX_RESOLUTION)) +}; +goog.exportProperty(ol.layer.Base.prototype, "getMaxResolution", ol.layer.Base.prototype.getMaxResolution); +ol.layer.Base.prototype.getMinResolution = function() { + return(this.get(ol.layer.LayerProperty.MIN_RESOLUTION)) +}; +goog.exportProperty(ol.layer.Base.prototype, "getMinResolution", ol.layer.Base.prototype.getMinResolution); +ol.layer.Base.prototype.getOpacity = function() { + return(this.get(ol.layer.LayerProperty.OPACITY)) +}; +goog.exportProperty(ol.layer.Base.prototype, "getOpacity", ol.layer.Base.prototype.getOpacity); +ol.layer.Base.prototype.getSaturation = function() { + return(this.get(ol.layer.LayerProperty.SATURATION)) +}; +goog.exportProperty(ol.layer.Base.prototype, "getSaturation", ol.layer.Base.prototype.getSaturation); +ol.layer.Base.prototype.getSourceState = goog.abstractMethod; +ol.layer.Base.prototype.getVisible = function() { + return(this.get(ol.layer.LayerProperty.VISIBLE)) +}; +goog.exportProperty(ol.layer.Base.prototype, "getVisible", ol.layer.Base.prototype.getVisible); +ol.layer.Base.prototype.setBrightness = function(brightness) { + this.set(ol.layer.LayerProperty.BRIGHTNESS, brightness) +}; +goog.exportProperty(ol.layer.Base.prototype, "setBrightness", ol.layer.Base.prototype.setBrightness); +ol.layer.Base.prototype.setContrast = function(contrast) { + this.set(ol.layer.LayerProperty.CONTRAST, contrast) +}; +goog.exportProperty(ol.layer.Base.prototype, "setContrast", ol.layer.Base.prototype.setContrast); +ol.layer.Base.prototype.setHue = function(hue) { + this.set(ol.layer.LayerProperty.HUE, hue) +}; +goog.exportProperty(ol.layer.Base.prototype, "setHue", ol.layer.Base.prototype.setHue); +ol.layer.Base.prototype.setMaxResolution = function(maxResolution) { + this.set(ol.layer.LayerProperty.MAX_RESOLUTION, maxResolution) +}; +goog.exportProperty(ol.layer.Base.prototype, "setMaxResolution", ol.layer.Base.prototype.setMaxResolution); +ol.layer.Base.prototype.setMinResolution = function(minResolution) { + this.set(ol.layer.LayerProperty.MIN_RESOLUTION, minResolution) +}; +goog.exportProperty(ol.layer.Base.prototype, "setMinResolution", ol.layer.Base.prototype.setMinResolution); +ol.layer.Base.prototype.setOpacity = function(opacity) { + this.set(ol.layer.LayerProperty.OPACITY, opacity) +}; +goog.exportProperty(ol.layer.Base.prototype, "setOpacity", ol.layer.Base.prototype.setOpacity); +ol.layer.Base.prototype.setSaturation = function(saturation) { + this.set(ol.layer.LayerProperty.SATURATION, saturation) +}; +goog.exportProperty(ol.layer.Base.prototype, "setSaturation", ol.layer.Base.prototype.setSaturation); +ol.layer.Base.prototype.setVisible = function(visible) { + this.set(ol.layer.LayerProperty.VISIBLE, visible) +}; +goog.exportProperty(ol.layer.Base.prototype, "setVisible", ol.layer.Base.prototype.setVisible); +goog.provide("ol.layer.Layer"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.object"); +goog.require("ol.layer.Base"); +goog.require("ol.source.Source"); +ol.layer.Layer = function(options) { + var baseOptions = goog.object.clone(options); + delete baseOptions.source; + goog.base(this, (baseOptions)); + this.source_ = options.source; + goog.events.listen(this.source_, goog.events.EventType.CHANGE, this.handleSourceChange_, false, this) +}; +goog.inherits(ol.layer.Layer, ol.layer.Base); +ol.layer.Layer.prototype.getLayersArray = function(opt_array) { + var array = goog.isDef(opt_array) ? opt_array : []; + array.push(this); + return array +}; +ol.layer.Layer.prototype.getLayerStatesArray = function(opt_obj) { + var obj = goog.isDef(opt_obj) ? opt_obj : {layers:[], layerStates:[]}; + goog.asserts.assert(obj.layers.length === obj.layerStates.length); + obj.layers.push(this); + obj.layerStates.push(this.getLayerState()); + return obj +}; +ol.layer.Layer.prototype.getSource = function() { + return this.source_ +}; +ol.layer.Layer.prototype.getSourceState = function() { + return this.getSource().getState() +}; +ol.layer.Layer.prototype.handleSourceChange_ = function() { + this.dispatchChangeEvent() +}; +goog.provide("ol.FrameState"); +goog.provide("ol.PostRenderFunction"); +goog.provide("ol.PreRenderFunction"); +goog.require("goog.vec.Mat4"); +goog.require("ol.Attribution"); +goog.require("ol.Extent"); +goog.require("ol.Size"); +goog.require("ol.TileQueue"); +goog.require("ol.TileRange"); +goog.require("ol.View2DState"); +goog.require("ol.layer.Layer"); +goog.require("ol.layer.LayerState"); +ol.FrameState; +ol.PostRenderFunction; +ol.PreRenderFunction; +goog.provide("ol.MapEvent"); +goog.provide("ol.MapEventType"); +goog.require("goog.events.Event"); +goog.require("ol.FrameState"); +ol.MapEventType = {POSTRENDER:"postrender", MOVEEND:"moveend"}; +ol.MapEvent = function(type, map, opt_frameState) { + goog.base(this, type); + this.map = map; + this.frameState = goog.isDef(opt_frameState) ? opt_frameState : null +}; +goog.inherits(ol.MapEvent, goog.events.Event); +goog.provide("ol.Pixel"); +ol.Pixel; +goog.provide("ol.MapBrowserEvent"); +goog.provide("ol.MapBrowserEvent.EventType"); +goog.provide("ol.MapBrowserEventHandler"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.BrowserEvent"); +goog.require("goog.events.EventTarget"); +goog.require("goog.events.EventType"); +goog.require("goog.object"); +goog.require("ol.Coordinate"); +goog.require("ol.FrameState"); +goog.require("ol.MapEvent"); +goog.require("ol.Pixel"); +ol.MapBrowserEvent = function(type, map, browserEvent, opt_frameState) { + goog.base(this, type, map, opt_frameState); + this.browserEvent = browserEvent; + this.originalEvent = browserEvent.getBrowserEvent(); + this.coordinate = map.getEventCoordinate(this.originalEvent); + this.pixel = map.getEventPixel(this.originalEvent) +}; +goog.inherits(ol.MapBrowserEvent, ol.MapEvent); +ol.MapBrowserEvent.prototype.preventDefault = function() { + goog.base(this, "preventDefault"); + this.browserEvent.preventDefault() +}; +ol.MapBrowserEvent.prototype.stopPropagation = function() { + goog.base(this, "stopPropagation"); + this.browserEvent.stopPropagation() +}; +ol.MapBrowserEventHandler = function(map) { + goog.base(this); + this.map_ = map; + this.clickTimeoutId_ = 0; + this.dragged_ = false; + this.dragListenerKeys_ = null; + this.mousedownListenerKey_ = null; + this.pointerdownListenerKey_ = null; + this.touchstartListenerKey_ = null; + if(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + this.ieDblclickListenerKey_ = null + } + this.down_ = null; + var element = this.map_.getViewport(); + this.relayedListenerKeys_ = [goog.events.listen(element, goog.events.EventType.MOUSEMOVE, this.relayEvent_, false, this), goog.events.listen(element, goog.events.EventType.CLICK, this.relayEvent_, false, this)]; + this.mousedownListenerKey_ = goog.events.listen(element, goog.events.EventType.MOUSEDOWN, this.handleMouseDown_, false, this); + this.pointerdownListenerKey_ = goog.events.listen(element, goog.events.EventType.MSPOINTERDOWN, this.handlePointerDown_, false, this); + this.touchstartListenerKey_ = goog.events.listen(element, goog.events.EventType.TOUCHSTART, this.handleTouchStart_, false, this); + if(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + this.ieDblclickListenerKey_ = goog.events.listen(element, goog.events.EventType.DBLCLICK, this.emulateClick_, false, this) + } +}; +goog.inherits(ol.MapBrowserEventHandler, goog.events.EventTarget); +ol.MapBrowserEventHandler.prototype.getDown = function() { + return this.down_ +}; +ol.MapBrowserEventHandler.prototype.emulateClick_ = function(browserEvent) { + if(this.clickTimeoutId_ !== 0) { + goog.global.clearTimeout(this.clickTimeoutId_); + this.clickTimeoutId_ = 0; + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.DBLCLICK, this.map_, browserEvent); + this.dispatchEvent(newEvent) + }else { + if(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + var ev = (goog.object.clone(browserEvent.getBrowserEvent())); + this.clickTimeoutId_ = goog.global.setTimeout(goog.bind(function() { + this.clickTimeoutId_ = 0; + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.SINGLECLICK, this.map_, new goog.events.BrowserEvent(ev, browserEvent.currentTarget)); + this.dispatchEvent(newEvent) + }, this), 250) + }else { + this.clickTimeoutId_ = goog.global.setTimeout(goog.bind(function() { + this.clickTimeoutId_ = 0; + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.SINGLECLICK, this.map_, browserEvent); + this.dispatchEvent(newEvent) + }, this), 250) + } + } +}; +ol.MapBrowserEventHandler.prototype.handleMouseUp_ = function(browserEvent) { + if(this.down_) { + goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey); + this.dragListenerKeys_ = null; + if(this.dragged_) { + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.DRAGEND, this.map_, browserEvent); + this.dispatchEvent(newEvent) + }else { + if(browserEvent.isMouseActionButton()) { + this.emulateClick_(browserEvent) + } + } + } +}; +ol.MapBrowserEventHandler.prototype.handleMouseDown_ = function(browserEvent) { + if(!goog.isNull(this.pointerdownListenerKey_)) { + goog.events.unlistenByKey(this.pointerdownListenerKey_); + this.pointerdownListenerKey_ = null; + goog.asserts.assert(!goog.isNull(this.touchstartListenerKey_)); + goog.events.unlistenByKey(this.touchstartListenerKey_); + this.touchstartListenerKey_ = null + } + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.DOWN, this.map_, browserEvent); + this.dispatchEvent(newEvent); + this.down_ = browserEvent; + this.dragged_ = false; + this.dragListenerKeys_ = [goog.events.listen(goog.global.document, goog.events.EventType.MOUSEMOVE, this.handleMouseMove_, false, this), goog.events.listen(goog.global.document, goog.events.EventType.MOUSEUP, this.handleMouseUp_, false, this)]; + browserEvent.preventDefault() +}; +ol.MapBrowserEventHandler.prototype.handleMouseMove_ = function(browserEvent) { + var newEvent; + if(!this.dragged_) { + this.dragged_ = true; + newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.DRAGSTART, this.map_, this.down_); + this.dispatchEvent(newEvent) + } + newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.DRAG, this.map_, browserEvent); + this.dispatchEvent(newEvent) +}; +ol.MapBrowserEventHandler.prototype.handlePointerDown_ = function(browserEvent) { + if(!goog.isNull(this.mousedownListenerKey_)) { + goog.events.unlistenByKey(this.mousedownListenerKey_); + this.mousedownListenerKey_ = null; + goog.asserts.assert(!goog.isNull(this.touchstartListenerKey_)); + goog.events.unlistenByKey(this.touchstartListenerKey_); + this.touchstartListenerKey_ = null + } + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.TOUCHSTART, this.map_, browserEvent); + this.dispatchEvent(newEvent); + this.down_ = browserEvent; + this.dragged_ = false; + this.dragListenerKeys_ = [goog.events.listen(goog.global.document, goog.events.EventType.MSPOINTERMOVE, this.handlePointerMove_, false, this), goog.events.listen(goog.global.document, goog.events.EventType.MSPOINTERUP, this.handlePointerUp_, false, this)]; + browserEvent.preventDefault() +}; +ol.MapBrowserEventHandler.prototype.handlePointerMove_ = function(browserEvent) { + if(browserEvent.clientX != this.down_.clientX || browserEvent.clientY != this.down_.clientY) { + this.dragged_ = true; + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.TOUCHMOVE, this.map_, browserEvent); + this.dispatchEvent(newEvent) + } +}; +ol.MapBrowserEventHandler.prototype.handlePointerUp_ = function(browserEvent) { + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.TOUCHEND, this.map_, browserEvent); + this.dispatchEvent(newEvent); + goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey); + if(!this.dragged_ && browserEvent.isMouseActionButton()) { + goog.asserts.assert(!goog.isNull(this.down_)); + this.emulateClick_(this.down_) + } +}; +ol.MapBrowserEventHandler.prototype.handleTouchStart_ = function(browserEvent) { + if(!goog.isNull(this.mousedownListenerKey_)) { + goog.events.unlistenByKey(this.mousedownListenerKey_); + this.mousedownListenerKey_ = null; + goog.asserts.assert(!goog.isNull(this.pointerdownListenerKey_)); + goog.events.unlistenByKey(this.pointerdownListenerKey_); + this.pointerdownListenerKey_ = null + } + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.TOUCHSTART, this.map_, browserEvent); + this.dispatchEvent(newEvent); + this.down_ = browserEvent; + this.dragged_ = false; + if(goog.isNull(this.dragListenerKeys_)) { + this.dragListenerKeys_ = [goog.events.listen(goog.global.document, goog.events.EventType.TOUCHMOVE, this.handleTouchMove_, false, this), goog.events.listen(goog.global.document, goog.events.EventType.TOUCHEND, this.handleTouchEnd_, false, this)] + } + browserEvent.preventDefault() +}; +ol.MapBrowserEventHandler.prototype.handleTouchMove_ = function(browserEvent) { + this.dragged_ = true; + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.TOUCHMOVE, this.map_, browserEvent); + this.dispatchEvent(newEvent); + browserEvent.preventDefault() +}; +ol.MapBrowserEventHandler.prototype.handleTouchEnd_ = function(browserEvent) { + var newEvent = new ol.MapBrowserEvent(ol.MapBrowserEvent.EventType.TOUCHEND, this.map_, browserEvent); + this.dispatchEvent(newEvent); + if(browserEvent.getBrowserEvent().targetTouches.length === 0) { + goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey); + this.dragListenerKeys_ = null + } + if(!this.dragged_) { + goog.asserts.assert(!goog.isNull(this.down_)); + this.emulateClick_(this.down_) + } +}; +ol.MapBrowserEventHandler.prototype.disposeInternal = function() { + if(!goog.isNull(this.relayedListenerKeys_)) { + goog.array.forEach(this.relayedListenerKeys_, goog.events.unlistenByKey); + this.relayedListenerKeys_ = null + } + if(!goog.isNull(this.mousedownListenerKey_)) { + goog.events.unlistenByKey(this.mousedownListenerKey_); + this.mousedownListenerKey_ = null + } + if(!goog.isNull(this.pointerdownListenerKey_)) { + goog.events.unlistenByKey(this.pointerdownListenerKey_); + this.pointerdownListenerKey_ = null + } + if(!goog.isNull(this.touchstartListenerKey_)) { + goog.events.unlistenByKey(this.touchstartListenerKey_); + this.touchstartListenerKey_ = null + } + if(!goog.isNull(this.dragListenerKeys_)) { + goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey); + this.dragListenerKeys_ = null + } + if(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE && !goog.isNull(this.ieDblclickListenerKey_)) { + goog.events.unlistenByKey(this.ieDblclickListenerKey_); + this.ieDblclickListenerKey_ = null + } + goog.base(this, "disposeInternal") +}; +ol.MapBrowserEventHandler.prototype.relayEvent_ = function(browserEvent) { + this.dispatchEvent(new ol.MapBrowserEvent(browserEvent.type, this.map_, browserEvent)) +}; +ol.MapBrowserEvent.EventType = {CLICK:goog.events.EventType.CLICK, DBLCLICK:goog.events.EventType.DBLCLICK, MOUSEMOVE:goog.events.EventType.MOUSEMOVE, DOWN:"down", DRAGSTART:"dragstart", DRAG:"drag", DRAGEND:"dragend", SINGLECLICK:"singleclick", TOUCHSTART:goog.events.EventType.TOUCHSTART, TOUCHMOVE:goog.events.EventType.TOUCHMOVE, TOUCHEND:goog.events.EventType.TOUCHEND}; +goog.provide("ol.events.ConditionType"); +goog.provide("ol.events.condition"); +goog.require("goog.asserts"); +goog.require("goog.dom.TagName"); +goog.require("goog.functions"); +goog.require("ol.MapBrowserEvent.EventType"); +ol.events.ConditionType; +ol.events.condition.altKeyOnly = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return browserEvent.altKey && !browserEvent.platformModifierKey && !browserEvent.shiftKey +}; +ol.events.condition.altShiftKeysOnly = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return browserEvent.altKey && !browserEvent.platformModifierKey && browserEvent.shiftKey +}; +ol.events.condition.always = goog.functions.TRUE; +ol.events.condition.singleClick = function(mapBrowserEvent) { + return mapBrowserEvent.type == ol.MapBrowserEvent.EventType.SINGLECLICK +}; +ol.events.condition.noModifierKeys = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return!browserEvent.altKey && !browserEvent.platformModifierKey && !browserEvent.shiftKey +}; +ol.events.condition.platformModifierKeyOnly = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return!browserEvent.altKey && browserEvent.platformModifierKey && !browserEvent.shiftKey +}; +ol.events.condition.shiftKeyOnly = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return!browserEvent.altKey && !browserEvent.platformModifierKey && browserEvent.shiftKey +}; +ol.events.condition.targetNotEditable = function(mapBrowserEvent) { + var target = mapBrowserEvent.browserEvent.target; + goog.asserts.assertInstanceof(target, Element); + var tagName = target.tagName; + return tagName !== goog.dom.TagName.INPUT && tagName !== goog.dom.TagName.SELECT && tagName !== goog.dom.TagName.TEXTAREA +}; +goog.provide("ol.IView3D"); +ol.IView3D = function() { +}; +ol.IView3D.prototype.isDef = function() { +}; +goog.provide("ol.IView"); +goog.require("ol.IView2D"); +goog.require("ol.IView3D"); +ol.IView = function() { +}; +ol.IView.prototype.getView2D = function() { +}; +ol.IView.prototype.getView3D = function() { +}; +ol.IView.prototype.isDef = function() { +}; +goog.provide("ol.View"); +goog.provide("ol.ViewHint"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("ol.IView"); +goog.require("ol.Object"); +ol.ViewHint = {ANIMATING:0, INTERACTING:1}; +ol.View = function() { + goog.base(this); + this.hints_ = [0, 0] +}; +goog.inherits(ol.View, ol.Object); +ol.View.prototype.getHints = function() { + return goog.array.clone(this.hints_) +}; +ol.View.prototype.getView2D = function() { + goog.asserts.fail(); + return null +}; +ol.View.prototype.getView3D = function() { + goog.asserts.fail(); + return null +}; +ol.View.prototype.isDef = function() { + goog.asserts.fail(); + return false +}; +ol.View.prototype.setHint = function(hint, delta) { + goog.asserts.assert(0 <= hint && hint < this.hints_.length); + this.hints_[hint] += delta; + goog.asserts.assert(this.hints_[hint] >= 0); + return this.hints_[hint] +}; +goog.provide("ol.View2D"); +goog.provide("ol.View2DProperty"); +goog.require("goog.asserts"); +goog.require("ol.CenterConstraint"); +goog.require("ol.Constraints"); +goog.require("ol.IView2D"); +goog.require("ol.IView3D"); +goog.require("ol.ResolutionConstraint"); +goog.require("ol.RotationConstraint"); +goog.require("ol.RotationConstraintType"); +goog.require("ol.Size"); +goog.require("ol.View"); +goog.require("ol.coordinate"); +goog.require("ol.extent"); +goog.require("ol.proj"); +goog.require("ol.proj.METERS_PER_UNIT"); +goog.require("ol.proj.Projection"); +goog.require("ol.proj.Units"); +ol.View2DProperty = {CENTER:"center", PROJECTION:"projection", RESOLUTION:"resolution", ROTATION:"rotation"}; +ol.View2D = function(opt_options) { + goog.base(this); + var options = opt_options || {}; + var values = {}; + values[ol.View2DProperty.CENTER] = goog.isDef(options.center) ? options.center : null; + values[ol.View2DProperty.PROJECTION] = ol.proj.createProjection(options.projection, "EPSG:3857"); + var resolutionConstraintInfo = ol.View2D.createResolutionConstraint_(options); + this.maxResolution_ = resolutionConstraintInfo.maxResolution; + this.minResolution_ = resolutionConstraintInfo.minResolution; + var centerConstraint = ol.View2D.createCenterConstraint_(options); + var resolutionConstraint = resolutionConstraintInfo.constraint; + var rotationConstraint = ol.View2D.createRotationConstraint_(options); + this.constraints_ = new ol.Constraints(centerConstraint, resolutionConstraint, rotationConstraint); + if(goog.isDef(options.resolution)) { + values[ol.View2DProperty.RESOLUTION] = options.resolution + }else { + if(goog.isDef(options.zoom)) { + values[ol.View2DProperty.RESOLUTION] = this.constrainResolution(this.maxResolution_, options.zoom) + } + } + values[ol.View2DProperty.ROTATION] = goog.isDef(options.rotation) ? options.rotation : 0; + this.setValues(values) +}; +goog.inherits(ol.View2D, ol.View); +ol.View2D.prototype.calculateCenterRotate = function(rotation, anchor) { + var center; + var currentCenter = this.getCenter(); + if(goog.isDef(currentCenter)) { + center = [currentCenter[0] - anchor[0], currentCenter[1] - anchor[1]]; + ol.coordinate.rotate(center, rotation - this.getRotation()); + ol.coordinate.add(center, anchor) + } + return center +}; +ol.View2D.prototype.calculateCenterZoom = function(resolution, anchor) { + var center; + var currentCenter = this.getCenter(); + var currentResolution = this.getResolution(); + if(goog.isDef(currentCenter) && goog.isDef(currentResolution)) { + var x = anchor[0] - resolution * (anchor[0] - currentCenter[0]) / currentResolution; + var y = anchor[1] - resolution * (anchor[1] - currentCenter[1]) / currentResolution; + center = [x, y] + } + return center +}; +ol.View2D.prototype.constrainCenter = function(center) { + return this.constraints_.center(center) +}; +ol.View2D.prototype.constrainResolution = function(resolution, opt_delta, opt_direction) { + var delta = opt_delta || 0; + var direction = opt_direction || 0; + return this.constraints_.resolution(resolution, delta, direction) +}; +ol.View2D.prototype.constrainRotation = function(rotation, opt_delta) { + var delta = opt_delta || 0; + return this.constraints_.rotation(rotation, delta) +}; +ol.View2D.prototype.getCenter = function() { + return(this.get(ol.View2DProperty.CENTER)) +}; +goog.exportProperty(ol.View2D.prototype, "getCenter", ol.View2D.prototype.getCenter); +ol.View2D.prototype.calculateExtent = function(size) { + goog.asserts.assert(this.isDef()); + var center = this.getCenter(); + var resolution = this.getResolution(); + var minX = center[0] - resolution * size[0] / 2; + var maxX = center[0] + resolution * size[0] / 2; + var minY = center[1] - resolution * size[1] / 2; + var maxY = center[1] + resolution * size[1] / 2; + return[minX, minY, maxX, maxY] +}; +ol.View2D.prototype.getProjection = function() { + return(this.get(ol.View2DProperty.PROJECTION)) +}; +goog.exportProperty(ol.View2D.prototype, "getProjection", ol.View2D.prototype.getProjection); +ol.View2D.prototype.getResolution = function() { + return(this.get(ol.View2DProperty.RESOLUTION)) +}; +goog.exportProperty(ol.View2D.prototype, "getResolution", ol.View2D.prototype.getResolution); +ol.View2D.prototype.getResolutionForExtent = function(extent, size) { + var xResolution = (extent[2] - extent[0]) / size[0]; + var yResolution = (extent[3] - extent[1]) / size[1]; + return Math.max(xResolution, yResolution) +}; +ol.View2D.prototype.getResolutionForValueFunction = function(opt_power) { + var power = opt_power || 2; + var maxResolution = this.maxResolution_; + var minResolution = this.minResolution_; + var max = Math.log(maxResolution / minResolution) / Math.log(power); + return function(value) { + var resolution = maxResolution / Math.pow(power, value * max); + goog.asserts.assert(resolution >= minResolution && resolution <= maxResolution); + return resolution + } +}; +ol.View2D.prototype.getRotation = function() { + return(this.get(ol.View2DProperty.ROTATION)) +}; +goog.exportProperty(ol.View2D.prototype, "getRotation", ol.View2D.prototype.getRotation); +ol.View2D.prototype.getValueForResolutionFunction = function(opt_power) { + var power = opt_power || 2; + var maxResolution = this.maxResolution_; + var minResolution = this.minResolution_; + var max = Math.log(maxResolution / minResolution) / Math.log(power); + return function(resolution) { + var value = Math.log(maxResolution / resolution) / Math.log(power) / max; + goog.asserts.assert(value >= 0 && value <= 1); + return value + } +}; +ol.View2D.prototype.getView2D = function() { + return this +}; +ol.View2D.prototype.getView2DState = function() { + goog.asserts.assert(this.isDef()); + var center = (this.getCenter()); + var projection = this.getProjection(); + var resolution = (this.getResolution()); + var rotation = this.getRotation(); + return{center:center.slice(), projection:goog.isDef(projection) ? projection : null, resolution:resolution, rotation:goog.isDef(rotation) ? rotation : 0} +}; +ol.View2D.prototype.getView3D = function() { +}; +ol.View2D.prototype.getZoom = function() { + var zoom; + var resolution = this.getResolution(); + if(goog.isDef(resolution)) { + var res, z = 0; + do { + res = this.constrainResolution(this.maxResolution_, z); + if(res == resolution) { + zoom = z; + break + } + ++z + }while(res > this.minResolution_) + } + return zoom +}; +ol.View2D.prototype.fitExtent = function(extent, size) { + if(!ol.extent.isEmpty(extent)) { + this.setCenter(ol.extent.getCenter(extent)); + var resolution = this.getResolutionForExtent(extent, size); + var constrainedResolution = this.constrainResolution(resolution, 0, 0); + if(constrainedResolution < resolution) { + constrainedResolution = this.constrainResolution(constrainedResolution, -1, 0) + } + this.setResolution(constrainedResolution) + } +}; +ol.View2D.prototype.isDef = function() { + return goog.isDefAndNotNull(this.getCenter()) && goog.isDef(this.getResolution()) +}; +ol.View2D.prototype.setCenter = function(center) { + this.set(ol.View2DProperty.CENTER, center) +}; +goog.exportProperty(ol.View2D.prototype, "setCenter", ol.View2D.prototype.setCenter); +ol.View2D.prototype.setProjection = function(projection) { + this.set(ol.View2DProperty.PROJECTION, projection) +}; +goog.exportProperty(ol.View2D.prototype, "setProjection", ol.View2D.prototype.setProjection); +ol.View2D.prototype.setResolution = function(resolution) { + this.set(ol.View2DProperty.RESOLUTION, resolution) +}; +goog.exportProperty(ol.View2D.prototype, "setResolution", ol.View2D.prototype.setResolution); +ol.View2D.prototype.setRotation = function(rotation) { + this.set(ol.View2DProperty.ROTATION, rotation) +}; +goog.exportProperty(ol.View2D.prototype, "setRotation", ol.View2D.prototype.setRotation); +ol.View2D.prototype.setZoom = function(zoom) { + var resolution = this.constrainResolution(this.maxResolution_, zoom, 0); + this.setResolution(resolution) +}; +ol.View2D.createCenterConstraint_ = function(options) { + if(goog.isDef(options.extent)) { + return ol.CenterConstraint.createExtent(options.extent) + }else { + return ol.CenterConstraint.none + } +}; +ol.View2D.createResolutionConstraint_ = function(options) { + var resolutionConstraint; + var maxResolution; + var minResolution; + if(goog.isDef(options.resolutions)) { + var resolutions = options.resolutions; + maxResolution = resolutions[0]; + minResolution = resolutions[resolutions.length - 1]; + resolutionConstraint = ol.ResolutionConstraint.createSnapToResolutions(resolutions) + }else { + maxResolution = options.maxResolution; + if(!goog.isDef(maxResolution)) { + var projection = options.projection; + var projectionExtent = ol.proj.createProjection(projection, "EPSG:3857").getExtent(); + var size = goog.isNull(projectionExtent) ? 360 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] / ol.proj.METERS_PER_UNIT[projection.getUnits()] : Math.max(projectionExtent[2] - projectionExtent[0], projectionExtent[3] - projectionExtent[1]); + maxResolution = size / ol.DEFAULT_TILE_SIZE + } + var maxZoom = options.maxZoom; + if(!goog.isDef(maxZoom)) { + maxZoom = 28 + } + var zoomFactor = options.zoomFactor; + if(!goog.isDef(zoomFactor)) { + zoomFactor = 2 + } + minResolution = maxResolution / Math.pow(zoomFactor, maxZoom); + resolutionConstraint = ol.ResolutionConstraint.createSnapToPower(zoomFactor, maxResolution, maxZoom) + } + return{constraint:resolutionConstraint, maxResolution:maxResolution, minResolution:minResolution} +}; +ol.View2D.createRotationConstraint_ = function(options) { + var enableRotation = goog.isDef(options.enableRotation) ? options.enableRotation : true; + if(enableRotation) { + var constrainRotation = options.constrainRotation; + if(!goog.isDef(constrainRotation) || constrainRotation === true) { + return ol.RotationConstraint.createSnapToZero() + }else { + if(constrainRotation === false) { + return ol.RotationConstraint.none + }else { + if(goog.isNumber(constrainRotation)) { + return ol.RotationConstraint.createSnapToN(constrainRotation) + }else { + goog.asserts.fail(); + return ol.RotationConstraint.none + } + } + } + }else { + return ol.RotationConstraint.disable + } +}; +goog.provide("goog.fx.easing"); +goog.fx.easing.easeIn = function(t) { + return t * t * t +}; +goog.fx.easing.easeOut = function(t) { + return 1 - Math.pow(1 - t, 3) +}; +goog.fx.easing.inAndOut = function(t) { + return 3 * t * t - 2 * t * t * t +}; +goog.provide("ol.easing"); +goog.require("goog.fx.easing"); +ol.easing.bounce = function(t) { + var s = 7.5625, p = 2.75, l; + if(t < 1 / p) { + l = s * t * t + }else { + if(t < 2 / p) { + t -= 1.5 / p; + l = s * t * t + 0.75 + }else { + if(t < 2.5 / p) { + t -= 2.25 / p; + l = s * t * t + 0.9375 + }else { + t -= 2.625 / p; + l = s * t * t + 0.984375 + } + } + } + return l +}; +ol.easing.easeIn = goog.fx.easing.easeIn; +ol.easing.easeOut = goog.fx.easing.easeOut; +ol.easing.elastic = function(t) { + return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * 2 * Math.PI / 0.3) + 1 +}; +ol.easing.inAndOut = goog.fx.easing.inAndOut; +ol.easing.linear = function(t) { + return t +}; +ol.easing.upAndDown = function(t) { + if(t < 0.5) { + return ol.easing.inAndOut(2 * t) + }else { + return 1 - ol.easing.inAndOut(2 * (t - 0.5)) + } +}; +goog.provide("ol.animation"); +goog.require("ol.PreRenderFunction"); +goog.require("ol.ViewHint"); +goog.require("ol.easing"); +ol.animation.bounce = function(options) { + var resolution = options.resolution; + var start = goog.isDef(options.start) ? options.start : goog.now(); + var duration = goog.isDef(options.duration) ? options.duration : 1E3; + var easing = goog.isDef(options.easing) ? options.easing : ol.easing.upAndDown; + return function(map, frameState) { + if(frameState.time < start) { + frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true + }else { + if(frameState.time < start + duration) { + var delta = easing((frameState.time - start) / duration); + var deltaResolution = resolution - frameState.view2DState.resolution; + frameState.animate = true; + frameState.view2DState.resolution += delta * deltaResolution; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true + }else { + return false + } + } + } +}; +ol.animation.pan = function(options) { + var source = options.source; + var start = goog.isDef(options.start) ? options.start : goog.now(); + var sourceX = source[0]; + var sourceY = source[1]; + var duration = goog.isDef(options.duration) ? options.duration : 1E3; + var easing = goog.isDef(options.easing) ? options.easing : ol.easing.inAndOut; + return function(map, frameState) { + if(frameState.time < start) { + frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true + }else { + if(frameState.time < start + duration) { + var delta = 1 - easing((frameState.time - start) / duration); + var deltaX = sourceX - frameState.view2DState.center[0]; + var deltaY = sourceY - frameState.view2DState.center[1]; + frameState.animate = true; + frameState.view2DState.center[0] += delta * deltaX; + frameState.view2DState.center[1] += delta * deltaY; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true + }else { + return false + } + } + } +}; +ol.animation.rotate = function(options) { + var sourceRotation = options.rotation; + var start = goog.isDef(options.start) ? options.start : goog.now(); + var duration = goog.isDef(options.duration) ? options.duration : 1E3; + var easing = goog.isDef(options.easing) ? options.easing : ol.easing.inAndOut; + return function(map, frameState) { + if(frameState.time < start) { + frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true + }else { + if(frameState.time < start + duration) { + var delta = 1 - easing((frameState.time - start) / duration); + var deltaRotation = sourceRotation - frameState.view2DState.rotation; + frameState.animate = true; + frameState.view2DState.rotation += delta * deltaRotation; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true + }else { + return false + } + } + } +}; +ol.animation.zoom = function(options) { + var sourceResolution = options.resolution; + var start = goog.isDef(options.start) ? options.start : goog.now(); + var duration = goog.isDef(options.duration) ? options.duration : 1E3; + var easing = goog.isDef(options.easing) ? options.easing : ol.easing.inAndOut; + return function(map, frameState) { + if(frameState.time < start) { + frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true + }else { + if(frameState.time < start + duration) { + var delta = 1 - easing((frameState.time - start) / duration); + var deltaResolution = sourceResolution - frameState.view2DState.resolution; + frameState.animate = true; + frameState.view2DState.resolution += delta * deltaResolution; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true + }else { + return false + } + } + } +}; +goog.provide("ol.interaction.Interaction"); +goog.require("goog.asserts"); +goog.require("ol.MapBrowserEvent"); +goog.require("ol.Observable"); +goog.require("ol.View2D"); +goog.require("ol.animation"); +goog.require("ol.easing"); +ol.interaction.Interaction = function() { + goog.base(this); + this.map_ = null +}; +goog.inherits(ol.interaction.Interaction, ol.Observable); +ol.interaction.Interaction.prototype.getMap = function() { + return this.map_ +}; +ol.interaction.Interaction.prototype.handleMapBrowserEvent = goog.abstractMethod; +ol.interaction.Interaction.prototype.setMap = function(map) { + this.map_ = map +}; +ol.interaction.Interaction.pan = function(map, view, delta, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + var currentCenter = view.getCenter(); + if(goog.isDef(currentCenter)) { + if(goog.isDef(opt_duration) && opt_duration > 0) { + map.beforeRender(ol.animation.pan({source:currentCenter, duration:opt_duration, easing:ol.easing.linear})) + } + var center = view.constrainCenter([currentCenter[0] + delta[0], currentCenter[1] + delta[1]]); + view.setCenter(center) + } +}; +ol.interaction.Interaction.rotate = function(map, view, rotation, opt_anchor, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + rotation = view.constrainRotation(rotation, 0); + ol.interaction.Interaction.rotateWithoutConstraints(map, view, rotation, opt_anchor, opt_duration) +}; +ol.interaction.Interaction.rotateWithoutConstraints = function(map, view, rotation, opt_anchor, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + if(goog.isDefAndNotNull(rotation)) { + var currentRotation = view.getRotation(); + var currentCenter = view.getCenter(); + if(goog.isDef(currentRotation) && goog.isDef(currentCenter) && goog.isDef(opt_duration) && opt_duration > 0) { + map.beforeRender(ol.animation.rotate({rotation:currentRotation, duration:opt_duration, easing:ol.easing.easeOut})); + if(goog.isDef(opt_anchor)) { + map.beforeRender(ol.animation.pan({source:currentCenter, duration:opt_duration, easing:ol.easing.easeOut})) + } + } + goog.asserts.assertInstanceof(view, ol.View2D); + if(goog.isDefAndNotNull(opt_anchor)) { + var center = view.calculateCenterRotate(rotation, opt_anchor); + view.setCenter(center) + } + view.setRotation(rotation) + } +}; +ol.interaction.Interaction.zoom = function(map, view, resolution, opt_anchor, opt_duration, opt_direction) { + goog.asserts.assertInstanceof(view, ol.View2D); + resolution = view.constrainResolution(resolution, 0, opt_direction); + ol.interaction.Interaction.zoomWithoutConstraints(map, view, resolution, opt_anchor, opt_duration) +}; +ol.interaction.Interaction.zoomByDelta = function(map, view, delta, opt_anchor, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + var currentResolution = view.getResolution(); + var resolution = view.constrainResolution(currentResolution, delta, 0); + ol.interaction.Interaction.zoomWithoutConstraints(map, view, resolution, opt_anchor, opt_duration) +}; +ol.interaction.Interaction.zoomWithoutConstraints = function(map, view, resolution, opt_anchor, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + if(goog.isDefAndNotNull(resolution)) { + var currentResolution = view.getResolution(); + var currentCenter = view.getCenter(); + if(goog.isDef(currentResolution) && goog.isDef(currentCenter) && goog.isDef(opt_duration) && opt_duration > 0) { + map.beforeRender(ol.animation.zoom({resolution:currentResolution, duration:opt_duration, easing:ol.easing.easeOut})); + if(goog.isDef(opt_anchor)) { + map.beforeRender(ol.animation.pan({source:currentCenter, duration:opt_duration, easing:ol.easing.easeOut})) + } + } + goog.asserts.assertInstanceof(view, ol.View2D); + if(goog.isDefAndNotNull(opt_anchor)) { + var center = view.calculateCenterZoom(resolution, opt_anchor); + view.setCenter(center) + } + view.setResolution(resolution) + } +}; +goog.provide("ol.interaction.Drag"); +goog.require("goog.asserts"); +goog.require("goog.events.BrowserEvent"); +goog.require("goog.functions"); +goog.require("ol.Coordinate"); +goog.require("ol.MapBrowserEvent"); +goog.require("ol.MapBrowserEvent.EventType"); +goog.require("ol.interaction.Interaction"); +ol.interaction.Drag = function() { + goog.base(this); + this.dragging_ = false; + this.startX = 0; + this.startY = 0; + this.deltaX = 0; + this.deltaY = 0; + this.startCenter = null; + this.startCoordinate = null +}; +goog.inherits(ol.interaction.Drag, ol.interaction.Interaction); +ol.interaction.Drag.prototype.getDragging = function() { + return this.dragging_ +}; +ol.interaction.Drag.prototype.handleDrag = goog.nullFunction; +ol.interaction.Drag.prototype.handleDragEnd = goog.nullFunction; +ol.interaction.Drag.prototype.handleDragStart = goog.functions.FALSE; +ol.interaction.Drag.prototype.handleDown = goog.nullFunction; +ol.interaction.Drag.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + if(!map.isDef()) { + return true + } + var stopEvent = false; + var view = map.getView(); + var browserEvent = mapBrowserEvent.browserEvent; + if(mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DOWN) { + goog.asserts.assertInstanceof(browserEvent, goog.events.BrowserEvent); + this.handleDown(mapBrowserEvent) + } + if(this.dragging_) { + if(mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DRAG) { + goog.asserts.assertInstanceof(browserEvent, goog.events.BrowserEvent); + this.deltaX = browserEvent.clientX - this.startX; + this.deltaY = browserEvent.clientY - this.startY; + this.handleDrag(mapBrowserEvent) + }else { + if(mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DRAGEND) { + goog.asserts.assertInstanceof(browserEvent, goog.events.BrowserEvent); + this.deltaX = browserEvent.clientX - this.startX; + this.deltaY = browserEvent.clientY - this.startY; + this.dragging_ = false; + this.handleDragEnd(mapBrowserEvent) + } + } + }else { + if(mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DRAGSTART) { + goog.asserts.assertInstanceof(browserEvent, goog.events.BrowserEvent); + var view2DState = view.getView2D().getView2DState(); + this.startX = browserEvent.clientX; + this.startY = browserEvent.clientY; + this.deltaX = 0; + this.deltaY = 0; + this.startCenter = view2DState.center; + this.startCoordinate = mapBrowserEvent.coordinate; + var handled = this.handleDragStart(mapBrowserEvent); + if(handled) { + this.dragging_ = true; + mapBrowserEvent.preventDefault(); + stopEvent = true + } + } + } + return!stopEvent +}; +goog.provide("ol.geom.Geometry"); +goog.provide("ol.geom.GeometryType"); +goog.require("goog.asserts"); +goog.require("goog.functions"); +goog.require("ol.Observable"); +ol.geom.GeometryType = {POINT:"Point", LINE_STRING:"LineString", LINEAR_RING:"LinearRing", POLYGON:"Polygon", MULTI_POINT:"MultiPoint", MULTI_LINE_STRING:"MultiLineString", MULTI_POLYGON:"MultiPolygon", GEOMETRY_COLLECTION:"GeometryCollection", CIRCLE:"Circle"}; +ol.geom.GeometryLayout = {XY:"XY", XYZ:"XYZ", XYM:"XYM", XYZM:"XYZM"}; +ol.geom.Geometry = function() { + goog.base(this); + this.extent = undefined; + this.extentRevision = -1; + this.simplifiedGeometryCache = {}; + this.simplifiedGeometryMaxMinSquaredTolerance = 0; + this.simplifiedGeometryRevision = 0 +}; +goog.inherits(ol.geom.Geometry, ol.Observable); +ol.geom.Geometry.prototype.clone = goog.abstractMethod; +ol.geom.Geometry.prototype.closestPointXY = goog.abstractMethod; +ol.geom.Geometry.prototype.getClosestPoint = function(point, opt_closestPoint) { + var closestPoint = goog.isDef(opt_closestPoint) ? opt_closestPoint : [NaN, NaN]; + this.closestPointXY(point[0], point[1], closestPoint, Infinity); + return closestPoint +}; +ol.geom.Geometry.prototype.containsCoordinate = function(coordinate) { + return this.containsXY(coordinate[0], coordinate[1]) +}; +ol.geom.Geometry.prototype.containsXY = goog.functions.FALSE; +ol.geom.Geometry.prototype.getExtent = goog.abstractMethod; +ol.geom.Geometry.prototype.getSimplifiedGeometry = goog.abstractMethod; +ol.geom.Geometry.prototype.getType = goog.abstractMethod; +ol.geom.Geometry.prototype.transform = goog.abstractMethod; +ol.geom.RawPoint; +ol.geom.RawLineString; +ol.geom.RawLinearRing; +ol.geom.RawPolygon; +ol.geom.RawMultiPoint; +ol.geom.RawMultiLineString; +ol.geom.RawMultiPolygon; +goog.provide("ol.geom.flat"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.math"); +goog.require("goog.vec.Mat4"); +goog.require("ol.extent"); +ol.geom.flat.closestPoint = function(flatCoordinates, offset1, offset2, stride, x, y, closestPoint) { + var x1 = flatCoordinates[offset1]; + var y1 = flatCoordinates[offset1 + 1]; + var dx = flatCoordinates[offset2] - x1; + var dy = flatCoordinates[offset2 + 1] - y1; + var i, offset; + if(dx === 0 && dy === 0) { + offset = offset1 + }else { + var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy); + if(t > 1) { + offset = offset2 + }else { + if(t > 0) { + for(i = 0;i < stride;++i) { + closestPoint[i] = goog.math.lerp(flatCoordinates[offset1 + i], flatCoordinates[offset2 + i], t) + } + closestPoint.length = stride; + return + }else { + offset = offset1 + } + } + } + for(i = 0;i < stride;++i) { + closestPoint[i] = flatCoordinates[offset + i] + } + closestPoint.length = stride +}; +ol.geom.flat.deflateCoordinate = function(flatCoordinates, offset, coordinate, stride) { + goog.asserts.assert(coordinate.length == stride); + var i, ii; + for(i = 0, ii = coordinate.length;i < ii;++i) { + flatCoordinates[offset++] = coordinate[i] + } + return offset +}; +ol.geom.flat.deflateCoordinates = function(flatCoordinates, offset, coordinates, stride) { + var i, ii; + for(i = 0, ii = coordinates.length;i < ii;++i) { + var coordinate = coordinates[i]; + goog.asserts.assert(coordinate.length == stride); + var j; + for(j = 0;j < stride;++j) { + flatCoordinates[offset++] = coordinate[j] + } + } + return offset +}; +ol.geom.flat.deflateCoordinatess = function(flatCoordinates, offset, coordinatess, stride, opt_ends) { + var ends = goog.isDef(opt_ends) ? opt_ends : []; + var i = 0; + var j, jj; + for(j = 0, jj = coordinatess.length;j < jj;++j) { + var end = ol.geom.flat.deflateCoordinates(flatCoordinates, offset, coordinatess[j], stride); + ends[i++] = end; + offset = end + } + ends.length = i; + return ends +}; +ol.geom.flat.deflateCoordinatesss = function(flatCoordinates, offset, coordinatesss, stride, opt_endss) { + var endss = goog.isDef(opt_endss) ? opt_endss : []; + var i = 0; + var j, jj; + for(j = 0, jj = coordinatesss.length;j < jj;++j) { + var ends = ol.geom.flat.deflateCoordinatess(flatCoordinates, offset, coordinatesss[j], stride, endss[i]); + endss[i++] = ends; + offset = ends[ends.length - 1] + } + endss.length = i; + return endss +}; +ol.geom.flat.flipXY = function(flatCoordinates, offset, end, stride, opt_dest, opt_destOffset) { + var dest, destOffset; + if(goog.isDef(opt_dest)) { + dest = opt_dest; + destOffset = goog.isDef(opt_destOffset) ? opt_destOffset : 0 + }else { + goog.asserts.assert(!goog.isDef(opt_destOffset)); + dest = []; + destOffset = 0 + } + var j, k; + for(j = offset;j < end;) { + var x = flatCoordinates[j++]; + dest[destOffset++] = flatCoordinates[j++]; + dest[destOffset++] = x; + for(k = 2;k < stride;++k) { + dest[destOffset++] = flatCoordinates[j++] + } + } + dest.length = destOffset; + return dest +}; +ol.geom.flat.inflateCoordinates = function(flatCoordinates, offset, end, stride, opt_coordinates) { + var coordinates = goog.isDef(opt_coordinates) ? opt_coordinates : []; + var i = 0; + var j; + for(j = offset;j < end;j += stride) { + coordinates[i++] = flatCoordinates.slice(j, j + stride) + } + coordinates.length = i; + return coordinates +}; +ol.geom.flat.inflateCoordinatess = function(flatCoordinates, offset, ends, stride, opt_coordinatess) { + var coordinatess = goog.isDef(opt_coordinatess) ? opt_coordinatess : []; + var i = 0; + var j, jj; + for(j = 0, jj = ends.length;j < jj;++j) { + var end = ends[j]; + coordinatess[i++] = ol.geom.flat.inflateCoordinates(flatCoordinates, offset, end, stride, coordinatess[i]); + offset = end + } + coordinatess.length = i; + return coordinatess +}; +ol.geom.flat.inflateCoordinatesss = function(flatCoordinates, offset, endss, stride, opt_coordinatesss) { + var coordinatesss = goog.isDef(opt_coordinatesss) ? opt_coordinatesss : []; + var i = 0; + var j, jj; + for(j = 0, jj = endss.length;j < jj;++j) { + var ends = endss[j]; + coordinatesss[i++] = ol.geom.flat.inflateCoordinatess(flatCoordinates, offset, ends, stride, coordinatesss[i]); + offset = ends[ends.length - 1] + } + coordinatesss.length = i; + return coordinatesss +}; +ol.geom.flat.lineStringInterpolate = function(flatCoordinates, offset, end, stride, fraction, opt_dest) { + goog.asserts.assert(0 <= fraction && fraction <= 1); + var pointX = NaN; + var pointY = NaN; + var n = (end - offset) / stride; + if(n === 0) { + goog.asserts.fail() + }else { + if(n == 1) { + pointX = flatCoordinates[offset]; + pointY = flatCoordinates[offset + 1] + }else { + if(n == 2) { + pointX = (1 - fraction) * flatCoordinates[offset] + fraction * flatCoordinates[offset + stride]; + pointY = (1 - fraction) * flatCoordinates[offset + 1] + fraction * flatCoordinates[offset + stride + 1] + }else { + var x1 = flatCoordinates[offset]; + var y1 = flatCoordinates[offset + 1]; + var length = 0; + var cumulativeLengths = [0]; + var i; + for(i = offset + stride;i < end;i += stride) { + var x2 = flatCoordinates[i]; + var y2 = flatCoordinates[i + 1]; + length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + cumulativeLengths.push(length); + x1 = x2; + y1 = y2 + } + var target = fraction * length; + var index = goog.array.binarySearch(cumulativeLengths, target); + if(index < 0) { + var t = (target - cumulativeLengths[-index - 2]) / (cumulativeLengths[-index - 1] - cumulativeLengths[-index - 2]); + var o = offset + (-index - 2) * stride; + pointX = (1 - t) * flatCoordinates[o] + t * flatCoordinates[o + stride]; + pointY = (1 - t) * flatCoordinates[o + 1] + t * flatCoordinates[o + stride + 1] + }else { + pointX = flatCoordinates[offset + index * stride]; + pointY = flatCoordinates[offset + index * stride + 1] + } + } + } + } + if(goog.isDefAndNotNull(opt_dest)) { + opt_dest.push(pointX, pointY); + return opt_dest + }else { + return[pointX, pointY] + } +}; +ol.geom.flat.lineStringCoordinateAtM = function(flatCoordinates, offset, end, stride, m, extrapolate) { + if(end == offset) { + return null + } + var coordinate; + if(m < flatCoordinates[offset + stride - 1]) { + if(extrapolate) { + coordinate = flatCoordinates.slice(offset, offset + stride); + coordinate[stride - 1] = m; + return coordinate + }else { + return null + } + }else { + if(flatCoordinates[end - 1] < m) { + if(extrapolate) { + coordinate = flatCoordinates.slice(end - stride, end); + coordinate[stride - 1] = m; + return coordinate + }else { + return null + } + } + } + if(m == flatCoordinates[offset + stride - 1]) { + return flatCoordinates.slice(offset, offset + stride) + } + var lo = offset / stride; + var hi = end / stride; + while(lo < hi) { + var mid = lo + hi >> 1; + if(m < flatCoordinates[(mid + 1) * stride - 1]) { + hi = mid + }else { + lo = mid + 1 + } + } + var m0 = flatCoordinates[lo * stride - 1]; + if(m == m0) { + return flatCoordinates.slice((lo - 1) * stride, (lo - 1) * stride + stride) + } + var m1 = flatCoordinates[(lo + 1) * stride - 1]; + goog.asserts.assert(m0 < m); + goog.asserts.assert(m <= m1); + var t = (m - m0) / (m1 - m0); + coordinate = []; + var i; + for(i = 0;i < stride - 1;++i) { + coordinate.push((1 - t) * flatCoordinates[(lo - 1) * stride + i] + t * flatCoordinates[lo * stride + i]) + } + coordinate.push(m); + goog.asserts.assert(coordinate.length == stride); + return coordinate +}; +ol.geom.flat.lineStringsCoordinateAtM = function(flatCoordinates, offset, ends, stride, m, extrapolate, interpolate) { + if(interpolate) { + return ol.geom.flat.lineStringCoordinateAtM(flatCoordinates, offset, ends[ends.length - 1], stride, m, extrapolate) + } + var coordinate; + if(m < flatCoordinates[stride - 1]) { + if(extrapolate) { + coordinate = flatCoordinates.slice(0, stride); + coordinate[stride - 1] = m; + return coordinate + }else { + return null + } + } + if(flatCoordinates[flatCoordinates.length - 1] < m) { + if(extrapolate) { + coordinate = flatCoordinates.slice(flatCoordinates.length - stride); + coordinate[stride - 1] = m; + return coordinate + }else { + return null + } + } + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + if(offset == end) { + continue + } + if(m < flatCoordinates[offset + stride - 1]) { + return null + }else { + if(m <= flatCoordinates[end - 1]) { + return ol.geom.flat.lineStringCoordinateAtM(flatCoordinates, offset, end, stride, m, false) + } + } + offset = end + } + goog.asserts.fail(); + return null +}; +ol.geom.flat.lineStringLength = function(flatCoordinates, offset, end, stride) { + var x1 = flatCoordinates[offset]; + var y1 = flatCoordinates[offset + 1]; + var length = 0; + var i; + for(i = offset + stride;i < end;i += stride) { + var x2 = flatCoordinates[i]; + var y2 = flatCoordinates[i + 1]; + length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + x1 = x2; + y1 = y2 + } + return length +}; +ol.geom.flat.linearRingArea = function(flatCoordinates, offset, end, stride) { + var twiceArea = 0; + var x1 = flatCoordinates[end - stride]; + var y1 = flatCoordinates[end - stride + 1]; + for(;offset < end;offset += stride) { + var x2 = flatCoordinates[offset]; + var y2 = flatCoordinates[offset + 1]; + twiceArea += y1 * x2 - x1 * y2; + x1 = x2; + y1 = y2 + } + return twiceArea / 2 +}; +ol.geom.flat.linearRingContainsXY = function(flatCoordinates, offset, end, stride, x, y) { + var contains = false; + var x1 = flatCoordinates[end - stride]; + var y1 = flatCoordinates[end - stride + 1]; + for(;offset < end;offset += stride) { + var x2 = flatCoordinates[offset]; + var y2 = flatCoordinates[offset + 1]; + var intersect = y1 > y != y2 > y && x < (x2 - x1) * (y - y1) / (y2 - y1) + x1; + if(intersect) { + contains = !contains + } + x1 = x2; + y1 = y2 + } + return contains +}; +ol.geom.flat.linearRingIsClockwise = function(flatCoordinates, offset, end, stride) { + var edge = 0; + var x1 = flatCoordinates[end - stride]; + var y1 = flatCoordinates[end - stride + 1]; + for(;offset < end;offset += stride) { + var x2 = flatCoordinates[offset]; + var y2 = flatCoordinates[offset + 1]; + edge += (x2 - x1) * (y2 + y1); + x1 = x2; + y1 = y2 + } + return edge > 0 +}; +ol.geom.flat.linearRingPerimeter = function(flatCoordinates, offset, end, stride) { + var perimeter = ol.geom.flat.lineStringLength(flatCoordinates, offset, end, stride); + var dx = flatCoordinates[end - stride] - flatCoordinates[offset]; + var dy = flatCoordinates[end - stride + 1] - flatCoordinates[offset + 1]; + perimeter += Math.sqrt(dx * dx + dy * dy); + return perimeter +}; +ol.geom.flat.linearRingsArea = function(flatCoordinates, offset, ends, stride) { + var area = 0; + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + area += ol.geom.flat.linearRingArea(flatCoordinates, offset, end, stride); + offset = end + } + return area +}; +ol.geom.flat.linearRingsContainsXY = function(flatCoordinates, offset, ends, stride, x, y) { + goog.asserts.assert(ends.length > 0); + if(ends.length === 0) { + return false + } + if(!ol.geom.flat.linearRingContainsXY(flatCoordinates, offset, ends[0], stride, x, y)) { + return false + } + var i, ii; + for(i = 1, ii = ends.length;i < ii;++i) { + if(ol.geom.flat.linearRingContainsXY(flatCoordinates, ends[i - 1], ends[i], stride, x, y)) { + return false + } + } + return true +}; +ol.geom.flat.linearRingsGetInteriorPoint = function(flatCoordinates, offset, ends, stride, flatCenters, flatCentersOffset, opt_dest) { + var i, ii, x, x1, x2, y1, y2; + var y = flatCenters[flatCentersOffset + 1]; + var intersections = []; + var end = ends[0]; + x1 = flatCoordinates[end - stride]; + y1 = flatCoordinates[end - stride + 1]; + for(i = offset;i < end;i += stride) { + x2 = flatCoordinates[i]; + y2 = flatCoordinates[i + 1]; + if(y <= y1 && y2 <= y || y1 <= y && y <= y2) { + x = (y - y1) / (y2 - y1) * (x2 - x1) + x1; + intersections.push(x) + } + x1 = x2; + y1 = y2 + } + var pointX = NaN; + var maxSegmentLength = -Infinity; + intersections.sort(); + x1 = intersections[0]; + for(i = 1, ii = intersections.length;i < ii;++i) { + x2 = intersections[i]; + var segmentLength = Math.abs(x2 - x1); + if(segmentLength > maxSegmentLength) { + x = (x1 + x2) / 2; + if(ol.geom.flat.linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y)) { + pointX = x; + maxSegmentLength = segmentLength + } + } + x1 = x2 + } + if(isNaN(pointX)) { + pointX = flatCenters[flatCentersOffset] + } + if(goog.isDef(opt_dest)) { + opt_dest.push(pointX, y); + return opt_dest + }else { + return[pointX, y] + } +}; +ol.geom.flat.linearRingsAreOriented = function(flatCoordinates, offset, ends, stride) { + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + var isClockwise = ol.geom.flat.linearRingIsClockwise(flatCoordinates, offset, end, stride); + if(i === 0 ? !isClockwise : isClockwise) { + return false + } + offset = end + } + return true +}; +ol.geom.flat.linearRingssAreOriented = function(flatCoordinates, offset, endss, stride) { + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + if(!ol.geom.flat.linearRingsAreOriented(flatCoordinates, offset, endss[i], stride)) { + return false + } + } + return true +}; +ol.geom.flat.linearRingssArea = function(flatCoordinates, offset, endss, stride) { + var area = 0; + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + area += ol.geom.flat.linearRingsArea(flatCoordinates, offset, ends, stride); + offset = ends[ends.length - 1] + } + return area +}; +ol.geom.flat.linearRingssContainsXY = function(flatCoordinates, offset, endss, stride, x, y) { + goog.asserts.assert(endss.length > 0); + if(endss.length === 0) { + return false + } + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + if(ol.geom.flat.linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y)) { + return true + } + offset = ends[ends.length - 1] + } + return false +}; +ol.geom.flat.linearRingssGetInteriorPoints = function(flatCoordinates, offset, endss, stride, flatCenters) { + goog.asserts.assert(2 * endss.length == flatCenters.length); + var interiorPoints = []; + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + interiorPoints = ol.geom.flat.linearRingsGetInteriorPoint(flatCoordinates, offset, ends, stride, flatCenters, 2 * i, interiorPoints); + offset = ends[ends.length - 1] + } + return interiorPoints +}; +ol.geom.flat.linearRingssGetFlatCenters = function(flatCoordinates, offset, endss, stride) { + var flatCenters = []; + var i, ii; + var extent = ol.extent.createEmpty(); + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + extent = ol.extent.createOrUpdateFromFlatCoordinates(flatCoordinates, offset, ends[0], stride); + flatCenters.push((extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2); + offset = ends[ends.length - 1] + } + return flatCenters +}; +ol.geom.flat.orientLinearRings = function(flatCoordinates, offset, ends, stride) { + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + var isClockwise = ol.geom.flat.linearRingIsClockwise(flatCoordinates, offset, end, stride); + var reverse = i === 0 ? !isClockwise : isClockwise; + if(reverse) { + ol.geom.flat.reverseCoordinates(flatCoordinates, offset, end, stride) + } + offset = end + } + return offset +}; +ol.geom.flat.orientLinearRingss = function(flatCoordinates, offset, endss, stride) { + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + offset = ol.geom.flat.orientLinearRings(flatCoordinates, offset, endss[i], stride) + } + return offset +}; +ol.geom.flat.reverseCoordinates = function(flatCoordinates, offset, end, stride) { + while(offset < end - stride) { + var i; + for(i = 0;i < stride;++i) { + var tmp = flatCoordinates[offset + i]; + flatCoordinates[offset + i] = flatCoordinates[end - stride + i]; + flatCoordinates[end - stride + i] = tmp + } + offset += stride; + end -= stride + } +}; +ol.geom.flat.squaredSegmentDistance = function(x, y, x1, y1, x2, y2) { + var dx = x2 - x1; + var dy = y2 - y1; + if(dx !== 0 || dy !== 0) { + var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy); + if(t > 1) { + x1 = x2; + y1 = y2 + }else { + if(t > 0) { + x1 += dx * t; + y1 += dy * t + } + } + } + return ol.geom.flat.squaredDistance(x, y, x1, y1) +}; +ol.geom.flat.squaredDistance = function(x1, y1, x2, y2) { + var dx = x2 - x1; + var dy = y2 - y1; + return dx * dx + dy * dy +}; +ol.geom.flat.transform2D = function(flatCoordinates, stride, transform, opt_dest) { + var m00 = goog.vec.Mat4.getElement(transform, 0, 0); + var m10 = goog.vec.Mat4.getElement(transform, 1, 0); + var m01 = goog.vec.Mat4.getElement(transform, 0, 1); + var m11 = goog.vec.Mat4.getElement(transform, 1, 1); + var m03 = goog.vec.Mat4.getElement(transform, 0, 3); + var m13 = goog.vec.Mat4.getElement(transform, 1, 3); + var dest = goog.isDef(opt_dest) ? opt_dest : []; + var i = 0; + var j, jj; + for(j = 0, jj = flatCoordinates.length;j < jj;j += stride) { + var x = flatCoordinates[j]; + var y = flatCoordinates[j + 1]; + dest[i++] = m00 * x + m01 * y + m03; + dest[i++] = m10 * x + m11 * y + m13 + } + if(goog.isDef(opt_dest) && dest.length != i) { + dest.length = i + } + return dest +}; +goog.provide("ol.geom.SimpleGeometry"); +goog.require("goog.asserts"); +goog.require("goog.functions"); +goog.require("goog.object"); +goog.require("ol.extent"); +goog.require("ol.geom.Geometry"); +goog.require("ol.geom.flat"); +ol.geom.SimpleGeometry = function() { + goog.base(this); + this.layout = ol.geom.GeometryLayout.XY; + this.stride = 2; + this.flatCoordinates = null +}; +goog.inherits(ol.geom.SimpleGeometry, ol.geom.Geometry); +ol.geom.SimpleGeometry.getLayoutForStride_ = function(stride) { + if(stride == 2) { + return ol.geom.GeometryLayout.XY + }else { + if(stride == 3) { + return ol.geom.GeometryLayout.XYZ + }else { + if(stride == 4) { + return ol.geom.GeometryLayout.XYZM + }else { + throw new Error("unsupported stride: " + stride); + } + } + } +}; +ol.geom.SimpleGeometry.getStrideForLayout_ = function(layout) { + if(layout == ol.geom.GeometryLayout.XY) { + return 2 + }else { + if(layout == ol.geom.GeometryLayout.XYZ) { + return 3 + }else { + if(layout == ol.geom.GeometryLayout.XYM) { + return 3 + }else { + if(layout == ol.geom.GeometryLayout.XYZM) { + return 4 + }else { + throw new Error("unsupported layout: " + layout); + } + } + } + } +}; +ol.geom.SimpleGeometry.prototype.containsXY = goog.functions.FALSE; +ol.geom.SimpleGeometry.prototype.getExtent = function(opt_extent) { + if(this.extentRevision != this.getRevision()) { + this.extent = ol.extent.createOrUpdateFromFlatCoordinates(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.extent); + this.extentRevision = this.getRevision() + } + goog.asserts.assert(goog.isDef(this.extent)); + return ol.extent.returnOrUpdate(this.extent, opt_extent) +}; +ol.geom.SimpleGeometry.prototype.getFirstCoordinate = function() { + return this.flatCoordinates.slice(0, this.stride) +}; +ol.geom.SimpleGeometry.prototype.getFlatCoordinates = function() { + return this.flatCoordinates +}; +ol.geom.SimpleGeometry.prototype.getLastCoordinate = function() { + return this.flatCoordinates.slice(this.flatCoordinates.length - this.stride) +}; +ol.geom.SimpleGeometry.prototype.getLayout = function() { + return this.layout +}; +ol.geom.SimpleGeometry.prototype.getSimplifiedGeometry = function(squaredTolerance) { + if(this.simplifiedGeometryRevision != this.getRevision()) { + goog.object.clear(this.simplifiedGeometryCache); + this.simplifiedGeometryMaxMinSquaredTolerance = 0; + this.simplifiedGeometryRevision = this.getRevision() + } + if(squaredTolerance < 0 || this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance) { + return this + } + var key = squaredTolerance.toString(); + if(this.simplifiedGeometryCache.hasOwnProperty(key)) { + return this.simplifiedGeometryCache[key] + }else { + var simplifiedGeometry = this.getSimplifiedGeometryInternal(squaredTolerance); + var simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates(); + if(simplifiedFlatCoordinates.length < this.flatCoordinates.length) { + this.simplifiedGeometryCache[key] = simplifiedGeometry; + return simplifiedGeometry + }else { + this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance; + return this + } + } +}; +ol.geom.SimpleGeometry.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { + return this +}; +ol.geom.SimpleGeometry.prototype.getStride = function() { + return this.stride +}; +ol.geom.SimpleGeometry.prototype.setFlatCoordinatesInternal = function(layout, flatCoordinates) { + this.stride = ol.geom.SimpleGeometry.getStrideForLayout_(layout); + this.layout = layout; + this.flatCoordinates = flatCoordinates +}; +ol.geom.SimpleGeometry.prototype.setLayout = function(layout, coordinates, nesting) { + var stride; + if(goog.isDef(layout)) { + stride = ol.geom.SimpleGeometry.getStrideForLayout_(layout) + }else { + var i; + for(i = 0;i < nesting;++i) { + if(coordinates.length === 0) { + this.layout = ol.geom.GeometryLayout.XY; + this.stride = 2; + return + }else { + coordinates = (coordinates[0]) + } + } + stride = (coordinates).length; + layout = ol.geom.SimpleGeometry.getLayoutForStride_(stride) + } + this.layout = layout; + this.stride = stride +}; +ol.geom.SimpleGeometry.prototype.transform = function(transformFn) { + if(!goog.isNull(this.flatCoordinates)) { + transformFn(this.flatCoordinates, this.flatCoordinates, this.stride); + this.dispatchChangeEvent() + } +}; +ol.geom.transformSimpleGeometry2D = function(simpleGeometry, transform, opt_dest) { + var flatCoordinates = simpleGeometry.getFlatCoordinates(); + if(goog.isNull(flatCoordinates)) { + return null + }else { + var stride = simpleGeometry.getStride(); + return ol.geom.flat.transform2D(flatCoordinates, stride, transform, opt_dest) + } +}; +goog.provide("ol.geom.closest"); +goog.require("goog.asserts"); +goog.require("ol.geom.flat"); +ol.geom.closest.getMaxSquaredDelta = function(flatCoordinates, offset, end, stride, maxSquaredDelta) { + var x1 = flatCoordinates[offset]; + var y1 = flatCoordinates[offset + 1]; + for(offset += stride;offset < end;offset += stride) { + var x2 = flatCoordinates[offset]; + var y2 = flatCoordinates[offset + 1]; + var squaredDelta = ol.geom.flat.squaredDistance(x1, y1, x2, y2); + if(squaredDelta > maxSquaredDelta) { + maxSquaredDelta = squaredDelta + } + x1 = x2; + y1 = y2 + } + return maxSquaredDelta +}; +ol.geom.closest.getsMaxSquaredDelta = function(flatCoordinates, offset, ends, stride, maxSquaredDelta) { + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + maxSquaredDelta = ol.geom.closest.getMaxSquaredDelta(flatCoordinates, offset, end, stride, maxSquaredDelta); + offset = end + } + return maxSquaredDelta +}; +ol.geom.closest.getssMaxSquaredDelta = function(flatCoordinates, offset, endss, stride, maxSquaredDelta) { + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + maxSquaredDelta = ol.geom.closest.getsMaxSquaredDelta(flatCoordinates, offset, ends, stride, maxSquaredDelta); + offset = ends[ends.length - 1] + } + return maxSquaredDelta +}; +ol.geom.closest.getClosestPoint = function(flatCoordinates, offset, end, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, opt_tmpPoint) { + if(offset == end) { + return minSquaredDistance + } + var i, squaredDistance; + if(maxDelta === 0) { + squaredDistance = ol.geom.flat.squaredDistance(x, y, flatCoordinates[offset], flatCoordinates[offset + 1]); + if(squaredDistance < minSquaredDistance) { + for(i = 0;i < stride;++i) { + closestPoint[i] = flatCoordinates[offset + i] + } + closestPoint.length = stride; + return squaredDistance + }else { + return minSquaredDistance + } + } + goog.asserts.assert(maxDelta > 0); + var tmpPoint = goog.isDef(opt_tmpPoint) ? opt_tmpPoint : [NaN, NaN]; + var index = offset + stride; + while(index < end) { + ol.geom.flat.closestPoint(flatCoordinates, index - stride, index, stride, x, y, tmpPoint); + squaredDistance = ol.geom.flat.squaredDistance(x, y, tmpPoint[0], tmpPoint[1]); + if(squaredDistance < minSquaredDistance) { + minSquaredDistance = squaredDistance; + for(i = 0;i < stride;++i) { + closestPoint[i] = tmpPoint[i] + } + closestPoint.length = stride; + index += stride + }else { + index += stride * Math.max((Math.sqrt(squaredDistance) - Math.sqrt(minSquaredDistance)) / maxDelta | 0, 1) + } + } + if(isRing) { + ol.geom.flat.closestPoint(flatCoordinates, end - stride, offset, stride, x, y, tmpPoint); + squaredDistance = ol.geom.flat.squaredDistance(x, y, tmpPoint[0], tmpPoint[1]); + if(squaredDistance < minSquaredDistance) { + minSquaredDistance = squaredDistance; + for(i = 0;i < stride;++i) { + closestPoint[i] = tmpPoint[i] + } + closestPoint.length = stride + } + } + return minSquaredDistance +}; +ol.geom.closest.getsClosestPoint = function(flatCoordinates, offset, ends, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, opt_tmpPoint) { + var tmpPoint = goog.isDef(opt_tmpPoint) ? opt_tmpPoint : [NaN, NaN]; + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + minSquaredDistance = ol.geom.closest.getClosestPoint(flatCoordinates, offset, end, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint); + offset = end + } + return minSquaredDistance +}; +ol.geom.closest.getssClosestPoint = function(flatCoordinates, offset, endss, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, opt_tmpPoint) { + var tmpPoint = goog.isDef(opt_tmpPoint) ? opt_tmpPoint : [NaN, NaN]; + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + minSquaredDistance = ol.geom.closest.getsClosestPoint(flatCoordinates, offset, ends, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint); + offset = ends[ends.length - 1] + } + return minSquaredDistance +}; +goog.provide("ol.geom.simplify"); +goog.require("ol.geom.flat"); +ol.geom.simplify.lineString = function(flatCoordinates, offset, end, stride, squaredTolerance, highQuality, opt_simplifiedFlatCoordinates) { + var simplifiedFlatCoordinates = goog.isDef(opt_simplifiedFlatCoordinates) ? opt_simplifiedFlatCoordinates : []; + if(!highQuality) { + end = ol.geom.simplify.radialDistance(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, 0); + flatCoordinates = simplifiedFlatCoordinates; + offset = 0; + stride = 2 + } + simplifiedFlatCoordinates.length = ol.geom.simplify.douglasPeucker(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, 0); + return simplifiedFlatCoordinates +}; +ol.geom.simplify.douglasPeucker = function(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) { + var n = (end - offset) / stride; + if(n < 3) { + for(;offset < end;offset += stride) { + simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset]; + simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + 1] + } + return simplifiedOffset + } + var markers = new Array(n); + markers[0] = 1; + markers[n - 1] = 1; + var stack = [offset, end - stride]; + var index = 0; + var i; + while(stack.length > 0) { + var last = stack.pop(); + var first = stack.pop(); + var maxSquaredDistance = 0; + var x1 = flatCoordinates[first]; + var y1 = flatCoordinates[first + 1]; + var x2 = flatCoordinates[last]; + var y2 = flatCoordinates[last + 1]; + for(i = first + stride;i < last;i += stride) { + var x = flatCoordinates[i]; + var y = flatCoordinates[i + 1]; + var squaredDistance = ol.geom.flat.squaredSegmentDistance(x, y, x1, y1, x2, y2); + if(squaredDistance > maxSquaredDistance) { + index = i; + maxSquaredDistance = squaredDistance + } + } + if(maxSquaredDistance > squaredTolerance) { + markers[(index - offset) / stride] = 1; + if(first + stride < index) { + stack.push(first, index) + } + if(index + stride < last) { + stack.push(index, last) + } + } + } + for(i = 0;i < n;++i) { + if(markers[i]) { + simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + i * stride]; + simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + i * stride + 1] + } + } + return simplifiedOffset +}; +ol.geom.simplify.douglasPeuckers = function(flatCoordinates, offset, ends, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) { + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + simplifiedOffset = ol.geom.simplify.douglasPeucker(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset); + simplifiedEnds.push(simplifiedOffset); + offset = end + } + return simplifiedOffset +}; +ol.geom.simplify.douglasPeuckerss = function(flatCoordinates, offset, endss, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) { + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + var simplifiedEnds = []; + simplifiedOffset = ol.geom.simplify.douglasPeuckers(flatCoordinates, offset, ends, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds); + simplifiedEndss.push(simplifiedEnds); + offset = ends[ends.length - 1] + } + return simplifiedOffset +}; +ol.geom.simplify.radialDistance = function(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) { + if(end <= offset + stride) { + for(;offset < end;offset += stride) { + simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset]; + simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + 1] + } + return simplifiedOffset + } + var x1 = flatCoordinates[offset]; + var y1 = flatCoordinates[offset + 1]; + simplifiedFlatCoordinates[simplifiedOffset++] = x1; + simplifiedFlatCoordinates[simplifiedOffset++] = y1; + var x2 = x1; + var y2 = y1; + for(offset += stride;offset < end;offset += stride) { + x2 = flatCoordinates[offset]; + y2 = flatCoordinates[offset + 1]; + if(ol.geom.flat.squaredDistance(x1, y1, x2, y2) > squaredTolerance) { + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2; + x1 = x2; + y1 = y2 + } + } + if(x2 != x1 || y2 != y1) { + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2 + } + return simplifiedOffset +}; +ol.geom.simplify.snap = function(value, tolerance) { + return tolerance * Math.round(value / tolerance) +}; +ol.geom.simplify.quantize = function(flatCoordinates, offset, end, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset) { + if(offset == end) { + return simplifiedOffset + } + var x1 = ol.geom.simplify.snap(flatCoordinates[offset], tolerance); + var y1 = ol.geom.simplify.snap(flatCoordinates[offset + 1], tolerance); + offset += stride; + simplifiedFlatCoordinates[simplifiedOffset++] = x1; + simplifiedFlatCoordinates[simplifiedOffset++] = y1; + var x2, y2; + do { + x2 = ol.geom.simplify.snap(flatCoordinates[offset], tolerance); + y2 = ol.geom.simplify.snap(flatCoordinates[offset + 1], tolerance); + offset += stride; + if(offset == end) { + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2; + return simplifiedOffset + } + }while(x2 == x1 && y2 == y1); + while(offset < end) { + var x3, y3; + x3 = ol.geom.simplify.snap(flatCoordinates[offset], tolerance); + y3 = ol.geom.simplify.snap(flatCoordinates[offset + 1], tolerance); + offset += stride; + if(x3 == x2 && y3 == y2) { + continue + } + var dx1 = x2 - x1; + var dy1 = y2 - y1; + var dx2 = x3 - x1; + var dy2 = y3 - y1; + if(dx1 * dy2 == dy1 * dx2 && (dx1 < 0 && dx2 < dx1 || dx1 == dx2 || dx1 > 0 && dx2 > dx1) && (dy1 < 0 && dy2 < dy1 || dy1 == dy2 || dy1 > 0 && dy2 > dy1)) { + x2 = x3; + y2 = y3; + continue + } + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2; + x1 = x2; + y1 = y2; + x2 = x3; + y2 = y3 + } + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2; + return simplifiedOffset +}; +ol.geom.simplify.quantizes = function(flatCoordinates, offset, ends, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) { + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + simplifiedOffset = ol.geom.simplify.quantize(flatCoordinates, offset, end, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset); + simplifiedEnds.push(simplifiedOffset); + offset = end + } + return simplifiedOffset +}; +ol.geom.simplify.quantizess = function(flatCoordinates, offset, endss, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) { + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + var simplifiedEnds = []; + simplifiedOffset = ol.geom.simplify.quantizes(flatCoordinates, offset, ends, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds); + simplifiedEndss.push(simplifiedEnds); + offset = ends[ends.length - 1] + } + return simplifiedOffset +}; +goog.provide("ol.geom.LinearRing"); +goog.require("ol.extent"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.SimpleGeometry"); +goog.require("ol.geom.closest"); +goog.require("ol.geom.flat"); +goog.require("ol.geom.simplify"); +ol.geom.LinearRing = function(coordinates, opt_layout) { + goog.base(this); + this.maxDelta_ = -1; + this.maxDeltaRevision_ = -1; + this.setCoordinates(coordinates, opt_layout) +}; +goog.inherits(ol.geom.LinearRing, ol.geom.SimpleGeometry); +ol.geom.LinearRing.prototype.clone = function() { + var linearRing = new ol.geom.LinearRing(null); + linearRing.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return linearRing +}; +ol.geom.LinearRing.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { + if(minSquaredDistance < ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance + } + if(this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getMaxSquaredDelta(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision() + } + return ol.geom.closest.getClosestPoint(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.maxDelta_, true, x, y, closestPoint, minSquaredDistance) +}; +ol.geom.LinearRing.prototype.getArea = function() { + return ol.geom.flat.linearRingArea(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride) +}; +ol.geom.LinearRing.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinates(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride) +}; +ol.geom.LinearRing.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.douglasPeucker(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, squaredTolerance, simplifiedFlatCoordinates, 0); + var simplifiedLinearRing = new ol.geom.LinearRing(null); + simplifiedLinearRing.setFlatCoordinates(ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates); + return simplifiedLinearRing +}; +ol.geom.LinearRing.prototype.getType = function() { + return ol.geom.GeometryType.LINEAR_RING +}; +ol.geom.LinearRing.prototype.setCoordinates = function(coordinates, opt_layout) { + if(goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null) + }else { + this.setLayout(opt_layout, coordinates, 1); + if(goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = [] + } + this.flatCoordinates.length = ol.geom.flat.deflateCoordinates(this.flatCoordinates, 0, coordinates, this.stride); + this.dispatchChangeEvent() + } +}; +ol.geom.LinearRing.prototype.setFlatCoordinates = function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent() +}; +goog.provide("ol.geom.Point"); +goog.require("goog.asserts"); +goog.require("ol.extent"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.SimpleGeometry"); +goog.require("ol.geom.flat"); +ol.geom.Point = function(coordinates, opt_layout) { + goog.base(this); + this.setCoordinates(coordinates, opt_layout) +}; +goog.inherits(ol.geom.Point, ol.geom.SimpleGeometry); +ol.geom.Point.prototype.clone = function() { + var point = new ol.geom.Point(null); + point.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return point +}; +ol.geom.Point.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { + var flatCoordinates = this.flatCoordinates; + var squaredDistance = ol.geom.flat.squaredDistance(x, y, flatCoordinates[0], flatCoordinates[1]); + if(squaredDistance < minSquaredDistance) { + var stride = this.stride; + var i; + for(i = 0;i < stride;++i) { + closestPoint[i] = flatCoordinates[i] + } + closestPoint.length = stride; + return squaredDistance + }else { + return minSquaredDistance + } +}; +ol.geom.Point.prototype.getCoordinates = function() { + return this.flatCoordinates.slice() +}; +ol.geom.Point.prototype.getExtent = function(opt_extent) { + if(this.extentRevision != this.getRevision()) { + this.extent = ol.extent.createOrUpdateFromCoordinate(this.flatCoordinates, this.extent); + this.extentRevision = this.getRevision() + } + goog.asserts.assert(goog.isDef(this.extent)); + return ol.extent.returnOrUpdate(this.extent, opt_extent) +}; +ol.geom.Point.prototype.getType = function() { + return ol.geom.GeometryType.POINT +}; +ol.geom.Point.prototype.setCoordinates = function(coordinates, opt_layout) { + if(goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null) + }else { + this.setLayout(opt_layout, coordinates, 0); + if(goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = [] + } + this.flatCoordinates.length = ol.geom.flat.deflateCoordinate(this.flatCoordinates, 0, coordinates, this.stride); + this.dispatchChangeEvent() + } +}; +ol.geom.Point.prototype.setFlatCoordinates = function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent() +}; +goog.provide("ol.geom.Polygon"); +goog.require("ol.extent"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.LinearRing"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.SimpleGeometry"); +goog.require("ol.geom.closest"); +goog.require("ol.geom.flat"); +goog.require("ol.geom.simplify"); +ol.geom.Polygon = function(coordinates, opt_layout) { + goog.base(this); + this.ends_ = []; + this.flatInteriorPointRevision_ = -1; + this.flatInteriorPoint_ = null; + this.maxDelta_ = -1; + this.maxDeltaRevision_ = -1; + this.orientedRevision_ = -1; + this.orientedFlatCoordinates_ = null; + this.setCoordinates(coordinates, opt_layout) +}; +goog.inherits(ol.geom.Polygon, ol.geom.SimpleGeometry); +ol.geom.Polygon.prototype.clone = function() { + var polygon = new ol.geom.Polygon(null); + polygon.setFlatCoordinates(this.layout, this.flatCoordinates.slice(), this.ends_.slice()); + return polygon +}; +ol.geom.Polygon.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { + if(minSquaredDistance < ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance + } + if(this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getsMaxSquaredDelta(this.flatCoordinates, 0, this.ends_, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision() + } + return ol.geom.closest.getsClosestPoint(this.flatCoordinates, 0, this.ends_, this.stride, this.maxDelta_, true, x, y, closestPoint, minSquaredDistance) +}; +ol.geom.Polygon.prototype.containsXY = function(x, y) { + return ol.geom.flat.linearRingsContainsXY(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, x, y) +}; +ol.geom.Polygon.prototype.getArea = function() { + return ol.geom.flat.linearRingsArea(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride) +}; +ol.geom.Polygon.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinatess(this.flatCoordinates, 0, this.ends_, this.stride) +}; +ol.geom.Polygon.prototype.getEnds = function() { + return this.ends_ +}; +ol.geom.Polygon.prototype.getFlatInteriorPoint = function() { + if(this.flatInteriorPointRevision_ != this.getRevision()) { + var flatCenter = ol.extent.getCenter(this.getExtent()); + this.flatInteriorPoint_ = ol.geom.flat.linearRingsGetInteriorPoint(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, flatCenter, 0); + this.flatInteriorPointRevision_ = this.getRevision() + } + return this.flatInteriorPoint_ +}; +ol.geom.Polygon.prototype.getInteriorPoint = function() { + return new ol.geom.Point(this.getFlatInteriorPoint()) +}; +ol.geom.Polygon.prototype.getLinearRings = function() { + var layout = this.layout; + var flatCoordinates = this.flatCoordinates; + var ends = this.ends_; + var linearRings = []; + var offset = 0; + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + var linearRing = new ol.geom.LinearRing(null); + linearRing.setFlatCoordinates(layout, flatCoordinates.slice(offset, end)); + linearRings.push(linearRing); + offset = end + } + return linearRings +}; +ol.geom.Polygon.prototype.getOrientedFlatCoordinates = function() { + if(this.orientedRevision_ != this.getRevision()) { + var flatCoordinates = this.flatCoordinates; + if(ol.geom.flat.linearRingsAreOriented(flatCoordinates, 0, this.ends_, this.stride)) { + this.orientedFlatCoordinates_ = flatCoordinates + }else { + this.orientedFlatCoordinates_ = flatCoordinates.slice(); + this.orientedFlatCoordinates_.length = ol.geom.flat.orientLinearRings(this.orientedFlatCoordinates_, 0, this.ends_, this.stride) + } + this.orientedRevision_ = this.getRevision() + } + return this.orientedFlatCoordinates_ +}; +ol.geom.Polygon.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + var simplifiedEnds = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.quantizes(this.flatCoordinates, 0, this.ends_, this.stride, Math.sqrt(squaredTolerance), simplifiedFlatCoordinates, 0, simplifiedEnds); + var simplifiedPolygon = new ol.geom.Polygon(null); + simplifiedPolygon.setFlatCoordinates(ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEnds); + return simplifiedPolygon +}; +ol.geom.Polygon.prototype.getType = function() { + return ol.geom.GeometryType.POLYGON +}; +ol.geom.Polygon.prototype.setCoordinates = function(coordinates, opt_layout) { + if(goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.ends_) + }else { + this.setLayout(opt_layout, coordinates, 2); + if(goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = [] + } + var ends = ol.geom.flat.deflateCoordinatess(this.flatCoordinates, 0, coordinates, this.stride, this.ends_); + this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1]; + this.dispatchChangeEvent() + } +}; +ol.geom.Polygon.prototype.setFlatCoordinates = function(layout, flatCoordinates, ends) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.ends_ = ends; + this.dispatchChangeEvent() +}; +goog.provide("ol.render.IVectorContext"); +ol.render.IVectorContext = function() { +}; +ol.render.IVectorContext.prototype.drawAsync = function(zIndex, callback) { +}; +ol.render.IVectorContext.prototype.drawCircleGeometry = function(circleGeometry, data) { +}; +ol.render.IVectorContext.prototype.drawFeature = function(feature, style) { +}; +ol.render.IVectorContext.prototype.drawGeometryCollectionGeometry = function(geometryCollectionGeometry, data) { +}; +ol.render.IVectorContext.prototype.drawPointGeometry = function(pointGeometry, data) { +}; +ol.render.IVectorContext.prototype.drawLineStringGeometry = function(lineStringGeometry, data) { +}; +ol.render.IVectorContext.prototype.drawMultiLineStringGeometry = function(multiLineStringGeometry, data) { +}; +ol.render.IVectorContext.prototype.drawMultiPointGeometry = function(multiPointGeometry, data) { +}; +ol.render.IVectorContext.prototype.drawMultiPolygonGeometry = function(multiPolygonGeometry, data) { +}; +ol.render.IVectorContext.prototype.drawPolygonGeometry = function(polygonGeometry, data) { +}; +ol.render.IVectorContext.prototype.drawText = function(flatCoordinates, offset, end, stride, geometry, data) { +}; +ol.render.IVectorContext.prototype.setFillStrokeStyle = function(fillStyle, strokeStyle) { +}; +ol.render.IVectorContext.prototype.setImageStyle = function(imageStyle) { +}; +ol.render.IVectorContext.prototype.setTextStyle = function(textStyle) { +}; +goog.provide("ol.render.Event"); +goog.provide("ol.render.EventType"); +goog.require("goog.events.Event"); +goog.require("ol.render.IVectorContext"); +ol.render.EventType = {POSTCOMPOSE:"postcompose", PRECOMPOSE:"precompose", RENDER:"render"}; +ol.render.Event = function(type, opt_target, opt_vectorContext, opt_frameState, opt_context, opt_glContext) { + goog.base(this, type, opt_target); + this.vectorContext = opt_vectorContext; + this.frameState = opt_frameState; + this.context = opt_context; + this.glContext = opt_glContext +}; +goog.inherits(ol.render.Event, goog.events.Event); +goog.provide("ol.render.Box"); +goog.require("goog.Disposable"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("ol.geom.Polygon"); +goog.require("ol.render.EventType"); +ol.render.Box = function(style) { + this.map_ = null; + this.postComposeListenerKey_ = null; + this.startPixel_ = null; + this.endPixel_ = null; + this.geometry_ = null; + this.style_ = style +}; +goog.inherits(ol.render.Box, goog.Disposable); +ol.render.Box.prototype.createGeometry_ = function() { + goog.asserts.assert(!goog.isNull(this.startPixel_)); + goog.asserts.assert(!goog.isNull(this.endPixel_)); + goog.asserts.assert(!goog.isNull(this.map_)); + var startPixel = this.startPixel_; + var endPixel = this.endPixel_; + var pixels = [startPixel, [startPixel[0], endPixel[1]], endPixel, [endPixel[0], startPixel[1]]]; + var coordinates = goog.array.map(pixels, this.map_.getCoordinateFromPixel, this.map_); + coordinates[4] = coordinates[0].slice(); + return new ol.geom.Polygon([coordinates]) +}; +ol.render.Box.prototype.disposeInternal = function() { + this.setMap(null) +}; +ol.render.Box.prototype.handleMapPostCompose_ = function(event) { + var geometry = this.geometry_; + goog.asserts.assert(!goog.isNull(geometry)); + var style = this.style_; + goog.asserts.assert(!goog.isNull(style)); + event.vectorContext.drawAsync(Infinity, function(render) { + render.setFillStrokeStyle(style.getFill(), style.getStroke()); + render.setTextStyle(style.getText()); + render.drawPolygonGeometry(geometry, null) + }) +}; +ol.render.Box.prototype.getGeometry = function() { + return this.geometry_ +}; +ol.render.Box.prototype.requestMapRenderFrame_ = function() { + if(!goog.isNull(this.map_) && !goog.isNull(this.startPixel_) && !goog.isNull(this.endPixel_)) { + this.map_.render() + } +}; +ol.render.Box.prototype.setMap = function(map) { + if(!goog.isNull(this.postComposeListenerKey_)) { + goog.events.unlistenByKey(this.postComposeListenerKey_); + this.postComposeListenerKey_ = null; + this.map_.render(); + this.map_ = null + } + this.map_ = map; + if(!goog.isNull(this.map_)) { + this.postComposeListenerKey_ = goog.events.listen(map, ol.render.EventType.POSTCOMPOSE, this.handleMapPostCompose_, false, this); + this.requestMapRenderFrame_() + } +}; +ol.render.Box.prototype.setPixels = function(startPixel, endPixel) { + this.startPixel_ = startPixel; + this.endPixel_ = endPixel; + this.geometry_ = this.createGeometry_(); + this.requestMapRenderFrame_() +}; +goog.provide("ol.DragBoxEvent"); +goog.provide("ol.interaction.DragBox"); +goog.require("goog.asserts"); +goog.require("goog.events.Event"); +goog.require("ol.events.ConditionType"); +goog.require("ol.events.condition"); +goog.require("ol.interaction.Drag"); +goog.require("ol.render.Box"); +ol.DRAG_BOX_HYSTERESIS_PIXELS = 8; +ol.DRAG_BOX_HYSTERESIS_PIXELS_SQUARED = ol.DRAG_BOX_HYSTERESIS_PIXELS * ol.DRAG_BOX_HYSTERESIS_PIXELS; +ol.DragBoxEventType = {BOXSTART:"boxstart", BOXEND:"boxend"}; +ol.DragBoxEvent = function(type, coordinate) { + goog.base(this, type); + this.coordinate = coordinate +}; +goog.inherits(ol.DragBoxEvent, goog.events.Event); +ol.interaction.DragBox = function(opt_options) { + goog.base(this); + var options = goog.isDef(opt_options) ? opt_options : {}; + var style = goog.isDef(options.style) ? options.style : null; + this.box_ = new ol.render.Box(style); + this.startPixel_ = null; + this.condition_ = goog.isDef(options.condition) ? options.condition : ol.events.condition.always +}; +goog.inherits(ol.interaction.DragBox, ol.interaction.Drag); +ol.interaction.DragBox.prototype.handleDrag = function(mapBrowserEvent) { + this.box_.setPixels(this.startPixel_, mapBrowserEvent.pixel) +}; +ol.interaction.DragBox.prototype.getGeometry = function() { + return this.box_.getGeometry() +}; +ol.interaction.DragBox.prototype.onBoxEnd = goog.nullFunction; +ol.interaction.DragBox.prototype.handleDragEnd = function(mapBrowserEvent) { + this.box_.setMap(null); + if(this.deltaX * this.deltaX + this.deltaY * this.deltaY >= ol.DRAG_BOX_HYSTERESIS_PIXELS_SQUARED) { + this.onBoxEnd(mapBrowserEvent); + this.dispatchEvent(new ol.DragBoxEvent(ol.DragBoxEventType.BOXEND, mapBrowserEvent.coordinate)) + } +}; +ol.interaction.DragBox.prototype.handleDragStart = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + if(browserEvent.isMouseActionButton() && this.condition_(mapBrowserEvent)) { + this.startPixel_ = mapBrowserEvent.pixel; + this.box_.setMap(mapBrowserEvent.map); + this.box_.setPixels(this.startPixel_, this.startPixel_); + this.dispatchEvent(new ol.DragBoxEvent(ol.DragBoxEventType.BOXSTART, mapBrowserEvent.coordinate)); + return true + }else { + return false + } +}; +goog.provide("goog.color.names"); +goog.color.names = {"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", "darkgreen":"#006400", "darkgrey":"#a9a9a9", "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", "green":"#008000", "greenyellow":"#adff2f", "grey":"#808080", "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", "lightgreen":"#90ee90", "lightgrey":"#d3d3d3", "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":"#9370db", "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":"#db7093", "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"}; +goog.provide("goog.color"); +goog.require("goog.color.names"); +goog.require("goog.math"); +goog.color.Rgb; +goog.color.Hsv; +goog.color.Hsl; +goog.color.parse = function(str) { + var result = {}; + str = String(str); + var maybeHex = goog.color.prependHashIfNecessaryHelper(str); + if(goog.color.isValidHexColor_(maybeHex)) { + result.hex = goog.color.normalizeHex(maybeHex); + result.type = "hex"; + return result + }else { + var rgb = goog.color.isValidRgbColor_(str); + if(rgb.length) { + result.hex = goog.color.rgbArrayToHex(rgb); + result.type = "rgb"; + return result + }else { + if(goog.color.names) { + var hex = goog.color.names[str.toLowerCase()]; + if(hex) { + result.hex = hex; + result.type = "named"; + return result + } + } + } + } + throw Error(str + " is not a valid color string"); +}; +goog.color.isValidColor = function(str) { + var maybeHex = goog.color.prependHashIfNecessaryHelper(str); + return!!(goog.color.isValidHexColor_(maybeHex) || goog.color.isValidRgbColor_(str).length || goog.color.names && goog.color.names[str.toLowerCase()]) +}; +goog.color.parseRgb = function(str) { + var rgb = goog.color.isValidRgbColor_(str); + if(!rgb.length) { + throw Error(str + " is not a valid RGB color"); + } + return rgb +}; +goog.color.hexToRgbStyle = function(hexColor) { + return goog.color.rgbStyle_(goog.color.hexToRgb(hexColor)) +}; +goog.color.hexTripletRe_ = /#(.)(.)(.)/; +goog.color.normalizeHex = function(hexColor) { + if(!goog.color.isValidHexColor_(hexColor)) { + throw Error("'" + hexColor + "' is not a valid hex color"); + } + if(hexColor.length == 4) { + hexColor = hexColor.replace(goog.color.hexTripletRe_, "#$1$1$2$2$3$3") + } + return hexColor.toLowerCase() +}; +goog.color.hexToRgb = function(hexColor) { + hexColor = goog.color.normalizeHex(hexColor); + var r = parseInt(hexColor.substr(1, 2), 16); + var g = parseInt(hexColor.substr(3, 2), 16); + var b = parseInt(hexColor.substr(5, 2), 16); + return[r, g, b] +}; +goog.color.rgbToHex = function(r, g, b) { + r = Number(r); + g = Number(g); + b = Number(b); + if(isNaN(r) || r < 0 || r > 255 || isNaN(g) || g < 0 || g > 255 || isNaN(b) || b < 0 || b > 255) { + throw Error('"(' + r + "," + g + "," + b + '") is not a valid RGB color'); + } + var hexR = goog.color.prependZeroIfNecessaryHelper(r.toString(16)); + var hexG = goog.color.prependZeroIfNecessaryHelper(g.toString(16)); + var hexB = goog.color.prependZeroIfNecessaryHelper(b.toString(16)); + return"#" + hexR + hexG + hexB +}; +goog.color.rgbArrayToHex = function(rgb) { + return goog.color.rgbToHex(rgb[0], rgb[1], rgb[2]) +}; +goog.color.rgbToHsl = function(r, g, b) { + var normR = r / 255; + var normG = g / 255; + var normB = b / 255; + var max = Math.max(normR, normG, normB); + var min = Math.min(normR, normG, normB); + var h = 0; + var s = 0; + var l = 0.5 * (max + min); + if(max != min) { + if(max == normR) { + h = 60 * (normG - normB) / (max - min) + }else { + if(max == normG) { + h = 60 * (normB - normR) / (max - min) + 120 + }else { + if(max == normB) { + h = 60 * (normR - normG) / (max - min) + 240 + } + } + } + if(0 < l && l <= 0.5) { + s = (max - min) / (2 * l) + }else { + s = (max - min) / (2 - 2 * l) + } + } + return[Math.round(h + 360) % 360, s, l] +}; +goog.color.rgbArrayToHsl = function(rgb) { + return goog.color.rgbToHsl(rgb[0], rgb[1], rgb[2]) +}; +goog.color.hueToRgb_ = function(v1, v2, vH) { + if(vH < 0) { + vH += 1 + }else { + if(vH > 1) { + vH -= 1 + } + } + if(6 * vH < 1) { + return v1 + (v2 - v1) * 6 * vH + }else { + if(2 * vH < 1) { + return v2 + }else { + if(3 * vH < 2) { + return v1 + (v2 - v1) * (2 / 3 - vH) * 6 + } + } + } + return v1 +}; +goog.color.hslToRgb = function(h, s, l) { + var r = 0; + var g = 0; + var b = 0; + var normH = h / 360; + if(s == 0) { + r = g = b = l * 255 + }else { + var temp1 = 0; + var temp2 = 0; + if(l < 0.5) { + temp2 = l * (1 + s) + }else { + temp2 = l + s - s * l + } + temp1 = 2 * l - temp2; + r = 255 * goog.color.hueToRgb_(temp1, temp2, normH + 1 / 3); + g = 255 * goog.color.hueToRgb_(temp1, temp2, normH); + b = 255 * goog.color.hueToRgb_(temp1, temp2, normH - 1 / 3) + } + return[Math.round(r), Math.round(g), Math.round(b)] +}; +goog.color.hslArrayToRgb = function(hsl) { + return goog.color.hslToRgb(hsl[0], hsl[1], hsl[2]) +}; +goog.color.validHexColorRe_ = /^#(?:[0-9a-f]{3}){1,2}$/i; +goog.color.isValidHexColor_ = function(str) { + return goog.color.validHexColorRe_.test(str) +}; +goog.color.normalizedHexColorRe_ = /^#[0-9a-f]{6}$/; +goog.color.isNormalizedHexColor_ = function(str) { + return goog.color.normalizedHexColorRe_.test(str) +}; +goog.color.rgbColorRe_ = /^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i; +goog.color.isValidRgbColor_ = function(str) { + var regExpResultArray = str.match(goog.color.rgbColorRe_); + if(regExpResultArray) { + var r = Number(regExpResultArray[1]); + var g = Number(regExpResultArray[2]); + var b = Number(regExpResultArray[3]); + if(r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255) { + return[r, g, b] + } + } + return[] +}; +goog.color.prependZeroIfNecessaryHelper = function(hex) { + return hex.length == 1 ? "0" + hex : hex +}; +goog.color.prependHashIfNecessaryHelper = function(str) { + return str.charAt(0) == "#" ? str : "#" + str +}; +goog.color.rgbStyle_ = function(rgb) { + return"rgb(" + rgb.join(",") + ")" +}; +goog.color.hsvToRgb = function(h, s, brightness) { + var red = 0; + var green = 0; + var blue = 0; + if(s == 0) { + red = brightness; + green = brightness; + blue = brightness + }else { + var sextant = Math.floor(h / 60); + var remainder = h / 60 - sextant; + var val1 = brightness * (1 - s); + var val2 = brightness * (1 - s * remainder); + var val3 = brightness * (1 - s * (1 - remainder)); + switch(sextant) { + case 1: + red = val2; + green = brightness; + blue = val1; + break; + case 2: + red = val1; + green = brightness; + blue = val3; + break; + case 3: + red = val1; + green = val2; + blue = brightness; + break; + case 4: + red = val3; + green = val1; + blue = brightness; + break; + case 5: + red = brightness; + green = val1; + blue = val2; + break; + case 6: + ; + case 0: + red = brightness; + green = val3; + blue = val1; + break + } + } + return[Math.floor(red), Math.floor(green), Math.floor(blue)] +}; +goog.color.rgbToHsv = function(red, green, blue) { + var max = Math.max(Math.max(red, green), blue); + var min = Math.min(Math.min(red, green), blue); + var hue; + var saturation; + var value = max; + if(min == max) { + hue = 0; + saturation = 0 + }else { + var delta = max - min; + saturation = delta / max; + if(red == max) { + hue = (green - blue) / delta + }else { + if(green == max) { + hue = 2 + (blue - red) / delta + }else { + hue = 4 + (red - green) / delta + } + } + hue *= 60; + if(hue < 0) { + hue += 360 + } + if(hue > 360) { + hue -= 360 + } + } + return[hue, saturation, value] +}; +goog.color.rgbArrayToHsv = function(rgb) { + return goog.color.rgbToHsv(rgb[0], rgb[1], rgb[2]) +}; +goog.color.hsvArrayToRgb = function(hsv) { + return goog.color.hsvToRgb(hsv[0], hsv[1], hsv[2]) +}; +goog.color.hexToHsl = function(hex) { + var rgb = goog.color.hexToRgb(hex); + return goog.color.rgbToHsl(rgb[0], rgb[1], rgb[2]) +}; +goog.color.hslToHex = function(h, s, l) { + return goog.color.rgbArrayToHex(goog.color.hslToRgb(h, s, l)) +}; +goog.color.hslArrayToHex = function(hsl) { + return goog.color.rgbArrayToHex(goog.color.hslToRgb(hsl[0], hsl[1], hsl[2])) +}; +goog.color.hexToHsv = function(hex) { + return goog.color.rgbArrayToHsv(goog.color.hexToRgb(hex)) +}; +goog.color.hsvToHex = function(h, s, v) { + return goog.color.rgbArrayToHex(goog.color.hsvToRgb(h, s, v)) +}; +goog.color.hsvArrayToHex = function(hsv) { + return goog.color.hsvToHex(hsv[0], hsv[1], hsv[2]) +}; +goog.color.hslDistance = function(hsl1, hsl2) { + var sl1, sl2; + if(hsl1[2] <= 0.5) { + sl1 = hsl1[1] * hsl1[2] + }else { + sl1 = hsl1[1] * (1 - hsl1[2]) + } + if(hsl2[2] <= 0.5) { + sl2 = hsl2[1] * hsl2[2] + }else { + sl2 = hsl2[1] * (1 - hsl2[2]) + } + var h1 = hsl1[0] / 360; + var h2 = hsl2[0] / 360; + var dh = (h1 - h2) * 2 * Math.PI; + return(hsl1[2] - hsl2[2]) * (hsl1[2] - hsl2[2]) + sl1 * sl1 + sl2 * sl2 - 2 * sl1 * sl2 * Math.cos(dh) +}; +goog.color.blend = function(rgb1, rgb2, factor) { + factor = goog.math.clamp(factor, 0, 1); + return[Math.round(factor * rgb1[0] + (1 - factor) * rgb2[0]), Math.round(factor * rgb1[1] + (1 - factor) * rgb2[1]), Math.round(factor * rgb1[2] + (1 - factor) * rgb2[2])] +}; +goog.color.darken = function(rgb, factor) { + var black = [0, 0, 0]; + return goog.color.blend(black, rgb, factor) +}; +goog.color.lighten = function(rgb, factor) { + var white = [255, 255, 255]; + return goog.color.blend(white, rgb, factor) +}; +goog.color.highContrast = function(prime, suggestions) { + var suggestionsWithDiff = []; + for(var i = 0;i < suggestions.length;i++) { + suggestionsWithDiff.push({color:suggestions[i], diff:goog.color.yiqBrightnessDiff_(suggestions[i], prime) + goog.color.colorDiff_(suggestions[i], prime)}) + } + suggestionsWithDiff.sort(function(a, b) { + return b.diff - a.diff + }); + return suggestionsWithDiff[0].color +}; +goog.color.yiqBrightness_ = function(rgb) { + return Math.round((rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1E3) +}; +goog.color.yiqBrightnessDiff_ = function(rgb1, rgb2) { + return Math.abs(goog.color.yiqBrightness_(rgb1) - goog.color.yiqBrightness_(rgb2)) +}; +goog.color.colorDiff_ = function(rgb1, rgb2) { + return Math.abs(rgb1[0] - rgb2[0]) + Math.abs(rgb1[1] - rgb2[1]) + Math.abs(rgb1[2] - rgb2[2]) +}; +goog.provide("ol.color"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.color"); +goog.require("goog.color.names"); +goog.require("goog.math"); +goog.require("goog.vec.Mat4"); +ol.color.ENABLE_NAMED_COLORS = true; +ol.Color; +ol.color.hexColorRe_ = /^#(?:[0-9a-f]{3}){1,2}$/i; +ol.color.rgbColorRe_ = /^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i; +ol.color.rgbaColorRe_ = /^(?:rgba)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|1|0\.\d{0,10})\)$/i; +ol.color.blend = function(dst, src, opt_color) { + var out = goog.isDef(opt_color) ? opt_color : []; + var dstA = dst[3]; + var srcA = dst[3]; + if(dstA == 1) { + out[0] = src[0] * srcA + dst[0] * (1 - srcA) + 0.5 | 0; + out[1] = src[1] * srcA + dst[1] * (1 - srcA) + 0.5 | 0; + out[2] = src[2] * srcA + dst[2] * (1 - srcA) + 0.5 | 0; + out[4] = 1 + }else { + if(srcA === 0) { + out[0] = dst[0]; + out[1] = dst[1]; + out[2] = dst[2]; + out[3] = dstA + }else { + var outA = srcA + dstA * (1 - srcA); + if(outA === 0) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0 + }else { + out[0] = (src[0] * srcA + dst[0] * dstA * (1 - srcA)) / outA + 0.5 | 0; + out[1] = (src[1] * srcA + dst[1] * dstA * (1 - srcA)) / outA + 0.5 | 0; + out[2] = (src[2] * srcA + dst[2] * dstA * (1 - srcA)) / outA + 0.5 | 0; + out[3] = outA + } + } + } + goog.asserts.assert(ol.color.isValid(out)); + return out +}; +ol.color.asArray = function(color) { + if(goog.isArray(color)) { + return color + }else { + goog.asserts.assert(goog.isString(color)); + return ol.color.fromString(color) + } +}; +ol.color.asString = function(color) { + if(goog.isString(color)) { + return color + }else { + goog.asserts.assert(goog.isArray(color)); + return ol.color.toString(color) + } +}; +ol.color.equals = function(color1, color2) { + return color1 === color2 || color1[0] == color2[0] && color1[1] == color2[1] && color1[2] == color2[2] && color1[3] == color2[3] +}; +ol.color.fromString = function() { + var MAX_CACHE_SIZE = 1024; + var cache = {}; + var cacheSize = 0; + return function(s, opt_color) { + var color; + if(cache.hasOwnProperty(s)) { + color = cache[s] + }else { + if(cacheSize >= MAX_CACHE_SIZE) { + var i = 0; + var key; + for(key in cache) { + if((i++ & 3) === 0) { + delete cache[key]; + --cacheSize + } + } + } + color = ol.color.fromStringInternal_(s); + cache[s] = color; + ++cacheSize + } + return ol.color.returnOrUpdate(color, opt_color) + } +}(); +ol.color.fromStringInternal_ = function(s) { + var isHex = false; + if(ol.color.ENABLE_NAMED_COLORS && goog.color.names.hasOwnProperty(s)) { + s = (goog.color.names[s]); + isHex = true + } + var r, g, b, a, color, match; + if(isHex || (match = ol.color.hexColorRe_.exec(s))) { + var n = s.length - 1; + goog.asserts.assert(n == 3 || n == 6); + var d = n == 3 ? 1 : 2; + r = parseInt(s.substr(1 + 0 * d, d), 16); + g = parseInt(s.substr(1 + 1 * d, d), 16); + b = parseInt(s.substr(1 + 2 * d, d), 16); + if(d == 1) { + r = (r << 4) + r; + g = (g << 4) + g; + b = (b << 4) + b + } + a = 1; + color = [r, g, b, a]; + goog.asserts.assert(ol.color.isValid(color)); + return color + }else { + if(match = ol.color.rgbaColorRe_.exec(s)) { + r = Number(match[1]); + g = Number(match[2]); + b = Number(match[3]); + a = Number(match[4]); + color = [r, g, b, a]; + return ol.color.normalize(color, color) + }else { + if(match = ol.color.rgbColorRe_.exec(s)) { + r = Number(match[1]); + g = Number(match[2]); + b = Number(match[3]); + color = [r, g, b, 1]; + return ol.color.normalize(color, color) + }else { + throw new Error(s + " is not a valid color"); + } + } + } +}; +ol.color.isValid = function(color) { + return 0 <= color[0] && color[0] < 256 && 0 <= color[1] && color[1] < 256 && 0 <= color[2] && color[2] < 256 && 0 <= color[3] && color[3] <= 1 +}; +ol.color.normalize = function(color, opt_color) { + var result = goog.isDef(opt_color) ? opt_color : []; + result[0] = goog.math.clamp(color[0] + 0.5 | 0, 0, 255); + result[1] = goog.math.clamp(color[1] + 0.5 | 0, 0, 255); + result[2] = goog.math.clamp(color[2] + 0.5 | 0, 0, 255); + result[3] = goog.math.clamp(color[3], 0, 1); + return result +}; +ol.color.returnOrUpdate = function(color, opt_color) { + if(goog.isDef(opt_color)) { + opt_color[0] = color[0]; + opt_color[1] = color[1]; + opt_color[2] = color[2]; + opt_color[3] = color[3]; + return opt_color + }else { + return color + } +}; +ol.color.toString = function(color) { + var r = color[0]; + if(r != (r | 0)) { + r = r + 0.5 | 0 + } + var g = color[1]; + if(g != (g | 0)) { + g = g + 0.5 | 0 + } + var b = color[2]; + if(b != (b | 0)) { + b = b + 0.5 | 0 + } + var a = color[3]; + return"rgba(" + r + "," + g + "," + b + "," + a + ")" +}; +ol.color.transform = function(color, transform, opt_color) { + var result = goog.isDef(opt_color) ? opt_color : []; + result = goog.vec.Mat4.multVec3(transform, color, result); + goog.asserts.assert(goog.isArray(result)); + result[3] = color[3]; + return ol.color.normalize(result, result) +}; +ol.color.stringOrColorEquals = function(color1, color2) { + if(color1 === color2 || color1 == color2) { + return true + } + if(goog.isString(color1)) { + color1 = ol.color.fromString(color1) + } + if(goog.isString(color2)) { + color2 = ol.color.fromString(color2) + } + return ol.color.equals(color1, color2) +}; +goog.provide("ol.render.canvas"); +goog.require("ol.color"); +ol.render.canvas.FillState; +ol.render.canvas.StrokeState; +ol.render.canvas.TextState; +ol.render.canvas.defaultFont = "10px sans-serif"; +ol.render.canvas.defaultFillStyle = ol.color.fromString("black"); +ol.render.canvas.defaultLineCap = "round"; +ol.render.canvas.defaultLineDash = []; +ol.render.canvas.defaultLineJoin = "round"; +ol.render.canvas.defaultMiterLimit = 10; +ol.render.canvas.defaultStrokeStyle = [0, 0, 0, 1]; +ol.render.canvas.defaultTextAlign = "center"; +ol.render.canvas.defaultTextBaseline = "middle"; +ol.render.canvas.defaultLineWidth = 1; +goog.provide("ol.style.Fill"); +goog.require("ol.color"); +ol.style.Fill = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.color_ = goog.isDef(options.color) ? options.color : null +}; +ol.style.Fill.prototype.getColor = function() { + return this.color_ +}; +goog.provide("ol.style.Image"); +goog.provide("ol.style.ImageState"); +goog.require("goog.array"); +ol.style.ImageState = {IDLE:0, LOADING:1, LOADED:2, ERROR:3}; +ol.style.ImageOptions; +ol.style.Image = function(options) { + this.opacity_ = options.opacity; + this.rotateWithView_ = options.rotateWithView; + this.rotation_ = options.rotation; + this.scale_ = options.scale; + this.snapToPixel_ = options.snapToPixel +}; +ol.style.Image.prototype.getOpacity = function() { + return this.opacity_ +}; +ol.style.Image.prototype.getRotateWithView = function() { + return this.rotateWithView_ +}; +ol.style.Image.prototype.getRotation = function() { + return this.rotation_ +}; +ol.style.Image.prototype.getScale = function() { + return this.scale_ +}; +ol.style.Image.prototype.getSnapToPixel = function() { + return this.snapToPixel_ +}; +ol.style.Image.prototype.getAnchor = goog.abstractMethod; +ol.style.Image.prototype.getImage = goog.abstractMethod; +ol.style.Image.prototype.getImageState = goog.abstractMethod; +ol.style.Image.prototype.getHitDetectionImage = goog.abstractMethod; +ol.style.Image.prototype.getSize = goog.abstractMethod; +ol.style.Image.prototype.listenImageChange = goog.abstractMethod; +ol.style.Image.prototype.load = goog.abstractMethod; +ol.style.Image.prototype.unlistenImageChange = goog.abstractMethod; +goog.provide("ol.style.Stroke"); +goog.require("ol.color"); +ol.style.Stroke = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.color_ = goog.isDef(options.color) ? options.color : null; + this.lineCap_ = options.lineCap; + this.lineDash_ = goog.isDef(options.lineDash) ? options.lineDash : null; + this.lineJoin_ = options.lineJoin; + this.miterLimit_ = options.miterLimit; + this.width_ = options.width +}; +ol.style.Stroke.prototype.getColor = function() { + return this.color_ +}; +ol.style.Stroke.prototype.getLineCap = function() { + return this.lineCap_ +}; +ol.style.Stroke.prototype.getLineDash = function() { + return this.lineDash_ +}; +ol.style.Stroke.prototype.getLineJoin = function() { + return this.lineJoin_ +}; +ol.style.Stroke.prototype.getMiterLimit = function() { + return this.miterLimit_ +}; +ol.style.Stroke.prototype.getWidth = function() { + return this.width_ +}; +goog.provide("ol.style.Circle"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("ol.color"); +goog.require("ol.render.canvas"); +goog.require("ol.style.Fill"); +goog.require("ol.style.Image"); +goog.require("ol.style.ImageState"); +goog.require("ol.style.Stroke"); +ol.style.Circle = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.canvas_ = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + this.hitDetectionCanvas_ = null; + this.fill_ = goog.isDef(options.fill) ? options.fill : null; + this.radius_ = options.radius; + this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null; + var size = this.render_(); + this.anchor_ = [size / 2, size / 2]; + this.size_ = [size, size]; + goog.base(this, {opacity:1, rotateWithView:false, rotation:0, scale:1, snapToPixel:undefined}) +}; +goog.inherits(ol.style.Circle, ol.style.Image); +ol.style.Circle.prototype.getAnchor = function() { + return this.anchor_ +}; +ol.style.Circle.prototype.getFill = function() { + return this.fill_ +}; +ol.style.Circle.prototype.getHitDetectionImage = function(pixelRatio) { + return this.hitDetectionCanvas_ +}; +ol.style.Circle.prototype.getImage = function(pixelRatio) { + return this.canvas_ +}; +ol.style.Circle.prototype.getImageState = function() { + return ol.style.ImageState.LOADED +}; +ol.style.Circle.prototype.getRadius = function() { + return this.radius_ +}; +ol.style.Circle.prototype.getSize = function() { + return this.size_ +}; +ol.style.Circle.prototype.getStroke = function() { + return this.stroke_ +}; +ol.style.Circle.prototype.listenImageChange = goog.nullFunction; +ol.style.Circle.prototype.load = goog.nullFunction; +ol.style.Circle.prototype.unlistenImageChange = goog.nullFunction; +ol.style.Circle.prototype.render_ = function() { + var canvas = this.canvas_; + var strokeStyle, strokeWidth; + if(goog.isNull(this.stroke_)) { + strokeWidth = 0 + }else { + strokeStyle = ol.color.asString(this.stroke_.getColor()); + strokeWidth = this.stroke_.getWidth(); + if(!goog.isDef(strokeWidth)) { + strokeWidth = ol.render.canvas.defaultLineWidth + } + } + var size = 2 * (this.radius_ + strokeWidth) + 1; + canvas.height = size; + canvas.width = size; + var context = (canvas.getContext("2d")); + context.arc(size / 2, size / 2, this.radius_, 0, 2 * Math.PI, true); + if(!goog.isNull(this.fill_)) { + context.fillStyle = ol.color.asString(this.fill_.getColor()); + context.fill() + } + if(!goog.isNull(this.stroke_)) { + context.strokeStyle = strokeStyle; + context.lineWidth = strokeWidth; + context.stroke() + } + if(!goog.isNull(this.fill_)) { + this.hitDetectionCanvas_ = canvas + }else { + this.hitDetectionCanvas_ = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas = this.hitDetectionCanvas_; + canvas.height = size; + canvas.width = size; + context = (canvas.getContext("2d")); + context.arc(size / 2, size / 2, this.radius_, 0, 2 * Math.PI, true); + context.fillStyle = ol.render.canvas.defaultFillStyle; + context.fill(); + if(!goog.isNull(this.stroke_)) { + context.strokeStyle = strokeStyle; + context.lineWidth = strokeWidth; + context.stroke() + } + } + return size +}; +goog.provide("ol.style.Style"); +goog.require("ol.style.Fill"); +goog.require("ol.style.Image"); +ol.style.Style = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.fill_ = goog.isDef(options.fill) ? options.fill : null; + this.image_ = goog.isDef(options.image) ? options.image : null; + this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null; + this.text_ = goog.isDef(options.text) ? options.text : null; + this.zIndex_ = options.zIndex +}; +ol.style.Style.prototype.getFill = function() { + return this.fill_ +}; +ol.style.Style.prototype.getImage = function() { + return this.image_ +}; +ol.style.Style.prototype.getStroke = function() { + return this.stroke_ +}; +ol.style.Style.prototype.getText = function() { + return this.text_ +}; +ol.style.Style.prototype.getZIndex = function() { + return this.zIndex_ +}; +goog.provide("ol.Feature"); +goog.provide("ol.feature"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.functions"); +goog.require("ol.Object"); +goog.require("ol.geom.Geometry"); +goog.require("ol.style.Circle"); +goog.require("ol.style.Fill"); +goog.require("ol.style.Stroke"); +goog.require("ol.style.Style"); +ol.Feature = function(opt_geometryOrValues) { + goog.base(this); + this.id_ = undefined; + this.geometryName_ = "geometry"; + this.style_ = null; + this.styleFunction_ = undefined; + this.geometryChangeKey_ = null; + goog.events.listen(this, ol.Object.getChangeEventType(this.geometryName_), this.handleGeometryChanged_, false, this); + if(goog.isDefAndNotNull(opt_geometryOrValues)) { + if(opt_geometryOrValues instanceof ol.geom.Geometry) { + var geometry = (opt_geometryOrValues); + this.setGeometry(geometry) + }else { + goog.asserts.assert(goog.isObject(opt_geometryOrValues)); + var values = (opt_geometryOrValues); + this.setValues(values) + } + }else { + this.setGeometry(null) + } +}; +goog.inherits(ol.Feature, ol.Object); +ol.Feature.prototype.getGeometry = function() { + return(this.get(this.geometryName_)) +}; +goog.exportProperty(ol.Feature.prototype, "getGeometry", ol.Feature.prototype.getGeometry); +ol.Feature.prototype.getId = function() { + return this.id_ +}; +ol.Feature.prototype.getGeometryName = function() { + return this.geometryName_ +}; +ol.Feature.prototype.getStyle = function() { + return this.style_ +}; +ol.Feature.prototype.getStyleFunction = function() { + return this.styleFunction_ +}; +ol.Feature.prototype.handleGeometryChange_ = function() { + this.dispatchChangeEvent() +}; +ol.Feature.prototype.handleGeometryChanged_ = function() { + if(!goog.isNull(this.geometryChangeKey_)) { + goog.events.unlistenByKey(this.geometryChangeKey_); + this.geometryChangeKey_ = null + } + var geometry = this.getGeometry(); + if(goog.isDefAndNotNull(geometry)) { + this.geometryChangeKey_ = goog.events.listen(geometry, goog.events.EventType.CHANGE, this.handleGeometryChange_, false, this) + } + this.dispatchChangeEvent() +}; +ol.Feature.prototype.setGeometry = function(geometry) { + this.set(this.geometryName_, geometry) +}; +goog.exportProperty(ol.Feature.prototype, "setGeometry", ol.Feature.prototype.setGeometry); +ol.Feature.prototype.setStyle = function(style) { + this.style_ = style; + this.styleFunction_ = ol.feature.createFeatureStyleFunction(style); + this.dispatchChangeEvent() +}; +ol.Feature.prototype.setId = function(id) { + this.id_ = id +}; +ol.Feature.prototype.setGeometryName = function(name) { + goog.events.unlisten(this, ol.Object.getChangeEventType(this.geometryName_), this.handleGeometryChanged_, false, this); + this.geometryName_ = name; + goog.events.listen(this, ol.Object.getChangeEventType(this.geometryName_), this.handleGeometryChanged_, false, this); + this.handleGeometryChanged_() +}; +ol.feature.FeatureStyleFunction; +ol.feature.defaultFeatureStyleFunction = function() { + var fill = new ol.style.Fill({color:"rgba(255,255,255,0.4)"}); + var stroke = new ol.style.Stroke({color:"#3399CC", width:1.25}); + var styles = [new ol.style.Style({image:new ol.style.Circle({fill:fill, stroke:stroke, radius:5}), fill:fill, stroke:stroke})]; + return function(resolution) { + return styles + } +}(); +ol.feature.StyleFunction; +ol.feature.defaultStyleFunction = function(feature, resolution) { + var featureStyleFunction = feature.getStyleFunction(); + if(!goog.isDef(featureStyleFunction)) { + featureStyleFunction = ol.feature.defaultFeatureStyleFunction + } + return featureStyleFunction.call(feature, resolution) +}; +ol.feature.createFeatureStyleFunction = function(obj) { + var styleFunction; + if(goog.isFunction(obj)) { + styleFunction = (obj) + }else { + var styles; + if(goog.isArray(obj)) { + styles = obj + }else { + goog.asserts.assertInstanceof(obj, ol.style.Style); + styles = [obj] + } + styleFunction = goog.functions.constant(styles) + } + return styleFunction +}; +ol.feature.createStyleFunction = function(obj) { + var styleFunction; + if(goog.isFunction(obj)) { + styleFunction = (obj) + }else { + var styles; + if(goog.isArray(obj)) { + styles = obj + }else { + goog.asserts.assertInstanceof(obj, ol.style.Style); + styles = [obj] + } + styleFunction = goog.functions.constant(styles) + } + return styleFunction +}; +goog.provide("ol.FeatureOverlay"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.object"); +goog.require("ol.Collection"); +goog.require("ol.CollectionEventType"); +goog.require("ol.Feature"); +goog.require("ol.feature"); +goog.require("ol.render.EventType"); +ol.FeatureOverlay = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.features_ = null; + this.featuresListenerKeys_ = null; + this.featureChangeListenerKeys_ = null; + this.map_ = null; + this.postComposeListenerKey_ = null; + this.style_ = null; + this.styleFunction_ = goog.isDef(options.style) ? ol.feature.createStyleFunction(options.style) : undefined; + if(goog.isDef(options.features)) { + if(goog.isArray(options.features)) { + this.setFeatures(new ol.Collection(goog.array.clone(options.features))) + }else { + goog.asserts.assertInstanceof(options.features, ol.Collection); + this.setFeatures(options.features) + } + }else { + this.setFeatures(new ol.Collection) + } + if(goog.isDef(options.map)) { + this.setMap(options.map) + } +}; +ol.FeatureOverlay.prototype.addFeature = function(feature) { + this.features_.push(feature) +}; +ol.FeatureOverlay.prototype.getFeatures = function() { + return this.features_ +}; +ol.FeatureOverlay.prototype.handleFeatureChange_ = function() { + this.render_() +}; +ol.FeatureOverlay.prototype.handleFeaturesAdd_ = function(collectionEvent) { + goog.asserts.assert(!goog.isNull(this.featureChangeListenerKeys_)); + var feature = (collectionEvent.element); + this.featureChangeListenerKeys_[goog.getUid(feature).toString()] = goog.events.listen(feature, goog.events.EventType.CHANGE, this.handleFeatureChange_, false, this); + this.render_() +}; +ol.FeatureOverlay.prototype.handleFeaturesRemove_ = function(collectionEvent) { + goog.asserts.assert(!goog.isNull(this.featureChangeListenerKeys_)); + var feature = (collectionEvent.element); + var key = goog.getUid(feature).toString(); + goog.events.unlistenByKey(this.featureChangeListenerKeys_[key]); + delete this.featureChangeListenerKeys_[key]; + this.render_() +}; +ol.FeatureOverlay.prototype.handleMapPostCompose_ = function(event) { + if(goog.isNull(this.features_) || !goog.isDef(this.styleFunction_)) { + return + } + var resolution = event.frameState.view2DState.resolution; + var vectorContext = event.vectorContext; + var i, ii, feature, styles; + this.features_.forEach(function(feature) { + styles = this.styleFunction_(feature, resolution); + if(!goog.isDefAndNotNull(styles)) { + return + } + ii = styles.length; + for(i = 0;i < ii;++i) { + vectorContext.drawFeature(feature, styles[i]) + } + }, this) +}; +ol.FeatureOverlay.prototype.removeFeature = function(feature) { + this.features_.remove(feature) +}; +ol.FeatureOverlay.prototype.render_ = function() { + if(!goog.isNull(this.map_)) { + this.map_.render() + } +}; +ol.FeatureOverlay.prototype.setFeatures = function(features) { + if(!goog.isNull(this.featuresListenerKeys_)) { + goog.array.forEach(this.featuresListenerKeys_, goog.events.unlistenByKey); + this.featuresListenerKeys_ = null + } + if(!goog.isNull(this.featureChangeListenerKeys_)) { + goog.array.forEach(goog.object.getValues(this.featureChangeListenerKeys_), goog.events.unlistenByKey); + this.featureChangeListenerKeys_ = null + } + this.features_ = features; + if(!goog.isNull(features)) { + this.featuresListenerKeys_ = [goog.events.listen(features, ol.CollectionEventType.ADD, this.handleFeaturesAdd_, false, this), goog.events.listen(features, ol.CollectionEventType.REMOVE, this.handleFeaturesRemove_, false, this)]; + this.featureChangeListenerKeys_ = {}; + var featuresArray = features.getArray(); + var i, ii = featuresArray.length; + var feature; + for(i = 0;i < ii;++i) { + feature = featuresArray[i]; + this.featureChangeListenerKeys_[goog.getUid(feature).toString()] = goog.events.listen(feature, goog.events.EventType.CHANGE, this.handleFeatureChange_, false, this) + } + } + this.render_() +}; +ol.FeatureOverlay.prototype.setMap = function(map) { + if(!goog.isNull(this.postComposeListenerKey_)) { + goog.events.unlistenByKey(this.postComposeListenerKey_); + this.postComposeListenerKey_ = null + } + this.render_(); + this.map_ = map; + if(!goog.isNull(map)) { + this.postComposeListenerKey_ = goog.events.listen(map, ol.render.EventType.POSTCOMPOSE, this.handleMapPostCompose_, false, this); + map.render() + } +}; +ol.FeatureOverlay.prototype.setStyle = function(style) { + this.style_ = style; + this.styleFunction_ = ol.feature.createStyleFunction(style); + this.render_() +}; +ol.FeatureOverlay.prototype.getStyle = function() { + return this.style_ +}; +ol.FeatureOverlay.prototype.getStyleFunction = function() { + return this.styleFunction_ +}; +goog.provide("goog.structs"); +goog.require("goog.array"); +goog.require("goog.object"); +goog.structs.getCount = function(col) { + if(typeof col.getCount == "function") { + return col.getCount() + } + if(goog.isArrayLike(col) || goog.isString(col)) { + return col.length + } + return goog.object.getCount(col) +}; +goog.structs.getValues = function(col) { + if(typeof col.getValues == "function") { + return col.getValues() + } + if(goog.isString(col)) { + return col.split("") + } + if(goog.isArrayLike(col)) { + var rv = []; + var l = col.length; + for(var i = 0;i < l;i++) { + rv.push(col[i]) + } + return rv + } + return goog.object.getValues(col) +}; +goog.structs.getKeys = function(col) { + if(typeof col.getKeys == "function") { + return col.getKeys() + } + if(typeof col.getValues == "function") { + return undefined + } + if(goog.isArrayLike(col) || goog.isString(col)) { + var rv = []; + var l = col.length; + for(var i = 0;i < l;i++) { + rv.push(i) + } + return rv + } + return goog.object.getKeys(col) +}; +goog.structs.contains = function(col, val) { + if(typeof col.contains == "function") { + return col.contains(val) + } + if(typeof col.containsValue == "function") { + return col.containsValue(val) + } + if(goog.isArrayLike(col) || goog.isString(col)) { + return goog.array.contains((col), val) + } + return goog.object.containsValue(col, val) +}; +goog.structs.isEmpty = function(col) { + if(typeof col.isEmpty == "function") { + return col.isEmpty() + } + if(goog.isArrayLike(col) || goog.isString(col)) { + return goog.array.isEmpty((col)) + } + return goog.object.isEmpty(col) +}; +goog.structs.clear = function(col) { + if(typeof col.clear == "function") { + col.clear() + }else { + if(goog.isArrayLike(col)) { + goog.array.clear((col)) + }else { + goog.object.clear(col) + } + } +}; +goog.structs.forEach = function(col, f, opt_obj) { + if(typeof col.forEach == "function") { + col.forEach(f, opt_obj) + }else { + if(goog.isArrayLike(col) || goog.isString(col)) { + goog.array.forEach((col), f, opt_obj) + }else { + var keys = goog.structs.getKeys(col); + var values = goog.structs.getValues(col); + var l = values.length; + for(var i = 0;i < l;i++) { + f.call(opt_obj, values[i], keys && keys[i], col) + } + } + } +}; +goog.structs.filter = function(col, f, opt_obj) { + if(typeof col.filter == "function") { + return col.filter(f, opt_obj) + } + if(goog.isArrayLike(col) || goog.isString(col)) { + return goog.array.filter((col), f, opt_obj) + } + var rv; + var keys = goog.structs.getKeys(col); + var values = goog.structs.getValues(col); + var l = values.length; + if(keys) { + rv = {}; + for(var i = 0;i < l;i++) { + if(f.call(opt_obj, values[i], keys[i], col)) { + rv[keys[i]] = values[i] + } + } + }else { + rv = []; + for(var i = 0;i < l;i++) { + if(f.call(opt_obj, values[i], undefined, col)) { + rv.push(values[i]) + } + } + } + return rv +}; +goog.structs.map = function(col, f, opt_obj) { + if(typeof col.map == "function") { + return col.map(f, opt_obj) + } + if(goog.isArrayLike(col) || goog.isString(col)) { + return goog.array.map((col), f, opt_obj) + } + var rv; + var keys = goog.structs.getKeys(col); + var values = goog.structs.getValues(col); + var l = values.length; + if(keys) { + rv = {}; + for(var i = 0;i < l;i++) { + rv[keys[i]] = f.call(opt_obj, values[i], keys[i], col) + } + }else { + rv = []; + for(var i = 0;i < l;i++) { + rv[i] = f.call(opt_obj, values[i], undefined, col) + } + } + return rv +}; +goog.structs.some = function(col, f, opt_obj) { + if(typeof col.some == "function") { + return col.some(f, opt_obj) + } + if(goog.isArrayLike(col) || goog.isString(col)) { + return goog.array.some((col), f, opt_obj) + } + var keys = goog.structs.getKeys(col); + var values = goog.structs.getValues(col); + var l = values.length; + for(var i = 0;i < l;i++) { + if(f.call(opt_obj, values[i], keys && keys[i], col)) { + return true + } + } + return false +}; +goog.structs.every = function(col, f, opt_obj) { + if(typeof col.every == "function") { + return col.every(f, opt_obj) + } + if(goog.isArrayLike(col) || goog.isString(col)) { + return goog.array.every((col), f, opt_obj) + } + var keys = goog.structs.getKeys(col); + var values = goog.structs.getValues(col); + var l = values.length; + for(var i = 0;i < l;i++) { + if(!f.call(opt_obj, values[i], keys && keys[i], col)) { + return false + } + } + return true +}; +goog.provide("goog.iter"); +goog.provide("goog.iter.Iterator"); +goog.provide("goog.iter.StopIteration"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.iter.Iterable; +if("StopIteration" in goog.global) { + goog.iter.StopIteration = goog.global["StopIteration"] +}else { + goog.iter.StopIteration = Error("StopIteration") +} +goog.iter.Iterator = function() { +}; +goog.iter.Iterator.prototype.next = function() { + throw goog.iter.StopIteration; +}; +goog.iter.Iterator.prototype.__iterator__ = function(opt_keys) { + return this +}; +goog.iter.toIterator = function(iterable) { + if(iterable instanceof goog.iter.Iterator) { + return iterable + } + if(typeof iterable.__iterator__ == "function") { + return iterable.__iterator__(false) + } + if(goog.isArrayLike(iterable)) { + var i = 0; + var newIter = new goog.iter.Iterator; + newIter.next = function() { + while(true) { + if(i >= iterable.length) { + throw goog.iter.StopIteration; + } + if(!(i in iterable)) { + i++; + continue + } + return iterable[i++] + } + }; + return newIter + } + throw Error("Not implemented"); +}; +goog.iter.forEach = function(iterable, f, opt_obj) { + if(goog.isArrayLike(iterable)) { + try { + goog.array.forEach((iterable), f, opt_obj) + }catch(ex) { + if(ex !== goog.iter.StopIteration) { + throw ex; + } + } + }else { + iterable = goog.iter.toIterator(iterable); + try { + while(true) { + f.call(opt_obj, iterable.next(), undefined, iterable) + } + }catch(ex) { + if(ex !== goog.iter.StopIteration) { + throw ex; + } + } + } +}; +goog.iter.filter = function(iterable, f, opt_obj) { + var iterator = goog.iter.toIterator(iterable); + var newIter = new goog.iter.Iterator; + newIter.next = function() { + while(true) { + var val = iterator.next(); + if(f.call(opt_obj, val, undefined, iterator)) { + return val + } + } + }; + return newIter +}; +goog.iter.range = function(startOrStop, opt_stop, opt_step) { + var start = 0; + var stop = startOrStop; + var step = opt_step || 1; + if(arguments.length > 1) { + start = startOrStop; + stop = opt_stop + } + if(step == 0) { + throw Error("Range step argument must not be zero"); + } + var newIter = new goog.iter.Iterator; + newIter.next = function() { + if(step > 0 && start >= stop || step < 0 && start <= stop) { + throw goog.iter.StopIteration; + } + var rv = start; + start += step; + return rv + }; + return newIter +}; +goog.iter.join = function(iterable, deliminator) { + return goog.iter.toArray(iterable).join(deliminator) +}; +goog.iter.map = function(iterable, f, opt_obj) { + var iterator = goog.iter.toIterator(iterable); + var newIter = new goog.iter.Iterator; + newIter.next = function() { + while(true) { + var val = iterator.next(); + return f.call(opt_obj, val, undefined, iterator) + } + }; + return newIter +}; +goog.iter.reduce = function(iterable, f, val, opt_obj) { + var rval = val; + goog.iter.forEach(iterable, function(val) { + rval = f.call(opt_obj, rval, val) + }); + return rval +}; +goog.iter.some = function(iterable, f, opt_obj) { + iterable = goog.iter.toIterator(iterable); + try { + while(true) { + if(f.call(opt_obj, iterable.next(), undefined, iterable)) { + return true + } + } + }catch(ex) { + if(ex !== goog.iter.StopIteration) { + throw ex; + } + } + return false +}; +goog.iter.every = function(iterable, f, opt_obj) { + iterable = goog.iter.toIterator(iterable); + try { + while(true) { + if(!f.call(opt_obj, iterable.next(), undefined, iterable)) { + return false + } + } + }catch(ex) { + if(ex !== goog.iter.StopIteration) { + throw ex; + } + } + return true +}; +goog.iter.chain = function(var_args) { + var args = arguments; + var length = args.length; + var i = 0; + var newIter = new goog.iter.Iterator; + newIter.next = function() { + try { + if(i >= length) { + throw goog.iter.StopIteration; + } + var current = goog.iter.toIterator(args[i]); + return current.next() + }catch(ex) { + if(ex !== goog.iter.StopIteration || i >= length) { + throw ex; + }else { + i++; + return this.next() + } + } + }; + return newIter +}; +goog.iter.dropWhile = function(iterable, f, opt_obj) { + var iterator = goog.iter.toIterator(iterable); + var newIter = new goog.iter.Iterator; + var dropping = true; + newIter.next = function() { + while(true) { + var val = iterator.next(); + if(dropping && f.call(opt_obj, val, undefined, iterator)) { + continue + }else { + dropping = false + } + return val + } + }; + return newIter +}; +goog.iter.takeWhile = function(iterable, f, opt_obj) { + var iterator = goog.iter.toIterator(iterable); + var newIter = new goog.iter.Iterator; + var taking = true; + newIter.next = function() { + while(true) { + if(taking) { + var val = iterator.next(); + if(f.call(opt_obj, val, undefined, iterator)) { + return val + }else { + taking = false + } + }else { + throw goog.iter.StopIteration; + } + } + }; + return newIter +}; +goog.iter.toArray = function(iterable) { + if(goog.isArrayLike(iterable)) { + return goog.array.toArray((iterable)) + } + iterable = goog.iter.toIterator(iterable); + var array = []; + goog.iter.forEach(iterable, function(val) { + array.push(val) + }); + return array +}; +goog.iter.equals = function(iterable1, iterable2) { + iterable1 = goog.iter.toIterator(iterable1); + iterable2 = goog.iter.toIterator(iterable2); + var b1, b2; + try { + while(true) { + b1 = b2 = false; + var val1 = iterable1.next(); + b1 = true; + var val2 = iterable2.next(); + b2 = true; + if(val1 != val2) { + return false + } + } + }catch(ex) { + if(ex !== goog.iter.StopIteration) { + throw ex; + }else { + if(b1 && !b2) { + return false + } + if(!b2) { + try { + val2 = iterable2.next(); + return false + }catch(ex1) { + if(ex1 !== goog.iter.StopIteration) { + throw ex1; + } + return true + } + } + } + } + return false +}; +goog.iter.nextOrValue = function(iterable, defaultValue) { + try { + return goog.iter.toIterator(iterable).next() + }catch(e) { + if(e != goog.iter.StopIteration) { + throw e; + } + return defaultValue + } +}; +goog.iter.product = function(var_args) { + var someArrayEmpty = goog.array.some(arguments, function(arr) { + return!arr.length + }); + if(someArrayEmpty || !arguments.length) { + return new goog.iter.Iterator + } + var iter = new goog.iter.Iterator; + var arrays = arguments; + var indicies = goog.array.repeat(0, arrays.length); + iter.next = function() { + if(indicies) { + var retVal = goog.array.map(indicies, function(valueIndex, arrayIndex) { + return arrays[arrayIndex][valueIndex] + }); + for(var i = indicies.length - 1;i >= 0;i--) { + goog.asserts.assert(indicies); + if(indicies[i] < arrays[i].length - 1) { + indicies[i]++; + break + } + if(i == 0) { + indicies = null; + break + } + indicies[i] = 0 + } + return retVal + } + throw goog.iter.StopIteration; + }; + return iter +}; +goog.iter.cycle = function(iterable) { + var baseIterator = goog.iter.toIterator(iterable); + var cache = []; + var cacheIndex = 0; + var iter = new goog.iter.Iterator; + var useCache = false; + iter.next = function() { + var returnElement = null; + if(!useCache) { + try { + returnElement = baseIterator.next(); + cache.push(returnElement); + return returnElement + }catch(e) { + if(e != goog.iter.StopIteration || goog.array.isEmpty(cache)) { + throw e; + } + useCache = true + } + } + returnElement = cache[cacheIndex]; + cacheIndex = (cacheIndex + 1) % cache.length; + return returnElement + }; + return iter +}; +goog.provide("goog.structs.Map"); +goog.require("goog.iter.Iterator"); +goog.require("goog.iter.StopIteration"); +goog.require("goog.object"); +goog.structs.Map = function(opt_map, var_args) { + this.map_ = {}; + this.keys_ = []; + var argLength = arguments.length; + if(argLength > 1) { + if(argLength % 2) { + throw Error("Uneven number of arguments"); + } + for(var i = 0;i < argLength;i += 2) { + this.set(arguments[i], arguments[i + 1]) + } + }else { + if(opt_map) { + this.addAll((opt_map)) + } + } +}; +goog.structs.Map.prototype.count_ = 0; +goog.structs.Map.prototype.version_ = 0; +goog.structs.Map.prototype.getCount = function() { + return this.count_ +}; +goog.structs.Map.prototype.getValues = function() { + this.cleanupKeysArray_(); + var rv = []; + for(var i = 0;i < this.keys_.length;i++) { + var key = this.keys_[i]; + rv.push(this.map_[key]) + } + return rv +}; +goog.structs.Map.prototype.getKeys = function() { + this.cleanupKeysArray_(); + return(this.keys_.concat()) +}; +goog.structs.Map.prototype.containsKey = function(key) { + return goog.structs.Map.hasKey_(this.map_, key) +}; +goog.structs.Map.prototype.containsValue = function(val) { + for(var i = 0;i < this.keys_.length;i++) { + var key = this.keys_[i]; + if(goog.structs.Map.hasKey_(this.map_, key) && this.map_[key] == val) { + return true + } + } + return false +}; +goog.structs.Map.prototype.equals = function(otherMap, opt_equalityFn) { + if(this === otherMap) { + return true + } + if(this.count_ != otherMap.getCount()) { + return false + } + var equalityFn = opt_equalityFn || goog.structs.Map.defaultEquals; + this.cleanupKeysArray_(); + for(var key, i = 0;key = this.keys_[i];i++) { + if(!equalityFn(this.get(key), otherMap.get(key))) { + return false + } + } + return true +}; +goog.structs.Map.defaultEquals = function(a, b) { + return a === b +}; +goog.structs.Map.prototype.isEmpty = function() { + return this.count_ == 0 +}; +goog.structs.Map.prototype.clear = function() { + this.map_ = {}; + this.keys_.length = 0; + this.count_ = 0; + this.version_ = 0 +}; +goog.structs.Map.prototype.remove = function(key) { + if(goog.structs.Map.hasKey_(this.map_, key)) { + delete this.map_[key]; + this.count_--; + this.version_++; + if(this.keys_.length > 2 * this.count_) { + this.cleanupKeysArray_() + } + return true + } + return false +}; +goog.structs.Map.prototype.cleanupKeysArray_ = function() { + if(this.count_ != this.keys_.length) { + var srcIndex = 0; + var destIndex = 0; + while(srcIndex < this.keys_.length) { + var key = this.keys_[srcIndex]; + if(goog.structs.Map.hasKey_(this.map_, key)) { + this.keys_[destIndex++] = key + } + srcIndex++ + } + this.keys_.length = destIndex + } + if(this.count_ != this.keys_.length) { + var seen = {}; + var srcIndex = 0; + var destIndex = 0; + while(srcIndex < this.keys_.length) { + var key = this.keys_[srcIndex]; + if(!goog.structs.Map.hasKey_(seen, key)) { + this.keys_[destIndex++] = key; + seen[key] = 1 + } + srcIndex++ + } + this.keys_.length = destIndex + } +}; +goog.structs.Map.prototype.get = function(key, opt_val) { + if(goog.structs.Map.hasKey_(this.map_, key)) { + return this.map_[key] + } + return opt_val +}; +goog.structs.Map.prototype.set = function(key, value) { + if(!goog.structs.Map.hasKey_(this.map_, key)) { + this.count_++; + this.keys_.push(key); + this.version_++ + } + this.map_[key] = value +}; +goog.structs.Map.prototype.addAll = function(map) { + var keys, values; + if(map instanceof goog.structs.Map) { + keys = map.getKeys(); + values = map.getValues() + }else { + keys = goog.object.getKeys(map); + values = goog.object.getValues(map) + } + for(var i = 0;i < keys.length;i++) { + this.set(keys[i], values[i]) + } +}; +goog.structs.Map.prototype.clone = function() { + return new goog.structs.Map(this) +}; +goog.structs.Map.prototype.transpose = function() { + var transposed = new goog.structs.Map; + for(var i = 0;i < this.keys_.length;i++) { + var key = this.keys_[i]; + var value = this.map_[key]; + transposed.set(value, key) + } + return transposed +}; +goog.structs.Map.prototype.toObject = function() { + this.cleanupKeysArray_(); + var obj = {}; + for(var i = 0;i < this.keys_.length;i++) { + var key = this.keys_[i]; + obj[key] = this.map_[key] + } + return obj +}; +goog.structs.Map.prototype.getKeyIterator = function() { + return this.__iterator__(true) +}; +goog.structs.Map.prototype.getValueIterator = function() { + return this.__iterator__(false) +}; +goog.structs.Map.prototype.__iterator__ = function(opt_keys) { + this.cleanupKeysArray_(); + var i = 0; + var keys = this.keys_; + var map = this.map_; + var version = this.version_; + var selfObj = this; + var newIter = new goog.iter.Iterator; + newIter.next = function() { + while(true) { + if(version != selfObj.version_) { + throw Error("The map has changed since the iterator was created"); + } + if(i >= keys.length) { + throw goog.iter.StopIteration; + } + var key = keys[i++]; + return opt_keys ? key : map[key] + } + }; + return newIter +}; +goog.structs.Map.hasKey_ = function(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key) +}; +goog.provide("goog.uri.utils"); +goog.provide("goog.uri.utils.ComponentIndex"); +goog.provide("goog.uri.utils.QueryArray"); +goog.provide("goog.uri.utils.QueryValue"); +goog.provide("goog.uri.utils.StandardQueryParam"); +goog.require("goog.asserts"); +goog.require("goog.string"); +goog.require("goog.userAgent"); +goog.uri.utils.CharCode_ = {AMPERSAND:38, EQUAL:61, HASH:35, QUESTION:63}; +goog.uri.utils.buildFromEncodedParts = function(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) { + var out = ""; + if(opt_scheme) { + out += opt_scheme + ":" + } + if(opt_domain) { + out += "//"; + if(opt_userInfo) { + out += opt_userInfo + "@" + } + out += opt_domain; + if(opt_port) { + out += ":" + opt_port + } + } + if(opt_path) { + out += opt_path + } + if(opt_queryData) { + out += "?" + opt_queryData + } + if(opt_fragment) { + out += "#" + opt_fragment + } + return out +}; +goog.uri.utils.splitRe_ = new RegExp("^" + "(?:" + "([^:/?#.]+)" + ":)?" + "(?://" + "(?:([^/?#]*)@)?" + "([^/#?]*?)" + "(?::([0-9]+))?" + "(?\x3d[/#?]|$)" + ")?" + "([^?#]+)?" + "(?:\\?([^#]*))?" + "(?:#(.*))?" + "$"); +goog.uri.utils.ComponentIndex = {SCHEME:1, USER_INFO:2, DOMAIN:3, PORT:4, PATH:5, QUERY_DATA:6, FRAGMENT:7}; +goog.uri.utils.split = function(uri) { + goog.uri.utils.phishingProtection_(); + return(uri.match(goog.uri.utils.splitRe_)) +}; +goog.uri.utils.needsPhishingProtection_ = goog.userAgent.WEBKIT; +goog.uri.utils.phishingProtection_ = function() { + if(goog.uri.utils.needsPhishingProtection_) { + goog.uri.utils.needsPhishingProtection_ = false; + var location = goog.global["location"]; + if(location) { + var href = location["href"]; + if(href) { + var domain = goog.uri.utils.getDomain(href); + if(domain && domain != location["hostname"]) { + goog.uri.utils.needsPhishingProtection_ = true; + throw Error(); + } + } + } + } +}; +goog.uri.utils.decodeIfPossible_ = function(uri) { + return uri && decodeURIComponent(uri) +}; +goog.uri.utils.getComponentByIndex_ = function(componentIndex, uri) { + return goog.uri.utils.split(uri)[componentIndex] || null +}; +goog.uri.utils.getScheme = function(uri) { + return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.SCHEME, uri) +}; +goog.uri.utils.getEffectiveScheme = function(uri) { + var scheme = goog.uri.utils.getScheme(uri); + if(!scheme && self.location) { + var protocol = self.location.protocol; + scheme = protocol.substr(0, protocol.length - 1) + } + return scheme ? scheme.toLowerCase() : "" +}; +goog.uri.utils.getUserInfoEncoded = function(uri) { + return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.USER_INFO, uri) +}; +goog.uri.utils.getUserInfo = function(uri) { + return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getUserInfoEncoded(uri)) +}; +goog.uri.utils.getDomainEncoded = function(uri) { + return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.DOMAIN, uri) +}; +goog.uri.utils.getDomain = function(uri) { + return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getDomainEncoded(uri)) +}; +goog.uri.utils.getPort = function(uri) { + return Number(goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PORT, uri)) || null +}; +goog.uri.utils.getPathEncoded = function(uri) { + return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PATH, uri) +}; +goog.uri.utils.getPath = function(uri) { + return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getPathEncoded(uri)) +}; +goog.uri.utils.getQueryData = function(uri) { + return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.QUERY_DATA, uri) +}; +goog.uri.utils.getFragmentEncoded = function(uri) { + var hashIndex = uri.indexOf("#"); + return hashIndex < 0 ? null : uri.substr(hashIndex + 1) +}; +goog.uri.utils.setFragmentEncoded = function(uri, fragment) { + return goog.uri.utils.removeFragment(uri) + (fragment ? "#" + fragment : "") +}; +goog.uri.utils.getFragment = function(uri) { + return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getFragmentEncoded(uri)) +}; +goog.uri.utils.getHost = function(uri) { + var pieces = goog.uri.utils.split(uri); + return goog.uri.utils.buildFromEncodedParts(pieces[goog.uri.utils.ComponentIndex.SCHEME], pieces[goog.uri.utils.ComponentIndex.USER_INFO], pieces[goog.uri.utils.ComponentIndex.DOMAIN], pieces[goog.uri.utils.ComponentIndex.PORT]) +}; +goog.uri.utils.getPathAndAfter = function(uri) { + var pieces = goog.uri.utils.split(uri); + return goog.uri.utils.buildFromEncodedParts(null, null, null, null, pieces[goog.uri.utils.ComponentIndex.PATH], pieces[goog.uri.utils.ComponentIndex.QUERY_DATA], pieces[goog.uri.utils.ComponentIndex.FRAGMENT]) +}; +goog.uri.utils.removeFragment = function(uri) { + var hashIndex = uri.indexOf("#"); + return hashIndex < 0 ? uri : uri.substr(0, hashIndex) +}; +goog.uri.utils.haveSameDomain = function(uri1, uri2) { + var pieces1 = goog.uri.utils.split(uri1); + var pieces2 = goog.uri.utils.split(uri2); + return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] == pieces2[goog.uri.utils.ComponentIndex.DOMAIN] && pieces1[goog.uri.utils.ComponentIndex.SCHEME] == pieces2[goog.uri.utils.ComponentIndex.SCHEME] && pieces1[goog.uri.utils.ComponentIndex.PORT] == pieces2[goog.uri.utils.ComponentIndex.PORT] +}; +goog.uri.utils.assertNoFragmentsOrQueries_ = function(uri) { + if(goog.DEBUG && (uri.indexOf("#") >= 0 || uri.indexOf("?") >= 0)) { + throw Error("goog.uri.utils: Fragment or query identifiers are not " + "supported: [" + uri + "]"); + } +}; +goog.uri.utils.QueryValue; +goog.uri.utils.QueryArray; +goog.uri.utils.appendQueryData_ = function(buffer) { + if(buffer[1]) { + var baseUri = (buffer[0]); + var hashIndex = baseUri.indexOf("#"); + if(hashIndex >= 0) { + buffer.push(baseUri.substr(hashIndex)); + buffer[0] = baseUri = baseUri.substr(0, hashIndex) + } + var questionIndex = baseUri.indexOf("?"); + if(questionIndex < 0) { + buffer[1] = "?" + }else { + if(questionIndex == baseUri.length - 1) { + buffer[1] = undefined + } + } + } + return buffer.join("") +}; +goog.uri.utils.appendKeyValuePairs_ = function(key, value, pairs) { + if(goog.isArray(value)) { + goog.asserts.assertArray(value); + for(var j = 0;j < value.length;j++) { + goog.uri.utils.appendKeyValuePairs_(key, String(value[j]), pairs) + } + }else { + if(value != null) { + pairs.push("\x26", key, value === "" ? "" : "\x3d", goog.string.urlEncode(value)) + } + } +}; +goog.uri.utils.buildQueryDataBuffer_ = function(buffer, keysAndValues, opt_startIndex) { + goog.asserts.assert(Math.max(keysAndValues.length - (opt_startIndex || 0), 0) % 2 == 0, "goog.uri.utils: Key/value lists must be even in length."); + for(var i = opt_startIndex || 0;i < keysAndValues.length;i += 2) { + goog.uri.utils.appendKeyValuePairs_(keysAndValues[i], keysAndValues[i + 1], buffer) + } + return buffer +}; +goog.uri.utils.buildQueryData = function(keysAndValues, opt_startIndex) { + var buffer = goog.uri.utils.buildQueryDataBuffer_([], keysAndValues, opt_startIndex); + buffer[0] = ""; + return buffer.join("") +}; +goog.uri.utils.buildQueryDataBufferFromMap_ = function(buffer, map) { + for(var key in map) { + goog.uri.utils.appendKeyValuePairs_(key, map[key], buffer) + } + return buffer +}; +goog.uri.utils.buildQueryDataFromMap = function(map) { + var buffer = goog.uri.utils.buildQueryDataBufferFromMap_([], map); + buffer[0] = ""; + return buffer.join("") +}; +goog.uri.utils.appendParams = function(uri, var_args) { + return goog.uri.utils.appendQueryData_(arguments.length == 2 ? goog.uri.utils.buildQueryDataBuffer_([uri], arguments[1], 0) : goog.uri.utils.buildQueryDataBuffer_([uri], arguments, 1)) +}; +goog.uri.utils.appendParamsFromMap = function(uri, map) { + return goog.uri.utils.appendQueryData_(goog.uri.utils.buildQueryDataBufferFromMap_([uri], map)) +}; +goog.uri.utils.appendParam = function(uri, key, opt_value) { + var paramArr = [uri, "\x26", key]; + if(goog.isDefAndNotNull(opt_value)) { + paramArr.push("\x3d", goog.string.urlEncode(opt_value)) + } + return goog.uri.utils.appendQueryData_(paramArr) +}; +goog.uri.utils.findParam_ = function(uri, startIndex, keyEncoded, hashOrEndIndex) { + var index = startIndex; + var keyLength = keyEncoded.length; + while((index = uri.indexOf(keyEncoded, index)) >= 0 && index < hashOrEndIndex) { + var precedingChar = uri.charCodeAt(index - 1); + if(precedingChar == goog.uri.utils.CharCode_.AMPERSAND || precedingChar == goog.uri.utils.CharCode_.QUESTION) { + var followingChar = uri.charCodeAt(index + keyLength); + if(!followingChar || followingChar == goog.uri.utils.CharCode_.EQUAL || followingChar == goog.uri.utils.CharCode_.AMPERSAND || followingChar == goog.uri.utils.CharCode_.HASH) { + return index + } + } + index += keyLength + 1 + } + return-1 +}; +goog.uri.utils.hashOrEndRe_ = /#|$/; +goog.uri.utils.hasParam = function(uri, keyEncoded) { + return goog.uri.utils.findParam_(uri, 0, keyEncoded, uri.search(goog.uri.utils.hashOrEndRe_)) >= 0 +}; +goog.uri.utils.getParamValue = function(uri, keyEncoded) { + var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_); + var foundIndex = goog.uri.utils.findParam_(uri, 0, keyEncoded, hashOrEndIndex); + if(foundIndex < 0) { + return null + }else { + var endPosition = uri.indexOf("\x26", foundIndex); + if(endPosition < 0 || endPosition > hashOrEndIndex) { + endPosition = hashOrEndIndex + } + foundIndex += keyEncoded.length + 1; + return goog.string.urlDecode(uri.substr(foundIndex, endPosition - foundIndex)) + } +}; +goog.uri.utils.getParamValues = function(uri, keyEncoded) { + var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_); + var position = 0; + var foundIndex; + var result = []; + while((foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex)) >= 0) { + position = uri.indexOf("\x26", foundIndex); + if(position < 0 || position > hashOrEndIndex) { + position = hashOrEndIndex + } + foundIndex += keyEncoded.length + 1; + result.push(goog.string.urlDecode(uri.substr(foundIndex, position - foundIndex))) + } + return result +}; +goog.uri.utils.trailingQueryPunctuationRe_ = /[?&]($|#)/; +goog.uri.utils.removeParam = function(uri, keyEncoded) { + var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_); + var position = 0; + var foundIndex; + var buffer = []; + while((foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex)) >= 0) { + buffer.push(uri.substring(position, foundIndex)); + position = Math.min(uri.indexOf("\x26", foundIndex) + 1 || hashOrEndIndex, hashOrEndIndex) + } + buffer.push(uri.substr(position)); + return buffer.join("").replace(goog.uri.utils.trailingQueryPunctuationRe_, "$1") +}; +goog.uri.utils.setParam = function(uri, keyEncoded, value) { + return goog.uri.utils.appendParam(goog.uri.utils.removeParam(uri, keyEncoded), keyEncoded, value) +}; +goog.uri.utils.appendPath = function(baseUri, path) { + goog.uri.utils.assertNoFragmentsOrQueries_(baseUri); + if(goog.string.endsWith(baseUri, "/")) { + baseUri = baseUri.substr(0, baseUri.length - 1) + } + if(goog.string.startsWith(path, "/")) { + path = path.substr(1) + } + return goog.string.buildString(baseUri, "/", path) +}; +goog.uri.utils.StandardQueryParam = {RANDOM:"zx"}; +goog.uri.utils.makeUnique = function(uri) { + return goog.uri.utils.setParam(uri, goog.uri.utils.StandardQueryParam.RANDOM, goog.string.getRandomString()) +}; +goog.provide("goog.Uri"); +goog.provide("goog.Uri.QueryData"); +goog.require("goog.array"); +goog.require("goog.string"); +goog.require("goog.structs"); +goog.require("goog.structs.Map"); +goog.require("goog.uri.utils"); +goog.require("goog.uri.utils.ComponentIndex"); +goog.require("goog.uri.utils.StandardQueryParam"); +goog.Uri = function(opt_uri, opt_ignoreCase) { + var m; + if(opt_uri instanceof goog.Uri) { + this.ignoreCase_ = goog.isDef(opt_ignoreCase) ? opt_ignoreCase : opt_uri.getIgnoreCase(); + this.setScheme(opt_uri.getScheme()); + this.setUserInfo(opt_uri.getUserInfo()); + this.setDomain(opt_uri.getDomain()); + this.setPort(opt_uri.getPort()); + this.setPath(opt_uri.getPath()); + this.setQueryData(opt_uri.getQueryData().clone()); + this.setFragment(opt_uri.getFragment()) + }else { + if(opt_uri && (m = goog.uri.utils.split(String(opt_uri)))) { + this.ignoreCase_ = !!opt_ignoreCase; + this.setScheme(m[goog.uri.utils.ComponentIndex.SCHEME] || "", true); + this.setUserInfo(m[goog.uri.utils.ComponentIndex.USER_INFO] || "", true); + this.setDomain(m[goog.uri.utils.ComponentIndex.DOMAIN] || "", true); + this.setPort(m[goog.uri.utils.ComponentIndex.PORT]); + this.setPath(m[goog.uri.utils.ComponentIndex.PATH] || "", true); + this.setQueryData(m[goog.uri.utils.ComponentIndex.QUERY_DATA] || "", true); + this.setFragment(m[goog.uri.utils.ComponentIndex.FRAGMENT] || "", true) + }else { + this.ignoreCase_ = !!opt_ignoreCase; + this.queryData_ = new goog.Uri.QueryData(null, null, this.ignoreCase_) + } + } +}; +goog.Uri.preserveParameterTypesCompatibilityFlag = false; +goog.Uri.RANDOM_PARAM = goog.uri.utils.StandardQueryParam.RANDOM; +goog.Uri.prototype.scheme_ = ""; +goog.Uri.prototype.userInfo_ = ""; +goog.Uri.prototype.domain_ = ""; +goog.Uri.prototype.port_ = null; +goog.Uri.prototype.path_ = ""; +goog.Uri.prototype.queryData_; +goog.Uri.prototype.fragment_ = ""; +goog.Uri.prototype.isReadOnly_ = false; +goog.Uri.prototype.ignoreCase_ = false; +goog.Uri.prototype.toString = function() { + var out = []; + var scheme = this.getScheme(); + if(scheme) { + out.push(goog.Uri.encodeSpecialChars_(scheme, goog.Uri.reDisallowedInSchemeOrUserInfo_), ":") + } + var domain = this.getDomain(); + if(domain) { + out.push("//"); + var userInfo = this.getUserInfo(); + if(userInfo) { + out.push(goog.Uri.encodeSpecialChars_(userInfo, goog.Uri.reDisallowedInSchemeOrUserInfo_), "@") + } + out.push(goog.string.urlEncode(domain)); + var port = this.getPort(); + if(port != null) { + out.push(":", String(port)) + } + } + var path = this.getPath(); + if(path) { + if(this.hasDomain() && path.charAt(0) != "/") { + out.push("/") + } + out.push(goog.Uri.encodeSpecialChars_(path, path.charAt(0) == "/" ? goog.Uri.reDisallowedInAbsolutePath_ : goog.Uri.reDisallowedInRelativePath_)) + } + var query = this.getEncodedQuery(); + if(query) { + out.push("?", query) + } + var fragment = this.getFragment(); + if(fragment) { + out.push("#", goog.Uri.encodeSpecialChars_(fragment, goog.Uri.reDisallowedInFragment_)) + } + return out.join("") +}; +goog.Uri.prototype.resolve = function(relativeUri) { + var absoluteUri = this.clone(); + var overridden = relativeUri.hasScheme(); + if(overridden) { + absoluteUri.setScheme(relativeUri.getScheme()) + }else { + overridden = relativeUri.hasUserInfo() + } + if(overridden) { + absoluteUri.setUserInfo(relativeUri.getUserInfo()) + }else { + overridden = relativeUri.hasDomain() + } + if(overridden) { + absoluteUri.setDomain(relativeUri.getDomain()) + }else { + overridden = relativeUri.hasPort() + } + var path = relativeUri.getPath(); + if(overridden) { + absoluteUri.setPort(relativeUri.getPort()) + }else { + overridden = relativeUri.hasPath(); + if(overridden) { + if(path.charAt(0) != "/") { + if(this.hasDomain() && !this.hasPath()) { + path = "/" + path + }else { + var lastSlashIndex = absoluteUri.getPath().lastIndexOf("/"); + if(lastSlashIndex != -1) { + path = absoluteUri.getPath().substr(0, lastSlashIndex + 1) + path + } + } + } + path = goog.Uri.removeDotSegments(path) + } + } + if(overridden) { + absoluteUri.setPath(path) + }else { + overridden = relativeUri.hasQuery() + } + if(overridden) { + absoluteUri.setQueryData(relativeUri.getDecodedQuery()) + }else { + overridden = relativeUri.hasFragment() + } + if(overridden) { + absoluteUri.setFragment(relativeUri.getFragment()) + } + return absoluteUri +}; +goog.Uri.prototype.clone = function() { + return new goog.Uri(this) +}; +goog.Uri.prototype.getScheme = function() { + return this.scheme_ +}; +goog.Uri.prototype.setScheme = function(newScheme, opt_decode) { + this.enforceReadOnly(); + this.scheme_ = opt_decode ? goog.Uri.decodeOrEmpty_(newScheme) : newScheme; + if(this.scheme_) { + this.scheme_ = this.scheme_.replace(/:$/, "") + } + return this +}; +goog.Uri.prototype.hasScheme = function() { + return!!this.scheme_ +}; +goog.Uri.prototype.getUserInfo = function() { + return this.userInfo_ +}; +goog.Uri.prototype.setUserInfo = function(newUserInfo, opt_decode) { + this.enforceReadOnly(); + this.userInfo_ = opt_decode ? goog.Uri.decodeOrEmpty_(newUserInfo) : newUserInfo; + return this +}; +goog.Uri.prototype.hasUserInfo = function() { + return!!this.userInfo_ +}; +goog.Uri.prototype.getDomain = function() { + return this.domain_ +}; +goog.Uri.prototype.setDomain = function(newDomain, opt_decode) { + this.enforceReadOnly(); + this.domain_ = opt_decode ? goog.Uri.decodeOrEmpty_(newDomain) : newDomain; + return this +}; +goog.Uri.prototype.hasDomain = function() { + return!!this.domain_ +}; +goog.Uri.prototype.getPort = function() { + return this.port_ +}; +goog.Uri.prototype.setPort = function(newPort) { + this.enforceReadOnly(); + if(newPort) { + newPort = Number(newPort); + if(isNaN(newPort) || newPort < 0) { + throw Error("Bad port number " + newPort); + } + this.port_ = newPort + }else { + this.port_ = null + } + return this +}; +goog.Uri.prototype.hasPort = function() { + return this.port_ != null +}; +goog.Uri.prototype.getPath = function() { + return this.path_ +}; +goog.Uri.prototype.setPath = function(newPath, opt_decode) { + this.enforceReadOnly(); + this.path_ = opt_decode ? goog.Uri.decodeOrEmpty_(newPath) : newPath; + return this +}; +goog.Uri.prototype.hasPath = function() { + return!!this.path_ +}; +goog.Uri.prototype.hasQuery = function() { + return this.queryData_.toString() !== "" +}; +goog.Uri.prototype.setQueryData = function(queryData, opt_decode) { + this.enforceReadOnly(); + if(queryData instanceof goog.Uri.QueryData) { + this.queryData_ = queryData; + this.queryData_.setIgnoreCase(this.ignoreCase_) + }else { + if(!opt_decode) { + queryData = goog.Uri.encodeSpecialChars_(queryData, goog.Uri.reDisallowedInQuery_) + } + this.queryData_ = new goog.Uri.QueryData(queryData, null, this.ignoreCase_) + } + return this +}; +goog.Uri.prototype.setQuery = function(newQuery, opt_decode) { + return this.setQueryData(newQuery, opt_decode) +}; +goog.Uri.prototype.getEncodedQuery = function() { + return this.queryData_.toString() +}; +goog.Uri.prototype.getDecodedQuery = function() { + return this.queryData_.toDecodedString() +}; +goog.Uri.prototype.getQueryData = function() { + return this.queryData_ +}; +goog.Uri.prototype.getQuery = function() { + return this.getEncodedQuery() +}; +goog.Uri.prototype.setParameterValue = function(key, value) { + this.enforceReadOnly(); + this.queryData_.set(key, value); + return this +}; +goog.Uri.prototype.setParameterValues = function(key, values) { + this.enforceReadOnly(); + if(!goog.isArray(values)) { + values = [String(values)] + } + this.queryData_.setValues(key, (values)); + return this +}; +goog.Uri.prototype.getParameterValues = function(name) { + return this.queryData_.getValues(name) +}; +goog.Uri.prototype.getParameterValue = function(paramName) { + return(this.queryData_.get(paramName)) +}; +goog.Uri.prototype.getFragment = function() { + return this.fragment_ +}; +goog.Uri.prototype.setFragment = function(newFragment, opt_decode) { + this.enforceReadOnly(); + this.fragment_ = opt_decode ? goog.Uri.decodeOrEmpty_(newFragment) : newFragment; + return this +}; +goog.Uri.prototype.hasFragment = function() { + return!!this.fragment_ +}; +goog.Uri.prototype.hasSameDomainAs = function(uri2) { + return(!this.hasDomain() && !uri2.hasDomain() || this.getDomain() == uri2.getDomain()) && (!this.hasPort() && !uri2.hasPort() || this.getPort() == uri2.getPort()) +}; +goog.Uri.prototype.makeUnique = function() { + this.enforceReadOnly(); + this.setParameterValue(goog.Uri.RANDOM_PARAM, goog.string.getRandomString()); + return this +}; +goog.Uri.prototype.removeParameter = function(key) { + this.enforceReadOnly(); + this.queryData_.remove(key); + return this +}; +goog.Uri.prototype.setReadOnly = function(isReadOnly) { + this.isReadOnly_ = isReadOnly; + return this +}; +goog.Uri.prototype.isReadOnly = function() { + return this.isReadOnly_ +}; +goog.Uri.prototype.enforceReadOnly = function() { + if(this.isReadOnly_) { + throw Error("Tried to modify a read-only Uri"); + } +}; +goog.Uri.prototype.setIgnoreCase = function(ignoreCase) { + this.ignoreCase_ = ignoreCase; + if(this.queryData_) { + this.queryData_.setIgnoreCase(ignoreCase) + } + return this +}; +goog.Uri.prototype.getIgnoreCase = function() { + return this.ignoreCase_ +}; +goog.Uri.parse = function(uri, opt_ignoreCase) { + return uri instanceof goog.Uri ? uri.clone() : new goog.Uri(uri, opt_ignoreCase) +}; +goog.Uri.create = function(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_query, opt_fragment, opt_ignoreCase) { + var uri = new goog.Uri(null, opt_ignoreCase); + opt_scheme && uri.setScheme(opt_scheme); + opt_userInfo && uri.setUserInfo(opt_userInfo); + opt_domain && uri.setDomain(opt_domain); + opt_port && uri.setPort(opt_port); + opt_path && uri.setPath(opt_path); + opt_query && uri.setQueryData(opt_query); + opt_fragment && uri.setFragment(opt_fragment); + return uri +}; +goog.Uri.resolve = function(base, rel) { + if(!(base instanceof goog.Uri)) { + base = goog.Uri.parse(base) + } + if(!(rel instanceof goog.Uri)) { + rel = goog.Uri.parse(rel) + } + return base.resolve(rel) +}; +goog.Uri.removeDotSegments = function(path) { + if(path == ".." || path == ".") { + return"" + }else { + if(!goog.string.contains(path, "./") && !goog.string.contains(path, "/.")) { + return path + }else { + var leadingSlash = goog.string.startsWith(path, "/"); + var segments = path.split("/"); + var out = []; + for(var pos = 0;pos < segments.length;) { + var segment = segments[pos++]; + if(segment == ".") { + if(leadingSlash && pos == segments.length) { + out.push("") + } + }else { + if(segment == "..") { + if(out.length > 1 || out.length == 1 && out[0] != "") { + out.pop() + } + if(leadingSlash && pos == segments.length) { + out.push("") + } + }else { + out.push(segment); + leadingSlash = true + } + } + } + return out.join("/") + } + } +}; +goog.Uri.decodeOrEmpty_ = function(val) { + return val ? decodeURIComponent(val) : "" +}; +goog.Uri.encodeSpecialChars_ = function(unescapedPart, extra) { + if(goog.isString(unescapedPart)) { + return encodeURI(unescapedPart).replace(extra, goog.Uri.encodeChar_) + } + return null +}; +goog.Uri.encodeChar_ = function(ch) { + var n = ch.charCodeAt(0); + return"%" + (n >> 4 & 15).toString(16) + (n & 15).toString(16) +}; +goog.Uri.reDisallowedInSchemeOrUserInfo_ = /[#\/\?@]/g; +goog.Uri.reDisallowedInRelativePath_ = /[\#\?:]/g; +goog.Uri.reDisallowedInAbsolutePath_ = /[\#\?]/g; +goog.Uri.reDisallowedInQuery_ = /[\#\?@]/g; +goog.Uri.reDisallowedInFragment_ = /#/g; +goog.Uri.haveSameDomain = function(uri1String, uri2String) { + var pieces1 = goog.uri.utils.split(uri1String); + var pieces2 = goog.uri.utils.split(uri2String); + return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] == pieces2[goog.uri.utils.ComponentIndex.DOMAIN] && pieces1[goog.uri.utils.ComponentIndex.PORT] == pieces2[goog.uri.utils.ComponentIndex.PORT] +}; +goog.Uri.QueryData = function(opt_query, opt_uri, opt_ignoreCase) { + this.encodedQuery_ = opt_query || null; + this.ignoreCase_ = !!opt_ignoreCase +}; +goog.Uri.QueryData.prototype.ensureKeyMapInitialized_ = function() { + if(!this.keyMap_) { + this.keyMap_ = new goog.structs.Map; + this.count_ = 0; + if(this.encodedQuery_) { + var pairs = this.encodedQuery_.split("\x26"); + for(var i = 0;i < pairs.length;i++) { + var indexOfEquals = pairs[i].indexOf("\x3d"); + var name = null; + var value = null; + if(indexOfEquals >= 0) { + name = pairs[i].substring(0, indexOfEquals); + value = pairs[i].substring(indexOfEquals + 1) + }else { + name = pairs[i] + } + name = goog.string.urlDecode(name); + name = this.getKeyName_(name); + this.add(name, value ? goog.string.urlDecode(value) : "") + } + } + } +}; +goog.Uri.QueryData.createFromMap = function(map, opt_uri, opt_ignoreCase) { + var keys = goog.structs.getKeys(map); + if(typeof keys == "undefined") { + throw Error("Keys are undefined"); + } + var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase); + var values = goog.structs.getValues(map); + for(var i = 0;i < keys.length;i++) { + var key = keys[i]; + var value = values[i]; + if(!goog.isArray(value)) { + queryData.add(key, value) + }else { + queryData.setValues(key, value) + } + } + return queryData +}; +goog.Uri.QueryData.createFromKeysValues = function(keys, values, opt_uri, opt_ignoreCase) { + if(keys.length != values.length) { + throw Error("Mismatched lengths for keys/values"); + } + var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase); + for(var i = 0;i < keys.length;i++) { + queryData.add(keys[i], values[i]) + } + return queryData +}; +goog.Uri.QueryData.prototype.keyMap_ = null; +goog.Uri.QueryData.prototype.count_ = null; +goog.Uri.QueryData.prototype.getCount = function() { + this.ensureKeyMapInitialized_(); + return this.count_ +}; +goog.Uri.QueryData.prototype.add = function(key, value) { + this.ensureKeyMapInitialized_(); + this.invalidateCache_(); + key = this.getKeyName_(key); + var values = this.keyMap_.get(key); + if(!values) { + this.keyMap_.set(key, values = []) + } + values.push(value); + this.count_++; + return this +}; +goog.Uri.QueryData.prototype.remove = function(key) { + this.ensureKeyMapInitialized_(); + key = this.getKeyName_(key); + if(this.keyMap_.containsKey(key)) { + this.invalidateCache_(); + this.count_ -= this.keyMap_.get(key).length; + return this.keyMap_.remove(key) + } + return false +}; +goog.Uri.QueryData.prototype.clear = function() { + this.invalidateCache_(); + this.keyMap_ = null; + this.count_ = 0 +}; +goog.Uri.QueryData.prototype.isEmpty = function() { + this.ensureKeyMapInitialized_(); + return this.count_ == 0 +}; +goog.Uri.QueryData.prototype.containsKey = function(key) { + this.ensureKeyMapInitialized_(); + key = this.getKeyName_(key); + return this.keyMap_.containsKey(key) +}; +goog.Uri.QueryData.prototype.containsValue = function(value) { + var vals = this.getValues(); + return goog.array.contains(vals, value) +}; +goog.Uri.QueryData.prototype.getKeys = function() { + this.ensureKeyMapInitialized_(); + var vals = (this.keyMap_.getValues()); + var keys = this.keyMap_.getKeys(); + var rv = []; + for(var i = 0;i < keys.length;i++) { + var val = vals[i]; + for(var j = 0;j < val.length;j++) { + rv.push(keys[i]) + } + } + return rv +}; +goog.Uri.QueryData.prototype.getValues = function(opt_key) { + this.ensureKeyMapInitialized_(); + var rv = []; + if(opt_key) { + if(this.containsKey(opt_key)) { + rv = goog.array.concat(rv, this.keyMap_.get(this.getKeyName_(opt_key))) + } + }else { + var values = (this.keyMap_.getValues()); + for(var i = 0;i < values.length;i++) { + rv = goog.array.concat(rv, values[i]) + } + } + return rv +}; +goog.Uri.QueryData.prototype.set = function(key, value) { + this.ensureKeyMapInitialized_(); + this.invalidateCache_(); + key = this.getKeyName_(key); + if(this.containsKey(key)) { + this.count_ -= this.keyMap_.get(key).length + } + this.keyMap_.set(key, [value]); + this.count_++; + return this +}; +goog.Uri.QueryData.prototype.get = function(key, opt_default) { + var values = key ? this.getValues(key) : []; + if(goog.Uri.preserveParameterTypesCompatibilityFlag) { + return values.length > 0 ? values[0] : opt_default + }else { + return values.length > 0 ? String(values[0]) : opt_default + } +}; +goog.Uri.QueryData.prototype.setValues = function(key, values) { + this.remove(key); + if(values.length > 0) { + this.invalidateCache_(); + this.keyMap_.set(this.getKeyName_(key), goog.array.clone(values)); + this.count_ += values.length + } +}; +goog.Uri.QueryData.prototype.toString = function() { + if(this.encodedQuery_) { + return this.encodedQuery_ + } + if(!this.keyMap_) { + return"" + } + var sb = []; + var keys = this.keyMap_.getKeys(); + for(var i = 0;i < keys.length;i++) { + var key = keys[i]; + var encodedKey = goog.string.urlEncode(key); + var val = this.getValues(key); + for(var j = 0;j < val.length;j++) { + var param = encodedKey; + if(val[j] !== "") { + param += "\x3d" + goog.string.urlEncode(val[j]) + } + sb.push(param) + } + } + return this.encodedQuery_ = sb.join("\x26") +}; +goog.Uri.QueryData.prototype.toDecodedString = function() { + return goog.Uri.decodeOrEmpty_(this.toString()) +}; +goog.Uri.QueryData.prototype.invalidateCache_ = function() { + this.encodedQuery_ = null +}; +goog.Uri.QueryData.prototype.filterKeys = function(keys) { + this.ensureKeyMapInitialized_(); + goog.structs.forEach(this.keyMap_, function(value, key, map) { + if(!goog.array.contains(keys, key)) { + this.remove(key) + } + }, this); + return this +}; +goog.Uri.QueryData.prototype.clone = function() { + var rv = new goog.Uri.QueryData; + rv.encodedQuery_ = this.encodedQuery_; + if(this.keyMap_) { + rv.keyMap_ = this.keyMap_.clone(); + rv.count_ = this.count_ + } + return rv +}; +goog.Uri.QueryData.prototype.getKeyName_ = function(arg) { + var keyName = String(arg); + if(this.ignoreCase_) { + keyName = keyName.toLowerCase() + } + return keyName +}; +goog.Uri.QueryData.prototype.setIgnoreCase = function(ignoreCase) { + var resetKeys = ignoreCase && !this.ignoreCase_; + if(resetKeys) { + this.ensureKeyMapInitialized_(); + this.invalidateCache_(); + goog.structs.forEach(this.keyMap_, function(value, key) { + var lowerCase = key.toLowerCase(); + if(key != lowerCase) { + this.remove(key); + this.setValues(lowerCase, value) + } + }, this) + } + this.ignoreCase_ = ignoreCase +}; +goog.Uri.QueryData.prototype.extend = function(var_args) { + for(var i = 0;i < arguments.length;i++) { + var data = arguments[i]; + goog.structs.forEach(data, function(value, key) { + this.add(key, value) + }, this) + } +}; +goog.provide("goog.async.AnimationDelay"); +goog.require("goog.Disposable"); +goog.require("goog.events"); +goog.require("goog.functions"); +goog.async.AnimationDelay = function(listener, opt_window, opt_handler) { + goog.base(this); + this.listener_ = listener; + this.handler_ = opt_handler; + this.win_ = opt_window || window; + this.callback_ = goog.bind(this.doAction_, this) +}; +goog.inherits(goog.async.AnimationDelay, goog.Disposable); +goog.async.AnimationDelay.prototype.id_ = null; +goog.async.AnimationDelay.prototype.usingListeners_ = false; +goog.async.AnimationDelay.TIMEOUT = 20; +goog.async.AnimationDelay.MOZ_BEFORE_PAINT_EVENT_ = "MozBeforePaint"; +goog.async.AnimationDelay.prototype.start = function() { + this.stop(); + this.usingListeners_ = false; + var raf = this.getRaf_(); + var cancelRaf = this.getCancelRaf_(); + if(raf && !cancelRaf && this.win_.mozRequestAnimationFrame) { + this.id_ = goog.events.listen(this.win_, goog.async.AnimationDelay.MOZ_BEFORE_PAINT_EVENT_, this.callback_); + this.win_.mozRequestAnimationFrame(null); + this.usingListeners_ = true + }else { + if(raf && cancelRaf) { + this.id_ = raf.call(this.win_, this.callback_) + }else { + this.id_ = this.win_.setTimeout(goog.functions.lock(this.callback_), goog.async.AnimationDelay.TIMEOUT) + } + } +}; +goog.async.AnimationDelay.prototype.stop = function() { + if(this.isActive()) { + var raf = this.getRaf_(); + var cancelRaf = this.getCancelRaf_(); + if(raf && !cancelRaf && this.win_.mozRequestAnimationFrame) { + goog.events.unlistenByKey(this.id_) + }else { + if(raf && cancelRaf) { + cancelRaf.call(this.win_, (this.id_)) + }else { + this.win_.clearTimeout((this.id_)) + } + } + } + this.id_ = null +}; +goog.async.AnimationDelay.prototype.fire = function() { + this.stop(); + this.doAction_() +}; +goog.async.AnimationDelay.prototype.fireIfActive = function() { + if(this.isActive()) { + this.fire() + } +}; +goog.async.AnimationDelay.prototype.isActive = function() { + return this.id_ != null +}; +goog.async.AnimationDelay.prototype.doAction_ = function() { + if(this.usingListeners_ && this.id_) { + goog.events.unlistenByKey(this.id_) + } + this.id_ = null; + this.listener_.call(this.handler_, goog.now()) +}; +goog.async.AnimationDelay.prototype.disposeInternal = function() { + this.stop(); + goog.base(this, "disposeInternal") +}; +goog.async.AnimationDelay.prototype.getRaf_ = function() { + var win = this.win_; + return win.requestAnimationFrame || win.webkitRequestAnimationFrame || win.mozRequestAnimationFrame || win.oRequestAnimationFrame || win.msRequestAnimationFrame || null +}; +goog.async.AnimationDelay.prototype.getCancelRaf_ = function() { + var win = this.win_; + return win.cancelRequestAnimationFrame || win.webkitCancelRequestAnimationFrame || win.mozCancelRequestAnimationFrame || win.oCancelRequestAnimationFrame || win.msCancelRequestAnimationFrame || null +}; +goog.provide("goog.async.nextTick"); +goog.require("goog.debug.entryPointRegistry"); +goog.require("goog.functions"); +goog.async.nextTick = function(callback, opt_context) { + var cb = callback; + if(opt_context) { + cb = goog.bind(callback, opt_context) + } + cb = goog.async.nextTick.wrapCallback_(cb); + if(goog.isFunction(goog.global.setImmediate)) { + goog.global.setImmediate(cb); + return + } + if(!goog.async.nextTick.setImmediate_) { + goog.async.nextTick.setImmediate_ = goog.async.nextTick.getSetImmediateEmulator_() + } + goog.async.nextTick.setImmediate_(cb) +}; +goog.async.nextTick.setImmediate_; +goog.async.nextTick.getSetImmediateEmulator_ = function() { + var Channel = goog.global["MessageChannel"]; + if(typeof Channel === "undefined" && typeof window !== "undefined" && window.postMessage && window.addEventListener) { + Channel = function() { + var iframe = document.createElement("iframe"); + iframe.style.display = "none"; + iframe.src = ""; + document.body.appendChild(iframe); + var win = iframe.contentWindow; + var doc = win.document; + doc.open(); + doc.write(""); + doc.close(); + var message = "callImmediate" + Math.random(); + var origin = win.location.protocol + "//" + win.location.host; + var onmessage = goog.bind(function(e) { + if(e.origin != origin && e.data != message) { + return + } + this["port1"].onmessage() + }, this); + win.addEventListener("message", onmessage, false); + this["port1"] = {}; + this["port2"] = {postMessage:function() { + win.postMessage(message, origin) + }} + } + } + if(typeof Channel !== "undefined") { + var channel = new Channel; + var head = {}; + var tail = head; + channel["port1"].onmessage = function() { + head = head.next; + var cb = head.cb; + head.cb = null; + cb() + }; + return function(cb) { + tail.next = {cb:cb}; + tail = tail.next; + channel["port2"].postMessage(0) + } + } + if(typeof document !== "undefined" && "onreadystatechange" in document.createElement("script")) { + return function(cb) { + var script = document.createElement("script"); + script.onreadystatechange = function() { + script.onreadystatechange = null; + script.parentNode.removeChild(script); + script = null; + cb(); + cb = null + }; + document.documentElement.appendChild(script) + } + } + return function(cb) { + goog.global.setTimeout(cb, 0) + } +}; +goog.async.nextTick.wrapCallback_ = goog.functions.identity; +goog.debug.entryPointRegistry.register(function(transformer) { + goog.async.nextTick.wrapCallback_ = transformer +}); +goog.provide("goog.structs.Collection"); +goog.structs.Collection = function() { +}; +goog.structs.Collection.prototype.add; +goog.structs.Collection.prototype.remove; +goog.structs.Collection.prototype.contains; +goog.structs.Collection.prototype.getCount; +goog.provide("goog.structs.Set"); +goog.require("goog.structs"); +goog.require("goog.structs.Collection"); +goog.require("goog.structs.Map"); +goog.structs.Set = function(opt_values) { + this.map_ = new goog.structs.Map; + if(opt_values) { + this.addAll(opt_values) + } +}; +goog.structs.Set.getKey_ = function(val) { + var type = typeof val; + if(type == "object" && val || type == "function") { + return"o" + goog.getUid((val)) + }else { + return type.substr(0, 1) + val + } +}; +goog.structs.Set.prototype.getCount = function() { + return this.map_.getCount() +}; +goog.structs.Set.prototype.add = function(element) { + this.map_.set(goog.structs.Set.getKey_(element), element) +}; +goog.structs.Set.prototype.addAll = function(col) { + var values = goog.structs.getValues(col); + var l = values.length; + for(var i = 0;i < l;i++) { + this.add(values[i]) + } +}; +goog.structs.Set.prototype.removeAll = function(col) { + var values = goog.structs.getValues(col); + var l = values.length; + for(var i = 0;i < l;i++) { + this.remove(values[i]) + } +}; +goog.structs.Set.prototype.remove = function(element) { + return this.map_.remove(goog.structs.Set.getKey_(element)) +}; +goog.structs.Set.prototype.clear = function() { + this.map_.clear() +}; +goog.structs.Set.prototype.isEmpty = function() { + return this.map_.isEmpty() +}; +goog.structs.Set.prototype.contains = function(element) { + return this.map_.containsKey(goog.structs.Set.getKey_(element)) +}; +goog.structs.Set.prototype.containsAll = function(col) { + return goog.structs.every(col, this.contains, this) +}; +goog.structs.Set.prototype.intersection = function(col) { + var result = new goog.structs.Set; + var values = goog.structs.getValues(col); + for(var i = 0;i < values.length;i++) { + var value = values[i]; + if(this.contains(value)) { + result.add(value) + } + } + return result +}; +goog.structs.Set.prototype.difference = function(col) { + var result = this.clone(); + result.removeAll(col); + return result +}; +goog.structs.Set.prototype.getValues = function() { + return this.map_.getValues() +}; +goog.structs.Set.prototype.clone = function() { + return new goog.structs.Set(this) +}; +goog.structs.Set.prototype.equals = function(col) { + return this.getCount() == goog.structs.getCount(col) && this.isSubsetOf(col) +}; +goog.structs.Set.prototype.isSubsetOf = function(col) { + var colCount = goog.structs.getCount(col); + if(this.getCount() > colCount) { + return false + } + if(!(col instanceof goog.structs.Set) && colCount > 5) { + col = new goog.structs.Set(col) + } + return goog.structs.every(this, function(value) { + return goog.structs.contains(col, value) + }) +}; +goog.structs.Set.prototype.__iterator__ = function(opt_keys) { + return this.map_.__iterator__(false) +}; +goog.provide("goog.debug"); +goog.require("goog.array"); +goog.require("goog.string"); +goog.require("goog.structs.Set"); +goog.require("goog.userAgent"); +goog.define("goog.debug.LOGGING_ENABLED", goog.DEBUG); +goog.debug.catchErrors = function(logFunc, opt_cancel, opt_target) { + var target = opt_target || goog.global; + var oldErrorHandler = target.onerror; + var retVal = !!opt_cancel; + if(goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher("535.3")) { + retVal = !retVal + } + target.onerror = function(message, url, line) { + if(oldErrorHandler) { + oldErrorHandler(message, url, line) + } + logFunc({message:message, fileName:url, line:line}); + return retVal + } +}; +goog.debug.expose = function(obj, opt_showFn) { + if(typeof obj == "undefined") { + return"undefined" + } + if(obj == null) { + return"NULL" + } + var str = []; + for(var x in obj) { + if(!opt_showFn && goog.isFunction(obj[x])) { + continue + } + var s = x + " \x3d "; + try { + s += obj[x] + }catch(e) { + s += "*** " + e + " ***" + } + str.push(s) + } + return str.join("\n") +}; +goog.debug.deepExpose = function(obj, opt_showFn) { + var previous = new goog.structs.Set; + var str = []; + var helper = function(obj, space) { + var nestspace = space + " "; + var indentMultiline = function(str) { + return str.replace(/\n/g, "\n" + space) + }; + try { + if(!goog.isDef(obj)) { + str.push("undefined") + }else { + if(goog.isNull(obj)) { + str.push("NULL") + }else { + if(goog.isString(obj)) { + str.push('"' + indentMultiline(obj) + '"') + }else { + if(goog.isFunction(obj)) { + str.push(indentMultiline(String(obj))) + }else { + if(goog.isObject(obj)) { + if(previous.contains(obj)) { + str.push("*** reference loop detected ***") + }else { + previous.add(obj); + str.push("{"); + for(var x in obj) { + if(!opt_showFn && goog.isFunction(obj[x])) { + continue + } + str.push("\n"); + str.push(nestspace); + str.push(x + " \x3d "); + helper(obj[x], nestspace) + } + str.push("\n" + space + "}") + } + }else { + str.push(obj) + } + } + } + } + } + }catch(e) { + str.push("*** " + e + " ***") + } + }; + helper(obj, ""); + return str.join("") +}; +goog.debug.exposeArray = function(arr) { + var str = []; + for(var i = 0;i < arr.length;i++) { + if(goog.isArray(arr[i])) { + str.push(goog.debug.exposeArray(arr[i])) + }else { + str.push(arr[i]) + } + } + return"[ " + str.join(", ") + " ]" +}; +goog.debug.exposeException = function(err, opt_fn) { + try { + var e = goog.debug.normalizeErrorObject(err); + var error = "Message: " + goog.string.htmlEscape(e.message) + '\nUrl: \x3ca href\x3d"view-source:' + e.fileName + '" target\x3d"_new"\x3e' + e.fileName + "\x3c/a\x3e\nLine: " + e.lineNumber + "\n\nBrowser stack:\n" + goog.string.htmlEscape(e.stack + "-\x3e ") + "[end]\n\nJS stack traversal:\n" + goog.string.htmlEscape(goog.debug.getStacktrace(opt_fn) + "-\x3e "); + return error + }catch(e2) { + return"Exception trying to expose exception! You win, we lose. " + e2 + } +}; +goog.debug.normalizeErrorObject = function(err) { + var href = goog.getObjectByName("window.location.href"); + if(goog.isString(err)) { + return{"message":err, "name":"Unknown error", "lineNumber":"Not available", "fileName":href, "stack":"Not available"} + } + var lineNumber, fileName; + var threwError = false; + try { + lineNumber = err.lineNumber || err.line || "Not available" + }catch(e) { + lineNumber = "Not available"; + threwError = true + } + try { + fileName = err.fileName || err.filename || err.sourceURL || goog.global["$googDebugFname"] || href + }catch(e) { + fileName = "Not available"; + threwError = true + } + if(threwError || !err.lineNumber || !err.fileName || !err.stack || !err.message || !err.name) { + return{"message":err.message || "Not available", "name":err.name || "UnknownError", "lineNumber":lineNumber, "fileName":fileName, "stack":err.stack || "Not available"} + } + return err +}; +goog.debug.enhanceError = function(err, opt_message) { + var error = typeof err == "string" ? Error(err) : err; + if(!error.stack) { + error.stack = goog.debug.getStacktrace(arguments.callee.caller) + } + if(opt_message) { + var x = 0; + while(error["message" + x]) { + ++x + } + error["message" + x] = String(opt_message) + } + return error +}; +goog.debug.getStacktraceSimple = function(opt_depth) { + var sb = []; + var fn = arguments.callee.caller; + var depth = 0; + while(fn && (!opt_depth || depth < opt_depth)) { + sb.push(goog.debug.getFunctionName(fn)); + sb.push("()\n"); + try { + fn = fn.caller + }catch(e) { + sb.push("[exception trying to get caller]\n"); + break + } + depth++; + if(depth >= goog.debug.MAX_STACK_DEPTH) { + sb.push("[...long stack...]"); + break + } + } + if(opt_depth && depth >= opt_depth) { + sb.push("[...reached max depth limit...]") + }else { + sb.push("[end]") + } + return sb.join("") +}; +goog.debug.MAX_STACK_DEPTH = 50; +goog.debug.getStacktrace = function(opt_fn) { + return goog.debug.getStacktraceHelper_(opt_fn || arguments.callee.caller, []) +}; +goog.debug.getStacktraceHelper_ = function(fn, visited) { + var sb = []; + if(goog.array.contains(visited, fn)) { + sb.push("[...circular reference...]") + }else { + if(fn && visited.length < goog.debug.MAX_STACK_DEPTH) { + sb.push(goog.debug.getFunctionName(fn) + "("); + var args = fn.arguments; + for(var i = 0;i < args.length;i++) { + if(i > 0) { + sb.push(", ") + } + var argDesc; + var arg = args[i]; + switch(typeof arg) { + case "object": + argDesc = arg ? "object" : "null"; + break; + case "string": + argDesc = arg; + break; + case "number": + argDesc = String(arg); + break; + case "boolean": + argDesc = arg ? "true" : "false"; + break; + case "function": + argDesc = goog.debug.getFunctionName(arg); + argDesc = argDesc ? argDesc : "[fn]"; + break; + case "undefined": + ; + default: + argDesc = typeof arg; + break + } + if(argDesc.length > 40) { + argDesc = argDesc.substr(0, 40) + "..." + } + sb.push(argDesc) + } + visited.push(fn); + sb.push(")\n"); + try { + sb.push(goog.debug.getStacktraceHelper_(fn.caller, visited)) + }catch(e) { + sb.push("[exception trying to get caller]\n") + } + }else { + if(fn) { + sb.push("[...long stack...]") + }else { + sb.push("[end]") + } + } + } + return sb.join("") +}; +goog.debug.setFunctionResolver = function(resolver) { + goog.debug.fnNameResolver_ = resolver +}; +goog.debug.getFunctionName = function(fn) { + if(goog.debug.fnNameCache_[fn]) { + return goog.debug.fnNameCache_[fn] + } + if(goog.debug.fnNameResolver_) { + var name = goog.debug.fnNameResolver_(fn); + if(name) { + goog.debug.fnNameCache_[fn] = name; + return name + } + } + var functionSource = String(fn); + if(!goog.debug.fnNameCache_[functionSource]) { + var matches = /function ([^\(]+)/.exec(functionSource); + if(matches) { + var method = matches[1]; + goog.debug.fnNameCache_[functionSource] = method + }else { + goog.debug.fnNameCache_[functionSource] = "[Anonymous]" + } + } + return goog.debug.fnNameCache_[functionSource] +}; +goog.debug.makeWhitespaceVisible = function(string) { + return string.replace(/ /g, "[_]").replace(/\f/g, "[f]").replace(/\n/g, "[n]\n").replace(/\r/g, "[r]").replace(/\t/g, "[t]") +}; +goog.debug.fnNameCache_ = {}; +goog.debug.fnNameResolver_; +goog.provide("goog.debug.LogRecord"); +goog.debug.LogRecord = function(level, msg, loggerName, opt_time, opt_sequenceNumber) { + this.reset(level, msg, loggerName, opt_time, opt_sequenceNumber) +}; +goog.debug.LogRecord.prototype.time_; +goog.debug.LogRecord.prototype.level_; +goog.debug.LogRecord.prototype.msg_; +goog.debug.LogRecord.prototype.loggerName_; +goog.debug.LogRecord.prototype.sequenceNumber_ = 0; +goog.debug.LogRecord.prototype.exception_ = null; +goog.debug.LogRecord.prototype.exceptionText_ = null; +goog.define("goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS", true); +goog.debug.LogRecord.nextSequenceNumber_ = 0; +goog.debug.LogRecord.prototype.reset = function(level, msg, loggerName, opt_time, opt_sequenceNumber) { + if(goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS) { + this.sequenceNumber_ = typeof opt_sequenceNumber == "number" ? opt_sequenceNumber : goog.debug.LogRecord.nextSequenceNumber_++ + } + this.time_ = opt_time || goog.now(); + this.level_ = level; + this.msg_ = msg; + this.loggerName_ = loggerName; + delete this.exception_; + delete this.exceptionText_ +}; +goog.debug.LogRecord.prototype.getLoggerName = function() { + return this.loggerName_ +}; +goog.debug.LogRecord.prototype.getException = function() { + return this.exception_ +}; +goog.debug.LogRecord.prototype.setException = function(exception) { + this.exception_ = exception +}; +goog.debug.LogRecord.prototype.getExceptionText = function() { + return this.exceptionText_ +}; +goog.debug.LogRecord.prototype.setExceptionText = function(text) { + this.exceptionText_ = text +}; +goog.debug.LogRecord.prototype.setLoggerName = function(loggerName) { + this.loggerName_ = loggerName +}; +goog.debug.LogRecord.prototype.getLevel = function() { + return this.level_ +}; +goog.debug.LogRecord.prototype.setLevel = function(level) { + this.level_ = level +}; +goog.debug.LogRecord.prototype.getMessage = function() { + return this.msg_ +}; +goog.debug.LogRecord.prototype.setMessage = function(msg) { + this.msg_ = msg +}; +goog.debug.LogRecord.prototype.getMillis = function() { + return this.time_ +}; +goog.debug.LogRecord.prototype.setMillis = function(time) { + this.time_ = time +}; +goog.debug.LogRecord.prototype.getSequenceNumber = function() { + return this.sequenceNumber_ +}; +goog.provide("goog.debug.LogBuffer"); +goog.require("goog.asserts"); +goog.require("goog.debug.LogRecord"); +goog.debug.LogBuffer = function() { + goog.asserts.assert(goog.debug.LogBuffer.isBufferingEnabled(), "Cannot use goog.debug.LogBuffer without defining " + "goog.debug.LogBuffer.CAPACITY."); + this.clear() +}; +goog.debug.LogBuffer.getInstance = function() { + if(!goog.debug.LogBuffer.instance_) { + goog.debug.LogBuffer.instance_ = new goog.debug.LogBuffer + } + return goog.debug.LogBuffer.instance_ +}; +goog.define("goog.debug.LogBuffer.CAPACITY", 0); +goog.debug.LogBuffer.prototype.buffer_; +goog.debug.LogBuffer.prototype.curIndex_; +goog.debug.LogBuffer.prototype.isFull_; +goog.debug.LogBuffer.prototype.addRecord = function(level, msg, loggerName) { + var curIndex = (this.curIndex_ + 1) % goog.debug.LogBuffer.CAPACITY; + this.curIndex_ = curIndex; + if(this.isFull_) { + var ret = this.buffer_[curIndex]; + ret.reset(level, msg, loggerName); + return ret + } + this.isFull_ = curIndex == goog.debug.LogBuffer.CAPACITY - 1; + return this.buffer_[curIndex] = new goog.debug.LogRecord(level, msg, loggerName) +}; +goog.debug.LogBuffer.isBufferingEnabled = function() { + return goog.debug.LogBuffer.CAPACITY > 0 +}; +goog.debug.LogBuffer.prototype.clear = function() { + this.buffer_ = new Array(goog.debug.LogBuffer.CAPACITY); + this.curIndex_ = -1; + this.isFull_ = false +}; +goog.debug.LogBuffer.prototype.forEachRecord = function(func) { + var buffer = this.buffer_; + if(!buffer[0]) { + return + } + var curIndex = this.curIndex_; + var i = this.isFull_ ? curIndex : -1; + do { + i = (i + 1) % goog.debug.LogBuffer.CAPACITY; + func((buffer[i])) + }while(i != curIndex) +}; +goog.provide("goog.debug.LogManager"); +goog.provide("goog.debug.Logger"); +goog.provide("goog.debug.Logger.Level"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.debug"); +goog.require("goog.debug.LogBuffer"); +goog.require("goog.debug.LogRecord"); +goog.debug.Logger = function(name) { + this.name_ = name +}; +goog.debug.Logger.prototype.parent_ = null; +goog.debug.Logger.prototype.level_ = null; +goog.debug.Logger.prototype.children_ = null; +goog.debug.Logger.prototype.handlers_ = null; +goog.define("goog.debug.Logger.ENABLE_HIERARCHY", true); +if(!goog.debug.Logger.ENABLE_HIERARCHY) { + goog.debug.Logger.rootHandlers_ = []; + goog.debug.Logger.rootLevel_ +} +goog.debug.Logger.Level = function(name, value) { + this.name = name; + this.value = value +}; +goog.debug.Logger.Level.prototype.toString = function() { + return this.name +}; +goog.debug.Logger.Level.OFF = new goog.debug.Logger.Level("OFF", Infinity); +goog.debug.Logger.Level.SHOUT = new goog.debug.Logger.Level("SHOUT", 1200); +goog.debug.Logger.Level.SEVERE = new goog.debug.Logger.Level("SEVERE", 1E3); +goog.debug.Logger.Level.WARNING = new goog.debug.Logger.Level("WARNING", 900); +goog.debug.Logger.Level.INFO = new goog.debug.Logger.Level("INFO", 800); +goog.debug.Logger.Level.CONFIG = new goog.debug.Logger.Level("CONFIG", 700); +goog.debug.Logger.Level.FINE = new goog.debug.Logger.Level("FINE", 500); +goog.debug.Logger.Level.FINER = new goog.debug.Logger.Level("FINER", 400); +goog.debug.Logger.Level.FINEST = new goog.debug.Logger.Level("FINEST", 300); +goog.debug.Logger.Level.ALL = new goog.debug.Logger.Level("ALL", 0); +goog.debug.Logger.Level.PREDEFINED_LEVELS = [goog.debug.Logger.Level.OFF, goog.debug.Logger.Level.SHOUT, goog.debug.Logger.Level.SEVERE, goog.debug.Logger.Level.WARNING, goog.debug.Logger.Level.INFO, goog.debug.Logger.Level.CONFIG, goog.debug.Logger.Level.FINE, goog.debug.Logger.Level.FINER, goog.debug.Logger.Level.FINEST, goog.debug.Logger.Level.ALL]; +goog.debug.Logger.Level.predefinedLevelsCache_ = null; +goog.debug.Logger.Level.createPredefinedLevelsCache_ = function() { + goog.debug.Logger.Level.predefinedLevelsCache_ = {}; + for(var i = 0, level;level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i];i++) { + goog.debug.Logger.Level.predefinedLevelsCache_[level.value] = level; + goog.debug.Logger.Level.predefinedLevelsCache_[level.name] = level + } +}; +goog.debug.Logger.Level.getPredefinedLevel = function(name) { + if(!goog.debug.Logger.Level.predefinedLevelsCache_) { + goog.debug.Logger.Level.createPredefinedLevelsCache_() + } + return goog.debug.Logger.Level.predefinedLevelsCache_[name] || null +}; +goog.debug.Logger.Level.getPredefinedLevelByValue = function(value) { + if(!goog.debug.Logger.Level.predefinedLevelsCache_) { + goog.debug.Logger.Level.createPredefinedLevelsCache_() + } + if(value in goog.debug.Logger.Level.predefinedLevelsCache_) { + return goog.debug.Logger.Level.predefinedLevelsCache_[value] + } + for(var i = 0;i < goog.debug.Logger.Level.PREDEFINED_LEVELS.length;++i) { + var level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i]; + if(level.value <= value) { + return level + } + } + return null +}; +goog.debug.Logger.getLogger = function(name) { + return goog.debug.LogManager.getLogger(name) +}; +goog.debug.Logger.logToProfilers = function(msg) { + if(goog.global["console"]) { + if(goog.global["console"]["timeStamp"]) { + goog.global["console"]["timeStamp"](msg) + }else { + if(goog.global["console"]["markTimeline"]) { + goog.global["console"]["markTimeline"](msg) + } + } + } + if(goog.global["msWriteProfilerMark"]) { + goog.global["msWriteProfilerMark"](msg) + } +}; +goog.debug.Logger.prototype.getName = function() { + return this.name_ +}; +goog.debug.Logger.prototype.addHandler = function(handler) { + if(goog.debug.LOGGING_ENABLED) { + if(goog.debug.Logger.ENABLE_HIERARCHY) { + if(!this.handlers_) { + this.handlers_ = [] + } + this.handlers_.push(handler) + }else { + goog.asserts.assert(!this.name_, "Cannot call addHandler on a non-root logger when " + "goog.debug.Logger.ENABLE_HIERARCHY is false."); + goog.debug.Logger.rootHandlers_.push(handler) + } + } +}; +goog.debug.Logger.prototype.removeHandler = function(handler) { + if(goog.debug.LOGGING_ENABLED) { + var handlers = goog.debug.Logger.ENABLE_HIERARCHY ? this.handlers_ : goog.debug.Logger.rootHandlers_; + return!!handlers && goog.array.remove(handlers, handler) + }else { + return false + } +}; +goog.debug.Logger.prototype.getParent = function() { + return this.parent_ +}; +goog.debug.Logger.prototype.getChildren = function() { + if(!this.children_) { + this.children_ = {} + } + return this.children_ +}; +goog.debug.Logger.prototype.setLevel = function(level) { + if(goog.debug.LOGGING_ENABLED) { + if(goog.debug.Logger.ENABLE_HIERARCHY) { + this.level_ = level + }else { + goog.asserts.assert(!this.name_, "Cannot call setLevel() on a non-root logger when " + "goog.debug.Logger.ENABLE_HIERARCHY is false."); + goog.debug.Logger.rootLevel_ = level + } + } +}; +goog.debug.Logger.prototype.getLevel = function() { + return goog.debug.LOGGING_ENABLED ? this.level_ : goog.debug.Logger.Level.OFF +}; +goog.debug.Logger.prototype.getEffectiveLevel = function() { + if(!goog.debug.LOGGING_ENABLED) { + return goog.debug.Logger.Level.OFF + } + if(!goog.debug.Logger.ENABLE_HIERARCHY) { + return goog.debug.Logger.rootLevel_ + } + if(this.level_) { + return this.level_ + } + if(this.parent_) { + return this.parent_.getEffectiveLevel() + } + goog.asserts.fail("Root logger has no level set."); + return null +}; +goog.debug.Logger.prototype.isLoggable = function(level) { + return goog.debug.LOGGING_ENABLED && level.value >= this.getEffectiveLevel().value +}; +goog.debug.Logger.prototype.log = function(level, msg, opt_exception) { + if(goog.debug.LOGGING_ENABLED && this.isLoggable(level)) { + this.doLogRecord_(this.getLogRecord(level, msg, opt_exception)) + } +}; +goog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception) { + if(goog.debug.LogBuffer.isBufferingEnabled()) { + var logRecord = goog.debug.LogBuffer.getInstance().addRecord(level, msg, this.name_) + }else { + logRecord = new goog.debug.LogRecord(level, String(msg), this.name_) + } + if(opt_exception) { + logRecord.setException(opt_exception); + logRecord.setExceptionText(goog.debug.exposeException(opt_exception, arguments.callee.caller)) + } + return logRecord +}; +goog.debug.Logger.prototype.shout = function(msg, opt_exception) { + if(goog.debug.LOGGING_ENABLED) { + this.log(goog.debug.Logger.Level.SHOUT, msg, opt_exception) + } +}; +goog.debug.Logger.prototype.severe = function(msg, opt_exception) { + if(goog.debug.LOGGING_ENABLED) { + this.log(goog.debug.Logger.Level.SEVERE, msg, opt_exception) + } +}; +goog.debug.Logger.prototype.warning = function(msg, opt_exception) { + if(goog.debug.LOGGING_ENABLED) { + this.log(goog.debug.Logger.Level.WARNING, msg, opt_exception) + } +}; +goog.debug.Logger.prototype.info = function(msg, opt_exception) { + if(goog.debug.LOGGING_ENABLED) { + this.log(goog.debug.Logger.Level.INFO, msg, opt_exception) + } +}; +goog.debug.Logger.prototype.config = function(msg, opt_exception) { + if(goog.debug.LOGGING_ENABLED) { + this.log(goog.debug.Logger.Level.CONFIG, msg, opt_exception) + } +}; +goog.debug.Logger.prototype.fine = function(msg, opt_exception) { + if(goog.debug.LOGGING_ENABLED) { + this.log(goog.debug.Logger.Level.FINE, msg, opt_exception) + } +}; +goog.debug.Logger.prototype.finer = function(msg, opt_exception) { + if(goog.debug.LOGGING_ENABLED) { + this.log(goog.debug.Logger.Level.FINER, msg, opt_exception) + } +}; +goog.debug.Logger.prototype.finest = function(msg, opt_exception) { + if(goog.debug.LOGGING_ENABLED) { + this.log(goog.debug.Logger.Level.FINEST, msg, opt_exception) + } +}; +goog.debug.Logger.prototype.logRecord = function(logRecord) { + if(goog.debug.LOGGING_ENABLED && this.isLoggable(logRecord.getLevel())) { + this.doLogRecord_(logRecord) + } +}; +goog.debug.Logger.prototype.doLogRecord_ = function(logRecord) { + goog.debug.Logger.logToProfilers("log:" + logRecord.getMessage()); + if(goog.debug.Logger.ENABLE_HIERARCHY) { + var target = this; + while(target) { + target.callPublish_(logRecord); + target = target.getParent() + } + }else { + for(var i = 0, handler;handler = goog.debug.Logger.rootHandlers_[i++];) { + handler(logRecord) + } + } +}; +goog.debug.Logger.prototype.callPublish_ = function(logRecord) { + if(this.handlers_) { + for(var i = 0, handler;handler = this.handlers_[i];i++) { + handler(logRecord) + } + } +}; +goog.debug.Logger.prototype.setParent_ = function(parent) { + this.parent_ = parent +}; +goog.debug.Logger.prototype.addChild_ = function(name, logger) { + this.getChildren()[name] = logger +}; +goog.debug.LogManager = {}; +goog.debug.LogManager.loggers_ = {}; +goog.debug.LogManager.rootLogger_ = null; +goog.debug.LogManager.initialize = function() { + if(!goog.debug.LogManager.rootLogger_) { + goog.debug.LogManager.rootLogger_ = new goog.debug.Logger(""); + goog.debug.LogManager.loggers_[""] = goog.debug.LogManager.rootLogger_; + goog.debug.LogManager.rootLogger_.setLevel(goog.debug.Logger.Level.CONFIG) + } +}; +goog.debug.LogManager.getLoggers = function() { + return goog.debug.LogManager.loggers_ +}; +goog.debug.LogManager.getRoot = function() { + goog.debug.LogManager.initialize(); + return(goog.debug.LogManager.rootLogger_) +}; +goog.debug.LogManager.getLogger = function(name) { + goog.debug.LogManager.initialize(); + var ret = goog.debug.LogManager.loggers_[name]; + return ret || goog.debug.LogManager.createLogger_(name) +}; +goog.debug.LogManager.createFunctionForCatchErrors = function(opt_logger) { + return function(info) { + var logger = opt_logger || goog.debug.LogManager.getRoot(); + logger.severe("Error: " + info.message + " (" + info.fileName + " @ Line: " + info.line + ")") + } +}; +goog.debug.LogManager.createLogger_ = function(name) { + var logger = new goog.debug.Logger(name); + if(goog.debug.Logger.ENABLE_HIERARCHY) { + var lastDotIndex = name.lastIndexOf("."); + var parentName = name.substr(0, lastDotIndex); + var leafName = name.substr(lastDotIndex + 1); + var parentLogger = goog.debug.LogManager.getLogger(parentName); + parentLogger.addChild_(leafName, logger); + logger.setParent_(parentLogger) + } + goog.debug.LogManager.loggers_[name] = logger; + return logger +}; +goog.provide("goog.debug.RelativeTimeProvider"); +goog.debug.RelativeTimeProvider = function() { + this.relativeTimeStart_ = goog.now() +}; +goog.debug.RelativeTimeProvider.defaultInstance_ = new goog.debug.RelativeTimeProvider; +goog.debug.RelativeTimeProvider.prototype.set = function(timeStamp) { + this.relativeTimeStart_ = timeStamp +}; +goog.debug.RelativeTimeProvider.prototype.reset = function() { + this.set(goog.now()) +}; +goog.debug.RelativeTimeProvider.prototype.get = function() { + return this.relativeTimeStart_ +}; +goog.debug.RelativeTimeProvider.getDefaultInstance = function() { + return goog.debug.RelativeTimeProvider.defaultInstance_ +}; +goog.provide("goog.debug.Formatter"); +goog.provide("goog.debug.HtmlFormatter"); +goog.provide("goog.debug.TextFormatter"); +goog.require("goog.debug.RelativeTimeProvider"); +goog.require("goog.string"); +goog.debug.Formatter = function(opt_prefix) { + this.prefix_ = opt_prefix || ""; + this.startTimeProvider_ = goog.debug.RelativeTimeProvider.getDefaultInstance() +}; +goog.debug.Formatter.prototype.showAbsoluteTime = true; +goog.debug.Formatter.prototype.showRelativeTime = true; +goog.debug.Formatter.prototype.showLoggerName = true; +goog.debug.Formatter.prototype.showExceptionText = false; +goog.debug.Formatter.prototype.showSeverityLevel = false; +goog.debug.Formatter.prototype.formatRecord = goog.abstractMethod; +goog.debug.Formatter.prototype.setStartTimeProvider = function(provider) { + this.startTimeProvider_ = provider +}; +goog.debug.Formatter.prototype.getStartTimeProvider = function() { + return this.startTimeProvider_ +}; +goog.debug.Formatter.prototype.resetRelativeTimeStart = function() { + this.startTimeProvider_.reset() +}; +goog.debug.Formatter.getDateTimeStamp_ = function(logRecord) { + var time = new Date(logRecord.getMillis()); + return goog.debug.Formatter.getTwoDigitString_(time.getFullYear() - 2E3) + goog.debug.Formatter.getTwoDigitString_(time.getMonth() + 1) + goog.debug.Formatter.getTwoDigitString_(time.getDate()) + " " + goog.debug.Formatter.getTwoDigitString_(time.getHours()) + ":" + goog.debug.Formatter.getTwoDigitString_(time.getMinutes()) + ":" + goog.debug.Formatter.getTwoDigitString_(time.getSeconds()) + "." + goog.debug.Formatter.getTwoDigitString_(Math.floor(time.getMilliseconds() / 10)) +}; +goog.debug.Formatter.getTwoDigitString_ = function(n) { + if(n < 10) { + return"0" + n + } + return String(n) +}; +goog.debug.Formatter.getRelativeTime_ = function(logRecord, relativeTimeStart) { + var ms = logRecord.getMillis() - relativeTimeStart; + var sec = ms / 1E3; + var str = sec.toFixed(3); + var spacesToPrepend = 0; + if(sec < 1) { + spacesToPrepend = 2 + }else { + while(sec < 100) { + spacesToPrepend++; + sec *= 10 + } + } + while(spacesToPrepend-- > 0) { + str = " " + str + } + return str +}; +goog.debug.HtmlFormatter = function(opt_prefix) { + goog.debug.Formatter.call(this, opt_prefix) +}; +goog.inherits(goog.debug.HtmlFormatter, goog.debug.Formatter); +goog.debug.HtmlFormatter.prototype.showExceptionText = true; +goog.debug.HtmlFormatter.prototype.formatRecord = function(logRecord) { + var className; + switch(logRecord.getLevel().value) { + case goog.debug.Logger.Level.SHOUT.value: + className = "dbg-sh"; + break; + case goog.debug.Logger.Level.SEVERE.value: + className = "dbg-sev"; + break; + case goog.debug.Logger.Level.WARNING.value: + className = "dbg-w"; + break; + case goog.debug.Logger.Level.INFO.value: + className = "dbg-i"; + break; + case goog.debug.Logger.Level.FINE.value: + ; + default: + className = "dbg-f"; + break + } + var sb = []; + sb.push(this.prefix_, " "); + if(this.showAbsoluteTime) { + sb.push("[", goog.debug.Formatter.getDateTimeStamp_(logRecord), "] ") + } + if(this.showRelativeTime) { + sb.push("[", goog.string.whitespaceEscape(goog.debug.Formatter.getRelativeTime_(logRecord, this.startTimeProvider_.get())), "s] ") + } + if(this.showLoggerName) { + sb.push("[", goog.string.htmlEscape(logRecord.getLoggerName()), "] ") + } + if(this.showSeverityLevel) { + sb.push("[", goog.string.htmlEscape(logRecord.getLevel().name), "] ") + } + sb.push('\x3cspan class\x3d"', className, '"\x3e', goog.string.newLineToBr(goog.string.whitespaceEscape(goog.string.htmlEscape(logRecord.getMessage())))); + if(this.showExceptionText && logRecord.getException()) { + sb.push("\x3cbr\x3e", goog.string.newLineToBr(goog.string.whitespaceEscape(logRecord.getExceptionText() || ""))) + } + sb.push("\x3c/span\x3e\x3cbr\x3e"); + return sb.join("") +}; +goog.debug.TextFormatter = function(opt_prefix) { + goog.debug.Formatter.call(this, opt_prefix) +}; +goog.inherits(goog.debug.TextFormatter, goog.debug.Formatter); +goog.debug.TextFormatter.prototype.formatRecord = function(logRecord) { + var sb = []; + sb.push(this.prefix_, " "); + if(this.showAbsoluteTime) { + sb.push("[", goog.debug.Formatter.getDateTimeStamp_(logRecord), "] ") + } + if(this.showRelativeTime) { + sb.push("[", goog.debug.Formatter.getRelativeTime_(logRecord, this.startTimeProvider_.get()), "s] ") + } + if(this.showLoggerName) { + sb.push("[", logRecord.getLoggerName(), "] ") + } + if(this.showSeverityLevel) { + sb.push("[", logRecord.getLevel().name, "] ") + } + sb.push(logRecord.getMessage(), "\n"); + if(this.showExceptionText && logRecord.getException()) { + sb.push(logRecord.getExceptionText(), "\n") + } + return sb.join("") +}; +goog.provide("goog.debug.Console"); +goog.require("goog.debug.LogManager"); +goog.require("goog.debug.Logger.Level"); +goog.require("goog.debug.TextFormatter"); +goog.debug.Console = function() { + this.publishHandler_ = goog.bind(this.addLogRecord, this); + this.formatter_ = new goog.debug.TextFormatter; + this.formatter_.showAbsoluteTime = false; + this.formatter_.showExceptionText = false; + this.isCapturing_ = false; + this.logBuffer_ = ""; + this.filteredLoggers_ = {} +}; +goog.debug.Console.prototype.getFormatter = function() { + return this.formatter_ +}; +goog.debug.Console.prototype.setCapturing = function(capturing) { + if(capturing == this.isCapturing_) { + return + } + var rootLogger = goog.debug.LogManager.getRoot(); + if(capturing) { + rootLogger.addHandler(this.publishHandler_) + }else { + rootLogger.removeHandler(this.publishHandler_); + this.logBuffer = "" + } + this.isCapturing_ = capturing +}; +goog.debug.Console.prototype.addLogRecord = function(logRecord) { + if(this.filteredLoggers_[logRecord.getLoggerName()]) { + return + } + var record = this.formatter_.formatRecord(logRecord); + var console = goog.debug.Console.console_; + if(console) { + switch(logRecord.getLevel()) { + case goog.debug.Logger.Level.SHOUT: + goog.debug.Console.logToConsole_(console, "info", record); + break; + case goog.debug.Logger.Level.SEVERE: + goog.debug.Console.logToConsole_(console, "error", record); + break; + case goog.debug.Logger.Level.WARNING: + goog.debug.Console.logToConsole_(console, "warn", record); + break; + default: + goog.debug.Console.logToConsole_(console, "debug", record); + break + } + }else { + if(window.opera) { + window.opera["postError"](record) + }else { + this.logBuffer_ += record + } + } +}; +goog.debug.Console.prototype.addFilter = function(loggerName) { + this.filteredLoggers_[loggerName] = true +}; +goog.debug.Console.prototype.removeFilter = function(loggerName) { + delete this.filteredLoggers_[loggerName] +}; +goog.debug.Console.instance = null; +goog.debug.Console.console_ = window.console; +goog.debug.Console.setConsole = function(console) { + goog.debug.Console.console_ = console +}; +goog.debug.Console.autoInstall = function() { + if(!goog.debug.Console.instance) { + goog.debug.Console.instance = new goog.debug.Console + } + if(window.location.href.indexOf("Debug\x3dtrue") != -1) { + goog.debug.Console.instance.setCapturing(true) + } +}; +goog.debug.Console.show = function() { + alert(goog.debug.Console.instance.logBuffer_) +}; +goog.debug.Console.logToConsole_ = function(console, fnName, record) { + if(console[fnName]) { + console[fnName](record) + }else { + console.log(record) + } +}; +goog.provide("goog.dom.ViewportSizeMonitor"); +goog.require("goog.dom"); +goog.require("goog.events"); +goog.require("goog.events.EventTarget"); +goog.require("goog.events.EventType"); +goog.require("goog.math.Size"); +goog.dom.ViewportSizeMonitor = function(opt_window) { + goog.events.EventTarget.call(this); + this.window_ = opt_window || window; + this.listenerKey_ = goog.events.listen(this.window_, goog.events.EventType.RESIZE, this.handleResize_, false, this); + this.size_ = goog.dom.getViewportSize(this.window_) +}; +goog.inherits(goog.dom.ViewportSizeMonitor, goog.events.EventTarget); +goog.dom.ViewportSizeMonitor.getInstanceForWindow = function(opt_window) { + var currentWindow = opt_window || window; + var uid = goog.getUid(currentWindow); + return goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid] = goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid] || new goog.dom.ViewportSizeMonitor(currentWindow) +}; +goog.dom.ViewportSizeMonitor.removeInstanceForWindow = function(opt_window) { + var uid = goog.getUid(opt_window || window); + goog.dispose(goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid]); + delete goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid] +}; +goog.dom.ViewportSizeMonitor.windowInstanceMap_ = {}; +goog.dom.ViewportSizeMonitor.prototype.listenerKey_ = null; +goog.dom.ViewportSizeMonitor.prototype.window_ = null; +goog.dom.ViewportSizeMonitor.prototype.size_ = null; +goog.dom.ViewportSizeMonitor.prototype.getSize = function() { + return this.size_ ? this.size_.clone() : null +}; +goog.dom.ViewportSizeMonitor.prototype.disposeInternal = function() { + goog.dom.ViewportSizeMonitor.superClass_.disposeInternal.call(this); + if(this.listenerKey_) { + goog.events.unlistenByKey(this.listenerKey_); + this.listenerKey_ = null + } + this.window_ = null; + this.size_ = null +}; +goog.dom.ViewportSizeMonitor.prototype.handleResize_ = function(event) { + var size = goog.dom.getViewportSize(this.window_); + if(!goog.math.Size.equals(size, this.size_)) { + this.size_ = size; + this.dispatchEvent(goog.events.EventType.RESIZE) + } +}; +goog.provide("goog.events.KeyCodes"); +goog.require("goog.userAgent"); +goog.events.KeyCodes = {WIN_KEY_FF_LINUX:0, MAC_ENTER:3, BACKSPACE:8, TAB:9, NUM_CENTER:12, ENTER:13, SHIFT:16, CTRL:17, ALT:18, PAUSE:19, CAPS_LOCK:20, ESC:27, SPACE:32, PAGE_UP:33, PAGE_DOWN:34, END:35, HOME:36, LEFT:37, UP:38, RIGHT:39, DOWN:40, PRINT_SCREEN:44, INSERT:45, DELETE:46, ZERO:48, ONE:49, TWO:50, THREE:51, FOUR:52, FIVE:53, SIX:54, SEVEN:55, EIGHT:56, NINE:57, FF_SEMICOLON:59, FF_EQUALS:61, QUESTION_MARK:63, A:65, B:66, C:67, D:68, E:69, F:70, G:71, H:72, I:73, J:74, K:75, L:76, M:77, +N:78, O:79, P:80, Q:81, R:82, S:83, T:84, U:85, V:86, W:87, X:88, Y:89, Z:90, META:91, WIN_KEY_RIGHT:92, CONTEXT_MENU:93, NUM_ZERO:96, NUM_ONE:97, NUM_TWO:98, NUM_THREE:99, NUM_FOUR:100, NUM_FIVE:101, NUM_SIX:102, NUM_SEVEN:103, NUM_EIGHT:104, NUM_NINE:105, NUM_MULTIPLY:106, NUM_PLUS:107, NUM_MINUS:109, NUM_PERIOD:110, NUM_DIVISION:111, F1:112, F2:113, F3:114, F4:115, F5:116, F6:117, F7:118, F8:119, F9:120, F10:121, F11:122, F12:123, NUMLOCK:144, SCROLL_LOCK:145, FIRST_MEDIA_KEY:166, LAST_MEDIA_KEY:183, +SEMICOLON:186, DASH:189, EQUALS:187, COMMA:188, PERIOD:190, SLASH:191, APOSTROPHE:192, TILDE:192, SINGLE_QUOTE:222, OPEN_SQUARE_BRACKET:219, BACKSLASH:220, CLOSE_SQUARE_BRACKET:221, WIN_KEY:224, MAC_FF_META:224, WIN_IME:229, PHANTOM:255}; +goog.events.KeyCodes.isTextModifyingKeyEvent = function(e) { + if(e.altKey && !e.ctrlKey || e.metaKey || e.keyCode >= goog.events.KeyCodes.F1 && e.keyCode <= goog.events.KeyCodes.F12) { + return false + } + switch(e.keyCode) { + case goog.events.KeyCodes.ALT: + ; + case goog.events.KeyCodes.CAPS_LOCK: + ; + case goog.events.KeyCodes.CONTEXT_MENU: + ; + case goog.events.KeyCodes.CTRL: + ; + case goog.events.KeyCodes.DOWN: + ; + case goog.events.KeyCodes.END: + ; + case goog.events.KeyCodes.ESC: + ; + case goog.events.KeyCodes.HOME: + ; + case goog.events.KeyCodes.INSERT: + ; + case goog.events.KeyCodes.LEFT: + ; + case goog.events.KeyCodes.MAC_FF_META: + ; + case goog.events.KeyCodes.META: + ; + case goog.events.KeyCodes.NUMLOCK: + ; + case goog.events.KeyCodes.NUM_CENTER: + ; + case goog.events.KeyCodes.PAGE_DOWN: + ; + case goog.events.KeyCodes.PAGE_UP: + ; + case goog.events.KeyCodes.PAUSE: + ; + case goog.events.KeyCodes.PHANTOM: + ; + case goog.events.KeyCodes.PRINT_SCREEN: + ; + case goog.events.KeyCodes.RIGHT: + ; + case goog.events.KeyCodes.SCROLL_LOCK: + ; + case goog.events.KeyCodes.SHIFT: + ; + case goog.events.KeyCodes.UP: + ; + case goog.events.KeyCodes.WIN_KEY: + ; + case goog.events.KeyCodes.WIN_KEY_RIGHT: + return false; + case goog.events.KeyCodes.WIN_KEY_FF_LINUX: + return!goog.userAgent.GECKO; + default: + return e.keyCode < goog.events.KeyCodes.FIRST_MEDIA_KEY || e.keyCode > goog.events.KeyCodes.LAST_MEDIA_KEY + } +}; +goog.events.KeyCodes.firesKeyPressEvent = function(keyCode, opt_heldKeyCode, opt_shiftKey, opt_ctrlKey, opt_altKey) { + if(!goog.userAgent.IE && !(goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher("525"))) { + return true + } + if(goog.userAgent.MAC && opt_altKey) { + return goog.events.KeyCodes.isCharacterKey(keyCode) + } + if(opt_altKey && !opt_ctrlKey) { + return false + } + if(!opt_shiftKey && (opt_heldKeyCode == goog.events.KeyCodes.CTRL || opt_heldKeyCode == goog.events.KeyCodes.ALT || goog.userAgent.MAC && opt_heldKeyCode == goog.events.KeyCodes.META)) { + return false + } + if(goog.userAgent.WEBKIT && opt_ctrlKey && opt_shiftKey) { + switch(keyCode) { + case goog.events.KeyCodes.BACKSLASH: + ; + case goog.events.KeyCodes.OPEN_SQUARE_BRACKET: + ; + case goog.events.KeyCodes.CLOSE_SQUARE_BRACKET: + ; + case goog.events.KeyCodes.TILDE: + ; + case goog.events.KeyCodes.SEMICOLON: + ; + case goog.events.KeyCodes.DASH: + ; + case goog.events.KeyCodes.EQUALS: + ; + case goog.events.KeyCodes.COMMA: + ; + case goog.events.KeyCodes.PERIOD: + ; + case goog.events.KeyCodes.SLASH: + ; + case goog.events.KeyCodes.APOSTROPHE: + ; + case goog.events.KeyCodes.SINGLE_QUOTE: + return false + } + } + if(goog.userAgent.IE && opt_ctrlKey && opt_heldKeyCode == keyCode) { + return false + } + switch(keyCode) { + case goog.events.KeyCodes.ENTER: + return!(goog.userAgent.IE && goog.userAgent.isDocumentModeOrHigher(9)); + case goog.events.KeyCodes.ESC: + return!goog.userAgent.WEBKIT + } + return goog.events.KeyCodes.isCharacterKey(keyCode) +}; +goog.events.KeyCodes.isCharacterKey = function(keyCode) { + if(keyCode >= goog.events.KeyCodes.ZERO && keyCode <= goog.events.KeyCodes.NINE) { + return true + } + if(keyCode >= goog.events.KeyCodes.NUM_ZERO && keyCode <= goog.events.KeyCodes.NUM_MULTIPLY) { + return true + } + if(keyCode >= goog.events.KeyCodes.A && keyCode <= goog.events.KeyCodes.Z) { + return true + } + if(goog.userAgent.WEBKIT && keyCode == 0) { + return true + } + switch(keyCode) { + case goog.events.KeyCodes.SPACE: + ; + case goog.events.KeyCodes.QUESTION_MARK: + ; + case goog.events.KeyCodes.NUM_PLUS: + ; + case goog.events.KeyCodes.NUM_MINUS: + ; + case goog.events.KeyCodes.NUM_PERIOD: + ; + case goog.events.KeyCodes.NUM_DIVISION: + ; + case goog.events.KeyCodes.SEMICOLON: + ; + case goog.events.KeyCodes.FF_SEMICOLON: + ; + case goog.events.KeyCodes.DASH: + ; + case goog.events.KeyCodes.EQUALS: + ; + case goog.events.KeyCodes.FF_EQUALS: + ; + case goog.events.KeyCodes.COMMA: + ; + case goog.events.KeyCodes.PERIOD: + ; + case goog.events.KeyCodes.SLASH: + ; + case goog.events.KeyCodes.APOSTROPHE: + ; + case goog.events.KeyCodes.SINGLE_QUOTE: + ; + case goog.events.KeyCodes.OPEN_SQUARE_BRACKET: + ; + case goog.events.KeyCodes.BACKSLASH: + ; + case goog.events.KeyCodes.CLOSE_SQUARE_BRACKET: + return true; + default: + return false + } +}; +goog.events.KeyCodes.normalizeGeckoKeyCode = function(keyCode) { + switch(keyCode) { + case goog.events.KeyCodes.FF_EQUALS: + return goog.events.KeyCodes.EQUALS; + case goog.events.KeyCodes.FF_SEMICOLON: + return goog.events.KeyCodes.SEMICOLON; + case goog.events.KeyCodes.MAC_FF_META: + return goog.events.KeyCodes.META; + case goog.events.KeyCodes.WIN_KEY_FF_LINUX: + return goog.events.KeyCodes.WIN_KEY; + default: + return keyCode + } +}; +goog.provide("goog.events.KeyEvent"); +goog.provide("goog.events.KeyHandler"); +goog.provide("goog.events.KeyHandler.EventType"); +goog.require("goog.events"); +goog.require("goog.events.BrowserEvent"); +goog.require("goog.events.EventTarget"); +goog.require("goog.events.EventType"); +goog.require("goog.events.KeyCodes"); +goog.require("goog.userAgent"); +goog.events.KeyHandler = function(opt_element, opt_capture) { + goog.events.EventTarget.call(this); + if(opt_element) { + this.attach(opt_element, opt_capture) + } +}; +goog.inherits(goog.events.KeyHandler, goog.events.EventTarget); +goog.events.KeyHandler.prototype.element_ = null; +goog.events.KeyHandler.prototype.keyPressKey_ = null; +goog.events.KeyHandler.prototype.keyDownKey_ = null; +goog.events.KeyHandler.prototype.keyUpKey_ = null; +goog.events.KeyHandler.prototype.lastKey_ = -1; +goog.events.KeyHandler.prototype.keyCode_ = -1; +goog.events.KeyHandler.prototype.altKey_ = false; +goog.events.KeyHandler.EventType = {KEY:"key"}; +goog.events.KeyHandler.safariKey_ = {3:goog.events.KeyCodes.ENTER, 12:goog.events.KeyCodes.NUMLOCK, 63232:goog.events.KeyCodes.UP, 63233:goog.events.KeyCodes.DOWN, 63234:goog.events.KeyCodes.LEFT, 63235:goog.events.KeyCodes.RIGHT, 63236:goog.events.KeyCodes.F1, 63237:goog.events.KeyCodes.F2, 63238:goog.events.KeyCodes.F3, 63239:goog.events.KeyCodes.F4, 63240:goog.events.KeyCodes.F5, 63241:goog.events.KeyCodes.F6, 63242:goog.events.KeyCodes.F7, 63243:goog.events.KeyCodes.F8, 63244:goog.events.KeyCodes.F9, +63245:goog.events.KeyCodes.F10, 63246:goog.events.KeyCodes.F11, 63247:goog.events.KeyCodes.F12, 63248:goog.events.KeyCodes.PRINT_SCREEN, 63272:goog.events.KeyCodes.DELETE, 63273:goog.events.KeyCodes.HOME, 63275:goog.events.KeyCodes.END, 63276:goog.events.KeyCodes.PAGE_UP, 63277:goog.events.KeyCodes.PAGE_DOWN, 63289:goog.events.KeyCodes.NUMLOCK, 63302:goog.events.KeyCodes.INSERT}; +goog.events.KeyHandler.keyIdentifier_ = {"Up":goog.events.KeyCodes.UP, "Down":goog.events.KeyCodes.DOWN, "Left":goog.events.KeyCodes.LEFT, "Right":goog.events.KeyCodes.RIGHT, "Enter":goog.events.KeyCodes.ENTER, "F1":goog.events.KeyCodes.F1, "F2":goog.events.KeyCodes.F2, "F3":goog.events.KeyCodes.F3, "F4":goog.events.KeyCodes.F4, "F5":goog.events.KeyCodes.F5, "F6":goog.events.KeyCodes.F6, "F7":goog.events.KeyCodes.F7, "F8":goog.events.KeyCodes.F8, "F9":goog.events.KeyCodes.F9, "F10":goog.events.KeyCodes.F10, +"F11":goog.events.KeyCodes.F11, "F12":goog.events.KeyCodes.F12, "U+007F":goog.events.KeyCodes.DELETE, "Home":goog.events.KeyCodes.HOME, "End":goog.events.KeyCodes.END, "PageUp":goog.events.KeyCodes.PAGE_UP, "PageDown":goog.events.KeyCodes.PAGE_DOWN, "Insert":goog.events.KeyCodes.INSERT}; +goog.events.KeyHandler.USES_KEYDOWN_ = goog.userAgent.IE || goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher("525"); +goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_ = goog.userAgent.MAC && goog.userAgent.GECKO; +goog.events.KeyHandler.prototype.handleKeyDown_ = function(e) { + if(goog.userAgent.WEBKIT) { + if(this.lastKey_ == goog.events.KeyCodes.CTRL && !e.ctrlKey || this.lastKey_ == goog.events.KeyCodes.ALT && !e.altKey || goog.userAgent.MAC && this.lastKey_ == goog.events.KeyCodes.META && !e.metaKey) { + this.lastKey_ = -1; + this.keyCode_ = -1 + } + } + if(this.lastKey_ == -1) { + if(e.ctrlKey && e.keyCode != goog.events.KeyCodes.CTRL) { + this.lastKey_ = goog.events.KeyCodes.CTRL + }else { + if(e.altKey && e.keyCode != goog.events.KeyCodes.ALT) { + this.lastKey_ = goog.events.KeyCodes.ALT + }else { + if(e.metaKey && e.keyCode != goog.events.KeyCodes.META) { + this.lastKey_ = goog.events.KeyCodes.META + } + } + } + } + if(goog.events.KeyHandler.USES_KEYDOWN_ && !goog.events.KeyCodes.firesKeyPressEvent(e.keyCode, this.lastKey_, e.shiftKey, e.ctrlKey, e.altKey)) { + this.handleEvent(e) + }else { + this.keyCode_ = goog.userAgent.GECKO ? goog.events.KeyCodes.normalizeGeckoKeyCode(e.keyCode) : e.keyCode; + if(goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_) { + this.altKey_ = e.altKey + } + } +}; +goog.events.KeyHandler.prototype.resetState = function() { + this.lastKey_ = -1; + this.keyCode_ = -1 +}; +goog.events.KeyHandler.prototype.handleKeyup_ = function(e) { + this.resetState(); + this.altKey_ = e.altKey +}; +goog.events.KeyHandler.prototype.handleEvent = function(e) { + var be = e.getBrowserEvent(); + var keyCode, charCode; + var altKey = be.altKey; + if(goog.userAgent.IE && e.type == goog.events.EventType.KEYPRESS) { + keyCode = this.keyCode_; + charCode = keyCode != goog.events.KeyCodes.ENTER && keyCode != goog.events.KeyCodes.ESC ? be.keyCode : 0 + }else { + if(goog.userAgent.WEBKIT && e.type == goog.events.EventType.KEYPRESS) { + keyCode = this.keyCode_; + charCode = be.charCode >= 0 && be.charCode < 63232 && goog.events.KeyCodes.isCharacterKey(keyCode) ? be.charCode : 0 + }else { + if(goog.userAgent.OPERA) { + keyCode = this.keyCode_; + charCode = goog.events.KeyCodes.isCharacterKey(keyCode) ? be.keyCode : 0 + }else { + keyCode = be.keyCode || this.keyCode_; + charCode = be.charCode || 0; + if(goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_) { + altKey = this.altKey_ + } + if(goog.userAgent.MAC && charCode == goog.events.KeyCodes.QUESTION_MARK && keyCode == goog.events.KeyCodes.WIN_KEY) { + keyCode = goog.events.KeyCodes.SLASH + } + } + } + } + var key = keyCode; + var keyIdentifier = be.keyIdentifier; + if(keyCode) { + if(keyCode >= 63232 && keyCode in goog.events.KeyHandler.safariKey_) { + key = goog.events.KeyHandler.safariKey_[keyCode] + }else { + if(keyCode == 25 && e.shiftKey) { + key = 9 + } + } + }else { + if(keyIdentifier && keyIdentifier in goog.events.KeyHandler.keyIdentifier_) { + key = goog.events.KeyHandler.keyIdentifier_[keyIdentifier] + } + } + var repeat = key == this.lastKey_; + this.lastKey_ = key; + var event = new goog.events.KeyEvent(key, charCode, repeat, be); + event.altKey = altKey; + this.dispatchEvent(event) +}; +goog.events.KeyHandler.prototype.getElement = function() { + return this.element_ +}; +goog.events.KeyHandler.prototype.attach = function(element, opt_capture) { + if(this.keyUpKey_) { + this.detach() + } + this.element_ = element; + this.keyPressKey_ = goog.events.listen(this.element_, goog.events.EventType.KEYPRESS, this, opt_capture); + this.keyDownKey_ = goog.events.listen(this.element_, goog.events.EventType.KEYDOWN, this.handleKeyDown_, opt_capture, this); + this.keyUpKey_ = goog.events.listen(this.element_, goog.events.EventType.KEYUP, this.handleKeyup_, opt_capture, this) +}; +goog.events.KeyHandler.prototype.detach = function() { + if(this.keyPressKey_) { + goog.events.unlistenByKey(this.keyPressKey_); + goog.events.unlistenByKey(this.keyDownKey_); + goog.events.unlistenByKey(this.keyUpKey_); + this.keyPressKey_ = null; + this.keyDownKey_ = null; + this.keyUpKey_ = null + } + this.element_ = null; + this.lastKey_ = -1; + this.keyCode_ = -1 +}; +goog.events.KeyHandler.prototype.disposeInternal = function() { + goog.events.KeyHandler.superClass_.disposeInternal.call(this); + this.detach() +}; +goog.events.KeyEvent = function(keyCode, charCode, repeat, browserEvent) { + goog.events.BrowserEvent.call(this, browserEvent); + this.type = goog.events.KeyHandler.EventType.KEY; + this.keyCode = keyCode; + this.charCode = charCode; + this.repeat = repeat +}; +goog.inherits(goog.events.KeyEvent, goog.events.BrowserEvent); +goog.provide("goog.dom.vendor"); +goog.require("goog.userAgent"); +goog.dom.vendor.getVendorJsPrefix = function() { + if(goog.userAgent.WEBKIT) { + return"Webkit" + }else { + if(goog.userAgent.GECKO) { + return"Moz" + }else { + if(goog.userAgent.IE) { + return"ms" + }else { + if(goog.userAgent.OPERA) { + return"O" + } + } + } + } + return null +}; +goog.dom.vendor.getVendorPrefix = function() { + if(goog.userAgent.WEBKIT) { + return"-webkit" + }else { + if(goog.userAgent.GECKO) { + return"-moz" + }else { + if(goog.userAgent.IE) { + return"-ms" + }else { + if(goog.userAgent.OPERA) { + return"-o" + } + } + } + } + return null +}; +goog.provide("goog.math.Box"); +goog.require("goog.math.Coordinate"); +goog.math.Box = function(top, right, bottom, left) { + this.top = top; + this.right = right; + this.bottom = bottom; + this.left = left +}; +goog.math.Box.boundingBox = function(var_args) { + var box = new goog.math.Box(arguments[0].y, arguments[0].x, arguments[0].y, arguments[0].x); + for(var i = 1;i < arguments.length;i++) { + var coord = arguments[i]; + box.top = Math.min(box.top, coord.y); + box.right = Math.max(box.right, coord.x); + box.bottom = Math.max(box.bottom, coord.y); + box.left = Math.min(box.left, coord.x) + } + return box +}; +goog.math.Box.prototype.clone = function() { + return new goog.math.Box(this.top, this.right, this.bottom, this.left) +}; +if(goog.DEBUG) { + goog.math.Box.prototype.toString = function() { + return"(" + this.top + "t, " + this.right + "r, " + this.bottom + "b, " + this.left + "l)" + } +} +goog.math.Box.prototype.contains = function(other) { + return goog.math.Box.contains(this, other) +}; +goog.math.Box.prototype.expand = function(top, opt_right, opt_bottom, opt_left) { + if(goog.isObject(top)) { + this.top -= top.top; + this.right += top.right; + this.bottom += top.bottom; + this.left -= top.left + }else { + this.top -= top; + this.right += opt_right; + this.bottom += opt_bottom; + this.left -= opt_left + } + return this +}; +goog.math.Box.prototype.expandToInclude = function(box) { + this.left = Math.min(this.left, box.left); + this.top = Math.min(this.top, box.top); + this.right = Math.max(this.right, box.right); + this.bottom = Math.max(this.bottom, box.bottom) +}; +goog.math.Box.equals = function(a, b) { + if(a == b) { + return true + } + if(!a || !b) { + return false + } + return a.top == b.top && a.right == b.right && a.bottom == b.bottom && a.left == b.left +}; +goog.math.Box.contains = function(box, other) { + if(!box || !other) { + return false + } + if(other instanceof goog.math.Box) { + return other.left >= box.left && other.right <= box.right && other.top >= box.top && other.bottom <= box.bottom + } + return other.x >= box.left && other.x <= box.right && other.y >= box.top && other.y <= box.bottom +}; +goog.math.Box.relativePositionX = function(box, coord) { + if(coord.x < box.left) { + return coord.x - box.left + }else { + if(coord.x > box.right) { + return coord.x - box.right + } + } + return 0 +}; +goog.math.Box.relativePositionY = function(box, coord) { + if(coord.y < box.top) { + return coord.y - box.top + }else { + if(coord.y > box.bottom) { + return coord.y - box.bottom + } + } + return 0 +}; +goog.math.Box.distance = function(box, coord) { + var x = goog.math.Box.relativePositionX(box, coord); + var y = goog.math.Box.relativePositionY(box, coord); + return Math.sqrt(x * x + y * y) +}; +goog.math.Box.intersects = function(a, b) { + return a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom +}; +goog.math.Box.intersectsWithPadding = function(a, b, padding) { + return a.left <= b.right + padding && b.left <= a.right + padding && a.top <= b.bottom + padding && b.top <= a.bottom + padding +}; +goog.math.Box.prototype.ceil = function() { + this.top = Math.ceil(this.top); + this.right = Math.ceil(this.right); + this.bottom = Math.ceil(this.bottom); + this.left = Math.ceil(this.left); + return this +}; +goog.math.Box.prototype.floor = function() { + this.top = Math.floor(this.top); + this.right = Math.floor(this.right); + this.bottom = Math.floor(this.bottom); + this.left = Math.floor(this.left); + return this +}; +goog.math.Box.prototype.round = function() { + this.top = Math.round(this.top); + this.right = Math.round(this.right); + this.bottom = Math.round(this.bottom); + this.left = Math.round(this.left); + return this +}; +goog.math.Box.prototype.translate = function(tx, opt_ty) { + if(tx instanceof goog.math.Coordinate) { + this.left += tx.x; + this.right += tx.x; + this.top += tx.y; + this.bottom += tx.y + }else { + this.left += tx; + this.right += tx; + if(goog.isNumber(opt_ty)) { + this.top += opt_ty; + this.bottom += opt_ty + } + } + return this +}; +goog.math.Box.prototype.scale = function(sx, opt_sy) { + var sy = goog.isNumber(opt_sy) ? opt_sy : sx; + this.left *= sx; + this.right *= sx; + this.top *= sy; + this.bottom *= sy; + return this +}; +goog.provide("goog.math.Rect"); +goog.require("goog.math.Box"); +goog.require("goog.math.Coordinate"); +goog.require("goog.math.Size"); +goog.math.Rect = function(x, y, w, h) { + this.left = x; + this.top = y; + this.width = w; + this.height = h +}; +goog.math.Rect.prototype.clone = function() { + return new goog.math.Rect(this.left, this.top, this.width, this.height) +}; +goog.math.Rect.prototype.toBox = function() { + var right = this.left + this.width; + var bottom = this.top + this.height; + return new goog.math.Box(this.top, right, bottom, this.left) +}; +goog.math.Rect.createFromBox = function(box) { + return new goog.math.Rect(box.left, box.top, box.right - box.left, box.bottom - box.top) +}; +if(goog.DEBUG) { + goog.math.Rect.prototype.toString = function() { + return"(" + this.left + ", " + this.top + " - " + this.width + "w x " + this.height + "h)" + } +} +goog.math.Rect.equals = function(a, b) { + if(a == b) { + return true + } + if(!a || !b) { + return false + } + return a.left == b.left && a.width == b.width && a.top == b.top && a.height == b.height +}; +goog.math.Rect.prototype.intersection = function(rect) { + var x0 = Math.max(this.left, rect.left); + var x1 = Math.min(this.left + this.width, rect.left + rect.width); + if(x0 <= x1) { + var y0 = Math.max(this.top, rect.top); + var y1 = Math.min(this.top + this.height, rect.top + rect.height); + if(y0 <= y1) { + this.left = x0; + this.top = y0; + this.width = x1 - x0; + this.height = y1 - y0; + return true + } + } + return false +}; +goog.math.Rect.intersection = function(a, b) { + var x0 = Math.max(a.left, b.left); + var x1 = Math.min(a.left + a.width, b.left + b.width); + if(x0 <= x1) { + var y0 = Math.max(a.top, b.top); + var y1 = Math.min(a.top + a.height, b.top + b.height); + if(y0 <= y1) { + return new goog.math.Rect(x0, y0, x1 - x0, y1 - y0) + } + } + return null +}; +goog.math.Rect.intersects = function(a, b) { + return a.left <= b.left + b.width && b.left <= a.left + a.width && a.top <= b.top + b.height && b.top <= a.top + a.height +}; +goog.math.Rect.prototype.intersects = function(rect) { + return goog.math.Rect.intersects(this, rect) +}; +goog.math.Rect.difference = function(a, b) { + var intersection = goog.math.Rect.intersection(a, b); + if(!intersection || !intersection.height || !intersection.width) { + return[a.clone()] + } + var result = []; + var top = a.top; + var height = a.height; + var ar = a.left + a.width; + var ab = a.top + a.height; + var br = b.left + b.width; + var bb = b.top + b.height; + if(b.top > a.top) { + result.push(new goog.math.Rect(a.left, a.top, a.width, b.top - a.top)); + top = b.top; + height -= b.top - a.top + } + if(bb < ab) { + result.push(new goog.math.Rect(a.left, bb, a.width, ab - bb)); + height = bb - top + } + if(b.left > a.left) { + result.push(new goog.math.Rect(a.left, top, b.left - a.left, height)) + } + if(br < ar) { + result.push(new goog.math.Rect(br, top, ar - br, height)) + } + return result +}; +goog.math.Rect.prototype.difference = function(rect) { + return goog.math.Rect.difference(this, rect) +}; +goog.math.Rect.prototype.boundingRect = function(rect) { + var right = Math.max(this.left + this.width, rect.left + rect.width); + var bottom = Math.max(this.top + this.height, rect.top + rect.height); + this.left = Math.min(this.left, rect.left); + this.top = Math.min(this.top, rect.top); + this.width = right - this.left; + this.height = bottom - this.top +}; +goog.math.Rect.boundingRect = function(a, b) { + if(!a || !b) { + return null + } + var clone = a.clone(); + clone.boundingRect(b); + return clone +}; +goog.math.Rect.prototype.contains = function(another) { + if(another instanceof goog.math.Rect) { + return this.left <= another.left && this.left + this.width >= another.left + another.width && this.top <= another.top && this.top + this.height >= another.top + another.height + }else { + return another.x >= this.left && another.x <= this.left + this.width && another.y >= this.top && another.y <= this.top + this.height + } +}; +goog.math.Rect.prototype.squaredDistance = function(point) { + var dx = point.x < this.left ? this.left - point.x : Math.max(point.x - (this.left + this.width), 0); + var dy = point.y < this.top ? this.top - point.y : Math.max(point.y - (this.top + this.height), 0); + return dx * dx + dy * dy +}; +goog.math.Rect.prototype.distance = function(point) { + return Math.sqrt(this.squaredDistance(point)) +}; +goog.math.Rect.prototype.getSize = function() { + return new goog.math.Size(this.width, this.height) +}; +goog.math.Rect.prototype.getTopLeft = function() { + return new goog.math.Coordinate(this.left, this.top) +}; +goog.math.Rect.prototype.getCenter = function() { + return new goog.math.Coordinate(this.left + this.width / 2, this.top + this.height / 2) +}; +goog.math.Rect.prototype.getBottomRight = function() { + return new goog.math.Coordinate(this.left + this.width, this.top + this.height) +}; +goog.math.Rect.prototype.ceil = function() { + this.left = Math.ceil(this.left); + this.top = Math.ceil(this.top); + this.width = Math.ceil(this.width); + this.height = Math.ceil(this.height); + return this +}; +goog.math.Rect.prototype.floor = function() { + this.left = Math.floor(this.left); + this.top = Math.floor(this.top); + this.width = Math.floor(this.width); + this.height = Math.floor(this.height); + return this +}; +goog.math.Rect.prototype.round = function() { + this.left = Math.round(this.left); + this.top = Math.round(this.top); + this.width = Math.round(this.width); + this.height = Math.round(this.height); + return this +}; +goog.math.Rect.prototype.translate = function(tx, opt_ty) { + if(tx instanceof goog.math.Coordinate) { + this.left += tx.x; + this.top += tx.y + }else { + this.left += tx; + if(goog.isNumber(opt_ty)) { + this.top += opt_ty + } + } + return this +}; +goog.math.Rect.prototype.scale = function(sx, opt_sy) { + var sy = goog.isNumber(opt_sy) ? opt_sy : sx; + this.left *= sx; + this.width *= sx; + this.top *= sy; + this.height *= sy; + return this +}; +goog.provide("goog.style"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.NodeType"); +goog.require("goog.dom.vendor"); +goog.require("goog.math.Box"); +goog.require("goog.math.Coordinate"); +goog.require("goog.math.Rect"); +goog.require("goog.math.Size"); +goog.require("goog.object"); +goog.require("goog.string"); +goog.require("goog.userAgent"); +goog.define("goog.style.GET_BOUNDING_CLIENT_RECT_ALWAYS_EXISTS", false); +goog.style.setStyle = function(element, style, opt_value) { + if(goog.isString(style)) { + goog.style.setStyle_(element, opt_value, style) + }else { + goog.object.forEach(style, goog.partial(goog.style.setStyle_, element)) + } +}; +goog.style.setStyle_ = function(element, value, style) { + var propertyName = goog.style.getVendorJsStyleName_(element, style); + if(propertyName) { + element.style[propertyName] = value + } +}; +goog.style.getVendorJsStyleName_ = function(element, style) { + var camelStyle = goog.string.toCamelCase(style); + if(element.style[camelStyle] === undefined) { + var prefixedStyle = goog.dom.vendor.getVendorJsPrefix() + goog.string.toTitleCase(style); + if(element.style[prefixedStyle] !== undefined) { + return prefixedStyle + } + } + return camelStyle +}; +goog.style.getVendorStyleName_ = function(element, style) { + var camelStyle = goog.string.toCamelCase(style); + if(element.style[camelStyle] === undefined) { + var prefixedStyle = goog.dom.vendor.getVendorJsPrefix() + goog.string.toTitleCase(style); + if(element.style[prefixedStyle] !== undefined) { + return goog.dom.vendor.getVendorPrefix() + "-" + style + } + } + return style +}; +goog.style.getStyle = function(element, property) { + var styleValue = element.style[goog.string.toCamelCase(property)]; + if(typeof styleValue !== "undefined") { + return styleValue + } + return element.style[goog.style.getVendorJsStyleName_(element, property)] || "" +}; +goog.style.getComputedStyle = function(element, property) { + var doc = goog.dom.getOwnerDocument(element); + if(doc.defaultView && doc.defaultView.getComputedStyle) { + var styles = doc.defaultView.getComputedStyle(element, null); + if(styles) { + return styles[property] || styles.getPropertyValue(property) || "" + } + } + return"" +}; +goog.style.getCascadedStyle = function(element, style) { + return element.currentStyle ? element.currentStyle[style] : null +}; +goog.style.getStyle_ = function(element, style) { + return goog.style.getComputedStyle(element, style) || goog.style.getCascadedStyle(element, style) || element.style && element.style[style] +}; +goog.style.getComputedPosition = function(element) { + return goog.style.getStyle_(element, "position") +}; +goog.style.getBackgroundColor = function(element) { + return goog.style.getStyle_(element, "backgroundColor") +}; +goog.style.getComputedOverflowX = function(element) { + return goog.style.getStyle_(element, "overflowX") +}; +goog.style.getComputedOverflowY = function(element) { + return goog.style.getStyle_(element, "overflowY") +}; +goog.style.getComputedZIndex = function(element) { + return goog.style.getStyle_(element, "zIndex") +}; +goog.style.getComputedTextAlign = function(element) { + return goog.style.getStyle_(element, "textAlign") +}; +goog.style.getComputedCursor = function(element) { + return goog.style.getStyle_(element, "cursor") +}; +goog.style.setPosition = function(el, arg1, opt_arg2) { + var x, y; + var buggyGeckoSubPixelPos = goog.userAgent.GECKO && (goog.userAgent.MAC || goog.userAgent.X11) && goog.userAgent.isVersionOrHigher("1.9"); + if(arg1 instanceof goog.math.Coordinate) { + x = arg1.x; + y = arg1.y + }else { + x = arg1; + y = opt_arg2 + } + el.style.left = goog.style.getPixelStyleValue_((x), buggyGeckoSubPixelPos); + el.style.top = goog.style.getPixelStyleValue_((y), buggyGeckoSubPixelPos) +}; +goog.style.getPosition = function(element) { + return new goog.math.Coordinate(element.offsetLeft, element.offsetTop) +}; +goog.style.getClientViewportElement = function(opt_node) { + var doc; + if(opt_node) { + doc = goog.dom.getOwnerDocument(opt_node) + }else { + doc = goog.dom.getDocument() + } + if(goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9) && !goog.dom.getDomHelper(doc).isCss1CompatMode()) { + return doc.body + } + return doc.documentElement +}; +goog.style.getViewportPageOffset = function(doc) { + var body = doc.body; + var documentElement = doc.documentElement; + var scrollLeft = body.scrollLeft || documentElement.scrollLeft; + var scrollTop = body.scrollTop || documentElement.scrollTop; + return new goog.math.Coordinate(scrollLeft, scrollTop) +}; +goog.style.getBoundingClientRect_ = function(el) { + var rect; + try { + rect = el.getBoundingClientRect() + }catch(e) { + return{"left":0, "top":0, "right":0, "bottom":0} + } + if(goog.userAgent.IE) { + var doc = el.ownerDocument; + rect.left -= doc.documentElement.clientLeft + doc.body.clientLeft; + rect.top -= doc.documentElement.clientTop + doc.body.clientTop + } + return(rect) +}; +goog.style.getOffsetParent = function(element) { + if(goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(8)) { + return element.offsetParent + } + var doc = goog.dom.getOwnerDocument(element); + var positionStyle = goog.style.getStyle_(element, "position"); + var skipStatic = positionStyle == "fixed" || positionStyle == "absolute"; + for(var parent = element.parentNode;parent && parent != doc;parent = parent.parentNode) { + positionStyle = goog.style.getStyle_((parent), "position"); + skipStatic = skipStatic && positionStyle == "static" && parent != doc.documentElement && parent != doc.body; + if(!skipStatic && (parent.scrollWidth > parent.clientWidth || parent.scrollHeight > parent.clientHeight || positionStyle == "fixed" || positionStyle == "absolute" || positionStyle == "relative")) { + return(parent) + } + } + return null +}; +goog.style.getVisibleRectForElement = function(element) { + var visibleRect = new goog.math.Box(0, Infinity, Infinity, 0); + var dom = goog.dom.getDomHelper(element); + var body = dom.getDocument().body; + var documentElement = dom.getDocument().documentElement; + var scrollEl = dom.getDocumentScrollElement(); + for(var el = element;el = goog.style.getOffsetParent(el);) { + if((!goog.userAgent.IE || el.clientWidth != 0) && (!goog.userAgent.WEBKIT || el.clientHeight != 0 || el != body) && el != body && el != documentElement && goog.style.getStyle_(el, "overflow") != "visible") { + var pos = goog.style.getPageOffset(el); + var client = goog.style.getClientLeftTop(el); + pos.x += client.x; + pos.y += client.y; + visibleRect.top = Math.max(visibleRect.top, pos.y); + visibleRect.right = Math.min(visibleRect.right, pos.x + el.clientWidth); + visibleRect.bottom = Math.min(visibleRect.bottom, pos.y + el.clientHeight); + visibleRect.left = Math.max(visibleRect.left, pos.x) + } + } + var scrollX = scrollEl.scrollLeft, scrollY = scrollEl.scrollTop; + visibleRect.left = Math.max(visibleRect.left, scrollX); + visibleRect.top = Math.max(visibleRect.top, scrollY); + var winSize = dom.getViewportSize(); + visibleRect.right = Math.min(visibleRect.right, scrollX + winSize.width); + visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + winSize.height); + return visibleRect.top >= 0 && visibleRect.left >= 0 && visibleRect.bottom > visibleRect.top && visibleRect.right > visibleRect.left ? visibleRect : null +}; +goog.style.getContainerOffsetToScrollInto = function(element, container, opt_center) { + var elementPos = goog.style.getPageOffset(element); + var containerPos = goog.style.getPageOffset(container); + var containerBorder = goog.style.getBorderBox(container); + var relX = elementPos.x - containerPos.x - containerBorder.left; + var relY = elementPos.y - containerPos.y - containerBorder.top; + var spaceX = container.clientWidth - element.offsetWidth; + var spaceY = container.clientHeight - element.offsetHeight; + var scrollLeft = container.scrollLeft; + var scrollTop = container.scrollTop; + if(opt_center) { + scrollLeft += relX - spaceX / 2; + scrollTop += relY - spaceY / 2 + }else { + scrollLeft += Math.min(relX, Math.max(relX - spaceX, 0)); + scrollTop += Math.min(relY, Math.max(relY - spaceY, 0)) + } + return new goog.math.Coordinate(scrollLeft, scrollTop) +}; +goog.style.scrollIntoContainerView = function(element, container, opt_center) { + var offset = goog.style.getContainerOffsetToScrollInto(element, container, opt_center); + container.scrollLeft = offset.x; + container.scrollTop = offset.y +}; +goog.style.getClientLeftTop = function(el) { + if(goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher("1.9")) { + var left = parseFloat(goog.style.getComputedStyle(el, "borderLeftWidth")); + if(goog.style.isRightToLeft(el)) { + var scrollbarWidth = el.offsetWidth - el.clientWidth - left - parseFloat(goog.style.getComputedStyle(el, "borderRightWidth")); + left += scrollbarWidth + } + return new goog.math.Coordinate(left, parseFloat(goog.style.getComputedStyle(el, "borderTopWidth"))) + } + return new goog.math.Coordinate(el.clientLeft, el.clientTop) +}; +goog.style.getPageOffset = function(el) { + var box, doc = goog.dom.getOwnerDocument(el); + var positionStyle = goog.style.getStyle_(el, "position"); + goog.asserts.assertObject(el, "Parameter is required"); + var BUGGY_GECKO_BOX_OBJECT = !goog.style.GET_BOUNDING_CLIENT_RECT_ALWAYS_EXISTS && goog.userAgent.GECKO && doc.getBoxObjectFor && !el.getBoundingClientRect && positionStyle == "absolute" && (box = doc.getBoxObjectFor(el)) && (box.screenX < 0 || box.screenY < 0); + var pos = new goog.math.Coordinate(0, 0); + var viewportElement = goog.style.getClientViewportElement(doc); + if(el == viewportElement) { + return pos + } + if(goog.style.GET_BOUNDING_CLIENT_RECT_ALWAYS_EXISTS || el.getBoundingClientRect) { + box = goog.style.getBoundingClientRect_(el); + var scrollCoord = goog.dom.getDomHelper(doc).getDocumentScroll(); + pos.x = box.left + scrollCoord.x; + pos.y = box.top + scrollCoord.y + }else { + if(doc.getBoxObjectFor && !BUGGY_GECKO_BOX_OBJECT) { + box = doc.getBoxObjectFor(el); + var vpBox = doc.getBoxObjectFor(viewportElement); + pos.x = box.screenX - vpBox.screenX; + pos.y = box.screenY - vpBox.screenY + }else { + var parent = el; + do { + pos.x += parent.offsetLeft; + pos.y += parent.offsetTop; + if(parent != el) { + pos.x += parent.clientLeft || 0; + pos.y += parent.clientTop || 0 + } + if(goog.userAgent.WEBKIT && goog.style.getComputedPosition(parent) == "fixed") { + pos.x += doc.body.scrollLeft; + pos.y += doc.body.scrollTop; + break + } + parent = parent.offsetParent + }while(parent && parent != el); + if(goog.userAgent.OPERA || goog.userAgent.WEBKIT && positionStyle == "absolute") { + pos.y -= doc.body.offsetTop + } + for(parent = el;(parent = goog.style.getOffsetParent(parent)) && parent != doc.body && parent != viewportElement;) { + pos.x -= parent.scrollLeft; + if(!goog.userAgent.OPERA || parent.tagName != "TR") { + pos.y -= parent.scrollTop + } + } + } + } + return pos +}; +goog.style.getPageOffsetLeft = function(el) { + return goog.style.getPageOffset(el).x +}; +goog.style.getPageOffsetTop = function(el) { + return goog.style.getPageOffset(el).y +}; +goog.style.getFramedPageOffset = function(el, relativeWin) { + var position = new goog.math.Coordinate(0, 0); + var currentWin = goog.dom.getWindow(goog.dom.getOwnerDocument(el)); + var currentEl = el; + do { + var offset = currentWin == relativeWin ? goog.style.getPageOffset(currentEl) : goog.style.getClientPositionForElement_(goog.asserts.assert(currentEl)); + position.x += offset.x; + position.y += offset.y + }while(currentWin && currentWin != relativeWin && (currentEl = currentWin.frameElement) && (currentWin = currentWin.parent)); + return position +}; +goog.style.translateRectForAnotherFrame = function(rect, origBase, newBase) { + if(origBase.getDocument() != newBase.getDocument()) { + var body = origBase.getDocument().body; + var pos = goog.style.getFramedPageOffset(body, newBase.getWindow()); + pos = goog.math.Coordinate.difference(pos, goog.style.getPageOffset(body)); + if(goog.userAgent.IE && !origBase.isCss1CompatMode()) { + pos = goog.math.Coordinate.difference(pos, origBase.getDocumentScroll()) + } + rect.left += pos.x; + rect.top += pos.y + } +}; +goog.style.getRelativePosition = function(a, b) { + var ap = goog.style.getClientPosition(a); + var bp = goog.style.getClientPosition(b); + return new goog.math.Coordinate(ap.x - bp.x, ap.y - bp.y) +}; +goog.style.getClientPositionForElement_ = function(el) { + var pos; + if(goog.style.GET_BOUNDING_CLIENT_RECT_ALWAYS_EXISTS || el.getBoundingClientRect) { + var box = goog.style.getBoundingClientRect_(el); + pos = new goog.math.Coordinate(box.left, box.top) + }else { + var scrollCoord = goog.dom.getDomHelper(el).getDocumentScroll(); + var pageCoord = goog.style.getPageOffset(el); + pos = new goog.math.Coordinate(pageCoord.x - scrollCoord.x, pageCoord.y - scrollCoord.y) + } + if(goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher(12)) { + return goog.math.Coordinate.sum(pos, goog.style.getCssTranslation(el)) + }else { + return pos + } +}; +goog.style.getClientPosition = function(el) { + goog.asserts.assert(el); + if(el.nodeType == goog.dom.NodeType.ELEMENT) { + return goog.style.getClientPositionForElement_((el)) + }else { + var isAbstractedEvent = goog.isFunction(el.getBrowserEvent); + var targetEvent = el; + if(el.targetTouches) { + targetEvent = el.targetTouches[0] + }else { + if(isAbstractedEvent && el.getBrowserEvent().targetTouches) { + targetEvent = el.getBrowserEvent().targetTouches[0] + } + } + return new goog.math.Coordinate(targetEvent.clientX, targetEvent.clientY) + } +}; +goog.style.setPageOffset = function(el, x, opt_y) { + var cur = goog.style.getPageOffset(el); + if(x instanceof goog.math.Coordinate) { + opt_y = x.y; + x = x.x + } + var dx = x - cur.x; + var dy = opt_y - cur.y; + goog.style.setPosition(el, el.offsetLeft + dx, el.offsetTop + dy) +}; +goog.style.setSize = function(element, w, opt_h) { + var h; + if(w instanceof goog.math.Size) { + h = w.height; + w = w.width + }else { + if(opt_h == undefined) { + throw Error("missing height argument"); + } + h = opt_h + } + goog.style.setWidth(element, (w)); + goog.style.setHeight(element, (h)) +}; +goog.style.getPixelStyleValue_ = function(value, round) { + if(typeof value == "number") { + value = (round ? Math.round(value) : value) + "px" + } + return value +}; +goog.style.setHeight = function(element, height) { + element.style.height = goog.style.getPixelStyleValue_(height, true) +}; +goog.style.setWidth = function(element, width) { + element.style.width = goog.style.getPixelStyleValue_(width, true) +}; +goog.style.getSize = function(element) { + return goog.style.evaluateWithTemporaryDisplay_(goog.style.getSizeWithDisplay_, (element)) +}; +goog.style.evaluateWithTemporaryDisplay_ = function(fn, element) { + if(goog.style.getStyle_(element, "display") != "none") { + return fn(element) + } + var style = element.style; + var originalDisplay = style.display; + var originalVisibility = style.visibility; + var originalPosition = style.position; + style.visibility = "hidden"; + style.position = "absolute"; + style.display = "inline"; + var retVal = fn(element); + style.display = originalDisplay; + style.position = originalPosition; + style.visibility = originalVisibility; + return retVal +}; +goog.style.getSizeWithDisplay_ = function(element) { + var offsetWidth = element.offsetWidth; + var offsetHeight = element.offsetHeight; + var webkitOffsetsZero = goog.userAgent.WEBKIT && !offsetWidth && !offsetHeight; + if((!goog.isDef(offsetWidth) || webkitOffsetsZero) && element.getBoundingClientRect) { + var clientRect = goog.style.getBoundingClientRect_(element); + return new goog.math.Size(clientRect.right - clientRect.left, clientRect.bottom - clientRect.top) + } + return new goog.math.Size(offsetWidth, offsetHeight) +}; +goog.style.getTransformedSize = function(element) { + if(!element.getBoundingClientRect) { + return null + } + var clientRect = goog.style.evaluateWithTemporaryDisplay_(goog.style.getBoundingClientRect_, element); + return new goog.math.Size(clientRect.right - clientRect.left, clientRect.bottom - clientRect.top) +}; +goog.style.getBounds = function(element) { + var o = goog.style.getPageOffset(element); + var s = goog.style.getSize(element); + return new goog.math.Rect(o.x, o.y, s.width, s.height) +}; +goog.style.toCamelCase = function(selector) { + return goog.string.toCamelCase(String(selector)) +}; +goog.style.toSelectorCase = function(selector) { + return goog.string.toSelectorCase(selector) +}; +goog.style.getOpacity = function(el) { + var style = el.style; + var result = ""; + if("opacity" in style) { + result = style.opacity + }else { + if("MozOpacity" in style) { + result = style.MozOpacity + }else { + if("filter" in style) { + var match = style.filter.match(/alpha\(opacity=([\d.]+)\)/); + if(match) { + result = String(match[1] / 100) + } + } + } + } + return result == "" ? result : Number(result) +}; +goog.style.setOpacity = function(el, alpha) { + var style = el.style; + if("opacity" in style) { + style.opacity = alpha + }else { + if("MozOpacity" in style) { + style.MozOpacity = alpha + }else { + if("filter" in style) { + if(alpha === "") { + style.filter = "" + }else { + style.filter = "alpha(opacity\x3d" + alpha * 100 + ")" + } + } + } + } +}; +goog.style.setTransparentBackgroundImage = function(el, src) { + var style = el.style; + if(goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("8")) { + style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(" + 'src\x3d"' + src + '", sizingMethod\x3d"crop")' + }else { + style.backgroundImage = "url(" + src + ")"; + style.backgroundPosition = "top left"; + style.backgroundRepeat = "no-repeat" + } +}; +goog.style.clearTransparentBackgroundImage = function(el) { + var style = el.style; + if("filter" in style) { + style.filter = "" + }else { + style.backgroundImage = "none" + } +}; +goog.style.showElement = function(el, display) { + goog.style.setElementShown(el, display) +}; +goog.style.setElementShown = function(el, isShown) { + el.style.display = isShown ? "" : "none" +}; +goog.style.isElementShown = function(el) { + return el.style.display != "none" +}; +goog.style.installStyles = function(stylesString, opt_node) { + var dh = goog.dom.getDomHelper(opt_node); + var styleSheet = null; + if(goog.userAgent.IE) { + styleSheet = dh.getDocument().createStyleSheet(); + goog.style.setStyles(styleSheet, stylesString) + }else { + var head = dh.getElementsByTagNameAndClass("head")[0]; + if(!head) { + var body = dh.getElementsByTagNameAndClass("body")[0]; + head = dh.createDom("head"); + body.parentNode.insertBefore(head, body) + } + styleSheet = dh.createDom("style"); + goog.style.setStyles(styleSheet, stylesString); + dh.appendChild(head, styleSheet) + } + return styleSheet +}; +goog.style.uninstallStyles = function(styleSheet) { + var node = styleSheet.ownerNode || styleSheet.owningElement || (styleSheet); + goog.dom.removeNode(node) +}; +goog.style.setStyles = function(element, stylesString) { + if(goog.userAgent.IE) { + element.cssText = stylesString + }else { + element.innerHTML = stylesString + } +}; +goog.style.setPreWrap = function(el) { + var style = el.style; + if(goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("8")) { + style.whiteSpace = "pre"; + style.wordWrap = "break-word" + }else { + if(goog.userAgent.GECKO) { + style.whiteSpace = "-moz-pre-wrap" + }else { + style.whiteSpace = "pre-wrap" + } + } +}; +goog.style.setInlineBlock = function(el) { + var style = el.style; + style.position = "relative"; + if(goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("8")) { + style.zoom = "1"; + style.display = "inline" + }else { + if(goog.userAgent.GECKO) { + style.display = goog.userAgent.isVersionOrHigher("1.9a") ? "inline-block" : "-moz-inline-box" + }else { + style.display = "inline-block" + } + } +}; +goog.style.isRightToLeft = function(el) { + return"rtl" == goog.style.getStyle_(el, "direction") +}; +goog.style.unselectableStyle_ = goog.userAgent.GECKO ? "MozUserSelect" : goog.userAgent.WEBKIT ? "WebkitUserSelect" : null; +goog.style.isUnselectable = function(el) { + if(goog.style.unselectableStyle_) { + return el.style[goog.style.unselectableStyle_].toLowerCase() == "none" + }else { + if(goog.userAgent.IE || goog.userAgent.OPERA) { + return el.getAttribute("unselectable") == "on" + } + } + return false +}; +goog.style.setUnselectable = function(el, unselectable, opt_noRecurse) { + var descendants = !opt_noRecurse ? el.getElementsByTagName("*") : null; + var name = goog.style.unselectableStyle_; + if(name) { + var value = unselectable ? "none" : ""; + el.style[name] = value; + if(descendants) { + for(var i = 0, descendant;descendant = descendants[i];i++) { + descendant.style[name] = value + } + } + }else { + if(goog.userAgent.IE || goog.userAgent.OPERA) { + var value = unselectable ? "on" : ""; + el.setAttribute("unselectable", value); + if(descendants) { + for(var i = 0, descendant;descendant = descendants[i];i++) { + descendant.setAttribute("unselectable", value) + } + } + } + } +}; +goog.style.getBorderBoxSize = function(element) { + return new goog.math.Size(element.offsetWidth, element.offsetHeight) +}; +goog.style.setBorderBoxSize = function(element, size) { + var doc = goog.dom.getOwnerDocument(element); + var isCss1CompatMode = goog.dom.getDomHelper(doc).isCss1CompatMode(); + if(goog.userAgent.IE && (!isCss1CompatMode || !goog.userAgent.isVersionOrHigher("8"))) { + var style = element.style; + if(isCss1CompatMode) { + var paddingBox = goog.style.getPaddingBox(element); + var borderBox = goog.style.getBorderBox(element); + style.pixelWidth = size.width - borderBox.left - paddingBox.left - paddingBox.right - borderBox.right; + style.pixelHeight = size.height - borderBox.top - paddingBox.top - paddingBox.bottom - borderBox.bottom + }else { + style.pixelWidth = size.width; + style.pixelHeight = size.height + } + }else { + goog.style.setBoxSizingSize_(element, size, "border-box") + } +}; +goog.style.getContentBoxSize = function(element) { + var doc = goog.dom.getOwnerDocument(element); + var ieCurrentStyle = goog.userAgent.IE && element.currentStyle; + if(ieCurrentStyle && goog.dom.getDomHelper(doc).isCss1CompatMode() && ieCurrentStyle.width != "auto" && ieCurrentStyle.height != "auto" && !ieCurrentStyle.boxSizing) { + var width = goog.style.getIePixelValue_(element, ieCurrentStyle.width, "width", "pixelWidth"); + var height = goog.style.getIePixelValue_(element, ieCurrentStyle.height, "height", "pixelHeight"); + return new goog.math.Size(width, height) + }else { + var borderBoxSize = goog.style.getBorderBoxSize(element); + var paddingBox = goog.style.getPaddingBox(element); + var borderBox = goog.style.getBorderBox(element); + return new goog.math.Size(borderBoxSize.width - borderBox.left - paddingBox.left - paddingBox.right - borderBox.right, borderBoxSize.height - borderBox.top - paddingBox.top - paddingBox.bottom - borderBox.bottom) + } +}; +goog.style.setContentBoxSize = function(element, size) { + var doc = goog.dom.getOwnerDocument(element); + var isCss1CompatMode = goog.dom.getDomHelper(doc).isCss1CompatMode(); + if(goog.userAgent.IE && (!isCss1CompatMode || !goog.userAgent.isVersionOrHigher("8"))) { + var style = element.style; + if(isCss1CompatMode) { + style.pixelWidth = size.width; + style.pixelHeight = size.height + }else { + var paddingBox = goog.style.getPaddingBox(element); + var borderBox = goog.style.getBorderBox(element); + style.pixelWidth = size.width + borderBox.left + paddingBox.left + paddingBox.right + borderBox.right; + style.pixelHeight = size.height + borderBox.top + paddingBox.top + paddingBox.bottom + borderBox.bottom + } + }else { + goog.style.setBoxSizingSize_(element, size, "content-box") + } +}; +goog.style.setBoxSizingSize_ = function(element, size, boxSizing) { + var style = element.style; + if(goog.userAgent.GECKO) { + style.MozBoxSizing = boxSizing + }else { + if(goog.userAgent.WEBKIT) { + style.WebkitBoxSizing = boxSizing + }else { + style.boxSizing = boxSizing + } + } + style.width = Math.max(size.width, 0) + "px"; + style.height = Math.max(size.height, 0) + "px" +}; +goog.style.getIePixelValue_ = function(element, value, name, pixelName) { + if(/^\d+px?$/.test(value)) { + return parseInt(value, 10) + }else { + var oldStyleValue = element.style[name]; + var oldRuntimeValue = element.runtimeStyle[name]; + element.runtimeStyle[name] = element.currentStyle[name]; + element.style[name] = value; + var pixelValue = element.style[pixelName]; + element.style[name] = oldStyleValue; + element.runtimeStyle[name] = oldRuntimeValue; + return pixelValue + } +}; +goog.style.getIePixelDistance_ = function(element, propName) { + var value = goog.style.getCascadedStyle(element, propName); + return value ? goog.style.getIePixelValue_(element, value, "left", "pixelLeft") : 0 +}; +goog.style.getBox_ = function(element, stylePrefix) { + if(goog.userAgent.IE) { + var left = goog.style.getIePixelDistance_(element, stylePrefix + "Left"); + var right = goog.style.getIePixelDistance_(element, stylePrefix + "Right"); + var top = goog.style.getIePixelDistance_(element, stylePrefix + "Top"); + var bottom = goog.style.getIePixelDistance_(element, stylePrefix + "Bottom"); + return new goog.math.Box(top, right, bottom, left) + }else { + var left = (goog.style.getComputedStyle(element, stylePrefix + "Left")); + var right = (goog.style.getComputedStyle(element, stylePrefix + "Right")); + var top = (goog.style.getComputedStyle(element, stylePrefix + "Top")); + var bottom = (goog.style.getComputedStyle(element, stylePrefix + "Bottom")); + return new goog.math.Box(parseFloat(top), parseFloat(right), parseFloat(bottom), parseFloat(left)) + } +}; +goog.style.getPaddingBox = function(element) { + return goog.style.getBox_(element, "padding") +}; +goog.style.getMarginBox = function(element) { + return goog.style.getBox_(element, "margin") +}; +goog.style.ieBorderWidthKeywords_ = {"thin":2, "medium":4, "thick":6}; +goog.style.getIePixelBorder_ = function(element, prop) { + if(goog.style.getCascadedStyle(element, prop + "Style") == "none") { + return 0 + } + var width = goog.style.getCascadedStyle(element, prop + "Width"); + if(width in goog.style.ieBorderWidthKeywords_) { + return goog.style.ieBorderWidthKeywords_[width] + } + return goog.style.getIePixelValue_(element, width, "left", "pixelLeft") +}; +goog.style.getBorderBox = function(element) { + if(goog.userAgent.IE) { + var left = goog.style.getIePixelBorder_(element, "borderLeft"); + var right = goog.style.getIePixelBorder_(element, "borderRight"); + var top = goog.style.getIePixelBorder_(element, "borderTop"); + var bottom = goog.style.getIePixelBorder_(element, "borderBottom"); + return new goog.math.Box(top, right, bottom, left) + }else { + var left = (goog.style.getComputedStyle(element, "borderLeftWidth")); + var right = (goog.style.getComputedStyle(element, "borderRightWidth")); + var top = (goog.style.getComputedStyle(element, "borderTopWidth")); + var bottom = (goog.style.getComputedStyle(element, "borderBottomWidth")); + return new goog.math.Box(parseFloat(top), parseFloat(right), parseFloat(bottom), parseFloat(left)) + } +}; +goog.style.getFontFamily = function(el) { + var doc = goog.dom.getOwnerDocument(el); + var font = ""; + if(doc.body.createTextRange) { + var range = doc.body.createTextRange(); + range.moveToElementText(el); + try { + font = range.queryCommandValue("FontName") + }catch(e) { + font = "" + } + } + if(!font) { + font = goog.style.getStyle_(el, "fontFamily") + } + var fontsArray = font.split(","); + if(fontsArray.length > 1) { + font = fontsArray[0] + } + return goog.string.stripQuotes(font, "\"'") +}; +goog.style.lengthUnitRegex_ = /[^\d]+$/; +goog.style.getLengthUnits = function(value) { + var units = value.match(goog.style.lengthUnitRegex_); + return units && units[0] || null +}; +goog.style.ABSOLUTE_CSS_LENGTH_UNITS_ = {"cm":1, "in":1, "mm":1, "pc":1, "pt":1}; +goog.style.CONVERTIBLE_RELATIVE_CSS_UNITS_ = {"em":1, "ex":1}; +goog.style.getFontSize = function(el) { + var fontSize = goog.style.getStyle_(el, "fontSize"); + var sizeUnits = goog.style.getLengthUnits(fontSize); + if(fontSize && "px" == sizeUnits) { + return parseInt(fontSize, 10) + } + if(goog.userAgent.IE) { + if(sizeUnits in goog.style.ABSOLUTE_CSS_LENGTH_UNITS_) { + return goog.style.getIePixelValue_(el, fontSize, "left", "pixelLeft") + }else { + if(el.parentNode && el.parentNode.nodeType == goog.dom.NodeType.ELEMENT && sizeUnits in goog.style.CONVERTIBLE_RELATIVE_CSS_UNITS_) { + var parentElement = (el.parentNode); + var parentSize = goog.style.getStyle_(parentElement, "fontSize"); + return goog.style.getIePixelValue_(parentElement, fontSize == parentSize ? "1em" : fontSize, "left", "pixelLeft") + } + } + } + var sizeElement = goog.dom.createDom("span", {"style":"visibility:hidden;position:absolute;" + "line-height:0;padding:0;margin:0;border:0;height:1em;"}); + goog.dom.appendChild(el, sizeElement); + fontSize = sizeElement.offsetHeight; + goog.dom.removeNode(sizeElement); + return fontSize +}; +goog.style.parseStyleAttribute = function(value) { + var result = {}; + goog.array.forEach(value.split(/\s*;\s*/), function(pair) { + var keyValue = pair.split(/\s*:\s*/); + if(keyValue.length == 2) { + result[goog.string.toCamelCase(keyValue[0].toLowerCase())] = keyValue[1] + } + }); + return result +}; +goog.style.toStyleAttribute = function(obj) { + var buffer = []; + goog.object.forEach(obj, function(value, key) { + buffer.push(goog.string.toSelectorCase(key), ":", value, ";") + }); + return buffer.join("") +}; +goog.style.setFloat = function(el, value) { + el.style[goog.userAgent.IE ? "styleFloat" : "cssFloat"] = value +}; +goog.style.getFloat = function(el) { + return el.style[goog.userAgent.IE ? "styleFloat" : "cssFloat"] || "" +}; +goog.style.getScrollbarWidth = function(opt_className) { + var outerDiv = goog.dom.createElement("div"); + if(opt_className) { + outerDiv.className = opt_className + } + outerDiv.style.cssText = "overflow:auto;" + "position:absolute;top:0;width:100px;height:100px"; + var innerDiv = goog.dom.createElement("div"); + goog.style.setSize(innerDiv, "200px", "200px"); + outerDiv.appendChild(innerDiv); + goog.dom.appendChild(goog.dom.getDocument().body, outerDiv); + var width = outerDiv.offsetWidth - outerDiv.clientWidth; + goog.dom.removeNode(outerDiv); + return width +}; +goog.style.MATRIX_TRANSLATION_REGEX_ = new RegExp("matrix\\([0-9\\.\\-]+, [0-9\\.\\-]+, " + "[0-9\\.\\-]+, [0-9\\.\\-]+, " + "([0-9\\.\\-]+)p?x?, ([0-9\\.\\-]+)p?x?\\)"); +goog.style.getCssTranslation = function(element) { + var property; + if(goog.userAgent.IE) { + property = "-ms-transform" + }else { + if(goog.userAgent.WEBKIT) { + property = "-webkit-transform" + }else { + if(goog.userAgent.OPERA) { + property = "-o-transform" + }else { + if(goog.userAgent.GECKO) { + property = "-moz-transform" + } + } + } + } + var transform; + if(property) { + transform = goog.style.getStyle_(element, property) + } + if(!transform) { + transform = goog.style.getStyle_(element, "transform") + } + if(!transform) { + return new goog.math.Coordinate(0, 0) + } + var matches = transform.match(goog.style.MATRIX_TRANSLATION_REGEX_); + if(!matches) { + return new goog.math.Coordinate(0, 0) + } + return new goog.math.Coordinate(parseFloat(matches[1]), parseFloat(matches[2])) +}; +goog.provide("goog.events.MouseWheelEvent"); +goog.provide("goog.events.MouseWheelHandler"); +goog.provide("goog.events.MouseWheelHandler.EventType"); +goog.require("goog.dom"); +goog.require("goog.events"); +goog.require("goog.events.BrowserEvent"); +goog.require("goog.events.EventTarget"); +goog.require("goog.math"); +goog.require("goog.style"); +goog.require("goog.userAgent"); +goog.events.MouseWheelHandler = function(element, opt_capture) { + goog.events.EventTarget.call(this); + this.element_ = element; + var rtlElement = goog.dom.isElement(this.element_) ? (this.element_) : this.element_ ? (this.element_).body : null; + this.isRtl_ = !!rtlElement && goog.style.isRightToLeft(rtlElement); + var type = goog.userAgent.GECKO ? "DOMMouseScroll" : "mousewheel"; + this.listenKey_ = goog.events.listen(this.element_, type, this, opt_capture) +}; +goog.inherits(goog.events.MouseWheelHandler, goog.events.EventTarget); +goog.events.MouseWheelHandler.EventType = {MOUSEWHEEL:"mousewheel"}; +goog.events.MouseWheelHandler.prototype.maxDeltaX_; +goog.events.MouseWheelHandler.prototype.maxDeltaY_; +goog.events.MouseWheelHandler.prototype.setMaxDeltaX = function(maxDeltaX) { + this.maxDeltaX_ = maxDeltaX +}; +goog.events.MouseWheelHandler.prototype.setMaxDeltaY = function(maxDeltaY) { + this.maxDeltaY_ = maxDeltaY +}; +goog.events.MouseWheelHandler.prototype.handleEvent = function(e) { + var deltaX = 0; + var deltaY = 0; + var detail = 0; + var be = e.getBrowserEvent(); + if(be.type == "mousewheel") { + var wheelDeltaScaleFactor = 1; + if(goog.userAgent.IE || goog.userAgent.WEBKIT && (goog.userAgent.WINDOWS || goog.userAgent.isVersionOrHigher("532.0"))) { + wheelDeltaScaleFactor = 40 + } + detail = goog.events.MouseWheelHandler.smartScale_(-be.wheelDelta, wheelDeltaScaleFactor); + if(goog.isDef(be.wheelDeltaX)) { + deltaX = goog.events.MouseWheelHandler.smartScale_(-be.wheelDeltaX, wheelDeltaScaleFactor); + deltaY = goog.events.MouseWheelHandler.smartScale_(-be.wheelDeltaY, wheelDeltaScaleFactor) + }else { + deltaY = detail + } + }else { + detail = be.detail; + if(detail > 100) { + detail = 3 + }else { + if(detail < -100) { + detail = -3 + } + } + if(goog.isDef(be.axis) && be.axis === be.HORIZONTAL_AXIS) { + deltaX = detail + }else { + deltaY = detail + } + } + if(goog.isNumber(this.maxDeltaX_)) { + deltaX = goog.math.clamp(deltaX, -this.maxDeltaX_, this.maxDeltaX_) + } + if(goog.isNumber(this.maxDeltaY_)) { + deltaY = goog.math.clamp(deltaY, -this.maxDeltaY_, this.maxDeltaY_) + } + if(this.isRtl_) { + deltaX = -deltaX + } + var newEvent = new goog.events.MouseWheelEvent(detail, be, deltaX, deltaY); + this.dispatchEvent(newEvent) +}; +goog.events.MouseWheelHandler.smartScale_ = function(mouseWheelDelta, scaleFactor) { + if(goog.userAgent.WEBKIT && (goog.userAgent.MAC || goog.userAgent.LINUX) && mouseWheelDelta % scaleFactor != 0) { + return mouseWheelDelta + }else { + return mouseWheelDelta / scaleFactor + } +}; +goog.events.MouseWheelHandler.prototype.disposeInternal = function() { + goog.events.MouseWheelHandler.superClass_.disposeInternal.call(this); + goog.events.unlistenByKey(this.listenKey_); + this.listenKey_ = null +}; +goog.events.MouseWheelEvent = function(detail, browserEvent, deltaX, deltaY) { + goog.events.BrowserEvent.call(this, browserEvent); + this.type = goog.events.MouseWheelHandler.EventType.MOUSEWHEEL; + this.detail = detail; + this.deltaX = deltaX; + this.deltaY = deltaY +}; +goog.inherits(goog.events.MouseWheelEvent, goog.events.BrowserEvent); +goog.provide("goog.log"); +goog.provide("goog.log.Level"); +goog.provide("goog.log.LogRecord"); +goog.provide("goog.log.Logger"); +goog.require("goog.debug"); +goog.require("goog.debug.LogRecord"); +goog.require("goog.debug.Logger"); +goog.define("goog.log.ENABLED", goog.debug.LOGGING_ENABLED); +goog.log.Logger = goog.debug.Logger; +goog.log.Level = goog.debug.Logger.Level; +goog.log.LogRecord = goog.debug.LogRecord; +goog.log.getLogger = function(name, opt_level) { + if(goog.log.ENABLED) { + var logger = goog.debug.Logger.getLogger(name); + if(opt_level && logger) { + logger.setLevel(opt_level) + } + return logger + }else { + return null + } +}; +goog.log.addHandler = function(logger, handler) { + if(goog.log.ENABLED && logger) { + logger.addHandler(handler) + } +}; +goog.log.removeHandler = function(logger, handler) { + if(goog.log.ENABLED && logger) { + return logger.removeHandler(handler) + }else { + return false + } +}; +goog.log.log = function(logger, level, msg, opt_exception) { + if(goog.log.ENABLED && logger) { + logger.log(level, msg, opt_exception) + } +}; +goog.log.error = function(logger, msg, opt_exception) { + if(goog.log.ENABLED && logger) { + logger.severe(msg, opt_exception) + } +}; +goog.log.warning = function(logger, msg, opt_exception) { + if(goog.log.ENABLED && logger) { + logger.warning(msg, opt_exception) + } +}; +goog.log.info = function(logger, msg, opt_exception) { + if(goog.log.ENABLED && logger) { + logger.info(msg, opt_exception) + } +}; +goog.log.fine = function(logger, msg, opt_exception) { + if(goog.log.ENABLED && logger) { + logger.fine(msg, opt_exception) + } +}; +goog.provide("ol.control.Control"); +goog.require("goog.array"); +goog.require("goog.dom"); +goog.require("goog.events"); +goog.require("ol.MapEventType"); +goog.require("ol.Object"); +ol.control.Control = function(options) { + goog.base(this); + this.element = goog.isDef(options.element) ? options.element : null; + this.target_ = goog.isDef(options.target) ? goog.dom.getElement(options.target) : null; + this.map_ = null; + this.listenerKeys = [] +}; +goog.inherits(ol.control.Control, ol.Object); +ol.control.Control.prototype.disposeInternal = function() { + goog.dom.removeNode(this.element); + goog.base(this, "disposeInternal") +}; +ol.control.Control.prototype.getMap = function() { + return this.map_ +}; +ol.control.Control.prototype.handleMapPostrender = goog.nullFunction; +ol.control.Control.prototype.setMap = function(map) { + if(!goog.isNull(this.map_)) { + goog.dom.removeNode(this.element) + } + if(!goog.array.isEmpty(this.listenerKeys)) { + goog.array.forEach(this.listenerKeys, goog.events.unlistenByKey); + this.listenerKeys.length = 0 + } + this.map_ = map; + if(!goog.isNull(this.map_)) { + var target = !goog.isNull(this.target_) ? this.target_ : map.getOverlayContainerStopEvent(); + goog.dom.appendChild(target, this.element); + if(this.handleMapPostrender !== goog.nullFunction) { + this.listenerKeys.push(goog.events.listen(map, ol.MapEventType.POSTRENDER, this.handleMapPostrender, false, this)) + } + map.render() + } +}; +goog.provide("ol.css"); +ol.css.CLASS_UNSELECTABLE = "ol-unselectable"; +ol.css.CLASS_UNSUPPORTED = "ol-unsupported"; +goog.provide("ol.control.Attribution"); +goog.require("goog.array"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.object"); +goog.require("goog.style"); +goog.require("ol.Attribution"); +goog.require("ol.FrameState"); +goog.require("ol.control.Control"); +goog.require("ol.css"); +ol.control.Attribution = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.ulElement_ = goog.dom.createElement(goog.dom.TagName.UL); + var className = goog.isDef(options.className) ? options.className : "ol-attribution"; + var element = goog.dom.createDom(goog.dom.TagName.DIV, {"class":className + " " + ol.css.CLASS_UNSELECTABLE}, this.ulElement_); + goog.base(this, {element:element, target:options.target}); + this.renderedVisible_ = true; + this.attributionElements_ = {}; + this.attributionElementRenderedVisible_ = {} +}; +goog.inherits(ol.control.Attribution, ol.control.Control); +ol.control.Attribution.prototype.getSourceAttributions = function(frameState) { + var i, ii, j, jj, tileRanges, source, sourceAttribution, sourceAttributionKey, sourceAttributions, sourceKey; + var layers = frameState.layersArray; + var attributions = goog.object.clone(frameState.attributions); + var hiddenAttributions = {}; + for(i = 0, ii = layers.length;i < ii;i++) { + source = layers[i].getSource(); + sourceKey = goog.getUid(source).toString(); + sourceAttributions = source.getAttributions(); + if(goog.isNull(sourceAttributions)) { + continue + } + for(j = 0, jj = sourceAttributions.length;j < jj;j++) { + sourceAttribution = sourceAttributions[j]; + sourceAttributionKey = goog.getUid(sourceAttribution).toString(); + if(sourceAttributionKey in attributions) { + continue + } + tileRanges = frameState.usedTiles[sourceKey]; + if(goog.isDef(tileRanges) && sourceAttribution.intersectsAnyTileRange(tileRanges)) { + if(sourceAttributionKey in hiddenAttributions) { + delete hiddenAttributions[sourceAttributionKey] + } + attributions[sourceAttributionKey] = sourceAttribution + }else { + hiddenAttributions[sourceAttributionKey] = sourceAttribution + } + } + } + return[attributions, hiddenAttributions] +}; +ol.control.Attribution.prototype.handleMapPostrender = function(mapEvent) { + this.updateElement_(mapEvent.frameState) +}; +ol.control.Attribution.prototype.updateElement_ = function(frameState) { + if(goog.isNull(frameState)) { + if(this.renderedVisible_) { + goog.style.setElementShown(this.element, false); + this.renderedVisible_ = false + } + return + } + var attributions = this.getSourceAttributions(frameState); + var visibleAttributions = attributions[0]; + var hiddenAttributions = attributions[1]; + var attributionElement, attributionKey; + for(attributionKey in this.attributionElements_) { + if(attributionKey in visibleAttributions) { + if(!this.attributionElementRenderedVisible_[attributionKey]) { + goog.style.setElementShown(this.attributionElements_[attributionKey], true); + this.attributionElementRenderedVisible_[attributionKey] = true + } + delete visibleAttributions[attributionKey] + }else { + if(attributionKey in hiddenAttributions) { + if(this.attributionElementRenderedVisible_[attributionKey]) { + goog.style.setElementShown(this.attributionElements_[attributionKey], false); + delete this.attributionElementRenderedVisible_[attributionKey] + } + delete hiddenAttributions[attributionKey] + }else { + goog.dom.removeNode(this.attributionElements_[attributionKey]); + delete this.attributionElements_[attributionKey]; + delete this.attributionElementRenderedVisible_[attributionKey] + } + } + } + for(attributionKey in visibleAttributions) { + attributionElement = goog.dom.createElement(goog.dom.TagName.LI); + attributionElement.innerHTML = visibleAttributions[attributionKey].getHTML(); + goog.dom.appendChild(this.ulElement_, attributionElement); + this.attributionElements_[attributionKey] = attributionElement; + this.attributionElementRenderedVisible_[attributionKey] = true + } + for(attributionKey in hiddenAttributions) { + attributionElement = goog.dom.createElement(goog.dom.TagName.LI); + attributionElement.innerHTML = hiddenAttributions[attributionKey].getHTML(); + goog.style.setElementShown(attributionElement, false); + goog.dom.appendChild(this.ulElement_, attributionElement); + this.attributionElements_[attributionKey] = attributionElement + } + var renderVisible = !goog.object.isEmpty(this.attributionElementRenderedVisible_); + if(this.renderedVisible_ != renderVisible) { + goog.style.setElementShown(this.element, renderVisible); + this.renderedVisible_ = renderVisible + } +}; +goog.provide("ol.control.Logo"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.object"); +goog.require("goog.style"); +goog.require("ol.FrameState"); +goog.require("ol.control.Control"); +goog.require("ol.css"); +ol.control.Logo = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.ulElement_ = goog.dom.createElement(goog.dom.TagName.UL); + var className = goog.isDef(options.className) ? options.className : "ol-logo"; + var element = goog.dom.createDom(goog.dom.TagName.DIV, {"class":className + " " + ol.css.CLASS_UNSELECTABLE}, this.ulElement_); + goog.base(this, {element:element, target:options.target}); + this.renderedVisible_ = true; + this.logoElements_ = {} +}; +goog.inherits(ol.control.Logo, ol.control.Control); +ol.control.Logo.prototype.handleMapPostrender = function(mapEvent) { + this.updateElement_(mapEvent.frameState) +}; +ol.control.Logo.prototype.updateElement_ = function(frameState) { + if(goog.isNull(frameState)) { + if(this.renderedVisible_) { + goog.style.setElementShown(this.element, false); + this.renderedVisible_ = false + } + return + } + var logo; + var logos = frameState.logos; + var logoElements = this.logoElements_; + for(logo in logoElements) { + if(!(logo in logos)) { + goog.dom.removeNode(logoElements[logo]); + delete logoElements[logo] + } + } + var image, logoElement, logoKey; + for(logoKey in logos) { + if(!(logoKey in logoElements)) { + image = new Image; + image.src = logoKey; + var logoValue = logos[logoKey]; + var child; + if(logoValue === "") { + child = image + }else { + child = goog.dom.createDom(goog.dom.TagName.A, {"href":logoValue, "target":"_blank"}); + child.appendChild(image) + } + logoElement = goog.dom.createDom(goog.dom.TagName.LI, undefined, child); + goog.dom.appendChild(this.ulElement_, logoElement); + logoElements[logoKey] = logoElement + } + } + var renderVisible = !goog.object.isEmpty(logos); + if(this.renderedVisible_ != renderVisible) { + goog.style.setElementShown(this.element, renderVisible); + this.renderedVisible_ = renderVisible + } +}; +goog.provide("ol.control.Zoom"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("ol.View2D"); +goog.require("ol.animation"); +goog.require("ol.control.Control"); +goog.require("ol.css"); +goog.require("ol.easing"); +ol.control.Zoom = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var className = goog.isDef(options.className) ? options.className : "ol-zoom"; + var delta = goog.isDef(options.delta) ? options.delta : 1; + var zoomInLabel = goog.isDef(options.zoomInLabel) ? options.zoomInLabel : "+"; + var zoomOutLabel = goog.isDef(options.zoomOutLabel) ? options.zoomOutLabel : "\u2212"; + var zoomInTipLabel = goog.isDef(options.zoomInTipLabel) ? options.zoomInTipLabel : "Zoom in"; + var zoomOutTipLabel = goog.isDef(options.zoomOutTipLabel) ? options.zoomOutTipLabel : "Zoom out"; + var tTipZoomIn = goog.dom.createDom(goog.dom.TagName.SPAN, {"role":"tooltip"}, zoomInTipLabel); + var inElement = goog.dom.createDom(goog.dom.TagName.BUTTON, {"class":className + "-in ol-has-tooltip", "name":"ZoomIn", "type":"button"}, tTipZoomIn, zoomInLabel); + goog.events.listen(inElement, [goog.events.EventType.TOUCHEND, goog.events.EventType.CLICK], goog.partial(ol.control.Zoom.prototype.zoomByDelta_, delta), false, this); + goog.events.listen(inElement, [goog.events.EventType.MOUSEOUT, goog.events.EventType.FOCUSOUT], function() { + this.blur() + }, false); + var tTipsZoomOut = goog.dom.createDom(goog.dom.TagName.SPAN, {"role":"tooltip", "type":"button"}, zoomOutTipLabel); + var outElement = goog.dom.createDom(goog.dom.TagName.BUTTON, {"class":className + "-out ol-has-tooltip", "name":"ZoomOut"}, tTipsZoomOut, zoomOutLabel); + goog.events.listen(outElement, [goog.events.EventType.TOUCHEND, goog.events.EventType.CLICK], goog.partial(ol.control.Zoom.prototype.zoomByDelta_, -delta), false, this); + goog.events.listen(outElement, [goog.events.EventType.MOUSEOUT, goog.events.EventType.FOCUSOUT], function() { + this.blur() + }, false); + var cssClasses = className + " " + ol.css.CLASS_UNSELECTABLE; + var element = goog.dom.createDom(goog.dom.TagName.DIV, cssClasses, inElement, outElement); + goog.base(this, {element:element, target:options.target}); + this.duration_ = goog.isDef(options.duration) ? options.duration : 250 +}; +goog.inherits(ol.control.Zoom, ol.control.Control); +ol.control.Zoom.prototype.zoomByDelta_ = function(delta, browserEvent) { + browserEvent.preventDefault(); + var map = this.getMap(); + var view = map.getView(); + goog.asserts.assert(goog.isDef(view)); + var view2D = view.getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + var currentResolution = view2D.getResolution(); + if(goog.isDef(currentResolution)) { + if(this.duration_ > 0) { + map.beforeRender(ol.animation.zoom({resolution:currentResolution, duration:this.duration_, easing:ol.easing.easeOut})) + } + var newResolution = view2D.constrainResolution(currentResolution, delta); + view2D.setResolution(newResolution) + } +}; +goog.provide("ol.control"); +goog.require("ol.Collection"); +goog.require("ol.control.Attribution"); +goog.require("ol.control.Logo"); +goog.require("ol.control.Zoom"); +ol.control.defaults = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var controls = new ol.Collection; + var zoomControl = goog.isDef(options.zoom) ? options.zoom : true; + if(zoomControl) { + var zoomControlOptions = goog.isDef(options.zoomOptions) ? options.zoomOptions : undefined; + controls.push(new ol.control.Zoom(zoomControlOptions)) + } + var attributionControl = goog.isDef(options.attribution) ? options.attribution : true; + if(attributionControl) { + var attributionControlOptions = goog.isDef(options.attributionOptions) ? options.attributionOptions : undefined; + controls.push(new ol.control.Attribution(attributionControlOptions)) + } + var logoControl = goog.isDef(options.logo) ? options.logo : true; + if(logoControl) { + var logoControlOptions = goog.isDef(options.logoOptions) ? options.logoOptions : undefined; + controls.push(new ol.control.Logo(logoControlOptions)) + } + return controls +}; +goog.provide("ol.Kinetic"); +goog.require("ol.Coordinate"); +goog.require("ol.PreRenderFunction"); +goog.require("ol.animation"); +ol.Kinetic = function(decay, minVelocity, delay) { + this.decay_ = decay; + this.minVelocity_ = minVelocity; + this.delay_ = delay; + this.points_ = []; + this.angle_ = 0; + this.initialVelocity_ = 0 +}; +ol.Kinetic.prototype.begin = function() { + this.points_.length = 0; + this.angle_ = 0; + this.initialVelocity_ = 0 +}; +ol.Kinetic.prototype.update = function(x, y) { + this.points_.push(x, y, goog.now()) +}; +ol.Kinetic.prototype.end = function() { + var delay = goog.now() - this.delay_; + var lastIndex = this.points_.length - 3; + if(this.points_[lastIndex + 2] < delay) { + return false + } + var firstIndex = lastIndex - 3; + while(firstIndex >= 0 && this.points_[firstIndex + 2] > delay) { + firstIndex -= 3 + } + if(firstIndex >= 0) { + var duration = this.points_[lastIndex + 2] - this.points_[firstIndex + 2]; + var dx = this.points_[lastIndex] - this.points_[firstIndex]; + var dy = this.points_[lastIndex + 1] - this.points_[firstIndex + 1]; + this.angle_ = Math.atan2(dy, dx); + this.initialVelocity_ = Math.sqrt(dx * dx + dy * dy) / duration; + return this.initialVelocity_ > this.minVelocity_ + } + return false +}; +ol.Kinetic.prototype.pan = function(source) { + var decay = this.decay_; + var initialVelocity = this.initialVelocity_; + var minVelocity = this.minVelocity_; + var duration = this.getDuration_(); + var easingFunction = function(t) { + return initialVelocity * (Math.exp(decay * t * duration) - 1) / (minVelocity - initialVelocity) + }; + return ol.animation.pan({source:source, duration:duration, easing:easingFunction}) +}; +ol.Kinetic.prototype.getDuration_ = function() { + return Math.log(this.minVelocity_ / this.initialVelocity_) / this.decay_ +}; +ol.Kinetic.prototype.getDistance = function() { + return(this.minVelocity_ - this.initialVelocity_) / this.decay_ +}; +ol.Kinetic.prototype.getAngle = function() { + return this.angle_ +}; +goog.provide("ol.interaction.DoubleClickZoom"); +goog.require("goog.asserts"); +goog.require("ol.MapBrowserEvent"); +goog.require("ol.MapBrowserEvent.EventType"); +goog.require("ol.interaction.Interaction"); +ol.interaction.DoubleClickZoom = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.delta_ = goog.isDef(options.delta) ? options.delta : 1; + goog.base(this); + this.duration_ = goog.isDef(options.duration) ? options.duration : 250 +}; +goog.inherits(ol.interaction.DoubleClickZoom, ol.interaction.Interaction); +ol.interaction.DoubleClickZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + var stopEvent = false; + var browserEvent = mapBrowserEvent.browserEvent; + if(mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DBLCLICK) { + var map = mapBrowserEvent.map; + var anchor = mapBrowserEvent.coordinate; + var delta = browserEvent.shiftKey ? -this.delta_ : this.delta_; + var view = map.getView().getView2D(); + ol.interaction.Interaction.zoomByDelta(map, view, delta, anchor, this.duration_); + mapBrowserEvent.preventDefault(); + stopEvent = true + } + return!stopEvent +}; +goog.provide("ol.interaction.DragPan"); +goog.require("goog.asserts"); +goog.require("ol.Kinetic"); +goog.require("ol.PreRenderFunction"); +goog.require("ol.View2D"); +goog.require("ol.ViewHint"); +goog.require("ol.coordinate"); +goog.require("ol.events.ConditionType"); +goog.require("ol.events.condition"); +goog.require("ol.interaction.Drag"); +ol.interaction.DragPan = function(opt_options) { + goog.base(this); + var options = goog.isDef(opt_options) ? opt_options : {}; + this.condition_ = goog.isDef(options.condition) ? options.condition : ol.events.condition.noModifierKeys; + this.kinetic_ = options.kinetic; + this.kineticPreRenderFn_ = null +}; +goog.inherits(ol.interaction.DragPan, ol.interaction.Drag); +ol.interaction.DragPan.prototype.handleDrag = function(mapBrowserEvent) { + if(this.kinetic_) { + this.kinetic_.update(mapBrowserEvent.browserEvent.clientX, mapBrowserEvent.browserEvent.clientY) + } + var map = mapBrowserEvent.map; + var view = map.getView(); + goog.asserts.assertInstanceof(view, ol.View2D); + var view2DState = view.getView2DState(); + var newCenter = [-view2DState.resolution * this.deltaX, view2DState.resolution * this.deltaY]; + ol.coordinate.rotate(newCenter, view2DState.rotation); + ol.coordinate.add(newCenter, this.startCenter); + newCenter = view.constrainCenter(newCenter); + map.render(); + view.setCenter(newCenter) +}; +ol.interaction.DragPan.prototype.handleDragEnd = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var view = map.getView(); + view.setHint(ol.ViewHint.INTERACTING, -1); + if(this.kinetic_ && this.kinetic_.end()) { + var view2D = view.getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + var view2DState = view2D.getView2DState(); + var distance = this.kinetic_.getDistance(); + var angle = this.kinetic_.getAngle(); + this.kineticPreRenderFn_ = this.kinetic_.pan(view2DState.center); + map.beforeRender(this.kineticPreRenderFn_); + var centerpx = map.getPixelFromCoordinate(view2DState.center); + var dest = map.getCoordinateFromPixel([centerpx[0] - distance * Math.cos(angle), centerpx[1] - distance * Math.sin(angle)]); + dest = view2D.constrainCenter(dest); + view2D.setCenter(dest) + } + map.render() +}; +ol.interaction.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + if(browserEvent.isMouseActionButton() && this.condition_(mapBrowserEvent)) { + if(this.kinetic_) { + this.kinetic_.begin(); + this.kinetic_.update(browserEvent.clientX, browserEvent.clientY) + } + var map = mapBrowserEvent.map; + map.getView().setHint(ol.ViewHint.INTERACTING, 1); + map.render(); + return true + }else { + return false + } +}; +ol.interaction.DragPan.prototype.handleDown = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var view = map.getView(); + goog.asserts.assertInstanceof(view, ol.View2D); + goog.asserts.assert(!goog.isNull(mapBrowserEvent.frameState)); + if(!goog.isNull(this.kineticPreRenderFn_) && map.removePreRenderFunction(this.kineticPreRenderFn_)) { + map.render(); + view.setCenter(mapBrowserEvent.frameState.view2DState.center); + this.kineticPreRenderFn_ = null + } +}; +goog.provide("ol.interaction.DragRotate"); +goog.require("goog.asserts"); +goog.require("ol.ViewHint"); +goog.require("ol.events.ConditionType"); +goog.require("ol.events.condition"); +goog.require("ol.interaction.Drag"); +goog.require("ol.interaction.Interaction"); +ol.interaction.DRAGROTATE_ANIMATION_DURATION = 250; +ol.interaction.DragRotate = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + this.condition_ = goog.isDef(options.condition) ? options.condition : ol.events.condition.altShiftKeysOnly; + this.lastAngle_ = undefined +}; +goog.inherits(ol.interaction.DragRotate, ol.interaction.Drag); +ol.interaction.DragRotate.prototype.handleDrag = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var size = map.getSize(); + var offset = mapBrowserEvent.pixel; + var theta = Math.atan2(size[1] / 2 - offset[1], offset[0] - size[0] / 2); + if(goog.isDef(this.lastAngle_)) { + var delta = theta - this.lastAngle_; + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + map.render(); + ol.interaction.Interaction.rotateWithoutConstraints(map, view, view2DState.rotation - delta) + } + this.lastAngle_ = theta +}; +ol.interaction.DragRotate.prototype.handleDragEnd = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var view = map.getView(); + view.setHint(ol.ViewHint.INTERACTING, -1); + var view2D = view.getView2D(); + var view2DState = view2D.getView2DState(); + ol.interaction.Interaction.rotate(map, view2D, view2DState.rotation, undefined, ol.interaction.DRAGROTATE_ANIMATION_DURATION) +}; +ol.interaction.DragRotate.prototype.handleDragStart = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + if(browserEvent.isMouseActionButton() && this.condition_(mapBrowserEvent)) { + var map = mapBrowserEvent.map; + map.getView().setHint(ol.ViewHint.INTERACTING, 1); + map.render(); + this.lastAngle_ = undefined; + return true + }else { + return false + } +}; +goog.provide("ol.interaction.DragZoom"); +goog.require("goog.asserts"); +goog.require("ol.events.condition"); +goog.require("ol.extent"); +goog.require("ol.interaction.DragBox"); +goog.require("ol.interaction.Interaction"); +goog.require("ol.style.Stroke"); +goog.require("ol.style.Style"); +ol.interaction.DRAGZOOM_ANIMATION_DURATION = 200; +ol.interaction.DragZoom = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var condition = goog.isDef(options.condition) ? options.condition : ol.events.condition.shiftKeyOnly; + var style = goog.isDef(options.style) ? options.style : new ol.style.Style({stroke:new ol.style.Stroke({color:[0, 0, 255, 1]})}); + goog.base(this, {condition:condition, style:style}) +}; +goog.inherits(ol.interaction.DragZoom, ol.interaction.DragBox); +ol.interaction.DragZoom.prototype.onBoxEnd = function() { + var map = this.getMap(); + var view = map.getView().getView2D(); + var extent = this.getGeometry().getExtent(); + var center = ol.extent.getCenter(extent); + ol.interaction.Interaction.zoom(map, view, view.getResolutionForExtent(extent, map.getSize()), center, ol.interaction.DRAGZOOM_ANIMATION_DURATION) +}; +goog.provide("ol.interaction.KeyboardPan"); +goog.require("goog.asserts"); +goog.require("goog.events.KeyCodes"); +goog.require("goog.events.KeyHandler.EventType"); +goog.require("goog.functions"); +goog.require("ol.View2D"); +goog.require("ol.coordinate"); +goog.require("ol.events.ConditionType"); +goog.require("ol.events.condition"); +goog.require("ol.interaction.Interaction"); +ol.interaction.KEYBOARD_PAN_DURATION = 100; +ol.interaction.KeyboardPan = function(opt_options) { + goog.base(this); + var options = goog.isDef(opt_options) ? opt_options : {}; + this.condition_ = goog.isDef(options.condition) ? options.condition : goog.functions.and(ol.events.condition.noModifierKeys, ol.events.condition.targetNotEditable); + this.pixelDelta_ = goog.isDef(options.pixelDelta) ? options.pixelDelta : 128 +}; +goog.inherits(ol.interaction.KeyboardPan, ol.interaction.Interaction); +ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + var stopEvent = false; + if(mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { + var keyEvent = (mapBrowserEvent.browserEvent); + var keyCode = keyEvent.keyCode; + if(this.condition_(mapBrowserEvent) && (keyCode == goog.events.KeyCodes.DOWN || keyCode == goog.events.KeyCodes.LEFT || keyCode == goog.events.KeyCodes.RIGHT || keyCode == goog.events.KeyCodes.UP)) { + var map = mapBrowserEvent.map; + var view = map.getView(); + goog.asserts.assertInstanceof(view, ol.View2D); + var view2DState = view.getView2DState(); + var mapUnitsDelta = view2DState.resolution * this.pixelDelta_; + var deltaX = 0, deltaY = 0; + if(keyCode == goog.events.KeyCodes.DOWN) { + deltaY = -mapUnitsDelta + }else { + if(keyCode == goog.events.KeyCodes.LEFT) { + deltaX = -mapUnitsDelta + }else { + if(keyCode == goog.events.KeyCodes.RIGHT) { + deltaX = mapUnitsDelta + }else { + deltaY = mapUnitsDelta + } + } + } + var delta = [deltaX, deltaY]; + ol.coordinate.rotate(delta, view2DState.rotation); + ol.interaction.Interaction.pan(map, view, delta, ol.interaction.KEYBOARD_PAN_DURATION); + mapBrowserEvent.preventDefault(); + stopEvent = true + } + } + return!stopEvent +}; +goog.provide("ol.interaction.KeyboardZoom"); +goog.require("goog.asserts"); +goog.require("goog.events.KeyHandler.EventType"); +goog.require("ol.events.ConditionType"); +goog.require("ol.events.condition"); +goog.require("ol.interaction.Interaction"); +ol.interaction.KeyboardZoom = function(opt_options) { + goog.base(this); + var options = goog.isDef(opt_options) ? opt_options : {}; + this.condition_ = goog.isDef(options.condition) ? options.condition : ol.events.condition.targetNotEditable; + this.delta_ = goog.isDef(options.delta) ? options.delta : 1; + this.duration_ = goog.isDef(options.duration) ? options.duration : 100 +}; +goog.inherits(ol.interaction.KeyboardZoom, ol.interaction.Interaction); +ol.interaction.KeyboardZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + var stopEvent = false; + if(mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { + var keyEvent = (mapBrowserEvent.browserEvent); + var charCode = keyEvent.charCode; + if(this.condition_(mapBrowserEvent) && (charCode == "+".charCodeAt(0) || charCode == "-".charCodeAt(0))) { + var map = mapBrowserEvent.map; + var delta = charCode == "+".charCodeAt(0) ? this.delta_ : -this.delta_; + map.render(); + var view = map.getView().getView2D(); + ol.interaction.Interaction.zoomByDelta(map, view, delta, undefined, this.duration_); + mapBrowserEvent.preventDefault(); + stopEvent = true + } + } + return!stopEvent +}; +goog.provide("ol.interaction.MouseWheelZoom"); +goog.require("goog.asserts"); +goog.require("goog.events.MouseWheelEvent"); +goog.require("goog.events.MouseWheelHandler.EventType"); +goog.require("goog.math"); +goog.require("ol.Coordinate"); +goog.require("ol.interaction.Interaction"); +ol.interaction.MOUSEWHEELZOOM_MAXDELTA = 1; +ol.interaction.MOUSEWHEELZOOM_TIMEOUT_DURATION = 80; +ol.interaction.MouseWheelZoom = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + this.delta_ = 0; + this.duration_ = goog.isDef(options.duration) ? options.duration : 250; + this.lastAnchor_ = null; + this.startTime_ = undefined; + this.timeoutId_ = undefined +}; +goog.inherits(ol.interaction.MouseWheelZoom, ol.interaction.Interaction); +ol.interaction.MouseWheelZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + var stopEvent = false; + if(mapBrowserEvent.type == goog.events.MouseWheelHandler.EventType.MOUSEWHEEL) { + var map = mapBrowserEvent.map; + var mouseWheelEvent = mapBrowserEvent.browserEvent; + goog.asserts.assertInstanceof(mouseWheelEvent, goog.events.MouseWheelEvent); + this.lastAnchor_ = mapBrowserEvent.coordinate; + this.delta_ += mouseWheelEvent.deltaY / 3; + if(!goog.isDef(this.startTime_)) { + this.startTime_ = goog.now() + } + var duration = ol.interaction.MOUSEWHEELZOOM_TIMEOUT_DURATION; + var timeLeft = Math.max(duration - (goog.now() - this.startTime_), 0); + goog.global.clearTimeout(this.timeoutId_); + this.timeoutId_ = goog.global.setTimeout(goog.bind(this.doZoom_, this, map), timeLeft); + mapBrowserEvent.preventDefault(); + stopEvent = true + } + return!stopEvent +}; +ol.interaction.MouseWheelZoom.prototype.doZoom_ = function(map) { + var maxDelta = ol.interaction.MOUSEWHEELZOOM_MAXDELTA; + var delta = goog.math.clamp(this.delta_, -maxDelta, maxDelta); + var view = map.getView().getView2D(); + map.render(); + ol.interaction.Interaction.zoomByDelta(map, view, -delta, this.lastAnchor_, this.duration_); + this.delta_ = 0; + this.lastAnchor_ = null; + this.startTime_ = undefined; + this.timeoutId_ = undefined +}; +goog.provide("ol.interaction.Touch"); +goog.require("goog.asserts"); +goog.require("goog.functions"); +goog.require("goog.object"); +goog.require("ol.MapBrowserEvent"); +goog.require("ol.MapBrowserEvent.EventType"); +goog.require("ol.Pixel"); +goog.require("ol.ViewHint"); +goog.require("ol.interaction.Interaction"); +ol.interaction.Touch = function() { + goog.base(this); + this.handled_ = false; + this.trackedTouches_ = {}; + this.targetTouches = [] +}; +goog.inherits(ol.interaction.Touch, ol.interaction.Interaction); +ol.interaction.Touch.centroid = function(touches) { + var length = touches.length; + var clientX = 0; + var clientY = 0; + for(var i = 0;i < length;i++) { + clientX += touches[i].clientX; + clientY += touches[i].clientY + } + return[clientX / length, clientY / length] +}; +ol.interaction.Touch.isTouchEvent_ = function(mapBrowserEvent) { + var type = mapBrowserEvent.type; + return type === ol.MapBrowserEvent.EventType.TOUCHSTART || type === ol.MapBrowserEvent.EventType.TOUCHMOVE || type === ol.MapBrowserEvent.EventType.TOUCHEND +}; +ol.interaction.Touch.prototype.updateTrackedTouches_ = function(mapBrowserEvent) { + if(ol.interaction.Touch.isTouchEvent_(mapBrowserEvent)) { + var event = mapBrowserEvent.originalEvent; + if(goog.isDef(event.targetTouches)) { + this.targetTouches = event.targetTouches + }else { + if(goog.isDef(event.pointerId)) { + if(mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHEND) { + delete this.trackedTouches_[event.pointerId] + }else { + this.trackedTouches_[event.pointerId] = event + } + this.targetTouches = goog.object.getValues(this.trackedTouches_) + }else { + goog.asserts.fail("unknown touch event model") + } + } + } +}; +ol.interaction.Touch.prototype.handleTouchMove = goog.nullFunction; +ol.interaction.Touch.prototype.handleTouchEnd = goog.functions.FALSE; +ol.interaction.Touch.prototype.handleTouchStart = goog.functions.FALSE; +ol.interaction.Touch.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + var view = mapBrowserEvent.map.getView(); + this.updateTrackedTouches_(mapBrowserEvent); + if(this.handled_) { + if(mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHMOVE) { + this.handleTouchMove(mapBrowserEvent) + }else { + if(mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHEND) { + this.handled_ = this.handleTouchEnd(mapBrowserEvent); + if(!this.handled_) { + view.setHint(ol.ViewHint.INTERACTING, -1) + } + } + } + } + if(mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHSTART) { + var handled = this.handleTouchStart(mapBrowserEvent); + if(!this.handled_ && handled) { + view.setHint(ol.ViewHint.INTERACTING, 1) + } + this.handled_ = handled + } + return true +}; +goog.provide("ol.interaction.TouchPan"); +goog.require("goog.asserts"); +goog.require("ol.Kinetic"); +goog.require("ol.Pixel"); +goog.require("ol.PreRenderFunction"); +goog.require("ol.View2D"); +goog.require("ol.coordinate"); +goog.require("ol.interaction.Touch"); +ol.interaction.TouchPan = function(opt_options) { + goog.base(this); + var options = goog.isDef(opt_options) ? opt_options : {}; + this.kinetic_ = options.kinetic; + this.kineticPreRenderFn_ = null; + this.lastCentroid = null; + this.noKinetic_ = false +}; +goog.inherits(ol.interaction.TouchPan, ol.interaction.Touch); +ol.interaction.TouchPan.prototype.handleTouchMove = function(mapBrowserEvent) { + goog.asserts.assert(this.targetTouches.length >= 1); + var centroid = ol.interaction.Touch.centroid(this.targetTouches); + if(!goog.isNull(this.lastCentroid)) { + if(this.kinetic_) { + this.kinetic_.update(centroid[0], centroid[1]) + } + var deltaX = this.lastCentroid[0] - centroid[0]; + var deltaY = centroid[1] - this.lastCentroid[1]; + var map = mapBrowserEvent.map; + var view2D = map.getView().getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + var view2DState = view2D.getView2DState(); + var center = [deltaX, deltaY]; + ol.coordinate.scale(center, view2DState.resolution); + ol.coordinate.rotate(center, view2DState.rotation); + ol.coordinate.add(center, view2DState.center); + center = view2D.constrainCenter(center); + map.render(); + view2D.setCenter(center) + } + this.lastCentroid = centroid +}; +ol.interaction.TouchPan.prototype.handleTouchEnd = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var view2D = map.getView().getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + if(this.targetTouches.length === 0) { + if(!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) { + var distance = this.kinetic_.getDistance(); + var angle = this.kinetic_.getAngle(); + var center = view2D.getCenter(); + goog.asserts.assert(goog.isDef(center)); + this.kineticPreRenderFn_ = this.kinetic_.pan(center); + map.beforeRender(this.kineticPreRenderFn_); + var centerpx = map.getPixelFromCoordinate(center); + var dest = map.getCoordinateFromPixel([centerpx[0] - distance * Math.cos(angle), centerpx[1] - distance * Math.sin(angle)]); + dest = view2D.constrainCenter(dest); + view2D.setCenter(dest) + } + map.render(); + return false + }else { + this.lastCentroid = null; + return true + } +}; +ol.interaction.TouchPan.prototype.handleTouchStart = function(mapBrowserEvent) { + if(this.targetTouches.length > 0) { + var map = mapBrowserEvent.map; + var view2D = map.getView().getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + this.lastCentroid = null; + map.render(); + if(!goog.isNull(this.kineticPreRenderFn_) && map.removePreRenderFunction(this.kineticPreRenderFn_)) { + view2D.setCenter(mapBrowserEvent.frameState.view2DState.center); + this.kineticPreRenderFn_ = null + } + if(this.kinetic_) { + this.kinetic_.begin() + } + this.noKinetic_ = this.targetTouches.length > 1; + return true + }else { + return false + } +}; +goog.provide("ol.interaction.TouchRotate"); +goog.require("goog.asserts"); +goog.require("goog.style"); +goog.require("ol.Coordinate"); +goog.require("ol.interaction.Interaction"); +goog.require("ol.interaction.Touch"); +ol.interaction.TOUCHROTATE_ANIMATION_DURATION = 250; +ol.interaction.TouchRotate = function(opt_options) { + goog.base(this); + var options = goog.isDef(opt_options) ? opt_options : {}; + this.anchor_ = null; + this.lastAngle_ = undefined; + this.rotating_ = false; + this.rotationDelta_ = 0; + this.threshold_ = goog.isDef(options.threshold) ? options.threshold : 0.3 +}; +goog.inherits(ol.interaction.TouchRotate, ol.interaction.Touch); +ol.interaction.TouchRotate.prototype.handleTouchMove = function(mapBrowserEvent) { + goog.asserts.assert(this.targetTouches.length >= 2); + var rotationDelta = 0; + var touch0 = this.targetTouches[0]; + var touch1 = this.targetTouches[1]; + var angle = Math.atan2(touch1.clientY - touch0.clientY, touch1.clientX - touch0.clientX); + if(goog.isDef(this.lastAngle_)) { + var delta = angle - this.lastAngle_; + this.rotationDelta_ += delta; + if(!this.rotating_ && Math.abs(this.rotationDelta_) > this.threshold_) { + this.rotating_ = true + } + rotationDelta = delta + } + this.lastAngle_ = angle; + var map = mapBrowserEvent.map; + var viewportPosition = goog.style.getClientPosition(map.getViewport()); + var centroid = ol.interaction.Touch.centroid(this.targetTouches); + centroid[0] -= viewportPosition.x; + centroid[1] -= viewportPosition.y; + this.anchor_ = map.getCoordinateFromPixel(centroid); + if(this.rotating_) { + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + map.render(); + ol.interaction.Interaction.rotateWithoutConstraints(map, view, view2DState.rotation + rotationDelta, this.anchor_) + } +}; +ol.interaction.TouchRotate.prototype.handleTouchEnd = function(mapBrowserEvent) { + if(this.targetTouches.length < 2) { + var map = mapBrowserEvent.map; + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + if(this.rotating_) { + ol.interaction.Interaction.rotate(map, view, view2DState.rotation, this.anchor_, ol.interaction.TOUCHROTATE_ANIMATION_DURATION) + } + return false + }else { + return true + } +}; +ol.interaction.TouchRotate.prototype.handleTouchStart = function(mapBrowserEvent) { + if(this.targetTouches.length >= 2) { + var map = mapBrowserEvent.map; + this.anchor_ = null; + this.lastAngle_ = undefined; + this.rotating_ = false; + this.rotationDelta_ = 0; + map.render(); + return true + }else { + return false + } +}; +goog.provide("ol.interaction.TouchZoom"); +goog.require("goog.asserts"); +goog.require("goog.style"); +goog.require("ol.Coordinate"); +goog.require("ol.interaction.Interaction"); +goog.require("ol.interaction.Touch"); +ol.interaction.TouchZoom = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + this.anchor_ = null; + this.duration_ = goog.isDef(options.duration) ? options.duration : 400; + this.lastDistance_ = undefined; + this.lastScaleDelta_ = 1 +}; +goog.inherits(ol.interaction.TouchZoom, ol.interaction.Touch); +ol.interaction.TouchZoom.prototype.handleTouchMove = function(mapBrowserEvent) { + goog.asserts.assert(this.targetTouches.length >= 2); + var scaleDelta = 1; + var touch0 = this.targetTouches[0]; + var touch1 = this.targetTouches[1]; + var dx = touch0.clientX - touch1.clientX; + var dy = touch0.clientY - touch1.clientY; + var distance = Math.sqrt(dx * dx + dy * dy); + if(goog.isDef(this.lastDistance_)) { + scaleDelta = this.lastDistance_ / distance + } + this.lastDistance_ = distance; + if(scaleDelta != 1) { + this.lastScaleDelta_ = scaleDelta + } + var map = mapBrowserEvent.map; + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + var viewportPosition = goog.style.getClientPosition(map.getViewport()); + var centroid = ol.interaction.Touch.centroid(this.targetTouches); + centroid[0] -= viewportPosition.x; + centroid[1] -= viewportPosition.y; + this.anchor_ = map.getCoordinateFromPixel(centroid); + map.render(); + ol.interaction.Interaction.zoomWithoutConstraints(map, view, view2DState.resolution * scaleDelta, this.anchor_) +}; +ol.interaction.TouchZoom.prototype.handleTouchEnd = function(mapBrowserEvent) { + if(this.targetTouches.length < 2) { + var map = mapBrowserEvent.map; + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + var direction = this.lastScaleDelta_ - 1; + ol.interaction.Interaction.zoom(map, view, view2DState.resolution, this.anchor_, this.duration_, direction); + return false + }else { + return true + } +}; +ol.interaction.TouchZoom.prototype.handleTouchStart = function(mapBrowserEvent) { + if(this.targetTouches.length >= 2) { + var map = mapBrowserEvent.map; + this.anchor_ = null; + this.lastDistance_ = undefined; + this.lastScaleDelta_ = 1; + map.render(); + return true + }else { + return false + } +}; +goog.provide("ol.interaction"); +goog.require("ol.Collection"); +goog.require("ol.Kinetic"); +goog.require("ol.interaction.DoubleClickZoom"); +goog.require("ol.interaction.DragPan"); +goog.require("ol.interaction.DragRotate"); +goog.require("ol.interaction.DragZoom"); +goog.require("ol.interaction.KeyboardPan"); +goog.require("ol.interaction.KeyboardZoom"); +goog.require("ol.interaction.MouseWheelZoom"); +goog.require("ol.interaction.TouchPan"); +goog.require("ol.interaction.TouchRotate"); +goog.require("ol.interaction.TouchZoom"); +ol.interaction.defaults = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var interactions = new ol.Collection; + var kinetic = new ol.Kinetic(-0.005, 0.05, 100); + var altShiftDragRotate = goog.isDef(options.altShiftDragRotate) ? options.altShiftDragRotate : true; + if(altShiftDragRotate) { + interactions.push(new ol.interaction.DragRotate) + } + var doubleClickZoom = goog.isDef(options.doubleClickZoom) ? options.doubleClickZoom : true; + if(doubleClickZoom) { + interactions.push(new ol.interaction.DoubleClickZoom({delta:options.zoomDelta, duration:options.zoomDuration})) + } + var touchPan = goog.isDef(options.touchPan) ? options.touchPan : true; + if(touchPan) { + interactions.push(new ol.interaction.TouchPan({kinetic:kinetic})) + } + var touchRotate = goog.isDef(options.touchRotate) ? options.touchRotate : true; + if(touchRotate) { + interactions.push(new ol.interaction.TouchRotate) + } + var touchZoom = goog.isDef(options.touchZoom) ? options.touchZoom : true; + if(touchZoom) { + interactions.push(new ol.interaction.TouchZoom({duration:options.zoomDuration})) + } + var dragPan = goog.isDef(options.dragPan) ? options.dragPan : true; + if(dragPan) { + interactions.push(new ol.interaction.DragPan({kinetic:kinetic})) + } + var keyboard = goog.isDef(options.keyboard) ? options.keyboard : true; + if(keyboard) { + interactions.push(new ol.interaction.KeyboardPan); + interactions.push(new ol.interaction.KeyboardZoom({delta:options.zoomDelta, duration:options.zoomDuration})) + } + var mouseWheelZoom = goog.isDef(options.mouseWheelZoom) ? options.mouseWheelZoom : true; + if(mouseWheelZoom) { + interactions.push(new ol.interaction.MouseWheelZoom({duration:options.zoomDuration})) + } + var shiftDragZoom = goog.isDef(options.shiftDragZoom) ? options.shiftDragZoom : true; + if(shiftDragZoom) { + interactions.push(new ol.interaction.DragZoom) + } + return interactions +}; +goog.provide("ol.layer.Group"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.math"); +goog.require("goog.object"); +goog.require("ol.Collection"); +goog.require("ol.CollectionEvent"); +goog.require("ol.CollectionEventType"); +goog.require("ol.Object"); +goog.require("ol.ObjectEventType"); +goog.require("ol.layer.Base"); +goog.require("ol.source.State"); +ol.layer.GroupProperty = {LAYERS:"layers"}; +ol.layer.Group = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var baseOptions = (goog.object.clone(options)); + delete baseOptions.layers; + var layers = options.layers; + goog.base(this, baseOptions); + this.listenerKeys_ = null; + goog.events.listen(this, ol.Object.getChangeEventType(ol.layer.GroupProperty.LAYERS), this.handleLayersChanged_, false, this); + if(goog.isDef(layers)) { + if(goog.isArray(layers)) { + layers = new ol.Collection(goog.array.clone(layers)) + }else { + goog.asserts.assertInstanceof(layers, ol.Collection); + layers = layers + } + }else { + layers = new ol.Collection + } + this.setLayers(layers) +}; +goog.inherits(ol.layer.Group, ol.layer.Base); +ol.layer.Group.prototype.handleLayerChange_ = function() { + if(this.getVisible()) { + this.dispatchChangeEvent() + } +}; +ol.layer.Group.prototype.handleLayersChanged_ = function(event) { + if(!goog.isNull(this.listenerKeys_)) { + goog.array.forEach(goog.object.getValues(this.listenerKeys_), goog.events.unlistenByKey); + this.listenerKeys_ = null + } + var layers = this.getLayers(); + if(goog.isDefAndNotNull(layers)) { + this.listenerKeys_ = {"add":goog.events.listen(layers, ol.CollectionEventType.ADD, this.handleLayersAdd_, false, this), "remove":goog.events.listen(layers, ol.CollectionEventType.REMOVE, this.handleLayersRemove_, false, this)}; + var layersArray = layers.getArray(); + var i, ii, layer; + for(i = 0, ii = layersArray.length;i < ii;i++) { + layer = layersArray[i]; + this.listenerKeys_[goog.getUid(layer).toString()] = goog.events.listen(layer, [ol.ObjectEventType.PROPERTYCHANGE, goog.events.EventType.CHANGE], this.handleLayerChange_, false, this) + } + } + this.dispatchChangeEvent() +}; +ol.layer.Group.prototype.handleLayersAdd_ = function(collectionEvent) { + var layer = (collectionEvent.element); + this.listenerKeys_[goog.getUid(layer).toString()] = goog.events.listen(layer, [ol.ObjectEventType.PROPERTYCHANGE, goog.events.EventType.CHANGE], this.handleLayerChange_, false, this); + this.dispatchChangeEvent() +}; +ol.layer.Group.prototype.handleLayersRemove_ = function(collectionEvent) { + var layer = (collectionEvent.element); + var key = goog.getUid(layer).toString(); + goog.events.unlistenByKey(this.listenerKeys_[key]); + delete this.listenerKeys_[key]; + this.dispatchChangeEvent() +}; +ol.layer.Group.prototype.getLayers = function() { + return(this.get(ol.layer.GroupProperty.LAYERS)) +}; +goog.exportProperty(ol.layer.Group.prototype, "getLayers", ol.layer.Group.prototype.getLayers); +ol.layer.Group.prototype.setLayers = function(layers) { + this.set(ol.layer.GroupProperty.LAYERS, layers) +}; +goog.exportProperty(ol.layer.Group.prototype, "setLayers", ol.layer.Group.prototype.setLayers); +ol.layer.Group.prototype.getLayersArray = function(opt_array) { + var array = goog.isDef(opt_array) ? opt_array : []; + this.getLayers().forEach(function(layer) { + layer.getLayersArray(array) + }); + return array +}; +ol.layer.Group.prototype.getLayerStatesArray = function(opt_obj) { + var obj = goog.isDef(opt_obj) ? opt_obj : {layers:[], layerStates:[]}; + goog.asserts.assert(obj.layers.length === obj.layerStates.length); + var pos = obj.layers.length; + this.getLayers().forEach(function(layer) { + layer.getLayerStatesArray(obj) + }); + var ownLayerState = this.getLayerState(); + var i, ii, layerState; + for(i = pos, ii = obj.layerStates.length;i < ii;i++) { + layerState = obj.layerStates[i]; + layerState.brightness = goog.math.clamp(layerState.brightness + ownLayerState.brightness, -1, 1); + layerState.contrast *= ownLayerState.contrast; + layerState.hue += ownLayerState.hue; + layerState.opacity *= ownLayerState.opacity; + layerState.saturation *= ownLayerState.saturation; + layerState.visible = layerState.visible && ownLayerState.visible; + layerState.maxResolution = Math.min(layerState.maxResolution, ownLayerState.maxResolution); + layerState.minResolution = Math.max(layerState.minResolution, ownLayerState.minResolution) + } + return obj +}; +ol.layer.Group.prototype.getSourceState = function() { + return ol.source.State.READY +}; +goog.provide("ol.math"); +goog.require("goog.asserts"); +ol.math.cosh = function(x) { + return(Math.exp(x) + Math.exp(-x)) / 2 +}; +ol.math.coth = function(x) { + var expMinusTwoX = Math.exp(-2 * x); + return(1 + expMinusTwoX) / (1 - expMinusTwoX) +}; +ol.math.csch = function(x) { + return 2 / (Math.exp(x) - Math.exp(-x)) +}; +ol.math.roundUpToPowerOfTwo = function(x) { + goog.asserts.assert(0 < x); + return Math.pow(2, Math.ceil(Math.log(x) / Math.LN2)) +}; +ol.math.sech = function(x) { + return 2 / (Math.exp(x) + Math.exp(-x)) +}; +ol.math.sinh = function(x) { + return(Math.exp(x) - Math.exp(-x)) / 2 +}; +ol.math.tanh = function(x) { + var expMinusTwoX = Math.exp(-2 * x); + return(1 - expMinusTwoX) / (1 + expMinusTwoX) +}; +goog.provide("ol.proj.EPSG3857"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("ol.math"); +goog.require("ol.proj"); +goog.require("ol.proj.Projection"); +goog.require("ol.proj.Units"); +ol.proj.EPSG3857 = function(code) { + goog.base(this, {code:code, units:ol.proj.Units.METERS, extent:ol.proj.EPSG3857.EXTENT, global:true}) +}; +goog.inherits(ol.proj.EPSG3857, ol.proj.Projection); +ol.proj.EPSG3857.RADIUS = 6378137; +ol.proj.EPSG3857.HALF_SIZE = Math.PI * ol.proj.EPSG3857.RADIUS; +ol.proj.EPSG3857.EXTENT = [-ol.proj.EPSG3857.HALF_SIZE, -ol.proj.EPSG3857.HALF_SIZE, ol.proj.EPSG3857.HALF_SIZE, ol.proj.EPSG3857.HALF_SIZE]; +ol.proj.EPSG3857.CODES = ["EPSG:3857", "EPSG:102100", "EPSG:102113", "EPSG:900913", "urn:ogc:def:crs:EPSG:6.18:3:3857"]; +ol.proj.EPSG3857.PROJECTIONS = goog.array.map(ol.proj.EPSG3857.CODES, function(code) { + return new ol.proj.EPSG3857(code) +}); +ol.proj.EPSG3857.fromEPSG4326 = function(input, opt_output, opt_dimension) { + var length = input.length, dimension = opt_dimension > 1 ? opt_dimension : 2, output = opt_output; + if(!goog.isDef(output)) { + if(dimension > 2) { + output = input.slice() + }else { + output = new Array(length) + } + } + goog.asserts.assert(output.length % dimension === 0); + for(var i = 0;i < length;i += dimension) { + output[i] = ol.proj.EPSG3857.RADIUS * Math.PI * input[i] / 180; + output[i + 1] = ol.proj.EPSG3857.RADIUS * Math.log(Math.tan(Math.PI * (input[i + 1] + 90) / 360)) + } + return output +}; +ol.proj.EPSG3857.toEPSG4326 = function(input, opt_output, opt_dimension) { + var length = input.length, dimension = opt_dimension > 1 ? opt_dimension : 2, output = opt_output; + if(!goog.isDef(output)) { + if(dimension > 2) { + output = input.slice() + }else { + output = new Array(length) + } + } + goog.asserts.assert(output.length % dimension === 0); + for(var i = 0;i < length;i += dimension) { + output[i] = 180 * input[i] / (ol.proj.EPSG3857.RADIUS * Math.PI); + output[i + 1] = 360 * Math.atan(Math.exp(input[i + 1] / ol.proj.EPSG3857.RADIUS)) / Math.PI - 90 + } + return output +}; +ol.proj.EPSG3857.prototype.getPointResolution = function(resolution, point) { + return resolution / ol.math.cosh(point[1] / ol.proj.EPSG3857.RADIUS) +}; +goog.provide("ol.proj.EPSG4326"); +goog.require("ol.proj"); +goog.require("ol.proj.Projection"); +goog.require("ol.proj.Units"); +ol.proj.EPSG4326 = function(code, opt_axisOrientation) { + goog.base(this, {code:code, units:ol.proj.Units.DEGREES, extent:ol.proj.EPSG4326.EXTENT, axisOrientation:opt_axisOrientation, global:true}) +}; +goog.inherits(ol.proj.EPSG4326, ol.proj.Projection); +ol.proj.EPSG4326.EXTENT = [-180, -90, 180, 90]; +ol.proj.EPSG4326.PROJECTIONS = [new ol.proj.EPSG4326("CRS:84"), new ol.proj.EPSG4326("EPSG:4326", "neu"), new ol.proj.EPSG4326("urn:ogc:def:crs:EPSG:6.6:4326", "neu"), new ol.proj.EPSG4326("urn:ogc:def:crs:OGC:1.3:CRS84"), new ol.proj.EPSG4326("urn:ogc:def:crs:OGC:2:84"), new ol.proj.EPSG4326("http://www.opengis.net/gml/srs/epsg.xml#4326", "neu"), new ol.proj.EPSG4326("urn:x-ogc:def:crs:EPSG:4326", "neu")]; +ol.proj.EPSG4326.prototype.getPointResolution = function(resolution, point) { + return resolution +}; +goog.provide("ol.proj.common"); +goog.require("ol.proj"); +goog.require("ol.proj.EPSG3857"); +goog.require("ol.proj.EPSG4326"); +ol.proj.common.add = function() { + ol.proj.addEquivalentProjections(ol.proj.EPSG3857.PROJECTIONS); + ol.proj.addEquivalentProjections(ol.proj.EPSG4326.PROJECTIONS); + ol.proj.addEquivalentTransforms(ol.proj.EPSG4326.PROJECTIONS, ol.proj.EPSG3857.PROJECTIONS, ol.proj.EPSG3857.fromEPSG4326, ol.proj.EPSG3857.toEPSG4326) +}; +goog.provide("ol.ImageBase"); +goog.provide("ol.ImageState"); +goog.require("goog.events.EventTarget"); +goog.require("goog.events.EventType"); +goog.require("ol.Attribution"); +goog.require("ol.Extent"); +ol.ImageState = {IDLE:0, LOADING:1, LOADED:2, ERROR:3}; +ol.ImageBase = function(extent, resolution, pixelRatio, state, attributions) { + goog.base(this); + this.attributions_ = attributions; + this.extent_ = extent; + this.pixelRatio_ = pixelRatio; + this.resolution_ = resolution; + this.state = state +}; +goog.inherits(ol.ImageBase, goog.events.EventTarget); +ol.ImageBase.prototype.dispatchChangeEvent = function() { + this.dispatchEvent(goog.events.EventType.CHANGE) +}; +ol.ImageBase.prototype.getAttributions = function() { + return this.attributions_ +}; +ol.ImageBase.prototype.getExtent = function() { + return this.extent_ +}; +ol.ImageBase.prototype.getImageElement = goog.abstractMethod; +ol.ImageBase.prototype.getPixelRatio = function() { + return this.pixelRatio_ +}; +ol.ImageBase.prototype.getResolution = function() { + return this.resolution_ +}; +ol.ImageBase.prototype.getState = function() { + return this.state +}; +ol.ImageBase.prototype.load = goog.abstractMethod; +goog.provide("ol.Image"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.object"); +goog.require("ol.ImageBase"); +goog.require("ol.ImageState"); +ol.Image = function(extent, resolution, pixelRatio, attributions, src, crossOrigin) { + goog.base(this, extent, resolution, pixelRatio, ol.ImageState.IDLE, attributions); + this.src_ = src; + this.image_ = new Image; + if(!goog.isNull(crossOrigin)) { + this.image_.crossOrigin = crossOrigin + } + this.imageByContext_ = {}; + this.imageListenerKeys_ = null; + this.state = ol.ImageState.IDLE +}; +goog.inherits(ol.Image, ol.ImageBase); +ol.Image.prototype.getImageElement = function(opt_context) { + if(goog.isDef(opt_context)) { + var image; + var key = goog.getUid(opt_context); + if(key in this.imageByContext_) { + return this.imageByContext_[key] + }else { + if(goog.object.isEmpty(this.imageByContext_)) { + image = this.image_ + }else { + image = (this.image_.cloneNode(false)) + } + } + this.imageByContext_[key] = image; + return image + }else { + return this.image_ + } +}; +ol.Image.prototype.handleImageError_ = function() { + this.state = ol.ImageState.ERROR; + this.unlistenImage_(); + this.dispatchChangeEvent() +}; +ol.Image.prototype.handleImageLoad_ = function() { + this.state = ol.ImageState.LOADED; + this.unlistenImage_(); + this.dispatchChangeEvent() +}; +ol.Image.prototype.load = function() { + if(this.state == ol.ImageState.IDLE) { + this.state = ol.ImageState.LOADING; + goog.asserts.assert(goog.isNull(this.imageListenerKeys_)); + this.imageListenerKeys_ = [goog.events.listenOnce(this.image_, goog.events.EventType.ERROR, this.handleImageError_, false, this), goog.events.listenOnce(this.image_, goog.events.EventType.LOAD, this.handleImageLoad_, false, this)]; + this.image_.src = this.src_ + } +}; +ol.Image.prototype.unlistenImage_ = function() { + goog.asserts.assert(!goog.isNull(this.imageListenerKeys_)); + goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey); + this.imageListenerKeys_ = null +}; +goog.provide("ol.tilegrid.TileGrid"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("ol.Coordinate"); +goog.require("ol.TileCoord"); +goog.require("ol.TileRange"); +goog.require("ol.array"); +goog.require("ol.extent"); +goog.require("ol.proj.METERS_PER_UNIT"); +goog.require("ol.proj.Projection"); +goog.require("ol.proj.Units"); +ol.DEFAULT_TILE_SIZE = 256; +ol.DEFAULT_MAX_ZOOM = 42; +ol.tilegrid.TileGrid = function(options) { + this.minZoom = goog.isDef(options.minZoom) ? options.minZoom : 0; + this.resolutions_ = options.resolutions; + goog.asserts.assert(goog.array.isSorted(this.resolutions_, function(a, b) { + return b - a + }, true)); + this.maxZoom = this.resolutions_.length - 1; + this.origin_ = goog.isDef(options.origin) ? options.origin : null; + this.origins_ = null; + if(goog.isDef(options.origins)) { + this.origins_ = options.origins; + goog.asserts.assert(this.origins_.length == this.maxZoom + 1) + } + goog.asserts.assert(goog.isNull(this.origin_) && !goog.isNull(this.origins_) || !goog.isNull(this.origin_) && goog.isNull(this.origins_)); + this.tileSizes_ = null; + if(goog.isDef(options.tileSizes)) { + this.tileSizes_ = options.tileSizes; + goog.asserts.assert(this.tileSizes_.length == this.maxZoom + 1) + } + this.tileSize_ = goog.isDef(options.tileSize) ? options.tileSize : goog.isNull(this.tileSizes_) ? ol.DEFAULT_TILE_SIZE : undefined; + goog.asserts.assert(!goog.isDef(this.tileSize_) && !goog.isNull(this.tileSizes_) || goog.isDef(this.tileSize_) && goog.isNull(this.tileSizes_)) +}; +ol.tilegrid.TileGrid.tmpTileCoord_ = new ol.TileCoord(0, 0, 0); +ol.tilegrid.TileGrid.prototype.createTileCoordTransform = goog.abstractMethod; +ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange = function(tileCoord, callback, opt_this, opt_tileRange, opt_extent) { + var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent); + var z = tileCoord.z - 1; + while(z >= this.minZoom) { + if(callback.call(opt_this, z, this.getTileRangeForExtentAndZ(tileCoordExtent, z, opt_tileRange))) { + return true + } + --z + } + return false +}; +ol.tilegrid.TileGrid.prototype.getMaxZoom = function() { + return this.maxZoom +}; +ol.tilegrid.TileGrid.prototype.getMinZoom = function() { + return this.minZoom +}; +ol.tilegrid.TileGrid.prototype.getOrigin = function(z) { + if(!goog.isNull(this.origin_)) { + return this.origin_ + }else { + goog.asserts.assert(!goog.isNull(this.origins_)); + goog.asserts.assert(this.minZoom <= z && z <= this.maxZoom); + return this.origins_[z] + } +}; +ol.tilegrid.TileGrid.prototype.getResolution = function(z) { + goog.asserts.assert(this.minZoom <= z && z <= this.maxZoom); + return this.resolutions_[z] +}; +ol.tilegrid.TileGrid.prototype.getResolutions = function() { + return this.resolutions_ +}; +ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange = function(tileCoord, opt_tileRange, opt_extent) { + if(tileCoord.z < this.maxZoom) { + var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent); + return this.getTileRangeForExtentAndZ(tileCoordExtent, tileCoord.z + 1, opt_tileRange) + }else { + return null + } +}; +ol.tilegrid.TileGrid.prototype.getTileRangeExtent = function(z, tileRange, opt_extent) { + var origin = this.getOrigin(z); + var resolution = this.getResolution(z); + var tileSize = this.getTileSize(z); + var minX = origin[0] + tileRange.minX * tileSize * resolution; + var maxX = origin[0] + (tileRange.maxX + 1) * tileSize * resolution; + var minY = origin[1] + tileRange.minY * tileSize * resolution; + var maxY = origin[1] + (tileRange.maxY + 1) * tileSize * resolution; + return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent) +}; +ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndResolution = function(extent, resolution, opt_tileRange) { + var tileCoord = ol.tilegrid.TileGrid.tmpTileCoord_; + this.getTileCoordForXYAndResolution_(extent[0], extent[1], resolution, false, tileCoord); + var minX = tileCoord.x; + var minY = tileCoord.y; + this.getTileCoordForXYAndResolution_(extent[2], extent[3], resolution, true, tileCoord); + return ol.TileRange.createOrUpdate(minX, tileCoord.x, minY, tileCoord.y, opt_tileRange) +}; +ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndZ = function(extent, z, opt_tileRange) { + var resolution = this.getResolution(z); + return this.getTileRangeForExtentAndResolution(extent, resolution, opt_tileRange) +}; +ol.tilegrid.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { + var origin = this.getOrigin(tileCoord.z); + var resolution = this.getResolution(tileCoord.z); + var tileSize = this.getTileSize(tileCoord.z); + return[origin[0] + (tileCoord.x + 0.5) * tileSize * resolution, origin[1] + (tileCoord.y + 0.5) * tileSize * resolution] +}; +ol.tilegrid.TileGrid.prototype.getTileCoordExtent = function(tileCoord, opt_extent) { + var origin = this.getOrigin(tileCoord.z); + var resolution = this.getResolution(tileCoord.z); + var tileSize = this.getTileSize(tileCoord.z); + var minX = origin[0] + tileCoord.x * tileSize * resolution; + var minY = origin[1] + tileCoord.y * tileSize * resolution; + var maxX = minX + tileSize * resolution; + var maxY = minY + tileSize * resolution; + return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent) +}; +ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndResolution = function(coordinate, resolution, opt_tileCoord) { + return this.getTileCoordForXYAndResolution_(coordinate[0], coordinate[1], resolution, false, opt_tileCoord) +}; +ol.tilegrid.TileGrid.prototype.getTileCoordForXYAndResolution_ = function(x, y, resolution, reverseIntersectionPolicy, opt_tileCoord) { + var z = this.getZForResolution(resolution); + var scale = resolution / this.getResolution(z); + var origin = this.getOrigin(z); + var tileSize = this.getTileSize(z); + var tileCoordX = scale * (x - origin[0]) / (resolution * tileSize); + var tileCoordY = scale * (y - origin[1]) / (resolution * tileSize); + if(reverseIntersectionPolicy) { + tileCoordX = Math.ceil(tileCoordX) - 1; + tileCoordY = Math.ceil(tileCoordY) - 1 + }else { + tileCoordX = Math.floor(tileCoordX); + tileCoordY = Math.floor(tileCoordY) + } + return ol.TileCoord.createOrUpdate(z, tileCoordX, tileCoordY, opt_tileCoord) +}; +ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndZ = function(coordinate, z, opt_tileCoord) { + var resolution = this.getResolution(z); + return this.getTileCoordForXYAndResolution_(coordinate[0], coordinate[1], resolution, false, opt_tileCoord) +}; +ol.tilegrid.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { + goog.asserts.assert(this.minZoom <= tileCoord.z && tileCoord.z <= this.maxZoom); + return this.resolutions_[tileCoord.z] +}; +ol.tilegrid.TileGrid.prototype.getTileSize = function(z) { + if(goog.isDef(this.tileSize_)) { + return this.tileSize_ + }else { + goog.asserts.assert(!goog.isNull(this.tileSizes_)); + goog.asserts.assert(this.minZoom <= z && z <= this.maxZoom); + return this.tileSizes_[z] + } +}; +ol.tilegrid.TileGrid.prototype.getZForResolution = function(resolution) { + return ol.array.linearFindNearest(this.resolutions_, resolution, 0) +}; +ol.tilegrid.getForProjection = function(projection) { + var tileGrid = projection.getDefaultTileGrid(); + if(goog.isNull(tileGrid)) { + tileGrid = ol.tilegrid.createForProjection(projection); + projection.setDefaultTileGrid(tileGrid) + } + return tileGrid +}; +ol.tilegrid.createForProjection = function(projection, opt_maxZoom, opt_tileSize) { + var projectionExtent = projection.getExtent(); + var size = goog.isNull(projectionExtent) ? 360 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] / projection.getMetersPerUnit() : Math.max(projectionExtent[2] - projectionExtent[0], projectionExtent[3] - projectionExtent[1]); + var maxZoom = goog.isDef(opt_maxZoom) ? opt_maxZoom : ol.DEFAULT_MAX_ZOOM; + var tileSize = goog.isDef(opt_tileSize) ? opt_tileSize : ol.DEFAULT_TILE_SIZE; + var resolutions = new Array(maxZoom + 1); + var maxResolution = size / tileSize; + for(var z = 0, zz = resolutions.length;z < zz;++z) { + resolutions[z] = maxResolution / Math.pow(2, z) + } + return new ol.tilegrid.TileGrid({origin:goog.isNull(projectionExtent) ? [0, 0] : ol.extent.getBottomLeft(projectionExtent), resolutions:resolutions, tileSize:tileSize}) +}; +goog.provide("ol.source.Tile"); +goog.provide("ol.source.TileOptions"); +goog.require("goog.functions"); +goog.require("ol.Attribution"); +goog.require("ol.Extent"); +goog.require("ol.Tile"); +goog.require("ol.TileCoord"); +goog.require("ol.TileRange"); +goog.require("ol.source.Source"); +goog.require("ol.tilegrid.TileGrid"); +ol.source.TileOptions; +ol.source.Tile = function(options) { + goog.base(this, {attributions:options.attributions, extent:options.extent, logo:options.logo, projection:options.projection}); + this.opaque_ = goog.isDef(options.opaque) ? options.opaque : false; + this.tileGrid = goog.isDef(options.tileGrid) ? options.tileGrid : null +}; +goog.inherits(ol.source.Tile, ol.source.Source); +ol.source.Tile.prototype.canExpireCache = goog.functions.FALSE; +ol.source.Tile.prototype.expireCache = goog.abstractMethod; +ol.source.Tile.prototype.findLoadedTiles = function(loadedTilesByZ, getTileIfLoaded, z, tileRange) { + var fullyCovered = true; + var tile, tileCoordKey, x, y; + for(x = tileRange.minX;x <= tileRange.maxX;++x) { + for(y = tileRange.minY;y <= tileRange.maxY;++y) { + tileCoordKey = this.getKeyZXY(z, x, y); + if(loadedTilesByZ[z] && loadedTilesByZ[z][tileCoordKey]) { + continue + } + tile = getTileIfLoaded(z, x, y); + if(!goog.isNull(tile)) { + if(!loadedTilesByZ[z]) { + loadedTilesByZ[z] = {} + } + loadedTilesByZ[z][tileCoordKey] = tile + }else { + fullyCovered = false + } + } + } + return fullyCovered +}; +ol.source.Tile.prototype.getGutter = function() { + return 0 +}; +ol.source.Tile.prototype.getKeyZXY = ol.TileCoord.getKeyZXY; +ol.source.Tile.prototype.getOpaque = function() { + return this.opaque_ +}; +ol.source.Tile.prototype.getResolutions = function() { + return this.tileGrid.getResolutions() +}; +ol.source.Tile.prototype.getTile = goog.abstractMethod; +ol.source.Tile.prototype.getTileGrid = function() { + return this.tileGrid +}; +ol.source.Tile.prototype.getTileGridForProjection = function(projection) { + if(goog.isNull(this.tileGrid)) { + return ol.tilegrid.getForProjection(projection) + }else { + return this.tileGrid + } +}; +ol.source.Tile.prototype.getTilePixelSize = function(z, pixelRatio, projection) { + var tileGrid = this.getTileGridForProjection(projection); + return tileGrid.getTileSize(z) +}; +ol.source.Tile.prototype.useTile = goog.nullFunction; +goog.provide("ol.renderer.Layer"); +goog.require("goog.Disposable"); +goog.require("ol.FrameState"); +goog.require("ol.Image"); +goog.require("ol.ImageState"); +goog.require("ol.Tile"); +goog.require("ol.TileRange"); +goog.require("ol.TileState"); +goog.require("ol.layer.Layer"); +goog.require("ol.layer.LayerState"); +goog.require("ol.source.Source"); +goog.require("ol.source.State"); +goog.require("ol.source.Tile"); +ol.renderer.Layer = function(mapRenderer, layer) { + goog.base(this); + this.mapRenderer_ = mapRenderer; + this.layer_ = layer +}; +goog.inherits(ol.renderer.Layer, goog.Disposable); +ol.renderer.Layer.prototype.forEachFeatureAtPixel = goog.nullFunction; +ol.renderer.Layer.prototype.getLayer = function() { + return this.layer_ +}; +ol.renderer.Layer.prototype.getMap = function() { + return this.mapRenderer_.getMap() +}; +ol.renderer.Layer.prototype.getMapRenderer = function() { + return this.mapRenderer_ +}; +ol.renderer.Layer.prototype.handleImageChange = function(event) { + var image = (event.target); + if(image.getState() === ol.ImageState.LOADED) { + this.renderIfReadyAndVisible() + } +}; +ol.renderer.Layer.prototype.prepareFrame = goog.abstractMethod; +ol.renderer.Layer.prototype.renderIfReadyAndVisible = function() { + var layer = this.getLayer(); + if(layer.getVisible() && layer.getSourceState() == ol.source.State.READY) { + this.getMap().render() + } +}; +ol.renderer.Layer.prototype.scheduleExpireCache = function(frameState, tileSource) { + if(tileSource.canExpireCache()) { + frameState.postRenderFunctions.push(goog.partial(function(tileSource, map, frameState) { + var tileSourceKey = goog.getUid(tileSource).toString(); + tileSource.expireCache(frameState.usedTiles[tileSourceKey]) + }, tileSource)) + } +}; +ol.renderer.Layer.prototype.updateAttributions = function(attributionsSet, attributions) { + if(goog.isDefAndNotNull(attributions)) { + var attribution, i, ii; + for(i = 0, ii = attributions.length;i < ii;++i) { + attribution = attributions[i]; + attributionsSet[goog.getUid(attribution).toString()] = attribution + } + } +}; +ol.renderer.Layer.prototype.updateLogos = function(frameState, source) { + var logo = source.getLogo(); + if(goog.isDef(logo)) { + frameState.logos[logo] = "" + } +}; +ol.renderer.Layer.prototype.updateUsedTiles = function(usedTiles, tileSource, z, tileRange) { + var tileSourceKey = goog.getUid(tileSource).toString(); + var zKey = z.toString(); + if(tileSourceKey in usedTiles) { + if(zKey in usedTiles[tileSourceKey]) { + usedTiles[tileSourceKey][zKey].extend(tileRange) + }else { + usedTiles[tileSourceKey][zKey] = tileRange + } + }else { + usedTiles[tileSourceKey] = {}; + usedTiles[tileSourceKey][zKey] = tileRange + } +}; +ol.renderer.Layer.prototype.createGetTileIfLoadedFunction = function(isLoadedFunction, tileSource, pixelRatio, projection) { + return function(z, x, y) { + var tile = tileSource.getTile(z, x, y, pixelRatio, projection); + return isLoadedFunction(tile) ? tile : null + } +}; +ol.renderer.Layer.prototype.snapCenterToPixel = function(center, resolution, size) { + return[resolution * (Math.round(center[0] / resolution) + size[0] % 2 / 2), resolution * (Math.round(center[1] / resolution) + size[1] % 2 / 2)] +}; +ol.renderer.Layer.prototype.manageTilePyramid = function(frameState, tileSource, tileGrid, pixelRatio, projection, extent, currentZ, preload, opt_tileCallback, opt_this) { + var tileSourceKey = goog.getUid(tileSource).toString(); + if(!(tileSourceKey in frameState.wantedTiles)) { + frameState.wantedTiles[tileSourceKey] = {} + } + var wantedTiles = frameState.wantedTiles[tileSourceKey]; + var tileQueue = frameState.tileQueue; + var minZoom = tileGrid.getMinZoom(); + var tile, tileRange, tileResolution, x, y, z; + if(!goog.isDef(preload)) { + preload = 0 + } + for(z = currentZ;z >= minZoom;--z) { + tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); + tileResolution = tileGrid.getResolution(z); + for(x = tileRange.minX;x <= tileRange.maxX;++x) { + for(y = tileRange.minY;y <= tileRange.maxY;++y) { + if(currentZ - z <= preload) { + tile = tileSource.getTile(z, x, y, pixelRatio, projection); + if(tile.getState() == ol.TileState.IDLE) { + wantedTiles[tile.tileCoord.toString()] = true; + if(!tileQueue.isKeyQueued(tile.getKey())) { + tileQueue.enqueue([tile, tileSourceKey, tileGrid.getTileCoordCenter(tile.tileCoord), tileResolution]) + } + } + if(goog.isDef(opt_tileCallback)) { + opt_tileCallback.call(opt_this, tile) + } + }else { + tileSource.useTile(z, x, y) + } + } + } + } +}; +goog.provide("ol.style.Icon"); +goog.provide("ol.style.IconAnchorOrigin"); +goog.provide("ol.style.IconAnchorUnits"); +goog.provide("ol.style.IconImageCache"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.events.EventTarget"); +goog.require("goog.events.EventType"); +goog.require("ol.style.Image"); +goog.require("ol.style.ImageState"); +ol.style.IconAnchorOrigin = {BOTTOM_LEFT:"bottom-left", BOTTOM_RIGHT:"bottom-right", TOP_LEFT:"top-left", TOP_RIGHT:"top-right"}; +ol.style.IconAnchorUnits = {FRACTION:"fraction", PIXELS:"pixels"}; +ol.style.Icon = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.anchor_ = goog.isDef(options.anchor) ? options.anchor : [0.5, 0.5]; + this.anchorOrigin_ = goog.isDef(options.anchorOrigin) ? options.anchorOrigin : ol.style.IconAnchorOrigin.TOP_LEFT; + this.anchorXUnits_ = goog.isDef(options.anchorXUnits) ? options.anchorXUnits : ol.style.IconAnchorUnits.FRACTION; + this.anchorYUnits_ = goog.isDef(options.anchorYUnits) ? options.anchorYUnits : ol.style.IconAnchorUnits.FRACTION; + var crossOrigin = goog.isDef(options.crossOrigin) ? options.crossOrigin : null; + this.iconImage_ = ol.style.IconImage_.get(options.src, crossOrigin); + this.size_ = goog.isDef(options.size) ? options.size : null; + var opacity = goog.isDef(options.opacity) ? options.opacity : 1; + var rotateWithView = goog.isDef(options.rotateWithView) ? options.rotateWithView : false; + var rotation = goog.isDef(options.rotation) ? options.rotation : 0; + var scale = goog.isDef(options.scale) ? options.scale : 1; + goog.base(this, {opacity:opacity, rotation:rotation, scale:scale, snapToPixel:undefined, rotateWithView:rotateWithView}) +}; +goog.inherits(ol.style.Icon, ol.style.Image); +ol.style.Icon.prototype.getAnchor = function() { + var anchor = this.anchor_; + var size = this.getSize(); + if(this.anchorXUnits_ == ol.style.IconAnchorUnits.FRACTION || this.anchorYUnits_ == ol.style.IconAnchorUnits.FRACTION) { + if(goog.isNull(size)) { + return null + } + anchor = this.anchor_.slice(); + if(this.anchorXUnits_ == ol.style.IconAnchorUnits.FRACTION) { + anchor[0] *= size[0] + } + if(this.anchorYUnits_ == ol.style.IconAnchorUnits.FRACTION) { + anchor[1] *= size[1] + } + } + if(this.anchorOrigin_ != ol.style.IconAnchorOrigin.TOP_LEFT) { + if(goog.isNull(size)) { + return null + } + if(anchor === this.anchor_) { + anchor = this.anchor_.slice() + } + if(this.anchorOrigin_ == ol.style.IconAnchorOrigin.TOP_RIGHT || this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_RIGHT) { + anchor[0] = -anchor[0] + size[0] + } + if(this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_LEFT || this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_RIGHT) { + anchor[1] += size[1] + } + } + return anchor +}; +ol.style.Icon.prototype.getImage = function(pixelRatio) { + return this.iconImage_.getImage(pixelRatio) +}; +ol.style.Icon.prototype.getImageState = function() { + return this.iconImage_.getImageState() +}; +ol.style.Icon.prototype.getHitDetectionImage = function(pixelRatio) { + return this.iconImage_.getHitDetectionImage(pixelRatio) +}; +ol.style.Icon.prototype.getSrc = function() { + return this.iconImage_.getSrc() +}; +ol.style.Icon.prototype.getSize = function() { + return goog.isNull(this.size_) ? this.iconImage_.getSize() : this.size_ +}; +ol.style.Icon.prototype.listenImageChange = function(listener, thisArg) { + return goog.events.listen(this.iconImage_, goog.events.EventType.CHANGE, listener, false, thisArg) +}; +ol.style.Icon.prototype.load = function() { + this.iconImage_.load() +}; +ol.style.Icon.prototype.unlistenImageChange = function(listener, thisArg) { + goog.events.unlisten(this.iconImage_, goog.events.EventType.CHANGE, listener, false, thisArg) +}; +ol.style.IconImage_ = function(src, crossOrigin) { + goog.base(this); + this.hitDetectionImage_ = null; + this.image_ = new Image; + if(!goog.isNull(crossOrigin)) { + this.image_.crossOrigin = crossOrigin + } + this.imageListenerKeys_ = null; + this.imageState_ = ol.style.ImageState.IDLE; + this.size_ = null; + this.src_ = src; + this.tainting_ = false +}; +goog.inherits(ol.style.IconImage_, goog.events.EventTarget); +ol.style.IconImage_.get = function(src, crossOrigin) { + var iconImageCache = ol.style.IconImageCache.getInstance(); + var iconImage = iconImageCache.get(src, crossOrigin); + if(goog.isNull(iconImage)) { + iconImage = new ol.style.IconImage_(src, crossOrigin); + iconImageCache.set(src, crossOrigin, iconImage) + } + return iconImage +}; +ol.style.IconImage_.prototype.determineTainting_ = function() { + var canvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas.width = 1; + canvas.height = 1; + var context = (canvas.getContext("2d")); + context.drawImage(this.image_, 0, 0); + try { + context.getImageData(0, 0, 1, 1) + }catch(e) { + this.tainting_ = true + } +}; +ol.style.IconImage_.prototype.dispatchChangeEvent_ = function() { + this.dispatchEvent(goog.events.EventType.CHANGE) +}; +ol.style.IconImage_.prototype.handleImageError_ = function() { + this.imageState_ = ol.style.ImageState.ERROR; + this.unlistenImage_(); + this.dispatchChangeEvent_() +}; +ol.style.IconImage_.prototype.handleImageLoad_ = function() { + this.imageState_ = ol.style.ImageState.LOADED; + this.size_ = [this.image_.width, this.image_.height]; + this.unlistenImage_(); + this.determineTainting_(); + this.dispatchChangeEvent_() +}; +ol.style.IconImage_.prototype.getImage = function(pixelRatio) { + return this.image_ +}; +ol.style.IconImage_.prototype.getImageState = function() { + return this.imageState_ +}; +ol.style.IconImage_.prototype.getHitDetectionImage = function(pixelRatio) { + if(goog.isNull(this.hitDetectionImage_)) { + if(this.tainting_) { + var canvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + var width = this.size_[0]; + var height = this.size_[1]; + canvas.width = width; + canvas.height = height; + var context = (canvas.getContext("2d")); + context.fillRect(0, 0, width, height); + this.hitDetectionImage_ = canvas + }else { + this.hitDetectionImage_ = this.image_ + } + } + return this.hitDetectionImage_ +}; +ol.style.IconImage_.prototype.getSize = function() { + return this.size_ +}; +ol.style.IconImage_.prototype.getSrc = function() { + return this.src_ +}; +ol.style.IconImage_.prototype.load = function() { + if(this.imageState_ == ol.style.ImageState.IDLE) { + goog.asserts.assert(goog.isDef(this.src_)); + goog.asserts.assert(goog.isNull(this.imageListenerKeys_)); + this.imageState_ = ol.style.ImageState.LOADING; + this.imageListenerKeys_ = [goog.events.listenOnce(this.image_, goog.events.EventType.ERROR, this.handleImageError_, false, this), goog.events.listenOnce(this.image_, goog.events.EventType.LOAD, this.handleImageLoad_, false, this)]; + try { + this.image_.src = this.src_ + }catch(e) { + this.handleImageError_() + } + } +}; +ol.style.IconImage_.prototype.unlistenImage_ = function() { + goog.asserts.assert(!goog.isNull(this.imageListenerKeys_)); + goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey); + this.imageListenerKeys_ = null +}; +ol.style.IconImageCache = function() { + this.cache_ = {}; + this.cacheSize_ = 0; + this.maxCacheSize_ = 32 +}; +goog.addSingletonGetter(ol.style.IconImageCache); +ol.style.IconImageCache.getKey = function(src, crossOrigin) { + goog.asserts.assert(goog.isDef(crossOrigin)); + return crossOrigin + ":" + src +}; +ol.style.IconImageCache.prototype.clear = function() { + this.cache_ = {}; + this.cacheSize_ = 0 +}; +ol.style.IconImageCache.prototype.expire = function() { + if(this.cacheSize_ > this.maxCacheSize_) { + var i = 0; + var key, iconImage; + for(key in this.cache_) { + iconImage = this.cache_[key]; + if((i++ & 3) === 0 && !goog.events.hasListener(iconImage)) { + delete this.cache_[key]; + --this.cacheSize_ + } + } + } +}; +ol.style.IconImageCache.prototype.get = function(src, crossOrigin) { + var key = ol.style.IconImageCache.getKey(src, crossOrigin); + return key in this.cache_ ? this.cache_[key] : null +}; +ol.style.IconImageCache.prototype.set = function(src, crossOrigin, iconImage) { + var key = ol.style.IconImageCache.getKey(src, crossOrigin); + this.cache_[key] = iconImage; + ++this.cacheSize_ +}; +goog.provide("ol.vec.Mat4"); +goog.require("goog.vec.Mat4"); +ol.vec.Mat4.makeTransform2D = function(mat, translateX1, translateY1, scaleX, scaleY, rotation, translateX2, translateY2) { + goog.vec.Mat4.makeIdentity(mat); + if(translateX1 !== 0 || translateY1 !== 0) { + goog.vec.Mat4.translate(mat, translateX1, translateY1, 0) + } + if(scaleX != 1 || scaleY != 1) { + goog.vec.Mat4.scale(mat, scaleX, scaleY, 1) + } + if(rotation !== 0) { + goog.vec.Mat4.rotateZ(mat, rotation) + } + if(translateX2 !== 0 || translateY2 !== 0) { + goog.vec.Mat4.translate(mat, translateX2, translateY2, 0) + } + return mat +}; +ol.vec.Mat4.equals2D = function(mat1, mat2) { + return goog.vec.Mat4.getElement(mat1, 0, 0) == goog.vec.Mat4.getElement(mat2, 0, 0) && goog.vec.Mat4.getElement(mat1, 1, 0) == goog.vec.Mat4.getElement(mat2, 1, 0) && goog.vec.Mat4.getElement(mat1, 0, 1) == goog.vec.Mat4.getElement(mat2, 0, 1) && goog.vec.Mat4.getElement(mat1, 1, 1) == goog.vec.Mat4.getElement(mat2, 1, 1) && goog.vec.Mat4.getElement(mat1, 0, 3) == goog.vec.Mat4.getElement(mat2, 0, 3) && goog.vec.Mat4.getElement(mat1, 1, 3) == goog.vec.Mat4.getElement(mat2, 1, 3) +}; +ol.vec.Mat4.multVec2 = function(mat, vec, resultVec) { + var m00 = goog.vec.Mat4.getElement(mat, 0, 0); + var m10 = goog.vec.Mat4.getElement(mat, 1, 0); + var m01 = goog.vec.Mat4.getElement(mat, 0, 1); + var m11 = goog.vec.Mat4.getElement(mat, 1, 1); + var m03 = goog.vec.Mat4.getElement(mat, 0, 3); + var m13 = goog.vec.Mat4.getElement(mat, 1, 3); + var x = vec[0], y = vec[1]; + resultVec[0] = m00 * x + m01 * y + m03; + resultVec[1] = m10 * x + m11 * y + m13; + return resultVec +}; +goog.provide("ol.renderer.Map"); +goog.require("goog.Disposable"); +goog.require("goog.asserts"); +goog.require("goog.dispose"); +goog.require("goog.object"); +goog.require("goog.vec.Mat4"); +goog.require("ol.FrameState"); +goog.require("ol.layer.Layer"); +goog.require("ol.renderer.Layer"); +goog.require("ol.style.IconImageCache"); +goog.require("ol.vec.Mat4"); +ol.renderer.Map = function(container, map) { + goog.base(this); + this.map_ = map; + this.layerRenderers_ = {} +}; +goog.inherits(ol.renderer.Map, goog.Disposable); +ol.renderer.Map.prototype.calculateMatrices2D = function(frameState) { + var view2DState = frameState.view2DState; + var coordinateToPixelMatrix = frameState.coordinateToPixelMatrix; + goog.asserts.assert(!goog.isNull(coordinateToPixelMatrix)); + ol.vec.Mat4.makeTransform2D(coordinateToPixelMatrix, frameState.size[0] / 2, frameState.size[1] / 2, 1 / view2DState.resolution, -1 / view2DState.resolution, -view2DState.rotation, -view2DState.center[0], -view2DState.center[1]); + var inverted = goog.vec.Mat4.invert(coordinateToPixelMatrix, frameState.pixelToCoordinateMatrix); + goog.asserts.assert(inverted) +}; +ol.renderer.Map.prototype.createLayerRenderer = function(layer) { + return new ol.renderer.Layer(this, layer) +}; +ol.renderer.Map.prototype.disposeInternal = function() { + goog.object.forEach(this.layerRenderers_, function(layerRenderer) { + goog.dispose(layerRenderer) + }); + goog.base(this, "disposeInternal") +}; +ol.renderer.Map.prototype.forEachFeatureAtPixel = function(coordinate, frameState, callback, thisArg, layerFilter, thisArg2) { + var layersArray = this.map_.getLayerGroup().getLayersArray(); + var i; + for(i = layersArray.length - 1;i >= 0;--i) { + var layer = layersArray[i]; + if(layer.getVisible() && layerFilter.call(thisArg2, layer)) { + var layerRenderer = this.getLayerRenderer(layer); + var result = layerRenderer.forEachFeatureAtPixel(coordinate, frameState, callback, thisArg); + if(result) { + return result + } + } + } + return undefined +}; +ol.renderer.Map.prototype.getLayerRenderer = function(layer) { + var layerKey = goog.getUid(layer).toString(); + if(layerKey in this.layerRenderers_) { + return this.layerRenderers_[layerKey] + }else { + var layerRenderer = this.createLayerRenderer(layer); + this.layerRenderers_[layerKey] = layerRenderer; + return layerRenderer + } +}; +ol.renderer.Map.prototype.getLayerRendererByKey = function(layerKey) { + goog.asserts.assert(layerKey in this.layerRenderers_); + return this.layerRenderers_[layerKey] +}; +ol.renderer.Map.prototype.getLayerRenderers = function() { + return this.layerRenderers_ +}; +ol.renderer.Map.prototype.getMap = function() { + return this.map_ +}; +ol.renderer.Map.prototype.removeLayerRendererByKey_ = function(layerKey) { + goog.asserts.assert(layerKey in this.layerRenderers_); + var layerRenderer = this.layerRenderers_[layerKey]; + delete this.layerRenderers_[layerKey]; + return layerRenderer +}; +ol.renderer.Map.prototype.renderFrame = goog.nullFunction; +ol.renderer.Map.prototype.removeUnusedLayerRenderers_ = function(map, frameState) { + var layerKey; + for(layerKey in this.layerRenderers_) { + if(goog.isNull(frameState) || !(layerKey in frameState.layerStates)) { + goog.dispose(this.removeLayerRendererByKey_(layerKey)) + } + } +}; +ol.renderer.Map.prototype.scheduleExpireIconCache = function(frameState) { + frameState.postRenderFunctions.push(function(map, frameState) { + ol.style.IconImageCache.getInstance().expire() + }) +}; +ol.renderer.Map.prototype.scheduleRemoveUnusedLayerRenderers = function(frameState) { + var layerKey; + for(layerKey in this.layerRenderers_) { + if(!(layerKey in frameState.layerStates)) { + frameState.postRenderFunctions.push(goog.bind(this.removeUnusedLayerRenderers_, this)); + return + } + } +}; +goog.provide("ol.layer.Image"); +goog.require("ol.layer.Layer"); +ol.layer.Image = function(options) { + goog.base(this, options) +}; +goog.inherits(ol.layer.Image, ol.layer.Layer); +goog.provide("ol.layer.Tile"); +goog.require("ol.layer.Layer"); +ol.layer.TileProperty = {PRELOAD:"preload", USE_INTERIM_TILES_ON_ERROR:"useInterimTilesOnError"}; +ol.layer.Tile = function(options) { + goog.base(this, options) +}; +goog.inherits(ol.layer.Tile, ol.layer.Layer); +ol.layer.Tile.prototype.getPreload = function() { + return(this.get(ol.layer.TileProperty.PRELOAD)) +}; +goog.exportProperty(ol.layer.Tile.prototype, "getPreload", ol.layer.Tile.prototype.getPreload); +ol.layer.Tile.prototype.setPreload = function(preload) { + this.set(ol.layer.TileProperty.PRELOAD, preload) +}; +goog.exportProperty(ol.layer.Tile.prototype, "setPreload", ol.layer.Tile.prototype.setPreload); +ol.layer.Tile.prototype.getUseInterimTilesOnError = function() { + return(this.get(ol.layer.TileProperty.USE_INTERIM_TILES_ON_ERROR)) +}; +goog.exportProperty(ol.layer.Tile.prototype, "getUseInterimTilesOnError", ol.layer.Tile.prototype.getUseInterimTilesOnError); +ol.layer.Tile.prototype.setUseInterimTilesOnError = function(useInterimTilesOnError) { + this.set(ol.layer.TileProperty.USE_INTERIM_TILES_ON_ERROR, useInterimTilesOnError) +}; +goog.exportProperty(ol.layer.Tile.prototype, "setUseInterimTilesOnError", ol.layer.Tile.prototype.setUseInterimTilesOnError); +goog.provide("ol.layer.Vector"); +goog.require("goog.object"); +goog.require("ol.feature"); +goog.require("ol.layer.Layer"); +ol.layer.VectorProperty = {RENDER_GEOMETRY_FUNCTIONS:"renderGeometryFunctions"}; +ol.layer.Vector = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : ({}); + var baseOptions = goog.object.clone(options); + delete baseOptions.style; + goog.base(this, (baseOptions)); + this.style_ = null; + this.styleFunction_ = undefined; + if(goog.isDef(options.style)) { + this.setStyle(options.style) + } +}; +goog.inherits(ol.layer.Vector, ol.layer.Layer); +ol.layer.Vector.prototype.getRenderGeometryFunctions = function() { + return(this.get(ol.layer.VectorProperty.RENDER_GEOMETRY_FUNCTIONS)) +}; +goog.exportProperty(ol.layer.Vector.prototype, "getRenderGeometryFunctions", ol.layer.Vector.prototype.getRenderGeometryFunctions); +ol.layer.Vector.prototype.getStyle = function() { + return this.style_ +}; +ol.layer.Vector.prototype.getStyleFunction = function() { + return this.styleFunction_ +}; +ol.layer.Vector.prototype.setRenderGeometryFunctions = function(renderGeometryFunctions) { + this.set(ol.layer.VectorProperty.RENDER_GEOMETRY_FUNCTIONS, renderGeometryFunctions) +}; +goog.exportProperty(ol.layer.Vector.prototype, "setRenderGeometryFunctions", ol.layer.Vector.prototype.setRenderGeometryFunctions); +ol.layer.Vector.prototype.setStyle = function(style) { + this.style_ = style; + this.styleFunction_ = ol.feature.createStyleFunction(style); + this.dispatchChangeEvent() +}; +goog.provide("ol.render.canvas.Immediate"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.object"); +goog.require("goog.vec.Mat4"); +goog.require("ol.BrowserFeature"); +goog.require("ol.color"); +goog.require("ol.extent"); +goog.require("ol.geom.flat"); +goog.require("ol.render.IVectorContext"); +goog.require("ol.render.canvas"); +goog.require("ol.vec.Mat4"); +ol.render.canvas.Immediate = function(context, pixelRatio, extent, transform, viewRotation) { + this.callbacksByZIndex_ = {}; + this.context_ = context; + this.pixelRatio_ = pixelRatio; + this.extent_ = extent; + this.transform_ = transform; + this.viewRotation_ = viewRotation; + this.contextFillState_ = null; + this.contextStrokeState_ = null; + this.contextTextState_ = null; + this.fillState_ = null; + this.strokeState_ = null; + this.image_ = null; + this.imageAnchorX_ = 0; + this.imageAnchorY_ = 0; + this.imageHeight_ = 0; + this.imageOpacity_ = 0; + this.imageRotateWithView_ = false; + this.imageRotation_ = 0; + this.imageScale_ = 0; + this.imageSnapToPixel_ = false; + this.imageWidth_ = 0; + this.text_ = ""; + this.textRotation_ = 0; + this.textScale_ = 0; + this.textFillState_ = null; + this.textStrokeState_ = null; + this.textState_ = null; + this.pixelCoordinates_ = []; + this.tmpLocalTransform_ = goog.vec.Mat4.createNumber() +}; +ol.render.canvas.Immediate.prototype.drawImages_ = function(flatCoordinates, offset, end, stride) { + if(goog.isNull(this.image_)) { + return + } + goog.asserts.assert(offset === 0); + goog.asserts.assert(end == flatCoordinates.length); + var pixelCoordinates = ol.geom.flat.transform2D(flatCoordinates, 2, this.transform_, this.pixelCoordinates_); + var context = this.context_; + var localTransform = this.tmpLocalTransform_; + var alpha = context.globalAlpha; + if(this.imageOpacity_ != 1) { + context.globalAlpha = alpha * this.imageOpacity_ + } + var rotation = this.imageRotation_; + if(this.imageRotateWithView_) { + rotation += this.viewRotation_ + } + var i, ii; + for(i = 0, ii = pixelCoordinates.length;i < ii;i += 2) { + var x = pixelCoordinates[i] - this.imageAnchorX_; + var y = pixelCoordinates[i + 1] - this.imageAnchorY_; + if(this.imageSnapToPixel_) { + x = x + 0.5 | 0; + y = y + 0.5 | 0 + } + if(rotation !== 0 || this.imageScale_ != 1) { + var centerX = x + this.imageAnchorX_; + var centerY = y + this.imageAnchorY_; + ol.vec.Mat4.makeTransform2D(localTransform, centerX, centerY, this.imageScale_, this.imageScale_, rotation, -centerX, -centerY); + context.setTransform(goog.vec.Mat4.getElement(localTransform, 0, 0), goog.vec.Mat4.getElement(localTransform, 1, 0), goog.vec.Mat4.getElement(localTransform, 0, 1), goog.vec.Mat4.getElement(localTransform, 1, 1), goog.vec.Mat4.getElement(localTransform, 0, 3), goog.vec.Mat4.getElement(localTransform, 1, 3)) + } + context.drawImage(this.image_, x, y, this.imageWidth_, this.imageHeight_) + } + if(rotation !== 0 || this.imageScale_ != 1) { + context.setTransform(1, 0, 0, 1, 0, 0) + } + if(this.imageOpacity_ != 1) { + context.globalAlpha = alpha + } +}; +ol.render.canvas.Immediate.prototype.drawText_ = function(flatCoordinates, offset, end, stride) { + if(goog.isNull(this.textState_) || this.text_ === "") { + return + } + if(!goog.isNull(this.textFillState_)) { + this.setContextFillState_(this.textFillState_) + } + if(!goog.isNull(this.textStrokeState_)) { + this.setContextStrokeState_(this.textStrokeState_) + } + this.setContextTextState_(this.textState_); + goog.asserts.assert(offset === 0); + goog.asserts.assert(end == flatCoordinates.length); + var pixelCoordinates = ol.geom.flat.transform2D(flatCoordinates, stride, this.transform_, this.pixelCoordinates_); + var context = this.context_; + for(;offset < end;offset += stride) { + var x = pixelCoordinates[offset]; + var y = pixelCoordinates[offset + 1]; + if(this.textRotation_ !== 0 || this.textScale_ != 1) { + var localTransform = ol.vec.Mat4.makeTransform2D(this.tmpLocalTransform_, x, y, this.textScale_, this.textScale_, this.textRotation_, -x, -y); + context.setTransform(goog.vec.Mat4.getElement(localTransform, 0, 0), goog.vec.Mat4.getElement(localTransform, 1, 0), goog.vec.Mat4.getElement(localTransform, 0, 1), goog.vec.Mat4.getElement(localTransform, 1, 1), goog.vec.Mat4.getElement(localTransform, 0, 3), goog.vec.Mat4.getElement(localTransform, 1, 3)) + } + if(!goog.isNull(this.textStrokeState_)) { + context.strokeText(this.text_, x, y) + } + if(!goog.isNull(this.textFillState_)) { + context.fillText(this.text_, x, y) + } + } + if(this.textRotation_ !== 0 || this.textScale_ != 1) { + context.setTransform(1, 0, 0, 1, 0, 0) + } +}; +ol.render.canvas.Immediate.prototype.moveToLineTo_ = function(pixelCoordinates, offset, end, close) { + var context = this.context_; + context.moveTo(pixelCoordinates[offset], pixelCoordinates[offset + 1]); + var i; + for(i = offset + 2;i < end;i += 2) { + context.lineTo(pixelCoordinates[i], pixelCoordinates[i + 1]) + } + if(close) { + context.lineTo(pixelCoordinates[offset], pixelCoordinates[offset + 1]) + } + return end +}; +ol.render.canvas.Immediate.prototype.drawRings_ = function(pixelCoordinates, offset, ends) { + var context = this.context_; + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + offset = this.moveToLineTo_(pixelCoordinates, offset, ends[i], true); + context.closePath() + } + return offset +}; +ol.render.canvas.Immediate.prototype.drawAsync = function(zIndex, callback) { + var zIndexKey = zIndex.toString(); + var callbacks = this.callbacksByZIndex_[zIndexKey]; + if(goog.isDef(callbacks)) { + callbacks.push(callback) + }else { + this.callbacksByZIndex_[zIndexKey] = [callback] + } +}; +ol.render.canvas.Immediate.prototype.drawCircleGeometry = function(circleGeometry, data) { + if(!ol.extent.intersects(this.extent_, circleGeometry.getExtent())) { + return + } + if(!goog.isNull(this.fillState_) || !goog.isNull(this.strokeState_)) { + if(!goog.isNull(this.fillState_)) { + this.setContextFillState_(this.fillState_) + } + if(!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_) + } + var pixelCoordinates = ol.geom.transformSimpleGeometry2D(circleGeometry, this.transform_, this.pixelCoordinates_); + var dx = pixelCoordinates[2] - pixelCoordinates[0]; + var dy = pixelCoordinates[3] - pixelCoordinates[1]; + var radius = Math.sqrt(dx * dx + dy * dy); + var context = this.context_; + context.beginPath(); + context.arc(pixelCoordinates[0], pixelCoordinates[1], radius, 0, 2 * Math.PI); + if(!goog.isNull(this.fillState_)) { + context.fill() + } + if(!goog.isNull(this.strokeState_)) { + context.stroke() + } + } + if(this.text_ !== "") { + this.drawText_(circleGeometry.getCenter(), 0, 2, 2) + } +}; +ol.render.canvas.Immediate.prototype.drawFeature = function(feature, style) { + var geometry = feature.getGeometry(); + if(goog.isNull(geometry) || !ol.extent.intersects(this.extent_, geometry.getExtent())) { + return + } + var zIndex = style.getZIndex(); + if(!goog.isDef(zIndex)) { + zIndex = 0 + } + this.drawAsync(zIndex, function(render) { + render.setFillStrokeStyle(style.getFill(), style.getStroke()); + render.setImageStyle(style.getImage()); + render.setTextStyle(style.getText()); + var renderGeometry = ol.render.canvas.Immediate.GEOMETRY_RENDERES_[geometry.getType()]; + goog.asserts.assert(goog.isDef(renderGeometry)); + renderGeometry.call(render, geometry, null) + }) +}; +ol.render.canvas.Immediate.prototype.drawGeometryCollectionGeometry = function(geometryCollectionGeometry, data) { + var geometries = geometryCollectionGeometry.getGeometriesArray(); + var i, ii; + for(i = 0, ii = geometries.length;i < ii;++i) { + var geometry = geometries[i]; + var geometryRenderer = ol.render.canvas.Immediate.GEOMETRY_RENDERES_[geometry.getType()]; + goog.asserts.assert(goog.isDef(geometryRenderer)); + geometryRenderer.call(this, geometry, data) + } +}; +ol.render.canvas.Immediate.prototype.drawPointGeometry = function(pointGeometry, data) { + var flatCoordinates = pointGeometry.getFlatCoordinates(); + var stride = pointGeometry.getStride(); + if(!goog.isNull(this.image_)) { + this.drawImages_(flatCoordinates, 0, flatCoordinates.length, stride) + } + if(this.text_ !== "") { + this.drawText_(flatCoordinates, 0, flatCoordinates.length, stride) + } +}; +ol.render.canvas.Immediate.prototype.drawMultiPointGeometry = function(multiPointGeometry, data) { + var flatCoordinates = multiPointGeometry.getFlatCoordinates(); + var stride = multiPointGeometry.getStride(); + if(!goog.isNull(this.image_)) { + this.drawImages_(flatCoordinates, 0, flatCoordinates.length, stride) + } + if(this.text_ !== "") { + this.drawText_(flatCoordinates, 0, flatCoordinates.length, stride) + } +}; +ol.render.canvas.Immediate.prototype.drawLineStringGeometry = function(lineStringGeometry, data) { + if(!ol.extent.intersects(this.extent_, lineStringGeometry.getExtent())) { + return + } + if(!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_); + var pixelCoordinates = ol.geom.transformSimpleGeometry2D(lineStringGeometry, this.transform_, this.pixelCoordinates_); + var context = this.context_; + context.beginPath(); + this.moveToLineTo_(pixelCoordinates, 0, pixelCoordinates.length, false); + context.stroke() + } + if(this.text_ !== "") { + var flatMidpoint = lineStringGeometry.getFlatMidpoint(); + this.drawText_(flatMidpoint, 0, 2, 2) + } +}; +ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry = function(multiLineStringGeometry, data) { + var geometryExtent = multiLineStringGeometry.getExtent(); + if(!ol.extent.intersects(this.extent_, geometryExtent)) { + return + } + var pixelCoordinates; + if(!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_); + pixelCoordinates = ol.geom.transformSimpleGeometry2D(multiLineStringGeometry, this.transform_, this.pixelCoordinates_); + var context = this.context_; + context.beginPath(); + var ends = multiLineStringGeometry.getEnds(); + var offset = 0; + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + offset = this.moveToLineTo_(pixelCoordinates, offset, ends[i], false) + } + context.stroke() + } + if(this.text_ !== "") { + var flatMidpoints = multiLineStringGeometry.getFlatMidpoints(); + this.drawText_(flatMidpoints, 0, flatMidpoints.length, 2) + } +}; +ol.render.canvas.Immediate.prototype.drawPolygonGeometry = function(polygonGeometry, data) { + if(!ol.extent.intersects(this.extent_, polygonGeometry.getExtent())) { + return + } + var pixelCoordinates; + if(!goog.isNull(this.strokeState_) || !goog.isNull(this.fillState_)) { + if(!goog.isNull(this.fillState_)) { + this.setContextFillState_(this.fillState_) + } + if(!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_) + } + pixelCoordinates = ol.geom.transformSimpleGeometry2D(polygonGeometry, this.transform_, this.pixelCoordinates_); + var context = this.context_; + context.beginPath(); + this.drawRings_(pixelCoordinates, 0, polygonGeometry.getEnds()); + if(!goog.isNull(this.fillState_)) { + context.fill() + } + if(!goog.isNull(this.strokeState_)) { + context.stroke() + } + } + if(this.text_ !== "") { + var flatInteriorPoint = polygonGeometry.getFlatInteriorPoint(); + this.drawText_(flatInteriorPoint, 0, 2, 2) + } +}; +ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry = function(multiPolygonGeometry, data) { + if(!ol.extent.intersects(this.extent_, multiPolygonGeometry.getExtent())) { + return + } + var pixelCoordinates; + if(!goog.isNull(this.strokeState_) || !goog.isNull(this.fillState_)) { + if(!goog.isNull(this.fillState_)) { + this.setContextFillState_(this.fillState_) + } + if(!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_) + } + pixelCoordinates = ol.geom.transformSimpleGeometry2D(multiPolygonGeometry, this.transform_, this.pixelCoordinates_); + var context = this.context_; + var endss = multiPolygonGeometry.getEndss(); + var offset = 0; + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + context.beginPath(); + offset = this.drawRings_(pixelCoordinates, offset, ends); + if(!goog.isNull(this.fillState_)) { + context.fill() + } + if(!goog.isNull(this.strokeState_)) { + context.stroke() + } + } + } + if(this.text_ !== "") { + var flatInteriorPoints = multiPolygonGeometry.getFlatInteriorPoints(); + this.drawText_(flatInteriorPoints, 0, flatInteriorPoints.length, 2) + } +}; +ol.render.canvas.Immediate.prototype.drawText = goog.abstractMethod; +ol.render.canvas.Immediate.prototype.flush = function() { + var zs = goog.array.map(goog.object.getKeys(this.callbacksByZIndex_), Number); + goog.array.sort(zs); + var i, ii, callbacks, j, jj; + for(i = 0, ii = zs.length;i < ii;++i) { + callbacks = this.callbacksByZIndex_[zs[i].toString()]; + for(j = 0, jj = callbacks.length;j < jj;++j) { + callbacks[j](this) + } + } +}; +ol.render.canvas.Immediate.prototype.setContextFillState_ = function(fillState) { + var context = this.context_; + var contextFillState = this.contextFillState_; + if(goog.isNull(contextFillState)) { + context.fillStyle = fillState.fillStyle; + this.contextFillState_ = {fillStyle:fillState.fillStyle} + }else { + if(contextFillState.fillStyle != fillState.fillStyle) { + contextFillState.fillStyle = context.fillStyle = fillState.fillStyle + } + } +}; +ol.render.canvas.Immediate.prototype.setContextStrokeState_ = function(strokeState) { + var context = this.context_; + var contextStrokeState = this.contextStrokeState_; + if(goog.isNull(contextStrokeState)) { + context.lineCap = strokeState.lineCap; + if(ol.BrowserFeature.HAS_CANVAS_LINE_DASH) { + context.setLineDash(strokeState.lineDash) + } + context.lineJoin = strokeState.lineJoin; + context.lineWidth = strokeState.lineWidth; + context.miterLimit = strokeState.miterLimit; + context.strokeStyle = strokeState.strokeStyle; + this.contextStrokeState_ = {lineCap:strokeState.lineCap, lineDash:strokeState.lineDash, lineJoin:strokeState.lineJoin, lineWidth:strokeState.lineWidth, miterLimit:strokeState.miterLimit, strokeStyle:strokeState.strokeStyle} + }else { + if(contextStrokeState.lineCap != strokeState.lineCap) { + contextStrokeState.lineCap = context.lineCap = strokeState.lineCap + } + if(ol.BrowserFeature.HAS_CANVAS_LINE_DASH) { + if(!goog.array.equals(contextStrokeState.lineDash, strokeState.lineDash)) { + context.setLineDash(contextStrokeState.lineDash = strokeState.lineDash) + } + } + if(contextStrokeState.lineJoin != strokeState.lineJoin) { + contextStrokeState.lineJoin = context.lineJoin = strokeState.lineJoin + } + if(contextStrokeState.lineWidth != strokeState.lineWidth) { + contextStrokeState.lineWidth = context.lineWidth = strokeState.lineWidth + } + if(contextStrokeState.miterLimit != strokeState.miterLimit) { + contextStrokeState.miterLimit = context.miterLimit = strokeState.miterLimit + } + if(contextStrokeState.strokeStyle != strokeState.strokeStyle) { + contextStrokeState.strokeStyle = context.strokeStyle = strokeState.strokeStyle + } + } +}; +ol.render.canvas.Immediate.prototype.setContextTextState_ = function(textState) { + var context = this.context_; + var contextTextState = this.contextTextState_; + if(goog.isNull(contextTextState)) { + context.font = textState.font; + context.textAlign = textState.textAlign; + context.textBaseline = textState.textBaseline; + this.contextTextState_ = {font:textState.font, textAlign:textState.textAlign, textBaseline:textState.textBaseline} + }else { + if(contextTextState.font != textState.font) { + contextTextState.font = context.font = textState.font + } + if(contextTextState.textAlign != textState.textAlign) { + contextTextState.textAlign = context.textAlign = textState.textAlign + } + if(contextTextState.textBaseline != textState.textBaseline) { + contextTextState.textBaseline = context.textBaseline = textState.textBaseline + } + } +}; +ol.render.canvas.Immediate.prototype.setFillStrokeStyle = function(fillStyle, strokeStyle) { + if(goog.isNull(fillStyle)) { + this.fillState_ = null + }else { + var fillStyleColor = fillStyle.getColor(); + this.fillState_ = {fillStyle:ol.color.asString(!goog.isNull(fillStyleColor) ? fillStyleColor : ol.render.canvas.defaultFillStyle)} + } + if(goog.isNull(strokeStyle)) { + this.strokeState_ = null + }else { + var strokeStyleColor = strokeStyle.getColor(); + var strokeStyleLineCap = strokeStyle.getLineCap(); + var strokeStyleLineDash = strokeStyle.getLineDash(); + var strokeStyleLineJoin = strokeStyle.getLineJoin(); + var strokeStyleWidth = strokeStyle.getWidth(); + var strokeStyleMiterLimit = strokeStyle.getMiterLimit(); + this.strokeState_ = {lineCap:goog.isDef(strokeStyleLineCap) ? strokeStyleLineCap : ol.render.canvas.defaultLineCap, lineDash:goog.isDefAndNotNull(strokeStyleLineDash) ? strokeStyleLineDash : ol.render.canvas.defaultLineDash, lineJoin:goog.isDef(strokeStyleLineJoin) ? strokeStyleLineJoin : ol.render.canvas.defaultLineJoin, lineWidth:this.pixelRatio_ * (goog.isDef(strokeStyleWidth) ? strokeStyleWidth : ol.render.canvas.defaultLineWidth), miterLimit:goog.isDef(strokeStyleMiterLimit) ? strokeStyleMiterLimit : + ol.render.canvas.defaultMiterLimit, strokeStyle:ol.color.asString(!goog.isNull(strokeStyleColor) ? strokeStyleColor : ol.render.canvas.defaultStrokeStyle)} + } +}; +ol.render.canvas.Immediate.prototype.setImageStyle = function(imageStyle) { + if(goog.isNull(imageStyle)) { + this.image_ = null + }else { + var imageAnchor = imageStyle.getAnchor(); + var imageImage = imageStyle.getImage(1); + var imageOpacity = imageStyle.getOpacity(); + var imageRotateWithView = imageStyle.getRotateWithView(); + var imageRotation = imageStyle.getRotation(); + var imageScale = imageStyle.getScale(); + var imageSize = imageStyle.getSize(); + var imageSnapToPixel = imageStyle.getSnapToPixel(); + goog.asserts.assert(!goog.isNull(imageAnchor)); + goog.asserts.assert(!goog.isNull(imageImage)); + goog.asserts.assert(!goog.isNull(imageSize)); + this.imageAnchorX_ = imageAnchor[0]; + this.imageAnchorY_ = imageAnchor[1]; + this.imageHeight_ = imageSize[1]; + this.image_ = imageImage; + this.imageOpacity_ = goog.isDef(imageOpacity) ? imageOpacity : 1; + this.imageRotateWithView_ = goog.isDef(imageRotateWithView) ? imageRotateWithView : false; + this.imageRotation_ = goog.isDef(imageRotation) ? imageRotation : 0; + this.imageScale_ = goog.isDef(imageScale) ? imageScale : 1; + this.imageSnapToPixel_ = goog.isDef(imageSnapToPixel) ? imageSnapToPixel : false; + this.imageWidth_ = imageSize[0] + } +}; +ol.render.canvas.Immediate.prototype.setTextStyle = function(textStyle) { + if(goog.isNull(textStyle)) { + this.text_ = "" + }else { + var textFillStyle = textStyle.getFill(); + if(goog.isNull(textFillStyle)) { + this.textFillState_ = null + }else { + var textFillStyleColor = textFillStyle.getColor(); + this.textFillState_ = {fillStyle:ol.color.asString(!goog.isNull(textFillStyleColor) ? textFillStyleColor : ol.render.canvas.defaultFillStyle)} + } + var textStrokeStyle = textStyle.getStroke(); + if(goog.isNull(textStrokeStyle)) { + this.textStrokeState_ = null + }else { + var textStrokeStyleColor = textStrokeStyle.getColor(); + var textStrokeStyleLineCap = textStrokeStyle.getLineCap(); + var textStrokeStyleLineDash = textStrokeStyle.getLineDash(); + var textStrokeStyleLineJoin = textStrokeStyle.getLineJoin(); + var textStrokeStyleWidth = textStrokeStyle.getWidth(); + var textStrokeStyleMiterLimit = textStrokeStyle.getMiterLimit(); + this.textStrokeState_ = {lineCap:goog.isDef(textStrokeStyleLineCap) ? textStrokeStyleLineCap : ol.render.canvas.defaultLineCap, lineDash:goog.isDefAndNotNull(textStrokeStyleLineDash) ? textStrokeStyleLineDash : ol.render.canvas.defaultLineDash, lineJoin:goog.isDef(textStrokeStyleLineJoin) ? textStrokeStyleLineJoin : ol.render.canvas.defaultLineJoin, lineWidth:this.pixelRatio_ * (goog.isDef(textStrokeStyleWidth) ? textStrokeStyleWidth : ol.render.canvas.defaultLineWidth), miterLimit:goog.isDef(textStrokeStyleMiterLimit) ? + textStrokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit, strokeStyle:ol.color.asString(!goog.isNull(textStrokeStyleColor) ? textStrokeStyleColor : ol.render.canvas.defaultStrokeStyle)} + } + var textFont = textStyle.getFont(); + var textRotation = textStyle.getRotation(); + var textScale = textStyle.getScale(); + var textText = textStyle.getText(); + var textTextAlign = textStyle.getTextAlign(); + var textTextBaseline = textStyle.getTextBaseline(); + this.textState_ = {font:goog.isDef(textFont) ? textFont : ol.render.canvas.defaultFont, textAlign:goog.isDef(textTextAlign) ? textTextAlign : ol.render.canvas.defaultTextAlign, textBaseline:goog.isDef(textTextBaseline) ? textTextBaseline : ol.render.canvas.defaultTextBaseline}; + this.text_ = goog.isDef(textText) ? textText : ""; + this.textRotation_ = goog.isDef(textRotation) ? textRotation : 0; + this.textScale_ = this.pixelRatio_ * (goog.isDef(textScale) ? textScale : 1) + } +}; +ol.render.canvas.Immediate.GEOMETRY_RENDERES_ = {"Point":ol.render.canvas.Immediate.prototype.drawPointGeometry, "LineString":ol.render.canvas.Immediate.prototype.drawLineStringGeometry, "Polygon":ol.render.canvas.Immediate.prototype.drawPolygonGeometry, "MultiPoint":ol.render.canvas.Immediate.prototype.drawMultiPointGeometry, "MultiLineString":ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry, "MultiPolygon":ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry, "GeometryCollection":ol.render.canvas.Immediate.prototype.drawGeometryCollectionGeometry, +"Circle":ol.render.canvas.Immediate.prototype.drawCircleGeometry}; +goog.provide("ol.renderer.canvas.Layer"); +goog.require("goog.vec.Mat4"); +goog.require("ol.layer.Layer"); +goog.require("ol.render.Event"); +goog.require("ol.render.EventType"); +goog.require("ol.render.canvas.Immediate"); +goog.require("ol.renderer.Layer"); +goog.require("ol.vec.Mat4"); +ol.renderer.canvas.Layer = function(mapRenderer, layer) { + goog.base(this, mapRenderer, layer); + this.transform_ = goog.vec.Mat4.createNumber() +}; +goog.inherits(ol.renderer.canvas.Layer, ol.renderer.Layer); +ol.renderer.canvas.Layer.prototype.composeFrame = function(frameState, layerState, context) { + this.dispatchPreComposeEvent(context, frameState); + var image = this.getImage(); + if(!goog.isNull(image)) { + var imageTransform = this.getImageTransform(); + context.globalAlpha = layerState.opacity; + if(frameState.view2DState.rotation === 0) { + var dx = goog.vec.Mat4.getElement(imageTransform, 0, 3); + var dy = goog.vec.Mat4.getElement(imageTransform, 1, 3); + var dw = image.width * goog.vec.Mat4.getElement(imageTransform, 0, 0); + var dh = image.height * goog.vec.Mat4.getElement(imageTransform, 1, 1); + context.drawImage(image, 0, 0, +image.width, +image.height, Math.round(dx), Math.round(dy), Math.round(dw), Math.round(dh)) + }else { + context.setTransform(goog.vec.Mat4.getElement(imageTransform, 0, 0), goog.vec.Mat4.getElement(imageTransform, 1, 0), goog.vec.Mat4.getElement(imageTransform, 0, 1), goog.vec.Mat4.getElement(imageTransform, 1, 1), goog.vec.Mat4.getElement(imageTransform, 0, 3), goog.vec.Mat4.getElement(imageTransform, 1, 3)); + context.drawImage(image, 0, 0); + context.setTransform(1, 0, 0, 1, 0, 0) + } + } + this.dispatchPostComposeEvent(context, frameState) +}; +ol.renderer.canvas.Layer.prototype.dispatchComposeEvent_ = function(type, context, frameState, opt_transform) { + var layer = this.getLayer(); + if(layer.hasListener(type)) { + var transform = goog.isDef(opt_transform) ? opt_transform : this.getTransform(frameState); + var render = new ol.render.canvas.Immediate(context, frameState.pixelRatio, frameState.extent, transform, frameState.view2DState.rotation); + var composeEvent = new ol.render.Event(type, layer, render, frameState, context, null); + layer.dispatchEvent(composeEvent); + render.flush() + } +}; +ol.renderer.canvas.Layer.prototype.dispatchPostComposeEvent = function(context, frameState, opt_transform) { + this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, context, frameState, opt_transform) +}; +ol.renderer.canvas.Layer.prototype.dispatchPreComposeEvent = function(context, frameState, opt_transform) { + this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, context, frameState, opt_transform) +}; +ol.renderer.canvas.Layer.prototype.dispatchRenderEvent = function(context, frameState, opt_transform) { + this.dispatchComposeEvent_(ol.render.EventType.RENDER, context, frameState, opt_transform) +}; +ol.renderer.canvas.Layer.prototype.getImage = goog.abstractMethod; +ol.renderer.canvas.Layer.prototype.getImageTransform = goog.abstractMethod; +ol.renderer.canvas.Layer.prototype.getTransform = function(frameState) { + var view2DState = frameState.view2DState; + var pixelRatio = frameState.pixelRatio; + return ol.vec.Mat4.makeTransform2D(this.transform_, pixelRatio * frameState.size[0] / 2, pixelRatio * frameState.size[1] / 2, pixelRatio / view2DState.resolution, -pixelRatio / view2DState.resolution, -view2DState.rotation, -view2DState.center[0], -view2DState.center[1]) +}; +goog.provide("ol.source.Image"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("ol.Attribution"); +goog.require("ol.Extent"); +goog.require("ol.Image"); +goog.require("ol.array"); +goog.require("ol.source.Source"); +ol.source.ImageOptions; +ol.source.Image = function(options) { + goog.base(this, {attributions:options.attributions, extent:options.extent, logo:options.logo, projection:options.projection, state:options.state}); + this.resolutions_ = goog.isDef(options.resolutions) ? options.resolutions : null; + goog.asserts.assert(goog.isNull(this.resolutions_) || goog.array.isSorted(this.resolutions_, function(a, b) { + return b - a + }, true)) +}; +goog.inherits(ol.source.Image, ol.source.Source); +ol.source.Image.prototype.getResolutions = function() { + return this.resolutions_ +}; +ol.source.Image.prototype.findNearestResolution = function(resolution) { + if(!goog.isNull(this.resolutions_)) { + var idx = ol.array.linearFindNearest(this.resolutions_, resolution, 0); + resolution = this.resolutions_[idx] + } + return resolution +}; +ol.source.Image.prototype.getImage = goog.abstractMethod; +goog.provide("ol.renderer.canvas.ImageLayer"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.vec.Mat4"); +goog.require("ol.ImageBase"); +goog.require("ol.ImageState"); +goog.require("ol.ViewHint"); +goog.require("ol.layer.Image"); +goog.require("ol.renderer.Map"); +goog.require("ol.renderer.canvas.Layer"); +goog.require("ol.source.Image"); +goog.require("ol.vec.Mat4"); +ol.renderer.canvas.ImageLayer = function(mapRenderer, imageLayer) { + goog.base(this, mapRenderer, imageLayer); + this.image_ = null; + this.imageTransform_ = goog.vec.Mat4.createNumber() +}; +goog.inherits(ol.renderer.canvas.ImageLayer, ol.renderer.canvas.Layer); +ol.renderer.canvas.ImageLayer.prototype.forEachFeatureAtPixel = function(coordinate, frameState, callback, thisArg) { + var layer = this.getLayer(); + var source = layer.getSource(); + goog.asserts.assertInstanceof(source, ol.source.Image); + var extent = frameState.extent; + var resolution = frameState.view2DState.resolution; + var rotation = frameState.view2DState.rotation; + return source.forEachFeatureAtPixel(extent, resolution, rotation, coordinate, function(feature) { + return callback.call(thisArg, feature, layer) + }) +}; +ol.renderer.canvas.ImageLayer.prototype.getImage = function() { + return goog.isNull(this.image_) ? null : this.image_.getImageElement() +}; +ol.renderer.canvas.ImageLayer.prototype.getImageTransform = function() { + return this.imageTransform_ +}; +ol.renderer.canvas.ImageLayer.prototype.prepareFrame = function(frameState, layerState) { + var pixelRatio = frameState.pixelRatio; + var view2DState = frameState.view2DState; + var viewCenter = view2DState.center; + var viewResolution = view2DState.resolution; + var viewRotation = view2DState.rotation; + var image; + var imageLayer = this.getLayer(); + goog.asserts.assertInstanceof(imageLayer, ol.layer.Image); + var imageSource = imageLayer.getSource(); + goog.asserts.assertInstanceof(imageSource, ol.source.Image); + var hints = frameState.viewHints; + if(!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) { + image = imageSource.getImage(frameState.extent, viewResolution, pixelRatio, view2DState.projection); + if(!goog.isNull(image)) { + var imageState = image.getState(); + if(imageState == ol.ImageState.IDLE) { + goog.events.listenOnce(image, goog.events.EventType.CHANGE, this.handleImageChange, false, this); + image.load() + }else { + if(imageState == ol.ImageState.LOADED) { + this.image_ = image + } + } + } + } + if(!goog.isNull(this.image_)) { + image = this.image_; + var imageExtent = image.getExtent(); + var imageResolution = image.getResolution(); + var imagePixelRatio = image.getPixelRatio(); + var scale = pixelRatio * imageResolution / (viewResolution * imagePixelRatio); + ol.vec.Mat4.makeTransform2D(this.imageTransform_, pixelRatio * frameState.size[0] / 2, pixelRatio * frameState.size[1] / 2, scale, scale, viewRotation, imagePixelRatio * (imageExtent[0] - viewCenter[0]) / imageResolution, imagePixelRatio * (viewCenter[1] - imageExtent[3]) / imageResolution); + this.updateAttributions(frameState.attributions, image.getAttributions()); + this.updateLogos(frameState, imageSource) + } +}; +goog.provide("ol.renderer.canvas.TileLayer"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.object"); +goog.require("goog.vec.Mat4"); +goog.require("ol.Size"); +goog.require("ol.Tile"); +goog.require("ol.TileCoord"); +goog.require("ol.TileRange"); +goog.require("ol.TileState"); +goog.require("ol.extent"); +goog.require("ol.layer.Tile"); +goog.require("ol.renderer.Map"); +goog.require("ol.renderer.canvas.Layer"); +goog.require("ol.source.Tile"); +goog.require("ol.vec.Mat4"); +ol.renderer.canvas.TileLayer = function(mapRenderer, tileLayer) { + goog.base(this, mapRenderer, tileLayer); + this.canvas_ = null; + this.canvasSize_ = null; + this.context_ = null; + this.imageTransform_ = goog.vec.Mat4.createNumber(); + this.renderedCanvasZ_ = NaN; + this.renderedCanvasTileRange_ = null; + this.renderedTiles_ = null +}; +goog.inherits(ol.renderer.canvas.TileLayer, ol.renderer.canvas.Layer); +ol.renderer.canvas.TileLayer.prototype.getImage = function() { + return this.canvas_ +}; +ol.renderer.canvas.TileLayer.prototype.getImageTransform = function() { + return this.imageTransform_ +}; +ol.renderer.canvas.TileLayer.prototype.prepareFrame = function(frameState, layerState) { + var pixelRatio = frameState.pixelRatio; + var view2DState = frameState.view2DState; + var projection = view2DState.projection; + var tileLayer = this.getLayer(); + goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile); + var tileSource = tileLayer.getSource(); + goog.asserts.assertInstanceof(tileSource, ol.source.Tile); + var tileGrid = tileSource.getTileGridForProjection(projection); + var tileGutter = tileSource.getGutter(); + var z = tileGrid.getZForResolution(view2DState.resolution); + var tilePixelSize = tileSource.getTilePixelSize(z, frameState.pixelRatio, projection); + var tilePixelRatio = tilePixelSize / tileGrid.getTileSize(z); + var tileResolution = tileGrid.getResolution(z); + var tilePixelResolution = tileResolution / tilePixelRatio; + var center = view2DState.center; + var extent; + if(tileResolution == view2DState.resolution) { + center = this.snapCenterToPixel(center, tileResolution, frameState.size); + extent = ol.extent.getForView2DAndSize(center, tileResolution, view2DState.rotation, frameState.size) + }else { + extent = frameState.extent + } + var tileRange = tileGrid.getTileRangeForExtentAndResolution(extent, tileResolution); + var canvasWidth = tilePixelSize * tileRange.getWidth(); + var canvasHeight = tilePixelSize * tileRange.getHeight(); + var canvas, context; + if(goog.isNull(this.canvas_)) { + goog.asserts.assert(goog.isNull(this.canvasSize_)); + goog.asserts.assert(goog.isNull(this.context_)); + goog.asserts.assert(goog.isNull(this.renderedCanvasTileRange_)); + canvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas.width = canvasWidth; + canvas.height = canvasHeight; + context = (canvas.getContext("2d")); + this.canvas_ = canvas; + this.canvasSize_ = [canvasWidth, canvasHeight]; + this.context_ = context + }else { + goog.asserts.assert(!goog.isNull(this.canvasSize_)); + goog.asserts.assert(!goog.isNull(this.context_)); + canvas = this.canvas_; + context = this.context_; + if(this.canvasSize_[0] < canvasWidth || this.canvasSize_[1] < canvasHeight) { + canvas.width = canvasWidth; + canvas.height = canvasHeight; + this.canvasSize_ = [canvasWidth, canvasHeight]; + this.renderedCanvasTileRange_ = null + }else { + canvasWidth = this.canvasSize_[0]; + canvasHeight = this.canvasSize_[1]; + if(z != this.renderedCanvasZ_ || !this.renderedCanvasTileRange_.containsTileRange(tileRange)) { + this.renderedCanvasTileRange_ = null + } + } + } + var canvasTileRange, canvasTileRangeWidth, minX, minY; + if(goog.isNull(this.renderedCanvasTileRange_)) { + canvasTileRangeWidth = canvasWidth / tilePixelSize; + var canvasTileRangeHeight = canvasHeight / tilePixelSize; + minX = tileRange.minX - Math.floor((canvasTileRangeWidth - tileRange.getWidth()) / 2); + minY = tileRange.minY - Math.floor((canvasTileRangeHeight - tileRange.getHeight()) / 2); + this.renderedCanvasZ_ = z; + this.renderedCanvasTileRange_ = new ol.TileRange(minX, minX + canvasTileRangeWidth - 1, minY, minY + canvasTileRangeHeight - 1); + this.renderedTiles_ = new Array(canvasTileRangeWidth * canvasTileRangeHeight); + canvasTileRange = this.renderedCanvasTileRange_ + }else { + canvasTileRange = this.renderedCanvasTileRange_; + canvasTileRangeWidth = canvasTileRange.getWidth() + } + goog.asserts.assert(canvasTileRange.containsTileRange(tileRange)); + var tilesToDrawByZ = {}; + tilesToDrawByZ[z] = {}; + var tilesToClear = []; + var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { + return!goog.isNull(tile) && tile.getState() == ol.TileState.LOADED + }, tileSource, pixelRatio, projection); + var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, tilesToDrawByZ, getTileIfLoaded); + var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError(); + if(!goog.isDef(useInterimTilesOnError)) { + useInterimTilesOnError = true + } + var tmpExtent = ol.extent.createEmpty(); + var tmpTileRange = new ol.TileRange(0, 0, 0, 0); + var childTileRange, fullyLoaded, tile, tileState, x, y; + for(x = tileRange.minX;x <= tileRange.maxX;++x) { + for(y = tileRange.minY;y <= tileRange.maxY;++y) { + tile = tileSource.getTile(z, x, y, pixelRatio, projection); + tileState = tile.getState(); + if(tileState == ol.TileState.LOADED || tileState == ol.TileState.EMPTY || tileState == ol.TileState.ERROR && !useInterimTilesOnError) { + tilesToDrawByZ[z][tile.tileCoord.toString()] = tile; + continue + } + fullyLoaded = tileGrid.forEachTileCoordParentTileRange(tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent); + if(!fullyLoaded) { + tilesToClear.push(tile); + childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord, tmpTileRange, tmpExtent); + if(!goog.isNull(childTileRange)) { + findLoadedTiles(z + 1, childTileRange) + } + } + } + } + var i, ii; + for(i = 0, ii = tilesToClear.length;i < ii;++i) { + tile = tilesToClear[i]; + x = tilePixelSize * (tile.tileCoord.x - canvasTileRange.minX); + y = tilePixelSize * (canvasTileRange.maxY - tile.tileCoord.y); + context.clearRect(x, y, tilePixelSize, tilePixelSize) + } + var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number); + goog.array.sort(zs); + var opaque = tileSource.getOpaque(); + var origin = ol.extent.getTopLeft(tileGrid.getTileCoordExtent(new ol.TileCoord(z, canvasTileRange.minX, canvasTileRange.maxY), tmpExtent)); + var currentZ, index, scale, tileCoordKey, tileExtent, tilesToDraw; + var ix, iy, interimTileExtent, interimTileRange, maxX, maxY; + var height, width; + for(i = 0, ii = zs.length;i < ii;++i) { + currentZ = zs[i]; + tilePixelSize = tileSource.getTilePixelSize(currentZ, pixelRatio, projection); + tilesToDraw = tilesToDrawByZ[currentZ]; + if(currentZ == z) { + for(tileCoordKey in tilesToDraw) { + tile = tilesToDraw[tileCoordKey]; + index = (tile.tileCoord.y - canvasTileRange.minY) * canvasTileRangeWidth + (tile.tileCoord.x - canvasTileRange.minX); + if(this.renderedTiles_[index] != tile) { + x = tilePixelSize * (tile.tileCoord.x - canvasTileRange.minX); + y = tilePixelSize * (canvasTileRange.maxY - tile.tileCoord.y); + tileState = tile.getState(); + if(tileState == ol.TileState.EMPTY || tileState == ol.TileState.ERROR && !useInterimTilesOnError || !opaque) { + context.clearRect(x, y, tilePixelSize, tilePixelSize) + } + if(tileState == ol.TileState.LOADED) { + context.drawImage(tile.getImage(), tileGutter, tileGutter, tilePixelSize, tilePixelSize, x, y, tilePixelSize, tilePixelSize) + } + this.renderedTiles_[index] = tile + } + } + }else { + scale = tileGrid.getResolution(currentZ) / tileResolution; + for(tileCoordKey in tilesToDraw) { + tile = tilesToDraw[tileCoordKey]; + tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent); + x = (tileExtent[0] - origin[0]) / tilePixelResolution; + y = (origin[1] - tileExtent[3]) / tilePixelResolution; + width = scale * tilePixelSize; + height = scale * tilePixelSize; + tileState = tile.getState(); + if(tileState == ol.TileState.EMPTY || !opaque) { + context.clearRect(x, y, width, height) + } + if(tileState == ol.TileState.LOADED) { + context.drawImage(tile.getImage(), tileGutter, tileGutter, tilePixelSize, tilePixelSize, x, y, width, height) + } + interimTileRange = tileGrid.getTileRangeForExtentAndZ(tileExtent, z, tmpTileRange); + minX = Math.max(interimTileRange.minX, canvasTileRange.minX); + maxX = Math.min(interimTileRange.maxX, canvasTileRange.maxX); + minY = Math.max(interimTileRange.minY, canvasTileRange.minY); + maxY = Math.min(interimTileRange.maxY, canvasTileRange.maxY); + for(ix = minX;ix <= maxX;++ix) { + for(iy = minY;iy <= maxY;++iy) { + index = (iy - canvasTileRange.minY) * canvasTileRangeWidth + (ix - canvasTileRange.minX); + this.renderedTiles_[index] = undefined + } + } + } + } + } + this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); + this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio, projection, extent, z, tileLayer.getPreload()); + this.scheduleExpireCache(frameState, tileSource); + this.updateLogos(frameState, tileSource); + ol.vec.Mat4.makeTransform2D(this.imageTransform_, pixelRatio * frameState.size[0] / 2, pixelRatio * frameState.size[1] / 2, pixelRatio * tilePixelResolution / view2DState.resolution, pixelRatio * tilePixelResolution / view2DState.resolution, view2DState.rotation, (origin[0] - center[0]) / tilePixelResolution, (center[1] - origin[1]) / tilePixelResolution) +}; +goog.provide("ol.render.IReplayGroup"); +goog.require("goog.functions"); +goog.require("ol.render.IVectorContext"); +ol.render.ReplayType = {IMAGE:"Image", LINE_STRING:"LineString", POLYGON:"Polygon", TEXT:"Text"}; +ol.render.REPLAY_ORDER = [ol.render.ReplayType.POLYGON, ol.render.ReplayType.LINE_STRING, ol.render.ReplayType.IMAGE, ol.render.ReplayType.TEXT]; +ol.render.IReplayGroup = function() { +}; +ol.render.IReplayGroup.prototype.finish = function() { +}; +ol.render.IReplayGroup.prototype.getReplay = function(zIndex, replayType) { +}; +ol.render.IReplayGroup.prototype.isEmpty = function() { +}; +goog.provide("ol.render.canvas.ReplayGroup"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.object"); +goog.require("goog.vec.Mat4"); +goog.require("ol.BrowserFeature"); +goog.require("ol.array"); +goog.require("ol.color"); +goog.require("ol.extent"); +goog.require("ol.extent.Relationship"); +goog.require("ol.geom.flat"); +goog.require("ol.geom.simplify"); +goog.require("ol.render.IReplayGroup"); +goog.require("ol.render.IVectorContext"); +goog.require("ol.render.canvas"); +goog.require("ol.vec.Mat4"); +ol.render.canvas.Instruction = {BEGIN_GEOMETRY:0, BEGIN_PATH:1, CIRCLE:2, CLOSE_PATH:3, DRAW_IMAGE:4, DRAW_TEXT:5, END_GEOMETRY:6, FILL:7, MOVE_TO_LINE_TO:8, SET_FILL_STYLE:9, SET_STROKE_STYLE:10, SET_TEXT_STYLE:11, STROKE:12}; +ol.render.canvas.Replay = function(tolerance, maxExtent) { + this.tolerance = tolerance; + this.maxExtent = maxExtent; + this.beginGeometryInstruction1_ = null; + this.beginGeometryInstruction2_ = null; + this.instructions = []; + this.coordinates = []; + this.renderedTransform_ = goog.vec.Mat4.createNumber(); + this.hitDetectionInstructions = []; + this.pixelCoordinates_ = []; + this.extent_ = ol.extent.createEmpty(); + this.tmpLocalTransform_ = goog.vec.Mat4.createNumber() +}; +ol.render.canvas.Replay.prototype.appendFlatCoordinates = function(flatCoordinates, offset, end, stride, close) { + var myEnd = this.coordinates.length; + var extent = this.maxExtent; + var lastCoord = [flatCoordinates[offset], flatCoordinates[offset + 1]]; + var nextCoord = [NaN, NaN]; + var skipped = true; + var i, lastRel, nextRel; + for(i = offset + stride;i < end;i += stride) { + nextCoord[0] = flatCoordinates[i]; + nextCoord[1] = flatCoordinates[i + 1]; + nextRel = ol.extent.coordinateRelationship(extent, nextCoord); + if(nextRel !== lastRel) { + if(skipped) { + this.coordinates[myEnd++] = lastCoord[0]; + this.coordinates[myEnd++] = lastCoord[1] + } + this.coordinates[myEnd++] = nextCoord[0]; + this.coordinates[myEnd++] = nextCoord[1]; + skipped = false + }else { + if(nextRel === ol.extent.Relationship.INTERSECTING) { + this.coordinates[myEnd++] = nextCoord[0]; + this.coordinates[myEnd++] = nextCoord[1]; + skipped = false + }else { + skipped = true + } + } + lastCoord[0] = nextCoord[0]; + lastCoord[1] = nextCoord[1]; + lastRel = nextRel + } + if(close) { + this.coordinates[myEnd++] = flatCoordinates[offset]; + this.coordinates[myEnd++] = flatCoordinates[offset + 1] + } + return myEnd +}; +ol.render.canvas.Replay.prototype.beginGeometry = function(geometry) { + this.beginGeometryInstruction1_ = [ol.render.canvas.Instruction.BEGIN_GEOMETRY, geometry, 0]; + this.instructions.push(this.beginGeometryInstruction1_); + this.beginGeometryInstruction2_ = [ol.render.canvas.Instruction.BEGIN_GEOMETRY, geometry, 0]; + this.hitDetectionInstructions.push(this.beginGeometryInstruction2_) +}; +ol.render.canvas.Replay.prototype.replay_ = function(context, pixelRatio, transform, viewRotation, renderGeometryFunction, instructions, geometryCallback) { + var pixelCoordinates; + if(ol.vec.Mat4.equals2D(transform, this.renderedTransform_)) { + pixelCoordinates = this.pixelCoordinates_ + }else { + pixelCoordinates = ol.geom.flat.transform2D(this.coordinates, 2, transform, this.pixelCoordinates_); + goog.vec.Mat4.setFromArray(this.renderedTransform_, transform); + goog.asserts.assert(pixelCoordinates === this.pixelCoordinates_) + } + var i = 0; + var ii = instructions.length; + var d = 0; + var dd; + var localTransform = this.tmpLocalTransform_; + while(i < ii) { + var instruction = instructions[i]; + var type = (instruction[0]); + var fill, geometry, stroke, text, x, y; + switch(type) { + case ol.render.canvas.Instruction.BEGIN_GEOMETRY: + geometry = (instruction[1]); + if(renderGeometryFunction(geometry)) { + ++i + }else { + i = (instruction[2]) + } + break; + case ol.render.canvas.Instruction.BEGIN_PATH: + context.beginPath(); + ++i; + break; + case ol.render.canvas.Instruction.CIRCLE: + var x1 = pixelCoordinates[d]; + var y1 = pixelCoordinates[d + 1]; + var x2 = pixelCoordinates[d + 2]; + var y2 = pixelCoordinates[d + 3]; + var dx = x2 - x1; + var dy = y2 - y1; + var r = Math.sqrt(dx * dx + dy * dy); + context.arc(x1, y1, r, 0, 2 * Math.PI, true); + d += 4; + ++i; + break; + case ol.render.canvas.Instruction.CLOSE_PATH: + context.closePath(); + ++i; + break; + case ol.render.canvas.Instruction.DRAW_IMAGE: + goog.asserts.assert(goog.isNumber(instruction[1])); + d = (instruction[1]); + goog.asserts.assert(goog.isNumber(instruction[2])); + dd = (instruction[2]); + var image = (instruction[3]); + var anchorX = (instruction[4]) * pixelRatio; + var anchorY = (instruction[5]) * pixelRatio; + var height = (instruction[6]) * pixelRatio; + var opacity = (instruction[7]); + var rotateWithView = (instruction[8]); + var rotation = (instruction[9]); + var scale = (instruction[10]); + var snapToPixel = (instruction[11]); + var width = (instruction[12]) * pixelRatio; + if(rotateWithView) { + rotation += viewRotation + } + for(;d < dd;d += 2) { + x = pixelCoordinates[d] - anchorX; + y = pixelCoordinates[d + 1] - anchorY; + if(snapToPixel) { + x = x + 0.5 | 0; + y = y + 0.5 | 0 + } + if(scale != 1 || rotation !== 0) { + var centerX = x + anchorX; + var centerY = y + anchorY; + ol.vec.Mat4.makeTransform2D(localTransform, centerX, centerY, scale, scale, rotation, -centerX, -centerY); + context.setTransform(goog.vec.Mat4.getElement(localTransform, 0, 0), goog.vec.Mat4.getElement(localTransform, 1, 0), goog.vec.Mat4.getElement(localTransform, 0, 1), goog.vec.Mat4.getElement(localTransform, 1, 1), goog.vec.Mat4.getElement(localTransform, 0, 3), goog.vec.Mat4.getElement(localTransform, 1, 3)) + } + var alpha = context.globalAlpha; + if(opacity != 1) { + context.globalAlpha = alpha * opacity + } + context.drawImage(image, x, y, width, height); + if(opacity != 1) { + context.globalAlpha = alpha + } + if(scale != 1 || rotation !== 0) { + context.setTransform(1, 0, 0, 1, 0, 0) + } + } + ++i; + break; + case ol.render.canvas.Instruction.DRAW_TEXT: + goog.asserts.assert(goog.isNumber(instruction[1])); + d = (instruction[1]); + goog.asserts.assert(goog.isNumber(instruction[2])); + dd = (instruction[2]); + goog.asserts.assert(goog.isString(instruction[3])); + text = (instruction[3]); + goog.asserts.assert(goog.isNumber(instruction[4])); + rotation = (instruction[4]); + goog.asserts.assert(goog.isNumber(instruction[5])); + scale = (instruction[5]) * pixelRatio; + goog.asserts.assert(goog.isBoolean(instruction[6])); + fill = (instruction[6]); + goog.asserts.assert(goog.isBoolean(instruction[7])); + stroke = (instruction[7]); + for(;d < dd;d += 2) { + x = pixelCoordinates[d]; + y = pixelCoordinates[d + 1]; + if(scale != 1 || rotation !== 0) { + ol.vec.Mat4.makeTransform2D(localTransform, x, y, scale, scale, rotation, -x, -y); + context.setTransform(goog.vec.Mat4.getElement(localTransform, 0, 0), goog.vec.Mat4.getElement(localTransform, 1, 0), goog.vec.Mat4.getElement(localTransform, 0, 1), goog.vec.Mat4.getElement(localTransform, 1, 1), goog.vec.Mat4.getElement(localTransform, 0, 3), goog.vec.Mat4.getElement(localTransform, 1, 3)) + } + if(stroke) { + context.strokeText(text, x, y) + } + if(fill) { + context.fillText(text, x, y) + } + if(scale != 1 || rotation !== 0) { + context.setTransform(1, 0, 0, 1, 0, 0) + } + } + ++i; + break; + case ol.render.canvas.Instruction.END_GEOMETRY: + if(goog.isDef(geometryCallback)) { + geometry = (instruction[1]); + var data = (instruction[2]); + var result = geometryCallback(geometry, data); + if(result) { + return result + } + } + ++i; + break; + case ol.render.canvas.Instruction.FILL: + context.fill(); + ++i; + break; + case ol.render.canvas.Instruction.MOVE_TO_LINE_TO: + goog.asserts.assert(goog.isNumber(instruction[1])); + d = (instruction[1]); + goog.asserts.assert(goog.isNumber(instruction[2])); + dd = (instruction[2]); + context.moveTo(pixelCoordinates[d], pixelCoordinates[d + 1]); + for(d += 2;d < dd;d += 2) { + context.lineTo(pixelCoordinates[d], pixelCoordinates[d + 1]) + } + ++i; + break; + case ol.render.canvas.Instruction.SET_FILL_STYLE: + goog.asserts.assert(goog.isString(instruction[1])); + context.fillStyle = (instruction[1]); + ++i; + break; + case ol.render.canvas.Instruction.SET_STROKE_STYLE: + goog.asserts.assert(goog.isString(instruction[1])); + goog.asserts.assert(goog.isNumber(instruction[2])); + goog.asserts.assert(goog.isString(instruction[3])); + goog.asserts.assert(goog.isString(instruction[4])); + goog.asserts.assert(goog.isNumber(instruction[5])); + goog.asserts.assert(!goog.isNull(instruction[6])); + context.strokeStyle = (instruction[1]); + context.lineWidth = (instruction[2]) * pixelRatio; + context.lineCap = (instruction[3]); + context.lineJoin = (instruction[4]); + context.miterLimit = (instruction[5]); + if(ol.BrowserFeature.HAS_CANVAS_LINE_DASH) { + context.setLineDash((instruction[6])) + } + ++i; + break; + case ol.render.canvas.Instruction.SET_TEXT_STYLE: + goog.asserts.assert(goog.isString(instruction[1])); + goog.asserts.assert(goog.isString(instruction[2])); + goog.asserts.assert(goog.isString(instruction[3])); + context.font = (instruction[1]); + context.textAlign = (instruction[2]); + context.textBaseline = (instruction[3]); + ++i; + break; + case ol.render.canvas.Instruction.STROKE: + context.stroke(); + ++i; + break; + default: + goog.asserts.fail(); + ++i; + break + } + } + goog.asserts.assert(i == instructions.length); + return undefined +}; +ol.render.canvas.Replay.prototype.replay = function(context, pixelRatio, transform, viewRotation, renderGeometryFunction) { + var instructions = this.instructions; + return this.replay_(context, pixelRatio, transform, viewRotation, renderGeometryFunction, instructions, undefined) +}; +ol.render.canvas.Replay.prototype.replayHitDetection = function(context, transform, viewRotation, renderGeometryFunction, opt_geometryCallback) { + var instructions = this.hitDetectionInstructions; + return this.replay_(context, 1, transform, viewRotation, renderGeometryFunction, instructions, opt_geometryCallback) +}; +ol.render.canvas.Replay.prototype.reverseHitDetectionInstructions_ = function() { + var hitDetectionInstructions = this.hitDetectionInstructions; + hitDetectionInstructions.reverse(); + var i; + var n = hitDetectionInstructions.length; + var instruction; + var type; + var begin = -1; + for(i = 0;i < n;++i) { + instruction = hitDetectionInstructions[i]; + type = (instruction[0]); + if(type == ol.render.canvas.Instruction.END_GEOMETRY) { + goog.asserts.assert(begin == -1); + begin = i + }else { + if(type == ol.render.canvas.Instruction.BEGIN_GEOMETRY) { + goog.asserts.assert(begin >= 0); + ol.array.reverseSubArray(this.hitDetectionInstructions, begin, i); + begin = -1 + } + } + } +}; +ol.render.canvas.Replay.prototype.drawAsync = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawCircleGeometry = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawFeature = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawGeometryCollectionGeometry = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawLineStringGeometry = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawMultiLineStringGeometry = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawPointGeometry = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawMultiPointGeometry = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawPolygonGeometry = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawMultiPolygonGeometry = goog.abstractMethod; +ol.render.canvas.Replay.prototype.drawText = goog.abstractMethod; +ol.render.canvas.Replay.prototype.endGeometry = function(geometry, data) { + goog.asserts.assert(!goog.isNull(this.beginGeometryInstruction1_)); + this.beginGeometryInstruction1_[2] = this.instructions.length; + this.beginGeometryInstruction1_ = null; + goog.asserts.assert(!goog.isNull(this.beginGeometryInstruction2_)); + this.beginGeometryInstruction2_[2] = this.hitDetectionInstructions.length; + this.beginGeometryInstruction2_ = null; + var endGeometryInstruction = [ol.render.canvas.Instruction.END_GEOMETRY, geometry, data]; + this.instructions.push(endGeometryInstruction); + this.hitDetectionInstructions.push(endGeometryInstruction) +}; +ol.render.canvas.Replay.prototype.finish = goog.nullFunction; +ol.render.canvas.Replay.prototype.getExtent = function() { + return this.extent_ +}; +ol.render.canvas.Replay.prototype.setFillStrokeStyle = goog.abstractMethod; +ol.render.canvas.Replay.prototype.setImageStyle = goog.abstractMethod; +ol.render.canvas.Replay.prototype.setTextStyle = goog.abstractMethod; +ol.render.canvas.ImageReplay = function(tolerance, maxExtent) { + goog.base(this, tolerance, maxExtent); + this.hitDetectionImage_ = null; + this.image_ = null; + this.anchorX_ = undefined; + this.anchorY_ = undefined; + this.height_ = undefined; + this.opacity_ = undefined; + this.rotateWithView_ = undefined; + this.rotation_ = undefined; + this.scale_ = undefined; + this.snapToPixel_ = undefined; + this.width_ = undefined +}; +goog.inherits(ol.render.canvas.ImageReplay, ol.render.canvas.Replay); +ol.render.canvas.ImageReplay.prototype.drawCoordinates_ = function(flatCoordinates, offset, end, stride) { + return this.appendFlatCoordinates(flatCoordinates, offset, end, stride, false) +}; +ol.render.canvas.ImageReplay.prototype.drawPointGeometry = function(pointGeometry, data) { + if(goog.isNull(this.image_)) { + return + } + goog.asserts.assert(goog.isDef(this.anchorX_)); + goog.asserts.assert(goog.isDef(this.anchorY_)); + goog.asserts.assert(goog.isDef(this.height_)); + goog.asserts.assert(goog.isDef(this.opacity_)); + goog.asserts.assert(goog.isDef(this.rotateWithView_)); + goog.asserts.assert(goog.isDef(this.rotation_)); + goog.asserts.assert(goog.isDef(this.scale_)); + goog.asserts.assert(goog.isDef(this.width_)); + ol.extent.extend(this.extent_, pointGeometry.getExtent()); + this.beginGeometry(pointGeometry); + var flatCoordinates = pointGeometry.getFlatCoordinates(); + var stride = pointGeometry.getStride(); + var myBegin = this.coordinates.length; + var myEnd = this.drawCoordinates_(flatCoordinates, 0, flatCoordinates.length, stride); + this.instructions.push([ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.image_, this.anchorX_, this.anchorY_, this.height_, this.opacity_, this.rotateWithView_, this.rotation_, this.scale_, this.snapToPixel_, this.width_]); + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.hitDetectionImage_, this.anchorX_, this.anchorY_, this.height_, this.opacity_, this.rotateWithView_, this.rotation_, this.scale_, this.snapToPixel_, this.width_]); + this.endGeometry(pointGeometry, data) +}; +ol.render.canvas.ImageReplay.prototype.drawMultiPointGeometry = function(multiPointGeometry, data) { + if(goog.isNull(this.image_)) { + return + } + goog.asserts.assert(goog.isDef(this.anchorX_)); + goog.asserts.assert(goog.isDef(this.anchorY_)); + goog.asserts.assert(goog.isDef(this.height_)); + goog.asserts.assert(goog.isDef(this.opacity_)); + goog.asserts.assert(goog.isDef(this.rotateWithView_)); + goog.asserts.assert(goog.isDef(this.rotation_)); + goog.asserts.assert(goog.isDef(this.scale_)); + goog.asserts.assert(goog.isDef(this.width_)); + ol.extent.extend(this.extent_, multiPointGeometry.getExtent()); + this.beginGeometry(multiPointGeometry); + var flatCoordinates = multiPointGeometry.getFlatCoordinates(); + var stride = multiPointGeometry.getStride(); + var myBegin = this.coordinates.length; + var myEnd = this.drawCoordinates_(flatCoordinates, 0, flatCoordinates.length, stride); + this.instructions.push([ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.image_, this.anchorX_, this.anchorY_, this.height_, this.opacity_, this.rotateWithView_, this.rotation_, this.scale_, this.snapToPixel_, this.width_]); + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.hitDetectionImage_, this.anchorX_, this.anchorY_, this.height_, this.opacity_, this.rotateWithView_, this.rotation_, this.scale_, this.snapToPixel_, this.width_]); + this.endGeometry(multiPointGeometry, data) +}; +ol.render.canvas.ImageReplay.prototype.finish = function() { + this.reverseHitDetectionInstructions_(); + this.anchorX_ = undefined; + this.anchorY_ = undefined; + this.hitDetectionImage_ = null; + this.image_ = null; + this.height_ = undefined; + this.scale_ = undefined; + this.opacity_ = undefined; + this.rotateWithView_ = undefined; + this.rotation_ = undefined; + this.snapToPixel_ = undefined; + this.width_ = undefined +}; +ol.render.canvas.ImageReplay.prototype.setImageStyle = function(imageStyle) { + goog.asserts.assert(!goog.isNull(imageStyle)); + var anchor = imageStyle.getAnchor(); + goog.asserts.assert(!goog.isNull(anchor)); + var size = imageStyle.getSize(); + goog.asserts.assert(!goog.isNull(size)); + var hitDetectionImage = imageStyle.getHitDetectionImage(1); + goog.asserts.assert(!goog.isNull(hitDetectionImage)); + var image = imageStyle.getImage(1); + goog.asserts.assert(!goog.isNull(image)); + this.anchorX_ = anchor[0]; + this.anchorY_ = anchor[1]; + this.hitDetectionImage_ = hitDetectionImage; + this.image_ = image; + this.height_ = size[1]; + this.opacity_ = imageStyle.getOpacity(); + this.rotateWithView_ = imageStyle.getRotateWithView(); + this.rotation_ = imageStyle.getRotation(); + this.scale_ = imageStyle.getScale(); + this.snapToPixel_ = imageStyle.getSnapToPixel(); + this.width_ = size[0] +}; +ol.render.canvas.LineStringReplay = function(tolerance, maxExtent) { + goog.base(this, tolerance, maxExtent); + this.state_ = {currentStrokeStyle:undefined, currentLineCap:undefined, currentLineDash:null, currentLineJoin:undefined, currentLineWidth:undefined, currentMiterLimit:undefined, lastStroke:0, strokeStyle:undefined, lineCap:undefined, lineDash:null, lineJoin:undefined, lineWidth:undefined, miterLimit:undefined} +}; +goog.inherits(ol.render.canvas.LineStringReplay, ol.render.canvas.Replay); +ol.render.canvas.LineStringReplay.prototype.drawFlatCoordinates_ = function(flatCoordinates, offset, end, stride) { + var myBegin = this.coordinates.length; + var myEnd = this.appendFlatCoordinates(flatCoordinates, offset, end, stride, false); + var moveToLineToInstruction = [ol.render.canvas.Instruction.MOVE_TO_LINE_TO, myBegin, myEnd]; + this.instructions.push(moveToLineToInstruction); + this.hitDetectionInstructions.push(moveToLineToInstruction); + return end +}; +ol.render.canvas.LineStringReplay.prototype.setStrokeStyle_ = function() { + var state = this.state_; + var strokeStyle = state.strokeStyle; + var lineCap = state.lineCap; + var lineDash = state.lineDash; + var lineJoin = state.lineJoin; + var lineWidth = state.lineWidth; + var miterLimit = state.miterLimit; + goog.asserts.assert(goog.isDef(strokeStyle)); + goog.asserts.assert(goog.isDef(lineCap)); + goog.asserts.assert(!goog.isNull(lineDash)); + goog.asserts.assert(goog.isDef(lineJoin)); + goog.asserts.assert(goog.isDef(lineWidth)); + goog.asserts.assert(goog.isDef(miterLimit)); + if(state.currentStrokeStyle != strokeStyle || state.currentLineCap != lineCap || !goog.array.equals(state.currentLineDash, lineDash) || state.currentLineJoin != lineJoin || state.currentLineWidth != lineWidth || state.currentMiterLimit != miterLimit) { + if(state.lastStroke != this.coordinates.length) { + this.instructions.push([ol.render.canvas.Instruction.STROKE]); + state.lastStroke = this.coordinates.length + } + this.instructions.push([ol.render.canvas.Instruction.SET_STROKE_STYLE, strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash], [ol.render.canvas.Instruction.BEGIN_PATH]); + state.currentStrokeStyle = strokeStyle; + state.currentLineCap = lineCap; + state.currentLineDash = lineDash; + state.currentLineJoin = lineJoin; + state.currentLineWidth = lineWidth; + state.currentMiterLimit = miterLimit + } +}; +ol.render.canvas.LineStringReplay.prototype.drawLineStringGeometry = function(lineStringGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var strokeStyle = state.strokeStyle; + var lineWidth = state.lineWidth; + if(!goog.isDef(strokeStyle) || !goog.isDef(lineWidth)) { + return + } + ol.extent.extend(this.extent_, lineStringGeometry.getExtent()); + this.setStrokeStyle_(); + this.beginGeometry(lineStringGeometry); + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.SET_STROKE_STYLE, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.miterLimit, state.lineDash], [ol.render.canvas.Instruction.BEGIN_PATH]); + var flatCoordinates = lineStringGeometry.getFlatCoordinates(); + var stride = lineStringGeometry.getStride(); + this.drawFlatCoordinates_(flatCoordinates, 0, flatCoordinates.length, stride); + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.STROKE]); + this.endGeometry(lineStringGeometry, data) +}; +ol.render.canvas.LineStringReplay.prototype.drawMultiLineStringGeometry = function(multiLineStringGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var strokeStyle = state.strokeStyle; + var lineWidth = state.lineWidth; + if(!goog.isDef(strokeStyle) || !goog.isDef(lineWidth)) { + return + } + ol.extent.extend(this.extent_, multiLineStringGeometry.getExtent()); + this.setStrokeStyle_(); + this.beginGeometry(multiLineStringGeometry); + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.SET_STROKE_STYLE, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.miterLimit, state.lineDash], [ol.render.canvas.Instruction.BEGIN_PATH]); + var ends = multiLineStringGeometry.getEnds(); + var flatCoordinates = multiLineStringGeometry.getFlatCoordinates(); + var stride = multiLineStringGeometry.getStride(); + var offset = 0; + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + offset = this.drawFlatCoordinates_(flatCoordinates, offset, ends[i], stride) + } + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.STROKE]); + this.endGeometry(multiLineStringGeometry, data) +}; +ol.render.canvas.LineStringReplay.prototype.finish = function() { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + if(state.lastStroke != this.coordinates.length) { + this.instructions.push([ol.render.canvas.Instruction.STROKE]) + } + this.reverseHitDetectionInstructions_(); + this.state_ = null +}; +ol.render.canvas.LineStringReplay.prototype.setFillStrokeStyle = function(fillStyle, strokeStyle) { + goog.asserts.assert(!goog.isNull(this.state_)); + goog.asserts.assert(goog.isNull(fillStyle)); + goog.asserts.assert(!goog.isNull(strokeStyle)); + var strokeStyleColor = strokeStyle.getColor(); + this.state_.strokeStyle = ol.color.asString(!goog.isNull(strokeStyleColor) ? strokeStyleColor : ol.render.canvas.defaultStrokeStyle); + var strokeStyleLineCap = strokeStyle.getLineCap(); + this.state_.lineCap = goog.isDef(strokeStyleLineCap) ? strokeStyleLineCap : ol.render.canvas.defaultLineCap; + var strokeStyleLineDash = strokeStyle.getLineDash(); + this.state_.lineDash = !goog.isNull(strokeStyleLineDash) ? strokeStyleLineDash : ol.render.canvas.defaultLineDash; + var strokeStyleLineJoin = strokeStyle.getLineJoin(); + this.state_.lineJoin = goog.isDef(strokeStyleLineJoin) ? strokeStyleLineJoin : ol.render.canvas.defaultLineJoin; + var strokeStyleWidth = strokeStyle.getWidth(); + this.state_.lineWidth = goog.isDef(strokeStyleWidth) ? strokeStyleWidth : ol.render.canvas.defaultLineWidth; + var strokeStyleMiterLimit = strokeStyle.getMiterLimit(); + this.state_.miterLimit = goog.isDef(strokeStyleMiterLimit) ? strokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit +}; +ol.render.canvas.PolygonReplay = function(tolerance, maxExtent) { + goog.base(this, tolerance, maxExtent); + this.state_ = {currentFillStyle:undefined, currentStrokeStyle:undefined, currentLineCap:undefined, currentLineDash:null, currentLineJoin:undefined, currentLineWidth:undefined, currentMiterLimit:undefined, fillStyle:undefined, strokeStyle:undefined, lineCap:undefined, lineDash:null, lineJoin:undefined, lineWidth:undefined, miterLimit:undefined} +}; +goog.inherits(ol.render.canvas.PolygonReplay, ol.render.canvas.Replay); +ol.render.canvas.PolygonReplay.prototype.drawFlatCoordinatess_ = function(flatCoordinates, offset, ends, stride) { + var state = this.state_; + var beginPathInstruction = [ol.render.canvas.Instruction.BEGIN_PATH]; + this.instructions.push(beginPathInstruction); + this.hitDetectionInstructions.push(beginPathInstruction); + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + var myBegin = this.coordinates.length; + var myEnd = this.appendFlatCoordinates(flatCoordinates, offset, end, stride, true); + var moveToLineToInstruction = [ol.render.canvas.Instruction.MOVE_TO_LINE_TO, myBegin, myEnd]; + var closePathInstruction = [ol.render.canvas.Instruction.CLOSE_PATH]; + this.instructions.push(moveToLineToInstruction, closePathInstruction); + this.hitDetectionInstructions.push(moveToLineToInstruction, closePathInstruction); + offset = end + } + var fillInstruction = [ol.render.canvas.Instruction.FILL]; + this.hitDetectionInstructions.push(fillInstruction); + if(goog.isDef(state.fillStyle)) { + this.instructions.push(fillInstruction) + } + if(goog.isDef(state.strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)); + var strokeInstruction = [ol.render.canvas.Instruction.STROKE]; + this.instructions.push(strokeInstruction); + this.hitDetectionInstructions.push(strokeInstruction) + } + return offset +}; +ol.render.canvas.PolygonReplay.prototype.drawCircleGeometry = function(circleGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var fillStyle = state.fillStyle; + var strokeStyle = state.strokeStyle; + if(!goog.isDef(fillStyle) && !goog.isDef(strokeStyle)) { + return + } + if(goog.isDef(strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)) + } + ol.extent.extend(this.extent_, circleGeometry.getExtent()); + this.setFillStrokeStyles_(); + this.beginGeometry(circleGeometry); + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.SET_FILL_STYLE, ol.color.asString(ol.render.canvas.defaultFillStyle)]); + if(goog.isDef(state.strokeStyle)) { + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.SET_STROKE_STYLE, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.miterLimit, state.lineDash]) + } + var flatCoordinates = circleGeometry.getFlatCoordinates(); + var stride = circleGeometry.getStride(); + this.appendFlatCoordinates(flatCoordinates, 0, flatCoordinates.length, stride, false); + var beginPathInstruction = [ol.render.canvas.Instruction.BEGIN_PATH]; + var circleInstruction = [ol.render.canvas.Instruction.CIRCLE]; + this.instructions.push(beginPathInstruction, circleInstruction); + this.hitDetectionInstructions.push(beginPathInstruction, circleInstruction); + this.endGeometry(circleGeometry, data); + var fillInstruction = [ol.render.canvas.Instruction.FILL]; + this.hitDetectionInstructions.push(fillInstruction); + if(goog.isDef(state.fillStyle)) { + this.instructions.push(fillInstruction) + } + if(goog.isDef(state.strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)); + var strokeInstruction = [ol.render.canvas.Instruction.STROKE]; + this.instructions.push(strokeInstruction); + this.hitDetectionInstructions.push(strokeInstruction) + } +}; +ol.render.canvas.PolygonReplay.prototype.drawPolygonGeometry = function(polygonGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var fillStyle = state.fillStyle; + var strokeStyle = state.strokeStyle; + if(!goog.isDef(fillStyle) && !goog.isDef(strokeStyle)) { + return + } + if(goog.isDef(strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)) + } + ol.extent.extend(this.extent_, polygonGeometry.getExtent()); + this.setFillStrokeStyles_(); + this.beginGeometry(polygonGeometry); + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.SET_FILL_STYLE, ol.color.asString(ol.render.canvas.defaultFillStyle)]); + if(goog.isDef(state.strokeStyle)) { + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.SET_STROKE_STYLE, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.miterLimit, state.lineDash]) + } + var ends = polygonGeometry.getEnds(); + var flatCoordinates = polygonGeometry.getOrientedFlatCoordinates(); + var stride = polygonGeometry.getStride(); + this.drawFlatCoordinatess_(flatCoordinates, 0, ends, stride); + this.endGeometry(polygonGeometry, data) +}; +ol.render.canvas.PolygonReplay.prototype.drawMultiPolygonGeometry = function(multiPolygonGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var fillStyle = state.fillStyle; + var strokeStyle = state.strokeStyle; + if(!goog.isDef(fillStyle) && !goog.isDef(strokeStyle)) { + return + } + if(goog.isDef(strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)) + } + ol.extent.extend(this.extent_, multiPolygonGeometry.getExtent()); + this.setFillStrokeStyles_(); + this.beginGeometry(multiPolygonGeometry); + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.SET_FILL_STYLE, ol.color.asString(ol.render.canvas.defaultFillStyle)]); + if(goog.isDef(state.strokeStyle)) { + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.SET_STROKE_STYLE, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.miterLimit, state.lineDash]) + } + var endss = multiPolygonGeometry.getEndss(); + var flatCoordinates = multiPolygonGeometry.getOrientedFlatCoordinates(); + var stride = multiPolygonGeometry.getStride(); + var offset = 0; + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + offset = this.drawFlatCoordinatess_(flatCoordinates, offset, endss[i], stride) + } + this.endGeometry(multiPolygonGeometry, data) +}; +ol.render.canvas.PolygonReplay.prototype.finish = function() { + goog.asserts.assert(!goog.isNull(this.state_)); + this.reverseHitDetectionInstructions_(); + this.state_ = null; + var tolerance = this.tolerance; + if(tolerance !== 0) { + var coordinates = this.coordinates; + var i, ii; + for(i = 0, ii = coordinates.length;i < ii;++i) { + coordinates[i] = ol.geom.simplify.snap(coordinates[i], tolerance) + } + } +}; +ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyle = function(fillStyle, strokeStyle) { + goog.asserts.assert(!goog.isNull(this.state_)); + goog.asserts.assert(!goog.isNull(fillStyle) || !goog.isNull(strokeStyle)); + var state = this.state_; + if(!goog.isNull(fillStyle)) { + var fillStyleColor = fillStyle.getColor(); + state.fillStyle = ol.color.asString(!goog.isNull(fillStyleColor) ? fillStyleColor : ol.render.canvas.defaultFillStyle) + }else { + state.fillStyle = undefined + } + if(!goog.isNull(strokeStyle)) { + var strokeStyleColor = strokeStyle.getColor(); + state.strokeStyle = ol.color.asString(!goog.isNull(strokeStyleColor) ? strokeStyleColor : ol.render.canvas.defaultStrokeStyle); + var strokeStyleLineCap = strokeStyle.getLineCap(); + state.lineCap = goog.isDef(strokeStyleLineCap) ? strokeStyleLineCap : ol.render.canvas.defaultLineCap; + var strokeStyleLineDash = strokeStyle.getLineDash(); + state.lineDash = !goog.isNull(strokeStyleLineDash) ? strokeStyleLineDash.slice() : ol.render.canvas.defaultLineDash; + var strokeStyleLineJoin = strokeStyle.getLineJoin(); + state.lineJoin = goog.isDef(strokeStyleLineJoin) ? strokeStyleLineJoin : ol.render.canvas.defaultLineJoin; + var strokeStyleWidth = strokeStyle.getWidth(); + state.lineWidth = goog.isDef(strokeStyleWidth) ? strokeStyleWidth : ol.render.canvas.defaultLineWidth; + var strokeStyleMiterLimit = strokeStyle.getMiterLimit(); + state.miterLimit = goog.isDef(strokeStyleMiterLimit) ? strokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit + }else { + state.strokeStyle = undefined; + state.lineCap = undefined; + state.lineDash = null; + state.lineJoin = undefined; + state.lineWidth = undefined; + state.miterLimit = undefined + } +}; +ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyles_ = function() { + var state = this.state_; + var fillStyle = state.fillStyle; + var strokeStyle = state.strokeStyle; + var lineCap = state.lineCap; + var lineDash = state.lineDash; + var lineJoin = state.lineJoin; + var lineWidth = state.lineWidth; + var miterLimit = state.miterLimit; + if(goog.isDef(fillStyle) && state.currentFillStyle != fillStyle) { + this.instructions.push([ol.render.canvas.Instruction.SET_FILL_STYLE, fillStyle]); + state.currentFillStyle = state.fillStyle + } + if(goog.isDef(strokeStyle)) { + goog.asserts.assert(goog.isDef(lineCap)); + goog.asserts.assert(!goog.isNull(lineDash)); + goog.asserts.assert(goog.isDef(lineJoin)); + goog.asserts.assert(goog.isDef(lineWidth)); + goog.asserts.assert(goog.isDef(miterLimit)); + if(state.currentStrokeStyle != strokeStyle || state.currentLineCap != lineCap || state.currentLineDash != lineDash || state.currentLineJoin != lineJoin || state.currentLineWidth != lineWidth || state.currentMiterLimit != miterLimit) { + this.instructions.push([ol.render.canvas.Instruction.SET_STROKE_STYLE, strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash]); + state.currentStrokeStyle = strokeStyle; + state.currentLineCap = lineCap; + state.currentLineDash = lineDash; + state.currentLineJoin = lineJoin; + state.currentLineWidth = lineWidth; + state.currentMiterLimit = miterLimit + } + } +}; +ol.render.canvas.TextReplay = function(tolerance, maxExtent) { + goog.base(this, tolerance, maxExtent); + this.replayFillState_ = null; + this.replayStrokeState_ = null; + this.replayTextState_ = null; + this.text_ = ""; + this.textRotation_ = 0; + this.textScale_ = 0; + this.textFillState_ = null; + this.textStrokeState_ = null; + this.textState_ = null +}; +goog.inherits(ol.render.canvas.TextReplay, ol.render.canvas.Replay); +ol.render.canvas.TextReplay.prototype.drawText = function(flatCoordinates, offset, end, stride, geometry, data) { + if(this.text_ === "" || goog.isNull(this.textState_) || goog.isNull(this.textFillState_) && goog.isNull(this.textStrokeState_)) { + return + } + ol.extent.extendFlatCoordinates(this.extent_, flatCoordinates, offset, end, stride); + if(!goog.isNull(this.textFillState_)) { + this.setReplayFillState_(this.textFillState_) + } + if(!goog.isNull(this.textStrokeState_)) { + this.setReplayStrokeState_(this.textStrokeState_) + } + this.setReplayTextState_(this.textState_); + this.beginGeometry(geometry); + var myBegin = this.coordinates.length; + var myEnd = this.appendFlatCoordinates(flatCoordinates, offset, end, stride, false); + var fill = !goog.isNull(this.textFillState_); + var stroke = !goog.isNull(this.textStrokeState_); + var drawTextInstruction = [ol.render.canvas.Instruction.DRAW_TEXT, myBegin, myEnd, this.text_, this.textRotation_, this.textScale_, fill, stroke]; + this.instructions.push(drawTextInstruction); + this.hitDetectionInstructions.push(drawTextInstruction); + this.endGeometry(geometry, data) +}; +ol.render.canvas.TextReplay.prototype.setReplayFillState_ = function(fillState) { + var replayFillState = this.replayFillState_; + if(!goog.isNull(replayFillState) && replayFillState.fillStyle == fillState.fillStyle) { + return + } + var setFillStyleInstruction = [ol.render.canvas.Instruction.SET_FILL_STYLE, fillState.fillStyle]; + this.instructions.push(setFillStyleInstruction); + this.hitDetectionInstructions.push(setFillStyleInstruction); + if(goog.isNull(replayFillState)) { + this.replayFillState_ = {fillStyle:fillState.fillStyle} + }else { + replayFillState.fillStyle = fillState.fillStyle + } +}; +ol.render.canvas.TextReplay.prototype.setReplayStrokeState_ = function(strokeState) { + var replayStrokeState = this.replayStrokeState_; + if(!goog.isNull(replayStrokeState) && replayStrokeState.lineCap == strokeState.lineCap && replayStrokeState.lineDash == strokeState.lineDash && replayStrokeState.lineJoin == strokeState.lineJoin && replayStrokeState.lineWidth == strokeState.lineWidth && replayStrokeState.miterLimit == strokeState.miterLimit && replayStrokeState.strokeStyle == strokeState.strokeStyle) { + return + } + var setStrokeStyleInstruction = [ol.render.canvas.Instruction.SET_STROKE_STYLE, strokeState.strokeStyle, strokeState.lineWidth, strokeState.lineCap, strokeState.lineJoin, strokeState.miterLimit, strokeState.lineDash]; + this.instructions.push(setStrokeStyleInstruction); + this.hitDetectionInstructions.push(setStrokeStyleInstruction); + if(goog.isNull(replayStrokeState)) { + this.replayStrokeState_ = {lineCap:strokeState.lineCap, lineDash:strokeState.lineDash, lineJoin:strokeState.lineJoin, lineWidth:strokeState.lineWidth, miterLimit:strokeState.miterLimit, strokeStyle:strokeState.strokeStyle} + }else { + replayStrokeState.lineCap = strokeState.lineCap; + replayStrokeState.lineDash = strokeState.lineDash; + replayStrokeState.lineJoin = strokeState.lineJoin; + replayStrokeState.lineWidth = strokeState.lineWidth; + replayStrokeState.miterLimit = strokeState.miterLimit; + replayStrokeState.strokeStyle = strokeState.strokeStyle + } +}; +ol.render.canvas.TextReplay.prototype.setReplayTextState_ = function(textState) { + var replayTextState = this.replayTextState_; + if(!goog.isNull(replayTextState) && replayTextState.font == textState.font && replayTextState.textAlign == textState.textAlign && replayTextState.textBaseline == textState.textBaseline) { + return + } + var setTextStyleInstruction = [ol.render.canvas.Instruction.SET_TEXT_STYLE, textState.font, textState.textAlign, textState.textBaseline]; + this.instructions.push(setTextStyleInstruction); + this.hitDetectionInstructions.push(setTextStyleInstruction); + if(goog.isNull(replayTextState)) { + this.replayTextState_ = {font:textState.font, textAlign:textState.textAlign, textBaseline:textState.textBaseline} + }else { + replayTextState.font = textState.font; + replayTextState.textAlign = textState.textAlign; + replayTextState.textBaseline = textState.textBaseline + } +}; +ol.render.canvas.TextReplay.prototype.setTextStyle = function(textStyle) { + if(goog.isNull(textStyle)) { + this.text_ = "" + }else { + var textFillStyle = textStyle.getFill(); + if(goog.isNull(textFillStyle)) { + this.textFillState_ = null + }else { + var textFillStyleColor = textFillStyle.getColor(); + var fillStyle = ol.color.asString(!goog.isNull(textFillStyleColor) ? textFillStyleColor : ol.render.canvas.defaultFillStyle); + if(goog.isNull(this.textFillState_)) { + this.textFillState_ = {fillStyle:fillStyle} + }else { + var textFillState = this.textFillState_; + textFillState.fillStyle = fillStyle + } + } + var textStrokeStyle = textStyle.getStroke(); + if(goog.isNull(textStrokeStyle)) { + this.textStrokeState_ = null + }else { + var textStrokeStyleColor = textStrokeStyle.getColor(); + var textStrokeStyleLineCap = textStrokeStyle.getLineCap(); + var textStrokeStyleLineDash = textStrokeStyle.getLineDash(); + var textStrokeStyleLineJoin = textStrokeStyle.getLineJoin(); + var textStrokeStyleWidth = textStrokeStyle.getWidth(); + var textStrokeStyleMiterLimit = textStrokeStyle.getMiterLimit(); + var lineCap = goog.isDef(textStrokeStyleLineCap) ? textStrokeStyleLineCap : ol.render.canvas.defaultLineCap; + var lineDash = goog.isDefAndNotNull(textStrokeStyleLineDash) ? textStrokeStyleLineDash.slice() : ol.render.canvas.defaultLineDash; + var lineJoin = goog.isDef(textStrokeStyleLineJoin) ? textStrokeStyleLineJoin : ol.render.canvas.defaultLineJoin; + var lineWidth = goog.isDef(textStrokeStyleWidth) ? textStrokeStyleWidth : ol.render.canvas.defaultLineWidth; + var miterLimit = goog.isDef(textStrokeStyleMiterLimit) ? textStrokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit; + var strokeStyle = ol.color.asString(!goog.isNull(textStrokeStyleColor) ? textStrokeStyleColor : ol.render.canvas.defaultStrokeStyle); + if(goog.isNull(this.textStrokeState_)) { + this.textStrokeState_ = {lineCap:lineCap, lineDash:lineDash, lineJoin:lineJoin, lineWidth:lineWidth, miterLimit:miterLimit, strokeStyle:strokeStyle} + }else { + var textStrokeState = this.textStrokeState_; + textStrokeState.lineCap = lineCap; + textStrokeState.lineDash = lineDash; + textStrokeState.lineJoin = lineJoin; + textStrokeState.lineWidth = lineWidth; + textStrokeState.miterLimit = miterLimit; + textStrokeState.strokeStyle = strokeStyle + } + } + var textFont = textStyle.getFont(); + var textRotation = textStyle.getRotation(); + var textScale = textStyle.getScale(); + var textText = textStyle.getText(); + var textTextAlign = textStyle.getTextAlign(); + var textTextBaseline = textStyle.getTextBaseline(); + var font = goog.isDef(textFont) ? textFont : ol.render.canvas.defaultFont; + var textAlign = goog.isDef(textTextAlign) ? textTextAlign : ol.render.canvas.defaultTextAlign; + var textBaseline = goog.isDef(textTextBaseline) ? textTextBaseline : ol.render.canvas.defaultTextBaseline; + if(goog.isNull(this.textState_)) { + this.textState_ = {font:font, textAlign:textAlign, textBaseline:textBaseline} + }else { + var textState = this.textState_; + textState.font = font; + textState.textAlign = textAlign; + textState.textBaseline = textBaseline + } + this.text_ = goog.isDef(textText) ? textText : ""; + this.textRotation_ = goog.isDef(textRotation) ? textRotation : 0; + this.textScale_ = goog.isDef(textScale) ? textScale : 1 + } +}; +ol.render.canvas.ReplayGroup = function(tolerance, maxExtent) { + this.tolerance_ = tolerance; + this.maxExtent_ = maxExtent; + this.replaysByZIndex_ = {}; + var hitDetectionCanvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + hitDetectionCanvas.width = 1; + hitDetectionCanvas.height = 1; + this.hitDetectionContext_ = (hitDetectionCanvas.getContext("2d")); + this.hitDetectionTransform_ = goog.vec.Mat4.createNumber() +}; +ol.render.canvas.ReplayGroup.prototype.replay = function(context, extent, pixelRatio, transform, viewRotation, renderGeometryFunction) { + var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); + goog.array.sort(zs); + return this.replay_(zs, context, extent, pixelRatio, transform, viewRotation, renderGeometryFunction) +}; +ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function(zs, context, extent, transform, viewRotation, renderGeometryFunction, geometryCallback) { + var i, ii, replays, replayType, replay, result; + for(i = 0, ii = zs.length;i < ii;++i) { + replays = this.replaysByZIndex_[zs[i].toString()]; + for(replayType in replays) { + replay = replays[replayType]; + if(ol.extent.intersects(extent, replay.getExtent())) { + result = replay.replayHitDetection(context, transform, viewRotation, renderGeometryFunction, geometryCallback); + if(result) { + return result + } + } + } + } + return undefined +}; +ol.render.canvas.ReplayGroup.prototype.replay_ = function(zs, context, extent, pixelRatio, transform, viewRotation, renderGeometryFunction) { + var maxExtent = this.maxExtent_; + var minX = maxExtent[0]; + var minY = maxExtent[1]; + var maxX = maxExtent[2]; + var maxY = maxExtent[3]; + var flatClipCoords = ol.geom.flat.transform2D([minX, minY, minX, maxY, maxX, maxY, maxX, minY], 2, transform); + context.save(); + context.beginPath(); + context.moveTo(flatClipCoords[0], flatClipCoords[1]); + context.lineTo(flatClipCoords[2], flatClipCoords[3]); + context.lineTo(flatClipCoords[4], flatClipCoords[5]); + context.lineTo(flatClipCoords[6], flatClipCoords[7]); + context.closePath(); + context.clip(); + var i, ii, j, jj, replays, replayType, replay, result; + for(i = 0, ii = zs.length;i < ii;++i) { + replays = this.replaysByZIndex_[zs[i].toString()]; + for(j = 0, jj = ol.render.REPLAY_ORDER.length;j < jj;++j) { + replay = replays[ol.render.REPLAY_ORDER[j]]; + if(goog.isDef(replay) && ol.extent.intersects(extent, replay.getExtent())) { + result = replay.replay(context, pixelRatio, transform, viewRotation, renderGeometryFunction); + if(result) { + return result + } + } + } + } + context.restore(); + return undefined +}; +ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function(extent, resolution, rotation, coordinate, renderGeometryFunction, callback) { + var transform = this.hitDetectionTransform_; + ol.vec.Mat4.makeTransform2D(transform, 0.5, 0.5, 1 / resolution, -1 / resolution, -rotation, -coordinate[0], -coordinate[1]); + var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); + goog.array.sort(zs, function(a, b) { + return b - a + }); + var context = this.hitDetectionContext_; + context.clearRect(0, 0, 1, 1); + return this.replayHitDetection_(zs, context, extent, transform, rotation, renderGeometryFunction, function(geometry, data) { + var imageData = context.getImageData(0, 0, 1, 1).data; + if(imageData[3] > 0) { + var result = callback(geometry, data); + if(result) { + return result + } + context.clearRect(0, 0, 1, 1) + } + }) +}; +ol.render.canvas.ReplayGroup.prototype.finish = function() { + var zKey; + for(zKey in this.replaysByZIndex_) { + var replays = this.replaysByZIndex_[zKey]; + var replayKey; + for(replayKey in replays) { + replays[replayKey].finish() + } + } +}; +ol.render.canvas.ReplayGroup.prototype.getReplay = function(zIndex, replayType) { + var zIndexKey = goog.isDef(zIndex) ? zIndex.toString() : "0"; + var replays = this.replaysByZIndex_[zIndexKey]; + if(!goog.isDef(replays)) { + replays = {}; + this.replaysByZIndex_[zIndexKey] = replays + } + var replay = replays[replayType]; + if(!goog.isDef(replay)) { + var Constructor = ol.render.canvas.BATCH_CONSTRUCTORS_[replayType]; + goog.asserts.assert(goog.isDef(Constructor)); + replay = new Constructor(this.tolerance_, this.maxExtent_); + replays[replayType] = replay + } + return replay +}; +ol.render.canvas.ReplayGroup.prototype.isEmpty = function() { + return goog.object.isEmpty(this.replaysByZIndex_) +}; +ol.render.canvas.BATCH_CONSTRUCTORS_ = {"Image":ol.render.canvas.ImageReplay, "LineString":ol.render.canvas.LineStringReplay, "Polygon":ol.render.canvas.PolygonReplay, "Text":ol.render.canvas.TextReplay}; +goog.provide("ol.geom.Circle"); +goog.require("goog.asserts"); +goog.require("ol.extent"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.SimpleGeometry"); +goog.require("ol.geom.flat"); +ol.geom.Circle = function(center, opt_radius, opt_layout) { + goog.base(this); + var radius = goog.isDef(opt_radius) ? opt_radius : 0; + this.setCenterAndRadius(center, radius, opt_layout) +}; +goog.inherits(ol.geom.Circle, ol.geom.SimpleGeometry); +ol.geom.Circle.prototype.clone = function() { + var circle = new ol.geom.Circle(null); + circle.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return circle +}; +ol.geom.Circle.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { + var flatCoordinates = this.flatCoordinates; + var dx = x - flatCoordinates[0]; + var dy = y - flatCoordinates[1]; + var squaredDistance = dx * dx + dy * dy; + if(squaredDistance < minSquaredDistance) { + var i; + if(squaredDistance === 0) { + for(i = 0;i < this.stride;++i) { + closestPoint[i] = flatCoordinates[i] + } + }else { + var delta = this.getRadius() / Math.sqrt(squaredDistance); + closestPoint[0] = flatCoordinates[0] + delta * dx; + closestPoint[1] = flatCoordinates[1] + delta * dy; + for(i = 2;i < this.stride;++i) { + closestPoint[i] = flatCoordinates[i] + } + } + closestPoint.length = this.stride; + return squaredDistance + }else { + return minSquaredDistance + } +}; +ol.geom.Circle.prototype.containsXY = function(x, y) { + var flatCoordinates = this.flatCoordinates; + var dx = x - flatCoordinates[0]; + var dy = y - flatCoordinates[1]; + return dx * dx + dy * dy <= this.getRadiusSquared_() +}; +ol.geom.Circle.prototype.getCenter = function() { + return this.flatCoordinates.slice(0, this.stride) +}; +ol.geom.Circle.prototype.getExtent = function(opt_extent) { + if(this.extentRevision != this.getRevision()) { + var flatCoordinates = this.flatCoordinates; + var radius = flatCoordinates[this.stride] - flatCoordinates[0]; + this.extent = ol.extent.createOrUpdate(flatCoordinates[0] - radius, flatCoordinates[1] - radius, flatCoordinates[0] + radius, flatCoordinates[1] + radius, this.extent); + this.extentRevision = this.getRevision() + } + goog.asserts.assert(goog.isDef(this.extent)); + return ol.extent.returnOrUpdate(this.extent, opt_extent) +}; +ol.geom.Circle.prototype.getRadius = function() { + return Math.sqrt(this.getRadiusSquared_()) +}; +ol.geom.Circle.prototype.getRadiusSquared_ = function() { + var dx = this.flatCoordinates[this.stride] - this.flatCoordinates[0]; + var dy = this.flatCoordinates[this.stride + 1] - this.flatCoordinates[1]; + return dx * dx + dy * dy +}; +ol.geom.Circle.prototype.getSimplifiedGeometry = function(squaredTolerance) { + return this +}; +ol.geom.Circle.prototype.getType = function() { + return ol.geom.GeometryType.CIRCLE +}; +ol.geom.Circle.prototype.setCenter = function(center) { + var stride = this.stride; + goog.asserts.assert(center.length == stride); + var radius = this.flatCoordinates[stride] - this.flatCoordinates[0]; + var flatCoordinates = center.slice(); + flatCoordinates[stride] = flatCoordinates[0] + radius; + var i; + for(i = 1;i < stride;++i) { + flatCoordinates[stride + i] = center[i] + } + this.setFlatCoordinates(this.layout, flatCoordinates) +}; +ol.geom.Circle.prototype.setCenterAndRadius = function(center, radius, opt_layout) { + if(goog.isNull(center)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null) + }else { + this.setLayout(opt_layout, center, 0); + if(goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = [] + } + var flatCoordinates = this.flatCoordinates; + var offset = ol.geom.flat.deflateCoordinate(flatCoordinates, 0, center, this.stride); + flatCoordinates[offset++] = flatCoordinates[0] + radius; + var i, ii; + for(i = 1, ii = this.stride;i < ii;++i) { + flatCoordinates[offset++] = flatCoordinates[i] + } + flatCoordinates.length = offset; + this.dispatchChangeEvent() + } +}; +ol.geom.Circle.prototype.setFlatCoordinates = function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent() +}; +ol.geom.Circle.prototype.setRadius = function(radius) { + goog.asserts.assert(!goog.isNull(this.flatCoordinates)); + this.flatCoordinates[this.stride] = this.flatCoordinates[0] + radius; + this.dispatchChangeEvent() +}; +ol.geom.Circle.prototype.transform = goog.abstractMethod; +goog.provide("ol.geom.GeometryCollection"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.object"); +goog.require("ol.extent"); +goog.require("ol.geom.Geometry"); +goog.require("ol.geom.GeometryType"); +ol.geom.GeometryCollection = function(opt_geometries) { + goog.base(this); + this.geometries_ = goog.isDef(opt_geometries) ? opt_geometries : null; + this.listenGeometriesChange_() +}; +goog.inherits(ol.geom.GeometryCollection, ol.geom.Geometry); +ol.geom.GeometryCollection.cloneGeometries_ = function(geometries) { + var clonedGeometries = []; + var i, ii; + for(i = 0, ii = geometries.length;i < ii;++i) { + clonedGeometries.push(geometries[i].clone()) + } + return clonedGeometries +}; +ol.geom.GeometryCollection.prototype.unlistenGeometriesChange_ = function() { + var i, ii; + if(goog.isNull(this.geometries_)) { + return + } + for(i = 0, ii = this.geometries_.length;i < ii;++i) { + goog.events.unlisten(this.geometries_[i], goog.events.EventType.CHANGE, this.dispatchChangeEvent, false, this) + } +}; +ol.geom.GeometryCollection.prototype.listenGeometriesChange_ = function() { + var i, ii; + if(goog.isNull(this.geometries_)) { + return + } + for(i = 0, ii = this.geometries_.length;i < ii;++i) { + goog.events.listen(this.geometries_[i], goog.events.EventType.CHANGE, this.dispatchChangeEvent, false, this) + } +}; +ol.geom.GeometryCollection.prototype.clone = function() { + var geometryCollection = new ol.geom.GeometryCollection(null); + geometryCollection.setGeometries(this.geometries_); + return geometryCollection +}; +ol.geom.GeometryCollection.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { + if(minSquaredDistance < ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance + } + var geometries = this.geometries_; + var i, ii; + for(i = 0, ii = geometries.length;i < ii;++i) { + minSquaredDistance = geometries[i].closestPointXY(x, y, closestPoint, minSquaredDistance) + } + return minSquaredDistance +}; +ol.geom.GeometryCollection.prototype.containsXY = function(x, y) { + var geometries = this.geometries_; + var i, ii; + for(i = 0, ii = geometries.length;i < ii;++i) { + if(geometries[i].containsXY(x, y)) { + return true + } + } + return false +}; +ol.geom.GeometryCollection.prototype.getExtent = function(opt_extent) { + if(this.extentRevision != this.getRevision()) { + var extent = ol.extent.createOrUpdateEmpty(this.extent); + var geometries = this.geometries_; + var i, ii; + for(i = 0, ii = geometries.length;i < ii;++i) { + ol.extent.extend(extent, geometries[i].getExtent()) + } + this.extent = extent; + this.extentRevision = this.getRevision() + } + goog.asserts.assert(goog.isDef(this.extent)); + return ol.extent.returnOrUpdate(this.extent, opt_extent) +}; +ol.geom.GeometryCollection.prototype.getGeometries = function() { + return ol.geom.GeometryCollection.cloneGeometries_(this.geometries_) +}; +ol.geom.GeometryCollection.prototype.getGeometriesArray = function() { + return this.geometries_ +}; +ol.geom.GeometryCollection.prototype.getSimplifiedGeometry = function(squaredTolerance) { + if(this.simplifiedGeometryRevision != this.getRevision()) { + goog.object.clear(this.simplifiedGeometryCache); + this.simplifiedGeometryMaxMinSquaredTolerance = 0; + this.simplifiedGeometryRevision = this.getRevision() + } + if(squaredTolerance < 0 || this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && squaredTolerance < this.simplifiedGeometryMaxMinSquaredTolerance) { + return this + } + var key = squaredTolerance.toString(); + if(this.simplifiedGeometryCache.hasOwnProperty(key)) { + return this.simplifiedGeometryCache[key] + }else { + var simplifiedGeometries = []; + var geometries = this.geometries_; + var simplified = false; + var i, ii; + for(i = 0, ii = geometries.length;i < ii;++i) { + var geometry = geometries[i]; + var simplifiedGeometry = geometry.getSimplifiedGeometry(squaredTolerance); + simplifiedGeometries.push(simplifiedGeometry); + if(simplifiedGeometry !== geometry) { + simplified = true + } + } + if(simplified) { + var simplifiedGeometryCollection = new ol.geom.GeometryCollection(null); + simplifiedGeometryCollection.setGeometriesArray(simplifiedGeometries); + this.simplifiedGeometryCache[key] = simplifiedGeometryCollection; + return simplifiedGeometryCollection + }else { + this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance; + return this + } + } +}; +ol.geom.GeometryCollection.prototype.getType = function() { + return ol.geom.GeometryType.GEOMETRY_COLLECTION +}; +ol.geom.GeometryCollection.prototype.isEmpty = function() { + return goog.array.isEmpty(this.geometries_) +}; +ol.geom.GeometryCollection.prototype.setGeometries = function(geometries) { + this.setGeometriesArray(ol.geom.GeometryCollection.cloneGeometries_(geometries)) +}; +ol.geom.GeometryCollection.prototype.setGeometriesArray = function(geometries) { + this.unlistenGeometriesChange_(); + this.geometries_ = geometries; + this.listenGeometriesChange_(); + this.dispatchChangeEvent() +}; +ol.geom.GeometryCollection.prototype.transform = function(transformFn) { + var geometries = this.geometries_; + var i, ii; + for(i = 0, ii = geometries.length;i < ii;++i) { + geometries[i].transform(transformFn) + } + this.dispatchChangeEvent() +}; +ol.geom.GeometryCollection.prototype.disposeInternal = function() { + this.unlistenGeometriesChange_(); + goog.base(this, "disposeInternal") +}; +goog.provide("ol.geom.LineString"); +goog.require("ol.extent"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.SimpleGeometry"); +goog.require("ol.geom.closest"); +goog.require("ol.geom.flat"); +goog.require("ol.geom.simplify"); +ol.geom.LineString = function(coordinates, opt_layout) { + goog.base(this); + this.flatMidpoint_ = null; + this.flatMidpointRevision_ = -1; + this.maxDelta_ = -1; + this.maxDeltaRevision_ = -1; + this.setCoordinates(coordinates, opt_layout) +}; +goog.inherits(ol.geom.LineString, ol.geom.SimpleGeometry); +ol.geom.LineString.prototype.clone = function() { + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return lineString +}; +ol.geom.LineString.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { + if(minSquaredDistance < ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance + } + if(this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getMaxSquaredDelta(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision() + } + return ol.geom.closest.getClosestPoint(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.maxDelta_, false, x, y, closestPoint, minSquaredDistance) +}; +ol.geom.LineString.prototype.getCoordinateAtM = function(m, opt_extrapolate) { + if(this.layout != ol.geom.GeometryLayout.XYM && this.layout != ol.geom.GeometryLayout.XYZM) { + return null + } + var extrapolate = goog.isDef(opt_extrapolate) ? opt_extrapolate : false; + return ol.geom.flat.lineStringCoordinateAtM(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, m, extrapolate) +}; +ol.geom.LineString.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinates(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride) +}; +ol.geom.LineString.prototype.getLength = function() { + return ol.geom.flat.lineStringLength(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride) +}; +ol.geom.LineString.prototype.getFlatMidpoint = function() { + if(this.flatMidpointRevision_ != this.getRevision()) { + this.flatMidpoint_ = ol.geom.flat.lineStringInterpolate(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0.5, this.flatMidpoint_); + this.flatMidpointRevision_ = this.getRevision() + } + return this.flatMidpoint_ +}; +ol.geom.LineString.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.douglasPeucker(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, squaredTolerance, simplifiedFlatCoordinates, 0); + var simplifiedLineString = new ol.geom.LineString(null); + simplifiedLineString.setFlatCoordinates(ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates); + return simplifiedLineString +}; +ol.geom.LineString.prototype.getType = function() { + return ol.geom.GeometryType.LINE_STRING +}; +ol.geom.LineString.prototype.setCoordinates = function(coordinates, opt_layout) { + if(goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null) + }else { + this.setLayout(opt_layout, coordinates, 1); + if(goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = [] + } + this.flatCoordinates.length = ol.geom.flat.deflateCoordinates(this.flatCoordinates, 0, coordinates, this.stride); + this.dispatchChangeEvent() + } +}; +ol.geom.LineString.prototype.setFlatCoordinates = function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent() +}; +goog.provide("ol.geom.MultiLineString"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("ol.extent"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.SimpleGeometry"); +goog.require("ol.geom.closest"); +goog.require("ol.geom.flat"); +goog.require("ol.geom.simplify"); +ol.geom.MultiLineString = function(coordinates, opt_layout) { + goog.base(this); + this.ends_ = []; + this.maxDelta_ = -1; + this.maxDeltaRevision_ = -1; + this.setCoordinates(coordinates, opt_layout) +}; +goog.inherits(ol.geom.MultiLineString, ol.geom.SimpleGeometry); +ol.geom.MultiLineString.prototype.clone = function() { + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setFlatCoordinates(this.layout, this.flatCoordinates.slice(), this.ends_.slice()); + return multiLineString +}; +ol.geom.MultiLineString.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { + if(minSquaredDistance < ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance + } + if(this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getsMaxSquaredDelta(this.flatCoordinates, 0, this.ends_, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision() + } + return ol.geom.closest.getsClosestPoint(this.flatCoordinates, 0, this.ends_, this.stride, this.maxDelta_, false, x, y, closestPoint, minSquaredDistance) +}; +ol.geom.MultiLineString.prototype.getCoordinateAtM = function(m, opt_extrapolate, opt_interpolate) { + if(this.layout != ol.geom.GeometryLayout.XYM && this.layout != ol.geom.GeometryLayout.XYZM || this.flatCoordinates.length === 0) { + return null + } + var extrapolate = goog.isDef(opt_extrapolate) ? opt_extrapolate : false; + var interpolate = goog.isDef(opt_interpolate) ? opt_interpolate : false; + return ol.geom.flat.lineStringsCoordinateAtM(this.flatCoordinates, 0, this.ends_, this.stride, m, extrapolate, interpolate) +}; +ol.geom.MultiLineString.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinatess(this.flatCoordinates, 0, this.ends_, this.stride) +}; +ol.geom.MultiLineString.prototype.getEnds = function() { + return this.ends_ +}; +ol.geom.MultiLineString.prototype.getLineStrings = function() { + var coordinates = this.getCoordinates(); + var lineStrings = []; + var i, ii; + for(i = 0, ii = coordinates.length;i < ii;++i) { + lineStrings.push(new ol.geom.LineString(coordinates[i])) + } + return lineStrings +}; +ol.geom.MultiLineString.prototype.getFlatMidpoints = function() { + var midpoints = []; + var flatCoordinates = this.flatCoordinates; + var offset = 0; + var ends = this.ends_; + var stride = this.stride; + var i, ii; + for(i = 0, ii = ends.length;i < ii;++i) { + var end = ends[i]; + var midpoint = ol.geom.flat.lineStringInterpolate(flatCoordinates, offset, end, stride, 0.5); + goog.array.extend(midpoints, midpoint); + offset = end + } + return midpoints +}; +ol.geom.MultiLineString.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + var simplifiedEnds = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.douglasPeuckers(this.flatCoordinates, 0, this.ends_, this.stride, squaredTolerance, simplifiedFlatCoordinates, 0, simplifiedEnds); + var simplifiedMultiLineString = new ol.geom.MultiLineString(null); + simplifiedMultiLineString.setFlatCoordinates(ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEnds); + return simplifiedMultiLineString +}; +ol.geom.MultiLineString.prototype.getType = function() { + return ol.geom.GeometryType.MULTI_LINE_STRING +}; +ol.geom.MultiLineString.prototype.setCoordinates = function(coordinates, opt_layout) { + if(goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.ends_) + }else { + this.setLayout(opt_layout, coordinates, 2); + if(goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = [] + } + var ends = ol.geom.flat.deflateCoordinatess(this.flatCoordinates, 0, coordinates, this.stride, this.ends_); + this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1]; + this.dispatchChangeEvent() + } +}; +ol.geom.MultiLineString.prototype.setFlatCoordinates = function(layout, flatCoordinates, ends) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.ends_ = ends; + this.dispatchChangeEvent() +}; +ol.geom.MultiLineString.prototype.setLineStrings = function(lineStrings) { + var layout = ol.geom.GeometryLayout.XY; + var flatCoordinates = []; + var ends = []; + var i, ii; + for(i = 0, ii = lineStrings.length;i < ii;++i) { + var lineString = lineStrings[i]; + if(i === 0) { + layout = lineString.getLayout() + }else { + goog.asserts.assert(lineString.getLayout() == layout) + } + goog.array.extend(flatCoordinates, lineString.getFlatCoordinates()); + ends.push(flatCoordinates.length) + } + this.setFlatCoordinates(layout, flatCoordinates, ends) +}; +goog.provide("ol.geom.MultiPoint"); +goog.require("ol.extent"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.SimpleGeometry"); +goog.require("ol.geom.flat"); +ol.geom.MultiPoint = function(coordinates, opt_layout) { + goog.base(this); + this.setCoordinates(coordinates, opt_layout) +}; +goog.inherits(ol.geom.MultiPoint, ol.geom.SimpleGeometry); +ol.geom.MultiPoint.prototype.clone = function() { + var multiPoint = new ol.geom.MultiPoint(null); + multiPoint.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return multiPoint +}; +ol.geom.MultiPoint.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { + if(minSquaredDistance < ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance + } + var flatCoordinates = this.flatCoordinates; + var stride = this.stride; + var i, ii, j; + for(i = 0, ii = flatCoordinates.length;i < ii;i += stride) { + var squaredDistance = ol.geom.flat.squaredDistance(x, y, flatCoordinates[i], flatCoordinates[i + 1]); + if(squaredDistance < minSquaredDistance) { + minSquaredDistance = squaredDistance; + for(j = 0;j < stride;++j) { + closestPoint[j] = flatCoordinates[i + j] + } + closestPoint.length = stride + } + } + return minSquaredDistance +}; +ol.geom.MultiPoint.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinates(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride) +}; +ol.geom.MultiPoint.prototype.getPoints = function() { + var coordinates = this.getCoordinates(); + var points = []; + var i, ii; + for(i = 0, ii = coordinates.length;i < ii;++i) { + points.push(new ol.geom.Point(coordinates[i])) + } + return points +}; +ol.geom.MultiPoint.prototype.getType = function() { + return ol.geom.GeometryType.MULTI_POINT +}; +ol.geom.MultiPoint.prototype.setCoordinates = function(coordinates, opt_layout) { + if(goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null) + }else { + this.setLayout(opt_layout, coordinates, 1); + if(goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = [] + } + this.flatCoordinates.length = ol.geom.flat.deflateCoordinates(this.flatCoordinates, 0, coordinates, this.stride); + this.dispatchChangeEvent() + } +}; +ol.geom.MultiPoint.prototype.setFlatCoordinates = function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent() +}; +goog.provide("ol.geom.MultiPolygon"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("ol.extent"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.MultiPoint"); +goog.require("ol.geom.Polygon"); +goog.require("ol.geom.SimpleGeometry"); +goog.require("ol.geom.closest"); +goog.require("ol.geom.flat"); +goog.require("ol.geom.simplify"); +ol.geom.MultiPolygon = function(coordinates, opt_layout) { + goog.base(this); + this.endss_ = []; + this.flatInteriorPointsRevision_ = -1; + this.flatInteriorPoints_ = null; + this.maxDelta_ = -1; + this.maxDeltaRevision_ = -1; + this.orientedRevision_ = -1; + this.orientedFlatCoordinates_ = null; + this.setCoordinates(coordinates, opt_layout) +}; +goog.inherits(ol.geom.MultiPolygon, ol.geom.SimpleGeometry); +ol.geom.MultiPolygon.prototype.clone = function() { + var multiPolygon = new ol.geom.MultiPolygon(null); + multiPolygon.setFlatCoordinates(this.layout, this.flatCoordinates.slice(), this.endss_.slice()); + return multiPolygon +}; +ol.geom.MultiPolygon.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { + if(minSquaredDistance < ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance + } + if(this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getssMaxSquaredDelta(this.flatCoordinates, 0, this.endss_, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision() + } + return ol.geom.closest.getssClosestPoint(this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, this.maxDelta_, true, x, y, closestPoint, minSquaredDistance) +}; +ol.geom.MultiPolygon.prototype.containsXY = function(x, y) { + return ol.geom.flat.linearRingssContainsXY(this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, x, y) +}; +ol.geom.MultiPolygon.prototype.getArea = function() { + return ol.geom.flat.linearRingssArea(this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride) +}; +ol.geom.MultiPolygon.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinatesss(this.flatCoordinates, 0, this.endss_, this.stride) +}; +ol.geom.MultiPolygon.prototype.getEndss = function() { + return this.endss_ +}; +ol.geom.MultiPolygon.prototype.getFlatInteriorPoints = function() { + if(this.flatInteriorPointsRevision_ != this.getRevision()) { + var flatCenters = ol.geom.flat.linearRingssGetFlatCenters(this.flatCoordinates, 0, this.endss_, this.stride); + this.flatInteriorPoints_ = ol.geom.flat.linearRingssGetInteriorPoints(this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, flatCenters); + this.flatInteriorPointsRevision_ = this.getRevision() + } + return this.flatInteriorPoints_ +}; +ol.geom.MultiPolygon.prototype.getInteriorPoints = function() { + var interiorPoints = new ol.geom.MultiPoint(null); + interiorPoints.setFlatCoordinates(ol.geom.GeometryLayout.XY, this.getFlatInteriorPoints().slice()); + return interiorPoints +}; +ol.geom.MultiPolygon.prototype.getOrientedFlatCoordinates = function() { + if(this.orientedRevision_ != this.getRevision()) { + var flatCoordinates = this.flatCoordinates; + if(ol.geom.flat.linearRingssAreOriented(flatCoordinates, 0, this.endss_, this.stride)) { + this.orientedFlatCoordinates_ = flatCoordinates + }else { + this.orientedFlatCoordinates_ = flatCoordinates.slice(); + this.orientedFlatCoordinates_.length = ol.geom.flat.orientLinearRingss(this.orientedFlatCoordinates_, 0, this.endss_, this.stride) + } + this.orientedRevision_ = this.getRevision() + } + return this.orientedFlatCoordinates_ +}; +ol.geom.MultiPolygon.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + var simplifiedEndss = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.quantizess(this.flatCoordinates, 0, this.endss_, this.stride, Math.sqrt(squaredTolerance), simplifiedFlatCoordinates, 0, simplifiedEndss); + var simplifiedMultiPolygon = new ol.geom.MultiPolygon(null); + simplifiedMultiPolygon.setFlatCoordinates(ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEndss); + return simplifiedMultiPolygon +}; +ol.geom.MultiPolygon.prototype.getPolygons = function() { + var layout = this.layout; + var flatCoordinates = this.flatCoordinates; + var endss = this.endss_; + var polygons = []; + var offset = 0; + var i, ii; + for(i = 0, ii = endss.length;i < ii;++i) { + var ends = endss[i]; + var end = ends[ends.length - 1]; + var polygon = new ol.geom.Polygon(null); + polygon.setFlatCoordinates(layout, flatCoordinates.slice(offset, end), ends.slice()); + polygons.push(polygon); + offset = end + } + return polygons +}; +ol.geom.MultiPolygon.prototype.getType = function() { + return ol.geom.GeometryType.MULTI_POLYGON +}; +ol.geom.MultiPolygon.prototype.setCoordinates = function(coordinates, opt_layout) { + if(goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.endss_) + }else { + this.setLayout(opt_layout, coordinates, 3); + if(goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = [] + } + var endss = ol.geom.flat.deflateCoordinatesss(this.flatCoordinates, 0, coordinates, this.stride, this.endss_); + var lastEnds = endss[endss.length - 1]; + this.flatCoordinates.length = lastEnds.length === 0 ? 0 : lastEnds[lastEnds.length - 1]; + this.dispatchChangeEvent() + } +}; +ol.geom.MultiPolygon.prototype.setFlatCoordinates = function(layout, flatCoordinates, endss) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.endss_ = endss; + this.dispatchChangeEvent() +}; +ol.geom.MultiPolygon.prototype.setPolygons = function(polygons) { + var layout = ol.geom.GeometryLayout.XY; + var flatCoordinates = []; + var endss = []; + var i, ii, ends; + for(i = 0, ii = polygons.length;i < ii;++i) { + var polygon = polygons[i]; + if(i === 0) { + layout = polygon.getLayout() + }else { + goog.asserts.assert(polygon.getLayout() == layout) + } + var offset = flatCoordinates.length; + ends = polygon.getEnds(); + var j, jj; + for(j = 0, jj = ends.length;j < jj;++j) { + ends[j] += offset + } + goog.array.extend(flatCoordinates, polygon.getFlatCoordinates()); + endss.push(ends) + } + this.setFlatCoordinates(layout, flatCoordinates, endss) +}; +goog.provide("ol.renderer.vector"); +goog.require("goog.asserts"); +goog.require("ol.geom.Circle"); +goog.require("ol.geom.GeometryCollection"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.MultiLineString"); +goog.require("ol.geom.MultiPoint"); +goog.require("ol.geom.MultiPolygon"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.Polygon"); +goog.require("ol.render.IReplayGroup"); +goog.require("ol.style.ImageState"); +goog.require("ol.style.Style"); +ol.renderer.vector.renderCircleGeometry_ = function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.Circle); + var fillStyle = style.getFill(); + var strokeStyle = style.getStroke(); + if(!goog.isNull(fillStyle) || !goog.isNull(strokeStyle)) { + var polygonReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.POLYGON); + polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle); + polygonReplay.drawCircleGeometry(geometry, data) + } + var textStyle = style.getText(); + if(!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + textReplay.drawText(geometry.getCenter(), 0, 2, 2, geometry, data) + } +}; +ol.renderer.vector.renderFeature = function(replayGroup, feature, style, squaredTolerance, data, listener, thisArg) { + var loading = false; + var imageStyle, imageState; + imageStyle = style.getImage(); + if(goog.isNull(imageStyle)) { + ol.renderer.vector.renderFeature_(replayGroup, feature, style, squaredTolerance, data) + }else { + imageState = imageStyle.getImageState(); + if(imageState == ol.style.ImageState.LOADED || imageState == ol.style.ImageState.ERROR) { + imageStyle.unlistenImageChange(listener, thisArg); + if(imageState == ol.style.ImageState.LOADED) { + ol.renderer.vector.renderFeature_(replayGroup, feature, style, squaredTolerance, data) + } + }else { + if(imageState == ol.style.ImageState.IDLE) { + imageStyle.load() + } + imageState = imageStyle.getImageState(); + goog.asserts.assert(imageState == ol.style.ImageState.LOADING); + imageStyle.listenImageChange(listener, thisArg); + loading = true + } + } + return loading +}; +ol.renderer.vector.renderFeature_ = function(replayGroup, feature, style, squaredTolerance, data) { + var geometry = feature.getGeometry(); + if(goog.isNull(geometry)) { + return + } + var simplifiedGeometry = geometry.getSimplifiedGeometry(squaredTolerance); + var geometryRenderer = ol.renderer.vector.GEOMETRY_RENDERERS_[simplifiedGeometry.getType()]; + goog.asserts.assert(goog.isDef(geometryRenderer)); + geometryRenderer(replayGroup, simplifiedGeometry, style, data) +}; +ol.renderer.vector.renderGeometryCollectionGeometry_ = function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.GeometryCollection); + var geometries = geometry.getGeometriesArray(); + var i, ii; + for(i = 0, ii = geometries.length;i < ii;++i) { + var geometryRenderer = ol.renderer.vector.GEOMETRY_RENDERERS_[geometries[i].getType()]; + goog.asserts.assert(goog.isDef(geometryRenderer)); + geometryRenderer(replayGroup, geometries[i], style, data) + } +}; +ol.renderer.vector.renderLineStringGeometry_ = function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + var strokeStyle = style.getStroke(); + if(!goog.isNull(strokeStyle)) { + var lineStringReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.LINE_STRING); + lineStringReplay.setFillStrokeStyle(null, strokeStyle); + lineStringReplay.drawLineStringGeometry(geometry, data) + } + var textStyle = style.getText(); + if(!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + textReplay.drawText(geometry.getFlatMidpoint(), 0, 2, 2, geometry, data) + } +}; +ol.renderer.vector.renderMultiLineStringGeometry_ = function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString); + var strokeStyle = style.getStroke(); + if(!goog.isNull(strokeStyle)) { + var lineStringReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.LINE_STRING); + lineStringReplay.setFillStrokeStyle(null, strokeStyle); + lineStringReplay.drawMultiLineStringGeometry(geometry, data) + } + var textStyle = style.getText(); + if(!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + var flatMidpointCoordinates = geometry.getFlatMidpoints(); + textReplay.drawText(flatMidpointCoordinates, 0, flatMidpointCoordinates.length, 2, geometry, data) + } +}; +ol.renderer.vector.renderMultiPolygonGeometry_ = function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon); + var fillStyle = style.getFill(); + var strokeStyle = style.getStroke(); + if(!goog.isNull(strokeStyle) || !goog.isNull(fillStyle)) { + var polygonReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.POLYGON); + polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle); + polygonReplay.drawMultiPolygonGeometry(geometry, data) + } + var textStyle = style.getText(); + if(!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + var flatInteriorPointCoordinates = geometry.getFlatInteriorPoints(); + textReplay.drawText(flatInteriorPointCoordinates, 0, flatInteriorPointCoordinates.length, 2, geometry, data) + } +}; +ol.renderer.vector.renderPointGeometry_ = function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + var imageStyle = style.getImage(); + if(!goog.isNull(imageStyle)) { + var imageReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.IMAGE); + imageReplay.setImageStyle(imageStyle); + imageReplay.drawPointGeometry(geometry, data) + } + var textStyle = style.getText(); + if(!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + textReplay.drawText(geometry.getCoordinates(), 0, 2, 2, geometry, data) + } +}; +ol.renderer.vector.renderMultiPointGeometry_ = function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPoint); + var imageStyle = style.getImage(); + if(!goog.isNull(imageStyle)) { + var imageReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.IMAGE); + imageReplay.setImageStyle(imageStyle); + imageReplay.drawMultiPointGeometry(geometry, data) + } + var textStyle = style.getText(); + if(!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + var flatCoordinates = geometry.getFlatCoordinates(); + textReplay.drawText(flatCoordinates, 0, flatCoordinates.length, geometry.getStride(), geometry, data) + } +}; +ol.renderer.vector.renderPolygonGeometry_ = function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + var fillStyle = style.getFill(); + var strokeStyle = style.getStroke(); + if(!goog.isNull(fillStyle) || !goog.isNull(strokeStyle)) { + var polygonReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.POLYGON); + polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle); + polygonReplay.drawPolygonGeometry(geometry, data) + } + var textStyle = style.getText(); + if(!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + textReplay.drawText(geometry.getFlatInteriorPoint(), 0, 2, 2, geometry, data) + } +}; +ol.renderer.vector.GEOMETRY_RENDERERS_ = {"Point":ol.renderer.vector.renderPointGeometry_, "LineString":ol.renderer.vector.renderLineStringGeometry_, "Polygon":ol.renderer.vector.renderPolygonGeometry_, "MultiPoint":ol.renderer.vector.renderMultiPointGeometry_, "MultiLineString":ol.renderer.vector.renderMultiLineStringGeometry_, "MultiPolygon":ol.renderer.vector.renderMultiPolygonGeometry_, "GeometryCollection":ol.renderer.vector.renderGeometryCollectionGeometry_, "Circle":ol.renderer.vector.renderCircleGeometry_}; +goog.provide("ol.structs.RBush"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.object"); +goog.require("ol.extent"); +ol.structs.RBushNode = function(extent, height, children, value) { + if(height === 0) { + goog.asserts.assert(goog.isNull(children)); + goog.asserts.assert(!goog.isNull(value)) + }else { + goog.asserts.assert(!goog.isNull(children)); + goog.asserts.assert(goog.isNull(value)) + } + this.extent = extent; + this.height = height; + this.children = children; + this.value = value +}; +ol.structs.RBushNode.compareMinX = function(node1, node2) { + return node1.extent[0] - node2.extent[0] +}; +ol.structs.RBushNode.compareMinY = function(node1, node2) { + return node1.extent[1] - node2.extent[1] +}; +ol.structs.RBushNode.prototype.assertValid = function(maxEntries) { + if(this.height === 0) { + goog.asserts.assert(goog.isNull(this.children)); + goog.asserts.assert(!goog.isNull(this.value)) + }else { + goog.asserts.assert(!goog.isNull(this.children)); + goog.asserts.assert(goog.isNull(this.value)); + goog.asserts.assert(this.children.length <= maxEntries); + var i, ii; + for(i = 0, ii = this.children.length;i < ii;++i) { + var child = this.children[i]; + goog.asserts.assert(ol.extent.containsExtent(this.extent, child.extent)); + child.assertValid(maxEntries) + } + } +}; +ol.structs.RBushNode.prototype.getChildrenExtent = function(start, stop, opt_extent) { + goog.asserts.assert(!this.isLeaf()); + var children = this.children; + var extent = ol.extent.createOrUpdateEmpty(opt_extent); + var i; + for(i = start;i < stop;++i) { + ol.extent.extend(extent, children[i].extent) + } + return extent +}; +ol.structs.RBushNode.prototype.remove = function(extent, value, path) { + var children = this.children; + var ii = children.length; + var child, i; + if(this.height == 1) { + for(i = 0;i < ii;++i) { + child = children[i]; + if(child.value === value) { + goog.array.removeAt(children, i); + return true + } + } + }else { + goog.asserts.assert(this.height > 1); + for(i = 0;i < ii;++i) { + child = children[i]; + if(ol.extent.containsExtent(child.extent, extent)) { + path.push(child); + if(child.remove(extent, value, path)) { + return true + } + path.pop() + } + } + } + return false +}; +ol.structs.RBushNode.prototype.updateExtent = function() { + goog.asserts.assert(!this.isLeaf()); + var extent = ol.extent.createOrUpdateEmpty(this.extent); + var children = this.children; + var i, ii; + for(i = 0, ii = children.length;i < ii;++i) { + ol.extent.extend(extent, children[i].extent) + } +}; +ol.structs.RBushNode.prototype.isLeaf = function() { + return goog.isNull(this.children) +}; +ol.structs.RBush = function(opt_maxEntries) { + this.maxEntries_ = Math.max(4, goog.isDef(opt_maxEntries) ? opt_maxEntries : 9); + this.minEntries_ = Math.max(2, Math.ceil(0.4 * this.maxEntries_)); + this.root_ = new ol.structs.RBushNode(ol.extent.createEmpty(), 1, [], null); + this.valueExtent_ = {}; + if(goog.DEBUG) { + this.readers_ = 0 + } +}; +ol.structs.RBush.prototype.allDistMargin_ = function(node, compare) { + var children = node.children; + var m = this.minEntries_; + var M = children.length; + var i; + goog.array.sort(children, compare); + var leftExtent = node.getChildrenExtent(0, m); + var rightExtent = node.getChildrenExtent(M - m, M); + var margin = ol.extent.getMargin(leftExtent) + ol.extent.getMargin(rightExtent); + for(i = m;i < M - m;++i) { + ol.extent.extend(leftExtent, children[i].extent); + margin += ol.extent.getMargin(leftExtent) + } + for(i = M - m - 1;i >= m;--i) { + ol.extent.extend(rightExtent, children[i].extent); + margin += ol.extent.getMargin(rightExtent) + } + return margin +}; +ol.structs.RBush.prototype.assertValid = function() { + this.root_.assertValid(this.maxEntries_) +}; +ol.structs.RBush.prototype.chooseSplitAxis_ = function(node) { + var xMargin = this.allDistMargin_(node, ol.structs.RBushNode.compareMinX); + var yMargin = this.allDistMargin_(node, ol.structs.RBushNode.compareMinY); + if(xMargin < yMargin) { + goog.array.sort(node.children, ol.structs.RBushNode.compareMinX) + } +}; +ol.structs.RBush.prototype.chooseSplitIndex_ = function(node) { + var children = node.children; + var m = this.minEntries_; + var M = children.length; + var minOverlap = Infinity; + var minArea = Infinity; + var extent1 = ol.extent.createEmpty(); + var extent2 = ol.extent.createEmpty(); + var index = 0; + var i; + for(i = m;i <= M - m;++i) { + extent1 = node.getChildrenExtent(0, i, extent1); + extent2 = node.getChildrenExtent(i, M, extent2); + var overlap = ol.extent.getIntersectionArea(extent1, extent2); + var area = ol.extent.getArea(extent1) + ol.extent.getArea(extent2); + if(overlap < minOverlap) { + minOverlap = overlap; + minArea = Math.min(area, minArea); + index = i + }else { + if(overlap == minOverlap && area < minArea) { + minArea = area; + index = i + } + } + } + return index +}; +ol.structs.RBush.prototype.chooseSubtree_ = function(extent, node, level, path) { + while(!node.isLeaf() && path.length - 1 != level) { + var minArea = Infinity; + var minEnlargement = Infinity; + var children = node.children; + var bestChild = null; + var i, ii; + for(i = 0, ii = children.length;i < ii;++i) { + var child = children[i]; + var area = ol.extent.getArea(child.extent); + var enlargement = ol.extent.getEnlargedArea(child.extent, extent) - area; + if(enlargement < minEnlargement) { + minEnlargement = enlargement; + minArea = Math.min(area, minArea); + bestChild = child + }else { + if(enlargement == minEnlargement && area < minArea) { + minArea = area; + bestChild = child + } + } + } + goog.asserts.assert(!goog.isNull(bestChild)); + node = bestChild; + path.push(node) + } + return node +}; +ol.structs.RBush.prototype.clear = function() { + var node = this.root_; + node.extent = ol.extent.createOrUpdateEmpty(this.root_.extent); + node.height = 1; + node.children.length = 0; + node.value = null; + goog.object.clear(this.valueExtent_) +}; +ol.structs.RBush.prototype.condense_ = function(path) { + var i; + for(i = path.length - 1;i >= 0;--i) { + var node = path[i]; + if(node.children.length === 0) { + if(i > 0) { + goog.array.remove(path[i - 1].children, node) + }else { + this.clear() + } + }else { + node.updateExtent() + } + } +}; +ol.structs.RBush.prototype.forEach = function(callback, opt_this) { + if(goog.DEBUG) { + ++this.readers_; + try { + return this.forEach_(this.root_, callback, opt_this) + }finally { + --this.readers_ + } + }else { + return this.forEach_(this.root_, callback, opt_this) + } +}; +ol.structs.RBush.prototype.forEach_ = function(node, callback, opt_this) { + goog.asserts.assert(!node.isLeaf()); + var toVisit = [node]; + var children, i, ii, result; + while(toVisit.length > 0) { + node = toVisit.pop(); + children = node.children; + if(node.height == 1) { + for(i = 0, ii = children.length;i < ii;++i) { + result = callback.call(opt_this, children[i].value); + if(result) { + return result + } + } + }else { + toVisit.push.apply(toVisit, children) + } + } +}; +ol.structs.RBush.prototype.forEachInExtent = function(extent, callback, opt_this) { + if(goog.DEBUG) { + ++this.readers_; + try { + return this.forEachInExtent_(extent, callback, opt_this) + }finally { + --this.readers_ + } + }else { + return this.forEachInExtent_(extent, callback, opt_this) + } +}; +ol.structs.RBush.prototype.forEachInExtent_ = function(extent, callback, opt_this) { + var toVisit = [this.root_]; + var result; + while(toVisit.length > 0) { + var node = toVisit.pop(); + if(ol.extent.intersects(extent, node.extent)) { + if(node.isLeaf()) { + result = callback.call(opt_this, node.value); + if(result) { + return result + } + }else { + if(ol.extent.containsExtent(extent, node.extent)) { + result = this.forEach_(node, callback, opt_this); + if(result) { + return result + } + }else { + toVisit.push.apply(toVisit, node.children) + } + } + } + } + return undefined +}; +ol.structs.RBush.prototype.forEachNode = function(callback, opt_this) { + var toVisit = [this.root_]; + while(toVisit.length > 0) { + var node = toVisit.pop(); + var result = callback.call(opt_this, node); + if(result) { + return result + } + if(!node.isLeaf()) { + toVisit.push.apply(toVisit, node.children) + } + } + return undefined +}; +ol.structs.RBush.prototype.getAll = function() { + var values = []; + this.forEach(function(value) { + values.push(value) + }); + return values +}; +ol.structs.RBush.prototype.getInExtent = function(extent) { + var values = []; + this.forEachInExtent(extent, function(value) { + values.push(value) + }); + return values +}; +ol.structs.RBush.prototype.getExtent = function(opt_extent) { + return ol.extent.returnOrUpdate(this.root_.extent, opt_extent) +}; +ol.structs.RBush.prototype.getKey_ = function(value) { + goog.asserts.assert(goog.isObject(value)); + return goog.getUid(value).toString() +}; +ol.structs.RBush.prototype.insert = function(extent, value) { + if(goog.DEBUG && this.readers_) { + throw new Error("cannot insert value while reading"); + } + var key = this.getKey_(value); + goog.asserts.assert(!this.valueExtent_.hasOwnProperty(key)); + this.insert_(extent, value, this.root_.height - 1); + this.valueExtent_[key] = ol.extent.clone(extent) +}; +ol.structs.RBush.prototype.insert_ = function(extent, value, level) { + var path = [this.root_]; + var node = this.chooseSubtree_(extent, this.root_, level, path); + node.children.push(new ol.structs.RBushNode(extent, 0, null, value)); + ol.extent.extend(node.extent, extent); + var i; + for(i = path.length - 1;i >= 0;--i) { + if(path[i].children.length > this.maxEntries_) { + this.split_(path, i) + }else { + break + } + } + for(;i >= 0;--i) { + ol.extent.extend(path[i].extent, extent) + } + return node +}; +ol.structs.RBush.prototype.isEmpty = function() { + return this.root_.children.length === 0 +}; +ol.structs.RBush.prototype.remove = function(value) { + if(goog.DEBUG && this.readers_) { + throw new Error("cannot remove value while reading"); + } + var key = this.getKey_(value); + goog.asserts.assert(this.valueExtent_.hasOwnProperty(key)); + var extent = this.valueExtent_[key]; + delete this.valueExtent_[key]; + return this.remove_(extent, value) +}; +ol.structs.RBush.prototype.remove_ = function(extent, value) { + var root = this.root_; + var path = [root]; + var removed = root.remove(extent, value, path); + if(removed) { + this.condense_(path) + }else { + goog.asserts.assert(path.length == 1); + goog.asserts.assert(path[0] === root) + } + return removed +}; +ol.structs.RBush.prototype.split_ = function(path, level) { + var node = path[level]; + this.chooseSplitAxis_(node); + var splitIndex = this.chooseSplitIndex_(node); + var newChildren = node.children.splice(splitIndex); + var newNode = new ol.structs.RBushNode(ol.extent.createEmpty(), node.height, newChildren, null); + node.updateExtent(); + newNode.updateExtent(); + if(level) { + path[level - 1].children.push(newNode) + }else { + this.splitRoot_(node, newNode) + } +}; +ol.structs.RBush.prototype.splitRoot_ = function(node1, node2) { + goog.asserts.assert(node1 === this.root_); + var height = node1.height + 1; + var extent = ol.extent.extend(node1.extent.slice(), node2.extent); + var children = [node1, node2]; + this.root_ = new ol.structs.RBushNode(extent, height, children, null) +}; +ol.structs.RBush.prototype.update = function(extent, value) { + if(goog.DEBUG && this.readers_) { + throw new Error("cannot update value while reading"); + } + var key = this.getKey_(value); + var currentExtent = this.valueExtent_[key]; + goog.asserts.assert(goog.isDef(currentExtent)); + if(!ol.extent.equals(currentExtent, extent)) { + var removed = this.remove_(currentExtent, value); + goog.asserts.assert(removed); + this.insert_(extent, value, this.root_.height - 1); + this.valueExtent_[key] = ol.extent.clone(extent, currentExtent) + } +}; +goog.provide("ol.source.Vector"); +goog.provide("ol.source.VectorEvent"); +goog.provide("ol.source.VectorEventType"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.Event"); +goog.require("goog.events.EventType"); +goog.require("goog.object"); +goog.require("ol.source.Source"); +goog.require("ol.structs.RBush"); +ol.source.VectorEventType = {ADDFEATURE:"addfeature", REMOVEFEATURE:"removefeature"}; +ol.source.Vector = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, {attributions:options.attributions, extent:options.extent, logo:options.logo, projection:options.projection, state:options.state}); + this.rBush_ = new ol.structs.RBush; + this.nullGeometryFeatures_ = {}; + this.featureChangeKeys_ = {}; + if(goog.isDef(options.features)) { + this.addFeaturesInternal(options.features) + } +}; +goog.inherits(ol.source.Vector, ol.source.Source); +ol.source.Vector.prototype.addFeature = function(feature) { + this.addFeatureInternal(feature); + this.dispatchChangeEvent() +}; +ol.source.Vector.prototype.addFeatureInternal = function(feature) { + var featureKey = goog.getUid(feature).toString(); + goog.asserts.assert(!(featureKey in this.featureChangeKeys_)); + this.featureChangeKeys_[featureKey] = goog.events.listen(feature, goog.events.EventType.CHANGE, this.handleFeatureChange_, false, this); + var geometry = feature.getGeometry(); + if(goog.isNull(geometry)) { + this.nullGeometryFeatures_[goog.getUid(feature).toString()] = feature + }else { + var extent = geometry.getExtent(); + this.rBush_.insert(extent, feature) + } + this.dispatchEvent(new ol.source.VectorEvent(ol.source.VectorEventType.ADDFEATURE, feature)) +}; +ol.source.Vector.prototype.addFeatures = function(features) { + this.addFeaturesInternal(features); + this.dispatchChangeEvent() +}; +ol.source.Vector.prototype.addFeaturesInternal = function(features) { + var i, ii; + for(i = 0, ii = features.length;i < ii;++i) { + this.addFeatureInternal(features[i]) + } +}; +ol.source.Vector.prototype.clear = function() { + this.rBush_.forEach(this.removeFeatureInternal, this); + this.rBush_.clear(); + goog.object.forEach(this.nullGeometryFeatures_, this.removeFeatureInternal, this); + goog.object.clear(this.nullGeometryFeatures_); + goog.asserts.assert(goog.object.isEmpty(this.featureChangeKeys_)); + this.dispatchChangeEvent() +}; +ol.source.Vector.prototype.forEachFeature = function(f, opt_this) { + return this.rBush_.forEach(f, opt_this) +}; +ol.source.Vector.prototype.forEachFeatureAtCoordinate = function(coordinate, f, opt_this) { + var extent = [coordinate[0], coordinate[1], coordinate[0], coordinate[1]]; + return this.forEachFeatureInExtent(extent, function(feature) { + var geometry = feature.getGeometry(); + goog.asserts.assert(!goog.isNull(geometry)); + if(geometry.containsCoordinate(coordinate)) { + return f.call(opt_this, feature) + }else { + return undefined + } + }) +}; +ol.source.Vector.prototype.forEachFeatureInExtent = function(extent, f, opt_this) { + return this.rBush_.forEachInExtent(extent, f, opt_this) +}; +ol.source.Vector.prototype.getFeatures = function() { + var features = this.rBush_.getAll(); + if(!goog.object.isEmpty(this.nullGeometryFeatures_)) { + goog.array.extend(features, goog.object.getValues(this.nullGeometryFeatures_)) + } + return features +}; +ol.source.Vector.prototype.getFeaturesAtCoordinate = function(coordinate) { + var features = []; + this.forEachFeatureAtCoordinate(coordinate, function(feature) { + features.push(feature) + }); + return features +}; +ol.source.Vector.prototype.getFeaturesInExtent = function(extent) { + return this.rBush_.getInExtent(extent) +}; +ol.source.Vector.prototype.getClosestFeatureToCoordinate = function(coordinate) { + var x = coordinate[0]; + var y = coordinate[1]; + var closestFeature = null; + var closestPoint = [NaN, NaN]; + var minSquaredDistance = Infinity; + var extent = [-Infinity, -Infinity, Infinity, Infinity]; + this.rBush_.forEachInExtent(extent, function(feature) { + var geometry = feature.getGeometry(); + goog.asserts.assert(!goog.isNull(geometry)); + var previousMinSquaredDistance = minSquaredDistance; + minSquaredDistance = geometry.closestPointXY(x, y, closestPoint, minSquaredDistance); + if(minSquaredDistance < previousMinSquaredDistance) { + closestFeature = feature; + var minDistance = Math.sqrt(minSquaredDistance); + extent[0] = x - minDistance; + extent[1] = y - minDistance; + extent[2] = x + minDistance; + extent[3] = y + minDistance + } + }); + return closestFeature +}; +ol.source.Vector.prototype.getExtent = function() { + return this.rBush_.getExtent() +}; +ol.source.Vector.prototype.handleFeatureChange_ = function(event) { + var feature = (event.target); + var featureKey = goog.getUid(feature).toString(); + var geometry = feature.getGeometry(); + if(goog.isNull(geometry)) { + if(!(featureKey in this.nullGeometryFeatures_)) { + this.rBush_.remove(feature); + this.nullGeometryFeatures_[featureKey] = feature + } + }else { + var extent = geometry.getExtent(); + if(featureKey in this.nullGeometryFeatures_) { + delete this.nullGeometryFeatures_[featureKey]; + this.rBush_.insert(extent, feature) + }else { + this.rBush_.update(extent, feature) + } + } + this.dispatchChangeEvent() +}; +ol.source.Vector.prototype.isEmpty = function() { + return this.rBush_.isEmpty() && goog.object.isEmpty(this.nullGeometryFeatures_) +}; +ol.source.Vector.prototype.removeFeature = function(feature) { + var featureKey = goog.getUid(feature).toString(); + if(featureKey in this.nullGeometryFeatures_) { + delete this.nullGeometryFeatures_[featureKey] + }else { + this.rBush_.remove(feature) + } + this.removeFeatureInternal(feature); + this.dispatchChangeEvent() +}; +ol.source.Vector.prototype.removeFeatureInternal = function(feature) { + var featureKey = goog.getUid(feature).toString(); + goog.asserts.assert(featureKey in this.featureChangeKeys_); + goog.events.unlistenByKey(this.featureChangeKeys_[featureKey]); + delete this.featureChangeKeys_[featureKey]; + this.dispatchEvent(new ol.source.VectorEvent(ol.source.VectorEventType.REMOVEFEATURE, feature)) +}; +ol.source.VectorEvent = function(type, opt_feature) { + goog.base(this, type); + this.feature = opt_feature +}; +goog.inherits(ol.source.VectorEvent, goog.events.Event); +goog.provide("ol.renderer.canvas.VectorLayer"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.functions"); +goog.require("ol.ViewHint"); +goog.require("ol.extent"); +goog.require("ol.feature"); +goog.require("ol.layer.Vector"); +goog.require("ol.render.EventType"); +goog.require("ol.render.canvas.ReplayGroup"); +goog.require("ol.renderer.canvas.Layer"); +goog.require("ol.renderer.vector"); +goog.require("ol.source.Vector"); +ol.renderer.canvas.VectorLayer = function(mapRenderer, vectorLayer) { + goog.base(this, mapRenderer, vectorLayer); + this.dirty_ = false; + this.renderedRevision_ = -1; + this.renderedResolution_ = NaN; + this.renderedExtent_ = ol.extent.createEmpty(); + this.replayGroup_ = null; + var canvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + this.context_ = (canvas.getContext("2d")) +}; +goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer); +ol.renderer.canvas.VectorLayer.prototype.composeFrame = function(frameState, layerState, context) { + var transform = this.getTransform(frameState); + this.dispatchPreComposeEvent(context, frameState, transform); + var replayGroup = this.replayGroup_; + if(!goog.isNull(replayGroup) && !replayGroup.isEmpty()) { + var layer = this.getLayer(); + var replayContext; + if(layer.hasListener(ol.render.EventType.RENDER)) { + this.context_.canvas.width = context.canvas.width; + this.context_.canvas.height = context.canvas.height; + replayContext = this.context_ + }else { + replayContext = context + } + var renderGeometryFunction = this.getRenderGeometryFunction_(); + goog.asserts.assert(goog.isFunction(renderGeometryFunction)); + replayContext.globalAlpha = layerState.opacity; + replayGroup.replay(replayContext, frameState.extent, frameState.pixelRatio, transform, frameState.view2DState.rotation, renderGeometryFunction); + if(replayContext != context) { + this.dispatchRenderEvent(replayContext, frameState, transform); + context.drawImage(replayContext.canvas, 0, 0) + } + } + this.dispatchPostComposeEvent(context, frameState, transform) +}; +ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtPixel = function(coordinate, frameState, callback, thisArg) { + if(goog.isNull(this.replayGroup_)) { + return undefined + }else { + var extent = frameState.extent; + var resolution = frameState.view2DState.resolution; + var rotation = frameState.view2DState.rotation; + var layer = this.getLayer(); + var renderGeometryFunction = this.getRenderGeometryFunction_(); + goog.asserts.assert(goog.isFunction(renderGeometryFunction)); + return this.replayGroup_.forEachGeometryAtPixel(extent, resolution, rotation, coordinate, renderGeometryFunction, function(geometry, data) { + var feature = (data); + goog.asserts.assert(goog.isDef(feature)); + return callback.call(thisArg, feature, layer) + }) + } +}; +ol.renderer.canvas.VectorLayer.prototype.getRenderGeometryFunction_ = function() { + var vectorLayer = this.getLayer(); + goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector); + var renderGeometryFunctions = vectorLayer.getRenderGeometryFunctions(); + if(!goog.isDef(renderGeometryFunctions)) { + return goog.functions.TRUE + } + var renderGeometryFunctionsArray = renderGeometryFunctions.getArray(); + switch(renderGeometryFunctionsArray.length) { + case 0: + return goog.functions.TRUE; + case 1: + return renderGeometryFunctionsArray[0]; + default: + return function(geometry) { + var i, ii; + for(i = 0, ii = renderGeometryFunctionsArray.length;i < ii;++i) { + if(!renderGeometryFunctionsArray[i](geometry)) { + return false + } + } + return true + } + } +}; +ol.renderer.canvas.VectorLayer.prototype.handleImageChange_ = function(event) { + this.renderIfReadyAndVisible() +}; +ol.renderer.canvas.VectorLayer.prototype.prepareFrame = function(frameState, layerState) { + var vectorLayer = this.getLayer(); + goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector); + var vectorSource = vectorLayer.getSource(); + goog.asserts.assertInstanceof(vectorSource, ol.source.Vector); + this.updateAttributions(frameState.attributions, vectorSource.getAttributions()); + this.updateLogos(frameState, vectorSource); + if(!this.dirty_ && (frameState.viewHints[ol.ViewHint.ANIMATING] || frameState.viewHints[ol.ViewHint.INTERACTING])) { + return + } + var frameStateExtent = frameState.extent; + var frameStateResolution = frameState.view2DState.resolution; + var pixelRatio = frameState.pixelRatio; + var vectorLayerRevision = vectorLayer.getRevision(); + if(!this.dirty_ && this.renderedResolution_ == frameStateResolution && this.renderedRevision_ == vectorLayerRevision && ol.extent.containsExtent(this.renderedExtent_, frameStateExtent)) { + return + } + var extent = this.renderedExtent_; + var xBuffer = ol.extent.getWidth(frameStateExtent) / 4; + var yBuffer = ol.extent.getHeight(frameStateExtent) / 4; + extent[0] = frameStateExtent[0] - xBuffer; + extent[1] = frameStateExtent[1] - yBuffer; + extent[2] = frameStateExtent[2] + xBuffer; + extent[3] = frameStateExtent[3] + yBuffer; + goog.dispose(this.replayGroup_); + this.replayGroup_ = null; + this.dirty_ = false; + var styleFunction = vectorLayer.getStyleFunction(); + if(!goog.isDef(styleFunction)) { + styleFunction = ol.feature.defaultStyleFunction + } + var tolerance = frameStateResolution / (2 * pixelRatio); + var replayGroup = new ol.render.canvas.ReplayGroup(tolerance, extent); + vectorSource.forEachFeatureInExtent(extent, function(feature) { + var dirty = this.renderFeature(feature, frameStateResolution, pixelRatio, styleFunction, replayGroup); + this.dirty_ = this.dirty_ || dirty + }, this); + replayGroup.finish(); + this.renderedResolution_ = frameStateResolution; + this.renderedRevision_ = vectorLayerRevision; + this.replayGroup_ = replayGroup +}; +ol.renderer.canvas.VectorLayer.prototype.renderFeature = function(feature, resolution, pixelRatio, styleFunction, replayGroup) { + var styles = styleFunction(feature, resolution); + if(!goog.isDefAndNotNull(styles)) { + return false + } + var squaredTolerance = resolution * resolution / (4 * pixelRatio * pixelRatio); + var i, ii, loading = false; + for(i = 0, ii = styles.length;i < ii;++i) { + loading = ol.renderer.vector.renderFeature(replayGroup, feature, styles[i], squaredTolerance, feature, this.handleImageChange_, this) || loading + } + return loading +}; +goog.provide("ol.renderer.canvas.Map"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.style"); +goog.require("goog.vec.Mat4"); +goog.require("ol.css"); +goog.require("ol.layer.Image"); +goog.require("ol.layer.Tile"); +goog.require("ol.layer.Vector"); +goog.require("ol.render.Event"); +goog.require("ol.render.EventType"); +goog.require("ol.render.canvas.Immediate"); +goog.require("ol.renderer.Map"); +goog.require("ol.renderer.canvas.ImageLayer"); +goog.require("ol.renderer.canvas.Layer"); +goog.require("ol.renderer.canvas.TileLayer"); +goog.require("ol.renderer.canvas.VectorLayer"); +goog.require("ol.source.State"); +goog.require("ol.vec.Mat4"); +ol.renderer.canvas.Map = function(container, map) { + goog.base(this, container, map); + this.canvas_ = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + this.canvas_.style.width = "100%"; + this.canvas_.style.height = "100%"; + this.canvas_.className = ol.css.CLASS_UNSELECTABLE; + goog.dom.insertChildAt(container, this.canvas_, 0); + this.renderedVisible_ = true; + this.context_ = (this.canvas_.getContext("2d")); + this.transform_ = goog.vec.Mat4.createNumber() +}; +goog.inherits(ol.renderer.canvas.Map, ol.renderer.Map); +ol.renderer.canvas.Map.prototype.createLayerRenderer = function(layer) { + if(ol.ENABLE_IMAGE && layer instanceof ol.layer.Image) { + return new ol.renderer.canvas.ImageLayer(this, layer) + }else { + if(ol.ENABLE_TILE && layer instanceof ol.layer.Tile) { + return new ol.renderer.canvas.TileLayer(this, layer) + }else { + if(ol.ENABLE_VECTOR && layer instanceof ol.layer.Vector) { + return new ol.renderer.canvas.VectorLayer(this, layer) + }else { + goog.asserts.fail(); + return null + } + } + } +}; +ol.renderer.canvas.Map.prototype.dispatchComposeEvent_ = function(type, frameState) { + var map = this.getMap(); + var context = this.context_; + if(map.hasListener(type)) { + var view2DState = frameState.view2DState; + var pixelRatio = frameState.pixelRatio; + ol.vec.Mat4.makeTransform2D(this.transform_, this.canvas_.width / 2, this.canvas_.height / 2, pixelRatio / view2DState.resolution, -pixelRatio / view2DState.resolution, -view2DState.rotation, -view2DState.center[0], -view2DState.center[1]); + var render = new ol.render.canvas.Immediate(context, pixelRatio, frameState.extent, this.transform_, view2DState.rotation); + var composeEvent = new ol.render.Event(type, map, render, frameState, context, null); + map.dispatchEvent(composeEvent); + render.flush() + } +}; +ol.renderer.canvas.Map.prototype.getCanvasLayerRenderer = function(layer) { + var layerRenderer = this.getLayerRenderer(layer); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.canvas.Layer); + return(layerRenderer) +}; +ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) { + if(goog.isNull(frameState)) { + if(this.renderedVisible_) { + goog.style.setElementShown(this.canvas_, false); + this.renderedVisible_ = false + } + return + } + var context = this.context_; + var width = frameState.size[0] * frameState.pixelRatio; + var height = frameState.size[1] * frameState.pixelRatio; + if(this.canvas_.width != width || this.canvas_.height != height) { + this.canvas_.width = width; + this.canvas_.height = height + }else { + context.clearRect(0, 0, this.canvas_.width, this.canvas_.height) + } + this.calculateMatrices2D(frameState); + this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, frameState); + var layerStates = frameState.layerStates; + var layersArray = frameState.layersArray; + var viewResolution = frameState.view2DState.resolution; + var i, ii, layer, layerRenderer, layerState; + for(i = 0, ii = layersArray.length;i < ii;++i) { + layer = layersArray[i]; + layerRenderer = this.getLayerRenderer(layer); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.canvas.Layer); + layerState = layerStates[goog.getUid(layer)]; + if(!layerState.visible || layerState.sourceState != ol.source.State.READY || viewResolution >= layerState.maxResolution || viewResolution < layerState.minResolution) { + continue + } + layerRenderer.prepareFrame(frameState, layerState); + layerRenderer.composeFrame(frameState, layerState, context) + } + this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState); + if(!this.renderedVisible_) { + goog.style.setElementShown(this.canvas_, true); + this.renderedVisible_ = true + } + this.scheduleRemoveUnusedLayerRenderers(frameState); + this.scheduleExpireIconCache(frameState) +}; +goog.provide("ol.dom"); +goog.provide("ol.dom.BrowserFeature"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.style"); +goog.require("goog.userAgent"); +goog.require("goog.vec.Mat4"); +ol.dom.BrowserFeature = {USE_MS_MATRIX_TRANSFORM:ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE, USE_MS_ALPHA_FILTER:ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE}; +ol.dom.canUseCssTransform = function() { + var canUseCssTransform; + return function() { + if(!goog.isDef(canUseCssTransform)) { + goog.asserts.assert(!goog.isNull(document.body)); + if(!goog.global.getComputedStyle) { + canUseCssTransform = false + }else { + var el = goog.dom.createElement(goog.dom.TagName.P), has2d, transforms = {"webkitTransform":"-webkit-transform", "OTransform":"-o-transform", "msTransform":"-ms-transform", "MozTransform":"-moz-transform", "transform":"transform"}; + goog.dom.appendChild(document.body, el); + for(var t in transforms) { + if(t in el.style) { + el.style[t] = "translate(1px,1px)"; + has2d = goog.global.getComputedStyle(el).getPropertyValue(transforms[t]) + } + } + goog.dom.removeNode(el); + canUseCssTransform = has2d && has2d !== "none" + } + } + return canUseCssTransform + } +}(); +ol.dom.canUseCssTransform3D = function() { + var canUseCssTransform3D; + return function() { + if(!goog.isDef(canUseCssTransform3D)) { + goog.asserts.assert(!goog.isNull(document.body)); + if(!goog.global.getComputedStyle) { + canUseCssTransform3D = false + }else { + var el = goog.dom.createElement(goog.dom.TagName.P), has3d, transforms = {"webkitTransform":"-webkit-transform", "OTransform":"-o-transform", "msTransform":"-ms-transform", "MozTransform":"-moz-transform", "transform":"transform"}; + goog.dom.appendChild(document.body, el); + for(var t in transforms) { + if(t in el.style) { + el.style[t] = "translate3d(1px,1px,1px)"; + has3d = goog.global.getComputedStyle(el).getPropertyValue(transforms[t]) + } + } + goog.dom.removeNode(el); + canUseCssTransform3D = has3d && has3d !== "none" + } + } + return canUseCssTransform3D + } +}(); +ol.dom.setTransform = function(element, value) { + var style = element.style; + style.WebkitTransform = value; + style.MozTransform = value; + style.OTransform = value; + style.msTransform = value; + style.transform = value; + if(goog.userAgent.IE && !ol.IS_LEGACY_IE) { + element.style.transformOrigin = "0 0" + } +}; +ol.dom.setOpacity = function(element, value) { + if(ol.dom.BrowserFeature.USE_MS_ALPHA_FILTER) { + var filter = element.currentStyle.filter; + var regex; + var alpha; + if(goog.userAgent.VERSION == "8.0") { + regex = /progid:DXImageTransform\.Microsoft\.Alpha\(.*?\)/i, alpha = "progid:DXImageTransform.Microsoft.Alpha(Opacity\x3d" + value * 100 + ")" + }else { + regex = /alpha\(.*?\)/i; + alpha = "alpha(opacity\x3d" + value * 100 + ")" + } + var newFilter = filter.replace(regex, alpha); + if(newFilter === filter) { + newFilter += " " + alpha + } + element.style.filter = newFilter; + if(element.currentStyle.zIndex === "auto") { + element.style.zIndex = 0 + } + }else { + goog.style.setOpacity(element, value) + } +}; +ol.dom.setIEMatrix_ = function(element, value) { + var filter = element.currentStyle.filter; + var newFilter = filter.replace(/progid:DXImageTransform.Microsoft.Matrix\(.*?\)/i, value); + if(newFilter === filter) { + newFilter = " " + value + } + element.style.filter = newFilter; + if(element.currentStyle.zIndex === "auto") { + element.style.zIndex = 0 + } +}; +ol.dom.transformElement2D = function(element, transform, opt_precision, opt_translationElement) { + var i; + if(ol.dom.canUseCssTransform3D()) { + var value3D; + if(goog.isDef(opt_precision)) { + var strings3D = new Array(16); + for(i = 0;i < 16;++i) { + strings3D[i] = transform[i].toFixed(opt_precision) + } + value3D = strings3D.join(",") + }else { + value3D = transform.join(",") + } + ol.dom.setTransform(element, "matrix3d(" + value3D + ")") + }else { + if(ol.dom.canUseCssTransform()) { + var transform2D = [goog.vec.Mat4.getElement(transform, 0, 0), goog.vec.Mat4.getElement(transform, 1, 0), goog.vec.Mat4.getElement(transform, 0, 1), goog.vec.Mat4.getElement(transform, 1, 1), goog.vec.Mat4.getElement(transform, 0, 3), goog.vec.Mat4.getElement(transform, 1, 3)]; + var value2D; + if(goog.isDef(opt_precision)) { + var strings2D = new Array(6); + for(i = 0;i < 6;++i) { + strings2D[i] = transform2D[i].toFixed(opt_precision) + } + value2D = strings2D.join(",") + }else { + value2D = transform2D.join(",") + } + ol.dom.setTransform(element, "matrix(" + value2D + ")") + }else { + if(ol.dom.BrowserFeature.USE_MS_MATRIX_TRANSFORM) { + var m11 = goog.vec.Mat4.getElement(transform, 0, 0), m12 = goog.vec.Mat4.getElement(transform, 0, 1), m21 = goog.vec.Mat4.getElement(transform, 1, 0), m22 = goog.vec.Mat4.getElement(transform, 1, 1), dx = goog.vec.Mat4.getElement(transform, 0, 3), dy = goog.vec.Mat4.getElement(transform, 1, 3); + var s = "progid:DXImageTransform.Microsoft.Matrix("; + s += 'sizingMethod\x3d"auto expand"'; + s += ",M11\x3d" + m11.toFixed(opt_precision || 20); + s += ",M12\x3d" + m12.toFixed(opt_precision || 20); + s += ",M21\x3d" + m21.toFixed(opt_precision || 20); + s += ",M22\x3d" + m22.toFixed(opt_precision || 20); + s += ")"; + ol.dom.setIEMatrix_(element, s); + dx /= m11; + dy /= m22; + opt_translationElement.style.left = Math.round(dx) + "px"; + opt_translationElement.style.top = Math.round(dy) + "px" + }else { + element.style.left = Math.round(goog.vec.Mat4.getElement(transform, 0, 3)) + "px"; + element.style.top = Math.round(goog.vec.Mat4.getElement(transform, 1, 3)) + "px" + } + } + } +}; +goog.provide("ol.renderer.dom.Layer"); +goog.require("goog.dom"); +goog.require("ol.layer.Layer"); +goog.require("ol.renderer.Layer"); +ol.renderer.dom.Layer = function(mapRenderer, layer, target) { + goog.base(this, mapRenderer, layer); + this.target = target +}; +goog.inherits(ol.renderer.dom.Layer, ol.renderer.Layer); +ol.renderer.dom.Layer.prototype.getTarget = function() { + return this.target +}; +goog.provide("ol.renderer.dom.ImageLayer"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.vec.Mat4"); +goog.require("ol.ImageBase"); +goog.require("ol.ImageState"); +goog.require("ol.ViewHint"); +goog.require("ol.dom"); +goog.require("ol.layer.Image"); +goog.require("ol.renderer.dom.Layer"); +goog.require("ol.source.Image"); +goog.require("ol.vec.Mat4"); +ol.renderer.dom.ImageLayer = function(mapRenderer, imageLayer) { + var target = goog.dom.createElement(goog.dom.TagName.DIV); + target.style.position = "absolute"; + goog.base(this, mapRenderer, imageLayer, target); + this.image_ = null; + this.transform_ = goog.vec.Mat4.createNumberIdentity() +}; +goog.inherits(ol.renderer.dom.ImageLayer, ol.renderer.dom.Layer); +ol.renderer.dom.ImageLayer.prototype.forEachFeatureAtPixel = function(coordinate, frameState, callback, thisArg) { + var layer = this.getLayer(); + var source = layer.getSource(); + goog.asserts.assertInstanceof(source, ol.source.Image); + var extent = frameState.extent; + var resolution = frameState.view2DState.resolution; + var rotation = frameState.view2DState.rotation; + return source.forEachFeatureAtPixel(extent, resolution, rotation, coordinate, function(feature) { + return callback.call(thisArg, feature, layer) + }) +}; +ol.renderer.dom.ImageLayer.prototype.prepareFrame = function(frameState, layerState) { + var view2DState = frameState.view2DState; + var viewCenter = view2DState.center; + var viewResolution = view2DState.resolution; + var viewRotation = view2DState.rotation; + var image = this.image_; + var imageLayer = this.getLayer(); + goog.asserts.assertInstanceof(imageLayer, ol.layer.Image); + var imageSource = imageLayer.getSource(); + goog.asserts.assertInstanceof(imageSource, ol.source.Image); + var hints = frameState.viewHints; + if(!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) { + var image_ = imageSource.getImage(frameState.extent, viewResolution, frameState.pixelRatio, view2DState.projection); + if(!goog.isNull(image_)) { + var imageState = image_.getState(); + if(imageState == ol.ImageState.IDLE) { + goog.events.listenOnce(image_, goog.events.EventType.CHANGE, this.handleImageChange, false, this); + image_.load() + }else { + if(imageState == ol.ImageState.LOADED) { + image = image_ + } + } + } + } + if(!goog.isNull(image)) { + var imageExtent = image.getExtent(); + var imageResolution = image.getResolution(); + var transform = goog.vec.Mat4.createNumber(); + ol.vec.Mat4.makeTransform2D(transform, frameState.size[0] / 2, frameState.size[1] / 2, imageResolution / viewResolution, imageResolution / viewResolution, viewRotation, (imageExtent[0] - viewCenter[0]) / imageResolution, (viewCenter[1] - imageExtent[3]) / imageResolution); + if(image != this.image_) { + var imageElement = image.getImageElement(this); + imageElement.style.maxWidth = "none"; + imageElement.style.position = "absolute"; + goog.dom.removeChildren(this.target); + goog.dom.appendChild(this.target, imageElement); + this.image_ = image + } + this.setTransform_(transform); + this.updateAttributions(frameState.attributions, image.getAttributions()); + this.updateLogos(frameState, imageSource) + } +}; +ol.renderer.dom.ImageLayer.prototype.setTransform_ = function(transform) { + if(!ol.vec.Mat4.equals2D(transform, this.transform_)) { + ol.dom.transformElement2D(this.target, transform, 6); + goog.vec.Mat4.setFromArray(this.transform_, transform) + } +}; +goog.provide("ol.renderer.dom.TileLayer"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.object"); +goog.require("goog.style"); +goog.require("goog.vec.Mat4"); +goog.require("ol.Coordinate"); +goog.require("ol.Tile"); +goog.require("ol.TileCoord"); +goog.require("ol.TileRange"); +goog.require("ol.TileState"); +goog.require("ol.ViewHint"); +goog.require("ol.dom"); +goog.require("ol.dom.BrowserFeature"); +goog.require("ol.extent"); +goog.require("ol.layer.Tile"); +goog.require("ol.renderer.dom.Layer"); +goog.require("ol.source.Tile"); +goog.require("ol.tilegrid.TileGrid"); +goog.require("ol.vec.Mat4"); +ol.renderer.dom.TileLayer = function(mapRenderer, tileLayer) { + var target = goog.dom.createElement(goog.dom.TagName.DIV); + target.style.position = "absolute"; + if(ol.dom.BrowserFeature.USE_MS_MATRIX_TRANSFORM) { + target.style.width = "100%"; + target.style.height = "100%" + } + goog.base(this, mapRenderer, tileLayer, target); + this.renderedVisible_ = true; + this.renderedOpacity_ = 1; + this.renderedRevision_ = 0; + this.tileLayerZs_ = {} +}; +goog.inherits(ol.renderer.dom.TileLayer, ol.renderer.dom.Layer); +ol.renderer.dom.TileLayer.prototype.prepareFrame = function(frameState, layerState) { + if(!layerState.visible) { + if(this.renderedVisible_) { + goog.style.setElementShown(this.target, false); + this.renderedVisible_ = false + } + return + } + var pixelRatio = frameState.pixelRatio; + var view2DState = frameState.view2DState; + var projection = view2DState.projection; + var tileLayer = this.getLayer(); + goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile); + var tileSource = tileLayer.getSource(); + goog.asserts.assertInstanceof(tileSource, ol.source.Tile); + var tileGrid = tileSource.getTileGridForProjection(projection); + var tileGutter = tileSource.getGutter(); + var z = tileGrid.getZForResolution(view2DState.resolution); + var tileResolution = tileGrid.getResolution(z); + var center = view2DState.center; + var extent; + if(tileResolution == view2DState.resolution) { + center = this.snapCenterToPixel(center, tileResolution, frameState.size); + extent = ol.extent.getForView2DAndSize(center, tileResolution, view2DState.rotation, frameState.size) + }else { + extent = frameState.extent + } + var tileRange = tileGrid.getTileRangeForExtentAndResolution(extent, tileResolution); + var tilesToDrawByZ = {}; + tilesToDrawByZ[z] = {}; + var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { + return!goog.isNull(tile) && tile.getState() == ol.TileState.LOADED + }, tileSource, pixelRatio, projection); + var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, tilesToDrawByZ, getTileIfLoaded); + var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError(); + if(!goog.isDef(useInterimTilesOnError)) { + useInterimTilesOnError = true + } + var tmpExtent = ol.extent.createEmpty(); + var tmpTileRange = new ol.TileRange(0, 0, 0, 0); + var childTileRange, fullyLoaded, tile, tileState, x, y; + for(x = tileRange.minX;x <= tileRange.maxX;++x) { + for(y = tileRange.minY;y <= tileRange.maxY;++y) { + tile = tileSource.getTile(z, x, y, pixelRatio, projection); + tileState = tile.getState(); + if(tileState == ol.TileState.LOADED) { + tilesToDrawByZ[z][tile.tileCoord.toString()] = tile; + continue + }else { + if(tileState == ol.TileState.EMPTY || tileState == ol.TileState.ERROR && !useInterimTilesOnError) { + continue + } + } + fullyLoaded = tileGrid.forEachTileCoordParentTileRange(tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent); + if(!fullyLoaded) { + childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord, tmpTileRange, tmpExtent); + if(!goog.isNull(childTileRange)) { + findLoadedTiles(z + 1, childTileRange) + } + } + } + } + var tileLayerZ, tileLayerZKey; + if(this.renderedRevision_ != tileSource.getRevision()) { + for(tileLayerZKey in this.tileLayerZs_) { + tileLayerZ = this.tileLayerZs_[+tileLayerZKey]; + goog.dom.removeNode(tileLayerZ.target) + } + this.tileLayerZs_ = {}; + this.renderedRevision_ = tileSource.getRevision() + } + var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number); + goog.array.sort(zs); + var newTileLayerZKeys = {}; + var iz, iziz, tileCoordKey, tileCoordOrigin, tilesToDraw; + for(iz = 0, iziz = zs.length;iz < iziz;++iz) { + tileLayerZKey = zs[iz]; + if(tileLayerZKey in this.tileLayerZs_) { + tileLayerZ = this.tileLayerZs_[tileLayerZKey] + }else { + tileCoordOrigin = tileGrid.getTileCoordForCoordAndZ(center, tileLayerZKey); + tileLayerZ = new ol.renderer.dom.TileLayerZ_(tileGrid, tileCoordOrigin); + newTileLayerZKeys[tileLayerZKey] = true; + this.tileLayerZs_[tileLayerZKey] = tileLayerZ + } + tilesToDraw = tilesToDrawByZ[tileLayerZKey]; + for(tileCoordKey in tilesToDraw) { + tileLayerZ.addTile(tilesToDraw[tileCoordKey], tileGutter) + } + tileLayerZ.finalizeAddTiles() + } + var tileLayerZKeys = goog.array.map(goog.object.getKeys(this.tileLayerZs_), Number); + goog.array.sort(tileLayerZKeys); + var i, ii, j, origin, resolution; + var transform = goog.vec.Mat4.createNumber(); + for(i = 0, ii = tileLayerZKeys.length;i < ii;++i) { + tileLayerZKey = tileLayerZKeys[i]; + tileLayerZ = this.tileLayerZs_[tileLayerZKey]; + if(!(tileLayerZKey in tilesToDrawByZ)) { + goog.dom.removeNode(tileLayerZ.target); + delete this.tileLayerZs_[tileLayerZKey]; + continue + } + resolution = tileLayerZ.getResolution(); + origin = tileLayerZ.getOrigin(); + ol.vec.Mat4.makeTransform2D(transform, frameState.size[0] / 2, frameState.size[1] / 2, resolution / view2DState.resolution, resolution / view2DState.resolution, view2DState.rotation, (origin[0] - center[0]) / resolution, (center[1] - origin[1]) / resolution); + tileLayerZ.setTransform(transform); + if(tileLayerZKey in newTileLayerZKeys) { + for(j = tileLayerZKey - 1;j >= 0;--j) { + if(j in this.tileLayerZs_) { + goog.dom.insertSiblingAfter(tileLayerZ.target, this.tileLayerZs_[j].target); + break + } + } + if(j < 0) { + goog.dom.insertChildAt(this.target, tileLayerZ.target, 0) + } + }else { + if(!frameState.viewHints[ol.ViewHint.ANIMATING] && !frameState.viewHints[ol.ViewHint.INTERACTING]) { + tileLayerZ.removeTilesOutsideExtent(extent, tmpTileRange) + } + } + } + if(layerState.opacity != this.renderedOpacity_) { + ol.dom.setOpacity(this.target, layerState.opacity); + this.renderedOpacity_ = layerState.opacity + } + if(layerState.visible && !this.renderedVisible_) { + goog.style.setElementShown(this.target, true); + this.renderedVisible_ = true + } + this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); + this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio, projection, extent, z, tileLayer.getPreload()); + this.scheduleExpireCache(frameState, tileSource); + this.updateLogos(frameState, tileSource) +}; +ol.renderer.dom.TileLayerZ_ = function(tileGrid, tileCoordOrigin) { + this.target = goog.dom.createElement(goog.dom.TagName.DIV); + this.target.style.position = "absolute"; + this.target.style.width = "100%"; + this.target.style.height = "100%"; + if(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + this.translateTarget_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.translateTarget_.style.position = "absolute"; + this.translateTarget_.style.width = "100%"; + this.translateTarget_.style.height = "100%"; + goog.dom.appendChild(this.target, this.translateTarget_) + } + this.tileGrid_ = tileGrid; + this.tileCoordOrigin_ = tileCoordOrigin; + this.origin_ = ol.extent.getTopLeft(tileGrid.getTileCoordExtent(tileCoordOrigin)); + this.resolution_ = tileGrid.getResolution(tileCoordOrigin.z); + this.tiles_ = {}; + this.documentFragment_ = null; + this.transform_ = goog.vec.Mat4.createNumberIdentity() +}; +ol.renderer.dom.TileLayerZ_.prototype.addTile = function(tile, tileGutter) { + var tileCoord = tile.tileCoord; + goog.asserts.assert(tileCoord.z == this.tileCoordOrigin_.z); + var tileCoordKey = tileCoord.toString(); + if(tileCoordKey in this.tiles_) { + return + } + var tileSize = this.tileGrid_.getTileSize(tileCoord.z); + var image = tile.getImage(this); + var imageStyle = image.style; + imageStyle.maxWidth = "none"; + var tileElement; + var tileElementStyle; + if(tileGutter > 0) { + tileElement = goog.dom.createElement(goog.dom.TagName.DIV); + tileElementStyle = tileElement.style; + tileElementStyle.overflow = "hidden"; + tileElementStyle.width = tileSize + "px"; + tileElementStyle.height = tileSize + "px"; + imageStyle.position = "absolute"; + imageStyle.left = -tileGutter + "px"; + imageStyle.top = -tileGutter + "px"; + imageStyle.width = tileSize + 2 * tileGutter + "px"; + imageStyle.height = tileSize + 2 * tileGutter + "px"; + goog.dom.appendChild(tileElement, image) + }else { + imageStyle.width = tileSize + "px"; + imageStyle.height = tileSize + "px"; + tileElement = image; + tileElementStyle = imageStyle + } + tileElementStyle.position = "absolute"; + tileElementStyle.left = (tileCoord.x - this.tileCoordOrigin_.x) * tileSize + "px"; + tileElementStyle.top = (this.tileCoordOrigin_.y - tileCoord.y) * tileSize + "px"; + if(goog.isNull(this.documentFragment_)) { + this.documentFragment_ = document.createDocumentFragment() + } + goog.dom.appendChild(this.documentFragment_, tileElement); + this.tiles_[tileCoordKey] = tile +}; +ol.renderer.dom.TileLayerZ_.prototype.finalizeAddTiles = function() { + if(!goog.isNull(this.documentFragment_)) { + if(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + goog.dom.appendChild(this.translateTarget_, this.documentFragment_) + }else { + goog.dom.appendChild(this.target, this.documentFragment_) + } + this.documentFragment_ = null + } +}; +ol.renderer.dom.TileLayerZ_.prototype.getOrigin = function() { + return this.origin_ +}; +ol.renderer.dom.TileLayerZ_.prototype.getResolution = function() { + return this.resolution_ +}; +ol.renderer.dom.TileLayerZ_.prototype.removeTilesOutsideExtent = function(extent, opt_tileRange) { + var tileRange = this.tileGrid_.getTileRangeForExtentAndZ(extent, this.tileCoordOrigin_.z, opt_tileRange); + var tilesToRemove = []; + var tile, tileCoordKey; + for(tileCoordKey in this.tiles_) { + tile = this.tiles_[tileCoordKey]; + if(!tileRange.contains(tile.tileCoord)) { + tilesToRemove.push(tile) + } + } + var i, ii; + for(i = 0, ii = tilesToRemove.length;i < ii;++i) { + tile = tilesToRemove[i]; + tileCoordKey = tile.tileCoord.toString(); + goog.dom.removeNode(tile.getImage(this)); + delete this.tiles_[tileCoordKey] + } +}; +ol.renderer.dom.TileLayerZ_.prototype.setTransform = function(transform) { + if(!ol.vec.Mat4.equals2D(transform, this.transform_)) { + if(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + ol.dom.transformElement2D(this.target, transform, 6, this.translateTarget_) + }else { + ol.dom.transformElement2D(this.target, transform, 6) + } + goog.vec.Mat4.setFromArray(this.transform_, transform) + } +}; +goog.provide("ol.renderer.dom.Map"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.functions"); +goog.require("goog.style"); +goog.require("ol.css"); +goog.require("ol.layer.Image"); +goog.require("ol.layer.Tile"); +goog.require("ol.renderer.Map"); +goog.require("ol.renderer.dom.ImageLayer"); +goog.require("ol.renderer.dom.Layer"); +goog.require("ol.renderer.dom.TileLayer"); +goog.require("ol.source.State"); +ol.renderer.dom.Map = function(container, map) { + goog.base(this, container, map); + this.layersPane_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.layersPane_.className = ol.css.CLASS_UNSELECTABLE; + var style = this.layersPane_.style; + style.position = "absolute"; + style.width = "100%"; + style.height = "100%"; + if(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + this.layersPane_.ondragstart = goog.functions.FALSE; + this.layersPane_.onselectstart = goog.functions.FALSE + } + goog.dom.insertChildAt(container, this.layersPane_, 0); + this.renderedVisible_ = true +}; +goog.inherits(ol.renderer.dom.Map, ol.renderer.Map); +ol.renderer.dom.Map.prototype.createLayerRenderer = function(layer) { + var layerRenderer; + if(ol.ENABLE_IMAGE && layer instanceof ol.layer.Image) { + layerRenderer = new ol.renderer.dom.ImageLayer(this, layer) + }else { + if(ol.ENABLE_TILE && layer instanceof ol.layer.Tile) { + layerRenderer = new ol.renderer.dom.TileLayer(this, layer) + }else { + goog.asserts.fail(); + return null + } + } + return layerRenderer +}; +ol.renderer.dom.Map.prototype.renderFrame = function(frameState) { + if(goog.isNull(frameState)) { + if(this.renderedVisible_) { + goog.style.setElementShown(this.layersPane_, false); + this.renderedVisible_ = false + } + return + } + var addChild; + if(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + addChild = function(elem) { + goog.dom.appendChild(this.layersPane_, elem) + } + }else { + addChild = function(elem, i) { + goog.dom.insertChildAt(this.layersPane_, elem, i) + } + } + var layerStates = frameState.layerStates; + var layersArray = frameState.layersArray; + var i, ii, layer, layerRenderer, layerState; + for(i = 0, ii = layersArray.length;i < ii;++i) { + layer = layersArray[i]; + layerRenderer = (this.getLayerRenderer(layer)); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.dom.Layer); + addChild.call(this, layerRenderer.getTarget(), i); + layerState = frameState.layerStates[goog.getUid(layer)]; + if(layerState.sourceState == ol.source.State.READY) { + layerRenderer.prepareFrame(frameState, layerState) + } + } + var layerKey; + for(layerKey in this.getLayerRenderers()) { + if(!(layerKey in layerStates)) { + layerRenderer = this.getLayerRendererByKey(layerKey); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.dom.Layer); + goog.dom.removeNode(layerRenderer.getTarget()) + } + } + if(!this.renderedVisible_) { + goog.style.setElementShown(this.layersPane_, true); + this.renderedVisible_ = true + } + this.calculateMatrices2D(frameState); + this.scheduleRemoveUnusedLayerRenderers(frameState); + this.scheduleExpireIconCache(frameState) +}; +goog.provide("goog.webgl"); +goog.webgl.DEPTH_BUFFER_BIT = 256; +goog.webgl.STENCIL_BUFFER_BIT = 1024; +goog.webgl.COLOR_BUFFER_BIT = 16384; +goog.webgl.POINTS = 0; +goog.webgl.LINES = 1; +goog.webgl.LINE_LOOP = 2; +goog.webgl.LINE_STRIP = 3; +goog.webgl.TRIANGLES = 4; +goog.webgl.TRIANGLE_STRIP = 5; +goog.webgl.TRIANGLE_FAN = 6; +goog.webgl.ZERO = 0; +goog.webgl.ONE = 1; +goog.webgl.SRC_COLOR = 768; +goog.webgl.ONE_MINUS_SRC_COLOR = 769; +goog.webgl.SRC_ALPHA = 770; +goog.webgl.ONE_MINUS_SRC_ALPHA = 771; +goog.webgl.DST_ALPHA = 772; +goog.webgl.ONE_MINUS_DST_ALPHA = 773; +goog.webgl.DST_COLOR = 774; +goog.webgl.ONE_MINUS_DST_COLOR = 775; +goog.webgl.SRC_ALPHA_SATURATE = 776; +goog.webgl.FUNC_ADD = 32774; +goog.webgl.BLEND_EQUATION = 32777; +goog.webgl.BLEND_EQUATION_RGB = 32777; +goog.webgl.BLEND_EQUATION_ALPHA = 34877; +goog.webgl.FUNC_SUBTRACT = 32778; +goog.webgl.FUNC_REVERSE_SUBTRACT = 32779; +goog.webgl.BLEND_DST_RGB = 32968; +goog.webgl.BLEND_SRC_RGB = 32969; +goog.webgl.BLEND_DST_ALPHA = 32970; +goog.webgl.BLEND_SRC_ALPHA = 32971; +goog.webgl.CONSTANT_COLOR = 32769; +goog.webgl.ONE_MINUS_CONSTANT_COLOR = 32770; +goog.webgl.CONSTANT_ALPHA = 32771; +goog.webgl.ONE_MINUS_CONSTANT_ALPHA = 32772; +goog.webgl.BLEND_COLOR = 32773; +goog.webgl.ARRAY_BUFFER = 34962; +goog.webgl.ELEMENT_ARRAY_BUFFER = 34963; +goog.webgl.ARRAY_BUFFER_BINDING = 34964; +goog.webgl.ELEMENT_ARRAY_BUFFER_BINDING = 34965; +goog.webgl.STREAM_DRAW = 35040; +goog.webgl.STATIC_DRAW = 35044; +goog.webgl.DYNAMIC_DRAW = 35048; +goog.webgl.BUFFER_SIZE = 34660; +goog.webgl.BUFFER_USAGE = 34661; +goog.webgl.CURRENT_VERTEX_ATTRIB = 34342; +goog.webgl.FRONT = 1028; +goog.webgl.BACK = 1029; +goog.webgl.FRONT_AND_BACK = 1032; +goog.webgl.CULL_FACE = 2884; +goog.webgl.BLEND = 3042; +goog.webgl.DITHER = 3024; +goog.webgl.STENCIL_TEST = 2960; +goog.webgl.DEPTH_TEST = 2929; +goog.webgl.SCISSOR_TEST = 3089; +goog.webgl.POLYGON_OFFSET_FILL = 32823; +goog.webgl.SAMPLE_ALPHA_TO_COVERAGE = 32926; +goog.webgl.SAMPLE_COVERAGE = 32928; +goog.webgl.NO_ERROR = 0; +goog.webgl.INVALID_ENUM = 1280; +goog.webgl.INVALID_VALUE = 1281; +goog.webgl.INVALID_OPERATION = 1282; +goog.webgl.OUT_OF_MEMORY = 1285; +goog.webgl.CW = 2304; +goog.webgl.CCW = 2305; +goog.webgl.LINE_WIDTH = 2849; +goog.webgl.ALIASED_POINT_SIZE_RANGE = 33901; +goog.webgl.ALIASED_LINE_WIDTH_RANGE = 33902; +goog.webgl.CULL_FACE_MODE = 2885; +goog.webgl.FRONT_FACE = 2886; +goog.webgl.DEPTH_RANGE = 2928; +goog.webgl.DEPTH_WRITEMASK = 2930; +goog.webgl.DEPTH_CLEAR_VALUE = 2931; +goog.webgl.DEPTH_FUNC = 2932; +goog.webgl.STENCIL_CLEAR_VALUE = 2961; +goog.webgl.STENCIL_FUNC = 2962; +goog.webgl.STENCIL_FAIL = 2964; +goog.webgl.STENCIL_PASS_DEPTH_FAIL = 2965; +goog.webgl.STENCIL_PASS_DEPTH_PASS = 2966; +goog.webgl.STENCIL_REF = 2967; +goog.webgl.STENCIL_VALUE_MASK = 2963; +goog.webgl.STENCIL_WRITEMASK = 2968; +goog.webgl.STENCIL_BACK_FUNC = 34816; +goog.webgl.STENCIL_BACK_FAIL = 34817; +goog.webgl.STENCIL_BACK_PASS_DEPTH_FAIL = 34818; +goog.webgl.STENCIL_BACK_PASS_DEPTH_PASS = 34819; +goog.webgl.STENCIL_BACK_REF = 36003; +goog.webgl.STENCIL_BACK_VALUE_MASK = 36004; +goog.webgl.STENCIL_BACK_WRITEMASK = 36005; +goog.webgl.VIEWPORT = 2978; +goog.webgl.SCISSOR_BOX = 3088; +goog.webgl.COLOR_CLEAR_VALUE = 3106; +goog.webgl.COLOR_WRITEMASK = 3107; +goog.webgl.UNPACK_ALIGNMENT = 3317; +goog.webgl.PACK_ALIGNMENT = 3333; +goog.webgl.MAX_TEXTURE_SIZE = 3379; +goog.webgl.MAX_VIEWPORT_DIMS = 3386; +goog.webgl.SUBPIXEL_BITS = 3408; +goog.webgl.RED_BITS = 3410; +goog.webgl.GREEN_BITS = 3411; +goog.webgl.BLUE_BITS = 3412; +goog.webgl.ALPHA_BITS = 3413; +goog.webgl.DEPTH_BITS = 3414; +goog.webgl.STENCIL_BITS = 3415; +goog.webgl.POLYGON_OFFSET_UNITS = 10752; +goog.webgl.POLYGON_OFFSET_FACTOR = 32824; +goog.webgl.TEXTURE_BINDING_2D = 32873; +goog.webgl.SAMPLE_BUFFERS = 32936; +goog.webgl.SAMPLES = 32937; +goog.webgl.SAMPLE_COVERAGE_VALUE = 32938; +goog.webgl.SAMPLE_COVERAGE_INVERT = 32939; +goog.webgl.COMPRESSED_TEXTURE_FORMATS = 34467; +goog.webgl.DONT_CARE = 4352; +goog.webgl.FASTEST = 4353; +goog.webgl.NICEST = 4354; +goog.webgl.GENERATE_MIPMAP_HINT = 33170; +goog.webgl.BYTE = 5120; +goog.webgl.UNSIGNED_BYTE = 5121; +goog.webgl.SHORT = 5122; +goog.webgl.UNSIGNED_SHORT = 5123; +goog.webgl.INT = 5124; +goog.webgl.UNSIGNED_INT = 5125; +goog.webgl.FLOAT = 5126; +goog.webgl.DEPTH_COMPONENT = 6402; +goog.webgl.ALPHA = 6406; +goog.webgl.RGB = 6407; +goog.webgl.RGBA = 6408; +goog.webgl.LUMINANCE = 6409; +goog.webgl.LUMINANCE_ALPHA = 6410; +goog.webgl.UNSIGNED_SHORT_4_4_4_4 = 32819; +goog.webgl.UNSIGNED_SHORT_5_5_5_1 = 32820; +goog.webgl.UNSIGNED_SHORT_5_6_5 = 33635; +goog.webgl.FRAGMENT_SHADER = 35632; +goog.webgl.VERTEX_SHADER = 35633; +goog.webgl.MAX_VERTEX_ATTRIBS = 34921; +goog.webgl.MAX_VERTEX_UNIFORM_VECTORS = 36347; +goog.webgl.MAX_VARYING_VECTORS = 36348; +goog.webgl.MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661; +goog.webgl.MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660; +goog.webgl.MAX_TEXTURE_IMAGE_UNITS = 34930; +goog.webgl.MAX_FRAGMENT_UNIFORM_VECTORS = 36349; +goog.webgl.SHADER_TYPE = 35663; +goog.webgl.DELETE_STATUS = 35712; +goog.webgl.LINK_STATUS = 35714; +goog.webgl.VALIDATE_STATUS = 35715; +goog.webgl.ATTACHED_SHADERS = 35717; +goog.webgl.ACTIVE_UNIFORMS = 35718; +goog.webgl.ACTIVE_ATTRIBUTES = 35721; +goog.webgl.SHADING_LANGUAGE_VERSION = 35724; +goog.webgl.CURRENT_PROGRAM = 35725; +goog.webgl.NEVER = 512; +goog.webgl.LESS = 513; +goog.webgl.EQUAL = 514; +goog.webgl.LEQUAL = 515; +goog.webgl.GREATER = 516; +goog.webgl.NOTEQUAL = 517; +goog.webgl.GEQUAL = 518; +goog.webgl.ALWAYS = 519; +goog.webgl.KEEP = 7680; +goog.webgl.REPLACE = 7681; +goog.webgl.INCR = 7682; +goog.webgl.DECR = 7683; +goog.webgl.INVERT = 5386; +goog.webgl.INCR_WRAP = 34055; +goog.webgl.DECR_WRAP = 34056; +goog.webgl.VENDOR = 7936; +goog.webgl.RENDERER = 7937; +goog.webgl.VERSION = 7938; +goog.webgl.NEAREST = 9728; +goog.webgl.LINEAR = 9729; +goog.webgl.NEAREST_MIPMAP_NEAREST = 9984; +goog.webgl.LINEAR_MIPMAP_NEAREST = 9985; +goog.webgl.NEAREST_MIPMAP_LINEAR = 9986; +goog.webgl.LINEAR_MIPMAP_LINEAR = 9987; +goog.webgl.TEXTURE_MAG_FILTER = 10240; +goog.webgl.TEXTURE_MIN_FILTER = 10241; +goog.webgl.TEXTURE_WRAP_S = 10242; +goog.webgl.TEXTURE_WRAP_T = 10243; +goog.webgl.TEXTURE_2D = 3553; +goog.webgl.TEXTURE = 5890; +goog.webgl.TEXTURE_CUBE_MAP = 34067; +goog.webgl.TEXTURE_BINDING_CUBE_MAP = 34068; +goog.webgl.TEXTURE_CUBE_MAP_POSITIVE_X = 34069; +goog.webgl.TEXTURE_CUBE_MAP_NEGATIVE_X = 34070; +goog.webgl.TEXTURE_CUBE_MAP_POSITIVE_Y = 34071; +goog.webgl.TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072; +goog.webgl.TEXTURE_CUBE_MAP_POSITIVE_Z = 34073; +goog.webgl.TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074; +goog.webgl.MAX_CUBE_MAP_TEXTURE_SIZE = 34076; +goog.webgl.TEXTURE0 = 33984; +goog.webgl.TEXTURE1 = 33985; +goog.webgl.TEXTURE2 = 33986; +goog.webgl.TEXTURE3 = 33987; +goog.webgl.TEXTURE4 = 33988; +goog.webgl.TEXTURE5 = 33989; +goog.webgl.TEXTURE6 = 33990; +goog.webgl.TEXTURE7 = 33991; +goog.webgl.TEXTURE8 = 33992; +goog.webgl.TEXTURE9 = 33993; +goog.webgl.TEXTURE10 = 33994; +goog.webgl.TEXTURE11 = 33995; +goog.webgl.TEXTURE12 = 33996; +goog.webgl.TEXTURE13 = 33997; +goog.webgl.TEXTURE14 = 33998; +goog.webgl.TEXTURE15 = 33999; +goog.webgl.TEXTURE16 = 34E3; +goog.webgl.TEXTURE17 = 34001; +goog.webgl.TEXTURE18 = 34002; +goog.webgl.TEXTURE19 = 34003; +goog.webgl.TEXTURE20 = 34004; +goog.webgl.TEXTURE21 = 34005; +goog.webgl.TEXTURE22 = 34006; +goog.webgl.TEXTURE23 = 34007; +goog.webgl.TEXTURE24 = 34008; +goog.webgl.TEXTURE25 = 34009; +goog.webgl.TEXTURE26 = 34010; +goog.webgl.TEXTURE27 = 34011; +goog.webgl.TEXTURE28 = 34012; +goog.webgl.TEXTURE29 = 34013; +goog.webgl.TEXTURE30 = 34014; +goog.webgl.TEXTURE31 = 34015; +goog.webgl.ACTIVE_TEXTURE = 34016; +goog.webgl.REPEAT = 10497; +goog.webgl.CLAMP_TO_EDGE = 33071; +goog.webgl.MIRRORED_REPEAT = 33648; +goog.webgl.FLOAT_VEC2 = 35664; +goog.webgl.FLOAT_VEC3 = 35665; +goog.webgl.FLOAT_VEC4 = 35666; +goog.webgl.INT_VEC2 = 35667; +goog.webgl.INT_VEC3 = 35668; +goog.webgl.INT_VEC4 = 35669; +goog.webgl.BOOL = 35670; +goog.webgl.BOOL_VEC2 = 35671; +goog.webgl.BOOL_VEC3 = 35672; +goog.webgl.BOOL_VEC4 = 35673; +goog.webgl.FLOAT_MAT2 = 35674; +goog.webgl.FLOAT_MAT3 = 35675; +goog.webgl.FLOAT_MAT4 = 35676; +goog.webgl.SAMPLER_2D = 35678; +goog.webgl.SAMPLER_CUBE = 35680; +goog.webgl.VERTEX_ATTRIB_ARRAY_ENABLED = 34338; +goog.webgl.VERTEX_ATTRIB_ARRAY_SIZE = 34339; +goog.webgl.VERTEX_ATTRIB_ARRAY_STRIDE = 34340; +goog.webgl.VERTEX_ATTRIB_ARRAY_TYPE = 34341; +goog.webgl.VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922; +goog.webgl.VERTEX_ATTRIB_ARRAY_POINTER = 34373; +goog.webgl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975; +goog.webgl.COMPILE_STATUS = 35713; +goog.webgl.LOW_FLOAT = 36336; +goog.webgl.MEDIUM_FLOAT = 36337; +goog.webgl.HIGH_FLOAT = 36338; +goog.webgl.LOW_INT = 36339; +goog.webgl.MEDIUM_INT = 36340; +goog.webgl.HIGH_INT = 36341; +goog.webgl.FRAMEBUFFER = 36160; +goog.webgl.RENDERBUFFER = 36161; +goog.webgl.RGBA4 = 32854; +goog.webgl.RGB5_A1 = 32855; +goog.webgl.RGB565 = 36194; +goog.webgl.DEPTH_COMPONENT16 = 33189; +goog.webgl.STENCIL_INDEX = 6401; +goog.webgl.STENCIL_INDEX8 = 36168; +goog.webgl.DEPTH_STENCIL = 34041; +goog.webgl.RENDERBUFFER_WIDTH = 36162; +goog.webgl.RENDERBUFFER_HEIGHT = 36163; +goog.webgl.RENDERBUFFER_INTERNAL_FORMAT = 36164; +goog.webgl.RENDERBUFFER_RED_SIZE = 36176; +goog.webgl.RENDERBUFFER_GREEN_SIZE = 36177; +goog.webgl.RENDERBUFFER_BLUE_SIZE = 36178; +goog.webgl.RENDERBUFFER_ALPHA_SIZE = 36179; +goog.webgl.RENDERBUFFER_DEPTH_SIZE = 36180; +goog.webgl.RENDERBUFFER_STENCIL_SIZE = 36181; +goog.webgl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 36048; +goog.webgl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 36049; +goog.webgl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 36050; +goog.webgl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 36051; +goog.webgl.COLOR_ATTACHMENT0 = 36064; +goog.webgl.DEPTH_ATTACHMENT = 36096; +goog.webgl.STENCIL_ATTACHMENT = 36128; +goog.webgl.DEPTH_STENCIL_ATTACHMENT = 33306; +goog.webgl.NONE = 0; +goog.webgl.FRAMEBUFFER_COMPLETE = 36053; +goog.webgl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 36054; +goog.webgl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 36055; +goog.webgl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 36057; +goog.webgl.FRAMEBUFFER_UNSUPPORTED = 36061; +goog.webgl.FRAMEBUFFER_BINDING = 36006; +goog.webgl.RENDERBUFFER_BINDING = 36007; +goog.webgl.MAX_RENDERBUFFER_SIZE = 34024; +goog.webgl.INVALID_FRAMEBUFFER_OPERATION = 1286; +goog.webgl.UNPACK_FLIP_Y_WEBGL = 37440; +goog.webgl.UNPACK_PREMULTIPLY_ALPHA_WEBGL = 37441; +goog.webgl.CONTEXT_LOST_WEBGL = 37442; +goog.webgl.UNPACK_COLORSPACE_CONVERSION_WEBGL = 37443; +goog.webgl.BROWSER_DEFAULT_WEBGL = 37444; +goog.webgl.HALF_FLOAT_OES = 36193; +goog.webgl.FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 35723; +goog.webgl.VERTEX_ARRAY_BINDING_OES = 34229; +goog.webgl.UNMASKED_VENDOR_WEBGL = 37445; +goog.webgl.UNMASKED_RENDERER_WEBGL = 37446; +goog.webgl.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776; +goog.webgl.COMPRESSED_RGBA_S3TC_DXT1_EXT = 33777; +goog.webgl.COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778; +goog.webgl.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779; +goog.webgl.TEXTURE_MAX_ANISOTROPY_EXT = 34046; +goog.webgl.MAX_TEXTURE_MAX_ANISOTROPY_EXT = 34047; +goog.provide("ol.render.webgl.Immediate"); +ol.render.webgl.Immediate = function(context, pixelRatio) { +}; +ol.render.webgl.Immediate.prototype.drawAsync = function(zIndex, callback) { +}; +ol.render.webgl.Immediate.prototype.drawCircleGeometry = function(circleGeometry, data) { +}; +ol.render.webgl.Immediate.prototype.drawFeature = function(feature, style) { +}; +ol.render.webgl.Immediate.prototype.drawGeometryCollectionGeometry = function(geometryCollectionGeometry, data) { +}; +ol.render.webgl.Immediate.prototype.drawPointGeometry = function(pointGeometry, data) { +}; +ol.render.webgl.Immediate.prototype.drawLineStringGeometry = function(lineStringGeometry, data) { +}; +ol.render.webgl.Immediate.prototype.drawMultiLineStringGeometry = function(multiLineStringGeometry, data) { +}; +ol.render.webgl.Immediate.prototype.drawMultiPointGeometry = function(multiPointGeometry, data) { +}; +ol.render.webgl.Immediate.prototype.drawMultiPolygonGeometry = function(multiPolygonGeometry, data) { +}; +ol.render.webgl.Immediate.prototype.drawPolygonGeometry = function(polygonGeometry, data) { +}; +ol.render.webgl.Immediate.prototype.drawText = function(flatCoordinates, offset, end, stride, geometry, data) { +}; +ol.render.webgl.Immediate.prototype.setFillStrokeStyle = function(fillStyle, strokeStyle) { +}; +ol.render.webgl.Immediate.prototype.setImageStyle = function(imageStyle) { +}; +ol.render.webgl.Immediate.prototype.setTextStyle = function(textStyle) { +}; +goog.provide("ol.color.Matrix"); +goog.require("goog.vec.Mat4"); +ol.color.Matrix = function() { + this.colorMatrix_ = goog.vec.Mat4.createNumber(); + this.brightness_ = undefined; + this.brightnessMatrix_ = goog.vec.Mat4.createNumber(); + this.contrast_ = undefined; + this.contrastMatrix_ = goog.vec.Mat4.createNumber(); + this.hue_ = undefined; + this.hueMatrix_ = goog.vec.Mat4.createNumber(); + this.saturation_ = undefined; + this.saturationMatrix_ = goog.vec.Mat4.createNumber() +}; +ol.color.Matrix.makeBrightness = function(matrix, value) { + goog.vec.Mat4.makeTranslate(matrix, value, value, value); + return matrix +}; +ol.color.Matrix.makeContrast = function(matrix, value) { + goog.vec.Mat4.makeScale(matrix, value, value, value); + var translateValue = -0.5 * value + 0.5; + goog.vec.Mat4.setColumnValues(matrix, 3, translateValue, translateValue, translateValue, 1); + return matrix +}; +ol.color.Matrix.makeHue = function(matrix, value) { + var cosHue = Math.cos(value); + var sinHue = Math.sin(value); + var v00 = 0.213 + cosHue * 0.787 - sinHue * 0.213; + var v01 = 0.715 - cosHue * 0.715 - sinHue * 0.715; + var v02 = 0.072 - cosHue * 0.072 + sinHue * 0.928; + var v03 = 0; + var v10 = 0.213 - cosHue * 0.213 + sinHue * 0.143; + var v11 = 0.715 + cosHue * 0.285 + sinHue * 0.14; + var v12 = 0.072 - cosHue * 0.072 - sinHue * 0.283; + var v13 = 0; + var v20 = 0.213 - cosHue * 0.213 - sinHue * 0.787; + var v21 = 0.715 - cosHue * 0.715 + sinHue * 0.715; + var v22 = 0.072 + cosHue * 0.928 + sinHue * 0.072; + var v23 = 0; + var v30 = 0; + var v31 = 0; + var v32 = 0; + var v33 = 1; + goog.vec.Mat4.setFromValues(matrix, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23, v33); + return matrix +}; +ol.color.Matrix.makeSaturation = function(matrix, value) { + var v00 = 0.213 + 0.787 * value; + var v01 = 0.715 - 0.715 * value; + var v02 = 0.072 - 0.072 * value; + var v03 = 0; + var v10 = 0.213 - 0.213 * value; + var v11 = 0.715 + 0.285 * value; + var v12 = 0.072 - 0.072 * value; + var v13 = 0; + var v20 = 0.213 - 0.213 * value; + var v21 = 0.715 - 0.715 * value; + var v22 = 0.072 + 0.928 * value; + var v23 = 0; + var v30 = 0; + var v31 = 0; + var v32 = 0; + var v33 = 1; + goog.vec.Mat4.setFromValues(matrix, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23, v33); + return matrix +}; +ol.color.Matrix.prototype.getMatrix = function(brightness, contrast, hue, saturation) { + var colorMatrixDirty = false; + if(goog.isDef(brightness) && brightness !== this.brightness_) { + ol.color.Matrix.makeBrightness(this.brightnessMatrix_, brightness); + this.brightness_ = brightness; + colorMatrixDirty = true + } + if(goog.isDef(contrast) && contrast !== this.contrast_) { + ol.color.Matrix.makeContrast(this.contrastMatrix_, contrast); + this.contrast_ = contrast; + colorMatrixDirty = true + } + if(goog.isDef(hue) && hue !== this.hue_) { + ol.color.Matrix.makeHue(this.hueMatrix_, hue); + this.hue_ = hue; + colorMatrixDirty = true + } + if(goog.isDef(saturation) && saturation !== this.saturation_) { + ol.color.Matrix.makeSaturation(this.saturationMatrix_, saturation); + this.saturation_ = saturation; + colorMatrixDirty = true + } + if(colorMatrixDirty) { + var colorMatrix = this.colorMatrix_; + goog.vec.Mat4.makeIdentity(colorMatrix); + if(goog.isDef(contrast)) { + goog.vec.Mat4.multMat(colorMatrix, this.contrastMatrix_, colorMatrix) + } + if(goog.isDef(brightness)) { + goog.vec.Mat4.multMat(colorMatrix, this.brightnessMatrix_, colorMatrix) + } + if(goog.isDef(saturation)) { + goog.vec.Mat4.multMat(colorMatrix, this.saturationMatrix_, colorMatrix) + } + if(goog.isDef(hue)) { + goog.vec.Mat4.multMat(colorMatrix, this.hueMatrix_, colorMatrix) + } + } + return this.colorMatrix_ +}; +goog.provide("ol.webgl.shader"); +goog.require("goog.functions"); +goog.require("goog.webgl"); +goog.require("ol.webgl"); +ol.webgl.Shader = function(source) { + this.source_ = source +}; +ol.webgl.Shader.prototype.getType = goog.abstractMethod; +ol.webgl.Shader.prototype.getSource = function() { + return this.source_ +}; +ol.webgl.Shader.prototype.isAnimated = goog.functions.FALSE; +ol.webgl.shader.Fragment = function(source) { + goog.base(this, source) +}; +goog.inherits(ol.webgl.shader.Fragment, ol.webgl.Shader); +ol.webgl.shader.Fragment.prototype.getType = function() { + return goog.webgl.FRAGMENT_SHADER +}; +ol.webgl.shader.Vertex = function(source) { + goog.base(this, source) +}; +goog.inherits(ol.webgl.shader.Vertex, ol.webgl.Shader); +ol.webgl.shader.Vertex.prototype.getType = function() { + return goog.webgl.VERTEX_SHADER +}; +goog.provide("ol.renderer.webgl.map.shader.Color"); +goog.require("ol.webgl.shader"); +ol.renderer.webgl.map.shader.ColorFragment = function() { + goog.base(this, ol.renderer.webgl.map.shader.ColorFragment.SOURCE) +}; +goog.inherits(ol.renderer.webgl.map.shader.ColorFragment, ol.webgl.shader.Fragment); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.ColorFragment); +ol.renderer.webgl.map.shader.ColorFragment.DEBUG_SOURCE = "precision mediump float;\nvarying vec2 v_texCoord;\n\n\n// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp\nuniform mat4 u_colorMatrix;\nuniform float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n vec4 texColor \x3d texture2D(u_texture, v_texCoord);\n gl_FragColor.rgb \x3d (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;\n gl_FragColor.a \x3d texColor.a * u_opacity;\n}\n"; +ol.renderer.webgl.map.shader.ColorFragment.OPTIMIZED_SOURCE = "precision mediump float;varying vec2 a;uniform mat4 f;uniform float g;uniform sampler2D h;void main(void){vec4 texColor\x3dtexture2D(h,a);gl_FragColor.rgb\x3d(f*vec4(texColor.rgb,1.)).rgb;gl_FragColor.a\x3dtexColor.a*g;}"; +ol.renderer.webgl.map.shader.ColorFragment.SOURCE = goog.DEBUG ? ol.renderer.webgl.map.shader.ColorFragment.DEBUG_SOURCE : ol.renderer.webgl.map.shader.ColorFragment.OPTIMIZED_SOURCE; +ol.renderer.webgl.map.shader.ColorVertex = function() { + goog.base(this, ol.renderer.webgl.map.shader.ColorVertex.SOURCE) +}; +goog.inherits(ol.renderer.webgl.map.shader.ColorVertex, ol.webgl.shader.Vertex); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.ColorVertex); +ol.renderer.webgl.map.shader.ColorVertex.DEBUG_SOURCE = "varying vec2 v_texCoord;\n\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\n\nuniform mat4 u_texCoordMatrix;\nuniform mat4 u_projectionMatrix;\n\nvoid main(void) {\n gl_Position \x3d u_projectionMatrix * vec4(a_position, 0., 1.);\n v_texCoord \x3d (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;\n}\n\n\n"; +ol.renderer.webgl.map.shader.ColorVertex.OPTIMIZED_SOURCE = "varying vec2 a;attribute vec2 b;attribute vec2 c;uniform mat4 d;uniform mat4 e;void main(void){gl_Position\x3de*vec4(b,0.,1.);a\x3d(d*vec4(c,0.,1.)).st;}"; +ol.renderer.webgl.map.shader.ColorVertex.SOURCE = goog.DEBUG ? ol.renderer.webgl.map.shader.ColorVertex.DEBUG_SOURCE : ol.renderer.webgl.map.shader.ColorVertex.OPTIMIZED_SOURCE; +ol.renderer.webgl.map.shader.Color.Locations = function(gl, program) { + this.u_colorMatrix = gl.getUniformLocation(program, goog.DEBUG ? "u_colorMatrix" : "f"); + this.u_opacity = gl.getUniformLocation(program, goog.DEBUG ? "u_opacity" : "g"); + this.u_projectionMatrix = gl.getUniformLocation(program, goog.DEBUG ? "u_projectionMatrix" : "e"); + this.u_texCoordMatrix = gl.getUniformLocation(program, goog.DEBUG ? "u_texCoordMatrix" : "d"); + this.u_texture = gl.getUniformLocation(program, goog.DEBUG ? "u_texture" : "h"); + this.a_position = gl.getAttribLocation(program, goog.DEBUG ? "a_position" : "b"); + this.a_texCoord = gl.getAttribLocation(program, goog.DEBUG ? "a_texCoord" : "c") +}; +goog.provide("ol.renderer.webgl.map.shader.Default"); +goog.require("ol.webgl.shader"); +ol.renderer.webgl.map.shader.DefaultFragment = function() { + goog.base(this, ol.renderer.webgl.map.shader.DefaultFragment.SOURCE) +}; +goog.inherits(ol.renderer.webgl.map.shader.DefaultFragment, ol.webgl.shader.Fragment); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.DefaultFragment); +ol.renderer.webgl.map.shader.DefaultFragment.DEBUG_SOURCE = "precision mediump float;\nvarying vec2 v_texCoord;\n\n\nuniform float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n vec4 texColor \x3d texture2D(u_texture, v_texCoord);\n gl_FragColor.rgb \x3d texColor.rgb;\n gl_FragColor.a \x3d texColor.a * u_opacity;\n}\n"; +ol.renderer.webgl.map.shader.DefaultFragment.OPTIMIZED_SOURCE = "precision mediump float;varying vec2 a;uniform float f;uniform sampler2D g;void main(void){vec4 texColor\x3dtexture2D(g,a);gl_FragColor.rgb\x3dtexColor.rgb;gl_FragColor.a\x3dtexColor.a*f;}"; +ol.renderer.webgl.map.shader.DefaultFragment.SOURCE = goog.DEBUG ? ol.renderer.webgl.map.shader.DefaultFragment.DEBUG_SOURCE : ol.renderer.webgl.map.shader.DefaultFragment.OPTIMIZED_SOURCE; +ol.renderer.webgl.map.shader.DefaultVertex = function() { + goog.base(this, ol.renderer.webgl.map.shader.DefaultVertex.SOURCE) +}; +goog.inherits(ol.renderer.webgl.map.shader.DefaultVertex, ol.webgl.shader.Vertex); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.DefaultVertex); +ol.renderer.webgl.map.shader.DefaultVertex.DEBUG_SOURCE = "varying vec2 v_texCoord;\n\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\n\nuniform mat4 u_texCoordMatrix;\nuniform mat4 u_projectionMatrix;\n\nvoid main(void) {\n gl_Position \x3d u_projectionMatrix * vec4(a_position, 0., 1.);\n v_texCoord \x3d (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;\n}\n\n\n"; +ol.renderer.webgl.map.shader.DefaultVertex.OPTIMIZED_SOURCE = "varying vec2 a;attribute vec2 b;attribute vec2 c;uniform mat4 d;uniform mat4 e;void main(void){gl_Position\x3de*vec4(b,0.,1.);a\x3d(d*vec4(c,0.,1.)).st;}"; +ol.renderer.webgl.map.shader.DefaultVertex.SOURCE = goog.DEBUG ? ol.renderer.webgl.map.shader.DefaultVertex.DEBUG_SOURCE : ol.renderer.webgl.map.shader.DefaultVertex.OPTIMIZED_SOURCE; +ol.renderer.webgl.map.shader.Default.Locations = function(gl, program) { + this.u_opacity = gl.getUniformLocation(program, goog.DEBUG ? "u_opacity" : "f"); + this.u_projectionMatrix = gl.getUniformLocation(program, goog.DEBUG ? "u_projectionMatrix" : "e"); + this.u_texCoordMatrix = gl.getUniformLocation(program, goog.DEBUG ? "u_texCoordMatrix" : "d"); + this.u_texture = gl.getUniformLocation(program, goog.DEBUG ? "u_texture" : "g"); + this.a_position = gl.getAttribLocation(program, goog.DEBUG ? "a_position" : "b"); + this.a_texCoord = gl.getAttribLocation(program, goog.DEBUG ? "a_texCoord" : "c") +}; +goog.provide("ol.structs.IntegerSet"); +goog.require("goog.asserts"); +ol.structs.IntegerSet = function(opt_arr) { + this.arr_ = goog.isDef(opt_arr) ? opt_arr : []; + if(goog.DEBUG) { + this.assertValid() + } +}; +ol.structs.IntegerSet.prototype.addRange = function(addStart, addStop) { + goog.asserts.assert(addStart <= addStop); + if(addStart == addStop) { + return + } + var arr = this.arr_; + var n = arr.length; + var i; + for(i = 0;i < n;i += 2) { + if(addStart <= arr[i]) { + arr.splice(i, 0, addStart, addStop); + this.compactRanges_(); + return + } + } + arr.push(addStart, addStop); + this.compactRanges_() +}; +ol.structs.IntegerSet.prototype.assertValid = function() { + var arr = this.arr_; + var n = arr.length; + goog.asserts.assert(n % 2 === 0); + var i; + for(i = 1;i < n;++i) { + goog.asserts.assert(arr[i] > arr[i - 1]) + } +}; +ol.structs.IntegerSet.prototype.clear = function() { + this.arr_.length = 0 +}; +ol.structs.IntegerSet.prototype.compactRanges_ = function() { + var arr = this.arr_; + var n = arr.length; + var rangeIndex = 0; + var i; + for(i = 0;i < n;i += 2) { + if(arr[i] == arr[i + 1]) { + }else { + if(rangeIndex > 0 && arr[rangeIndex - 2] <= arr[i] && arr[i] <= arr[rangeIndex - 1]) { + arr[rangeIndex - 1] = Math.max(arr[rangeIndex - 1], arr[i + 1]) + }else { + arr[rangeIndex++] = arr[i]; + arr[rangeIndex++] = arr[i + 1] + } + } + } + arr.length = rangeIndex +}; +ol.structs.IntegerSet.prototype.findRange = function(minSize) { + goog.asserts.assert(minSize > 0); + var arr = this.arr_; + var n = arr.length; + var bestIndex = -1; + var bestSize, i, size; + for(i = 0;i < n;i += 2) { + size = arr[i + 1] - arr[i]; + if(size == minSize) { + return arr[i] + }else { + if(size > minSize && (bestIndex == -1 || size < bestSize)) { + bestIndex = arr[i]; + bestSize = size + } + } + } + return bestIndex +}; +ol.structs.IntegerSet.prototype.forEachRange = function(f, opt_this) { + var arr = this.arr_; + var n = arr.length; + var i; + for(i = 0;i < n;i += 2) { + f.call(opt_this, arr[i], arr[i + 1]) + } +}; +ol.structs.IntegerSet.prototype.forEachRangeInverted = function(start, stop, f, opt_this) { + goog.asserts.assert(start < stop); + var arr = this.arr_; + var n = arr.length; + if(n === 0) { + f.call(opt_this, start, stop) + }else { + if(start < arr[0]) { + f.call(opt_this, start, arr[0]) + } + var i; + for(i = 1;i < n - 1;i += 2) { + f.call(opt_this, arr[i], arr[i + 1]) + } + if(arr[n - 1] < stop) { + f.call(opt_this, arr[n - 1], stop) + } + } +}; +ol.structs.IntegerSet.prototype.getArray = function() { + return this.arr_ +}; +ol.structs.IntegerSet.prototype.getFirst = function() { + return this.arr_.length === 0 ? -1 : this.arr_[0] +}; +ol.structs.IntegerSet.prototype.getLast = function() { + var n = this.arr_.length; + return n === 0 ? -1 : this.arr_[n - 1] +}; +ol.structs.IntegerSet.prototype.getSize = function() { + var arr = this.arr_; + var n = arr.length; + var size = 0; + var i; + for(i = 0;i < n;i += 2) { + size += arr[i + 1] - arr[i] + } + return size +}; +ol.structs.IntegerSet.prototype.intersectsRange = function(start, stop) { + goog.asserts.assert(start <= stop); + if(start == stop) { + return false + }else { + var arr = this.arr_; + var n = arr.length; + var i = 0; + for(i = 0;i < n;i += 2) { + if(arr[i] <= start && start < arr[i + 1] || arr[i] < stop && stop - 1 < arr[i + 1] || start < arr[i] && arr[i + 1] <= stop) { + return true + } + } + return false + } +}; +ol.structs.IntegerSet.prototype.isEmpty = function() { + return this.arr_.length === 0 +}; +ol.structs.IntegerSet.prototype.pack = function() { + return this.arr_ +}; +ol.structs.IntegerSet.prototype.removeRange = function(removeStart, removeStop) { + goog.asserts.assert(removeStart <= removeStop); + var arr = this.arr_; + var n = arr.length; + var i; + for(i = 0;i < n;i += 2) { + if(removeStop < arr[i] || arr[i + 1] < removeStart) { + continue + }else { + if(arr[i] > removeStop) { + break + } + } + if(removeStart < arr[i]) { + if(removeStop == arr[i]) { + break + }else { + if(removeStop < arr[i + 1]) { + arr[i] = Math.max(arr[i], removeStop); + break + }else { + arr.splice(i, 2); + i -= 2; + n -= 2 + } + } + }else { + if(removeStart == arr[i]) { + if(removeStop < arr[i + 1]) { + arr[i] = removeStop; + break + }else { + if(removeStop == arr[i + 1]) { + arr.splice(i, 2); + break + }else { + arr.splice(i, 2); + i -= 2; + n -= 2 + } + } + }else { + if(removeStop < arr[i + 1]) { + arr.splice(i, 2, arr[i], removeStart, removeStop, arr[i + 1]); + break + }else { + if(removeStop == arr[i + 1]) { + arr[i + 1] = removeStart; + break + }else { + arr[i + 1] = removeStart + } + } + } + } + } + this.compactRanges_() +}; +if(goog.DEBUG) { + ol.structs.IntegerSet.prototype.toString = function() { + var arr = this.arr_; + var n = arr.length; + var result = new Array(n / 2); + var resultIndex = 0; + var i; + for(i = 0;i < n;i += 2) { + result[resultIndex++] = arr[i] + "-" + arr[i + 1] + } + return result.join(", ") + } +} +;goog.provide("ol.structs.Buffer"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.webgl"); +goog.require("ol.structs.IntegerSet"); +ol.structs.BufferUsage = {STATIC_DRAW:goog.webgl.STATIC_DRAW, STREAM_DRAW:goog.webgl.STREAM_DRAW, DYNAMIC_DRAW:goog.webgl.DYNAMIC_DRAW}; +ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS = goog.DEBUG; +ol.structs.Buffer = function(opt_arr, opt_used, opt_usage) { + this.arr_ = goog.isDef(opt_arr) ? opt_arr : []; + this.dirtySets_ = []; + this.freeSet_ = new ol.structs.IntegerSet; + var used = goog.isDef(opt_used) ? opt_used : this.arr_.length; + if(used < this.arr_.length) { + this.freeSet_.addRange(used, this.arr_.length) + } + if(ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS) { + var arr = this.arr_; + var n = arr.length; + var i; + for(i = used;i < n;++i) { + arr[i] = NaN + } + } + this.split32_ = null; + this.split32DirtySet_ = null; + this.usage_ = goog.isDef(opt_usage) ? opt_usage : ol.structs.BufferUsage.STATIC_DRAW +}; +ol.structs.Buffer.prototype.allocate = function(size) { + goog.asserts.assert(size > 0); + var offset = this.freeSet_.findRange(size); + goog.asserts.assert(offset != -1); + this.freeSet_.removeRange(offset, offset + size); + return offset +}; +ol.structs.Buffer.prototype.add = function(values) { + var size = values.length; + var offset = this.allocate(size); + var i; + for(i = 0;i < size;++i) { + this.arr_[offset + i] = values[i] + } + this.markDirty(size, offset); + return offset +}; +ol.structs.Buffer.prototype.addDirtySet = function(dirtySet) { + goog.asserts.assert(!goog.array.contains(this.dirtySets_, dirtySet)); + this.dirtySets_.push(dirtySet) +}; +ol.structs.Buffer.prototype.forEachRange = function(f, opt_this) { + if(this.arr_.length !== 0) { + this.freeSet_.forEachRangeInverted(0, this.arr_.length, f, opt_this) + } +}; +ol.structs.Buffer.prototype.getArray = function() { + return this.arr_ +}; +ol.structs.Buffer.prototype.getCount = function() { + return this.arr_.length - this.freeSet_.getSize() +}; +ol.structs.Buffer.prototype.getFreeSet = function() { + return this.freeSet_ +}; +ol.structs.Buffer.prototype.getSplit32 = function() { + var arr = this.arr_; + var n = arr.length; + if(goog.isNull(this.split32DirtySet_)) { + this.split32DirtySet_ = new ol.structs.IntegerSet([0, n]); + this.addDirtySet(this.split32DirtySet_) + } + if(goog.isNull(this.split32_)) { + this.split32_ = new Float32Array(2 * n) + } + var split32 = this.split32_; + this.split32DirtySet_.forEachRange(function(start, stop) { + var doubleHigh, i, j, value; + for(i = start, j = 2 * start;i < stop;++i, j += 2) { + value = arr[i]; + if(value < 0) { + doubleHigh = 65536 * Math.floor(-value / 65536); + split32[j] = -doubleHigh; + split32[j + 1] = value + doubleHigh + }else { + doubleHigh = 65536 * Math.floor(value / 65536); + split32[j] = doubleHigh; + split32[j + 1] = value - doubleHigh + } + } + }); + this.split32DirtySet_.clear(); + return this.split32_ +}; +ol.structs.Buffer.prototype.getUsage = function() { + return this.usage_ +}; +ol.structs.Buffer.prototype.markDirty = function(size, offset) { + var i, ii; + for(i = 0, ii = this.dirtySets_.length;i < ii;++i) { + this.dirtySets_[i].addRange(offset, offset + size) + } +}; +ol.structs.Buffer.prototype.remove = function(size, offset) { + var i, ii; + this.freeSet_.addRange(offset, offset + size); + for(i = 0, ii = this.dirtySets_.length;i < ii;++i) { + this.dirtySets_[i].removeRange(offset, offset + size) + } + if(ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS) { + var arr = this.arr_; + for(i = 0;i < size;++i) { + arr[offset + i] = NaN + } + } +}; +ol.structs.Buffer.prototype.removeDirtySet = function(dirtySet) { + var removed = goog.array.remove(this.dirtySets_, dirtySet); + goog.asserts.assert(removed) +}; +ol.structs.Buffer.prototype.set = function(values, offset) { + var arr = this.arr_; + var n = values.length; + goog.asserts.assert(0 <= offset && offset + n <= arr.length); + var i; + for(i = 0;i < n;++i) { + arr[offset + i] = values[i] + } + this.markDirty(n, offset) +}; +goog.provide("ol.renderer.webgl.Layer"); +goog.require("goog.vec.Mat4"); +goog.require("goog.webgl"); +goog.require("ol.FrameState"); +goog.require("ol.color.Matrix"); +goog.require("ol.layer.Layer"); +goog.require("ol.render.Event"); +goog.require("ol.render.EventType"); +goog.require("ol.render.webgl.Immediate"); +goog.require("ol.renderer.Layer"); +goog.require("ol.renderer.webgl.map.shader.Color"); +goog.require("ol.renderer.webgl.map.shader.Default"); +goog.require("ol.structs.Buffer"); +ol.renderer.webgl.Layer = function(mapRenderer, layer) { + goog.base(this, mapRenderer, layer); + this.arrayBuffer_ = new ol.structs.Buffer([-1, -1, 0, 0, 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1]); + this.texture = null; + this.framebuffer = null; + this.framebufferDimension = undefined; + this.texCoordMatrix = goog.vec.Mat4.createNumber(); + this.projectionMatrix = goog.vec.Mat4.createNumberIdentity(); + this.colorMatrix_ = new ol.color.Matrix; + this.colorLocations_ = null; + this.defaultLocations_ = null +}; +goog.inherits(ol.renderer.webgl.Layer, ol.renderer.Layer); +ol.renderer.webgl.Layer.prototype.bindFramebuffer = function(frameState, framebufferDimension) { + var mapRenderer = this.getWebGLMapRenderer(); + var gl = mapRenderer.getGL(); + if(!goog.isDef(this.framebufferDimension) || this.framebufferDimension != framebufferDimension) { + frameState.postRenderFunctions.push(goog.partial(function(gl, framebuffer, texture) { + if(!gl.isContextLost()) { + gl.deleteFramebuffer(framebuffer); + gl.deleteTexture(texture) + } + }, gl, this.framebuffer, this.texture)); + var texture = gl.createTexture(); + gl.bindTexture(goog.webgl.TEXTURE_2D, texture); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, framebufferDimension, framebufferDimension, 0, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, null); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, goog.webgl.LINEAR); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, goog.webgl.LINEAR); + var framebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer); + gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER, goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0); + this.texture = texture; + this.framebuffer = framebuffer; + this.framebufferDimension = framebufferDimension + }else { + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer) + } +}; +ol.renderer.webgl.Layer.prototype.composeFrame = function(frameState, layerState, context) { + this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, context, frameState); + context.bindBuffer(goog.webgl.ARRAY_BUFFER, this.arrayBuffer_); + var gl = context.getGL(); + var useColor = layerState.brightness || layerState.contrast != 1 || layerState.hue || layerState.saturation != 1; + var fragmentShader, vertexShader; + if(useColor) { + fragmentShader = ol.renderer.webgl.map.shader.ColorFragment.getInstance(); + vertexShader = ol.renderer.webgl.map.shader.ColorVertex.getInstance() + }else { + fragmentShader = ol.renderer.webgl.map.shader.DefaultFragment.getInstance(); + vertexShader = ol.renderer.webgl.map.shader.DefaultVertex.getInstance() + } + var program = context.getProgram(fragmentShader, vertexShader); + var locations; + if(useColor) { + if(goog.isNull(this.colorLocations_)) { + locations = new ol.renderer.webgl.map.shader.Color.Locations(gl, program); + this.colorLocations_ = locations + }else { + locations = this.colorLocations_ + } + }else { + if(goog.isNull(this.defaultLocations_)) { + locations = new ol.renderer.webgl.map.shader.Default.Locations(gl, program); + this.defaultLocations_ = locations + }else { + locations = this.defaultLocations_ + } + } + if(context.useProgram(program)) { + gl.enableVertexAttribArray(locations.a_position); + gl.vertexAttribPointer(locations.a_position, 2, goog.webgl.FLOAT, false, 16, 0); + gl.enableVertexAttribArray(locations.a_texCoord); + gl.vertexAttribPointer(locations.a_texCoord, 2, goog.webgl.FLOAT, false, 16, 8); + gl.uniform1i(locations.u_texture, 0) + } + gl.uniformMatrix4fv(locations.u_texCoordMatrix, false, this.getTexCoordMatrix()); + gl.uniformMatrix4fv(locations.u_projectionMatrix, false, this.getProjectionMatrix()); + if(useColor) { + gl.uniformMatrix4fv(locations.u_colorMatrix, false, this.colorMatrix_.getMatrix(layerState.brightness, layerState.contrast, layerState.hue, layerState.saturation)) + } + gl.uniform1f(locations.u_opacity, layerState.opacity); + gl.bindTexture(goog.webgl.TEXTURE_2D, this.getTexture()); + gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); + this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, context, frameState) +}; +ol.renderer.webgl.Layer.prototype.dispatchComposeEvent_ = function(type, context, frameState) { + var layer = this.getLayer(); + if(layer.hasListener(type)) { + var render = new ol.render.webgl.Immediate(context, frameState.pixelRatio); + var composeEvent = new ol.render.Event(type, layer, render, frameState, null, context); + layer.dispatchEvent(composeEvent) + } +}; +ol.renderer.webgl.Layer.prototype.getWebGLMapRenderer = function() { + return(this.getMapRenderer()) +}; +ol.renderer.webgl.Layer.prototype.getTexCoordMatrix = function() { + return this.texCoordMatrix +}; +ol.renderer.webgl.Layer.prototype.getTexture = function() { + return this.texture +}; +ol.renderer.webgl.Layer.prototype.getProjectionMatrix = function() { + return this.projectionMatrix +}; +ol.renderer.webgl.Layer.prototype.handleWebGLContextLost = function() { + this.texture = null; + this.framebuffer = null; + this.framebufferDimension = undefined +}; +goog.provide("ol.renderer.webgl.ImageLayer"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.vec.Mat4"); +goog.require("goog.webgl"); +goog.require("ol.Coordinate"); +goog.require("ol.Extent"); +goog.require("ol.ImageBase"); +goog.require("ol.ImageState"); +goog.require("ol.ViewHint"); +goog.require("ol.layer.Image"); +goog.require("ol.renderer.webgl.Layer"); +goog.require("ol.source.Image"); +ol.renderer.webgl.ImageLayer = function(mapRenderer, imageLayer) { + goog.base(this, mapRenderer, imageLayer); + this.image_ = null +}; +goog.inherits(ol.renderer.webgl.ImageLayer, ol.renderer.webgl.Layer); +ol.renderer.webgl.ImageLayer.prototype.createTexture_ = function(image) { + var imageElement = image.getImageElement(); + var gl = this.getWebGLMapRenderer().getGL(); + var texture = gl.createTexture(); + gl.bindTexture(goog.webgl.TEXTURE_2D, texture); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, imageElement); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_S, goog.webgl.CLAMP_TO_EDGE); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_T, goog.webgl.CLAMP_TO_EDGE); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, goog.webgl.LINEAR); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, goog.webgl.LINEAR); + return texture +}; +ol.renderer.webgl.ImageLayer.prototype.forEachFeatureAtPixel = function(coordinate, frameState, callback, thisArg) { + var layer = this.getLayer(); + var source = layer.getSource(); + goog.asserts.assertInstanceof(source, ol.source.Image); + var extent = frameState.extent; + var resolution = frameState.view2DState.resolution; + var rotation = frameState.view2DState.rotation; + return source.forEachFeatureAtPixel(extent, resolution, rotation, coordinate, function(feature) { + return callback.call(thisArg, feature, layer) + }) +}; +ol.renderer.webgl.ImageLayer.prototype.prepareFrame = function(frameState, layerState) { + var gl = this.getWebGLMapRenderer().getGL(); + var view2DState = frameState.view2DState; + var viewCenter = view2DState.center; + var viewResolution = view2DState.resolution; + var viewRotation = view2DState.rotation; + var image = this.image_; + var texture = this.texture; + var imageLayer = this.getLayer(); + goog.asserts.assertInstanceof(imageLayer, ol.layer.Image); + var imageSource = imageLayer.getSource(); + goog.asserts.assertInstanceof(imageSource, ol.source.Image); + var hints = frameState.viewHints; + if(!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) { + var image_ = imageSource.getImage(frameState.extent, viewResolution, frameState.pixelRatio, view2DState.projection); + if(!goog.isNull(image_)) { + var imageState = image_.getState(); + if(imageState == ol.ImageState.IDLE) { + goog.events.listenOnce(image_, goog.events.EventType.CHANGE, this.handleImageChange, false, this); + image_.load() + }else { + if(imageState == ol.ImageState.LOADED) { + image = image_; + texture = this.createTexture_(image_); + if(!goog.isNull(this.texture)) { + frameState.postRenderFunctions.push(goog.partial(function(gl, texture) { + if(!gl.isContextLost()) { + gl.deleteTexture(texture) + } + }, gl, this.texture)) + } + } + } + } + } + if(!goog.isNull(image)) { + goog.asserts.assert(!goog.isNull(texture)); + var canvas = this.getWebGLMapRenderer().getContext().getCanvas(); + this.updateProjectionMatrix_(canvas.width, canvas.height, viewCenter, viewResolution, viewRotation, image.getExtent()); + var texCoordMatrix = this.texCoordMatrix; + goog.vec.Mat4.makeIdentity(texCoordMatrix); + goog.vec.Mat4.scale(texCoordMatrix, 1, -1, 1); + goog.vec.Mat4.translate(texCoordMatrix, 0, -1, 0); + this.image_ = image; + this.texture = texture; + this.updateAttributions(frameState.attributions, image.getAttributions()); + this.updateLogos(frameState, imageSource) + } +}; +ol.renderer.webgl.ImageLayer.prototype.updateProjectionMatrix_ = function(canvasWidth, canvasHeight, viewCenter, viewResolution, viewRotation, imageExtent) { + var canvasExtentWidth = canvasWidth * viewResolution; + var canvasExtentHeight = canvasHeight * viewResolution; + var projectionMatrix = this.projectionMatrix; + goog.vec.Mat4.makeIdentity(projectionMatrix); + goog.vec.Mat4.scale(projectionMatrix, 2 / canvasExtentWidth, 2 / canvasExtentHeight, 1); + goog.vec.Mat4.rotateZ(projectionMatrix, -viewRotation); + goog.vec.Mat4.translate(projectionMatrix, imageExtent[0] - viewCenter[0], imageExtent[1] - viewCenter[1], 0); + goog.vec.Mat4.scale(projectionMatrix, (imageExtent[2] - imageExtent[0]) / 2, (imageExtent[3] - imageExtent[1]) / 2, 1); + goog.vec.Mat4.translate(projectionMatrix, 1, 1, 0) +}; +goog.provide("ol.renderer.webgl.tilelayer.shader"); +goog.require("ol.webgl.shader"); +ol.renderer.webgl.tilelayer.shader.Fragment = function() { + goog.base(this, ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE) +}; +goog.inherits(ol.renderer.webgl.tilelayer.shader.Fragment, ol.webgl.shader.Fragment); +goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Fragment); +ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE = "precision mediump float;\nvarying vec2 v_texCoord;\n\n\nuniform sampler2D u_texture;\n\nvoid main(void) {\n gl_FragColor \x3d texture2D(u_texture, v_texCoord);\n}\n"; +ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE = "precision mediump float;varying vec2 a;uniform sampler2D e;void main(void){gl_FragColor\x3dtexture2D(e,a);}"; +ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE = goog.DEBUG ? ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE : ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE; +ol.renderer.webgl.tilelayer.shader.Vertex = function() { + goog.base(this, ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE) +}; +goog.inherits(ol.renderer.webgl.tilelayer.shader.Vertex, ol.webgl.shader.Vertex); +goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Vertex); +ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE = "varying vec2 v_texCoord;\n\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\nuniform vec4 u_tileOffset;\n\nvoid main(void) {\n gl_Position \x3d vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);\n v_texCoord \x3d a_texCoord;\n}\n\n\n"; +ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE = "varying vec2 a;attribute vec2 b;attribute vec2 c;uniform vec4 d;void main(void){gl_Position\x3dvec4(b*d.xy+d.zw,0.,1.);a\x3dc;}"; +ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE = goog.DEBUG ? ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE : ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE; +ol.renderer.webgl.tilelayer.shader.Locations = function(gl, program) { + this.u_texture = gl.getUniformLocation(program, goog.DEBUG ? "u_texture" : "e"); + this.u_tileOffset = gl.getUniformLocation(program, goog.DEBUG ? "u_tileOffset" : "d"); + this.a_position = gl.getAttribLocation(program, goog.DEBUG ? "a_position" : "b"); + this.a_texCoord = gl.getAttribLocation(program, goog.DEBUG ? "a_texCoord" : "c") +}; +goog.provide("ol.renderer.webgl.TileLayer"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.object"); +goog.require("goog.vec.Mat4"); +goog.require("goog.vec.Vec4"); +goog.require("goog.webgl"); +goog.require("ol.Tile"); +goog.require("ol.TileRange"); +goog.require("ol.TileState"); +goog.require("ol.extent"); +goog.require("ol.layer.Tile"); +goog.require("ol.math"); +goog.require("ol.renderer.webgl.Layer"); +goog.require("ol.renderer.webgl.tilelayer.shader"); +goog.require("ol.source.Tile"); +goog.require("ol.structs.Buffer"); +ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) { + goog.base(this, mapRenderer, tileLayer); + this.fragmentShader_ = ol.renderer.webgl.tilelayer.shader.Fragment.getInstance(); + this.vertexShader_ = ol.renderer.webgl.tilelayer.shader.Vertex.getInstance(); + this.locations_ = null; + this.renderArrayBuffer_ = new ol.structs.Buffer([0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0]); + this.renderedTileRange_ = null; + this.renderedFramebufferExtent_ = null; + this.renderedRevision_ = -1 +}; +goog.inherits(ol.renderer.webgl.TileLayer, ol.renderer.webgl.Layer); +ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() { + var mapRenderer = this.getWebGLMapRenderer(); + var context = mapRenderer.getContext(); + context.deleteBuffer(this.renderArrayBuffer_); + goog.base(this, "disposeInternal") +}; +ol.renderer.webgl.TileLayer.prototype.handleWebGLContextLost = function() { + goog.base(this, "handleWebGLContextLost"); + this.locations_ = null +}; +ol.renderer.webgl.TileLayer.prototype.prepareFrame = function(frameState, layerState) { + var mapRenderer = this.getWebGLMapRenderer(); + var context = mapRenderer.getContext(); + var gl = mapRenderer.getGL(); + var view2DState = frameState.view2DState; + var projection = view2DState.projection; + var tileLayer = this.getLayer(); + goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile); + var tileSource = tileLayer.getSource(); + goog.asserts.assertInstanceof(tileSource, ol.source.Tile); + var tileGrid = tileSource.getTileGridForProjection(projection); + var z = tileGrid.getZForResolution(view2DState.resolution); + var tileResolution = tileGrid.getResolution(z); + var tilePixelSize = tileSource.getTilePixelSize(z, frameState.pixelRatio, projection); + var pixelRatio = tilePixelSize / tileGrid.getTileSize(z); + var tilePixelResolution = tileResolution / pixelRatio; + var tileGutter = tileSource.getGutter(); + var center = view2DState.center; + var extent; + if(tileResolution == view2DState.resolution) { + center = this.snapCenterToPixel(center, tileResolution, frameState.size); + extent = ol.extent.getForView2DAndSize(center, tileResolution, view2DState.rotation, frameState.size) + }else { + extent = frameState.extent + } + var tileRange = tileGrid.getTileRangeForExtentAndResolution(extent, tileResolution); + var framebufferExtent; + if(!goog.isNull(this.renderedTileRange_) && this.renderedTileRange_.equals(tileRange) && this.renderedRevision_ == tileSource.getRevision()) { + framebufferExtent = this.renderedFramebufferExtent_ + }else { + var tileRangeSize = tileRange.getSize(); + var maxDimension = Math.max(tileRangeSize[0] * tilePixelSize, tileRangeSize[1] * tilePixelSize); + var framebufferDimension = ol.math.roundUpToPowerOfTwo(maxDimension); + var framebufferExtentDimension = tilePixelResolution * framebufferDimension; + var origin = tileGrid.getOrigin(z); + var minX = origin[0] + tileRange.minX * tilePixelSize * tilePixelResolution; + var minY = origin[1] + tileRange.minY * tilePixelSize * tilePixelResolution; + framebufferExtent = [minX, minY, minX + framebufferExtentDimension, minY + framebufferExtentDimension]; + this.bindFramebuffer(frameState, framebufferDimension); + gl.viewport(0, 0, framebufferDimension, framebufferDimension); + gl.clearColor(0, 0, 0, 0); + gl.clear(goog.webgl.COLOR_BUFFER_BIT); + gl.disable(goog.webgl.BLEND); + var program = context.getProgram(this.fragmentShader_, this.vertexShader_); + context.useProgram(program); + if(goog.isNull(this.locations_)) { + this.locations_ = new ol.renderer.webgl.tilelayer.shader.Locations(gl, program) + } + context.bindBuffer(goog.webgl.ARRAY_BUFFER, this.renderArrayBuffer_); + gl.enableVertexAttribArray(this.locations_.a_position); + gl.vertexAttribPointer(this.locations_.a_position, 2, goog.webgl.FLOAT, false, 16, 0); + gl.enableVertexAttribArray(this.locations_.a_texCoord); + gl.vertexAttribPointer(this.locations_.a_texCoord, 2, goog.webgl.FLOAT, false, 16, 8); + gl.uniform1i(this.locations_.u_texture, 0); + var tilesToDrawByZ = {}; + tilesToDrawByZ[z] = {}; + var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { + return!goog.isNull(tile) && tile.getState() == ol.TileState.LOADED && mapRenderer.isTileTextureLoaded(tile) + }, tileSource, pixelRatio, projection); + var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, tilesToDrawByZ, getTileIfLoaded); + var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError(); + if(!goog.isDef(useInterimTilesOnError)) { + useInterimTilesOnError = true + } + var allTilesLoaded = true; + var tmpExtent = ol.extent.createEmpty(); + var tmpTileRange = new ol.TileRange(0, 0, 0, 0); + var childTileRange, fullyLoaded, tile, tileState, x, y; + for(x = tileRange.minX;x <= tileRange.maxX;++x) { + for(y = tileRange.minY;y <= tileRange.maxY;++y) { + tile = tileSource.getTile(z, x, y, pixelRatio, projection); + tileState = tile.getState(); + if(tileState == ol.TileState.LOADED) { + if(mapRenderer.isTileTextureLoaded(tile)) { + tilesToDrawByZ[z][tile.tileCoord.toString()] = tile; + continue + } + }else { + if(tileState == ol.TileState.EMPTY || tileState == ol.TileState.ERROR && !useInterimTilesOnError) { + continue + } + } + allTilesLoaded = false; + fullyLoaded = tileGrid.forEachTileCoordParentTileRange(tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent); + if(!fullyLoaded) { + childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord, tmpTileRange, tmpExtent); + if(!goog.isNull(childTileRange)) { + findLoadedTiles(z + 1, childTileRange) + } + } + } + } + var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number); + goog.array.sort(zs); + var u_tileOffset = goog.vec.Vec4.createFloat32(); + var i, ii, sx, sy, tileExtent, tileKey, tilesToDraw, tx, ty; + for(i = 0, ii = zs.length;i < ii;++i) { + tilesToDraw = tilesToDrawByZ[zs[i]]; + for(tileKey in tilesToDraw) { + tile = tilesToDraw[tileKey]; + tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent); + sx = 2 * (tileExtent[2] - tileExtent[0]) / framebufferExtentDimension; + sy = 2 * (tileExtent[3] - tileExtent[1]) / framebufferExtentDimension; + tx = 2 * (tileExtent[0] - framebufferExtent[0]) / framebufferExtentDimension - 1; + ty = 2 * (tileExtent[1] - framebufferExtent[1]) / framebufferExtentDimension - 1; + goog.vec.Vec4.setFromValues(u_tileOffset, sx, sy, tx, ty); + gl.uniform4fv(this.locations_.u_tileOffset, u_tileOffset); + mapRenderer.bindTileTexture(tile, tilePixelSize, tileGutter * pixelRatio, goog.webgl.LINEAR, goog.webgl.LINEAR); + gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4) + } + } + if(allTilesLoaded) { + this.renderedTileRange_ = tileRange; + this.renderedFramebufferExtent_ = framebufferExtent; + this.renderedRevision_ = tileSource.getRevision() + }else { + this.renderedTileRange_ = null; + this.renderedFramebufferExtent_ = null; + this.renderedRevision_ = -1; + frameState.animate = true + } + } + this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); + var tileTextureQueue = mapRenderer.getTileTextureQueue(); + this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio, projection, extent, z, tileLayer.getPreload(), function(tile) { + if(tile.getState() == ol.TileState.LOADED && !mapRenderer.isTileTextureLoaded(tile) && !tileTextureQueue.isKeyQueued(tile.getKey())) { + tileTextureQueue.enqueue([tile, tileGrid.getTileCoordCenter(tile.tileCoord), tileGrid.getResolution(tile.tileCoord.z), tilePixelSize, tileGutter * pixelRatio]) + } + }, this); + this.scheduleExpireCache(frameState, tileSource); + this.updateLogos(frameState, tileSource); + var texCoordMatrix = this.texCoordMatrix; + goog.vec.Mat4.makeIdentity(texCoordMatrix); + goog.vec.Mat4.translate(texCoordMatrix, (center[0] - framebufferExtent[0]) / (framebufferExtent[2] - framebufferExtent[0]), (center[1] - framebufferExtent[1]) / (framebufferExtent[3] - framebufferExtent[1]), 0); + if(view2DState.rotation !== 0) { + goog.vec.Mat4.rotateZ(texCoordMatrix, view2DState.rotation) + } + goog.vec.Mat4.scale(texCoordMatrix, frameState.size[0] * view2DState.resolution / (framebufferExtent[2] - framebufferExtent[0]), frameState.size[1] * view2DState.resolution / (framebufferExtent[3] - framebufferExtent[1]), 1); + goog.vec.Mat4.translate(texCoordMatrix, -0.5, -0.5, 0) +}; +goog.provide("ol.structs.LRUCache"); +goog.require("goog.asserts"); +goog.require("goog.object"); +ol.structs.LRUCache = function() { + this.count_ = 0; + this.entries_ = {}; + this.oldest_ = null; + this.newest_ = null +}; +ol.structs.LRUCache.prototype.assertValid = function() { + if(this.count_ === 0) { + goog.asserts.assert(goog.object.isEmpty(this.entries_)); + goog.asserts.assert(goog.isNull(this.oldest_)); + goog.asserts.assert(goog.isNull(this.newest_)) + }else { + goog.asserts.assert(goog.object.getCount(this.entries_) == this.count_); + goog.asserts.assert(!goog.isNull(this.oldest_)); + goog.asserts.assert(goog.isNull(this.oldest_.older)); + goog.asserts.assert(!goog.isNull(this.newest_)); + goog.asserts.assert(goog.isNull(this.newest_.newer)); + var i, entry; + var older = null; + i = 0; + for(entry = this.oldest_;!goog.isNull(entry);entry = entry.newer) { + goog.asserts.assert(entry.older === older); + older = entry; + ++i + } + goog.asserts.assert(i == this.count_); + var newer = null; + i = 0; + for(entry = this.newest_;!goog.isNull(entry);entry = entry.older) { + goog.asserts.assert(entry.newer === newer); + newer = entry; + ++i + } + goog.asserts.assert(i == this.count_) + } +}; +ol.structs.LRUCache.prototype.clear = function() { + this.count_ = 0; + this.entries_ = {}; + this.oldest_ = null; + this.newest_ = null +}; +ol.structs.LRUCache.prototype.containsKey = function(key) { + return this.entries_.hasOwnProperty(key) +}; +ol.structs.LRUCache.prototype.forEach = function(f, opt_this) { + var entry = this.oldest_; + while(!goog.isNull(entry)) { + f.call(opt_this, entry.value_, entry.key_, this); + entry = entry.newer + } +}; +ol.structs.LRUCache.prototype.get = function(key) { + var entry = this.entries_[key]; + goog.asserts.assert(goog.isDef(entry)); + if(entry === this.newest_) { + return entry.value_ + }else { + if(entry === this.oldest_) { + this.oldest_ = this.oldest_.newer; + this.oldest_.older = null + }else { + entry.newer.older = entry.older; + entry.older.newer = entry.newer + } + } + entry.newer = null; + entry.older = this.newest_; + this.newest_.newer = entry; + this.newest_ = entry; + return entry.value_ +}; +ol.structs.LRUCache.prototype.getCount = function() { + return this.count_ +}; +ol.structs.LRUCache.prototype.getKeys = function() { + var keys = new Array(this.count_); + var i = 0; + var entry; + for(entry = this.newest_;!goog.isNull(entry);entry = entry.older) { + keys[i++] = entry.key_ + } + goog.asserts.assert(i == this.count_); + return keys +}; +ol.structs.LRUCache.prototype.getValues = function() { + var values = new Array(this.count_); + var i = 0; + var entry; + for(entry = this.newest_;!goog.isNull(entry);entry = entry.older) { + values[i++] = entry.value_ + } + goog.asserts.assert(i == this.count_); + return values +}; +ol.structs.LRUCache.prototype.peekLast = function() { + goog.asserts.assert(!goog.isNull(this.oldest_)); + return this.oldest_.value_ +}; +ol.structs.LRUCache.prototype.peekLastKey = function() { + goog.asserts.assert(!goog.isNull(this.oldest_)); + return this.oldest_.key_ +}; +ol.structs.LRUCache.prototype.pop = function() { + goog.asserts.assert(!goog.isNull(this.oldest_)); + goog.asserts.assert(!goog.isNull(this.newest_)); + var entry = this.oldest_; + goog.asserts.assert(entry.key_ in this.entries_); + delete this.entries_[entry.key_]; + if(!goog.isNull(entry.newer)) { + entry.newer.older = null + } + this.oldest_ = entry.newer; + if(goog.isNull(this.oldest_)) { + this.newest_ = null + } + --this.count_; + return entry.value_ +}; +ol.structs.LRUCache.prototype.set = function(key, value) { + goog.asserts.assert(!(key in {})); + goog.asserts.assert(!(key in this.entries_)); + var entry = {key_:key, newer:null, older:this.newest_, value_:value}; + if(goog.isNull(this.newest_)) { + this.oldest_ = entry + }else { + this.newest_.newer = entry + } + this.newest_ = entry; + this.entries_[key] = entry; + ++this.count_ +}; +ol.structs.LRUCacheEntry; +goog.provide("ol.webgl.Context"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.log"); +goog.require("goog.object"); +goog.require("ol.structs.Buffer"); +goog.require("ol.structs.IntegerSet"); +goog.require("ol.webgl.WebGLContextEventType"); +ol.webgl.BufferCacheEntry; +ol.webgl.Context = function(canvas, gl) { + this.canvas_ = canvas; + this.gl_ = gl; + this.bufferCache_ = {}; + this.shaderCache_ = {}; + this.programCache_ = {}; + this.currentProgram_ = null; + goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.LOST, this.handleWebGLContextLost, false, this); + goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.RESTORED, this.handleWebGLContextRestored, false, this) +}; +ol.webgl.Context.prototype.bindBuffer = function(target, buf) { + var gl = this.getGL(); + var arr = buf.getArray(); + var bufferKey = goog.getUid(buf); + if(bufferKey in this.bufferCache_) { + var bufferCacheEntry = this.bufferCache_[bufferKey]; + gl.bindBuffer(target, bufferCacheEntry.buffer); + bufferCacheEntry.dirtySet.forEachRange(function(start, stop) { + var slice = arr.slice(start, stop); + gl.bufferSubData(target, start, target == goog.webgl.ARRAY_BUFFER ? new Float32Array(slice) : new Uint16Array(slice)) + }); + bufferCacheEntry.dirtySet.clear() + }else { + var buffer = gl.createBuffer(); + gl.bindBuffer(target, buffer); + gl.bufferData(target, target == goog.webgl.ARRAY_BUFFER ? new Float32Array(arr) : new Uint16Array(arr), buf.getUsage()); + var dirtySet = new ol.structs.IntegerSet; + buf.addDirtySet(dirtySet); + this.bufferCache_[bufferKey] = {buf:buf, buffer:buffer, dirtySet:dirtySet} + } +}; +ol.webgl.Context.prototype.deleteBuffer = function(buf) { + var gl = this.getGL(); + var bufferKey = goog.getUid(buf); + goog.asserts.assert(bufferKey in this.bufferCache_); + var bufferCacheEntry = this.bufferCache_[bufferKey]; + bufferCacheEntry.buf.removeDirtySet(bufferCacheEntry.dirtySet); + if(!gl.isContextLost()) { + gl.deleteBuffer(bufferCacheEntry.buffer) + } + delete this.bufferCache_[bufferKey] +}; +ol.webgl.Context.prototype.disposeInternal = function() { + goog.object.forEach(this.bufferCache_, function(bufferCacheEntry) { + bufferCacheEntry.buf.removeDirtySet(bufferCacheEntry.dirtySet) + }); + var gl = this.getGL(); + if(!gl.isContextLost()) { + goog.object.forEach(this.bufferCache_, function(bufferCacheEntry) { + gl.deleteBuffer(bufferCacheEntry.buffer) + }); + goog.object.forEach(this.programCache_, function(program) { + gl.deleteProgram(program) + }); + goog.object.forEach(this.shaderCache_, function(shader) { + gl.deleteShader(shader) + }) + } +}; +ol.webgl.Context.prototype.getCanvas = function() { + return this.canvas_ +}; +ol.webgl.Context.prototype.getGL = function() { + return this.gl_ +}; +ol.webgl.Context.prototype.getShader = function(shaderObject) { + var shaderKey = goog.getUid(shaderObject); + if(shaderKey in this.shaderCache_) { + return this.shaderCache_[shaderKey] + }else { + var gl = this.getGL(); + var shader = gl.createShader(shaderObject.getType()); + gl.shaderSource(shader, shaderObject.getSource()); + gl.compileShader(shader); + if(goog.DEBUG) { + if(!gl.getShaderParameter(shader, goog.webgl.COMPILE_STATUS) && !gl.isContextLost()) { + goog.log.error(this.logger_, gl.getShaderInfoLog(shader)) + } + } + goog.asserts.assert(gl.getShaderParameter(shader, goog.webgl.COMPILE_STATUS) || gl.isContextLost()); + this.shaderCache_[shaderKey] = shader; + return shader + } +}; +ol.webgl.Context.prototype.getProgram = function(fragmentShaderObject, vertexShaderObject) { + var programKey = goog.getUid(fragmentShaderObject) + "/" + goog.getUid(vertexShaderObject); + if(programKey in this.programCache_) { + return this.programCache_[programKey] + }else { + var gl = this.getGL(); + var program = gl.createProgram(); + gl.attachShader(program, this.getShader(fragmentShaderObject)); + gl.attachShader(program, this.getShader(vertexShaderObject)); + gl.linkProgram(program); + if(goog.DEBUG) { + if(!gl.getProgramParameter(program, goog.webgl.LINK_STATUS) && !gl.isContextLost()) { + goog.log.error(this.logger_, gl.getProgramInfoLog(program)) + } + } + goog.asserts.assert(gl.getProgramParameter(program, goog.webgl.LINK_STATUS) || gl.isContextLost()); + this.programCache_[programKey] = program; + return program + } +}; +ol.webgl.Context.prototype.handleWebGLContextLost = function() { + goog.object.clear(this.bufferCache_); + goog.object.clear(this.shaderCache_); + goog.object.clear(this.programCache_); + this.currentProgram_ = null +}; +ol.webgl.Context.prototype.handleWebGLContextRestored = function() { +}; +ol.webgl.Context.prototype.useProgram = function(program) { + if(program == this.currentProgram_) { + return false + }else { + var gl = this.getGL(); + gl.useProgram(program); + this.currentProgram_ = program; + return true + } +}; +ol.webgl.Context.prototype.logger_ = goog.log.getLogger("ol.webgl.Context"); +goog.provide("ol.renderer.webgl.Map"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.events.Event"); +goog.require("goog.log"); +goog.require("goog.log.Logger"); +goog.require("goog.object"); +goog.require("goog.style"); +goog.require("goog.webgl"); +goog.require("ol.FrameState"); +goog.require("ol.Tile"); +goog.require("ol.css"); +goog.require("ol.layer.Image"); +goog.require("ol.layer.Tile"); +goog.require("ol.render.Event"); +goog.require("ol.render.EventType"); +goog.require("ol.render.webgl.Immediate"); +goog.require("ol.renderer.Map"); +goog.require("ol.renderer.webgl.ImageLayer"); +goog.require("ol.renderer.webgl.Layer"); +goog.require("ol.renderer.webgl.TileLayer"); +goog.require("ol.source.State"); +goog.require("ol.structs.LRUCache"); +goog.require("ol.structs.PriorityQueue"); +goog.require("ol.webgl"); +goog.require("ol.webgl.Context"); +goog.require("ol.webgl.WebGLContextEventType"); +ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK = 1024; +ol.renderer.webgl.TextureCacheEntry; +ol.renderer.webgl.Map = function(container, map) { + goog.base(this, container, map); + this.canvas_ = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + this.canvas_.style.width = "100%"; + this.canvas_.style.height = "100%"; + this.canvas_.className = ol.css.CLASS_UNSELECTABLE; + goog.dom.insertChildAt(container, this.canvas_, 0); + this.clipTileCanvas_ = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + this.clipTileCanvasSize_ = 0; + this.clipTileContext_ = (this.clipTileCanvas_.getContext("2d")); + this.renderedVisible_ = true; + this.gl_ = ol.webgl.getContext(this.canvas_, {antialias:true, depth:false, failIfMajorPerformanceCaveat:true, preserveDrawingBuffer:false, stencil:true}); + goog.asserts.assert(!goog.isNull(this.gl_)); + this.context_ = new ol.webgl.Context(this.canvas_, this.gl_); + goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.LOST, this.handleWebGLContextLost, false, this); + goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.RESTORED, this.handleWebGLContextRestored, false, this); + this.textureCache_ = new ol.structs.LRUCache; + this.focus_ = null; + this.tileTextureQueue_ = new ol.structs.PriorityQueue(goog.bind(function(element) { + var tileCenter = (element[1]); + var tileResolution = (element[2]); + var deltaX = tileCenter[0] - this.focus_[0]; + var deltaY = tileCenter[1] - this.focus_[1]; + return 65536 * Math.log(tileResolution) + Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution + }, this), function(element) { + return(element[0]).getKey() + }); + this.loadNextTileTexture_ = goog.bind(function(map, frameState) { + if(!this.tileTextureQueue_.isEmpty()) { + this.tileTextureQueue_.reprioritize(); + var element = this.tileTextureQueue_.dequeue(); + var tile = (element[0]); + var tileSize = (element[3]); + var tileGutter = (element[4]); + this.bindTileTexture(tile, tileSize, tileGutter, goog.webgl.LINEAR, goog.webgl.LINEAR) + } + }, this); + this.textureCacheFrameMarkerCount_ = 0; + this.initializeGL_() +}; +goog.inherits(ol.renderer.webgl.Map, ol.renderer.Map); +ol.renderer.webgl.Map.prototype.bindTileTexture = function(tile, tileSize, tileGutter, magFilter, minFilter) { + var gl = this.getGL(); + var tileKey = tile.getKey(); + if(this.textureCache_.containsKey(tileKey)) { + var textureCacheEntry = (this.textureCache_.get(tileKey)); + gl.bindTexture(goog.webgl.TEXTURE_2D, textureCacheEntry.texture); + if(textureCacheEntry.magFilter != magFilter) { + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, magFilter); + textureCacheEntry.magFilter = magFilter + } + if(textureCacheEntry.minFilter != minFilter) { + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, minFilter); + textureCacheEntry.minFilter = minFilter + } + }else { + var texture = gl.createTexture(); + gl.bindTexture(goog.webgl.TEXTURE_2D, texture); + if(tileGutter > 0) { + var clipTileCanvas = this.clipTileCanvas_; + var clipTileContext = this.clipTileContext_; + if(this.clipTileCanvasSize_ != tileSize) { + clipTileCanvas.width = tileSize; + clipTileCanvas.height = tileSize; + this.clipTileCanvasSize_ = tileSize + }else { + clipTileContext.clearRect(0, 0, tileSize, tileSize) + } + clipTileContext.drawImage(tile.getImage(), tileGutter, tileGutter, tileSize, tileSize, 0, 0, tileSize, tileSize); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, clipTileCanvas) + }else { + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, tile.getImage()) + } + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, magFilter); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, minFilter); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_S, goog.webgl.CLAMP_TO_EDGE); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_T, goog.webgl.CLAMP_TO_EDGE); + this.textureCache_.set(tileKey, {texture:texture, magFilter:magFilter, minFilter:minFilter}) + } +}; +ol.renderer.webgl.Map.prototype.createLayerRenderer = function(layer) { + if(ol.ENABLE_IMAGE && layer instanceof ol.layer.Image) { + return new ol.renderer.webgl.ImageLayer(this, layer) + }else { + if(ol.ENABLE_TILE && layer instanceof ol.layer.Tile) { + return new ol.renderer.webgl.TileLayer(this, layer) + }else { + goog.asserts.fail(); + return null + } + } +}; +ol.renderer.webgl.Map.prototype.dispatchComposeEvent_ = function(type, frameState) { + var map = this.getMap(); + if(map.hasListener(type)) { + var context = this.getContext(); + var render = new ol.render.webgl.Immediate(context, frameState.pixelRatio); + var composeEvent = new ol.render.Event(type, map, render, frameState, null, context); + map.dispatchEvent(composeEvent) + } +}; +ol.renderer.webgl.Map.prototype.disposeInternal = function() { + var gl = this.getGL(); + if(!gl.isContextLost()) { + this.textureCache_.forEach(function(textureCacheEntry) { + if(!goog.isNull(textureCacheEntry)) { + gl.deleteTexture(textureCacheEntry.texture) + } + }) + } + goog.dispose(this.context_); + goog.base(this, "disposeInternal") +}; +ol.renderer.webgl.Map.prototype.expireCache_ = function(map, frameState) { + var gl = this.getGL(); + var textureCacheEntry; + while(this.textureCache_.getCount() - this.textureCacheFrameMarkerCount_ > ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK) { + textureCacheEntry = (this.textureCache_.peekLast()); + if(goog.isNull(textureCacheEntry)) { + if(+this.textureCache_.peekLastKey() == frameState.index) { + break + }else { + --this.textureCacheFrameMarkerCount_ + } + }else { + gl.deleteTexture(textureCacheEntry.texture) + } + this.textureCache_.pop() + } +}; +ol.renderer.webgl.Map.prototype.getContext = function() { + return this.context_ +}; +ol.renderer.webgl.Map.prototype.getGL = function() { + return this.gl_ +}; +ol.renderer.webgl.Map.prototype.getTileTextureQueue = function() { + return this.tileTextureQueue_ +}; +ol.renderer.webgl.Map.prototype.handleWebGLContextLost = function(event) { + event.preventDefault(); + this.textureCache_.clear(); + this.textureCacheFrameMarkerCount_ = 0; + goog.object.forEach(this.getLayerRenderers(), function(layerRenderer, key, object) { + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer); + var webGLLayerRenderer = (layerRenderer); + webGLLayerRenderer.handleWebGLContextLost() + }) +}; +ol.renderer.webgl.Map.prototype.handleWebGLContextRestored = function() { + this.initializeGL_(); + this.getMap().render() +}; +ol.renderer.webgl.Map.prototype.initializeGL_ = function() { + var gl = this.gl_; + gl.activeTexture(goog.webgl.TEXTURE0); + gl.blendFuncSeparate(goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA, goog.webgl.ONE, goog.webgl.ONE_MINUS_SRC_ALPHA); + gl.disable(goog.webgl.CULL_FACE); + gl.disable(goog.webgl.DEPTH_TEST); + gl.disable(goog.webgl.SCISSOR_TEST); + gl.disable(goog.webgl.STENCIL_TEST) +}; +ol.renderer.webgl.Map.prototype.isTileTextureLoaded = function(tile) { + return this.textureCache_.containsKey(tile.getKey()) +}; +ol.renderer.webgl.Map.prototype.logger_ = goog.log.getLogger("ol.renderer.webgl.Map"); +ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) { + var context = this.getContext(); + var gl = this.getGL(); + if(gl.isContextLost()) { + return false + } + if(goog.isNull(frameState)) { + if(this.renderedVisible_) { + goog.style.setElementShown(this.canvas_, false); + this.renderedVisible_ = false + } + return false + } + this.focus_ = frameState.focus; + this.textureCache_.set((-frameState.index).toString(), null); + ++this.textureCacheFrameMarkerCount_; + var layersToDraw = []; + var layersArray = frameState.layersArray; + var viewResolution = frameState.view2DState.resolution; + var i, ii, layer, layerRenderer, layerState; + for(i = 0, ii = layersArray.length;i < ii;++i) { + layer = layersArray[i]; + layerState = frameState.layerStates[goog.getUid(layer)]; + if(layerState.visible && layerState.sourceState == ol.source.State.READY && viewResolution < layerState.maxResolution && viewResolution >= layerState.minResolution) { + layersToDraw.push(layer) + } + } + for(i = 0, ii = layersToDraw.length;i < ii;++i) { + layer = layersToDraw[i]; + layerRenderer = this.getLayerRenderer(layer); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer); + layerState = frameState.layerStates[goog.getUid(layer)]; + layerRenderer.prepareFrame(frameState, layerState) + } + var width = frameState.size[0] * frameState.pixelRatio; + var height = frameState.size[1] * frameState.pixelRatio; + if(this.canvas_.width != width || this.canvas_.height != height) { + this.canvas_.width = width; + this.canvas_.height = height + } + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, null); + gl.clearColor(0, 0, 0, 0); + gl.clear(goog.webgl.COLOR_BUFFER_BIT); + gl.enable(goog.webgl.BLEND); + gl.viewport(0, 0, this.canvas_.width, this.canvas_.height); + this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, frameState); + for(i = 0, ii = layersToDraw.length;i < ii;++i) { + layer = layersToDraw[i]; + layerState = frameState.layerStates[goog.getUid(layer)]; + layerRenderer = this.getLayerRenderer(layer); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer); + layerRenderer.composeFrame(frameState, layerState, context) + } + if(!this.renderedVisible_) { + goog.style.setElementShown(this.canvas_, true); + this.renderedVisible_ = true + } + this.calculateMatrices2D(frameState); + if(this.textureCache_.getCount() - this.textureCacheFrameMarkerCount_ > ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK) { + frameState.postRenderFunctions.push(goog.bind(this.expireCache_, this)) + } + if(!this.tileTextureQueue_.isEmpty()) { + frameState.postRenderFunctions.push(this.loadNextTileTexture_); + frameState.animate = true + } + this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState); + this.scheduleRemoveUnusedLayerRenderers(frameState); + this.scheduleExpireIconCache(frameState) +}; +goog.provide("ol.Map"); +goog.provide("ol.MapProperty"); +goog.provide("ol.RendererHint"); +goog.require("goog.Uri.QueryData"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.async.AnimationDelay"); +goog.require("goog.async.nextTick"); +goog.require("goog.debug.Console"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.dom.ViewportSizeMonitor"); +goog.require("goog.events"); +goog.require("goog.events.BrowserEvent"); +goog.require("goog.events.Event"); +goog.require("goog.events.EventType"); +goog.require("goog.events.KeyHandler"); +goog.require("goog.events.KeyHandler.EventType"); +goog.require("goog.events.MouseWheelHandler"); +goog.require("goog.events.MouseWheelHandler.EventType"); +goog.require("goog.log"); +goog.require("goog.log.Level"); +goog.require("goog.object"); +goog.require("goog.style"); +goog.require("goog.vec.Mat4"); +goog.require("ol.BrowserFeature"); +goog.require("ol.Collection"); +goog.require("ol.CollectionEventType"); +goog.require("ol.FrameState"); +goog.require("ol.IView"); +goog.require("ol.MapBrowserEvent"); +goog.require("ol.MapBrowserEvent.EventType"); +goog.require("ol.MapBrowserEventHandler"); +goog.require("ol.MapEvent"); +goog.require("ol.MapEventType"); +goog.require("ol.Object"); +goog.require("ol.ObjectEvent"); +goog.require("ol.ObjectEventType"); +goog.require("ol.Pixel"); +goog.require("ol.PostRenderFunction"); +goog.require("ol.PreRenderFunction"); +goog.require("ol.Size"); +goog.require("ol.Tile"); +goog.require("ol.TileQueue"); +goog.require("ol.View"); +goog.require("ol.View2D"); +goog.require("ol.ViewHint"); +goog.require("ol.control"); +goog.require("ol.extent"); +goog.require("ol.interaction"); +goog.require("ol.layer.Base"); +goog.require("ol.layer.Group"); +goog.require("ol.proj"); +goog.require("ol.proj.common"); +goog.require("ol.renderer.Map"); +goog.require("ol.renderer.canvas.Map"); +goog.require("ol.renderer.dom.Map"); +goog.require("ol.renderer.webgl.Map"); +goog.require("ol.structs.PriorityQueue"); +goog.require("ol.vec.Mat4"); +ol.OL3_URL = "http://ol3js.org/"; +ol.OL3_LOGO_URL = "data:image/png;base64," + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBI" + "WXMAAAHGAAABxgEXwfpGAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAA" + "AhNQTFRF////AP//AICAgP//AFVVQECA////K1VVSbbbYL/fJ05idsTYJFtbbcjbJllmZszW" + "WMTOIFhoHlNiZszTa9DdUcHNHlNlV8XRIVdiasrUHlZjIVZjaMnVH1RlIFRkH1RkH1ZlasvY" + "asvXVsPQH1VkacnVa8vWIVZjIFRjVMPQa8rXIVVkXsXRsNveIFVkIFZlIVVj3eDeh6GmbMvX" + "H1ZkIFRka8rWbMvXIFVkIFVjIFVkbMvWH1VjbMvWIFVlbcvWIFVla8vVIFVkbMvWbMvVH1Vk" + +"bMvWIFVlbcvWIFVkbcvVbMvWjNPbIFVkU8LPwMzNIFVkbczWIFVkbsvWbMvXIFVkRnB8bcvW" + "2+TkW8XRIFVkIlZlJVloJlpoKlxrLl9tMmJwOWd0Omh1RXF8TneCT3iDUHiDU8LPVMLPVcLP" + "VcPQVsPPVsPQV8PQWMTQWsTQW8TQXMXSXsXRX4SNX8bSYMfTYcfTYsfTY8jUZcfSZsnUaIqT" + "acrVasrVa8jTa8rWbI2VbMvWbcvWdJObdcvUdszUd8vVeJaee87Yfc3WgJyjhqGnitDYjaar" + "ldPZnrK2oNbborW5o9bbo9fbpLa6q9ndrL3ArtndscDDutzfu8fJwN7gwt7gxc/QyuHhy+Hi" + "zeHi0NfX0+Pj19zb1+Tj2uXk29/e3uLg3+Lh3+bl4uXj4ufl4+fl5Ofl5ufl5ujm5+jmySDn" + "BAAAAFp0Uk5TAAECAgMEBAYHCA0NDg4UGRogIiMmKSssLzU7PkJJT1JTVFliY2hrdHZ3foSF" + +"hYeJjY2QkpugqbG1tre5w8zQ09XY3uXn6+zx8vT09vf4+Pj5+fr6/P39/f3+gz7SsAAAAVVJ" + "REFUOMtjYKA7EBDnwCPLrObS1BRiLoJLnte6CQy8FLHLCzs2QUG4FjZ5GbcmBDDjxJBXDWxC" + "Brb8aM4zbkIDzpLYnAcE9VXlJSWlZRU13koIeW57mGx5XjoMZEUqwxWYQaQbSzLSkYGfKFSe" + "0QMsX5WbjgY0YS4MBplemI4BdGBW+DQ11eZiymfqQuXZIjqwyadPNoSZ4L+0FVM6e+oGI6g8" + "a9iKNT3o8kVzNkzRg5lgl7p4wyRUL9Yt2jAxVh6mQCogae6GmflI8p0r13VFWTHBQ0rWPW7a" + "hgWVcPm+9cuLoyy4kCJDzCm6d8PSFoh0zvQNC5OjDJhQopPPJqph1doJBUD5tnkbZiUEqaCn" + "B3bTqLTFG1bPn71kw4b+GFdpLElKIzRxxgYgWNYc5SCENVHKeUaltHdXx0dZ8uBI1hJ2UUDg" + +"q82CM2MwKeibqAvSO7MCABq0wXEPiqWEAAAAAElFTkSuQmCC"; +ol.RendererHint = {CANVAS:"canvas", DOM:"dom", WEBGL:"webgl"}; +ol.DEFAULT_RENDERER_HINTS = [ol.RendererHint.WEBGL, ol.RendererHint.CANVAS, ol.RendererHint.DOM]; +ol.MapProperty = {LAYERGROUP:"layergroup", SIZE:"size", TARGET:"target", VIEW:"view"}; +ol.Map = function(options) { + goog.base(this); + var optionsInternal = ol.Map.createOptionsInternal(options); + this.pixelRatio_ = goog.isDef(options.pixelRatio) ? options.pixelRatio : ol.BrowserFeature.DEVICE_PIXEL_RATIO; + this.ol3Logo_ = optionsInternal.ol3Logo; + this.animationDelay_ = new goog.async.AnimationDelay(this.renderFrame_, undefined, this); + this.registerDisposable(this.animationDelay_); + this.coordinateToPixelMatrix_ = goog.vec.Mat4.createNumber(); + this.pixelToCoordinateMatrix_ = goog.vec.Mat4.createNumber(); + this.frameIndex_ = 0; + this.frameState_ = null; + this.viewPropertyListenerKey_ = null; + this.layerGroupPropertyListenerKeys_ = null; + this.viewport_ = goog.dom.createDom(goog.dom.TagName.DIV, "ol-viewport"); + this.viewport_.style.position = "relative"; + this.viewport_.style.overflow = "hidden"; + this.viewport_.style.width = "100%"; + this.viewport_.style.height = "100%"; + this.viewport_.style.msTouchAction = "none"; + if(ol.BrowserFeature.HAS_TOUCH) { + this.viewport_.className = "ol-touch" + } + this.overlayContainer_ = goog.dom.createDom(goog.dom.TagName.DIV, "ol-overlaycontainer"); + goog.dom.appendChild(this.viewport_, this.overlayContainer_); + this.overlayContainerStopEvent_ = goog.dom.createDom(goog.dom.TagName.DIV, "ol-overlaycontainer-stopevent"); + goog.events.listen(this.overlayContainerStopEvent_, [goog.events.EventType.CLICK, goog.events.EventType.DBLCLICK, goog.events.EventType.MOUSEDOWN, goog.events.EventType.TOUCHSTART, goog.events.EventType.MSPOINTERDOWN], goog.events.Event.stopPropagation); + goog.dom.appendChild(this.viewport_, this.overlayContainerStopEvent_); + var mapBrowserEventHandler = new ol.MapBrowserEventHandler(this); + goog.events.listen(mapBrowserEventHandler, goog.object.getValues(ol.MapBrowserEvent.EventType), this.handleMapBrowserEvent, false, this); + this.registerDisposable(mapBrowserEventHandler); + this.keyboardEventTarget_ = optionsInternal.keyboardEventTarget; + this.keyHandler_ = new goog.events.KeyHandler; + goog.events.listen(this.keyHandler_, goog.events.KeyHandler.EventType.KEY, this.handleBrowserEvent, false, this); + this.registerDisposable(this.keyHandler_); + var mouseWheelHandler = new goog.events.MouseWheelHandler(this.viewport_); + goog.events.listen(mouseWheelHandler, goog.events.MouseWheelHandler.EventType.MOUSEWHEEL, this.handleBrowserEvent, false, this); + this.registerDisposable(mouseWheelHandler); + this.controls_ = optionsInternal.controls; + this.deviceOptions_ = optionsInternal.deviceOptions; + this.interactions_ = optionsInternal.interactions; + this.overlays_ = optionsInternal.overlays; + this.renderer_ = new optionsInternal.rendererConstructor(this.viewport_, this); + this.registerDisposable(this.renderer_); + this.viewportSizeMonitor_ = new goog.dom.ViewportSizeMonitor; + goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE, this.updateSize, false, this); + this.focus_ = null; + this.preRenderFunctions_ = []; + this.postRenderFunctions_ = []; + this.tileQueue_ = new ol.TileQueue(goog.bind(this.getTilePriority, this), goog.bind(this.handleTileChange_, this)); + goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.LAYERGROUP), this.handleLayerGroupChanged_, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.VIEW), this.handleViewChanged_, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.SIZE), this.handleSizeChanged_, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.TARGET), this.handleTargetChanged_, false, this); + this.setValues(optionsInternal.values); + this.controls_.forEach(function(control) { + control.setMap(this) + }, this); + goog.events.listen(this.controls_, ol.CollectionEventType.ADD, function(event) { + event.element.setMap(this) + }, false, this); + goog.events.listen(this.controls_, ol.CollectionEventType.REMOVE, function(event) { + event.element.setMap(null) + }, false, this); + this.interactions_.forEach(function(interaction) { + interaction.setMap(this) + }, this); + goog.events.listen(this.interactions_, ol.CollectionEventType.ADD, function(event) { + event.element.setMap(this) + }, false, this); + goog.events.listen(this.interactions_, ol.CollectionEventType.REMOVE, function(event) { + event.element.setMap(null) + }, false, this); + this.overlays_.forEach(function(overlay) { + overlay.setMap(this) + }, this); + goog.events.listen(this.overlays_, ol.CollectionEventType.ADD, function(event) { + event.element.setMap(this) + }, false, this); + goog.events.listen(this.overlays_, ol.CollectionEventType.REMOVE, function(event) { + event.element.setMap(null) + }, false, this) +}; +goog.inherits(ol.Map, ol.Object); +ol.Map.prototype.addControl = function(control) { + var controls = this.getControls(); + goog.asserts.assert(goog.isDef(controls)); + controls.push(control) +}; +ol.Map.prototype.addInteraction = function(interaction) { + var interactions = this.getInteractions(); + goog.asserts.assert(goog.isDef(interactions)); + interactions.push(interaction) +}; +ol.Map.prototype.addLayer = function(layer) { + var layers = this.getLayerGroup().getLayers(); + goog.asserts.assert(goog.isDef(layers)); + layers.push(layer) +}; +ol.Map.prototype.addOverlay = function(overlay) { + var overlays = this.getOverlays(); + goog.asserts.assert(goog.isDef(overlays)); + overlays.push(overlay) +}; +ol.Map.prototype.beforeRender = function(var_args) { + this.render(); + Array.prototype.push.apply(this.preRenderFunctions_, arguments) +}; +ol.Map.prototype.removePreRenderFunction = function(preRenderFunction) { + return goog.array.remove(this.preRenderFunctions_, preRenderFunction) +}; +ol.Map.prototype.disposeInternal = function() { + goog.dom.removeNode(this.viewport_); + goog.base(this, "disposeInternal") +}; +ol.Map.prototype.forEachFeatureAtPixel = function(pixel, callback, opt_this, opt_layerFilter, opt_this2) { + if(goog.isNull(this.frameState_)) { + return + } + var coordinate = this.getCoordinateFromPixel(pixel); + var thisArg = goog.isDef(opt_this) ? opt_this : null; + var layerFilter = goog.isDef(opt_layerFilter) ? opt_layerFilter : goog.functions.TRUE; + var thisArg2 = goog.isDef(opt_this2) ? opt_this2 : null; + return this.renderer_.forEachFeatureAtPixel(coordinate, this.frameState_, callback, thisArg, layerFilter, thisArg2) +}; +ol.Map.prototype.getEventCoordinate = function(event) { + return this.getCoordinateFromPixel(this.getEventPixel(event)) +}; +ol.Map.prototype.getEventPixel = function(event) { + if(goog.isDef(event.changedTouches)) { + var touch = event.changedTouches.item(0); + var viewportPosition = goog.style.getClientPosition(this.viewport_); + return[touch.clientX - viewportPosition.x, touch.clientY - viewportPosition.y] + }else { + var eventPosition = goog.style.getRelativePosition(event, this.viewport_); + return[eventPosition.x, eventPosition.y] + } +}; +ol.Map.prototype.getTarget = function() { + return(this.get(ol.MapProperty.TARGET)) +}; +goog.exportProperty(ol.Map.prototype, "getTarget", ol.Map.prototype.getTarget); +ol.Map.prototype.getCoordinateFromPixel = function(pixel) { + var frameState = this.frameState_; + if(goog.isNull(frameState)) { + return null + }else { + var vec2 = pixel.slice(); + return ol.vec.Mat4.multVec2(frameState.pixelToCoordinateMatrix, vec2, vec2) + } +}; +ol.Map.prototype.getControls = function() { + return this.controls_ +}; +ol.Map.prototype.getOverlays = function() { + return this.overlays_ +}; +ol.Map.prototype.getInteractions = function() { + return this.interactions_ +}; +ol.Map.prototype.getLayerGroup = function() { + return(this.get(ol.MapProperty.LAYERGROUP)) +}; +goog.exportProperty(ol.Map.prototype, "getLayerGroup", ol.Map.prototype.getLayerGroup); +ol.Map.prototype.getLayers = function() { + var layerGroup = this.getLayerGroup(); + if(goog.isDef(layerGroup)) { + return layerGroup.getLayers() + }else { + return undefined + } +}; +ol.Map.prototype.getPixelFromCoordinate = function(coordinate) { + var frameState = this.frameState_; + if(goog.isNull(frameState)) { + return null + }else { + var vec2 = coordinate.slice(0, 2); + return ol.vec.Mat4.multVec2(frameState.coordinateToPixelMatrix, vec2, vec2) + } +}; +ol.Map.prototype.getSize = function() { + return(this.get(ol.MapProperty.SIZE)) +}; +goog.exportProperty(ol.Map.prototype, "getSize", ol.Map.prototype.getSize); +ol.Map.prototype.getView = function() { + return(this.get(ol.MapProperty.VIEW)) +}; +goog.exportProperty(ol.Map.prototype, "getView", ol.Map.prototype.getView); +ol.Map.prototype.getViewport = function() { + return this.viewport_ +}; +ol.Map.prototype.getOverlayContainer = function() { + return this.overlayContainer_ +}; +ol.Map.prototype.getOverlayContainerStopEvent = function() { + return this.overlayContainerStopEvent_ +}; +ol.Map.prototype.getTilePriority = function(tile, tileSourceKey, tileCenter, tileResolution) { + var frameState = this.frameState_; + if(goog.isNull(frameState) || !(tileSourceKey in frameState.wantedTiles)) { + return ol.structs.PriorityQueue.DROP + } + var coordKey = tile.tileCoord.toString(); + if(!frameState.wantedTiles[tileSourceKey][coordKey]) { + return ol.structs.PriorityQueue.DROP + } + var deltaX = tileCenter[0] - frameState.focus[0]; + var deltaY = tileCenter[1] - frameState.focus[1]; + return 65536 * Math.log(tileResolution) + Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution +}; +ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) { + var type = opt_type || browserEvent.type; + var mapBrowserEvent = new ol.MapBrowserEvent(type, this, browserEvent); + this.handleMapBrowserEvent(mapBrowserEvent) +}; +ol.Map.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + if(goog.isNull(this.frameState_)) { + return + } + this.focus_ = mapBrowserEvent.coordinate; + mapBrowserEvent.frameState = this.frameState_; + var interactions = this.getInteractions(); + var interactionsArray = (interactions.getArray()); + var i; + if(this.dispatchEvent(mapBrowserEvent) !== false) { + for(i = interactionsArray.length - 1;i >= 0;i--) { + var interaction = interactionsArray[i]; + var cont = interaction.handleMapBrowserEvent(mapBrowserEvent); + if(!cont) { + break + } + } + } +}; +ol.Map.prototype.handlePostRender = function() { + var frameState = this.frameState_; + var tileQueue = this.tileQueue_; + if(!tileQueue.isEmpty()) { + var maxTotalLoading = 16; + var maxNewLoads = maxTotalLoading; + var tileSourceCount = 0; + if(!goog.isNull(frameState)) { + var hints = frameState.viewHints; + var deviceOptions = this.deviceOptions_; + if(hints[ol.ViewHint.ANIMATING]) { + maxTotalLoading = deviceOptions.loadTilesWhileAnimating === false ? 0 : 8; + maxNewLoads = 2 + } + if(hints[ol.ViewHint.INTERACTING]) { + maxTotalLoading = deviceOptions.loadTilesWhileInteracting === false ? 0 : 8; + maxNewLoads = 2 + } + tileSourceCount = goog.object.getCount(frameState.wantedTiles) + } + maxTotalLoading *= tileSourceCount; + maxNewLoads *= tileSourceCount; + if(tileQueue.getTilesLoading() < maxTotalLoading) { + tileQueue.reprioritize(); + tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads) + } + } + var postRenderFunctions = this.postRenderFunctions_; + var i, ii; + for(i = 0, ii = postRenderFunctions.length;i < ii;++i) { + postRenderFunctions[i](this, frameState) + } + postRenderFunctions.length = 0 +}; +ol.Map.prototype.handleSizeChanged_ = function() { + this.render() +}; +ol.Map.prototype.handleTargetChanged_ = function() { + var target = this.getTarget(); + var targetElement = goog.isDef(target) ? goog.dom.getElement(target) : null; + this.keyHandler_.detach(); + if(goog.isNull(targetElement)) { + goog.dom.removeNode(this.viewport_) + }else { + goog.dom.appendChild(targetElement, this.viewport_); + var keyboardEventTarget = goog.isNull(this.keyboardEventTarget_) ? targetElement : this.keyboardEventTarget_; + this.keyHandler_.attach(keyboardEventTarget) + } + this.updateSize() +}; +ol.Map.prototype.handleTileChange_ = function() { + this.render() +}; +ol.Map.prototype.handleViewPropertyChanged_ = function() { + this.render() +}; +ol.Map.prototype.handleViewChanged_ = function() { + if(!goog.isNull(this.viewPropertyListenerKey_)) { + goog.events.unlistenByKey(this.viewPropertyListenerKey_); + this.viewPropertyListenerKey_ = null + } + var view = this.getView(); + if(goog.isDefAndNotNull(view)) { + this.viewPropertyListenerKey_ = goog.events.listen(view, ol.ObjectEventType.PROPERTYCHANGE, this.handleViewPropertyChanged_, false, this) + } + this.render() +}; +ol.Map.prototype.handleLayerGroupMemberChanged_ = function(event) { + goog.asserts.assertInstanceof(event, goog.events.Event); + this.render() +}; +ol.Map.prototype.handleLayerGroupPropertyChanged_ = function(event) { + goog.asserts.assertInstanceof(event, ol.ObjectEvent); + this.render() +}; +ol.Map.prototype.handleLayerGroupChanged_ = function() { + if(!goog.isNull(this.layerGroupPropertyListenerKeys_)) { + var length = this.layerGroupPropertyListenerKeys_.length; + for(var i = 0;i < length;++i) { + goog.events.unlistenByKey(this.layerGroupPropertyListenerKeys_[i]) + } + this.layerGroupPropertyListenerKeys_ = null + } + var layerGroup = this.getLayerGroup(); + if(goog.isDefAndNotNull(layerGroup)) { + this.layerGroupPropertyListenerKeys_ = [goog.events.listen(layerGroup, ol.ObjectEventType.PROPERTYCHANGE, this.handleLayerGroupPropertyChanged_, false, this), goog.events.listen(layerGroup, goog.events.EventType.CHANGE, this.handleLayerGroupMemberChanged_, false, this)] + } + this.render() +}; +ol.Map.prototype.isDef = function() { + if(!goog.dom.contains(document, this.viewport_)) { + return false + } + if(!goog.style.isElementShown(this.viewport_)) { + return false + } + var size = this.getSize(); + if(!goog.isDefAndNotNull(size) || size[0] <= 0 || size[1] <= 0) { + return false + } + var view = this.getView(); + if(!goog.isDef(view) || !view.isDef()) { + return false + } + return true +}; +ol.Map.prototype.isRendered = function() { + return!goog.isNull(this.frameState_) +}; +ol.Map.prototype.renderSync = function() { + this.animationDelay_.fire() +}; +ol.Map.prototype.render = function() { + if(!this.animationDelay_.isActive()) { + this.animationDelay_.start() + } +}; +ol.Map.prototype.removeControl = function(control) { + var controls = this.getControls(); + goog.asserts.assert(goog.isDef(controls)); + if(goog.isDef(controls.remove(control))) { + return control + } + return undefined +}; +ol.Map.prototype.removeInteraction = function(interaction) { + var removed; + var interactions = this.getInteractions(); + goog.asserts.assert(goog.isDef(interactions)); + if(goog.isDef(interactions.remove(interaction))) { + removed = interaction + } + return removed +}; +ol.Map.prototype.removeLayer = function(layer) { + var layers = this.getLayerGroup().getLayers(); + goog.asserts.assert(goog.isDef(layers)); + return(layers.remove(layer)) +}; +ol.Map.prototype.removeOverlay = function(overlay) { + var overlays = this.getOverlays(); + goog.asserts.assert(goog.isDef(overlays)); + if(goog.isDef(overlays.remove(overlay))) { + return overlay + } + return undefined +}; +ol.Map.prototype.renderFrame_ = function(time) { + var i, ii, view2DState; + function hasArea(size) { + return size[0] > 0 && size[1] > 0 + } + var size = this.getSize(); + var view = this.getView(); + var view2D = goog.isDef(view) ? this.getView().getView2D() : undefined; + var frameState = null; + if(goog.isDef(size) && hasArea(size) && goog.isDef(view2D) && view2D.isDef()) { + var viewHints = view.getHints(); + var obj = this.getLayerGroup().getLayerStatesArray(); + var layersArray = obj.layers; + var layerStatesArray = obj.layerStates; + var layerStates = {}; + var layer; + for(i = 0, ii = layersArray.length;i < ii;++i) { + layer = layersArray[i]; + layerStates[goog.getUid(layer)] = layerStatesArray[i] + } + view2DState = view2D.getView2DState(); + frameState = {animate:false, attributions:{}, coordinateToPixelMatrix:this.coordinateToPixelMatrix_, extent:null, focus:goog.isNull(this.focus_) ? view2DState.center : this.focus_, index:this.frameIndex_++, layersArray:layersArray, layerStates:layerStates, logos:{}, pixelRatio:this.pixelRatio_, pixelToCoordinateMatrix:this.pixelToCoordinateMatrix_, postRenderFunctions:[], size:size, tileQueue:this.tileQueue_, time:time, usedTiles:{}, view2DState:view2DState, viewHints:viewHints, wantedTiles:{}}; + if(this.ol3Logo_) { + frameState.logos[ol.OL3_LOGO_URL] = ol.OL3_URL + } + } + var preRenderFunctions = this.preRenderFunctions_; + var n = 0, preRenderFunction; + for(i = 0, ii = preRenderFunctions.length;i < ii;++i) { + preRenderFunction = preRenderFunctions[i]; + if(preRenderFunction(this, frameState)) { + preRenderFunctions[n++] = preRenderFunction + } + } + preRenderFunctions.length = n; + if(!goog.isNull(frameState)) { + frameState.extent = ol.extent.getForView2DAndSize(view2DState.center, view2DState.resolution, view2DState.rotation, frameState.size) + } + this.frameState_ = frameState; + this.renderer_.renderFrame(frameState); + if(!goog.isNull(frameState)) { + if(frameState.animate) { + this.render() + } + Array.prototype.push.apply(this.postRenderFunctions_, frameState.postRenderFunctions); + var idle = this.preRenderFunctions_.length == 0 && !frameState.animate && !frameState.viewHints[ol.ViewHint.ANIMATING] && !frameState.viewHints[ol.ViewHint.INTERACTING]; + if(idle) { + this.dispatchEvent(new ol.MapEvent(ol.MapEventType.MOVEEND, this)) + } + } + this.dispatchEvent(new ol.MapEvent(ol.MapEventType.POSTRENDER, this, frameState)); + goog.async.nextTick(this.handlePostRender, this) +}; +ol.Map.prototype.setLayerGroup = function(layerGroup) { + this.set(ol.MapProperty.LAYERGROUP, layerGroup) +}; +goog.exportProperty(ol.Map.prototype, "setLayerGroup", ol.Map.prototype.setLayerGroup); +ol.Map.prototype.setSize = function(size) { + this.set(ol.MapProperty.SIZE, size) +}; +goog.exportProperty(ol.Map.prototype, "setSize", ol.Map.prototype.setSize); +ol.Map.prototype.setTarget = function(target) { + this.set(ol.MapProperty.TARGET, target) +}; +goog.exportProperty(ol.Map.prototype, "setTarget", ol.Map.prototype.setTarget); +ol.Map.prototype.setView = function(view) { + this.set(ol.MapProperty.VIEW, view) +}; +goog.exportProperty(ol.Map.prototype, "setView", ol.Map.prototype.setView); +ol.Map.prototype.updateSize = function() { + var target = this.getTarget(); + var targetElement = goog.isDef(target) ? goog.dom.getElement(target) : null; + if(goog.isNull(targetElement)) { + this.setSize(undefined) + }else { + var size = goog.style.getContentBoxSize(targetElement); + this.setSize([size.width, size.height]) + } +}; +ol.MapOptionsInternal; +ol.Map.createOptionsInternal = function(options) { + var keyboardEventTarget = null; + if(goog.isDef(options.keyboardEventTarget)) { + keyboardEventTarget = goog.isString(options.keyboardEventTarget) ? document.getElementById(options.keyboardEventTarget) : options.keyboardEventTarget + } + var values = {}; + var ol3Logo = goog.isDef(options.ol3Logo) ? options.ol3Logo : true; + var layerGroup = options.layers instanceof ol.layer.Group ? options.layers : new ol.layer.Group({layers:options.layers}); + values[ol.MapProperty.LAYERGROUP] = layerGroup; + values[ol.MapProperty.TARGET] = options.target; + values[ol.MapProperty.VIEW] = goog.isDef(options.view) ? options.view : new ol.View2D; + var rendererConstructor = ol.renderer.Map; + var rendererHints; + if(goog.isDef(options.renderer)) { + if(goog.isArray(options.renderer)) { + rendererHints = options.renderer + }else { + if(goog.isString(options.renderer)) { + rendererHints = [options.renderer] + }else { + goog.asserts.fail("Incorrect format for renderer option") + } + } + }else { + rendererHints = ol.DEFAULT_RENDERER_HINTS + } + var i, ii; + for(i = 0, ii = rendererHints.length;i < ii;++i) { + var rendererHint = rendererHints[i]; + if(ol.ENABLE_CANVAS && rendererHint == ol.RendererHint.CANVAS) { + if(ol.BrowserFeature.HAS_CANVAS) { + rendererConstructor = ol.renderer.canvas.Map; + break + } + }else { + if(ol.ENABLE_DOM && rendererHint == ol.RendererHint.DOM) { + if(ol.BrowserFeature.HAS_DOM) { + rendererConstructor = ol.renderer.dom.Map; + break + } + }else { + if(ol.ENABLE_WEBGL && rendererHint == ol.RendererHint.WEBGL) { + if(ol.BrowserFeature.HAS_WEBGL) { + rendererConstructor = ol.renderer.webgl.Map; + break + } + } + } + } + } + var controls; + if(goog.isDef(options.controls)) { + if(goog.isArray(options.controls)) { + controls = new ol.Collection(goog.array.clone(options.controls)) + }else { + goog.asserts.assertInstanceof(options.controls, ol.Collection); + controls = options.controls + } + }else { + controls = ol.control.defaults() + } + var deviceOptions = goog.isDef(options.deviceOptions) ? options.deviceOptions : ({}); + var interactions; + if(goog.isDef(options.interactions)) { + if(goog.isArray(options.interactions)) { + interactions = new ol.Collection(goog.array.clone(options.interactions)) + }else { + goog.asserts.assertInstanceof(options.interactions, ol.Collection); + interactions = options.interactions + } + }else { + interactions = ol.interaction.defaults() + } + var overlays; + if(goog.isDef(options.overlays)) { + if(goog.isArray(options.overlays)) { + overlays = new ol.Collection(goog.array.clone(options.overlays)) + }else { + goog.asserts.assertInstanceof(options.overlays, ol.Collection); + overlays = options.overlays + } + }else { + overlays = new ol.Collection + } + return{controls:controls, deviceOptions:deviceOptions, interactions:interactions, keyboardEventTarget:keyboardEventTarget, ol3Logo:ol3Logo, overlays:overlays, rendererConstructor:rendererConstructor, values:values} +}; +ol.proj.common.add(); +if(goog.DEBUG) { + (function() { + goog.debug.Console.autoInstall(); + var logger = goog.log.getLogger("ol"); + logger.setLevel(goog.log.Level.FINEST) + })() +} +;goog.provide("ol.DrawEvent"); +goog.provide("ol.interaction.Draw"); +goog.require("goog.asserts"); +goog.require("goog.events.Event"); +goog.require("ol.Collection"); +goog.require("ol.Coordinate"); +goog.require("ol.Feature"); +goog.require("ol.FeatureOverlay"); +goog.require("ol.Map"); +goog.require("ol.MapBrowserEvent"); +goog.require("ol.MapBrowserEvent.EventType"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.MultiLineString"); +goog.require("ol.geom.MultiPoint"); +goog.require("ol.geom.MultiPolygon"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.Polygon"); +goog.require("ol.interaction.Interaction"); +goog.require("ol.source.Vector"); +goog.require("ol.style.Circle"); +goog.require("ol.style.Fill"); +goog.require("ol.style.Stroke"); +goog.require("ol.style.Style"); +ol.DrawEventType = {DRAWSTART:"drawstart", DRAWEND:"drawend"}; +ol.DrawEvent = function(type, feature) { + goog.base(this, type); + this.feature = feature +}; +goog.inherits(ol.DrawEvent, goog.events.Event); +ol.interaction.Draw = function(options) { + goog.base(this); + this.source_ = goog.isDef(options.source) ? options.source : null; + this.features_ = goog.isDef(options.features) ? options.features : null; + this.snapTolerance_ = goog.isDef(options.snapTolerance) ? options.snapTolerance : 12; + this.minPointsPerRing_ = goog.isDef(options.minPointsPerRing) ? options.minPointsPerRing : 3; + this.type_ = options.type; + this.mode_ = ol.interaction.Draw.getMode_(this.type_); + this.finishCoordinate_ = null; + this.sketchFeature_ = null; + this.sketchPoint_ = null; + this.sketchLine_ = null; + this.sketchRawPolygon_ = null; + this.squaredClickTolerance_ = 4; + this.overlay_ = new ol.FeatureOverlay({style:goog.isDef(options.style) ? options.style : ol.interaction.Draw.getDefaultStyleFunction()}) +}; +goog.inherits(ol.interaction.Draw, ol.interaction.Interaction); +ol.interaction.Draw.getDefaultStyleFunction = function() { + var styles = {}; + styles[ol.geom.GeometryType.POLYGON] = [new ol.style.Style({fill:new ol.style.Fill({color:[255, 255, 255, 0.5]})})]; + styles[ol.geom.GeometryType.MULTI_POLYGON] = styles[ol.geom.GeometryType.POLYGON]; + styles[ol.geom.GeometryType.LINE_STRING] = [new ol.style.Style({stroke:new ol.style.Stroke({color:[255, 255, 255, 1], width:5})}), new ol.style.Style({stroke:new ol.style.Stroke({color:[0, 153, 255, 1], width:3})})]; + styles[ol.geom.GeometryType.MULTI_LINE_STRING] = styles[ol.geom.GeometryType.LINE_STRING]; + styles[ol.geom.GeometryType.POINT] = [new ol.style.Style({image:new ol.style.Circle({radius:7, fill:new ol.style.Fill({color:[0, 153, 255, 1]}), stroke:new ol.style.Stroke({color:[255, 255, 255, 0.75], width:1.5})}), zIndex:1E5})]; + styles[ol.geom.GeometryType.MULTI_POINT] = styles[ol.geom.GeometryType.POINT]; + return function(feature, resolution) { + return styles[feature.getGeometry().getType()] + } +}; +ol.interaction.Draw.prototype.setMap = function(map) { + if(goog.isNull(map)) { + this.abortDrawing_() + } + this.overlay_.setMap(map); + goog.base(this, "setMap", map) +}; +ol.interaction.Draw.prototype.handleMapBrowserEvent = function(event) { + var map = event.map; + if(!map.isDef()) { + return true + } + var pass = true; + if(event.type === ol.MapBrowserEvent.EventType.CLICK) { + pass = this.handleClick_(event) + }else { + if(event.type === ol.MapBrowserEvent.EventType.MOUSEMOVE) { + pass = this.handleMove_(event) + }else { + if(event.type === ol.MapBrowserEvent.EventType.DBLCLICK) { + pass = false + } + } + } + return pass +}; +ol.interaction.Draw.prototype.handleClick_ = function(event) { + var downPx = event.map.getEventPixel(event.target.getDown()); + var clickPx = event.pixel; + var dx = downPx[0] - clickPx[0]; + var dy = downPx[1] - clickPx[1]; + var squaredDistance = dx * dx + dy * dy; + var pass = true; + if(squaredDistance <= this.squaredClickTolerance_) { + if(goog.isNull(this.finishCoordinate_)) { + this.startDrawing_(event) + }else { + if(this.mode_ === ol.interaction.DrawMode.POINT || this.atFinish_(event)) { + this.finishDrawing_(event) + }else { + this.addToDrawing_(event) + } + } + pass = false + } + return pass +}; +ol.interaction.Draw.prototype.handleMove_ = function(event) { + if(this.mode_ === ol.interaction.DrawMode.POINT && goog.isNull(this.finishCoordinate_)) { + this.startDrawing_(event) + }else { + if(!goog.isNull(this.finishCoordinate_)) { + this.modifyDrawing_(event) + } + } + return true +}; +ol.interaction.Draw.prototype.atFinish_ = function(event) { + var at = false; + if(!goog.isNull(this.sketchFeature_)) { + var geometry = this.sketchFeature_.getGeometry(); + var potentiallyDone = false; + var potentiallyFinishCoordinates = [this.finishCoordinate_]; + if(this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + potentiallyDone = geometry.getCoordinates().length > 2 + }else { + if(this.mode_ === ol.interaction.DrawMode.POLYGON) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + potentiallyDone = geometry.getCoordinates()[0].length > this.minPointsPerRing_; + potentiallyFinishCoordinates = [this.sketchRawPolygon_[0][0], this.sketchRawPolygon_[0][this.sketchRawPolygon_[0].length - 2]] + } + } + if(potentiallyDone) { + var map = event.map; + for(var i = 0, ii = potentiallyFinishCoordinates.length;i < ii;i++) { + var finishCoordinate = potentiallyFinishCoordinates[i]; + var finishPixel = map.getPixelFromCoordinate(finishCoordinate); + var pixel = event.pixel; + var dx = pixel[0] - finishPixel[0]; + var dy = pixel[1] - finishPixel[1]; + at = Math.sqrt(dx * dx + dy * dy) <= this.snapTolerance_; + if(at) { + this.finishCoordinate_ = finishCoordinate; + break + } + } + } + } + return at +}; +ol.interaction.Draw.prototype.startDrawing_ = function(event) { + var start = event.coordinate; + this.finishCoordinate_ = start; + var geometry; + if(this.mode_ === ol.interaction.DrawMode.POINT) { + geometry = new ol.geom.Point(start.slice()) + }else { + this.sketchPoint_ = new ol.Feature(new ol.geom.Point(start.slice())); + if(this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + geometry = new ol.geom.LineString([start.slice(), start.slice()]) + }else { + if(this.mode_ === ol.interaction.DrawMode.POLYGON) { + this.sketchLine_ = new ol.Feature(new ol.geom.LineString([start.slice(), start.slice()])); + this.sketchRawPolygon_ = [[start.slice(), start.slice()]]; + geometry = new ol.geom.Polygon(this.sketchRawPolygon_) + } + } + } + goog.asserts.assert(goog.isDef(geometry)); + this.sketchFeature_ = new ol.Feature(geometry); + this.updateSketchFeatures_(); + this.dispatchEvent(new ol.DrawEvent(ol.DrawEventType.DRAWSTART, this.sketchFeature_)) +}; +ol.interaction.Draw.prototype.modifyDrawing_ = function(event) { + var coordinate = event.coordinate; + var geometry = this.sketchFeature_.getGeometry(); + var coordinates, last; + if(this.mode_ === ol.interaction.DrawMode.POINT) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + last = geometry.getCoordinates(); + last[0] = coordinate[0]; + last[1] = coordinate[1]; + geometry.setCoordinates(last) + }else { + if(this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + coordinates = geometry.getCoordinates() + }else { + if(this.mode_ === ol.interaction.DrawMode.POLYGON) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + coordinates = this.sketchRawPolygon_[0] + } + } + if(this.atFinish_(event)) { + coordinate = this.finishCoordinate_.slice() + } + var sketchPointGeom = this.sketchPoint_.getGeometry(); + goog.asserts.assertInstanceof(sketchPointGeom, ol.geom.Point); + sketchPointGeom.setCoordinates(coordinate); + last = coordinates[coordinates.length - 1]; + last[0] = coordinate[0]; + last[1] = coordinate[1]; + if(this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + geometry.setCoordinates(coordinates) + }else { + if(this.mode_ === ol.interaction.DrawMode.POLYGON) { + var sketchLineGeom = this.sketchLine_.getGeometry(); + goog.asserts.assertInstanceof(sketchLineGeom, ol.geom.LineString); + sketchLineGeom.setCoordinates(coordinates); + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + geometry.setCoordinates(this.sketchRawPolygon_) + } + } + } + this.updateSketchFeatures_() +}; +ol.interaction.Draw.prototype.addToDrawing_ = function(event) { + var coordinate = event.coordinate; + var geometry = this.sketchFeature_.getGeometry(); + var coordinates, last; + if(this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + this.finishCoordinate_ = coordinate.slice(); + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + coordinates = geometry.getCoordinates(); + coordinates.push(coordinate.slice()); + geometry.setCoordinates(coordinates) + }else { + if(this.mode_ === ol.interaction.DrawMode.POLYGON) { + this.sketchRawPolygon_[0].push(coordinate.slice()); + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + geometry.setCoordinates(this.sketchRawPolygon_) + } + } + this.updateSketchFeatures_() +}; +ol.interaction.Draw.prototype.finishDrawing_ = function(event) { + var sketchFeature = this.abortDrawing_(); + goog.asserts.assert(!goog.isNull(sketchFeature)); + var coordinates; + var geometry = sketchFeature.getGeometry(); + if(this.mode_ === ol.interaction.DrawMode.POINT) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + coordinates = geometry.getCoordinates() + }else { + if(this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + coordinates = geometry.getCoordinates(); + coordinates.pop(); + geometry.setCoordinates(coordinates) + }else { + if(this.mode_ === ol.interaction.DrawMode.POLYGON) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + this.sketchRawPolygon_[0].pop(); + this.sketchRawPolygon_[0].push(this.sketchRawPolygon_[0][0]); + geometry.setCoordinates(this.sketchRawPolygon_); + coordinates = geometry.getCoordinates() + } + } + } + if(this.type_ === ol.geom.GeometryType.MULTI_POINT) { + sketchFeature.setGeometry(new ol.geom.MultiPoint([coordinates])) + }else { + if(this.type_ === ol.geom.GeometryType.MULTI_LINE_STRING) { + sketchFeature.setGeometry(new ol.geom.MultiLineString([coordinates])) + }else { + if(this.type_ === ol.geom.GeometryType.MULTI_POLYGON) { + sketchFeature.setGeometry(new ol.geom.MultiPolygon([coordinates])) + } + } + } + if(!goog.isNull(this.features_)) { + this.features_.push(sketchFeature) + } + if(!goog.isNull(this.source_)) { + this.source_.addFeature(sketchFeature) + } + this.dispatchEvent(new ol.DrawEvent(ol.DrawEventType.DRAWEND, sketchFeature)) +}; +ol.interaction.Draw.prototype.abortDrawing_ = function() { + this.finishCoordinate_ = null; + var sketchFeature = this.sketchFeature_; + if(!goog.isNull(sketchFeature)) { + this.sketchFeature_ = null; + this.sketchPoint_ = null; + this.sketchLine_ = null; + this.overlay_.getFeatures().clear() + } + return sketchFeature +}; +ol.interaction.Draw.prototype.updateSketchFeatures_ = function() { + var sketchFeatures = [this.sketchFeature_]; + if(!goog.isNull(this.sketchLine_)) { + sketchFeatures.push(this.sketchLine_) + } + if(!goog.isNull(this.sketchPoint_)) { + sketchFeatures.push(this.sketchPoint_) + } + this.overlay_.setFeatures(new ol.Collection(sketchFeatures)) +}; +ol.interaction.Draw.getMode_ = function(type) { + var mode; + if(type === ol.geom.GeometryType.POINT || type === ol.geom.GeometryType.MULTI_POINT) { + mode = ol.interaction.DrawMode.POINT + }else { + if(type === ol.geom.GeometryType.LINE_STRING || type === ol.geom.GeometryType.MULTI_LINE_STRING) { + mode = ol.interaction.DrawMode.LINE_STRING + }else { + if(type === ol.geom.GeometryType.POLYGON || type === ol.geom.GeometryType.MULTI_POLYGON) { + mode = ol.interaction.DrawMode.POLYGON + } + } + } + goog.asserts.assert(goog.isDef(mode)); + return mode +}; +ol.interaction.DrawMode = {POINT:"Point", LINE_STRING:"LineString", POLYGON:"Polygon"}; +goog.provide("ol.Ellipsoid"); +goog.require("goog.math"); +goog.require("ol.Coordinate"); +ol.Ellipsoid = function(a, flattening) { + this.a = a; + this.flattening = flattening; + this.b = this.a * (1 - this.flattening); + this.eSquared = 2 * flattening - flattening * flattening; + this.e = Math.sqrt(this.eSquared) +}; +ol.Ellipsoid.prototype.vincenty = function(c1, c2, opt_minDeltaLambda, opt_maxIterations) { + var minDeltaLambda = goog.isDef(opt_minDeltaLambda) ? opt_minDeltaLambda : 1E-12; + var maxIterations = goog.isDef(opt_maxIterations) ? opt_maxIterations : 100; + var f = this.flattening; + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + var U1 = Math.atan((1 - f) * Math.tan(lat1)); + var cosU1 = Math.cos(U1); + var sinU1 = Math.sin(U1); + var U2 = Math.atan((1 - f) * Math.tan(lat2)); + var cosU2 = Math.cos(U2); + var sinU2 = Math.sin(U2); + var lambda = deltaLon; + var cosSquaredAlpha, sinAlpha; + var cosLambda, deltaLambda = Infinity, sinLambda; + var cos2SigmaM, cosSigma, sigma, sinSigma; + var i; + for(i = maxIterations;i > 0;--i) { + cosLambda = Math.cos(lambda); + sinLambda = Math.sin(lambda); + var x = cosU2 * sinLambda; + var y = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda; + sinSigma = Math.sqrt(x * x + y * y); + if(sinSigma === 0) { + return{distance:0, initialBearing:0, finalBearing:0} + } + cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda; + sigma = Math.atan2(sinSigma, cosSigma); + sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma; + cosSquaredAlpha = 1 - sinAlpha * sinAlpha; + cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSquaredAlpha; + if(isNaN(cos2SigmaM)) { + cos2SigmaM = 0 + } + var C = f / 16 * cosSquaredAlpha * (4 + f * (4 - 3 * cosSquaredAlpha)); + var lambdaPrime = deltaLon + (1 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (2 * cos2SigmaM * cos2SigmaM - 1))); + deltaLambda = Math.abs(lambdaPrime - lambda); + lambda = lambdaPrime; + if(deltaLambda < minDeltaLambda) { + break + } + } + if(i === 0) { + return{distance:NaN, finalBearing:NaN, initialBearing:NaN} + } + var aSquared = this.a * this.a; + var bSquared = this.b * this.b; + var uSquared = cosSquaredAlpha * (aSquared - bSquared) / bSquared; + var A = 1 + uSquared / 16384 * (4096 + uSquared * (uSquared * (320 - 175 * uSquared) - 768)); + var B = uSquared / 1024 * (256 + uSquared * (uSquared * (74 - 47 * uSquared) - 128)); + var deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (2 * cos2SigmaM * cos2SigmaM - 1) - B / 6 * cos2SigmaM * (4 * sinSigma * sinSigma - 3) * (4 * cos2SigmaM * cos2SigmaM - 3))); + cosLambda = Math.cos(lambda); + sinLambda = Math.sin(lambda); + var alpha1 = Math.atan2(cosU2 * sinLambda, cosU1 * sinU2 - sinU1 * cosU2 * cosLambda); + var alpha2 = Math.atan2(cosU1 * sinLambda, cosU1 * sinU2 * cosLambda - sinU1 * cosU2); + return{distance:this.b * A * (sigma - deltaSigma), initialBearing:goog.math.toDegrees(alpha1), finalBearing:goog.math.toDegrees(alpha2)} +}; +ol.Ellipsoid.prototype.vincentyDistance = function(c1, c2, opt_minDeltaLambda, opt_maxIterations) { + var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations); + return vincenty.distance +}; +ol.Ellipsoid.prototype.vincentyFinalBearing = function(c1, c2, opt_minDeltaLambda, opt_maxIterations) { + var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations); + return vincenty.finalBearing +}; +ol.Ellipsoid.prototype.vincentyInitialBearing = function(c1, c2, opt_minDeltaLambda, opt_maxIterations) { + var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations); + return vincenty.initialBearing +}; +goog.provide("ol.Geolocation"); +goog.provide("ol.GeolocationProperty"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.math"); +goog.require("ol.BrowserFeature"); +goog.require("ol.Coordinate"); +goog.require("ol.Object"); +goog.require("ol.proj"); +ol.GeolocationProperty = {ACCURACY:"accuracy", ALTITUDE:"altitude", ALTITUDE_ACCURACY:"altitudeAccuracy", HEADING:"heading", POSITION:"position", PROJECTION:"projection", SPEED:"speed", TRACKING:"tracking", TRACKING_OPTIONS:"trackingOptions"}; +ol.Geolocation = function(opt_options) { + goog.base(this); + var options = goog.isDef(opt_options) ? opt_options : {}; + this.position_ = null; + this.transform_ = ol.proj.identityTransform; + this.watchId_ = undefined; + goog.events.listen(this, ol.Object.getChangeEventType(ol.GeolocationProperty.PROJECTION), this.handleProjectionChanged_, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.GeolocationProperty.TRACKING), this.handleTrackingChanged_, false, this); + if(goog.isDef(options.projection)) { + this.setProjection(ol.proj.get(options.projection)) + } + if(goog.isDef(options.trackingOptions)) { + this.setTrackingOptions(options.trackingOptions) + } + this.setTracking(goog.isDef(options.tracking) ? options.tracking : false) +}; +goog.inherits(ol.Geolocation, ol.Object); +ol.Geolocation.prototype.disposeInternal = function() { + this.setTracking(false); + goog.base(this, "disposeInternal") +}; +ol.Geolocation.prototype.handleProjectionChanged_ = function() { + var projection = this.getProjection(); + if(goog.isDefAndNotNull(projection)) { + this.transform_ = ol.proj.getTransformFromProjections(ol.proj.get("EPSG:4326"), projection); + if(!goog.isNull(this.position_)) { + this.set(ol.GeolocationProperty.POSITION, this.transform_(this.position_)) + } + } +}; +ol.Geolocation.prototype.handleTrackingChanged_ = function() { + if(ol.BrowserFeature.HAS_GEOLOCATION) { + var tracking = this.getTracking(); + if(tracking && !goog.isDef(this.watchId_)) { + this.watchId_ = goog.global.navigator.geolocation.watchPosition(goog.bind(this.positionChange_, this), goog.bind(this.positionError_, this), this.getTrackingOptions()) + }else { + if(!tracking && goog.isDef(this.watchId_)) { + goog.global.navigator.geolocation.clearWatch(this.watchId_); + this.watchId_ = undefined + } + } + } +}; +ol.Geolocation.prototype.positionChange_ = function(position) { + var coords = position.coords; + this.set(ol.GeolocationProperty.ACCURACY, coords.accuracy); + this.set(ol.GeolocationProperty.ALTITUDE, goog.isNull(coords.altitude) ? undefined : coords.altitude); + this.set(ol.GeolocationProperty.ALTITUDE_ACCURACY, goog.isNull(coords.altitudeAccuracy) ? undefined : coords.altitudeAccuracy); + this.set(ol.GeolocationProperty.HEADING, goog.isNull(coords.heading) ? undefined : goog.math.toRadians(coords.heading)); + if(goog.isNull(this.position_)) { + this.position_ = [coords.longitude, coords.latitude] + }else { + this.position_[0] = coords.longitude; + this.position_[1] = coords.latitude + } + this.set(ol.GeolocationProperty.POSITION, this.transform_(this.position_)); + this.set(ol.GeolocationProperty.SPEED, goog.isNull(coords.speed) ? undefined : coords.speed) +}; +ol.Geolocation.prototype.positionError_ = function(error) { + error.type = goog.events.EventType.ERROR; + this.dispatchEvent(error) +}; +ol.Geolocation.prototype.getAccuracy = function() { + return(this.get(ol.GeolocationProperty.ACCURACY)) +}; +goog.exportProperty(ol.Geolocation.prototype, "getAccuracy", ol.Geolocation.prototype.getAccuracy); +ol.Geolocation.prototype.getAltitude = function() { + return(this.get(ol.GeolocationProperty.ALTITUDE)) +}; +goog.exportProperty(ol.Geolocation.prototype, "getAltitude", ol.Geolocation.prototype.getAltitude); +ol.Geolocation.prototype.getAltitudeAccuracy = function() { + return(this.get(ol.GeolocationProperty.ALTITUDE_ACCURACY)) +}; +goog.exportProperty(ol.Geolocation.prototype, "getAltitudeAccuracy", ol.Geolocation.prototype.getAltitudeAccuracy); +ol.Geolocation.prototype.getHeading = function() { + return(this.get(ol.GeolocationProperty.HEADING)) +}; +goog.exportProperty(ol.Geolocation.prototype, "getHeading", ol.Geolocation.prototype.getHeading); +ol.Geolocation.prototype.getPosition = function() { + return(this.get(ol.GeolocationProperty.POSITION)) +}; +goog.exportProperty(ol.Geolocation.prototype, "getPosition", ol.Geolocation.prototype.getPosition); +ol.Geolocation.prototype.getProjection = function() { + return(this.get(ol.GeolocationProperty.PROJECTION)) +}; +goog.exportProperty(ol.Geolocation.prototype, "getProjection", ol.Geolocation.prototype.getProjection); +ol.Geolocation.prototype.getSpeed = function() { + return(this.get(ol.GeolocationProperty.SPEED)) +}; +goog.exportProperty(ol.Geolocation.prototype, "getSpeed", ol.Geolocation.prototype.getSpeed); +ol.Geolocation.prototype.getTracking = function() { + return(this.get(ol.GeolocationProperty.TRACKING)) +}; +goog.exportProperty(ol.Geolocation.prototype, "getTracking", ol.Geolocation.prototype.getTracking); +ol.Geolocation.prototype.getTrackingOptions = function() { + return(this.get(ol.GeolocationProperty.TRACKING_OPTIONS)) +}; +goog.exportProperty(ol.Geolocation.prototype, "getTrackingOptions", ol.Geolocation.prototype.getTrackingOptions); +ol.Geolocation.prototype.setProjection = function(projection) { + this.set(ol.GeolocationProperty.PROJECTION, projection) +}; +goog.exportProperty(ol.Geolocation.prototype, "setProjection", ol.Geolocation.prototype.setProjection); +ol.Geolocation.prototype.setTracking = function(tracking) { + this.set(ol.GeolocationProperty.TRACKING, tracking) +}; +goog.exportProperty(ol.Geolocation.prototype, "setTracking", ol.Geolocation.prototype.setTracking); +ol.Geolocation.prototype.setTrackingOptions = function(options) { + this.set(ol.GeolocationProperty.TRACKING_OPTIONS, options) +}; +goog.exportProperty(ol.Geolocation.prototype, "setTrackingOptions", ol.Geolocation.prototype.setTrackingOptions); +goog.provide("ol.ImageCanvas"); +goog.require("ol.ImageBase"); +goog.require("ol.ImageState"); +ol.ImageCanvas = function(extent, resolution, pixelRatio, attributions, canvas) { + goog.base(this, extent, resolution, pixelRatio, ol.ImageState.LOADED, attributions); + this.canvas_ = canvas +}; +goog.inherits(ol.ImageCanvas, ol.ImageBase); +ol.ImageCanvas.prototype.getImageElement = function(opt_context) { + return this.canvas_ +}; +goog.provide("ol.TileLoadFunctionType"); +ol.TileLoadFunctionType; +goog.provide("ol.ImageTile"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.object"); +goog.require("ol.Tile"); +goog.require("ol.TileCoord"); +goog.require("ol.TileLoadFunctionType"); +goog.require("ol.TileState"); +ol.ImageTile = function(tileCoord, state, src, crossOrigin, tileLoadFunction) { + goog.base(this, tileCoord, state); + this.src_ = src; + this.image_ = new Image; + if(!goog.isNull(crossOrigin)) { + this.image_.crossOrigin = crossOrigin + } + this.imageByContext_ = {}; + this.imageListenerKeys_ = null; + this.tileLoadFunction_ = tileLoadFunction +}; +goog.inherits(ol.ImageTile, ol.Tile); +ol.ImageTile.prototype.getImage = function(opt_context) { + if(goog.isDef(opt_context)) { + var image; + var key = goog.getUid(opt_context); + if(key in this.imageByContext_) { + return this.imageByContext_[key] + }else { + if(goog.object.isEmpty(this.imageByContext_)) { + image = this.image_ + }else { + image = (this.image_.cloneNode(false)) + } + } + this.imageByContext_[key] = image; + return image + }else { + return this.image_ + } +}; +ol.ImageTile.prototype.getKey = function() { + return this.src_ +}; +ol.ImageTile.prototype.handleImageError_ = function() { + this.state = ol.TileState.ERROR; + this.unlistenImage_(); + this.dispatchChangeEvent() +}; +ol.ImageTile.prototype.handleImageLoad_ = function() { + if(!goog.isDef(this.image_.naturalWidth)) { + this.image_.naturalWidth = this.image_.width; + this.image_.naturalHeight = this.image_.height + } + if(this.image_.naturalWidth && this.image_.naturalHeight) { + this.state = ol.TileState.LOADED + }else { + this.state = ol.TileState.EMPTY + } + this.unlistenImage_(); + this.dispatchChangeEvent() +}; +ol.ImageTile.prototype.load = function() { + if(this.state == ol.TileState.IDLE) { + this.state = ol.TileState.LOADING; + goog.asserts.assert(goog.isNull(this.imageListenerKeys_)); + this.imageListenerKeys_ = [goog.events.listenOnce(this.image_, goog.events.EventType.ERROR, this.handleImageError_, false, this), goog.events.listenOnce(this.image_, goog.events.EventType.LOAD, this.handleImageLoad_, false, this)]; + this.tileLoadFunction_(this, this.src_) + } +}; +ol.ImageTile.prototype.unlistenImage_ = function() { + goog.asserts.assert(!goog.isNull(this.imageListenerKeys_)); + goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey); + this.imageListenerKeys_ = null +}; +goog.provide("ol.ImageUrlFunction"); +goog.provide("ol.ImageUrlFunctionType"); +goog.require("ol.Size"); +ol.ImageUrlFunctionType; +ol.ImageUrlFunction.createFromParamsFunction = function(baseUrl, params, paramsFunction) { + return function(extent, size, projection) { + return paramsFunction(baseUrl, params, extent, size, projection) + } +}; +ol.ImageUrlFunction.nullImageUrlFunction = function(extent, size) { + return undefined +}; +goog.provide("ol.Overlay"); +goog.provide("ol.OverlayPositioning"); +goog.provide("ol.OverlayProperty"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.style"); +goog.require("ol.Coordinate"); +goog.require("ol.Map"); +goog.require("ol.MapEventType"); +goog.require("ol.Object"); +ol.OverlayProperty = {ELEMENT:"element", MAP:"map", POSITION:"position", POSITIONING:"positioning"}; +ol.OverlayPositioning = {BOTTOM_LEFT:"bottom-left", BOTTOM_CENTER:"bottom-center", BOTTOM_RIGHT:"bottom-right", CENTER_LEFT:"center-left", CENTER_CENTER:"center-center", CENTER_RIGHT:"center-right", TOP_LEFT:"top-left", TOP_CENTER:"top-center", TOP_RIGHT:"top-right"}; +ol.Overlay = function(options) { + goog.base(this); + this.insertFirst_ = goog.isDef(options.insertFirst) ? options.insertFirst : true; + this.stopEvent_ = goog.isDef(options.stopEvent) ? options.stopEvent : true; + this.element_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.element_.style.position = "absolute"; + this.rendered_ = {bottom_:"", left_:"", right_:"", top_:"", visible:true}; + this.mapPostrenderListenerKey_ = null; + goog.events.listen(this, ol.Object.getChangeEventType(ol.OverlayProperty.ELEMENT), this.handleElementChanged, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.OverlayProperty.MAP), this.handleMapChanged, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.OverlayProperty.POSITION), this.handlePositionChanged, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.OverlayProperty.POSITIONING), this.handlePositioningChanged, false, this); + if(goog.isDef(options.element)) { + this.setElement(options.element) + } + if(goog.isDef(options.position)) { + this.setPosition(options.position) + } + if(goog.isDef(options.positioning)) { + this.setPositioning((options.positioning)) + } +}; +goog.inherits(ol.Overlay, ol.Object); +ol.Overlay.prototype.getElement = function() { + return(this.get(ol.OverlayProperty.ELEMENT)) +}; +goog.exportProperty(ol.Overlay.prototype, "getElement", ol.Overlay.prototype.getElement); +ol.Overlay.prototype.getMap = function() { + return(this.get(ol.OverlayProperty.MAP)) +}; +goog.exportProperty(ol.Overlay.prototype, "getMap", ol.Overlay.prototype.getMap); +ol.Overlay.prototype.getPosition = function() { + return(this.get(ol.OverlayProperty.POSITION)) +}; +goog.exportProperty(ol.Overlay.prototype, "getPosition", ol.Overlay.prototype.getPosition); +ol.Overlay.prototype.getPositioning = function() { + return(this.get(ol.OverlayProperty.POSITIONING)) +}; +goog.exportProperty(ol.Overlay.prototype, "getPositioning", ol.Overlay.prototype.getPositioning); +ol.Overlay.prototype.handleElementChanged = function() { + goog.dom.removeChildren(this.element_); + var element = this.getElement(); + if(goog.isDefAndNotNull(element)) { + goog.dom.append((this.element_), element) + } +}; +ol.Overlay.prototype.handleMapChanged = function() { + if(!goog.isNull(this.mapPostrenderListenerKey_)) { + goog.dom.removeNode(this.element_); + goog.events.unlistenByKey(this.mapPostrenderListenerKey_); + this.mapPostrenderListenerKey_ = null + } + var map = this.getMap(); + if(goog.isDefAndNotNull(map)) { + this.mapPostrenderListenerKey_ = goog.events.listen(map, ol.MapEventType.POSTRENDER, this.handleMapPostrender, false, this); + this.updatePixelPosition_(); + var container = this.stopEvent_ ? map.getOverlayContainerStopEvent() : map.getOverlayContainer(); + if(this.insertFirst_) { + goog.dom.insertChildAt((container), this.element_, 0) + }else { + goog.dom.append((container), this.element_) + } + } +}; +ol.Overlay.prototype.handleMapPostrender = function() { + this.updatePixelPosition_() +}; +ol.Overlay.prototype.handlePositionChanged = function() { + this.updatePixelPosition_() +}; +ol.Overlay.prototype.handlePositioningChanged = function() { + this.updatePixelPosition_() +}; +ol.Overlay.prototype.setElement = function(element) { + this.set(ol.OverlayProperty.ELEMENT, element) +}; +goog.exportProperty(ol.Overlay.prototype, "setElement", ol.Overlay.prototype.setElement); +ol.Overlay.prototype.setMap = function(map) { + this.set(ol.OverlayProperty.MAP, map) +}; +goog.exportProperty(ol.Overlay.prototype, "setMap", ol.Overlay.prototype.setMap); +ol.Overlay.prototype.setPosition = function(position) { + this.set(ol.OverlayProperty.POSITION, position) +}; +goog.exportProperty(ol.Overlay.prototype, "setPosition", ol.Overlay.prototype.setPosition); +ol.Overlay.prototype.setPositioning = function(positioning) { + this.set(ol.OverlayProperty.POSITIONING, positioning) +}; +goog.exportProperty(ol.Overlay.prototype, "setPositioning", ol.Overlay.prototype.setPositioning); +ol.Overlay.prototype.updatePixelPosition_ = function() { + var map = this.getMap(); + var position = this.getPosition(); + if(!goog.isDef(map) || !map.isRendered() || !goog.isDef(position)) { + if(this.rendered_.visible) { + goog.style.setElementShown(this.element_, false); + this.rendered_.visible = false + } + return + } + var pixel = map.getPixelFromCoordinate(position); + goog.asserts.assert(!goog.isNull(pixel)); + var mapSize = map.getSize(); + goog.asserts.assert(goog.isDef(mapSize)); + var style = this.element_.style; + var positioning = this.getPositioning(); + if(positioning == ol.OverlayPositioning.BOTTOM_RIGHT || positioning == ol.OverlayPositioning.CENTER_RIGHT || positioning == ol.OverlayPositioning.TOP_RIGHT) { + if(this.rendered_.left_ !== "") { + this.rendered_.left_ = style.left = "" + } + var right = Math.round(mapSize[0] - pixel[0]) + "px"; + if(this.rendered_.right_ != right) { + this.rendered_.right_ = style.right = right + } + }else { + if(this.rendered_.right_ !== "") { + this.rendered_.right_ = style.right = "" + } + var offsetX = 0; + if(positioning == ol.OverlayPositioning.BOTTOM_CENTER || positioning == ol.OverlayPositioning.CENTER_CENTER || positioning == ol.OverlayPositioning.TOP_CENTER) { + offsetX = goog.style.getSize(this.element_).width / 2 + } + var left = Math.round(pixel[0] - offsetX) + "px"; + if(this.rendered_.left_ != left) { + this.rendered_.left_ = style.left = left + } + } + if(positioning == ol.OverlayPositioning.BOTTOM_LEFT || positioning == ol.OverlayPositioning.BOTTOM_CENTER || positioning == ol.OverlayPositioning.BOTTOM_RIGHT) { + if(this.rendered_.top_ !== "") { + this.rendered_.top_ = style.top = "" + } + var bottom = Math.round(mapSize[1] - pixel[1]) + "px"; + if(this.rendered_.bottom_ != bottom) { + this.rendered_.bottom_ = style.bottom = bottom + } + }else { + if(this.rendered_.bottom_ !== "") { + this.rendered_.bottom_ = style.bottom = "" + } + var offsetY = 0; + if(positioning == ol.OverlayPositioning.CENTER_LEFT || positioning == ol.OverlayPositioning.CENTER_CENTER || positioning == ol.OverlayPositioning.CENTER_RIGHT) { + offsetY = goog.style.getSize(this.element_).height / 2 + } + var top = Math.round(pixel[1] - offsetY) + "px"; + if(this.rendered_.top_ != top) { + this.rendered_.top_ = style.top = top + } + } + if(!this.rendered_.visible) { + goog.style.setElementShown(this.element_, true); + this.rendered_.visible = true + } +}; +goog.provide("ol.TileCache"); +goog.require("goog.asserts"); +goog.require("ol.Tile"); +goog.require("ol.TileCoord"); +goog.require("ol.TileRange"); +goog.require("ol.structs.LRUCache"); +ol.DEFAULT_TILE_CACHE_HIGH_WATER_MARK = 2048; +ol.TileCache = function(opt_highWaterMark) { + goog.base(this); + this.highWaterMark_ = goog.isDef(opt_highWaterMark) ? opt_highWaterMark : ol.DEFAULT_TILE_CACHE_HIGH_WATER_MARK +}; +goog.inherits(ol.TileCache, ol.structs.LRUCache); +ol.TileCache.prototype.canExpireCache = function() { + return this.getCount() > this.highWaterMark_ +}; +ol.TileCache.prototype.expireCache = function(usedTiles) { + var tile, zKey; + while(this.canExpireCache()) { + tile = (this.peekLast()); + zKey = tile.tileCoord.z.toString(); + if(zKey in usedTiles && usedTiles[zKey].contains(tile.tileCoord)) { + break + }else { + this.pop() + } + } +}; +ol.TileCache.prototype.pruneTileRange = function(tileRange) { + var i = this.getCount(), key; + while(i--) { + key = this.peekLastKey(); + if(tileRange.contains(ol.TileCoord.createFromString(key))) { + this.pop() + }else { + this.get(key) + } + } +}; +goog.provide("ol.TileUrlFunction"); +goog.provide("ol.TileUrlFunctionType"); +goog.require("goog.array"); +goog.require("goog.math"); +goog.require("ol.TileCoord"); +ol.TileUrlFunctionType; +ol.TileCoordTransformType; +ol.TileUrlFunction.createFromTemplate = function(template) { + return function(tileCoord, pixelRatio, projection) { + if(goog.isNull(tileCoord)) { + return undefined + }else { + return template.replace("{z}", tileCoord.z.toString()).replace("{x}", tileCoord.x.toString()).replace("{y}", tileCoord.y.toString()) + } + } +}; +ol.TileUrlFunction.createFromTemplates = function(templates) { + return ol.TileUrlFunction.createFromTileUrlFunctions(goog.array.map(templates, ol.TileUrlFunction.createFromTemplate)) +}; +ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { + if(tileUrlFunctions.length === 1) { + return tileUrlFunctions[0] + } + return function(tileCoord, pixelRatio, projection) { + if(goog.isNull(tileCoord)) { + return undefined + }else { + var index = goog.math.modulo(tileCoord.hash(), tileUrlFunctions.length); + return tileUrlFunctions[index].call(this, tileCoord, pixelRatio, projection) + } + } +}; +ol.TileUrlFunction.nullTileUrlFunction = function(tileCoord, pixelRatio, projection) { + return undefined +}; +ol.TileUrlFunction.withTileCoordTransform = function(transformFn, tileUrlFunction) { + var tmpTileCoord = new ol.TileCoord(0, 0, 0); + return function(tileCoord, pixelRatio, projection) { + if(goog.isNull(tileCoord)) { + return undefined + }else { + return tileUrlFunction.call(this, transformFn.call(this, tileCoord, projection, tmpTileCoord), pixelRatio, projection) + } + } +}; +ol.TileUrlFunction.expandUrl = function(url) { + var urls = []; + var match = /\{(\d)-(\d)\}/.exec(url) || /\{([a-z])-([a-z])\}/.exec(url); + if(match) { + var startCharCode = match[1].charCodeAt(0); + var stopCharCode = match[2].charCodeAt(0); + var charCode; + for(charCode = startCharCode;charCode <= stopCharCode;++charCode) { + urls.push(url.replace(match[0], String.fromCharCode(charCode))) + } + }else { + urls.push(url) + } + return urls +}; +goog.provide("ol.binary.Buffer"); +goog.provide("ol.binary.IReader"); +goog.require("goog.asserts"); +goog.require("goog.userAgent"); +goog.require("ol.BrowserFeature"); +ol.binary.Buffer = function(data) { + this.data_ = data +}; +ol.binary.Buffer.prototype.getReader = function() { + var data = this.data_; + if(ol.BrowserFeature.HAS_ARRAY_BUFFER) { + var arrayBuffer; + if(data instanceof ArrayBuffer) { + arrayBuffer = data + }else { + if(goog.isString(data)) { + arrayBuffer = new ArrayBuffer(data.length); + var uint8View = new Uint8Array(arrayBuffer); + var i, ii; + for(i = 0, ii = data.length;i < ii;++i) { + uint8View[i] = data.charCodeAt(i) + } + }else { + goog.asserts.fail(); + return null + } + } + return new ol.binary.ArrayBufferReader(arrayBuffer) + }else { + goog.asserts.assert(goog.isString(data)); + goog.asserts.assert(goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("10.0")); + return new ol.binary.ArrayReader((new VBArray(data)).toArray()) + } +}; +ol.binary.IReader = function() { +}; +ol.binary.IReader.prototype.atEOF = function() { +}; +ol.binary.IReader.prototype.readByte = function() { +}; +ol.binary.ArrayBufferReader = function(arrayBuffer) { + this.uint8View_ = new Uint8Array(arrayBuffer); + this.length_ = this.uint8View_.length; + this.offset_ = 0 +}; +ol.binary.ArrayBufferReader.prototype.atEOF = function() { + return this.offset_ == this.length_ +}; +ol.binary.ArrayBufferReader.prototype.readByte = function() { + if(this.offset_ < this.length_) { + return this.uint8View_[this.offset_++] + }else { + goog.asserts.fail(); + return 0 + } +}; +ol.binary.ArrayReader = function(array) { + this.array_ = array; + this.length_ = array.length; + this.offset_ = 0 +}; +ol.binary.ArrayReader.prototype.atEOF = function() { + return this.offset_ == this.length_ +}; +ol.binary.ArrayReader.prototype.readByte = function() { + if(this.offset_ < this.length_) { + return this.array_[this.offset_++] + }else { + goog.asserts.fail(); + return 0 + } +}; +goog.provide("googx.dom.fullscreen"); +goog.provide("googx.dom.fullscreen.EventType"); +goog.require("goog.dom"); +goog.require("goog.userAgent"); +googx.dom.fullscreen.EventType = {CHANGE:function() { + if(goog.userAgent.WEBKIT) { + return"webkitfullscreenchange" + } + if(goog.userAgent.GECKO) { + return"mozfullscreenchange" + } + if(goog.userAgent.IE) { + return"MSFullscreenChange" + } + return"fullscreenchange" +}()}; +googx.dom.fullscreen.isSupported = function(opt_domHelper) { + var doc = googx.dom.fullscreen.getDocument_(opt_domHelper); + var body = doc.body; + return!!(body.webkitRequestFullscreen || body.mozRequestFullScreen && doc.mozFullScreenEnabled || body.msRequestFullscreen && doc.msFullscreenEnabled || body.requestFullscreen && doc.fullscreenEnabled) +}; +googx.dom.fullscreen.requestFullScreen = function(element) { + if(element.webkitRequestFullscreen) { + element.webkitRequestFullscreen() + }else { + if(element.mozRequestFullScreen) { + element.mozRequestFullScreen() + }else { + if(element.msRequestFullscreen) { + element.msRequestFullscreen() + }else { + if(element.requestFullscreen) { + element.requestFullscreen() + } + } + } + } +}; +googx.dom.fullscreen.requestFullScreenWithKeys = function(element) { + if(element.mozRequestFullScreenWithKeys) { + element.mozRequestFullScreenWithKeys() + }else { + if(element.webkitRequestFullscreen) { + element.webkitRequestFullscreen() + }else { + googx.dom.fullscreen.requestFullScreen(element) + } + } +}; +googx.dom.fullscreen.exitFullScreen = function(opt_domHelper) { + var doc = googx.dom.fullscreen.getDocument_(opt_domHelper); + if(doc.webkitCancelFullScreen) { + doc.webkitCancelFullScreen() + }else { + if(doc.mozCancelFullScreen) { + doc.mozCancelFullScreen() + }else { + if(doc.msExitFullscreen) { + doc.msExitFullscreen() + }else { + if(doc.exitFullscreen) { + doc.exitFullscreen() + } + } + } + } +}; +googx.dom.fullscreen.isFullScreen = function(opt_domHelper) { + var doc = googx.dom.fullscreen.getDocument_(opt_domHelper); + return!!(doc.webkitIsFullScreen || doc.mozFullScreen || doc.msFullscreenElement || doc.fullscreenElement) +}; +googx.dom.fullscreen.getDocument_ = function(opt_domHelper) { + return opt_domHelper ? opt_domHelper.getDocument() : goog.dom.getDomHelper().getDocument() +}; +goog.provide("ol.control.FullScreen"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.dom.classes"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("googx.dom.fullscreen"); +goog.require("googx.dom.fullscreen.EventType"); +goog.require("ol.control.Control"); +goog.require("ol.css"); +ol.control.FullScreen = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.cssClassName_ = goog.isDef(options.className) ? options.className : "ol-full-screen"; + var tipLabel = goog.isDef(options.tipLabel) ? options.tipLabel : "Toggle full-screen"; + var tip = goog.dom.createDom(goog.dom.TagName.SPAN, {"role":"tooltip"}, tipLabel); + var button = goog.dom.createDom(goog.dom.TagName.BUTTON, {"class":this.cssClassName_ + "-" + googx.dom.fullscreen.isFullScreen() + " ol-has-tooltip"}); + goog.dom.appendChild(button, tip); + goog.events.listen(button, [goog.events.EventType.CLICK, goog.events.EventType.TOUCHEND], this.handleClick_, false, this); + goog.events.listen(button, [goog.events.EventType.MOUSEOUT, goog.events.EventType.FOCUSOUT], function() { + this.blur() + }, false); + goog.events.listen(goog.global.document, googx.dom.fullscreen.EventType.CHANGE, this.handleFullScreenChange_, false, this); + var element = goog.dom.createDom(goog.dom.TagName.DIV, {"class":this.cssClassName_ + " " + ol.css.CLASS_UNSELECTABLE + " " + (!googx.dom.fullscreen.isSupported() ? ol.css.CLASS_UNSUPPORTED : "")}, button); + goog.base(this, {element:element, target:options.target}); + this.keys_ = goog.isDef(options.keys) ? options.keys : false +}; +goog.inherits(ol.control.FullScreen, ol.control.Control); +ol.control.FullScreen.prototype.handleClick_ = function(browserEvent) { + if(!googx.dom.fullscreen.isSupported()) { + return + } + browserEvent.preventDefault(); + var map = this.getMap(); + if(goog.isNull(map)) { + return + } + if(googx.dom.fullscreen.isFullScreen()) { + googx.dom.fullscreen.exitFullScreen() + }else { + var target = map.getTarget(); + goog.asserts.assert(goog.isDefAndNotNull(target)); + var element = goog.dom.getElement(target); + goog.asserts.assert(goog.isDefAndNotNull(element)); + if(this.keys_) { + googx.dom.fullscreen.requestFullScreenWithKeys(element) + }else { + googx.dom.fullscreen.requestFullScreen(element) + } + } +}; +ol.control.FullScreen.prototype.handleFullScreenChange_ = function() { + var opened = this.cssClassName_ + "-true"; + var closed = this.cssClassName_ + "-false"; + var anchor = goog.dom.getFirstElementChild(this.element); + var map = this.getMap(); + if(googx.dom.fullscreen.isFullScreen()) { + goog.dom.classes.swap(anchor, closed, opened) + }else { + goog.dom.classes.swap(anchor, opened, closed) + } + if(!goog.isNull(map)) { + map.updateSize() + } +}; +goog.provide("ol.control.MousePosition"); +goog.require("goog.array"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.style"); +goog.require("ol.CoordinateFormatType"); +goog.require("ol.Object"); +goog.require("ol.Pixel"); +goog.require("ol.TransformFunction"); +goog.require("ol.control.Control"); +goog.require("ol.proj"); +goog.require("ol.proj.Projection"); +ol.control.MousePositionProperty = {PROJECTION:"projection", COORDINATE_FORMAT:"coordinateFormat"}; +ol.control.MousePosition = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var className = goog.isDef(options.className) ? options.className : "ol-mouse-position"; + var element = goog.dom.createDom(goog.dom.TagName.DIV, {"class":className}); + goog.base(this, {element:element, target:options.target}); + goog.events.listen(this, ol.Object.getChangeEventType(ol.control.MousePositionProperty.PROJECTION), this.handleProjectionChanged_, false, this); + if(goog.isDef(options.coordinateFormat)) { + this.setCoordinateFormat(options.coordinateFormat) + } + if(goog.isDef(options.projection)) { + this.setProjection(ol.proj.get(options.projection)) + } + this.undefinedHTML_ = goog.isDef(options.undefinedHTML) ? options.undefinedHTML : ""; + this.renderedHTML_ = element.innerHTML; + this.mapProjection_ = null; + this.transform_ = null; + this.lastMouseMovePixel_ = null +}; +goog.inherits(ol.control.MousePosition, ol.control.Control); +ol.control.MousePosition.prototype.handleMapPostrender = function(mapEvent) { + var frameState = mapEvent.frameState; + if(goog.isNull(frameState)) { + this.mapProjection_ = null + }else { + if(this.mapProjection_ != frameState.view2DState.projection) { + this.mapProjection_ = frameState.view2DState.projection; + this.transform_ = null + } + } + this.updateHTML_(this.lastMouseMovePixel_) +}; +ol.control.MousePosition.prototype.handleProjectionChanged_ = function() { + this.transform_ = null +}; +ol.control.MousePosition.prototype.getCoordinateFormat = function() { + return(this.get(ol.control.MousePositionProperty.COORDINATE_FORMAT)) +}; +goog.exportProperty(ol.control.MousePosition.prototype, "getCoordinateFormat", ol.control.MousePosition.prototype.getCoordinateFormat); +ol.control.MousePosition.prototype.getProjection = function() { + return(this.get(ol.control.MousePositionProperty.PROJECTION)) +}; +goog.exportProperty(ol.control.MousePosition.prototype, "getProjection", ol.control.MousePosition.prototype.getProjection); +ol.control.MousePosition.prototype.handleMouseMove = function(browserEvent) { + var map = this.getMap(); + var eventPosition = goog.style.getRelativePosition(browserEvent, map.getViewport()); + this.lastMouseMovePixel_ = [eventPosition.x, eventPosition.y]; + this.updateHTML_(this.lastMouseMovePixel_) +}; +ol.control.MousePosition.prototype.handleMouseOut = function(browserEvent) { + this.updateHTML_(null); + this.lastMouseMovePixel_ = null +}; +ol.control.MousePosition.prototype.setMap = function(map) { + goog.base(this, "setMap", map); + if(!goog.isNull(map)) { + var viewport = map.getViewport(); + this.listenerKeys.push(goog.events.listen(viewport, goog.events.EventType.MOUSEMOVE, this.handleMouseMove, false, this), goog.events.listen(viewport, goog.events.EventType.MOUSEOUT, this.handleMouseOut, false, this)) + } +}; +ol.control.MousePosition.prototype.setCoordinateFormat = function(format) { + this.set(ol.control.MousePositionProperty.COORDINATE_FORMAT, format) +}; +goog.exportProperty(ol.control.MousePosition.prototype, "setCoordinateFormat", ol.control.MousePosition.prototype.setCoordinateFormat); +ol.control.MousePosition.prototype.setProjection = function(projection) { + this.set(ol.control.MousePositionProperty.PROJECTION, projection) +}; +goog.exportProperty(ol.control.MousePosition.prototype, "setProjection", ol.control.MousePosition.prototype.setProjection); +ol.control.MousePosition.prototype.updateHTML_ = function(pixel) { + var html = this.undefinedHTML_; + if(!goog.isNull(pixel) && !goog.isNull(this.mapProjection_)) { + if(goog.isNull(this.transform_)) { + var projection = this.getProjection(); + if(goog.isDef(projection)) { + this.transform_ = ol.proj.getTransformFromProjections(this.mapProjection_, projection) + }else { + this.transform_ = ol.proj.identityTransform + } + } + var map = this.getMap(); + var coordinate = map.getCoordinateFromPixel(pixel); + if(!goog.isNull(coordinate)) { + this.transform_(coordinate, coordinate); + var coordinateFormat = this.getCoordinateFormat(); + if(goog.isDef(coordinateFormat)) { + html = coordinateFormat(coordinate) + }else { + html = coordinate.toString() + } + } + } + if(!goog.isDef(this.renderedHTML_) || html != this.renderedHTML_) { + this.element.innerHTML = html; + this.renderedHTML_ = html + } +}; +goog.provide("ol.control.ScaleLine"); +goog.provide("ol.control.ScaleLineProperty"); +goog.provide("ol.control.ScaleLineUnits"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.math"); +goog.require("goog.style"); +goog.require("ol.Object"); +goog.require("ol.TransformFunction"); +goog.require("ol.View2DState"); +goog.require("ol.control.Control"); +goog.require("ol.css"); +goog.require("ol.proj"); +goog.require("ol.proj.Units"); +goog.require("ol.sphere.NORMAL"); +ol.control.ScaleLineProperty = {UNITS:"units"}; +ol.control.ScaleLineUnits = {DEGREES:"degrees", IMPERIAL:"imperial", NAUTICAL:"nautical", METRIC:"metric", US:"us"}; +ol.control.ScaleLine = function(opt_options) { + var options = opt_options || {}; + var className = goog.isDef(options.className) ? options.className : "ol-scale-line"; + this.innerElement_ = goog.dom.createDom(goog.dom.TagName.DIV, {"class":className + "-inner"}); + this.element_ = goog.dom.createDom(goog.dom.TagName.DIV, {"class":className + " " + ol.css.CLASS_UNSELECTABLE}, this.innerElement_); + this.view2DState_ = null; + this.minWidth_ = goog.isDef(options.minWidth) ? options.minWidth : 64; + this.renderedVisible_ = false; + this.renderedWidth_ = undefined; + this.renderedHTML_ = ""; + this.toEPSG4326_ = null; + goog.base(this, {element:this.element_, target:options.target}); + goog.events.listen(this, ol.Object.getChangeEventType(ol.control.ScaleLineProperty.UNITS), this.handleUnitsChanged_, false, this); + this.setUnits((options.units) || ol.control.ScaleLineUnits.METRIC) +}; +goog.inherits(ol.control.ScaleLine, ol.control.Control); +ol.control.ScaleLine.LEADING_DIGITS = [1, 2, 5]; +ol.control.ScaleLine.prototype.getUnits = function() { + return(this.get(ol.control.ScaleLineProperty.UNITS)) +}; +goog.exportProperty(ol.control.ScaleLine.prototype, "getUnits", ol.control.ScaleLine.prototype.getUnits); +ol.control.ScaleLine.prototype.handleMapPostrender = function(mapEvent) { + var frameState = mapEvent.frameState; + if(goog.isNull(frameState)) { + this.view2DState_ = null + }else { + this.view2DState_ = frameState.view2DState + } + this.updateElement_() +}; +ol.control.ScaleLine.prototype.handleUnitsChanged_ = function() { + this.updateElement_() +}; +ol.control.ScaleLine.prototype.setUnits = function(units) { + this.set(ol.control.ScaleLineProperty.UNITS, units) +}; +goog.exportProperty(ol.control.ScaleLine.prototype, "setUnits", ol.control.ScaleLine.prototype.setUnits); +ol.control.ScaleLine.prototype.updateElement_ = function() { + var view2DState = this.view2DState_; + if(goog.isNull(view2DState)) { + if(this.renderedVisible_) { + goog.style.setElementShown(this.element_, false); + this.renderedVisible_ = false + } + return + } + var center = view2DState.center; + var projection = view2DState.projection; + var pointResolution = projection.getPointResolution(view2DState.resolution, center); + var projectionUnits = projection.getUnits(); + var cosLatitude; + var units = this.getUnits(); + if(projectionUnits == ol.proj.Units.DEGREES && (units == ol.control.ScaleLineUnits.METRIC || units == ol.control.ScaleLineUnits.IMPERIAL)) { + this.toEPSG4326_ = null; + cosLatitude = Math.cos(goog.math.toRadians(center[1])); + pointResolution *= Math.PI * cosLatitude * ol.sphere.NORMAL.radius / 180; + projectionUnits = ol.proj.Units.METERS + }else { + if((projectionUnits == ol.proj.Units.FEET || projectionUnits == ol.proj.Units.METERS) && units == ol.control.ScaleLineUnits.DEGREES) { + if(goog.isNull(this.toEPSG4326_)) { + this.toEPSG4326_ = ol.proj.getTransformFromProjections(projection, ol.proj.get("EPSG:4326")) + } + cosLatitude = Math.cos(goog.math.toRadians(this.toEPSG4326_(center)[1])); + var radius = ol.sphere.NORMAL.radius; + if(projectionUnits == ol.proj.Units.FEET) { + radius /= 0.3048 + } + pointResolution *= 180 / (Math.PI * cosLatitude * radius); + projectionUnits = ol.proj.Units.DEGREES + }else { + this.toEPSG4326_ = null + } + } + goog.asserts.assert((units == ol.control.ScaleLineUnits.METRIC || units == ol.control.ScaleLineUnits.IMPERIAL) && projectionUnits == ol.proj.Units.METERS || units == ol.control.ScaleLineUnits.DEGREES && projectionUnits == ol.proj.Units.DEGREES); + var nominalCount = this.minWidth_ * pointResolution; + var suffix = ""; + if(units == ol.control.ScaleLineUnits.DEGREES) { + if(nominalCount < 1 / 60) { + suffix = "\u2033"; + pointResolution *= 3600 + }else { + if(nominalCount < 1) { + suffix = "\u2032"; + pointResolution *= 60 + }else { + suffix = "\u00b0" + } + } + }else { + if(units == ol.control.ScaleLineUnits.IMPERIAL) { + if(nominalCount < 0.9144) { + suffix = "in"; + pointResolution /= 0.0254 + }else { + if(nominalCount < 1609.344) { + suffix = "ft"; + pointResolution /= 0.3048 + }else { + suffix = "mi"; + pointResolution /= 1609.344 + } + } + }else { + if(units == ol.control.ScaleLineUnits.NAUTICAL) { + pointResolution /= 1852; + suffix = "nm" + }else { + if(units == ol.control.ScaleLineUnits.METRIC) { + if(nominalCount < 1) { + suffix = "mm"; + pointResolution *= 1E3 + }else { + if(nominalCount < 1E3) { + suffix = "m" + }else { + suffix = "km"; + pointResolution /= 1E3 + } + } + }else { + if(units == ol.control.ScaleLineUnits.US) { + if(nominalCount < 0.9144) { + suffix = "in"; + pointResolution *= 39.37 + }else { + if(nominalCount < 1609.344) { + suffix = "ft"; + pointResolution /= 0.30480061 + }else { + suffix = "mi"; + pointResolution /= 1609.3472 + } + } + }else { + goog.asserts.fail() + } + } + } + } + } + var i = 3 * Math.floor(Math.log(this.minWidth_ * pointResolution) / Math.log(10)); + var count, width; + while(true) { + count = ol.control.ScaleLine.LEADING_DIGITS[i % 3] * Math.pow(10, Math.floor(i / 3)); + width = Math.round(count / pointResolution); + if(width >= this.minWidth_) { + break + } + ++i + } + var html = count + suffix; + if(this.renderedHTML_ != html) { + this.innerElement_.innerHTML = html; + this.renderedHTML_ = html + } + if(this.renderedWidth_ != width) { + this.innerElement_.style.width = width + "px"; + this.renderedWidth_ = width + } + if(!this.renderedVisible_) { + goog.style.setElementShown(this.element_, true); + this.renderedVisible_ = true + } +}; +goog.provide("goog.events.EventHandler"); +goog.require("goog.Disposable"); +goog.require("goog.events"); +goog.require("goog.object"); +goog.events.EventHandler = function(opt_handler) { + goog.Disposable.call(this); + this.handler_ = opt_handler; + this.keys_ = {} +}; +goog.inherits(goog.events.EventHandler, goog.Disposable); +goog.events.EventHandler.typeArray_ = []; +goog.events.EventHandler.prototype.listen = function(src, type, opt_fn, opt_capture, opt_handler) { + if(!goog.isArray(type)) { + goog.events.EventHandler.typeArray_[0] = (type); + type = goog.events.EventHandler.typeArray_ + } + for(var i = 0;i < type.length;i++) { + var listenerObj = goog.events.listen(src, type[i], opt_fn || this, opt_capture || false, opt_handler || this.handler_ || this); + if(goog.DEBUG && !listenerObj) { + return this + } + var key = listenerObj.key; + this.keys_[key] = listenerObj + } + return this +}; +goog.events.EventHandler.prototype.listenOnce = function(src, type, opt_fn, opt_capture, opt_handler) { + if(goog.isArray(type)) { + for(var i = 0;i < type.length;i++) { + this.listenOnce(src, type[i], opt_fn, opt_capture, opt_handler) + } + }else { + var listenerObj = goog.events.listenOnce(src, type, opt_fn || this, opt_capture, opt_handler || this.handler_ || this); + var key = listenerObj.key; + this.keys_[key] = listenerObj + } + return this +}; +goog.events.EventHandler.prototype.listenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) { + wrapper.listen(src, listener, opt_capt, opt_handler || this.handler_ || this, this); + return this +}; +goog.events.EventHandler.prototype.getListenerCount = function() { + var count = 0; + for(var key in this.keys_) { + if(Object.prototype.hasOwnProperty.call(this.keys_, key)) { + count++ + } + } + return count +}; +goog.events.EventHandler.prototype.unlisten = function(src, type, opt_fn, opt_capture, opt_handler) { + if(goog.isArray(type)) { + for(var i = 0;i < type.length;i++) { + this.unlisten(src, type[i], opt_fn, opt_capture, opt_handler) + } + }else { + var listener = goog.events.getListener(src, type, opt_fn || this, opt_capture, opt_handler || this.handler_ || this); + if(listener) { + goog.events.unlistenByKey(listener); + delete this.keys_[listener.key] + } + } + return this +}; +goog.events.EventHandler.prototype.unlistenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) { + wrapper.unlisten(src, listener, opt_capt, opt_handler || this.handler_ || this, this); + return this +}; +goog.events.EventHandler.prototype.removeAll = function() { + goog.object.forEach(this.keys_, goog.events.unlistenByKey); + this.keys_ = {} +}; +goog.events.EventHandler.prototype.disposeInternal = function() { + goog.events.EventHandler.superClass_.disposeInternal.call(this); + this.removeAll() +}; +goog.events.EventHandler.prototype.handleEvent = function(e) { + throw Error("EventHandler.handleEvent not implemented"); +}; +goog.provide("goog.style.bidi"); +goog.require("goog.dom"); +goog.require("goog.style"); +goog.require("goog.userAgent"); +goog.style.bidi.getScrollLeft = function(element) { + var isRtl = goog.style.isRightToLeft(element); + if(isRtl && goog.userAgent.GECKO) { + return-element.scrollLeft + }else { + if(isRtl && !(goog.userAgent.IE && goog.userAgent.isVersionOrHigher("8"))) { + var overflowX = goog.style.getComputedOverflowX(element); + if(overflowX == "visible") { + return element.scrollLeft + }else { + return element.scrollWidth - element.clientWidth - element.scrollLeft + } + } + } + return element.scrollLeft +}; +goog.style.bidi.getOffsetStart = function(element) { + var offsetLeftForReal = element.offsetLeft; + var bestParent = element.offsetParent; + if(!bestParent && goog.style.getComputedPosition(element) == "fixed") { + bestParent = goog.dom.getOwnerDocument(element).documentElement + } + if(!bestParent) { + return offsetLeftForReal + } + if(goog.userAgent.GECKO) { + var borderWidths = goog.style.getBorderBox(bestParent); + offsetLeftForReal += borderWidths.left + }else { + if(goog.userAgent.isDocumentModeOrHigher(8)) { + var borderWidths = goog.style.getBorderBox(bestParent); + offsetLeftForReal -= borderWidths.left + } + } + if(goog.style.isRightToLeft(bestParent)) { + var elementRightOffset = offsetLeftForReal + element.offsetWidth; + return bestParent.clientWidth - elementRightOffset + } + return offsetLeftForReal +}; +goog.style.bidi.setScrollOffset = function(element, offsetStart) { + offsetStart = Math.max(offsetStart, 0); + if(!goog.style.isRightToLeft(element)) { + element.scrollLeft = offsetStart + }else { + if(goog.userAgent.GECKO) { + element.scrollLeft = -offsetStart + }else { + if(!(goog.userAgent.IE && goog.userAgent.isVersionOrHigher("8"))) { + element.scrollLeft = element.scrollWidth - offsetStart - element.clientWidth + }else { + element.scrollLeft = offsetStart + } + } + } +}; +goog.style.bidi.setPosition = function(elem, left, top, isRtl) { + if(!goog.isNull(top)) { + elem.style.top = top + "px" + } + if(isRtl) { + elem.style.right = left + "px"; + elem.style.left = "" + }else { + elem.style.left = left + "px"; + elem.style.right = "" + } +}; +goog.provide("goog.fx.DragEvent"); +goog.provide("goog.fx.Dragger"); +goog.provide("goog.fx.Dragger.EventType"); +goog.require("goog.dom"); +goog.require("goog.events"); +goog.require("goog.events.Event"); +goog.require("goog.events.EventHandler"); +goog.require("goog.events.EventTarget"); +goog.require("goog.events.EventType"); +goog.require("goog.math.Coordinate"); +goog.require("goog.math.Rect"); +goog.require("goog.style"); +goog.require("goog.style.bidi"); +goog.require("goog.userAgent"); +goog.fx.Dragger = function(target, opt_handle, opt_limits) { + goog.events.EventTarget.call(this); + this.target = target; + this.handle = opt_handle || target; + this.limits = opt_limits || new goog.math.Rect(NaN, NaN, NaN, NaN); + this.document_ = goog.dom.getOwnerDocument(target); + this.eventHandler_ = new goog.events.EventHandler(this); + this.registerDisposable(this.eventHandler_); + goog.events.listen(this.handle, [goog.events.EventType.TOUCHSTART, goog.events.EventType.MOUSEDOWN], this.startDrag, false, this) +}; +goog.inherits(goog.fx.Dragger, goog.events.EventTarget); +goog.fx.Dragger.HAS_SET_CAPTURE_ = goog.userAgent.IE || goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher("1.9.3"); +goog.fx.Dragger.EventType = {EARLY_CANCEL:"earlycancel", START:"start", BEFOREDRAG:"beforedrag", DRAG:"drag", END:"end"}; +goog.fx.Dragger.prototype.target; +goog.fx.Dragger.prototype.handle; +goog.fx.Dragger.prototype.limits; +goog.fx.Dragger.prototype.rightToLeft_; +goog.fx.Dragger.prototype.clientX = 0; +goog.fx.Dragger.prototype.clientY = 0; +goog.fx.Dragger.prototype.screenX = 0; +goog.fx.Dragger.prototype.screenY = 0; +goog.fx.Dragger.prototype.startX = 0; +goog.fx.Dragger.prototype.startY = 0; +goog.fx.Dragger.prototype.deltaX = 0; +goog.fx.Dragger.prototype.deltaY = 0; +goog.fx.Dragger.prototype.pageScroll; +goog.fx.Dragger.prototype.enabled_ = true; +goog.fx.Dragger.prototype.dragging_ = false; +goog.fx.Dragger.prototype.hysteresisDistanceSquared_ = 0; +goog.fx.Dragger.prototype.mouseDownTime_ = 0; +goog.fx.Dragger.prototype.document_; +goog.fx.Dragger.prototype.scrollTarget_; +goog.fx.Dragger.prototype.ieDragStartCancellingOn_ = false; +goog.fx.Dragger.prototype.useRightPositioningForRtl_ = false; +goog.fx.Dragger.prototype.enableRightPositioningForRtl = function(useRightPositioningForRtl) { + this.useRightPositioningForRtl_ = useRightPositioningForRtl +}; +goog.fx.Dragger.prototype.getHandler = function() { + return this.eventHandler_ +}; +goog.fx.Dragger.prototype.setLimits = function(limits) { + this.limits = limits || new goog.math.Rect(NaN, NaN, NaN, NaN) +}; +goog.fx.Dragger.prototype.setHysteresis = function(distance) { + this.hysteresisDistanceSquared_ = Math.pow(distance, 2) +}; +goog.fx.Dragger.prototype.getHysteresis = function() { + return Math.sqrt(this.hysteresisDistanceSquared_) +}; +goog.fx.Dragger.prototype.setScrollTarget = function(scrollTarget) { + this.scrollTarget_ = scrollTarget +}; +goog.fx.Dragger.prototype.setCancelIeDragStart = function(cancelIeDragStart) { + this.ieDragStartCancellingOn_ = cancelIeDragStart +}; +goog.fx.Dragger.prototype.getEnabled = function() { + return this.enabled_ +}; +goog.fx.Dragger.prototype.setEnabled = function(enabled) { + this.enabled_ = enabled +}; +goog.fx.Dragger.prototype.disposeInternal = function() { + goog.fx.Dragger.superClass_.disposeInternal.call(this); + goog.events.unlisten(this.handle, [goog.events.EventType.TOUCHSTART, goog.events.EventType.MOUSEDOWN], this.startDrag, false, this); + this.cleanUpAfterDragging_(); + this.target = null; + this.handle = null +}; +goog.fx.Dragger.prototype.isRightToLeft_ = function() { + if(!goog.isDef(this.rightToLeft_)) { + this.rightToLeft_ = goog.style.isRightToLeft(this.target) + } + return this.rightToLeft_ +}; +goog.fx.Dragger.prototype.startDrag = function(e) { + var isMouseDown = e.type == goog.events.EventType.MOUSEDOWN; + if(this.enabled_ && !this.dragging_ && (!isMouseDown || e.isMouseActionButton())) { + this.maybeReinitTouchEvent_(e); + if(this.hysteresisDistanceSquared_ == 0) { + if(this.fireDragStart_(e)) { + this.dragging_ = true; + e.preventDefault() + }else { + return + } + }else { + e.preventDefault() + } + this.setupDragHandlers(); + this.clientX = this.startX = e.clientX; + this.clientY = this.startY = e.clientY; + this.screenX = e.screenX; + this.screenY = e.screenY; + this.deltaX = this.useRightPositioningForRtl_ ? goog.style.bidi.getOffsetStart(this.target) : this.target.offsetLeft; + this.deltaY = this.target.offsetTop; + this.pageScroll = goog.dom.getDomHelper(this.document_).getDocumentScroll(); + this.mouseDownTime_ = goog.now() + }else { + this.dispatchEvent(goog.fx.Dragger.EventType.EARLY_CANCEL) + } +}; +goog.fx.Dragger.prototype.setupDragHandlers = function() { + var doc = this.document_; + var docEl = doc.documentElement; + var useCapture = !goog.fx.Dragger.HAS_SET_CAPTURE_; + this.eventHandler_.listen(doc, [goog.events.EventType.TOUCHMOVE, goog.events.EventType.MOUSEMOVE], this.handleMove_, useCapture); + this.eventHandler_.listen(doc, [goog.events.EventType.TOUCHEND, goog.events.EventType.MOUSEUP], this.endDrag, useCapture); + if(goog.fx.Dragger.HAS_SET_CAPTURE_) { + docEl.setCapture(false); + this.eventHandler_.listen(docEl, goog.events.EventType.LOSECAPTURE, this.endDrag) + }else { + this.eventHandler_.listen(goog.dom.getWindow(doc), goog.events.EventType.BLUR, this.endDrag) + } + if(goog.userAgent.IE && this.ieDragStartCancellingOn_) { + this.eventHandler_.listen(doc, goog.events.EventType.DRAGSTART, goog.events.Event.preventDefault) + } + if(this.scrollTarget_) { + this.eventHandler_.listen(this.scrollTarget_, goog.events.EventType.SCROLL, this.onScroll_, useCapture) + } +}; +goog.fx.Dragger.prototype.fireDragStart_ = function(e) { + return this.dispatchEvent(new goog.fx.DragEvent(goog.fx.Dragger.EventType.START, this, e.clientX, e.clientY, e)) +}; +goog.fx.Dragger.prototype.cleanUpAfterDragging_ = function() { + this.eventHandler_.removeAll(); + if(goog.fx.Dragger.HAS_SET_CAPTURE_) { + this.document_.releaseCapture() + } +}; +goog.fx.Dragger.prototype.endDrag = function(e, opt_dragCanceled) { + this.cleanUpAfterDragging_(); + if(this.dragging_) { + this.maybeReinitTouchEvent_(e); + this.dragging_ = false; + var x = this.limitX(this.deltaX); + var y = this.limitY(this.deltaY); + var dragCanceled = opt_dragCanceled || e.type == goog.events.EventType.TOUCHCANCEL; + this.dispatchEvent(new goog.fx.DragEvent(goog.fx.Dragger.EventType.END, this, e.clientX, e.clientY, e, x, y, dragCanceled)) + }else { + this.dispatchEvent(goog.fx.Dragger.EventType.EARLY_CANCEL) + } +}; +goog.fx.Dragger.prototype.endDragCancel = function(e) { + this.endDrag(e, true) +}; +goog.fx.Dragger.prototype.maybeReinitTouchEvent_ = function(e) { + var type = e.type; + if(type == goog.events.EventType.TOUCHSTART || type == goog.events.EventType.TOUCHMOVE) { + e.init(e.getBrowserEvent().targetTouches[0], e.currentTarget) + }else { + if(type == goog.events.EventType.TOUCHEND || type == goog.events.EventType.TOUCHCANCEL) { + e.init(e.getBrowserEvent().changedTouches[0], e.currentTarget) + } + } +}; +goog.fx.Dragger.prototype.handleMove_ = function(e) { + if(this.enabled_) { + this.maybeReinitTouchEvent_(e); + var sign = this.useRightPositioningForRtl_ && this.isRightToLeft_() ? -1 : 1; + var dx = sign * (e.clientX - this.clientX); + var dy = e.clientY - this.clientY; + this.clientX = e.clientX; + this.clientY = e.clientY; + this.screenX = e.screenX; + this.screenY = e.screenY; + if(!this.dragging_) { + var diffX = this.startX - this.clientX; + var diffY = this.startY - this.clientY; + var distance = diffX * diffX + diffY * diffY; + if(distance > this.hysteresisDistanceSquared_) { + if(this.fireDragStart_(e)) { + this.dragging_ = true + }else { + if(!this.isDisposed()) { + this.endDrag(e) + } + return + } + } + } + var pos = this.calculatePosition_(dx, dy); + var x = pos.x; + var y = pos.y; + if(this.dragging_) { + var rv = this.dispatchEvent(new goog.fx.DragEvent(goog.fx.Dragger.EventType.BEFOREDRAG, this, e.clientX, e.clientY, e, x, y)); + if(rv) { + this.doDrag(e, x, y, false); + e.preventDefault() + } + } + } +}; +goog.fx.Dragger.prototype.calculatePosition_ = function(dx, dy) { + var pageScroll = goog.dom.getDomHelper(this.document_).getDocumentScroll(); + dx += pageScroll.x - this.pageScroll.x; + dy += pageScroll.y - this.pageScroll.y; + this.pageScroll = pageScroll; + this.deltaX += dx; + this.deltaY += dy; + var x = this.limitX(this.deltaX); + var y = this.limitY(this.deltaY); + return new goog.math.Coordinate(x, y) +}; +goog.fx.Dragger.prototype.onScroll_ = function(e) { + var pos = this.calculatePosition_(0, 0); + e.clientX = this.clientX; + e.clientY = this.clientY; + this.doDrag(e, pos.x, pos.y, true) +}; +goog.fx.Dragger.prototype.doDrag = function(e, x, y, dragFromScroll) { + this.defaultAction(x, y); + this.dispatchEvent(new goog.fx.DragEvent(goog.fx.Dragger.EventType.DRAG, this, e.clientX, e.clientY, e, x, y)) +}; +goog.fx.Dragger.prototype.limitX = function(x) { + var rect = this.limits; + var left = !isNaN(rect.left) ? rect.left : null; + var width = !isNaN(rect.width) ? rect.width : 0; + var maxX = left != null ? left + width : Infinity; + var minX = left != null ? left : -Infinity; + return Math.min(maxX, Math.max(minX, x)) +}; +goog.fx.Dragger.prototype.limitY = function(y) { + var rect = this.limits; + var top = !isNaN(rect.top) ? rect.top : null; + var height = !isNaN(rect.height) ? rect.height : 0; + var maxY = top != null ? top + height : Infinity; + var minY = top != null ? top : -Infinity; + return Math.min(maxY, Math.max(minY, y)) +}; +goog.fx.Dragger.prototype.defaultAction = function(x, y) { + if(this.useRightPositioningForRtl_ && this.isRightToLeft_()) { + this.target.style.right = x + "px" + }else { + this.target.style.left = x + "px" + } + this.target.style.top = y + "px" +}; +goog.fx.Dragger.prototype.isDragging = function() { + return this.dragging_ +}; +goog.fx.DragEvent = function(type, dragobj, clientX, clientY, browserEvent, opt_actX, opt_actY, opt_dragCanceled) { + goog.events.Event.call(this, type); + this.clientX = clientX; + this.clientY = clientY; + this.browserEvent = browserEvent; + this.left = goog.isDef(opt_actX) ? opt_actX : dragobj.deltaX; + this.top = goog.isDef(opt_actY) ? opt_actY : dragobj.deltaY; + this.dragger = dragobj; + this.dragCanceled = !!opt_dragCanceled +}; +goog.inherits(goog.fx.DragEvent, goog.events.Event); +goog.provide("ol.control.ZoomSlider"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.events.Event"); +goog.require("goog.events.EventType"); +goog.require("goog.fx.Dragger"); +goog.require("goog.fx.Dragger.EventType"); +goog.require("goog.math"); +goog.require("goog.math.Rect"); +goog.require("goog.style"); +goog.require("ol.animation"); +goog.require("ol.control.Control"); +goog.require("ol.css"); +goog.require("ol.easing"); +ol.control.ZOOMSLIDER_ANIMATION_DURATION = 200; +ol.control.ZoomSlider = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.currentResolution_ = undefined; + this.direction_ = ol.control.ZoomSlider.direction.VERTICAL; + this.sliderInitialized_ = false; + var className = goog.isDef(options.className) ? options.className : "ol-zoomslider"; + var thumbElement = goog.dom.createDom(goog.dom.TagName.DIV, [className + "-thumb", ol.css.CLASS_UNSELECTABLE]); + var sliderElement = goog.dom.createDom(goog.dom.TagName.DIV, [className, ol.css.CLASS_UNSELECTABLE], thumbElement); + this.dragger_ = new goog.fx.Dragger(thumbElement); + this.registerDisposable(this.dragger_); + goog.events.listen(this.dragger_, [goog.fx.Dragger.EventType.DRAG, goog.fx.Dragger.EventType.END], this.handleSliderChange_, undefined, this); + goog.events.listen(sliderElement, goog.events.EventType.CLICK, this.handleContainerClick_, false, this); + goog.events.listen(thumbElement, goog.events.EventType.CLICK, goog.events.Event.stopPropagation); + goog.base(this, {element:sliderElement}) +}; +goog.inherits(ol.control.ZoomSlider, ol.control.Control); +ol.control.ZoomSlider.direction = {VERTICAL:0, HORIZONTAL:1}; +ol.control.ZoomSlider.prototype.setMap = function(map) { + goog.base(this, "setMap", map); + if(!goog.isNull(map)) { + map.render() + } +}; +ol.control.ZoomSlider.prototype.initSlider_ = function() { + var container = this.element, thumb = goog.dom.getFirstElementChild(container), elemSize = goog.style.getContentBoxSize(container), thumbBounds = goog.style.getBounds(thumb), thumbMargins = goog.style.getMarginBox(thumb), thumbBorderBox = goog.style.getBorderBox(thumb), w = elemSize.width - thumbMargins.left - thumbMargins.right - thumbBorderBox.left - thumbBorderBox.right - thumbBounds.width, h = elemSize.height - thumbMargins.top - thumbMargins.bottom - thumbBorderBox.top - thumbBorderBox.bottom - + thumbBounds.height, limits; + if(elemSize.width > elemSize.height) { + this.direction_ = ol.control.ZoomSlider.direction.HORIZONTAL; + limits = new goog.math.Rect(0, 0, w, 0) + }else { + this.direction_ = ol.control.ZoomSlider.direction.VERTICAL; + limits = new goog.math.Rect(0, 0, 0, h) + } + this.dragger_.setLimits(limits); + this.sliderInitialized_ = true +}; +ol.control.ZoomSlider.prototype.handleMapPostrender = function(mapEvent) { + if(goog.isNull(mapEvent.frameState)) { + return + } + goog.asserts.assert(goog.isDefAndNotNull(mapEvent.frameState.view2DState)); + if(!this.sliderInitialized_) { + this.initSlider_() + } + var res = mapEvent.frameState.view2DState.resolution; + if(res !== this.currentResolution_) { + this.currentResolution_ = res; + this.positionThumbForResolution_(res) + } +}; +ol.control.ZoomSlider.prototype.handleContainerClick_ = function(browserEvent) { + var map = this.getMap(); + var view = map.getView().getView2D(); + var resolution; + var amountDragged = this.amountDragged_(browserEvent.offsetX, browserEvent.offsetY); + resolution = this.resolutionForAmount_(amountDragged); + goog.asserts.assert(goog.isDef(resolution)); + map.beforeRender(ol.animation.zoom({resolution:resolution, duration:ol.control.ZOOMSLIDER_ANIMATION_DURATION, easing:ol.easing.easeOut})); + resolution = view.constrainResolution(resolution); + view.setResolution(resolution) +}; +ol.control.ZoomSlider.prototype.positionThumbForResolution_ = function(res) { + var amount = this.amountForResolution_(res), dragger = this.dragger_, thumb = goog.dom.getFirstElementChild(this.element); + if(this.direction_ == ol.control.ZoomSlider.direction.HORIZONTAL) { + var left = dragger.limits.left + dragger.limits.width * amount; + goog.style.setPosition(thumb, left) + }else { + var top = dragger.limits.top + dragger.limits.height * amount; + goog.style.setPosition(thumb, dragger.limits.left, top) + } +}; +ol.control.ZoomSlider.prototype.amountDragged_ = function(x, y) { + var draggerLimits = this.dragger_.limits, amount = 0; + if(this.direction_ === ol.control.ZoomSlider.direction.HORIZONTAL) { + amount = (x - draggerLimits.left) / draggerLimits.width + }else { + amount = (y - draggerLimits.top) / draggerLimits.height + } + return amount +}; +ol.control.ZoomSlider.prototype.resolutionForAmount_ = function(amount) { + amount = (goog.math.clamp(amount, 0, 1) - 1) * -1; + var fn = this.getMap().getView().getView2D().getResolutionForValueFunction(); + return fn(amount) +}; +ol.control.ZoomSlider.prototype.amountForResolution_ = function(res) { + var fn = this.getMap().getView().getView2D().getValueForResolutionFunction(); + var value = fn(res); + return(value - 1) * -1 +}; +ol.control.ZoomSlider.prototype.handleSliderChange_ = function(e) { + var map = this.getMap(); + var view = map.getView().getView2D(); + var resolution; + if(e.type === goog.fx.Dragger.EventType.DRAG) { + var amountDragged = this.amountDragged_(e.left, e.top); + resolution = this.resolutionForAmount_(amountDragged); + if(resolution !== this.currentResolution_) { + this.currentResolution_ = resolution; + view.setResolution(resolution) + } + }else { + goog.asserts.assert(goog.isDef(this.currentResolution_)); + map.beforeRender(ol.animation.zoom({resolution:this.currentResolution_, duration:ol.control.ZOOMSLIDER_ANIMATION_DURATION, easing:ol.easing.easeOut})); + resolution = view.constrainResolution(this.currentResolution_); + view.setResolution(resolution) + } +}; +goog.provide("ol.control.ZoomToExtent"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("ol.control.Control"); +goog.require("ol.css"); +ol.control.ZoomToExtent = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.extent_ = goog.isDef(options.extent) ? options.extent : null; + var className = goog.isDef(options.className) ? options.className : "ol-zoom-extent"; + var tipLabel = goog.isDef(options.tipLabel) ? options.tipLabel : "Fit to extent"; + var tip = goog.dom.createDom(goog.dom.TagName.SPAN, {"role":"tooltip"}, tipLabel); + var element = goog.dom.createDom(goog.dom.TagName.DIV, {"class":className + " " + ol.css.CLASS_UNSELECTABLE}); + var button = goog.dom.createDom(goog.dom.TagName.BUTTON, {"class":"ol-has-tooltip"}); + goog.dom.appendChild(button, tip); + goog.dom.appendChild(element, button); + goog.events.listen(button, [goog.events.EventType.TOUCHEND, goog.events.EventType.CLICK], this.handleZoomToExtent_, false, this); + goog.events.listen(button, [goog.events.EventType.MOUSEOUT, goog.events.EventType.FOCUSOUT], function() { + this.blur() + }, false); + goog.base(this, {element:element, target:options.target}) +}; +goog.inherits(ol.control.ZoomToExtent, ol.control.Control); +ol.control.ZoomToExtent.prototype.handleZoomToExtent_ = function(browserEvent) { + browserEvent.preventDefault(); + var map = this.getMap(); + var view = map.getView(); + goog.asserts.assert(goog.isDef(view)); + var view2D = view.getView2D(); + var extent = goog.isNull(this.extent_) ? view2D.getProjection().getExtent() : this.extent_; + view2D.fitExtent(extent, map.getSize()) +}; +goog.provide("ol.dom.Input"); +goog.provide("ol.dom.InputProperty"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("ol.Object"); +ol.dom.InputProperty = {VALUE:"value", CHECKED:"checked"}; +ol.dom.Input = function(target) { + goog.base(this); + this.target_ = (target); + goog.events.listen(this.target_, [goog.events.EventType.CHANGE, goog.events.EventType.INPUT], this.handleInputChanged_, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.dom.InputProperty.VALUE), this.handleValueChanged_, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.dom.InputProperty.CHECKED), this.handleCheckedChanged_, false, this) +}; +goog.inherits(ol.dom.Input, ol.Object); +ol.dom.Input.prototype.getChecked = function() { + return(this.get(ol.dom.InputProperty.CHECKED)) +}; +goog.exportProperty(ol.dom.Input.prototype, "getChecked", ol.dom.Input.prototype.getChecked); +ol.dom.Input.prototype.getValue = function() { + return(this.get(ol.dom.InputProperty.VALUE)) +}; +goog.exportProperty(ol.dom.Input.prototype, "getValue", ol.dom.Input.prototype.getValue); +ol.dom.Input.prototype.setValue = function(value) { + this.set(ol.dom.InputProperty.VALUE, value) +}; +goog.exportProperty(ol.dom.Input.prototype, "setValue", ol.dom.Input.prototype.setValue); +ol.dom.Input.prototype.setChecked = function(checked) { + this.set(ol.dom.InputProperty.CHECKED, checked) +}; +goog.exportProperty(ol.dom.Input.prototype, "setChecked", ol.dom.Input.prototype.setChecked); +ol.dom.Input.prototype.handleInputChanged_ = function(browserEvent) { + goog.asserts.assert(browserEvent.currentTarget == this.target_); + var target = this.target_; + if(target.type === "checkbox" || target.type === "radio") { + this.setChecked(target.checked) + }else { + this.setValue(target.value) + } +}; +ol.dom.Input.prototype.handleCheckedChanged_ = function(event) { + this.target_.checked = (this.getChecked()) +}; +ol.dom.Input.prototype.handleValueChanged_ = function(event) { + this.target_.value = (this.getValue()) +}; +goog.provide("ol.ellipsoid.BESSEL1841"); +goog.require("ol.Ellipsoid"); +ol.ellipsoid.BESSEL1841 = new ol.Ellipsoid(6377397.155, 1 / 299.15281285); +goog.provide("ol.ellipsoid.WGS84"); +goog.require("ol.Ellipsoid"); +ol.ellipsoid.WGS84 = new ol.Ellipsoid(6378137, 1 / 298.257223563); +goog.provide("ol.format.Feature"); +goog.require("goog.functions"); +ol.format.Feature = function() { +}; +ol.format.Feature.prototype.getExtensions = goog.abstractMethod; +ol.format.Feature.prototype.getType = goog.abstractMethod; +ol.format.Feature.prototype.readFeature = goog.abstractMethod; +ol.format.Feature.prototype.readFeatures = goog.abstractMethod; +ol.format.Feature.prototype.readGeometry = goog.abstractMethod; +ol.format.Feature.prototype.readProjection = goog.abstractMethod; +ol.format.Feature.prototype.writeFeature = goog.abstractMethod; +ol.format.Feature.prototype.writeFeatures = goog.abstractMethod; +ol.format.Feature.prototype.writeGeometry = goog.abstractMethod; +goog.provide("ol.format.FormatType"); +ol.format.FormatType = {BINARY:"binary", JSON:"json", TEXT:"text", XML:"xml"}; +goog.provide("ol.format.BinaryFeature"); +goog.require("goog.asserts"); +goog.require("ol.BrowserFeature"); +goog.require("ol.binary.Buffer"); +goog.require("ol.format.Feature"); +goog.require("ol.format.FormatType"); +goog.require("ol.proj"); +ol.format.BinaryFeature = function() { + goog.base(this) +}; +goog.inherits(ol.format.BinaryFeature, ol.format.Feature); +ol.format.BinaryFeature.getBuffer_ = function(source) { + if(ol.BrowserFeature.HAS_ARRAY_BUFFER && source instanceof ArrayBuffer) { + return new ol.binary.Buffer(source) + }else { + if(goog.isString(source)) { + return new ol.binary.Buffer(source) + }else { + goog.asserts.fail(); + return null + } + } +}; +ol.format.BinaryFeature.prototype.getType = function() { + return ol.format.FormatType.BINARY +}; +ol.format.BinaryFeature.prototype.readFeature = function(source) { + return this.readFeatureFromBuffer(ol.format.BinaryFeature.getBuffer_(source)) +}; +ol.format.BinaryFeature.prototype.readFeatures = function(source) { + return this.readFeaturesFromBuffer(ol.format.BinaryFeature.getBuffer_(source)) +}; +ol.format.BinaryFeature.prototype.readFeatureFromBuffer = goog.abstractMethod; +ol.format.BinaryFeature.prototype.readFeaturesFromBuffer = goog.abstractMethod; +ol.format.BinaryFeature.prototype.readGeometry = function(source) { + return this.readGeometryFromBuffer(ol.format.BinaryFeature.getBuffer_(source)) +}; +ol.format.BinaryFeature.prototype.readGeometryFromBuffer = goog.abstractMethod; +ol.format.BinaryFeature.prototype.readProjection = function(source) { + return this.readProjectionFromBuffer(ol.format.BinaryFeature.getBuffer_(source)) +}; +ol.format.BinaryFeature.prototype.readProjectionFromBuffer = goog.abstractMethod; +goog.provide("goog.dom.xml"); +goog.require("goog.dom"); +goog.require("goog.dom.NodeType"); +goog.dom.xml.MAX_XML_SIZE_KB = 2 * 1024; +goog.dom.xml.MAX_ELEMENT_DEPTH = 256; +goog.dom.xml.createDocument = function(opt_rootTagName, opt_namespaceUri) { + if(opt_namespaceUri && !opt_rootTagName) { + throw Error("Can't create document with namespace and no root tag"); + } + if(document.implementation && document.implementation.createDocument) { + return document.implementation.createDocument(opt_namespaceUri || "", opt_rootTagName || "", null) + }else { + if(typeof ActiveXObject != "undefined") { + var doc = goog.dom.xml.createMsXmlDocument_(); + if(doc) { + if(opt_rootTagName) { + doc.appendChild(doc.createNode(goog.dom.NodeType.ELEMENT, opt_rootTagName, opt_namespaceUri || "")) + } + return doc + } + } + } + throw Error("Your browser does not support creating new documents"); +}; +goog.dom.xml.loadXml = function(xml) { + if(typeof DOMParser != "undefined") { + return(new DOMParser).parseFromString(xml, "application/xml") + }else { + if(typeof ActiveXObject != "undefined") { + var doc = goog.dom.xml.createMsXmlDocument_(); + doc.loadXML(xml); + return doc + } + } + throw Error("Your browser does not support loading xml documents"); +}; +goog.dom.xml.serialize = function(xml) { + if(typeof XMLSerializer != "undefined") { + return(new XMLSerializer).serializeToString(xml) + } + var text = xml.xml; + if(text) { + return text + } + throw Error("Your browser does not support serializing XML documents"); +}; +goog.dom.xml.selectSingleNode = function(node, path) { + if(typeof node.selectSingleNode != "undefined") { + var doc = goog.dom.getOwnerDocument(node); + if(typeof doc.setProperty != "undefined") { + doc.setProperty("SelectionLanguage", "XPath") + } + return node.selectSingleNode(path) + }else { + if(document.implementation.hasFeature("XPath", "3.0")) { + var doc = goog.dom.getOwnerDocument(node); + var resolver = doc.createNSResolver(doc.documentElement); + var result = doc.evaluate(path, node, resolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null); + return result.singleNodeValue + } + } + return null +}; +goog.dom.xml.selectNodes = function(node, path) { + if(typeof node.selectNodes != "undefined") { + var doc = goog.dom.getOwnerDocument(node); + if(typeof doc.setProperty != "undefined") { + doc.setProperty("SelectionLanguage", "XPath") + } + return node.selectNodes(path) + }else { + if(document.implementation.hasFeature("XPath", "3.0")) { + var doc = goog.dom.getOwnerDocument(node); + var resolver = doc.createNSResolver(doc.documentElement); + var nodes = doc.evaluate(path, node, resolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var results = []; + var count = nodes.snapshotLength; + for(var i = 0;i < count;i++) { + results.push(nodes.snapshotItem(i)) + } + return results + }else { + return[] + } + } +}; +goog.dom.xml.setAttributes = function(element, attributes) { + for(var key in attributes) { + if(attributes.hasOwnProperty(key)) { + element.setAttribute(key, attributes[key]) + } + } +}; +goog.dom.xml.createMsXmlDocument_ = function() { + var doc = new ActiveXObject("MSXML2.DOMDocument"); + if(doc) { + doc.resolveExternals = false; + doc.validateOnParse = false; + try { + doc.setProperty("ProhibitDTD", true); + doc.setProperty("MaxXMLSize", goog.dom.xml.MAX_XML_SIZE_KB); + doc.setProperty("MaxElementDepth", goog.dom.xml.MAX_ELEMENT_DEPTH) + }catch(e) { + } + } + return doc +}; +goog.provide("ol.xml"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom.NodeType"); +goog.require("goog.dom.xml"); +goog.require("goog.object"); +goog.require("goog.userAgent"); +ol.xml.NodeStackItem; +ol.xml.Parser; +ol.xml.Serializer; +ol.xml.DOCUMENT = goog.dom.xml.createDocument(); +ol.xml.createElementNS_ = function(namespaceURI, qualifiedName) { + return ol.xml.DOCUMENT.createElementNS(namespaceURI, qualifiedName) +}; +ol.xml.createElementNSActiveX_ = function(namespaceURI, qualifiedName) { + if(goog.isNull(namespaceURI)) { + namespaceURI = "" + } + return ol.xml.DOCUMENT.createNode(1, qualifiedName, namespaceURI) +}; +ol.xml.createElementNS = document.implementation && document.implementation.createDocument ? ol.xml.createElementNS_ : ol.xml.createElementNSActiveX_; +ol.xml.getAllTextContent = function(node, normalizeWhitespace) { + return ol.xml.getAllTextContent_(node, normalizeWhitespace, []).join("") +}; +ol.xml.getAllTextContent_ = function(node, normalizeWhitespace, accumulator) { + if(node.nodeType == goog.dom.NodeType.CDATA_SECTION || node.nodeType == goog.dom.NodeType.TEXT) { + if(normalizeWhitespace) { + accumulator.push(String(node.nodeValue).replace(/(\r\n|\r|\n)/g, "")) + }else { + accumulator.push(node.nodeValue) + } + }else { + var n; + for(n = node.firstChild;!goog.isNull(n);n = n.nextSibling) { + ol.xml.getAllTextContent_(n, normalizeWhitespace, accumulator) + } + } + return accumulator +}; +ol.xml.getLocalName_ = function(node) { + return node.localName +}; +ol.xml.getLocalNameIE_ = function(node) { + var localName = node.localName; + if(goog.isDef(localName)) { + return localName + } + var baseName = node.baseName; + goog.asserts.assert(goog.isDefAndNotNull(baseName)); + return baseName +}; +ol.xml.getLocalName = goog.userAgent.IE ? ol.xml.getLocalNameIE_ : ol.xml.getLocalName_; +ol.xml.isDocument_ = function(value) { + return value instanceof Document +}; +ol.xml.isDocumentIE_ = function(value) { + return goog.isObject(value) && value.nodeType == goog.dom.NodeType.DOCUMENT +}; +ol.xml.isDocument = goog.userAgent.IE ? ol.xml.isDocumentIE_ : ol.xml.isDocument_; +ol.xml.isNode_ = function(value) { + return value instanceof Node +}; +ol.xml.isNodeIE_ = function(value) { + return goog.isObject(value) && goog.isDef(value.nodeType) +}; +ol.xml.isNode = goog.userAgent.IE ? ol.xml.isNodeIE_ : ol.xml.isNode_; +ol.xml.getAttributeNS_ = function(node, namespaceURI, name) { + return node.getAttributeNS(namespaceURI, name) || "" +}; +ol.xml.getAttributeNSActiveX_ = function(node, namespaceURI, name) { + var attributeValue = ""; + var attributeNode = ol.xml.getAttributeNodeNS(node, namespaceURI, name); + if(goog.isDef(attributeNode)) { + attributeValue = attributeNode.nodeValue + } + return attributeValue +}; +ol.xml.getAttributeNS = document.implementation && document.implementation.createDocument ? ol.xml.getAttributeNS_ : ol.xml.getAttributeNSActiveX_; +ol.xml.getAttributeNodeNS_ = function(node, namespaceURI, name) { + return node.getAttributeNodeNS(namespaceURI, name) +}; +ol.xml.getAttributeNodeNSActiveX_ = function(node, namespaceURI, name) { + var attributeNode = null; + var attributes = node.attributes; + var potentialNode, fullName; + for(var i = 0, len = attributes.length;i < len;++i) { + potentialNode = attributes[i]; + if(potentialNode.namespaceURI == namespaceURI) { + fullName = potentialNode.prefix ? potentialNode.prefix + ":" + name : name; + if(fullName == potentialNode.nodeName) { + attributeNode = potentialNode; + break + } + } + } + return attributeNode +}; +ol.xml.getAttributeNodeNS = document.implementation && document.implementation.createDocument ? ol.xml.getAttributeNodeNS_ : ol.xml.getAttributeNodeNSActiveX_; +ol.xml.setAttributeNS_ = function(node, namespaceURI, name, value) { + node.setAttributeNS(namespaceURI, name, value) +}; +ol.xml.setAttributeNSActiveX_ = function(node, namespaceURI, name, value) { + if(!goog.isNull(namespaceURI)) { + var attribute = node.ownerDocument.createNode(2, name, namespaceURI); + attribute.nodeValue = value; + node.setAttributeNode(attribute) + }else { + node.setAttribute(name, value) + } +}; +ol.xml.setAttributeNS = document.implementation && document.implementation.createDocument ? ol.xml.setAttributeNS_ : ol.xml.setAttributeNSActiveX_; +ol.xml.load = function(xml) { + return(new DOMParser).parseFromString(xml, "application/xml") +}; +ol.xml.makeArrayExtender = function(valueReader, opt_this) { + return function(node, objectStack) { + var value = valueReader.call(opt_this, node, objectStack); + if(goog.isDef(value)) { + goog.asserts.assert(goog.isArray(value)); + var array = (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(array)); + goog.array.extend(array, value) + } + } +}; +ol.xml.makeArrayPusher = function(valueReader, opt_this) { + return function(node, objectStack) { + var value = valueReader.call(opt_this, node, objectStack); + if(goog.isDef(value)) { + var array = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isArray(array)); + array.push(value) + } + } +}; +ol.xml.makeReplacer = function(valueReader, opt_this) { + return function(node, objectStack) { + var value = valueReader.call(opt_this, node, objectStack); + if(goog.isDef(value)) { + objectStack[objectStack.length - 1] = value + } + } +}; +ol.xml.makeObjectPropertySetter = function(valueReader, opt_property, opt_this) { + goog.asserts.assert(goog.isDef(valueReader)); + return function(node, objectStack) { + var value = valueReader.call(opt_this, node, objectStack); + if(goog.isDef(value)) { + var object = (objectStack[objectStack.length - 1]); + var property = goog.isDef(opt_property) ? opt_property : node.localName; + goog.asserts.assert(goog.isObject(object)); + goog.object.set(object, property, value) + } + } +}; +ol.xml.makeParsersNS = function(namespaceURIs, parsers, opt_parsersNS) { + return(ol.xml.makeStructureNS(namespaceURIs, parsers, opt_parsersNS)) +}; +ol.xml.makeChildAppender = function(nodeWriter, opt_this) { + return function(node, value, objectStack) { + nodeWriter.call(opt_this, node, value, objectStack); + var parent = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(parent)); + var parentNode = parent.node; + goog.asserts.assert(ol.xml.isNode(parentNode) || ol.xml.isDocument(parentNode)); + parentNode.appendChild(node) + } +}; +ol.xml.makeArraySerializer = function(nodeWriter, opt_this) { + var serializersNS, nodeFactory; + return function(node, value, objectStack) { + if(!goog.isDef(serializersNS)) { + serializersNS = {}; + var serializers = {}; + goog.object.set(serializers, node.localName, nodeWriter); + goog.object.set(serializersNS, node.namespaceURI, serializers); + nodeFactory = ol.xml.makeSimpleNodeFactory(node.localName) + } + ol.xml.serialize(serializersNS, nodeFactory, value, objectStack) + } +}; +ol.xml.makeSimpleNodeFactory = function(opt_nodeName, opt_namespaceURI) { + var fixedNodeName = opt_nodeName; + return function(value, objectStack, opt_nodeName) { + var context = objectStack[objectStack.length - 1]; + var node = context.node; + goog.asserts.assert(ol.xml.isNode(node) || ol.xml.isDocument(node)); + var nodeName = fixedNodeName; + if(!goog.isDef(nodeName)) { + nodeName = opt_nodeName + } + var namespaceURI = opt_namespaceURI; + if(!goog.isDef(opt_namespaceURI)) { + namespaceURI = node.namespaceURI + } + goog.asserts.assert(goog.isDef(nodeName)); + return ol.xml.createElementNS(namespaceURI, nodeName) + } +}; +ol.xml.OBJECT_PROPERTY_NODE_FACTORY = ol.xml.makeSimpleNodeFactory(); +ol.xml.makeSequence = function(object, orderedKeys) { + var length = orderedKeys.length; + var sequence = new Array(length); + for(var i = 0;i < length;++i) { + sequence[i] = object[orderedKeys[i]] + } + return sequence +}; +ol.xml.makeStructureNS = function(namespaceURIs, structure, opt_structureNS) { + var structureNS = goog.isDef(opt_structureNS) ? opt_structureNS : {}; + var i, ii; + for(i = 0, ii = namespaceURIs.length;i < ii;++i) { + structureNS[namespaceURIs[i]] = structure + } + return structureNS +}; +ol.xml.parse = function(parsersNS, node, objectStack, opt_this) { + var n; + for(n = node.firstElementChild;!goog.isNull(n);n = n.nextElementSibling) { + var parsers = parsersNS[n.namespaceURI]; + if(goog.isDef(parsers)) { + var parser = parsers[n.localName]; + if(goog.isDef(parser)) { + parser.call(opt_this, n, objectStack) + } + } + } +}; +ol.xml.pushParseAndPop = function(object, parsersNS, node, objectStack, opt_this) { + objectStack.push(object); + ol.xml.parse(parsersNS, node, objectStack, opt_this); + return objectStack.pop() +}; +ol.xml.serialize = function(serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this) { + var length = (goog.isDef(opt_keys) ? opt_keys : values).length; + var value, node; + for(var i = 0;i < length;++i) { + value = values[i]; + if(goog.isDef(value)) { + node = nodeFactory.call(opt_this, value, objectStack, goog.isDef(opt_keys) ? opt_keys[i] : undefined); + if(goog.isDef(node)) { + serializersNS[node.namespaceURI][node.localName].call(opt_this, node, value, objectStack) + } + } + } +}; +ol.xml.pushSerializeAndPop = function(object, serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this) { + objectStack.push(object); + ol.xml.serialize(serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this); + return objectStack.pop() +}; +goog.provide("ol.format.XMLFeature"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom.NodeType"); +goog.require("ol.format.Feature"); +goog.require("ol.format.FormatType"); +goog.require("ol.xml"); +ol.format.XMLFeature = function() { + goog.base(this) +}; +goog.inherits(ol.format.XMLFeature, ol.format.Feature); +ol.format.XMLFeature.prototype.getType = function() { + return ol.format.FormatType.XML +}; +ol.format.XMLFeature.prototype.readFeature = function(source) { + if(ol.xml.isDocument(source)) { + return this.readFeatureFromDocument((source)) + }else { + if(ol.xml.isNode(source)) { + return this.readFeatureFromNode((source)) + }else { + if(goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readFeatureFromDocument(doc) + }else { + goog.asserts.fail(); + return null + } + } + } +}; +ol.format.XMLFeature.prototype.readFeatureFromDocument = function(doc) { + var features = this.readFeaturesFromDocument(doc); + if(features.length > 0) { + return features[0] + }else { + return null + } +}; +ol.format.XMLFeature.prototype.readFeatureFromNode = goog.abstractMethod; +ol.format.XMLFeature.prototype.readFeatures = function(source) { + if(ol.xml.isDocument(source)) { + return this.readFeaturesFromDocument((source)) + }else { + if(ol.xml.isNode(source)) { + return this.readFeaturesFromNode((source)) + }else { + if(goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readFeaturesFromDocument(doc) + }else { + goog.asserts.fail(); + return[] + } + } + } +}; +ol.format.XMLFeature.prototype.readFeaturesFromDocument = function(doc) { + var features = []; + var n; + for(n = doc.firstChild;!goog.isNull(n);n = n.nextSibling) { + if(n.nodeType == goog.dom.NodeType.ELEMENT) { + goog.array.extend(features, this.readFeaturesFromNode(n)) + } + } + return features +}; +ol.format.XMLFeature.prototype.readFeaturesFromNode = goog.abstractMethod; +ol.format.XMLFeature.prototype.readGeometry = function(source) { + if(ol.xml.isDocument(source)) { + return this.readGeometryFromDocument((source)) + }else { + if(ol.xml.isNode(source)) { + return this.readGeometryFromNode((source)) + }else { + if(goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readGeometryFromDocument(doc) + }else { + goog.asserts.fail(); + return null + } + } + } +}; +ol.format.XMLFeature.prototype.readGeometryFromDocument = goog.abstractMethod; +ol.format.XMLFeature.prototype.readGeometryFromNode = goog.abstractMethod; +ol.format.XMLFeature.prototype.readProjection = function(source) { + if(ol.xml.isDocument(source)) { + return this.readProjectionFromDocument((source)) + }else { + if(ol.xml.isNode(source)) { + return this.readProjectionFromNode((source)) + }else { + if(goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readProjectionFromDocument(doc) + }else { + goog.asserts.fail(); + return null + } + } + } +}; +ol.format.XMLFeature.prototype.readProjectionFromDocument = goog.abstractMethod; +ol.format.XMLFeature.prototype.readProjectionFromNode = goog.abstractMethod; +ol.format.XMLFeature.prototype.writeFeature = function(feature) { + return this.writeFeatureNode(feature) +}; +ol.format.XMLFeature.prototype.writeFeatureNode = goog.abstractMethod; +ol.format.XMLFeature.prototype.writeFeatures = function(features) { + return this.writeFeaturesNode(features) +}; +ol.format.XMLFeature.prototype.writeFeaturesNode = goog.abstractMethod; +ol.format.XMLFeature.prototype.writeGeometry = function(geometry) { + return this.writeGeometryNode(geometry) +}; +ol.format.XMLFeature.prototype.writeGeometryNode = goog.abstractMethod; +goog.provide("ol.format.XSD"); +goog.require("goog.asserts"); +goog.require("goog.string"); +goog.require("ol.xml"); +ol.format.XSD.NAMESPACE_URI = "http://www.w3.org/2001/XMLSchema"; +ol.format.XSD.readBoolean = function(node) { + var s = ol.xml.getAllTextContent(node, false); + return ol.format.XSD.readBooleanString(s) +}; +ol.format.XSD.readBooleanString = function(string) { + var m = /^\s*(true|1)|(false|0)\s*$/.exec(string); + if(m) { + return goog.isDef(m[1]) || false + }else { + return undefined + } +}; +ol.format.XSD.readDateTime = function(node) { + var s = ol.xml.getAllTextContent(node, false); + var re = /^\s*(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(Z|(?:([+\-])(\d{2})(?::(\d{2}))?))\s*$/; + var m = re.exec(s); + if(m) { + var year = parseInt(m[1], 10); + var month = parseInt(m[2], 10) - 1; + var day = parseInt(m[3], 10); + var hour = parseInt(m[4], 10); + var minute = parseInt(m[5], 10); + var second = parseInt(m[6], 10); + var dateTime = Date.UTC(year, month, day, hour, minute, second) / 1E3; + if(m[7] != "Z") { + var sign = m[8] == "-" ? -1 : 1; + dateTime += sign * 60 * parseInt(m[9], 10); + if(goog.isDef(m[10])) { + dateTime += sign * 60 * 60 * parseInt(m[10], 10) + } + } + return dateTime + }else { + return undefined + } +}; +ol.format.XSD.readDecimal = function(node) { + var s = ol.xml.getAllTextContent(node, false); + return ol.format.XSD.readDecimalString(s) +}; +ol.format.XSD.readDecimalString = function(string) { + var m = /^\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)\s*$/i.exec(string); + if(m) { + return parseFloat(m[1]) + }else { + return undefined + } +}; +ol.format.XSD.readNonNegativeInteger = function(node) { + var s = ol.xml.getAllTextContent(node, false); + return ol.format.XSD.readNonNegativeIntegerString(s) +}; +ol.format.XSD.readNonNegativeIntegerString = function(string) { + var m = /^\s*(\d+)\s*$/.exec(string); + if(m) { + return parseInt(m[1], 10) + }else { + return undefined + } +}; +ol.format.XSD.readString = function(node) { + var s = ol.xml.getAllTextContent(node, false); + return goog.string.trim(s) +}; +ol.format.XSD.writeDateTimeTextNode = function(node, dateTime) { + var date = new Date(dateTime * 1E3); + var string = date.getUTCFullYear() + "-" + goog.string.padNumber(date.getUTCMonth() + 1, 2) + "-" + goog.string.padNumber(date.getUTCDate(), 2) + "T" + goog.string.padNumber(date.getUTCHours(), 2) + ":" + goog.string.padNumber(date.getUTCMinutes(), 2) + ":" + goog.string.padNumber(date.getUTCSeconds(), 2) + "Z"; + node.appendChild(ol.xml.DOCUMENT.createTextNode(string)) +}; +ol.format.XSD.writeDecimalTextNode = function(node, decimal) { + var string = decimal.toPrecision(); + node.appendChild(ol.xml.DOCUMENT.createTextNode(string)) +}; +ol.format.XSD.writeNonNegativeIntegerTextNode = function(node, nonNegativeInteger) { + goog.asserts.assert(nonNegativeInteger >= 0); + goog.asserts.assert(nonNegativeInteger == (nonNegativeInteger | 0)); + var string = nonNegativeInteger.toString(); + node.appendChild(ol.xml.DOCUMENT.createTextNode(string)) +}; +ol.format.XSD.writeStringTextNode = function(node, string) { + node.appendChild(ol.xml.DOCUMENT.createTextNode(string)) +}; +goog.provide("ol.format.GML"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.NodeType"); +goog.require("goog.object"); +goog.require("goog.string"); +goog.require("ol.Feature"); +goog.require("ol.extent"); +goog.require("ol.format.XMLFeature"); +goog.require("ol.format.XSD"); +goog.require("ol.geom.Geometry"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.LinearRing"); +goog.require("ol.geom.MultiLineString"); +goog.require("ol.geom.MultiPoint"); +goog.require("ol.geom.MultiPolygon"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.Polygon"); +goog.require("ol.proj"); +goog.require("ol.xml"); +ol.format.GML = function(opt_options) { + var options = (goog.isDef(opt_options) ? opt_options : {}); + this.featureType_ = options.featureType; + this.featureNS_ = options.featureNS; + this.srsName_ = options.srsName; + this.surface_ = goog.isDef(options.surface) ? options.surface : false; + this.curve_ = goog.isDef(options.curve) ? options.curve : false; + this.multiCurve_ = goog.isDef(options.multiCurve) ? options.multiCurve : true; + this.multiSurface_ = goog.isDef(options.multiSurface) ? options.multiSurface : true; + this.schemaLocation_ = goog.isDef(options.schemaLocation) ? options.schemaLocation : ol.format.GML.schemaLocation_; + goog.base(this) +}; +goog.inherits(ol.format.GML, ol.format.XMLFeature); +ol.format.GML.schemaLocation_ = "http://www.opengis.net/gml " + "http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/" + "1.0.0/gmlsf.xsd"; +ol.format.GML.readFeatures_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + var localName = ol.xml.getLocalName(node); + var context = objectStack[0]; + goog.asserts.assert(goog.isObject(context)); + var featureType = goog.object.get(context, "featureType"); + var features; + if(localName == "FeatureCollection") { + features = ol.xml.pushParseAndPop(null, ol.format.GML.FEATURE_COLLECTION_PARSERS_, node, objectStack) + }else { + if(localName == "featureMembers") { + var parsers = {}; + var parsersNS = {}; + parsers[featureType] = ol.xml.makeArrayPusher(ol.format.GML.readFeature_); + parsersNS[goog.object.get(context, "featureNS")] = parsers; + features = ol.xml.pushParseAndPop([], parsersNS, node, objectStack) + } + } + if(!goog.isDef(features)) { + features = [] + } + return features +}; +ol.format.GML.FEATURE_COLLECTION_PARSERS_ = {"http://www.opengis.net/gml":{"featureMembers":ol.xml.makeReplacer(ol.format.GML.readFeatures_)}}; +ol.format.GML.readGeometry_ = function(node, objectStack) { + var context = objectStack[0]; + goog.asserts.assert(goog.isObject(context)); + goog.object.set(context, "srsName", node.firstElementChild.getAttribute("srsName")); + var geometry = ol.xml.pushParseAndPop((null), ol.format.GML.GEOMETRY_PARSERS_, node, objectStack); + if(goog.isDefAndNotNull(geometry)) { + return geometry + }else { + return undefined + } +}; +ol.format.GML.readFeature_ = function(node, objectStack) { + var n; + var fid = node.getAttribute("fid") || ol.xml.getAttributeNS(node, "http://www.opengis.net/gml", "id"); + var values = {}, geometryName; + for(n = node.firstElementChild;!goog.isNull(n);n = n.nextElementSibling) { + if(n.childNodes.length === 0 || n.childNodes.length === 1 && n.firstChild.nodeType === 3) { + var value = ol.xml.getAllTextContent(n, false); + if(goog.string.isEmpty(value)) { + value = undefined + } + values[ol.xml.getLocalName(n)] = value + }else { + geometryName = ol.xml.getLocalName(n); + values[geometryName] = ol.format.GML.readGeometry_(n, objectStack) + } + } + var feature = new ol.Feature(values); + if(goog.isDef(geometryName)) { + feature.setGeometryName(geometryName) + } + if(fid) { + feature.setId(fid) + } + return feature +}; +ol.format.GML.readPoint_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Point"); + var flatCoordinates = ol.format.GML.readFlatCoordinatesFromNode_(node, objectStack); + if(goog.isDefAndNotNull(flatCoordinates)) { + var point = new ol.geom.Point(null); + goog.asserts.assert(flatCoordinates.length == 3); + point.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return point + } +}; +ol.format.GML.readMultiPoint_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "MultiPoint"); + var coordinates = ol.xml.pushParseAndPop(([]), ol.format.GML.MULTIPOINT_PARSERS_, node, objectStack); + if(goog.isDef(coordinates)) { + return new ol.geom.MultiPoint(coordinates) + }else { + return undefined + } +}; +ol.format.GML.readMultiLineString_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "MultiLineString"); + var lineStrings = ol.xml.pushParseAndPop(([]), ol.format.GML.MULTILINESTRING_PARSERS_, node, objectStack); + if(goog.isDef(lineStrings)) { + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setLineStrings(lineStrings); + return multiLineString + }else { + return undefined + } +}; +ol.format.GML.readMultiCurve_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "MultiCurve"); + var lineStrings = ol.xml.pushParseAndPop(([]), ol.format.GML.MULTICURVE_PARSERS_, node, objectStack); + if(goog.isDef(lineStrings)) { + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setLineStrings(lineStrings); + return multiLineString + }else { + return undefined + } +}; +ol.format.GML.readMultiSurface_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "MultiSurface"); + var polygons = ol.xml.pushParseAndPop(([]), ol.format.GML.MULTISURFACE_PARSERS_, node, objectStack); + if(goog.isDef(polygons)) { + var multiPolygon = new ol.geom.MultiPolygon(null); + multiPolygon.setPolygons(polygons); + return multiPolygon + }else { + return undefined + } +}; +ol.format.GML.readMultiPolygon_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "MultiPolygon"); + var polygons = ol.xml.pushParseAndPop(([]), ol.format.GML.MULTIPOLYGON_PARSERS_, node, objectStack); + if(goog.isDef(polygons)) { + var multiPolygon = new ol.geom.MultiPolygon(null); + multiPolygon.setPolygons(polygons); + return multiPolygon + }else { + return undefined + } +}; +ol.format.GML.pointMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "pointMember" || node.localName == "pointMembers"); + ol.xml.parse(ol.format.GML.POINTMEMBER_PARSERS_, node, objectStack) +}; +ol.format.GML.lineStringMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "lineStringMember" || node.localName == "lineStringMembers"); + ol.xml.parse(ol.format.GML.LINESTRINGMEMBER_PARSERS_, node, objectStack) +}; +ol.format.GML.curveMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "curveMember" || node.localName == "curveMembers"); + ol.xml.parse(ol.format.GML.CURVEMEMBER_PARSERS_, node, objectStack) +}; +ol.format.GML.surfaceMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "surfaceMember" || node.localName == "surfaceMembers"); + ol.xml.parse(ol.format.GML.SURFACEMEMBER_PARSERS_, node, objectStack) +}; +ol.format.GML.polygonMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "polygonMember" || node.localName == "polygonMembers"); + ol.xml.parse(ol.format.GML.POLYGONMEMBER_PARSERS_, node, objectStack) +}; +ol.format.GML.readLineString_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "LineString"); + var flatCoordinates = ol.format.GML.readFlatCoordinatesFromNode_(node, objectStack); + if(goog.isDefAndNotNull(flatCoordinates)) { + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return lineString + }else { + return undefined + } +}; +ol.format.GML.readPatch_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "patches"); + return ol.xml.pushParseAndPop(([null]), ol.format.GML.PATCHES_PARSERS_, node, objectStack) +}; +ol.format.GML.readSegment_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "segments"); + return ol.xml.pushParseAndPop(([null]), ol.format.GML.SEGMENTS_PARSERS_, node, objectStack) +}; +ol.format.GML.readPolygonPatch_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "PolygonPatch"); + return ol.xml.pushParseAndPop(([null]), ol.format.GML.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack) +}; +ol.format.GML.readLineStringSegment_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "LineStringSegment"); + return ol.xml.pushParseAndPop(([null]), ol.format.GML.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack) +}; +ol.format.GML.interiorParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "interior"); + var flatLinearRing = ol.xml.pushParseAndPop((undefined), ol.format.GML.RING_PARSERS_, node, objectStack); + if(goog.isDef(flatLinearRing)) { + var flatLinearRings = (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(flatLinearRings)); + goog.asserts.assert(flatLinearRings.length > 0); + flatLinearRings.push(flatLinearRing) + } +}; +ol.format.GML.exteriorParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "exterior"); + var flatLinearRing = ol.xml.pushParseAndPop((undefined), ol.format.GML.RING_PARSERS_, node, objectStack); + if(goog.isDef(flatLinearRing)) { + var flatLinearRings = (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(flatLinearRings)); + goog.asserts.assert(flatLinearRings.length > 0); + flatLinearRings[0] = flatLinearRing + } +}; +ol.format.GML.readFlatLinearRing_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "LinearRing"); + var ring = ol.xml.pushParseAndPop((null), ol.format.GML.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack); + if(goog.isDefAndNotNull(ring)) { + return ring + }else { + return undefined + } +}; +ol.format.GML.readLinearRing_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "LinearRing"); + var flatCoordinates = ol.format.GML.readFlatCoordinatesFromNode_(node, objectStack); + if(goog.isDef(flatCoordinates)) { + var ring = new ol.geom.LinearRing(null); + ring.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return ring + }else { + return undefined + } +}; +ol.format.GML.readPolygon_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Polygon"); + var flatLinearRings = ol.xml.pushParseAndPop(([null]), ol.format.GML.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack); + if(goog.isDef(flatLinearRings) && !goog.isNull(flatLinearRings[0])) { + var polygon = new ol.geom.Polygon(null); + var flatCoordinates = flatLinearRings[0]; + var ends = [flatCoordinates.length]; + var i, ii; + for(i = 1, ii = flatLinearRings.length;i < ii;++i) { + goog.array.extend(flatCoordinates, flatLinearRings[i]); + ends.push(flatCoordinates.length) + } + polygon.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates, ends); + return polygon + }else { + return undefined + } +}; +ol.format.GML.readSurface_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Surface"); + var flatLinearRings = ol.xml.pushParseAndPop(([null]), ol.format.GML.SURFACE_PARSERS_, node, objectStack); + if(goog.isDef(flatLinearRings) && !goog.isNull(flatLinearRings[0])) { + var polygon = new ol.geom.Polygon(null); + var flatCoordinates = flatLinearRings[0]; + var ends = [flatCoordinates.length]; + var i, ii; + for(i = 1, ii = flatLinearRings.length;i < ii;++i) { + goog.array.extend(flatCoordinates, flatLinearRings[i]); + ends.push(flatCoordinates.length) + } + polygon.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates, ends); + return polygon + }else { + return undefined + } +}; +ol.format.GML.readCurve_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Curve"); + var flatCoordinates = ol.xml.pushParseAndPop(([null]), ol.format.GML.CURVE_PARSERS_, node, objectStack); + if(goog.isDef(flatCoordinates)) { + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return lineString + }else { + return undefined + } +}; +ol.format.GML.readEnvelope_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Envelope"); + var flatCoordinates = ol.xml.pushParseAndPop(([null]), ol.format.GML.ENVELOPE_PARSERS_, node, objectStack); + return ol.extent.createOrUpdate(flatCoordinates[1][0], flatCoordinates[1][1], flatCoordinates[2][0], flatCoordinates[2][1]) +}; +ol.format.GML.readFlatCoordinatesFromNode_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + return(ol.xml.pushParseAndPop(null, ol.format.GML.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack)) +}; +ol.format.GML.readFlatPos_ = function(node, objectStack) { + var s = ol.xml.getAllTextContent(node, false).replace(/^\s*|\s*$/g, ""); + var flatCoordinates = goog.array.map(s.split(/\s+/), parseFloat); + var context = objectStack[0]; + goog.asserts.assert(goog.isObject(context)); + var containerSrs = goog.object.get(context, "srsName"); + var axisOrientation = "enu"; + if(!goog.isNull(containerSrs)) { + var proj = ol.proj.get(containerSrs); + axisOrientation = proj.getAxisOrientation() + } + if(axisOrientation === "neu") { + flatCoordinates = flatCoordinates.reverse() + } + var len = flatCoordinates.length; + if(len == 2) { + flatCoordinates.push(0) + } + if(len === 0) { + return undefined + } + return flatCoordinates +}; +ol.format.GML.readFlatPosList_ = function(node, objectStack) { + var s = ol.xml.getAllTextContent(node, false).replace(/^\s*|\s*$/g, ""); + var context = objectStack[0]; + goog.asserts.assert(goog.isObject(context)); + var containerSrs = goog.object.get(context, "srsName"); + var containerDimension = node.parentNode.getAttribute("srsDimension"); + var axisOrientation = "enu"; + if(!goog.isNull(containerSrs)) { + var proj = ol.proj.get(containerSrs); + axisOrientation = proj.getAxisOrientation() + } + var coords = s.split(/\s+/); + var dim = 2; + if(!goog.isNull(node.getAttribute("srsDimension"))) { + dim = ol.format.XSD.readNonNegativeIntegerString(node.getAttribute("srsDimension")) + }else { + if(!goog.isNull(node.getAttribute("dimension"))) { + dim = ol.format.XSD.readNonNegativeIntegerString(node.getAttribute("dimension")) + }else { + if(!goog.isNull(containerDimension)) { + dim = ol.format.XSD.readNonNegativeIntegerString(containerDimension) + } + } + } + var x, y, z; + var flatCoordinates = []; + for(var i = 0, ii = coords.length;i < ii;i += dim) { + x = parseFloat(coords[i]); + y = parseFloat(coords[i + 1]); + z = dim === 3 ? parseFloat(coords[i + 2]) : 0; + if(axisOrientation.substr(0, 2) === "en") { + flatCoordinates.push(x, y, z) + }else { + flatCoordinates.push(y, x, z) + } + } + return flatCoordinates +}; +ol.format.GML.GEOMETRY_PARSERS_ = {"http://www.opengis.net/gml":{"Point":ol.xml.makeReplacer(ol.format.GML.readPoint_), "MultiPoint":ol.xml.makeReplacer(ol.format.GML.readMultiPoint_), "LineString":ol.xml.makeReplacer(ol.format.GML.readLineString_), "MultiLineString":ol.xml.makeReplacer(ol.format.GML.readMultiLineString_), "LinearRing":ol.xml.makeReplacer(ol.format.GML.readLinearRing_), "Polygon":ol.xml.makeReplacer(ol.format.GML.readPolygon_), "MultiPolygon":ol.xml.makeReplacer(ol.format.GML.readMultiPolygon_), +"Surface":ol.xml.makeReplacer(ol.format.GML.readSurface_), "MultiSurface":ol.xml.makeReplacer(ol.format.GML.readMultiSurface_), "Curve":ol.xml.makeReplacer(ol.format.GML.readCurve_), "MultiCurve":ol.xml.makeReplacer(ol.format.GML.readMultiCurve_), "Envelope":ol.xml.makeReplacer(ol.format.GML.readEnvelope_)}}; +ol.format.GML.GEOMETRY_FLAT_COORDINATES_PARSERS_ = {"http://www.opengis.net/gml":{"pos":ol.xml.makeReplacer(ol.format.GML.readFlatPos_), "posList":ol.xml.makeReplacer(ol.format.GML.readFlatPosList_)}}; +ol.format.GML.FLAT_LINEAR_RINGS_PARSERS_ = {"http://www.opengis.net/gml":{"interior":ol.format.GML.interiorParser_, "exterior":ol.format.GML.exteriorParser_}}; +ol.format.GML.MULTIPOINT_PARSERS_ = {"http://www.opengis.net/gml":{"pointMember":ol.xml.makeArrayPusher(ol.format.GML.pointMemberParser_), "pointMembers":ol.xml.makeArrayPusher(ol.format.GML.pointMemberParser_)}}; +ol.format.GML.MULTILINESTRING_PARSERS_ = {"http://www.opengis.net/gml":{"lineStringMember":ol.xml.makeArrayPusher(ol.format.GML.lineStringMemberParser_), "lineStringMembers":ol.xml.makeArrayPusher(ol.format.GML.lineStringMemberParser_)}}; +ol.format.GML.MULTICURVE_PARSERS_ = {"http://www.opengis.net/gml":{"curveMember":ol.xml.makeArrayPusher(ol.format.GML.curveMemberParser_), "curveMembers":ol.xml.makeArrayPusher(ol.format.GML.curveMemberParser_)}}; +ol.format.GML.MULTISURFACE_PARSERS_ = {"http://www.opengis.net/gml":{"surfaceMember":ol.xml.makeArrayPusher(ol.format.GML.surfaceMemberParser_), "surfaceMembers":ol.xml.makeArrayPusher(ol.format.GML.surfaceMemberParser_)}}; +ol.format.GML.MULTIPOLYGON_PARSERS_ = {"http://www.opengis.net/gml":{"polygonMember":ol.xml.makeArrayPusher(ol.format.GML.polygonMemberParser_), "polygonMembers":ol.xml.makeArrayPusher(ol.format.GML.polygonMemberParser_)}}; +ol.format.GML.POINTMEMBER_PARSERS_ = {"http://www.opengis.net/gml":{"Point":ol.xml.makeArrayPusher(ol.format.GML.readFlatCoordinatesFromNode_)}}; +ol.format.GML.LINESTRINGMEMBER_PARSERS_ = {"http://www.opengis.net/gml":{"LineString":ol.xml.makeArrayPusher(ol.format.GML.readLineString_)}}; +ol.format.GML.CURVEMEMBER_PARSERS_ = {"http://www.opengis.net/gml":{"LineString":ol.xml.makeArrayPusher(ol.format.GML.readLineString_), "Curve":ol.xml.makeArrayPusher(ol.format.GML.readCurve_)}}; +ol.format.GML.SURFACEMEMBER_PARSERS_ = {"http://www.opengis.net/gml":{"Polygon":ol.xml.makeArrayPusher(ol.format.GML.readPolygon_), "Surface":ol.xml.makeArrayPusher(ol.format.GML.readSurface_)}}; +ol.format.GML.POLYGONMEMBER_PARSERS_ = {"http://www.opengis.net/gml":{"Polygon":ol.xml.makeArrayPusher(ol.format.GML.readPolygon_)}}; +ol.format.GML.SURFACE_PARSERS_ = {"http://www.opengis.net/gml":{"patches":ol.xml.makeReplacer(ol.format.GML.readPatch_)}}; +ol.format.GML.CURVE_PARSERS_ = {"http://www.opengis.net/gml":{"segments":ol.xml.makeReplacer(ol.format.GML.readSegment_)}}; +ol.format.GML.ENVELOPE_PARSERS_ = {"http://www.opengis.net/gml":{"lowerCorner":ol.xml.makeArrayPusher(ol.format.GML.readFlatPosList_), "upperCorner":ol.xml.makeArrayPusher(ol.format.GML.readFlatPosList_)}}; +ol.format.GML.PATCHES_PARSERS_ = {"http://www.opengis.net/gml":{"PolygonPatch":ol.xml.makeReplacer(ol.format.GML.readPolygonPatch_)}}; +ol.format.GML.SEGMENTS_PARSERS_ = {"http://www.opengis.net/gml":{"LineStringSegment":ol.xml.makeReplacer(ol.format.GML.readLineStringSegment_)}}; +ol.format.GML.RING_PARSERS_ = {"http://www.opengis.net/gml":{"LinearRing":ol.xml.makeReplacer(ol.format.GML.readFlatLinearRing_)}}; +ol.format.GML.prototype.readGeometryFromNode = function(node) { + var geometry = ol.format.GML.readGeometry_(node, [{}]); + return goog.isDef(geometry) ? geometry : null +}; +ol.format.GML.prototype.readFeaturesFromNode = function(node) { + var objectStack = [{"featureType":this.featureType_, "featureNS":this.featureNS_}]; + return ol.format.GML.readFeatures_(node, objectStack) +}; +ol.format.GML.writePos_ = function(node, value, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, "srsName"); + var axisOrientation = "enu"; + if(goog.isDefAndNotNull(srsName)) { + axisOrientation = ol.proj.get(srsName).getAxisOrientation() + } + var point = value.getCoordinates(); + var coords; + if(axisOrientation.substr(0, 2) === "en") { + coords = point[0] + " " + point[1] + }else { + coords = point[1] + " " + point[0] + } + ol.format.XSD.writeStringTextNode(node, coords) +}; +ol.format.GML.getCoords_ = function(point, opt_srsName) { + var axisOrientation = "enu"; + if(goog.isDefAndNotNull(opt_srsName)) { + axisOrientation = ol.proj.get(opt_srsName).getAxisOrientation() + } + return axisOrientation.substr(0, 2) === "en" ? point[0] + " " + point[1] : point[1] + " " + point[0] +}; +ol.format.GML.writePosList_ = function(node, value, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, "srsName"); + var points = value.getCoordinates(); + var len = points.length; + var parts = new Array(len); + var point; + for(var i = 0;i < len;++i) { + point = points[i]; + parts[i] = ol.format.GML.getCoords_(point, srsName) + } + ol.format.XSD.writeStringTextNode(node, parts.join(" ")) +}; +ol.format.GML.writePoint_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, "srsName"); + if(goog.isDefAndNotNull(srsName)) { + node.setAttribute("srsName", srsName) + } + var pos = ol.xml.createElementNS(node.namespaceURI, "pos"); + node.appendChild(pos); + ol.format.GML.writePos_(pos, geometry, objectStack) +}; +ol.format.GML.writeLinearRing_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, "srsName"); + if(goog.isDefAndNotNull(srsName)) { + node.setAttribute("srsName", srsName) + } + var posList = ol.xml.createElementNS(node.namespaceURI, "posList"); + node.appendChild(posList); + ol.format.GML.writePosList_(posList, geometry, objectStack) +}; +ol.format.GML.RING_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { + var context = objectStack[objectStack.length - 1]; + var parentNode = context.node; + goog.asserts.assert(goog.isObject(context)); + var exteriorWritten = goog.object.get(context, "exteriorWritten"); + if(!goog.isDef(exteriorWritten)) { + goog.object.set(context, "exteriorWritten", true) + } + return ol.xml.createElementNS(parentNode.namespaceURI, goog.isDef(exteriorWritten) ? "interior" : "exterior") +}; +ol.format.GML.writeSurfaceOrPolygon_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, "srsName"); + if(node.nodeName !== "PolygonPatch" && goog.isDefAndNotNull(srsName)) { + node.setAttribute("srsName", srsName) + } + if(node.nodeName === "Polygon" || node.nodeName === "PolygonPatch") { + var rings = geometry.getLinearRings(); + ol.xml.pushSerializeAndPop({node:node, srsName:srsName}, ol.format.GML.RING_SERIALIZERS_, ol.format.GML.RING_NODE_FACTORY_, rings, objectStack) + }else { + if(node.nodeName === "Surface") { + var patches = ol.xml.createElementNS(node.namespaceURI, "patches"); + node.appendChild(patches); + ol.format.GML.writeSurfacePatches_(patches, geometry, objectStack) + } + } +}; +ol.format.GML.writeCurveOrLineString_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, "srsName"); + if(node.nodeName !== "LineStringSegment" && goog.isDefAndNotNull(srsName)) { + node.setAttribute("srsName", srsName) + } + if(node.nodeName === "LineString" || node.nodeName === "LineStringSegment") { + var posList = ol.xml.createElementNS(node.namespaceURI, "posList"); + node.appendChild(posList); + ol.format.GML.writePosList_(posList, geometry, objectStack) + }else { + if(node.nodeName === "Curve") { + var segments = ol.xml.createElementNS(node.namespaceURI, "segments"); + node.appendChild(segments); + ol.format.GML.writeCurveSegments_(segments, geometry, objectStack) + } + } +}; +ol.format.GML.writeMultiSurfaceOrPolygon_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, "srsName"); + var surface = goog.object.get(context, "surface"); + if(goog.isDefAndNotNull(srsName)) { + node.setAttribute("srsName", srsName) + } + var polygons = geometry.getPolygons(); + ol.xml.pushSerializeAndPop({node:node, srsName:srsName, surface:surface}, ol.format.GML.SURFACEORPOLYGONMEMBER_SERIALIZERS_, ol.format.GML.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, polygons, objectStack) +}; +ol.format.GML.writeMultiPoint_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, "srsName"); + if(goog.isDefAndNotNull(srsName)) { + node.setAttribute("srsName", srsName) + } + var points = geometry.getPoints(); + ol.xml.pushSerializeAndPop({node:node, srsName:srsName}, ol.format.GML.POINTMEMBER_SERIALIZERS_, ol.xml.makeSimpleNodeFactory("pointMember"), points, objectStack) +}; +ol.format.GML.writeMultiCurveOrLineString_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, "srsName"); + var curve = goog.object.get(context, "curve"); + if(goog.isDefAndNotNull(srsName)) { + node.setAttribute("srsName", srsName) + } + var lines = geometry.getLineStrings(); + ol.xml.pushSerializeAndPop({node:node, srsName:srsName, curve:curve}, ol.format.GML.LINESTRINGORCURVEMEMBER_SERIALIZERS_, ol.format.GML.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, lines, objectStack) +}; +ol.format.GML.writeRing_ = function(node, ring, objectStack) { + var linearRing = ol.xml.createElementNS(node.namespaceURI, "LinearRing"); + node.appendChild(linearRing); + ol.format.GML.writeLinearRing_(linearRing, ring, objectStack) +}; +ol.format.GML.writeSurfaceOrPolygonMember_ = function(node, polygon, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var child = ol.format.GML.GEOMETRY_NODE_FACTORY_(polygon, objectStack); + if(goog.isDef(child)) { + node.appendChild(child); + ol.format.GML.writeSurfaceOrPolygon_(child, polygon, objectStack) + } +}; +ol.format.GML.writePointMember_ = function(node, point, objectStack) { + var child = ol.xml.createElementNS(node.namespaceURI, "Point"); + node.appendChild(child); + ol.format.GML.writePoint_(child, point, objectStack) +}; +ol.format.GML.writeLineStringOrCurveMember_ = function(node, line, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var child = ol.format.GML.GEOMETRY_NODE_FACTORY_(line, objectStack); + if(goog.isDef(child)) { + node.appendChild(child); + ol.format.GML.writeCurveOrLineString_(child, line, objectStack) + } +}; +ol.format.GML.writeSurfacePatches_ = function(node, polygon, objectStack) { + var child = ol.xml.createElementNS(node.namespaceURI, "PolygonPatch"); + node.appendChild(child); + ol.format.GML.writeSurfaceOrPolygon_(child, polygon, objectStack) +}; +ol.format.GML.writeCurveSegments_ = function(node, line, objectStack) { + var child = ol.xml.createElementNS(node.namespaceURI, "LineStringSegment"); + node.appendChild(child); + ol.format.GML.writeCurveOrLineString_(child, line, objectStack) +}; +ol.format.GML.writeGeometry_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var item = goog.object.clone(context); + item.node = node; + ol.xml.pushSerializeAndPop((item), ol.format.GML.GEOMETRY_SERIALIZERS_, ol.format.GML.GEOMETRY_NODE_FACTORY_, [geometry], objectStack) +}; +ol.format.GML.writeFeature_ = function(node, feature, objectStack) { + var fid = feature.getId(); + if(goog.isDef(fid)) { + node.setAttribute("fid", fid) + } + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var featureNS = goog.object.get(context, "featureNS"); + var geometryName = feature.getGeometryName(); + if(!goog.isDef(context.serializers)) { + context.serializers = {}; + context.serializers[featureNS] = {} + } + var properties = feature.getProperties(); + var keys = [], values = []; + for(var key in properties) { + keys.push(key); + values.push(properties[key]); + if(key == geometryName) { + if(!(key in context.serializers[featureNS])) { + context.serializers[featureNS][key] = ol.xml.makeChildAppender(ol.format.GML.writeGeometry_) + } + }else { + if(!(key in context.serializers[featureNS])) { + context.serializers[featureNS][key] = ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode) + } + } + } + var item = goog.object.clone(context); + item.node = node; + ol.xml.pushSerializeAndPop((item), context.serializers, ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, keys) +}; +ol.format.GML.writeFeatureMembers_ = function(node, features, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var featureType = goog.object.get(context, "featureType"); + var featureNS = goog.object.get(context, "featureNS"); + var serializers = {}; + serializers[featureNS] = {}; + serializers[featureNS][featureType] = ol.xml.makeChildAppender(ol.format.GML.writeFeature_); + var item = goog.object.clone(context); + item.node = node; + ol.xml.pushSerializeAndPop((item), serializers, ol.xml.makeSimpleNodeFactory(featureType, featureNS), features, objectStack) +}; +ol.format.GML.SURFACEORPOLYGONMEMBER_SERIALIZERS_ = {"http://www.opengis.net/gml":{"surfaceMember":ol.xml.makeChildAppender(ol.format.GML.writeSurfaceOrPolygonMember_), "polygonMember":ol.xml.makeChildAppender(ol.format.GML.writeSurfaceOrPolygonMember_)}}; +ol.format.GML.POINTMEMBER_SERIALIZERS_ = {"http://www.opengis.net/gml":{"pointMember":ol.xml.makeChildAppender(ol.format.GML.writePointMember_)}}; +ol.format.GML.LINESTRINGORCURVEMEMBER_SERIALIZERS_ = {"http://www.opengis.net/gml":{"lineStringMember":ol.xml.makeChildAppender(ol.format.GML.writeLineStringOrCurveMember_), "curveMember":ol.xml.makeChildAppender(ol.format.GML.writeLineStringOrCurveMember_)}}; +ol.format.GML.RING_SERIALIZERS_ = {"http://www.opengis.net/gml":{"exterior":ol.xml.makeChildAppender(ol.format.GML.writeRing_), "interior":ol.xml.makeChildAppender(ol.format.GML.writeRing_)}}; +ol.format.GML.GEOMETRY_SERIALIZERS_ = {"http://www.opengis.net/gml":{"Curve":ol.xml.makeChildAppender(ol.format.GML.writeCurveOrLineString_), "MultiCurve":ol.xml.makeChildAppender(ol.format.GML.writeMultiCurveOrLineString_), "Point":ol.xml.makeChildAppender(ol.format.GML.writePoint_), "MultiPoint":ol.xml.makeChildAppender(ol.format.GML.writeMultiPoint_), "LineString":ol.xml.makeChildAppender(ol.format.GML.writeCurveOrLineString_), "MultiLineString":ol.xml.makeChildAppender(ol.format.GML.writeMultiCurveOrLineString_), +"LinearRing":ol.xml.makeChildAppender(ol.format.GML.writeLinearRing_), "Polygon":ol.xml.makeChildAppender(ol.format.GML.writeSurfaceOrPolygon_), "MultiPolygon":ol.xml.makeChildAppender(ol.format.GML.writeMultiSurfaceOrPolygon_), "Surface":ol.xml.makeChildAppender(ol.format.GML.writeSurfaceOrPolygon_), "MultiSurface":ol.xml.makeChildAppender(ol.format.GML.writeMultiSurfaceOrPolygon_)}}; +ol.format.GML.MULTIGEOMETRY_TO_MEMBER_NODENAME_ = {"MultiLineString":"lineStringMember", "MultiCurve":"curveMember", "MultiPolygon":"polygonMember", "MultiSurface":"surfaceMember"}; +ol.format.GML.MULTIGEOMETRY_MEMBER_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { + var parentNode = objectStack[objectStack.length - 1].node; + goog.asserts.assert(ol.xml.isNode(parentNode)); + return ol.xml.createElementNS("http://www.opengis.net/gml", ol.format.GML.MULTIGEOMETRY_TO_MEMBER_NODENAME_[parentNode.nodeName]) +}; +ol.format.GML.GEOMETRY_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var multiSurface = goog.object.get(context, "multiSurface"); + var surface = goog.object.get(context, "surface"); + var curve = goog.object.get(context, "curve"); + var multiCurve = goog.object.get(context, "multiCurve"); + goog.asserts.assertInstanceof(value, ol.geom.Geometry); + var parentNode = objectStack[objectStack.length - 1].node; + goog.asserts.assert(ol.xml.isNode(parentNode)); + var nodeName = value.getType(); + if(nodeName === "MultiPolygon" && multiSurface === true) { + nodeName = "MultiSurface" + }else { + if(nodeName === "Polygon" && surface === true) { + nodeName = "Surface" + }else { + if(nodeName === "LineString" && curve === true) { + nodeName = "Curve" + }else { + if(nodeName === "MultiLineString" && multiCurve === true) { + nodeName = "MultiCurve" + } + } + } + } + return ol.xml.createElementNS("http://www.opengis.net/gml", nodeName) +}; +ol.format.GML.prototype.writeGeometryNode = function(geometry) { + var geom = ol.xml.createElementNS("http://www.opengis.net/gml", "geom"); + var context = {node:geom, srsName:this.srsName_, curve:this.curve_, surface:this.surface_, multiSurface:this.multiSurface_, multiCurve:this.multiCurve_}; + ol.xml.pushSerializeAndPop((context), ol.format.GML.GEOMETRY_SERIALIZERS_, ol.format.GML.GEOMETRY_NODE_FACTORY_, [geometry], []); + return geom +}; +ol.format.GML.prototype.writeFeaturesNode = function(features) { + var node = ol.xml.createElementNS("http://www.opengis.net/gml", "featureMembers"); + ol.xml.setAttributeNS(node, "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation", this.schemaLocation_); + var context = {srsName:this.srsName_, curve:this.curve_, surface:this.surface_, multiSurface:this.multiSurface_, multiCurve:this.multiCurve_, featureNS:this.featureNS_, featureType:this.featureType_}; + ol.format.GML.writeFeatureMembers_(node, features, [context]); + return node +}; +goog.provide("ol.format.GPX"); +goog.provide("ol.format.GPX.V1_1"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom.NodeType"); +goog.require("goog.object"); +goog.require("ol.Feature"); +goog.require("ol.format.XMLFeature"); +goog.require("ol.format.XSD"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.MultiLineString"); +goog.require("ol.geom.Point"); +goog.require("ol.proj"); +goog.require("ol.xml"); +ol.format.GPX = function() { + goog.base(this) +}; +goog.inherits(ol.format.GPX, ol.format.XMLFeature); +ol.format.GPX.NAMESPACE_URIS_ = [null, "http://www.topografix.com/GPX/1/0", "http://www.topografix.com/GPX/1/1"]; +ol.format.GPX.appendCoordinate_ = function(flatCoordinates, node, values) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + flatCoordinates.push(parseFloat(node.getAttribute("lon")), parseFloat(node.getAttribute("lat"))); + if(goog.object.containsKey(values, "ele")) { + flatCoordinates.push((goog.object.get(values, "ele"))); + goog.object.remove(values, "ele") + }else { + flatCoordinates.push(0) + } + if(goog.object.containsKey(values, "time")) { + flatCoordinates.push((goog.object.get(values, "time"))); + goog.object.remove(values, "time") + }else { + flatCoordinates.push(0) + } + return flatCoordinates +}; +ol.format.GPX.parseLink_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "link"); + var values = (objectStack[objectStack.length - 1]); + var href = node.getAttribute("href"); + if(!goog.isNull(href)) { + goog.object.set(values, "link", href) + } + ol.xml.parse(ol.format.GPX.LINK_PARSERS_, node, objectStack) +}; +ol.format.GPX.parseRtePt_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "rtept"); + var values = ol.xml.pushParseAndPop({}, ol.format.GPX.RTEPT_PARSERS_, node, objectStack); + if(goog.isDef(values)) { + var rteValues = (objectStack[objectStack.length - 1]); + var flatCoordinates = (goog.object.get(rteValues, "flatCoordinates")); + ol.format.GPX.appendCoordinate_(flatCoordinates, node, values) + } +}; +ol.format.GPX.parseTrkPt_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "trkpt"); + var values = ol.xml.pushParseAndPop({}, ol.format.GPX.TRKPT_PARSERS_, node, objectStack); + if(goog.isDef(values)) { + var trkValues = (objectStack[objectStack.length - 1]); + var flatCoordinates = (goog.object.get(trkValues, "flatCoordinates")); + ol.format.GPX.appendCoordinate_(flatCoordinates, node, values) + } +}; +ol.format.GPX.parseTrkSeg_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "trkseg"); + var values = (objectStack[objectStack.length - 1]); + ol.xml.parse(ol.format.GPX.TRKSEG_PARSERS_, node, objectStack); + var flatCoordinates = (goog.object.get(values, "flatCoordinates")); + var ends = (goog.object.get(values, "ends")); + ends.push(flatCoordinates.length) +}; +ol.format.GPX.readRte_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "rte"); + var values = ol.xml.pushParseAndPop({"flatCoordinates":[]}, ol.format.GPX.RTE_PARSERS_, node, objectStack); + if(!goog.isDef(values)) { + return undefined + } + var flatCoordinates = (goog.object.get(values, "flatCoordinates")); + goog.object.remove(values, "flatCoordinates"); + var geometry = new ol.geom.LineString(null); + geometry.setFlatCoordinates(ol.geom.GeometryLayout.XYZM, flatCoordinates); + var feature = new ol.Feature(geometry); + feature.setValues(values); + return feature +}; +ol.format.GPX.readTrk_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "trk"); + var values = ol.xml.pushParseAndPop({"flatCoordinates":[], "ends":[]}, ol.format.GPX.TRK_PARSERS_, node, objectStack); + if(!goog.isDef(values)) { + return undefined + } + var flatCoordinates = (goog.object.get(values, "flatCoordinates")); + goog.object.remove(values, "flatCoordinates"); + var ends = (goog.object.get(values, "ends")); + goog.object.remove(values, "ends"); + var geometry = new ol.geom.MultiLineString(null); + geometry.setFlatCoordinates(ol.geom.GeometryLayout.XYZM, flatCoordinates, ends); + var feature = new ol.Feature(geometry); + feature.setValues(values); + return feature +}; +ol.format.GPX.readWpt_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "wpt"); + var values = ol.xml.pushParseAndPop({}, ol.format.GPX.WPT_PARSERS_, node, objectStack); + if(!goog.isDef(values)) { + return undefined + } + var coordinates = ol.format.GPX.appendCoordinate_([], node, values); + var geometry = new ol.geom.Point(coordinates, ol.geom.GeometryLayout.XYZM); + var feature = new ol.Feature(geometry); + feature.setValues(values); + return feature +}; +ol.format.GPX.FEATURE_READER_ = {"rte":ol.format.GPX.readRte_, "trk":ol.format.GPX.readTrk_, "wpt":ol.format.GPX.readWpt_}; +ol.format.GPX.GPX_PARSERS_ = ol.xml.makeParsersNS(ol.format.GPX.NAMESPACE_URIS_, {"rte":ol.xml.makeArrayPusher(ol.format.GPX.readRte_), "trk":ol.xml.makeArrayPusher(ol.format.GPX.readTrk_), "wpt":ol.xml.makeArrayPusher(ol.format.GPX.readWpt_)}); +ol.format.GPX.LINK_PARSERS_ = ol.xml.makeParsersNS(ol.format.GPX.NAMESPACE_URIS_, {"text":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString, "linkText"), "type":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString, "linkType")}); +ol.format.GPX.RTE_PARSERS_ = ol.xml.makeParsersNS(ol.format.GPX.NAMESPACE_URIS_, {"name":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "cmt":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "desc":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "src":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "link":ol.format.GPX.parseLink_, "number":ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger), "type":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), +"rtept":ol.format.GPX.parseRtePt_}); +ol.format.GPX.RTEPT_PARSERS_ = ol.xml.makeParsersNS(ol.format.GPX.NAMESPACE_URIS_, {"ele":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), "time":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime)}); +ol.format.GPX.TRK_PARSERS_ = ol.xml.makeParsersNS(ol.format.GPX.NAMESPACE_URIS_, {"name":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "cmt":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "desc":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "src":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "link":ol.format.GPX.parseLink_, "number":ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger), "type":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), +"trkseg":ol.format.GPX.parseTrkSeg_}); +ol.format.GPX.TRKSEG_PARSERS_ = ol.xml.makeParsersNS(ol.format.GPX.NAMESPACE_URIS_, {"trkpt":ol.format.GPX.parseTrkPt_}); +ol.format.GPX.TRKPT_PARSERS_ = ol.xml.makeParsersNS(ol.format.GPX.NAMESPACE_URIS_, {"ele":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), "time":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime)}); +ol.format.GPX.WPT_PARSERS_ = ol.xml.makeParsersNS(ol.format.GPX.NAMESPACE_URIS_, {"ele":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), "time":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime), "magvar":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), "geoidheight":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), "name":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "cmt":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "desc":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), +"src":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "link":ol.format.GPX.parseLink_, "sym":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "type":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "fix":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "sat":ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger), "hdop":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), "vdop":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), +"pdop":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), "ageofdgpsdata":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), "dgpsid":ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger)}); +ol.format.GPX.prototype.readFeatureFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if(goog.array.indexOf(ol.format.GPX.NAMESPACE_URIS_, node.namespaceURI) == -1) { + return null + } + var featureReader = ol.format.GPX.FEATURE_READER_[node.localName]; + if(!goog.isDef(featureReader)) { + return null + } + var feature = featureReader(node, []); + if(!goog.isDef(feature)) { + return null + } + return feature +}; +ol.format.GPX.prototype.readFeaturesFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if(goog.array.indexOf(ol.format.GPX.NAMESPACE_URIS_, node.namespaceURI) == -1) { + return[] + } + if(node.localName == "gpx") { + var features = ol.xml.pushParseAndPop(([]), ol.format.GPX.GPX_PARSERS_, node, []); + if(goog.isDef(features)) { + return features + }else { + return[] + } + } + return[] +}; +ol.format.GPX.prototype.readProjectionFromDocument = function(doc) { + return ol.proj.get("EPSG:4326") +}; +ol.format.GPX.prototype.readProjectionFromNode = function(node) { + return ol.proj.get("EPSG:4326") +}; +ol.format.GPX.writeLink_ = function(node, value, objectStack) { + node.setAttribute("href", value); + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var properties = goog.object.get(context, "properties"); + var link = [goog.object.get(properties, "linkText"), goog.object.get(properties, "linkType")]; + ol.xml.pushSerializeAndPop(({node:node}), ol.format.GPX.LINK_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY, link, objectStack, ol.format.GPX.LINK_SEQUENCE_) +}; +ol.format.GPX.writeWptType_ = function(node, coordinate, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var parentNode = context.node; + goog.asserts.assert(ol.xml.isNode(parentNode)); + var namespaceURI = parentNode.namespaceURI; + var properties = goog.object.get(context, "properties"); + ol.xml.setAttributeNS(node, null, "lat", coordinate[1]); + ol.xml.setAttributeNS(node, null, "lon", coordinate[0]); + var geometryLayout = goog.object.get(context, "geometryLayout"); + switch(geometryLayout) { + case ol.geom.GeometryLayout.XYZM: + if(coordinate[3] !== 0) { + goog.object.set(properties, "time", coordinate[3]) + } + ; + case ol.geom.GeometryLayout.XYZ: + if(coordinate[2] !== 0) { + goog.object.set(properties, "ele", coordinate[2]) + } + break; + case ol.geom.GeometryLayout.XYM: + if(coordinate[2] !== 0) { + goog.object.set(properties, "time", coordinate[2]) + } + } + var orderedKeys = ol.format.GPX.WPT_TYPE_SEQUENCE_[namespaceURI]; + var values = ol.xml.makeSequence(properties, orderedKeys); + ol.xml.pushSerializeAndPop(({node:node, "properties":properties}), ol.format.GPX.WPT_TYPE_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, orderedKeys) +}; +ol.format.GPX.writeRte_ = function(node, feature, objectStack) { + var properties = feature.getProperties(); + var context = {node:node, "properties":properties}; + var geometry = feature.getGeometry(); + if(goog.isDef(geometry)) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + goog.object.set(context, "geometryLayout", geometry.getLayout()); + goog.object.set(properties, "rtept", geometry.getCoordinates()) + } + var parentNode = objectStack[objectStack.length - 1].node; + var orderedKeys = ol.format.GPX.RTE_SEQUENCE_[parentNode.namespaceURI]; + var values = ol.xml.makeSequence(properties, orderedKeys); + ol.xml.pushSerializeAndPop((context), ol.format.GPX.RTE_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, orderedKeys) +}; +ol.format.GPX.writeTrk_ = function(node, feature, objectStack) { + var properties = feature.getProperties(); + var context = {node:node, "properties":properties}; + var geometry = feature.getGeometry(); + if(goog.isDef(geometry)) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString); + goog.object.set(properties, "trkseg", geometry.getLineStrings()) + } + var parentNode = objectStack[objectStack.length - 1].node; + var orderedKeys = ol.format.GPX.TRK_SEQUENCE_[parentNode.namespaceURI]; + var values = ol.xml.makeSequence(properties, orderedKeys); + ol.xml.pushSerializeAndPop((context), ol.format.GPX.TRK_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, orderedKeys) +}; +ol.format.GPX.writeTrkSeg_ = function(node, lineString, objectStack) { + var context = {node:node, "geometryLayout":lineString.getLayout(), "properties":{}}; + ol.xml.pushSerializeAndPop((context), ol.format.GPX.TRKSEG_SERIALIZERS_, ol.format.GPX.TRKSEG_NODE_FACTORY_, lineString.getCoordinates(), objectStack) +}; +ol.format.GPX.writeWpt_ = function(node, feature, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + goog.object.set(context, "properties", feature.getProperties()); + var geometry = feature.getGeometry(); + if(goog.isDef(geometry)) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + goog.object.set(context, "geometryLayout", geometry.getLayout()); + ol.format.GPX.writeWptType_(node, geometry.getCoordinates(), objectStack) + } +}; +ol.format.GPX.LINK_SEQUENCE_ = ["text", "type"]; +ol.format.GPX.LINK_SERIALIZERS_ = ol.xml.makeStructureNS(ol.format.GPX.NAMESPACE_URIS_, {"text":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "type":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode)}); +ol.format.GPX.RTE_SEQUENCE_ = ol.xml.makeStructureNS(ol.format.GPX.NAMESPACE_URIS_, ["name", "cmt", "desc", "src", "link", "number", "type", "rtept"]); +ol.format.GPX.RTE_SERIALIZERS_ = ol.xml.makeStructureNS(ol.format.GPX.NAMESPACE_URIS_, {"name":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "cmt":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "desc":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "src":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "link":ol.xml.makeChildAppender(ol.format.GPX.writeLink_), "number":ol.xml.makeChildAppender(ol.format.XSD.writeNonNegativeIntegerTextNode), "type":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), +"rtept":ol.xml.makeArraySerializer(ol.xml.makeChildAppender(ol.format.GPX.writeWptType_))}); +ol.format.GPX.TRK_SEQUENCE_ = ol.xml.makeStructureNS(ol.format.GPX.NAMESPACE_URIS_, ["name", "cmt", "desc", "src", "link", "number", "type", "trkseg"]); +ol.format.GPX.TRK_SERIALIZERS_ = ol.xml.makeStructureNS(ol.format.GPX.NAMESPACE_URIS_, {"name":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "cmt":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "desc":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "src":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "link":ol.xml.makeChildAppender(ol.format.GPX.writeLink_), "number":ol.xml.makeChildAppender(ol.format.XSD.writeNonNegativeIntegerTextNode), "type":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), +"trkseg":ol.xml.makeArraySerializer(ol.xml.makeChildAppender(ol.format.GPX.writeTrkSeg_))}); +ol.format.GPX.TRKSEG_NODE_FACTORY_ = ol.xml.makeSimpleNodeFactory("trkpt"); +ol.format.GPX.TRKSEG_SERIALIZERS_ = ol.xml.makeStructureNS(ol.format.GPX.NAMESPACE_URIS_, {"trkpt":ol.xml.makeChildAppender(ol.format.GPX.writeWptType_)}); +ol.format.GPX.WPT_TYPE_SEQUENCE_ = ol.xml.makeStructureNS(ol.format.GPX.NAMESPACE_URIS_, ["ele", "time", "magvar", "geoidheight", "name", "cmt", "desc", "src", "link", "sym", "type", "fix", "sat", "hdop", "vdop", "pdop", "ageofdgpsdata", "dgpsid"]); +ol.format.GPX.WPT_TYPE_SERIALIZERS_ = ol.xml.makeStructureNS(ol.format.GPX.NAMESPACE_URIS_, {"ele":ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), "time":ol.xml.makeChildAppender(ol.format.XSD.writeDateTimeTextNode), "magvar":ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), "geoidheight":ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), "name":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "cmt":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), +"desc":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "src":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "link":ol.xml.makeChildAppender(ol.format.GPX.writeLink_), "sym":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "type":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "fix":ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), "sat":ol.xml.makeChildAppender(ol.format.XSD.writeNonNegativeIntegerTextNode), "hdop":ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), +"vdop":ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), "pdop":ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), "ageofdgpsdata":ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), "dgpsid":ol.xml.makeChildAppender(ol.format.XSD.writeNonNegativeIntegerTextNode)}); +ol.format.GPX.GEOMETRY_TYPE_TO_NODENAME_ = {"Point":"wpt", "LineString":"rte", "MultiLineString":"trk"}; +ol.format.GPX.GPX_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { + goog.asserts.assertInstanceof(value, ol.Feature); + var geometry = value.getGeometry(); + if(goog.isDef(geometry)) { + var parentNode = objectStack[objectStack.length - 1].node; + goog.asserts.assert(ol.xml.isNode(parentNode)); + return ol.xml.createElementNS(parentNode.namespaceURI, ol.format.GPX.GEOMETRY_TYPE_TO_NODENAME_[geometry.getType()]) + } +}; +ol.format.GPX.GPX_SERIALIZERS_ = ol.xml.makeStructureNS(ol.format.GPX.NAMESPACE_URIS_, {"rte":ol.xml.makeChildAppender(ol.format.GPX.writeRte_), "trk":ol.xml.makeChildAppender(ol.format.GPX.writeTrk_), "wpt":ol.xml.makeChildAppender(ol.format.GPX.writeWpt_)}); +ol.format.GPX.V1_1 = function() { + goog.base(this) +}; +goog.inherits(ol.format.GPX.V1_1, ol.format.GPX); +ol.format.GPX.V1_1.prototype.writeFeaturesNode = function(features) { + var gpx = ol.xml.createElementNS("http://www.topografix.com/GPX/1/1", "gpx"); + ol.xml.pushSerializeAndPop(({node:gpx}), ol.format.GPX.GPX_SERIALIZERS_, ol.format.GPX.GPX_NODE_FACTORY_, features, []); + return gpx +}; +goog.provide("goog.json"); +goog.provide("goog.json.Serializer"); +goog.json.isValid_ = function(s) { + if(/^\s*$/.test(s)) { + return false + } + var backslashesRe = /\\["\\\/bfnrtu]/g; + var simpleValuesRe = /"[^"\\\n\r\u2028\u2029\x00-\x08\x0a-\x1f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; + var openBracketsRe = /(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g; + var remainderRe = /^[\],:{}\s\u2028\u2029]*$/; + return remainderRe.test(s.replace(backslashesRe, "@").replace(simpleValuesRe, "]").replace(openBracketsRe, "")) +}; +goog.json.parse = function(s) { + var o = String(s); + if(goog.json.isValid_(o)) { + try { + return(eval("(" + o + ")")) + }catch(ex) { + } + } + throw Error("Invalid JSON string: " + o); +}; +goog.json.unsafeParse = function(s) { + return(eval("(" + s + ")")) +}; +goog.json.Replacer; +goog.json.Reviver; +goog.json.serialize = function(object, opt_replacer) { + return(new goog.json.Serializer(opt_replacer)).serialize(object) +}; +goog.json.Serializer = function(opt_replacer) { + this.replacer_ = opt_replacer +}; +goog.json.Serializer.prototype.serialize = function(object) { + var sb = []; + this.serialize_(object, sb); + return sb.join("") +}; +goog.json.Serializer.prototype.serialize_ = function(object, sb) { + switch(typeof object) { + case "string": + this.serializeString_((object), sb); + break; + case "number": + this.serializeNumber_((object), sb); + break; + case "boolean": + sb.push(object); + break; + case "undefined": + sb.push("null"); + break; + case "object": + if(object == null) { + sb.push("null"); + break + } + if(goog.isArray(object)) { + this.serializeArray((object), sb); + break + } + this.serializeObject_((object), sb); + break; + case "function": + break; + default: + throw Error("Unknown type: " + typeof object); + } +}; +goog.json.Serializer.charToJsonCharCache_ = {'"':'\\"', "\\":"\\\\", "/":"\\/", "\b":"\\b", "\f":"\\f", "\n":"\\n", "\r":"\\r", "\t":"\\t", "\x0B":"\\u000b"}; +goog.json.Serializer.charsToReplace_ = /\uffff/.test("\uffff") ? /[\\\"\x00-\x1f\x7f-\uffff]/g : /[\\\"\x00-\x1f\x7f-\xff]/g; +goog.json.Serializer.prototype.serializeString_ = function(s, sb) { + sb.push('"', s.replace(goog.json.Serializer.charsToReplace_, function(c) { + if(c in goog.json.Serializer.charToJsonCharCache_) { + return goog.json.Serializer.charToJsonCharCache_[c] + } + var cc = c.charCodeAt(0); + var rv = "\\u"; + if(cc < 16) { + rv += "000" + }else { + if(cc < 256) { + rv += "00" + }else { + if(cc < 4096) { + rv += "0" + } + } + } + return goog.json.Serializer.charToJsonCharCache_[c] = rv + cc.toString(16) + }), '"') +}; +goog.json.Serializer.prototype.serializeNumber_ = function(n, sb) { + sb.push(isFinite(n) && !isNaN(n) ? n : "null") +}; +goog.json.Serializer.prototype.serializeArray = function(arr, sb) { + var l = arr.length; + sb.push("["); + var sep = ""; + for(var i = 0;i < l;i++) { + sb.push(sep); + var value = arr[i]; + this.serialize_(this.replacer_ ? this.replacer_.call(arr, String(i), value) : value, sb); + sep = "," + } + sb.push("]") +}; +goog.json.Serializer.prototype.serializeObject_ = function(obj, sb) { + sb.push("{"); + var sep = ""; + for(var key in obj) { + if(Object.prototype.hasOwnProperty.call(obj, key)) { + var value = obj[key]; + if(typeof value != "function") { + sb.push(sep); + this.serializeString_(key, sb); + sb.push(":"); + this.serialize_(this.replacer_ ? this.replacer_.call(obj, key, value) : value, sb); + sep = "," + } + } + } + sb.push("}") +}; +goog.provide("ol.format.JSONFeature"); +goog.require("goog.asserts"); +goog.require("goog.json"); +goog.require("ol.format.Feature"); +goog.require("ol.format.FormatType"); +ol.format.JSONFeature = function() { + goog.base(this) +}; +goog.inherits(ol.format.JSONFeature, ol.format.Feature); +ol.format.JSONFeature.prototype.getObject_ = function(source) { + if(goog.isObject(source)) { + return source + }else { + if(goog.isString(source)) { + var object = goog.json.parse(source); + return goog.isDef(object) ? object : null + }else { + goog.asserts.fail(); + return null + } + } +}; +ol.format.JSONFeature.prototype.getType = function() { + return ol.format.FormatType.JSON +}; +ol.format.JSONFeature.prototype.readFeature = function(source) { + return this.readFeatureFromObject(this.getObject_(source)) +}; +ol.format.JSONFeature.prototype.readFeatures = function(source) { + return this.readFeaturesFromObject(this.getObject_(source)) +}; +ol.format.JSONFeature.prototype.readFeatureFromObject = goog.abstractMethod; +ol.format.JSONFeature.prototype.readFeaturesFromObject = goog.abstractMethod; +ol.format.JSONFeature.prototype.readGeometry = function(source) { + return this.readGeometryFromObject(this.getObject_(source)) +}; +ol.format.JSONFeature.prototype.readGeometryFromObject = goog.abstractMethod; +ol.format.JSONFeature.prototype.readProjection = function(source) { + return this.readProjectionFromObject(this.getObject_(source)) +}; +ol.format.JSONFeature.prototype.readProjectionFromObject = goog.abstractMethod; +ol.format.JSONFeature.prototype.writeFeature = function(feature) { + return this.writeFeatureObject(feature) +}; +ol.format.JSONFeature.prototype.writeFeatureObject = goog.abstractMethod; +ol.format.JSONFeature.prototype.writeFeatures = function(features) { + return this.writeFeaturesObject(features) +}; +ol.format.JSONFeature.prototype.writeFeaturesObject = goog.abstractMethod; +ol.format.JSONFeature.prototype.writeGeometry = function(geometry) { + return this.writeGeometryObject(geometry) +}; +ol.format.JSONFeature.prototype.writeGeometryObject = goog.abstractMethod; +goog.provide("ol.format.GeoJSON"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.object"); +goog.require("ol.Feature"); +goog.require("ol.format.JSONFeature"); +goog.require("ol.geom.GeometryCollection"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.MultiLineString"); +goog.require("ol.geom.MultiPoint"); +goog.require("ol.geom.MultiPolygon"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.Polygon"); +goog.require("ol.proj"); +ol.format.GeoJSON = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + this.defaultProjection_ = ol.proj.get(options.defaultProjection ? options.defaultProjection : "EPSG:4326") +}; +goog.inherits(ol.format.GeoJSON, ol.format.JSONFeature); +ol.format.GeoJSON.EXTENSIONS_ = [".geojson"]; +ol.format.GeoJSON.readGeometry_ = function(object) { + if(goog.isNull(object)) { + return null + } + var geometryReader = ol.format.GeoJSON.GEOMETRY_READERS_[object.type]; + goog.asserts.assert(goog.isDef(geometryReader)); + return geometryReader(object) +}; +ol.format.GeoJSON.readGeometryCollectionGeometry_ = function(object) { + goog.asserts.assert(object.type == "GeometryCollection"); + var geometries = goog.array.map(object.geometries, ol.format.GeoJSON.readGeometry_); + return new ol.geom.GeometryCollection(geometries) +}; +ol.format.GeoJSON.readPointGeometry_ = function(object) { + goog.asserts.assert(object.type == "Point"); + return new ol.geom.Point(object.coordinates) +}; +ol.format.GeoJSON.readLineStringGeometry_ = function(object) { + goog.asserts.assert(object.type == "LineString"); + return new ol.geom.LineString(object.coordinates) +}; +ol.format.GeoJSON.readMultiLineStringGeometry_ = function(object) { + goog.asserts.assert(object.type == "MultiLineString"); + return new ol.geom.MultiLineString(object.coordinates) +}; +ol.format.GeoJSON.readMultiPointGeometry_ = function(object) { + goog.asserts.assert(object.type == "MultiPoint"); + return new ol.geom.MultiPoint(object.coordinates) +}; +ol.format.GeoJSON.readMultiPolygonGeometry_ = function(object) { + goog.asserts.assert(object.type == "MultiPolygon"); + return new ol.geom.MultiPolygon(object.coordinates) +}; +ol.format.GeoJSON.readPolygonGeometry_ = function(object) { + goog.asserts.assert(object.type == "Polygon"); + return new ol.geom.Polygon(object.coordinates) +}; +ol.format.GeoJSON.writeGeometry_ = function(geometry) { + var geometryWriter = ol.format.GeoJSON.GEOMETRY_WRITERS_[geometry.getType()]; + goog.asserts.assert(goog.isDef(geometryWriter)); + return geometryWriter(geometry) +}; +ol.format.GeoJSON.writeEmptyGeometryCollectionGeometry_ = function(geometry) { + return({"type":"GeometryCollection", "geometries":[]}) +}; +ol.format.GeoJSON.writeGeometryCollectionGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.GeometryCollection); + var geometries = goog.array.map(geometry.getGeometriesArray(), ol.format.GeoJSON.writeGeometry_); + return({"type":"GeometryCollection", "geometries":geometries}) +}; +ol.format.GeoJSON.writeLineStringGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + return({"type":"LineString", "coordinates":geometry.getCoordinates()}) +}; +ol.format.GeoJSON.writeMultiLineStringGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString); + goog.asserts.assert(geometry.getType() == ol.geom.GeometryType.MULTI_LINE_STRING); + return({"type":"MultiLineString", "coordinates":geometry.getCoordinates()}) +}; +ol.format.GeoJSON.writeMultiPointGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPoint); + return({"type":"MultiPoint", "coordinates":geometry.getCoordinates()}) +}; +ol.format.GeoJSON.writeMultiPolygonGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon); + return({"type":"MultiPolygon", "coordinates":geometry.getCoordinates()}) +}; +ol.format.GeoJSON.writePointGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + return({"type":"Point", "coordinates":geometry.getCoordinates()}) +}; +ol.format.GeoJSON.writePolygonGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + return({"type":"Polygon", "coordinates":geometry.getCoordinates()}) +}; +ol.format.GeoJSON.GEOMETRY_READERS_ = {"Point":ol.format.GeoJSON.readPointGeometry_, "LineString":ol.format.GeoJSON.readLineStringGeometry_, "Polygon":ol.format.GeoJSON.readPolygonGeometry_, "MultiPoint":ol.format.GeoJSON.readMultiPointGeometry_, "MultiLineString":ol.format.GeoJSON.readMultiLineStringGeometry_, "MultiPolygon":ol.format.GeoJSON.readMultiPolygonGeometry_, "GeometryCollection":ol.format.GeoJSON.readGeometryCollectionGeometry_}; +ol.format.GeoJSON.GEOMETRY_WRITERS_ = {"Point":ol.format.GeoJSON.writePointGeometry_, "LineString":ol.format.GeoJSON.writeLineStringGeometry_, "Polygon":ol.format.GeoJSON.writePolygonGeometry_, "MultiPoint":ol.format.GeoJSON.writeMultiPointGeometry_, "MultiLineString":ol.format.GeoJSON.writeMultiLineStringGeometry_, "MultiPolygon":ol.format.GeoJSON.writeMultiPolygonGeometry_, "GeometryCollection":ol.format.GeoJSON.writeGeometryCollectionGeometry_, "Circle":ol.format.GeoJSON.writeEmptyGeometryCollectionGeometry_}; +ol.format.GeoJSON.prototype.getExtensions = function() { + return ol.format.GeoJSON.EXTENSIONS_ +}; +ol.format.GeoJSON.prototype.readFeatureFromObject = function(object) { + var geoJSONFeature = (object); + goog.asserts.assert(geoJSONFeature.type == "Feature"); + var geometry = ol.format.GeoJSON.readGeometry_(geoJSONFeature.geometry); + var feature = new ol.Feature(geometry); + if(goog.isDef(geoJSONFeature.id)) { + feature.setId(geoJSONFeature.id) + } + if(goog.isDef(geoJSONFeature.properties)) { + feature.setValues(geoJSONFeature.properties) + } + return feature +}; +ol.format.GeoJSON.prototype.readFeaturesFromObject = function(object) { + var geoJSONObject = (object); + if(geoJSONObject.type == "Feature") { + return[this.readFeatureFromObject(object)] + }else { + if(geoJSONObject.type == "FeatureCollection") { + var geoJSONFeatureCollection = (object); + var features = []; + var geoJSONFeatures = geoJSONFeatureCollection.features; + var i, ii; + for(i = 0, ii = geoJSONFeatures.length;i < ii;++i) { + features.push(this.readFeatureFromObject(geoJSONFeatures[i])) + } + return features + }else { + goog.asserts.fail(); + return[] + } + } +}; +ol.format.GeoJSON.prototype.readGeometryFromObject = function(object) { + return ol.format.GeoJSON.readGeometry_((object)) +}; +ol.format.GeoJSON.prototype.readProjection = function(object) { + var geoJSONObject = (object); + var crs = geoJSONObject.crs; + if(goog.isDefAndNotNull(crs)) { + if(crs.type == "name") { + return ol.proj.get(crs.properties.name) + }else { + if(crs.type == "EPSG") { + return ol.proj.get("EPSG:" + crs.properties.code) + }else { + goog.asserts.fail(); + return null + } + } + }else { + return this.defaultProjection_ + } +}; +ol.format.GeoJSON.prototype.writeFeatureObject = function(feature) { + var object = {"type":"Feature"}; + var id = feature.getId(); + if(goog.isDefAndNotNull(id)) { + goog.object.set(object, "id", id) + } + var geometry = feature.getGeometry(); + if(goog.isDefAndNotNull(geometry)) { + goog.object.set(object, "geometry", ol.format.GeoJSON.writeGeometry_(geometry)) + } + var properties = feature.getProperties(); + goog.object.remove(properties, "geometry"); + if(!goog.object.isEmpty(properties)) { + goog.object.set(object, "properties", properties) + } + return object +}; +ol.format.GeoJSON.prototype.writeFeaturesObject = function(features) { + var objects = []; + var i, ii; + for(i = 0, ii = features.length;i < ii;++i) { + objects.push(this.writeFeatureObject(features[i])) + } + return({"type":"FeatureCollection", "features":objects}) +}; +ol.format.GeoJSON.prototype.writeGeometryObject = ol.format.GeoJSON.writeGeometry_; +goog.provide("goog.string.newlines"); +goog.provide("goog.string.newlines.Line"); +goog.require("goog.array"); +goog.string.newlines.splitLines = function(str, opt_keepNewlines) { + var lines = goog.string.newlines.getLines(str); + return goog.array.map(lines, function(line) { + return opt_keepNewlines ? line.getFullLine() : line.getContent() + }) +}; +goog.string.newlines.Line = function(string, startLineIndex, endContentIndex, endLineIndex) { + this.string = string; + this.startLineIndex = startLineIndex; + this.endContentIndex = endContentIndex; + this.endLineIndex = endLineIndex +}; +goog.string.newlines.Line.prototype.getContent = function() { + return this.string.substring(this.startLineIndex, this.endContentIndex) +}; +goog.string.newlines.Line.prototype.getFullLine = function() { + return this.string.substring(this.startLineIndex, this.endLineIndex) +}; +goog.string.newlines.Line.prototype.getNewline = function() { + return this.string.substring(this.endContentIndex, this.endLineIndex) +}; +goog.string.newlines.getLines = function(str) { + var re = RegExp("\r\n|\r|\n", "g"); + var sliceIndex = 0; + var result; + var lines = []; + while(result = re.exec(str)) { + var line = new goog.string.newlines.Line(str, sliceIndex, result.index, result.index + result[0].length); + lines.push(line); + sliceIndex = re.lastIndex + } + if(sliceIndex < str.length) { + var line = new goog.string.newlines.Line(str, sliceIndex, str.length, str.length); + lines.push(line) + } + return lines +}; +goog.provide("ol.format.TextFeature"); +goog.require("goog.asserts"); +goog.require("ol.format.Feature"); +goog.require("ol.format.FormatType"); +ol.format.TextFeature = function() { + goog.base(this) +}; +goog.inherits(ol.format.TextFeature, ol.format.Feature); +ol.format.TextFeature.prototype.getText_ = function(source) { + if(goog.isString(source)) { + return source + }else { + goog.asserts.fail(); + return"" + } +}; +ol.format.TextFeature.prototype.getType = function() { + return ol.format.FormatType.TEXT +}; +ol.format.TextFeature.prototype.readFeature = function(source) { + return this.readFeatureFromText(this.getText_(source)) +}; +ol.format.TextFeature.prototype.readFeatureFromText = goog.abstractMethod; +ol.format.TextFeature.prototype.readFeatures = function(source) { + return this.readFeaturesFromText(this.getText_(source)) +}; +ol.format.TextFeature.prototype.readFeaturesFromText = goog.abstractMethod; +ol.format.TextFeature.prototype.readGeometry = function(source) { + return this.readGeometryFromText(this.getText_(source)) +}; +ol.format.TextFeature.prototype.readGeometryFromText = goog.abstractMethod; +ol.format.TextFeature.prototype.readProjection = function(source) { + return this.readProjectionFromText(this.getText_(source)) +}; +ol.format.TextFeature.prototype.readProjectionFromText = goog.abstractMethod; +ol.format.TextFeature.prototype.writeFeature = function(feature) { + return this.writeFeatureText(feature) +}; +ol.format.TextFeature.prototype.writeFeatureText = goog.abstractMethod; +ol.format.TextFeature.prototype.writeFeatures = function(features) { + return this.writeFeaturesText(features) +}; +ol.format.TextFeature.prototype.writeFeaturesText = goog.abstractMethod; +ol.format.TextFeature.prototype.writeGeometry = function(geometry) { + return this.writeGeometryText(geometry) +}; +ol.format.TextFeature.prototype.writeGeometryText = goog.abstractMethod; +goog.provide("ol.format.IGC"); +goog.provide("ol.format.IGCZ"); +goog.require("goog.asserts"); +goog.require("goog.string"); +goog.require("goog.string.newlines"); +goog.require("ol.Feature"); +goog.require("ol.format.TextFeature"); +goog.require("ol.geom.LineString"); +goog.require("ol.proj"); +ol.format.IGCZ = {BAROMETRIC:"barometric", GPS:"gps", NONE:"none"}; +ol.format.IGC = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + this.altitudeMode_ = goog.isDef(options.altitudeMode) ? options.altitudeMode : ol.format.IGCZ.NONE +}; +goog.inherits(ol.format.IGC, ol.format.TextFeature); +ol.format.IGC.EXTENSIONS_ = [".igc"]; +ol.format.IGC.B_RECORD_RE_ = /^B(\d{2})(\d{2})(\d{2})(\d{2})(\d{5})([NS])(\d{3})(\d{5})([EW])([AV])(\d{5})(\d{5})/; +ol.format.IGC.H_RECORD_RE_ = /^H.([A-Z]{3}).*?:(.*)/; +ol.format.IGC.HFDTE_RECORD_RE_ = /^HFDTE(\d{2})(\d{2})(\d{2})/; +ol.format.IGC.prototype.getExtensions = function() { + return ol.format.IGC.EXTENSIONS_ +}; +ol.format.IGC.prototype.readFeatureFromText = function(text) { + var altitudeMode = this.altitudeMode_; + var lines = goog.string.newlines.splitLines(text); + var properties = {}; + var flatCoordinates = []; + var year = 2E3; + var month = 0; + var day = 1; + var i, ii; + for(i = 0, ii = lines.length;i < ii;++i) { + var line = lines[i]; + var m; + if(line.charAt(0) == "B") { + m = ol.format.IGC.B_RECORD_RE_.exec(line); + if(m) { + var hour = parseInt(m[1], 10); + var minute = parseInt(m[2], 10); + var second = parseInt(m[3], 10); + var y = parseInt(m[4], 10) + parseInt(m[5], 10) / 6E4; + if(m[6] == "S") { + y = -y + } + var x = parseInt(m[7], 10) + parseInt(m[8], 10) / 6E4; + if(m[9] == "W") { + x = -x + } + flatCoordinates.push(x, y); + if(altitudeMode != ol.format.IGCZ.NONE) { + var z; + if(altitudeMode == ol.format.IGCZ.GPS) { + z = parseInt(m[11], 10) + }else { + if(altitudeMode == ol.format.IGCZ.BAROMETRIC) { + z = parseInt(m[12], 10) + }else { + goog.asserts.fail(); + z = 0 + } + } + flatCoordinates.push(z) + } + var dateTime = Date.UTC(year, month, day, hour, minute, second); + flatCoordinates.push(dateTime / 1E3) + } + }else { + if(line.charAt(0) == "H") { + m = ol.format.IGC.HFDTE_RECORD_RE_.exec(line); + if(m) { + day = parseInt(m[1], 10); + month = parseInt(m[2], 10) - 1; + year = 2E3 + parseInt(m[3], 10) + }else { + m = ol.format.IGC.H_RECORD_RE_.exec(line); + if(m) { + properties[m[1]] = goog.string.trim(m[2]); + m = ol.format.IGC.HFDTE_RECORD_RE_.exec(line) + } + } + } + } + } + var lineString = new ol.geom.LineString(null); + var layout = altitudeMode == ol.format.IGCZ.NONE ? ol.geom.GeometryLayout.XYM : ol.geom.GeometryLayout.XYZM; + lineString.setFlatCoordinates(layout, flatCoordinates); + var feature = new ol.Feature(lineString); + feature.setValues(properties); + return feature +}; +ol.format.IGC.prototype.readFeaturesFromText = function(text) { + var feature = this.readFeatureFromText(text); + if(!goog.isNull(feature)) { + return[feature] + }else { + return[] + } +}; +ol.format.IGC.prototype.readProjectionFromText = function(text) { + return ol.proj.get("EPSG:4326") +}; +goog.provide("ol.format.KML"); +goog.require("goog.Uri"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom.NodeType"); +goog.require("goog.math"); +goog.require("goog.object"); +goog.require("goog.string"); +goog.require("ol.Feature"); +goog.require("ol.feature"); +goog.require("ol.format.XMLFeature"); +goog.require("ol.format.XSD"); +goog.require("ol.geom.GeometryCollection"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.MultiLineString"); +goog.require("ol.geom.MultiPoint"); +goog.require("ol.geom.MultiPolygon"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.Polygon"); +goog.require("ol.proj"); +goog.require("ol.style.Fill"); +goog.require("ol.style.Icon"); +goog.require("ol.style.IconAnchorOrigin"); +goog.require("ol.style.IconAnchorUnits"); +goog.require("ol.style.Image"); +goog.require("ol.style.Stroke"); +goog.require("ol.style.Style"); +goog.require("ol.xml"); +ol.format.KMLVec2_; +ol.format.KMLGxTrackObject_; +ol.format.KML = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + var defaultStyle = goog.isDef(options.defaultStyle) ? options.defaultStyle : ol.format.KML.DEFAULT_STYLE_ARRAY_; + var sharedStyles = {}; + var findStyle = function(styleValue) { + if(goog.isArray(styleValue)) { + return styleValue + }else { + if(goog.isString(styleValue)) { + if(!(styleValue in sharedStyles) && "#" + styleValue in sharedStyles) { + styleValue = "#" + styleValue + } + return findStyle(sharedStyles[styleValue]) + }else { + return defaultStyle + } + } + }; + this.sharedStyles_ = sharedStyles; + this.featureStyleFunction_ = function(resolution) { + var style = (this.get("Style")); + if(goog.isDef(style)) { + return style + } + var styleUrl = (this.get("styleUrl")); + if(goog.isDef(styleUrl)) { + return findStyle(styleUrl) + } + return defaultStyle + } +}; +goog.inherits(ol.format.KML, ol.format.XMLFeature); +ol.format.KML.EXTENSIONS_ = [".kml"]; +ol.format.KML.GX_NAMESPACE_URIS_ = ["http://www.google.com/kml/ext/2.2"]; +ol.format.KML.NAMESPACE_URIS_ = [null, "http://earth.google.com/kml/2.0", "http://earth.google.com/kml/2.1", "http://earth.google.com/kml/2.2", "http://www.opengis.net/kml/2.2"]; +ol.format.KML.DEFAULT_COLOR_ = [255, 255, 255, 1]; +ol.format.KML.DEFAULT_FILL_STYLE_ = new ol.style.Fill({color:ol.format.KML.DEFAULT_COLOR_}); +ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_ = [2, 20]; +ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_ = ol.style.IconAnchorUnits.PIXELS; +ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_Y_UNITS_ = ol.style.IconAnchorUnits.PIXELS; +ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_ = [32, 32]; +ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_ = "https://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png"; +ol.format.KML.DEFAULT_IMAGE_STYLE_ = new ol.style.Icon({anchor:ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_, anchorXUnits:ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_, anchorYUnits:ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_Y_UNITS_, crossOrigin:"anonymous", rotation:0, scale:1, size:ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_, src:ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_}); +ol.format.KML.DEFAULT_STROKE_STYLE_ = new ol.style.Stroke({color:ol.format.KML.DEFAULT_COLOR_, width:1}); +ol.format.KML.DEFAULT_STYLE_ = new ol.style.Style({fill:ol.format.KML.DEFAULT_FILL_STYLE_, image:ol.format.KML.DEFAULT_IMAGE_STYLE_, text:null, stroke:ol.format.KML.DEFAULT_STROKE_STYLE_, zIndex:0}); +ol.format.KML.DEFAULT_STYLE_ARRAY_ = [ol.format.KML.DEFAULT_STYLE_]; +ol.format.KML.ICON_ANCHOR_UNITS_MAP_ = {"fraction":ol.style.IconAnchorUnits.FRACTION, "pixels":ol.style.IconAnchorUnits.PIXELS}; +ol.format.KML.readColor_ = function(node) { + var s = ol.xml.getAllTextContent(node, false); + var m = /^\s*#?\s*([0-9A-Fa-f]{8})\s*$/.exec(s); + if(m) { + var hexColor = m[1]; + return[parseInt(hexColor.substr(6, 2), 16), parseInt(hexColor.substr(4, 2), 16), parseInt(hexColor.substr(2, 2), 16), parseInt(hexColor.substr(0, 2), 16) / 255] + }else { + return undefined + } +}; +ol.format.KML.readFlatCoordinates_ = function(node) { + var s = ol.xml.getAllTextContent(node, false); + var flatCoordinates = []; + var re = /^\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)\s*,\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)(?:\s*,\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?))?\s*/i; + var m; + while(m = re.exec(s)) { + var x = parseFloat(m[1]); + var y = parseFloat(m[2]); + var z = m[3] ? parseFloat(m[3]) : 0; + flatCoordinates.push(x, y, z); + s = s.substr(m[0].length) + } + if(s !== "") { + return undefined + } + return flatCoordinates +}; +ol.format.KML.readStyleUrl_ = function(node) { + var s = goog.string.trim(ol.xml.getAllTextContent(node, false)); + if(goog.isDefAndNotNull(node.baseURI)) { + return goog.Uri.resolve(node.baseURI, s).toString() + }else { + return s + } +}; +ol.format.KML.readURI_ = function(node) { + var s = ol.xml.getAllTextContent(node, false); + if(goog.isDefAndNotNull(node.baseURI)) { + return goog.Uri.resolve(node.baseURI, goog.string.trim(s)).toString() + }else { + return goog.string.trim(s) + } +}; +ol.format.KML.readVec2_ = function(node) { + var xunits = node.getAttribute("xunits"); + var yunits = node.getAttribute("yunits"); + return{x:parseFloat(node.getAttribute("x")), xunits:ol.format.KML.ICON_ANCHOR_UNITS_MAP_[xunits], y:parseFloat(node.getAttribute("y")), yunits:ol.format.KML.ICON_ANCHOR_UNITS_MAP_[yunits]} +}; +ol.format.KML.readScale_ = function(node) { + var number = ol.format.XSD.readDecimal(node); + if(goog.isDef(number)) { + return Math.sqrt(number) + }else { + return undefined + } +}; +ol.format.KML.readStyleMapValue_ = function(node, objectStack) { + return ol.xml.pushParseAndPop((undefined), ol.format.KML.STYLE_MAP_PARSERS_, node, objectStack) +}; +ol.format.KML.IconStyleParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "IconStyle"); + var object = ol.xml.pushParseAndPop({}, ol.format.KML.ICON_STYLE_PARSERS_, node, objectStack); + if(!goog.isDef(object)) { + return + } + var styleObject = (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isObject(styleObject)); + var IconObject = (goog.object.get(object, "Icon", {})); + var src; + var href = (goog.object.get(IconObject, "href")); + if(goog.isDef(href)) { + src = href + }else { + src = ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_ + } + var anchor, anchorXUnits, anchorYUnits; + var hotSpot = (goog.object.get(object, "hotSpot")); + if(goog.isDef(hotSpot)) { + anchor = [hotSpot.x, hotSpot.y]; + anchorXUnits = hotSpot.xunits; + anchorYUnits = hotSpot.yunits + }else { + if(src === ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_) { + anchor = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_; + anchorXUnits = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_; + anchorYUnits = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_Y_UNITS_ + }else { + if(/^http:\/\/maps\.(?:google|gstatic)\.com\//.test(src)) { + anchor = [0.5, 1]; + anchorXUnits = ol.style.IconAnchorUnits.FRACTION; + anchorYUnits = ol.style.IconAnchorUnits.FRACTION + } + } + } + var rotation; + var heading = (goog.object.get(object, "heading")); + if(goog.isDef(heading)) { + rotation = goog.math.toRadians(heading) + } + var scale = (goog.object.get(object, "scale")); + var size; + if(src == ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_) { + size = ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_ + } + var imageStyle = new ol.style.Icon({anchor:anchor, anchorOrigin:ol.style.IconAnchorOrigin.TOP_LEFT, anchorXUnits:anchorXUnits, anchorYUnits:anchorYUnits, crossOrigin:"anonymous", rotation:rotation, scale:scale, size:size, src:src}); + goog.object.set(styleObject, "imageStyle", imageStyle) +}; +ol.format.KML.LineStyleParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "LineStyle"); + var object = ol.xml.pushParseAndPop({}, ol.format.KML.LINE_STYLE_PARSERS_, node, objectStack); + if(!goog.isDef(object)) { + return + } + var styleObject = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(styleObject)); + var strokeStyle = new ol.style.Stroke({color:(goog.object.get(object, "color", ol.format.KML.DEFAULT_COLOR_)), width:(goog.object.get(object, "width", 1))}); + goog.object.set(styleObject, "strokeStyle", strokeStyle) +}; +ol.format.KML.PolyStyleParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "PolyStyle"); + var object = ol.xml.pushParseAndPop({}, ol.format.KML.POLY_STYLE_PARSERS_, node, objectStack); + if(!goog.isDef(object)) { + return + } + var styleObject = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(styleObject)); + var fillStyle = new ol.style.Fill({color:(goog.object.get(object, "color", ol.format.KML.DEFAULT_COLOR_))}); + goog.object.set(styleObject, "fillStyle", fillStyle); + var fill = (goog.object.get(object, "fill")); + if(goog.isDef(fill)) { + goog.object.set(styleObject, "fill", fill) + } + var outline = (goog.object.get(object, "outline")); + if(goog.isDef(outline)) { + goog.object.set(styleObject, "outline", outline) + } +}; +ol.format.KML.readFlatLinearRing_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "LinearRing"); + return(ol.xml.pushParseAndPop(null, ol.format.KML.FLAT_LINEAR_RING_PARSERS_, node, objectStack)) +}; +ol.format.KML.gxCoordParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(goog.array.indexOf(ol.format.KML.GX_NAMESPACE_URIS_, node.namespaceURI) != -1); + goog.asserts.assert(node.localName == "coord"); + var gxTrackObject = (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isObject(gxTrackObject)); + var flatCoordinates = gxTrackObject.flatCoordinates; + var s = ol.xml.getAllTextContent(node, false); + var re = /^\s*([+\-]?\d+(?:\.\d*)?(?:e[+\-]?\d*)?)\s+([+\-]?\d+(?:\.\d*)?(?:e[+\-]?\d*)?)\s+([+\-]?\d+(?:\.\d*)?(?:e[+\-]?\d*)?)\s*$/i; + var m = re.exec(s); + if(m) { + var x = parseFloat(m[1]); + var y = parseFloat(m[2]); + var z = parseFloat(m[3]); + flatCoordinates.push(x, y, z, 0) + }else { + flatCoordinates.push(0, 0, 0, 0) + } +}; +ol.format.KML.readGxMultiTrack_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(goog.array.indexOf(ol.format.KML.GX_NAMESPACE_URIS_, node.namespaceURI) != -1); + goog.asserts.assert(node.localName == "MultiTrack"); + var lineStrings = ol.xml.pushParseAndPop(([]), ol.format.KML.GX_MULTITRACK_GEOMETRY_PARSERS_, node, objectStack); + if(!goog.isDef(lineStrings)) { + return undefined + } + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setLineStrings(lineStrings); + return multiLineString +}; +ol.format.KML.readGxTrack_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(goog.array.indexOf(ol.format.KML.GX_NAMESPACE_URIS_, node.namespaceURI) != -1); + goog.asserts.assert(node.localName == "Track"); + var gxTrackObject = ol.xml.pushParseAndPop(({flatCoordinates:[], whens:[]}), ol.format.KML.GX_TRACK_PARSERS_, node, objectStack); + if(!goog.isDef(gxTrackObject)) { + return undefined + } + var flatCoordinates = gxTrackObject.flatCoordinates; + var whens = gxTrackObject.whens; + goog.asserts.assert(flatCoordinates.length / 4 == whens.length); + var i, ii; + for(i = 0, ii = Math.min(flatCoordinates.length, whens.length);i < ii;++i) { + flatCoordinates[4 * i + 3] = whens[i] + } + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZM, flatCoordinates); + return lineString +}; +ol.format.KML.readIcon_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Icon"); + var iconObject = ol.xml.pushParseAndPop({}, ol.format.KML.ICON_PARSERS_, node, objectStack); + if(goog.isDef(iconObject)) { + return iconObject + }else { + return null + } +}; +ol.format.KML.readFlatCoordinatesFromNode_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + return(ol.xml.pushParseAndPop(null, ol.format.KML.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack)) +}; +ol.format.KML.readLineString_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "LineString"); + var flatCoordinates = ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack); + if(goog.isDef(flatCoordinates)) { + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return lineString + }else { + return undefined + } +}; +ol.format.KML.readLinearRing_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "LinearRing"); + var flatCoordinates = ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack); + if(goog.isDef(flatCoordinates)) { + var polygon = new ol.geom.Polygon(null); + polygon.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates, [flatCoordinates.length]); + return polygon + }else { + return undefined + } +}; +ol.format.KML.readMultiGeometry_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "MultiGeometry"); + var geometries = ol.xml.pushParseAndPop(([]), ol.format.KML.MULTI_GEOMETRY_PARSERS_, node, objectStack); + if(!goog.isDef(geometries)) { + return null + } + if(geometries.length === 0) { + return new ol.geom.GeometryCollection(geometries) + } + var homogeneous = true; + var type = geometries[0].getType(); + var geometry, i, ii; + for(i = 1, ii = geometries.length;i < ii;++i) { + geometry = geometries[i]; + if(geometry.getType() != type) { + homogeneous = false; + break + } + } + if(homogeneous) { + var layout; + var flatCoordinates; + if(type == ol.geom.GeometryType.POINT) { + var point = geometries[0]; + goog.asserts.assertInstanceof(point, ol.geom.Point); + layout = point.getLayout(); + flatCoordinates = point.getFlatCoordinates(); + for(i = 1, ii = geometries.length;i < ii;++i) { + geometry = geometries[i]; + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + goog.asserts.assert(geometry.getLayout() == layout); + goog.array.extend(flatCoordinates, geometry.getFlatCoordinates()) + } + var multiPoint = new ol.geom.MultiPoint(null); + multiPoint.setFlatCoordinates(layout, flatCoordinates); + return multiPoint + }else { + if(type == ol.geom.GeometryType.LINE_STRING) { + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setLineStrings(geometries); + return multiLineString + }else { + if(type == ol.geom.GeometryType.POLYGON) { + var multiPolygon = new ol.geom.MultiPolygon(null); + multiPolygon.setPolygons(geometries); + return multiPolygon + }else { + if(type == ol.geom.GeometryType.GEOMETRY_COLLECTION) { + return new ol.geom.GeometryCollection(geometries) + }else { + goog.asserts.fail(); + return null + } + } + } + } + }else { + return new ol.geom.GeometryCollection(geometries) + } +}; +ol.format.KML.readPoint_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Point"); + var flatCoordinates = ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack); + if(goog.isDefAndNotNull(flatCoordinates)) { + var point = new ol.geom.Point(null); + goog.asserts.assert(flatCoordinates.length == 3); + point.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return point + }else { + return undefined + } +}; +ol.format.KML.readPolygon_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Polygon"); + var flatLinearRings = ol.xml.pushParseAndPop(([null]), ol.format.KML.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack); + if(goog.isDefAndNotNull(flatLinearRings) && !goog.isNull(flatLinearRings[0])) { + var polygon = new ol.geom.Polygon(null); + var flatCoordinates = flatLinearRings[0]; + var ends = [flatCoordinates.length]; + var i, ii; + for(i = 1, ii = flatLinearRings.length;i < ii;++i) { + goog.array.extend(flatCoordinates, flatLinearRings[i]); + ends.push(flatCoordinates.length) + } + polygon.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates, ends); + return polygon + }else { + return undefined + } +}; +ol.format.KML.readStyle_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Style"); + var styleObject = ol.xml.pushParseAndPop({}, ol.format.KML.STYLE_PARSERS_, node, objectStack); + if(!goog.isDef(styleObject)) { + return null + } + var fillStyle = (goog.object.get(styleObject, "fillStyle", ol.format.KML.DEFAULT_FILL_STYLE_)); + var fill = (goog.object.get(styleObject, "fill")); + if(goog.isDef(fill) && !fill) { + fillStyle = null + } + var imageStyle = (goog.object.get(styleObject, "imageStyle", ol.format.KML.DEFAULT_IMAGE_STYLE_)); + var strokeStyle = (goog.object.get(styleObject, "strokeStyle", ol.format.KML.DEFAULT_STROKE_STYLE_)); + var outline = (goog.object.get(styleObject, "outline")); + if(goog.isDef(outline) && !outline) { + strokeStyle = null + } + return[new ol.style.Style({fill:fillStyle, image:imageStyle, stroke:strokeStyle, text:null, zIndex:undefined})] +}; +ol.format.KML.DataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Data"); + var name = node.getAttribute("name"); + if(!goog.isNull(name)) { + var data = ol.xml.pushParseAndPop(undefined, ol.format.KML.DATA_PARSERS_, node, objectStack); + if(goog.isDef(data)) { + var featureObject = (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isObject(featureObject)); + goog.object.set(featureObject, name, data) + } + } +}; +ol.format.KML.ExtendedDataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "ExtendedData"); + ol.xml.parse(ol.format.KML.EXTENDED_DATA_PARSERS_, node, objectStack) +}; +ol.format.KML.PairDataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Pair"); + var pairObject = ol.xml.pushParseAndPop({}, ol.format.KML.PAIR_PARSERS_, node, objectStack); + if(!goog.isDef(pairObject)) { + return + } + var key = (goog.object.get(pairObject, "key")); + if(goog.isDef(key) && key == "normal") { + var styleUrl = (goog.object.get(pairObject, "styleUrl")); + if(goog.isDef(styleUrl)) { + objectStack[objectStack.length - 1] = styleUrl + } + var Style = (goog.object.get(pairObject, "Style")); + if(goog.isDef(Style)) { + objectStack[objectStack.length - 1] = Style + } + } +}; +ol.format.KML.PlacemarkStyleMapParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "StyleMap"); + var styleMapValue = ol.format.KML.readStyleMapValue_(node, objectStack); + if(!goog.isDef(styleMapValue)) { + return + } + var placemarkObject = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(placemarkObject)); + if(goog.isArray(styleMapValue)) { + goog.object.set(placemarkObject, "Style", styleMapValue) + }else { + if(goog.isString(styleMapValue)) { + goog.object.set(placemarkObject, "styleUrl", styleMapValue) + }else { + goog.asserts.fail() + } + } +}; +ol.format.KML.SchemaDataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "SchemaData"); + ol.xml.parse(ol.format.KML.SCHEMA_DATA_PARSERS_, node, objectStack) +}; +ol.format.KML.SimpleDataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "SimpleData"); + var name = node.getAttribute("name"); + if(!goog.isNull(name)) { + var data = ol.format.XSD.readString(node); + var featureObject = (objectStack[objectStack.length - 1]); + goog.object.set(featureObject, name, data) + } +}; +ol.format.KML.innerBoundaryIsParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "innerBoundaryIs"); + var flatLinearRing = ol.xml.pushParseAndPop((undefined), ol.format.KML.INNER_BOUNDARY_IS_PARSERS_, node, objectStack); + if(goog.isDef(flatLinearRing)) { + var flatLinearRings = (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(flatLinearRings)); + goog.asserts.assert(flatLinearRings.length > 0); + flatLinearRings.push(flatLinearRing) + } +}; +ol.format.KML.outerBoundaryIsParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "outerBoundaryIs"); + var flatLinearRing = ol.xml.pushParseAndPop((undefined), ol.format.KML.OUTER_BOUNDARY_IS_PARSERS_, node, objectStack); + if(goog.isDef(flatLinearRing)) { + var flatLinearRings = (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(flatLinearRings)); + goog.asserts.assert(flatLinearRings.length > 0); + flatLinearRings[0] = flatLinearRing + } +}; +ol.format.KML.whenParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "when"); + var gxTrackObject = (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isObject(gxTrackObject)); + var whens = gxTrackObject.whens; + var s = ol.xml.getAllTextContent(node, false); + var re = /^\s*(\d{4})($|-(\d{2})($|-(\d{2})($|T(\d{2}):(\d{2}):(\d{2})(Z|(?:([+\-])(\d{2})(?::(\d{2}))?)))))\s*$/; + var m = re.exec(s); + if(m) { + var year = parseInt(m[1], 10); + var month = goog.isDef(m[3]) ? parseInt(m[3], 10) - 1 : 0; + var day = goog.isDef(m[5]) ? parseInt(m[5], 10) : 1; + var hour = goog.isDef(m[7]) ? parseInt(m[7], 10) : 0; + var minute = goog.isDef(m[8]) ? parseInt(m[8], 10) : 0; + var second = goog.isDef(m[9]) ? parseInt(m[9], 10) : 0; + var when = Date.UTC(year, month, day, hour, minute, second); + if(goog.isDef(m[10]) && m[10] != "Z") { + var sign = m[11] == "-" ? -1 : 1; + when += sign * 60 * parseInt(m[12], 10); + if(goog.isDef(m[13])) { + when += sign * 60 * 60 * parseInt(m[13], 10) + } + } + whens.push(when) + }else { + whens.push(0) + } +}; +ol.format.KML.DATA_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"value":ol.xml.makeReplacer(ol.format.XSD.readString)}); +ol.format.KML.EXTENDED_DATA_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"Data":ol.format.KML.DataParser_, "SchemaData":ol.format.KML.SchemaDataParser_}); +ol.format.KML.FLAT_LINEAR_RING_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"coordinates":ol.xml.makeReplacer(ol.format.KML.readFlatCoordinates_)}); +ol.format.KML.FLAT_LINEAR_RINGS_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"innerBoundaryIs":ol.format.KML.innerBoundaryIsParser_, "outerBoundaryIs":ol.format.KML.outerBoundaryIsParser_}); +ol.format.KML.GX_TRACK_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"when":ol.format.KML.whenParser_}, ol.xml.makeParsersNS(ol.format.KML.GX_NAMESPACE_URIS_, {"coord":ol.format.KML.gxCoordParser_})); +ol.format.KML.GEOMETRY_FLAT_COORDINATES_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"coordinates":ol.xml.makeReplacer(ol.format.KML.readFlatCoordinates_)}); +ol.format.KML.ICON_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"href":ol.xml.makeObjectPropertySetter(ol.format.KML.readURI_)}); +ol.format.KML.ICON_STYLE_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"Icon":ol.xml.makeObjectPropertySetter(ol.format.KML.readIcon_), "heading":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), "hotSpot":ol.xml.makeObjectPropertySetter(ol.format.KML.readVec2_), "scale":ol.xml.makeObjectPropertySetter(ol.format.KML.readScale_)}); +ol.format.KML.INNER_BOUNDARY_IS_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"LinearRing":ol.xml.makeReplacer(ol.format.KML.readFlatLinearRing_)}); +ol.format.KML.LINE_STYLE_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"color":ol.xml.makeObjectPropertySetter(ol.format.KML.readColor_), "width":ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal)}); +ol.format.KML.MULTI_GEOMETRY_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"LineString":ol.xml.makeArrayPusher(ol.format.KML.readLineString_), "LinearRing":ol.xml.makeArrayPusher(ol.format.KML.readLinearRing_), "MultiGeometry":ol.xml.makeArrayPusher(ol.format.KML.readMultiGeometry_), "Point":ol.xml.makeArrayPusher(ol.format.KML.readPoint_), "Polygon":ol.xml.makeArrayPusher(ol.format.KML.readPolygon_)}); +ol.format.KML.GX_MULTITRACK_GEOMETRY_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.GX_NAMESPACE_URIS_, {"Track":ol.xml.makeArrayPusher(ol.format.KML.readGxTrack_)}); +ol.format.KML.OUTER_BOUNDARY_IS_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"LinearRing":ol.xml.makeReplacer(ol.format.KML.readFlatLinearRing_)}); +ol.format.KML.PAIR_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"Style":ol.xml.makeObjectPropertySetter(ol.format.KML.readStyle_), "key":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "styleUrl":ol.xml.makeObjectPropertySetter(ol.format.KML.readStyleUrl_)}); +ol.format.KML.PLACEMARK_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"ExtendedData":ol.format.KML.ExtendedDataParser_, "MultiGeometry":ol.xml.makeObjectPropertySetter(ol.format.KML.readMultiGeometry_, "geometry"), "LineString":ol.xml.makeObjectPropertySetter(ol.format.KML.readLineString_, "geometry"), "LinearRing":ol.xml.makeObjectPropertySetter(ol.format.KML.readLinearRing_, "geometry"), "Point":ol.xml.makeObjectPropertySetter(ol.format.KML.readPoint_, "geometry"), "Polygon":ol.xml.makeObjectPropertySetter(ol.format.KML.readPolygon_, +"geometry"), "Style":ol.xml.makeObjectPropertySetter(ol.format.KML.readStyle_), "StyleMap":ol.format.KML.PlacemarkStyleMapParser_, "address":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "description":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "name":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "open":ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean), "phoneNumber":ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), "styleUrl":ol.xml.makeObjectPropertySetter(ol.format.KML.readURI_), +"visibility":ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean)}, ol.xml.makeParsersNS(ol.format.KML.GX_NAMESPACE_URIS_, {"MultiTrack":ol.xml.makeObjectPropertySetter(ol.format.KML.readGxMultiTrack_, "geometry"), "Track":ol.xml.makeObjectPropertySetter(ol.format.KML.readGxTrack_, "geometry")})); +ol.format.KML.POLY_STYLE_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"color":ol.xml.makeObjectPropertySetter(ol.format.KML.readColor_), "fill":ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean), "outline":ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean)}); +ol.format.KML.SCHEMA_DATA_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"SimpleData":ol.format.KML.SimpleDataParser_}); +ol.format.KML.STYLE_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"IconStyle":ol.format.KML.IconStyleParser_, "LineStyle":ol.format.KML.LineStyleParser_, "PolyStyle":ol.format.KML.PolyStyleParser_}); +ol.format.KML.STYLE_MAP_PARSERS_ = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"Pair":ol.format.KML.PairDataParser_}); +ol.format.KML.prototype.getExtensions = function() { + return ol.format.KML.EXTENSIONS_ +}; +ol.format.KML.prototype.readDocumentOrFolder_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + var localName = ol.xml.getLocalName(node); + goog.asserts.assert(localName == "Document" || localName == "Folder"); + var parsersNS = ol.xml.makeParsersNS(ol.format.KML.NAMESPACE_URIS_, {"Folder":ol.xml.makeArrayExtender(this.readDocumentOrFolder_, this), "Placemark":ol.xml.makeArrayPusher(this.readPlacemark_, this), "Style":goog.bind(this.readSharedStyle_, this), "StyleMap":goog.bind(this.readSharedStyleMap_, this)}); + var features = ol.xml.pushParseAndPop(([]), parsersNS, node, objectStack, this); + if(goog.isDef(features)) { + return features + }else { + return undefined + } +}; +ol.format.KML.prototype.readPlacemark_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Placemark"); + var object = ol.xml.pushParseAndPop({"geometry":null}, ol.format.KML.PLACEMARK_PARSERS_, node, objectStack); + if(!goog.isDef(object)) { + return undefined + } + var feature = new ol.Feature; + var id = node.getAttribute("id"); + if(!goog.isNull(id)) { + feature.setId(id) + } + feature.setValues(object); + feature.setStyle(this.featureStyleFunction_); + return feature +}; +ol.format.KML.prototype.readSharedStyle_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "Style"); + var id = node.getAttribute("id"); + if(!goog.isNull(id)) { + var style = ol.format.KML.readStyle_(node, objectStack); + if(goog.isDef(style)) { + var styleUri; + if(goog.isDefAndNotNull(node.baseURI)) { + styleUri = goog.Uri.resolve(node.baseURI, "#" + id).toString() + }else { + styleUri = "#" + id + } + this.sharedStyles_[styleUri] = style + } + } +}; +ol.format.KML.prototype.readSharedStyleMap_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "StyleMap"); + var id = node.getAttribute("id"); + if(goog.isNull(id)) { + return + } + var styleMapValue = ol.format.KML.readStyleMapValue_(node, objectStack); + if(!goog.isDef(styleMapValue)) { + return + } + var styleUri; + if(goog.isDefAndNotNull(node.baseURI)) { + styleUri = goog.Uri.resolve(node.baseURI, "#" + id).toString() + }else { + styleUri = "#" + id + } + this.sharedStyles_[styleUri] = styleMapValue +}; +ol.format.KML.prototype.readFeatureFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if(goog.array.indexOf(ol.format.KML.NAMESPACE_URIS_, node.namespaceURI) == -1) { + return null + } + goog.asserts.assert(node.localName == "Placemark"); + var feature = this.readPlacemark_(node, []); + if(goog.isDef(feature)) { + return feature + }else { + return null + } +}; +ol.format.KML.prototype.readFeaturesFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if(goog.array.indexOf(ol.format.KML.NAMESPACE_URIS_, node.namespaceURI) == -1) { + return[] + } + var features; + var localName = ol.xml.getLocalName(node); + if(localName == "Document" || localName == "Folder") { + features = this.readDocumentOrFolder_(node, []); + if(goog.isDef(features)) { + return features + }else { + return[] + } + }else { + if(localName == "Placemark") { + var feature = this.readPlacemark_(node, []); + if(goog.isDef(feature)) { + return[feature] + }else { + return[] + } + }else { + if(localName == "kml") { + features = []; + var n; + for(n = node.firstElementChild;!goog.isNull(n);n = n.nextElementSibling) { + var fs = this.readFeaturesFromNode(n); + if(goog.isDef(fs)) { + goog.array.extend(features, fs) + } + } + return features + }else { + return[] + } + } + } +}; +ol.format.KML.prototype.readName = function(source) { + if(ol.xml.isDocument(source)) { + return this.readNameFromDocument((source)) + }else { + if(ol.xml.isNode(source)) { + return this.readNameFromNode((source)) + }else { + if(goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readNameFromDocument(doc) + }else { + goog.asserts.fail(); + return undefined + } + } + } +}; +ol.format.KML.prototype.readNameFromDocument = function(doc) { + var n; + for(n = doc.firstChild;!goog.isNull(n);n = n.nextSibling) { + if(n.nodeType == goog.dom.NodeType.ELEMENT) { + var name = this.readNameFromNode(n); + if(goog.isDef(name)) { + return name + } + } + } + return undefined +}; +ol.format.KML.prototype.readNameFromNode = function(node) { + var n; + for(n = node.firstElementChild;!goog.isNull(n);n = n.nextElementSibling) { + if(goog.array.indexOf(ol.format.KML.NAMESPACE_URIS_, n.namespaceURI) != -1 && n.localName == "name") { + return ol.format.XSD.readString(n) + } + } + for(n = node.firstElementChild;!goog.isNull(n);n = n.nextElementSibling) { + var localName = ol.xml.getLocalName(n); + if(goog.array.indexOf(ol.format.KML.NAMESPACE_URIS_, n.namespaceURI) != -1 && (localName == "Document" || localName == "Folder" || localName == "Placemark" || localName == "kml")) { + var name = this.readNameFromNode(n); + if(goog.isDef(name)) { + return name + } + } + } + return undefined +}; +ol.format.KML.prototype.readProjectionFromDocument = function(doc) { + return ol.proj.get("EPSG:4326") +}; +ol.format.KML.prototype.readProjectionFromNode = function(node) { + return ol.proj.get("EPSG:4326") +}; +goog.provide("ol.format.OSMXML"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom.NodeType"); +goog.require("goog.object"); +goog.require("ol.Feature"); +goog.require("ol.format.XMLFeature"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.Polygon"); +goog.require("ol.proj"); +goog.require("ol.xml"); +ol.format.OSMXML = function() { + goog.base(this) +}; +goog.inherits(ol.format.OSMXML, ol.format.XMLFeature); +ol.format.OSMXML.EXTENSIONS_ = [".osm"]; +ol.format.OSMXML.prototype.getExtensions = function() { + return ol.format.OSMXML.EXTENSIONS_ +}; +ol.format.OSMXML.readNode_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "node"); + var state = (objectStack[objectStack.length - 1]); + var id = node.getAttribute("id"); + var coordinates = ([parseFloat(node.getAttribute("lon")), parseFloat(node.getAttribute("lat"))]); + goog.object.set(state.nodes, id, coordinates); + var values = ol.xml.pushParseAndPop({tags:{}}, ol.format.OSMXML.NODE_PARSERS_, node, objectStack); + if(!goog.object.isEmpty(values.tags)) { + var geometry = new ol.geom.Point(coordinates); + var feature = new ol.Feature(geometry); + feature.setId(id); + feature.setValues(values.tags); + state.features.push(feature) + } +}; +ol.format.OSMXML.readWay_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "way"); + var id = node.getAttribute("id"); + var values = ol.xml.pushParseAndPop({ndrefs:[], tags:{}}, ol.format.OSMXML.WAY_PARSERS_, node, objectStack); + var state = (objectStack[objectStack.length - 1]); + var flatCoordinates = ([]); + for(var i = 0, ii = values.ndrefs.length;i < ii;i++) { + var point = goog.object.get(state.nodes, values.ndrefs[i]); + goog.array.extend(flatCoordinates, point) + } + var geometry; + if(values.ndrefs[0] == values.ndrefs[values.ndrefs.length - 1]) { + geometry = new ol.geom.Polygon(null); + geometry.setFlatCoordinates(ol.geom.GeometryLayout.XY, flatCoordinates, [flatCoordinates.length]) + }else { + geometry = new ol.geom.LineString(null); + geometry.setFlatCoordinates(ol.geom.GeometryLayout.XY, flatCoordinates) + } + var feature = new ol.Feature(geometry); + feature.setId(id); + feature.setValues(values.tags); + state.features.push(feature) +}; +ol.format.OSMXML.readNd_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "nd"); + var values = (objectStack[objectStack.length - 1]); + values.ndrefs.push(node.getAttribute("ref")) +}; +ol.format.OSMXML.readTag_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == "tag"); + var values = (objectStack[objectStack.length - 1]); + goog.object.set(values.tags, node.getAttribute("k"), node.getAttribute("v")) +}; +ol.format.OSMXML.NAMESPACE_URIS_ = [null]; +ol.format.OSMXML.WAY_PARSERS_ = ol.xml.makeParsersNS(ol.format.OSMXML.NAMESPACE_URIS_, {"nd":ol.format.OSMXML.readNd_, "tag":ol.format.OSMXML.readTag_}); +ol.format.OSMXML.PARSERS_ = ol.xml.makeParsersNS(ol.format.OSMXML.NAMESPACE_URIS_, {"node":ol.format.OSMXML.readNode_, "way":ol.format.OSMXML.readWay_}); +ol.format.OSMXML.NODE_PARSERS_ = ol.xml.makeParsersNS(ol.format.OSMXML.NAMESPACE_URIS_, {"tag":ol.format.OSMXML.readTag_}); +ol.format.OSMXML.prototype.readFeaturesFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if(node.localName == "osm") { + var state = ol.xml.pushParseAndPop({nodes:{}, features:[]}, ol.format.OSMXML.PARSERS_, node, []); + if(goog.isDef(state.features)) { + return state.features + } + } + return[] +}; +ol.format.OSMXML.prototype.readProjectionFromDocument = function(doc) { + return ol.proj.get("EPSG:4326") +}; +ol.format.OSMXML.prototype.readProjectionFromNode = function(node) { + return ol.proj.get("EPSG:4326") +}; +goog.provide("ol.format.Polyline"); +goog.require("goog.asserts"); +goog.require("ol.Feature"); +goog.require("ol.format.TextFeature"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.flat"); +goog.require("ol.proj"); +ol.format.Polyline = function() { + goog.base(this) +}; +goog.inherits(ol.format.Polyline, ol.format.TextFeature); +ol.format.Polyline.encodeFlatCoordinates = function(flatPoints, opt_dimension) { + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + return ol.format.Polyline.encodeDeltas(flatPoints, dimension) +}; +ol.format.Polyline.decodeFlatCoordinates = function(encoded, opt_dimension) { + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + return ol.format.Polyline.decodeDeltas(encoded, dimension) +}; +ol.format.Polyline.encodeDeltas = function(numbers, dimension, opt_factor) { + var factor = goog.isDef(opt_factor) ? opt_factor : 1E5; + var d; + var lastNumbers = new Array(dimension); + for(d = 0;d < dimension;++d) { + lastNumbers[d] = 0 + } + var i, ii; + for(i = 0, ii = numbers.length;i < ii;) { + for(d = 0;d < dimension;++d, ++i) { + var num = numbers[i]; + var delta = num - lastNumbers[d]; + lastNumbers[d] = num; + numbers[i] = delta + } + } + return ol.format.Polyline.encodeFloats(numbers, factor) +}; +ol.format.Polyline.decodeDeltas = function(encoded, dimension, opt_factor) { + var factor = goog.isDef(opt_factor) ? opt_factor : 1E5; + var d; + var lastNumbers = new Array(dimension); + for(d = 0;d < dimension;++d) { + lastNumbers[d] = 0 + } + var numbers = ol.format.Polyline.decodeFloats(encoded, factor); + var i, ii; + for(i = 0, ii = numbers.length;i < ii;) { + for(d = 0;d < dimension;++d, ++i) { + lastNumbers[d] += numbers[i]; + numbers[i] = lastNumbers[d] + } + } + return numbers +}; +ol.format.Polyline.encodeFloats = function(numbers, opt_factor) { + var factor = goog.isDef(opt_factor) ? opt_factor : 1E5; + var i, ii; + for(i = 0, ii = numbers.length;i < ii;++i) { + numbers[i] = Math.round(numbers[i] * factor) + } + return ol.format.Polyline.encodeSignedIntegers(numbers) +}; +ol.format.Polyline.decodeFloats = function(encoded, opt_factor) { + var factor = goog.isDef(opt_factor) ? opt_factor : 1E5; + var numbers = ol.format.Polyline.decodeSignedIntegers(encoded); + var i, ii; + for(i = 0, ii = numbers.length;i < ii;++i) { + numbers[i] /= factor + } + return numbers +}; +ol.format.Polyline.encodeSignedIntegers = function(numbers) { + var i, ii; + for(i = 0, ii = numbers.length;i < ii;++i) { + var num = numbers[i]; + numbers[i] = num < 0 ? ~(num << 1) : num << 1 + } + return ol.format.Polyline.encodeUnsignedIntegers(numbers) +}; +ol.format.Polyline.decodeSignedIntegers = function(encoded) { + var numbers = ol.format.Polyline.decodeUnsignedIntegers(encoded); + var i, ii; + for(i = 0, ii = numbers.length;i < ii;++i) { + var num = numbers[i]; + numbers[i] = num & 1 ? ~(num >> 1) : num >> 1 + } + return numbers +}; +ol.format.Polyline.encodeUnsignedIntegers = function(numbers) { + var encoded = ""; + var i, ii; + for(i = 0, ii = numbers.length;i < ii;++i) { + encoded += ol.format.Polyline.encodeUnsignedInteger(numbers[i]) + } + return encoded +}; +ol.format.Polyline.decodeUnsignedIntegers = function(encoded) { + var numbers = []; + var current = 0; + var shift = 0; + var i, ii; + for(i = 0, ii = encoded.length;i < ii;++i) { + var b = encoded.charCodeAt(i) - 63; + current |= (b & 31) << shift; + if(b < 32) { + numbers.push(current); + current = 0; + shift = 0 + }else { + shift += 5 + } + } + return numbers +}; +ol.format.Polyline.encodeUnsignedInteger = function(num) { + var value, encoded = ""; + while(num >= 32) { + value = (32 | num & 31) + 63; + encoded += String.fromCharCode(value); + num >>= 5 + } + value = num + 63; + encoded += String.fromCharCode(value); + return encoded +}; +ol.format.Polyline.prototype.readFeatureFromText = function(text) { + var geometry = this.readGeometryFromText(text); + return new ol.Feature(geometry) +}; +ol.format.Polyline.prototype.readFeaturesFromText = function(text) { + var feature = this.readFeatureFromText(text); + return[feature] +}; +ol.format.Polyline.prototype.readGeometryFromText = function(text) { + var flatCoordinates = ol.format.Polyline.decodeFlatCoordinates(text, 2); + var coordinates = ol.geom.flat.inflateCoordinates(flatCoordinates, 0, flatCoordinates.length, 2); + return new ol.geom.LineString(coordinates) +}; +ol.format.Polyline.prototype.readProjectionFromText = function(text) { + return ol.proj.get("EPSG:4326") +}; +ol.format.Polyline.prototype.writeFeatureText = function(feature) { + var geometry = feature.getGeometry(); + if(goog.isDefAndNotNull(geometry)) { + return this.writeGeometryText(geometry) + }else { + goog.asserts.fail(); + return"" + } +}; +ol.format.Polyline.prototype.writeFeaturesText = function(features) { + goog.asserts.assert(features.length == 1); + return this.writeFeatureText(features[0]) +}; +ol.format.Polyline.prototype.writeGeometryText = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + var flatCoordinates = geometry.getFlatCoordinates(); + var stride = geometry.getStride(); + return ol.format.Polyline.encodeFlatCoordinates(flatCoordinates, stride) +}; +goog.provide("ol.format.TopoJSON"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.object"); +goog.require("ol.Feature"); +goog.require("ol.format.JSONFeature"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.MultiLineString"); +goog.require("ol.geom.MultiPoint"); +goog.require("ol.geom.MultiPolygon"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.Polygon"); +goog.require("ol.proj"); +ol.format.TopoJSON = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + this.defaultProjection_ = ol.proj.get(options.defaultProjection || "EPSG:4326") +}; +goog.inherits(ol.format.TopoJSON, ol.format.JSONFeature); +ol.format.TopoJSON.EXTENSIONS_ = [".topojson"]; +ol.format.TopoJSON.concatenateArcs_ = function(indices, arcs) { + var coordinates = []; + var index, arc; + var i, ii; + var j, jj; + for(i = 0, ii = indices.length;i < ii;++i) { + index = indices[i]; + if(i > 0) { + coordinates.pop() + } + if(index >= 0) { + arc = arcs[index] + }else { + arc = arcs[~index].slice().reverse() + } + coordinates.push.apply(coordinates, arc) + } + for(j = 0, jj = coordinates.length;j < jj;++j) { + coordinates[j] = coordinates[j].slice() + } + return coordinates +}; +ol.format.TopoJSON.readPointGeometry_ = function(object, scale, translate) { + var coordinates = object.coordinates; + if(goog.isDef(scale) && goog.isDef(translate)) { + ol.format.TopoJSON.transformVertex_(coordinates, scale, translate) + } + return new ol.geom.Point(coordinates) +}; +ol.format.TopoJSON.readMultiPointGeometry_ = function(object, scale, translate) { + var coordinates = object.coordinates; + var i, ii; + if(goog.isDef(scale) && goog.isDef(translate)) { + for(i = 0, ii = coordinates.length;i < ii;++i) { + ol.format.TopoJSON.transformVertex_(coordinates[i], scale, translate) + } + } + return new ol.geom.MultiPoint(coordinates) +}; +ol.format.TopoJSON.readLineStringGeometry_ = function(object, arcs) { + var coordinates = ol.format.TopoJSON.concatenateArcs_(object.arcs, arcs); + return new ol.geom.LineString(goog.array.flatten(coordinates)) +}; +ol.format.TopoJSON.readMultiLineStringGeometry_ = function(object, arcs) { + var coordinates = []; + var i, ii; + for(i = 0, ii = object.arcs.length;i < ii;++i) { + coordinates[i] = ol.format.TopoJSON.concatenateArcs_(object.arcs[i], arcs) + } + return new ol.geom.MultiLineString(coordinates) +}; +ol.format.TopoJSON.readPolygonGeometry_ = function(object, arcs) { + var coordinates = []; + var i, ii; + for(i = 0, ii = object.arcs.length;i < ii;++i) { + coordinates[i] = ol.format.TopoJSON.concatenateArcs_(object.arcs[i], arcs) + } + return new ol.geom.Polygon(coordinates) +}; +ol.format.TopoJSON.readMultiPolygonGeometry_ = function(object, arcs) { + var coordinates = []; + var polyArray, ringCoords, j, jj; + var i, ii; + for(i = 0, ii = object.arcs.length;i < ii;++i) { + polyArray = object.arcs[i]; + ringCoords = []; + for(j = 0, jj = polyArray.length;j < jj;++j) { + ringCoords[j] = ol.format.TopoJSON.concatenateArcs_(polyArray[j], arcs) + } + coordinates[i] = ringCoords + } + return new ol.geom.MultiPolygon(coordinates) +}; +ol.format.TopoJSON.prototype.getExtensions = function() { + return ol.format.TopoJSON.EXTENSIONS_ +}; +ol.format.TopoJSON.readFeaturesFromGeometryCollection_ = function(collection, arcs, scale, translate) { + var geometries = collection.geometries; + var features = []; + var i, ii; + for(i = 0, ii = geometries.length;i < ii;++i) { + features[i] = ol.format.TopoJSON.readFeatureFromGeometry_(geometries[i], arcs, scale, translate) + } + return features +}; +ol.format.TopoJSON.readFeatureFromGeometry_ = function(object, arcs, scale, translate) { + var geometry; + var type = object.type; + var geometryReader = ol.format.TopoJSON.GEOMETRY_READERS_[type]; + goog.asserts.assert(goog.isDef(geometryReader)); + if(type === "Point" || type === "MultiPoint") { + geometry = geometryReader(object, scale, translate) + }else { + geometry = geometryReader(object, arcs) + } + var feature = new ol.Feature; + feature.setGeometry(geometry); + if(goog.isDef(object.id)) { + feature.setId(object.id) + } + if(goog.isDef(object.properties)) { + feature.setValues(object.properties) + } + return feature +}; +ol.format.TopoJSON.prototype.readFeaturesFromObject = function(object) { + if(object.type == "Topology") { + var topoJSONTopology = (object); + var transform, scale = null, translate = null; + if(goog.isDef(topoJSONTopology.transform)) { + transform = (topoJSONTopology.transform); + scale = transform.scale; + translate = transform.translate + } + var arcs = topoJSONTopology.arcs; + if(goog.isDef(transform)) { + ol.format.TopoJSON.transformArcs_(arcs, scale, translate) + } + var features = []; + var topoJSONFeatures = goog.object.getValues(topoJSONTopology.objects); + var i, ii; + var feature; + for(i = 0, ii = topoJSONFeatures.length;i < ii;++i) { + if(topoJSONFeatures[i].type === "GeometryCollection") { + feature = (topoJSONFeatures[i]); + features.push.apply(features, ol.format.TopoJSON.readFeaturesFromGeometryCollection_(feature, arcs, scale, translate)) + }else { + feature = (topoJSONFeatures[i]); + features.push(ol.format.TopoJSON.readFeatureFromGeometry_(feature, arcs, scale, translate)) + } + } + return features + }else { + return[] + } +}; +ol.format.TopoJSON.transformArcs_ = function(arcs, scale, translate) { + var i, ii; + for(i = 0, ii = arcs.length;i < ii;++i) { + ol.format.TopoJSON.transformArc_(arcs[i], scale, translate) + } +}; +ol.format.TopoJSON.transformArc_ = function(arc, scale, translate) { + var x = 0; + var y = 0; + var vertex; + var i, ii; + for(i = 0, ii = arc.length;i < ii;++i) { + vertex = arc[i]; + x += vertex[0]; + y += vertex[1]; + vertex[0] = x; + vertex[1] = y; + ol.format.TopoJSON.transformVertex_(vertex, scale, translate) + } +}; +ol.format.TopoJSON.transformVertex_ = function(vertex, scale, translate) { + vertex[0] = vertex[0] * scale[0] + translate[0]; + vertex[1] = vertex[1] * scale[1] + translate[1] +}; +ol.format.TopoJSON.prototype.readProjection = function(object) { + return this.defaultProjection_ +}; +ol.format.TopoJSON.GEOMETRY_READERS_ = {"Point":ol.format.TopoJSON.readPointGeometry_, "LineString":ol.format.TopoJSON.readLineStringGeometry_, "Polygon":ol.format.TopoJSON.readPolygonGeometry_, "MultiPoint":ol.format.TopoJSON.readMultiPointGeometry_, "MultiLineString":ol.format.TopoJSON.readMultiLineStringGeometry_, "MultiPolygon":ol.format.TopoJSON.readMultiPolygonGeometry_}; +goog.provide("goog.events.FileDropHandler"); +goog.provide("goog.events.FileDropHandler.EventType"); +goog.require("goog.array"); +goog.require("goog.dom"); +goog.require("goog.events"); +goog.require("goog.events.BrowserEvent"); +goog.require("goog.events.EventHandler"); +goog.require("goog.events.EventTarget"); +goog.require("goog.events.EventType"); +goog.require("goog.log"); +goog.events.FileDropHandler = function(element, opt_preventDropOutside) { + goog.events.EventTarget.call(this); + this.eventHandler_ = new goog.events.EventHandler(this); + var doc = element; + if(opt_preventDropOutside) { + doc = goog.dom.getOwnerDocument(element) + } + this.eventHandler_.listen(doc, goog.events.EventType.DRAGENTER, this.onDocDragEnter_); + if(doc != element) { + this.eventHandler_.listen(doc, goog.events.EventType.DRAGOVER, this.onDocDragOver_) + } + this.eventHandler_.listen(element, goog.events.EventType.DRAGOVER, this.onElemDragOver_); + this.eventHandler_.listen(element, goog.events.EventType.DROP, this.onElemDrop_) +}; +goog.inherits(goog.events.FileDropHandler, goog.events.EventTarget); +goog.events.FileDropHandler.prototype.dndContainsFiles_ = false; +goog.events.FileDropHandler.prototype.logger_ = goog.log.getLogger("goog.events.FileDropHandler"); +goog.events.FileDropHandler.EventType = {DROP:goog.events.EventType.DROP}; +goog.events.FileDropHandler.prototype.disposeInternal = function() { + goog.events.FileDropHandler.superClass_.disposeInternal.call(this); + this.eventHandler_.dispose() +}; +goog.events.FileDropHandler.prototype.dispatch_ = function(e) { + goog.log.fine(this.logger_, "Firing DROP event..."); + var event = new goog.events.BrowserEvent(e.getBrowserEvent()); + event.type = goog.events.FileDropHandler.EventType.DROP; + this.dispatchEvent(event) +}; +goog.events.FileDropHandler.prototype.onDocDragEnter_ = function(e) { + goog.log.log(this.logger_, goog.log.Level.FINER, '"' + e.target.id + '" (' + e.target + ") dispatched: " + e.type); + var dt = e.getBrowserEvent().dataTransfer; + this.dndContainsFiles_ = !!(dt && (dt.types && (goog.array.contains(dt.types, "Files") || goog.array.contains(dt.types, "public.file-url")) || dt.files && dt.files.length > 0)); + if(this.dndContainsFiles_) { + e.preventDefault() + } + goog.log.log(this.logger_, goog.log.Level.FINER, "dndContainsFiles_: " + this.dndContainsFiles_) +}; +goog.events.FileDropHandler.prototype.onDocDragOver_ = function(e) { + goog.log.log(this.logger_, goog.log.Level.FINEST, '"' + e.target.id + '" (' + e.target + ") dispatched: " + e.type); + if(this.dndContainsFiles_) { + e.preventDefault(); + var dt = e.getBrowserEvent().dataTransfer; + dt.dropEffect = "none" + } +}; +goog.events.FileDropHandler.prototype.onElemDragOver_ = function(e) { + goog.log.log(this.logger_, goog.log.Level.FINEST, '"' + e.target.id + '" (' + e.target + ") dispatched: " + e.type); + if(this.dndContainsFiles_) { + e.preventDefault(); + e.stopPropagation(); + var dt = e.getBrowserEvent().dataTransfer; + dt.effectAllowed = "all"; + dt.dropEffect = "copy" + } +}; +goog.events.FileDropHandler.prototype.onElemDrop_ = function(e) { + goog.log.log(this.logger_, goog.log.Level.FINER, '"' + e.target.id + '" (' + e.target + ") dispatched: " + e.type); + if(this.dndContainsFiles_) { + e.preventDefault(); + e.stopPropagation(); + this.dispatch_(e) + } +}; +/* + Portions of this code are from MochiKit, received by + The Closure Authors under the MIT license. All other code is Copyright + 2005-2009 The Closure Authors. All Rights Reserved. +*/ +goog.provide("goog.async.Deferred"); +goog.provide("goog.async.Deferred.AlreadyCalledError"); +goog.provide("goog.async.Deferred.CanceledError"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.debug.Error"); +goog.require("goog.functions"); +goog.async.Deferred = function(opt_onCancelFunction, opt_defaultScope) { + this.sequence_ = []; + this.onCancelFunction_ = opt_onCancelFunction; + this.defaultScope_ = opt_defaultScope || null; + if(goog.async.Deferred.LONG_STACK_TRACES) { + this.constructorStack_ = null; + if(Error.captureStackTrace) { + var target = {stack:""}; + Error.captureStackTrace(target, goog.async.Deferred); + if(typeof target.stack == "string") { + this.constructorStack_ = target.stack.replace(/^[^\n]*\n/, "") + } + } + } +}; +goog.async.Deferred.prototype.fired_ = false; +goog.async.Deferred.prototype.hadError_ = false; +goog.async.Deferred.prototype.result_; +goog.async.Deferred.prototype.blocked_ = false; +goog.async.Deferred.prototype.blocking_ = false; +goog.async.Deferred.prototype.silentlyCanceled_ = false; +goog.async.Deferred.prototype.unhandledExceptionTimeoutId_; +goog.async.Deferred.prototype.parent_; +goog.async.Deferred.prototype.branches_ = 0; +goog.define("goog.async.Deferred.STRICT_ERRORS", false); +goog.define("goog.async.Deferred.LONG_STACK_TRACES", goog.DEBUG); +goog.async.Deferred.prototype.cancel = function(opt_deepCancel) { + if(!this.hasFired()) { + if(this.parent_) { + var parent = this.parent_; + delete this.parent_; + if(opt_deepCancel) { + parent.cancel(opt_deepCancel) + }else { + parent.branchCancel_() + } + } + if(this.onCancelFunction_) { + this.onCancelFunction_.call(this.defaultScope_, this) + }else { + this.silentlyCanceled_ = true + } + if(!this.hasFired()) { + this.errback(new goog.async.Deferred.CanceledError(this)) + } + }else { + if(this.result_ instanceof goog.async.Deferred) { + this.result_.cancel() + } + } +}; +goog.async.Deferred.prototype.branchCancel_ = function() { + this.branches_--; + if(this.branches_ <= 0) { + this.cancel() + } +}; +goog.async.Deferred.prototype.continue_ = function(isSuccess, res) { + this.blocked_ = false; + this.updateResult_(isSuccess, res) +}; +goog.async.Deferred.prototype.updateResult_ = function(isSuccess, res) { + this.fired_ = true; + this.result_ = res; + this.hadError_ = !isSuccess; + this.fire_() +}; +goog.async.Deferred.prototype.check_ = function() { + if(this.hasFired()) { + if(!this.silentlyCanceled_) { + throw new goog.async.Deferred.AlreadyCalledError(this); + } + this.silentlyCanceled_ = false + } +}; +goog.async.Deferred.prototype.callback = function(opt_result) { + this.check_(); + this.assertNotDeferred_(opt_result); + this.updateResult_(true, opt_result) +}; +goog.async.Deferred.prototype.errback = function(opt_result) { + this.check_(); + this.assertNotDeferred_(opt_result); + this.makeStackTraceLong_(opt_result); + this.updateResult_(false, opt_result) +}; +goog.async.Deferred.prototype.makeStackTraceLong_ = function(error) { + if(!goog.async.Deferred.LONG_STACK_TRACES) { + return + } + if(this.constructorStack_ && goog.isObject(error) && error.stack && /^[^\n]+(\n [^\n]+)+/.test(error.stack)) { + error.stack = error.stack + "\nDEFERRED OPERATION:\n" + this.constructorStack_ + } +}; +goog.async.Deferred.prototype.assertNotDeferred_ = function(obj) { + goog.asserts.assert(!(obj instanceof goog.async.Deferred), "An execution sequence may not be initiated with a blocking Deferred.") +}; +goog.async.Deferred.prototype.addCallback = function(cb, opt_scope) { + return this.addCallbacks(cb, null, opt_scope) +}; +goog.async.Deferred.prototype.addErrback = function(eb, opt_scope) { + return this.addCallbacks(null, eb, opt_scope) +}; +goog.async.Deferred.prototype.addBoth = function(f, opt_scope) { + return this.addCallbacks(f, f, opt_scope) +}; +goog.async.Deferred.prototype.addCallbacks = function(cb, eb, opt_scope) { + goog.asserts.assert(!this.blocking_, "Blocking Deferreds can not be re-used"); + this.sequence_.push([cb, eb, opt_scope]); + if(this.hasFired()) { + this.fire_() + } + return this +}; +goog.async.Deferred.prototype.chainDeferred = function(otherDeferred) { + this.addCallbacks(otherDeferred.callback, otherDeferred.errback, otherDeferred); + return this +}; +goog.async.Deferred.prototype.awaitDeferred = function(otherDeferred) { + return this.addCallback(goog.bind(otherDeferred.branch, otherDeferred)) +}; +goog.async.Deferred.prototype.branch = function(opt_propagateCancel) { + var d = new goog.async.Deferred; + this.chainDeferred(d); + if(opt_propagateCancel) { + d.parent_ = this; + this.branches_++ + } + return d +}; +goog.async.Deferred.prototype.hasFired = function() { + return this.fired_ +}; +goog.async.Deferred.prototype.isError = function(res) { + return res instanceof Error +}; +goog.async.Deferred.prototype.hasErrback_ = function() { + return goog.array.some(this.sequence_, function(sequenceRow) { + return goog.isFunction(sequenceRow[1]) + }) +}; +goog.async.Deferred.prototype.fire_ = function() { + if(this.unhandledExceptionTimeoutId_ && this.hasFired() && this.hasErrback_()) { + goog.global.clearTimeout(this.unhandledExceptionTimeoutId_); + delete this.unhandledExceptionTimeoutId_ + } + if(this.parent_) { + this.parent_.branches_--; + delete this.parent_ + } + var res = this.result_; + var unhandledException = false; + var isNewlyBlocked = false; + while(this.sequence_.length && !this.blocked_) { + var sequenceEntry = this.sequence_.shift(); + var callback = sequenceEntry[0]; + var errback = sequenceEntry[1]; + var scope = sequenceEntry[2]; + var f = this.hadError_ ? errback : callback; + if(f) { + try { + var ret = f.call(scope || this.defaultScope_, res); + if(goog.isDef(ret)) { + this.hadError_ = this.hadError_ && (ret == res || this.isError(ret)); + this.result_ = res = ret + } + if(res instanceof goog.async.Deferred) { + isNewlyBlocked = true; + this.blocked_ = true + } + }catch(ex) { + res = ex; + this.hadError_ = true; + this.makeStackTraceLong_(res); + if(!this.hasErrback_()) { + unhandledException = true + } + } + } + } + this.result_ = res; + if(isNewlyBlocked) { + res.addCallbacks(goog.bind(this.continue_, this, true), goog.bind(this.continue_, this, false)); + res.blocking_ = true + }else { + if(goog.async.Deferred.STRICT_ERRORS && this.isError(res) && !(res instanceof goog.async.Deferred.CanceledError)) { + this.hadError_ = true; + unhandledException = true + } + } + if(unhandledException) { + this.unhandledExceptionTimeoutId_ = goog.global.setTimeout(goog.functions.fail(res), 0) + } +}; +goog.async.Deferred.succeed = function(opt_result) { + var d = new goog.async.Deferred; + d.callback(opt_result); + return d +}; +goog.async.Deferred.fail = function(res) { + var d = new goog.async.Deferred; + d.errback(res); + return d +}; +goog.async.Deferred.canceled = function() { + var d = new goog.async.Deferred; + d.cancel(); + return d +}; +goog.async.Deferred.when = function(value, callback, opt_scope) { + if(value instanceof goog.async.Deferred) { + return value.branch(true).addCallback(callback, opt_scope) + }else { + return goog.async.Deferred.succeed(value).addCallback(callback, opt_scope) + } +}; +goog.async.Deferred.AlreadyCalledError = function(deferred) { + goog.debug.Error.call(this); + this.deferred = deferred +}; +goog.inherits(goog.async.Deferred.AlreadyCalledError, goog.debug.Error); +goog.async.Deferred.AlreadyCalledError.prototype.message = "Deferred has already fired"; +goog.async.Deferred.AlreadyCalledError.prototype.name = "AlreadyCalledError"; +goog.async.Deferred.CanceledError = function(deferred) { + goog.debug.Error.call(this); + this.deferred = deferred +}; +goog.inherits(goog.async.Deferred.CanceledError, goog.debug.Error); +goog.async.Deferred.CanceledError.prototype.message = "Deferred was canceled"; +goog.async.Deferred.CanceledError.prototype.name = "CanceledError"; +goog.provide("goog.fs.Error"); +goog.provide("goog.fs.Error.ErrorCode"); +goog.require("goog.debug.Error"); +goog.require("goog.string"); +goog.fs.Error = function(code, action) { + goog.base(this, goog.string.subs("Error %s: %s", action, goog.fs.Error.getDebugMessage(code))); + this.code = (code) +}; +goog.inherits(goog.fs.Error, goog.debug.Error); +goog.fs.Error.ErrorCode = {NOT_FOUND:1, SECURITY:2, ABORT:3, NOT_READABLE:4, ENCODING:5, NO_MODIFICATION_ALLOWED:6, INVALID_STATE:7, SYNTAX:8, INVALID_MODIFICATION:9, QUOTA_EXCEEDED:10, TYPE_MISMATCH:11, PATH_EXISTS:12}; +goog.fs.Error.getDebugMessage = function(errorCode) { + switch(errorCode) { + case goog.fs.Error.ErrorCode.NOT_FOUND: + return"File or directory not found"; + case goog.fs.Error.ErrorCode.SECURITY: + return"Insecure or disallowed operation"; + case goog.fs.Error.ErrorCode.ABORT: + return"Operation aborted"; + case goog.fs.Error.ErrorCode.NOT_READABLE: + return"File or directory not readable"; + case goog.fs.Error.ErrorCode.ENCODING: + return"Invalid encoding"; + case goog.fs.Error.ErrorCode.NO_MODIFICATION_ALLOWED: + return"Cannot modify file or directory"; + case goog.fs.Error.ErrorCode.INVALID_STATE: + return"Invalid state"; + case goog.fs.Error.ErrorCode.SYNTAX: + return"Invalid line-ending specifier"; + case goog.fs.Error.ErrorCode.INVALID_MODIFICATION: + return"Invalid modification"; + case goog.fs.Error.ErrorCode.QUOTA_EXCEEDED: + return"Quota exceeded"; + case goog.fs.Error.ErrorCode.TYPE_MISMATCH: + return"Invalid filetype"; + case goog.fs.Error.ErrorCode.PATH_EXISTS: + return"File or directory already exists at specified path"; + default: + return"Unrecognized error" + } +}; +goog.provide("goog.fs.ProgressEvent"); +goog.require("goog.events.Event"); +goog.fs.ProgressEvent = function(event, target) { + goog.base(this, event.type, target); + this.event_ = event +}; +goog.inherits(goog.fs.ProgressEvent, goog.events.Event); +goog.fs.ProgressEvent.prototype.isLengthComputable = function() { + return this.event_.lengthComputable +}; +goog.fs.ProgressEvent.prototype.getLoaded = function() { + return this.event_.loaded +}; +goog.fs.ProgressEvent.prototype.getTotal = function() { + return this.event_.total +}; +goog.provide("goog.fs.FileReader"); +goog.provide("goog.fs.FileReader.EventType"); +goog.provide("goog.fs.FileReader.ReadyState"); +goog.require("goog.async.Deferred"); +goog.require("goog.events.Event"); +goog.require("goog.events.EventTarget"); +goog.require("goog.fs.Error"); +goog.require("goog.fs.ProgressEvent"); +goog.fs.FileReader = function() { + goog.base(this); + this.reader_ = new FileReader; + this.reader_.onloadstart = goog.bind(this.dispatchProgressEvent_, this); + this.reader_.onprogress = goog.bind(this.dispatchProgressEvent_, this); + this.reader_.onload = goog.bind(this.dispatchProgressEvent_, this); + this.reader_.onabort = goog.bind(this.dispatchProgressEvent_, this); + this.reader_.onerror = goog.bind(this.dispatchProgressEvent_, this); + this.reader_.onloadend = goog.bind(this.dispatchProgressEvent_, this) +}; +goog.inherits(goog.fs.FileReader, goog.events.EventTarget); +goog.fs.FileReader.ReadyState = {INIT:0, LOADING:1, DONE:2}; +goog.fs.FileReader.EventType = {LOAD_START:"loadstart", PROGRESS:"progress", LOAD:"load", ABORT:"abort", ERROR:"error", LOAD_END:"loadend"}; +goog.fs.FileReader.prototype.abort = function() { + try { + this.reader_.abort() + }catch(e) { + throw new goog.fs.Error(e.code, "aborting read"); + } +}; +goog.fs.FileReader.prototype.getReadyState = function() { + return(this.reader_.readyState) +}; +goog.fs.FileReader.prototype.getResult = function() { + return this.reader_.result +}; +goog.fs.FileReader.prototype.getError = function() { + return this.reader_.error && new goog.fs.Error(this.reader_.error.code, "reading file") +}; +goog.fs.FileReader.prototype.dispatchProgressEvent_ = function(event) { + this.dispatchEvent(new goog.fs.ProgressEvent(event, this)) +}; +goog.fs.FileReader.prototype.disposeInternal = function() { + goog.base(this, "disposeInternal"); + delete this.reader_ +}; +goog.fs.FileReader.prototype.readAsBinaryString = function(blob) { + this.reader_.readAsBinaryString(blob) +}; +goog.fs.FileReader.readAsBinaryString = function(blob) { + var reader = new goog.fs.FileReader; + var d = goog.fs.FileReader.createDeferred_(reader); + reader.readAsBinaryString(blob); + return d +}; +goog.fs.FileReader.prototype.readAsArrayBuffer = function(blob) { + this.reader_.readAsArrayBuffer(blob) +}; +goog.fs.FileReader.readAsArrayBuffer = function(blob) { + var reader = new goog.fs.FileReader; + var d = goog.fs.FileReader.createDeferred_(reader); + reader.readAsArrayBuffer(blob); + return d +}; +goog.fs.FileReader.prototype.readAsText = function(blob, opt_encoding) { + this.reader_.readAsText(blob, opt_encoding) +}; +goog.fs.FileReader.readAsText = function(blob, opt_encoding) { + var reader = new goog.fs.FileReader; + var d = goog.fs.FileReader.createDeferred_(reader); + reader.readAsText(blob, opt_encoding); + return d +}; +goog.fs.FileReader.prototype.readAsDataUrl = function(blob) { + this.reader_.readAsDataURL(blob) +}; +goog.fs.FileReader.readAsDataUrl = function(blob) { + var reader = new goog.fs.FileReader; + var d = goog.fs.FileReader.createDeferred_(reader); + reader.readAsDataUrl(blob); + return d +}; +goog.fs.FileReader.createDeferred_ = function(reader) { + var deferred = new goog.async.Deferred; + reader.addEventListener(goog.fs.FileReader.EventType.LOAD_END, goog.partial(function(d, r, e) { + var result = r.getResult(); + var error = r.getError(); + if(result != null && !error) { + d.callback(result) + }else { + d.errback(error) + } + r.dispose() + }, deferred, reader)); + return deferred +}; +goog.provide("ol.interaction.DragAndDrop"); +goog.provide("ol.interaction.DragAndDropEvent"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("goog.events.Event"); +goog.require("goog.events.FileDropHandler"); +goog.require("goog.events.FileDropHandler.EventType"); +goog.require("goog.fs.FileReader"); +goog.require("goog.functions"); +goog.require("ol.interaction.Interaction"); +goog.require("ol.proj"); +ol.interaction.DragAndDrop = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + this.formatConstructors_ = goog.isDef(options.formatConstructors) ? options.formatConstructors : []; + this.reprojectTo_ = goog.isDef(options.reprojectTo) ? ol.proj.get(options.reprojectTo) : null; + this.fileDropHandler_ = null; + this.dropListenKey_ = undefined +}; +goog.inherits(ol.interaction.DragAndDrop, ol.interaction.Interaction); +ol.interaction.DragAndDrop.prototype.disposeInternal = function() { + if(goog.isDef(this.dropListenKey_)) { + goog.events.unlistenByKey(this.dropListenKey_) + } + goog.base(this, "disposeInternal") +}; +ol.interaction.DragAndDrop.prototype.handleDrop_ = function(event) { + var files = event.getBrowserEvent().dataTransfer.files; + var i, ii; + for(i = 0, ii = files.length;i < ii;++i) { + var reader = goog.fs.FileReader.readAsText(files[i], ""); + reader.addCallback(this.handleResult_, this) + } +}; +ol.interaction.DragAndDrop.prototype.handleResult_ = function(result) { + var map = this.getMap(); + goog.asserts.assert(!goog.isNull(map)); + var projection = this.reprojectTo_; + if(goog.isNull(projection)) { + var view = map.getView(); + goog.asserts.assert(goog.isDef(view)); + projection = view.getView2D().getProjection(); + goog.asserts.assert(goog.isDef(projection)) + } + var formatConstructors = this.formatConstructors_; + var features = []; + var i, ii; + for(i = 0, ii = formatConstructors.length;i < ii;++i) { + var formatConstructor = formatConstructors[i]; + var format = new formatConstructor; + var readFeatures = this.tryReadFeatures_(format, result); + if(!goog.isNull(readFeatures)) { + var featureProjection = format.readProjection(result); + var transform = ol.proj.getTransform(featureProjection, projection); + var j, jj; + for(j = 0, jj = readFeatures.length;j < jj;++j) { + var feature = readFeatures[j]; + var geometry = feature.getGeometry(); + if(!goog.isNull(geometry)) { + geometry.transform(transform) + } + features.push(feature) + } + } + } + this.dispatchEvent(new ol.interaction.DragAndDropEvent(ol.interaction.DragAndDropEventType.ADD_FEATURES, this, features, projection)) +}; +ol.interaction.DragAndDrop.prototype.handleMapBrowserEvent = goog.functions.TRUE; +ol.interaction.DragAndDrop.prototype.setMap = function(map) { + if(goog.isDef(this.dropListenKey_)) { + goog.events.unlistenByKey(this.dropListenKey_); + this.dropListenKey_ = undefined + } + if(!goog.isNull(this.fileDropHandler_)) { + goog.dispose(this.fileDropHandler_); + this.fileDropHandler_ = null + } + goog.asserts.assert(!goog.isDef(this.dropListenKey_)); + goog.base(this, "setMap", map); + if(!goog.isNull(map)) { + this.fileDropHandler_ = new goog.events.FileDropHandler(map.getViewport()); + this.dropListenKey_ = goog.events.listen(this.fileDropHandler_, goog.events.FileDropHandler.EventType.DROP, this.handleDrop_, false, this) + } +}; +ol.interaction.DragAndDrop.prototype.tryReadFeatures_ = function(format, text) { + try { + return format.readFeatures(text) + }catch(e) { + return null + } +}; +ol.interaction.DragAndDropEventType = {ADD_FEATURES:"addfeatures"}; +ol.interaction.DragAndDropEvent = function(type, opt_target, opt_features, opt_projection) { + goog.base(this, type, opt_target); + this.features = opt_features; + this.projection = opt_projection +}; +goog.inherits(ol.interaction.DragAndDropEvent, goog.events.Event); +goog.provide("goog.math.Vec2"); +goog.require("goog.math"); +goog.require("goog.math.Coordinate"); +goog.math.Vec2 = function(x, y) { + this.x = x; + this.y = y +}; +goog.inherits(goog.math.Vec2, goog.math.Coordinate); +goog.math.Vec2.randomUnit = function() { + var angle = Math.random() * Math.PI * 2; + return new goog.math.Vec2(Math.cos(angle), Math.sin(angle)) +}; +goog.math.Vec2.random = function() { + var mag = Math.sqrt(Math.random()); + var angle = Math.random() * Math.PI * 2; + return new goog.math.Vec2(Math.cos(angle) * mag, Math.sin(angle) * mag) +}; +goog.math.Vec2.fromCoordinate = function(a) { + return new goog.math.Vec2(a.x, a.y) +}; +goog.math.Vec2.prototype.clone = function() { + return new goog.math.Vec2(this.x, this.y) +}; +goog.math.Vec2.prototype.magnitude = function() { + return Math.sqrt(this.x * this.x + this.y * this.y) +}; +goog.math.Vec2.prototype.squaredMagnitude = function() { + return this.x * this.x + this.y * this.y +}; +goog.math.Vec2.prototype.scale = (goog.math.Coordinate.prototype.scale); +goog.math.Vec2.prototype.invert = function() { + this.x = -this.x; + this.y = -this.y; + return this +}; +goog.math.Vec2.prototype.normalize = function() { + return this.scale(1 / this.magnitude()) +}; +goog.math.Vec2.prototype.add = function(b) { + this.x += b.x; + this.y += b.y; + return this +}; +goog.math.Vec2.prototype.subtract = function(b) { + this.x -= b.x; + this.y -= b.y; + return this +}; +goog.math.Vec2.prototype.rotate = function(angle) { + var cos = Math.cos(angle); + var sin = Math.sin(angle); + var newX = this.x * cos - this.y * sin; + var newY = this.y * cos + this.x * sin; + this.x = newX; + this.y = newY; + return this +}; +goog.math.Vec2.rotateAroundPoint = function(v, axisPoint, angle) { + var res = v.clone(); + return res.subtract(axisPoint).rotate(angle).add(axisPoint) +}; +goog.math.Vec2.prototype.equals = function(b) { + return this == b || !!b && this.x == b.x && this.y == b.y +}; +goog.math.Vec2.distance = goog.math.Coordinate.distance; +goog.math.Vec2.squaredDistance = goog.math.Coordinate.squaredDistance; +goog.math.Vec2.equals = goog.math.Coordinate.equals; +goog.math.Vec2.sum = function(a, b) { + return new goog.math.Vec2(a.x + b.x, a.y + b.y) +}; +goog.math.Vec2.difference = function(a, b) { + return new goog.math.Vec2(a.x - b.x, a.y - b.y) +}; +goog.math.Vec2.dot = function(a, b) { + return a.x * b.x + a.y * b.y +}; +goog.math.Vec2.lerp = function(a, b, x) { + return new goog.math.Vec2(goog.math.lerp(a.x, b.x, x), goog.math.lerp(a.y, b.y, x)) +}; +goog.provide("ol.interaction.DragRotateAndZoom"); +goog.require("goog.asserts"); +goog.require("goog.math.Vec2"); +goog.require("ol.ViewHint"); +goog.require("ol.events.ConditionType"); +goog.require("ol.events.condition"); +goog.require("ol.interaction.Drag"); +goog.require("ol.interaction.Interaction"); +ol.interaction.DRAGROTATEANDZOOM_ANIMATION_DURATION = 400; +ol.interaction.DragRotateAndZoom = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + this.condition_ = goog.isDef(options.condition) ? options.condition : ol.events.condition.shiftKeyOnly; + this.lastAngle_ = undefined; + this.lastMagnitude_ = undefined; + this.lastScaleDelta_ = 0 +}; +goog.inherits(ol.interaction.DragRotateAndZoom, ol.interaction.Drag); +ol.interaction.DragRotateAndZoom.prototype.handleDrag = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var size = map.getSize(); + var offset = mapBrowserEvent.pixel; + var delta = new goog.math.Vec2(offset[0] - size[0] / 2, size[1] / 2 - offset[1]); + var theta = Math.atan2(delta.y, delta.x); + var magnitude = delta.magnitude(); + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + map.render(); + if(goog.isDef(this.lastAngle_)) { + var angleDelta = theta - this.lastAngle_; + ol.interaction.Interaction.rotateWithoutConstraints(map, view, view2DState.rotation - angleDelta) + } + this.lastAngle_ = theta; + if(goog.isDef(this.lastMagnitude_)) { + var resolution = this.lastMagnitude_ * (view2DState.resolution / magnitude); + ol.interaction.Interaction.zoomWithoutConstraints(map, view, resolution) + } + if(goog.isDef(this.lastMagnitude_)) { + this.lastScaleDelta_ = this.lastMagnitude_ / magnitude + } + this.lastMagnitude_ = magnitude +}; +ol.interaction.DragRotateAndZoom.prototype.handleDragEnd = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var view = map.getView(); + view.setHint(ol.ViewHint.INTERACTING, -1); + var view2D = view.getView2D(); + var view2DState = view2D.getView2DState(); + var direction = this.lastScaleDelta_ - 1; + ol.interaction.Interaction.rotate(map, view2D, view2DState.rotation); + ol.interaction.Interaction.zoom(map, view2D, view2DState.resolution, undefined, ol.interaction.DRAGROTATEANDZOOM_ANIMATION_DURATION, direction); + this.lastScaleDelta_ = 0; + return true +}; +ol.interaction.DragRotateAndZoom.prototype.handleDragStart = function(mapBrowserEvent) { + if(this.condition_(mapBrowserEvent)) { + mapBrowserEvent.map.getView().setHint(ol.ViewHint.INTERACTING, 1); + this.lastAngle_ = undefined; + this.lastMagnitude_ = undefined; + return true + }else { + return false + } +}; +goog.provide("ol.interaction.Modify"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.events"); +goog.require("ol.Collection"); +goog.require("ol.CollectionEventType"); +goog.require("ol.Feature"); +goog.require("ol.FeatureOverlay"); +goog.require("ol.MapBrowserEvent.EventType"); +goog.require("ol.ViewHint"); +goog.require("ol.coordinate"); +goog.require("ol.extent"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.MultiLineString"); +goog.require("ol.geom.MultiPoint"); +goog.require("ol.geom.MultiPolygon"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.Polygon"); +goog.require("ol.interaction.Drag"); +goog.require("ol.structs.RBush"); +ol.interaction.SegmentDataType; +ol.interaction.Modify = function(options) { + goog.base(this); + this.vertexFeature_ = null; + this.vertexSegments_ = null; + this.modifiable_ = false; + this.lastPixel_ = null; + this.rBush_ = null; + this.pixelTolerance_ = goog.isDef(options.pixelTolerance) ? options.pixelTolerance : 20; + this.dragSegments_ = null; + this.overlay_ = new ol.FeatureOverlay({style:options.style}); + this.features_ = options.features; + goog.events.listen(this.features_, ol.CollectionEventType.ADD, this.addFeature_, false, this); + goog.events.listen(this.features_, ol.CollectionEventType.REMOVE, this.removeFeature_, false, this); + this.SEGMENT_WRITERS_ = {"Point":this.writePointGeometry_, "LineString":this.writeLineStringGeometry_, "LinearRing":this.writeLineStringGeometry_, "Polygon":this.writePolygonGeometry_, "MultiPoint":this.writeMultiPointGeometry_, "MultiLineString":this.writeMultiLineStringGeometry_, "MultiPolygon":this.writeMultiPolygonGeometry_, "GeometryCollection":this.writeGeometryCollectionGeometry_} +}; +goog.inherits(ol.interaction.Modify, ol.interaction.Drag); +ol.interaction.Modify.prototype.setMap = function(map) { + if(!goog.isNull(map)) { + if(goog.isNull(this.rBush_)) { + this.rBush_ = new ol.structs.RBush + } + }else { + this.rBush_ = null + } + this.overlay_.setMap(map); + goog.base(this, "setMap", map) +}; +ol.interaction.Modify.prototype.addFeature_ = function(evt) { + var feature = evt.element; + goog.asserts.assertInstanceof(feature, ol.Feature); + var geometry = feature.getGeometry(); + if(goog.isDef(this.SEGMENT_WRITERS_[geometry.getType()])) { + this.SEGMENT_WRITERS_[geometry.getType()].call(this, feature, geometry) + } + this.handleMouseAtPixel_(this.lastPixel_, this.getMap()) +}; +ol.interaction.Modify.prototype.writePointGeometry_ = function(feature, geometry) { + var coordinates = geometry.getCoordinates(); + var segmentData = ({feature:feature, geometry:geometry, segment:[coordinates, coordinates]}); + this.rBush_.insert(geometry.getExtent(), segmentData) +}; +ol.interaction.Modify.prototype.writeMultiPointGeometry_ = function(feature, geometry) { + var points = geometry.getCoordinates(); + var coordinates, i, ii, segmentData; + for(i = 0, ii = points.length;i < ii;++i) { + coordinates = points[i]; + segmentData = ({feature:feature, geometry:geometry, depth:[i], index:i, segment:[coordinates, coordinates]}); + this.rBush_.insert(geometry.getExtent(), segmentData) + } +}; +ol.interaction.Modify.prototype.writeLineStringGeometry_ = function(feature, geometry) { + var coordinates = geometry.getCoordinates(); + var i, ii, segment, segmentData; + for(i = 0, ii = coordinates.length - 1;i < ii;++i) { + segment = coordinates.slice(i, i + 2); + segmentData = ({feature:feature, geometry:geometry, index:i, segment:segment}); + this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData) + } +}; +ol.interaction.Modify.prototype.writeMultiLineStringGeometry_ = function(feature, geometry) { + var lines = geometry.getCoordinates(); + var coordinates, i, ii, j, jj, segment, segmentData; + for(j = 0, jj = lines.length;j < jj;++j) { + coordinates = lines[j]; + for(i = 0, ii = coordinates.length - 1;i < ii;++i) { + segment = coordinates.slice(i, i + 2); + segmentData = ({feature:feature, geometry:geometry, depth:[j], index:i, segment:segment}); + this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData) + } + } +}; +ol.interaction.Modify.prototype.writePolygonGeometry_ = function(feature, geometry) { + var rings = geometry.getCoordinates(); + var coordinates = rings[0]; + var i, ii, segment, segmentData; + for(i = 0, ii = coordinates.length - 1;i < ii;++i) { + segment = coordinates.slice(i, i + 2); + segmentData = ({feature:feature, geometry:geometry, index:i, segment:segment}); + this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData) + } +}; +ol.interaction.Modify.prototype.writeMultiPolygonGeometry_ = function(feature, geometry) { + var polygons = geometry.getCoordinates(); + var coordinates, i, ii, j, jj, segment, segmentData; + for(j = 0, jj = polygons.length;j < jj;++j) { + coordinates = polygons[j][0]; + for(i = 0, ii = coordinates.length - 1;i < ii;++i) { + segment = coordinates.slice(i, i + 2); + segmentData = ({feature:feature, geometry:geometry, depth:[j], index:i, segment:segment}); + this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData) + } + } +}; +ol.interaction.Modify.prototype.writeGeometryCollectionGeometry_ = function(feature, geometry) { + var i, geometries = geometry.getGeometriesArray(); + for(i = 0;i < geometries.length;++i) { + this.SEGMENT_WRITERS_[geometries[i].getType()].call(this, feature, geometries[i]) + } +}; +ol.interaction.Modify.prototype.removeFeature_ = function(evt) { + var feature = evt.element; + var rBush = this.rBush_; + var i, nodesToRemove = []; + rBush.forEachInExtent(feature.getGeometry().getExtent(), function(node) { + if(feature === node.feature) { + nodesToRemove.push(node) + } + }); + for(i = nodesToRemove.length - 1;i >= 0;--i) { + rBush.remove(nodesToRemove[i]) + } + if(!goog.isNull(this.vertexFeature_) && this.features_.getLength() === 0) { + this.overlay_.removeFeature(this.vertexFeature_); + this.vertexFeature_ = null + } +}; +ol.interaction.Modify.prototype.createOrUpdateVertexFeature_ = function(coordinates) { + var vertexFeature = this.vertexFeature_; + if(goog.isNull(vertexFeature)) { + vertexFeature = new ol.Feature(new ol.geom.Point(coordinates)); + this.vertexFeature_ = vertexFeature; + this.overlay_.addFeature(vertexFeature) + }else { + var geometry = (vertexFeature.getGeometry()); + geometry.setCoordinates(coordinates) + } + return vertexFeature +}; +ol.interaction.Modify.prototype.handleDragStart = function(evt) { + this.dragSegments_ = []; + var vertexFeature = this.vertexFeature_; + if(!goog.isNull(vertexFeature)) { + var insertVertices = []; + var geometry = (vertexFeature.getGeometry()); + var vertex = geometry.getCoordinates(); + var vertexExtent = ol.extent.boundingExtent([vertex]); + var segmentDataMatches = []; + this.rBush_.forEachInExtent(vertexExtent, function(segmentData) { + segmentDataMatches.push(segmentData) + }); + var distinctFeatures = {}; + for(var i = 0, ii = segmentDataMatches.length;i < ii;++i) { + var segmentDataMatch = segmentDataMatches[i]; + var segment = segmentDataMatch.segment; + if(!(goog.getUid(segmentDataMatch.feature) in distinctFeatures)) { + var feature = segmentDataMatch.feature; + distinctFeatures[goog.getUid(feature)] = true + } + if(ol.coordinate.equals(segment[0], vertex)) { + this.dragSegments_.push([segmentDataMatch, 0]) + }else { + if(ol.coordinate.equals(segment[1], vertex)) { + this.dragSegments_.push([segmentDataMatch, 1]) + }else { + if(goog.getUid(segment) in this.vertexSegments_) { + insertVertices.push([segmentDataMatch, vertex]) + } + } + } + } + for(i = insertVertices.length - 1;i >= 0;--i) { + this.insertVertex_.apply(this, insertVertices[i]) + } + } + return this.modifiable_ +}; +ol.interaction.Modify.prototype.handleDrag = function(evt) { + var vertex = evt.coordinate; + for(var i = 0, ii = this.dragSegments_.length;i < ii;++i) { + var dragSegment = this.dragSegments_[i]; + var segmentData = dragSegment[0]; + var depth = segmentData.depth; + var geometry = segmentData.geometry; + var coordinates = geometry.getCoordinates(); + var segment = segmentData.segment; + var index = dragSegment[1]; + switch(geometry.getType()) { + case ol.geom.GeometryType.POINT: + coordinates = vertex; + segment[0] = segment[1] = vertex; + break; + case ol.geom.GeometryType.MULTI_POINT: + coordinates[segmentData.index] = vertex; + segment[0] = segment[1] = vertex; + break; + case ol.geom.GeometryType.LINE_STRING: + coordinates[segmentData.index + index] = vertex; + segment[index] = vertex; + break; + case ol.geom.GeometryType.MULTI_LINE_STRING: + coordinates[depth[0]][segmentData.index + index] = vertex; + segment[index] = vertex; + break; + case ol.geom.GeometryType.POLYGON: + coordinates[0][segmentData.index + index] = vertex; + segment[index] = vertex; + break; + case ol.geom.GeometryType.MULTI_POLYGON: + coordinates[depth[0]][0][segmentData.index + index] = vertex; + segment[index] = vertex; + break + } + geometry.setCoordinates(coordinates); + var newBounds = ol.extent.boundingExtent(segment); + this.createOrUpdateVertexFeature_(vertex); + this.rBush_.remove(segmentData); + this.rBush_.insert(newBounds, segmentData) + } +}; +ol.interaction.Modify.prototype.handleDragEnd = function(evt) { + var segmentData; + for(var i = this.dragSegments_.length - 1;i >= 0;--i) { + segmentData = this.dragSegments_[i][0]; + this.rBush_.update(ol.extent.boundingExtent(segmentData.segment), segmentData) + } +}; +ol.interaction.Modify.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + if(!mapBrowserEvent.map.getView().getHints()[ol.ViewHint.INTERACTING] && !this.getDragging() && mapBrowserEvent.type == ol.MapBrowserEvent.EventType.MOUSEMOVE) { + this.handleMouseMove_(mapBrowserEvent) + } + goog.base(this, "handleMapBrowserEvent", mapBrowserEvent); + return!this.modifiable_ +}; +ol.interaction.Modify.prototype.handleMouseMove_ = function(evt) { + this.lastPixel_ = evt.pixel; + this.handleMouseAtPixel_(evt.pixel, evt.map) +}; +ol.interaction.Modify.prototype.handleMouseAtPixel_ = function(pixel, map) { + var pixelCoordinate = map.getCoordinateFromPixel(pixel); + var sortByDistance = function(a, b) { + return ol.coordinate.squaredDistanceToSegment(pixelCoordinate, a.segment) - ol.coordinate.squaredDistanceToSegment(pixelCoordinate, b.segment) + }; + var lowerLeft = map.getCoordinateFromPixel([pixel[0] - this.pixelTolerance_, pixel[1] + this.pixelTolerance_]); + var upperRight = map.getCoordinateFromPixel([pixel[0] + this.pixelTolerance_, pixel[1] - this.pixelTolerance_]); + var box = ol.extent.boundingExtent([lowerLeft, upperRight]); + this.modifiable_ = false; + var rBush = this.rBush_; + var nodes = rBush.getInExtent(box); + if(nodes.length > 0) { + nodes.sort(sortByDistance); + var node = nodes[0]; + var closestSegment = node.segment; + var vertex = ol.coordinate.closestOnSegment(pixelCoordinate, closestSegment); + var vertexPixel = map.getPixelFromCoordinate(vertex); + if(Math.sqrt(ol.coordinate.squaredDistance(pixel, vertexPixel)) <= this.pixelTolerance_) { + var pixel1 = map.getPixelFromCoordinate(closestSegment[0]); + var pixel2 = map.getPixelFromCoordinate(closestSegment[1]); + var squaredDist1 = ol.coordinate.squaredDistance(vertexPixel, pixel1); + var squaredDist2 = ol.coordinate.squaredDistance(vertexPixel, pixel2); + var dist = Math.sqrt(Math.min(squaredDist1, squaredDist2)); + if(dist <= 10) { + vertex = squaredDist1 > squaredDist2 ? closestSegment[1] : closestSegment[0] + } + this.createOrUpdateVertexFeature_(vertex); + var vertexSegments = {}; + vertexSegments[goog.getUid(closestSegment)] = true; + var segment; + for(var i = 1, ii = nodes.length;i < ii;++i) { + segment = nodes[i].segment; + if(ol.coordinate.equals(closestSegment[0], segment[0]) && ol.coordinate.equals(closestSegment[1], segment[1]) || ol.coordinate.equals(closestSegment[0], segment[1]) && ol.coordinate.equals(closestSegment[1], segment[0])) { + vertexSegments[goog.getUid(segment)] = true + }else { + break + } + } + this.vertexSegments_ = vertexSegments; + this.modifiable_ = true; + return + } + } + if(!goog.isNull(this.vertexFeature_)) { + this.overlay_.removeFeature(this.vertexFeature_); + this.vertexFeature_ = null + } +}; +ol.interaction.Modify.prototype.insertVertex_ = function(segmentData, vertex) { + var segment = segmentData.segment; + var feature = segmentData.feature; + var geometry = segmentData.geometry; + var depth = segmentData.depth; + var index = segmentData.index; + var coordinates; + switch(geometry.getType()) { + case ol.geom.GeometryType.MULTI_LINE_STRING: + goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString); + coordinates = geometry.getCoordinates(); + coordinates[depth[0]].splice(index + 1, 0, vertex); + break; + case ol.geom.GeometryType.POLYGON: + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + coordinates = geometry.getCoordinates(); + coordinates[0].splice(index + 1, 0, vertex); + break; + case ol.geom.GeometryType.MULTI_POLYGON: + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon); + coordinates = geometry.getCoordinates(); + coordinates[depth[0]][0].splice(index + 1, 0, vertex); + break; + case ol.geom.GeometryType.LINE_STRING: + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + coordinates = geometry.getCoordinates(); + coordinates.splice(index + 1, 0, vertex); + break; + default: + return + } + geometry.setCoordinates(coordinates); + var rTree = this.rBush_; + goog.asserts.assert(goog.isDef(segment)); + rTree.remove(segmentData); + var uid = goog.getUid(feature); + var segmentDataMatches = []; + this.rBush_.forEachInExtent(geometry.getExtent(), function(segmentData) { + if(goog.getUid(segmentData.feature) === uid) { + segmentDataMatches.push(segmentData) + } + }); + for(var i = 0, ii = segmentDataMatches.length;i < ii;++i) { + var segmentDataMatch = segmentDataMatches[i]; + if(segmentDataMatch.geometry === geometry && segmentDataMatch.index > index) { + ++segmentDataMatch.index + } + } + var newSegmentData = ({segment:[segment[0], vertex], feature:feature, geometry:geometry, depth:depth, index:index}); + rTree.insert(ol.extent.boundingExtent(newSegmentData.segment), newSegmentData); + this.dragSegments_.push([newSegmentData, 1]); + var newSegmentData2 = ({segment:[vertex, segment[1]], feature:feature, geometry:geometry, depth:depth, index:index + 1}); + rTree.insert(ol.extent.boundingExtent(newSegmentData2.segment), newSegmentData2); + this.dragSegments_.push([newSegmentData2, 0]) +}; +goog.provide("ol.interaction.Select"); +goog.require("goog.array"); +goog.require("goog.functions"); +goog.require("ol.FeatureOverlay"); +goog.require("ol.events.condition"); +goog.require("ol.interaction.Interaction"); +ol.interaction.Select = function(options) { + goog.base(this); + this.condition_ = goog.isDef(options.condition) ? options.condition : ol.events.condition.singleClick; + this.addCondition_ = goog.isDef(options.addCondition) ? options.addCondition : ol.events.condition.shiftKeyOnly; + var layerFilter; + if(goog.isDef(options.layerFilter)) { + layerFilter = options.layerFilter + }else { + if(goog.isDef(options.layer)) { + var layer = options.layer; + layerFilter = function(l) { + return l === layer + } + }else { + if(goog.isDef(options.layers)) { + var layers = options.layers; + layerFilter = function(layer) { + return goog.array.indexOf(layers, layer) != -1 + } + }else { + layerFilter = goog.functions.TRUE + } + } + } + this.layerFilter_ = layerFilter; + this.featureOverlay_ = new ol.FeatureOverlay({style:options.style}) +}; +goog.inherits(ol.interaction.Select, ol.interaction.Interaction); +ol.interaction.Select.prototype.getFeatures = function() { + return this.featureOverlay_.getFeatures() +}; +ol.interaction.Select.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + if(!this.condition_(mapBrowserEvent)) { + return true + } + var add = this.addCondition_(mapBrowserEvent); + var map = mapBrowserEvent.map; + var features = this.featureOverlay_.getFeatures(); + if(add) { + map.forEachFeatureAtPixel(mapBrowserEvent.pixel, function(feature, layer) { + if(goog.array.indexOf(features.getArray(), feature) == -1) { + features.push(feature) + } + }, undefined, this.layerFilter_) + }else { + var feature = map.forEachFeatureAtPixel(mapBrowserEvent.pixel, function(feature, layer) { + return feature + }, undefined, this.layerFilter_); + if(goog.isDef(feature)) { + if(features.getLength() == 1) { + if(features.getAt(0) !== feature) { + features.setAt(0, feature) + } + }else { + if(features.getLength() != 1) { + features.clear() + } + features.push(feature) + } + }else { + if(features.getLength() !== 0) { + features.clear() + } + } + } + return false +}; +ol.interaction.Select.prototype.setMap = function(map) { + goog.base(this, "setMap", map); + this.featureOverlay_.setMap(map) +}; +goog.provide("ol.layer.Heatmap"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("ol.Object"); +goog.require("ol.layer.Vector"); +goog.require("ol.render.EventType"); +goog.require("ol.style.Icon"); +goog.require("ol.style.Style"); +ol.layer.HeatmapLayerProperty = {GRADIENT:"gradient"}; +ol.layer.Heatmap = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, (options)); + this.gradient_ = null; + goog.events.listen(this, ol.Object.getChangeEventType(ol.layer.HeatmapLayerProperty.GRADIENT), this.handleGradientChanged_, false, this); + this.setGradient(goog.isDef(options.gradient) ? options.gradient : ol.layer.Heatmap.DEFAULT_GRADIENT); + var radius = goog.isDef(options.radius) ? options.radius : 8; + var blur = goog.isDef(options.blur) ? options.blur : 15; + var shadow = goog.isDef(options.shadow) ? options.shadow : 250; + var style = new ol.style.Style({image:ol.layer.Heatmap.createIcon_(radius, blur, shadow)}); + this.setStyle(style); + goog.events.listen(this, ol.render.EventType.RENDER, this.handleRender_, false, this) +}; +goog.inherits(ol.layer.Heatmap, ol.layer.Vector); +ol.layer.Heatmap.DEFAULT_GRADIENT = ["#00f", "#0ff", "#0f0", "#ff0", "#f00"]; +ol.layer.Heatmap.createGradient_ = function(colors) { + var canvas = goog.dom.createElement(goog.dom.TagName.CANVAS); + var context = canvas.getContext("2d"); + var width = 1; + var height = 256; + canvas.width = width; + canvas.height = height; + var gradient = context.createLinearGradient(0, 0, width, height); + var step = 1 / colors.length; + for(var i = 0, ii = colors.length;i < ii;++i) { + gradient.addColorStop(i * step, colors[i]) + } + context.fillStyle = gradient; + context.fillRect(0, 0, width, height); + return context.getImageData(0, 0, width, height).data +}; +ol.layer.Heatmap.createIcon_ = function(radius, blur, shadow) { + var canvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + var context = canvas.getContext("2d"); + var halfSize = radius + blur + 1; + canvas.width = canvas.height = halfSize * 2; + context.shadowOffsetX = context.shadowOffsetY = shadow; + context.shadowBlur = blur; + context.shadowColor = "#000"; + context.beginPath(); + var center = halfSize - shadow; + context.arc(center, center, radius, 0, Math.PI * 2, true); + context.fill(); + return new ol.style.Icon({src:canvas.toDataURL()}) +}; +ol.layer.Heatmap.prototype.getGradient = function() { + return(this.get(ol.layer.HeatmapLayerProperty.GRADIENT)) +}; +goog.exportProperty(ol.layer.Heatmap.prototype, "getGradient", ol.layer.Heatmap.prototype.getGradient); +ol.layer.Heatmap.prototype.handleGradientChanged_ = function() { + this.gradient_ = ol.layer.Heatmap.createGradient_(this.getGradient()) +}; +ol.layer.Heatmap.prototype.handleRender_ = function(event) { + goog.asserts.assert(event.type == ol.render.EventType.RENDER); + var context = event.context; + var canvas = context.canvas; + var image = context.getImageData(0, 0, canvas.width, canvas.height); + var view8 = image.data; + var i, ii, alpha, offset; + for(i = 0, ii = view8.length;i < ii;i += 4) { + alpha = view8[i + 3] * 4; + if(alpha) { + view8[i] = this.gradient_[alpha]; + view8[i + 1] = this.gradient_[alpha + 1]; + view8[i + 2] = this.gradient_[alpha + 2] + } + } + context.putImageData(image, 0, 0) +}; +ol.layer.Heatmap.prototype.setGradient = function(colors) { + this.set(ol.layer.HeatmapLayerProperty.GRADIENT, colors) +}; +goog.exportProperty(ol.layer.Heatmap.prototype, "setGradient", ol.layer.Heatmap.prototype.setGradient); +goog.provide("ol.parser.Parser"); +ol.parser.Parser = function() { +}; +goog.provide("ol.parser.XML"); +goog.require("goog.dom.xml"); +goog.require("ol.parser.Parser"); +ol.parser.XML = function() { + if(goog.global.ActiveXObject) { + this.xmldom = new ActiveXObject("Microsoft.XMLDOM") + } + this.regExes = {trimSpace:/^\s*|\s*$/g, removeSpace:/\s*/g, splitSpace:/\s+/, trimComma:/\s*,\s*/g} +}; +goog.inherits(ol.parser.XML, ol.parser.Parser); +ol.parser.XML.prototype.readNode = function(node, obj) { + if(!obj) { + obj = {} + } + var group = this.readers[node.namespaceURI] || this.readers[this.defaultNamespaceURI]; + if(group) { + var local = node.localName || node.nodeName.split(":").pop(); + var reader = group[local] || group["*"]; + if(reader) { + reader.apply(this, [node, obj]) + } + } + return obj +}; +ol.parser.XML.prototype.readChildNodes = function(node, obj) { + if(!obj) { + obj = {} + } + var children = node.childNodes; + var child; + for(var i = 0, len = children.length;i < len;++i) { + child = children[i]; + if(child.nodeType == 1) { + this.readNode(child, obj) + } + } + return obj +}; +ol.parser.XML.prototype.getChildValue = function(node, def) { + var value = def || ""; + if(node) { + for(var child = node.firstChild;child;child = child.nextSibling) { + switch(child.nodeType) { + case 3: + ; + case 4: + value += child.nodeValue; + break; + default: + break + } + } + } + return value +}; +ol.parser.XML.prototype.getAttributeNodeNS = function(node, uri, name) { + var attributeNode = null; + if(node.getAttributeNodeNS) { + attributeNode = node.getAttributeNodeNS(uri, name) + }else { + var attributes = node.attributes; + var potentialNode, fullName; + for(var i = 0, len = attributes.length;i < len;++i) { + potentialNode = attributes[i]; + if(potentialNode.namespaceURI == uri) { + fullName = potentialNode.prefix ? potentialNode.prefix + ":" + name : name; + if(fullName == potentialNode.nodeName) { + attributeNode = potentialNode; + break + } + } + } + } + return attributeNode +}; +ol.parser.XML.prototype.getAttributeNS = function(node, uri, name) { + var attributeValue = ""; + if(node.getAttributeNS) { + attributeValue = node.getAttributeNS(uri, name) || "" + }else { + var attributeNode = this.getAttributeNodeNS(node, uri, name); + if(attributeNode) { + attributeValue = attributeNode.nodeValue + } + } + return attributeValue +}; +ol.parser.XML.prototype.createElementNS = function(name, opt_uri) { + var uri = opt_uri ? opt_uri : this.defaultNamespaceURI; + var element; + if(this.xmldom) { + element = this.xmldom.createNode(1, name, uri) + }else { + element = document.createElementNS(uri, name) + } + return element +}; +ol.parser.XML.prototype.writeNode = function(name, obj, opt_uri, opt_parent) { + var child = null; + if(goog.isDef(this.writers)) { + var uri = opt_uri ? opt_uri : this.defaultNamespaceURI; + child = this.writers[uri][name].apply(this, [obj]); + if(opt_parent && child) { + opt_parent.appendChild(child) + } + } + return child +}; +ol.parser.XML.prototype.createTextNode = function(text) { + var node; + if(this.xmldom) { + node = this.xmldom.createTextNode(text) + }else { + node = document.createTextNode(text) + } + return node +}; +ol.parser.XML.prototype.setAttributeNS = function(node, uri, name, value) { + if(node.setAttributeNS) { + node.setAttributeNS(uri, name, value) + }else { + if(this.xmldom) { + if(uri) { + var attribute = node.ownerDocument.createNode(2, name, uri); + attribute.nodeValue = value; + node.setAttributeNode(attribute) + }else { + node.setAttribute(name, value) + } + }else { + throw new Error("setAttributeNS not implemented"); + } + } +}; +ol.parser.XML.prototype.serialize = function(node) { + if(this.xmldom) { + return node.xml + }else { + if(node.nodeType == 1) { + var doc = document.implementation.createDocument("", "", null); + if(doc.importNode) { + doc.appendChild(doc.importNode(node, true)) + }else { + doc.appendChild(node) + } + return goog.dom.xml.serialize(doc) + }else { + return goog.dom.xml.serialize(node) + } + } +}; +ol.parser.XML.prototype.createDocumentFragment = function() { + var element; + if(this.xmldom) { + element = this.xmldom.createDocumentFragment() + }else { + element = document.createDocumentFragment() + } + return element +}; +goog.provide("ol.parser.ogc.ExceptionReport"); +goog.require("goog.dom.xml"); +goog.require("ol.parser.XML"); +ol.parser.ogc.ExceptionReport = function() { + var exceptionReader = function(node, exceptionReport) { + var exception = {code:node.getAttribute("exceptionCode"), locator:node.getAttribute("locator"), texts:[]}; + exceptionReport.exceptions.push(exception); + this.readChildNodes(node, exception) + }; + var exceptionTextReader = function(node, exception) { + var text = this.getChildValue(node); + exception.texts.push(text) + }; + this.readers = {"http://www.opengis.net/ogc":{"ServiceExceptionReport":function(node, obj) { + obj["exceptionReport"] = {}; + obj["exceptionReport"]["exceptions"] = []; + this.readChildNodes(node, obj["exceptionReport"]) + }, "ServiceException":function(node, exceptionReport) { + var exception = {}; + exception["code"] = node.getAttribute("code"); + exception["locator"] = node.getAttribute("locator"); + exception["text"] = this.getChildValue(node); + exceptionReport["exceptions"].push(exception) + }}, "http://www.opengis.net/ows":{"ExceptionReport":function(node, obj) { + obj.success = false; + obj.exceptionReport = {version:node.getAttribute("version"), language:node.getAttribute("language"), exceptions:[]}; + this.readChildNodes(node, obj.exceptionReport) + }, "Exception":function(node, exceptionReport) { + exceptionReader.apply(this, arguments) + }, "ExceptionText":function(node, exception) { + exceptionTextReader.apply(this, arguments) + }}, "http://www.opengis.net/ows/1.1":{"ExceptionReport":function(node, obj) { + obj.exceptionReport = {version:node.getAttribute("version"), language:node.getAttribute("xml:lang"), exceptions:[]}; + this.readChildNodes(node, obj.exceptionReport) + }, "Exception":function(node, exceptionReport) { + exceptionReader.apply(this, arguments) + }, "ExceptionText":function(node, exception) { + exceptionTextReader.apply(this, arguments) + }}}; + goog.base(this) +}; +goog.inherits(ol.parser.ogc.ExceptionReport, ol.parser.XML); +ol.parser.ogc.ExceptionReport.prototype.read = function(data) { + if(goog.isString(data)) { + data = goog.dom.xml.loadXml(data) + } + var exceptionInfo = {}; + exceptionInfo["exceptionReport"] = null; + if(data) { + this.readChildNodes(data, exceptionInfo) + } + return exceptionInfo +}; +goog.provide("ol.parser.ogc.Versioned"); +goog.require("goog.dom.xml"); +goog.require("ol.parser.ogc.ExceptionReport"); +ol.parser.ogc.Versioned = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.options = options; + this.defaultVersion = options.defaultVersion || null; + this.version = options.version; + this.profile = options.profile; + if(goog.isDef(options.allowFallback)) { + this.allowFallback = options.allowFallback + }else { + this.allowFallback = false + } + if(goog.isDef(options.stringifyOutput)) { + this.stringifyOutput = options.stringifyOutput + }else { + this.stringifyOutput = false + } +}; +ol.parser.ogc.Versioned.prototype.getVersion = function(root, opt_options) { + var version; + if(root) { + version = this.version; + if(!version) { + version = root.getAttribute("version"); + if(!version) { + version = this.defaultVersion + } + } + }else { + version = opt_options && opt_options.version || this.version || this.defaultVersion + } + return version +}; +ol.parser.ogc.Versioned.prototype.getParser = function(version) { + version = version || this.defaultVersion; + var profile = this.profile ? "_" + this.profile : ""; + if(!this.parser || this.parser.VERSION != version) { + var format = this.parsers["v" + version.replace(/\./g, "_") + profile]; + if(!format) { + if(profile !== "" && this.allowFallback) { + profile = ""; + format = this.parsers["v" + version.replace(/\./g, "_") + profile] + } + if(!format) { + throw"Can't find a parser for version " + version + profile; + } + } + this.parser = new format(this.options) + } + return this.parser +}; +ol.parser.ogc.Versioned.prototype.write = function(obj, opt_options) { + var version = this.getVersion(null, opt_options); + this.parser = this.getParser(version); + var root = this.parser.write(obj, opt_options); + if(this.stringifyOutput === false) { + return root + }else { + return goog.dom.xml.serialize(root) + } +}; +ol.parser.ogc.Versioned.prototype.read = function(data, opt_options) { + if(goog.isString(data)) { + data = goog.dom.xml.loadXml(data) + } + var root = data.documentElement; + var version = this.getVersion(root); + this.parser = this.getParser(version); + var obj = this.parser.read(data, opt_options); + var errorProperty = this.parser.errorProperty || null; + if(errorProperty !== null && obj[errorProperty] === undefined) { + var format = new ol.parser.ogc.ExceptionReport; + obj.error = format.read(data) + } + obj.version = version; + return obj +}; +goog.provide("ol.parser.ogc.WMSCapabilities_v1"); +goog.require("goog.dom.xml"); +goog.require("goog.object"); +goog.require("ol.parser.XML"); +ol.parser.ogc.WMSCapabilities_v1 = function() { + this.defaultNamespaceURI = "http://www.opengis.net/wms"; + this.errorProperty = "service"; + this.readers = {"http://www.opengis.net/wms":{"Service":function(node, obj) { + obj["service"] = {}; + this.readChildNodes(node, obj["service"]) + }, "Name":function(node, obj) { + obj["name"] = this.getChildValue(node) + }, "Title":function(node, obj) { + obj["title"] = this.getChildValue(node) + }, "Abstract":function(node, obj) { + obj["abstract"] = this.getChildValue(node) + }, "BoundingBox":function(node, obj) { + var bbox = {}; + bbox["bbox"] = [parseFloat(node.getAttribute("minx")), parseFloat(node.getAttribute("miny")), parseFloat(node.getAttribute("maxx")), parseFloat(node.getAttribute("maxy"))]; + var res = {x:parseFloat(node.getAttribute("resx")), y:parseFloat(node.getAttribute("resy"))}; + if(!(isNaN(res.x) && isNaN(res.y))) { + bbox["res"] = res + } + return bbox + }, "OnlineResource":function(node, obj) { + obj["href"] = this.getAttributeNS(node, "http://www.w3.org/1999/xlink", "href") + }, "ContactInformation":function(node, obj) { + obj["contactInformation"] = {}; + this.readChildNodes(node, obj["contactInformation"]) + }, "ContactPersonPrimary":function(node, obj) { + obj["personPrimary"] = {}; + this.readChildNodes(node, obj["personPrimary"]) + }, "ContactPerson":function(node, obj) { + obj["person"] = this.getChildValue(node) + }, "ContactOrganization":function(node, obj) { + obj["organization"] = this.getChildValue(node) + }, "ContactPosition":function(node, obj) { + obj["position"] = this.getChildValue(node) + }, "ContactAddress":function(node, obj) { + obj["contactAddress"] = {}; + this.readChildNodes(node, obj["contactAddress"]) + }, "AddressType":function(node, obj) { + obj["type"] = this.getChildValue(node) + }, "Address":function(node, obj) { + obj["address"] = this.getChildValue(node) + }, "City":function(node, obj) { + obj["city"] = this.getChildValue(node) + }, "StateOrProvince":function(node, obj) { + obj["stateOrProvince"] = this.getChildValue(node) + }, "PostCode":function(node, obj) { + obj["postcode"] = this.getChildValue(node) + }, "Country":function(node, obj) { + obj["country"] = this.getChildValue(node) + }, "ContactVoiceTelephone":function(node, obj) { + obj["phone"] = this.getChildValue(node) + }, "ContactFacsimileTelephone":function(node, obj) { + obj["fax"] = this.getChildValue(node) + }, "ContactElectronicMailAddress":function(node, obj) { + obj["email"] = this.getChildValue(node) + }, "Fees":function(node, obj) { + var fees = this.getChildValue(node); + if(fees && fees.toLowerCase() != "none") { + obj["fees"] = fees + } + }, "AccessConstraints":function(node, obj) { + var constraints = this.getChildValue(node); + if(constraints && constraints.toLowerCase() != "none") { + obj["accessConstraints"] = constraints + } + }, "Capability":function(node, obj) { + obj["capability"] = {}; + obj["capability"]["nestedLayers"] = []; + obj["capability"]["layers"] = []; + this.readChildNodes(node, obj["capability"]) + }, "Request":function(node, obj) { + obj["request"] = {}; + this.readChildNodes(node, obj["request"]) + }, "GetCapabilities":function(node, obj) { + obj["getcapabilities"] = {}; + obj["getcapabilities"]["formats"] = []; + this.readChildNodes(node, obj["getcapabilities"]) + }, "Format":function(node, obj) { + if(goog.isArray(obj["formats"])) { + obj["formats"].push(this.getChildValue(node)) + }else { + obj["format"] = this.getChildValue(node) + } + }, "DCPType":function(node, obj) { + this.readChildNodes(node, obj) + }, "HTTP":function(node, obj) { + this.readChildNodes(node, obj) + }, "Get":function(node, obj) { + obj["get"] = {}; + this.readChildNodes(node, obj["get"]) + }, "Post":function(node, obj) { + obj["post"] = {}; + this.readChildNodes(node, obj["post"]) + }, "GetMap":function(node, obj) { + obj["getmap"] = {}; + obj["getmap"]["formats"] = []; + this.readChildNodes(node, obj["getmap"]) + }, "GetFeatureInfo":function(node, obj) { + obj["getfeatureinfo"] = {}; + obj["getfeatureinfo"]["formats"] = []; + this.readChildNodes(node, obj["getfeatureinfo"]) + }, "Exception":function(node, obj) { + obj["exception"] = {}; + obj["exception"]["formats"] = []; + this.readChildNodes(node, obj["exception"]) + }, "Layer":function(node, obj) { + var parentLayer, capability; + if(obj["capability"]) { + capability = obj["capability"]; + parentLayer = obj + }else { + capability = obj + } + var attrNode = node.getAttributeNode("queryable"); + var queryable = attrNode && attrNode.specified ? node.getAttribute("queryable") : null; + attrNode = node.getAttributeNode("cascaded"); + var cascaded = attrNode && attrNode.specified ? node.getAttribute("cascaded") : null; + attrNode = node.getAttributeNode("opaque"); + var opaque = attrNode && attrNode.specified ? node.getAttribute("opaque") : null; + var noSubsets = node.getAttribute("noSubsets"); + var fixedWidth = node.getAttribute("fixedWidth"); + var fixedHeight = node.getAttribute("fixedHeight"); + var parent = parentLayer || {}; + var layer = {"nestedLayers":[], "styles":parentLayer ? [].concat(parentLayer["styles"]) : [], "srs":{}, "metadataURLs":[], "bbox":{}, "llbbox":parent["llbbox"], "dimensions":{}, "authorityURLs":{}, "identifiers":{}, "keywords":[], "queryable":queryable && queryable !== "" ? queryable === "1" || queryable === "true" : parent["queryable"] || false, "cascaded":cascaded !== null ? parseInt(cascaded, 10) : parent["cascaded"] || 0, "opaque":opaque ? opaque === "1" || opaque === "true" : parent["opaque"] || + false, "noSubsets":noSubsets !== null ? noSubsets === "1" || noSubsets === "true" : parent["noSubsets"] || false, "fixedWidth":fixedWidth !== null ? parseInt(fixedWidth, 10) : parent["fixedWidth"] || 0, "fixedHeight":fixedHeight !== null ? parseInt(fixedHeight, 10) : parent["fixedHeight"] || 0, "minScale":parent["minScale"], "maxScale":parent["maxScale"], "attribution":parent["attribution"]}; + if(parentLayer) { + goog.object.extend(layer["srs"], parent["srs"]); + goog.object.extend(layer["bbox"], parent["bbox"]); + goog.object.extend(layer["dimensions"], parent["dimensions"]); + goog.object.extend(layer["authorityURLs"], parent["authorityURLs"]) + } + obj["nestedLayers"].push(layer); + layer["capability"] = capability; + this.readChildNodes(node, layer); + delete layer["capability"]; + if(layer["name"]) { + var parts = layer["name"].split(":"), request = capability["request"], gfi = request["getfeatureinfo"]; + if(parts.length > 0) { + layer["prefix"] = parts[0] + } + capability["layers"].push(layer); + if(!goog.isDef(layer["formats"])) { + layer["formats"] = request["getmap"]["formats"] + } + if(!goog.isDef(layer["infoFormats"]) && gfi) { + layer["infoFormats"] = gfi["formats"] + } + } + }, "Attribution":function(node, obj) { + obj["attribution"] = {}; + this.readChildNodes(node, obj["attribution"]) + }, "LogoURL":function(node, obj) { + obj["logo"] = {"width":node.getAttribute("width"), "height":node.getAttribute("height")}; + this.readChildNodes(node, obj["logo"]) + }, "Style":function(node, obj) { + var style = {}; + obj["styles"].push(style); + this.readChildNodes(node, style) + }, "LegendURL":function(node, obj) { + var legend = {"width":node.getAttribute("width"), "height":node.getAttribute("height")}; + obj["legend"] = legend; + this.readChildNodes(node, legend) + }, "MetadataURL":function(node, obj) { + var metadataURL = {"type":node.getAttribute("type")}; + obj["metadataURLs"].push(metadataURL); + this.readChildNodes(node, metadataURL) + }, "DataURL":function(node, obj) { + obj["dataURL"] = {}; + this.readChildNodes(node, obj["dataURL"]) + }, "FeatureListURL":function(node, obj) { + obj["featureListURL"] = {}; + this.readChildNodes(node, obj["featureListURL"]) + }, "AuthorityURL":function(node, obj) { + var name = node.getAttribute("name"); + var authority = {}; + this.readChildNodes(node, authority); + obj["authorityURLs"][name] = authority["href"] + }, "Identifier":function(node, obj) { + var authority = node.getAttribute("authority"); + obj["identifiers"][authority] = this.getChildValue(node) + }, "KeywordList":function(node, obj) { + this.readChildNodes(node, obj) + }, "SRS":function(node, obj) { + obj["srs"][this.getChildValue(node)] = true + }}}; + goog.base(this) +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1, ol.parser.XML); +ol.parser.ogc.WMSCapabilities_v1.prototype.read = function(data) { + if(goog.isString(data)) { + data = goog.dom.xml.loadXml(data) + } + if(data && data.nodeType == 9) { + data = data.documentElement + } + var obj = {}; + this.readNode(data, obj); + return obj +}; +goog.provide("ol.parser.ogc.WMSCapabilities_v1_1"); +goog.require("goog.object"); +goog.require("ol.parser.ogc.WMSCapabilities_v1"); +ol.parser.ogc.WMSCapabilities_v1_1 = function() { + goog.base(this); + var bboxreader = this.readers["http://www.opengis.net/wms"]["BoundingBox"]; + goog.object.extend(this.readers["http://www.opengis.net/wms"], {"WMT_MS_Capabilities":function(node, obj) { + this.readChildNodes(node, obj) + }, "Keyword":function(node, obj) { + if(obj["keywords"]) { + obj["keywords"].push({"value":this.getChildValue(node)}) + } + }, "DescribeLayer":function(node, obj) { + obj["describelayer"] = {"formats":[]}; + this.readChildNodes(node, obj["describelayer"]) + }, "GetLegendGraphic":function(node, obj) { + obj["getlegendgraphic"] = {"formats":[]}; + this.readChildNodes(node, obj["getlegendgraphic"]) + }, "GetStyles":function(node, obj) { + obj["getstyles"] = {"formats":[]}; + this.readChildNodes(node, obj["getstyles"]) + }, "PutStyles":function(node, obj) { + obj["putstyles"] = {"formats":[]}; + this.readChildNodes(node, obj["putstyles"]) + }, "UserDefinedSymbolization":function(node, obj) { + var userSymbols = {"supportSLD":parseInt(node.getAttribute("SupportSLD"), 10) == 1, "userLayer":parseInt(node.getAttribute("UserLayer"), 10) == 1, "userStyle":parseInt(node.getAttribute("UserStyle"), 10) == 1, "remoteWFS":parseInt(node.getAttribute("RemoteWFS"), 10) == 1}; + obj["userSymbols"] = userSymbols + }, "LatLonBoundingBox":function(node, obj) { + obj["llbbox"] = [parseFloat(node.getAttribute("minx")), parseFloat(node.getAttribute("miny")), parseFloat(node.getAttribute("maxx")), parseFloat(node.getAttribute("maxy"))] + }, "BoundingBox":function(node, obj) { + var bbox = bboxreader.apply(this, arguments); + bbox["srs"] = node.getAttribute("SRS"); + obj["bbox"][bbox["srs"]] = bbox + }, "ScaleHint":function(node, obj) { + var min = parseFloat(node.getAttribute("min")); + var max = parseFloat(node.getAttribute("max")); + var rad2 = Math.pow(2, 0.5); + var dpi = 25.4 / 0.28; + var ipm = 39.37; + if(min !== 0) { + obj["maxScale"] = parseFloat(min / rad2 * ipm * dpi) + } + if(max != Infinity) { + obj["minScale"] = parseFloat(max / rad2 * ipm * dpi) + } + }, "Dimension":function(node, obj) { + var name = node.getAttribute("name").toLowerCase(); + var dim = {"name":name, "units":node.getAttribute("units"), "unitsymbol":node.getAttribute("unitSymbol")}; + obj["dimensions"][dim.name] = dim + }, "Extent":function(node, obj) { + var name = node.getAttribute("name").toLowerCase(); + if(name in obj["dimensions"]) { + var extent = obj["dimensions"][name]; + extent["nearestVal"] = node.getAttribute("nearestValue") === "1"; + extent["multipleVal"] = node.getAttribute("multipleValues") === "1"; + extent["current"] = node.getAttribute("current") === "1"; + extent["default"] = node.getAttribute("default") || ""; + var values = this.getChildValue(node); + extent["values"] = values.split(",") + } + }}) +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1, ol.parser.ogc.WMSCapabilities_v1); +goog.provide("ol.parser.ogc.WMSCapabilities_v1_1_0"); +goog.require("goog.object"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1"); +ol.parser.ogc.WMSCapabilities_v1_1_0 = function() { + goog.base(this); + this.version = "1.1.0"; + goog.object.extend(this.readers["http://www.opengis.net/wms"], {"SRS":function(node, obj) { + var srs = this.getChildValue(node); + var values = srs.split(/ +/); + for(var i = 0, ii = values.length;i < ii;i++) { + obj["srs"][values[i]] = true + } + }}) +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1_0, ol.parser.ogc.WMSCapabilities_v1_1); +goog.provide("ol.parser.ogc.WMSCapabilities_v1_0_0"); +goog.require("goog.object"); +goog.require("goog.string"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1_0"); +ol.parser.ogc.WMSCapabilities_v1_0_0 = function() { + goog.base(this); + this.version = "1.0.0"; + goog.object.extend(this.readers["http://www.opengis.net/wms"], {"Format":function(node, obj) { + for(var i = 0, ii = node.childNodes.length;i < ii;i++) { + var child = node.childNodes[i]; + var local = child.localName || child.nodeName.split(":").pop(); + if(goog.isArray(obj["formats"])) { + obj["formats"].push(local) + }else { + obj["format"] = local + } + } + }, "Keywords":function(node, obj) { + if(!goog.isDef(obj["keywords"])) { + obj["keywords"] = [] + } + var keywords = this.getChildValue(node).split(/ +/); + for(var i = 0, ii = keywords.length;i < ii;++i) { + if(!goog.string.isEmpty(keywords[i])) { + obj["keywords"].push({"value":keywords[i]}) + } + } + }, "OnlineResource":function(node, obj) { + obj["href"] = this.getChildValue(node) + }, "Get":function(node, obj) { + obj["get"] = {"href":node.getAttribute("onlineResource")} + }, "Post":function(node, obj) { + obj["post"] = {"href":node.getAttribute("onlineResource")} + }, "Map":function(node, obj) { + var reader = this.readers[this.defaultNamespaceURI]["GetMap"]; + reader.apply(this, arguments) + }, "Capabilities":function(node, obj) { + var reader = this.readers[this.defaultNamespaceURI]["GetCapabilities"]; + reader.apply(this, arguments) + }, "FeatureInfo":function(node, obj) { + var reader = this.readers[this.defaultNamespaceURI]["GetFeatureInfo"]; + reader.apply(this, arguments) + }}) +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_0_0, ol.parser.ogc.WMSCapabilities_v1_1_0); +goog.provide("ol.parser.ogc.WMSCapabilities_v1_1_1"); +goog.require("goog.object"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1"); +ol.parser.ogc.WMSCapabilities_v1_1_1 = function() { + goog.base(this); + this.version = "1.1.1"; + goog.object.extend(this.readers["http://www.opengis.net/wms"], {"SRS":function(node, obj) { + obj["srs"][this.getChildValue(node)] = true + }}) +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1_1, ol.parser.ogc.WMSCapabilities_v1_1); +goog.provide("ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC"); +goog.require("goog.object"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1_1"); +ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC = function() { + goog.base(this); + this.profile = "WMSC"; + goog.object.extend(this.readers["http://www.opengis.net/wms"], {"VendorSpecificCapabilities":function(node, obj) { + obj["vendorSpecific"] = {"tileSets":[]}; + this.readChildNodes(node, obj["vendorSpecific"]) + }, "TileSet":function(node, vendorSpecific) { + var tileset = {"srs":{}, "bbox":{}, "resolutions":[]}; + this.readChildNodes(node, tileset); + vendorSpecific.tileSets.push(tileset) + }, "Resolutions":function(node, tileset) { + var res = this.getChildValue(node).split(" "); + for(var i = 0, ii = res.length;i < ii;i++) { + if(res[i] !== "") { + tileset["resolutions"].push(parseFloat(res[i])) + } + } + }, "Width":function(node, tileset) { + tileset["width"] = parseInt(this.getChildValue(node), 10) + }, "Height":function(node, tileset) { + tileset["height"] = parseInt(this.getChildValue(node), 10) + }, "Layers":function(node, tileset) { + tileset["layers"] = this.getChildValue(node) + }, "Styles":function(node, tileset) { + tileset["styles"] = this.getChildValue(node) + }}) +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC, ol.parser.ogc.WMSCapabilities_v1_1_1); +goog.provide("ol.parser.ogc.WMSCapabilities_v1_3_0"); +goog.require("goog.object"); +goog.require("ol.parser.ogc.WMSCapabilities_v1"); +ol.parser.ogc.WMSCapabilities_v1_3_0 = function() { + goog.base(this); + var bboxreader = this.readers["http://www.opengis.net/wms"]["BoundingBox"]; + goog.object.extend(this.readers["http://www.opengis.net/wms"], {"WMS_Capabilities":function(node, obj) { + this.readChildNodes(node, obj) + }, "LayerLimit":function(node, obj) { + obj["layerLimit"] = parseInt(this.getChildValue(node), 10) + }, "MaxWidth":function(node, obj) { + obj["maxWidth"] = parseInt(this.getChildValue(node), 10) + }, "MaxHeight":function(node, obj) { + obj["maxHeight"] = parseInt(this.getChildValue(node), 10) + }, "BoundingBox":function(node, obj) { + var bbox = bboxreader.apply(this, arguments); + bbox["srs"] = node.getAttribute("CRS"); + obj["bbox"][bbox["srs"]] = bbox + }, "CRS":function(node, obj) { + this.readers["http://www.opengis.net/wms"]["SRS"].apply(this, arguments) + }, "EX_GeographicBoundingBox":function(node, obj) { + obj["llbbox"] = []; + this.readChildNodes(node, obj["llbbox"]) + }, "westBoundLongitude":function(node, obj) { + obj[0] = this.getChildValue(node) + }, "eastBoundLongitude":function(node, obj) { + obj[2] = this.getChildValue(node) + }, "southBoundLatitude":function(node, obj) { + obj[1] = this.getChildValue(node) + }, "northBoundLatitude":function(node, obj) { + obj[3] = this.getChildValue(node) + }, "MinScaleDenominator":function(node, obj) { + obj["maxScale"] = parseFloat(this.getChildValue(node)).toPrecision(16) + }, "MaxScaleDenominator":function(node, obj) { + obj["minScale"] = parseFloat(this.getChildValue(node)).toPrecision(16) + }, "Dimension":function(node, obj) { + var name = node.getAttribute("name").toLowerCase(); + var dim = {"name":name, "units":node.getAttribute("units"), "unitsymbol":node.getAttribute("unitSymbol"), "nearestVal":node.getAttribute("nearestValue") === "1", "multipleVal":node.getAttribute("multipleValues") === "1", "default":node.getAttribute("default") || "", "current":node.getAttribute("current") === "1", "values":this.getChildValue(node).split(",")}; + obj["dimensions"][dim["name"]] = dim + }, "Keyword":function(node, obj) { + var keyword = {"value":this.getChildValue(node), "vocabulary":node.getAttribute("vocabulary")}; + if(obj["keywords"]) { + obj["keywords"].push(keyword) + } + }}); + this.readers["sld"] = {"UserDefinedSymbolization":function(node, obj) { + var readers = this.readers["http://www.opengis.net/wms"]; + readers.UserDefinedSymbolization.apply(this, arguments); + var value = node.getAttribute("InlineFeature"); + obj["userSymbols"]["inlineFeature"] = parseInt(value, 10) == 1; + value = node.getAttribute("RemoteWCS"); + obj["userSymbols"]["remoteWCS"] = parseInt(value, 10) == 1 + }, "DescribeLayer":function(node, obj) { + var readers = this.readers["http://www.opengis.net/wms"]; + readers.DescribeLayer.apply(this, arguments) + }, "GetLegendGraphic":function(node, obj) { + var readers = this.readers["http://www.opengis.net/wms"]; + readers.GetLegendGraphic.apply(this, arguments) + }} +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_3_0, ol.parser.ogc.WMSCapabilities_v1); +goog.provide("ol.parser.ogc.WMSCapabilities"); +goog.require("ol.parser.ogc.Versioned"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_0_0"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1_0"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1_1"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_3_0"); +ol.ENABLE_WMSCAPS_1_0_0 = false; +ol.ENABLE_WMSCAPS_1_1_0 = true; +ol.ENABLE_WMSCAPS_1_1_1 = true; +ol.ENABLE_WMSCAPS_1_3_0 = true; +ol.ENABLE_WMSCAPS_1_1_1_WMSC = true; +ol.parser.ogc.WMSCapabilities = function(opt_options) { + opt_options = opt_options || {}; + opt_options["defaultVersion"] = "1.1.1"; + this.parsers = {}; + if(ol.ENABLE_WMSCAPS_1_0_0) { + this.parsers["v1_0_0"] = ol.parser.ogc.WMSCapabilities_v1_0_0 + } + if(ol.ENABLE_WMSCAPS_1_1_0) { + this.parsers["v1_1_0"] = ol.parser.ogc.WMSCapabilities_v1_1_0 + } + if(ol.ENABLE_WMSCAPS_1_1_1) { + this.parsers["v1_1_1"] = ol.parser.ogc.WMSCapabilities_v1_1_1 + } + if(ol.ENABLE_WMSCAPS_1_1_1_WMSC) { + this.parsers["v1_1_1_WMSC"] = ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC + } + if(ol.ENABLE_WMSCAPS_1_3_0) { + this.parsers["v1_3_0"] = ol.parser.ogc.WMSCapabilities_v1_3_0 + } + goog.base(this, opt_options) +}; +goog.inherits(ol.parser.ogc.WMSCapabilities, ol.parser.ogc.Versioned); +goog.provide("ol.proj.CH"); +goog.provide("ol.proj.EPSG2056"); +goog.provide("ol.proj.EPSG21781"); +goog.require("goog.asserts"); +goog.require("goog.math"); +goog.require("ol.ellipsoid.BESSEL1841"); +goog.require("ol.proj"); +goog.require("ol.proj.EPSG4326"); +goog.require("ol.proj.Projection"); +goog.require("ol.proj.Units"); +ol.proj.CH = function(options) { + goog.base(this, {code:options.code, extent:options.extent, global:false, units:ol.proj.Units.METERS}) +}; +goog.inherits(ol.proj.CH, ol.proj.Projection); +ol.proj.CH.PHI0 = goog.math.toRadians((3600 * 46 + 60 * 57 + 8.66) / 3600); +ol.proj.CH.LAMBDA0 = goog.math.toRadians((3600 * 7 + 60 * 26 + 22.5) / 3600); +ol.proj.CH.ELLIPSOID = ol.ellipsoid.BESSEL1841; +ol.proj.CH.COS_PHI0 = Math.cos(ol.proj.CH.PHI0); +ol.proj.CH.SIN_PHI0 = Math.sin(ol.proj.CH.PHI0); +ol.proj.CH.R = ol.proj.CH.ELLIPSOID.a * Math.sqrt(1 - ol.proj.CH.ELLIPSOID.eSquared) / (1 - ol.proj.CH.ELLIPSOID.eSquared * ol.proj.CH.SIN_PHI0 * ol.proj.CH.SIN_PHI0); +ol.proj.CH.ALPHA = Math.sqrt(1 + ol.proj.CH.ELLIPSOID.eSquared * Math.pow(ol.proj.CH.COS_PHI0, 4) / (1 - ol.proj.CH.ELLIPSOID.eSquared)); +ol.proj.CH.SIN_B0 = ol.proj.CH.SIN_PHI0 / ol.proj.CH.ALPHA; +ol.proj.CH.B0 = Math.asin(ol.proj.CH.SIN_B0); +ol.proj.CH.COS_B0 = Math.cos(ol.proj.CH.B0); +ol.proj.CH.K = Math.log(Math.tan(Math.PI / 4 + ol.proj.CH.B0 / 2)) - ol.proj.CH.ALPHA * Math.log(Math.tan(Math.PI / 4 + ol.proj.CH.PHI0 / 2)) + ol.proj.CH.ALPHA * ol.proj.CH.ELLIPSOID.e * Math.log((1 + ol.proj.CH.ELLIPSOID.e * ol.proj.CH.SIN_PHI0) / (1 - ol.proj.CH.ELLIPSOID.e * ol.proj.CH.SIN_PHI0)) / 2; +ol.proj.CH.add = function() { + ol.proj.EPSG2056.add(); + ol.proj.EPSG21781.add(); + var epsg2056 = ol.proj.get("EPSG:2056"); + var epsg21781 = ol.proj.get("EPSG:21781"); + ol.proj.addTransform(epsg2056, epsg21781, goog.partial(ol.proj.CH.translate_, -2E6, -1E6)); + ol.proj.addTransform(epsg21781, epsg2056, goog.partial(ol.proj.CH.translate_, 2E6, 1E6)) +}; +ol.proj.CH.fromEPSG4326Approximate_ = function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if(goog.isDef(opt_output)) { + output = opt_output + }else { + if(dimension > 2) { + output = input.slice() + }else { + output = new Array(n) + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var auxLat, auxLon, i; + for(i = 0;i < n;i += dimension) { + auxLat = 36 * input[i + 1] / 100 - 16.902866; + auxLon = 36 * input[i] / 100 - 2.67825; + output[i] = offsetY + 72.37 + 211455.93 * auxLon - 10938.51 * auxLon * auxLat - 0.36 * auxLon * auxLat * auxLat - 44.54 * auxLon * auxLon * auxLon; + output[i + 1] = offsetX + 147.07 + 308807.95 * auxLat + 3745.25 * auxLon * auxLon + 76.63 * auxLat * auxLat - 194.56 * auxLon * auxLon * auxLat + 119.79 * auxLat * auxLat * auxLat + } + return output +}; +ol.proj.CH.fromEPSG4326Rigorous_ = function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if(goog.isDef(opt_output)) { + output = opt_output + }else { + if(dimension > 2) { + output = input.slice() + }else { + output = new Array(n) + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var b, bBar, eSinPhi, i, l, lambda, lBar, phi, s; + for(i = 0;i < n;i += dimension) { + lambda = goog.math.toRadians(input[i]); + phi = goog.math.toRadians(input[i + 1]); + eSinPhi = ol.proj.CH.ELLIPSOID.e * Math.sin(phi); + s = ol.proj.CH.ALPHA * Math.log(Math.tan(Math.PI / 4 + phi / 2)) - ol.proj.CH.ALPHA * ol.proj.CH.ELLIPSOID.e * Math.log((1 + eSinPhi) / (1 - eSinPhi)) / 2 + ol.proj.CH.K; + b = 2 * (Math.atan(Math.exp(s)) - Math.PI / 4); + l = ol.proj.CH.ALPHA * (lambda - ol.proj.CH.LAMBDA0); + lBar = Math.atan2(Math.sin(l), ol.proj.CH.SIN_B0 * Math.tan(b) + ol.proj.CH.COS_B0 * Math.cos(l)); + bBar = Math.asin(ol.proj.CH.COS_B0 * Math.sin(b) - ol.proj.CH.SIN_B0 * Math.cos(b) * Math.cos(l)); + output[i] = offsetY + ol.proj.CH.R * lBar; + output[i + 1] = offsetX + ol.proj.CH.R * Math.log((1 + Math.sin(bBar)) / (1 - Math.sin(bBar))) / 2 + } + return output +}; +ol.proj.CH.toEPSG4326Approximate_ = function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if(goog.isDef(opt_output)) { + output = opt_output + }else { + if(dimension > 2) { + output = input.slice() + }else { + output = new Array(n) + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var auxX, auxY, i; + for(i = 0;i < n;i += dimension) { + auxY = (input[i] - offsetY) / 1E6; + auxX = (input[i + 1] - offsetX) / 1E6; + output[i] = 100 * (2.6779094 + 4.728982 * auxY + 0.791484 * auxY * auxX + 0.1306 * auxY * auxX * auxX - 0.0436 * auxY * auxY * auxY) / 36; + output[i + 1] = 100 * (16.9023892 + 3.238272 * auxX - 0.270978 * auxY * auxY - 0.002528 * auxX * auxX - 0.0447 * auxY * auxY * auxX - 0.014 * auxX * auxX * auxX) / 36 + } + return output +}; +ol.proj.CH.toEPSG4326Rigorous_ = function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if(goog.isDef(opt_output)) { + output = opt_output + }else { + if(dimension > 2) { + output = input.slice() + }else { + output = new Array(n) + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var b, bBar, eSinPhi, i, iterations, l, lambda, lastPhi, lBar, phi, s, x, y; + for(i = 0;i < n;i += dimension) { + y = input[i] - offsetY; + x = input[i + 1] - offsetX; + lBar = y / ol.proj.CH.R; + bBar = 2 * (Math.atan(Math.exp(x / ol.proj.CH.R)) - Math.PI / 4); + b = Math.asin(ol.proj.CH.COS_B0 * Math.sin(bBar) + ol.proj.CH.SIN_B0 * Math.cos(bBar) * Math.cos(lBar)); + l = Math.atan2(Math.sin(lBar), ol.proj.CH.COS_B0 * Math.cos(lBar) - ol.proj.CH.SIN_B0 * Math.tan(bBar)); + lambda = ol.proj.CH.LAMBDA0 + l / ol.proj.CH.ALPHA; + lastPhi = phi = b; + for(iterations = 20;iterations > 0;--iterations) { + s = (Math.log(Math.tan(Math.PI / 4 + b / 2)) - ol.proj.CH.K) / ol.proj.CH.ALPHA + ol.proj.CH.ELLIPSOID.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(ol.proj.CH.ELLIPSOID.e * Math.sin(phi)) / 2)); + phi = 2 * Math.atan(Math.exp(s)) - Math.PI / 2; + if(Math.abs(phi - lastPhi) < 1E-7) { + break + } + lastPhi = phi + } + goog.asserts.assert(iterations !== 0); + output[i] = goog.math.toDegrees(lambda); + output[i + 1] = goog.math.toDegrees(phi) + } + return output +}; +ol.proj.CH.translate_ = function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if(goog.isDef(opt_output)) { + output = opt_output + }else { + if(dimension > 2) { + output = input.slice() + }else { + output = new Array(n) + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var i; + for(i = 0;i < n;i += dimension) { + output[i] = input[i] + offsetY; + output[i + 1] = input[i + 1] + offsetX + } + return output +}; +ol.proj.CH.prototype.getPointResolution = function(resolution, point) { + return resolution +}; +ol.proj.EPSG2056 = function() { + goog.base(this, {code:"EPSG:2056", extent:ol.proj.EPSG2056.EXTENT}) +}; +goog.inherits(ol.proj.EPSG2056, ol.proj.CH); +ol.proj.EPSG2056.EXTENT = [2485869.5728, 1076443.1884, 2837076.5648, 1299941.7864]; +ol.proj.EPSG2056.add = function() { + ol.proj.addEquivalentProjections(ol.proj.EPSG4326.PROJECTIONS); + var epsg2056 = new ol.proj.EPSG2056; + ol.proj.addProjection(epsg2056); + ol.proj.addEquivalentTransforms(ol.proj.EPSG4326.PROJECTIONS, [epsg2056], goog.partial(ol.proj.CH.fromEPSG4326Rigorous_, 26E5, 12E5), goog.partial(ol.proj.CH.toEPSG4326Rigorous_, 26E5, 12E5)) +}; +ol.proj.EPSG21781 = function() { + goog.base(this, {code:"EPSG:21781", extent:ol.proj.EPSG21781.EXTENT}) +}; +goog.inherits(ol.proj.EPSG21781, ol.proj.CH); +ol.proj.EPSG21781.EXTENT = [485869.5728, 76443.1884, 837076.5648, 299941.7864]; +ol.proj.EPSG21781.add = function() { + ol.proj.addEquivalentProjections(ol.proj.EPSG4326.PROJECTIONS); + var epsg21781 = new ol.proj.EPSG21781; + ol.proj.addProjection(epsg21781); + ol.proj.addEquivalentTransforms(ol.proj.EPSG4326.PROJECTIONS, [epsg21781], goog.partial(ol.proj.CH.fromEPSG4326Rigorous_, 6E5, 2E5), goog.partial(ol.proj.CH.toEPSG4326Rigorous_, 6E5, 2E5)) +}; +goog.provide("goog.net.jsloader"); +goog.provide("goog.net.jsloader.Error"); +goog.provide("goog.net.jsloader.ErrorCode"); +goog.provide("goog.net.jsloader.Options"); +goog.require("goog.array"); +goog.require("goog.async.Deferred"); +goog.require("goog.debug.Error"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.net.jsloader.GLOBAL_VERIFY_OBJS_ = "closure_verification"; +goog.net.jsloader.DEFAULT_TIMEOUT = 5E3; +goog.net.jsloader.Options; +goog.net.jsloader.scriptsToLoad_ = []; +goog.net.jsloader.loadMany = function(uris, opt_options) { + if(!uris.length) { + return + } + var isAnotherModuleLoading = goog.net.jsloader.scriptsToLoad_.length; + goog.array.extend(goog.net.jsloader.scriptsToLoad_, uris); + if(isAnotherModuleLoading) { + return + } + uris = goog.net.jsloader.scriptsToLoad_; + var popAndLoadNextScript = function() { + var uri = uris.shift(); + var deferred = goog.net.jsloader.load(uri, opt_options); + if(uris.length) { + deferred.addBoth(popAndLoadNextScript) + } + }; + popAndLoadNextScript() +}; +goog.net.jsloader.load = function(uri, opt_options) { + var options = opt_options || {}; + var doc = options.document || document; + var script = goog.dom.createElement(goog.dom.TagName.SCRIPT); + var request = {script_:script, timeout_:undefined}; + var deferred = new goog.async.Deferred(goog.net.jsloader.cancel_, request); + var timeout = null; + var timeoutDuration = goog.isDefAndNotNull(options.timeout) ? options.timeout : goog.net.jsloader.DEFAULT_TIMEOUT; + if(timeoutDuration > 0) { + timeout = window.setTimeout(function() { + goog.net.jsloader.cleanup_(script, true); + deferred.errback(new goog.net.jsloader.Error(goog.net.jsloader.ErrorCode.TIMEOUT, "Timeout reached for loading script " + uri)) + }, timeoutDuration); + request.timeout_ = timeout + } + script.onload = script.onreadystatechange = function() { + if(!script.readyState || script.readyState == "loaded" || script.readyState == "complete") { + var removeScriptNode = options.cleanupWhenDone || false; + goog.net.jsloader.cleanup_(script, removeScriptNode, timeout); + deferred.callback(null) + } + }; + script.onerror = function() { + goog.net.jsloader.cleanup_(script, true, timeout); + deferred.errback(new goog.net.jsloader.Error(goog.net.jsloader.ErrorCode.LOAD_ERROR, "Error while loading script " + uri)) + }; + goog.dom.setProperties(script, {"type":"text/javascript", "charset":"UTF-8", "src":uri}); + var scriptParent = goog.net.jsloader.getScriptParentElement_(doc); + scriptParent.appendChild(script); + return deferred +}; +goog.net.jsloader.loadAndVerify = function(uri, verificationObjName, options) { + if(!goog.global[goog.net.jsloader.GLOBAL_VERIFY_OBJS_]) { + goog.global[goog.net.jsloader.GLOBAL_VERIFY_OBJS_] = {} + } + var verifyObjs = goog.global[goog.net.jsloader.GLOBAL_VERIFY_OBJS_]; + if(goog.isDef(verifyObjs[verificationObjName])) { + return goog.async.Deferred.fail(new goog.net.jsloader.Error(goog.net.jsloader.ErrorCode.VERIFY_OBJECT_ALREADY_EXISTS, "Verification object " + verificationObjName + " already defined.")) + } + var sendDeferred = goog.net.jsloader.load(uri, options); + var deferred = new goog.async.Deferred(goog.bind(sendDeferred.cancel, sendDeferred)); + sendDeferred.addCallback(function() { + var result = verifyObjs[verificationObjName]; + if(goog.isDef(result)) { + deferred.callback(result); + delete verifyObjs[verificationObjName] + }else { + deferred.errback(new goog.net.jsloader.Error(goog.net.jsloader.ErrorCode.VERIFY_ERROR, "Script " + uri + " loaded, but verification object " + verificationObjName + " was not defined.")) + } + }); + sendDeferred.addErrback(function(error) { + if(goog.isDef(verifyObjs[verificationObjName])) { + delete verifyObjs[verificationObjName] + } + deferred.errback(error) + }); + return deferred +}; +goog.net.jsloader.getScriptParentElement_ = function(doc) { + var headElements = doc.getElementsByTagName(goog.dom.TagName.HEAD); + if(!headElements || goog.array.isEmpty(headElements)) { + return doc.documentElement + }else { + return headElements[0] + } +}; +goog.net.jsloader.cancel_ = function() { + var request = this; + if(request && request.script_) { + var scriptNode = request.script_; + if(scriptNode && scriptNode.tagName == "SCRIPT") { + goog.net.jsloader.cleanup_(scriptNode, true, request.timeout_) + } + } +}; +goog.net.jsloader.cleanup_ = function(scriptNode, removeScriptNode, opt_timeout) { + if(goog.isDefAndNotNull(opt_timeout)) { + goog.global.clearTimeout(opt_timeout) + } + scriptNode.onload = goog.nullFunction; + scriptNode.onerror = goog.nullFunction; + scriptNode.onreadystatechange = goog.nullFunction; + if(removeScriptNode) { + window.setTimeout(function() { + goog.dom.removeNode(scriptNode) + }, 0) + } +}; +goog.net.jsloader.ErrorCode = {LOAD_ERROR:0, TIMEOUT:1, VERIFY_ERROR:2, VERIFY_OBJECT_ALREADY_EXISTS:3}; +goog.net.jsloader.Error = function(code, opt_message) { + var msg = "Jsloader error (code #" + code + ")"; + if(opt_message) { + msg += ": " + opt_message + } + goog.base(this, msg); + this.code = code +}; +goog.inherits(goog.net.jsloader.Error, goog.debug.Error); +goog.provide("goog.net.Jsonp"); +goog.require("goog.Uri"); +goog.require("goog.net.jsloader"); +goog.net.Jsonp = function(uri, opt_callbackParamName) { + this.uri_ = new goog.Uri(uri); + this.callbackParamName_ = opt_callbackParamName ? opt_callbackParamName : "callback"; + this.timeout_ = 5E3 +}; +goog.net.Jsonp.CALLBACKS = "_callbacks_"; +goog.net.Jsonp.scriptCounter_ = 0; +goog.net.Jsonp.prototype.setRequestTimeout = function(timeout) { + this.timeout_ = timeout +}; +goog.net.Jsonp.prototype.getRequestTimeout = function() { + return this.timeout_ +}; +goog.net.Jsonp.prototype.send = function(opt_payload, opt_replyCallback, opt_errorCallback, opt_callbackParamValue) { + var payload = opt_payload || null; + var id = opt_callbackParamValue || "_" + (goog.net.Jsonp.scriptCounter_++).toString(36) + goog.now().toString(36); + if(!goog.global[goog.net.Jsonp.CALLBACKS]) { + goog.global[goog.net.Jsonp.CALLBACKS] = {} + } + var uri = this.uri_.clone(); + if(payload) { + goog.net.Jsonp.addPayloadToUri_(payload, uri) + } + if(opt_replyCallback) { + var reply = goog.net.Jsonp.newReplyHandler_(id, opt_replyCallback); + goog.global[goog.net.Jsonp.CALLBACKS][id] = reply; + uri.setParameterValues(this.callbackParamName_, goog.net.Jsonp.CALLBACKS + "." + id) + } + var deferred = goog.net.jsloader.load(uri.toString(), {timeout:this.timeout_, cleanupWhenDone:true}); + var error = goog.net.Jsonp.newErrorHandler_(id, payload, opt_errorCallback); + deferred.addErrback(error); + return{id_:id, deferred_:deferred} +}; +goog.net.Jsonp.prototype.cancel = function(request) { + if(request) { + if(request.deferred_) { + request.deferred_.cancel() + } + if(request.id_) { + goog.net.Jsonp.cleanup_(request.id_, false) + } + } +}; +goog.net.Jsonp.newErrorHandler_ = function(id, payload, opt_errorCallback) { + return function() { + goog.net.Jsonp.cleanup_(id, false); + if(opt_errorCallback) { + opt_errorCallback(payload) + } + } +}; +goog.net.Jsonp.newReplyHandler_ = function(id, replyCallback) { + return function(var_args) { + goog.net.Jsonp.cleanup_(id, true); + replyCallback.apply(undefined, arguments) + } +}; +goog.net.Jsonp.cleanup_ = function(id, deleteReplyHandler) { + if(goog.global[goog.net.Jsonp.CALLBACKS][id]) { + if(deleteReplyHandler) { + delete goog.global[goog.net.Jsonp.CALLBACKS][id] + }else { + goog.global[goog.net.Jsonp.CALLBACKS][id] = goog.nullFunction + } + } +}; +goog.net.Jsonp.addPayloadToUri_ = function(payload, uri) { + for(var name in payload) { + if(!payload.hasOwnProperty || payload.hasOwnProperty(name)) { + uri.setParameterValues(name, payload[name]) + } + } + return uri +}; +goog.provide("ol.source.TileImage"); +goog.require("goog.asserts"); +goog.require("ol.Attribution"); +goog.require("ol.Extent"); +goog.require("ol.ImageTile"); +goog.require("ol.Tile"); +goog.require("ol.TileCache"); +goog.require("ol.TileCoord"); +goog.require("ol.TileLoadFunctionType"); +goog.require("ol.TileState"); +goog.require("ol.TileUrlFunction"); +goog.require("ol.TileUrlFunctionType"); +goog.require("ol.source.Tile"); +goog.require("ol.tilegrid.TileGrid"); +ol.source.TileImageOptions; +ol.source.TileImage = function(options) { + goog.base(this, {attributions:options.attributions, extent:options.extent, logo:options.logo, opaque:options.opaque, projection:options.projection, tileGrid:options.tileGrid}); + this.tileUrlFunction = goog.isDef(options.tileUrlFunction) ? options.tileUrlFunction : ol.TileUrlFunction.nullTileUrlFunction; + this.crossOrigin = goog.isDef(options.crossOrigin) ? options.crossOrigin : null; + this.tileCache = new ol.TileCache; + this.tileLoadFunction = goog.isDef(options.tileLoadFunction) ? options.tileLoadFunction : ol.source.TileImage.defaultTileLoadFunction; + this.tileClass = goog.isDef(options.tileClass) ? options.tileClass : ol.ImageTile +}; +goog.inherits(ol.source.TileImage, ol.source.Tile); +ol.source.TileImage.defaultTileLoadFunction = function(imageTile, src) { + imageTile.getImage().src = src +}; +ol.source.TileImage.prototype.canExpireCache = function() { + return this.tileCache.canExpireCache() +}; +ol.source.TileImage.prototype.expireCache = function(usedTiles) { + this.tileCache.expireCache(usedTiles) +}; +ol.source.TileImage.prototype.getTile = function(z, x, y, pixelRatio, projection) { + var tileCoordKey = this.getKeyZXY(z, x, y); + if(this.tileCache.containsKey(tileCoordKey)) { + return(this.tileCache.get(tileCoordKey)) + }else { + goog.asserts.assert(projection); + var tileCoord = new ol.TileCoord(z, x, y); + var tileUrl = this.tileUrlFunction(tileCoord, pixelRatio, projection); + var tile = new this.tileClass(tileCoord, goog.isDef(tileUrl) ? ol.TileState.IDLE : ol.TileState.EMPTY, goog.isDef(tileUrl) ? tileUrl : "", this.crossOrigin, this.tileLoadFunction); + this.tileCache.set(tileCoordKey, tile); + return tile + } +}; +ol.source.TileImage.prototype.setTileUrlFunction = function(tileUrlFunction) { + this.tileCache.clear(); + this.tileUrlFunction = tileUrlFunction; + this.dispatchChangeEvent() +}; +ol.source.TileImage.prototype.useTile = function(z, x, y) { + var tileCoordKey = this.getKeyZXY(z, x, y); + if(this.tileCache.containsKey(tileCoordKey)) { + this.tileCache.get(tileCoordKey) + } +}; +goog.provide("ol.tilegrid.XYZ"); +goog.require("goog.math"); +goog.require("ol.TileCoord"); +goog.require("ol.TileRange"); +goog.require("ol.proj"); +goog.require("ol.proj.EPSG3857"); +goog.require("ol.tilegrid.TileGrid"); +ol.tilegrid.XYZ = function(options) { + var resolutions = new Array(options.maxZoom + 1); + var z; + var size = 2 * ol.proj.EPSG3857.HALF_SIZE / ol.DEFAULT_TILE_SIZE; + for(z = 0;z <= options.maxZoom;++z) { + resolutions[z] = size / Math.pow(2, z) + } + goog.base(this, {minZoom:options.minZoom, origin:[-ol.proj.EPSG3857.HALF_SIZE, ol.proj.EPSG3857.HALF_SIZE], resolutions:resolutions, tileSize:ol.DEFAULT_TILE_SIZE}) +}; +goog.inherits(ol.tilegrid.XYZ, ol.tilegrid.TileGrid); +ol.tilegrid.XYZ.prototype.createTileCoordTransform = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var minZ = this.minZoom; + var maxZ = this.maxZoom; + var wrapX = goog.isDef(options.wrapX) ? options.wrapX : true; + var tmpTileCoord = new ol.TileCoord(0, 0, 0); + var tileRangeByZ = null; + if(goog.isDef(options.extent)) { + tileRangeByZ = new Array(maxZ + 1); + var z; + for(z = 0;z <= maxZ;++z) { + if(z < minZ) { + tileRangeByZ[z] = null + }else { + tileRangeByZ[z] = this.getTileRangeForExtentAndZ(options.extent, z) + } + } + } + return function(tileCoord, projection, opt_tileCoord) { + var z = tileCoord.z; + if(z < minZ || maxZ < z) { + return null + } + var n = Math.pow(2, z); + var x = tileCoord.x; + if(wrapX) { + x = goog.math.modulo(x, n) + }else { + if(x < 0 || n <= x) { + return null + } + } + var y = tileCoord.y; + if(y < -n || -1 < y) { + return null + } + if(!goog.isNull(tileRangeByZ)) { + tmpTileCoord.z = z; + tmpTileCoord.x = x; + tmpTileCoord.y = y; + if(!tileRangeByZ[z].contains(tmpTileCoord)) { + return null + } + } + return ol.TileCoord.createOrUpdate(z, x, -y - 1, opt_tileCoord) + } +}; +ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange = function(tileCoord, opt_tileRange) { + if(tileCoord.z < this.maxZoom) { + return ol.TileRange.createOrUpdate(2 * tileCoord.x, 2 * (tileCoord.x + 1), 2 * tileCoord.y, 2 * (tileCoord.y + 1), opt_tileRange) + }else { + return null + } +}; +ol.tilegrid.XYZ.prototype.forEachTileCoordParentTileRange = function(tileCoord, callback, opt_this, opt_tileRange) { + var tileRange = ol.TileRange.createOrUpdate(0, tileCoord.x, 0, tileCoord.y, opt_tileRange); + var z; + for(z = tileCoord.z - 1;z >= this.minZoom;--z) { + tileRange.minX = tileRange.maxX >>= 1; + tileRange.minY = tileRange.maxY >>= 1; + if(callback.call(opt_this, z, tileRange)) { + return true + } + } + return false +}; +goog.provide("ol.source.BingMaps"); +goog.require("goog.Uri"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.net.Jsonp"); +goog.require("ol.Attribution"); +goog.require("ol.TileRange"); +goog.require("ol.TileUrlFunction"); +goog.require("ol.extent"); +goog.require("ol.proj"); +goog.require("ol.source.State"); +goog.require("ol.source.TileImage"); +goog.require("ol.tilegrid.XYZ"); +ol.source.BingMaps = function(options) { + goog.base(this, {crossOrigin:"anonymous", opaque:true, projection:ol.proj.get("EPSG:3857"), state:ol.source.State.LOADING, tileLoadFunction:options.tileLoadFunction}); + this.culture_ = goog.isDef(options.culture) ? options.culture : "en-us"; + var uri = new goog.Uri("//dev.virtualearth.net/REST/v1/Imagery/Metadata/" + options.imagerySet); + var jsonp = new goog.net.Jsonp(uri, "jsonp"); + jsonp.send({"include":"ImageryProviders", "key":options.key}, goog.bind(this.handleImageryMetadataResponse, this)) +}; +goog.inherits(ol.source.BingMaps, ol.source.TileImage); +ol.source.BingMaps.TOS_ATTRIBUTION = new ol.Attribution({html:'\x3ca class\x3d"ol-attribution-bing-tos" target\x3d"_blank" ' + 'href\x3d"http://www.microsoft.com/maps/product/terms.html"\x3e' + "Terms of Use\x3c/a\x3e"}); +ol.source.BingMaps.prototype.handleImageryMetadataResponse = function(response) { + if(response.statusCode != 200 || response.statusDescription != "OK" || response.authenticationResultCode != "ValidCredentials" || response.resourceSets.length != 1 || response.resourceSets[0].resources.length != 1) { + this.setState(ol.source.State.ERROR); + return + } + var brandLogoUri = response.brandLogoUri; + var resource = response.resourceSets[0].resources[0]; + goog.asserts.assert(resource.imageWidth == resource.imageHeight); + var tileGrid = new ol.tilegrid.XYZ({minZoom:resource.zoomMin, maxZoom:resource.zoomMax, tileSize:resource.imageWidth}); + this.tileGrid = tileGrid; + var culture = this.culture_; + this.tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform(tileGrid.createTileCoordTransform(), ol.TileUrlFunction.createFromTileUrlFunctions(goog.array.map(resource.imageUrlSubdomains, function(subdomain) { + var imageUrl = resource.imageUrl.replace("{subdomain}", subdomain).replace("{culture}", culture); + return function(tileCoord, pixelRatio, projection) { + goog.asserts.assert(ol.proj.equivalent(projection, this.getProjection())); + if(goog.isNull(tileCoord)) { + return undefined + }else { + return imageUrl.replace("{quadkey}", tileCoord.quadKey()) + } + } + }))); + if(resource.imageryProviders) { + var transform = ol.proj.getTransformFromProjections(ol.proj.get("EPSG:4326"), this.getProjection()); + var attributions = goog.array.map(resource.imageryProviders, function(imageryProvider) { + var html = imageryProvider.attribution; + var tileRanges = {}; + goog.array.forEach(imageryProvider.coverageAreas, function(coverageArea) { + var minZ = coverageArea.zoomMin; + var maxZ = coverageArea.zoomMax; + var bbox = coverageArea.bbox; + var epsg4326Extent = [bbox[1], bbox[0], bbox[3], bbox[2]]; + var extent = ol.extent.transform(epsg4326Extent, transform); + var tileRange, z, zKey; + for(z = minZ;z <= maxZ;++z) { + zKey = z.toString(); + tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); + if(zKey in tileRanges) { + tileRanges[zKey].push(tileRange) + }else { + tileRanges[zKey] = [tileRange] + } + } + }); + return new ol.Attribution({html:html, tileRanges:tileRanges}) + }); + attributions.push(ol.source.BingMaps.TOS_ATTRIBUTION); + this.setAttributions(attributions) + } + this.setLogo(brandLogoUri); + this.setState(ol.source.State.READY) +}; +goog.provide("goog.net.EventType"); +goog.net.EventType = {COMPLETE:"complete", SUCCESS:"success", ERROR:"error", ABORT:"abort", READY:"ready", READY_STATE_CHANGE:"readystatechange", TIMEOUT:"timeout", INCREMENTAL_DATA:"incrementaldata", PROGRESS:"progress"}; +goog.provide("goog.Timer"); +goog.require("goog.events.EventTarget"); +goog.Timer = function(opt_interval, opt_timerObject) { + goog.events.EventTarget.call(this); + this.interval_ = opt_interval || 1; + this.timerObject_ = opt_timerObject || goog.Timer.defaultTimerObject; + this.boundTick_ = goog.bind(this.tick_, this); + this.last_ = goog.now() +}; +goog.inherits(goog.Timer, goog.events.EventTarget); +goog.Timer.MAX_TIMEOUT_ = 2147483647; +goog.Timer.prototype.enabled = false; +goog.Timer.defaultTimerObject = goog.global; +goog.Timer.intervalScale = 0.8; +goog.Timer.prototype.timer_ = null; +goog.Timer.prototype.getInterval = function() { + return this.interval_ +}; +goog.Timer.prototype.setInterval = function(interval) { + this.interval_ = interval; + if(this.timer_ && this.enabled) { + this.stop(); + this.start() + }else { + if(this.timer_) { + this.stop() + } + } +}; +goog.Timer.prototype.tick_ = function() { + if(this.enabled) { + var elapsed = goog.now() - this.last_; + if(elapsed > 0 && elapsed < this.interval_ * goog.Timer.intervalScale) { + this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_ - elapsed); + return + } + if(this.timer_) { + this.timerObject_.clearTimeout(this.timer_); + this.timer_ = null + } + this.dispatchTick(); + if(this.enabled) { + this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_); + this.last_ = goog.now() + } + } +}; +goog.Timer.prototype.dispatchTick = function() { + this.dispatchEvent(goog.Timer.TICK) +}; +goog.Timer.prototype.start = function() { + this.enabled = true; + if(!this.timer_) { + this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_); + this.last_ = goog.now() + } +}; +goog.Timer.prototype.stop = function() { + this.enabled = false; + if(this.timer_) { + this.timerObject_.clearTimeout(this.timer_); + this.timer_ = null + } +}; +goog.Timer.prototype.disposeInternal = function() { + goog.Timer.superClass_.disposeInternal.call(this); + this.stop(); + delete this.timerObject_ +}; +goog.Timer.TICK = "tick"; +goog.Timer.callOnce = function(listener, opt_delay, opt_handler) { + if(goog.isFunction(listener)) { + if(opt_handler) { + listener = goog.bind(listener, opt_handler) + } + }else { + if(listener && typeof listener.handleEvent == "function") { + listener = goog.bind(listener.handleEvent, listener) + }else { + throw Error("Invalid listener argument"); + } + } + if(opt_delay > goog.Timer.MAX_TIMEOUT_) { + return-1 + }else { + return goog.Timer.defaultTimerObject.setTimeout(listener, opt_delay || 0) + } +}; +goog.Timer.clear = function(timerId) { + goog.Timer.defaultTimerObject.clearTimeout(timerId) +}; +goog.provide("goog.net.ErrorCode"); +goog.net.ErrorCode = {NO_ERROR:0, ACCESS_DENIED:1, FILE_NOT_FOUND:2, FF_SILENT_ERROR:3, CUSTOM_ERROR:4, EXCEPTION:5, HTTP_ERROR:6, ABORT:7, TIMEOUT:8, OFFLINE:9}; +goog.net.ErrorCode.getDebugMessage = function(errorCode) { + switch(errorCode) { + case goog.net.ErrorCode.NO_ERROR: + return"No Error"; + case goog.net.ErrorCode.ACCESS_DENIED: + return"Access denied to content document"; + case goog.net.ErrorCode.FILE_NOT_FOUND: + return"File not found"; + case goog.net.ErrorCode.FF_SILENT_ERROR: + return"Firefox silently errored"; + case goog.net.ErrorCode.CUSTOM_ERROR: + return"Application custom error"; + case goog.net.ErrorCode.EXCEPTION: + return"An exception occurred"; + case goog.net.ErrorCode.HTTP_ERROR: + return"Http response at 400 or 500 level"; + case goog.net.ErrorCode.ABORT: + return"Request was aborted"; + case goog.net.ErrorCode.TIMEOUT: + return"Request timed out"; + case goog.net.ErrorCode.OFFLINE: + return"The resource is not available offline"; + default: + return"Unrecognized error code" + } +}; +goog.provide("goog.net.HttpStatus"); +goog.net.HttpStatus = {CONTINUE:100, SWITCHING_PROTOCOLS:101, OK:200, CREATED:201, ACCEPTED:202, NON_AUTHORITATIVE_INFORMATION:203, NO_CONTENT:204, RESET_CONTENT:205, PARTIAL_CONTENT:206, MULTIPLE_CHOICES:300, MOVED_PERMANENTLY:301, FOUND:302, SEE_OTHER:303, NOT_MODIFIED:304, USE_PROXY:305, TEMPORARY_REDIRECT:307, BAD_REQUEST:400, UNAUTHORIZED:401, PAYMENT_REQUIRED:402, FORBIDDEN:403, NOT_FOUND:404, METHOD_NOT_ALLOWED:405, NOT_ACCEPTABLE:406, PROXY_AUTHENTICATION_REQUIRED:407, REQUEST_TIMEOUT:408, +CONFLICT:409, GONE:410, LENGTH_REQUIRED:411, PRECONDITION_FAILED:412, REQUEST_ENTITY_TOO_LARGE:413, REQUEST_URI_TOO_LONG:414, UNSUPPORTED_MEDIA_TYPE:415, REQUEST_RANGE_NOT_SATISFIABLE:416, EXPECTATION_FAILED:417, INTERNAL_SERVER_ERROR:500, NOT_IMPLEMENTED:501, BAD_GATEWAY:502, SERVICE_UNAVAILABLE:503, GATEWAY_TIMEOUT:504, HTTP_VERSION_NOT_SUPPORTED:505, QUIRK_IE_NO_CONTENT:1223}; +goog.net.HttpStatus.isSuccess = function(status) { + switch(status) { + case goog.net.HttpStatus.OK: + ; + case goog.net.HttpStatus.CREATED: + ; + case goog.net.HttpStatus.ACCEPTED: + ; + case goog.net.HttpStatus.NO_CONTENT: + ; + case goog.net.HttpStatus.PARTIAL_CONTENT: + ; + case goog.net.HttpStatus.NOT_MODIFIED: + ; + case goog.net.HttpStatus.QUIRK_IE_NO_CONTENT: + return true; + default: + return false + } +}; +goog.provide("goog.net.XmlHttpFactory"); +goog.net.XmlHttpFactory = function() { +}; +goog.net.XmlHttpFactory.prototype.cachedOptions_ = null; +goog.net.XmlHttpFactory.prototype.createInstance = goog.abstractMethod; +goog.net.XmlHttpFactory.prototype.getOptions = function() { + return this.cachedOptions_ || (this.cachedOptions_ = this.internalGetOptions()) +}; +goog.net.XmlHttpFactory.prototype.internalGetOptions = goog.abstractMethod; +goog.provide("goog.net.WrapperXmlHttpFactory"); +goog.require("goog.net.XmlHttpFactory"); +goog.net.WrapperXmlHttpFactory = function(xhrFactory, optionsFactory) { + goog.net.XmlHttpFactory.call(this); + this.xhrFactory_ = xhrFactory; + this.optionsFactory_ = optionsFactory +}; +goog.inherits(goog.net.WrapperXmlHttpFactory, goog.net.XmlHttpFactory); +goog.net.WrapperXmlHttpFactory.prototype.createInstance = function() { + return this.xhrFactory_() +}; +goog.net.WrapperXmlHttpFactory.prototype.getOptions = function() { + return this.optionsFactory_() +}; +goog.provide("goog.net.DefaultXmlHttpFactory"); +goog.provide("goog.net.XmlHttp"); +goog.provide("goog.net.XmlHttp.OptionType"); +goog.provide("goog.net.XmlHttp.ReadyState"); +goog.require("goog.net.WrapperXmlHttpFactory"); +goog.require("goog.net.XmlHttpFactory"); +goog.net.XmlHttp = function() { + return goog.net.XmlHttp.factory_.createInstance() +}; +goog.define("goog.net.XmlHttp.ASSUME_NATIVE_XHR", false); +goog.net.XmlHttp.getOptions = function() { + return goog.net.XmlHttp.factory_.getOptions() +}; +goog.net.XmlHttp.OptionType = {USE_NULL_FUNCTION:0, LOCAL_REQUEST_ERROR:1}; +goog.net.XmlHttp.ReadyState = {UNINITIALIZED:0, LOADING:1, LOADED:2, INTERACTIVE:3, COMPLETE:4}; +goog.net.XmlHttp.factory_; +goog.net.XmlHttp.setFactory = function(factory, optionsFactory) { + goog.net.XmlHttp.setGlobalFactory(new goog.net.WrapperXmlHttpFactory((factory), (optionsFactory))) +}; +goog.net.XmlHttp.setGlobalFactory = function(factory) { + goog.net.XmlHttp.factory_ = factory +}; +goog.net.DefaultXmlHttpFactory = function() { + goog.net.XmlHttpFactory.call(this) +}; +goog.inherits(goog.net.DefaultXmlHttpFactory, goog.net.XmlHttpFactory); +goog.net.DefaultXmlHttpFactory.prototype.createInstance = function() { + var progId = this.getProgId_(); + if(progId) { + return new ActiveXObject(progId) + }else { + return new XMLHttpRequest + } +}; +goog.net.DefaultXmlHttpFactory.prototype.internalGetOptions = function() { + var progId = this.getProgId_(); + var options = {}; + if(progId) { + options[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] = true; + options[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] = true + } + return options +}; +goog.net.DefaultXmlHttpFactory.prototype.ieProgId_; +goog.net.DefaultXmlHttpFactory.prototype.getProgId_ = function() { + if(goog.net.XmlHttp.ASSUME_NATIVE_XHR) { + return"" + } + if(!this.ieProgId_ && typeof XMLHttpRequest == "undefined" && typeof ActiveXObject != "undefined") { + var ACTIVE_X_IDENTS = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]; + for(var i = 0;i < ACTIVE_X_IDENTS.length;i++) { + var candidate = ACTIVE_X_IDENTS[i]; + try { + new ActiveXObject(candidate); + this.ieProgId_ = candidate; + return candidate + }catch(e) { + } + } + throw Error("Could not create ActiveXObject. ActiveX might be disabled," + " or MSXML might not be installed"); + } + return(this.ieProgId_) +}; +goog.net.XmlHttp.setGlobalFactory(new goog.net.DefaultXmlHttpFactory); +goog.provide("goog.net.XhrIo"); +goog.provide("goog.net.XhrIo.ResponseType"); +goog.require("goog.Timer"); +goog.require("goog.array"); +goog.require("goog.debug.entryPointRegistry"); +goog.require("goog.events.EventTarget"); +goog.require("goog.json"); +goog.require("goog.log"); +goog.require("goog.net.ErrorCode"); +goog.require("goog.net.EventType"); +goog.require("goog.net.HttpStatus"); +goog.require("goog.net.XmlHttp"); +goog.require("goog.object"); +goog.require("goog.string"); +goog.require("goog.structs"); +goog.require("goog.structs.Map"); +goog.require("goog.uri.utils"); +goog.require("goog.userAgent"); +goog.net.XhrIo = function(opt_xmlHttpFactory) { + goog.base(this); + this.headers = new goog.structs.Map; + this.xmlHttpFactory_ = opt_xmlHttpFactory || null; + this.active_ = false; + this.xhr_ = null; + this.xhrOptions_ = null; + this.lastUri_ = ""; + this.lastMethod_ = ""; + this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR; + this.lastError_ = ""; + this.errorDispatched_ = false; + this.inSend_ = false; + this.inOpen_ = false; + this.inAbort_ = false; + this.timeoutInterval_ = 0; + this.timeoutId_ = null; + this.responseType_ = goog.net.XhrIo.ResponseType.DEFAULT; + this.withCredentials_ = false; + this.useXhr2Timeout_ = false +}; +goog.inherits(goog.net.XhrIo, goog.events.EventTarget); +goog.net.XhrIo.ResponseType = {DEFAULT:"", TEXT:"text", DOCUMENT:"document", BLOB:"blob", ARRAY_BUFFER:"arraybuffer"}; +goog.net.XhrIo.prototype.logger_ = goog.log.getLogger("goog.net.XhrIo"); +goog.net.XhrIo.CONTENT_TYPE_HEADER = "Content-Type"; +goog.net.XhrIo.HTTP_SCHEME_PATTERN = /^https?$/i; +goog.net.XhrIo.METHODS_WITH_FORM_DATA = ["POST", "PUT"]; +goog.net.XhrIo.FORM_CONTENT_TYPE = "application/x-www-form-urlencoded;charset\x3dutf-8"; +goog.net.XhrIo.XHR2_TIMEOUT_ = "timeout"; +goog.net.XhrIo.XHR2_ON_TIMEOUT_ = "ontimeout"; +goog.net.XhrIo.sendInstances_ = []; +goog.net.XhrIo.send = function(url, opt_callback, opt_method, opt_content, opt_headers, opt_timeoutInterval, opt_withCredentials) { + var x = new goog.net.XhrIo; + goog.net.XhrIo.sendInstances_.push(x); + if(opt_callback) { + x.listen(goog.net.EventType.COMPLETE, opt_callback) + } + x.listenOnce(goog.net.EventType.READY, x.cleanupSend_); + if(opt_timeoutInterval) { + x.setTimeoutInterval(opt_timeoutInterval) + } + if(opt_withCredentials) { + x.setWithCredentials(opt_withCredentials) + } + x.send(url, opt_method, opt_content, opt_headers) +}; +goog.net.XhrIo.cleanup = function() { + var instances = goog.net.XhrIo.sendInstances_; + while(instances.length) { + instances.pop().dispose() + } +}; +goog.net.XhrIo.protectEntryPoints = function(errorHandler) { + goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = errorHandler.protectEntryPoint(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_) +}; +goog.net.XhrIo.prototype.cleanupSend_ = function() { + this.dispose(); + goog.array.remove(goog.net.XhrIo.sendInstances_, this) +}; +goog.net.XhrIo.prototype.getTimeoutInterval = function() { + return this.timeoutInterval_ +}; +goog.net.XhrIo.prototype.setTimeoutInterval = function(ms) { + this.timeoutInterval_ = Math.max(0, ms) +}; +goog.net.XhrIo.prototype.setResponseType = function(type) { + this.responseType_ = type +}; +goog.net.XhrIo.prototype.getResponseType = function() { + return this.responseType_ +}; +goog.net.XhrIo.prototype.setWithCredentials = function(withCredentials) { + this.withCredentials_ = withCredentials +}; +goog.net.XhrIo.prototype.getWithCredentials = function() { + return this.withCredentials_ +}; +goog.net.XhrIo.prototype.send = function(url, opt_method, opt_content, opt_headers) { + if(this.xhr_) { + throw Error("[goog.net.XhrIo] Object is active with another request\x3d" + this.lastUri_ + "; newUri\x3d" + url); + } + var method = opt_method ? opt_method.toUpperCase() : "GET"; + this.lastUri_ = url; + this.lastError_ = ""; + this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR; + this.lastMethod_ = method; + this.errorDispatched_ = false; + this.active_ = true; + this.xhr_ = this.createXhr(); + this.xhrOptions_ = this.xmlHttpFactory_ ? this.xmlHttpFactory_.getOptions() : goog.net.XmlHttp.getOptions(); + this.xhr_.onreadystatechange = goog.bind(this.onReadyStateChange_, this); + try { + goog.log.fine(this.logger_, this.formatMsg_("Opening Xhr")); + this.inOpen_ = true; + this.xhr_.open(method, url, true); + this.inOpen_ = false + }catch(err) { + goog.log.fine(this.logger_, this.formatMsg_("Error opening Xhr: " + err.message)); + this.error_(goog.net.ErrorCode.EXCEPTION, err); + return + } + var content = opt_content || ""; + var headers = this.headers.clone(); + if(opt_headers) { + goog.structs.forEach(opt_headers, function(value, key) { + headers.set(key, value) + }) + } + var contentTypeKey = goog.array.find(headers.getKeys(), goog.net.XhrIo.isContentTypeHeader_); + var contentIsFormData = goog.global["FormData"] && content instanceof goog.global["FormData"]; + if(goog.array.contains(goog.net.XhrIo.METHODS_WITH_FORM_DATA, method) && !contentTypeKey && !contentIsFormData) { + headers.set(goog.net.XhrIo.CONTENT_TYPE_HEADER, goog.net.XhrIo.FORM_CONTENT_TYPE) + } + goog.structs.forEach(headers, function(value, key) { + this.xhr_.setRequestHeader(key, value) + }, this); + if(this.responseType_) { + this.xhr_.responseType = this.responseType_ + } + if(goog.object.containsKey(this.xhr_, "withCredentials")) { + this.xhr_.withCredentials = this.withCredentials_ + } + try { + this.cleanUpTimeoutTimer_(); + if(this.timeoutInterval_ > 0) { + this.useXhr2Timeout_ = goog.net.XhrIo.shouldUseXhr2Timeout_(this.xhr_); + goog.log.fine(this.logger_, this.formatMsg_("Will abort after " + this.timeoutInterval_ + "ms if incomplete, xhr2 " + this.useXhr2Timeout_)); + if(this.useXhr2Timeout_) { + this.xhr_[goog.net.XhrIo.XHR2_TIMEOUT_] = this.timeoutInterval_; + this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] = goog.bind(this.timeout_, this) + }else { + this.timeoutId_ = goog.Timer.callOnce(this.timeout_, this.timeoutInterval_, this) + } + } + goog.log.fine(this.logger_, this.formatMsg_("Sending request")); + this.inSend_ = true; + this.xhr_.send(content); + this.inSend_ = false + }catch(err) { + goog.log.fine(this.logger_, this.formatMsg_("Send error: " + err.message)); + this.error_(goog.net.ErrorCode.EXCEPTION, err) + } +}; +goog.net.XhrIo.shouldUseXhr2Timeout_ = function(xhr) { + return goog.userAgent.IE && goog.userAgent.isVersionOrHigher(9) && goog.isNumber(xhr[goog.net.XhrIo.XHR2_TIMEOUT_]) && goog.isDef(xhr[goog.net.XhrIo.XHR2_ON_TIMEOUT_]) +}; +goog.net.XhrIo.isContentTypeHeader_ = function(header) { + return goog.string.caseInsensitiveEquals(goog.net.XhrIo.CONTENT_TYPE_HEADER, header) +}; +goog.net.XhrIo.prototype.createXhr = function() { + return this.xmlHttpFactory_ ? this.xmlHttpFactory_.createInstance() : goog.net.XmlHttp() +}; +goog.net.XhrIo.prototype.timeout_ = function() { + if(typeof goog == "undefined") { + }else { + if(this.xhr_) { + this.lastError_ = "Timed out after " + this.timeoutInterval_ + "ms, aborting"; + this.lastErrorCode_ = goog.net.ErrorCode.TIMEOUT; + goog.log.fine(this.logger_, this.formatMsg_(this.lastError_)); + this.dispatchEvent(goog.net.EventType.TIMEOUT); + this.abort(goog.net.ErrorCode.TIMEOUT) + } + } +}; +goog.net.XhrIo.prototype.error_ = function(errorCode, err) { + this.active_ = false; + if(this.xhr_) { + this.inAbort_ = true; + this.xhr_.abort(); + this.inAbort_ = false + } + this.lastError_ = err; + this.lastErrorCode_ = errorCode; + this.dispatchErrors_(); + this.cleanUpXhr_() +}; +goog.net.XhrIo.prototype.dispatchErrors_ = function() { + if(!this.errorDispatched_) { + this.errorDispatched_ = true; + this.dispatchEvent(goog.net.EventType.COMPLETE); + this.dispatchEvent(goog.net.EventType.ERROR) + } +}; +goog.net.XhrIo.prototype.abort = function(opt_failureCode) { + if(this.xhr_ && this.active_) { + goog.log.fine(this.logger_, this.formatMsg_("Aborting")); + this.active_ = false; + this.inAbort_ = true; + this.xhr_.abort(); + this.inAbort_ = false; + this.lastErrorCode_ = opt_failureCode || goog.net.ErrorCode.ABORT; + this.dispatchEvent(goog.net.EventType.COMPLETE); + this.dispatchEvent(goog.net.EventType.ABORT); + this.cleanUpXhr_() + } +}; +goog.net.XhrIo.prototype.disposeInternal = function() { + if(this.xhr_) { + if(this.active_) { + this.active_ = false; + this.inAbort_ = true; + this.xhr_.abort(); + this.inAbort_ = false + } + this.cleanUpXhr_(true) + } + goog.base(this, "disposeInternal") +}; +goog.net.XhrIo.prototype.onReadyStateChange_ = function() { + if(this.isDisposed()) { + return + } + if(!this.inOpen_ && !this.inSend_ && !this.inAbort_) { + this.onReadyStateChangeEntryPoint_() + }else { + this.onReadyStateChangeHelper_() + } +}; +goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = function() { + this.onReadyStateChangeHelper_() +}; +goog.net.XhrIo.prototype.onReadyStateChangeHelper_ = function() { + if(!this.active_) { + return + } + if(typeof goog == "undefined") { + }else { + if(this.xhrOptions_[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] && this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE && this.getStatus() == 2) { + goog.log.fine(this.logger_, this.formatMsg_("Local request error detected and ignored")) + }else { + if(this.inSend_ && this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE) { + goog.Timer.callOnce(this.onReadyStateChange_, 0, this); + return + } + this.dispatchEvent(goog.net.EventType.READY_STATE_CHANGE); + if(this.isComplete()) { + goog.log.fine(this.logger_, this.formatMsg_("Request complete")); + this.active_ = false; + try { + if(this.isSuccess()) { + this.dispatchEvent(goog.net.EventType.COMPLETE); + this.dispatchEvent(goog.net.EventType.SUCCESS) + }else { + this.lastErrorCode_ = goog.net.ErrorCode.HTTP_ERROR; + this.lastError_ = this.getStatusText() + " [" + this.getStatus() + "]"; + this.dispatchErrors_() + } + }finally { + this.cleanUpXhr_() + } + } + } + } +}; +goog.net.XhrIo.prototype.cleanUpXhr_ = function(opt_fromDispose) { + if(this.xhr_) { + this.cleanUpTimeoutTimer_(); + var xhr = this.xhr_; + var clearedOnReadyStateChange = this.xhrOptions_[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] ? goog.nullFunction : null; + this.xhr_ = null; + this.xhrOptions_ = null; + if(!opt_fromDispose) { + this.dispatchEvent(goog.net.EventType.READY) + } + try { + xhr.onreadystatechange = clearedOnReadyStateChange + }catch(e) { + goog.log.error(this.logger_, "Problem encountered resetting onreadystatechange: " + e.message) + } + } +}; +goog.net.XhrIo.prototype.cleanUpTimeoutTimer_ = function() { + if(this.xhr_ && this.useXhr2Timeout_) { + this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] = null + } + if(goog.isNumber(this.timeoutId_)) { + goog.Timer.clear(this.timeoutId_); + this.timeoutId_ = null + } +}; +goog.net.XhrIo.prototype.isActive = function() { + return!!this.xhr_ +}; +goog.net.XhrIo.prototype.isComplete = function() { + return this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE +}; +goog.net.XhrIo.prototype.isSuccess = function() { + var status = this.getStatus(); + return goog.net.HttpStatus.isSuccess(status) || status === 0 && !this.isLastUriEffectiveSchemeHttp_() +}; +goog.net.XhrIo.prototype.isLastUriEffectiveSchemeHttp_ = function() { + var scheme = goog.uri.utils.getEffectiveScheme(String(this.lastUri_)); + return goog.net.XhrIo.HTTP_SCHEME_PATTERN.test(scheme) +}; +goog.net.XhrIo.prototype.getReadyState = function() { + return this.xhr_ ? (this.xhr_.readyState) : goog.net.XmlHttp.ReadyState.UNINITIALIZED +}; +goog.net.XhrIo.prototype.getStatus = function() { + try { + return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ? this.xhr_.status : -1 + }catch(e) { + goog.log.warning(this.logger_, "Can not get status: " + e.message); + return-1 + } +}; +goog.net.XhrIo.prototype.getStatusText = function() { + try { + return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ? this.xhr_.statusText : "" + }catch(e) { + goog.log.fine(this.logger_, "Can not get status: " + e.message); + return"" + } +}; +goog.net.XhrIo.prototype.getLastUri = function() { + return String(this.lastUri_) +}; +goog.net.XhrIo.prototype.getResponseText = function() { + try { + return this.xhr_ ? this.xhr_.responseText : "" + }catch(e) { + goog.log.fine(this.logger_, "Can not get responseText: " + e.message); + return"" + } +}; +goog.net.XhrIo.prototype.getResponseBody = function() { + try { + if(this.xhr_ && "responseBody" in this.xhr_) { + return this.xhr_["responseBody"] + } + }catch(e) { + goog.log.fine(this.logger_, "Can not get responseBody: " + e.message) + } + return null +}; +goog.net.XhrIo.prototype.getResponseXml = function() { + try { + return this.xhr_ ? this.xhr_.responseXML : null + }catch(e) { + goog.log.fine(this.logger_, "Can not get responseXML: " + e.message); + return null + } +}; +goog.net.XhrIo.prototype.getResponseJson = function(opt_xssiPrefix) { + if(!this.xhr_) { + return undefined + } + var responseText = this.xhr_.responseText; + if(opt_xssiPrefix && responseText.indexOf(opt_xssiPrefix) == 0) { + responseText = responseText.substring(opt_xssiPrefix.length) + } + return goog.json.parse(responseText) +}; +goog.net.XhrIo.prototype.getResponse = function() { + try { + if(!this.xhr_) { + return null + } + if("response" in this.xhr_) { + return this.xhr_.response + } + switch(this.responseType_) { + case goog.net.XhrIo.ResponseType.DEFAULT: + ; + case goog.net.XhrIo.ResponseType.TEXT: + return this.xhr_.responseText; + case goog.net.XhrIo.ResponseType.ARRAY_BUFFER: + if("mozResponseArrayBuffer" in this.xhr_) { + return this.xhr_.mozResponseArrayBuffer + } + } + goog.log.error(this.logger_, "Response type " + this.responseType_ + " is not " + "supported on this browser"); + return null + }catch(e) { + goog.log.fine(this.logger_, "Can not get response: " + e.message); + return null + } +}; +goog.net.XhrIo.prototype.getResponseHeader = function(key) { + return this.xhr_ && this.isComplete() ? this.xhr_.getResponseHeader(key) : undefined +}; +goog.net.XhrIo.prototype.getAllResponseHeaders = function() { + return this.xhr_ && this.isComplete() ? this.xhr_.getAllResponseHeaders() : "" +}; +goog.net.XhrIo.prototype.getLastErrorCode = function() { + return this.lastErrorCode_ +}; +goog.net.XhrIo.prototype.getLastError = function() { + return goog.isString(this.lastError_) ? this.lastError_ : String(this.lastError_) +}; +goog.net.XhrIo.prototype.formatMsg_ = function(msg) { + return msg + " [" + this.lastMethod_ + " " + this.lastUri_ + " " + this.getStatus() + "]" +}; +goog.debug.entryPointRegistry.register(function(transformer) { + goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = transformer(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_) +}); +goog.provide("ol.source.VectorFile"); +goog.require("goog.asserts"); +goog.require("goog.dispose"); +goog.require("goog.events"); +goog.require("goog.net.EventType"); +goog.require("goog.net.XhrIo"); +goog.require("goog.net.XhrIo.ResponseType"); +goog.require("goog.userAgent"); +goog.require("ol.BrowserFeature"); +goog.require("ol.format.FormatType"); +goog.require("ol.proj"); +goog.require("ol.source.State"); +goog.require("ol.source.Vector"); +goog.require("ol.xml"); +ol.source.VectorFile = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, {attributions:options.attributions, extent:options.extent, logo:options.logo, projection:options.projection}); + this.format = options.format; + if(goog.isDef(options.doc)) { + this.readFeatures_(options.doc) + } + if(goog.isDef(options.node)) { + this.readFeatures_(options.node) + } + if(goog.isDef(options.object)) { + this.readFeatures_(options.object) + } + if(goog.isDef(options.text)) { + this.readFeatures_(options.text) + } + if(goog.isDef(options.arrayBuffer)) { + this.readFeatures_(options.arrayBuffer) + } + if(goog.isDef(options.url) || goog.isDef(options.urls)) { + this.setState(ol.source.State.LOADING); + var type = this.format.getType(); + var responseType; + if(type == ol.format.FormatType.BINARY && ol.BrowserFeature.HAS_ARRAY_BUFFER) { + responseType = goog.net.XhrIo.ResponseType.ARRAY_BUFFER + }else { + responseType = goog.net.XhrIo.ResponseType.TEXT + } + var xhrIo; + if(goog.isDef(options.url)) { + xhrIo = new goog.net.XhrIo; + xhrIo.setResponseType(responseType); + goog.events.listen(xhrIo, goog.net.EventType.COMPLETE, goog.bind(this.handleXhrIo_, this)); + xhrIo.send(options.url) + } + if(goog.isDef(options.urls)) { + var urls = options.urls; + var i, ii; + for(i = 0, ii = urls.length;i < ii;++i) { + xhrIo = new goog.net.XhrIo; + xhrIo.setResponseType(responseType); + goog.events.listen(xhrIo, goog.net.EventType.COMPLETE, goog.bind(this.handleXhrIo_, this)); + xhrIo.send(urls[i]) + } + } + } +}; +goog.inherits(ol.source.VectorFile, ol.source.Vector); +ol.source.VectorFile.prototype.handleXhrIo_ = function(event) { + var xhrIo = event.target; + goog.asserts.assertInstanceof(xhrIo, goog.net.XhrIo); + if(xhrIo.isSuccess()) { + var type = this.format.getType(); + var source; + if(type == ol.format.FormatType.BINARY && ol.BrowserFeature.HAS_ARRAY_BUFFER) { + source = xhrIo.getResponse(); + goog.asserts.assertInstanceof(source, ArrayBuffer) + }else { + if(type == ol.format.FormatType.JSON) { + source = xhrIo.getResponseJson() + }else { + if(type == ol.format.FormatType.TEXT) { + source = xhrIo.getResponseText() + }else { + if(type == ol.format.FormatType.XML) { + if(!goog.userAgent.IE) { + source = xhrIo.getResponseXml() + } + if(!goog.isDefAndNotNull(source)) { + source = ol.xml.load(xhrIo.getResponseText()) + } + }else { + goog.asserts.fail() + } + } + } + } + goog.dispose(xhrIo); + if(goog.isDefAndNotNull(source)) { + this.readFeatures_(source) + }else { + this.setState(ol.source.State.ERROR); + goog.asserts.fail() + } + }else { + this.setState(ol.source.State.ERROR) + } +}; +ol.source.VectorFile.prototype.readFeatures_ = function(source) { + var format = this.format; + var features = format.readFeatures(source); + var featureProjection = format.readProjection(source); + var projection = this.getProjection(); + if(!goog.isNull(projection)) { + if(!ol.proj.equivalent(featureProjection, projection)) { + var transform = ol.proj.getTransform(featureProjection, projection); + var i, ii; + for(i = 0, ii = features.length;i < ii;++i) { + var feature = features[i]; + var geometry = feature.getGeometry(); + if(!goog.isNull(geometry)) { + geometry.transform(transform) + } + } + } + } + this.addFeaturesInternal(features); + this.setState(ol.source.State.READY) +}; +goog.provide("ol.source.GPX"); +goog.require("ol.format.GPX"); +goog.require("ol.source.VectorFile"); +ol.source.GPX = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, {attributions:options.attributions, doc:options.doc, extent:options.extent, format:new ol.format.GPX, logo:options.logo, node:options.node, projection:options.projection, text:options.text, url:options.url, urls:options.urls}) +}; +goog.inherits(ol.source.GPX, ol.source.VectorFile); +goog.provide("ol.source.GeoJSON"); +goog.require("ol.format.GeoJSON"); +goog.require("ol.source.VectorFile"); +ol.source.GeoJSON = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, {attributions:options.attributions, extent:options.extent, format:new ol.format.GeoJSON({defaultProjection:options.defaultProjection}), logo:options.logo, object:options.object, projection:options.projection, text:options.text, url:options.url, urls:options.urls}) +}; +goog.inherits(ol.source.GeoJSON, ol.source.VectorFile); +goog.provide("ol.source.IGC"); +goog.require("ol.format.IGC"); +goog.require("ol.source.VectorFile"); +ol.source.IGC = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, {format:new ol.format.IGC({altitudeMode:options.altitudeMode}), projection:options.projection, text:options.text, url:options.url, urls:options.urls}) +}; +goog.inherits(ol.source.IGC, ol.source.VectorFile); +goog.provide("ol.source.ImageCanvas"); +goog.require("ol.CanvasFunctionType"); +goog.require("ol.ImageCanvas"); +goog.require("ol.extent"); +goog.require("ol.source.Image"); +ol.source.ImageCanvas = function(options) { + goog.base(this, {attributions:options.attributions, extent:options.extent, logo:options.logo, projection:options.projection, resolutions:options.resolutions, state:options.state}); + this.canvasFunction_ = options.canvasFunction; + this.canvas_ = null; + this.renderedRevision_ = 0; + this.ratio_ = goog.isDef(options.ratio) ? options.ratio : 1.5 +}; +goog.inherits(ol.source.ImageCanvas, ol.source.Image); +ol.source.ImageCanvas.prototype.getImage = function(extent, resolution, pixelRatio, projection) { + resolution = this.findNearestResolution(resolution); + var canvas = this.canvas_; + if(!goog.isNull(canvas) && this.renderedRevision_ == this.getRevision() && canvas.getResolution() == resolution && canvas.getPixelRatio() == pixelRatio && ol.extent.containsExtent(canvas.getExtent(), extent)) { + return canvas + } + extent = extent.slice(); + ol.extent.scaleFromCenter(extent, this.ratio_); + var width = (extent[2] - extent[0]) / resolution; + var height = (extent[3] - extent[1]) / resolution; + var size = [width * pixelRatio, height * pixelRatio]; + var canvasElement = this.canvasFunction_(extent, resolution, pixelRatio, size, projection); + if(!goog.isNull(canvasElement)) { + canvas = new ol.ImageCanvas(extent, resolution, pixelRatio, this.getAttributions(), canvasElement) + } + this.canvas_ = canvas; + this.renderedRevision_ = this.getRevision(); + return canvas +}; +goog.provide("ol.source.ImageStatic"); +goog.require("ol.Image"); +goog.require("ol.extent"); +goog.require("ol.proj"); +goog.require("ol.source.Image"); +ol.source.ImageStatic = function(options) { + var attributions = goog.isDef(options.attributions) ? options.attributions : null; + var crossOrigin = goog.isDef(options.crossOrigin) ? options.crossOrigin : null; + var imageExtent = options.imageExtent; + var imageSize = options.imageSize; + var imageResolution = (imageExtent[3] - imageExtent[1]) / imageSize[1]; + var imageUrl = options.url; + var projection = ol.proj.get(options.projection); + goog.base(this, {attributions:attributions, extent:options.extent, logo:options.logo, projection:projection, resolutions:[imageResolution]}); + this.image_ = new ol.Image(imageExtent, imageResolution, 1, attributions, imageUrl, crossOrigin) +}; +goog.inherits(ol.source.ImageStatic, ol.source.Image); +ol.source.ImageStatic.prototype.getImage = function(extent, resolution, pixelRatio, projection) { + if(ol.extent.intersects(extent, this.image_.getExtent())) { + return this.image_ + } + return null +}; +goog.provide("ol.source.ImageVector"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("goog.events"); +goog.require("goog.events.EventType"); +goog.require("goog.vec.Mat4"); +goog.require("ol.extent"); +goog.require("ol.feature"); +goog.require("ol.render.canvas.ReplayGroup"); +goog.require("ol.renderer.vector"); +goog.require("ol.source.ImageCanvas"); +goog.require("ol.source.Vector"); +goog.require("ol.vec.Mat4"); +ol.source.ImageVector = function(options) { + this.source_ = options.source; + this.styleFunction_ = goog.isDef(options.style) ? ol.feature.createStyleFunction(options.style) : ol.feature.defaultStyleFunction; + this.transform_ = goog.vec.Mat4.createNumber(); + this.canvasElement_ = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + this.canvasContext_ = (this.canvasElement_.getContext("2d")); + this.canvasSize_ = [0, 0]; + this.replayGroup_ = null; + goog.base(this, {attributions:options.attributions, canvasFunction:goog.bind(this.canvasFunctionInternal_, this), extent:options.extent, logo:options.logo, projection:options.projection, ratio:options.ratio, resolutions:options.resolutions, state:this.source_.getState()}); + goog.events.listen(this.source_, goog.events.EventType.CHANGE, this.handleSourceChange_, undefined, this) +}; +goog.inherits(ol.source.ImageVector, ol.source.ImageCanvas); +ol.source.ImageVector.prototype.canvasFunctionInternal_ = function(extent, resolution, pixelRatio, size, projection) { + var tolerance = resolution / (2 * pixelRatio); + var replayGroup = new ol.render.canvas.ReplayGroup(tolerance, extent); + var loading = false; + this.source_.forEachFeatureInExtent(extent, function(feature) { + loading = loading || this.renderFeature_(feature, resolution, pixelRatio, replayGroup) + }, this); + replayGroup.finish(); + if(loading) { + return null + } + if(this.canvasSize_[0] != size[0] || this.canvasSize_[1] != size[1]) { + this.canvasElement_.width = size[0]; + this.canvasElement_.height = size[1]; + this.canvasSize_[0] = size[0]; + this.canvasSize_[1] = size[1] + }else { + this.canvasContext_.clearRect(0, 0, size[0], size[1]) + } + var transform = this.getTransform_(ol.extent.getCenter(extent), resolution, pixelRatio, size); + replayGroup.replay(this.canvasContext_, extent, pixelRatio, transform, 0, goog.functions.TRUE); + this.replayGroup_ = replayGroup; + return this.canvasElement_ +}; +ol.source.ImageVector.prototype.forEachFeatureAtPixel = function(extent, resolution, rotation, coordinate, callback) { + if(goog.isNull(this.replayGroup_)) { + return undefined + }else { + return this.replayGroup_.forEachGeometryAtPixel(extent, resolution, 0, coordinate, goog.functions.TRUE, function(geometry, data) { + var feature = (data); + return callback(feature) + }) + } +}; +ol.source.ImageVector.prototype.getTransform_ = function(center, resolution, pixelRatio, size) { + return ol.vec.Mat4.makeTransform2D(this.transform_, size[0] / 2, size[1] / 2, pixelRatio / resolution, -pixelRatio / resolution, 0, -center[0], -center[1]) +}; +ol.source.ImageVector.prototype.handleImageChange_ = function(event) { + this.dispatchChangeEvent() +}; +ol.source.ImageVector.prototype.handleSourceChange_ = function() { + this.setState(this.source_.getState()) +}; +ol.source.ImageVector.prototype.renderFeature_ = function(feature, resolution, pixelRatio, replayGroup) { + var styles = this.styleFunction_(feature, resolution); + if(!goog.isDefAndNotNull(styles)) { + return false + } + var squaredTolerance = resolution * resolution / (4 * pixelRatio * pixelRatio); + var i, ii, loading = false; + for(i = 0, ii = styles.length;i < ii;++i) { + loading = ol.renderer.vector.renderFeature(replayGroup, feature, styles[i], squaredTolerance, feature, this.handleImageChange_, this) || loading + } + return loading +}; +goog.provide("ol.source.wms"); +goog.provide("ol.source.wms.ServerType"); +ol.source.wms.DEFAULT_VERSION = "1.3.0"; +ol.source.wms.ServerType = {CARMENTA_SERVER:"carmentaserver", GEOSERVER:"geoserver", MAPSERVER:"mapserver", QGIS:"qgis"}; +goog.provide("ol.source.ImageWMS"); +goog.require("goog.asserts"); +goog.require("goog.object"); +goog.require("goog.string"); +goog.require("goog.uri.utils"); +goog.require("ol.Image"); +goog.require("ol.extent"); +goog.require("ol.proj"); +goog.require("ol.source.Image"); +goog.require("ol.source.wms"); +goog.require("ol.source.wms.ServerType"); +ol.source.ImageWMS = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, {attributions:options.attributions, extent:options.extent, logo:options.logo, projection:options.projection, resolutions:options.resolutions}); + this.crossOrigin_ = goog.isDef(options.crossOrigin) ? options.crossOrigin : null; + this.url_ = options.url; + this.params_ = options.params; + this.v13_ = true; + this.updateV13_(); + this.serverType_ = (options.serverType); + this.hidpi_ = goog.isDef(options.hidpi) ? options.hidpi : true; + this.image_ = null; + this.imageSize_ = [0, 0]; + this.renderedProjection_ = null; + this.renderedResolution_ = NaN; + this.renderedRevision_ = 0; + this.ratio_ = goog.isDef(options.ratio) ? options.ratio : 1.5 +}; +goog.inherits(ol.source.ImageWMS, ol.source.Image); +ol.source.ImageWMS.prototype.getGetFeatureInfoUrl = function(coordinate, resolution, projection, params) { + goog.asserts.assert(!("VERSION" in params)); + if(!goog.isDef(this.url_) || goog.isNull(this.image_)) { + return undefined + } + goog.asserts.assert(this.imageSize_[0] !== 0 && this.imageSize_[1] !== 0); + goog.asserts.assert(!isNaN(this.renderedResolution_)); + goog.asserts.assert(!goog.isNull(this.renderedProjection_)); + if(resolution != this.renderedResolution_ || !ol.proj.equivalent(projection, this.renderedProjection_)) { + return undefined + } + var extent = this.image_.getExtent(); + var pixelRatio = this.image_.getPixelRatio(); + var baseParams = {"SERVICE":"WMS", "VERSION":ol.source.wms.DEFAULT_VERSION, "REQUEST":"GetFeatureInfo", "FORMAT":"image/png", "TRANSPARENT":true, "QUERY_LAYERS":goog.object.get(this.params_, "LAYERS")}; + goog.object.extend(baseParams, this.params_, params); + var imageResolution = resolution / pixelRatio; + var x = Math.floor((coordinate[0] - extent[0]) / imageResolution); + var y = Math.floor((extent[3] - coordinate[1]) / imageResolution); + goog.object.set(baseParams, this.v13_ ? "I" : "X", x); + goog.object.set(baseParams, this.v13_ ? "J" : "Y", y); + return this.getRequestUrl_(extent, this.imageSize_, pixelRatio, projection, baseParams) +}; +ol.source.ImageWMS.prototype.getParams = function() { + return this.params_ +}; +ol.source.ImageWMS.prototype.getImage = function(extent, resolution, pixelRatio, projection) { + if(!goog.isDef(this.url_)) { + return null + } + resolution = this.findNearestResolution(resolution); + if(pixelRatio != 1 && (!this.hidpi_ || !goog.isDef(this.serverType_))) { + pixelRatio = 1 + } + var image = this.image_; + if(!goog.isNull(image) && this.renderedRevision_ == this.getRevision() && image.getResolution() == resolution && image.getPixelRatio() == pixelRatio && ol.extent.containsExtent(image.getExtent(), extent)) { + return image + } + var params = {"SERVICE":"WMS", "VERSION":ol.source.wms.DEFAULT_VERSION, "REQUEST":"GetMap", "FORMAT":"image/png", "TRANSPARENT":true}; + goog.object.extend(params, this.params_); + extent = extent.slice(); + var centerX = (extent[0] + extent[2]) / 2; + var centerY = (extent[1] + extent[3]) / 2; + if(this.ratio_ != 1) { + var halfWidth = this.ratio_ * (extent[2] - extent[0]) / 2; + var halfHeight = this.ratio_ * (extent[3] - extent[1]) / 2; + extent[0] = centerX - halfWidth; + extent[1] = centerY - halfHeight; + extent[2] = centerX + halfWidth; + extent[3] = centerY + halfHeight + } + var imageResolution = resolution / pixelRatio; + var width = Math.ceil((extent[2] - extent[0]) / imageResolution); + var height = Math.ceil((extent[3] - extent[1]) / imageResolution); + extent[0] = centerX - imageResolution * width / 2; + extent[2] = centerX + imageResolution * width / 2; + extent[1] = centerY - imageResolution * height / 2; + extent[3] = centerY + imageResolution * height / 2; + this.imageSize_[0] = width; + this.imageSize_[1] = height; + var url = this.getRequestUrl_(extent, this.imageSize_, pixelRatio, projection, params); + this.image_ = new ol.Image(extent, resolution, pixelRatio, this.getAttributions(), url, this.crossOrigin_); + this.renderedProjection_ = projection; + this.renderedResolution_ = resolution; + this.renderedRevision_ = this.getRevision(); + return this.image_ +}; +ol.source.ImageWMS.prototype.getRequestUrl_ = function(extent, size, pixelRatio, projection, params) { + goog.asserts.assert(goog.isDef(this.url_)); + params[this.v13_ ? "CRS" : "SRS"] = projection.getCode(); + if(!("STYLES" in this.params_)) { + goog.object.set(params, "STYLES", new String("")) + } + if(pixelRatio != 1) { + switch(this.serverType_) { + case ol.source.wms.ServerType.GEOSERVER: + var dpi = 90 * pixelRatio + 0.5 | 0; + goog.object.set(params, "FORMAT_OPTIONS", "dpi:" + dpi); + break; + case ol.source.wms.ServerType.MAPSERVER: + goog.object.set(params, "MAP_RESOLUTION", 90 * pixelRatio); + break; + case ol.source.wms.ServerType.CARMENTA_SERVER: + ; + case ol.source.wms.ServerType.QGIS: + goog.object.set(params, "DPI", 90 * pixelRatio); + break; + default: + goog.asserts.fail(); + break + } + } + goog.object.set(params, "WIDTH", size[0]); + goog.object.set(params, "HEIGHT", size[1]); + var axisOrientation = projection.getAxisOrientation(); + var bbox; + if(this.v13_ && axisOrientation.substr(0, 2) == "ne") { + bbox = [extent[1], extent[0], extent[3], extent[2]] + }else { + bbox = extent + } + goog.object.set(params, "BBOX", bbox.join(",")); + return goog.uri.utils.appendParamsFromMap(this.url_, params) +}; +ol.source.ImageWMS.prototype.setUrl = function(url) { + if(url != this.url_) { + this.url_ = url; + this.image_ = null; + this.dispatchChangeEvent() + } +}; +ol.source.ImageWMS.prototype.updateParams = function(params) { + goog.object.extend(this.params_, params); + this.updateV13_(); + this.image_ = null; + this.dispatchChangeEvent() +}; +ol.source.ImageWMS.prototype.updateV13_ = function() { + var version = goog.object.get(this.params_, "VERSION", ol.source.wms.DEFAULT_VERSION); + this.v13_ = goog.string.compareVersions(version, "1.3") >= 0 +}; +goog.provide("ol.source.KML"); +goog.require("ol.format.KML"); +goog.require("ol.source.VectorFile"); +ol.source.KML = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, {attributions:options.attributions, doc:options.doc, extent:options.extent, format:new ol.format.KML({defaultStyle:options.defaultStyle}), logo:options.logo, node:options.node, projection:options.projection, text:options.text, url:options.url, urls:options.urls}) +}; +goog.inherits(ol.source.KML, ol.source.VectorFile); +goog.provide("ol.source.MapGuide"); +goog.require("goog.object"); +goog.require("goog.uri.utils"); +goog.require("ol.Image"); +goog.require("ol.ImageUrlFunction"); +goog.require("ol.extent"); +goog.require("ol.source.Image"); +ol.source.MapGuide = function(options) { + goog.base(this, {extent:options.extent, projection:options.projection, resolutions:options.resolutions}); + this.crossOrigin_ = goog.isDef(options.crossOrigin) ? options.crossOrigin : null; + this.displayDpi_ = goog.isDef(options.displayDpi) ? options.displayDpi : 96; + var imageUrlFunction; + if(goog.isDef(options.url)) { + var params = goog.isDef(options.params) ? options.params : {}; + imageUrlFunction = ol.ImageUrlFunction.createFromParamsFunction(options.url, params, goog.bind(this.getUrl, this)) + }else { + imageUrlFunction = ol.ImageUrlFunction.nullImageUrlFunction + } + this.imageUrlFunction_ = imageUrlFunction; + this.hidpi_ = goog.isDef(options.hidpi) ? options.hidpi : true; + this.metersPerUnit_ = goog.isDef(options.metersPerUnit) ? options.metersPerUnit : 1; + this.ratio_ = goog.isDef(options.ratio) ? options.ratio : 1; + this.useOverlay_ = goog.isDef(options.useOverlay) ? options.useOverlay : false; + this.image_ = null +}; +goog.inherits(ol.source.MapGuide, ol.source.Image); +ol.source.MapGuide.prototype.getImage = function(extent, resolution, pixelRatio, projection) { + resolution = this.findNearestResolution(resolution); + pixelRatio = this.hidpi_ ? pixelRatio : 1; + var image = this.image_; + if(!goog.isNull(image) && image.getResolution() == resolution && image.getPixelRatio() == pixelRatio && ol.extent.containsExtent(image.getExtent(), extent)) { + return image + } + if(this.ratio_ != 1) { + extent = extent.slice(); + ol.extent.scaleFromCenter(extent, this.ratio_) + } + var width = (extent[2] - extent[0]) / resolution; + var height = (extent[3] - extent[1]) / resolution; + var size = [width * pixelRatio, height * pixelRatio]; + var imageUrl = this.imageUrlFunction_(extent, size, projection); + if(goog.isDef(imageUrl)) { + image = new ol.Image(extent, resolution, pixelRatio, this.getAttributions(), imageUrl, this.crossOrigin_) + }else { + image = null + } + this.image_ = image; + return image +}; +ol.source.MapGuide.getScale = function(extent, size, metersPerUnit, dpi) { + var mcsW = ol.extent.getWidth(extent); + var mcsH = ol.extent.getHeight(extent); + var devW = size[0]; + var devH = size[1]; + var mpp = 0.0254 / dpi; + if(devH * mcsW > devW * mcsH) { + return mcsW * metersPerUnit / (devW * mpp) + }else { + return mcsH * metersPerUnit / (devH * mpp) + } +}; +ol.source.MapGuide.prototype.getUrl = function(baseUrl, params, extent, size, projection) { + var scale = ol.source.MapGuide.getScale(extent, size, this.metersPerUnit_, this.displayDpi_); + var center = ol.extent.getCenter(extent); + var baseParams = {"OPERATION":this.useOverlay_ ? "GETDYNAMICMAPOVERLAYIMAGE" : "GETMAPIMAGE", "VERSION":"2.0.0", "LOCALE":"en", "CLIENTAGENT":"ol.source.MapGuide source", "CLIP":"1", "SETDISPLAYDPI":this.displayDpi_, "SETDISPLAYWIDTH":Math.round(size[0]), "SETDISPLAYHEIGHT":Math.round(size[1]), "SETVIEWSCALE":scale, "SETVIEWCENTERX":center[0], "SETVIEWCENTERY":center[1]}; + goog.object.extend(baseParams, params); + return goog.uri.utils.appendParamsFromMap(baseUrl, baseParams) +}; +goog.provide("ol.source.XYZ"); +goog.require("ol.Attribution"); +goog.require("ol.TileUrlFunction"); +goog.require("ol.TileUrlFunctionType"); +goog.require("ol.proj"); +goog.require("ol.source.TileImage"); +goog.require("ol.tilegrid.XYZ"); +ol.source.XYZ = function(options) { + var projection = options.projection || ol.proj.get("EPSG:3857"); + var maxZoom = goog.isDef(options.maxZoom) ? options.maxZoom : 18; + var tileGrid = new ol.tilegrid.XYZ({maxZoom:maxZoom}); + goog.base(this, {attributions:options.attributions, crossOrigin:options.crossOrigin, extent:options.extent, logo:options.logo, projection:projection, tileGrid:tileGrid, tileLoadFunction:options.tileLoadFunction, tileUrlFunction:ol.TileUrlFunction.nullTileUrlFunction}); + this.tileCoordTransform_ = tileGrid.createTileCoordTransform({extent:options.extent}); + if(goog.isDef(options.tileUrlFunction)) { + this.setTileUrlFunction(options.tileUrlFunction) + }else { + if(goog.isDef(options.urls)) { + this.setUrls(options.urls) + }else { + if(goog.isDef(options.url)) { + this.setUrl(options.url) + } + } + } +}; +goog.inherits(ol.source.XYZ, ol.source.TileImage); +ol.source.XYZ.prototype.setTileUrlFunction = function(tileUrlFunction) { + goog.base(this, "setTileUrlFunction", ol.TileUrlFunction.withTileCoordTransform(this.tileCoordTransform_, tileUrlFunction)) +}; +ol.source.XYZ.prototype.setUrl = function(url) { + this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates(ol.TileUrlFunction.expandUrl(url))) +}; +ol.source.XYZ.prototype.setUrls = function(urls) { + this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates(urls)) +}; +goog.provide("ol.source.OSM"); +goog.require("ol.Attribution"); +goog.require("ol.source.XYZ"); +ol.source.OSM = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var attributions; + if(goog.isDef(options.attributions)) { + attributions = options.attributions + }else { + attributions = ol.source.OSM.ATTRIBUTIONS + } + var crossOrigin = goog.isDef(options.crossOrigin) ? options.crossOrigin : "anonymous"; + var url = goog.isDef(options.url) ? options.url : "//{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png"; + goog.base(this, {attributions:attributions, crossOrigin:crossOrigin, opaque:true, maxZoom:options.maxZoom, tileLoadFunction:options.tileLoadFunction, url:url}) +}; +goog.inherits(ol.source.OSM, ol.source.XYZ); +ol.source.OSM.DATA_ATTRIBUTION = new ol.Attribution({html:"Data \x26copy; " + '\x3ca href\x3d"http://www.openstreetmap.org/"\x3eOpenStreetMap\x3c/a\x3e ' + "contributors, " + '\x3ca href\x3d"http://www.openstreetmap.org/copyright"\x3eODbL\x3c/a\x3e'}); +ol.source.OSM.TILE_ATTRIBUTION = new ol.Attribution({html:"Tiles \x26copy; " + '\x3ca href\x3d"http://www.openstreetmap.org/"\x3eOpenStreetMap\x3c/a\x3e ' + "contributors, " + '\x3ca href\x3d"http://creativecommons.org/licenses/by-sa/2.0/"\x3eCC BY-SA\x3c/a\x3e'}); +ol.source.OSM.ATTRIBUTIONS = [ol.source.OSM.TILE_ATTRIBUTION, ol.source.OSM.DATA_ATTRIBUTION]; +goog.provide("ol.source.MapQuest"); +goog.require("goog.asserts"); +goog.require("ol.Attribution"); +goog.require("ol.source.OSM"); +goog.require("ol.source.XYZ"); +ol.source.MapQuest = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.asserts.assert(options.layer in ol.source.MapQuestConfig); + var layerConfig = ol.source.MapQuestConfig[options.layer]; + var url = "//otile{1-4}.mqcdn.com/tiles/1.0.0/" + options.layer + "/{z}/{x}/{y}.jpg"; + goog.base(this, {attributions:layerConfig.attributions, crossOrigin:"anonymous", logo:"//developer.mapquest.com/content/osm/mq_logo.png", maxZoom:layerConfig.maxZoom, opaque:true, tileLoadFunction:options.tileLoadFunction, url:url}) +}; +goog.inherits(ol.source.MapQuest, ol.source.XYZ); +ol.source.MapQuest.TILE_ATTRIBUTION = new ol.Attribution({html:"Tiles Courtesy of " + '\x3ca href\x3d"http://www.mapquest.com/" target\x3d"_blank"\x3eMapQuest\x3c/a\x3e'}); +ol.source.MapQuestConfig = {"osm":{maxZoom:28, attributions:[ol.source.MapQuest.TILE_ATTRIBUTION, ol.source.OSM.DATA_ATTRIBUTION]}, "sat":{maxZoom:18, attributions:[ol.source.MapQuest.TILE_ATTRIBUTION, new ol.Attribution({html:"Portions Courtesy NASA/JPL-Caltech and " + "U.S. Depart. of Agriculture, Farm Service Agency"})]}, "hyb":{maxZoom:18, attributions:[ol.source.MapQuest.TILE_ATTRIBUTION, ol.source.OSM.DATA_ATTRIBUTION]}}; +goog.provide("ol.source.OSMXML"); +goog.require("ol.format.OSMXML"); +goog.require("ol.source.VectorFile"); +ol.source.OSMXML = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, {attributions:options.attributions, doc:options.doc, extent:options.extent, format:new ol.format.OSMXML, logo:options.logo, node:options.node, projection:options.projection, reprojectTo:options.reprojectTo, text:options.text, url:options.url}) +}; +goog.inherits(ol.source.OSMXML, ol.source.VectorFile); +goog.provide("ol.source.Stamen"); +goog.require("goog.asserts"); +goog.require("ol.Attribution"); +goog.require("ol.source.OSM"); +goog.require("ol.source.XYZ"); +ol.source.StamenLayerConfig = {"terrain":{extension:"jpg", opaque:true}, "terrain-background":{extension:"jpg", opaque:true}, "terrain-labels":{extension:"png", opaque:false}, "terrain-lines":{extension:"png", opaque:false}, "toner-background":{extension:"png", opaque:true}, "toner":{extension:"png", opaque:true}, "toner-hybrid":{extension:"png", opaque:false}, "toner-labels":{extension:"png", opaque:false}, "toner-lines":{extension:"png", opaque:false}, "toner-lite":{extension:"png", opaque:true}, +"watercolor":{extension:"jpg", opaque:true}}; +ol.source.StamenProviderConfig = {"terrain":{minZoom:4, maxZoom:18}, "toner":{minZoom:0, maxZoom:20}, "watercolor":{minZoom:3, maxZoom:16}}; +ol.source.Stamen = function(options) { + var i = options.layer.indexOf("-"); + var provider = i == -1 ? options.layer : options.layer.slice(0, i); + goog.asserts.assert(provider in ol.source.StamenProviderConfig); + var providerConfig = ol.source.StamenProviderConfig[provider]; + goog.asserts.assert(options.layer in ol.source.StamenLayerConfig); + var layerConfig = ol.source.StamenLayerConfig[options.layer]; + var url = goog.isDef(options.url) ? options.url : "//{a-d}.tile.stamen.com/" + options.layer + "/{z}/{x}/{y}." + layerConfig.extension; + goog.base(this, {attributions:ol.source.Stamen.ATTRIBUTIONS, crossOrigin:"anonymous", maxZoom:providerConfig.maxZoom, opaque:layerConfig.opaque, tileLoadFunction:options.tileLoadFunction, url:url}) +}; +goog.inherits(ol.source.Stamen, ol.source.XYZ); +ol.source.Stamen.ATTRIBUTIONS = [new ol.Attribution({html:'Map tiles by \x3ca href\x3d"http://stamen.com/"\x3eStamen Design\x3c/a\x3e, ' + 'under \x3ca href\x3d"http://creativecommons.org/licenses/by/3.0/"\x3eCC BY' + " 3.0\x3c/a\x3e."}), ol.source.OSM.DATA_ATTRIBUTION]; +goog.provide("ol.source.TileDebug"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("ol.Tile"); +goog.require("ol.TileCache"); +goog.require("ol.TileCoord"); +goog.require("ol.TileState"); +goog.require("ol.source.Tile"); +goog.require("ol.tilegrid.TileGrid"); +ol.DebugTile_ = function(tileCoord, tileGrid) { + goog.base(this, tileCoord, ol.TileState.LOADED); + this.tileCoord_ = tileCoord; + this.tileSize_ = tileGrid.getTileSize(tileCoord.z); + this.canvasByContext_ = {} +}; +goog.inherits(ol.DebugTile_, ol.Tile); +ol.DebugTile_.prototype.getImage = function(opt_context) { + var key = goog.isDef(opt_context) ? goog.getUid(opt_context) : -1; + if(key in this.canvasByContext_) { + return this.canvasByContext_[key] + }else { + var tileSize = this.tileSize_; + var canvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas.width = tileSize; + canvas.height = tileSize; + var context = (canvas.getContext("2d")); + context.strokeStyle = "black"; + context.strokeRect(0.5, 0.5, tileSize + 0.5, tileSize + 0.5); + context.fillStyle = "black"; + context.textAlign = "center"; + context.textBaseline = "middle"; + context.font = "24px sans-serif"; + context.fillText(this.tileCoord_.toString(), tileSize / 2, tileSize / 2); + this.canvasByContext_[key] = canvas; + return canvas + } +}; +ol.source.TileDebug = function(options) { + goog.base(this, {extent:options.extent, opaque:false, projection:options.projection, tileGrid:options.tileGrid}); + this.tileCache_ = new ol.TileCache +}; +goog.inherits(ol.source.TileDebug, ol.source.Tile); +ol.source.TileDebug.prototype.canExpireCache = function() { + return this.tileCache_.canExpireCache() +}; +ol.source.TileDebug.prototype.expireCache = function(usedTiles) { + this.tileCache_.expireCache(usedTiles) +}; +ol.source.TileDebug.prototype.getTile = function(z, x, y) { + var tileCoordKey = this.getKeyZXY(z, x, y); + if(this.tileCache_.containsKey(tileCoordKey)) { + return(this.tileCache_.get(tileCoordKey)) + }else { + var tile = new ol.DebugTile_(new ol.TileCoord(z, x, y), this.tileGrid); + this.tileCache_.set(tileCoordKey, tile); + return tile + } +}; +goog.provide("ol.source.TileJSON"); +goog.provide("ol.tilejson"); +goog.require("goog.asserts"); +goog.require("goog.net.jsloader"); +goog.require("ol.Attribution"); +goog.require("ol.TileRange"); +goog.require("ol.TileUrlFunction"); +goog.require("ol.extent"); +goog.require("ol.proj"); +goog.require("ol.source.State"); +goog.require("ol.source.TileImage"); +goog.require("ol.tilegrid.XYZ"); +ol.tilejson.grids_ = []; +var grid = function(tileJSON) { + ol.tilejson.grids_.push(tileJSON) +}; +goog.exportSymbol("grid", grid); +ol.source.TileJSON = function(options) { + goog.base(this, {crossOrigin:options.crossOrigin, projection:ol.proj.get("EPSG:3857"), state:ol.source.State.LOADING, tileLoadFunction:options.tileLoadFunction}); + this.deferred_ = goog.net.jsloader.load(options.url, {cleanupWhenDone:true}); + this.deferred_.addCallback(this.handleTileJSONResponse, this) +}; +goog.inherits(ol.source.TileJSON, ol.source.TileImage); +ol.source.TileJSON.prototype.handleTileJSONResponse = function() { + var tileJSON = ol.tilejson.grids_.pop(); + var epsg4326Projection = ol.proj.get("EPSG:4326"); + var extent; + if(goog.isDef(tileJSON.bounds)) { + var transform = ol.proj.getTransformFromProjections(epsg4326Projection, this.getProjection()); + extent = ol.extent.transform(tileJSON.bounds, transform); + this.setExtent(extent) + } + if(goog.isDef(tileJSON.scheme)) { + goog.asserts.assert(tileJSON.scheme == "xyz") + } + var minZoom = tileJSON.minzoom || 0; + var maxZoom = tileJSON.maxzoom || 22; + var tileGrid = new ol.tilegrid.XYZ({maxZoom:maxZoom, minZoom:minZoom}); + this.tileGrid = tileGrid; + this.tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform(tileGrid.createTileCoordTransform({extent:extent}), ol.TileUrlFunction.createFromTemplates(tileJSON.tiles)); + if(goog.isDef(tileJSON.attribution)) { + var attributionExtent = goog.isDef(extent) ? extent : epsg4326Projection.getExtent(); + var tileRanges = {}; + var z, zKey; + for(z = minZoom;z <= maxZoom;++z) { + zKey = z.toString(); + tileRanges[zKey] = [tileGrid.getTileRangeForExtentAndZ(attributionExtent, z)] + } + this.setAttributions([new ol.Attribution({html:tileJSON.attribution, tileRanges:tileRanges})]) + } + this.setState(ol.source.State.READY) +}; +goog.provide("ol.source.TileWMS"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.math"); +goog.require("goog.object"); +goog.require("goog.string"); +goog.require("goog.uri.utils"); +goog.require("ol.TileCoord"); +goog.require("ol.TileUrlFunction"); +goog.require("ol.extent"); +goog.require("ol.source.TileImage"); +goog.require("ol.source.wms"); +goog.require("ol.source.wms.ServerType"); +ol.source.TileWMS = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var params = goog.isDef(options.params) ? options.params : {}; + var transparent = goog.object.get(params, "TRANSPARENT", true); + goog.base(this, {attributions:options.attributions, crossOrigin:options.crossOrigin, extent:options.extent, logo:options.logo, opaque:!transparent, projection:options.projection, tileGrid:options.tileGrid, tileLoadFunction:options.tileLoadFunction, tileUrlFunction:goog.bind(this.tileUrlFunction_, this)}); + var urls = options.urls; + if(!goog.isDef(urls) && goog.isDef(options.url)) { + urls = ol.TileUrlFunction.expandUrl(options.url) + } + this.urls_ = urls; + this.gutter_ = goog.isDef(options.gutter) ? options.gutter : 0; + this.params_ = params; + this.pixelRatio_ = NaN; + this.v13_ = true; + this.serverType_ = (options.serverType); + this.hidpi_ = goog.isDef(options.hidpi) ? options.hidpi : true; + this.coordKeyPrefix_ = ""; + this.resetCoordKeyPrefix_(); + this.tmpExtent_ = ol.extent.createEmpty(); + this.updateV13_() +}; +goog.inherits(ol.source.TileWMS, ol.source.TileImage); +ol.source.TileWMS.prototype.getGetFeatureInfoUrl = function(coordinate, resolution, projection, params) { + goog.asserts.assert(!("VERSION" in params)); + var pixelRatio = this.pixelRatio_; + if(isNaN(this.pixelRatio_)) { + return undefined + } + var tileGrid = this.getTileGrid(); + if(goog.isNull(tileGrid)) { + tileGrid = this.getTileGridForProjection(projection) + } + var tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, resolution); + if(tileGrid.getResolutions().length <= tileCoord.z) { + return undefined + } + var tileResolution = tileGrid.getResolution(tileCoord.z); + var tileExtent = tileGrid.getTileCoordExtent(tileCoord, this.tmpExtent_); + var tileSize = tileGrid.getTileSize(tileCoord.z); + var gutter = this.gutter_; + if(gutter !== 0) { + tileSize += 2 * gutter; + tileExtent = ol.extent.buffer(tileExtent, tileResolution * gutter, tileExtent) + } + if(pixelRatio != 1) { + tileSize = tileSize * pixelRatio + 0.5 | 0 + } + var baseParams = {"SERVICE":"WMS", "VERSION":ol.source.wms.DEFAULT_VERSION, "REQUEST":"GetFeatureInfo", "FORMAT":"image/png", "TRANSPARENT":true, "QUERY_LAYERS":goog.object.get(this.params_, "LAYERS")}; + goog.object.extend(baseParams, this.params_, params); + var x = Math.floor((coordinate[0] - tileExtent[0]) / (tileResolution / pixelRatio)); + var y = Math.floor((tileExtent[3] - coordinate[1]) / (tileResolution / pixelRatio)); + goog.object.set(baseParams, this.v13_ ? "I" : "X", x); + goog.object.set(baseParams, this.v13_ ? "J" : "Y", y); + return this.getRequestUrl_(tileCoord, tileSize, tileExtent, pixelRatio, projection, baseParams) +}; +ol.source.TileWMS.prototype.getGutter = function() { + return this.gutter_ +}; +ol.source.TileWMS.prototype.getKeyZXY = function(z, x, y) { + return this.coordKeyPrefix_ + goog.base(this, "getKeyZXY", z, x, y) +}; +ol.source.TileWMS.prototype.getParams = function() { + return this.params_ +}; +ol.source.TileWMS.prototype.getRequestUrl_ = function(tileCoord, tileSize, tileExtent, pixelRatio, projection, params) { + var urls = this.urls_; + if(!goog.isDef(urls) || goog.array.isEmpty(urls)) { + return undefined + } + goog.object.set(params, "WIDTH", tileSize); + goog.object.set(params, "HEIGHT", tileSize); + params[this.v13_ ? "CRS" : "SRS"] = projection.getCode(); + if(!("STYLES" in this.params_)) { + goog.object.set(params, "STYLES", new String("")) + } + if(pixelRatio != 1) { + switch(this.serverType_) { + case ol.source.wms.ServerType.GEOSERVER: + var dpi = 90 * pixelRatio + 0.5 | 0; + goog.object.set(params, "FORMAT_OPTIONS", "dpi:" + dpi); + break; + case ol.source.wms.ServerType.MAPSERVER: + goog.object.set(params, "MAP_RESOLUTION", 90 * pixelRatio); + break; + case ol.source.wms.ServerType.CARMENTA_SERVER: + ; + case ol.source.wms.ServerType.QGIS: + goog.object.set(params, "DPI", 90 * pixelRatio); + break; + default: + goog.asserts.fail(); + break + } + } + var axisOrientation = projection.getAxisOrientation(); + var bbox = tileExtent; + if(this.v13_ && axisOrientation.substr(0, 2) == "ne") { + var tmp; + tmp = tileExtent[0]; + bbox[0] = tileExtent[1]; + bbox[1] = tmp; + tmp = tileExtent[2]; + bbox[2] = tileExtent[3]; + bbox[3] = tmp + } + goog.object.set(params, "BBOX", bbox.join(",")); + var url; + if(urls.length == 1) { + url = urls[0] + }else { + var index = goog.math.modulo(tileCoord.hash(), this.urls_.length); + url = urls[index] + } + return goog.uri.utils.appendParamsFromMap(url, params) +}; +ol.source.TileWMS.prototype.getTilePixelSize = function(z, pixelRatio, projection) { + var tileSize = goog.base(this, "getTilePixelSize", z, pixelRatio, projection); + if(pixelRatio == 1 || !this.hidpi_ || !goog.isDef(this.serverType_)) { + return tileSize + }else { + return tileSize * pixelRatio + 0.5 | 0 + } +}; +ol.source.TileWMS.prototype.resetCoordKeyPrefix_ = function() { + var i = 0; + var res = []; + for(var key in this.params_) { + res[i++] = key + "-" + this.params_[key] + } + this.coordKeyPrefix_ = res.join("/") +}; +ol.source.TileWMS.prototype.tileUrlFunction_ = function(tileCoord, pixelRatio, projection) { + var tileGrid = this.getTileGrid(); + if(goog.isNull(tileGrid)) { + tileGrid = this.getTileGridForProjection(projection) + } + if(tileGrid.getResolutions().length <= tileCoord.z) { + return undefined + } + if(pixelRatio != 1 && (!this.hidpi_ || !goog.isDef(this.serverType_))) { + pixelRatio = 1 + } + var tileResolution = tileGrid.getResolution(tileCoord.z); + var tileExtent = tileGrid.getTileCoordExtent(tileCoord, this.tmpExtent_); + var tileSize = tileGrid.getTileSize(tileCoord.z); + var gutter = this.gutter_; + if(gutter !== 0) { + tileSize += 2 * gutter; + tileExtent = ol.extent.buffer(tileExtent, tileResolution * gutter, tileExtent) + } + var extent = this.getExtent(); + if(!goog.isNull(extent) && (!ol.extent.intersects(tileExtent, extent) || ol.extent.touches(tileExtent, extent))) { + return undefined + } + if(pixelRatio != 1) { + tileSize = tileSize * pixelRatio + 0.5 | 0 + } + var baseParams = {"SERVICE":"WMS", "VERSION":ol.source.wms.DEFAULT_VERSION, "REQUEST":"GetMap", "FORMAT":"image/png", "TRANSPARENT":true}; + goog.object.extend(baseParams, this.params_); + this.pixelRatio_ = pixelRatio; + return this.getRequestUrl_(tileCoord, tileSize, tileExtent, pixelRatio, projection, baseParams) +}; +ol.source.TileWMS.prototype.updateParams = function(params) { + goog.object.extend(this.params_, params); + this.resetCoordKeyPrefix_(); + this.updateV13_(); + this.dispatchChangeEvent() +}; +ol.source.TileWMS.prototype.updateV13_ = function() { + var version = goog.object.get(this.params_, "VERSION", ol.source.wms.DEFAULT_VERSION); + this.v13_ = goog.string.compareVersions(version, "1.3") >= 0 +}; +goog.provide("ol.source.TopoJSON"); +goog.require("ol.format.TopoJSON"); +goog.require("ol.source.VectorFile"); +ol.source.TopoJSON = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this, {attributions:options.attributions, extent:options.extent, format:new ol.format.TopoJSON({defaultProjection:options.defaultProjection}), logo:options.logo, object:options.object, projection:options.projection, text:options.text, url:options.url}) +}; +goog.inherits(ol.source.TopoJSON, ol.source.VectorFile); +goog.provide("ol.tilegrid.WMTS"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("ol.proj"); +goog.require("ol.tilegrid.TileGrid"); +ol.tilegrid.WMTS = function(options) { + goog.asserts.assert(options.resolutions.length == options.matrixIds.length); + this.matrixIds_ = options.matrixIds; + goog.base(this, {origin:options.origin, origins:options.origins, resolutions:options.resolutions, tileSize:options.tileSize, tileSizes:options.tileSizes}) +}; +goog.inherits(ol.tilegrid.WMTS, ol.tilegrid.TileGrid); +ol.tilegrid.WMTS.prototype.getMatrixId = function(z) { + goog.asserts.assert(0 <= z && z < this.matrixIds_.length); + return this.matrixIds_[z] +}; +ol.tilegrid.WMTS.prototype.getMatrixIds = function() { + return this.matrixIds_ +}; +ol.tilegrid.WMTS.createFromCapabilitiesMatrixSet = function(matrixSet) { + var resolutions = []; + var matrixIds = []; + var origins = []; + var tileSizes = []; + var supportedCRSPropName = "supportedCRS"; + var matrixIdsPropName = "matrixIds"; + var identifierPropName = "identifier"; + var scaleDenominatorPropName = "scaleDenominator"; + var topLeftCornerPropName = "topLeftCorner"; + var tileWidthPropName = "tileWidth"; + var tileHeightPropName = "tileHeight"; + var projection = ol.proj.get(matrixSet[supportedCRSPropName]); + var metersPerUnit = projection.getMetersPerUnit(); + goog.array.sort(matrixSet[matrixIdsPropName], function(a, b) { + return b[scaleDenominatorPropName] - a[scaleDenominatorPropName] + }); + goog.array.forEach(matrixSet[matrixIdsPropName], function(elt, index, array) { + matrixIds.push(elt[identifierPropName]); + origins.push(elt[topLeftCornerPropName]); + resolutions.push(elt[scaleDenominatorPropName] * 2.8E-4 / metersPerUnit); + var tileWidth = elt[tileWidthPropName]; + var tileHeight = elt[tileHeightPropName]; + goog.asserts.assert(tileWidth == tileHeight); + tileSizes.push(tileWidth) + }); + return new ol.tilegrid.WMTS({origins:origins, resolutions:resolutions, matrixIds:matrixIds, tileSizes:tileSizes}) +}; +goog.provide("ol.source.WMTS"); +goog.provide("ol.source.WMTSRequestEncoding"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.math"); +goog.require("goog.object"); +goog.require("goog.uri.utils"); +goog.require("ol.TileCoord"); +goog.require("ol.TileUrlFunction"); +goog.require("ol.TileUrlFunctionType"); +goog.require("ol.extent"); +goog.require("ol.proj"); +goog.require("ol.source.TileImage"); +goog.require("ol.tilegrid.WMTS"); +ol.source.WMTSRequestEncoding = {KVP:"KVP", REST:"REST"}; +ol.source.WMTS = function(options) { + var version = goog.isDef(options.version) ? options.version : "1.0.0"; + var format = goog.isDef(options.format) ? options.format : "image/jpeg"; + this.dimensions_ = options.dimensions || {}; + this.coordKeyPrefix_ = ""; + this.resetCoordKeyPrefix_(); + var requestEncoding = goog.isDef(options.requestEncoding) ? options.requestEncoding : ol.source.WMTSRequestEncoding.KVP; + var tileGrid = options.tileGrid; + var context = {"Layer":options.layer, "style":options.style, "Style":options.style, "TileMatrixSet":options.matrixSet}; + if(requestEncoding == ol.source.WMTSRequestEncoding.KVP) { + goog.object.extend(context, {"Service":"WMTS", "Request":"GetTile", "Version":version, "Format":format}) + } + function createFromWMTSTemplate(template) { + template = requestEncoding == ol.source.WMTSRequestEncoding.KVP ? goog.uri.utils.appendParamsFromMap(template, context) : template.replace(/\{(\w+?)\}/g, function(m, p) { + return p in context ? context[p] : m + }); + return function(tileCoord, pixelRatio, projection) { + if(goog.isNull(tileCoord)) { + return undefined + }else { + var localContext = {"TileMatrix":tileGrid.getMatrixId(tileCoord.z), "TileCol":tileCoord.x, "TileRow":tileCoord.y}; + goog.object.extend(localContext, this.dimensions_); + var url = template; + if(requestEncoding == ol.source.WMTSRequestEncoding.KVP) { + url = goog.uri.utils.appendParamsFromMap(url, localContext) + }else { + url = url.replace(/\{(\w+?)\}/g, function(m, p) { + return localContext[p] + }) + } + return url + } + } + } + var tileUrlFunction = ol.TileUrlFunction.nullTileUrlFunction; + var urls = options.urls; + if(!goog.isDef(urls) && goog.isDef(options.url)) { + urls = ol.TileUrlFunction.expandUrl(options.url) + } + if(goog.isDef(urls)) { + tileUrlFunction = ol.TileUrlFunction.createFromTileUrlFunctions(goog.array.map(urls, createFromWMTSTemplate)) + } + var tmpExtent = ol.extent.createEmpty(); + var tmpTileCoord = new ol.TileCoord(0, 0, 0); + tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform(function(tileCoord, projection, opt_tileCoord) { + var tileGrid = this.getTileGrid(); + goog.asserts.assert(!goog.isNull(tileGrid)); + if(tileGrid.getResolutions().length <= tileCoord.z) { + return null + } + var x = tileCoord.x; + var y = -tileCoord.y - 1; + var tileExtent = tileGrid.getTileCoordExtent(tileCoord); + var projectionExtent = projection.getExtent(); + var extent = goog.isDef(options.extent) ? options.extent : projectionExtent; + if(!goog.isNull(extent) && projection.isGlobal() && extent[0] === projectionExtent[0] && extent[2] === projectionExtent[2]) { + var numCols = Math.ceil((extent[2] - extent[0]) / (tileExtent[2] - tileExtent[0])); + x = goog.math.modulo(x, numCols); + tmpTileCoord.z = tileCoord.z; + tmpTileCoord.x = x; + tmpTileCoord.y = tileCoord.y; + tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord, tmpExtent) + } + if(!ol.extent.intersects(tileExtent, extent) || ol.extent.touches(tileExtent, extent)) { + return null + } + return new ol.TileCoord(tileCoord.z, x, y) + }, tileUrlFunction); + goog.base(this, {attributions:options.attributions, crossOrigin:options.crossOrigin, extent:options.extent, logo:options.logo, projection:options.projection, tileGrid:tileGrid, tileLoadFunction:options.tileLoadFunction, tileUrlFunction:tileUrlFunction}) +}; +goog.inherits(ol.source.WMTS, ol.source.TileImage); +ol.source.WMTS.prototype.getDimensions = function() { + return this.dimensions_ +}; +ol.source.WMTS.prototype.getKeyZXY = function(z, x, y) { + return this.coordKeyPrefix_ + goog.base(this, "getKeyZXY", z, x, y) +}; +ol.source.WMTS.prototype.resetCoordKeyPrefix_ = function() { + var i = 0; + var res = []; + for(var key in this.dimensions_) { + res[i++] = key + "-" + this.dimensions_[key] + } + this.coordKeyPrefix_ = res.join("/") +}; +ol.source.WMTS.prototype.updateDimensions = function(dimensions) { + goog.object.extend(this.dimensions_, dimensions); + this.resetCoordKeyPrefix_(); + this.dispatchChangeEvent() +}; +ol.source.WMTS.optionsFromCapabilities = function(wmtsCap, layer) { + var layers = wmtsCap["contents"]["layers"]; + var l = goog.array.find(layers, function(elt, index, array) { + return elt["identifier"] == layer + }); + goog.asserts.assert(!goog.isNull(l)); + goog.asserts.assert(l["tileMatrixSetLinks"].length > 0); + var matrixSet = (l["tileMatrixSetLinks"][0]["tileMatrixSet"]); + var format = (l["formats"][0]); + var idx = goog.array.findIndex(l["styles"], function(elt, index, array) { + return elt["isDefault"] + }); + if(idx < 0) { + idx = 0 + } + var style = (l["styles"][idx]["identifier"]); + var dimensions = {}; + goog.array.forEach(l["dimensions"], function(elt, index, array) { + var key = elt["identifier"]; + var value = elt["default"]; + if(goog.isDef(value)) { + goog.asserts.assert(goog.array.indexOf(elt["values"], value) >= 0) + }else { + value = elt["values"][0] + } + goog.asserts.assert(goog.isDef(value)); + dimensions[key] = value + }); + var matrixSets = wmtsCap["contents"]["tileMatrixSets"]; + goog.asserts.assert(matrixSet in matrixSets); + var matrixSetObj = matrixSets[matrixSet]; + var tileGrid = ol.tilegrid.WMTS.createFromCapabilitiesMatrixSet(matrixSetObj); + var projection = ol.proj.get(matrixSetObj["supportedCRS"]); + var gets = wmtsCap["operationsMetadata"]["GetTile"]["dcp"]["http"]["get"]; + var encodings = goog.object.getKeys(gets[0]["constraints"]["GetEncoding"]["allowedValues"]); + goog.asserts.assert(encodings.length > 0); + var urls; + var requestEncoding; + switch(encodings[0]) { + case "REST": + ; + case "RESTful": + requestEncoding = ol.source.WMTSRequestEncoding.REST; + goog.asserts.assert(l["resourceUrls"].hasOwnProperty("tile")); + goog.asserts.assert(l["resourceUrls"]["tile"].hasOwnProperty(format)); + urls = (l["resourceUrls"]["tile"][format]); + break; + case "KVP": + requestEncoding = ol.source.WMTSRequestEncoding.KVP; + urls = []; + goog.array.forEach(gets, function(elt, index, array) { + if(elt["constraints"]["GetEncoding"]["allowedValues"].hasOwnProperty(ol.source.WMTSRequestEncoding.KVP)) { + urls.push((elt["url"])) + } + }); + goog.asserts.assert(urls.length > 0); + break; + default: + goog.asserts.fail() + } + return{urls:urls, layer:layer, matrixSet:matrixSet, format:format, projection:projection, requestEncoding:requestEncoding, tileGrid:tileGrid, style:style, dimensions:dimensions} +}; +goog.provide("ol.tilegrid.Zoomify"); +goog.require("goog.math"); +goog.require("ol.TileCoord"); +goog.require("ol.proj"); +goog.require("ol.tilegrid.TileGrid"); +ol.tilegrid.Zoomify = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : options; + goog.base(this, {origin:[0, 0], resolutions:options.resolutions}) +}; +goog.inherits(ol.tilegrid.Zoomify, ol.tilegrid.TileGrid); +ol.tilegrid.Zoomify.prototype.createTileCoordTransform = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var minZ = this.minZoom; + var maxZ = this.maxZoom; + var tmpTileCoord = new ol.TileCoord(0, 0, 0); + var tileRangeByZ = null; + if(goog.isDef(options.extent)) { + tileRangeByZ = new Array(maxZ + 1); + var z; + for(z = 0;z <= maxZ;++z) { + if(z < minZ) { + tileRangeByZ[z] = null + }else { + tileRangeByZ[z] = this.getTileRangeForExtentAndZ(options.extent, z) + } + } + } + return function(tileCoord, projection, opt_tileCoord) { + var z = tileCoord.z; + if(z < minZ || maxZ < z) { + return null + } + var n = Math.pow(2, z); + var x = tileCoord.x; + if(x < 0 || n <= x) { + return null + } + var y = tileCoord.y; + if(y < -n || -1 < y) { + return null + } + if(!goog.isNull(tileRangeByZ)) { + tmpTileCoord.z = z; + tmpTileCoord.x = x; + tmpTileCoord.y = -y - 1; + if(!tileRangeByZ[z].contains(tmpTileCoord)) { + return null + } + } + return ol.TileCoord.createOrUpdate(z, x, -y - 1, opt_tileCoord) + } +}; +goog.provide("ol.source.Zoomify"); +goog.require("goog.array"); +goog.require("goog.asserts"); +goog.require("goog.dom"); +goog.require("goog.dom.TagName"); +goog.require("ol.ImageTile"); +goog.require("ol.TileCoord"); +goog.require("ol.TileState"); +goog.require("ol.TileUrlFunction"); +goog.require("ol.proj"); +goog.require("ol.source.TileImage"); +goog.require("ol.tilegrid.Zoomify"); +ol.source.ZoomifyTierSizeCalculation = {DEFAULT:"default", TRUNCATED:"truncated"}; +ol.source.Zoomify = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var size = options.size; + var tierSizeCalculation = goog.isDef(options.tierSizeCalculation) ? options.tierSizeCalculation : ol.source.ZoomifyTierSizeCalculation.DEFAULT; + var imageWidth = size[0]; + var imageHeight = size[1]; + var tierSizeInTiles = []; + var tileSize = ol.DEFAULT_TILE_SIZE; + switch(tierSizeCalculation) { + case ol.source.ZoomifyTierSizeCalculation.DEFAULT: + while(imageWidth > tileSize || imageHeight > tileSize) { + tierSizeInTiles.push([Math.ceil(imageWidth / tileSize), Math.ceil(imageHeight / tileSize)]); + tileSize += tileSize + } + break; + case ol.source.ZoomifyTierSizeCalculation.TRUNCATED: + var width = imageWidth; + var height = imageHeight; + while(width > tileSize || height > tileSize) { + tierSizeInTiles.push([Math.ceil(width / tileSize), Math.ceil(height / tileSize)]); + width >>= 1; + height >>= 1 + } + break; + default: + goog.asserts.fail(); + break + } + tierSizeInTiles.push([1, 1]); + tierSizeInTiles.reverse(); + var resolutions = [1]; + var tileCountUpToTier = [0]; + var i, ii; + for(i = 1, ii = tierSizeInTiles.length;i < ii;i++) { + resolutions.push(1 << i); + tileCountUpToTier.push(tierSizeInTiles[i - 1][0] * tierSizeInTiles[i - 1][1] + tileCountUpToTier[i - 1]) + } + resolutions.reverse(); + var tileGrid = new ol.tilegrid.Zoomify({resolutions:resolutions}); + var url = options.url; + var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform(tileGrid.createTileCoordTransform({extent:[0, 0, size[0], size[1]]}), function(tileCoord, pixelRatio, projection) { + if(goog.isNull(tileCoord)) { + return undefined + }else { + var tileIndex = tileCoord.x + tileCoord.y * tierSizeInTiles[tileCoord.z][0] + tileCountUpToTier[tileCoord.z]; + var tileGroup = tileIndex / ol.DEFAULT_TILE_SIZE | 0; + return url + "TileGroup" + tileGroup + "/" + tileCoord.z + "-" + tileCoord.x + "-" + tileCoord.y + ".jpg" + } + }); + goog.base(this, {attributions:options.attributions, crossOrigin:options.crossOrigin, logo:options.logo, tileClass:ol.source.ZoomifyTile_, tileGrid:tileGrid, tileUrlFunction:tileUrlFunction}) +}; +goog.inherits(ol.source.Zoomify, ol.source.TileImage); +ol.source.ZoomifyTile_ = function(tileCoord, state, src, crossOrigin, tileLoadFunction) { + goog.base(this, tileCoord, state, src, crossOrigin, tileLoadFunction); + this.zoomifyImageByContext_ = {} +}; +goog.inherits(ol.source.ZoomifyTile_, ol.ImageTile); +ol.source.ZoomifyTile_.prototype.getImage = function(opt_context) { + var key = goog.isDef(opt_context) ? goog.getUid(opt_context).toString() : ""; + if(key in this.zoomifyImageByContext_) { + return this.zoomifyImageByContext_[key] + }else { + var image = goog.base(this, "getImage", opt_context); + if(this.state == ol.TileState.LOADED) { + if(image.width == ol.DEFAULT_TILE_SIZE && image.height == ol.DEFAULT_TILE_SIZE) { + this.zoomifyImageByContext_[key] = image; + return image + }else { + var canvas = (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas.width = ol.DEFAULT_TILE_SIZE; + canvas.height = ol.DEFAULT_TILE_SIZE; + var context = (canvas.getContext("2d")); + context.drawImage(image, 0, 0); + this.zoomifyImageByContext_[key] = canvas; + return canvas + } + }else { + return image + } + } +}; +goog.provide("ol.sphere.WGS84"); +goog.require("ol.Sphere"); +ol.sphere.WGS84 = new ol.Sphere(6378137); +goog.provide("ol.style.Text"); +ol.style.Text = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.font_ = options.font; + this.rotation_ = options.rotation; + this.scale_ = options.scale; + this.text_ = options.text; + this.textAlign_ = options.textAlign; + this.textBaseline_ = options.textBaseline; + this.fill_ = goog.isDef(options.fill) ? options.fill : null; + this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null +}; +ol.style.Text.prototype.getFont = function() { + return this.font_ +}; +ol.style.Text.prototype.getFill = function() { + return this.fill_ +}; +ol.style.Text.prototype.getRotation = function() { + return this.rotation_ +}; +ol.style.Text.prototype.getScale = function() { + return this.scale_ +}; +ol.style.Text.prototype.getStroke = function() { + return this.stroke_ +}; +ol.style.Text.prototype.getText = function() { + return this.text_ +}; +ol.style.Text.prototype.getTextAlign = function() { + return this.textAlign_ +}; +ol.style.Text.prototype.getTextBaseline = function() { + return this.textBaseline_ +}; +goog.require("libtess"); +goog.require("libtess.ActiveRegion"); +goog.require("libtess.CachedVertex"); +goog.require("libtess.Dict"); +goog.require("libtess.DictNode"); +goog.require("libtess.FaceCount"); +goog.require("libtess.GluFace"); +goog.require("libtess.GluHalfEdge"); +goog.require("libtess.GluMesh"); +goog.require("libtess.GluTesselator"); +goog.require("libtess.GluVertex"); +goog.require("libtess.PQHandleElem"); +goog.require("libtess.PQNode"); +goog.require("libtess.PriorityQ"); +goog.require("libtess.PriorityQHeap"); +goog.require("libtess.geom"); +goog.require("libtess.mesh"); +goog.require("libtess.normal"); +goog.require("libtess.render"); +goog.require("libtess.sweep"); +goog.require("libtess.tessmono"); +goog.require("ol"); +goog.require("ol.Attribution"); +goog.require("ol.BrowserFeature"); +goog.require("ol.CanvasFunctionType"); +goog.require("ol.CenterConstraint"); +goog.require("ol.CenterConstraintType"); +goog.require("ol.Collection"); +goog.require("ol.CollectionEvent"); +goog.require("ol.CollectionEventType"); +goog.require("ol.Constraints"); +goog.require("ol.Coordinate"); +goog.require("ol.CoordinateArray"); +goog.require("ol.CoordinateFormatType"); +goog.require("ol.DeviceOrientation"); +goog.require("ol.DeviceOrientationProperty"); +goog.require("ol.DragBoxEvent"); +goog.require("ol.DrawEvent"); +goog.require("ol.Ellipsoid"); +goog.require("ol.Extent"); +goog.require("ol.Feature"); +goog.require("ol.FeatureOverlay"); +goog.require("ol.FrameState"); +goog.require("ol.Geolocation"); +goog.require("ol.GeolocationProperty"); +goog.require("ol.IView"); +goog.require("ol.IView2D"); +goog.require("ol.IView3D"); +goog.require("ol.Image"); +goog.require("ol.ImageBase"); +goog.require("ol.ImageCanvas"); +goog.require("ol.ImageState"); +goog.require("ol.ImageTile"); +goog.require("ol.ImageUrlFunction"); +goog.require("ol.ImageUrlFunctionType"); +goog.require("ol.Kinetic"); +goog.require("ol.Map"); +goog.require("ol.MapBrowserEvent"); +goog.require("ol.MapBrowserEvent.EventType"); +goog.require("ol.MapBrowserEventHandler"); +goog.require("ol.MapEvent"); +goog.require("ol.MapEventType"); +goog.require("ol.MapProperty"); +goog.require("ol.Object"); +goog.require("ol.ObjectEvent"); +goog.require("ol.ObjectEventType"); +goog.require("ol.Observable"); +goog.require("ol.Overlay"); +goog.require("ol.OverlayPositioning"); +goog.require("ol.OverlayProperty"); +goog.require("ol.Pixel"); +goog.require("ol.PostRenderFunction"); +goog.require("ol.PreRenderFunction"); +goog.require("ol.RendererHint"); +goog.require("ol.ResolutionConstraint"); +goog.require("ol.ResolutionConstraintType"); +goog.require("ol.RotationConstraint"); +goog.require("ol.RotationConstraintType"); +goog.require("ol.Size"); +goog.require("ol.Sphere"); +goog.require("ol.Tile"); +goog.require("ol.TileCache"); +goog.require("ol.TileCoord"); +goog.require("ol.TileLoadFunctionType"); +goog.require("ol.TilePriorityFunction"); +goog.require("ol.TileQueue"); +goog.require("ol.TileRange"); +goog.require("ol.TileState"); +goog.require("ol.TileUrlFunction"); +goog.require("ol.TileUrlFunctionType"); +goog.require("ol.TransformFunction"); +goog.require("ol.View"); +goog.require("ol.View2D"); +goog.require("ol.View2DProperty"); +goog.require("ol.View2DState"); +goog.require("ol.ViewHint"); +goog.require("ol.animation"); +goog.require("ol.array"); +goog.require("ol.binary.Buffer"); +goog.require("ol.binary.IReader"); +goog.require("ol.color"); +goog.require("ol.color.Matrix"); +goog.require("ol.control"); +goog.require("ol.control.Attribution"); +goog.require("ol.control.Control"); +goog.require("ol.control.FullScreen"); +goog.require("ol.control.Logo"); +goog.require("ol.control.MousePosition"); +goog.require("ol.control.ScaleLine"); +goog.require("ol.control.ScaleLineProperty"); +goog.require("ol.control.ScaleLineUnits"); +goog.require("ol.control.Zoom"); +goog.require("ol.control.ZoomSlider"); +goog.require("ol.control.ZoomToExtent"); +goog.require("ol.coordinate"); +goog.require("ol.css"); +goog.require("ol.dom"); +goog.require("ol.dom.BrowserFeature"); +goog.require("ol.dom.Input"); +goog.require("ol.dom.InputProperty"); +goog.require("ol.easing"); +goog.require("ol.ellipsoid.BESSEL1841"); +goog.require("ol.ellipsoid.WGS84"); +goog.require("ol.events.ConditionType"); +goog.require("ol.events.condition"); +goog.require("ol.extent"); +goog.require("ol.extent.Relationship"); +goog.require("ol.feature"); +goog.require("ol.format.BinaryFeature"); +goog.require("ol.format.Feature"); +goog.require("ol.format.FormatType"); +goog.require("ol.format.GML"); +goog.require("ol.format.GPX"); +goog.require("ol.format.GPX.V1_1"); +goog.require("ol.format.GeoJSON"); +goog.require("ol.format.IGC"); +goog.require("ol.format.IGCZ"); +goog.require("ol.format.JSONFeature"); +goog.require("ol.format.KML"); +goog.require("ol.format.OSMXML"); +goog.require("ol.format.Polyline"); +goog.require("ol.format.TextFeature"); +goog.require("ol.format.TopoJSON"); +goog.require("ol.format.XMLFeature"); +goog.require("ol.format.XSD"); +goog.require("ol.geom.Circle"); +goog.require("ol.geom.Geometry"); +goog.require("ol.geom.GeometryCollection"); +goog.require("ol.geom.GeometryType"); +goog.require("ol.geom.LineString"); +goog.require("ol.geom.LinearRing"); +goog.require("ol.geom.MultiLineString"); +goog.require("ol.geom.MultiPoint"); +goog.require("ol.geom.MultiPolygon"); +goog.require("ol.geom.Point"); +goog.require("ol.geom.Polygon"); +goog.require("ol.geom.SimpleGeometry"); +goog.require("ol.geom.closest"); +goog.require("ol.geom.flat"); +goog.require("ol.geom.simplify"); +goog.require("ol.interaction"); +goog.require("ol.interaction.DoubleClickZoom"); +goog.require("ol.interaction.Drag"); +goog.require("ol.interaction.DragAndDrop"); +goog.require("ol.interaction.DragAndDropEvent"); +goog.require("ol.interaction.DragBox"); +goog.require("ol.interaction.DragPan"); +goog.require("ol.interaction.DragRotate"); +goog.require("ol.interaction.DragRotateAndZoom"); +goog.require("ol.interaction.DragZoom"); +goog.require("ol.interaction.Draw"); +goog.require("ol.interaction.Interaction"); +goog.require("ol.interaction.KeyboardPan"); +goog.require("ol.interaction.KeyboardZoom"); +goog.require("ol.interaction.Modify"); +goog.require("ol.interaction.MouseWheelZoom"); +goog.require("ol.interaction.Select"); +goog.require("ol.interaction.Touch"); +goog.require("ol.interaction.TouchPan"); +goog.require("ol.interaction.TouchRotate"); +goog.require("ol.interaction.TouchZoom"); +goog.require("ol.layer.Base"); +goog.require("ol.layer.Group"); +goog.require("ol.layer.Heatmap"); +goog.require("ol.layer.Image"); +goog.require("ol.layer.Layer"); +goog.require("ol.layer.LayerProperty"); +goog.require("ol.layer.LayerState"); +goog.require("ol.layer.Tile"); +goog.require("ol.layer.Vector"); +goog.require("ol.math"); +goog.require("ol.parser.Parser"); +goog.require("ol.parser.XML"); +goog.require("ol.parser.ogc.ExceptionReport"); +goog.require("ol.parser.ogc.Versioned"); +goog.require("ol.parser.ogc.WMSCapabilities"); +goog.require("ol.parser.ogc.WMSCapabilities_v1"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_0_0"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1_0"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1_1"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC"); +goog.require("ol.parser.ogc.WMSCapabilities_v1_3_0"); +goog.require("ol.proj"); +goog.require("ol.proj.CH"); +goog.require("ol.proj.EPSG2056"); +goog.require("ol.proj.EPSG21781"); +goog.require("ol.proj.EPSG3857"); +goog.require("ol.proj.EPSG4326"); +goog.require("ol.proj.METERS_PER_UNIT"); +goog.require("ol.proj.Projection"); +goog.require("ol.proj.ProjectionLike"); +goog.require("ol.proj.Units"); +goog.require("ol.proj.common"); +goog.require("ol.render.Box"); +goog.require("ol.render.Event"); +goog.require("ol.render.EventType"); +goog.require("ol.render.IReplayGroup"); +goog.require("ol.render.IVectorContext"); +goog.require("ol.render.canvas"); +goog.require("ol.render.canvas.Immediate"); +goog.require("ol.render.canvas.ReplayGroup"); +goog.require("ol.render.webgl.Immediate"); +goog.require("ol.renderer.Layer"); +goog.require("ol.renderer.Map"); +goog.require("ol.renderer.canvas.ImageLayer"); +goog.require("ol.renderer.canvas.Layer"); +goog.require("ol.renderer.canvas.Map"); +goog.require("ol.renderer.canvas.TileLayer"); +goog.require("ol.renderer.canvas.VectorLayer"); +goog.require("ol.renderer.dom.ImageLayer"); +goog.require("ol.renderer.dom.Layer"); +goog.require("ol.renderer.dom.Map"); +goog.require("ol.renderer.dom.TileLayer"); +goog.require("ol.renderer.vector"); +goog.require("ol.renderer.webgl.ImageLayer"); +goog.require("ol.renderer.webgl.Layer"); +goog.require("ol.renderer.webgl.Map"); +goog.require("ol.renderer.webgl.TileLayer"); +goog.require("ol.renderer.webgl.map.shader.Color"); +goog.require("ol.renderer.webgl.map.shader.Default"); +goog.require("ol.renderer.webgl.tilelayer.shader"); +goog.require("ol.size"); +goog.require("ol.source.BingMaps"); +goog.require("ol.source.GPX"); +goog.require("ol.source.GeoJSON"); +goog.require("ol.source.IGC"); +goog.require("ol.source.Image"); +goog.require("ol.source.ImageCanvas"); +goog.require("ol.source.ImageStatic"); +goog.require("ol.source.ImageVector"); +goog.require("ol.source.ImageWMS"); +goog.require("ol.source.KML"); +goog.require("ol.source.MapGuide"); +goog.require("ol.source.MapQuest"); +goog.require("ol.source.OSM"); +goog.require("ol.source.OSMXML"); +goog.require("ol.source.Source"); +goog.require("ol.source.Stamen"); +goog.require("ol.source.State"); +goog.require("ol.source.Tile"); +goog.require("ol.source.TileDebug"); +goog.require("ol.source.TileImage"); +goog.require("ol.source.TileJSON"); +goog.require("ol.source.TileOptions"); +goog.require("ol.source.TileWMS"); +goog.require("ol.source.TopoJSON"); +goog.require("ol.source.Vector"); +goog.require("ol.source.VectorEvent"); +goog.require("ol.source.VectorEventType"); +goog.require("ol.source.VectorFile"); +goog.require("ol.source.WMTS"); +goog.require("ol.source.WMTSRequestEncoding"); +goog.require("ol.source.XYZ"); +goog.require("ol.source.Zoomify"); +goog.require("ol.source.wms"); +goog.require("ol.source.wms.ServerType"); +goog.require("ol.sphere.NORMAL"); +goog.require("ol.sphere.WGS84"); +goog.require("ol.structs.Buffer"); +goog.require("ol.structs.IntegerSet"); +goog.require("ol.structs.LRUCache"); +goog.require("ol.structs.PriorityQueue"); +goog.require("ol.structs.RBush"); +goog.require("ol.style.Circle"); +goog.require("ol.style.Fill"); +goog.require("ol.style.Icon"); +goog.require("ol.style.IconAnchorOrigin"); +goog.require("ol.style.IconAnchorUnits"); +goog.require("ol.style.IconImageCache"); +goog.require("ol.style.Image"); +goog.require("ol.style.ImageState"); +goog.require("ol.style.Stroke"); +goog.require("ol.style.Style"); +goog.require("ol.style.Text"); +goog.require("ol.tilegrid.TileGrid"); +goog.require("ol.tilegrid.WMTS"); +goog.require("ol.tilegrid.XYZ"); +goog.require("ol.tilegrid.Zoomify"); +goog.require("ol.tilejson"); +goog.require("ol.vec.Mat4"); +goog.require("ol.webgl"); +goog.require("ol.webgl.Context"); +goog.require("ol.webgl.WebGLContextEventType"); +goog.require("ol.webgl.shader"); +goog.require("ol.xml"); + diff --git a/float-no-zero/build/ol.js b/float-no-zero/build/ol.js new file mode 100644 index 0000000000..eda39cd04c --- /dev/null +++ b/float-no-zero/build/ol.js @@ -0,0 +1,555 @@ +// OpenLayers 3. see http://ol3js.org/ +(function(){function ba(){return function(){}}function k(a){return function(){return this[a]}}function ca(a){return function(){return a}}var l,da=da||{},s=this;function fa(){}function ga(a){a.Ka=function(){return a.fe?a.fe:a.fe=new a}} +function ha(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null"; +else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function t(a){return void 0!==a}function ia(a){return"array"==ha(a)}function ja(a){var b=ha(a);return"array"==b||"object"==b&&"number"==typeof a.length}function la(a){return"string"==typeof a}function na(a){return"number"==typeof a}function oa(a){return"function"==ha(a)}function pa(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}function A(a){return a[qa]||(a[qa]=++ra)} +var qa="closure_uid_"+(1E9*Math.random()>>>0),ra=0;function ta(a,b,c){return a.call.apply(a.bind,arguments)}function ua(a,b,c){if(!a)throw Error();if(2/g,Fa=/\"/g,Ba=/[&<>\"]/;function Ga(a){a=t(void 0)?a.toFixed(void 0):String(a);var b=a.indexOf(".");-1==b&&(b=a.length);b=Math.max(0,2-b);return Array(b+1).join("0")+a} +function Ha(a,b){for(var c=0,d=za(String(a)).split("."),e=za(String(b)).split("."),f=Math.max(d.length,e.length),g=0;0==c&&g(0==q[1].length?0:parseInt(q[1],10))?1:0)||((0==r[2].length)<(0==q[2].length)? +-1:(0==r[2].length)>(0==q[2].length)?1:0)||(r[2]q[2]?1:0)}while(0==c)}return c};var Ia=Array.prototype,Ja=Ia.indexOf?function(a,b,c){return Ia.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(la(a))return la(b)&&1==b.length?a.indexOf(b,c):-1;for(;cc?null:la(a)?a.charAt(c):a[c]}function Oa(a,b,c){for(var d=a.length,e=la(a)?a.split(""):a,f=0;f=arguments.length?Ia.slice.call(a,b):Ia.slice.call(a,b,c)}function Va(a,b){Ia.sort.call(a,b||Wa)}function Xa(a,b){if(!ja(a)||!ja(b)||a.length!=b.length)return!1;for(var c=a.length,d=Ya,e=0;eb?1:a>=1;return b.join("")}$a.prototype.toString=function(){return bb(this.a,this.x,this.y)};function db(a,b,c,d){this.a=a;this.d=b;this.b=c;this.c=d}function eb(a,b,c,d,e){return t(e)?(e.a=a,e.d=b,e.b=c,e.c=d,e):new db(a,b,c,d)}db.prototype.contains=function(a){return this.a<=a.x&&a.x<=this.d&&this.b<=a.y&&a.y<=this.c};function fb(a){this.c=a.html;this.a=t(a.tileRanges)?a.tileRanges:null};var gb,hb,ib,kb,lb,mb,nb;function ob(){return s.navigator?s.navigator.userAgent:null}function pb(){return s.navigator}kb=ib=hb=gb=!1;var qb;if(qb=ob()){var rb=pb();gb=0==qb.lastIndexOf("Opera",0);hb=!gb&&(-1!=qb.indexOf("MSIE")||-1!=qb.indexOf("Trident"));ib=!gb&&-1!=qb.indexOf("WebKit");kb=!gb&&!ib&&!hb&&"Gecko"==rb.product}var sb=gb,H=hb,ub=kb,vb=ib,wb,xb=pb();wb=xb&&xb.platform||"";lb=-1!=wb.indexOf("Mac");mb=-1!=wb.indexOf("Win");nb=-1!=wb.indexOf("Linux"); +var yb=!!pb()&&-1!=(pb().appVersion||"").indexOf("X11");function zb(){var a=s.document;return a?a.documentMode:void 0}var Ab;a:{var Bb="",Cb;if(sb&&s.opera)var Db=s.opera.version,Bb="function"==typeof Db?Db():Db;else if(ub?Cb=/rv\:([^\);]+)(\)|;)/:H?Cb=/\b(?:MSIE|rv)\s+([^\);]+)(\)|;)/:vb&&(Cb=/WebKit\/(\S+)/),Cb)var Eb=Cb.exec(ob()),Bb=Eb?Eb[1]:"";if(H){var Fb=zb();if(Fb>parseFloat(Bb)){Ab=String(Fb);break a}}Ab=Bb}var Gb={};function Hb(a){return Gb[a]||(Gb[a]=0<=Ha(Ab,a))} +var Ib=s.document,Jb=Ib&&H?zb()||("CSS1Compat"==Ib.compatMode?parseInt(Ab,10):5):void 0;var Kb,Lb=!H||H&&9<=Jb;!ub&&!H||H&&H&&9<=Jb||ub&&Hb("1.9.1");H&&Hb("9");function Nb(a){a=a.className;return la(a)&&a.match(/\S+/g)||[]}function Ob(a,b){for(var c=Nb(a),d=Ua(arguments,1),e=c.length+d.length,f=c,g=0;gc*b?c+b:c}function Sb(a){return a*Math.PI/180};function Tb(a,b){this.x=t(a)?a:0;this.y=t(b)?b:0}l=Tb.prototype;l.J=function(){return new Tb(this.x,this.y)};l.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};l.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};l.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};l.scale=function(a,b){var c=na(b)?b:a;this.x*=a;this.y*=c;return this};function Ub(a,b){this.width=a;this.height=b}l=Ub.prototype;l.J=function(){return new Ub(this.width,this.height)};l.aa=function(){return!(this.width*this.height)};l.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};l.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};l.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this}; +l.scale=function(a,b){var c=na(b)?b:a;this.width*=a;this.height*=c;return this};function Vb(a,b,c){for(var d in a)b.call(c,a[d],d,a)}function Wb(a,b){for(var c in a)if(b.call(void 0,a[c],c,a))return!0;return!1}function Xb(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b}function Yb(a){var b=[],c=0,d;for(d in a)b[c++]=d;return b}function Zb(a){for(var b in a)return!1;return!0}function $b(a){for(var b in a)delete a[b]}function ac(a,b){b in a&&delete a[b]}function I(a,b,c){return b in a?a[b]:c}function bc(a){var b={},c;for(c in a)b[c]=a[c];return b}var cc="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "); +function dc(a,b){for(var c,d,e=1;e=a.keyCode)a.keyCode=-1}catch(b){}};l.df=k("Q");var Sc="closure_listenable_"+(1E6*Math.random()|0);function Tc(a){return!(!a||!a[Sc])}var Uc=0;function Vc(a,b,c,d,e,f){this.xa=a;this.a=b;this.src=c;this.type=d;this.capture=!!e;this.cb=f;this.key=++Uc;this.Ha=this.kb=!1}function Wc(a){a.Ha=!0;a.xa=null;a.a=null;a.src=null;a.cb=null};var Xc={},Yc={},Zc={},$c={};function J(a,b,c,d,e){if(ia(b)){for(var f=0;fe.keyCode||void 0!=e.returnValue)return!0;a:{var h=!1;if(0==e.keyCode)try{e.keyCode=-1;break a}catch(m){h=!0}if(h||void 0==e.returnValue)e.returnValue=!0}}h=new Oc;Pc(h,e,this);e=!0;try{if(c){for(var n=[],p=h.c;p;p=p.parentNode)n.push(p);f=d[!0];for(var r=n.length- +1;!h.Qa&&0<=r;r--)h.c=n[r],e&=kd(f,n[r],h);if(g)for(f=d[!1],r=0;!h.Qa&&r>>0);function ad(a){return oa(a)?a:a[md]||(a[md]=function(b){return a.handleEvent(b)})};function nd(a){return function(){return a}}var od=nd(!1),pd=nd(!0);function qd(a){return a}function rd(a){return function(){throw a;}}function sd(a){var b;b=b||0;return function(){return a.apply(this,Array.prototype.slice.call(arguments,0,b))}}function td(a){var b=arguments,c=b.length;return function(){for(var a=0;a=c||(1<=c?(g=h,e=f):(g+=c*m,e+=c*n));return[g,e]}function we(a,b){var c=Rb(a+180,360)-180,d=Math.abs(Math.round(3600*c));return Math.floor(d/3600)+"\u00b0 "+Math.floor(d/60%60)+"\u2032 "+Math.floor(d%60)+"\u2033 "+b.charAt(0>c?1:0)} +function xe(a,b,c){return t(a)?b.replace("{x}",a[0].toFixed(c)).replace("{y}",a[1].toFixed(c)):""}function ye(a,b){for(var c=!0,d=a.length-1;0<=d;--d)if(a[d]!=b[d]){c=!1;break}return c}function ze(a,b){var c=Math.cos(b),d=Math.sin(b),e=a[1]*c+a[0]*d;a[0]=a[0]*c-a[1]*d;a[1]=e;return a}function Ae(a,b){var c=a[0]-b[0],d=a[1]-b[1];return c*c+d*d}function Be(a,b){return xe(a,"{x}, {y}",b)};function Ce(a){for(var b=De(),c=0,d=a.length;ce[2]&&(e[2]=f[0]);f[1]e[3]&&(e[3]=f[1])}return b}function Ee(a,b,c){var d=Math.min.apply(null,a),e=Math.min.apply(null,b);a=Math.max.apply(null,a);b=Math.max.apply(null,b);return Fe(d,e,a,b,c)}function Ge(a,b,c){return t(c)?(c[0]=a[0]-b,c[1]=a[1]-b,c[2]=a[2]+b,c[3]=a[3]+b,c):[a[0]-b,a[1]-b,a[2]+b,a[3]+b]} +function He(a,b){return t(b)?(b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3],b):a.slice()}function Ie(a,b,c){b=ba[2]&&(a[2]=b[2]);b[1]a[3]&&(a[3]=b[3]);return a}function Ne(a,b,c,d,e){for(;cf;++f)g=e[f],h=d[f],e[f]=a[0]+g*b-h*c,d[f]=a[1]+g*c+h*b;return Ee(e,d,void 0)}function Re(a){return a[3]-a[1]}function Se(a){return[a[0],a[3]]}function Te(a){return a[2]-a[0]}function Ue(a,b){return a[0]<=b[2]&&a[2]>=b[0]&&a[1]<=b[3]&&a[3]>=b[1]}function Ve(a){return a[2]>1;){var m=2*b+1,n=2*b+2,m=nb;){var g=c-1>>1;if(a[g]>f)d[c]=d[g],a[c]=a[g],c=g;else break}d[c]=e;a[c]=f}function If(a){var b=a.f,c=a.a,d=a.c,e=0,f=c.length,g,h,m;for(h=0;h>1)-1;0<=b;b--)Ff(a,b)};function Jf(a,b){Df.call(this,function(b){return a.apply(null,b)},function(a){return a[0].d()});this.h=b;this.d=0}G(Jf,Df);Jf.prototype.g=function(){--this.d;this.h()};function Kf(a){yd.call(this);this.l=xf(a.projection);this.O=t(a.extent)?a.extent:t(a.projection)?this.l.p():null;this.d=t(a.attributions)?a.attributions:null;this.q=a.logo;this.f=t(a.state)?a.state:1}G(Kf,yd);Kf.prototype.k=fa;Kf.prototype.p=k("O");Kf.prototype.V=k("f");function Lf(a,b){a.f=b;a.u()};function T(a){P.call(this);a=bc(a);a.brightness=t(a.brightness)?a.brightness:0;a.contrast=t(a.contrast)?a.contrast:1;a.hue=t(a.hue)?a.hue:0;a.opacity=t(a.opacity)?a.opacity:1;a.saturation=t(a.saturation)?a.saturation:1;a.visible=t(a.visible)?a.visible:!0;a.maxResolution=t(a.maxResolution)?a.maxResolution:Infinity;a.minResolution=t(a.minResolution)?a.minResolution:0;this.Y(a)}G(T,P);T.prototype.i=function(){return this.s("brightness")};T.prototype.getBrightness=T.prototype.i;T.prototype.k=function(){return this.s("contrast")}; +T.prototype.getContrast=T.prototype.k;T.prototype.n=function(){return this.s("hue")};T.prototype.getHue=T.prototype.n;function Mf(a){var b=a.i(),c=a.k(),d=a.n(),e=a.G(),f=a.B(),g=a.Xc(),h=a.b(),m=a.o();a=a.q();return{brightness:t(b)?Qb(b,-1,1):0,contrast:t(c)?Math.max(c,0):1,hue:t(d)?d:0,opacity:t(e)?Qb(e,0,1):1,saturation:t(f)?Math.max(f,0):1,sd:g,visible:t(h)?!!h:!0,maxResolution:t(m)?m:Infinity,minResolution:t(a)?Math.max(a,0):0}}T.prototype.o=function(){return this.s("maxResolution")}; +T.prototype.getMaxResolution=T.prototype.o;T.prototype.q=function(){return this.s("minResolution")};T.prototype.getMinResolution=T.prototype.q;T.prototype.G=function(){return this.s("opacity")};T.prototype.getOpacity=T.prototype.G;T.prototype.B=function(){return this.s("saturation")};T.prototype.getSaturation=T.prototype.B;T.prototype.b=function(){return this.s("visible")};T.prototype.getVisible=T.prototype.b;T.prototype.Ua=function(a){this.t("brightness",a)};T.prototype.setBrightness=T.prototype.Ua; +T.prototype.jb=function(a){this.t("contrast",a)};T.prototype.setContrast=T.prototype.jb;T.prototype.Jc=function(a){this.t("hue",a)};T.prototype.setHue=T.prototype.Jc;T.prototype.Kc=function(a){this.t("maxResolution",a)};T.prototype.setMaxResolution=T.prototype.Kc;T.prototype.Lc=function(a){this.t("minResolution",a)};T.prototype.setMinResolution=T.prototype.Lc;T.prototype.Mc=function(a){this.t("opacity",a)};T.prototype.setOpacity=T.prototype.Mc;T.prototype.Oc=function(a){this.t("saturation",a)}; +T.prototype.setSaturation=T.prototype.Oc;T.prototype.Pc=function(a){this.t("visible",a)};T.prototype.setVisible=T.prototype.Pc;function Nf(a){var b=bc(a);delete b.source;T.call(this,b);this.a=a.source;J(this.a,"change",this.Ng,!1,this)}G(Nf,T);l=Nf.prototype;l.Wc=function(a){a=t(a)?a:[];a.push(this);return a};l.Vc=function(a){a=t(a)?a:{layers:[],$:[]};a.layers.push(this);a.$.push(Mf(this));return a};l.Mg=k("a");l.Xc=function(){return this.a.f};l.Ng=function(){this.u()};function Of(){P.call(this);this.k=[0,0]}G(Of,P);Of.prototype.N=ca(null);Of.prototype.gd=ca(!1);function Pf(a,b){a.k[1]+=b};function Qf(a){return 1-Math.pow(1-a,3)};function Rf(a){return 3*a*a-2*a*a*a}function Sf(a){return a}function Tf(a){return 0.5>a?Rf(2*a):1-Rf(2*(a-0.5))};function Uf(a){var b=a.source,c=t(a.start)?a.start:wa(),d=b[0],e=b[1],f=t(a.duration)?a.duration:1E3,g=t(a.easing)?a.easing:Rf;return function(a,b){if(b.timeb;)d-=3;if(0<=d){var b=a.a[c+2]-a.a[d+2],e=a.a[c]-a.a[d],c=a.a[c+1]-a.a[d+1];a.b=Math.atan2(c,e);a.c=Math.sqrt(e*e+c*c)/b;return a.c>a.d}return!1} +function Zf(a,b){var c=a.e,d=a.c,e=a.d,f=Math.log(a.d/a.c)/a.e;return Uf({source:b,duration:f,easing:function(a){return d*(Math.exp(c*a*f)-1)/(e-d)}})};function $f(a){if("function"==typeof a.Ba)return a.Ba();if(la(a))return a.split("");if(ja(a)){for(var b=[],c=a.length,d=0;d2*this.H&&dg(this),!0):!1};function dg(a){if(a.H!=a.a.length){for(var b=0,c=0;bc?a[1]="?":c==b.length-1&&(a[1]=void 0)}return a.join("")} +function kg(a,b,c){if(ia(b))for(var d=0;db)throw Error("Bad port number "+b);a.xb=b}else a.xb=null}function qg(a,b,c){og(a);b instanceof rg?(a.a=b,xg(a.a,a.$a)):(c||(b=sg(b,yg)),a.a=new rg(b,0,a.$a))}function zg(a,b,c){og(a);ia(c)||(c=[String(c)]);Ag(a.a,b,c)}function og(a){if(a.qg)throw Error("Tried to modify a read-only Uri");} +function Bg(a){return a instanceof mg?a.J():new mg(a,void 0)} +function Cg(a,b){a instanceof mg||(a=Bg(a));b instanceof mg||(b=Bg(b));var c=a,d=b,e=c.J(),f=!!d.Ra;f?ng(e,d.Ra):f=!!d.hb;if(f){var g=d.hb;og(e);e.hb=g}else f=!!d.za;f?(g=d.za,og(e),e.za=g):f=null!=d.xb;g=d.ya;if(f)pg(e,d.xb);else if(f=!!d.ya)if("/"!=g.charAt(0)&&(c.za&&!c.ya?g="/"+g:(c=e.ya.lastIndexOf("/"),-1!=c&&(g=e.ya.substr(0,c+1)+g))),".."==g||"."==g)g="";else if(-1!=g.indexOf("./")||-1!=g.indexOf("/.")){for(var c=0==g.lastIndexOf("/",0),g=g.split("/"),h=[],m=0;m>4&15).toString(16)+(a&15).toString(16)}var tg=/[#\/\?@]/g,vg=/[\#\?:]/g,ug=/[\#\?]/g,yg=/[\#\?@]/g,wg=/#/g; +function rg(a,b,c){this.a=a||null;this.c=!!c}function Eg(a){if(!a.R&&(a.R=new bg,a.H=0,a.a))for(var b=a.a.split("\x26"),c=0;c=a||96<=a&&106>=a||65<=a&&90>=a||vb&&0==a)return!0;switch(a){case 32:case 63:case 107:case 109:case 110:case 111:case 186:case 59:case 189:case 187:case 61:case 188:case 190:case 191:case 192:case 222:case 219:case 220:case 221:return!0;default:return!1}}function Pg(a){switch(a){case 61:return 187;case 59:return 186;case 224:return 91;case 0:return 224;default:return a}};function Qg(a,b){wd.call(this);a&&Rg(this,a,b)}G(Qg,wd);l=Qg.prototype;l.Tb=null;l.vc=null;l.bd=null;l.wc=null;l.ba=-1;l.Ma=-1;l.Qc=!1; +var Tg={3:13,12:144,63232:38,63233:40,63234:37,63235:39,63236:112,63237:113,63238:114,63239:115,63240:116,63241:117,63242:118,63243:119,63244:120,63245:121,63246:122,63247:123,63248:44,63272:46,63273:36,63275:35,63276:33,63277:34,63289:144,63302:45},Ug={Up:38,Down:40,Left:37,Right:39,Enter:13,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,"U+007F":46,Home:36,End:35,PageUp:33,PageDown:34,Insert:45},Vg=H||vb&&Hb("525"),Wg=lb&&ub; +Qg.prototype.a=function(a){vb&&(17==this.ba&&!a.Sb||18==this.ba&&!a.fa||lb&&91==this.ba&&!a.Zc)&&(this.Ma=this.ba=-1);-1==this.ba&&(a.Sb&&17!=a.Ca?this.ba=17:a.fa&&18!=a.Ca?this.ba=18:a.Zc&&91!=a.Ca&&(this.ba=91));Vg&&!Ng(a.Ca,this.ba,a.Da,a.Sb,a.fa)?this.handleEvent(a):(this.Ma=ub?Pg(a.Ca):a.Ca,Wg&&(this.Qc=a.fa))};Qg.prototype.c=function(a){this.Ma=this.ba=-1;this.Qc=a.fa}; +Qg.prototype.handleEvent=function(a){var b=a.Q,c,d,e=b.altKey;H&&"keypress"==a.type?(c=this.Ma,d=13!=c&&27!=c?b.keyCode:0):vb&&"keypress"==a.type?(c=this.Ma,d=0<=b.charCode&&63232>b.charCode&&Og(c)?b.charCode:0):sb?(c=this.Ma,d=Og(c)?b.keyCode:0):(c=b.keyCode||this.Ma,d=b.charCode||0,Wg&&(e=this.Qc),lb&&(63==d&&224==c)&&(c=191));var f=c,g=b.keyIdentifier;c?63232<=c&&c in Tg?f=Tg[c]:25==c&&a.Da&&(f=9):g&&g in Ug&&(f=Ug[g]);a=f==this.ba;this.ba=f;b=new Xg(f,d,a,b);b.fa=e;N(this,b)}; +function Rg(a,b,c){a.wc&&Yg(a);a.Tb=b;a.vc=J(a.Tb,"keypress",a,c);a.bd=J(a.Tb,"keydown",a.a,c,a);a.wc=J(a.Tb,"keyup",a.c,c,a)}function Yg(a){a.vc&&(K(a.vc),K(a.bd),K(a.wc),a.vc=null,a.bd=null,a.wc=null);a.Tb=null;a.ba=-1;a.Ma=-1}Qg.prototype.A=function(){Qg.F.A.call(this);Yg(this)};function Xg(a,b,c,d){d&&Pc(this,d,void 0);this.type="key";this.Ca=a;this.Yc=b;this.a=c}G(Xg,Oc);function Zg(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d}l=Zg.prototype;l.J=function(){return new Zg(this.top,this.right,this.bottom,this.left)};l.contains=function(a){return this&&a?a instanceof Zg?a.left>=this.left&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1}; +l.ceil=function(){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this};l.floor=function(){this.top=Math.floor(this.top);this.right=Math.floor(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.left);return this};l.round=function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this}; +l.scale=function(a,b){var c=na(b)?b:a;this.left*=a;this.right*=a;this.top*=c;this.bottom*=c;return this};function $g(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}l=$g.prototype;l.J=function(){return new $g(this.left,this.top,this.width,this.height)};l.contains=function(a){return a instanceof $g?this.left<=a.left&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a.height:a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+this.height}; +l.ceil=function(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};l.floor=function(){this.left=Math.floor(this.left);this.top=Math.floor(this.top);this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};l.round=function(){this.left=Math.round(this.left);this.top=Math.round(this.top);this.width=Math.round(this.width);this.height=Math.round(this.height);return this}; +l.scale=function(a,b){var c=na(b)?b:a;this.left*=a;this.width*=a;this.top*=c;this.height*=c;return this};function ah(a,b){var c=gc(a);return c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(a,null))?c[b]||c.getPropertyValue(b)||"":""}function bh(a,b){return ah(a,b)||(a.currentStyle?a.currentStyle[b]:null)||a.style&&a.style[b]}function ch(a,b,c){var d,e=ub&&(lb||yb)&&Hb("1.9");b instanceof Tb?(d=b.x,b=b.y):(d=b,b=c);a.style.left=dh(d,e);a.style.top=dh(b,e)} +function eh(a){var b;try{b=a.getBoundingClientRect()}catch(c){return{left:0,top:0,right:0,bottom:0}}H&&(a=a.ownerDocument,b.left-=a.documentElement.clientLeft+a.body.clientLeft,b.top-=a.documentElement.clientTop+a.body.clientTop);return b} +function fh(a){if(H&&!(H&&8<=Jb))return a.offsetParent;var b=gc(a),c=bh(a,"position"),d="fixed"==c||"absolute"==c;for(a=a.parentNode;a&&a!=b;a=a.parentNode)if(c=bh(a,"position"),d=d&&"static"==c&&a!=b.documentElement&&a!=b.body,!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||"fixed"==c||"absolute"==c||"relative"==c))return a;return null} +function gh(a){var b,c=gc(a),d=bh(a,"position"),e=ub&&c.getBoxObjectFor&&!a.getBoundingClientRect&&"absolute"==d&&(b=c.getBoxObjectFor(a))&&(0>b.screenX||0>b.screenY),f=new Tb(0,0),g;b=c?gc(c):document;(g=!H)||(g=H&&9<=Jb)||(ec(b),g=!0);g=g?b.documentElement:b.body;if(a==g)return f;if(a.getBoundingClientRect)b=eh(a),a=wc(ec(c)),f.x=b.left+a.x,f.y=b.top+a.y;else if(c.getBoxObjectFor&&!e)b=c.getBoxObjectFor(a),a=c.getBoxObjectFor(g),f.x=b.screenX-a.screenX,f.y=b.screenY-a.screenY;else{e=a;do{f.x+=e.offsetLeft; +f.y+=e.offsetTop;e!=a&&(f.x+=e.clientLeft||0,f.y+=e.clientTop||0);if(vb&&"fixed"==bh(e,"position")){f.x+=c.body.scrollLeft;f.y+=c.body.scrollTop;break}e=e.offsetParent}while(e&&e!=a);if(sb||vb&&"absolute"==d)f.y-=c.body.offsetTop;for(e=a;(e=fh(e))&&e!=c.body&&e!=g;)f.x-=e.scrollLeft,sb&&"TR"==e.tagName||(f.y-=e.scrollTop)}return f}function hh(a,b){var c=ih(a),d=ih(b);return new Tb(c.x-d.x,c.y-d.y)} +function ih(a){if(1==a.nodeType){var b;if(a.getBoundingClientRect)b=eh(a),b=new Tb(b.left,b.top);else{b=wc(ec(a));var c=gh(a);b=new Tb(c.x-b.x,c.y-b.y)}if(ub&&!Hb(12)){var d;H?d="-ms-transform":vb?d="-webkit-transform":sb?d="-o-transform":ub&&(d="-moz-transform");var e;d&&(e=bh(a,d));e||(e=bh(a,"transform"));a=e?(a=e.match(jh))?new Tb(parseFloat(a[1]),parseFloat(a[2])):new Tb(0,0):new Tb(0,0);a=new Tb(b.x+a.x,b.y+a.y)}else a=b;return a}d=oa(a.df);e=a;a.targetTouches?e=a.targetTouches[0]:d&&a.Q.targetTouches&& +(e=a.Q.targetTouches[0]);return new Tb(e.clientX,e.clientY)}function dh(a,b){"number"==typeof a&&(a=(b?Math.round(a):a)+"px");return a}function kh(a){var b=lh;if("none"!=bh(a,"display"))return b(a);var c=a.style,d=c.display,e=c.visibility,f=c.position;c.visibility="hidden";c.position="absolute";c.display="inline";a=b(a);c.display=d;c.position=f;c.visibility=e;return a} +function lh(a){var b=a.offsetWidth,c=a.offsetHeight,d=vb&&!b&&!c;return t(b)&&!d||!a.getBoundingClientRect?new Ub(b,c):(a=eh(a),new Ub(a.right-a.left,a.bottom-a.top))}function mh(a,b){var c=a.style;"opacity"in c?c.opacity=b:"MozOpacity"in c?c.MozOpacity=b:"filter"in c&&(c.filter=""===b?"":"alpha(opacity\x3d"+100*b+")")}function nh(a,b){a.style.display=b?"":"none"}function oh(a){return"rtl"==bh(a,"direction")} +function ph(a){var b=gc(a),c=H&&a.currentStyle,d;if(d=c)ec(b),d="auto"!=c.width&&"auto"!=c.height&&!c.boxSizing;if(d)return b=qh(a,c.width,"width","pixelWidth"),a=qh(a,c.height,"height","pixelHeight"),new Ub(b,a);c=new Ub(a.offsetWidth,a.offsetHeight);b=rh(a,"padding");a=sh(a);return new Ub(c.width-a.left-b.left-b.right-a.right,c.height-a.top-b.top-b.bottom-a.bottom)} +function qh(a,b,c,d){if(/^\d+px?$/.test(b))return parseInt(b,10);var e=a.style[c],f=a.runtimeStyle[c];a.runtimeStyle[c]=a.currentStyle[c];a.style[c]=b;b=a.style[d];a.style[c]=e;a.runtimeStyle[c]=f;return b}function th(a,b){var c=a.currentStyle?a.currentStyle[b]:null;return c?qh(a,c,"left","pixelLeft"):0} +function rh(a,b){if(H){var c=th(a,b+"Left"),d=th(a,b+"Right"),e=th(a,b+"Top"),f=th(a,b+"Bottom");return new Zg(e,d,f,c)}c=ah(a,b+"Left");d=ah(a,b+"Right");e=ah(a,b+"Top");f=ah(a,b+"Bottom");return new Zg(parseFloat(e),parseFloat(d),parseFloat(f),parseFloat(c))}var uh={thin:2,medium:4,thick:6};function vh(a,b){if("none"==(a.currentStyle?a.currentStyle[b+"Style"]:null))return 0;var c=a.currentStyle?a.currentStyle[b+"Width"]:null;return c in uh?uh[c]:qh(a,c,"left","pixelLeft")} +function sh(a){if(H){var b=vh(a,"borderLeft"),c=vh(a,"borderRight"),d=vh(a,"borderTop");a=vh(a,"borderBottom");return new Zg(d,c,a,b)}b=ah(a,"borderLeftWidth");c=ah(a,"borderRightWidth");d=ah(a,"borderTopWidth");a=ah(a,"borderBottomWidth");return new Zg(parseFloat(d),parseFloat(c),parseFloat(a),parseFloat(b))}var jh=/matrix\([0-9\.\-]+, [0-9\.\-]+, [0-9\.\-]+, [0-9\.\-]+, ([0-9\.\-]+)p?x?, ([0-9\.\-]+)p?x?\)/;function wh(a,b){wd.call(this);this.a=a;var c=pa(this.a)&&1==this.a.nodeType?this.a:this.a?this.a.body:null;this.e=!!c&&oh(c);this.c=J(this.a,ub?"DOMMouseScroll":"mousewheel",this,b)}G(wh,wd); +wh.prototype.handleEvent=function(a){var b=0,c=0,d=0;a=a.Q;if("mousewheel"==a.type){c=1;if(H||vb&&(mb||Hb("532.0")))c=40;d=xh(-a.wheelDelta,c);t(a.wheelDeltaX)?(b=xh(-a.wheelDeltaX,c),c=xh(-a.wheelDeltaY,c)):c=d}else d=a.detail,100d&&(d=-3),t(a.axis)&&a.axis===a.HORIZONTAL_AXIS?b=d:c=d;na(this.b)&&(b=Qb(b,-this.b,this.b));na(this.d)&&(c=Qb(c,-this.d,this.d));this.e&&(b=-b);b=new yh(d,a,b,c);N(this,b)};function xh(a,b){return vb&&(lb||nb)&&0!=a%b?a:a/b} +wh.prototype.A=function(){wh.F.A.call(this);K(this.c);this.c=null};function yh(a,b,c,d){b&&Pc(this,b,void 0);this.type="mousewheel";this.d=a;this.b=c;this.a=d}G(yh,Oc);function zh(a,b,c){Gc.call(this,a);this.map=b;this.b=t(c)?c:null}G(zh,Gc);function Ah(a,b,c,d){zh.call(this,a,b,d);this.a=c;this.originalEvent=c.Q;this.coordinate=b.Ud(this.originalEvent);this.pixel=b.pc(this.originalEvent)}G(Ah,zh);Ah.prototype.M=function(){Ah.F.M.call(this);this.a.M()};Ah.prototype.Ea=function(){Ah.F.Ea.call(this);this.a.Ea()}; +function Bh(a){wd.call(this);this.a=a;this.g=0;this.b=!1;this.va=this.f=this.e=this.d=this.c=null;a=this.a.b;this.h=[J(a,"mousemove",this.xe,!1,this),J(a,"click",this.xe,!1,this)];this.d=J(a,"mousedown",this.Xf,!1,this);this.e=J(a,"MSPointerDown",this.Zf,!1,this);this.f=J(a,"touchstart",this.lg,!1,this)}G(Bh,wd);function Ch(a,b){if(0!==a.g){s.clearTimeout(a.g);a.g=0;var c=new Ah(Dh,a.a,b);N(a,c)}else a.g=s.setTimeout(B(function(){this.g=0;var a=new Ah(Eh,this.a,b);N(this,a)},a),250)}l=Bh.prototype; +l.Yf=function(a){this.va&&(Ka(this.c,K),this.c=null,this.b?(a=new Ah(Fh,this.a,a),N(this,a)):Rc(a)&&Ch(this,a))};l.Xf=function(a){null!==this.e&&(K(this.e),this.e=null,K(this.f),this.f=null);var b=new Ah(Gh,this.a,a);N(this,b);this.va=a;this.b=!1;this.c=[J(s.document,"mousemove",this.Dg,!1,this),J(s.document,"mouseup",this.Yf,!1,this)];a.M()};l.Dg=function(a){var b;this.b||(this.b=!0,b=new Ah(Hh,this.a,this.va),N(this,b));b=new Ah(Ih,this.a,a);N(this,b)}; +l.Zf=function(a){null!==this.d&&(K(this.d),this.d=null,K(this.f),this.f=null);var b=new Ah(Jh,this.a,a);N(this,b);this.va=a;this.b=!1;this.c=[J(s.document,"MSPointerMove",this.$f,!1,this),J(s.document,"MSPointerUp",this.ag,!1,this)];a.M()};l.$f=function(a){if(a.clientX!=this.va.clientX||a.clientY!=this.va.clientY)this.b=!0,a=new Ah(Kh,this.a,a),N(this,a)};l.ag=function(a){var b=new Ah(Lh,this.a,a);N(this,b);Ka(this.c,K);!this.b&&Rc(a)&&Ch(this,this.va)}; +l.lg=function(a){null!==this.d&&(K(this.d),this.d=null,K(this.e),this.e=null);var b=new Ah(Jh,this.a,a);N(this,b);this.va=a;this.b=!1;null===this.c&&(this.c=[J(s.document,"touchmove",this.kg,!1,this),J(s.document,"touchend",this.jg,!1,this)]);a.M()};l.kg=function(a){this.b=!0;var b=new Ah(Kh,this.a,a);N(this,b);a.M()};l.jg=function(a){var b=new Ah(Lh,this.a,a);N(this,b);0===a.Q.targetTouches.length&&(Ka(this.c,K),this.c=null);this.b||Ch(this,this.va)}; +l.A=function(){null!==this.h&&(Ka(this.h,K),this.h=null);null!==this.d&&(K(this.d),this.d=null);null!==this.e&&(K(this.e),this.e=null);null!==this.f&&(K(this.f),this.f=null);null!==this.c&&(Ka(this.c,K),this.c=null);Bh.F.A.call(this)};l.xe=function(a){N(this,new Ah(a.type,this.a,a))};var Dh="dblclick",Gh="down",Hh="dragstart",Ih="drag",Fh="dragend",Eh="singleclick",Jh="touchstart",Kh="touchmove",Lh="touchend",Mh={ii:"click",ji:Dh,qi:"mousemove",ki:Gh,ni:Hh,li:Ih,mi:Fh,ri:Eh,vi:Jh,ui:Kh,ti:Lh};function Nh(a){return function(b){if(t(b))return[Qb(b[0],a[0],a[2]),Qb(b[1],a[1],a[3])]}}function Oh(a){return a};function Ph(a,b,c){var d=a.length;if(a[0]<=b)return 0;if(!(b<=a[d-1]))if(0c)for(c=1;cf?1:0.5,d=Math.floor(Math.log(b/d)/Math.log(a)+f),e=Math.max(d+e,0),t(c)&&(e=Math.min(e,c)),b/Math.pow(a,e)}};function Sh(a){if(t(a))return 0}function Th(a,b){if(t(a))return a+b}function Uh(a){var b=2*Math.PI/a;return function(a,d){if(t(a))return a=Math.floor((a+d)/b+0.5)*b}}function Vh(){var a=Sb(5);return function(b,c){if(t(b))return Math.abs(b+c)<=a?0:b+c}};function Wh(a,b,c){this.center=a;this.resolution=b;this.rotation=c};function U(a){Of.call(this);a=a||{};var b={};b.center=t(a.center)?a.center:null;b.projection=wf(a.projection);var c,d,e;if(t(a.resolutions))c=a.resolutions,d=c[0],e=c[c.length-1],c=Qh(c);else{d=a.maxResolution;t(d)||(d=a.projection,e=wf(d).p(),d=(null===e?360*bf.degrees/bf[d.ta]:Math.max(e[2]-e[0],e[3]-e[1]))/256);c=a.maxZoom;t(c)||(c=28);var f=a.zoomFactor;t(f)||(f=2);e=d/Math.pow(f,c);c=Rh(f,d,c)}this.i=d;this.o=e;(t(a.enableRotation)?a.enableRotation:1)?(d=a.constrainRotation,d=t(d)&&!0!==d?!1=== +d?Th:na(d)?Uh(d):Th:Vh()):d=Sh;this.g=new Wh(t(a.extent)?Nh(a.extent):Oh,c,d);t(a.resolution)?b.resolution=a.resolution:t(a.zoom)&&(b.resolution=this.a(this.i,a.zoom));b.rotation=t(a.rotation)?a.rotation:0;this.Y(b)}G(U,Of);U.prototype.a=function(a,b,c){return this.g.resolution(a,b||0,c||0)};U.prototype.constrainRotation=function(a,b){return this.g.rotation(a,b||0)};U.prototype.b=function(){return this.s("center")};U.prototype.getCenter=U.prototype.b; +U.prototype.r=function(a){var b=this.b(),c=this.d();return[b[0]-c*a[0]/2,b[1]-c*a[1]/2,b[0]+c*a[0]/2,b[1]+c*a[1]/2]};U.prototype.l=function(){return this.s("projection")};U.prototype.getProjection=U.prototype.l;U.prototype.d=function(){return this.s("resolution")};U.prototype.getResolution=U.prototype.d;function Xh(a,b){return Math.max((a[2]-a[0])/b[0],(a[3]-a[1])/b[1])}function Yh(a){var b=a.i,c=Math.log(b/a.o)/Math.log(2);return function(a){return b/Math.pow(2,a*c)}}U.prototype.n=function(){return this.s("rotation")}; +U.prototype.getRotation=U.prototype.n;function Zh(a){var b=a.i,c=Math.log(b/a.o)/Math.log(2);return function(a){return Math.log(b/a)/Math.log(2)/c}}l=U.prototype;l.N=function(){return this};function $h(a){var b=a.b(),c=a.l(),d=a.d();a=a.n();return{center:b.slice(),projection:t(c)?c:null,resolution:d,rotation:t(a)?a:0}}l.Gf=function(){var a,b=this.d();if(t(b)){var c,d=0;do{c=this.a(this.i,d);if(c==b){a=d;break}++d}while(c>this.o)}return a}; +l.Sd=function(a,b){if(!Ve(a)){this.pa(Pe(a));var c=Xh(a,b),d=this.a(c,0,0);d=w.a&&g.a[v][u].b<=w.c&&g.a[v][u].c>=w.b){u= +!0;break a}u=!1}u?(h in q&&delete q[h],r[h]=g):q[h]=g}b=[r,q];a=b[0];b=b[1];for(var y in this.d)y in a?(this.b[y]||(nh(this.d[y],!0),this.b[y]=!0),delete a[y]):y in b?(this.b[y]&&(nh(this.d[y],!1),delete this.b[y]),delete b[y]):(tc(this.d[y]),delete this.d[y],delete this.b[y]);for(y in a)c=oc("LI"),c.innerHTML=a[y].c,this.k.appendChild(c),this.d[y]=c,this.b[y]=!0;for(y in b)c=oc("LI"),c.innerHTML=b[y].c,nh(c,!1),this.k.appendChild(c),this.d[y]=c;y=!Zb(this.b);this.i!=y&&(nh(this.element,y),this.i= +y)}};function ci(a){a=t(a)?a:{};this.d=oc("UL");var b=lc("DIV",{"class":(t(a.className)?a.className:"ol-logo")+" ol-unselectable"},this.d);ai.call(this,{element:b,target:a.target});this.b=!0;this.i={}}G(ci,ai); +ci.prototype.f=function(a){a=a.b;if(null===a)this.b&&(nh(this.element,!1),this.b=!1);else{var b;a=a.dd;var c=this.i;for(b in c)b in a||(tc(c[b]),delete c[b]);for(var d in a)if(!(d in c)){b=new Image;b.src=d;var e=a[d];""===e?e=b:(e=lc("A",{href:e,target:"_blank"}),e.appendChild(b));b=lc("LI",void 0,e);this.d.appendChild(b);c[d]=b}d=!Zb(a);this.b!=d&&(nh(this.element,d),this.b=d)}};function di(a){a=t(a)?a:{};var b=t(a.className)?a.className:"ol-zoom",c=t(a.delta)?a.delta:1,d=t(a.zoomInLabel)?a.zoomInLabel:"+",e=t(a.zoomOutLabel)?a.zoomOutLabel:"\u2212",f=t(a.zoomOutTipLabel)?a.zoomOutTipLabel:"Zoom out",g=lc("SPAN",{role:"tooltip"},t(a.zoomInTipLabel)?a.zoomInTipLabel:"Zoom in"),d=lc("BUTTON",{"class":b+"-in ol-has-tooltip",name:"ZoomIn",type:"button"},g,d);J(d,["touchend","click"],va(di.prototype.d,c),!1,this);J(d,["mouseout",Mc],function(){this.blur()},!1);f=lc("SPAN",{role:"tooltip", +type:"button"},f);e=lc("BUTTON",{"class":b+"-out ol-has-tooltip",name:"ZoomOut"},f,e);J(e,["touchend","click"],va(di.prototype.d,-c),!1,this);J(e,["mouseout",Mc],function(){this.blur()},!1);b=lc("DIV",b+" ol-unselectable",d,e);ai.call(this,{element:b,target:a.target});this.b=t(a.duration)?a.duration:250}G(di,ai);di.prototype.d=function(a,b){b.M();var c=this.a,d=c.a().N(),e=d.d();t(e)&&(0>1,p=g(c,f[n]),0q?(c=(c-f[-q-2])/(f[-q-1]-f[-q-2]),b+=(-q-2)*d,f=(1-c)*a[b]+c*a[b+d],g=(1-c)*a[b+1]+c*a[b+d+1]):(f=a[b+q*d],g=a[b+q*d+1])}return null!= +e?(e.push(f,g),e):[f,g]}function Ai(a,b,c,d,e,f){if(c==b)return null;if(e>1,ef!=p>f&&e<(n-h)*(f-m)/(p-m)+h&&(g=!g);h=n;m=p}return g}function Ei(a,b,c,d){for(var e=0,f=a[c-d],g=a[c-d+1];br&&(n=(n+p)/2,Gi(a,b,c,d,n,q)&&(x=n,r=w));n=p}isNaN(x)&&(x=e[f]);return t(g)?(g.push(x,q),g):[x,q]}function Ii(a,b,c){var d=0,e,f;e=0;for(f=b.length;ea||0!==this.g&&a<=this.g)return this;var b=a.toString();if(this.f.hasOwnProperty(b))return this.f[b];var c=this.mb(a);if(c.j.lengthe&&(e=f);f=h;g=m}return e}function Si(a,b,c,d,e){var f,g;f=0;for(g=c.length;fh){for(;bu&&(n=p,u=z)}u>e&&(m[(n-b)/d]=1,q+dF&&aaF)&&(0>O&&saO)||(w[g++]=z,w[g++]=D,v=z,y=D);z=E;D=L}}w[g++]=z;w[g++]=D}}h.push(g);b=p}return g};function Xi(a,b){Mi.call(this);this.d=this.h=-1;this.K(a,b)}G(Xi,Mi);l=Xi.prototype;l.J=function(){var a=new Xi(null),b=this.j.slice();Oi(a,this.b,b);a.u();return a};l.la=function(a,b,c,d){if(dthis.n&&(this.a=!0));this.e=c;a=a.map;c=ih(a.b);d=nj(this.targetTouches);d[0]-=c.x;d[1]-=c.y;this.b=a.ea(d);this.a&&(c=a.a().N(),d=$h(c),a.I(),gi(a,c,d.rotation+b,this.b))}; +pj.prototype.f=function(a){if(2>this.targetTouches.length){a=a.map;var b=a.a().N(),c=$h(b);if(this.a){var c=c.rotation,d=this.b,c=b.constrainRotation(c,0);gi(a,b,c,d,250)}return!1}return!0};pj.prototype.h=function(a){return 2<=this.targetTouches.length?(a=a.map,this.b=null,this.e=void 0,this.a=!1,this.i=0,a.I(),!0):!1};function qj(a){a=t(a)?a:{};mj.call(this);this.b=null;this.i=t(a.duration)?a.duration:400;this.a=void 0;this.e=1}G(qj,mj);qj.prototype.g=function(a){var b=1,c=this.targetTouches[0],d=this.targetTouches[1],e=c.clientX-d.clientX,c=c.clientY-d.clientY,e=Math.sqrt(e*e+c*c);t(this.a)&&(b=this.a/e);this.a=e;1!=b&&(this.e=b);a=a.map;var e=a.a().N(),c=$h(e),d=ih(a.b),f=nj(this.targetTouches);f[0]-=d.x;f[1]-=d.y;this.b=a.ea(f);a.I();ii(a,e,c.resolution*b,this.b)}; +qj.prototype.f=function(a){if(2>this.targetTouches.length){a=a.map;var b=a.a().N(),c=$h(b).resolution,d=this.b,e=this.i,c=b.a(c,0,this.e-1);ii(a,b,c,d,e);return!1}return!0};qj.prototype.h=function(a){return 2<=this.targetTouches.length?(a=a.map,this.b=null,this.a=void 0,this.e=1,a.I(),!0):!1};function rj(a){a=t(a)?a:{};var b=new Q,c=new Xf(-0.005,0.05,100);(t(a.altShiftDragRotate)?a.altShiftDragRotate:1)&&b.push(new si);(t(a.doubleClickZoom)?a.doubleClickZoom:1)&&b.push(new ji({delta:a.zoomDelta,duration:a.zoomDuration}));(t(a.touchPan)?a.touchPan:1)&&b.push(new oj({kinetic:c}));(t(a.touchRotate)?a.touchRotate:1)&&b.push(new pj);(t(a.touchZoom)?a.touchZoom:1)&&b.push(new qj({duration:a.zoomDuration}));(t(a.dragPan)?a.dragPan:1)&&b.push(new ri({kinetic:c}));if(t(a.keyboard)?a.keyboard: +1)b.push(new jj),b.push(new kj({delta:a.zoomDelta,duration:a.zoomDuration}));(t(a.mouseWheelZoom)?a.mouseWheelZoom:1)&&b.push(new lj({duration:a.zoomDuration}));(t(a.shiftDragZoom)?a.shiftDragZoom:1)&&b.push(new ij);return b};function sj(a){var b=t(a)?a:{};a=bc(b);delete a.layers;b=b.layers;T.call(this,a);this.a=null;J(this,Fd("layers"),this.Uf,!1,this);t(b)?ia(b)&&(b=new Q(Ra(b))):b=new Q;this.d(b)}G(sj,T);l=sj.prototype;l.de=function(){this.b()&&this.u()}; +l.Uf=function(){null!==this.a&&(Ka(Xb(this.a),K),this.a=null);var a=this.eb();if(null!=a){this.a={add:J(a,"add",this.Tf,!1,this),remove:J(a,"remove",this.Vf,!1,this)};var a=a.a,b,c,d;b=0;for(c=a.length;b=this.minZoom;){if(b.call(c,a,Fj(this,e,a,d)))return!0;--a}return!1};l.vf=k("minZoom"); +l.Wb=function(a){return null===this.d?this.f[a]:this.d};l.Ya=k("a");l.rc=function(a,b,c){return a.aa.d&&(a.d=d.d),d.ba.c&&(a.c=d.c)):a[b][c]=d:(a[b]={},a[b][c]=d)}function Rj(a,b,c,d){return function(e,f,g){e=b.nb(e,f,g,c,d);return a(e)?e:null}}function Sj(a,b,c){return[b*(Math.round(a[0]/b)+c[0]%2/2),b*(Math.round(a[1]/b)+c[1]%2/2)]} +function Tj(a,b,c,d,e,f,g,h,m,n){var p=A(b).toString();p in a.Ab||(a.Ab[p]={});var r=a.Ab[p];a=a.Uh;var q=c.minZoom,u,x,w,v,y,z;t(h)||(h=0);for(z=g;z>=q;--z)for(x=Fj(c,f,z),w=c.a[z],v=x.a;v<=x.d;++v)for(y=x.b;y<=x.c;++y)g-z<=h?(u=b.nb(z,v,y,d,e),0==u.state&&(r[u.a.toString()]=!0,u.d()in a.b||Gf(a,[u,p,Ij(c,u.a),w])),t(m)&&m.call(n,u)):b.Ie(z,v,y)};function Uj(a){a=t(a)?a:{};this.b=t(a.anchor)?a.anchor:[0.5,0.5];this.c=t(a.anchorOrigin)?a.anchorOrigin:"top-left";this.d=t(a.anchorXUnits)?a.anchorXUnits:"fraction";this.g=t(a.anchorYUnits)?a.anchorYUnits:"fraction";var b=a.src,c=t(a.crossOrigin)?a.crossOrigin:null,d=Vj.Ka(),e;e=c+":"+b;e=e in d.a?d.a[e]:null;null===e&&(e=new Wj(b,c),d.a[c+":"+b]=e,++d.c);this.a=e;this.h=t(a.size)?a.size:null;ke.call(this,{opacity:t(a.opacity)?a.opacity:1,rotation:t(a.rotation)?a.rotation:0,scale:t(a.scale)?a.scale: +1,Fe:void 0,rotateWithView:t(a.rotateWithView)?a.rotateWithView:!1})}G(Uj,ke);l=Uj.prototype;l.Pb=function(){var a=this.b,b=this.vb();if("fraction"==this.d||"fraction"==this.g){if(null===b)return null;a=this.b.slice();"fraction"==this.d&&(a[0]*=b[0]);"fraction"==this.g&&(a[1]*=b[1])}if("top-left"!=this.c){if(null===b)return null;a===this.b&&(a=this.b.slice());if("top-right"==this.c||"bottom-right"==this.c)a[0]=-a[0]+b[0];if("bottom-left"==this.c||"bottom-right"==this.c)a[1]+=b[1]}return a};l.Vb=function(){return this.a.a}; +l.re=function(){return this.a.c};l.qe=function(){var a=this.a;if(null===a.d)if(a.h){var b=oc("CANVAS"),c=a.e[0],d=a.e[1];b.width=c;b.height=d;b.getContext("2d").fillRect(0,0,c,d);a.d=b}else a.d=a.a;return a.d};l.gh=function(){return this.a.f};l.vb=function(){return null===this.h?this.a.e:this.h};l.ge=function(a,b){return J(this.a,"change",a,!1,b)};l.se=function(){var a=this.a;if(0==a.c){a.c=1;a.b=[ed(a.a,"error",a.g,!1,a),ed(a.a,"load",a.i,!1,a)];try{a.a.src=a.f}catch(b){a.g()}}}; +l.He=function(a,b){fd(this.a,"change",a,!1,b)};function Wj(a,b){wd.call(this);this.d=null;this.a=new Image;null!==b&&(this.a.crossOrigin=b);this.b=null;this.c=0;this.e=null;this.f=a;this.h=!1}G(Wj,wd);Wj.prototype.g=function(){this.c=3;Ka(this.b,K);this.b=null;N(this,"change")}; +Wj.prototype.i=function(){this.c=2;this.e=[this.a.width,this.a.height];Ka(this.b,K);this.b=null;var a=oc("CANVAS");a.width=1;a.height=1;a=a.getContext("2d");a.drawImage(this.a,0,0);try{a.getImageData(0,0,1,1)}catch(b){this.h=!0}N(this,"change")};function Vj(){this.a={};this.c=0;this.b=32}ga(Vj);Vj.prototype.clear=function(){this.a={};this.c=0};function Xj(a,b,c,d,e,f,g,h){Vd(a);0===b&&0===c||Xd(a,b,c);1==d&&1==e||Yd(a,d,e);0!==f&&Zd(a,f);0===g&&0===h||Xd(a,g,h);return a}function Yj(a,b){return a[0]==b[0]&&a[1]==b[1]&&a[4]==b[4]&&a[5]==b[5]&&a[12]==b[12]&&a[13]==b[13]}function Zj(a,b,c){var d=a[1],e=a[5],f=a[13],g=b[0];b=b[1];c[0]=a[0]*g+a[4]*b+a[12];c[1]=d*g+e*b+f;return c};function ak(a,b){Bc.call(this);this.f=b;this.b={}}G(ak,Bc); +function bk(a){var b=a.w,c=a.Md;Xj(c,a.size[0]/2,a.size[1]/2,1/b.resolution,-1/b.resolution,-b.rotation,-b.center[0],-b.center[1]);a=a.ue;var b=c[0],d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],m=c[6],n=c[7],p=c[8],r=c[9],q=c[10],u=c[11],x=c[12],w=c[13],v=c[14],c=c[15],y=b*h-d*g,z=b*m-e*g,D=b*n-f*g,E=d*m-e*h,L=d*n-f*h,F=e*n-f*m,O=p*w-r*x,aa=p*v-q*x,sa=p*c-u*x,ma=r*v-q*w,M=r*c-u*w,ka=q*c-u*v,ea=y*ka-z*M+D*ma+E*sa-L*aa+F*O;0!=ea&&(ea=1/ea,a[0]=(h*ka-m*M+n*ma)*ea,a[1]=(-d*ka+e*M-f*ma)*ea,a[2]=(w*F-v*L+c*E)*ea, +a[3]=(-r*F+q*L-u*E)*ea,a[4]=(-g*ka+m*sa-n*aa)*ea,a[5]=(b*ka-e*sa+f*aa)*ea,a[6]=(-x*F+v*D-c*z)*ea,a[7]=(p*F-q*D+u*z)*ea,a[8]=(g*M-h*sa+n*O)*ea,a[9]=(-b*M+d*sa-f*O)*ea,a[10]=(x*L-w*D+c*y)*ea,a[11]=(-p*L+r*D-u*y)*ea,a[12]=(-g*ma+h*aa-m*O)*ea,a[13]=(b*ma-d*aa+e*O)*ea,a[14]=(-x*E+w*z-v*y)*ea,a[15]=(p*E-r*z+q*y)*ea)}ak.prototype.gc=function(a){return new Lj(this,a)};ak.prototype.A=function(){Vb(this.b,function(a){Fc(a)});ak.F.A.call(this)}; +function ck(a,b){var c=A(b).toString();if(c in a.b)return a.b[c];var d=a.gc(b);return a.b[c]=d}ak.prototype.Ec=fa;ak.prototype.r=function(a,b){for(var c in this.b)if(!(null!==b&&c in b.$)){var d=this.b[c];delete this.b[c];Fc(d)}};function dk(a){a.Pa.push(function(){var a=Vj.Ka();if(a.c>a.b){var c=0,d,e;for(d in a.a)e=a.a[d],0!==(c++&3)||id(e)||(delete a.a[d],--a.c)}})}function ek(a,b){for(var c in a.b)if(!(c in b.$)){b.Pa.push(B(a.r,a));break}};function fk(a){Nf.call(this,a)}G(fk,Nf);function gk(a){Nf.call(this,a)}G(gk,Nf);gk.prototype.d=function(){return this.s("preload")};gk.prototype.getPreload=gk.prototype.d;gk.prototype.g=function(a){this.t("preload",a)};gk.prototype.setPreload=gk.prototype.g;gk.prototype.f=function(){return this.s("useInterimTilesOnError")};gk.prototype.getUseInterimTilesOnError=gk.prototype.f;gk.prototype.l=function(a){this.t("useInterimTilesOnError",a)};gk.prototype.setUseInterimTilesOnError=gk.prototype.l;function hk(a){a=t(a)?a:{};var b=bc(a);delete b.style;Nf.call(this,b);this.O=null;this.f=void 0;t(a.style)&&this.g(a.style)}G(hk,Nf);hk.prototype.r=function(){return this.s("renderGeometryFunctions")};hk.prototype.getRenderGeometryFunctions=hk.prototype.r;hk.prototype.Sa=k("O");hk.prototype.Ta=k("f");hk.prototype.Nc=function(a){this.t("renderGeometryFunctions",a)};hk.prototype.setRenderGeometryFunctions=hk.prototype.Nc;hk.prototype.g=function(a){this.O=a;this.f=qe(a);this.u()};function ik(a,b,c,d,e){this.S={};this.b=a;this.B=b;this.g=c;this.f=d;this.jb=e;this.h=this.a=this.c=this.ja=this.U=this.O=null;this.o=this.V=this.r=this.ca=0;this.ua=!1;this.i=this.Ia=0;this.Sa=!1;this.Ta=0;this.d="";this.l=this.q=0;this.G=this.n=this.k=null;this.e=[];this.Ua=Rd()} +function jk(a,b){if(null!==a.h){var c=Li(b,2,a.f,a.e),d=a.b,e=a.Ua,f=d.globalAlpha;1!=a.o&&(d.globalAlpha=f*a.o);var g=a.Ia;a.ua&&(g+=a.jb);var h,m;h=0;for(m=c.length;hx&&(z=z|4);yw&&(z|=2);0===z&&(z=1);u=z;u!==q?(p&&(a.coordinates[g++]=m[0],a.coordinates[g++]=m[1]),a.coordinates[g++]=n[0],a.coordinates[g++]=n[1],p=!1):1===u?(a.coordinates[g++]=n[0],a.coordinates[g++]=n[1],p=!1):p=!0;m[0]=n[0];m[1]=n[1];q=u}f&&(a.coordinates[g++]=b[c],a.coordinates[g++]=b[c+ +1]);return g}function Ek(a,b){a.o=[0,b,0];a.c.push(a.o);a.q=[0,b,0];a.a.push(a.q)} +function Fk(a,b,c,d,e,f,g,h){var m;Yj(d,a.B)?m=a.r:(m=Li(a.coordinates,2,d,a.r),Ud(a.B,d));d=0;var n=g.length,p=0,r;for(a=a.O;da||0!==this.g&&a=a;--b)Me(f,d[b].extent),g+=Te(f)+Re(f);return g}l=ul.prototype; +l.clear=function(){var a=this.a;a.extent=Ke(this.a.extent);a.height=1;a.a.length=0;a.value=null;$b(this.c)};l.forEach=function(a,b){return wl(this.a,a,b)};function wl(a,b,c){for(var d=[a],e,f,g;0a.b){g=a;h=e;f=c;d=h[f];p=g;m=d;n=vl(p,m,ql); +p=vl(p,m,rl);n=h.maxResolution||ec;++c)d[c]=b[c].toFixed(6);c=d.join(",")}else c=b.join(",");Pl(a,"matrix3d("+c+")")}else if(Nl()){d=[b[0],b[1],b[4],b[5],b[12],b[13]];if(t(6)){var e=Array(6);for(c=0;6>c;++c)e[c]=d[c].toFixed(6);c=e.join(",")}else c=d.join(",");Pl(a,"matrix("+c+")")}else a.style.left=Math.round(b[12])+"px",a.style.top=Math.round(b[13])+"px"};function Rl(a,b,c){Lj.call(this,a,b);this.target=c}G(Rl,Lj);function Sl(a,b){var c=oc("DIV");c.style.position="absolute";Rl.call(this,a,b,c);this.c=null;this.e=Td()}G(Sl,Rl);Sl.prototype.f=function(a,b,c,d){var e=this.a;return e.a.k(b.extent,b.w.resolution,b.w.rotation,a,function(a){return c.call(d,a,e)})}; +Sl.prototype.b=function(a){var b=a.w,c=b.center,d=b.resolution,e=b.rotation,f=this.c,g=this.a.a,h=a.P;h[0]||h[1]||(b=g.ub(a.extent,d,a.pixelRatio,b.projection),null!==b&&(h=b.state,0==h?(ed(b,"change",this.l,!1,this),Bj(b)):2==h&&(f=b)));if(null!==f){var h=f.p(),m=f.d,b=Rd();Xj(b,a.size[0]/2,a.size[1]/2,m/d,m/d,e,(h[0]-c[0])/m,(c[1]-h[3])/m);f!=this.c&&(c=f.e(this),c.style.maxWidth="none",c.style.position="absolute",qc(this.target),this.target.appendChild(c),this.c=f);Yj(b,this.e)||(Ql(this.target, +b),Ud(this.e,b));Oj(a.attributions,f.g);Pj(a,g)}};function Tl(a,b){var c=oc("DIV");c.style.position="absolute";Rl.call(this,a,b,c);this.e=!0;this.h=1;this.g=0;this.c={}}G(Tl,Rl); +Tl.prototype.b=function(a,b){if(b.visible){var c=a.pixelRatio,d=a.w,e=d.projection,f=this.a,g=f.a,h=Kj(g,e),m=g.qc(),n=Ph(h.a,d.resolution,0),p=h.a[n],r=d.center,q;p==d.resolution?(r=Sj(r,p,a.size),q=Qe(r,p,d.rotation,a.size)):q=a.extent;var p=Gj(h,q,p),u={};u[n]={};var x=B(g.Uc,g,u,Rj(function(a){return null!==a&&2==a.state},g,c,e)),w=f.f();t(w)||(w=!0);var v=De(),y=new db(0,0,0,0),z,D,E,L;for(E=p.a;E<=p.d;++E)for(L=p.b;L<=p.c;++L)z=g.nb(n,E,L,c,e),D=z.state,2==D?u[n][z.a.toString()]=z:4==D||3== +D&&!w||(D=h.oc(z.a,x,null,y,v),D||(z=h.rc(z.a,y,v),null===z||x(n+1,z)));var F;if(this.g!=g.c){for(F in this.c)w=this.c[+F],tc(w.target);this.c={};this.g=g.c}v=La(Yb(u),Number);Va(v);var x={},O;E=0;for(L=v.length;EF&&sc(this.target,w.target,0)}else a.P[0]||a.P[1]||Yl(w,q,y);else tc(w.target),delete this.c[F];b.opacity!=this.h&&(mh(this.target,b.opacity),this.h=b.opacity);b.visible&&!this.e&&(nh(this.target,!0),this.e=!0);Qj(a.bc,g,n,p);Tj(a,g,h,c,e,q,n,f.d());Nj(a,g);Pj(a,g)}else this.e&&(nh(this.target,!1),this.e=!1)}; +function Ul(a,b){this.target=oc("DIV");this.target.style.position="absolute";this.target.style.width="100%";this.target.style.height="100%";this.e=a;this.b=b;this.f=Se(Ej(a,b));this.g=a.a[b.a];this.c={};this.a=null;this.d=Td()} +function Vl(a,b,c){var d=b.a,e=d.toString();if(!(e in a.c)){var f=a.e.na(d.a),g=b.b(a),h=g.style;h.maxWidth="none";var m,n;0c)break;if(bb&&(-1==e||h=n.minResolution)&&d.push(m);g=0;for(h=d.length;g=b[0]||0>=b[1])return!1;a=a.a();return t(a)&&a.gd()?!0:!1}l.Oh=function(){var a=this.q;Hg(a);a.Od()};l.I=function(){null!=this.q.X||this.q.start()};l.Ih=function(a){if(t(this.k.remove(a)))return a}; +l.Kh=function(a){var b;t(this.i.remove(a))&&(b=a);return b};l.Lh=function(a){return this.Xa().eb().remove(a)};l.Mh=function(a){if(t(this.l.remove(a)))return a}; +l.Nh=function(a){var b,c,d,e=this.g();b=this.a();var f=t(b)?this.a().N():void 0,g=null;if(t(e)&&0c?(e="\u2032",b*=60):e="\u00b0":"imperial"==f?0.9144> +c?(e="in",b/=0.0254):1609.344>c?(e="ft",b/=0.3048):(e="mi",b/=1609.344):"nautical"==f?(b/=1852,e="nm"):"metric"==f?1>c?(e="mm",b*=1E3):1E3>c?e="m":(e="km",b/=1E3):"us"==f&&(0.9144>c?(e="in",b*=39.37):1609.344>c?(e="ft",b/=0.30480061):(e="mi",b/=1609.3472));for(var f=3*Math.floor(Math.log(a.k*b)/Math.log(10)),g,h;;){g=Zm[f%3]*Math.pow(10,Math.floor(f/3));h=Math.round(g/b);if(h>=a.k)break;++f}g=g+e;a.q!=g&&(a.i.innerHTML=g,a.q=g);a.B!=h&&(a.i.style.width=h+"px",a.B=h);a.d||(nh(a.l,!0),a.d=!0)}};function an(a){Bc.call(this);this.c=a;this.a={}}G(an,Bc);var bn=[];an.prototype.ga=function(a,b,c,d,e){ia(b)||(bn[0]=b,b=bn);for(var f=0;fthis.ee)if(N(this,new hn("start",this,a.clientX,a.clientY,a)))this.bb=!0;else{this.ca||this.lc(a);return}}c=ln(this,b,c);b=c.x;c=c.y;this.bb&&N(this,new hn("beforedrag",this,a.clientX,a.clientY,a,b,c))&&(mn(this,a,b,c),a.M())}}; +function ln(a,b,c){var d=wc(ec(a.b));b+=d.x-a.e.x;c+=d.y-a.e.y;a.e=d;a.ob+=b;a.pb+=c;b=jn(a,a.ob);a=kn(a,a.pb);return new Tb(b,a)}l.Bh=function(a){var b=ln(this,0,0);a.clientX=this.clientX;a.clientY=this.clientY;mn(this,a,b.x,b.y)};function mn(a,b,c,d){a.vd&&fn(a)?a.target.style.right=c+"px":a.target.style.left=c+"px";a.target.style.top=d+"px";N(a,new hn("drag",a,b.clientX,b.clientY,b,c,d))} +function jn(a,b){var c=a.c,d=isNaN(c.left)?null:c.left,c=isNaN(c.width)?0:c.width;return Math.min(null!=d?d+c:Infinity,Math.max(null!=d?d:-Infinity,b))}function kn(a,b){var c=a.c,d=isNaN(c.top)?null:c.top,c=isNaN(c.height)?0:c.height;return Math.min(null!=d?d+c:Infinity,Math.max(null!=d?d:-Infinity,b))}function hn(a,b,c,d,e,f,g,h){Gc.call(this,a);this.clientX=c;this.clientY=d;this.d=e;this.left=t(f)?f:b.ob;this.top=t(g)?g:b.pb;this.b=b;this.a=!!h}G(hn,Gc);function nn(a){a=t(a)?a:{};this.b=void 0;this.i=on;this.k=!1;var b=t(a.className)?a.className:"ol-zoomslider";a=lc("DIV",[b+"-thumb","ol-unselectable"]);b=lc("DIV",[b,"ol-unselectable"],a);this.d=new dn(a);Ec(this,this.d);J(this.d,["drag","end"],this.n,void 0,this);J(b,"click",this.l,!1,this);J(a,"click",Hc);ai.call(this,{element:b})}G(nn,ai);var on=0;nn.prototype.setMap=function(a){nn.F.setMap.call(this,a);null===a||a.I()}; +nn.prototype.f=function(a){if(null!==a.b){if(!this.k){var b=this.element,c=uc(b),b=ph(b),d;d=gh(c);var e=kh(c);d=new $g(d.x,d.y,e.width,e.height);var e=rh(c,"margin"),f=sh(c),c=b.width-e.left-e.right-f.left-f.right-d.width;d=b.height-e.top-e.bottom-f.top-f.bottom-d.height;b.width>b.height?(this.i=1,b=new $g(0,0,c,0)):(this.i=on,b=new $g(0,0,0,d));this.d.c=b||new $g(NaN,NaN,NaN,NaN);this.k=!0}a=a.b.w.resolution;a!==this.b&&(this.b=a,a=-1*(Zh(this.a.a().N())(a)-1),b=this.d,c=uc(this.element),1==this.i? +ch(c,b.c.left+b.c.width*a):ch(c,b.c.left,b.c.top+b.c.height*a))}};nn.prototype.l=function(a){var b=this.a,c=b.a().N();a=pn(this,qn(this,a.Wd,a.Xd));b.ka(Wf({resolution:a,duration:200,easing:Qf}));a=c.a(a);c.f(a)};function qn(a,b,c){var d=a.d.c,e=0;return e=1===a.i?(b-d.left)/d.width:(c-d.top)/d.height}function pn(a,b){b=-1*(Qb(b,0,1)-1);return Yh(a.a.a().N())(b)} +nn.prototype.n=function(a){var b=this.a,c=b.a().N();"drag"===a.type?(a=pn(this,qn(this,a.left,a.top)),a!==this.b&&(this.b=a,c.f(a))):(b.ka(Wf({resolution:this.b,duration:200,easing:Qf})),a=c.a(this.b),c.f(a))};function rn(a){a=t(a)?a:{};this.b=t(a.extent)?a.extent:null;var b=t(a.className)?a.className:"ol-zoom-extent",c=lc("SPAN",{role:"tooltip"},t(a.tipLabel)?a.tipLabel:"Fit to extent"),b=lc("DIV",{"class":b+" ol-unselectable"}),d=lc("BUTTON",{"class":"ol-has-tooltip"});d.appendChild(c);b.appendChild(d);J(d,["touchend","click"],this.d,!1,this);J(d,["mouseout",Mc],function(){this.blur()},!1);ai.call(this,{element:b,target:a.target})}G(rn,ai); +rn.prototype.d=function(a){a.M();a=this.a;var b=a.a().N(),c=null===this.b?b.l().p():this.b;b.Sd(c,a.g())};function sn(a){P.call(this);this.a=a;J(this.a,["change","input"],this.k,!1,this);J(this,Fd("value"),this.l,!1,this);J(this,Fd("checked"),this.i,!1,this)}G(sn,P);sn.prototype.b=function(){return this.s("checked")};sn.prototype.getChecked=sn.prototype.b;sn.prototype.d=function(){return this.s("value")};sn.prototype.getValue=sn.prototype.d;sn.prototype.g=function(a){this.t("value",a)};sn.prototype.setValue=sn.prototype.g;sn.prototype.f=function(a){this.t("checked",a)};sn.prototype.setChecked=sn.prototype.f; +sn.prototype.k=function(){var a=this.a;"checkbox"===a.type||"radio"===a.type?this.f(a.checked):this.g(a.value)};sn.prototype.i=function(){this.a.checked=this.b()};sn.prototype.l=function(){this.a.value=this.d()};function tn(){};function un(a){if("undefined"!=typeof DOMParser)return(new DOMParser).parseFromString(a,"application/xml");if("undefined"!=typeof ActiveXObject){var b=vn();b.loadXML(a);return b}throw Error("Your browser does not support loading xml documents");}function vn(){var a=new ActiveXObject("MSXML2.DOMDocument");if(a){a.resolveExternals=!1;a.validateOnParse=!1;try{a.setProperty("ProhibitDTD",!0),a.setProperty("MaxXMLSize",2048),a.setProperty("MaxElementDepth",256)}catch(b){}}return a};var wn;a:if(document.implementation&&document.implementation.createDocument)wn=document.implementation.createDocument("","",null);else{if("undefined"!=typeof ActiveXObject){var xn=vn();if(xn){wn=xn;break a}}throw Error("Your browser does not support creating new documents");}var yn=wn;function zn(a,b){return yn.createElementNS(a,b)}function An(a,b){null===a&&(a="");return yn.createNode(1,b,a)}var Bn=document.implementation&&document.implementation.createDocument?zn:An; +function Cn(a){return Dn(a,!1,[]).join("")}function Dn(a,b,c){if(4==a.nodeType||3==a.nodeType)b?c.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):c.push(a.nodeValue);else for(a=a.firstChild;null!==a;a=a.nextSibling)Dn(a,b,c);return c}function En(a){return a.localName}function Fn(a){var b=a.localName;return t(b)?b:a.baseName}var Gn=H?Fn:En;function Hn(a){return a instanceof Document}function In(a){return pa(a)&&9==a.nodeType}var Jn=H?In:Hn;function Kn(a){return a instanceof Node} +function Ln(a){return pa(a)&&t(a.nodeType)}var Mn=H?Ln:Kn;function Nn(a,b,c,d){a.setAttributeNS(b,c,d)}function On(a,b,c,d){null===b?a.setAttribute(c,d):(b=a.ownerDocument.createNode(2,c,b),b.nodeValue=d,a.setAttributeNode(b))}var Pn=document.implementation&&document.implementation.createDocument?Nn:On;function Qn(a){return(new DOMParser).parseFromString(a,"application/xml")}function Rn(a,b){return function(c,d){var e=a.call(b,c,d);t(e)&&Sa(d[d.length-1],e)}} +function Sn(a,b){return function(c,d){var e=a.call(b,c,d);t(e)&&d[d.length-1].push(e)}}function Tn(a){return function(b,c){var d=a.call(void 0,b,c);t(d)&&(c[c.length-1]=d)}}function W(a,b){return function(c,d){var e=a.call(void 0,c,d);t(e)&&(d[d.length-1][t(b)?b:c.localName]=e)}}function X(a){return function(b,c,d){a.call(void 0,b,c,d);d[d.length-1].node.appendChild(b)}} +function Un(a){var b,c;return function(d,e,f){if(!t(b)){b={};var g={};g[d.localName]=a;b[d.namespaceURI]=g;c=Vn(d.localName)}Wn(b,c,e,f)}}function Vn(a){return function(b,c,d){b=c[c.length-1].node;c=a;t(c)||(c=d);d=void 0;t(void 0)||(d=b.namespaceURI);return Bn(d,c)}}var Xn=Vn();function Yn(a,b){for(var c=b.length,d=Array(c),e=0;ea.o,f=[a.b[0][0],a.b[0][a.b[0].length-2]]);if(e)for(var d=b.map,e=0,g=f.length;e=Math.sqrt(Math.min(b,c))&&(h=b>c?g[1]:g[0]);Kq(a,h);c={};c[A(g)]=!0;b=1;for(m=f.length;bg&&++q.index}p= +{T:[c[0],b],feature:d,geometry:e,depth:f,index:g};Bl(h,Ce(p.T),p);this.b.push([p,1]);c={T:[b,c[1]],feature:d,geometry:e,depth:f,index:g+1};Bl(h,Ce(c.T),c);this.b.push([c,0])};function Lq(a){fi.call(this);this.e=t(a.condition)?a.condition:li;this.d=t(a.addCondition)?a.addCondition:ni;var b;if(t(a.layerFilter))b=a.layerFilter;else if(t(a.layer)){var c=a.layer;b=function(a){return a===c}}else if(t(a.layers)){var d=a.layers;b=function(a){return-1!=Ja(d,a)}}else b=pd;this.b=b;this.a=new se({style:a.style})}G(Lq,fi);Lq.prototype.f=function(){return this.a.a}; +Lq.prototype.qa=function(a){if(!this.e(a))return!0;var b=this.d(a),c=a.map,d=this.a.a;b?c.hd(a.pixel,function(a){-1==Ja(d.a,a)&&d.push(a)},void 0,this.b):(a=c.hd(a.pixel,function(a){return a},void 0,this.b),t(a)?1==d.Na()?d.Td(0)!==a&&d.Ae(0,a):(1!=d.Na()&&d.clear(),d.push(a)):0!==d.Na()&&d.clear());return!1};Lq.prototype.setMap=function(a){Lq.F.setMap.call(this,a);this.a.setMap(a)};function Mq(a){var b=t(a)?a:{};hk.call(this,b);this.d=null;J(this,Fd("gradient"),this.ua,!1,this);this.V(t(b.gradient)?b.gradient:Nq);a=t(b.radius)?b.radius:8;var c=t(b.blur)?b.blur:15,d=t(b.Sh)?b.Sh:250,b=oc("CANVAS"),e=b.getContext("2d"),f=a+c+1;b.width=b.height=2*f;e.shadowOffsetX=e.shadowOffsetY=d;e.shadowBlur=c;e.shadowColor="#000";e.beginPath();c=f-d;e.arc(c,c,a,0,2*Math.PI,!0);e.fill();a=new Uj({src:b.toDataURL()});this.g(new ne({image:a}));J(this,"render",this.Ia,!1,this)}G(Mq,hk); +var Nq=["#00f","#0ff","#0f0","#ff0","#f00"];Mq.prototype.l=function(){return this.s("gradient")};Mq.prototype.getGradient=Mq.prototype.l;Mq.prototype.ua=function(){var a=this.l(),b=oc("CANVAS"),c=b.getContext("2d");b.width=1;b.height=256;for(var b=c.createLinearGradient(0,0,1,256),d=1/a.length,e=0,f=a.length;ea.d&&!(c=a.a.ib,d=c.a.a.toString(),d in b&&b[d].contains(c.a));)a.pop()};function vr(a){Jj.call(this,{attributions:a.attributions,extent:a.extent,logo:a.logo,opaque:a.opaque,projection:a.projection,tileGrid:a.tileGrid});this.tileUrlFunction=t(a.tileUrlFunction)?a.tileUrlFunction:qr;this.crossOrigin=t(a.crossOrigin)?a.crossOrigin:null;this.b=new tr;this.tileLoadFunction=t(a.tileLoadFunction)?a.tileLoadFunction:wr;this.Hc=t(a.Hc)?a.Hc:Cf}G(vr,Jj);function wr(a,b){a.b().src=b}l=vr.prototype;l.kd=function(){return this.b.wa()>this.b.d};l.oe=function(a){ur(this.b,a)}; +l.nb=function(a,b,c,d,e){var f=this.La(a,b,c);if(Dm(this.b,f))return Gm(this.b,f);a=new $a(a,b,c);d=this.tileUrlFunction(a,d,e);d=new this.Hc(a,t(d)?0:4,t(d)?d:"",this.crossOrigin,this.tileLoadFunction);Hm(this.b,f,d);return d};l.$b=function(a){this.b.clear();this.tileUrlFunction=a;this.u()};l.Ie=function(a,b,c){a=this.La(a,b,c);Dm(this.b,a)&&Gm(this.b,a)};function xr(a){var b=Array(a.maxZoom+1),c,d=2*vj/256;for(c=0;c<=a.maxZoom;++c)b[c]=d/Math.pow(2,c);Cj.call(this,{minZoom:a.minZoom,origin:[-vj,vj],resolutions:b,tileSize:256})}G(xr,Cj); +xr.prototype.c=function(a){a=t(a)?a:{};var b=this.minZoom,c=this.maxZoom,d=t(a.$h)?a.$h:!0,e=new $a(0,0,0),f=null;if(t(a.extent)){var f=Array(c+1),g;for(g=0;g<=c;++g)f[g]=gr||p<=r)return null;a=a.y;return a<-p||-1=this.minZoom;--a)if(d.a=d.d>>=1,d.b=d.c>>=1,b.call(c,a,d))return!0;return!1};function yr(a){vr.call(this,{crossOrigin:"anonymous",opaque:!0,projection:xf("EPSG:3857"),state:0,tileLoadFunction:a.tileLoadFunction});this.a=t(a.culture)?a.culture:"en-us";var b=new mg("//dev.virtualearth.net/REST/v1/Imagery/Metadata/"+a.imagerySet),b=new ir(b),c={include:"ImageryProviders",key:a.key};a=B(this.e,this);var d=c||null,c="_"+(jr++).toString(36)+wa().toString(36);s._callbacks_||(s._callbacks_={});var e=b.c.J();if(d)for(var f in d)d.hasOwnProperty&&!d.hasOwnProperty(f)||zg(e,f,d[f]); +a&&(s._callbacks_[c]=mr(c,a),zg(e,b.a,"_callbacks_."+c));f=br(e.toString(),{timeout:b.gb,Kd:!0});mq(f,null,kr(c),void 0)}G(yr,vr);var zr=new fb({html:'\x3ca class\x3d"ol-attribution-bing-tos" target\x3d"_blank" href\x3d"http://www.microsoft.com/maps/product/terms.html"\x3eTerms of Use\x3c/a\x3e'}); +yr.prototype.e=function(a){if(200!=a.statusCode||"OK"!=a.statusDescription||"ValidCredentials"!=a.authenticationResultCode||1!=a.resourceSets.length||1!=a.resourceSets[0].resources.length)Lf(this,2);else{var b=a.brandLogoUri,c=a.resourceSets[0].resources[0],d=new xr({minZoom:c.zoomMin,maxZoom:c.zoomMax,tileSize:c.imageWidth});this.tileGrid=d;var e=this.a;this.tileUrlFunction=rr(d.c(),pr(La(c.imageUrlSubdomains,function(a){var b=c.imageUrl.replace("{subdomain}",a).replace("{culture}",e);return function(a){return null=== +a?void 0:b.replace("{quadkey}",cb(a))}})));if(c.imageryProviders){var f=ff(xf("EPSG:4326"),this.l);a=La(c.imageryProviders,function(a){var b=a.attribution,c={};Ka(a.coverageAreas,function(a){var b=a.zoomMin,e=a.zoomMax;a=a.bbox;a=Ze([a[1],a[0],a[3],a[2]],f);var g,h;for(g=b;g<=e;++g)h=g.toString(),b=Fj(d,a,g),h in c?c[h].push(b):c[h]=[b]});return new fb({html:b,tileRanges:c})});a.push(zr);this.d=a}this.q=b;Lf(this,1)}};function Ar(a,b,c){if(oa(a))c&&(a=B(a,c));else if(a&&"function"==typeof a.handleEvent)a=B(a.handleEvent,a);else throw Error("Invalid listener argument");return 2147483647h*g?f*e/(h*n):g*e/(m*n);c=Pe(c);d={OPERATION:this.B?"GETDYNAMICMAPOVERLAYIMAGE":"GETMAPIMAGE",VERSION:"2.0.0",LOCALE:"en",CLIENTAGENT:"ol.source.MapGuide source",CLIP:"1",SETDISPLAYDPI:this.a,SETDISPLAYWIDTH:Math.round(d[0]),SETDISPLAYHEIGHT:Math.round(d[1]),SETVIEWSCALE:e,SETVIEWCENTERX:c[0],SETVIEWCENTERY:c[1]};dc(d,b);return jg(lg([a],d))};function ls(a){var b=a.projection||xf("EPSG:3857"),c=new xr({maxZoom:t(a.maxZoom)?a.maxZoom:18});vr.call(this,{attributions:a.attributions,crossOrigin:a.crossOrigin,extent:a.extent,logo:a.logo,projection:b,tileGrid:c,tileLoadFunction:a.tileLoadFunction,tileUrlFunction:qr});this.e=c.c({extent:a.extent});t(a.tileUrlFunction)?this.$b(a.tileUrlFunction):t(a.urls)?this.$b(or(a.urls)):t(a.url)&&this.a(a.url)}G(ls,vr);ls.prototype.$b=function(a){ls.F.$b.call(this,rr(this.e,a))};ls.prototype.a=function(a){this.$b(or(sr(a)))};function ms(a){a=t(a)?a:{};ls.call(this,{attributions:t(a.attributions)?a.attributions:ns,crossOrigin:t(a.crossOrigin)?a.crossOrigin:"anonymous",opaque:!0,maxZoom:a.maxZoom,tileLoadFunction:a.tileLoadFunction,url:t(a.url)?a.url:"//{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png"})}G(ms,ls); +var os=new fb({html:'Data \x26copy; \x3ca href\x3d"http://www.openstreetmap.org/"\x3eOpenStreetMap\x3c/a\x3e contributors, \x3ca href\x3d"http://www.openstreetmap.org/copyright"\x3eODbL\x3c/a\x3e'}),ps=new fb({html:'Tiles \x26copy; \x3ca href\x3d"http://www.openstreetmap.org/"\x3eOpenStreetMap\x3c/a\x3e contributors, \x3ca href\x3d"http://creativecommons.org/licenses/by-sa/2.0/"\x3eCC BY-SA\x3c/a\x3e'}),ns=[ps,os];function qs(a){a=t(a)?a:{};var b=rs[a.layer];ls.call(this,{attributions:b.attributions,crossOrigin:"anonymous",logo:"//developer.mapquest.com/content/osm/mq_logo.png",maxZoom:b.maxZoom,opaque:!0,tileLoadFunction:a.tileLoadFunction,url:"//otile{1-4}.mqcdn.com/tiles/1.0.0/"+a.layer+"/{z}/{x}/{y}.jpg"})}G(qs,ls); +var ss=new fb({html:'Tiles Courtesy of \x3ca href\x3d"http://www.mapquest.com/" target\x3d"_blank"\x3eMapQuest\x3c/a\x3e'}),rs={osm:{maxZoom:28,attributions:[ss,os]},sat:{maxZoom:18,attributions:[ss,new fb({html:"Portions Courtesy NASA/JPL-Caltech and U.S. Depart. of Agriculture, Farm Service Agency"})]},hyb:{maxZoom:18,attributions:[ss,os]}};function ts(){}G(ts,bo);function us(a,b){var c=a.getAttribute("k"),d=a.getAttribute("v");b[b.length-1].ac[c]=d} +var vs=[null],ws=Y(vs,{nd:function(a,b){b[b.length-1].tb.push(a.getAttribute("ref"))},tag:us},void 0),ys=Y(vs,{node:function(a,b){var c=b[b.length-1],d=a.getAttribute("id"),e=[parseFloat(a.getAttribute("lon")),parseFloat(a.getAttribute("lat"))];c.je[d]=e;var f=$n({ac:{}},xs,a,b);Zb(f.ac)||(e=new Yi(e),e=new R(e),e.b(d),e.Y(f.ac),c.features.push(e))},way:function(a,b){for(var c=a.getAttribute("id"),d=$n({tb:[],ac:{}},ws,a,b),e=b[b.length-1],f=[],g=0,h=d.tb.length;gthis.a.d};Fs.prototype.oe=function(a){ur(this.a,a)};Fs.prototype.nb=function(a,b,c){var d=this.La(a,b,c);if(Dm(this.a,d))return Gm(this.a,d);a=new Es(new $a(a,b,c),this.tileGrid);Hm(this.a,d,a);return a};var Gs=[];C("grid",function(a){Gs.push(a)});function Hs(a){vr.call(this,{crossOrigin:a.crossOrigin,projection:xf("EPSG:3857"),state:0,tileLoadFunction:a.tileLoadFunction});this.a=br(a.url,{Kd:!0});mq(this.a,this.e,null,this)}G(Hs,vr); +Hs.prototype.e=function(){var a=Gs.pop(),b=xf("EPSG:4326"),c;if(t(a.bounds)){var d=ff(b,this.l);this.O=c=Ze(a.bounds,d)}var e=a.minzoom||0,d=a.maxzoom||22,f=new xr({maxZoom:d,minZoom:e});this.tileGrid=f;this.tileUrlFunction=rr(f.c({extent:c}),or(a.tiles));if(t(a.attribution)){b=t(c)?c:b.p();c={};for(var g;e<=d;++e)g=e.toString(),c[g]=[Fj(f,b,e)];this.d=[new fb({html:a.attribution,tileRanges:c})]}Lf(this,1)};function Is(a){a=t(a)?a:{};var b=t(a.params)?a.params:{};vr.call(this,{attributions:a.attributions,crossOrigin:a.crossOrigin,extent:a.extent,logo:a.logo,opaque:!I(b,"TRANSPARENT",!0),projection:a.projection,tileGrid:a.tileGrid,tileLoadFunction:a.tileLoadFunction,tileUrlFunction:B(this.Vh,this)});var c=a.urls;!t(c)&&t(a.url)&&(c=sr(a.url));this.B=c;this.g=t(a.gutter)?a.gutter:0;this.a=b;this.h=NaN;this.e=!0;this.i=a.serverType;this.o=t(a.hidpi)?a.hidpi:!0;this.n="";Js(this);this.r=De();Ks(this)} +G(Is,vr);l=Is.prototype; +l.Xg=function(a,b,c,d){var e=this.h;if(!isNaN(this.h)){var f=this.tileGrid;null===f&&(f=Kj(this,c));b=Hj(f,a[0],a[1],b,!1,void 0);if(!(f.Ya().length<=b.a)){var g=f.a[b.a],h=Ej(f,b,this.r),f=f.na(b.a),m=this.g;0!==m&&(f+=2*m,h=Ge(h,g*m,h));1!=e&&(f=f*e+0.5|0);m={SERVICE:"WMS",VERSION:"1.3.0",REQUEST:"GetFeatureInfo",FORMAT:"image/png",TRANSPARENT:!0,QUERY_LAYERS:I(this.a,"LAYERS")};dc(m,this.a,d);d=Math.floor((h[3]-a[1])/(g/e));m[this.e?"I":"X"]=Math.floor((a[0]-h[0])/(g/e));m[this.e?"J":"Y"]=d;return Ls(this, +b,f,h,e,c,m)}}};l.qc=k("g");l.La=function(a,b,c){return this.n+Is.F.La.call(this,a,b,c)};l.Yg=k("a"); +function Ls(a,b,c,d,e,f,g){var h=a.B;if(t(h)&&0!=h.length){g.WIDTH=c;g.HEIGHT=c;g[a.e?"CRS":"SRS"]=f.a;"STYLES"in a.a||(g.STYLES=new String(""));if(1!=e)switch(a.i){case "geoserver":g.FORMAT_OPTIONS="dpi:"+(90*e+0.5|0);break;case "mapserver":g.MAP_RESOLUTION=90*e;break;case "carmentaserver":case "qgis":g.DPI=90*e}c=f.e;a.e&&"ne"==c.substr(0,2)&&(c=d[0],d[0]=d[1],d[1]=c,c=d[2],d[2]=d[3],d[3]=c);g.BBOX=d.join(",");return jg(lg([1==h.length?h[0]:h[Rb((b.x<p||n<=p)return null;a=a.y;return a<-n||-1f||d>f;)e.push([Math.ceil(c/f),Math.ceil(d/f)]),f+=f;break;case "truncated":for(;c>f||d>f;)e.push([Math.ceil(c/f),Math.ceil(d/f)]),c>>=1,d>>=1}e.push([1,1]);e.reverse();for(var f=[1],g=[0],d=1,c=e.length;df&&(f=0);var f=c.styles[f].identifier,g={};Ka(c.dimensions,function(a){var b=a.identifier,c=a["default"];t(c)||(c=a.values[0]);g[b]=c});var h=a.contents.tileMatrixSets[d],m=Os(h),h=xf(h.supportedCRS),n=a.operationsMetadata.GetTile.dcp.http.get,p,r;switch(Yb(n[0].constraints.GetEncoding.allowedValues)[0]){case "REST":case "RESTful":r= +"REST";p=c.resourceUrls.tile[e];break;case "KVP":r=Ps,p=[],Ka(n,function(a){a.constraints.GetEncoding.allowedValues.hasOwnProperty(Ps)&&p.push(a.url)})}return{urls:p,layer:b,matrixSet:d,format:e,projection:h,requestEncoding:r,tileGrid:m,style:f,dimensions:g}});Qs.prototype.getDimensions=Qs.prototype.g;Qs.prototype.updateDimensions=Qs.prototype.h;C("ol.source.XYZ",ls);ls.prototype.setUrl=ls.prototype.a;C("ol.source.Zoomify",Ts);C("ol.style.Circle",me);me.prototype.getAnchor=me.prototype.Pb; +me.prototype.getFill=me.prototype.dh;me.prototype.getImage=me.prototype.Vb;me.prototype.getRadius=me.prototype.eh;me.prototype.getSize=me.prototype.vb;me.prototype.getStroke=me.prototype.fh;C("ol.style.Fill",je);je.prototype.getColor=je.prototype.c;C("ol.style.Icon",Uj);Uj.prototype.getAnchor=Uj.prototype.Pb;Uj.prototype.getImage=Uj.prototype.Vb;Uj.prototype.getSize=Uj.prototype.vb;Uj.prototype.getSrc=Uj.prototype.gh;C("ol.style.Image",ke);ke.prototype.getRotation=ke.prototype.S; +ke.prototype.getScale=ke.prototype.o;C("ol.style.Stroke",le);le.prototype.getColor=le.prototype.hh;le.prototype.getLineCap=le.prototype.sf;le.prototype.getLineDash=le.prototype.ih;le.prototype.getLineJoin=le.prototype.tf;le.prototype.getMiterLimit=le.prototype.wf;le.prototype.getWidth=le.prototype.jh;C("ol.style.Style",ne);ne.prototype.getFill=ne.prototype.kh;ne.prototype.getImage=ne.prototype.lh;ne.prototype.getStroke=ne.prototype.mh;ne.prototype.getText=ne.prototype.nh;ne.prototype.getZIndex=ne.prototype.Ff; +C("ol.style.Text",Vs);Vs.prototype.getFill=Vs.prototype.oh;Vs.prototype.getFont=Vs.prototype.jf;Vs.prototype.getRotation=Vs.prototype.ph;Vs.prototype.getScale=Vs.prototype.qh;Vs.prototype.getStroke=Vs.prototype.rh;Vs.prototype.getText=Vs.prototype.sh;Vs.prototype.getTextAlign=Vs.prototype.Af;Vs.prototype.getTextBaseline=Vs.prototype.Bf;C("ol.tilegrid.TileGrid",Cj);Cj.prototype.getMinZoom=Cj.prototype.vf;Cj.prototype.getOrigin=Cj.prototype.Wb;Cj.prototype.getResolutions=Cj.prototype.Ya; +Cj.prototype.getTileSize=Cj.prototype.na;C("ol.tilegrid.WMTS",Ns);Ns.prototype.getMatrixIds=Ns.prototype.g;C("ol.tilegrid.XYZ",xr);C("ol.tilegrid.Zoomify",Ss);C("ol.webgl.Context",Im);Im.prototype.getGL=Im.prototype.th;Im.prototype.useProgram=Im.prototype.ld;})(); diff --git a/float-no-zero/closure-library/closure/goog/a11y/aria/announcer.js b/float-no-zero/closure-library/closure/goog/a11y/aria/announcer.js new file mode 100644 index 0000000000..0ffaf33f33 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/a11y/aria/announcer.js @@ -0,0 +1,108 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * @fileoverview Announcer that allows messages to be spoken by assistive + * technologies. + */ + +goog.provide('goog.a11y.aria.Announcer'); + +goog.require('goog.Disposable'); +goog.require('goog.a11y.aria'); +goog.require('goog.a11y.aria.LivePriority'); +goog.require('goog.a11y.aria.State'); +goog.require('goog.dom'); +goog.require('goog.object'); + + + +/** + * Class that allows messages to be spoken by assistive technologies that the + * user may have active. + * + * @param {goog.dom.DomHelper=} opt_domHelper DOM helper. + * @constructor + * @extends {goog.Disposable} + */ +goog.a11y.aria.Announcer = function(opt_domHelper) { + goog.base(this); + + /** + * @type {goog.dom.DomHelper} + * @private + */ + this.domHelper_ = opt_domHelper || goog.dom.getDomHelper(); + + /** + * Map of priority to live region elements to use for communicating updates. + * Elements are created on demand. + * @type {Object.} + * @private + */ + this.liveRegions_ = {}; +}; +goog.inherits(goog.a11y.aria.Announcer, goog.Disposable); + + +/** @override */ +goog.a11y.aria.Announcer.prototype.disposeInternal = function() { + goog.object.forEach( + this.liveRegions_, this.domHelper_.removeNode, this.domHelper_); + this.liveRegions_ = null; + this.domHelper_ = null; + goog.base(this, 'disposeInternal'); +}; + + +/** + * Announce a message to be read by any assistive technologies the user may + * have active. + * @param {string} message The message to announce to screen readers. + * @param {goog.a11y.aria.LivePriority=} opt_priority The priority of the + * message. Defaults to POLITE. + */ +goog.a11y.aria.Announcer.prototype.say = function(message, opt_priority) { + goog.dom.setTextContent(this.getLiveRegion_( + opt_priority || goog.a11y.aria.LivePriority.POLITE), message); +}; + + +/** + * Returns an aria-live region that can be used to communicate announcements. + * @param {!goog.a11y.aria.LivePriority} priority The required priority. + * @return {Element} A live region of the requested priority. + * @private + */ +goog.a11y.aria.Announcer.prototype.getLiveRegion_ = function(priority) { + if (this.liveRegions_[priority]) { + return this.liveRegions_[priority]; + } + var liveRegion; + liveRegion = this.domHelper_.createElement('div'); + // Note that IE has a habit of declaring things that aren't display:none as + // invisible to third-party tools like JAWs, so we can't just use height:0. + liveRegion.style.position = 'absolute'; + liveRegion.style.top = '-1000px'; + liveRegion.style.height = '1px'; + liveRegion.style.overflow = 'hidden'; + goog.a11y.aria.setState(liveRegion, goog.a11y.aria.State.LIVE, + priority); + goog.a11y.aria.setState(liveRegion, goog.a11y.aria.State.ATOMIC, + 'true'); + this.domHelper_.getDocument().body.appendChild(liveRegion); + this.liveRegions_[priority] = liveRegion; + return liveRegion; +}; diff --git a/float-no-zero/closure-library/closure/goog/a11y/aria/aria.js b/float-no-zero/closure-library/closure/goog/a11y/aria/aria.js new file mode 100644 index 0000000000..abc261f6bf --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/a11y/aria/aria.js @@ -0,0 +1,362 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * @fileoverview Utilities for adding, removing and setting ARIA roles and + * states as defined by W3C ARIA standard: http://www.w3.org/TR/wai-aria/ + * All modern browsers have some form of ARIA support, so no browser checks are + * performed when adding ARIA to components. + * + */ + +goog.provide('goog.a11y.aria'); + +goog.require('goog.a11y.aria.Role'); +goog.require('goog.a11y.aria.State'); +goog.require('goog.a11y.aria.datatables'); +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.object'); +goog.require('goog.string'); + + +/** + * ARIA states/properties prefix. + * @private + */ +goog.a11y.aria.ARIA_PREFIX_ = 'aria-'; + + +/** + * ARIA role attribute. + * @private + */ +goog.a11y.aria.ROLE_ATTRIBUTE_ = 'role'; + + +/** + * A list of tag names for which we don't need to set ARIA role and states + * because they have well supported semantics for screen readers or because + * they don't contain content to be made accessible. + * @private + */ +goog.a11y.aria.TAGS_WITH_ASSUMED_ROLES_ = [ + goog.dom.TagName.A, + goog.dom.TagName.AREA, + goog.dom.TagName.BUTTON, + goog.dom.TagName.HEAD, + goog.dom.TagName.INPUT, + goog.dom.TagName.LINK, + goog.dom.TagName.MENU, + goog.dom.TagName.META, + goog.dom.TagName.OPTGROUP, + goog.dom.TagName.OPTION, + goog.dom.TagName.PROGRESS, + goog.dom.TagName.STYLE, + goog.dom.TagName.SELECT, + goog.dom.TagName.SOURCE, + goog.dom.TagName.TEXTAREA, + goog.dom.TagName.TITLE, + goog.dom.TagName.TRACK +]; + + +/** + * Sets the role of an element. If the roleName is + * empty string or null, the role for the element is removed. + * We encourage clients to call the goog.a11y.aria.removeRole + * method instead of setting null and empty string values. + * Special handling for this case is added to ensure + * backword compatibility with existing code. + * + * @param {!Element} element DOM node to set role of. + * @param {!goog.a11y.aria.Role|string} roleName role name(s). + */ +goog.a11y.aria.setRole = function(element, roleName) { + if (!roleName) { + // Setting the ARIA role to empty string is not allowed + // by the ARIA standard. + goog.a11y.aria.removeRole(element); + } else { + if (goog.asserts.ENABLE_ASSERTS) { + goog.asserts.assert(goog.object.containsValue( + goog.a11y.aria.Role, roleName), 'No such ARIA role ' + roleName); + } + element.setAttribute(goog.a11y.aria.ROLE_ATTRIBUTE_, roleName); + } +}; + + +/** + * Gets role of an element. + * @param {!Element} element DOM element to get role of. + * @return {?goog.a11y.aria.Role} ARIA Role name. + */ +goog.a11y.aria.getRole = function(element) { + var role = element.getAttribute(goog.a11y.aria.ROLE_ATTRIBUTE_); + return /** @type {goog.a11y.aria.Role} */ (role) || null; +}; + + +/** + * Removes role of an element. + * @param {!Element} element DOM element to remove the role from. + */ +goog.a11y.aria.removeRole = function(element) { + element.removeAttribute(goog.a11y.aria.ROLE_ATTRIBUTE_); +}; + + +/** + * Sets the state or property of an element. + * @param {!Element} element DOM node where we set state. + * @param {!(goog.a11y.aria.State|string)} stateName State attribute being set. + * Automatically adds prefix 'aria-' to the state name if the attribute is + * not an extra attribute. + * @param {string|boolean|number|!goog.array.ArrayLike.} value Value + * for the state attribute. + */ +goog.a11y.aria.setState = function(element, stateName, value) { + if (goog.isArrayLike(value)) { + var array = /** @type {!goog.array.ArrayLike.} */ (value); + value = array.join(' '); + } + var attrStateName = goog.a11y.aria.getAriaAttributeName_(stateName); + if (value === '' || value == undefined) { + var defaultValueMap = goog.a11y.aria.datatables.getDefaultValuesMap(); + // Work around for browsers that don't properly support ARIA. + // According to the ARIA W3C standard, user agents should allow + // setting empty value which results in setting the default value + // for the ARIA state if such exists. The exact text from the ARIA W3C + // standard (http://www.w3.org/TR/wai-aria/states_and_properties): + // "When a value is indicated as the default, the user agent + // MUST follow the behavior prescribed by this value when the state or + // property is empty or undefined." + // The defaultValueMap contains the default values for the ARIA states + // and has as a key the goog.a11y.aria.State constant for the state. + if (stateName in defaultValueMap) { + element.setAttribute(attrStateName, defaultValueMap[stateName]); + } else { + element.removeAttribute(attrStateName); + } + } else { + element.setAttribute(attrStateName, value); + } +}; + + +/** + * Remove the state or property for the element. + * @param {!Element} element DOM node where we set state. + * @param {!goog.a11y.aria.State} stateName State name. + */ +goog.a11y.aria.removeState = function(element, stateName) { + element.removeAttribute(goog.a11y.aria.getAriaAttributeName_(stateName)); +}; + + +/** + * Gets value of specified state or property. + * @param {!Element} element DOM node to get state from. + * @param {!goog.a11y.aria.State|string} stateName State name. + * @return {string} Value of the state attribute. + */ +goog.a11y.aria.getState = function(element, stateName) { + // TODO(user): return properly typed value result -- + // boolean, number, string, null. We should be able to chain + // getState(...) and setState(...) methods. + + var attr = + /** @type {string|number|boolean} */ (element.getAttribute( + goog.a11y.aria.getAriaAttributeName_(stateName))); + var isNullOrUndefined = attr == null || attr == undefined; + return isNullOrUndefined ? '' : String(attr); +}; + + +/** + * Returns the activedescendant element for the input element by + * using the activedescendant ARIA property of the given element. + * @param {!Element} element DOM node to get activedescendant + * element for. + * @return {?Element} DOM node of the activedescendant, if found. + */ +goog.a11y.aria.getActiveDescendant = function(element) { + var id = goog.a11y.aria.getState( + element, goog.a11y.aria.State.ACTIVEDESCENDANT); + return goog.dom.getOwnerDocument(element).getElementById(id); +}; + + +/** + * Sets the activedescendant ARIA property value for an element. + * If the activeElement is not null, it should have an id set. + * @param {!Element} element DOM node to set activedescendant ARIA property to. + * @param {?Element} activeElement DOM node being set as activedescendant. + */ +goog.a11y.aria.setActiveDescendant = function(element, activeElement) { + var id = ''; + if (activeElement) { + id = activeElement.id; + goog.asserts.assert(id, 'The active element should have an id.'); + } + + goog.a11y.aria.setState(element, goog.a11y.aria.State.ACTIVEDESCENDANT, id); +}; + + +/** + * Gets the label of the given element. + * @param {!Element} element DOM node to get label from. + * @return {string} label The label. + */ +goog.a11y.aria.getLabel = function(element) { + return goog.a11y.aria.getState(element, goog.a11y.aria.State.LABEL); +}; + + +/** + * Sets the label of the given element. + * @param {!Element} element DOM node to set label to. + * @param {string} label The label to set. + */ +goog.a11y.aria.setLabel = function(element, label) { + goog.a11y.aria.setState(element, goog.a11y.aria.State.LABEL, label); +}; + + +/** + * Asserts that the element has a role set if it's not an HTML element whose + * semantics is well supported by most screen readers. + * Only to be used internally by the ARIA library in goog.a11y.aria.*. + * @param {!Element} element The element to assert an ARIA role set. + * @param {!goog.array.ArrayLike.} allowedRoles The child roles of + * the roles. + */ +goog.a11y.aria.assertRoleIsSetInternalUtil = function(element, allowedRoles) { + if (goog.array.contains(goog.a11y.aria.TAGS_WITH_ASSUMED_ROLES_, + element.tagName)) { + return; + } + var elementRole = /** @type {string}*/ (goog.a11y.aria.getRole(element)); + goog.asserts.assert(elementRole != null, + 'The element ARIA role cannot be null.'); + + goog.asserts.assert(goog.array.contains(allowedRoles, elementRole), + 'Non existing or incorrect role set for element.' + + 'The role set is "' + elementRole + + '". The role should be any of "' + allowedRoles + + '". Check the ARIA specification for more details ' + + 'http://www.w3.org/TR/wai-aria/roles.'); +}; + + +/** + * Gets the boolean value of an ARIA state/property. + * Only to be used internally by the ARIA library in goog.a11y.aria.*. + * @param {!Element} element The element to get the ARIA state for. + * @param {!goog.a11y.aria.State|string} stateName the ARIA state name. + * @return {?boolean} Boolean value for the ARIA state value or null if + * the state value is not 'true' or 'false'. + */ +goog.a11y.aria.getBooleanStateInternalUtil = function(element, stateName) { + var stringValue = goog.a11y.aria.getState(element, stateName); + if (stringValue == 'true') { + return true; + } + if (stringValue == 'false') { + return false; + } + return null; +}; + + +/** + * Gets the number value of an ARIA state/property. + * Only to be used internally by the ARIA library in goog.a11y.aria.*. + * @param {!Element} element The element to get the ARIA state for. + * @param {!goog.a11y.aria.State|string} stateName the ARIA state name. + * @return {?number} Number value for the ARIA state value or null if + * the state value is not a number. + */ +goog.a11y.aria.getNumberStateInternalUtil = function(element, stateName) { + var stringValue = goog.a11y.aria.getState(element, stateName); + if (goog.string.isNumeric(stringValue)) { + return goog.string.toNumber(stringValue); + } + return null; +}; + + +/** + * Gets array of strings value of the specified state or + * property for the element. + * Only to be used internally by the ARIA library in goog.a11y.aria.*. + * @param {!Element} element DOM node to get state from. + * @param {!goog.a11y.aria.State} stateName State name. + * @return {!goog.array.ArrayLike.} string Array + * value of the state attribute. + */ +goog.a11y.aria.getStringArrayStateInternalUtil = function(element, stateName) { + var attrValue = element.getAttribute( + goog.a11y.aria.getAriaAttributeName_(stateName)); + return goog.a11y.aria.splitStringOnWhitespace_(attrValue); +}; + + +/** + * Gets the string value of an ARIA state/property. + * Only to be used internally by the ARIA library in goog.a11y.aria.*. + * @param {!Element} element The element to get the ARIA state for. + * @param {!goog.a11y.aria.State|string} stateName the ARIA state name. + * @return {?string} String value for the ARIA state value or null if + * the state value is empty string. + */ +goog.a11y.aria.getStringStateInternalUtil = function(element, stateName) { + var stringValue = goog.a11y.aria.getState(element, stateName); + return stringValue || null; +}; + + +/** + * Splits the input stringValue on whitespace. + * @param {string} stringValue The value of the string to split. + * @return {!goog.array.ArrayLike.} string Array + * value as result of the split. + * @private + */ +goog.a11y.aria.splitStringOnWhitespace_ = function(stringValue) { + return stringValue ? stringValue.split(/\s+/) : []; +}; + + +/** + * Adds the 'aria-' prefix to ariaName. + * @param {string} ariaName ARIA state/property name. + * @private + * @return {string} The ARIA attribute name with added 'aria-' prefix. + * @throws {Error} If no such attribute exists. + */ +goog.a11y.aria.getAriaAttributeName_ = function(ariaName) { + if (goog.asserts.ENABLE_ASSERTS) { + goog.asserts.assert(ariaName, 'ARIA attribute cannot be empty.'); + goog.asserts.assert(goog.object.containsValue( + goog.a11y.aria.State, ariaName), + 'No such ARIA attribute ' + ariaName); + } + return goog.a11y.aria.ARIA_PREFIX_ + ariaName; +}; diff --git a/float-no-zero/closure-library/closure/goog/a11y/aria/attributes.js b/float-no-zero/closure-library/closure/goog/a11y/aria/attributes.js new file mode 100644 index 0000000000..f4e0a3d074 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/a11y/aria/attributes.js @@ -0,0 +1,389 @@ +// Copyright 2013 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * @fileoverview The file contains generated enumerations for ARIA states + * and properties as defined by W3C ARIA standard: + * http://www.w3.org/TR/wai-aria/. + * + * This is auto-generated code. Do not manually edit! For more details + * about how to edit it via the generator check go/closure-ariagen. + */ + +goog.provide('goog.a11y.aria.AutoCompleteValues'); +goog.provide('goog.a11y.aria.CheckedValues'); +goog.provide('goog.a11y.aria.DropEffectValues'); +goog.provide('goog.a11y.aria.ExpandedValues'); +goog.provide('goog.a11y.aria.GrabbedValues'); +goog.provide('goog.a11y.aria.InvalidValues'); +goog.provide('goog.a11y.aria.LivePriority'); +goog.provide('goog.a11y.aria.OrientationValues'); +goog.provide('goog.a11y.aria.PressedValues'); +goog.provide('goog.a11y.aria.RelevantValues'); +goog.provide('goog.a11y.aria.SelectedValues'); +goog.provide('goog.a11y.aria.SortValues'); +goog.provide('goog.a11y.aria.State'); + + +/** + * ARIA states and properties. + * @enum {string} + */ +goog.a11y.aria.State = { + // ARIA property for setting the currently active descendant of an element, + // for example the selected item in a list box. Value: ID of an element. + ACTIVEDESCENDANT: 'activedescendant', + + // ARIA property that, if true, indicates that all of a changed region should + // be presented, instead of only parts. Value: one of {true, false}. + ATOMIC: 'atomic', + + // ARIA property to specify that input completion is provided. Value: + // one of {'inline', 'list', 'both', 'none'}. + AUTOCOMPLETE: 'autocomplete', + + // ARIA state to indicate that an element and its subtree are being updated. + // Value: one of {true, false}. + BUSY: 'busy', + + // ARIA state for a checked item. Value: one of {'true', 'false', 'mixed', + // undefined}. + CHECKED: 'checked', + + // ARIA property that identifies the element or elements whose contents or + // presence are controlled by this element. + // Value: space-separated IDs of other elements. + CONTROLS: 'controls', + + // ARIA property that identifies the element or elements that describe + // this element. Value: space-separated IDs of other elements. + DESCRIBEDBY: 'describedby', + + // ARIA state for a disabled item. Value: one of {true, false}. + DISABLED: 'disabled', + + // ARIA property that indicates what functions can be performed when a + // dragged object is released on the drop target. Value: one of + // {'copy', 'move', 'link', 'execute', 'popup', 'none'}. + DROPEFFECT: 'dropeffect', + + // ARIA state for setting whether the element like a tree node is expanded. + // Value: one of {true, false, undefined}. + EXPANDED: 'expanded', + + // ARIA property that identifies the next element (or elements) in the + // recommended reading order of content. Value: space-separated ids of + // elements to flow to. + FLOWTO: 'flowto', + + // ARIA state that indicates an element's "grabbed" state in drag-and-drop. + // Value: one of {true, false, undefined}. + GRABBED: 'grabbed', + + // ARIA property indicating whether the element has a popup. + // Value: one of {true, false}. + HASPOPUP: 'haspopup', + + // ARIA state indicating that the element is not visible or perceivable + // to any user. Value: one of {true, false}. + HIDDEN: 'hidden', + + // ARIA state indicating that the entered value does not conform. Value: + // one of {false, true, 'grammar', 'spelling'} + INVALID: 'invalid', + + // ARIA property that provides a label to override any other text, value, or + // contents used to describe this element. Value: string. + LABEL: 'label', + + // ARIA property for setting the element which labels another element. + // Value: space-separated IDs of elements. + LABELLEDBY: 'labelledby', + + // ARIA property for setting the level of an element in the hierarchy. + // Value: integer. + LEVEL: 'level', + + // ARIA property indicating that an element will be updated, and + // describes the types of updates the user agents, assistive technologies, + // and user can expect from the live region. Value: one of {'off', 'polite', + // 'assertive'}. + LIVE: 'live', + + // ARIA property indicating whether a text box can accept multiline input. + // Value: one of {true, false}. + MULTILINE: 'multiline', + + // ARIA property indicating if the user may select more than one item. + // Value: one of {true, false}. + MULTISELECTABLE: 'multiselectable', + + // ARIA property indicating if the element is horizontal or vertical. + // Value: one of {'vertical', 'horizontal'}. + ORIENTATION: 'orientation', + + // ARIA property creating a visual, functional, or contextual parent/child + // relationship when the DOM hierarchy can't be used to represent it. + // Value: Space-separated IDs of elements. + OWNS: 'owns', + + // ARIA property that defines an element's number of position in a list. + // Value: integer. + POSINSET: 'posinset', + + // ARIA state for a pressed item. + // Value: one of {true, false, undefined, 'mixed'}. + PRESSED: 'pressed', + + // ARIA property indicating that an element is not editable. + // Value: one of {true, false}. + READONLY: 'readonly', + + // ARIA property indicating that change notifications within this subtree + // of a live region should be announced. Value: one of {'additions', + // 'removals', 'text', 'all', 'additions text'}. + RELEVANT: 'relevant', + + // ARIA property indicating that user input is required on this element + // before a form may be submitted. Value: one of {true, false}. + REQUIRED: 'required', + + // ARIA state for setting the currently selected item in the list. + // Value: one of {true, false, undefined}. + SELECTED: 'selected', + + // ARIA property defining the number of items in a list. Value: integer. + SETSIZE: 'setsize', + + // ARIA property indicating if items are sorted. Value: one of {'ascending', + // 'descending', 'none', 'other'}. + SORT: 'sort', + + // ARIA property for slider maximum value. Value: number. + VALUEMAX: 'valuemax', + + // ARIA property for slider minimum value. Value: number. + VALUEMIN: 'valuemin', + + // ARIA property for slider active value. Value: number. + VALUENOW: 'valuenow', + + // ARIA property for slider active value represented as text. + // Value: string. + VALUETEXT: 'valuetext' +}; + + +/** + * ARIA state values for AutoCompleteValues. + * @enum {string} + */ +goog.a11y.aria.AutoCompleteValues = { + // The system provides text after the caret as a suggestion + // for how to complete the field. + INLINE: 'inline', + // A list of choices appears from which the user can choose, + // but the edit box retains focus. + LIST: 'list', + // A list of choices appears and the currently selected suggestion + // also appears inline. + BOTH: 'both', + // No input completion suggestions are provided. + NONE: 'none' +}; + + +/** + * ARIA state values for DropEffectValues. + * @enum {string} + */ +goog.a11y.aria.DropEffectValues = { + // A duplicate of the source object will be dropped into the target. + COPY: 'copy', + // The source object will be removed from its current location + // and dropped into the target. + MOVE: 'move', + // A reference or shortcut to the dragged object + // will be created in the target object. + LINK: 'link', + // A function supported by the drop target is + // executed, using the drag source as an input. + EXECUTE: 'execute', + // There is a popup menu or dialog that allows the user to choose + // one of the drag operations (copy, move, link, execute) and any other + // drag functionality, such as cancel. + POPUP: 'popup', + // No operation can be performed; effectively + // cancels the drag operation if an attempt is made to drop on this object. + NONE: 'none' +}; + + +/** + * ARIA state values for LivePriority. + * @enum {string} + */ +goog.a11y.aria.LivePriority = { + // Updates to the region will not be presented to the user + // unless the assitive technology is currently focused on that region. + OFF: 'off', + // (Background change) Assistive technologies SHOULD announce + // updates at the next graceful opportunity, such as at the end of + // speaking the current sentence or when the user pauses typing. + POLITE: 'polite', + // This information has the highest priority and assistive + // technologies SHOULD notify the user immediately. + // Because an interruption may disorient users or cause them to not complete + // their current task, authors SHOULD NOT use the assertive value unless the + // interruption is imperative. + ASSERTIVE: 'assertive' +}; + + +/** + * ARIA state values for OrientationValues. + * @enum {string} + */ +goog.a11y.aria.OrientationValues = { + // The element is oriented vertically. + VERTICAL: 'vertical', + // The element is oriented horizontally. + HORIZONTAL: 'horizontal' +}; + + +/** + * ARIA state values for RelevantValues. + * @enum {string} + */ +goog.a11y.aria.RelevantValues = { + // Element nodes are added to the DOM within the live region. + ADDITIONS: 'additions', + // Text or element nodes within the live region are removed from the DOM. + REMOVALS: 'removals', + // Text is added to any DOM descendant nodes of the live region. + TEXT: 'text', + // Equivalent to the combination of all values, "additions removals text". + ALL: 'all' +}; + + +/** + * ARIA state values for SortValues. + * @enum {string} + */ +goog.a11y.aria.SortValues = { + // Items are sorted in ascending order by this column. + ASCENDING: 'ascending', + // Items are sorted in descending order by this column. + DESCENDING: 'descending', + // There is no defined sort applied to the column. + NONE: 'none', + // A sort algorithm other than ascending or descending has been applied. + OTHER: 'other' +}; + + +/** + * ARIA state values for CheckedValues. + * @enum {string} + */ +goog.a11y.aria.CheckedValues = { + // The selectable element is checked. + TRUE: 'true', + // The selectable element is not checked. + FALSE: 'false', + // Indicates a mixed mode value for a tri-state + // checkbox or menuitemcheckbox. + MIXED: 'mixed', + // The element does not support being checked. + UNDEFINED: 'undefined' +}; + + +/** + * ARIA state values for ExpandedValues. + * @enum {string} + */ +goog.a11y.aria.ExpandedValues = { + // The element, or another grouping element it controls, is expanded. + TRUE: 'true', + // The element, or another grouping element it controls, is collapsed. + FALSE: 'false', + // The element, or another grouping element + // it controls, is neither expandable nor collapsible; all its + // child elements are shown or there are no child elements. + UNDEFINED: 'undefined' +}; + + +/** + * ARIA state values for GrabbedValues. + * @enum {string} + */ +goog.a11y.aria.GrabbedValues = { + // Indicates that the element has been "grabbed" for dragging. + TRUE: 'true', + // Indicates that the element supports being dragged. + FALSE: 'false', + // Indicates that the element does not support being dragged. + UNDEFINED: 'undefined' +}; + + +/** + * ARIA state values for InvalidValues. + * @enum {string} + */ +goog.a11y.aria.InvalidValues = { + // There are no detected errors in the value. + FALSE: 'false', + // The value entered by the user has failed validation. + TRUE: 'true', + // A grammatical error was detected. + GRAMMAR: 'grammar', + // A spelling error was detected. + SPELLING: 'spelling' +}; + + +/** + * ARIA state values for PressedValues. + * @enum {string} + */ +goog.a11y.aria.PressedValues = { + // The element is pressed. + TRUE: 'true', + // The element supports being pressed but is not currently pressed. + FALSE: 'false', + // Indicates a mixed mode value for a tri-state toggle button. + MIXED: 'mixed', + // The element does not support being pressed. + UNDEFINED: 'undefined' +}; + + +/** + * ARIA state values for SelectedValues. + * @enum {string} + */ +goog.a11y.aria.SelectedValues = { + // The selectable element is selected. + TRUE: 'true', + // The selectable element is not selected. + FALSE: 'false', + // The element is not selectable. + UNDEFINED: 'undefined' +}; diff --git a/float-no-zero/closure-library/closure/goog/a11y/aria/datatables.js b/float-no-zero/closure-library/closure/goog/a11y/aria/datatables.js new file mode 100644 index 0000000000..c97df20856 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/a11y/aria/datatables.js @@ -0,0 +1,68 @@ +// Copyright 2013 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + + +/** + * @fileoverview The file contains data tables generated from the ARIA + * standard schema http://www.w3.org/TR/wai-aria/. + * + * This is auto-generated code. Do not manually edit! + */ + +goog.provide('goog.a11y.aria.datatables'); + +goog.require('goog.a11y.aria.State'); +goog.require('goog.object'); + + +/** + * A map that contains mapping between an ARIA state and the default value + * for it. Note that not all ARIA states have default values. + * + * @type {Object.} + */ +goog.a11y.aria.DefaultStateValueMap_; + + +/** + * A method that creates a map that contains mapping between an ARIA state and + * the default value for it. Note that not all ARIA states have default values. + * + * @return {Object.} + * The names for each of the notification methods. + */ +goog.a11y.aria.datatables.getDefaultValuesMap = function() { + if (!goog.a11y.aria.DefaultStateValueMap_) { + goog.a11y.aria.DefaultStateValueMap_ = goog.object.create( + goog.a11y.aria.State.ATOMIC, false, + goog.a11y.aria.State.AUTOCOMPLETE, 'none', + goog.a11y.aria.State.DROPEFFECT, 'none', + goog.a11y.aria.State.HASPOPUP, false, + goog.a11y.aria.State.LIVE, 'off', + goog.a11y.aria.State.MULTILINE, false, + goog.a11y.aria.State.MULTISELECTABLE, false, + goog.a11y.aria.State.ORIENTATION, 'vertical', + goog.a11y.aria.State.READONLY, false, + goog.a11y.aria.State.RELEVANT, 'additions text', + goog.a11y.aria.State.REQUIRED, false, + goog.a11y.aria.State.SORT, 'none', + goog.a11y.aria.State.BUSY, false, + goog.a11y.aria.State.DISABLED, false, + goog.a11y.aria.State.HIDDEN, false, + goog.a11y.aria.State.INVALID, 'false'); + } + + return goog.a11y.aria.DefaultStateValueMap_; +}; diff --git a/float-no-zero/closure-library/closure/goog/a11y/aria/roles.js b/float-no-zero/closure-library/closure/goog/a11y/aria/roles.js new file mode 100644 index 0000000000..a282cc2d86 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/a11y/aria/roles.js @@ -0,0 +1,216 @@ +// Copyright 2013 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * @fileoverview The file contains generated enumerations for ARIA roles + * as defined by W3C ARIA standard: http://www.w3.org/TR/wai-aria/. + * + * This is auto-generated code. Do not manually edit! For more details + * about how to edit it via the generator check go/closure-ariagen. + */ + +goog.provide('goog.a11y.aria.Role'); + + +/** + * ARIA role values. + * @enum {string} + */ +goog.a11y.aria.Role = { + // ARIA role for an alert element that doesn't need to be explicitly closed. + ALERT: 'alert', + + // ARIA role for an alert dialog element that takes focus and must be closed. + ALERTDIALOG: 'alertdialog', + + // ARIA role for an application that implements its own keyboard navigation. + APPLICATION: 'application', + + // ARIA role for an article. + ARTICLE: 'article', + + // ARIA role for a banner containing mostly site content, not page content. + BANNER: 'banner', + + // ARIA role for a button element. + BUTTON: 'button', + + // ARIA role for a checkbox button element; use with the CHECKED state. + CHECKBOX: 'checkbox', + + // ARIA role for a column header of a table or grid. + COLUMNHEADER: 'columnheader', + + // ARIA role for a combo box element. + COMBOBOX: 'combobox', + + // ARIA role for a supporting section of the document. + COMPLEMENTARY: 'complementary', + + // ARIA role for a large perceivable region that contains information + // about the parent document. + CONTENTINFO: 'contentinfo', + + // ARIA role for a definition of a term or concept. + DEFINITION: 'definition', + + // ARIA role for a dialog, some descendant must take initial focus. + DIALOG: 'dialog', + + // ARIA role for a directory, like a table of contents. + DIRECTORY: 'directory', + + // ARIA role for a part of a page that's a document, not a web application. + DOCUMENT: 'document', + + // ARIA role for a landmark region logically considered one form. + FORM: 'form', + + // ARIA role for an interactive control of tabular data. + GRID: 'grid', + + // ARIA role for a cell in a grid. + GRIDCELL: 'gridcell', + + // ARIA role for a group of related elements like tree item siblings. + GROUP: 'group', + + // ARIA role for a heading element. + HEADING: 'heading', + + // ARIA role for a container of elements that together comprise one image. + IMG: 'img', + + // ARIA role for a link. + LINK: 'link', + + // ARIA role for a list of non-interactive list items. + LIST: 'list', + + // ARIA role for a listbox. + LISTBOX: 'listbox', + + // ARIA role for a list item. + LISTITEM: 'listitem', + + // ARIA role for a live region where new information is added. + LOG: 'log', + + // ARIA landmark role for the main content in a document. Use only once. + MAIN: 'main', + + // ARIA role for a live region of non-essential information that changes. + MARQUEE: 'marquee', + + // ARIA role for a mathematical expression. + MATH: 'math', + + // ARIA role for a popup menu. + MENU: 'menu', + + // ARIA role for a menubar element containing menu elements. + MENUBAR: 'menubar', + + // ARIA role for menu item elements. + MENU_ITEM: 'menuitem', + + // ARIA role for a checkbox box element inside a menu. + MENU_ITEM_CHECKBOX: 'menuitemcheckbox', + + // ARIA role for a radio button element inside a menu. + MENU_ITEM_RADIO: 'menuitemradio', + + // ARIA landmark role for a collection of navigation links. + NAVIGATION: 'navigation', + + // ARIA role for a section ancillary to the main content. + NOTE: 'note', + + // ARIA role for option items that are children of combobox, listbox, menu, + // radiogroup, or tree elements. + OPTION: 'option', + + // ARIA role for ignorable cosmetic elements with no semantic significance. + PRESENTATION: 'presentation', + + // ARIA role for a progress bar element. + PROGRESSBAR: 'progressbar', + + // ARIA role for a radio button element. + RADIO: 'radio', + + // ARIA role for a group of connected radio button elements. + RADIOGROUP: 'radiogroup', + + // ARIA role for an important region of the page. + REGION: 'region', + + // ARIA role for a row of cells in a grid. + ROW: 'row', + + // ARIA role for a group of one or more rows in a grid. + ROWGROUP: 'rowgroup', + + // ARIA role for a row header of a table or grid. + ROWHEADER: 'rowheader', + + // ARIA role for a scrollbar element. + SCROLLBAR: 'scrollbar', + + // ARIA landmark role for a part of the page providing search functionality. + SEARCH: 'search', + + // ARIA role for a menu separator. + SEPARATOR: 'separator', + + // ARIA role for a slider. + SLIDER: 'slider', + + // ARIA role for a spin button. + SPINBUTTON: 'spinbutton', + + // ARIA role for a live region with advisory info less severe than an alert. + STATUS: 'status', + + // ARIA role for a tab button. + TAB: 'tab', + + // ARIA role for a tab bar (i.e. a list of tab buttons). + TAB_LIST: 'tablist', + + // ARIA role for a tab page (i.e. the element holding tab contents). + TAB_PANEL: 'tabpanel', + + // ARIA role for a textbox element. + TEXTBOX: 'textbox', + + // ARIA role for an element displaying elapsed time or time remaining. + TIMER: 'timer', + + // ARIA role for a toolbar element. + TOOLBAR: 'toolbar', + + // ARIA role for a tooltip element. + TOOLTIP: 'tooltip', + + // ARIA role for a tree. + TREE: 'tree', + + // ARIA role for a grid whose rows can be expanded and collapsed like a tree. + TREEGRID: 'treegrid', + + // ARIA role for a tree item that sometimes may be expanded or collapsed. + TREEITEM: 'treeitem' +}; diff --git a/float-no-zero/closure-library/closure/goog/array/array.js b/float-no-zero/closure-library/closure/goog/array/array.js new file mode 100644 index 0000000000..0ec1491ebb --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/array/array.js @@ -0,0 +1,1507 @@ +// Copyright 2006 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilities for manipulating arrays. + * + */ + + +goog.provide('goog.array'); +goog.provide('goog.array.ArrayLike'); + +goog.require('goog.asserts'); + + +/** + * @define {boolean} NATIVE_ARRAY_PROTOTYPES indicates whether the code should + * rely on Array.prototype functions, if available. + * + * The Array.prototype functions can be defined by external libraries like + * Prototype and setting this flag to false forces closure to use its own + * goog.array implementation. + * + * If your javascript can be loaded by a third party site and you are wary about + * relying on the prototype functions, specify + * "--define goog.NATIVE_ARRAY_PROTOTYPES=false" to the JSCompiler. + * + * Setting goog.TRUSTED_SITE to false will automatically set + * NATIVE_ARRAY_PROTOTYPES to false. + */ +goog.define('goog.NATIVE_ARRAY_PROTOTYPES', goog.TRUSTED_SITE); + + +/** + * @typedef {Array|NodeList|Arguments|{length: number}} + */ +goog.array.ArrayLike; + + +/** + * Returns the last element in an array without removing it. + * @param {goog.array.ArrayLike} array The array. + * @return {*} Last item in array. + */ +goog.array.peek = function(array) { + return array[array.length - 1]; +}; + + +/** + * Reference to the original {@code Array.prototype}. + * @private + */ +goog.array.ARRAY_PROTOTYPE_ = Array.prototype; + + +// NOTE(arv): Since most of the array functions are generic it allows you to +// pass an array-like object. Strings have a length and are considered array- +// like. However, the 'in' operator does not work on strings so we cannot just +// use the array path even if the browser supports indexing into strings. We +// therefore end up splitting the string. + + +/** + * Returns the index of the first element of an array with a specified + * value, or -1 if the element is not present in the array. + * + * See {@link http://tinyurl.com/developer-mozilla-org-array-indexof} + * + * @param {goog.array.ArrayLike} arr The array to be searched. + * @param {*} obj The object for which we are searching. + * @param {number=} opt_fromIndex The index at which to start the search. If + * omitted the search starts at index 0. + * @return {number} The index of the first matching array element. + */ +goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.indexOf ? + function(arr, obj, opt_fromIndex) { + goog.asserts.assert(arr.length != null); + + return goog.array.ARRAY_PROTOTYPE_.indexOf.call(arr, obj, opt_fromIndex); + } : + function(arr, obj, opt_fromIndex) { + var fromIndex = opt_fromIndex == null ? + 0 : (opt_fromIndex < 0 ? + Math.max(0, arr.length + opt_fromIndex) : opt_fromIndex); + + if (goog.isString(arr)) { + // Array.prototype.indexOf uses === so only strings should be found. + if (!goog.isString(obj) || obj.length != 1) { + return -1; + } + return arr.indexOf(obj, fromIndex); + } + + for (var i = fromIndex; i < arr.length; i++) { + if (i in arr && arr[i] === obj) + return i; + } + return -1; + }; + + +/** + * Returns the index of the last element of an array with a specified value, or + * -1 if the element is not present in the array. + * + * See {@link http://tinyurl.com/developer-mozilla-org-array-lastindexof} + * + * @param {goog.array.ArrayLike} arr The array to be searched. + * @param {*} obj The object for which we are searching. + * @param {?number=} opt_fromIndex The index at which to start the search. If + * omitted the search starts at the end of the array. + * @return {number} The index of the last matching array element. + */ +goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.lastIndexOf ? + function(arr, obj, opt_fromIndex) { + goog.asserts.assert(arr.length != null); + + // Firefox treats undefined and null as 0 in the fromIndex argument which + // leads it to always return -1 + var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex; + return goog.array.ARRAY_PROTOTYPE_.lastIndexOf.call(arr, obj, fromIndex); + } : + function(arr, obj, opt_fromIndex) { + var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex; + + if (fromIndex < 0) { + fromIndex = Math.max(0, arr.length + fromIndex); + } + + if (goog.isString(arr)) { + // Array.prototype.lastIndexOf uses === so only strings should be found. + if (!goog.isString(obj) || obj.length != 1) { + return -1; + } + return arr.lastIndexOf(obj, fromIndex); + } + + for (var i = fromIndex; i >= 0; i--) { + if (i in arr && arr[i] === obj) + return i; + } + return -1; + }; + + +/** + * Calls a function for each element in an array. Skips holes in the array. + * See {@link http://tinyurl.com/developer-mozilla-org-array-foreach} + * + * @param {Array.|goog.array.ArrayLike} arr Array or array like object over + * which to iterate. + * @param {?function(this: S, T, number, ?): ?} f The function to call for every + * element. This function takes 3 arguments (the element, the index and the + * array). The return value is ignored. + * @param {S=} opt_obj The object to be used as the value of 'this' within f. + * @template T,S + */ +goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.forEach ? + function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + + goog.array.ARRAY_PROTOTYPE_.forEach.call(arr, f, opt_obj); + } : + function(arr, f, opt_obj) { + var l = arr.length; // must be fixed during loop... see docs + var arr2 = goog.isString(arr) ? arr.split('') : arr; + for (var i = 0; i < l; i++) { + if (i in arr2) { + f.call(opt_obj, arr2[i], i, arr); + } + } + }; + + +/** + * Calls a function for each element in an array, starting from the last + * element rather than the first. + * + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this: S, T, number, ?): ?} f The function to call for every + * element. This function + * takes 3 arguments (the element, the index and the array). The return + * value is ignored. + * @param {S=} opt_obj The object to be used as the value of 'this' + * within f. + * @template T,S + */ +goog.array.forEachRight = function(arr, f, opt_obj) { + var l = arr.length; // must be fixed during loop... see docs + var arr2 = goog.isString(arr) ? arr.split('') : arr; + for (var i = l - 1; i >= 0; --i) { + if (i in arr2) { + f.call(opt_obj, arr2[i], i, arr); + } + } +}; + + +/** + * Calls a function for each element in an array, and if the function returns + * true adds the element to a new array. + * + * See {@link http://tinyurl.com/developer-mozilla-org-array-filter} + * + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, T, number, ?):boolean} f The function to call for + * every element. This function + * takes 3 arguments (the element, the index and the array) and must + * return a Boolean. If the return value is true the element is added to the + * result array. If it is false the element is not included. + * @param {S=} opt_obj The object to be used as the value of 'this' + * within f. + * @return {!Array} a new array in which only elements that passed the test are + * present. + * @template T,S + */ +goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.filter ? + function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + + return goog.array.ARRAY_PROTOTYPE_.filter.call(arr, f, opt_obj); + } : + function(arr, f, opt_obj) { + var l = arr.length; // must be fixed during loop... see docs + var res = []; + var resLength = 0; + var arr2 = goog.isString(arr) ? arr.split('') : arr; + for (var i = 0; i < l; i++) { + if (i in arr2) { + var val = arr2[i]; // in case f mutates arr2 + if (f.call(opt_obj, val, i, arr)) { + res[resLength++] = val; + } + } + } + return res; + }; + + +/** + * Calls a function for each element in an array and inserts the result into a + * new array. + * + * See {@link http://tinyurl.com/developer-mozilla-org-array-map} + * + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, T, number, ?):?} f The function to call for every + * element. This function + * takes 3 arguments (the element, the index and the array) and should + * return something. The result will be inserted into a new array. + * @param {S=} opt_obj The object to be used as the value of 'this' + * within f. + * @return {!Array} a new array with the results from f. + * @template T,S + */ +goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.map ? + function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + + return goog.array.ARRAY_PROTOTYPE_.map.call(arr, f, opt_obj); + } : + function(arr, f, opt_obj) { + var l = arr.length; // must be fixed during loop... see docs + var res = new Array(l); + var arr2 = goog.isString(arr) ? arr.split('') : arr; + for (var i = 0; i < l; i++) { + if (i in arr2) { + res[i] = f.call(opt_obj, arr2[i], i, arr); + } + } + return res; + }; + + +/** + * Passes every element of an array into a function and accumulates the result. + * + * See {@link http://tinyurl.com/developer-mozilla-org-array-reduce} + * + * For example: + * var a = [1, 2, 3, 4]; + * goog.array.reduce(a, function(r, v, i, arr) {return r + v;}, 0); + * returns 10 + * + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, R, T, number, ?) : R} f The function to call for + * every element. This function + * takes 4 arguments (the function's previous result or the initial value, + * the value of the current array element, the current array index, and the + * array itself) + * function(previousValue, currentValue, index, array). + * @param {?} val The initial value to pass into the function on the first call. + * @param {S=} opt_obj The object to be used as the value of 'this' + * within f. + * @return {R} Result of evaluating f repeatedly across the values of the array. + * @template T,S,R + */ +goog.array.reduce = function(arr, f, val, opt_obj) { + if (arr.reduce) { + if (opt_obj) { + return arr.reduce(goog.bind(f, opt_obj), val); + } else { + return arr.reduce(f, val); + } + } + var rval = val; + goog.array.forEach(arr, function(val, index) { + rval = f.call(opt_obj, rval, val, index, arr); + }); + return rval; +}; + + +/** + * Passes every element of an array into a function and accumulates the result, + * starting from the last element and working towards the first. + * + * See {@link http://tinyurl.com/developer-mozilla-org-array-reduceright} + * + * For example: + * var a = ['a', 'b', 'c']; + * goog.array.reduceRight(a, function(r, v, i, arr) {return r + v;}, ''); + * returns 'cba' + * + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, R, T, number, ?) : R} f The function to call for + * every element. This function + * takes 4 arguments (the function's previous result or the initial value, + * the value of the current array element, the current array index, and the + * array itself) + * function(previousValue, currentValue, index, array). + * @param {?} val The initial value to pass into the function on the first call. + * @param {S=} opt_obj The object to be used as the value of 'this' + * within f. + * @return {R} Object returned as a result of evaluating f repeatedly across the + * values of the array. + * @template T,S,R + */ +goog.array.reduceRight = function(arr, f, val, opt_obj) { + if (arr.reduceRight) { + if (opt_obj) { + return arr.reduceRight(goog.bind(f, opt_obj), val); + } else { + return arr.reduceRight(f, val); + } + } + var rval = val; + goog.array.forEachRight(arr, function(val, index) { + rval = f.call(opt_obj, rval, val, index, arr); + }); + return rval; +}; + + +/** + * Calls f for each element of an array. If any call returns true, some() + * returns true (without checking the remaining elements). If all calls + * return false, some() returns false. + * + * See {@link http://tinyurl.com/developer-mozilla-org-array-some} + * + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, T, number, ?) : boolean} f The function to call for + * for every element. This function takes 3 arguments (the element, the + * index and the array) and should return a boolean. + * @param {S=} opt_obj The object to be used as the value of 'this' + * within f. + * @return {boolean} true if any element passes the test. + * @template T,S + */ +goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.some ? + function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + + return goog.array.ARRAY_PROTOTYPE_.some.call(arr, f, opt_obj); + } : + function(arr, f, opt_obj) { + var l = arr.length; // must be fixed during loop... see docs + var arr2 = goog.isString(arr) ? arr.split('') : arr; + for (var i = 0; i < l; i++) { + if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) { + return true; + } + } + return false; + }; + + +/** + * Call f for each element of an array. If all calls return true, every() + * returns true. If any call returns false, every() returns false and + * does not continue to check the remaining elements. + * + * See {@link http://tinyurl.com/developer-mozilla-org-array-every} + * + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, T, number, ?) : boolean} f The function to call for + * for every element. This function takes 3 arguments (the element, the + * index and the array) and should return a boolean. + * @param {S=} opt_obj The object to be used as the value of 'this' + * within f. + * @return {boolean} false if any element fails the test. + * @template T,S + */ +goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.every ? + function(arr, f, opt_obj) { + goog.asserts.assert(arr.length != null); + + return goog.array.ARRAY_PROTOTYPE_.every.call(arr, f, opt_obj); + } : + function(arr, f, opt_obj) { + var l = arr.length; // must be fixed during loop... see docs + var arr2 = goog.isString(arr) ? arr.split('') : arr; + for (var i = 0; i < l; i++) { + if (i in arr2 && !f.call(opt_obj, arr2[i], i, arr)) { + return false; + } + } + return true; + }; + + +/** + * Counts the array elements that fulfill the predicate, i.e. for which the + * callback function returns true. Skips holes in the array. + * + * @param {!(Array.|goog.array.ArrayLike)} arr Array or array like object + * over which to iterate. + * @param {function(this: S, T, number, ?): boolean} f The function to call for + * every element. Takes 3 arguments (the element, the index and the array). + * @param {S=} opt_obj The object to be used as the value of 'this' within f. + * @return {number} The number of the matching elements. + * @template T,S + */ +goog.array.count = function(arr, f, opt_obj) { + var count = 0; + goog.array.forEach(arr, function(element, index, arr) { + if (f.call(opt_obj, element, index, arr)) { + ++count; + } + }, opt_obj); + return count; +}; + + +/** + * Search an array for the first element that satisfies a given condition and + * return that element. + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, T, number, ?) : boolean} f The function to call + * for every element. This function takes 3 arguments (the element, the + * index and the array) and should return a boolean. + * @param {S=} opt_obj An optional "this" context for the function. + * @return {T} The first array element that passes the test, or null if no + * element is found. + * @template T,S + */ +goog.array.find = function(arr, f, opt_obj) { + var i = goog.array.findIndex(arr, f, opt_obj); + return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i]; +}; + + +/** + * Search an array for the first element that satisfies a given condition and + * return its index. + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, T, number, ?) : boolean} f The function to call for + * every element. This function + * takes 3 arguments (the element, the index and the array) and should + * return a boolean. + * @param {S=} opt_obj An optional "this" context for the function. + * @return {number} The index of the first array element that passes the test, + * or -1 if no element is found. + * @template T,S + */ +goog.array.findIndex = function(arr, f, opt_obj) { + var l = arr.length; // must be fixed during loop... see docs + var arr2 = goog.isString(arr) ? arr.split('') : arr; + for (var i = 0; i < l; i++) { + if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) { + return i; + } + } + return -1; +}; + + +/** + * Search an array (in reverse order) for the last element that satisfies a + * given condition and return that element. + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, T, number, ?) : boolean} f The function to call + * for every element. This function + * takes 3 arguments (the element, the index and the array) and should + * return a boolean. + * @param {S=} opt_obj An optional "this" context for the function. + * @return {T} The last array element that passes the test, or null if no + * element is found. + * @template T,S + */ +goog.array.findRight = function(arr, f, opt_obj) { + var i = goog.array.findIndexRight(arr, f, opt_obj); + return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i]; +}; + + +/** + * Search an array (in reverse order) for the last element that satisfies a + * given condition and return its index. + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, T, number, ?) : boolean} f The function to call + * for every element. This function + * takes 3 arguments (the element, the index and the array) and should + * return a boolean. + * @param {Object=} opt_obj An optional "this" context for the function. + * @return {number} The index of the last array element that passes the test, + * or -1 if no element is found. + * @template T,S + */ +goog.array.findIndexRight = function(arr, f, opt_obj) { + var l = arr.length; // must be fixed during loop... see docs + var arr2 = goog.isString(arr) ? arr.split('') : arr; + for (var i = l - 1; i >= 0; i--) { + if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) { + return i; + } + } + return -1; +}; + + +/** + * Whether the array contains the given object. + * @param {goog.array.ArrayLike} arr The array to test for the presence of the + * element. + * @param {*} obj The object for which to test. + * @return {boolean} true if obj is present. + */ +goog.array.contains = function(arr, obj) { + return goog.array.indexOf(arr, obj) >= 0; +}; + + +/** + * Whether the array is empty. + * @param {goog.array.ArrayLike} arr The array to test. + * @return {boolean} true if empty. + */ +goog.array.isEmpty = function(arr) { + return arr.length == 0; +}; + + +/** + * Clears the array. + * @param {goog.array.ArrayLike} arr Array or array like object to clear. + */ +goog.array.clear = function(arr) { + // For non real arrays we don't have the magic length so we delete the + // indices. + if (!goog.isArray(arr)) { + for (var i = arr.length - 1; i >= 0; i--) { + delete arr[i]; + } + } + arr.length = 0; +}; + + +/** + * Pushes an item into an array, if it's not already in the array. + * @param {Array.} arr Array into which to insert the item. + * @param {T} obj Value to add. + * @template T + */ +goog.array.insert = function(arr, obj) { + if (!goog.array.contains(arr, obj)) { + arr.push(obj); + } +}; + + +/** + * Inserts an object at the given index of the array. + * @param {goog.array.ArrayLike} arr The array to modify. + * @param {*} obj The object to insert. + * @param {number=} opt_i The index at which to insert the object. If omitted, + * treated as 0. A negative index is counted from the end of the array. + */ +goog.array.insertAt = function(arr, obj, opt_i) { + goog.array.splice(arr, opt_i, 0, obj); +}; + + +/** + * Inserts at the given index of the array, all elements of another array. + * @param {goog.array.ArrayLike} arr The array to modify. + * @param {goog.array.ArrayLike} elementsToAdd The array of elements to add. + * @param {number=} opt_i The index at which to insert the object. If omitted, + * treated as 0. A negative index is counted from the end of the array. + */ +goog.array.insertArrayAt = function(arr, elementsToAdd, opt_i) { + goog.partial(goog.array.splice, arr, opt_i, 0).apply(null, elementsToAdd); +}; + + +/** + * Inserts an object into an array before a specified object. + * @param {Array.} arr The array to modify. + * @param {T} obj The object to insert. + * @param {T=} opt_obj2 The object before which obj should be inserted. If obj2 + * is omitted or not found, obj is inserted at the end of the array. + * @template T + */ +goog.array.insertBefore = function(arr, obj, opt_obj2) { + var i; + if (arguments.length == 2 || (i = goog.array.indexOf(arr, opt_obj2)) < 0) { + arr.push(obj); + } else { + goog.array.insertAt(arr, obj, i); + } +}; + + +/** + * Removes the first occurrence of a particular value from an array. + * @param {goog.array.ArrayLike} arr Array from which to remove value. + * @param {*} obj Object to remove. + * @return {boolean} True if an element was removed. + */ +goog.array.remove = function(arr, obj) { + var i = goog.array.indexOf(arr, obj); + var rv; + if ((rv = i >= 0)) { + goog.array.removeAt(arr, i); + } + return rv; +}; + + +/** + * Removes from an array the element at index i + * @param {goog.array.ArrayLike} arr Array or array like object from which to + * remove value. + * @param {number} i The index to remove. + * @return {boolean} True if an element was removed. + */ +goog.array.removeAt = function(arr, i) { + goog.asserts.assert(arr.length != null); + + // use generic form of splice + // splice returns the removed items and if successful the length of that + // will be 1 + return goog.array.ARRAY_PROTOTYPE_.splice.call(arr, i, 1).length == 1; +}; + + +/** + * Removes the first value that satisfies the given condition. + * @param {Array.|goog.array.ArrayLike} arr Array or array + * like object over which to iterate. + * @param {?function(this:S, T, number, ?) : boolean} f The function to call + * for every element. This function + * takes 3 arguments (the element, the index and the array) and should + * return a boolean. + * @param {S=} opt_obj An optional "this" context for the function. + * @return {boolean} True if an element was removed. + * @template T,S + */ +goog.array.removeIf = function(arr, f, opt_obj) { + var i = goog.array.findIndex(arr, f, opt_obj); + if (i >= 0) { + goog.array.removeAt(arr, i); + return true; + } + return false; +}; + + +/** + * Returns a new array that is the result of joining the arguments. If arrays + * are passed then their items are added, however, if non-arrays are passed they + * will be added to the return array as is. + * + * Note that ArrayLike objects will be added as is, rather than having their + * items added. + * + * goog.array.concat([1, 2], [3, 4]) -> [1, 2, 3, 4] + * goog.array.concat(0, [1, 2]) -> [0, 1, 2] + * goog.array.concat([1, 2], null) -> [1, 2, null] + * + * There is bug in all current versions of IE (6, 7 and 8) where arrays created + * in an iframe become corrupted soon (not immediately) after the iframe is + * destroyed. This is common if loading data via goog.net.IframeIo, for example. + * This corruption only affects the concat method which will start throwing + * Catastrophic Errors (#-2147418113). + * + * See http://endoflow.com/scratch/corrupted-arrays.html for a test case. + * + * Internally goog.array should use this, so that all methods will continue to + * work on these broken array objects. + * + * @param {...*} var_args Items to concatenate. Arrays will have each item + * added, while primitives and objects will be added as is. + * @return {!Array} The new resultant array. + */ +goog.array.concat = function(var_args) { + return goog.array.ARRAY_PROTOTYPE_.concat.apply( + goog.array.ARRAY_PROTOTYPE_, arguments); +}; + + +/** + * Converts an object to an array. + * @param {goog.array.ArrayLike} object The object to convert to an array. + * @return {!Array} The object converted into an array. If object has a + * length property, every property indexed with a non-negative number + * less than length will be included in the result. If object does not + * have a length property, an empty array will be returned. + */ +goog.array.toArray = function(object) { + var length = object.length; + + // If length is not a number the following it false. This case is kept for + // backwards compatibility since there are callers that pass objects that are + // not array like. + if (length > 0) { + var rv = new Array(length); + for (var i = 0; i < length; i++) { + rv[i] = object[i]; + } + return rv; + } + return []; +}; + + +/** + * Does a shallow copy of an array. + * @param {goog.array.ArrayLike} arr Array or array-like object to clone. + * @return {!Array} Clone of the input array. + */ +goog.array.clone = goog.array.toArray; + + +/** + * Extends an array with another array, element, or "array like" object. + * This function operates 'in-place', it does not create a new Array. + * + * Example: + * var a = []; + * goog.array.extend(a, [0, 1]); + * a; // [0, 1] + * goog.array.extend(a, 2); + * a; // [0, 1, 2] + * + * @param {Array} arr1 The array to modify. + * @param {...*} var_args The elements or arrays of elements to add to arr1. + */ +goog.array.extend = function(arr1, var_args) { + for (var i = 1; i < arguments.length; i++) { + var arr2 = arguments[i]; + // If we have an Array or an Arguments object we can just call push + // directly. + var isArrayLike; + if (goog.isArray(arr2) || + // Detect Arguments. ES5 says that the [[Class]] of an Arguments object + // is "Arguments" but only V8 and JSC/Safari gets this right. We instead + // detect Arguments by checking for array like and presence of "callee". + (isArrayLike = goog.isArrayLike(arr2)) && + // The getter for callee throws an exception in strict mode + // according to section 10.6 in ES5 so check for presence instead. + Object.prototype.hasOwnProperty.call(arr2, 'callee')) { + arr1.push.apply(arr1, arr2); + } else if (isArrayLike) { + // Otherwise loop over arr2 to prevent copying the object. + var len1 = arr1.length; + var len2 = arr2.length; + for (var j = 0; j < len2; j++) { + arr1[len1 + j] = arr2[j]; + } + } else { + arr1.push(arr2); + } + } +}; + + +/** + * Adds or removes elements from an array. This is a generic version of Array + * splice. This means that it might work on other objects similar to arrays, + * such as the arguments object. + * + * @param {goog.array.ArrayLike} arr The array to modify. + * @param {number|undefined} index The index at which to start changing the + * array. If not defined, treated as 0. + * @param {number} howMany How many elements to remove (0 means no removal. A + * value below 0 is treated as zero and so is any other non number. Numbers + * are floored). + * @param {...*} var_args Optional, additional elements to insert into the + * array. + * @return {!Array} the removed elements. + */ +goog.array.splice = function(arr, index, howMany, var_args) { + goog.asserts.assert(arr.length != null); + + return goog.array.ARRAY_PROTOTYPE_.splice.apply( + arr, goog.array.slice(arguments, 1)); +}; + + +/** + * Returns a new array from a segment of an array. This is a generic version of + * Array slice. This means that it might work on other objects similar to + * arrays, such as the arguments object. + * + * @param {Array.|goog.array.ArrayLike} arr The array from + * which to copy a segment. + * @param {number} start The index of the first element to copy. + * @param {number=} opt_end The index after the last element to copy. + * @return {!Array.} A new array containing the specified segment of the + * original array. + * @template T + */ +goog.array.slice = function(arr, start, opt_end) { + goog.asserts.assert(arr.length != null); + + // passing 1 arg to slice is not the same as passing 2 where the second is + // null or undefined (in that case the second argument is treated as 0). + // we could use slice on the arguments object and then use apply instead of + // testing the length + if (arguments.length <= 2) { + return goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start); + } else { + return goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start, opt_end); + } +}; + + +/** + * Removes all duplicates from an array (retaining only the first + * occurrence of each array element). This function modifies the + * array in place and doesn't change the order of the non-duplicate items. + * + * For objects, duplicates are identified as having the same unique ID as + * defined by {@link goog.getUid}. + * + * Runtime: N, + * Worstcase space: 2N (no dupes) + * + * @param {goog.array.ArrayLike} arr The array from which to remove duplicates. + * @param {Array=} opt_rv An optional array in which to return the results, + * instead of performing the removal inplace. If specified, the original + * array will remain unchanged. + */ +goog.array.removeDuplicates = function(arr, opt_rv) { + var returnArray = opt_rv || arr; + + var seen = {}, cursorInsert = 0, cursorRead = 0; + while (cursorRead < arr.length) { + var current = arr[cursorRead++]; + + // Prefix each type with a single character representing the type to + // prevent conflicting keys (e.g. true and 'true'). + var key = goog.isObject(current) ? + 'o' + goog.getUid(current) : + (typeof current).charAt(0) + current; + + if (!Object.prototype.hasOwnProperty.call(seen, key)) { + seen[key] = true; + returnArray[cursorInsert++] = current; + } + } + returnArray.length = cursorInsert; +}; + + +/** + * Searches the specified array for the specified target using the binary + * search algorithm. If no opt_compareFn is specified, elements are compared + * using goog.array.defaultCompare, which compares the elements + * using the built in < and > operators. This will produce the expected + * behavior for homogeneous arrays of String(s) and Number(s). The array + * specified must be sorted in ascending order (as defined by the + * comparison function). If the array is not sorted, results are undefined. + * If the array contains multiple instances of the specified target value, any + * of these instances may be found. + * + * Runtime: O(log n) + * + * @param {goog.array.ArrayLike} arr The array to be searched. + * @param {*} target The sought value. + * @param {Function=} opt_compareFn Optional comparison function by which the + * array is ordered. Should take 2 arguments to compare, and return a + * negative number, zero, or a positive number depending on whether the + * first argument is less than, equal to, or greater than the second. + * @return {number} Lowest index of the target value if found, otherwise + * (-(insertion point) - 1). The insertion point is where the value should + * be inserted into arr to preserve the sorted property. Return value >= 0 + * iff target is found. + */ +goog.array.binarySearch = function(arr, target, opt_compareFn) { + return goog.array.binarySearch_(arr, + opt_compareFn || goog.array.defaultCompare, false /* isEvaluator */, + target); +}; + + +/** + * Selects an index in the specified array using the binary search algorithm. + * The evaluator receives an element and determines whether the desired index + * is before, at, or after it. The evaluator must be consistent (formally, + * goog.array.map(goog.array.map(arr, evaluator, opt_obj), goog.math.sign) + * must be monotonically non-increasing). + * + * Runtime: O(log n) + * + * @param {goog.array.ArrayLike} arr The array to be searched. + * @param {Function} evaluator Evaluator function that receives 3 arguments + * (the element, the index and the array). Should return a negative number, + * zero, or a positive number depending on whether the desired index is + * before, at, or after the element passed to it. + * @param {Object=} opt_obj The object to be used as the value of 'this' + * within evaluator. + * @return {number} Index of the leftmost element matched by the evaluator, if + * such exists; otherwise (-(insertion point) - 1). The insertion point is + * the index of the first element for which the evaluator returns negative, + * or arr.length if no such element exists. The return value is non-negative + * iff a match is found. + */ +goog.array.binarySelect = function(arr, evaluator, opt_obj) { + return goog.array.binarySearch_(arr, evaluator, true /* isEvaluator */, + undefined /* opt_target */, opt_obj); +}; + + +/** + * Implementation of a binary search algorithm which knows how to use both + * comparison functions and evaluators. If an evaluator is provided, will call + * the evaluator with the given optional data object, conforming to the + * interface defined in binarySelect. Otherwise, if a comparison function is + * provided, will call the comparison function against the given data object. + * + * This implementation purposefully does not use goog.bind or goog.partial for + * performance reasons. + * + * Runtime: O(log n) + * + * @param {goog.array.ArrayLike} arr The array to be searched. + * @param {Function} compareFn Either an evaluator or a comparison function, + * as defined by binarySearch and binarySelect above. + * @param {boolean} isEvaluator Whether the function is an evaluator or a + * comparison function. + * @param {*=} opt_target If the function is a comparison function, then this is + * the target to binary search for. + * @param {Object=} opt_selfObj If the function is an evaluator, this is an + * optional this object for the evaluator. + * @return {number} Lowest index of the target value if found, otherwise + * (-(insertion point) - 1). The insertion point is where the value should + * be inserted into arr to preserve the sorted property. Return value >= 0 + * iff target is found. + * @private + */ +goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target, + opt_selfObj) { + var left = 0; // inclusive + var right = arr.length; // exclusive + var found; + while (left < right) { + var middle = (left + right) >> 1; + var compareResult; + if (isEvaluator) { + compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr); + } else { + compareResult = compareFn(opt_target, arr[middle]); + } + if (compareResult > 0) { + left = middle + 1; + } else { + right = middle; + // We are looking for the lowest index so we can't return immediately. + found = !compareResult; + } + } + // left is the index if found, or the insertion point otherwise. + // ~left is a shorthand for -left - 1. + return found ? left : ~left; +}; + + +/** + * Sorts the specified array into ascending order. If no opt_compareFn is + * specified, elements are compared using + * goog.array.defaultCompare, which compares the elements using + * the built in < and > operators. This will produce the expected behavior + * for homogeneous arrays of String(s) and Number(s), unlike the native sort, + * but will give unpredictable results for heterogenous lists of strings and + * numbers with different numbers of digits. + * + * This sort is not guaranteed to be stable. + * + * Runtime: Same as Array.prototype.sort + * + * @param {Array.} arr The array to be sorted. + * @param {?function(T,T):number=} opt_compareFn Optional comparison + * function by which the + * array is to be ordered. Should take 2 arguments to compare, and return a + * negative number, zero, or a positive number depending on whether the + * first argument is less than, equal to, or greater than the second. + * @template T + */ +goog.array.sort = function(arr, opt_compareFn) { + // TODO(arv): Update type annotation since null is not accepted. + goog.asserts.assert(arr.length != null); + + goog.array.ARRAY_PROTOTYPE_.sort.call( + arr, opt_compareFn || goog.array.defaultCompare); +}; + + +/** + * Sorts the specified array into ascending order in a stable way. If no + * opt_compareFn is specified, elements are compared using + * goog.array.defaultCompare, which compares the elements using + * the built in < and > operators. This will produce the expected behavior + * for homogeneous arrays of String(s) and Number(s). + * + * Runtime: Same as Array.prototype.sort, plus an additional + * O(n) overhead of copying the array twice. + * + * @param {Array.} arr The array to be sorted. + * @param {?function(T, T): number=} opt_compareFn Optional comparison function + * by which the array is to be ordered. Should take 2 arguments to compare, + * and return a negative number, zero, or a positive number depending on + * whether the first argument is less than, equal to, or greater than the + * second. + * @template T + */ +goog.array.stableSort = function(arr, opt_compareFn) { + for (var i = 0; i < arr.length; i++) { + arr[i] = {index: i, value: arr[i]}; + } + var valueCompareFn = opt_compareFn || goog.array.defaultCompare; + function stableCompareFn(obj1, obj2) { + return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index; + }; + goog.array.sort(arr, stableCompareFn); + for (var i = 0; i < arr.length; i++) { + arr[i] = arr[i].value; + } +}; + + +/** + * Sorts an array of objects by the specified object key and compare + * function. If no compare function is provided, the key values are + * compared in ascending order using goog.array.defaultCompare. + * This won't work for keys that get renamed by the compiler. So use + * {'foo': 1, 'bar': 2} rather than {foo: 1, bar: 2}. + * @param {Array.} arr An array of objects to sort. + * @param {string} key The object key to sort by. + * @param {Function=} opt_compareFn The function to use to compare key + * values. + */ +goog.array.sortObjectsByKey = function(arr, key, opt_compareFn) { + var compare = opt_compareFn || goog.array.defaultCompare; + goog.array.sort(arr, function(a, b) { + return compare(a[key], b[key]); + }); +}; + + +/** + * Tells if the array is sorted. + * @param {!Array.} arr The array. + * @param {?function(T,T):number=} opt_compareFn Function to compare the + * array elements. + * Should take 2 arguments to compare, and return a negative number, zero, + * or a positive number depending on whether the first argument is less + * than, equal to, or greater than the second. + * @param {boolean=} opt_strict If true no equal elements are allowed. + * @return {boolean} Whether the array is sorted. + * @template T + */ +goog.array.isSorted = function(arr, opt_compareFn, opt_strict) { + var compare = opt_compareFn || goog.array.defaultCompare; + for (var i = 1; i < arr.length; i++) { + var compareResult = compare(arr[i - 1], arr[i]); + if (compareResult > 0 || compareResult == 0 && opt_strict) { + return false; + } + } + return true; +}; + + +/** + * Compares two arrays for equality. Two arrays are considered equal if they + * have the same length and their corresponding elements are equal according to + * the comparison function. + * + * @param {goog.array.ArrayLike} arr1 The first array to compare. + * @param {goog.array.ArrayLike} arr2 The second array to compare. + * @param {Function=} opt_equalsFn Optional comparison function. + * Should take 2 arguments to compare, and return true if the arguments + * are equal. Defaults to {@link goog.array.defaultCompareEquality} which + * compares the elements using the built-in '===' operator. + * @return {boolean} Whether the two arrays are equal. + */ +goog.array.equals = function(arr1, arr2, opt_equalsFn) { + if (!goog.isArrayLike(arr1) || !goog.isArrayLike(arr2) || + arr1.length != arr2.length) { + return false; + } + var l = arr1.length; + var equalsFn = opt_equalsFn || goog.array.defaultCompareEquality; + for (var i = 0; i < l; i++) { + if (!equalsFn(arr1[i], arr2[i])) { + return false; + } + } + return true; +}; + + +/** + * @deprecated Use {@link goog.array.equals}. + * @param {goog.array.ArrayLike} arr1 See {@link goog.array.equals}. + * @param {goog.array.ArrayLike} arr2 See {@link goog.array.equals}. + * @param {Function=} opt_equalsFn See {@link goog.array.equals}. + * @return {boolean} See {@link goog.array.equals}. + */ +goog.array.compare = function(arr1, arr2, opt_equalsFn) { + return goog.array.equals(arr1, arr2, opt_equalsFn); +}; + + +/** + * 3-way array compare function. + * @param {!goog.array.ArrayLike} arr1 The first array to compare. + * @param {!goog.array.ArrayLike} arr2 The second array to compare. + * @param {?function(?, ?): number=} opt_compareFn Optional comparison function + * by which the array is to be ordered. Should take 2 arguments to compare, + * and return a negative number, zero, or a positive number depending on + * whether the first argument is less than, equal to, or greater than the + * second. + * @return {number} Negative number, zero, or a positive number depending on + * whether the first argument is less than, equal to, or greater than the + * second. + */ +goog.array.compare3 = function(arr1, arr2, opt_compareFn) { + var compare = opt_compareFn || goog.array.defaultCompare; + var l = Math.min(arr1.length, arr2.length); + for (var i = 0; i < l; i++) { + var result = compare(arr1[i], arr2[i]); + if (result != 0) { + return result; + } + } + return goog.array.defaultCompare(arr1.length, arr2.length); +}; + + +/** + * Compares its two arguments for order, using the built in < and > + * operators. + * @param {*} a The first object to be compared. + * @param {*} b The second object to be compared. + * @return {number} A negative number, zero, or a positive number as the first + * argument is less than, equal to, or greater than the second. + */ +goog.array.defaultCompare = function(a, b) { + return a > b ? 1 : a < b ? -1 : 0; +}; + + +/** + * Compares its two arguments for equality, using the built in === operator. + * @param {*} a The first object to compare. + * @param {*} b The second object to compare. + * @return {boolean} True if the two arguments are equal, false otherwise. + */ +goog.array.defaultCompareEquality = function(a, b) { + return a === b; +}; + + +/** + * Inserts a value into a sorted array. The array is not modified if the + * value is already present. + * @param {Array.} array The array to modify. + * @param {T} value The object to insert. + * @param {?function(T,T):number=} opt_compareFn Optional comparison function by + * which the + * array is ordered. Should take 2 arguments to compare, and return a + * negative number, zero, or a positive number depending on whether the + * first argument is less than, equal to, or greater than the second. + * @return {boolean} True if an element was inserted. + * @template T + */ +goog.array.binaryInsert = function(array, value, opt_compareFn) { + var index = goog.array.binarySearch(array, value, opt_compareFn); + if (index < 0) { + goog.array.insertAt(array, value, -(index + 1)); + return true; + } + return false; +}; + + +/** + * Removes a value from a sorted array. + * @param {Array} array The array to modify. + * @param {*} value The object to remove. + * @param {Function=} opt_compareFn Optional comparison function by which the + * array is ordered. Should take 2 arguments to compare, and return a + * negative number, zero, or a positive number depending on whether the + * first argument is less than, equal to, or greater than the second. + * @return {boolean} True if an element was removed. + */ +goog.array.binaryRemove = function(array, value, opt_compareFn) { + var index = goog.array.binarySearch(array, value, opt_compareFn); + return (index >= 0) ? goog.array.removeAt(array, index) : false; +}; + + +/** + * Splits an array into disjoint buckets according to a splitting function. + * @param {Array.} array The array. + * @param {function(this:S, T,number,Array.):?} sorter Function to call for + * every element. This takes 3 arguments (the element, the index and the + * array) and must return a valid object key (a string, number, etc), or + * undefined, if that object should not be placed in a bucket. + * @param {S=} opt_obj The object to be used as the value of 'this' within + * sorter. + * @return {!Object} An object, with keys being all of the unique return values + * of sorter, and values being arrays containing the items for + * which the splitter returned that key. + * @template T,S + */ +goog.array.bucket = function(array, sorter, opt_obj) { + var buckets = {}; + + for (var i = 0; i < array.length; i++) { + var value = array[i]; + var key = sorter.call(opt_obj, value, i, array); + if (goog.isDef(key)) { + // Push the value to the right bucket, creating it if necessary. + var bucket = buckets[key] || (buckets[key] = []); + bucket.push(value); + } + } + + return buckets; +}; + + +/** + * Creates a new object built from the provided array and the key-generation + * function. + * @param {Array.|goog.array.ArrayLike} arr Array or array like object over + * which to iterate whose elements will be the values in the new object. + * @param {?function(this:S, T, number, ?) : string} keyFunc The function to + * call for every element. This function takes 3 arguments (the element, the + * index and the array) and should return a string that will be used as the + * key for the element in the new object. If the function returns the same + * key for more than one element, the value for that key is + * implementation-defined. + * @param {S=} opt_obj The object to be used as the value of 'this' + * within keyFunc. + * @return {!Object.} The new object. + * @template T,S + */ +goog.array.toObject = function(arr, keyFunc, opt_obj) { + var ret = {}; + goog.array.forEach(arr, function(element, index) { + ret[keyFunc.call(opt_obj, element, index, arr)] = element; + }); + return ret; +}; + + +/** + * Creates a range of numbers in an arithmetic progression. + * + * Range takes 1, 2, or 3 arguments: + *
+ * range(5) is the same as range(0, 5, 1) and produces [0, 1, 2, 3, 4]
+ * range(2, 5) is the same as range(2, 5, 1) and produces [2, 3, 4]
+ * range(-2, -5, -1) produces [-2, -3, -4]
+ * range(-2, -5, 1) produces [], since stepping by 1 wouldn't ever reach -5.
+ * 
+ * + * @param {number} startOrEnd The starting value of the range if an end argument + * is provided. Otherwise, the start value is 0, and this is the end value. + * @param {number=} opt_end The optional end value of the range. + * @param {number=} opt_step The step size between range values. Defaults to 1 + * if opt_step is undefined or 0. + * @return {!Array.} An array of numbers for the requested range. May be + * an empty array if adding the step would not converge toward the end + * value. + */ +goog.array.range = function(startOrEnd, opt_end, opt_step) { + var array = []; + var start = 0; + var end = startOrEnd; + var step = opt_step || 1; + if (opt_end !== undefined) { + start = startOrEnd; + end = opt_end; + } + + if (step * (end - start) < 0) { + // Sign mismatch: start + step will never reach the end value. + return []; + } + + if (step > 0) { + for (var i = start; i < end; i += step) { + array.push(i); + } + } else { + for (var i = start; i > end; i += step) { + array.push(i); + } + } + return array; +}; + + +/** + * Returns an array consisting of the given value repeated N times. + * + * @param {*} value The value to repeat. + * @param {number} n The repeat count. + * @return {!Array} An array with the repeated value. + */ +goog.array.repeat = function(value, n) { + var array = []; + for (var i = 0; i < n; i++) { + array[i] = value; + } + return array; +}; + + +/** + * Returns an array consisting of every argument with all arrays + * expanded in-place recursively. + * + * @param {...*} var_args The values to flatten. + * @return {!Array} An array containing the flattened values. + */ +goog.array.flatten = function(var_args) { + var result = []; + for (var i = 0; i < arguments.length; i++) { + var element = arguments[i]; + if (goog.isArray(element)) { + result.push.apply(result, goog.array.flatten.apply(null, element)); + } else { + result.push(element); + } + } + return result; +}; + + +/** + * Rotates an array in-place. After calling this method, the element at + * index i will be the element previously at index (i - n) % + * array.length, for all values of i between 0 and array.length - 1, + * inclusive. + * + * For example, suppose list comprises [t, a, n, k, s]. After invoking + * rotate(array, 1) (or rotate(array, -4)), array will comprise [s, t, a, n, k]. + * + * @param {!Array.} array The array to rotate. + * @param {number} n The amount to rotate. + * @return {!Array.} The array. + * @template T + */ +goog.array.rotate = function(array, n) { + goog.asserts.assert(array.length != null); + + if (array.length) { + n %= array.length; + if (n > 0) { + goog.array.ARRAY_PROTOTYPE_.unshift.apply(array, array.splice(-n, n)); + } else if (n < 0) { + goog.array.ARRAY_PROTOTYPE_.push.apply(array, array.splice(0, -n)); + } + } + return array; +}; + + +/** + * Moves one item of an array to a new position keeping the order of the rest + * of the items. Example use case: keeping a list of JavaScript objects + * synchronized with the corresponding list of DOM elements after one of the + * elements has been dragged to a new position. + * @param {!(Array|Arguments|{length:number})} arr The array to modify. + * @param {number} fromIndex Index of the item to move between 0 and + * {@code arr.length - 1}. + * @param {number} toIndex Target index between 0 and {@code arr.length - 1}. + */ +goog.array.moveItem = function(arr, fromIndex, toIndex) { + goog.asserts.assert(fromIndex >= 0 && fromIndex < arr.length); + goog.asserts.assert(toIndex >= 0 && toIndex < arr.length); + // Remove 1 item at fromIndex. + var removedItems = goog.array.ARRAY_PROTOTYPE_.splice.call(arr, fromIndex, 1); + // Insert the removed item at toIndex. + goog.array.ARRAY_PROTOTYPE_.splice.call(arr, toIndex, 0, removedItems[0]); + // We don't use goog.array.insertAt and goog.array.removeAt, because they're + // significantly slower than splice. +}; + + +/** + * Creates a new array for which the element at position i is an array of the + * ith element of the provided arrays. The returned array will only be as long + * as the shortest array provided; additional values are ignored. For example, + * the result of zipping [1, 2] and [3, 4, 5] is [[1,3], [2, 4]]. + * + * This is similar to the zip() function in Python. See {@link + * http://docs.python.org/library/functions.html#zip} + * + * @param {...!goog.array.ArrayLike} var_args Arrays to be combined. + * @return {!Array.} A new array of arrays created from provided arrays. + */ +goog.array.zip = function(var_args) { + if (!arguments.length) { + return []; + } + var result = []; + for (var i = 0; true; i++) { + var value = []; + for (var j = 0; j < arguments.length; j++) { + var arr = arguments[j]; + // If i is larger than the array length, this is the shortest array. + if (i >= arr.length) { + return result; + } + value.push(arr[i]); + } + result.push(value); + } +}; + + +/** + * Shuffles the values in the specified array using the Fisher-Yates in-place + * shuffle (also known as the Knuth Shuffle). By default, calls Math.random() + * and so resets the state of that random number generator. Similarly, may reset + * the state of the any other specified random number generator. + * + * Runtime: O(n) + * + * @param {!Array} arr The array to be shuffled. + * @param {function():number=} opt_randFn Optional random function to use for + * shuffling. + * Takes no arguments, and returns a random number on the interval [0, 1). + * Defaults to Math.random() using JavaScript's built-in Math library. + */ +goog.array.shuffle = function(arr, opt_randFn) { + var randFn = opt_randFn || Math.random; + + for (var i = arr.length - 1; i > 0; i--) { + // Choose a random array index in [0, i] (inclusive with i). + var j = Math.floor(randFn() * (i + 1)); + + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } +}; diff --git a/float-no-zero/closure-library/closure/goog/asserts/asserts.js b/float-no-zero/closure-library/closure/goog/asserts/asserts.js new file mode 100644 index 0000000000..4494526dce --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/asserts/asserts.js @@ -0,0 +1,293 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilities to check the preconditions, postconditions and + * invariants runtime. + * + * Methods in this package should be given special treatment by the compiler + * for type-inference. For example, goog.asserts.assert(foo) + * will restrict foo to a truthy value. + * + * The compiler has an option to disable asserts. So code like: + * + * var x = goog.asserts.assert(foo()); goog.asserts.assert(bar()); + * + * will be transformed into: + * + * var x = foo(); + * + * The compiler will leave in foo() (because its return value is used), + * but it will remove bar() because it assumes it does not have side-effects. + * + */ + +goog.provide('goog.asserts'); +goog.provide('goog.asserts.AssertionError'); + +goog.require('goog.debug.Error'); +goog.require('goog.string'); + + +/** + * @define {boolean} Whether to strip out asserts or to leave them in. + */ +goog.define('goog.asserts.ENABLE_ASSERTS', goog.DEBUG); + + + +/** + * Error object for failed assertions. + * @param {string} messagePattern The pattern that was used to form message. + * @param {!Array.<*>} messageArgs The items to substitute into the pattern. + * @constructor + * @extends {goog.debug.Error} + */ +goog.asserts.AssertionError = function(messagePattern, messageArgs) { + messageArgs.unshift(messagePattern); + goog.debug.Error.call(this, goog.string.subs.apply(null, messageArgs)); + // Remove the messagePattern afterwards to avoid permenantly modifying the + // passed in array. + messageArgs.shift(); + + /** + * The message pattern used to format the error message. Error handlers can + * use this to uniquely identify the assertion. + * @type {string} + */ + this.messagePattern = messagePattern; +}; +goog.inherits(goog.asserts.AssertionError, goog.debug.Error); + + +/** @override */ +goog.asserts.AssertionError.prototype.name = 'AssertionError'; + + +/** + * Throws an exception with the given message and "Assertion failed" prefixed + * onto it. + * @param {string} defaultMessage The message to use if givenMessage is empty. + * @param {Array.<*>} defaultArgs The substitution arguments for defaultMessage. + * @param {string|undefined} givenMessage Message supplied by the caller. + * @param {Array.<*>} givenArgs The substitution arguments for givenMessage. + * @throws {goog.asserts.AssertionError} When the value is not a number. + * @private + */ +goog.asserts.doAssertFailure_ = + function(defaultMessage, defaultArgs, givenMessage, givenArgs) { + var message = 'Assertion failed'; + if (givenMessage) { + message += ': ' + givenMessage; + var args = givenArgs; + } else if (defaultMessage) { + message += ': ' + defaultMessage; + args = defaultArgs; + } + // The '' + works around an Opera 10 bug in the unit tests. Without it, + // a stack trace is added to var message above. With this, a stack trace is + // not added until this line (it causes the extra garbage to be added after + // the assertion message instead of in the middle of it). + throw new goog.asserts.AssertionError('' + message, args || []); +}; + + +/** + * Checks if the condition evaluates to true if goog.asserts.ENABLE_ASSERTS is + * true. + * @param {*} condition The condition to check. + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @return {*} The value of the condition. + * @throws {goog.asserts.AssertionError} When the condition evaluates to false. + */ +goog.asserts.assert = function(condition, opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS && !condition) { + goog.asserts.doAssertFailure_('', null, opt_message, + Array.prototype.slice.call(arguments, 2)); + } + return condition; +}; + + +/** + * Fails if goog.asserts.ENABLE_ASSERTS is true. This function is useful in case + * when we want to add a check in the unreachable area like switch-case + * statement: + * + *
+ *  switch(type) {
+ *    case FOO: doSomething(); break;
+ *    case BAR: doSomethingElse(); break;
+ *    default: goog.assert.fail('Unrecognized type: ' + type);
+ *      // We have only 2 types - "default:" section is unreachable code.
+ *  }
+ * 
+ * + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @throws {goog.asserts.AssertionError} Failure. + */ +goog.asserts.fail = function(opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS) { + throw new goog.asserts.AssertionError( + 'Failure' + (opt_message ? ': ' + opt_message : ''), + Array.prototype.slice.call(arguments, 1)); + } +}; + + +/** + * Checks if the value is a number if goog.asserts.ENABLE_ASSERTS is true. + * @param {*} value The value to check. + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @return {number} The value, guaranteed to be a number when asserts enabled. + * @throws {goog.asserts.AssertionError} When the value is not a number. + */ +goog.asserts.assertNumber = function(value, opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS && !goog.isNumber(value)) { + goog.asserts.doAssertFailure_('Expected number but got %s: %s.', + [goog.typeOf(value), value], opt_message, + Array.prototype.slice.call(arguments, 2)); + } + return /** @type {number} */ (value); +}; + + +/** + * Checks if the value is a string if goog.asserts.ENABLE_ASSERTS is true. + * @param {*} value The value to check. + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @return {string} The value, guaranteed to be a string when asserts enabled. + * @throws {goog.asserts.AssertionError} When the value is not a string. + */ +goog.asserts.assertString = function(value, opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS && !goog.isString(value)) { + goog.asserts.doAssertFailure_('Expected string but got %s: %s.', + [goog.typeOf(value), value], opt_message, + Array.prototype.slice.call(arguments, 2)); + } + return /** @type {string} */ (value); +}; + + +/** + * Checks if the value is a function if goog.asserts.ENABLE_ASSERTS is true. + * @param {*} value The value to check. + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @return {!Function} The value, guaranteed to be a function when asserts + * enabled. + * @throws {goog.asserts.AssertionError} When the value is not a function. + */ +goog.asserts.assertFunction = function(value, opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS && !goog.isFunction(value)) { + goog.asserts.doAssertFailure_('Expected function but got %s: %s.', + [goog.typeOf(value), value], opt_message, + Array.prototype.slice.call(arguments, 2)); + } + return /** @type {!Function} */ (value); +}; + + +/** + * Checks if the value is an Object if goog.asserts.ENABLE_ASSERTS is true. + * @param {*} value The value to check. + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @return {!Object} The value, guaranteed to be a non-null object. + * @throws {goog.asserts.AssertionError} When the value is not an object. + */ +goog.asserts.assertObject = function(value, opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS && !goog.isObject(value)) { + goog.asserts.doAssertFailure_('Expected object but got %s: %s.', + [goog.typeOf(value), value], + opt_message, Array.prototype.slice.call(arguments, 2)); + } + return /** @type {!Object} */ (value); +}; + + +/** + * Checks if the value is an Array if goog.asserts.ENABLE_ASSERTS is true. + * @param {*} value The value to check. + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @return {!Array} The value, guaranteed to be a non-null array. + * @throws {goog.asserts.AssertionError} When the value is not an array. + */ +goog.asserts.assertArray = function(value, opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS && !goog.isArray(value)) { + goog.asserts.doAssertFailure_('Expected array but got %s: %s.', + [goog.typeOf(value), value], opt_message, + Array.prototype.slice.call(arguments, 2)); + } + return /** @type {!Array} */ (value); +}; + + +/** + * Checks if the value is a boolean if goog.asserts.ENABLE_ASSERTS is true. + * @param {*} value The value to check. + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @return {boolean} The value, guaranteed to be a boolean when asserts are + * enabled. + * @throws {goog.asserts.AssertionError} When the value is not a boolean. + */ +goog.asserts.assertBoolean = function(value, opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS && !goog.isBoolean(value)) { + goog.asserts.doAssertFailure_('Expected boolean but got %s: %s.', + [goog.typeOf(value), value], opt_message, + Array.prototype.slice.call(arguments, 2)); + } + return /** @type {boolean} */ (value); +}; + + +/** + * Checks if the value is an instance of the user-defined type if + * goog.asserts.ENABLE_ASSERTS is true. + * + * The compiler may tighten the type returned by this function. + * + * @param {*} value The value to check. + * @param {function(new: T, ...)} type A user-defined constructor. + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @throws {goog.asserts.AssertionError} When the value is not an instance of + * type. + * @return {!T} + * @template T + */ +goog.asserts.assertInstanceof = function(value, type, opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS && !(value instanceof type)) { + goog.asserts.doAssertFailure_('instanceof check failed.', null, + opt_message, Array.prototype.slice.call(arguments, 3)); + } + return value; +}; + + +/** + * Checks that no enumerable keys are present in Object.prototype. Such keys + * would break most code that use {@code for (var ... in ...)} loops. + */ +goog.asserts.assertObjectPrototypeIsIntact = function() { + for (var key in Object.prototype) { + goog.asserts.fail(key + ' should not be enumerable in Object.prototype.'); + } +}; diff --git a/float-no-zero/closure-library/closure/goog/async/animationdelay.js b/float-no-zero/closure-library/closure/goog/async/animationdelay.js new file mode 100644 index 0000000000..e617eb0daf --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/async/animationdelay.js @@ -0,0 +1,270 @@ +// Copyright 2012 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview A delayed callback that pegs to the next animation frame + * instead of a user-configurable timeout. + * + */ + +goog.provide('goog.async.AnimationDelay'); + +goog.require('goog.Disposable'); +goog.require('goog.events'); +goog.require('goog.functions'); + + + +// TODO(nicksantos): Should we factor out the common code between this and +// goog.async.Delay? I'm not sure if there's enough code for this to really +// make sense. Subclassing seems like the wrong approach for a variety of +// reasons. Maybe there should be a common interface? + + + +/** + * A delayed callback that pegs to the next animation frame + * instead of a user configurable timeout. By design, this should have + * the same interface as goog.async.Delay. + * + * Uses requestAnimationFrame and friends when available, but falls + * back to a timeout of goog.async.AnimationDelay.TIMEOUT. + * + * For more on requestAnimationFrame and how you can use it to create smoother + * animations, see: + * @see http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + * + * @param {function(number)} listener Function to call when the delay completes. + * Will be passed the timestamp when it's called, in unix ms. + * @param {Window=} opt_window The window object to execute the delay in. + * Defaults to the global object. + * @param {Object=} opt_handler The object scope to invoke the function in. + * @constructor + * @extends {goog.Disposable} + */ +goog.async.AnimationDelay = function(listener, opt_window, opt_handler) { + goog.base(this); + + /** + * The function that will be invoked after a delay. + * @type {function(number)} + * @private + */ + this.listener_ = listener; + + /** + * The object context to invoke the callback in. + * @type {Object|undefined} + * @private + */ + this.handler_ = opt_handler; + + /** + * @type {Window} + * @private + */ + this.win_ = opt_window || window; + + /** + * Cached callback function invoked when the delay finishes. + * @type {function()} + * @private + */ + this.callback_ = goog.bind(this.doAction_, this); +}; +goog.inherits(goog.async.AnimationDelay, goog.Disposable); + + +/** + * Identifier of the active delay timeout, or event listener, + * or null when inactive. + * @type {goog.events.Key|number|null} + * @private + */ +goog.async.AnimationDelay.prototype.id_ = null; + + +/** + * If we're using dom listeners. + * @type {?boolean} + * @private + */ +goog.async.AnimationDelay.prototype.usingListeners_ = false; + + +/** + * Default wait timeout for animations (in milliseconds). Only used for timed + * animation, which uses a timer (setTimeout) to schedule animation. + * + * @type {number} + * @const + */ +goog.async.AnimationDelay.TIMEOUT = 20; + + +/** + * Name of event received from the requestAnimationFrame in Firefox. + * + * @type {string} + * @const + * @private + */ +goog.async.AnimationDelay.MOZ_BEFORE_PAINT_EVENT_ = 'MozBeforePaint'; + + +/** + * Starts the delay timer. The provided listener function will be called + * before the next animation frame. + */ +goog.async.AnimationDelay.prototype.start = function() { + this.stop(); + this.usingListeners_ = false; + + var raf = this.getRaf_(); + var cancelRaf = this.getCancelRaf_(); + if (raf && !cancelRaf && this.win_.mozRequestAnimationFrame) { + // Because Firefox (Gecko) runs animation in separate threads, it also saves + // time by running the requestAnimationFrame callbacks in that same thread. + // Sadly this breaks the assumption of implicit thread-safety in JS, and can + // thus create thread-based inconsistencies on counters etc. + // + // Calling cycleAnimations_ using the MozBeforePaint event instead of as + // callback fixes this. + // + // Trigger this condition only if the mozRequestAnimationFrame is available, + // but not the W3C requestAnimationFrame function (as in draft) or the + // equivalent cancel functions. + this.id_ = goog.events.listen( + this.win_, + goog.async.AnimationDelay.MOZ_BEFORE_PAINT_EVENT_, + this.callback_); + this.win_.mozRequestAnimationFrame(null); + this.usingListeners_ = true; + } else if (raf && cancelRaf) { + this.id_ = raf.call(this.win_, this.callback_); + } else { + this.id_ = this.win_.setTimeout( + // Prior to Firefox 13, Gecko passed a non-standard parameter + // to the callback that we want to ignore. + goog.functions.lock(this.callback_), + goog.async.AnimationDelay.TIMEOUT); + } +}; + + +/** + * Stops the delay timer if it is active. No action is taken if the timer is not + * in use. + */ +goog.async.AnimationDelay.prototype.stop = function() { + if (this.isActive()) { + var raf = this.getRaf_(); + var cancelRaf = this.getCancelRaf_(); + if (raf && !cancelRaf && this.win_.mozRequestAnimationFrame) { + goog.events.unlistenByKey(this.id_); + } else if (raf && cancelRaf) { + cancelRaf.call(this.win_, /** @type {number} */ (this.id_)); + } else { + this.win_.clearTimeout(/** @type {number} */ (this.id_)); + } + } + this.id_ = null; +}; + + +/** + * Fires delay's action even if timer has already gone off or has not been + * started yet; guarantees action firing. Stops the delay timer. + */ +goog.async.AnimationDelay.prototype.fire = function() { + this.stop(); + this.doAction_(); +}; + + +/** + * Fires delay's action only if timer is currently active. Stops the delay + * timer. + */ +goog.async.AnimationDelay.prototype.fireIfActive = function() { + if (this.isActive()) { + this.fire(); + } +}; + + +/** + * @return {boolean} True if the delay is currently active, false otherwise. + */ +goog.async.AnimationDelay.prototype.isActive = function() { + return this.id_ != null; +}; + + +/** + * Invokes the callback function after the delay successfully completes. + * @private + */ +goog.async.AnimationDelay.prototype.doAction_ = function() { + if (this.usingListeners_ && this.id_) { + goog.events.unlistenByKey(this.id_); + } + this.id_ = null; + + // We are not using the timestamp returned by requestAnimationFrame + // because it may be either a Date.now-style time or a + // high-resolution time (depending on browser implementation). Using + // goog.now() will ensure that the timestamp used is consistent and + // compatible with goog.fx.Animation. + this.listener_.call(this.handler_, goog.now()); +}; + + +/** @override */ +goog.async.AnimationDelay.prototype.disposeInternal = function() { + this.stop(); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @return {?function(function(number)): number} The requestAnimationFrame + * function, or null if not available on this browser. + * @private + */ +goog.async.AnimationDelay.prototype.getRaf_ = function() { + var win = this.win_; + return win.requestAnimationFrame || + win.webkitRequestAnimationFrame || + win.mozRequestAnimationFrame || + win.oRequestAnimationFrame || + win.msRequestAnimationFrame || + null; +}; + + +/** + * @return {?function(number): number} The cancelAnimationFrame function, + * or null if not available on this browser. + * @private + */ +goog.async.AnimationDelay.prototype.getCancelRaf_ = function() { + var win = this.win_; + return win.cancelRequestAnimationFrame || + win.webkitCancelRequestAnimationFrame || + win.mozCancelRequestAnimationFrame || + win.oCancelRequestAnimationFrame || + win.msCancelRequestAnimationFrame || + null; +}; diff --git a/float-no-zero/closure-library/closure/goog/async/conditionaldelay.js b/float-no-zero/closure-library/closure/goog/async/conditionaldelay.js new file mode 100644 index 0000000000..1e3897579f --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/async/conditionaldelay.js @@ -0,0 +1,235 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Defines a class useful for handling functions that must be + * invoked later when some condition holds. Examples include deferred function + * calls that return a boolean flag whether it succedeed or not. + * + * Example: + * + * function deferred() { + * var succeeded = false; + * // ... custom code + * return succeeded; + * } + * + * var deferredCall = new goog.async.ConditionalDelay(deferred); + * deferredCall.onSuccess = function() { + * alert('Success: The deferred function has been successfully executed.'); + * } + * deferredCall.onFailure = function() { + * alert('Failure: Time limit exceeded.'); + * } + * + * // Call the deferred() every 100 msec until it returns true, + * // or 5 seconds pass. + * deferredCall.start(100, 5000); + * + * // Stop the deferred function call (does nothing if it's not active). + * deferredCall.stop(); + * + */ + + +goog.provide('goog.async.ConditionalDelay'); + +goog.require('goog.Disposable'); +goog.require('goog.async.Delay'); + + + +/** + * A ConditionalDelay object invokes the associated function after a specified + * interval delay and checks its return value. If the function returns + * {@code true} the conditional delay is cancelled and {@see #onSuccess} + * is called. Otherwise this object keeps to invoke the deferred function until + * either it returns {@code true} or the timeout is exceeded. In the latter case + * the {@see #onFailure} method will be called. + * + * The interval duration and timeout can be specified each time the delay is + * started. Calling start on an active delay will reset the timer. + * + * @param {function():boolean} listener Function to call when the delay + * completes. Should return a value that type-converts to {@code true} if + * the call succeeded and this delay should be stopped. + * @param {Object=} opt_handler The object scope to invoke the function in. + * @constructor + * @extends {goog.Disposable} + */ +goog.async.ConditionalDelay = function(listener, opt_handler) { + goog.Disposable.call(this); + + /** + * The function that will be invoked after a delay. + * @type {function():boolean} + * @private + */ + this.listener_ = listener; + + /** + * The object context to invoke the callback in. + * @type {Object|undefined} + * @private + */ + this.handler_ = opt_handler; + + /** + * The underlying goog.async.Delay delegate object. + * @type {goog.async.Delay} + * @private + */ + this.delay_ = new goog.async.Delay( + goog.bind(this.onTick_, this), 0 /*interval*/, this /*scope*/); +}; +goog.inherits(goog.async.ConditionalDelay, goog.Disposable); + + +/** + * The delay interval in milliseconds to between the calls to the callback. + * Note, that the callback may be invoked earlier than this interval if the + * timeout is exceeded. + * @type {number} + * @private + */ +goog.async.ConditionalDelay.prototype.interval_ = 0; + + +/** + * The timeout timestamp until which the delay is to be executed. + * A negative value means no timeout. + * @type {number} + * @private + */ +goog.async.ConditionalDelay.prototype.runUntil_ = 0; + + +/** + * True if the listener has been executed, and it returned {@code true}. + * @type {boolean} + * @private + */ +goog.async.ConditionalDelay.prototype.isDone_ = false; + + +/** @override */ +goog.async.ConditionalDelay.prototype.disposeInternal = function() { + this.delay_.dispose(); + delete this.listener_; + delete this.handler_; + goog.async.ConditionalDelay.superClass_.disposeInternal.call(this); +}; + + +/** + * Starts the delay timer. The provided listener function will be called + * repeatedly after the specified interval until the function returns + * {@code true} or the timeout is exceeded. Calling start on an active timer + * will stop the timer first. + * @param {number=} opt_interval The time interval between the function + * invocations (in milliseconds). Default is 0. + * @param {number=} opt_timeout The timeout interval (in milliseconds). Takes + * precedence over the {@code opt_interval}, i.e. if the timeout is less + * than the invocation interval, the function will be called when the + * timeout is exceeded. A negative value means no timeout. Default is 0. + */ +goog.async.ConditionalDelay.prototype.start = function(opt_interval, + opt_timeout) { + this.stop(); + this.isDone_ = false; + + var timeout = opt_timeout || 0; + this.interval_ = Math.max(opt_interval || 0, 0); + this.runUntil_ = timeout < 0 ? -1 : (goog.now() + timeout); + this.delay_.start( + timeout < 0 ? this.interval_ : Math.min(this.interval_, timeout)); +}; + + +/** + * Stops the delay timer if it is active. No action is taken if the timer is not + * in use. + */ +goog.async.ConditionalDelay.prototype.stop = function() { + this.delay_.stop(); +}; + + +/** + * @return {boolean} True if the delay is currently active, false otherwise. + */ +goog.async.ConditionalDelay.prototype.isActive = function() { + return this.delay_.isActive(); +}; + + +/** + * @return {boolean} True if the listener has been executed and returned + * {@code true} since the last call to {@see #start}. + */ +goog.async.ConditionalDelay.prototype.isDone = function() { + return this.isDone_; +}; + + +/** + * Called when the listener has been successfully executed and returned + * {@code true}. The {@see #isDone} method should return {@code true} by now. + * Designed for inheritance, should be overridden by subclasses or on the + * instances if they care. + */ +goog.async.ConditionalDelay.prototype.onSuccess = function() { + // Do nothing by default. +}; + + +/** + * Called when this delayed call is cancelled because the timeout has been + * exceeded, and the listener has never returned {@code true}. + * Designed for inheritance, should be overridden by subclasses or on the + * instances if they care. + */ +goog.async.ConditionalDelay.prototype.onFailure = function() { + // Do nothing by default. +}; + + +/** + * A callback function for the underlying {@code goog.async.Delay} object. When + * executed the listener function is called, and if it returns {@code true} + * the delay is stopped and the {@see #onSuccess} method is invoked. + * If the timeout is exceeded the delay is stopped and the + * {@see #onFailure} method is called. + * @private + */ +goog.async.ConditionalDelay.prototype.onTick_ = function() { + var successful = this.listener_.call(this.handler_); + if (successful) { + this.isDone_ = true; + this.onSuccess(); + } else { + // Try to reschedule the task. + if (this.runUntil_ < 0) { + // No timeout. + this.delay_.start(this.interval_); + } else { + var timeLeft = this.runUntil_ - goog.now(); + if (timeLeft <= 0) { + this.onFailure(); + } else { + this.delay_.start(Math.min(this.interval_, timeLeft)); + } + } + } +}; diff --git a/float-no-zero/closure-library/closure/goog/async/delay.js b/float-no-zero/closure-library/closure/goog/async/delay.js new file mode 100644 index 0000000000..3f3b262aef --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/async/delay.js @@ -0,0 +1,177 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Defines a class useful for handling functions that must be + * invoked after a delay, especially when that delay is frequently restarted. + * Examples include delaying before displaying a tooltip, menu hysteresis, + * idle timers, etc. + * @author brenneman@google.com (Shawn Brenneman) + * @see ../demos/timers.html + */ + + +goog.provide('goog.Delay'); +goog.provide('goog.async.Delay'); + +goog.require('goog.Disposable'); +goog.require('goog.Timer'); + + + +/** + * A Delay object invokes the associated function after a specified delay. The + * interval duration can be specified once in the constructor, or can be defined + * each time the delay is started. Calling start on an active delay will reset + * the timer. + * + * @param {Function} listener Function to call when the delay completes. + * @param {number=} opt_interval The default length of the invocation delay (in + * milliseconds). + * @param {Object=} opt_handler The object scope to invoke the function in. + * @constructor + * @extends {goog.Disposable} + */ +goog.async.Delay = function(listener, opt_interval, opt_handler) { + goog.Disposable.call(this); + + /** + * The function that will be invoked after a delay. + * @type {Function} + * @private + */ + this.listener_ = listener; + + /** + * The default amount of time to delay before invoking the callback. + * @type {number} + * @private + */ + this.interval_ = opt_interval || 0; + + /** + * The object context to invoke the callback in. + * @type {Object|undefined} + * @private + */ + this.handler_ = opt_handler; + + + /** + * Cached callback function invoked when the delay finishes. + * @type {Function} + * @private + */ + this.callback_ = goog.bind(this.doAction_, this); +}; +goog.inherits(goog.async.Delay, goog.Disposable); + + + +/** + * A deprecated alias. + * @deprecated Use goog.async.Delay instead. + * @constructor + */ +goog.Delay = goog.async.Delay; + + +/** + * Identifier of the active delay timeout, or 0 when inactive. + * @type {number} + * @private + */ +goog.async.Delay.prototype.id_ = 0; + + +/** + * Disposes of the object, cancelling the timeout if it is still outstanding and + * removing all object references. + * @override + * @protected + */ +goog.async.Delay.prototype.disposeInternal = function() { + goog.async.Delay.superClass_.disposeInternal.call(this); + this.stop(); + delete this.listener_; + delete this.handler_; +}; + + +/** + * Starts the delay timer. The provided listener function will be called after + * the specified interval. Calling start on an active timer will reset the + * delay interval. + * @param {number=} opt_interval If specified, overrides the object's default + * interval with this one (in milliseconds). + */ +goog.async.Delay.prototype.start = function(opt_interval) { + this.stop(); + this.id_ = goog.Timer.callOnce( + this.callback_, + goog.isDef(opt_interval) ? opt_interval : this.interval_); +}; + + +/** + * Stops the delay timer if it is active. No action is taken if the timer is not + * in use. + */ +goog.async.Delay.prototype.stop = function() { + if (this.isActive()) { + goog.Timer.clear(this.id_); + } + this.id_ = 0; +}; + + +/** + * Fires delay's action even if timer has already gone off or has not been + * started yet; guarantees action firing. Stops the delay timer. + */ +goog.async.Delay.prototype.fire = function() { + this.stop(); + this.doAction_(); +}; + + +/** + * Fires delay's action only if timer is currently active. Stops the delay + * timer. + */ +goog.async.Delay.prototype.fireIfActive = function() { + if (this.isActive()) { + this.fire(); + } +}; + + +/** + * @return {boolean} True if the delay is currently active, false otherwise. + */ +goog.async.Delay.prototype.isActive = function() { + return this.id_ != 0; +}; + + +/** + * Invokes the callback function after the delay successfully completes. + * @private + */ +goog.async.Delay.prototype.doAction_ = function() { + this.id_ = 0; + if (this.listener_) { + this.listener_.call(this.handler_); + } +}; diff --git a/float-no-zero/closure-library/closure/goog/async/nexttick.js b/float-no-zero/closure-library/closure/goog/async/nexttick.js new file mode 100644 index 0000000000..5f8b895e69 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/async/nexttick.js @@ -0,0 +1,174 @@ +// Copyright 2013 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Provides a function to schedule running a function as soon + * as possible after the current JS execution stops and yields to the event + * loop. + * + */ + +goog.provide('goog.async.nextTick'); + +goog.require('goog.debug.entryPointRegistry'); +goog.require('goog.functions'); + + +/** + * Fires the provided callbacks as soon as possible after the current JS + * execution context. setTimeout(…, 0) always takes at least 5ms for legacy + * reasons. + * @param {function()} callback Callback function to fire as soon as possible. + * @param {Object=} opt_context Object in whose scope to call the listener. + */ +goog.async.nextTick = function(callback, opt_context) { + var cb = callback; + if (opt_context) { + cb = goog.bind(callback, opt_context); + } + cb = goog.async.nextTick.wrapCallback_(cb); + // Introduced and currently only supported by IE10. + if (goog.isFunction(goog.global.setImmediate)) { + goog.global.setImmediate(cb); + return; + } + // Look for and cache the custom fallback version of setImmediate. + if (!goog.async.nextTick.setImmediate_) { + goog.async.nextTick.setImmediate_ = + goog.async.nextTick.getSetImmediateEmulator_(); + } + goog.async.nextTick.setImmediate_(cb); +}; + + +/** + * Cache for the setImmediate implementation. + * @type {function(function())} + * @private + */ +goog.async.nextTick.setImmediate_; + + +/** + * Determines the best possible implementation to run a function as soon as + * the JS event loop is idle. + * @return {function(function())} The "setImmediate" implementation. + * @private + */ +goog.async.nextTick.getSetImmediateEmulator_ = function() { + // Create a private message channel and use it to postMessage empty messages + // to ourselves. + var Channel = goog.global['MessageChannel']; + // If MessageChannel is not available and we are in a browser, implement + // an iframe based polyfill in browsers that have postMessage and + // document.addEventListener. The latter excludes IE8 because it has a + // synchronous postMessage implementation. + if (typeof Channel === 'undefined' && typeof window !== 'undefined' && + window.postMessage && window.addEventListener) { + /** @constructor */ + Channel = function() { + // Make an empty, invisible iframe. + var iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + iframe.src = ''; + document.body.appendChild(iframe); + var win = iframe.contentWindow; + var doc = win.document; + doc.open(); + doc.write(''); + doc.close(); + var message = 'callImmediate' + Math.random(); + var origin = win.location.protocol + '//' + win.location.host; + var onmessage = goog.bind(function(e) { + // Validate origin and message to make sure that this message was + // intended for us. + if (e.origin != origin && e.data != message) { + return; + } + this['port1'].onmessage(); + }, this); + win.addEventListener('message', onmessage, false); + this['port1'] = {}; + this['port2'] = { + postMessage: function() { + win.postMessage(message, origin); + } + }; + }; + } + if (typeof Channel !== 'undefined') { + var channel = new Channel(); + // Use a fifo linked list to call callbacks in the right order. + var head = {}; + var tail = head; + channel['port1'].onmessage = function() { + head = head.next; + var cb = head.cb; + head.cb = null; + cb(); + }; + return function(cb) { + tail.next = { + cb: cb + }; + tail = tail.next; + channel['port2'].postMessage(0); + }; + } + // Implementation for IE6-8: Script elements fire an asynchronous + // onreadystatechange event when inserted into the DOM. + if (typeof document !== 'undefined' && 'onreadystatechange' in + document.createElement('script')) { + return function(cb) { + var script = document.createElement('script'); + script.onreadystatechange = function() { + // Clean up and call the callback. + script.onreadystatechange = null; + script.parentNode.removeChild(script); + script = null; + cb(); + cb = null; + }; + document.documentElement.appendChild(script); + }; + } + // Fall back to setTimeout with 0. In browsers this creates a delay of 5ms + // or more. + return function(cb) { + goog.global.setTimeout(cb, 0); + }; +}; + + +/** + * Helper function that is overrided to protect callbacks with entry point + * monitor if the application monitors entry points. + * @param {function()} callback Callback function to fire as soon as possible. + * @return {function()} The wrapped callback. + * @private + */ +goog.async.nextTick.wrapCallback_ = goog.functions.identity; + + +// Register the callback function as an entry point, so that it can be +// monitored for exception handling, etc. This has to be done in this file +// since it requires special code to handle all browsers. +goog.debug.entryPointRegistry.register( + /** + * @param {function(!Function): !Function} transformer The transforming + * function. + */ + function(transformer) { + goog.async.nextTick.wrapCallback_ = transformer; + }); diff --git a/float-no-zero/closure-library/closure/goog/async/throttle.js b/float-no-zero/closure-library/closure/goog/async/throttle.js new file mode 100644 index 0000000000..c8ece971bd --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/async/throttle.js @@ -0,0 +1,189 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Definition of the goog.async.Throttle class. + * + * @see ../demos/timers.html + */ + +goog.provide('goog.Throttle'); +goog.provide('goog.async.Throttle'); + +goog.require('goog.Disposable'); +goog.require('goog.Timer'); + + + +/** + * Throttle will perform an action that is passed in no more than once + * per interval (specified in milliseconds). If it gets multiple signals + * to perform the action while it is waiting, it will only perform the action + * once at the end of the interval. + * @param {Function} listener Function to callback when the action is triggered. + * @param {number} interval Interval over which to throttle. The handler can + * only be called once per interval. + * @param {Object=} opt_handler Object in whose scope to call the listener. + * @constructor + * @extends {goog.Disposable} + */ +goog.async.Throttle = function(listener, interval, opt_handler) { + goog.Disposable.call(this); + + /** + * Function to callback + * @type {Function} + * @private + */ + this.listener_ = listener; + + /** + * Interval for the throttle time + * @type {number} + * @private + */ + this.interval_ = interval; + + /** + * "this" context for the listener + * @type {Object|undefined} + * @private + */ + this.handler_ = opt_handler; + + /** + * Cached callback function invoked after the throttle timeout completes + * @type {Function} + * @private + */ + this.callback_ = goog.bind(this.onTimer_, this); +}; +goog.inherits(goog.async.Throttle, goog.Disposable); + + + +/** + * A deprecated alias. + * @deprecated Use goog.async.Throttle instead. + * @constructor + */ +goog.Throttle = goog.async.Throttle; + + +/** + * Indicates that the action is pending and needs to be fired. + * @type {boolean} + * @private + */ +goog.async.Throttle.prototype.shouldFire_ = false; + + +/** + * Indicates the count of nested pauses currently in effect on the throttle. + * When this count is not zero, fired actions will be postponed until the + * throttle is resumed enough times to drop the pause count to zero. + * @type {number} + * @private + */ +goog.async.Throttle.prototype.pauseCount_ = 0; + + +/** + * Timer for scheduling the next callback + * @type {?number} + * @private + */ +goog.async.Throttle.prototype.timer_ = null; + + +/** + * Notifies the throttle that the action has happened. It will throttle the call + * so that the callback is not called too often according to the interval + * parameter passed to the constructor. + */ +goog.async.Throttle.prototype.fire = function() { + if (!this.timer_ && !this.pauseCount_) { + this.doAction_(); + } else { + this.shouldFire_ = true; + } +}; + + +/** + * Cancels any pending action callback. The throttle can be restarted by + * calling {@link #fire}. + */ +goog.async.Throttle.prototype.stop = function() { + if (this.timer_) { + goog.Timer.clear(this.timer_); + this.timer_ = null; + this.shouldFire_ = false; + } +}; + + +/** + * Pauses the throttle. All pending and future action callbacks will be + * delayed until the throttle is resumed. Pauses can be nested. + */ +goog.async.Throttle.prototype.pause = function() { + this.pauseCount_++; +}; + + +/** + * Resumes the throttle. If doing so drops the pausing count to zero, pending + * action callbacks will be executed as soon as possible, but still no sooner + * than an interval's delay after the previous call. Future action callbacks + * will be executed as normal. + */ +goog.async.Throttle.prototype.resume = function() { + this.pauseCount_--; + if (!this.pauseCount_ && this.shouldFire_ && !this.timer_) { + this.shouldFire_ = false; + this.doAction_(); + } +}; + + +/** @override */ +goog.async.Throttle.prototype.disposeInternal = function() { + goog.async.Throttle.superClass_.disposeInternal.call(this); + this.stop(); +}; + + +/** + * Handler for the timer to fire the throttle + * @private + */ +goog.async.Throttle.prototype.onTimer_ = function() { + this.timer_ = null; + + if (this.shouldFire_ && !this.pauseCount_) { + this.shouldFire_ = false; + this.doAction_(); + } +}; + + +/** + * Calls the callback + * @private + */ +goog.async.Throttle.prototype.doAction_ = function() { + this.timer_ = goog.Timer.callOnce(this.callback_, this.interval_); + this.listener_.call(this.handler_); +}; diff --git a/float-no-zero/closure-library/closure/goog/base.js b/float-no-zero/closure-library/closure/goog/base.js new file mode 100644 index 0000000000..bd82e88de5 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/base.js @@ -0,0 +1,1593 @@ +// Copyright 2006 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Bootstrap for the Google JS Library (Closure). + * + * In uncompiled mode base.js will write out Closure's deps file, unless the + * global CLOSURE_NO_DEPS is set to true. This allows projects to + * include their own deps file(s) from different locations. + * + * + * @provideGoog + */ + + +/** + * @define {boolean} Overridden to true by the compiler when --closure_pass + * or --mark_as_compiled is specified. + */ +var COMPILED = false; + + +/** + * Base namespace for the Closure library. Checks to see goog is already + * defined in the current scope before assigning to prevent clobbering if + * base.js is loaded more than once. + * + * @const + */ +var goog = goog || {}; + + +/** + * Reference to the global context. In most cases this will be 'window'. + */ +goog.global = this; + + +/** + * A hook for overriding the define values in uncompiled mode. + * + * In uncompiled mode, {@code CLOSURE_DEFINES} may be defined before loading + * base.js. If a key is defined in {@code CLOSURE_DEFINES}, {@code goog.define} + * will use the value instead of the default value. This allows flags to be + * overwritten without compilation (this is normally accomplished with the + * compiler's "define" flag). + * + * Example: + *
+ *   var CLOSURE_DEFINES = {'goog.DEBUG', false};
+ * 
+ * + * @type {Object.|undefined} + */ +goog.global.CLOSURE_DEFINES; + + +/** + * Builds an object structure for the provided namespace path, ensuring that + * names that already exist are not overwritten. For example: + * "a.b.c" -> a = {};a.b={};a.b.c={}; + * Used by goog.provide and goog.exportSymbol. + * @param {string} name name of the object that this file defines. + * @param {*=} opt_object the object to expose at the end of the path. + * @param {Object=} opt_objectToExportTo The object to add the path to; default + * is |goog.global|. + * @private + */ +goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) { + var parts = name.split('.'); + var cur = opt_objectToExportTo || goog.global; + + // Internet Explorer exhibits strange behavior when throwing errors from + // methods externed in this manner. See the testExportSymbolExceptions in + // base_test.html for an example. + if (!(parts[0] in cur) && cur.execScript) { + cur.execScript('var ' + parts[0]); + } + + // Certain browsers cannot parse code in the form for((a in b); c;); + // This pattern is produced by the JSCompiler when it collapses the + // statement above into the conditional loop below. To prevent this from + // happening, use a for-loop and reserve the init logic as below. + + // Parentheses added to eliminate strict JS warning in Firefox. + for (var part; parts.length && (part = parts.shift());) { + if (!parts.length && opt_object !== undefined) { + // last part and we have an object; use it + cur[part] = opt_object; + } else if (cur[part]) { + cur = cur[part]; + } else { + cur = cur[part] = {}; + } + } +}; + + +/** + * Defines a named value. In uncompiled mode, the value is retreived from + * CLOSURE_DEFINES if the object is defined and has the property specified, + * and otherwise used the defined defaultValue. When compiled, the default + * can be overridden using compiler command-line options. + * + * @param {string} name The distinguished name to provide. + * @param {string|number|boolean} defaultValue + */ +goog.define = function(name, defaultValue) { + var value = defaultValue; + if (!COMPILED) { + if (goog.global.CLOSURE_DEFINES && Object.prototype.hasOwnProperty.call( + goog.global.CLOSURE_DEFINES, name)) { + value = goog.global.CLOSURE_DEFINES[name]; + } + } + goog.exportPath_(name, value); +}; + + +/** + * @define {boolean} DEBUG is provided as a convenience so that debugging code + * that should not be included in a production js_binary can be easily stripped + * by specifying --define goog.DEBUG=false to the JSCompiler. For example, most + * toString() methods should be declared inside an "if (goog.DEBUG)" conditional + * because they are generally used for debugging purposes and it is difficult + * for the JSCompiler to statically determine whether they are used. + */ +goog.DEBUG = true; + + +/** + * @define {string} LOCALE defines the locale being used for compilation. It is + * used to select locale specific data to be compiled in js binary. BUILD rule + * can specify this value by "--define goog.LOCALE=" as JSCompiler + * option. + * + * Take into account that the locale code format is important. You should use + * the canonical Unicode format with hyphen as a delimiter. Language must be + * lowercase, Language Script - Capitalized, Region - UPPERCASE. + * There are few examples: pt-BR, en, en-US, sr-Latin-BO, zh-Hans-CN. + * + * See more info about locale codes here: + * http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers + * + * For language codes you should use values defined by ISO 693-1. See it here + * http://www.w3.org/WAI/ER/IG/ert/iso639.htm. There is only one exception from + * this rule: the Hebrew language. For legacy reasons the old code (iw) should + * be used instead of the new code (he), see http://wiki/Main/IIISynonyms. + */ +goog.define('goog.LOCALE', 'en'); // default to en + + +/** + * @define {boolean} Whether this code is running on trusted sites. + * + * On untrusted sites, several native functions can be defined or overridden by + * external libraries like Prototype, Datejs, and JQuery and setting this flag + * to false forces closure to use its own implementations when possible. + * + * If your JavaScript can be loaded by a third party site and you are wary about + * relying on non-standard implementations, specify + * "--define goog.TRUSTED_SITE=false" to the JSCompiler. + */ +goog.define('goog.TRUSTED_SITE', true); + + +/** + * Creates object stubs for a namespace. The presence of one or more + * goog.provide() calls indicate that the file defines the given + * objects/namespaces. Build tools also scan for provide/require statements + * to discern dependencies, build dependency files (see deps.js), etc. + * @see goog.require + * @param {string} name Namespace provided by this file in the form + * "goog.package.part". + */ +goog.provide = function(name) { + if (!COMPILED) { + // Ensure that the same namespace isn't provided twice. This is intended + // to teach new developers that 'goog.provide' is effectively a variable + // declaration. And when JSCompiler transforms goog.provide into a real + // variable declaration, the compiled JS should work the same as the raw + // JS--even when the raw JS uses goog.provide incorrectly. + if (goog.isProvided_(name)) { + throw Error('Namespace "' + name + '" already declared.'); + } + delete goog.implicitNamespaces_[name]; + + var namespace = name; + while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) { + if (goog.getObjectByName(namespace)) { + break; + } + goog.implicitNamespaces_[namespace] = true; + } + } + + goog.exportPath_(name); +}; + + +/** + * Marks that the current file should only be used for testing, and never for + * live code in production. + * + * In the case of unit tests, the message may optionally be an exact namespace + * for the test (e.g. 'goog.stringTest'). The linter will then ignore the extra + * provide (if not explicitly defined in the code). + * + * @param {string=} opt_message Optional message to add to the error that's + * raised when used in production code. + */ +goog.setTestOnly = function(opt_message) { + if (COMPILED && !goog.DEBUG) { + opt_message = opt_message || ''; + throw Error('Importing test-only code into non-debug environment' + + opt_message ? ': ' + opt_message : '.'); + } +}; + + +if (!COMPILED) { + + /** + * Check if the given name has been goog.provided. This will return false for + * names that are available only as implicit namespaces. + * @param {string} name name of the object to look for. + * @return {boolean} Whether the name has been provided. + * @private + */ + goog.isProvided_ = function(name) { + return !goog.implicitNamespaces_[name] && !!goog.getObjectByName(name); + }; + + /** + * Namespaces implicitly defined by goog.provide. For example, + * goog.provide('goog.events.Event') implicitly declares that 'goog' and + * 'goog.events' must be namespaces. + * + * @type {Object} + * @private + */ + goog.implicitNamespaces_ = {}; +} + + +/** + * Returns an object based on its fully qualified external name. If you are + * using a compilation pass that renames property names beware that using this + * function will not find renamed properties. + * + * @param {string} name The fully qualified name. + * @param {Object=} opt_obj The object within which to look; default is + * |goog.global|. + * @return {?} The value (object or primitive) or, if not found, null. + */ +goog.getObjectByName = function(name, opt_obj) { + var parts = name.split('.'); + var cur = opt_obj || goog.global; + for (var part; part = parts.shift(); ) { + if (goog.isDefAndNotNull(cur[part])) { + cur = cur[part]; + } else { + return null; + } + } + return cur; +}; + + +/** + * Globalizes a whole namespace, such as goog or goog.lang. + * + * @param {Object} obj The namespace to globalize. + * @param {Object=} opt_global The object to add the properties to. + * @deprecated Properties may be explicitly exported to the global scope, but + * this should no longer be done in bulk. + */ +goog.globalize = function(obj, opt_global) { + var global = opt_global || goog.global; + for (var x in obj) { + global[x] = obj[x]; + } +}; + + +/** + * Adds a dependency from a file to the files it requires. + * @param {string} relPath The path to the js file. + * @param {Array} provides An array of strings with the names of the objects + * this file provides. + * @param {Array} requires An array of strings with the names of the objects + * this file requires. + */ +goog.addDependency = function(relPath, provides, requires) { + if (goog.DEPENDENCIES_ENABLED) { + var provide, require; + var path = relPath.replace(/\\/g, '/'); + var deps = goog.dependencies_; + for (var i = 0; provide = provides[i]; i++) { + deps.nameToPath[provide] = path; + if (!(path in deps.pathToNames)) { + deps.pathToNames[path] = {}; + } + deps.pathToNames[path][provide] = true; + } + for (var j = 0; require = requires[j]; j++) { + if (!(path in deps.requires)) { + deps.requires[path] = {}; + } + deps.requires[path][require] = true; + } + } +}; + + + + +// NOTE(nnaze): The debug DOM loader was included in base.js as an original way +// to do "debug-mode" development. The dependency system can sometimes be +// confusing, as can the debug DOM loader's asynchronous nature. +// +// With the DOM loader, a call to goog.require() is not blocking -- the script +// will not load until some point after the current script. If a namespace is +// needed at runtime, it needs to be defined in a previous script, or loaded via +// require() with its registered dependencies. +// User-defined namespaces may need their own deps file. See http://go/js_deps, +// http://go/genjsdeps, or, externally, DepsWriter. +// http://code.google.com/closure/library/docs/depswriter.html +// +// Because of legacy clients, the DOM loader can't be easily removed from +// base.js. Work is being done to make it disableable or replaceable for +// different environments (DOM-less JavaScript interpreters like Rhino or V8, +// for example). See bootstrap/ for more information. + + +/** + * @define {boolean} Whether to enable the debug loader. + * + * If enabled, a call to goog.require() will attempt to load the namespace by + * appending a script tag to the DOM (if the namespace has been registered). + * + * If disabled, goog.require() will simply assert that the namespace has been + * provided (and depend on the fact that some outside tool correctly ordered + * the script). + */ +goog.define('goog.ENABLE_DEBUG_LOADER', true); + + +/** + * Implements a system for the dynamic resolution of dependencies that works in + * parallel with the BUILD system. Note that all calls to goog.require will be + * stripped by the JSCompiler when the --closure_pass option is used. + * @see goog.provide + * @param {string} name Namespace to include (as was given in goog.provide()) in + * the form "goog.package.part". + */ +goog.require = function(name) { + + // If the object already exists we do not need do do anything. + // TODO(arv): If we start to support require based on file name this has to + // change. + // TODO(arv): If we allow goog.foo.* this has to change. + // TODO(arv): If we implement dynamic load after page load we should probably + // not remove this code for the compiled output. + if (!COMPILED) { + if (goog.isProvided_(name)) { + return; + } + + if (goog.ENABLE_DEBUG_LOADER) { + var path = goog.getPathFromDeps_(name); + if (path) { + goog.included_[path] = true; + goog.writeScripts_(); + return; + } + } + + var errorMessage = 'goog.require could not find: ' + name; + if (goog.global.console) { + goog.global.console['error'](errorMessage); + } + + + throw Error(errorMessage); + + } +}; + + +/** + * Path for included scripts. + * @type {string} + */ +goog.basePath = ''; + + +/** + * A hook for overriding the base path. + * @type {string|undefined} + */ +goog.global.CLOSURE_BASE_PATH; + + +/** + * Whether to write out Closure's deps file. By default, the deps are written. + * @type {boolean|undefined} + */ +goog.global.CLOSURE_NO_DEPS; + + +/** + * A function to import a single script. This is meant to be overridden when + * Closure is being run in non-HTML contexts, such as web workers. It's defined + * in the global scope so that it can be set before base.js is loaded, which + * allows deps.js to be imported properly. + * + * The function is passed the script source, which is a relative URI. It should + * return true if the script was imported, false otherwise. + */ +goog.global.CLOSURE_IMPORT_SCRIPT; + + +/** + * Null function used for default values of callbacks, etc. + * @return {void} Nothing. + */ +goog.nullFunction = function() {}; + + +/** + * The identity function. Returns its first argument. + * + * @param {*=} opt_returnValue The single value that will be returned. + * @param {...*} var_args Optional trailing arguments. These are ignored. + * @return {?} The first argument. We can't know the type -- just pass it along + * without type. + * @deprecated Use goog.functions.identity instead. + */ +goog.identityFunction = function(opt_returnValue, var_args) { + return opt_returnValue; +}; + + +/** + * When defining a class Foo with an abstract method bar(), you can do: + * Foo.prototype.bar = goog.abstractMethod + * + * Now if a subclass of Foo fails to override bar(), an error will be thrown + * when bar() is invoked. + * + * Note: This does not take the name of the function to override as an argument + * because that would make it more difficult to obfuscate our JavaScript code. + * + * @type {!Function} + * @throws {Error} when invoked to indicate the method should be overridden. + */ +goog.abstractMethod = function() { + throw Error('unimplemented abstract method'); +}; + + +/** + * Adds a {@code getInstance} static method that always returns the same + * instance object. + * @param {!Function} ctor The constructor for the class to add the static + * method to. + */ +goog.addSingletonGetter = function(ctor) { + ctor.getInstance = function() { + if (ctor.instance_) { + return ctor.instance_; + } + if (goog.DEBUG) { + // NOTE: JSCompiler can't optimize away Array#push. + goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor; + } + return ctor.instance_ = new ctor; + }; +}; + + +/** + * All singleton classes that have been instantiated, for testing. Don't read + * it directly, use the {@code goog.testing.singleton} module. The compiler + * removes this variable if unused. + * @type {!Array.} + * @private + */ +goog.instantiatedSingletons_ = []; + + +/** + * True if goog.dependencies_ is available. + * @const {boolean} + */ +goog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER; + + +if (goog.DEPENDENCIES_ENABLED) { + /** + * Object used to keep track of urls that have already been added. This record + * allows the prevention of circular dependencies. + * @type {Object} + * @private + */ + goog.included_ = {}; + + + /** + * This object is used to keep track of dependencies and other data that is + * used for loading scripts. + * @private + * @type {Object} + */ + goog.dependencies_ = { + pathToNames: {}, // 1 to many + nameToPath: {}, // 1 to 1 + requires: {}, // 1 to many + // Used when resolving dependencies to prevent us from visiting file twice. + visited: {}, + written: {} // Used to keep track of script files we have written. + }; + + + /** + * Tries to detect whether is in the context of an HTML document. + * @return {boolean} True if it looks like HTML document. + * @private + */ + goog.inHtmlDocument_ = function() { + var doc = goog.global.document; + return typeof doc != 'undefined' && + 'write' in doc; // XULDocument misses write. + }; + + + /** + * Tries to detect the base path of base.js script that bootstraps Closure. + * @private + */ + goog.findBasePath_ = function() { + if (goog.global.CLOSURE_BASE_PATH) { + goog.basePath = goog.global.CLOSURE_BASE_PATH; + return; + } else if (!goog.inHtmlDocument_()) { + return; + } + var doc = goog.global.document; + var scripts = doc.getElementsByTagName('script'); + // Search backwards since the current script is in almost all cases the one + // that has base.js. + for (var i = scripts.length - 1; i >= 0; --i) { + var src = scripts[i].src; + var qmark = src.lastIndexOf('?'); + var l = qmark == -1 ? src.length : qmark; + if (src.substr(l - 7, 7) == 'base.js') { + goog.basePath = src.substr(0, l - 7); + return; + } + } + }; + + + /** + * Imports a script if, and only if, that script hasn't already been imported. + * (Must be called at execution time) + * @param {string} src Script source. + * @private + */ + goog.importScript_ = function(src) { + var importScript = goog.global.CLOSURE_IMPORT_SCRIPT || + goog.writeScriptTag_; + if (!goog.dependencies_.written[src] && importScript(src)) { + goog.dependencies_.written[src] = true; + } + }; + + + /** + * The default implementation of the import function. Writes a script tag to + * import the script. + * + * @param {string} src The script source. + * @return {boolean} True if the script was imported, false otherwise. + * @private + */ + goog.writeScriptTag_ = function(src) { + if (goog.inHtmlDocument_()) { + var doc = goog.global.document; + + // If the user tries to require a new symbol after document load, + // something has gone terribly wrong. Doing a document.write would + // wipe out the page. + if (doc.readyState == 'complete') { + // Certain test frameworks load base.js multiple times, which tries + // to write deps.js each time. If that happens, just fail silently. + // These frameworks wipe the page between each load of base.js, so this + // is OK. + var isDeps = /\bdeps.js$/.test(src); + if (isDeps) { + return false; + } else { + throw Error('Cannot write "' + src + '" after document load'); + } + } + + doc.write( + ''); + assertEquals('SCRIPT', script.tagName); + + if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) { + // Removing an Element from a DOM tree in IE sets its parentNode to a new + // DocumentFragment. Bizarre! + assertEquals(goog.dom.NodeType.DOCUMENT_FRAGMENT, + goog.dom.removeNode(div).parentNode.nodeType); + } else { + assertNull(div.parentNode); + } +} + +function testAppend() { + var div = document.createElement('div'); + var b = document.createElement('b'); + var c = document.createTextNode('c'); + goog.dom.append(div, 'a', b, c); + assertEqualsCaseAndLeadingWhitespaceInsensitive('ac', div.innerHTML); +} + +function testAppend2() { + var div = myIframeDoc.createElement('div'); + var b = myIframeDoc.createElement('b'); + var c = myIframeDoc.createTextNode('c'); + goog.dom.append(div, 'a', b, c); + assertEqualsCaseAndLeadingWhitespaceInsensitive('ac', div.innerHTML); +} + +function testAppend3() { + var div = document.createElement('div'); + var b = document.createElement('b'); + var c = document.createTextNode('c'); + goog.dom.append(div, ['a', b, c]); + assertEqualsCaseAndLeadingWhitespaceInsensitive('ac', div.innerHTML); +} + +function testAppend4() { + var div = document.createElement('div'); + var div2 = document.createElement('div'); + div2.innerHTML = 'ac'; + goog.dom.append(div, div2.childNodes); + assertEqualsCaseAndLeadingWhitespaceInsensitive('ac', div.innerHTML); + assertFalse(div2.hasChildNodes()); +} + +function testGetDocumentScroll() { + // setUpPage added divForTestingScrolling to the DOM. It's not init'd here so + // it can be shared amonst other tests. + window.scrollTo(100, 100); + + assertEquals(100, goog.dom.getDocumentScroll().x); + assertEquals(100, goog.dom.getDocumentScroll().y); +} + +function testGetDocumentScrollOfFixedViewport() { + // iOS and perhaps other environments don't actually support scrolling. + // Instead, you view the document's fixed layout through a screen viewport. + // We need getDocumentScroll to handle this case though. + // In case of IE10 though, we do want to use scrollLeft/scrollTop + // because the rest of the positioning is done off the scrolled away origin. + var fakeDocumentScrollElement = {scrollLeft: 0, scrollTop: 0}; + var fakeDocument = { + defaultView: {pageXOffset: 100, pageYOffset: 100}, + documentElement: fakeDocumentScrollElement, + body: fakeDocumentScrollElement + }; + var dh = goog.dom.getDomHelper(document); + dh.setDocument(fakeDocument); + if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher(10)) { + assertEquals(0, dh.getDocumentScroll().x); + assertEquals(0, dh.getDocumentScroll().y); + } else { + assertEquals(100, dh.getDocumentScroll().x); + assertEquals(100, dh.getDocumentScroll().y); + } +} + +function testActiveElementIE() { + if (!goog.userAgent.IE) { + return; + } + + var link = goog.dom.getElement('link'); + link.focus(); + + assertEquals(link.tagName, goog.dom.getActiveElement(document).tagName); + assertEquals(link, goog.dom.getActiveElement(document)); +} + +function testParentElement() { + var testEl = $('testEl'); + var bodyEl = goog.dom.getParentElement(testEl); + assertNotNull(bodyEl); + var htmlEl = goog.dom.getParentElement(bodyEl); + assertNotNull(htmlEl); + var documentNotAnElement = goog.dom.getParentElement(htmlEl); + assertNull(documentNotAnElement); + + var tree = goog.dom.htmlToDocumentFragment( + '
' + + '

Some text

' + + '
Some special text
' + + '
Foo
' + + '
'); + assertNull(goog.dom.getParentElement(tree)); + pEl = goog.dom.getNextNode(tree); + var fragmentRootEl = goog.dom.getParentElement(pEl); + assertEquals(tree, fragmentRootEl); + + var detachedEl = goog.dom.createDom('div'); + var detachedHasNoParent = goog.dom.getParentElement(detachedEl); + assertNull(detachedHasNoParent); + + if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9')) { + // svg is not supported in IE8 and below. + return; + } + + var svg = $('testSvg'); + assertNotNull(svg); + var rect = $('testRect'); + assertNotNull(rect); + var g = $('testG'); + assertNotNull(g); + + if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher('9')) { + // test to make sure IE9 is returning undefined for .parentElement + assertUndefined(g.parentElement); + assertUndefined(rect.parentElement); + assertUndefined(svg.parentElement); + } + var shouldBeG = goog.dom.getParentElement(rect); + assertEquals(g, shouldBeG); + var shouldBeSvg = goog.dom.getParentElement(g); + assertEquals(svg, shouldBeSvg); + var shouldBeBody = goog.dom.getParentElement(svg); + assertEquals(bodyEl, shouldBeBody); +} + + +/** + * @return {boolean} Returns true if the userAgent is IE8 or higher. + */ +function isIE8OrHigher() { + return goog.userAgent.IE && goog.userAgent.product.isVersion('8'); +} diff --git a/float-no-zero/closure-library/closure/goog/dom/fontsizemonitor.js b/float-no-zero/closure-library/closure/goog/dom/fontsizemonitor.js new file mode 100644 index 0000000000..8bf4f67569 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/fontsizemonitor.js @@ -0,0 +1,159 @@ +// Copyright 2005 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview A class that can be used to listen to font size changes. + */ + +goog.provide('goog.dom.FontSizeMonitor'); +goog.provide('goog.dom.FontSizeMonitor.EventType'); + +goog.require('goog.dom'); +goog.require('goog.events'); +goog.require('goog.events.EventTarget'); +goog.require('goog.events.EventType'); +goog.require('goog.userAgent'); + + +// TODO(arv): Move this to goog.events instead. + + + +/** + * This class can be used to monitor changes in font size. Instances will + * dispatch a {@code goog.dom.FontSizeMonitor.EventType.CHANGE} event. + * Example usage: + *
+ * var fms = new goog.dom.FontSizeMonitor();
+ * goog.events.listen(fms, goog.dom.FontSizeMonitor.EventType.CHANGE,
+ *     function(e) {
+ *       alert('Font size was changed');
+ *     });
+ * 
+ * @param {goog.dom.DomHelper=} opt_domHelper DOM helper object that is used to + * determine where to insert the DOM nodes used to determine when the font + * size changes. + * @constructor + * @extends {goog.events.EventTarget} + */ +goog.dom.FontSizeMonitor = function(opt_domHelper) { + goog.events.EventTarget.call(this); + + var dom = opt_domHelper || goog.dom.getDomHelper(); + + /** + * Offscreen iframe which we use to detect resize events. + * @type {Element} + * @private + */ + this.sizeElement_ = dom.createDom( + // The size of the iframe is expressed in em, which are font size relative + // which will cause the iframe to be resized when the font size changes. + // The actual values are not relevant as long as we can ensure that the + // iframe has a non zero size and is completely off screen. + goog.userAgent.IE ? 'div' : 'iframe', { + 'style': 'position:absolute;width:9em;height:9em;top:-99em', + 'tabIndex': -1, + 'aria-hidden': 'true' + }); + var p = dom.getDocument().body; + p.insertBefore(this.sizeElement_, p.firstChild); + + /** + * The object that we listen to resize events on. + * @type {Element|Window} + * @private + */ + var resizeTarget = this.resizeTarget_ = + goog.userAgent.IE ? this.sizeElement_ : + goog.dom.getFrameContentWindow( + /** @type {HTMLIFrameElement} */ (this.sizeElement_)); + + // We need to open and close the document to get Firefox 2 to work. We must + // not do this for IE in case we are using HTTPS since accessing the document + // on an about:blank iframe in IE using HTTPS raises a Permission Denied + // error. + if (goog.userAgent.GECKO) { + var doc = resizeTarget.document; + doc.open(); + doc.close(); + } + + // Listen to resize event on the window inside the iframe. + goog.events.listen(resizeTarget, goog.events.EventType.RESIZE, + this.handleResize_, false, this); + + /** + * Last measured width of the iframe element. + * @type {number} + * @private + */ + this.lastWidth_ = this.sizeElement_.offsetWidth; +}; +goog.inherits(goog.dom.FontSizeMonitor, goog.events.EventTarget); + + +/** + * The event types that the FontSizeMonitor fires. + * @enum {string} + */ +goog.dom.FontSizeMonitor.EventType = { + // TODO(arv): Change value to 'change' after updating the callers. + CHANGE: 'fontsizechange' +}; + + +/** + * Constant for the change event. + * @type {string} + * @deprecated Use {@code goog.dom.FontSizeMonitor.EventType.CHANGE} instead. + */ +goog.dom.FontSizeMonitor.CHANGE_EVENT = + goog.dom.FontSizeMonitor.EventType.CHANGE; + + +/** @override */ +goog.dom.FontSizeMonitor.prototype.disposeInternal = function() { + goog.dom.FontSizeMonitor.superClass_.disposeInternal.call(this); + + goog.events.unlisten(this.resizeTarget_, goog.events.EventType.RESIZE, + this.handleResize_, false, this); + this.resizeTarget_ = null; + + // Firefox 2 crashes if the iframe is removed during the unload phase. + if (!goog.userAgent.GECKO || + goog.userAgent.isVersionOrHigher('1.9')) { + goog.dom.removeNode(this.sizeElement_); + } + delete this.sizeElement_; +}; + + +/** + * Handles the onresize event of the iframe and dispatches a change event in + * case its size really changed. + * @param {goog.events.BrowserEvent} e The event object. + * @private + */ +goog.dom.FontSizeMonitor.prototype.handleResize_ = function(e) { + // Only dispatch the event if the size really changed. Some newer browsers do + // not really change the font-size, instead they zoom the whole page. This + // does trigger window resize events on the iframe but the logical pixel size + // remains the same (the device pixel size changes but that is irrelevant). + var currentWidth = this.sizeElement_.offsetWidth; + if (this.lastWidth_ != currentWidth) { + this.lastWidth_ = currentWidth; + this.dispatchEvent(goog.dom.FontSizeMonitor.EventType.CHANGE); + } +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/forms.js b/float-no-zero/closure-library/closure/goog/dom/forms.js new file mode 100644 index 0000000000..8e6e214413 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/forms.js @@ -0,0 +1,414 @@ +// Copyright 2006 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilities for manipulating a form and elements. + * + * @author arv@google.com (Erik Arvidsson) + * @author jonp@google.com (Jon Perlow) + * @author elsigh@google.com (Lindsey Simon) + */ + +goog.provide('goog.dom.forms'); + +goog.require('goog.structs.Map'); + + +/** + * Returns form data as a map of name to value arrays. This doesn't + * support file inputs. + * @param {HTMLFormElement} form The form. + * @return {!goog.structs.Map} A map of the form data as form name to arrays of + * values. + */ +goog.dom.forms.getFormDataMap = function(form) { + var map = new goog.structs.Map(); + goog.dom.forms.getFormDataHelper_(form, map, + goog.dom.forms.addFormDataToMap_); + return map; +}; + + +/** + * Returns the form data as an application/x-www-url-encoded string. This + * doesn't support file inputs. + * @param {HTMLFormElement} form The form. + * @return {string} An application/x-www-url-encoded string. + */ +goog.dom.forms.getFormDataString = function(form) { + var sb = []; + goog.dom.forms.getFormDataHelper_(form, sb, + goog.dom.forms.addFormDataToStringBuffer_); + return sb.join('&'); +}; + + +/** + * Returns the form data as a map or an application/x-www-url-encoded + * string. This doesn't support file inputs. + * @param {HTMLFormElement} form The form. + * @param {Object} result The object form data is being put in. + * @param {Function} fnAppend Function that takes {@code result}, an element + * name, and an element value, and adds the name/value pair to the result + * object. + * @private + */ +goog.dom.forms.getFormDataHelper_ = function(form, result, fnAppend) { + var els = form.elements; + for (var el, i = 0; el = els[i]; i++) { + if (// Make sure we don't include elements that are not part of the form. + // Some browsers include non-form elements. Check for 'form' property. + // See http://code.google.com/p/closure-library/issues/detail?id=227 + // and + // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#the-input-element + (el.form != form) || + el.disabled || + // HTMLFieldSetElement has a form property but no value. + el.tagName.toLowerCase() == 'fieldset') { + continue; + } + + var name = el.name; + switch (el.type.toLowerCase()) { + case 'file': + // file inputs are not supported + case 'submit': + case 'reset': + case 'button': + // don't submit these + break; + case 'select-multiple': + var values = goog.dom.forms.getValue(el); + if (values != null) { + for (var value, j = 0; value = values[j]; j++) { + fnAppend(result, name, value); + } + } + break; + default: + var value = goog.dom.forms.getValue(el); + if (value != null) { + fnAppend(result, name, value); + } + } + } + + // input[type=image] are not included in the elements collection + var inputs = form.getElementsByTagName('input'); + for (var input, i = 0; input = inputs[i]; i++) { + if (input.form == form && input.type.toLowerCase() == 'image') { + name = input.name; + fnAppend(result, name, input.value); + fnAppend(result, name + '.x', '0'); + fnAppend(result, name + '.y', '0'); + } + } +}; + + +/** + * Adds the name/value pair to the map. + * @param {goog.structs.Map} map The map to add to. + * @param {string} name The name. + * @param {string} value The value. + * @private + */ +goog.dom.forms.addFormDataToMap_ = function(map, name, value) { + var array = map.get(name); + if (!array) { + array = []; + map.set(name, array); + } + array.push(value); +}; + + +/** + * Adds a name/value pair to an string buffer array in the form 'name=value'. + * @param {Array} sb The string buffer array for storing data. + * @param {string} name The name. + * @param {string} value The value. + * @private + */ +goog.dom.forms.addFormDataToStringBuffer_ = function(sb, name, value) { + sb.push(encodeURIComponent(name) + '=' + encodeURIComponent(value)); +}; + + +/** + * Whether the form has a file input. + * @param {HTMLFormElement} form The form. + * @return {boolean} Whether the form has a file input. + */ +goog.dom.forms.hasFileInput = function(form) { + var els = form.elements; + for (var el, i = 0; el = els[i]; i++) { + if (!el.disabled && el.type && el.type.toLowerCase() == 'file') { + return true; + } + } + return false; +}; + + +/** + * Enables or disables either all elements in a form or a single form element. + * @param {Element} el The element, either a form or an element within a form. + * @param {boolean} disabled Whether the element should be disabled. + */ +goog.dom.forms.setDisabled = function(el, disabled) { + // disable all elements in a form + if (el.tagName == 'FORM') { + var els = el.elements; + for (var i = 0; el = els[i]; i++) { + goog.dom.forms.setDisabled(el, disabled); + } + } else { + // makes sure to blur buttons, multi-selects, and any elements which + // maintain keyboard/accessibility focus when disabled + if (disabled == true) { + el.blur(); + } + el.disabled = disabled; + } +}; + + +/** + * Focuses, and optionally selects the content of, a form element. + * @param {Element} el The form element. + */ +goog.dom.forms.focusAndSelect = function(el) { + el.focus(); + if (el.select) { + el.select(); + } +}; + + +/** + * Whether a form element has a value. + * @param {Element} el The element. + * @return {boolean} Whether the form has a value. + */ +goog.dom.forms.hasValue = function(el) { + var value = goog.dom.forms.getValue(el); + return !!value; +}; + + +/** + * Whether a named form field has a value. + * @param {HTMLFormElement} form The form element. + * @param {string} name Name of an input to the form. + * @return {boolean} Whether the form has a value. + */ +goog.dom.forms.hasValueByName = function(form, name) { + var value = goog.dom.forms.getValueByName(form, name); + return !!value; +}; + + +/** + * Gets the current value of any element with a type. + * @param {Element} el The element. + * @return {string|Array.|null} The current value of the element + * (or null). + */ +goog.dom.forms.getValue = function(el) { + var type = el.type; + if (!goog.isDef(type)) { + return null; + } + switch (type.toLowerCase()) { + case 'checkbox': + case 'radio': + return goog.dom.forms.getInputChecked_(el); + case 'select-one': + return goog.dom.forms.getSelectSingle_(el); + case 'select-multiple': + return goog.dom.forms.getSelectMultiple_(el); + default: + return goog.isDef(el.value) ? el.value : null; + } +}; + + +/** + * Alias for goog.dom.form.element.getValue + * @type {Function} + * @deprecated Use {@link goog.dom.forms.getValue} instead. + */ +goog.dom.$F = goog.dom.forms.getValue; + + +/** + * Returns the value of the named form field. In the case of radio buttons, + * returns the value of the checked button with the given name. + * + * @param {HTMLFormElement} form The form element. + * @param {string} name Name of an input to the form. + * + * @return {Array.|string|null} The value of the form element, or + * null if the form element does not exist or has no value. + */ +goog.dom.forms.getValueByName = function(form, name) { + var els = form.elements[name]; + + if (els) { + if (els.type) { + return goog.dom.forms.getValue(els); + } else { + for (var i = 0; i < els.length; i++) { + var val = goog.dom.forms.getValue(els[i]); + if (val) { + return val; + } + } + } + } + return null; +}; + + +/** + * Gets the current value of a checkable input element. + * @param {Element} el The element. + * @return {?string} The value of the form element (or null). + * @private + */ +goog.dom.forms.getInputChecked_ = function(el) { + return el.checked ? el.value : null; +}; + + +/** + * Gets the current value of a select-one element. + * @param {Element} el The element. + * @return {?string} The value of the form element (or null). + * @private + */ +goog.dom.forms.getSelectSingle_ = function(el) { + var selectedIndex = el.selectedIndex; + return selectedIndex >= 0 ? el.options[selectedIndex].value : null; +}; + + +/** + * Gets the current value of a select-multiple element. + * @param {Element} el The element. + * @return {Array.?} The value of the form element (or null). + * @private + */ +goog.dom.forms.getSelectMultiple_ = function(el) { + var values = []; + for (var option, i = 0; option = el.options[i]; i++) { + if (option.selected) { + values.push(option.value); + } + } + return values.length ? values : null; +}; + + +/** + * Sets the current value of any element with a type. + * @param {Element} el The element. + * @param {*=} opt_value The value to give to the element, which will be coerced + * by the browser in the default case using toString. This value should be + * an array for setting the value of select multiple elements. + */ +goog.dom.forms.setValue = function(el, opt_value) { + var type = el.type; + if (goog.isDef(type)) { + switch (type.toLowerCase()) { + case 'checkbox': + case 'radio': + goog.dom.forms.setInputChecked_(el, + /** @type {string} */ (opt_value)); + break; + case 'select-one': + goog.dom.forms.setSelectSingle_(el, + /** @type {string} */ (opt_value)); + break; + case 'select-multiple': + goog.dom.forms.setSelectMultiple_(el, + /** @type {Array} */ (opt_value)); + break; + default: + el.value = goog.isDefAndNotNull(opt_value) ? opt_value : ''; + } + } +}; + + +/** + * Sets a checkable input element's checked property. + * #TODO(user): This seems potentially unintuitive since it doesn't set + * the value property but my hunch is that the primary use case is to check a + * checkbox, not to reset its value property. + * @param {Element} el The element. + * @param {string|boolean=} opt_value The value, sets the element checked if + * val is set. + * @private + */ +goog.dom.forms.setInputChecked_ = function(el, opt_value) { + el.checked = opt_value ? 'checked' : null; +}; + + +/** + * Sets the value of a select-one element. + * @param {Element} el The element. + * @param {string=} opt_value The value of the selected option element. + * @private + */ +goog.dom.forms.setSelectSingle_ = function(el, opt_value) { + // unset any prior selections + el.selectedIndex = -1; + if (goog.isString(opt_value)) { + for (var option, i = 0; option = el.options[i]; i++) { + if (option.value == opt_value) { + option.selected = true; + break; + } + } + } +}; + + +/** + * Sets the value of a select-multiple element. + * @param {Element} el The element. + * @param {Array.|string=} opt_value The value of the selected option + * element(s). + * @private + */ +goog.dom.forms.setSelectMultiple_ = function(el, opt_value) { + // reset string opt_values as an array + if (goog.isString(opt_value)) { + opt_value = [opt_value]; + } + for (var option, i = 0; option = el.options[i]; i++) { + // we have to reset the other options to false for select-multiple + option.selected = false; + if (opt_value) { + for (var value, j = 0; value = opt_value[j]; j++) { + if (option.value == value) { + option.selected = true; + } + } + } + } +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/fullscreen.js b/float-no-zero/closure-library/closure/goog/dom/fullscreen.js new file mode 100644 index 0000000000..d1f1297314 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/fullscreen.js @@ -0,0 +1,124 @@ +// Copyright 2012 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Functions for managing full screen status of the DOM. + * + */ + +goog.provide('goog.dom.fullscreen'); +goog.provide('goog.dom.fullscreen.EventType'); + +goog.require('goog.dom'); +goog.require('goog.userAgent'); +goog.require('goog.userAgent.product'); + + +/** + * Event types for full screen. + * @enum {string} + */ +goog.dom.fullscreen.EventType = { + /** Dispatched by the Document when the fullscreen status changes. */ + CHANGE: goog.userAgent.WEBKIT ? + 'webkitfullscreenchange' : + 'mozfullscreenchange' +}; + + +/** + * Determines if full screen is supported. + * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper for the DOM being + * queried. If not provided, use the current DOM. + * @return {boolean} True iff full screen is supported. + */ +goog.dom.fullscreen.isSupported = function(opt_domHelper) { + var doc = goog.dom.fullscreen.getDocument_(opt_domHelper); + var body = doc.body; + return !!body.webkitRequestFullScreen || + (!!body.mozRequestFullScreen && doc.mozFullScreenEnabled); +}; + + +/** + * Requests putting the element in full screen. + * @param {!Element} element The element to put full screen. + */ +goog.dom.fullscreen.requestFullScreen = function(element) { + if (element.webkitRequestFullScreen) { + element.webkitRequestFullScreen(); + } else if (element.mozRequestFullScreen) { + element.mozRequestFullScreen(); + } +}; + + +/** + * Requests putting the element in full screen with full keyboard access. + * @param {!Element} element The element to put full screen. + */ +goog.dom.fullscreen.requestFullScreenWithKeys = function( + element) { + if (element.mozRequestFullScreenWithKeys) { + element.mozRequestFullScreenWithKeys(); + } else if (element.webkitRequestFullScreen && + element.ALLOW_KEYBOARD_INPUT && + goog.userAgent.product.CHROME) { + // Safari has the ALLOW_KEYBOARD_INPUT property but using it gives an error. + element.webkitRequestFullScreen(element.ALLOW_KEYBOARD_INPUT); + } else { + goog.dom.fullscreen.requestFullScreen(element); + } +}; + + +/** + * Exits full screen. + * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper for the DOM being + * queried. If not provided, use the current DOM. + */ +goog.dom.fullscreen.exitFullScreen = function(opt_domHelper) { + var doc = goog.dom.fullscreen.getDocument_(opt_domHelper); + if (doc.webkitCancelFullScreen) { + doc.webkitCancelFullScreen(); + } else if (doc.mozCancelFullScreen) { + doc.mozCancelFullScreen(); + } +}; + + +/** + * Determines if the document is full screen. + * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper for the DOM being + * queried. If not provided, use the current DOM. + * @return {boolean} Whether the document is full screen. + */ +goog.dom.fullscreen.isFullScreen = function(opt_domHelper) { + var doc = goog.dom.fullscreen.getDocument_(opt_domHelper); + return !!doc.webkitIsFullScreen || !!doc.mozFullScreen; +}; + + +/** + * Gets the document object of the dom. + * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper for the DOM being + * queried. If not provided, use the current DOM. + * @return {!Document} The dom document. + * @private + */ +goog.dom.fullscreen.getDocument_ = function(opt_domHelper) { + return opt_domHelper ? + opt_domHelper.getDocument() : + goog.dom.getDomHelper().getDocument(); +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/iframe.js b/float-no-zero/closure-library/closure/goog/dom/iframe.js new file mode 100644 index 0000000000..c23e795c31 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/iframe.js @@ -0,0 +1,163 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilities for creating and working with iframes + * cross-browser. + * @author gboyer@google.com (Garry Boyer) + */ + + +goog.provide('goog.dom.iframe'); + +goog.require('goog.dom'); +goog.require('goog.userAgent'); + + +/** + * Safe source for a blank iframe. + * + * Intentionally not about:blank, which gives mixed content warnings in IE6 + * over HTTPS. + * + * @type {string} + */ +goog.dom.iframe.BLANK_SOURCE = 'javascript:""'; + + +/** + * Safe source for a new blank iframe that may not cause a new load of the + * iframe. This is different from {@code goog.dom.iframe.BLANK_SOURCE} in that + * it will allow an iframe to be loaded synchronously in more browsers, notably + * Gecko, following the javascript protocol spec. + * + * NOTE: This should not be used to replace the source of an existing iframe. + * The new src value will be ignored, per the spec. + * + * Due to cross-browser differences, the load is not guaranteed to be + * synchronous. If code depends on the load of the iframe, + * then {@code goog.net.IframeLoadMonitor} or a similar technique should be + * used. + * + * According to + * http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#javascript-protocol + * the 'javascript:""' URL should trigger a new load of the iframe, which may be + * asynchronous. A void src, such as 'javascript:undefined', does not change + * the browsing context document's, and thus should not trigger another load. + * + * Intentionally not about:blank, which also triggers a load. + * + * NOTE: 'javascript:' URL handling spec compliance varies per browser. IE + * throws an error with 'javascript:undefined'. Webkit browsers will reload the + * iframe when setting this source on an existing iframe. + * + * @type {string} + */ +goog.dom.iframe.BLANK_SOURCE_NEW_FRAME = goog.userAgent.IE ? + 'javascript:""' : + 'javascript:undefined'; + + +/** + * Styles to help ensure an undecorated iframe. + * @type {string} + * @private + */ +goog.dom.iframe.STYLES_ = 'border:0;vertical-align:bottom;'; + + +/** + * Creates a completely blank iframe element. + * + * The iframe will not caused mixed-content warnings for IE6 under HTTPS. + * The iframe will also have no borders or padding, so that the styled width + * and height will be the actual width and height of the iframe. + * + * This function currently only attempts to create a blank iframe. There + * are no guarantees to the contents of the iframe or whether it is rendered + * in quirks mode. + * + * @param {goog.dom.DomHelper} domHelper The dom helper to use. + * @param {string=} opt_styles CSS styles for the iframe. + * @return {!HTMLIFrameElement} A completely blank iframe. + */ +goog.dom.iframe.createBlank = function(domHelper, opt_styles) { + return /** @type {!HTMLIFrameElement} */ (domHelper.createDom('iframe', { + 'frameborder': 0, + // Since iframes are inline elements, we must align to bottom to + // compensate for the line descent. + 'style': goog.dom.iframe.STYLES_ + (opt_styles || ''), + 'src': goog.dom.iframe.BLANK_SOURCE + })); +}; + + +/** + * Writes the contents of a blank iframe that has already been inserted + * into the document. + * @param {!HTMLIFrameElement} iframe An iframe with no contents, such as + * one created by goog.dom.iframe.createBlank, but already appended to + * a parent document. + * @param {string} content Content to write to the iframe, from doctype to + * the HTML close tag. + */ +goog.dom.iframe.writeContent = function(iframe, content) { + var doc = goog.dom.getFrameContentDocument(iframe); + doc.open(); + doc.write(content); + doc.close(); +}; + + +// TODO(gboyer): Provide a higher-level API for the most common use case, so +// that you can just provide a list of stylesheets and some content HTML. +/** + * Creates a same-domain iframe containing preloaded content. + * + * This is primarily useful for DOM sandboxing. One use case is to embed + * a trusted Javascript app with potentially conflicting CSS styles. The + * second case is to reduce the cost of layout passes by the browser -- for + * example, you can perform sandbox sizing of characters in an iframe while + * manipulating a heavy DOM in the main window. The iframe and parent frame + * can access each others' properties and functions without restriction. + * + * @param {!Element} parentElement The parent element in which to append the + * iframe. + * @param {string=} opt_headContents Contents to go into the iframe's head. + * @param {string=} opt_bodyContents Contents to go into the iframe's body. + * @param {string=} opt_styles CSS styles for the iframe itself, before adding + * to the parent element. + * @param {boolean=} opt_quirks Whether to use quirks mode (false by default). + * @return {HTMLIFrameElement} An iframe that has the specified contents. + */ +goog.dom.iframe.createWithContent = function( + parentElement, opt_headContents, opt_bodyContents, opt_styles, opt_quirks) { + var domHelper = goog.dom.getDomHelper(parentElement); + // Generate the HTML content. + var contentBuf = []; + + if (!opt_quirks) { + contentBuf.push(''); + } + contentBuf.push('', opt_headContents, '', + opt_bodyContents, ''); + + var iframe = goog.dom.iframe.createBlank(domHelper, opt_styles); + + // Cannot manipulate iframe content until it is in a document. + parentElement.appendChild(iframe); + goog.dom.iframe.writeContent(iframe, contentBuf.join('')); + + return iframe; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/iter.js b/float-no-zero/closure-library/closure/goog/dom/iter.js new file mode 100644 index 0000000000..0224af3ec4 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/iter.js @@ -0,0 +1,127 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Iterators over DOM nodes. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.iter.AncestorIterator'); +goog.provide('goog.dom.iter.ChildIterator'); +goog.provide('goog.dom.iter.SiblingIterator'); + +goog.require('goog.iter.Iterator'); +goog.require('goog.iter.StopIteration'); + + + +/** + * Iterator over a Node's siblings. + * @param {Node} node The node to start with. + * @param {boolean=} opt_includeNode Whether to return the given node as the + * first return value from next. + * @param {boolean=} opt_reverse Whether to traverse siblings in reverse + * document order. + * @constructor + * @extends {goog.iter.Iterator} + */ +goog.dom.iter.SiblingIterator = function(node, opt_includeNode, opt_reverse) { + /** + * The current node, or null if iteration is finished. + * @type {Node} + * @private + */ + this.node_ = node; + + /** + * Whether to iterate in reverse. + * @type {boolean} + * @private + */ + this.reverse_ = !!opt_reverse; + + if (node && !opt_includeNode) { + this.next(); + } +}; +goog.inherits(goog.dom.iter.SiblingIterator, goog.iter.Iterator); + + +/** @override */ +goog.dom.iter.SiblingIterator.prototype.next = function() { + var node = this.node_; + if (!node) { + throw goog.iter.StopIteration; + } + this.node_ = this.reverse_ ? node.previousSibling : node.nextSibling; + return node; +}; + + + +/** + * Iterator over an Element's children. + * @param {Element} element The element to iterate over. + * @param {boolean=} opt_reverse Optionally traverse children from last to + * first. + * @param {number=} opt_startIndex Optional starting index. + * @constructor + * @extends {goog.dom.iter.SiblingIterator} + */ +goog.dom.iter.ChildIterator = function(element, opt_reverse, opt_startIndex) { + if (!goog.isDef(opt_startIndex)) { + opt_startIndex = opt_reverse && element.childNodes.length ? + element.childNodes.length - 1 : 0; + } + goog.dom.iter.SiblingIterator.call(this, element.childNodes[opt_startIndex], + true, opt_reverse); +}; +goog.inherits(goog.dom.iter.ChildIterator, goog.dom.iter.SiblingIterator); + + + +/** + * Iterator over a Node's ancestors, stopping after the document body. + * @param {Node} node The node to start with. + * @param {boolean=} opt_includeNode Whether to return the given node as the + * first return value from next. + * @constructor + * @extends {goog.iter.Iterator} + */ +goog.dom.iter.AncestorIterator = function(node, opt_includeNode) { + /** + * The current node, or null if iteration is finished. + * @type {Node} + * @private + */ + this.node_ = node; + + if (node && !opt_includeNode) { + this.next(); + } +}; +goog.inherits(goog.dom.iter.AncestorIterator, goog.iter.Iterator); + + +/** @override */ +goog.dom.iter.AncestorIterator.prototype.next = function() { + var node = this.node_; + if (!node) { + throw goog.iter.StopIteration; + } + this.node_ = node.parentNode; + return node; +}; + diff --git a/float-no-zero/closure-library/closure/goog/dom/multirange.js b/float-no-zero/closure-library/closure/goog/dom/multirange.js new file mode 100644 index 0000000000..0fb6f2064f --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/multirange.js @@ -0,0 +1,519 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilities for working with W3C multi-part ranges. + * + * @author robbyw@google.com (Robby Walker) + */ + + +goog.provide('goog.dom.MultiRange'); +goog.provide('goog.dom.MultiRangeIterator'); + +goog.require('goog.array'); +goog.require('goog.dom.AbstractMultiRange'); +goog.require('goog.dom.AbstractRange'); +goog.require('goog.dom.RangeIterator'); +goog.require('goog.dom.RangeType'); +goog.require('goog.dom.SavedRange'); +goog.require('goog.dom.TextRange'); +goog.require('goog.iter.StopIteration'); +goog.require('goog.log'); + + + +/** + * Creates a new multi part range with no properties. Do not use this + * constructor: use one of the goog.dom.Range.createFrom* methods instead. + * @constructor + * @extends {goog.dom.AbstractMultiRange} + */ +goog.dom.MultiRange = function() { + /** + * Array of browser sub-ranges comprising this multi-range. + * @type {Array.} + * @private + */ + this.browserRanges_ = []; + + /** + * Lazily initialized array of range objects comprising this multi-range. + * @type {Array.} + * @private + */ + this.ranges_ = []; + + /** + * Lazily computed sorted version of ranges_, sorted by start point. + * @type {Array.?} + * @private + */ + this.sortedRanges_ = null; + + /** + * Lazily computed container node. + * @type {Node} + * @private + */ + this.container_ = null; +}; +goog.inherits(goog.dom.MultiRange, goog.dom.AbstractMultiRange); + + +/** + * Creates a new range wrapper from the given browser selection object. Do not + * use this method directly - please use goog.dom.Range.createFrom* instead. + * @param {Selection} selection The browser selection object. + * @return {goog.dom.MultiRange} A range wrapper object. + */ +goog.dom.MultiRange.createFromBrowserSelection = function(selection) { + var range = new goog.dom.MultiRange(); + for (var i = 0, len = selection.rangeCount; i < len; i++) { + range.browserRanges_.push(selection.getRangeAt(i)); + } + return range; +}; + + +/** + * Creates a new range wrapper from the given browser ranges. Do not + * use this method directly - please use goog.dom.Range.createFrom* instead. + * @param {Array.} browserRanges The browser ranges. + * @return {goog.dom.MultiRange} A range wrapper object. + */ +goog.dom.MultiRange.createFromBrowserRanges = function(browserRanges) { + var range = new goog.dom.MultiRange(); + range.browserRanges_ = goog.array.clone(browserRanges); + return range; +}; + + +/** + * Creates a new range wrapper from the given goog.dom.TextRange objects. Do + * not use this method directly - please use goog.dom.Range.createFrom* instead. + * @param {Array.} textRanges The text range objects. + * @return {goog.dom.MultiRange} A range wrapper object. + */ +goog.dom.MultiRange.createFromTextRanges = function(textRanges) { + var range = new goog.dom.MultiRange(); + range.ranges_ = textRanges; + range.browserRanges_ = goog.array.map(textRanges, function(range) { + return range.getBrowserRangeObject(); + }); + return range; +}; + + +/** + * Logging object. + * @type {goog.log.Logger} + * @private + */ +goog.dom.MultiRange.prototype.logger_ = + goog.log.getLogger('goog.dom.MultiRange'); + + +// Method implementations + + +/** + * Clears cached values. Should be called whenever this.browserRanges_ is + * modified. + * @private + */ +goog.dom.MultiRange.prototype.clearCachedValues_ = function() { + this.ranges_ = []; + this.sortedRanges_ = null; + this.container_ = null; +}; + + +/** + * @return {goog.dom.MultiRange} A clone of this range. + * @override + */ +goog.dom.MultiRange.prototype.clone = function() { + return goog.dom.MultiRange.createFromBrowserRanges(this.browserRanges_); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getType = function() { + return goog.dom.RangeType.MULTI; +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getBrowserRangeObject = function() { + // NOTE(robbyw): This method does not make sense for multi-ranges. + if (this.browserRanges_.length > 1) { + goog.log.warning(this.logger_, + 'getBrowserRangeObject called on MultiRange with more than 1 range'); + } + return this.browserRanges_[0]; +}; + + +/** @override */ +goog.dom.MultiRange.prototype.setBrowserRangeObject = function(nativeRange) { + // TODO(robbyw): Look in to adding setBrowserSelectionObject. + return false; +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getTextRangeCount = function() { + return this.browserRanges_.length; +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getTextRange = function(i) { + if (!this.ranges_[i]) { + this.ranges_[i] = goog.dom.TextRange.createFromBrowserRange( + this.browserRanges_[i]); + } + return this.ranges_[i]; +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getContainer = function() { + if (!this.container_) { + var nodes = []; + for (var i = 0, len = this.getTextRangeCount(); i < len; i++) { + nodes.push(this.getTextRange(i).getContainer()); + } + this.container_ = goog.dom.findCommonAncestor.apply(null, nodes); + } + return this.container_; +}; + + +/** + * @return {Array.} An array of sub-ranges, sorted by start + * point. + */ +goog.dom.MultiRange.prototype.getSortedRanges = function() { + if (!this.sortedRanges_) { + this.sortedRanges_ = this.getTextRanges(); + this.sortedRanges_.sort(function(a, b) { + var aStartNode = a.getStartNode(); + var aStartOffset = a.getStartOffset(); + var bStartNode = b.getStartNode(); + var bStartOffset = b.getStartOffset(); + + if (aStartNode == bStartNode && aStartOffset == bStartOffset) { + return 0; + } + + return goog.dom.Range.isReversed(aStartNode, aStartOffset, bStartNode, + bStartOffset) ? 1 : -1; + }); + } + return this.sortedRanges_; +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getStartNode = function() { + return this.getSortedRanges()[0].getStartNode(); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getStartOffset = function() { + return this.getSortedRanges()[0].getStartOffset(); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getEndNode = function() { + // NOTE(robbyw): This may return the wrong node if any subranges overlap. + return goog.array.peek(this.getSortedRanges()).getEndNode(); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getEndOffset = function() { + // NOTE(robbyw): This may return the wrong value if any subranges overlap. + return goog.array.peek(this.getSortedRanges()).getEndOffset(); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.isRangeInDocument = function() { + return goog.array.every(this.getTextRanges(), function(range) { + return range.isRangeInDocument(); + }); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.isCollapsed = function() { + return this.browserRanges_.length == 0 || + this.browserRanges_.length == 1 && this.getTextRange(0).isCollapsed(); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getText = function() { + return goog.array.map(this.getTextRanges(), function(range) { + return range.getText(); + }).join(''); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getHtmlFragment = function() { + return this.getValidHtml(); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getValidHtml = function() { + // NOTE(robbyw): This does not behave well if the sub-ranges overlap. + return goog.array.map(this.getTextRanges(), function(range) { + return range.getValidHtml(); + }).join(''); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.getPastableHtml = function() { + // TODO(robbyw): This should probably do something smart like group TR and TD + // selections in to the same table. + return this.getValidHtml(); +}; + + +/** @override */ +goog.dom.MultiRange.prototype.__iterator__ = function(opt_keys) { + return new goog.dom.MultiRangeIterator(this); +}; + + +// RANGE ACTIONS + + +/** @override */ +goog.dom.MultiRange.prototype.select = function() { + var selection = goog.dom.AbstractRange.getBrowserSelectionForWindow( + this.getWindow()); + selection.removeAllRanges(); + for (var i = 0, len = this.getTextRangeCount(); i < len; i++) { + selection.addRange(this.getTextRange(i).getBrowserRangeObject()); + } +}; + + +/** @override */ +goog.dom.MultiRange.prototype.removeContents = function() { + goog.array.forEach(this.getTextRanges(), function(range) { + range.removeContents(); + }); +}; + + +// SAVE/RESTORE + + +/** @override */ +goog.dom.MultiRange.prototype.saveUsingDom = function() { + return new goog.dom.DomSavedMultiRange_(this); +}; + + +// RANGE MODIFICATION + + +/** + * Collapses this range to a single point, either the first or last point + * depending on the parameter. This will result in the number of ranges in this + * multi range becoming 1. + * @param {boolean} toAnchor Whether to collapse to the anchor. + * @override + */ +goog.dom.MultiRange.prototype.collapse = function(toAnchor) { + if (!this.isCollapsed()) { + var range = toAnchor ? this.getTextRange(0) : this.getTextRange( + this.getTextRangeCount() - 1); + + this.clearCachedValues_(); + range.collapse(toAnchor); + this.ranges_ = [range]; + this.sortedRanges_ = [range]; + this.browserRanges_ = [range.getBrowserRangeObject()]; + } +}; + + +// SAVED RANGE OBJECTS + + + +/** + * A SavedRange implementation using DOM endpoints. + * @param {goog.dom.MultiRange} range The range to save. + * @constructor + * @extends {goog.dom.SavedRange} + * @private + */ +goog.dom.DomSavedMultiRange_ = function(range) { + /** + * Array of saved ranges. + * @type {Array.} + * @private + */ + this.savedRanges_ = goog.array.map(range.getTextRanges(), function(range) { + return range.saveUsingDom(); + }); +}; +goog.inherits(goog.dom.DomSavedMultiRange_, goog.dom.SavedRange); + + +/** + * @return {goog.dom.MultiRange} The restored range. + * @override + */ +goog.dom.DomSavedMultiRange_.prototype.restoreInternal = function() { + var ranges = goog.array.map(this.savedRanges_, function(savedRange) { + return savedRange.restore(); + }); + return goog.dom.MultiRange.createFromTextRanges(ranges); +}; + + +/** @override */ +goog.dom.DomSavedMultiRange_.prototype.disposeInternal = function() { + goog.dom.DomSavedMultiRange_.superClass_.disposeInternal.call(this); + + goog.array.forEach(this.savedRanges_, function(savedRange) { + savedRange.dispose(); + }); + delete this.savedRanges_; +}; + + +// RANGE ITERATION + + + +/** + * Subclass of goog.dom.TagIterator that iterates over a DOM range. It + * adds functions to determine the portion of each text node that is selected. + * + * @param {goog.dom.MultiRange} range The range to traverse. + * @constructor + * @extends {goog.dom.RangeIterator} + */ +goog.dom.MultiRangeIterator = function(range) { + if (range) { + this.iterators_ = goog.array.map( + range.getSortedRanges(), + function(r) { + return goog.iter.toIterator(r); + }); + } + + goog.dom.RangeIterator.call( + this, range ? this.getStartNode() : null, false); +}; +goog.inherits(goog.dom.MultiRangeIterator, goog.dom.RangeIterator); + + +/** + * The list of range iterators left to traverse. + * @type {Array.?} + * @private + */ +goog.dom.MultiRangeIterator.prototype.iterators_ = null; + + +/** + * The index of the current sub-iterator being traversed. + * @type {number} + * @private + */ +goog.dom.MultiRangeIterator.prototype.currentIdx_ = 0; + + +/** @override */ +goog.dom.MultiRangeIterator.prototype.getStartTextOffset = function() { + return this.iterators_[this.currentIdx_].getStartTextOffset(); +}; + + +/** @override */ +goog.dom.MultiRangeIterator.prototype.getEndTextOffset = function() { + return this.iterators_[this.currentIdx_].getEndTextOffset(); +}; + + +/** @override */ +goog.dom.MultiRangeIterator.prototype.getStartNode = function() { + return this.iterators_[0].getStartNode(); +}; + + +/** @override */ +goog.dom.MultiRangeIterator.prototype.getEndNode = function() { + return goog.array.peek(this.iterators_).getEndNode(); +}; + + +/** @override */ +goog.dom.MultiRangeIterator.prototype.isLast = function() { + return this.iterators_[this.currentIdx_].isLast(); +}; + + +/** @override */ +goog.dom.MultiRangeIterator.prototype.next = function() { + /** @preserveTry */ + try { + var it = this.iterators_[this.currentIdx_]; + var next = it.next(); + this.setPosition(it.node, it.tagType, it.depth); + return next; + } catch (ex) { + if (ex !== goog.iter.StopIteration || + this.iterators_.length - 1 == this.currentIdx_) { + throw ex; + } else { + // In case we got a StopIteration, increment counter and try again. + this.currentIdx_++; + return this.next(); + } + } +}; + + +/** @override */ +goog.dom.MultiRangeIterator.prototype.copyFrom = function(other) { + this.iterators_ = goog.array.clone(other.iterators_); + goog.dom.MultiRangeIterator.superClass_.copyFrom.call(this, other); +}; + + +/** + * @return {goog.dom.MultiRangeIterator} An identical iterator. + * @override + */ +goog.dom.MultiRangeIterator.prototype.clone = function() { + var copy = new goog.dom.MultiRangeIterator(null); + copy.copyFrom(this); + return copy; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/nodeiterator.js b/float-no-zero/closure-library/closure/goog/dom/nodeiterator.js new file mode 100644 index 0000000000..22453a021e --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/nodeiterator.js @@ -0,0 +1,86 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Iterator subclass for DOM tree traversal. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.NodeIterator'); + +goog.require('goog.dom.TagIterator'); + + + +/** + * A DOM tree traversal iterator. + * + * Starting with the given node, the iterator walks the DOM in order, reporting + * events for each node. The iterator acts as a prefix iterator: + * + *
+ * <div>1<span>2</span>3</div>
+ * 
+ * + * Will return the following nodes: + * + * [div, 1, span, 2, 3] + * + * With the following depths + * + * [1, 1, 2, 2, 1] + * + * Imagining | represents iterator position, the traversal stops at + * each of the following locations: + * + *
<div>|1|<span>|2|</span>3|</div>
+ * + * The iterator can also be used in reverse mode, which will return the nodes + * and states in the opposite order. The depths will be slightly different + * since, like in normal mode, the depth is computed *after* the last move. + * + * Lastly, it is possible to create an iterator that is unconstrained, meaning + * that it will continue iterating until the end of the document instead of + * until exiting the start node. + * + * @param {Node=} opt_node The start node. Defaults to an empty iterator. + * @param {boolean=} opt_reversed Whether to traverse the tree in reverse. + * @param {boolean=} opt_unconstrained Whether the iterator is not constrained + * to the starting node and its children. + * @param {number=} opt_depth The starting tree depth. + * @constructor + * @extends {goog.dom.TagIterator} + */ +goog.dom.NodeIterator = function(opt_node, opt_reversed, + opt_unconstrained, opt_depth) { + goog.dom.TagIterator.call(this, opt_node, opt_reversed, opt_unconstrained, + null, opt_depth); +}; +goog.inherits(goog.dom.NodeIterator, goog.dom.TagIterator); + + +/** + * Moves to the next position in the DOM tree. + * @return {Node} Returns the next node, or throws a goog.iter.StopIteration + * exception if the end of the iterator's range has been reached. + * @override + */ +goog.dom.NodeIterator.prototype.next = function() { + do { + goog.dom.NodeIterator.superClass_.next.call(this); + } while (this.isEndTag()); + + return this.node; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/nodeoffset.js b/float-no-zero/closure-library/closure/goog/dom/nodeoffset.js new file mode 100644 index 0000000000..084d4b0766 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/nodeoffset.js @@ -0,0 +1,112 @@ +// Copyright 2005 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Object to store the offset from one node to another in a way + * that works on any similar DOM structure regardless of whether it is the same + * actual nodes. + * + */ + +goog.provide('goog.dom.NodeOffset'); + +goog.require('goog.Disposable'); +goog.require('goog.dom.TagName'); + + + +/** + * Object to store the offset from one node to another in a way that works on + * any similar DOM structure regardless of whether it is the same actual nodes. + * @param {Node} node The node to get the offset for. + * @param {Node} baseNode The node to calculate the offset from. + * @extends {goog.Disposable} + * @constructor + */ +goog.dom.NodeOffset = function(node, baseNode) { + goog.Disposable.call(this); + + /** + * A stack of childNode offsets. + * @type {Array.} + * @private + */ + this.offsetStack_ = []; + + /** + * A stack of childNode names. + * @type {Array.} + * @private + */ + this.nameStack_ = []; + + while (node && node.nodeName != goog.dom.TagName.BODY && node != baseNode) { + // Compute the sibling offset. + var siblingOffset = 0; + var sib = node.previousSibling; + while (sib) { + sib = sib.previousSibling; + ++siblingOffset; + } + this.offsetStack_.unshift(siblingOffset); + this.nameStack_.unshift(node.nodeName); + + node = node.parentNode; + } +}; +goog.inherits(goog.dom.NodeOffset, goog.Disposable); + + +/** + * @return {string} A string representation of this object. + * @override + */ +goog.dom.NodeOffset.prototype.toString = function() { + var strs = []; + var name; + for (var i = 0; name = this.nameStack_[i]; i++) { + strs.push(this.offsetStack_[i] + ',' + name); + } + return strs.join('\n'); +}; + + +/** + * Walk the dom and find the node relative to baseNode. Returns null on + * failure. + * @param {Node} baseNode The node to start walking from. Should be equivalent + * to the node passed in to the constructor, in that it should have the + * same contents. + * @return {Node} The node relative to baseNode, or null on failure. + */ +goog.dom.NodeOffset.prototype.findTargetNode = function(baseNode) { + var name; + var curNode = baseNode; + for (var i = 0; name = this.nameStack_[i]; ++i) { + curNode = curNode.childNodes[this.offsetStack_[i]]; + + // Sanity check and make sure the element names match. + if (!curNode || curNode.nodeName != name) { + return null; + } + } + return curNode; +}; + + +/** @override */ +goog.dom.NodeOffset.prototype.disposeInternal = function() { + delete this.offsetStack_; + delete this.nameStack_; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/abstractpattern.js b/float-no-zero/closure-library/closure/goog/dom/pattern/abstractpattern.js new file mode 100644 index 0000000000..6015b09c5e --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/abstractpattern.js @@ -0,0 +1,60 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern base class. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.AbstractPattern'); + +goog.require('goog.dom.pattern.MatchType'); + + + +/** + * Base pattern class for DOM matching. + * + * @constructor + */ +goog.dom.pattern.AbstractPattern = function() { +}; + + +/** + * The first node matched by this pattern. + * @type {Node} + */ +goog.dom.pattern.AbstractPattern.prototype.matchedNode = null; + + +/** + * Reset any internal state this pattern keeps. + */ +goog.dom.pattern.AbstractPattern.prototype.reset = function() { + // The base implementation does nothing. +}; + + +/** + * Test whether this pattern matches the given token. + * + * @param {Node} token Token to match against. + * @param {goog.dom.TagWalkType} type The type of token. + * @return {goog.dom.pattern.MatchType} {@code MATCH} if the pattern matches. + */ +goog.dom.pattern.AbstractPattern.prototype.matchToken = function(token, type) { + return goog.dom.pattern.MatchType.NO_MATCH; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/allchildren.js b/float-no-zero/closure-library/closure/goog/dom/pattern/allchildren.js new file mode 100644 index 0000000000..86f8cdf9e3 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/allchildren.js @@ -0,0 +1,75 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match any children of a tag. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.AllChildren'); + +goog.require('goog.dom.pattern.AbstractPattern'); +goog.require('goog.dom.pattern.MatchType'); + + + +/** + * Pattern object that matches any nodes at or below the current tree depth. + * + * @constructor + * @extends {goog.dom.pattern.AbstractPattern} + */ +goog.dom.pattern.AllChildren = function() { +}; +goog.inherits(goog.dom.pattern.AllChildren, goog.dom.pattern.AbstractPattern); + + +/** + * Tracks the matcher's depth to detect the end of the tag. + * + * @type {number} + * @private + */ +goog.dom.pattern.AllChildren.prototype.depth_ = 0; + + +/** + * Test whether the given token is on the same level. + * + * @param {Node} token Token to match against. + * @param {goog.dom.TagWalkType} type The type of token. + * @return {goog.dom.pattern.MatchType} {@code MATCHING} if the token is on the + * same level or deeper and {@code BACKTRACK_MATCH} if not. + * @override + */ +goog.dom.pattern.AllChildren.prototype.matchToken = function(token, type) { + this.depth_ += type; + + if (this.depth_ >= 0) { + return goog.dom.pattern.MatchType.MATCHING; + } else { + this.depth_ = 0; + return goog.dom.pattern.MatchType.BACKTRACK_MATCH; + } +}; + + +/** + * Reset any internal state this pattern keeps. + * @override + */ +goog.dom.pattern.AllChildren.prototype.reset = function() { + this.depth_ = 0; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/callback/callback.js b/float-no-zero/closure-library/closure/goog/dom/pattern/callback/callback.js new file mode 100644 index 0000000000..7d7aa60c33 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/callback/callback.js @@ -0,0 +1,82 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Useful callback functions for the DOM matcher. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.callback'); + +goog.require('goog.dom'); +goog.require('goog.dom.TagWalkType'); +goog.require('goog.iter'); + + +/** + * Callback function for use in {@link goog.dom.pattern.Matcher.addPattern} + * that removes the matched node from the tree. Should be used in conjunciton + * with a {@link goog.dom.pattern.StartTag} pattern. + * + * @param {Node} node The node matched by the pattern. + * @param {goog.dom.TagIterator} position The position where the match + * finished. + * @return {boolean} Returns true to indicate tree changes were made. + */ +goog.dom.pattern.callback.removeNode = function(node, position) { + // Find out which position would be next. + position.setPosition(node, goog.dom.TagWalkType.END_TAG); + + goog.iter.nextOrValue(position, null); + + // Remove the node. + goog.dom.removeNode(node); + + // Correct for the depth change. + position.depth -= 1; + + // Indicate that we made position/tree changes. + return true; +}; + + +/** + * Callback function for use in {@link goog.dom.pattern.Matcher.addPattern} + * that removes the matched node from the tree and replaces it with its + * children. Should be used in conjunction with a + * {@link goog.dom.pattern.StartTag} pattern. + * + * @param {Element} node The node matched by the pattern. + * @param {goog.dom.TagIterator} position The position where the match + * finished. + * @return {boolean} Returns true to indicate tree changes were made. + */ +goog.dom.pattern.callback.flattenElement = function(node, position) { + // Find out which position would be next. + position.setPosition(node, node.firstChild ? + goog.dom.TagWalkType.START_TAG : + goog.dom.TagWalkType.END_TAG); + + goog.iter.nextOrValue(position, null); + + // Flatten the node. + goog.dom.flattenElement(node); + + // Correct for the depth change. + position.depth -= 1; + + // Indicate that we made position/tree changes. + return true; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/callback/counter.js b/float-no-zero/closure-library/closure/goog/dom/pattern/callback/counter.js new file mode 100644 index 0000000000..a354de05f1 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/callback/counter.js @@ -0,0 +1,72 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Callback object that counts matches. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.callback.Counter'); + + + +/** + * Callback class for counting matches. + * @constructor + */ +goog.dom.pattern.callback.Counter = function() { +}; + + +/** + * The count of objects matched so far. + * + * @type {number} + */ +goog.dom.pattern.callback.Counter.prototype.count = 0; + + +/** + * The callback function. Suitable as a callback for + * {@link goog.dom.pattern.Matcher}. + * @type {Function} + * @private + */ +goog.dom.pattern.callback.Counter.prototype.callback_ = null; + + +/** + * Get a bound callback function that is suitable as a callback for + * {@link goog.dom.pattern.Matcher}. + * + * @return {Function} A callback function. + */ +goog.dom.pattern.callback.Counter.prototype.getCallback = function() { + if (!this.callback_) { + this.callback_ = goog.bind(function() { + this.count++; + return false; + }, this); + } + return this.callback_; +}; + + +/** + * Reset the counter. + */ +goog.dom.pattern.callback.Counter.prototype.reset = function() { + this.count = 0; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/callback/test.js b/float-no-zero/closure-library/closure/goog/dom/pattern/callback/test.js new file mode 100644 index 0000000000..30a58c1615 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/callback/test.js @@ -0,0 +1,77 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Callback object that tests if a pattern matches at least once. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.callback.Test'); + +goog.require('goog.iter.StopIteration'); + + + +/** + * Callback class for testing for at least one match. + * @constructor + */ +goog.dom.pattern.callback.Test = function() { +}; + + +/** + * Whether or not the pattern matched. + * + * @type {boolean} + */ +goog.dom.pattern.callback.Test.prototype.matched = false; + + +/** + * The callback function. Suitable as a callback for + * {@link goog.dom.pattern.Matcher}. + * @type {Function} + * @private + */ +goog.dom.pattern.callback.Test.prototype.callback_ = null; + + +/** + * Get a bound callback function that is suitable as a callback for + * {@link goog.dom.pattern.Matcher}. + * + * @return {Function} A callback function. + */ +goog.dom.pattern.callback.Test.prototype.getCallback = function() { + if (!this.callback_) { + this.callback_ = goog.bind(function(node, position) { + // Mark our match. + this.matched = true; + + // Stop searching. + throw goog.iter.StopIteration; + }, this); + } + return this.callback_; +}; + + +/** + * Reset the counter. + */ +goog.dom.pattern.callback.Test.prototype.reset = function() { + this.matched = false; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/childmatches.js b/float-no-zero/closure-library/closure/goog/dom/pattern/childmatches.js new file mode 100644 index 0000000000..72f1b51f33 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/childmatches.js @@ -0,0 +1,154 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match any children of a tag, and + * specifically collect those that match a child pattern. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.ChildMatches'); + +goog.require('goog.dom.pattern.AllChildren'); +goog.require('goog.dom.pattern.MatchType'); + + + +/** + * Pattern object that matches any nodes at or below the current tree depth. + * + * @param {goog.dom.pattern.AbstractPattern} childPattern Pattern to collect + * child matches of. + * @param {number=} opt_minimumMatches Enforce a minimum nuber of matches. + * Defaults to 0. + * @constructor + * @extends {goog.dom.pattern.AllChildren} + */ +goog.dom.pattern.ChildMatches = function(childPattern, opt_minimumMatches) { + this.childPattern_ = childPattern; + this.matches = []; + this.minimumMatches_ = opt_minimumMatches || 0; + goog.dom.pattern.AllChildren.call(this); +}; +goog.inherits(goog.dom.pattern.ChildMatches, goog.dom.pattern.AllChildren); + + +/** + * Array of matched child nodes. + * + * @type {Array.} + */ +goog.dom.pattern.ChildMatches.prototype.matches; + + +/** + * Minimum number of matches. + * + * @type {number} + * @private + */ +goog.dom.pattern.ChildMatches.prototype.minimumMatches_ = 0; + + +/** + * The child pattern to collect matches from. + * + * @type {goog.dom.pattern.AbstractPattern} + * @private + */ +goog.dom.pattern.ChildMatches.prototype.childPattern_; + + +/** + * Whether the pattern has recently matched or failed to match and will need to + * be reset when starting a new round of matches. + * + * @type {boolean} + * @private + */ +goog.dom.pattern.ChildMatches.prototype.needsReset_ = false; + + +/** + * Test whether the given token is on the same level. + * + * @param {Node} token Token to match against. + * @param {goog.dom.TagWalkType} type The type of token. + * @return {goog.dom.pattern.MatchType} {@code MATCHING} if the token is on the + * same level or deeper and {@code BACKTRACK_MATCH} if not. + * @override + */ +goog.dom.pattern.ChildMatches.prototype.matchToken = function(token, type) { + // Defer resets so we maintain our matches array until the last possible time. + if (this.needsReset_) { + this.reset(); + } + + // Call the super-method to ensure we stay in the child tree. + var status = + goog.dom.pattern.AllChildren.prototype.matchToken.apply(this, arguments); + + switch (status) { + case goog.dom.pattern.MatchType.MATCHING: + var backtrack = false; + + switch (this.childPattern_.matchToken(token, type)) { + case goog.dom.pattern.MatchType.BACKTRACK_MATCH: + backtrack = true; + case goog.dom.pattern.MatchType.MATCH: + // Collect the match. + this.matches.push(this.childPattern_.matchedNode); + break; + + default: + // Keep trying if we haven't hit a terminal state. + break; + } + + if (backtrack) { + // The only interesting result is a MATCH, since BACKTRACK_MATCH means + // we are hitting an infinite loop on something like a Repeat(0). + if (this.childPattern_.matchToken(token, type) == + goog.dom.pattern.MatchType.MATCH) { + this.matches.push(this.childPattern_.matchedNode); + } + } + return goog.dom.pattern.MatchType.MATCHING; + + case goog.dom.pattern.MatchType.BACKTRACK_MATCH: + // TODO(robbyw): this should return something like BACKTRACK_NO_MATCH + // when we don't meet our minimum. + this.needsReset_ = true; + return (this.matches.length >= this.minimumMatches_) ? + goog.dom.pattern.MatchType.BACKTRACK_MATCH : + goog.dom.pattern.MatchType.NO_MATCH; + + default: + this.needsReset_ = true; + return status; + } +}; + + +/** + * Reset any internal state this pattern keeps. + * @override + */ +goog.dom.pattern.ChildMatches.prototype.reset = function() { + this.needsReset_ = false; + this.matches.length = 0; + this.childPattern_.reset(); + goog.dom.pattern.AllChildren.prototype.reset.call(this); +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/endtag.js b/float-no-zero/closure-library/closure/goog/dom/pattern/endtag.js new file mode 100644 index 0000000000..75f995266d --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/endtag.js @@ -0,0 +1,53 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match the end of a tag. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.EndTag'); + +goog.require('goog.dom.TagWalkType'); +goog.require('goog.dom.pattern.Tag'); + + + +/** + * Pattern object that matches a closing tag. + * + * @param {string|RegExp} tag Name of the tag. Also will accept a regular + * expression to match against the tag name. + * @param {Object=} opt_attrs Optional map of attribute names to desired values. + * This pattern will only match when all attributes are present and match + * the string or regular expression value provided here. + * @param {Object=} opt_styles Optional map of CSS style names to desired + * values. This pattern will only match when all styles are present and + * match the string or regular expression value provided here. + * @param {Function=} opt_test Optional function that takes the element as a + * parameter and returns true if this pattern should match it. + * @constructor + * @extends {goog.dom.pattern.Tag} + */ +goog.dom.pattern.EndTag = function(tag, opt_attrs, opt_styles, opt_test) { + goog.dom.pattern.Tag.call( + this, + tag, + goog.dom.TagWalkType.END_TAG, + opt_attrs, + opt_styles, + opt_test); +}; +goog.inherits(goog.dom.pattern.EndTag, goog.dom.pattern.Tag); diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/fulltag.js b/float-no-zero/closure-library/closure/goog/dom/pattern/fulltag.js new file mode 100644 index 0000000000..1fa2230319 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/fulltag.js @@ -0,0 +1,93 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match a tag and all of its children. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.FullTag'); + +goog.require('goog.dom.pattern.MatchType'); +goog.require('goog.dom.pattern.StartTag'); +goog.require('goog.dom.pattern.Tag'); + + + +/** + * Pattern object that matches a full tag including all its children. + * + * @param {string|RegExp} tag Name of the tag. Also will accept a regular + * expression to match against the tag name. + * @param {Object=} opt_attrs Optional map of attribute names to desired values. + * This pattern will only match when all attributes are present and match + * the string or regular expression value provided here. + * @param {Object=} opt_styles Optional map of CSS style names to desired + * values. This pattern will only match when all styles are present and + * match the string or regular expression value provided here. + * @param {Function=} opt_test Optional function that takes the element as a + * parameter and returns true if this pattern should match it. + * @constructor + * @extends {goog.dom.pattern.StartTag} + */ +goog.dom.pattern.FullTag = function(tag, opt_attrs, opt_styles, opt_test) { + goog.dom.pattern.StartTag.call( + this, + tag, + opt_attrs, + opt_styles, + opt_test); +}; +goog.inherits(goog.dom.pattern.FullTag, goog.dom.pattern.StartTag); + + +/** + * Tracks the matcher's depth to detect the end of the tag. + * + * @type {number} + * @private + */ +goog.dom.pattern.FullTag.prototype.depth_ = 0; + + +/** + * Test whether the given token is a start tag token which matches the tag name, + * style, and attributes provided in the constructor. + * + * @param {Node} token Token to match against. + * @param {goog.dom.TagWalkType} type The type of token. + * @return {goog.dom.pattern.MatchType} MATCH at the end of our + * tag, MATCHING if we are within the tag, and + * NO_MATCH if the starting tag does not match. + * @override + */ +goog.dom.pattern.FullTag.prototype.matchToken = function(token, type) { + if (!this.depth_) { + // If we have not yet started, make sure we match as a StartTag. + if (goog.dom.pattern.Tag.prototype.matchToken.call(this, token, type)) { + this.depth_ = type; + return goog.dom.pattern.MatchType.MATCHING; + + } else { + return goog.dom.pattern.MatchType.NO_MATCH; + } + } else { + this.depth_ += type; + + return this.depth_ ? + goog.dom.pattern.MatchType.MATCHING : + goog.dom.pattern.MatchType.MATCH; + } +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/matcher.js b/float-no-zero/closure-library/closure/goog/dom/pattern/matcher.js new file mode 100644 index 0000000000..c0c87a3d27 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/matcher.js @@ -0,0 +1,150 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern matcher. Allows for simple searching of DOM + * using patterns descended from {@link goog.dom.pattern.AbstractPattern}. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.Matcher'); + +goog.require('goog.dom.TagIterator'); +goog.require('goog.dom.pattern.MatchType'); +goog.require('goog.iter'); + + +// TODO(robbyw): Allow for backtracks of size > 1. + + + +/** + * Given a set of patterns and a root node, this class tests the patterns in + * parallel. + * + * It is not (yet) a smart matcher - it doesn't do any advanced backtracking. + * Given the pattern DIV, SPAN the matcher will not match + * DIV, DIV, SPAN because it starts matching at the first + * DIV, fails to match SPAN at the second, and never + * backtracks to try again. + * + * It is also possible to have a set of complex patterns that when matched in + * parallel will miss some possible matches. Running multiple times will catch + * all matches eventually. + * + * @constructor + */ +goog.dom.pattern.Matcher = function() { + this.patterns_ = []; + this.callbacks_ = []; +}; + + +/** + * Array of patterns to attempt to match in parallel. + * + * @type {Array.} + * @private + */ +goog.dom.pattern.Matcher.prototype.patterns_; + + +/** + * Array of callbacks to call when a pattern is matched. The indexing is the + * same as the {@link #patterns_} array. + * + * @type {Array.} + * @private + */ +goog.dom.pattern.Matcher.prototype.callbacks_; + + +/** + * Adds a pattern to be matched. The callback can return an object whose keys + * are processing instructions. + * + * @param {goog.dom.pattern.AbstractPattern} pattern The pattern to add. + * @param {Function} callback Function to call when a match is found. Uses + * the above semantics. + */ +goog.dom.pattern.Matcher.prototype.addPattern = function(pattern, callback) { + this.patterns_.push(pattern); + this.callbacks_.push(callback); +}; + + +/** + * Resets all the patterns. + * + * @private + */ +goog.dom.pattern.Matcher.prototype.reset_ = function() { + for (var i = 0, len = this.patterns_.length; i < len; i++) { + this.patterns_[i].reset(); + } +}; + + +/** + * Test the given node against all patterns. + * + * @param {goog.dom.TagIterator} position A position in a node walk that is + * located at the token to process. + * @return {boolean} Whether a pattern modified the position or tree + * and its callback resulted in DOM structure or position modification. + * @private + */ +goog.dom.pattern.Matcher.prototype.matchToken_ = function(position) { + for (var i = 0, len = this.patterns_.length; i < len; i++) { + var pattern = this.patterns_[i]; + switch (pattern.matchToken(position.node, position.tagType)) { + case goog.dom.pattern.MatchType.MATCH: + case goog.dom.pattern.MatchType.BACKTRACK_MATCH: + var callback = this.callbacks_[i]; + + // Callbacks are allowed to modify the current position, but must + // return true if the do. + if (callback(pattern.matchedNode, position, pattern)) { + return true; + } + + default: + // Do nothing. + break; + } + } + + return false; +}; + + +/** + * Match the set of patterns against a match tree. + * + * @param {Node} node The root node of the tree to match. + */ +goog.dom.pattern.Matcher.prototype.match = function(node) { + var position = new goog.dom.TagIterator(node); + + this.reset_(); + + goog.iter.forEach(position, function() { + while (this.matchToken_(position)) { + // Since we've moved, our old pattern statuses don't make sense any more. + // Reset them. + this.reset_(); + } + }, this); +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/nodetype.js b/float-no-zero/closure-library/closure/goog/dom/pattern/nodetype.js new file mode 100644 index 0000000000..b13bbe18c8 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/nodetype.js @@ -0,0 +1,58 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match a node of the given type. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.NodeType'); + +goog.require('goog.dom.pattern.AbstractPattern'); +goog.require('goog.dom.pattern.MatchType'); + + + +/** + * Pattern object that matches any node of the given type. + * @param {goog.dom.NodeType} nodeType The node type to match. + * @constructor + * @extends {goog.dom.pattern.AbstractPattern} + */ +goog.dom.pattern.NodeType = function(nodeType) { + /** + * The node type to match. + * @type {goog.dom.NodeType} + * @private + */ + this.nodeType_ = nodeType; +}; +goog.inherits(goog.dom.pattern.NodeType, goog.dom.pattern.AbstractPattern); + + +/** + * Test whether the given token is a text token which matches the string or + * regular expression provided in the constructor. + * @param {Node} token Token to match against. + * @param {goog.dom.TagWalkType} type The type of token. + * @return {goog.dom.pattern.MatchType} MATCH if the pattern + * matches, NO_MATCH otherwise. + * @override + */ +goog.dom.pattern.NodeType.prototype.matchToken = function(token, type) { + return token.nodeType == this.nodeType_ ? + goog.dom.pattern.MatchType.MATCH : + goog.dom.pattern.MatchType.NO_MATCH; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/pattern.js b/float-no-zero/closure-library/closure/goog/dom/pattern/pattern.js new file mode 100644 index 0000000000..19f4d1b794 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/pattern.js @@ -0,0 +1,93 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM patterns. Allows for description of complex DOM patterns + * using regular expression like constructs. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern'); +goog.provide('goog.dom.pattern.MatchType'); + + +/** + * Regular expression for breaking text nodes. + * @type {RegExp} + */ +goog.dom.pattern.BREAKING_TEXTNODE_RE = /^\s*$/; + + +/** + * Utility function to match a string against either a string or a regular + * expression. + * + * @param {string|RegExp} obj Either a string or a regular expression. + * @param {string} str The string to match. + * @return {boolean} Whether the strings are equal, or if the string matches + * the regular expression. + */ +goog.dom.pattern.matchStringOrRegex = function(obj, str) { + if (goog.isString(obj)) { + // Match a string + return str == obj; + } else { + // Match a regular expression + return !!(str && str.match(obj)); + } +}; + + +/** + * Utility function to match a DOM attribute against either a string or a + * regular expression. Conforms to the interface spec for + * {@link goog.object#every}. + * + * @param {string|RegExp} elem Either a string or a regular expression. + * @param {string} index The attribute name to match. + * @param {Object} orig The original map of matches to test. + * @return {boolean} Whether the strings are equal, or if the attribute matches + * the regular expression. + * @this {Element} Called using goog.object every on an Element. + */ +goog.dom.pattern.matchStringOrRegexMap = function(elem, index, orig) { + return goog.dom.pattern.matchStringOrRegex(elem, + index in this ? this[index] : + (this.getAttribute ? this.getAttribute(index) : null)); +}; + + +/** + * When matched to a token, a pattern may return any of the following statuses: + *
    + *
  1. NO_MATCH - The pattern does not match. This is the only + * value that evaluates to false in a boolean context. + *
  2. MATCHING - The token is part of an incomplete match. + *
  3. MATCH - The token completes a match. + *
  4. BACKTRACK_MATCH - The token does not match, but indicates + * the end of a repetitive match. For instance, in regular expressions, + * the pattern /a+/ would match 'aaaaaaaab'. + * Every 'a' token would give a status of + * MATCHING while the 'b' token would give a + * status of BACKTRACK_MATCH. + *
+ * @enum {number} + */ +goog.dom.pattern.MatchType = { + NO_MATCH: 0, + MATCHING: 1, + MATCH: 2, + BACKTRACK_MATCH: 3 +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/repeat.js b/float-no-zero/closure-library/closure/goog/dom/pattern/repeat.js new file mode 100644 index 0000000000..5a47de0b08 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/repeat.js @@ -0,0 +1,190 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match a tag and all of its children. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.Repeat'); + +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.pattern.AbstractPattern'); +goog.require('goog.dom.pattern.MatchType'); + + + +/** + * Pattern object that matches a repetition of another pattern. + * @param {goog.dom.pattern.AbstractPattern} pattern The pattern to + * repetitively match. + * @param {number=} opt_minimum The minimum number of times to match. Defaults + * to 0. + * @param {number=} opt_maximum The maximum number of times to match. Defaults + * to unlimited. + * @constructor + * @extends {goog.dom.pattern.AbstractPattern} + */ +goog.dom.pattern.Repeat = function(pattern, + opt_minimum, + opt_maximum) { + this.pattern_ = pattern; + this.minimum_ = opt_minimum || 0; + this.maximum_ = opt_maximum || null; + this.matches = []; +}; +goog.inherits(goog.dom.pattern.Repeat, goog.dom.pattern.AbstractPattern); + + +/** + * Pattern to repetitively match. + * + * @type {goog.dom.pattern.AbstractPattern} + * @private + */ +goog.dom.pattern.Repeat.prototype.pattern_; + + +/** + * Minimum number of times to match the pattern. + * + * @private + */ +goog.dom.pattern.Repeat.prototype.minimum_ = 0; + + +/** + * Optional maximum number of times to match the pattern. A {@code null} value + * will be treated as infinity. + * + * @type {?number} + * @private + */ +goog.dom.pattern.Repeat.prototype.maximum_ = 0; + + +/** + * Number of times the pattern has matched. + * + * @type {number} + */ +goog.dom.pattern.Repeat.prototype.count = 0; + + +/** + * Whether the pattern has recently matched or failed to match and will need to + * be reset when starting a new round of matches. + * + * @type {boolean} + * @private + */ +goog.dom.pattern.Repeat.prototype.needsReset_ = false; + + +/** + * The matched nodes. + * + * @type {Array.} + */ +goog.dom.pattern.Repeat.prototype.matches; + + +/** + * Test whether the given token continues a repeated series of matches of the + * pattern given in the constructor. + * + * @param {Node} token Token to match against. + * @param {goog.dom.TagWalkType} type The type of token. + * @return {goog.dom.pattern.MatchType} MATCH if the pattern + * matches, BACKTRACK_MATCH if the pattern does not match + * but already had accumulated matches, MATCHING if the pattern + * starts a match, and NO_MATCH if the pattern does not match. + * @suppress {missingProperties} See the broken line below. + * @override + */ +goog.dom.pattern.Repeat.prototype.matchToken = function(token, type) { + // Reset if we're starting a new match + if (this.needsReset_) { + this.reset(); + } + + // If the option is set, ignore any whitespace only text nodes + if (token.nodeType == goog.dom.NodeType.TEXT && + token.nodeValue.match(/^\s+$/)) { + return goog.dom.pattern.MatchType.MATCHING; + } + + switch (this.pattern_.matchToken(token, type)) { + case goog.dom.pattern.MatchType.MATCH: + // Record the first token we match. + if (this.count == 0) { + this.matchedNode = token; + } + + // Mark the match + this.count++; + + // Add to the list + this.matches.push(this.pattern_.matchedNode); + + // Check if this match hits our maximum + if (this.maximum_ !== null && this.count == this.maximum_) { + this.needsReset_ = true; + return goog.dom.pattern.MatchType.MATCH; + } else { + return goog.dom.pattern.MatchType.MATCHING; + } + + case goog.dom.pattern.MatchType.MATCHING: + // This can happen when our child pattern is a sequence or a repetition. + return goog.dom.pattern.MatchType.MATCHING; + + case goog.dom.pattern.MatchType.BACKTRACK_MATCH: + // This happens if our child pattern is repetitive too. + // TODO(robbyw): Backtrack further if necessary. + this.count++; + + // NOTE(nicksantos): This line of code is broken. this.patterns_ doesn't + // exist, and this.currentPosition_ doesn't exit. When this is fixed, + // remove the missingProperties suppression above. + if (this.currentPosition_ == this.patterns_.length) { + this.needsReset_ = true; + return goog.dom.pattern.MatchType.BACKTRACK_MATCH; + } else { + // Retry the same token on the next iteration of the child pattern. + return this.matchToken(token, type); + } + + default: + this.needsReset_ = true; + if (this.count >= this.minimum_) { + return goog.dom.pattern.MatchType.BACKTRACK_MATCH; + } else { + return goog.dom.pattern.MatchType.NO_MATCH; + } + } +}; + + +/** + * Reset any internal state this pattern keeps. + * @override + */ +goog.dom.pattern.Repeat.prototype.reset = function() { + this.pattern_.reset(); + this.count = 0; + this.needsReset_ = false; + this.matches.length = 0; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/sequence.js b/float-no-zero/closure-library/closure/goog/dom/pattern/sequence.js new file mode 100644 index 0000000000..df40fd6f61 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/sequence.js @@ -0,0 +1,141 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match a sequence of other patterns. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.Sequence'); + +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.pattern.AbstractPattern'); +goog.require('goog.dom.pattern.MatchType'); + + + +/** + * Pattern object that matches a sequence of other patterns. + * + * @param {Array.} patterns Ordered array of + * patterns to match. + * @param {boolean=} opt_ignoreWhitespace Optional flag to ignore text nodes + * consisting entirely of whitespace. The default is to not ignore them. + * @constructor + * @extends {goog.dom.pattern.AbstractPattern} + */ +goog.dom.pattern.Sequence = function(patterns, opt_ignoreWhitespace) { + this.patterns = patterns; + this.ignoreWhitespace_ = !!opt_ignoreWhitespace; +}; +goog.inherits(goog.dom.pattern.Sequence, goog.dom.pattern.AbstractPattern); + + +/** + * Ordered array of patterns to match. + * + * @type {Array.} + */ +goog.dom.pattern.Sequence.prototype.patterns; + + +/** + * Position in the patterns array we have reached by successful matches. + * + * @type {number} + * @private + */ +goog.dom.pattern.Sequence.prototype.currentPosition_ = 0; + + +/** + * Whether or not to ignore whitespace only Text nodes. + * + * @type {boolean} + * @private + */ +goog.dom.pattern.Sequence.prototype.ignoreWhitespace_ = false; + + +/** + * Test whether the given token starts, continues, or finishes the sequence + * of patterns given in the constructor. + * + * @param {Node} token Token to match against. + * @param {goog.dom.TagWalkType} type The type of token. + * @return {goog.dom.pattern.MatchType} MATCH if the pattern + * matches, MATCHING if the pattern starts a match, and + * NO_MATCH if the pattern does not match. + * @override + */ +goog.dom.pattern.Sequence.prototype.matchToken = function(token, type) { + // If the option is set, ignore any whitespace only text nodes + if (this.ignoreWhitespace_ && token.nodeType == goog.dom.NodeType.TEXT && + goog.dom.pattern.BREAKING_TEXTNODE_RE.test(token.nodeValue)) { + return goog.dom.pattern.MatchType.MATCHING; + } + + switch (this.patterns[this.currentPosition_].matchToken(token, type)) { + case goog.dom.pattern.MatchType.MATCH: + // Record the first token we match. + if (this.currentPosition_ == 0) { + this.matchedNode = token; + } + + // Move forward one position. + this.currentPosition_++; + + // Check if this is the last position. + if (this.currentPosition_ == this.patterns.length) { + this.reset(); + return goog.dom.pattern.MatchType.MATCH; + } else { + return goog.dom.pattern.MatchType.MATCHING; + } + + case goog.dom.pattern.MatchType.MATCHING: + // This can happen when our child pattern is a sequence or a repetition. + return goog.dom.pattern.MatchType.MATCHING; + + case goog.dom.pattern.MatchType.BACKTRACK_MATCH: + // This means a repetitive match succeeded 1 token ago. + // TODO(robbyw): Backtrack further if necessary. + this.currentPosition_++; + + if (this.currentPosition_ == this.patterns.length) { + this.reset(); + return goog.dom.pattern.MatchType.BACKTRACK_MATCH; + } else { + // Retry the same token on the next pattern. + return this.matchToken(token, type); + } + + default: + this.reset(); + return goog.dom.pattern.MatchType.NO_MATCH; + } +}; + + +/** + * Reset any internal state this pattern keeps. + * @override + */ +goog.dom.pattern.Sequence.prototype.reset = function() { + if (this.patterns[this.currentPosition_]) { + this.patterns[this.currentPosition_].reset(); + } + this.currentPosition_ = 0; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/starttag.js b/float-no-zero/closure-library/closure/goog/dom/pattern/starttag.js new file mode 100644 index 0000000000..4ce01135ea --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/starttag.js @@ -0,0 +1,53 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match the start of a tag. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.StartTag'); + +goog.require('goog.dom.TagWalkType'); +goog.require('goog.dom.pattern.Tag'); + + + +/** + * Pattern object that matches an opening tag. + * + * @param {string|RegExp} tag Name of the tag. Also will accept a regular + * expression to match against the tag name. + * @param {Object=} opt_attrs Optional map of attribute names to desired values. + * This pattern will only match when all attributes are present and match + * the string or regular expression value provided here. + * @param {Object=} opt_styles Optional map of CSS style names to desired + * values. This pattern will only match when all styles are present and + * match the string or regular expression value provided here. + * @param {Function=} opt_test Optional function that takes the element as a + * parameter and returns true if this pattern should match it. + * @constructor + * @extends {goog.dom.pattern.Tag} + */ +goog.dom.pattern.StartTag = function(tag, opt_attrs, opt_styles, opt_test) { + goog.dom.pattern.Tag.call( + this, + tag, + goog.dom.TagWalkType.START_TAG, + opt_attrs, + opt_styles, + opt_test); +}; +goog.inherits(goog.dom.pattern.StartTag, goog.dom.pattern.Tag); diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/tag.js b/float-no-zero/closure-library/closure/goog/dom/pattern/tag.js new file mode 100644 index 0000000000..d04ccd3a3f --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/tag.js @@ -0,0 +1,150 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match a tag. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.Tag'); + +goog.require('goog.dom.pattern'); +goog.require('goog.dom.pattern.AbstractPattern'); +goog.require('goog.dom.pattern.MatchType'); +goog.require('goog.object'); + + + +/** + * Pattern object that matches an tag. + * + * @param {string|RegExp} tag Name of the tag. Also will accept a regular + * expression to match against the tag name. + * @param {goog.dom.TagWalkType} type Type of token to match. + * @param {Object=} opt_attrs Optional map of attribute names to desired values. + * This pattern will only match when all attributes are present and match + * the string or regular expression value provided here. + * @param {Object=} opt_styles Optional map of CSS style names to desired + * values. This pattern will only match when all styles are present and + * match the string or regular expression value provided here. + * @param {Function=} opt_test Optional function that takes the element as a + * parameter and returns true if this pattern should match it. + * @constructor + * @extends {goog.dom.pattern.AbstractPattern} + */ +goog.dom.pattern.Tag = function(tag, type, opt_attrs, opt_styles, opt_test) { + if (goog.isString(tag)) { + this.tag_ = tag.toUpperCase(); + } else { + this.tag_ = tag; + } + + this.type_ = type; + + this.attrs_ = opt_attrs || null; + this.styles_ = opt_styles || null; + this.test_ = opt_test || null; +}; +goog.inherits(goog.dom.pattern.Tag, goog.dom.pattern.AbstractPattern); + + +/** + * The tag to match. + * + * @type {string|RegExp} + * @private + */ +goog.dom.pattern.Tag.prototype.tag_; + + +/** + * The type of token to match. + * + * @type {goog.dom.TagWalkType} + * @private + */ +goog.dom.pattern.Tag.prototype.type_; + + +/** + * The attributes to test for. + * + * @type {Object} + * @private + */ +goog.dom.pattern.Tag.prototype.attrs_ = null; + + +/** + * The styles to test for. + * + * @type {Object} + * @private + */ +goog.dom.pattern.Tag.prototype.styles_ = null; + + +/** + * Function that takes the element as a parameter and returns true if this + * pattern should match it. + * + * @type {Function} + * @private + */ +goog.dom.pattern.Tag.prototype.test_ = null; + + +/** + * Test whether the given token is a tag token which matches the tag name, + * style, and attributes provided in the constructor. + * + * @param {Node} token Token to match against. + * @param {goog.dom.TagWalkType} type The type of token. + * @return {goog.dom.pattern.MatchType} MATCH if the pattern + * matches, NO_MATCH otherwise. + * @override + */ +goog.dom.pattern.Tag.prototype.matchToken = function(token, type) { + // Check the direction and tag name. + if (type == this.type_ && + goog.dom.pattern.matchStringOrRegex(this.tag_, token.nodeName)) { + // Check the attributes. + if (this.attrs_ && + !goog.object.every( + this.attrs_, + goog.dom.pattern.matchStringOrRegexMap, + token)) { + return goog.dom.pattern.MatchType.NO_MATCH; + } + // Check the styles. + if (this.styles_ && + !goog.object.every( + this.styles_, + goog.dom.pattern.matchStringOrRegexMap, + token.style)) { + return goog.dom.pattern.MatchType.NO_MATCH; + } + + if (this.test_ && !this.test_(token)) { + return goog.dom.pattern.MatchType.NO_MATCH; + } + + // If we reach this point, we have a match and should save it. + this.matchedNode = token; + return goog.dom.pattern.MatchType.MATCH; + } + + return goog.dom.pattern.MatchType.NO_MATCH; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/pattern/text.js b/float-no-zero/closure-library/closure/goog/dom/pattern/text.js new file mode 100644 index 0000000000..5b625ab84e --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/pattern/text.js @@ -0,0 +1,70 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview DOM pattern to match a text node. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.pattern.Text'); + +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.pattern'); +goog.require('goog.dom.pattern.AbstractPattern'); +goog.require('goog.dom.pattern.MatchType'); + + + +/** + * Pattern object that matches text by exact matching or regular expressions. + * + * @param {string|RegExp} match String or regular expression to match against. + * @constructor + * @extends {goog.dom.pattern.AbstractPattern} + */ +goog.dom.pattern.Text = function(match) { + this.match_ = match; +}; +goog.inherits(goog.dom.pattern.Text, goog.dom.pattern.AbstractPattern); + + +/** + * The text or regular expression to match. + * + * @type {string|RegExp} + * @private + */ +goog.dom.pattern.Text.prototype.match_; + + +/** + * Test whether the given token is a text token which matches the string or + * regular expression provided in the constructor. + * + * @param {Node} token Token to match against. + * @param {goog.dom.TagWalkType} type The type of token. + * @return {goog.dom.pattern.MatchType} MATCH if the pattern + * matches, NO_MATCH otherwise. + * @override + */ +goog.dom.pattern.Text.prototype.matchToken = function(token, type) { + if (token.nodeType == goog.dom.NodeType.TEXT && + goog.dom.pattern.matchStringOrRegex(this.match_, token.nodeValue)) { + this.matchedNode = token; + return goog.dom.pattern.MatchType.MATCH; + } + + return goog.dom.pattern.MatchType.NO_MATCH; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/range.js b/float-no-zero/closure-library/closure/goog/dom/range.js new file mode 100644 index 0000000000..3df70816ed --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/range.js @@ -0,0 +1,226 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilities for working with ranges in HTML documents. + * + * @author robbyw@google.com (Robby Walker) + * @author ojan@google.com (Ojan Vafai) + * @author jparent@google.com (Julie Parent) + */ + +goog.provide('goog.dom.Range'); + +goog.require('goog.dom'); +goog.require('goog.dom.AbstractRange'); +goog.require('goog.dom.ControlRange'); +goog.require('goog.dom.MultiRange'); +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.TextRange'); +goog.require('goog.userAgent'); + + +/** + * Create a new selection from the given browser window's current selection. + * Note that this object does not auto-update if the user changes their + * selection and should be used as a snapshot. + * @param {Window=} opt_win The window to get the selection of. Defaults to the + * window this class was defined in. + * @return {goog.dom.AbstractRange?} A range wrapper object, or null if there + * was an error. + */ +goog.dom.Range.createFromWindow = function(opt_win) { + var sel = goog.dom.AbstractRange.getBrowserSelectionForWindow( + opt_win || window); + return sel && goog.dom.Range.createFromBrowserSelection(sel); +}; + + +/** + * Create a new range wrapper from the given browser selection object. Note + * that this object does not auto-update if the user changes their selection and + * should be used as a snapshot. + * @param {!Object} selection The browser selection object. + * @return {goog.dom.AbstractRange?} A range wrapper object or null if there + * was an error. + */ +goog.dom.Range.createFromBrowserSelection = function(selection) { + var range; + var isReversed = false; + if (selection.createRange) { + /** @preserveTry */ + try { + range = selection.createRange(); + } catch (e) { + // Access denied errors can be thrown here in IE if the selection was + // a flash obj or if there are cross domain issues + return null; + } + } else if (selection.rangeCount) { + if (selection.rangeCount > 1) { + return goog.dom.MultiRange.createFromBrowserSelection( + /** @type {Selection} */ (selection)); + } else { + range = selection.getRangeAt(0); + isReversed = goog.dom.Range.isReversed(selection.anchorNode, + selection.anchorOffset, selection.focusNode, selection.focusOffset); + } + } else { + return null; + } + + return goog.dom.Range.createFromBrowserRange(range, isReversed); +}; + + +/** + * Create a new range wrapper from the given browser range object. + * @param {Range|TextRange} range The browser range object. + * @param {boolean=} opt_isReversed Whether the focus node is before the anchor + * node. + * @return {goog.dom.AbstractRange} A range wrapper object. + */ +goog.dom.Range.createFromBrowserRange = function(range, opt_isReversed) { + // Create an IE control range when appropriate. + return goog.dom.AbstractRange.isNativeControlRange(range) ? + goog.dom.ControlRange.createFromBrowserRange(range) : + goog.dom.TextRange.createFromBrowserRange(range, opt_isReversed); +}; + + +/** + * Create a new range wrapper that selects the given node's text. + * @param {Node} node The node to select. + * @param {boolean=} opt_isReversed Whether the focus node is before the anchor + * node. + * @return {goog.dom.AbstractRange} A range wrapper object. + */ +goog.dom.Range.createFromNodeContents = function(node, opt_isReversed) { + return goog.dom.TextRange.createFromNodeContents(node, opt_isReversed); +}; + + +/** + * Create a new range wrapper that represents a caret at the given node, + * accounting for the given offset. This always creates a TextRange, regardless + * of whether node is an image node or other control range type node. + * @param {Node} node The node to place a caret at. + * @param {number} offset The offset within the node to place the caret at. + * @return {goog.dom.AbstractRange} A range wrapper object. + */ +goog.dom.Range.createCaret = function(node, offset) { + return goog.dom.TextRange.createFromNodes(node, offset, node, offset); +}; + + +/** + * Create a new range wrapper that selects the area between the given nodes, + * accounting for the given offsets. + * @param {Node} anchorNode The node to anchor on. + * @param {number} anchorOffset The offset within the node to anchor on. + * @param {Node} focusNode The node to focus on. + * @param {number} focusOffset The offset within the node to focus on. + * @return {goog.dom.AbstractRange} A range wrapper object. + */ +goog.dom.Range.createFromNodes = function(anchorNode, anchorOffset, focusNode, + focusOffset) { + return goog.dom.TextRange.createFromNodes(anchorNode, anchorOffset, focusNode, + focusOffset); +}; + + +/** + * Clears the window's selection. + * @param {Window=} opt_win The window to get the selection of. Defaults to the + * window this class was defined in. + */ +goog.dom.Range.clearSelection = function(opt_win) { + var sel = goog.dom.AbstractRange.getBrowserSelectionForWindow( + opt_win || window); + if (!sel) { + return; + } + if (sel.empty) { + // We can't just check that the selection is empty, becuase IE + // sometimes gets confused. + try { + sel.empty(); + } catch (e) { + // Emptying an already empty selection throws an exception in IE + } + } else { + try { + sel.removeAllRanges(); + } catch (e) { + // This throws in IE9 if the range has been invalidated; for example, if + // the user clicked on an element which disappeared during the event + // handler. + } + } +}; + + +/** + * Tests if the window has a selection. + * @param {Window=} opt_win The window to check the selection of. Defaults to + * the window this class was defined in. + * @return {boolean} Whether the window has a selection. + */ +goog.dom.Range.hasSelection = function(opt_win) { + var sel = goog.dom.AbstractRange.getBrowserSelectionForWindow( + opt_win || window); + return !!sel && (goog.userAgent.IE ? sel.type != 'None' : !!sel.rangeCount); +}; + + +/** + * Returns whether the focus position occurs before the anchor position. + * @param {Node} anchorNode The node to anchor on. + * @param {number} anchorOffset The offset within the node to anchor on. + * @param {Node} focusNode The node to focus on. + * @param {number} focusOffset The offset within the node to focus on. + * @return {boolean} Whether the focus position occurs before the anchor + * position. + */ +goog.dom.Range.isReversed = function(anchorNode, anchorOffset, focusNode, + focusOffset) { + if (anchorNode == focusNode) { + return focusOffset < anchorOffset; + } + var child; + if (anchorNode.nodeType == goog.dom.NodeType.ELEMENT && anchorOffset) { + child = anchorNode.childNodes[anchorOffset]; + if (child) { + anchorNode = child; + anchorOffset = 0; + } else if (goog.dom.contains(anchorNode, focusNode)) { + // If focus node is contained in anchorNode, it must be before the + // end of the node. Hence we are reversed. + return true; + } + } + if (focusNode.nodeType == goog.dom.NodeType.ELEMENT && focusOffset) { + child = focusNode.childNodes[focusOffset]; + if (child) { + focusNode = child; + focusOffset = 0; + } else if (goog.dom.contains(focusNode, anchorNode)) { + // If anchor node is contained in focusNode, it must be before the + // end of the node. Hence we are not reversed. + return false; + } + } + return (goog.dom.compareNodeOrder(anchorNode, focusNode) || + anchorOffset - focusOffset) > 0; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/rangeendpoint.js b/float-no-zero/closure-library/closure/goog/dom/rangeendpoint.js new file mode 100644 index 0000000000..f8d0fe446c --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/rangeendpoint.js @@ -0,0 +1,32 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Simple struct for endpoints of a range. + * + * @author robbyw@google.com (Robby Walker) + */ + + +goog.provide('goog.dom.RangeEndpoint'); + + +/** + * Constants for selection endpoints. + * @enum {number} + */ +goog.dom.RangeEndpoint = { + START: 1, + END: 0 +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/savedcaretrange.js b/float-no-zero/closure-library/closure/goog/dom/savedcaretrange.js new file mode 100644 index 0000000000..ed3aecfbfa --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/savedcaretrange.js @@ -0,0 +1,215 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview An API for saving and restoring ranges as HTML carets. + * + * @author nicksantos@google.com (Nick Santos) + */ + + +goog.provide('goog.dom.SavedCaretRange'); + +goog.require('goog.array'); +goog.require('goog.dom'); +goog.require('goog.dom.SavedRange'); +goog.require('goog.dom.TagName'); +goog.require('goog.string'); + + + +/** + * A struct for holding context about saved selections. + * This can be used to preserve the selection and restore while the DOM is + * manipulated, or through an asynchronous call. Use goog.dom.Range factory + * methods to obtain an {@see goog.dom.AbstractRange} instance, and use + * {@see goog.dom.AbstractRange#saveUsingCarets} to obtain a SavedCaretRange. + * For editor ranges under content-editable elements or design-mode iframes, + * prefer using {@see goog.editor.range.saveUsingNormalizedCarets}. + * @param {goog.dom.AbstractRange} range The range being saved. + * @constructor + * @extends {goog.dom.SavedRange} + */ +goog.dom.SavedCaretRange = function(range) { + goog.dom.SavedRange.call(this); + + /** + * The DOM id of the caret at the start of the range. + * @type {string} + * @private + */ + this.startCaretId_ = goog.string.createUniqueString(); + + /** + * The DOM id of the caret at the end of the range. + * @type {string} + * @private + */ + this.endCaretId_ = goog.string.createUniqueString(); + + /** + * Whether the range is reversed (anchor at the end). + * @private {boolean} + */ + this.reversed_ = range.isReversed(); + + /** + * A DOM helper for storing the current document context. + * @type {goog.dom.DomHelper} + * @private + */ + this.dom_ = goog.dom.getDomHelper(range.getDocument()); + + range.surroundWithNodes(this.createCaret_(true), this.createCaret_(false)); +}; +goog.inherits(goog.dom.SavedCaretRange, goog.dom.SavedRange); + + +/** + * Gets the range that this SavedCaretRage represents, without selecting it + * or removing the carets from the DOM. + * @return {goog.dom.AbstractRange?} An abstract range. + */ +goog.dom.SavedCaretRange.prototype.toAbstractRange = function() { + var range = null; + var startCaret = this.getCaret(true); + var endCaret = this.getCaret(false); + if (startCaret && endCaret) { + /** @suppress {missingRequire} circular dependency */ + range = goog.dom.Range.createFromNodes(startCaret, 0, endCaret, 0); + } + return range; +}; + + +/** + * Gets carets. + * @param {boolean} start If true, returns the start caret. Otherwise, get the + * end caret. + * @return {Element} The start or end caret in the given document. + */ +goog.dom.SavedCaretRange.prototype.getCaret = function(start) { + return this.dom_.getElement(start ? this.startCaretId_ : this.endCaretId_); +}; + + +/** + * Removes the carets from the current restoration document. + * @param {goog.dom.AbstractRange=} opt_range A range whose offsets have already + * been adjusted for caret removal; it will be adjusted if it is also + * affected by post-removal operations, such as text node normalization. + * @return {goog.dom.AbstractRange|undefined} The adjusted range, if opt_range + * was provided. + */ +goog.dom.SavedCaretRange.prototype.removeCarets = function(opt_range) { + goog.dom.removeNode(this.getCaret(true)); + goog.dom.removeNode(this.getCaret(false)); + return opt_range; +}; + + +/** + * Sets the document where the range will be restored. + * @param {!Document} doc An HTML document. + */ +goog.dom.SavedCaretRange.prototype.setRestorationDocument = function(doc) { + this.dom_.setDocument(doc); +}; + + +/** + * Reconstruct the selection from the given saved range. Removes carets after + * restoring the selection. If restore does not dispose this saved range, it may + * only be restored a second time if innerHTML or some other mechanism is used + * to restore the carets to the dom. + * @return {goog.dom.AbstractRange?} Restored selection. + * @override + * @protected + */ +goog.dom.SavedCaretRange.prototype.restoreInternal = function() { + var range = null; + var anchorCaret = this.getCaret(!this.reversed_); + var focusCaret = this.getCaret(this.reversed_); + if (anchorCaret && focusCaret) { + var anchorNode = anchorCaret.parentNode; + var anchorOffset = goog.array.indexOf(anchorNode.childNodes, anchorCaret); + var focusNode = focusCaret.parentNode; + var focusOffset = goog.array.indexOf(focusNode.childNodes, focusCaret); + if (focusNode == anchorNode) { + // Compensate for the start caret being removed. + if (this.reversed_) { + anchorOffset--; + } else { + focusOffset--; + } + } + /** @suppress {missingRequire} circular dependency */ + range = goog.dom.Range.createFromNodes(anchorNode, anchorOffset, + focusNode, focusOffset); + range = this.removeCarets(range); + range.select(); + } else { + // If only one caret was found, remove it. + this.removeCarets(); + } + return range; +}; + + +/** + * Dispose the saved range and remove the carets from the DOM. + * @override + * @protected + */ +goog.dom.SavedCaretRange.prototype.disposeInternal = function() { + this.removeCarets(); + this.dom_ = null; +}; + + +/** + * Creates a caret element. + * @param {boolean} start If true, creates the start caret. Otherwise, + * creates the end caret. + * @return {Element} The new caret element. + * @private + */ +goog.dom.SavedCaretRange.prototype.createCaret_ = function(start) { + return this.dom_.createDom(goog.dom.TagName.SPAN, + {'id': start ? this.startCaretId_ : this.endCaretId_}); +}; + + +/** + * A regex that will match all saved range carets in a string. + * @type {RegExp} + */ +goog.dom.SavedCaretRange.CARET_REGEX = /<\/span>/ig; + + +/** + * Returns whether two strings of html are equal, ignoring any saved carets. + * Thus two strings of html whose only difference is the id of their saved + * carets will be considered equal, since they represent html with the + * same selection. + * @param {string} str1 The first string. + * @param {string} str2 The second string. + * @return {boolean} Whether two strings of html are equal, ignoring any + * saved carets. + */ +goog.dom.SavedCaretRange.htmlEqual = function(str1, str2) { + return str1 == str2 || + str1.replace(goog.dom.SavedCaretRange.CARET_REGEX, '') == + str2.replace(goog.dom.SavedCaretRange.CARET_REGEX, ''); +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/savedrange.js b/float-no-zero/closure-library/closure/goog/dom/savedrange.js new file mode 100644 index 0000000000..5a7e951347 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/savedrange.js @@ -0,0 +1,74 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview A generic interface for saving and restoring ranges. + * + * @author robbyw@google.com (Robby Walker) + */ + + +goog.provide('goog.dom.SavedRange'); + +goog.require('goog.Disposable'); +goog.require('goog.log'); + + + +/** + * Abstract interface for a saved range. + * @constructor + * @extends {goog.Disposable} + */ +goog.dom.SavedRange = function() { + goog.Disposable.call(this); +}; +goog.inherits(goog.dom.SavedRange, goog.Disposable); + + +/** + * Logging object. + * @type {goog.log.Logger} + * @private + */ +goog.dom.SavedRange.logger_ = + goog.log.getLogger('goog.dom.SavedRange'); + + +/** + * Restores the range and by default disposes of the saved copy. Take note: + * this means the by default SavedRange objects are single use objects. + * @param {boolean=} opt_stayAlive Whether this SavedRange should stay alive + * (not be disposed) after restoring the range. Defaults to false (dispose). + * @return {goog.dom.AbstractRange} The restored range. + */ +goog.dom.SavedRange.prototype.restore = function(opt_stayAlive) { + if (this.isDisposed()) { + goog.log.error(goog.dom.SavedRange.logger_, + 'Disposed SavedRange objects cannot be restored.'); + } + + var range = this.restoreInternal(); + if (!opt_stayAlive) { + this.dispose(); + } + return range; +}; + + +/** + * Internal method to restore the saved range. + * @return {goog.dom.AbstractRange} The restored range. + */ +goog.dom.SavedRange.prototype.restoreInternal = goog.abstractMethod; diff --git a/float-no-zero/closure-library/closure/goog/dom/selection.js b/float-no-zero/closure-library/closure/goog/dom/selection.js new file mode 100644 index 0000000000..6d6f69e14f --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/selection.js @@ -0,0 +1,470 @@ +// Copyright 2006 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilities for working with selections in input boxes and text + * areas. + * + * @see ../demos/dom_selection.html + */ + + +goog.provide('goog.dom.selection'); + +goog.require('goog.string'); +goog.require('goog.userAgent'); + + +/** + * Sets the place where the selection should start inside a textarea or a text + * input + * @param {Element} textfield A textarea or text input. + * @param {number} pos The position to set the start of the selection at. + */ +goog.dom.selection.setStart = function(textfield, pos) { + if (goog.dom.selection.useSelectionProperties_(textfield)) { + textfield.selectionStart = pos; + } else if (goog.userAgent.IE) { + // destructuring assignment would have been sweet + var tmp = goog.dom.selection.getRangeIe_(textfield); + var range = tmp[0]; + var selectionRange = tmp[1]; + + if (range.inRange(selectionRange)) { + pos = goog.dom.selection.canonicalizePositionIe_(textfield, pos); + + range.collapse(true); + range.move('character', pos); + range.select(); + } + } +}; + + +/** + * Return the place where the selection starts inside a textarea or a text + * input + * @param {Element} textfield A textarea or text input. + * @return {number} The position where the selection starts or 0 if it was + * unable to find the position or no selection exists. Note that we can't + * reliably tell the difference between an element that has no selection and + * one where it starts at 0. + */ +goog.dom.selection.getStart = function(textfield) { + return goog.dom.selection.getEndPoints_(textfield, true)[0]; +}; + + +/** + * Returns the start and end points of the selection within a textarea in IE. + * IE treats newline characters as \r\n characters, and we need to check for + * these characters at the edge of our selection, to ensure that we return the + * right cursor position. + * @param {TextRange} range Complete range object, e.g., "Hello\r\n". + * @param {TextRange} selRange Selected range object. + * @param {boolean} getOnlyStart Value indicating if only start + * cursor position is to be returned. In IE, obtaining the end position + * involves extra work, hence we have this parameter for calls which need + * only start position. + * @return {Array.} An array with the start and end positions where the + * selection starts and ends or [0,0] if it was unable to find the + * positions or no selection exists. Note that we can't reliably tell the + * difference between an element that has no selection and one where + * it starts and ends at 0. If getOnlyStart was true, we return + * -1 as end offset. + * @private + */ +goog.dom.selection.getEndPointsTextareaIe_ = function( + range, selRange, getOnlyStart) { + // Create a duplicate of the selected range object to perform our actions + // against. Example of selectionRange = "" (assuming that the cursor is + // just after the \r\n combination) + var selectionRange = selRange.duplicate(); + + // Text before the selection start, e.g.,"Hello" (notice how range.text + // excludes the \r\n sequence) + var beforeSelectionText = range.text; + // Text before the selection start, e.g., "Hello" (this will later include + // the \r\n sequences also) + var untrimmedBeforeSelectionText = beforeSelectionText; + // Text within the selection , e.g. "" assuming that the cursor is just after + // the \r\n combination. + var selectionText = selectionRange.text; + // Text within the selection, e.g., "" (this will later include the \r\n + // sequences also) + var untrimmedSelectionText = selectionText; + + // Boolean indicating whether we are done dealing with the text before the + // selection's beginning. + var isRangeEndTrimmed = false; + // Go over the range until it becomes a 0-lengthed range or until the range + // text starts changing when we move the end back by one character. + // If after moving the end back by one character, the text remains the same, + // then we need to add a "\r\n" at the end to get the actual text. + while (!isRangeEndTrimmed) { + if (range.compareEndPoints('StartToEnd', range) == 0) { + isRangeEndTrimmed = true; + } else { + range.moveEnd('character', -1); + if (range.text == beforeSelectionText) { + // If the start position of the cursor was after a \r\n string, + // we would skip over it in one go with the moveEnd call, but + // range.text will still show "Hello" (because of the IE range.text + // bug) - this implies that we should add a \r\n to our + // untrimmedBeforeSelectionText string. + untrimmedBeforeSelectionText += '\r\n'; + } else { + isRangeEndTrimmed = true; + } + } + } + + if (getOnlyStart) { + // We return -1 as end, since the caller is only interested in the start + // value. + return [untrimmedBeforeSelectionText.length, -1]; + } + // Boolean indicating whether we are done dealing with the text inside the + // selection. + var isSelectionRangeEndTrimmed = false; + // Go over the selected range until it becomes a 0-lengthed range or until + // the range text starts changing when we move the end back by one character. + // If after moving the end back by one character, the text remains the same, + // then we need to add a "\r\n" at the end to get the actual text. + while (!isSelectionRangeEndTrimmed) { + if (selectionRange.compareEndPoints('StartToEnd', selectionRange) == 0) { + isSelectionRangeEndTrimmed = true; + } else { + selectionRange.moveEnd('character', -1); + if (selectionRange.text == selectionText) { + // If the selection was not empty, and the end point of the selection + // was just after a \r\n, we would have skipped it in one go with the + // moveEnd call, and this implies that we should add a \r\n to the + // untrimmedSelectionText string. + untrimmedSelectionText += '\r\n'; + } else { + isSelectionRangeEndTrimmed = true; + } + } + } + return [ + untrimmedBeforeSelectionText.length, + untrimmedBeforeSelectionText.length + untrimmedSelectionText.length]; +}; + + +/** + * Returns the start and end points of the selection inside a textarea or a + * text input. + * @param {Element} textfield A textarea or text input. + * @return {Array.} An array with the start and end positions where the + * selection starts and ends or [0,0] if it was unable to find the + * positions or no selection exists. Note that we can't reliably tell the + * difference between an element that has no selection and one where + * it starts and ends at 0. + */ +goog.dom.selection.getEndPoints = function(textfield) { + return goog.dom.selection.getEndPoints_(textfield, false); +}; + + +/** + * Returns the start and end points of the selection inside a textarea or a + * text input. + * @param {Element} textfield A textarea or text input. + * @param {boolean} getOnlyStart Value indicating if only start + * cursor position is to be returned. In IE, obtaining the end position + * involves extra work, hence we have this parameter. In FF, there is not + * much extra effort involved. + * @return {Array.} An array with the start and end positions where the + * selection starts and ends or [0,0] if it was unable to find the + * positions or no selection exists. Note that we can't reliably tell the + * difference between an element that has no selection and one where + * it starts and ends at 0. If getOnlyStart was true, we return + * -1 as end offset. + * @private + */ +goog.dom.selection.getEndPoints_ = function(textfield, getOnlyStart) { + var startPos = 0; + var endPos = 0; + if (goog.dom.selection.useSelectionProperties_(textfield)) { + startPos = textfield.selectionStart; + endPos = getOnlyStart ? -1 : textfield.selectionEnd; + } else if (goog.userAgent.IE) { + var tmp = goog.dom.selection.getRangeIe_(textfield); + var range = tmp[0]; + var selectionRange = tmp[1]; + + if (range.inRange(selectionRange)) { + range.setEndPoint('EndToStart', selectionRange); + if (textfield.type == 'textarea') { + return goog.dom.selection.getEndPointsTextareaIe_( + range, selectionRange, getOnlyStart); + } + startPos = range.text.length; + if (!getOnlyStart) { + endPos = range.text.length + selectionRange.text.length; + } else { + endPos = -1; // caller did not ask for end position + } + } + } + return [startPos, endPos]; +}; + + +/** + * Sets the place where the selection should end inside a text area or a text + * input + * @param {Element} textfield A textarea or text input. + * @param {number} pos The position to end the selection at. + */ +goog.dom.selection.setEnd = function(textfield, pos) { + if (goog.dom.selection.useSelectionProperties_(textfield)) { + textfield.selectionEnd = pos; + } else if (goog.userAgent.IE) { + var tmp = goog.dom.selection.getRangeIe_(textfield); + var range = tmp[0]; + var selectionRange = tmp[1]; + + if (range.inRange(selectionRange)) { + // Both the current position and the start cursor position need + // to be canonicalized to take care of possible \r\n miscounts. + pos = goog.dom.selection.canonicalizePositionIe_(textfield, pos); + var startCursorPos = goog.dom.selection.canonicalizePositionIe_( + textfield, goog.dom.selection.getStart(textfield)); + + selectionRange.collapse(true); + selectionRange.moveEnd('character', pos - startCursorPos); + selectionRange.select(); + } + } +}; + + +/** + * Returns the place where the selection ends inside a textarea or a text input + * @param {Element} textfield A textarea or text input. + * @return {number} The position where the selection ends or 0 if it was + * unable to find the position or no selection exists. + */ +goog.dom.selection.getEnd = function(textfield) { + return goog.dom.selection.getEndPoints_(textfield, false)[1]; +}; + + +/** + * Sets the cursor position within a textfield. + * @param {Element} textfield A textarea or text input. + * @param {number} pos The position within the text field. + */ +goog.dom.selection.setCursorPosition = function(textfield, pos) { + if (goog.dom.selection.useSelectionProperties_(textfield)) { + // Mozilla directly supports this + textfield.selectionStart = pos; + textfield.selectionEnd = pos; + + } else if (goog.userAgent.IE) { + pos = goog.dom.selection.canonicalizePositionIe_(textfield, pos); + + // IE has textranges. A textfield's textrange encompasses the + // entire textfield's text by default + var sel = textfield.createTextRange(); + + sel.collapse(true); + sel.move('character', pos); + sel.select(); + } +}; + + +/** + * Sets the selected text inside a textarea or a text input + * @param {Element} textfield A textarea or text input. + * @param {string} text The text to change the selection to. + */ +goog.dom.selection.setText = function(textfield, text) { + if (goog.dom.selection.useSelectionProperties_(textfield)) { + var value = textfield.value; + var oldSelectionStart = textfield.selectionStart; + var before = value.substr(0, oldSelectionStart); + var after = value.substr(textfield.selectionEnd); + textfield.value = before + text + after; + textfield.selectionStart = oldSelectionStart; + textfield.selectionEnd = oldSelectionStart + text.length; + } else if (goog.userAgent.IE) { + var tmp = goog.dom.selection.getRangeIe_(textfield); + var range = tmp[0]; + var selectionRange = tmp[1]; + + if (!range.inRange(selectionRange)) { + return; + } + // When we set the selection text the selection range is collapsed to the + // end. We therefore duplicate the current selection so we know where it + // started. Once we've set the selection text we move the start of the + // selection range to the old start + var range2 = selectionRange.duplicate(); + selectionRange.text = text; + selectionRange.setEndPoint('StartToStart', range2); + selectionRange.select(); + } else { + throw Error('Cannot set the selection end'); + } +}; + + +/** + * Returns the selected text inside a textarea or a text input + * @param {Element} textfield A textarea or text input. + * @return {string} The selected text. + */ +goog.dom.selection.getText = function(textfield) { + if (goog.dom.selection.useSelectionProperties_(textfield)) { + var s = textfield.value; + return s.substring(textfield.selectionStart, textfield.selectionEnd); + } + + if (goog.userAgent.IE) { + var tmp = goog.dom.selection.getRangeIe_(textfield); + var range = tmp[0]; + var selectionRange = tmp[1]; + + if (!range.inRange(selectionRange)) { + return ''; + } else if (textfield.type == 'textarea') { + return goog.dom.selection.getSelectionRangeText_(selectionRange); + } + return selectionRange.text; + } + + throw Error('Cannot get the selection text'); +}; + + +/** + * Returns the selected text within a textarea in IE. + * IE treats newline characters as \r\n characters, and we need to check for + * these characters at the edge of our selection, to ensure that we return the + * right string. + * @param {TextRange} selRange Selected range object. + * @return {string} Selected text in the textarea. + * @private + */ +goog.dom.selection.getSelectionRangeText_ = function(selRange) { + // Create a duplicate of the selected range object to perform our actions + // against. Suppose the text in the textarea is "Hello\r\nWorld" and the + // selection encompasses the "o\r\n" bit, initial selectionRange will be "o" + // (assuming that the cursor is just after the \r\n combination) + var selectionRange = selRange.duplicate(); + + // Text within the selection , e.g. "o" assuming that the cursor is just after + // the \r\n combination. + var selectionText = selectionRange.text; + // Text within the selection, e.g., "o" (this will later include the \r\n + // sequences also) + var untrimmedSelectionText = selectionText; + + // Boolean indicating whether we are done dealing with the text inside the + // selection. + var isSelectionRangeEndTrimmed = false; + // Go over the selected range until it becomes a 0-lengthed range or until + // the range text starts changing when we move the end back by one character. + // If after moving the end back by one character, the text remains the same, + // then we need to add a "\r\n" at the end to get the actual text. + while (!isSelectionRangeEndTrimmed) { + if (selectionRange.compareEndPoints('StartToEnd', selectionRange) == 0) { + isSelectionRangeEndTrimmed = true; + } else { + selectionRange.moveEnd('character', -1); + if (selectionRange.text == selectionText) { + // If the selection was not empty, and the end point of the selection + // was just after a \r\n, we would have skipped it in one go with the + // moveEnd call, and this implies that we should add a \r\n to the + // untrimmedSelectionText string. + untrimmedSelectionText += '\r\n'; + } else { + isSelectionRangeEndTrimmed = true; + } + } + } + return untrimmedSelectionText; +}; + + +/** + * Helper function for returning the range for an object as well as the + * selection range + * @private + * @param {Element} el The element to get the range for. + * @return {Array.} Range of object and selection range in two + * element array. + */ +goog.dom.selection.getRangeIe_ = function(el) { + var doc = el.ownerDocument || el.document; + + var selectionRange = doc.selection.createRange(); + // el.createTextRange() doesn't work on textareas + var range; + + if (el.type == 'textarea') { + range = doc.body.createTextRange(); + range.moveToElementText(el); + } else { + range = el.createTextRange(); + } + + return [range, selectionRange]; +}; + + +/** + * Helper function for canonicalizing a position inside a textfield in IE. + * Deals with the issue that \r\n counts as 2 characters, but + * move('character', n) passes over both characters in one move. + * @private + * @param {Element} textfield The text element. + * @param {number} pos The position desired in that element. + * @return {number} The canonicalized position that will work properly with + * move('character', pos). + */ +goog.dom.selection.canonicalizePositionIe_ = function(textfield, pos) { + if (textfield.type == 'textarea') { + // We do this only for textarea because it is the only one which can + // have a \r\n (input cannot have this). + var value = textfield.value.substring(0, pos); + pos = goog.string.canonicalizeNewlines(value).length; + } + return pos; +}; + + +/** + * Helper function to determine whether it's okay to use + * selectionStart/selectionEnd. + * + * @param {Element} el The element to check for. + * @return {boolean} Whether it's okay to use the selectionStart and + * selectionEnd properties on {@code el}. + * @private + */ +goog.dom.selection.useSelectionProperties_ = function(el) { + try { + return typeof el.selectionStart == 'number'; + } catch (e) { + // Firefox throws an exception if you try to access selectionStart + // on an element with display: none. + return false; + } +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/tagiterator.js b/float-no-zero/closure-library/closure/goog/dom/tagiterator.js new file mode 100644 index 0000000000..cd7787d6d9 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/tagiterator.js @@ -0,0 +1,367 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Iterator subclass for DOM tree traversal. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.TagIterator'); +goog.provide('goog.dom.TagWalkType'); + +goog.require('goog.dom.NodeType'); +goog.require('goog.iter.Iterator'); +goog.require('goog.iter.StopIteration'); + + +/** + * There are three types of token: + *
    + *
  1. {@code START_TAG} - The beginning of a tag. + *
  2. {@code OTHER} - Any non-element node position. + *
  3. {@code END_TAG} - The end of a tag. + *
+ * Users of this enumeration can rely on {@code START_TAG + END_TAG = 0} and + * that {@code OTHER = 0}. + * + * @enum {number} + */ +goog.dom.TagWalkType = { + START_TAG: 1, + OTHER: 0, + END_TAG: -1 +}; + + + +/** + * A DOM tree traversal iterator. + * + * Starting with the given node, the iterator walks the DOM in order, reporting + * events for the start and end of Elements, and the presence of text nodes. For + * example: + * + *
+ * <div>1<span>2</span>3</div>
+ * 
+ * + * Will return the following nodes: + * + * [div, 1, span, 2, span, 3, div] + * + * With the following states: + * + * [START, OTHER, START, OTHER, END, OTHER, END] + * + * And the following depths + * + * [1, 1, 2, 2, 1, 1, 0] + * + * Imagining | represents iterator position, the traversal stops at + * each of the following locations: + * + *
+ * <div>|1|<span>|2|</span>|3|</div>|
+ * 
+ * + * The iterator can also be used in reverse mode, which will return the nodes + * and states in the opposite order. The depths will be slightly different + * since, like in normal mode, the depth is computed *after* the given node. + * + * Lastly, it is possible to create an iterator that is unconstrained, meaning + * that it will continue iterating until the end of the document instead of + * until exiting the start node. + * + * @param {Node=} opt_node The start node. If unspecified or null, defaults to + * an empty iterator. + * @param {boolean=} opt_reversed Whether to traverse the tree in reverse. + * @param {boolean=} opt_unconstrained Whether the iterator is not constrained + * to the starting node and its children. + * @param {goog.dom.TagWalkType?=} opt_tagType The type of the position. + * Defaults to the start of the given node for forward iterators, and + * the end of the node for reverse iterators. + * @param {number=} opt_depth The starting tree depth. + * @constructor + * @extends {goog.iter.Iterator} + */ +goog.dom.TagIterator = function(opt_node, opt_reversed, + opt_unconstrained, opt_tagType, opt_depth) { + this.reversed = !!opt_reversed; + if (opt_node) { + this.setPosition(opt_node, opt_tagType); + } + this.depth = opt_depth != undefined ? opt_depth : this.tagType || 0; + if (this.reversed) { + this.depth *= -1; + } + this.constrained = !opt_unconstrained; +}; +goog.inherits(goog.dom.TagIterator, goog.iter.Iterator); + + +/** + * The node this position is located on. + * @type {Node} + */ +goog.dom.TagIterator.prototype.node = null; + + +/** + * The type of this position. + * @type {goog.dom.TagWalkType} + */ +goog.dom.TagIterator.prototype.tagType = goog.dom.TagWalkType.OTHER; + + +/** + * The tree depth of this position relative to where the iterator started. The + * depth is considered to be the tree depth just past the current node, so if an + * iterator is at position
+ *     
|
+ *
+ * (i.e. the node is the div and the type is START_TAG) its depth will be 1. + * @type {number} + */ +goog.dom.TagIterator.prototype.depth; + + +/** + * Whether the node iterator is moving in reverse. + * @type {boolean} + */ +goog.dom.TagIterator.prototype.reversed; + + +/** + * Whether the iterator is constrained to the starting node and its children. + * @type {boolean} + */ +goog.dom.TagIterator.prototype.constrained; + + +/** + * Whether iteration has started. + * @type {boolean} + * @private + */ +goog.dom.TagIterator.prototype.started_ = false; + + +/** + * Set the position of the iterator. Overwrite the tree node and the position + * type which can be one of the {@link goog.dom.TagWalkType} token types. + * Only overwrites the tree depth when the parameter is specified. + * @param {Node} node The node to set the position to. + * @param {goog.dom.TagWalkType?=} opt_tagType The type of the position + * Defaults to the start of the given node. + * @param {number=} opt_depth The tree depth. + */ +goog.dom.TagIterator.prototype.setPosition = function(node, + opt_tagType, opt_depth) { + this.node = node; + + if (node) { + if (goog.isNumber(opt_tagType)) { + this.tagType = opt_tagType; + } else { + // Auto-determine the proper type + this.tagType = this.node.nodeType != goog.dom.NodeType.ELEMENT ? + goog.dom.TagWalkType.OTHER : + this.reversed ? goog.dom.TagWalkType.END_TAG : + goog.dom.TagWalkType.START_TAG; + } + } + + if (goog.isNumber(opt_depth)) { + this.depth = opt_depth; + } +}; + + +/** + * Replace this iterator's values with values from another. The two iterators + * must be of the same type. + * @param {goog.dom.TagIterator} other The iterator to copy. + * @protected + */ +goog.dom.TagIterator.prototype.copyFrom = function(other) { + this.node = other.node; + this.tagType = other.tagType; + this.depth = other.depth; + this.reversed = other.reversed; + this.constrained = other.constrained; +}; + + +/** + * @return {goog.dom.TagIterator} A copy of this iterator. + */ +goog.dom.TagIterator.prototype.clone = function() { + return new goog.dom.TagIterator(this.node, this.reversed, + !this.constrained, this.tagType, this.depth); +}; + + +/** + * Skip the current tag. + */ +goog.dom.TagIterator.prototype.skipTag = function() { + var check = this.reversed ? goog.dom.TagWalkType.END_TAG : + goog.dom.TagWalkType.START_TAG; + if (this.tagType == check) { + this.tagType = /** @type {goog.dom.TagWalkType} */ (check * -1); + this.depth += this.tagType * (this.reversed ? -1 : 1); + } +}; + + +/** + * Restart the current tag. + */ +goog.dom.TagIterator.prototype.restartTag = function() { + var check = this.reversed ? goog.dom.TagWalkType.START_TAG : + goog.dom.TagWalkType.END_TAG; + if (this.tagType == check) { + this.tagType = /** @type {goog.dom.TagWalkType} */ (check * -1); + this.depth += this.tagType * (this.reversed ? -1 : 1); + } +}; + + +/** + * Move to the next position in the DOM tree. + * @return {Node} Returns the next node, or throws a goog.iter.StopIteration + * exception if the end of the iterator's range has been reached. + * @override + */ +goog.dom.TagIterator.prototype.next = function() { + var node; + + if (this.started_) { + if (!this.node || this.constrained && this.depth == 0) { + throw goog.iter.StopIteration; + } + node = this.node; + + var startType = this.reversed ? goog.dom.TagWalkType.END_TAG : + goog.dom.TagWalkType.START_TAG; + + if (this.tagType == startType) { + // If we have entered the tag, test if there are any children to move to. + var child = this.reversed ? node.lastChild : node.firstChild; + if (child) { + this.setPosition(child); + } else { + // If not, move on to exiting this tag. + this.setPosition(node, + /** @type {goog.dom.TagWalkType} */ (startType * -1)); + } + } else { + var sibling = this.reversed ? node.previousSibling : node.nextSibling; + if (sibling) { + // Try to move to the next node. + this.setPosition(sibling); + } else { + // If no such node exists, exit our parent. + this.setPosition(node.parentNode, + /** @type {goog.dom.TagWalkType} */ (startType * -1)); + } + } + + this.depth += this.tagType * (this.reversed ? -1 : 1); + } else { + this.started_ = true; + } + + // Check the new position for being last, and return it if it's not. + node = this.node; + if (!this.node) { + throw goog.iter.StopIteration; + } + return node; +}; + + +/** + * @return {boolean} Whether next has ever been called on this iterator. + * @protected + */ +goog.dom.TagIterator.prototype.isStarted = function() { + return this.started_; +}; + + +/** + * @return {boolean} Whether this iterator's position is a start tag position. + */ +goog.dom.TagIterator.prototype.isStartTag = function() { + return this.tagType == goog.dom.TagWalkType.START_TAG; +}; + + +/** + * @return {boolean} Whether this iterator's position is an end tag position. + */ +goog.dom.TagIterator.prototype.isEndTag = function() { + return this.tagType == goog.dom.TagWalkType.END_TAG; +}; + + +/** + * @return {boolean} Whether this iterator's position is not at an element node. + */ +goog.dom.TagIterator.prototype.isNonElement = function() { + return this.tagType == goog.dom.TagWalkType.OTHER; +}; + + +/** + * Test if two iterators are at the same position - i.e. if the node and tagType + * is the same. This will still return true if the two iterators are moving in + * opposite directions or have different constraints. + * @param {goog.dom.TagIterator} other The iterator to compare to. + * @return {boolean} Whether the two iterators are at the same position. + */ +goog.dom.TagIterator.prototype.equals = function(other) { + // Nodes must be equal, and we must either have reached the end of our tree + // or be at the same position. + return other.node == this.node && (!this.node || + other.tagType == this.tagType); +}; + + +/** + * Replace the current node with the list of nodes. Reset the iterator so that + * it visits the first of the nodes next. + * @param {...Object} var_args A list of nodes to replace the current node with. + * If the first argument is array-like, it will be used, otherwise all the + * arguments are assumed to be nodes. + */ +goog.dom.TagIterator.prototype.splice = function(var_args) { + // Reset the iterator so that it iterates over the first replacement node in + // the arguments on the next iteration. + var node = this.node; + this.restartTag(); + this.reversed = !this.reversed; + goog.dom.TagIterator.prototype.next.call(this); + this.reversed = !this.reversed; + + // Replace the node with the arguments. + var arr = goog.isArrayLike(arguments[0]) ? arguments[0] : arguments; + for (var i = arr.length - 1; i >= 0; i--) { + goog.dom.insertSiblingAfter(arr[i], node); + } + goog.dom.removeNode(node); +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/tagname.js b/float-no-zero/closure-library/closure/goog/dom/tagname.js new file mode 100644 index 0000000000..77a9b475a9 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/tagname.js @@ -0,0 +1,159 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Defines the goog.dom.TagName enum. This enumerates + * all HTML tag names specified in either the the W3C HTML 4.01 index of + * elements or the HTML5 draft specification. + * + * References: + * http://www.w3.org/TR/html401/index/elements.html + * http://dev.w3.org/html5/spec/section-index.html + * + */ +goog.provide('goog.dom.TagName'); + + +/** + * Enum of all html tag names specified by the W3C HTML4.01 and HTML5 + * specifications. + * @enum {string} + */ +goog.dom.TagName = { + A: 'A', + ABBR: 'ABBR', + ACRONYM: 'ACRONYM', + ADDRESS: 'ADDRESS', + APPLET: 'APPLET', + AREA: 'AREA', + ARTICLE: 'ARTICLE', + ASIDE: 'ASIDE', + AUDIO: 'AUDIO', + B: 'B', + BASE: 'BASE', + BASEFONT: 'BASEFONT', + BDI: 'BDI', + BDO: 'BDO', + BIG: 'BIG', + BLOCKQUOTE: 'BLOCKQUOTE', + BODY: 'BODY', + BR: 'BR', + BUTTON: 'BUTTON', + CANVAS: 'CANVAS', + CAPTION: 'CAPTION', + CENTER: 'CENTER', + CITE: 'CITE', + CODE: 'CODE', + COL: 'COL', + COLGROUP: 'COLGROUP', + COMMAND: 'COMMAND', + DATA: 'DATA', + DATALIST: 'DATALIST', + DD: 'DD', + DEL: 'DEL', + DETAILS: 'DETAILS', + DFN: 'DFN', + DIALOG: 'DIALOG', + DIR: 'DIR', + DIV: 'DIV', + DL: 'DL', + DT: 'DT', + EM: 'EM', + EMBED: 'EMBED', + FIELDSET: 'FIELDSET', + FIGCAPTION: 'FIGCAPTION', + FIGURE: 'FIGURE', + FONT: 'FONT', + FOOTER: 'FOOTER', + FORM: 'FORM', + FRAME: 'FRAME', + FRAMESET: 'FRAMESET', + H1: 'H1', + H2: 'H2', + H3: 'H3', + H4: 'H4', + H5: 'H5', + H6: 'H6', + HEAD: 'HEAD', + HEADER: 'HEADER', + HGROUP: 'HGROUP', + HR: 'HR', + HTML: 'HTML', + I: 'I', + IFRAME: 'IFRAME', + IMG: 'IMG', + INPUT: 'INPUT', + INS: 'INS', + ISINDEX: 'ISINDEX', + KBD: 'KBD', + KEYGEN: 'KEYGEN', + LABEL: 'LABEL', + LEGEND: 'LEGEND', + LI: 'LI', + LINK: 'LINK', + MAP: 'MAP', + MARK: 'MARK', + MATH: 'MATH', + MENU: 'MENU', + META: 'META', + METER: 'METER', + NAV: 'NAV', + NOFRAMES: 'NOFRAMES', + NOSCRIPT: 'NOSCRIPT', + OBJECT: 'OBJECT', + OL: 'OL', + OPTGROUP: 'OPTGROUP', + OPTION: 'OPTION', + OUTPUT: 'OUTPUT', + P: 'P', + PARAM: 'PARAM', + PRE: 'PRE', + PROGRESS: 'PROGRESS', + Q: 'Q', + RP: 'RP', + RT: 'RT', + RUBY: 'RUBY', + S: 'S', + SAMP: 'SAMP', + SCRIPT: 'SCRIPT', + SECTION: 'SECTION', + SELECT: 'SELECT', + SMALL: 'SMALL', + SOURCE: 'SOURCE', + SPAN: 'SPAN', + STRIKE: 'STRIKE', + STRONG: 'STRONG', + STYLE: 'STYLE', + SUB: 'SUB', + SUMMARY: 'SUMMARY', + SUP: 'SUP', + SVG: 'SVG', + TABLE: 'TABLE', + TBODY: 'TBODY', + TD: 'TD', + TEXTAREA: 'TEXTAREA', + TFOOT: 'TFOOT', + TH: 'TH', + THEAD: 'THEAD', + TIME: 'TIME', + TITLE: 'TITLE', + TR: 'TR', + TRACK: 'TRACK', + TT: 'TT', + U: 'U', + UL: 'UL', + VAR: 'VAR', + VIDEO: 'VIDEO', + WBR: 'WBR' +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/textrange.js b/float-no-zero/closure-library/closure/goog/dom/textrange.js new file mode 100644 index 0000000000..73b82ac1ab --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/textrange.js @@ -0,0 +1,630 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilities for working with text ranges in HTML documents. + * + * @author robbyw@google.com (Robby Walker) + * @author ojan@google.com (Ojan Vafai) + * @author jparent@google.com (Julie Parent) + */ + + +goog.provide('goog.dom.TextRange'); + +goog.require('goog.array'); +goog.require('goog.dom'); +goog.require('goog.dom.AbstractRange'); +goog.require('goog.dom.RangeType'); +goog.require('goog.dom.SavedRange'); +goog.require('goog.dom.TagName'); +goog.require('goog.dom.TextRangeIterator'); +goog.require('goog.dom.browserrange'); +goog.require('goog.string'); +goog.require('goog.userAgent'); + + + +/** + * Create a new text selection with no properties. Do not use this constructor: + * use one of the goog.dom.Range.createFrom* methods instead. + * @constructor + * @extends {goog.dom.AbstractRange} + */ +goog.dom.TextRange = function() { +}; +goog.inherits(goog.dom.TextRange, goog.dom.AbstractRange); + + +/** + * Create a new range wrapper from the given browser range object. Do not use + * this method directly - please use goog.dom.Range.createFrom* instead. + * @param {Range|TextRange} range The browser range object. + * @param {boolean=} opt_isReversed Whether the focus node is before the anchor + * node. + * @return {goog.dom.TextRange} A range wrapper object. + */ +goog.dom.TextRange.createFromBrowserRange = function(range, opt_isReversed) { + return goog.dom.TextRange.createFromBrowserRangeWrapper_( + goog.dom.browserrange.createRange(range), opt_isReversed); +}; + + +/** + * Create a new range wrapper from the given browser range wrapper. + * @param {goog.dom.browserrange.AbstractRange} browserRange The browser range + * wrapper. + * @param {boolean=} opt_isReversed Whether the focus node is before the anchor + * node. + * @return {goog.dom.TextRange} A range wrapper object. + * @private + */ +goog.dom.TextRange.createFromBrowserRangeWrapper_ = function(browserRange, + opt_isReversed) { + var range = new goog.dom.TextRange(); + + // Initialize the range as a browser range wrapper type range. + range.browserRangeWrapper_ = browserRange; + range.isReversed_ = !!opt_isReversed; + + return range; +}; + + +/** + * Create a new range wrapper that selects the given node's text. Do not use + * this method directly - please use goog.dom.Range.createFrom* instead. + * @param {Node} node The node to select. + * @param {boolean=} opt_isReversed Whether the focus node is before the anchor + * node. + * @return {goog.dom.TextRange} A range wrapper object. + */ +goog.dom.TextRange.createFromNodeContents = function(node, opt_isReversed) { + return goog.dom.TextRange.createFromBrowserRangeWrapper_( + goog.dom.browserrange.createRangeFromNodeContents(node), + opt_isReversed); +}; + + +/** + * Create a new range wrapper that selects the area between the given nodes, + * accounting for the given offsets. Do not use this method directly - please + * use goog.dom.Range.createFrom* instead. + * @param {Node} anchorNode The node to start with. + * @param {number} anchorOffset The offset within the node to start. + * @param {Node} focusNode The node to end with. + * @param {number} focusOffset The offset within the node to end. + * @return {goog.dom.TextRange} A range wrapper object. + */ +goog.dom.TextRange.createFromNodes = function(anchorNode, anchorOffset, + focusNode, focusOffset) { + var range = new goog.dom.TextRange(); + range.isReversed_ = goog.dom.Range.isReversed(anchorNode, anchorOffset, + focusNode, focusOffset); + + // Avoid selecting terminal elements directly + if (goog.dom.isElement(anchorNode) && !goog.dom.canHaveChildren(anchorNode)) { + var parent = anchorNode.parentNode; + anchorOffset = goog.array.indexOf(parent.childNodes, anchorNode); + anchorNode = parent; + } + + if (goog.dom.isElement(focusNode) && !goog.dom.canHaveChildren(focusNode)) { + var parent = focusNode.parentNode; + focusOffset = goog.array.indexOf(parent.childNodes, focusNode); + focusNode = parent; + } + + // Initialize the range as a W3C style range. + if (range.isReversed_) { + range.startNode_ = focusNode; + range.startOffset_ = focusOffset; + range.endNode_ = anchorNode; + range.endOffset_ = anchorOffset; + } else { + range.startNode_ = anchorNode; + range.startOffset_ = anchorOffset; + range.endNode_ = focusNode; + range.endOffset_ = focusOffset; + } + + return range; +}; + + +// Representation 1: a browser range wrapper. + + +/** + * The browser specific range wrapper. This can be null if one of the other + * representations of the range is specified. + * @type {goog.dom.browserrange.AbstractRange?} + * @private + */ +goog.dom.TextRange.prototype.browserRangeWrapper_ = null; + + +// Representation 2: two endpoints specified as nodes + offsets + + +/** + * The start node of the range. This can be null if one of the other + * representations of the range is specified. + * @type {Node} + * @private + */ +goog.dom.TextRange.prototype.startNode_ = null; + + +/** + * The start offset of the range. This can be null if one of the other + * representations of the range is specified. + * @type {?number} + * @private + */ +goog.dom.TextRange.prototype.startOffset_ = null; + + +/** + * The end node of the range. This can be null if one of the other + * representations of the range is specified. + * @type {Node} + * @private + */ +goog.dom.TextRange.prototype.endNode_ = null; + + +/** + * The end offset of the range. This can be null if one of the other + * representations of the range is specified. + * @type {?number} + * @private + */ +goog.dom.TextRange.prototype.endOffset_ = null; + + +/** + * Whether the focus node is before the anchor node. + * @type {boolean} + * @private + */ +goog.dom.TextRange.prototype.isReversed_ = false; + + +// Method implementations + + +/** + * @return {goog.dom.TextRange} A clone of this range. + * @override + */ +goog.dom.TextRange.prototype.clone = function() { + var range = new goog.dom.TextRange(); + range.browserRangeWrapper_ = this.browserRangeWrapper_; + range.startNode_ = this.startNode_; + range.startOffset_ = this.startOffset_; + range.endNode_ = this.endNode_; + range.endOffset_ = this.endOffset_; + range.isReversed_ = this.isReversed_; + + return range; +}; + + +/** @override */ +goog.dom.TextRange.prototype.getType = function() { + return goog.dom.RangeType.TEXT; +}; + + +/** @override */ +goog.dom.TextRange.prototype.getBrowserRangeObject = function() { + return this.getBrowserRangeWrapper_().getBrowserRange(); +}; + + +/** @override */ +goog.dom.TextRange.prototype.setBrowserRangeObject = function(nativeRange) { + // Test if it's a control range by seeing if a control range only method + // exists. + if (goog.dom.AbstractRange.isNativeControlRange(nativeRange)) { + return false; + } + this.browserRangeWrapper_ = goog.dom.browserrange.createRange( + nativeRange); + this.clearCachedValues_(); + return true; +}; + + +/** + * Clear all cached values. + * @private + */ +goog.dom.TextRange.prototype.clearCachedValues_ = function() { + this.startNode_ = this.startOffset_ = this.endNode_ = this.endOffset_ = null; +}; + + +/** @override */ +goog.dom.TextRange.prototype.getTextRangeCount = function() { + return 1; +}; + + +/** @override */ +goog.dom.TextRange.prototype.getTextRange = function(i) { + return this; +}; + + +/** + * @return {goog.dom.browserrange.AbstractRange} The range wrapper object. + * @private + */ +goog.dom.TextRange.prototype.getBrowserRangeWrapper_ = function() { + return this.browserRangeWrapper_ || + (this.browserRangeWrapper_ = goog.dom.browserrange.createRangeFromNodes( + this.getStartNode(), this.getStartOffset(), + this.getEndNode(), this.getEndOffset())); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getContainer = function() { + return this.getBrowserRangeWrapper_().getContainer(); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getStartNode = function() { + return this.startNode_ || + (this.startNode_ = this.getBrowserRangeWrapper_().getStartNode()); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getStartOffset = function() { + return this.startOffset_ != null ? this.startOffset_ : + (this.startOffset_ = this.getBrowserRangeWrapper_().getStartOffset()); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getStartPosition = function() { + return this.isReversed() ? + this.getBrowserRangeWrapper_().getEndPosition() : + this.getBrowserRangeWrapper_().getStartPosition(); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getEndNode = function() { + return this.endNode_ || + (this.endNode_ = this.getBrowserRangeWrapper_().getEndNode()); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getEndOffset = function() { + return this.endOffset_ != null ? this.endOffset_ : + (this.endOffset_ = this.getBrowserRangeWrapper_().getEndOffset()); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getEndPosition = function() { + return this.isReversed() ? + this.getBrowserRangeWrapper_().getStartPosition() : + this.getBrowserRangeWrapper_().getEndPosition(); +}; + + +/** + * Moves a TextRange to the provided nodes and offsets. + * @param {Node} startNode The node to start with. + * @param {number} startOffset The offset within the node to start. + * @param {Node} endNode The node to end with. + * @param {number} endOffset The offset within the node to end. + * @param {boolean} isReversed Whether the range is reversed. + */ +goog.dom.TextRange.prototype.moveToNodes = function(startNode, startOffset, + endNode, endOffset, + isReversed) { + this.startNode_ = startNode; + this.startOffset_ = startOffset; + this.endNode_ = endNode; + this.endOffset_ = endOffset; + this.isReversed_ = isReversed; + this.browserRangeWrapper_ = null; +}; + + +/** @override */ +goog.dom.TextRange.prototype.isReversed = function() { + return this.isReversed_; +}; + + +/** @override */ +goog.dom.TextRange.prototype.containsRange = function(otherRange, + opt_allowPartial) { + var otherRangeType = otherRange.getType(); + if (otherRangeType == goog.dom.RangeType.TEXT) { + return this.getBrowserRangeWrapper_().containsRange( + otherRange.getBrowserRangeWrapper_(), opt_allowPartial); + } else if (otherRangeType == goog.dom.RangeType.CONTROL) { + var elements = otherRange.getElements(); + var fn = opt_allowPartial ? goog.array.some : goog.array.every; + return fn(elements, function(el) { + return this.containsNode(el, opt_allowPartial); + }, this); + } + return false; +}; + + +/** + * Tests if the given node is in a document. + * @param {Node} node The node to check. + * @return {boolean} Whether the given node is in the given document. + */ +goog.dom.TextRange.isAttachedNode = function(node) { + if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) { + var returnValue = false; + /** @preserveTry */ + try { + returnValue = node.parentNode; + } catch (e) { + // IE sometimes throws Invalid Argument errors when a node is detached. + // Note: trying to return a value from the above try block can cause IE + // to crash. It is necessary to use the local returnValue + } + return !!returnValue; + } else { + return goog.dom.contains(node.ownerDocument.body, node); + } +}; + + +/** @override */ +goog.dom.TextRange.prototype.isRangeInDocument = function() { + // Ensure any cached nodes are in the document. IE also allows ranges to + // become detached, so we check if the range is still in the document as + // well for IE. + return (!this.startNode_ || + goog.dom.TextRange.isAttachedNode(this.startNode_)) && + (!this.endNode_ || + goog.dom.TextRange.isAttachedNode(this.endNode_)) && + (!(goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) || + this.getBrowserRangeWrapper_().isRangeInDocument()); +}; + + +/** @override */ +goog.dom.TextRange.prototype.isCollapsed = function() { + return this.getBrowserRangeWrapper_().isCollapsed(); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getText = function() { + return this.getBrowserRangeWrapper_().getText(); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getHtmlFragment = function() { + // TODO(robbyw): Generalize the code in browserrange so it is static and + // just takes an iterator. This would mean we don't always have to create a + // browser range. + return this.getBrowserRangeWrapper_().getHtmlFragment(); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getValidHtml = function() { + return this.getBrowserRangeWrapper_().getValidHtml(); +}; + + +/** @override */ +goog.dom.TextRange.prototype.getPastableHtml = function() { + // TODO(robbyw): Get any attributes the table or tr has. + + var html = this.getValidHtml(); + + if (html.match(/^\s*'; + } else if (html.match(/^\s*'; + } else if (html.match(/^\s*'; + } else if (html.match(/^\s*', html, ''); + } + + return html; +}; + + +/** + * Returns a TextRangeIterator over the contents of the range. Regardless of + * the direction of the range, the iterator will move in document order. + * @param {boolean=} opt_keys Unused for this iterator. + * @return {goog.dom.TextRangeIterator} An iterator over tags in the range. + * @override + */ +goog.dom.TextRange.prototype.__iterator__ = function(opt_keys) { + return new goog.dom.TextRangeIterator(this.getStartNode(), + this.getStartOffset(), this.getEndNode(), this.getEndOffset()); +}; + + +// RANGE ACTIONS + + +/** @override */ +goog.dom.TextRange.prototype.select = function() { + this.getBrowserRangeWrapper_().select(this.isReversed_); +}; + + +/** @override */ +goog.dom.TextRange.prototype.removeContents = function() { + this.getBrowserRangeWrapper_().removeContents(); + this.clearCachedValues_(); +}; + + +/** + * Surrounds the text range with the specified element (on Mozilla) or with a + * clone of the specified element (on IE). Returns a reference to the + * surrounding element if the operation was successful; returns null if the + * operation failed. + * @param {Element} element The element with which the selection is to be + * surrounded. + * @return {Element} The surrounding element (same as the argument on Mozilla, + * but not on IE), or null if unsuccessful. + */ +goog.dom.TextRange.prototype.surroundContents = function(element) { + var output = this.getBrowserRangeWrapper_().surroundContents(element); + this.clearCachedValues_(); + return output; +}; + + +/** @override */ +goog.dom.TextRange.prototype.insertNode = function(node, before) { + var output = this.getBrowserRangeWrapper_().insertNode(node, before); + this.clearCachedValues_(); + return output; +}; + + +/** @override */ +goog.dom.TextRange.prototype.surroundWithNodes = function(startNode, endNode) { + this.getBrowserRangeWrapper_().surroundWithNodes(startNode, endNode); + this.clearCachedValues_(); +}; + + +// SAVE/RESTORE + + +/** @override */ +goog.dom.TextRange.prototype.saveUsingDom = function() { + return new goog.dom.DomSavedTextRange_(this); +}; + + +// RANGE MODIFICATION + + +/** @override */ +goog.dom.TextRange.prototype.collapse = function(toAnchor) { + var toStart = this.isReversed() ? !toAnchor : toAnchor; + + if (this.browserRangeWrapper_) { + this.browserRangeWrapper_.collapse(toStart); + } + + if (toStart) { + this.endNode_ = this.startNode_; + this.endOffset_ = this.startOffset_; + } else { + this.startNode_ = this.endNode_; + this.startOffset_ = this.endOffset_; + } + + // Collapsed ranges can't be reversed + this.isReversed_ = false; +}; + + +// SAVED RANGE OBJECTS + + + +/** + * A SavedRange implementation using DOM endpoints. + * @param {goog.dom.AbstractRange} range The range to save. + * @constructor + * @extends {goog.dom.SavedRange} + * @private + */ +goog.dom.DomSavedTextRange_ = function(range) { + /** + * The anchor node. + * @type {Node} + * @private + */ + this.anchorNode_ = range.getAnchorNode(); + + /** + * The anchor node offset. + * @type {number} + * @private + */ + this.anchorOffset_ = range.getAnchorOffset(); + + /** + * The focus node. + * @type {Node} + * @private + */ + this.focusNode_ = range.getFocusNode(); + + /** + * The focus node offset. + * @type {number} + * @private + */ + this.focusOffset_ = range.getFocusOffset(); +}; +goog.inherits(goog.dom.DomSavedTextRange_, goog.dom.SavedRange); + + +/** + * @return {goog.dom.AbstractRange} The restored range. + * @override + */ +goog.dom.DomSavedTextRange_.prototype.restoreInternal = function() { + return goog.dom.Range.createFromNodes(this.anchorNode_, this.anchorOffset_, + this.focusNode_, this.focusOffset_); +}; + + +/** @override */ +goog.dom.DomSavedTextRange_.prototype.disposeInternal = function() { + goog.dom.DomSavedTextRange_.superClass_.disposeInternal.call(this); + + this.anchorNode_ = null; + this.focusNode_ = null; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/textrangeiterator.js b/float-no-zero/closure-library/closure/goog/dom/textrangeiterator.js new file mode 100644 index 0000000000..b8d49b8565 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/textrangeiterator.js @@ -0,0 +1,244 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Iterator between two DOM text range positions. + * + * @author robbyw@google.com (Robby Walker) + */ + +goog.provide('goog.dom.TextRangeIterator'); + +goog.require('goog.array'); +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.RangeIterator'); +goog.require('goog.dom.TagName'); +goog.require('goog.iter.StopIteration'); + + + +/** + * Subclass of goog.dom.TagIterator that iterates over a DOM range. It + * adds functions to determine the portion of each text node that is selected. + * + * @param {Node} startNode The starting node position. + * @param {number} startOffset The offset in to startNode. If startNode is + * an element, indicates an offset in to childNodes. If startNode is a + * text node, indicates an offset in to nodeValue. + * @param {Node} endNode The ending node position. + * @param {number} endOffset The offset in to endNode. If endNode is + * an element, indicates an offset in to childNodes. If endNode is a + * text node, indicates an offset in to nodeValue. + * @param {boolean=} opt_reverse Whether to traverse nodes in reverse. + * @constructor + * @extends {goog.dom.RangeIterator} + */ +goog.dom.TextRangeIterator = function(startNode, startOffset, endNode, + endOffset, opt_reverse) { + var goNext; + + if (startNode) { + this.startNode_ = startNode; + this.startOffset_ = startOffset; + this.endNode_ = endNode; + this.endOffset_ = endOffset; + + // Skip to the offset nodes - being careful to special case BRs since these + // have no children but still can appear as the startContainer of a range. + if (startNode.nodeType == goog.dom.NodeType.ELEMENT && + startNode.tagName != goog.dom.TagName.BR) { + var startChildren = startNode.childNodes; + var candidate = startChildren[startOffset]; + if (candidate) { + this.startNode_ = candidate; + this.startOffset_ = 0; + } else { + if (startChildren.length) { + this.startNode_ = + /** @type {Node} */ (goog.array.peek(startChildren)); + } + goNext = true; + } + } + + if (endNode.nodeType == goog.dom.NodeType.ELEMENT) { + this.endNode_ = endNode.childNodes[endOffset]; + if (this.endNode_) { + this.endOffset_ = 0; + } else { + // The offset was past the last element. + this.endNode_ = endNode; + } + } + } + + goog.dom.RangeIterator.call(this, opt_reverse ? this.endNode_ : + this.startNode_, opt_reverse); + + if (goNext) { + try { + this.next(); + } catch (e) { + if (e != goog.iter.StopIteration) { + throw e; + } + } + } +}; +goog.inherits(goog.dom.TextRangeIterator, goog.dom.RangeIterator); + + +/** + * The first node in the selection. + * @type {Node} + * @private + */ +goog.dom.TextRangeIterator.prototype.startNode_ = null; + + +/** + * The last node in the selection. + * @type {Node} + * @private + */ +goog.dom.TextRangeIterator.prototype.endNode_ = null; + + +/** + * The offset within the first node in the selection. + * @type {number} + * @private + */ +goog.dom.TextRangeIterator.prototype.startOffset_ = 0; + + +/** + * The offset within the last node in the selection. + * @type {number} + * @private + */ +goog.dom.TextRangeIterator.prototype.endOffset_ = 0; + + +/** @override */ +goog.dom.TextRangeIterator.prototype.getStartTextOffset = function() { + // Offsets only apply to text nodes. If our current node is the start node, + // return the saved offset. Otherwise, return 0. + return this.node.nodeType != goog.dom.NodeType.TEXT ? -1 : + this.node == this.startNode_ ? this.startOffset_ : 0; +}; + + +/** @override */ +goog.dom.TextRangeIterator.prototype.getEndTextOffset = function() { + // Offsets only apply to text nodes. If our current node is the end node, + // return the saved offset. Otherwise, return the length of the node. + return this.node.nodeType != goog.dom.NodeType.TEXT ? -1 : + this.node == this.endNode_ ? this.endOffset_ : this.node.nodeValue.length; +}; + + +/** @override */ +goog.dom.TextRangeIterator.prototype.getStartNode = function() { + return this.startNode_; +}; + + +/** + * Change the start node of the iterator. + * @param {Node} node The new start node. + */ +goog.dom.TextRangeIterator.prototype.setStartNode = function(node) { + if (!this.isStarted()) { + this.setPosition(node); + } + + this.startNode_ = node; + this.startOffset_ = 0; +}; + + +/** @override */ +goog.dom.TextRangeIterator.prototype.getEndNode = function() { + return this.endNode_; +}; + + +/** + * Change the end node of the iterator. + * @param {Node} node The new end node. + */ +goog.dom.TextRangeIterator.prototype.setEndNode = function(node) { + this.endNode_ = node; + this.endOffset_ = 0; +}; + + +/** @override */ +goog.dom.TextRangeIterator.prototype.isLast = function() { + return this.isStarted() && this.node == this.endNode_ && + (!this.endOffset_ || !this.isStartTag()); +}; + + +/** + * Move to the next position in the selection. + * Throws {@code goog.iter.StopIteration} when it passes the end of the range. + * @return {Node} The node at the next position. + * @override + */ +goog.dom.TextRangeIterator.prototype.next = function() { + if (this.isLast()) { + throw goog.iter.StopIteration; + } + + // Call the super function. + return goog.dom.TextRangeIterator.superClass_.next.call(this); +}; + + +/** @override */ +goog.dom.TextRangeIterator.prototype.skipTag = function() { + goog.dom.TextRangeIterator.superClass_.skipTag.apply(this); + + // If the node we are skipping contains the end node, we just skipped past + // the end, so we stop the iteration. + if (goog.dom.contains(this.node, this.endNode_)) { + throw goog.iter.StopIteration; + } +}; + + +/** @override */ +goog.dom.TextRangeIterator.prototype.copyFrom = function(other) { + this.startNode_ = other.startNode_; + this.endNode_ = other.endNode_; + this.startOffset_ = other.startOffset_; + this.endOffset_ = other.endOffset_; + this.isReversed_ = other.isReversed_; + + goog.dom.TextRangeIterator.superClass_.copyFrom.call(this, other); +}; + + +/** + * @return {goog.dom.TextRangeIterator} An identical iterator. + * @override + */ +goog.dom.TextRangeIterator.prototype.clone = function() { + var copy = new goog.dom.TextRangeIterator(this.startNode_, + this.startOffset_, this.endNode_, this.endOffset_, this.isReversed_); + copy.copyFrom(this); + return copy; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/vendor.js b/float-no-zero/closure-library/closure/goog/dom/vendor.js new file mode 100644 index 0000000000..8787f66615 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/vendor.js @@ -0,0 +1,62 @@ +// Copyright 2012 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Vendor prefix getters. + */ + +goog.provide('goog.dom.vendor'); + +goog.require('goog.userAgent'); + + +/** + * Returns the JS vendor prefix used in CSS properties. Different vendors + * use different methods of changing the case of the property names. + * + * @return {?string} The JS vendor prefix or null if there is none. + */ +goog.dom.vendor.getVendorJsPrefix = function() { + if (goog.userAgent.WEBKIT) { + return 'Webkit'; + } else if (goog.userAgent.GECKO) { + return 'Moz'; + } else if (goog.userAgent.IE) { + return 'ms'; + } else if (goog.userAgent.OPERA) { + return 'O'; + } + + return null; +}; + + +/** + * Returns the vendor prefix used in CSS properties. + * + * @return {?string} The vendor prefix or null if there is none. + */ +goog.dom.vendor.getVendorPrefix = function() { + if (goog.userAgent.WEBKIT) { + return '-webkit'; + } else if (goog.userAgent.GECKO) { + return '-moz'; + } else if (goog.userAgent.IE) { + return '-ms'; + } else if (goog.userAgent.OPERA) { + return '-o'; + } + + return null; +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/viewportsizemonitor.js b/float-no-zero/closure-library/closure/goog/dom/viewportsizemonitor.js new file mode 100644 index 0000000000..692687000c --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/viewportsizemonitor.js @@ -0,0 +1,180 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utility class that monitors viewport size changes. + * + * @author attila@google.com (Attila Bodis) + * @see ../demos/viewportsizemonitor.html + */ + +goog.provide('goog.dom.ViewportSizeMonitor'); + +goog.require('goog.dom'); +goog.require('goog.events'); +goog.require('goog.events.EventTarget'); +goog.require('goog.events.EventType'); +goog.require('goog.math.Size'); + + + +/** + * This class can be used to monitor changes in the viewport size. Instances + * dispatch a {@link goog.events.EventType.RESIZE} event when the viewport size + * changes. Handlers can call {@link goog.dom.ViewportSizeMonitor#getSize} to + * get the new viewport size. + * + * Use this class if you want to execute resize/reflow logic each time the + * user resizes the browser window. This class is guaranteed to only dispatch + * {@code RESIZE} events when the pixel dimensions of the viewport change. + * (Internet Explorer fires resize events if any element on the page is resized, + * even if the viewport dimensions are unchanged, which can lead to infinite + * resize loops.) + * + * Example usage: + *
+ *    var vsm = new goog.dom.ViewportSizeMonitor();
+ *    goog.events.listen(vsm, goog.events.EventType.RESIZE, function(e) {
+ *      alert('Viewport size changed to ' + vsm.getSize());
+ *    });
+ *  
+ * + * Manually verified on IE6, IE7, FF2, Opera 11, Safari 4 and Chrome. + * + * @param {Window=} opt_window The window to monitor; defaults to the window in + * which this code is executing. + * @constructor + * @extends {goog.events.EventTarget} + */ +goog.dom.ViewportSizeMonitor = function(opt_window) { + goog.events.EventTarget.call(this); + + // Default the window to the current window if unspecified. + this.window_ = opt_window || window; + + // Listen for window resize events. + this.listenerKey_ = goog.events.listen(this.window_, + goog.events.EventType.RESIZE, this.handleResize_, false, this); + + // Set the initial size. + this.size_ = goog.dom.getViewportSize(this.window_); +}; +goog.inherits(goog.dom.ViewportSizeMonitor, goog.events.EventTarget); + + +/** + * Returns a viewport size monitor for the given window. A new one is created + * if it doesn't exist already. This prevents the unnecessary creation of + * multiple spooling monitors for a window. + * @param {Window=} opt_window The window to monitor; defaults to the window in + * which this code is executing. + * @return {goog.dom.ViewportSizeMonitor} Monitor for the given window. + */ +goog.dom.ViewportSizeMonitor.getInstanceForWindow = function(opt_window) { + var currentWindow = opt_window || window; + var uid = goog.getUid(currentWindow); + + return goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid] = + goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid] || + new goog.dom.ViewportSizeMonitor(currentWindow); +}; + + +/** + * Removes and disposes a viewport size monitor for the given window if one + * exists. + * @param {Window=} opt_window The window whose monitor should be removed; + * defaults to the window in which this code is executing. + */ +goog.dom.ViewportSizeMonitor.removeInstanceForWindow = function(opt_window) { + var uid = goog.getUid(opt_window || window); + + goog.dispose(goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid]); + delete goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid]; +}; + + +/** + * Map of window hash code to viewport size monitor for that window, if + * created. + * @type {Object.} + * @private + */ +goog.dom.ViewportSizeMonitor.windowInstanceMap_ = {}; + + +/** + * Event listener key for window the window resize handler, as returned by + * {@link goog.events.listen}. + * @type {goog.events.Key} + * @private + */ +goog.dom.ViewportSizeMonitor.prototype.listenerKey_ = null; + + +/** + * The window to monitor. Defaults to the window in which the code is running. + * @type {Window} + * @private + */ +goog.dom.ViewportSizeMonitor.prototype.window_ = null; + + +/** + * The most recently recorded size of the viewport, in pixels. + * @type {goog.math.Size?} + * @private + */ +goog.dom.ViewportSizeMonitor.prototype.size_ = null; + + +/** + * Returns the most recently recorded size of the viewport, in pixels. May + * return null if no window resize event has been handled yet. + * @return {goog.math.Size} The viewport dimensions, in pixels. + */ +goog.dom.ViewportSizeMonitor.prototype.getSize = function() { + // Return a clone instead of the original to preserve encapsulation. + return this.size_ ? this.size_.clone() : null; +}; + + +/** @override */ +goog.dom.ViewportSizeMonitor.prototype.disposeInternal = function() { + goog.dom.ViewportSizeMonitor.superClass_.disposeInternal.call(this); + + if (this.listenerKey_) { + goog.events.unlistenByKey(this.listenerKey_); + this.listenerKey_ = null; + } + + this.window_ = null; + this.size_ = null; +}; + + +/** + * Handles window resize events by measuring the dimensions of the + * viewport and dispatching a {@link goog.events.EventType.RESIZE} event if the + * current dimensions are different from the previous ones. + * @param {goog.events.Event} event The window resize event to handle. + * @private + */ +goog.dom.ViewportSizeMonitor.prototype.handleResize_ = function(event) { + var size = goog.dom.getViewportSize(this.window_); + if (!goog.math.Size.equals(size, this.size_)) { + this.size_ = size; + this.dispatchEvent(goog.events.EventType.RESIZE); + } +}; diff --git a/float-no-zero/closure-library/closure/goog/dom/xml.js b/float-no-zero/closure-library/closure/goog/dom/xml.js new file mode 100644 index 0000000000..a5ab4f8db2 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/dom/xml.js @@ -0,0 +1,204 @@ +// Copyright 2006 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview + * XML utilities. + * + */ + +goog.provide('goog.dom.xml'); + +goog.require('goog.dom'); +goog.require('goog.dom.NodeType'); + + +/** + * Max XML size for MSXML2. Used to prevent potential DoS attacks. + * @type {number} + */ +goog.dom.xml.MAX_XML_SIZE_KB = 2 * 1024; // In kB + + +/** + * Max XML size for MSXML2. Used to prevent potential DoS attacks. + * @type {number} + */ +goog.dom.xml.MAX_ELEMENT_DEPTH = 256; // Same default as MSXML6. + + +/** + * Creates an XML document appropriate for the current JS runtime + * @param {string=} opt_rootTagName The root tag name. + * @param {string=} opt_namespaceUri Namespace URI of the document element. + * @return {Document} The new document. + */ +goog.dom.xml.createDocument = function(opt_rootTagName, opt_namespaceUri) { + if (opt_namespaceUri && !opt_rootTagName) { + throw Error("Can't create document with namespace and no root tag"); + } + if (document.implementation && document.implementation.createDocument) { + return document.implementation.createDocument(opt_namespaceUri || '', + opt_rootTagName || '', + null); + } else if (typeof ActiveXObject != 'undefined') { + var doc = goog.dom.xml.createMsXmlDocument_(); + if (doc) { + if (opt_rootTagName) { + doc.appendChild(doc.createNode(goog.dom.NodeType.ELEMENT, + opt_rootTagName, + opt_namespaceUri || '')); + } + return doc; + } + } + throw Error('Your browser does not support creating new documents'); +}; + + +/** + * Creates an XML document from a string + * @param {string} xml The text. + * @return {Document} XML document from the text. + */ +goog.dom.xml.loadXml = function(xml) { + if (typeof DOMParser != 'undefined') { + return new DOMParser().parseFromString(xml, 'application/xml'); + } else if (typeof ActiveXObject != 'undefined') { + var doc = goog.dom.xml.createMsXmlDocument_(); + doc.loadXML(xml); + return doc; + } + throw Error('Your browser does not support loading xml documents'); +}; + + +/** + * Serializes an XML document or subtree to string. + * @param {Document|Element} xml The document or the root node of the subtree. + * @return {string} The serialized XML. + */ +goog.dom.xml.serialize = function(xml) { + // Compatible with Firefox, Opera and WebKit. + if (typeof XMLSerializer != 'undefined') { + return new XMLSerializer().serializeToString(xml); + } + // Compatible with Internet Explorer. + var text = xml.xml; + if (text) { + return text; + } + throw Error('Your browser does not support serializing XML documents'); +}; + + +/** + * Selects a single node using an Xpath expression and a root node + * @param {Node} node The root node. + * @param {string} path Xpath selector. + * @return {Node} The selected node, or null if no matching node. + */ +goog.dom.xml.selectSingleNode = function(node, path) { + if (typeof node.selectSingleNode != 'undefined') { + var doc = goog.dom.getOwnerDocument(node); + if (typeof doc.setProperty != 'undefined') { + doc.setProperty('SelectionLanguage', 'XPath'); + } + return node.selectSingleNode(path); + } else if (document.implementation.hasFeature('XPath', '3.0')) { + var doc = goog.dom.getOwnerDocument(node); + var resolver = doc.createNSResolver(doc.documentElement); + var result = doc.evaluate(path, node, resolver, + XPathResult.FIRST_ORDERED_NODE_TYPE, null); + return result.singleNodeValue; + } + return null; +}; + + +/** + * Selects multiple nodes using an Xpath expression and a root node + * @param {Node} node The root node. + * @param {string} path Xpath selector. + * @return {(NodeList,Array.)} The selected nodes, or empty array if no + * matching nodes. + */ +goog.dom.xml.selectNodes = function(node, path) { + if (typeof node.selectNodes != 'undefined') { + var doc = goog.dom.getOwnerDocument(node); + if (typeof doc.setProperty != 'undefined') { + doc.setProperty('SelectionLanguage', 'XPath'); + } + return node.selectNodes(path); + } else if (document.implementation.hasFeature('XPath', '3.0')) { + var doc = goog.dom.getOwnerDocument(node); + var resolver = doc.createNSResolver(doc.documentElement); + var nodes = doc.evaluate(path, node, resolver, + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var results = []; + var count = nodes.snapshotLength; + for (var i = 0; i < count; i++) { + results.push(nodes.snapshotItem(i)); + } + return results; + } else { + return []; + } +}; + + +/** + * Sets multiple attributes on an element. Differs from goog.dom.setProperties + * in that it exclusively uses the element's setAttributes method. Use this + * when you need to ensure that the exact property is available as an attribute + * and can be read later by the native getAttribute method. + * @param {!Element} element XML or DOM element to set attributes on. + * @param {!Object.} attributes Map of property:value pairs. + */ +goog.dom.xml.setAttributes = function(element, attributes) { + for (var key in attributes) { + if (attributes.hasOwnProperty(key)) { + element.setAttribute(key, attributes[key]); + } + } +}; + + +/** + * Creates an instance of the MSXML2.DOMDocument. + * @return {Document} The new document. + * @private + */ +goog.dom.xml.createMsXmlDocument_ = function() { + var doc = new ActiveXObject('MSXML2.DOMDocument'); + if (doc) { + // Prevent potential vulnerabilities exposed by MSXML2, see + // http://b/1707300 and http://wiki/Main/ISETeamXMLAttacks for details. + doc.resolveExternals = false; + doc.validateOnParse = false; + // Add a try catch block because accessing these properties will throw an + // error on unsupported MSXML versions. This affects Windows machines + // running IE6 or IE7 that are on XP SP2 or earlier without MSXML updates. + // See http://msdn.microsoft.com/en-us/library/ms766391(VS.85).aspx for + // specific details on which MSXML versions support these properties. + try { + doc.setProperty('ProhibitDTD', true); + doc.setProperty('MaxXMLSize', goog.dom.xml.MAX_XML_SIZE_KB); + doc.setProperty('MaxElementDepth', goog.dom.xml.MAX_ELEMENT_DEPTH); + } catch (e) { + // No-op. + } + } + return doc; +}; diff --git a/float-no-zero/closure-library/closure/goog/editor/browserfeature.js b/float-no-zero/closure-library/closure/goog/editor/browserfeature.js new file mode 100644 index 0000000000..4f50e46d38 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/editor/browserfeature.js @@ -0,0 +1,273 @@ +// Copyright 2005 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Trogedit constants for browser features and quirks that should + * be used by the rich text editor. + */ + +goog.provide('goog.editor.BrowserFeature'); + +goog.require('goog.editor.defines'); +goog.require('goog.userAgent'); +goog.require('goog.userAgent.product'); +goog.require('goog.userAgent.product.isVersion'); + + +/** + * Maps browser quirks to boolean values, detailing what the current + * browser supports. + * @type {Object} + */ +goog.editor.BrowserFeature = { + // Whether this browser uses the IE TextRange object. + HAS_IE_RANGES: goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9), + + // Whether this browser uses the W3C standard Range object. + // Assumes IE higher versions will be compliance with W3C standard. + HAS_W3C_RANGES: goog.userAgent.GECKO || goog.userAgent.WEBKIT || + goog.userAgent.OPERA || + (goog.userAgent.IE && goog.userAgent.isDocumentModeOrHigher(9)), + + // Has the contentEditable attribute, which makes nodes editable. + // + // NOTE(nicksantos): FF3 has contentEditable, but there are 3 major reasons + // why we don't use it: + // 1) In FF3, we listen for key events on the document, and we'd have to + // filter them properly. See TR_Browser.USE_DOCUMENT_FOR_KEY_EVENTS. + // 2) In FF3, we listen for focus/blur events on the document, which + // simply doesn't make sense in contentEditable. focus/blur + // on contentEditable elements still has some quirks, which we're + // talking to Firefox-team about. + // 3) We currently use Mutation events in FF3 to detect changes, + // and these are dispatched on the document only. + // If we ever hope to support FF3/contentEditable, all 3 of these issues + // will need answers. Most just involve refactoring at our end. + HAS_CONTENT_EDITABLE: goog.userAgent.IE || goog.userAgent.WEBKIT || + goog.userAgent.OPERA || + (goog.editor.defines.USE_CONTENTEDITABLE_IN_FIREFOX_3 && + goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9')), + + // Whether to use mutation event types to detect changes + // in the field contents. + USE_MUTATION_EVENTS: goog.userAgent.GECKO, + + // Whether the browser has a functional DOMSubtreeModified event. + // TODO(user): Enable for all FF3 once we're confident this event fires + // reliably. Currently it's only enabled if using contentEditable in FF as + // we have no other choice in that case but to use this event. + HAS_DOM_SUBTREE_MODIFIED_EVENT: goog.userAgent.WEBKIT || + (goog.editor.defines.USE_CONTENTEDITABLE_IN_FIREFOX_3 && + goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9')), + + // Whether nodes can be copied from one document to another + HAS_DOCUMENT_INDEPENDENT_NODES: goog.userAgent.GECKO, + + // Whether the cursor goes before or inside the first block element on + // focus, e.g.,

foo

. FF will put the cursor before the + // paragraph on focus, which is wrong. + PUTS_CURSOR_BEFORE_FIRST_BLOCK_ELEMENT_ON_FOCUS: goog.userAgent.GECKO, + + // Whether the selection of one frame is cleared when another frame + // is focused. + CLEARS_SELECTION_WHEN_FOCUS_LEAVES: + goog.userAgent.IE || goog.userAgent.WEBKIT || goog.userAgent.OPERA, + + // Whether "unselectable" is supported as an element style. + HAS_UNSELECTABLE_STYLE: goog.userAgent.GECKO || goog.userAgent.WEBKIT, + + // Whether this browser's "FormatBlock" command does not suck. + FORMAT_BLOCK_WORKS_FOR_BLOCKQUOTES: goog.userAgent.GECKO || + goog.userAgent.WEBKIT || goog.userAgent.OPERA, + + // Whether this browser's "FormatBlock" command may create multiple + // blockquotes. + CREATES_MULTIPLE_BLOCKQUOTES: + (goog.userAgent.WEBKIT && + !goog.userAgent.isVersionOrHigher('534.16')) || + goog.userAgent.OPERA, + + // Whether this browser's "FormatBlock" command will wrap blockquotes + // inside of divs, instead of replacing divs with blockquotes. + WRAPS_BLOCKQUOTE_IN_DIVS: goog.userAgent.OPERA, + + // Whether the readystatechange event is more reliable than load. + PREFERS_READY_STATE_CHANGE_EVENT: goog.userAgent.IE, + + // Whether hitting the tab key will fire a keypress event. + // see http://www.quirksmode.org/js/keys.html + TAB_FIRES_KEYPRESS: !goog.userAgent.IE, + + // Has a standards mode quirk where width=100% doesn't do the right thing, + // but width=99% does. + // TODO(user|user): This should be fixable by less hacky means + NEEDS_99_WIDTH_IN_STANDARDS_MODE: goog.userAgent.IE, + + // Whether keyboard events only reliably fire on the document. + // On Gecko without contentEditable, keyboard events only fire reliably on the + // document element. With contentEditable, the field itself is focusable, + // which means that it will fire key events. This does not apply if + // application is using ContentEditableField or otherwise overriding Field + // not to use an iframe. + USE_DOCUMENT_FOR_KEY_EVENTS: goog.userAgent.GECKO && + !goog.editor.defines.USE_CONTENTEDITABLE_IN_FIREFOX_3, + + // Whether this browser shows non-standard attributes in innerHTML. + SHOWS_CUSTOM_ATTRS_IN_INNER_HTML: goog.userAgent.IE, + + // Whether this browser shrinks empty nodes away to nothing. + // (If so, we need to insert some space characters into nodes that + // shouldn't be collapsed) + COLLAPSES_EMPTY_NODES: + goog.userAgent.GECKO || goog.userAgent.WEBKIT || goog.userAgent.OPERA, + + // Whether we must convert and tags to , . + CONVERT_TO_B_AND_I_TAGS: goog.userAgent.GECKO || goog.userAgent.OPERA, + + // Whether this browser likes to tab through images in contentEditable mode, + // and we like to disable this feature. + TABS_THROUGH_IMAGES: goog.userAgent.IE, + + // Whether this browser unescapes urls when you extract it from the href tag. + UNESCAPES_URLS_WITHOUT_ASKING: goog.userAgent.IE && + !goog.userAgent.isVersionOrHigher('7.0'), + + // Whether this browser supports execCommand("styleWithCSS") to toggle between + // inserting html tags or inline styling for things like bold, italic, etc. + HAS_STYLE_WITH_CSS: + goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.8') || + goog.userAgent.WEBKIT || goog.userAgent.OPERA, + + // Whether clicking on an editable link will take you to that site. + FOLLOWS_EDITABLE_LINKS: goog.userAgent.WEBKIT || + goog.userAgent.IE && goog.userAgent.isVersionOrHigher('9'), + + // Whether this browser has document.activeElement available. + HAS_ACTIVE_ELEMENT: + goog.userAgent.IE || goog.userAgent.OPERA || + goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9'), + + // Whether this browser supports the setCapture method on DOM elements. + HAS_SET_CAPTURE: goog.userAgent.IE, + + // Whether this browser can't set background color when the selection + // is collapsed. + EATS_EMPTY_BACKGROUND_COLOR: goog.userAgent.GECKO || + goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('527'), + + // Whether this browser supports the "focusin" or "DOMFocusIn" event + // consistently. + // NOTE(nicksantos): FF supports DOMFocusIn, but doesn't seem to do so + // consistently. + SUPPORTS_FOCUSIN: goog.userAgent.IE || goog.userAgent.OPERA, + + // Whether clicking on an image will cause the selection to move to the image. + // Note: Gecko moves the selection, but it won't always go to the image. + // For example, if the image is wrapped in a div, and you click on the img, + // anchorNode = focusNode = div, anchorOffset = 0, focusOffset = 1, so this + // is another way of "selecting" the image, but there are too many special + // cases like this so we will do the work manually. + SELECTS_IMAGES_ON_CLICK: goog.userAgent.IE || goog.userAgent.OPERA, + + // Whether this browser moves '); + + // + // Hidefocus is needed to ensure that IE7 doesn't show the dotted, focus + // border when you tab into the field. + html.push('', bodyHtml, ''); + + return html.join(''); +}; + + +/** + * Write the initial iframe content in normal mode. + * @param {goog.editor.icontent.FieldFormatInfo} info Formatting info about + * the field. + * @param {string} bodyHtml The HTML to insert as the iframe body. + * @param {goog.editor.icontent.FieldStyleInfo?} style Style info about + * the field, if needed. + * @param {HTMLIFrameElement} iframe The iframe. + */ +goog.editor.icontent.writeNormalInitialBlendedIframe = + function(info, bodyHtml, style, iframe) { + // Firefox blended needs to inherit all the css from the original page. + // Firefox standards mode needs to set extra style for images. + if (info.blended_) { + var field = style.wrapper_; + // If there is padding on the original field, then the iFrame will be + // positioned inside the padding by default. We don't want this, as it + // causes the contents to appear to shift, and also causes the + // scrollbars to appear inside the padding. + // + // To compensate, we set the iframe margins to offset the padding. + var paddingBox = goog.style.getPaddingBox(field); + if (paddingBox.top || paddingBox.left || + paddingBox.right || paddingBox.bottom) { + goog.style.setStyle(iframe, 'margin', + (-paddingBox.top) + 'px ' + + (-paddingBox.right) + 'px ' + + (-paddingBox.bottom) + 'px ' + + (-paddingBox.left) + 'px'); + } + } + + goog.editor.icontent.writeNormalInitialIframe( + info, bodyHtml, style, iframe); +}; + + +/** + * Write the initial iframe content in normal mode. + * @param {goog.editor.icontent.FieldFormatInfo} info Formatting info about + * the field. + * @param {string} bodyHtml The HTML to insert as the iframe body. + * @param {goog.editor.icontent.FieldStyleInfo?} style Style info about + * the field, if needed. + * @param {HTMLIFrameElement} iframe The iframe. + */ +goog.editor.icontent.writeNormalInitialIframe = + function(info, bodyHtml, style, iframe) { + + var html = goog.editor.icontent.getInitialIframeContent_( + info, bodyHtml, style); + + var doc = goog.dom.getFrameContentDocument(iframe); + doc.open(); + doc.write(html); + doc.close(); +}; + + +/** + * Write the initial iframe content in IE/HTTPS mode. + * @param {goog.editor.icontent.FieldFormatInfo} info Formatting info about + * the field. + * @param {Document} doc The iframe document. + * @param {string} bodyHtml The HTML to insert as the iframe body. + */ +goog.editor.icontent.writeHttpsInitialIframe = function(info, doc, bodyHtml) { + var body = doc.body; + + // For HTTPS we already have a document with a doc type and a body element + // and don't want to create a new history entry which can cause data loss if + // the user clicks the back button. + if (goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE) { + body.contentEditable = true; + } + body.className = 'editable'; + body.setAttribute('g_editable', true); + body.hideFocus = true; + body.id = info.fieldId_; + + goog.style.setStyle(body, info.extraStyles_); + body.innerHTML = bodyHtml; +}; + diff --git a/float-no-zero/closure-library/closure/goog/editor/link.js b/float-no-zero/closure-library/closure/goog/editor/link.js new file mode 100644 index 0000000000..8e70dfe8a4 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/editor/link.js @@ -0,0 +1,359 @@ +// Copyright 2007 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview A utility class for managing editable links. + * + * @author nicksantos@google.com (Nick Santos) + */ + +goog.provide('goog.editor.Link'); + +goog.require('goog.array'); +goog.require('goog.dom'); +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.Range'); +goog.require('goog.editor.BrowserFeature'); +goog.require('goog.editor.Command'); +goog.require('goog.editor.node'); +goog.require('goog.editor.range'); +goog.require('goog.string'); +goog.require('goog.string.Unicode'); +goog.require('goog.uri.utils'); +goog.require('goog.uri.utils.ComponentIndex'); + + + +/** + * Wrap an editable link. + * @param {HTMLAnchorElement} anchor The anchor element. + * @param {boolean} isNew Whether this is a new link. + * @constructor + */ +goog.editor.Link = function(anchor, isNew) { + /** + * The link DOM element. + * @type {HTMLAnchorElement} + * @private + */ + this.anchor_ = anchor; + + /** + * Whether this link represents a link just added to the document. + * @type {boolean} + * @private + */ + this.isNew_ = isNew; + + + /** + * Any extra anchors created by the browser from a selection in the same + * operation that created the primary link + * @type {!Array.} + * @private + */ + this.extraAnchors_ = []; +}; + + +/** + * @return {HTMLAnchorElement} The anchor element. + */ +goog.editor.Link.prototype.getAnchor = function() { + return this.anchor_; +}; + + +/** + * @return {!Array.} The extra anchor elements, if any, + * created by the browser from a selection. + */ +goog.editor.Link.prototype.getExtraAnchors = function() { + return this.extraAnchors_; +}; + + +/** + * @return {string} The inner text for the anchor. + */ +goog.editor.Link.prototype.getCurrentText = function() { + if (!this.currentText_) { + this.currentText_ = goog.dom.getRawTextContent(this.getAnchor()); + } + return this.currentText_; +}; + + +/** + * @return {boolean} Whether the link is new. + */ +goog.editor.Link.prototype.isNew = function() { + return this.isNew_; +}; + + +/** + * Set the url without affecting the isNew() status of the link. + * @param {string} url A URL. + */ +goog.editor.Link.prototype.initializeUrl = function(url) { + this.getAnchor().href = url; +}; + + +/** + * Removes the link, leaving its contents in the document. Note that this + * object will no longer be usable/useful after this call. + */ +goog.editor.Link.prototype.removeLink = function() { + goog.dom.flattenElement(this.anchor_); + this.anchor_ = null; + while (this.extraAnchors_.length) { + goog.dom.flattenElement(/** @type {Element} */(this.extraAnchors_.pop())); + } +}; + + +/** + * Change the link. + * @param {string} newText New text for the link. If the link contains all its + * text in one descendent, newText will only replace the text in that + * one node. Otherwise, we'll change the innerHTML of the whole + * link to newText. + * @param {string} newUrl A new URL. + */ +goog.editor.Link.prototype.setTextAndUrl = function(newText, newUrl) { + var anchor = this.getAnchor(); + anchor.href = newUrl; + + // If the text did not change, don't update link text. + var currentText = this.getCurrentText(); + if (newText != currentText) { + var leaf = goog.editor.node.getLeftMostLeaf(anchor); + if (leaf.nodeType == goog.dom.NodeType.TEXT) { + leaf = leaf.parentNode; + } + + if (goog.dom.getRawTextContent(leaf) != currentText) { + leaf = anchor; + } + + goog.dom.removeChildren(leaf); + + var domHelper = goog.dom.getDomHelper(leaf); + goog.dom.appendChild(leaf, domHelper.createTextNode(newText)); + + // The text changed, so force getCurrentText to recompute. + this.currentText_ = null; + } + + this.isNew_ = false; +}; + + +/** + * Places the cursor to the right of the anchor. + * Note that this is different from goog.editor.range's placeCursorNextTo + * in that it specifically handles the placement of a cursor in browsers + * that trap you in links, by adding a space when necessary and placing the + * cursor after that space. + */ +goog.editor.Link.prototype.placeCursorRightOf = function() { + var anchor = this.getAnchor(); + // If the browser gets stuck in a link if we place the cursor next to it, + // we'll place the cursor after a space instead. + if (goog.editor.BrowserFeature.GETS_STUCK_IN_LINKS) { + var spaceNode; + var nextSibling = anchor.nextSibling; + + // Check if there is already a space after the link. Only handle the + // simple case - the next node is a text node that starts with a space. + if (nextSibling && + nextSibling.nodeType == goog.dom.NodeType.TEXT && + (goog.string.startsWith(nextSibling.data, goog.string.Unicode.NBSP) || + goog.string.startsWith(nextSibling.data, ' '))) { + spaceNode = nextSibling; + } else { + // If there isn't an obvious space to use, create one after the link. + var dh = goog.dom.getDomHelper(anchor); + spaceNode = dh.createTextNode(goog.string.Unicode.NBSP); + goog.dom.insertSiblingAfter(spaceNode, anchor); + } + + // Move the selection after the space. + var range = goog.dom.Range.createCaret(spaceNode, 1); + range.select(); + } else { + goog.editor.range.placeCursorNextTo(anchor, false); + } +}; + + +/** + * Updates the cursor position and link bubble for this link. + * @param {goog.editor.Field} field The field in which the link is created. + * @param {string} url The link url. + * @private + */ +goog.editor.Link.prototype.updateLinkDisplay_ = function(field, url) { + this.initializeUrl(url); + this.placeCursorRightOf(); + field.execCommand(goog.editor.Command.UPDATE_LINK_BUBBLE); +}; + + +/** + * @return {string?} The modified string for the link if the link + * text appears to be a valid link. Returns null if this is not + * a valid link address. + */ +goog.editor.Link.prototype.getValidLinkFromText = function() { + var text = this.getCurrentText(); + if (goog.editor.Link.isLikelyUrl(text)) { + if (text.search(/:/) < 0) { + return 'http://' + goog.string.trimLeft(text); + } + return text; + } else if (goog.editor.Link.isLikelyEmailAddress(text)) { + return 'mailto:' + text; + } + return null; +}; + + +/** + * After link creation, finish creating the link depending on the type + * of link being created. + * @param {goog.editor.Field} field The field where this link is being created. + */ +goog.editor.Link.prototype.finishLinkCreation = function(field) { + var linkFromText = this.getValidLinkFromText(); + if (linkFromText) { + this.updateLinkDisplay_(field, linkFromText); + } else { + field.execCommand(goog.editor.Command.MODAL_LINK_EDITOR, this); + } +}; + + +/** + * Initialize a new link. + * @param {HTMLAnchorElement} anchor The anchor element. + * @param {string} url The initial URL. + * @param {string=} opt_target The target. + * @param {Array.=} opt_extraAnchors Extra anchors created + * by the browser when parsing a selection. + * @return {goog.editor.Link} The link. + */ +goog.editor.Link.createNewLink = function(anchor, url, opt_target, + opt_extraAnchors) { + var link = new goog.editor.Link(anchor, true); + link.initializeUrl(url); + + if (opt_target) { + anchor.target = opt_target; + } + if (opt_extraAnchors) { + link.extraAnchors_ = opt_extraAnchors; + } + + return link; +}; + + +/** + * Returns true if str could be a URL, false otherwise + * + * Ex: TR_Util.isLikelyUrl_("http://www.google.com") == true + * TR_Util.isLikelyUrl_("www.google.com") == true + * + * @param {string} str String to check if it looks like a URL. + * @return {boolean} Whether str could be a URL. + */ +goog.editor.Link.isLikelyUrl = function(str) { + // Whitespace means this isn't a domain. + if (/\s/.test(str)) { + return false; + } + + if (goog.editor.Link.isLikelyEmailAddress(str)) { + return false; + } + + // Add a scheme if the url doesn't have one - this helps the parser. + var addedScheme = false; + if (!/^[^:\/?#.]+:/.test(str)) { + str = 'http://' + str; + addedScheme = true; + } + + // Parse the domain. + var parts = goog.uri.utils.split(str); + + // Relax the rules for special schemes. + var scheme = parts[goog.uri.utils.ComponentIndex.SCHEME]; + if (goog.array.indexOf(['mailto', 'aim'], scheme) != -1) { + return true; + } + + // Require domains to contain a '.', unless the domain is fully qualified and + // forbids domains from containing invalid characters. + var domain = parts[goog.uri.utils.ComponentIndex.DOMAIN]; + if (!domain || (addedScheme && domain.indexOf('.') == -1) || + (/[^\w\d\-\u0100-\uffff.%]/.test(domain))) { + return false; + } + + // Require http and ftp paths to start with '/'. + var path = parts[goog.uri.utils.ComponentIndex.PATH]; + return !path || path.indexOf('/') == 0; +}; + + +/** + * Regular expression that matches strings that could be an email address. + * @type {RegExp} + * @private + */ +goog.editor.Link.LIKELY_EMAIL_ADDRESS_ = new RegExp( + '^' + // Test from start of string + '[\\w-]+(\\.[\\w-]+)*' + // Dot-delimited alphanumerics and dashes (name) + '\\@' + // @ + '([\\w-]+\\.)+' + // Alphanumerics, dashes and dots (domain) + '(\\d+|\\w\\w+)$', // Domain ends in at least one number or 2 letters + 'i'); + + +/** + * Returns true if str could be an email address, false otherwise + * + * Ex: goog.editor.Link.isLikelyEmailAddress_("some word") == false + * goog.editor.Link.isLikelyEmailAddress_("foo@foo.com") == true + * + * @param {string} str String to test for being email address. + * @return {boolean} Whether "str" looks like an email address. + */ +goog.editor.Link.isLikelyEmailAddress = function(str) { + return goog.editor.Link.LIKELY_EMAIL_ADDRESS_.test(str); +}; + + +/** + * Determines whether or not a url is an email link. + * @param {string} url A url. + * @return {boolean} Whether the url is a mailto link. + */ +goog.editor.Link.isMailto = function(url) { + return !!url && goog.string.startsWith(url, 'mailto:'); +}; diff --git a/float-no-zero/closure-library/closure/goog/editor/node.js b/float-no-zero/closure-library/closure/goog/editor/node.js new file mode 100644 index 0000000000..307c7fa557 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/editor/node.js @@ -0,0 +1,483 @@ +// Copyright 2005 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilties for working with DOM nodes related to rich text + * editing. Many of these are not general enough to go into goog.dom. + * + */ + +goog.provide('goog.editor.node'); + +goog.require('goog.dom'); +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.TagName'); +goog.require('goog.dom.iter.ChildIterator'); +goog.require('goog.dom.iter.SiblingIterator'); +goog.require('goog.iter'); +goog.require('goog.object'); +goog.require('goog.string'); +goog.require('goog.string.Unicode'); +goog.require('goog.userAgent'); + + +/** + * Names of all block-level tags + * @type {Object} + * @private + */ +goog.editor.node.BLOCK_TAG_NAMES_ = goog.object.createSet( + goog.dom.TagName.ADDRESS, + goog.dom.TagName.ARTICLE, + goog.dom.TagName.ASIDE, + goog.dom.TagName.BLOCKQUOTE, + goog.dom.TagName.BODY, + goog.dom.TagName.CAPTION, + goog.dom.TagName.CENTER, + goog.dom.TagName.COL, + goog.dom.TagName.COLGROUP, + goog.dom.TagName.DETAILS, + goog.dom.TagName.DIR, + goog.dom.TagName.DIV, + goog.dom.TagName.DL, + goog.dom.TagName.DD, + goog.dom.TagName.DT, + goog.dom.TagName.FIELDSET, + goog.dom.TagName.FIGCAPTION, + goog.dom.TagName.FIGURE, + goog.dom.TagName.FOOTER, + goog.dom.TagName.FORM, + goog.dom.TagName.H1, + goog.dom.TagName.H2, + goog.dom.TagName.H3, + goog.dom.TagName.H4, + goog.dom.TagName.H5, + goog.dom.TagName.H6, + goog.dom.TagName.HEADER, + goog.dom.TagName.HGROUP, + goog.dom.TagName.HR, + goog.dom.TagName.ISINDEX, + goog.dom.TagName.OL, + goog.dom.TagName.LI, + goog.dom.TagName.MAP, + goog.dom.TagName.MENU, + goog.dom.TagName.NAV, + goog.dom.TagName.OPTGROUP, + goog.dom.TagName.OPTION, + goog.dom.TagName.P, + goog.dom.TagName.PRE, + goog.dom.TagName.SECTION, + goog.dom.TagName.SUMMARY, + goog.dom.TagName.TABLE, + goog.dom.TagName.TBODY, + goog.dom.TagName.TD, + goog.dom.TagName.TFOOT, + goog.dom.TagName.TH, + goog.dom.TagName.THEAD, + goog.dom.TagName.TR, + goog.dom.TagName.UL); + + +/** + * Names of tags that have intrinsic content. + * TODO(robbyw): What about object, br, input, textarea, button, isindex, + * hr, keygen, select, table, tr, td? + * @type {Object} + * @private + */ +goog.editor.node.NON_EMPTY_TAGS_ = goog.object.createSet( + goog.dom.TagName.IMG, goog.dom.TagName.IFRAME, goog.dom.TagName.EMBED); + + +/** + * Check if the node is in a standards mode document. + * @param {Node} node The node to test. + * @return {boolean} Whether the node is in a standards mode document. + */ +goog.editor.node.isStandardsMode = function(node) { + return goog.dom.getDomHelper(node).isCss1CompatMode(); +}; + + +/** + * Get the right-most non-ignorable leaf node of the given node. + * @param {Node} parent The parent ndoe. + * @return {Node} The right-most non-ignorable leaf node. + */ +goog.editor.node.getRightMostLeaf = function(parent) { + var temp; + while (temp = goog.editor.node.getLastChild(parent)) { + parent = temp; + } + return parent; +}; + + +/** + * Get the left-most non-ignorable leaf node of the given node. + * @param {Node} parent The parent ndoe. + * @return {Node} The left-most non-ignorable leaf node. + */ +goog.editor.node.getLeftMostLeaf = function(parent) { + var temp; + while (temp = goog.editor.node.getFirstChild(parent)) { + parent = temp; + } + return parent; +}; + + +/** + * Version of firstChild that skips nodes that are entirely + * whitespace and comments. + * @param {Node} parent The reference node. + * @return {Node} The first child of sibling that is important according to + * goog.editor.node.isImportant, or null if no such node exists. + */ +goog.editor.node.getFirstChild = function(parent) { + return goog.editor.node.getChildHelper_(parent, false); +}; + + +/** + * Version of lastChild that skips nodes that are entirely whitespace or + * comments. (Normally lastChild is a property of all DOM nodes that gives the + * last of the nodes contained directly in the reference node.) + * @param {Node} parent The reference node. + * @return {Node} The last child of sibling that is important according to + * goog.editor.node.isImportant, or null if no such node exists. + */ +goog.editor.node.getLastChild = function(parent) { + return goog.editor.node.getChildHelper_(parent, true); +}; + + +/** + * Version of previoussibling that skips nodes that are entirely + * whitespace or comments. (Normally previousSibling is a property + * of all DOM nodes that gives the sibling node, the node that is + * a child of the same parent, that occurs immediately before the + * reference node.) + * @param {Node} sibling The reference node. + * @return {Node} The closest previous sibling to sibling that is + * important according to goog.editor.node.isImportant, or null if no such + * node exists. + */ +goog.editor.node.getPreviousSibling = function(sibling) { + return /** @type {Node} */ (goog.editor.node.getFirstValue_( + goog.iter.filter(new goog.dom.iter.SiblingIterator(sibling, false, true), + goog.editor.node.isImportant))); +}; + + +/** + * Version of nextSibling that skips nodes that are entirely whitespace or + * comments. + * @param {Node} sibling The reference node. + * @return {Node} The closest next sibling to sibling that is important + * according to goog.editor.node.isImportant, or null if no + * such node exists. + */ +goog.editor.node.getNextSibling = function(sibling) { + return /** @type {Node} */ (goog.editor.node.getFirstValue_( + goog.iter.filter(new goog.dom.iter.SiblingIterator(sibling), + goog.editor.node.isImportant))); +}; + + +/** + * Internal helper for lastChild/firstChild that skips nodes that are entirely + * whitespace or comments. + * @param {Node} parent The reference node. + * @param {boolean} isReversed Whether children should be traversed forward + * or backward. + * @return {Node} The first/last child of sibling that is important according + * to goog.editor.node.isImportant, or null if no such node exists. + * @private + */ +goog.editor.node.getChildHelper_ = function(parent, isReversed) { + return (!parent || parent.nodeType != goog.dom.NodeType.ELEMENT) ? null : + /** @type {Node} */ (goog.editor.node.getFirstValue_(goog.iter.filter( + new goog.dom.iter.ChildIterator( + /** @type {Element} */ (parent), isReversed), + goog.editor.node.isImportant))); +}; + + +/** + * Utility function that returns the first value from an iterator or null if + * the iterator is empty. + * @param {goog.iter.Iterator} iterator The iterator to get a value from. + * @return {*} The first value from the iterator. + * @private + */ +goog.editor.node.getFirstValue_ = function(iterator) { + /** @preserveTry */ + try { + return iterator.next(); + } catch (e) { + return null; + } +}; + + +/** + * Determine if a node should be returned by the iterator functions. + * @param {Node} node An object implementing the DOM1 Node interface. + * @return {boolean} Whether the node is an element, or a text node that + * is not all whitespace. + */ +goog.editor.node.isImportant = function(node) { + // Return true if the node is not either a TextNode or an ElementNode. + return node.nodeType == goog.dom.NodeType.ELEMENT || + node.nodeType == goog.dom.NodeType.TEXT && + !goog.editor.node.isAllNonNbspWhiteSpace(node); +}; + + +/** + * Determine whether a node's text content is entirely whitespace. + * @param {Node} textNode A node implementing the CharacterData interface (i.e., + * a Text, Comment, or CDATASection node. + * @return {boolean} Whether the text content of node is whitespace, + * otherwise false. + */ +goog.editor.node.isAllNonNbspWhiteSpace = function(textNode) { + return goog.string.isBreakingWhitespace(textNode.nodeValue); +}; + + +/** + * Returns true if the node contains only whitespace and is not and does not + * contain any images, iframes or embed tags. + * @param {Node} node The node to check. + * @param {boolean=} opt_prohibitSingleNbsp By default, this function treats a + * single nbsp as empty. Set this to true to treat this case as non-empty. + * @return {boolean} Whether the node contains only whitespace. + */ +goog.editor.node.isEmpty = function(node, opt_prohibitSingleNbsp) { + var nodeData = goog.dom.getRawTextContent(node); + + if (node.getElementsByTagName) { + for (var tag in goog.editor.node.NON_EMPTY_TAGS_) { + if (node.tagName == tag || node.getElementsByTagName(tag).length > 0) { + return false; + } + } + } + return (!opt_prohibitSingleNbsp && nodeData == goog.string.Unicode.NBSP) || + goog.string.isBreakingWhitespace(nodeData); +}; + + +/** + * Returns the length of the text in node if it is a text node, or the number + * of children of the node, if it is an element. Useful for range-manipulation + * code where you need to know the offset for the right side of the node. + * @param {Node} node The node to get the length of. + * @return {number} The length of the node. + */ +goog.editor.node.getLength = function(node) { + return node.length || node.childNodes.length; +}; + + +/** + * Search child nodes using a predicate function and return the first node that + * satisfies the condition. + * @param {Node} parent The parent node to search. + * @param {function(Node):boolean} hasProperty A function that takes a child + * node as a parameter and returns true if it meets the criteria. + * @return {?number} The index of the node found, or null if no node is found. + */ +goog.editor.node.findInChildren = function(parent, hasProperty) { + for (var i = 0, len = parent.childNodes.length; i < len; i++) { + if (hasProperty(parent.childNodes[i])) { + return i; + } + } + return null; +}; + + +/** + * Search ancestor nodes using a predicate function and returns the topmost + * ancestor in the chain of consecutive ancestors that satisfies the condition. + * + * @param {Node} node The node whose ancestors have to be searched. + * @param {function(Node): boolean} hasProperty A function that takes a parent + * node as a parameter and returns true if it meets the criteria. + * @return {Node} The topmost ancestor or null if no ancestor satisfies the + * predicate function. + */ +goog.editor.node.findHighestMatchingAncestor = function(node, hasProperty) { + var parent = node.parentNode; + var ancestor = null; + while (parent && hasProperty(parent)) { + ancestor = parent; + parent = parent.parentNode; + } + return ancestor; +}; + + +/** +* Checks if node is a block-level html element. The display css + * property is ignored. + * @param {Node} node The node to test. + * @return {boolean} Whether the node is a block-level node. + */ +goog.editor.node.isBlockTag = function(node) { + return !!goog.editor.node.BLOCK_TAG_NAMES_[node.tagName]; +}; + + +/** + * Skips siblings of a node that are empty text nodes. + * @param {Node} node A node. May be null. + * @return {Node} The node or the first sibling of the node that is not an + * empty text node. May be null. + */ +goog.editor.node.skipEmptyTextNodes = function(node) { + while (node && node.nodeType == goog.dom.NodeType.TEXT && + !node.nodeValue) { + node = node.nextSibling; + } + return node; +}; + + +/** + * Checks if an element is a top-level editable container (meaning that + * it itself is not editable, but all its child nodes are editable). + * @param {Node} element The element to test. + * @return {boolean} Whether the element is a top-level editable container. + */ +goog.editor.node.isEditableContainer = function(element) { + return element.getAttribute && + element.getAttribute('g_editable') == 'true'; +}; + + +/** + * Checks if a node is inside an editable container. + * @param {Node} node The node to test. + * @return {boolean} Whether the node is in an editable container. + */ +goog.editor.node.isEditable = function(node) { + return !!goog.dom.getAncestor(node, goog.editor.node.isEditableContainer); +}; + + +/** + * Finds the top-most DOM node inside an editable field that is an ancestor + * (or self) of a given DOM node and meets the specified criteria. + * @param {Node} node The DOM node where the search starts. + * @param {function(Node) : boolean} criteria A function that takes a DOM node + * as a parameter and returns a boolean to indicate whether the node meets + * the criteria or not. + * @return {Node} The DOM node if found, or null. + */ +goog.editor.node.findTopMostEditableAncestor = function(node, criteria) { + var targetNode = null; + while (node && !goog.editor.node.isEditableContainer(node)) { + if (criteria(node)) { + targetNode = node; + } + node = node.parentNode; + } + return targetNode; +}; + + +/** + * Splits off a subtree. + * @param {!Node} currentNode The starting splitting point. + * @param {Node=} opt_secondHalf The initial leftmost leaf the new subtree. + * If null, siblings after currentNode will be placed in the subtree, but + * no additional node will be. + * @param {Node=} opt_root The top of the tree where splitting stops at. + * @return {!Node} The new subtree. + */ +goog.editor.node.splitDomTreeAt = function(currentNode, + opt_secondHalf, opt_root) { + var parent; + while (currentNode != opt_root && (parent = currentNode.parentNode)) { + opt_secondHalf = goog.editor.node.getSecondHalfOfNode_(parent, currentNode, + opt_secondHalf); + currentNode = parent; + } + return /** @type {!Node} */(opt_secondHalf); +}; + + +/** + * Creates a clone of node, moving all children after startNode to it. + * When firstChild is not null or undefined, it is also appended to the clone + * as the first child. + * @param {!Node} node The node to clone. + * @param {!Node} startNode All siblings after this node will be moved to the + * clone. + * @param {Node|undefined} firstChild The first child of the new cloned element. + * @return {!Node} The cloned node that now contains the children after + * startNode. + * @private + */ +goog.editor.node.getSecondHalfOfNode_ = function(node, startNode, firstChild) { + var secondHalf = /** @type {!Node} */(node.cloneNode(false)); + while (startNode.nextSibling) { + goog.dom.appendChild(secondHalf, startNode.nextSibling); + } + if (firstChild) { + secondHalf.insertBefore(firstChild, secondHalf.firstChild); + } + return secondHalf; +}; + + +/** + * Appends all of oldNode's children to newNode. This removes all children from + * oldNode and appends them to newNode. oldNode is left with no children. + * @param {!Node} newNode Node to transfer children to. + * @param {Node} oldNode Node to transfer children from. + * @deprecated Use goog.dom.append directly instead. + */ +goog.editor.node.transferChildren = function(newNode, oldNode) { + goog.dom.append(newNode, oldNode.childNodes); +}; + + +/** + * Replaces the innerHTML of a node. + * + * IE has serious problems if you try to set innerHTML of an editable node with + * any selection. Early versions of IE tear up the old internal tree storage, to + * help avoid ref-counting loops. But this sometimes leaves the selection object + * in a bad state and leads to segfaults. + * + * Removing the nodes first prevents IE from tearing them up. This is not + * strictly necessary in nodes that do not have the selection. You should always + * use this function when setting innerHTML inside of a field. + * + * @param {Node} node A node. + * @param {string} html The innerHTML to set on the node. + */ +goog.editor.node.replaceInnerHtml = function(node, html) { + // Only do this IE. On gecko, we use element change events, and don't + // want to trigger spurious events. + if (goog.userAgent.IE) { + goog.dom.removeChildren(node); + } + node.innerHTML = html; +}; diff --git a/float-no-zero/closure-library/closure/goog/editor/plugin.js b/float-no-zero/closure-library/closure/goog/editor/plugin.js new file mode 100644 index 0000000000..3550c4cde6 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/editor/plugin.js @@ -0,0 +1,463 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// All Rights Reserved. + +/** + * @fileoverview Abstract API for TrogEdit plugins. + * + * @see ../demos/editor/editor.html + */ + +goog.provide('goog.editor.Plugin'); + +// TODO(user): Remove the dependency on goog.editor.Command asap. Currently only +// needed for execCommand issues with links. +goog.require('goog.editor.Command'); +goog.require('goog.events.EventTarget'); +goog.require('goog.functions'); +goog.require('goog.log'); +goog.require('goog.object'); +goog.require('goog.reflect'); + + + +/** + * Abstract API for trogedit plugins. + * @constructor + * @extends {goog.events.EventTarget} + */ +goog.editor.Plugin = function() { + goog.events.EventTarget.call(this); + + /** + * Whether this plugin is enabled for the registered field object. + * @type {boolean} + * @private + */ + this.enabled_ = this.activeOnUneditableFields(); +}; +goog.inherits(goog.editor.Plugin, goog.events.EventTarget); + + +/** + * The field object this plugin is attached to. + * @type {goog.editor.Field} + * @protected + * @deprecated Use goog.editor.Plugin.getFieldObject and + * goog.editor.Plugin.setFieldObject. + */ +goog.editor.Plugin.prototype.fieldObject = null; + + +/** + * @return {goog.dom.DomHelper?} The dom helper object associated with the + * currently active field. + */ +goog.editor.Plugin.prototype.getFieldDomHelper = function() { + return this.getFieldObject() && this.getFieldObject().getEditableDomHelper(); +}; + + +/** + * Indicates if this plugin should be automatically disposed when the + * registered field is disposed. This should be changed to false for + * plugins used as multi-field plugins. + * @type {boolean} + * @private + */ +goog.editor.Plugin.prototype.autoDispose_ = true; + + +/** + * The logger for this plugin. + * @type {goog.log.Logger} + * @protected + */ +goog.editor.Plugin.prototype.logger = + goog.log.getLogger('goog.editor.Plugin'); + + +/** + * Sets the field object for use with this plugin. + * @return {goog.editor.Field} The editable field object. + * @protected + * @suppress {deprecated} Until fieldObject can be made private. + */ +goog.editor.Plugin.prototype.getFieldObject = function() { + return this.fieldObject; +}; + + +/** + * Sets the field object for use with this plugin. + * @param {goog.editor.Field} fieldObject The editable field object. + * @protected + * @suppress {deprecated} Until fieldObject can be made private. + */ +goog.editor.Plugin.prototype.setFieldObject = function(fieldObject) { + this.fieldObject = fieldObject; +}; + + +/** + * Registers the field object for use with this plugin. + * @param {goog.editor.Field} fieldObject The editable field object. + */ +goog.editor.Plugin.prototype.registerFieldObject = function(fieldObject) { + this.setFieldObject(fieldObject); +}; + + +/** + * Unregisters and disables this plugin for the current field object. + * @param {goog.editor.Field} fieldObj The field object. For single-field + * plugins, this parameter is ignored. + */ +goog.editor.Plugin.prototype.unregisterFieldObject = function(fieldObj) { + if (this.getFieldObject()) { + this.disable(this.getFieldObject()); + this.setFieldObject(null); + } +}; + + +/** + * Enables this plugin for the specified, registered field object. A field + * object should only be enabled when it is loaded. + * @param {goog.editor.Field} fieldObject The field object. + */ +goog.editor.Plugin.prototype.enable = function(fieldObject) { + if (this.getFieldObject() == fieldObject) { + this.enabled_ = true; + } else { + goog.log.error(this.logger, 'Trying to enable an unregistered field with ' + + 'this plugin.'); + } +}; + + +/** + * Disables this plugin for the specified, registered field object. + * @param {goog.editor.Field} fieldObject The field object. + */ +goog.editor.Plugin.prototype.disable = function(fieldObject) { + if (this.getFieldObject() == fieldObject) { + this.enabled_ = false; + } else { + goog.log.error(this.logger, 'Trying to disable an unregistered field ' + + 'with this plugin.'); + } +}; + + +/** + * Returns whether this plugin is enabled for the field object. + * + * @param {goog.editor.Field} fieldObject The field object. + * @return {boolean} Whether this plugin is enabled for the field object. + */ +goog.editor.Plugin.prototype.isEnabled = function(fieldObject) { + return this.getFieldObject() == fieldObject ? this.enabled_ : false; +}; + + +/** + * Set if this plugin should automatically be disposed when the registered + * field is disposed. + * @param {boolean} autoDispose Whether to autoDispose. + */ +goog.editor.Plugin.prototype.setAutoDispose = function(autoDispose) { + this.autoDispose_ = autoDispose; +}; + + +/** + * @return {boolean} Whether or not this plugin should automatically be disposed + * when it's registered field is disposed. + */ +goog.editor.Plugin.prototype.isAutoDispose = function() { + return this.autoDispose_; +}; + + +/** + * @return {boolean} If true, field will not disable the command + * when the field becomes uneditable. + */ +goog.editor.Plugin.prototype.activeOnUneditableFields = goog.functions.FALSE; + + +/** + * @param {string} command The command to check. + * @return {boolean} If true, field will not dispatch change events + * for commands of this type. This is useful for "seamless" plugins like + * dialogs and lorem ipsum. + */ +goog.editor.Plugin.prototype.isSilentCommand = goog.functions.FALSE; + + +/** @override */ +goog.editor.Plugin.prototype.disposeInternal = function() { + if (this.getFieldObject()) { + this.unregisterFieldObject(this.getFieldObject()); + } + + goog.editor.Plugin.superClass_.disposeInternal.call(this); +}; + + +/** + * @return {string} The ID unique to this plugin class. Note that different + * instances off the plugin share the same classId. + */ +goog.editor.Plugin.prototype.getTrogClassId; + + +/** + * An enum of operations that plugins may support. + * @enum {number} + */ +goog.editor.Plugin.Op = { + KEYDOWN: 1, + KEYPRESS: 2, + KEYUP: 3, + SELECTION: 4, + SHORTCUT: 5, + EXEC_COMMAND: 6, + QUERY_COMMAND: 7, + PREPARE_CONTENTS_HTML: 8, + CLEAN_CONTENTS_HTML: 10, + CLEAN_CONTENTS_DOM: 11 +}; + + +/** + * A map from plugin operations to the names of the methods that + * invoke those operations. + */ +goog.editor.Plugin.OPCODE = goog.object.transpose( + goog.reflect.object(goog.editor.Plugin, { + handleKeyDown: goog.editor.Plugin.Op.KEYDOWN, + handleKeyPress: goog.editor.Plugin.Op.KEYPRESS, + handleKeyUp: goog.editor.Plugin.Op.KEYUP, + handleSelectionChange: goog.editor.Plugin.Op.SELECTION, + handleKeyboardShortcut: goog.editor.Plugin.Op.SHORTCUT, + execCommand: goog.editor.Plugin.Op.EXEC_COMMAND, + queryCommandValue: goog.editor.Plugin.Op.QUERY_COMMAND, + prepareContentsHtml: goog.editor.Plugin.Op.PREPARE_CONTENTS_HTML, + cleanContentsHtml: goog.editor.Plugin.Op.CLEAN_CONTENTS_HTML, + cleanContentsDom: goog.editor.Plugin.Op.CLEAN_CONTENTS_DOM + })); + + +/** + * A set of op codes that run even on disabled plugins. + */ +goog.editor.Plugin.IRREPRESSIBLE_OPS = goog.object.createSet( + goog.editor.Plugin.Op.PREPARE_CONTENTS_HTML, + goog.editor.Plugin.Op.CLEAN_CONTENTS_HTML, + goog.editor.Plugin.Op.CLEAN_CONTENTS_DOM); + + +/** + * Handles keydown. It is run before handleKeyboardShortcut and if it returns + * true handleKeyboardShortcut will not be called. + * @param {!goog.events.BrowserEvent} e The browser event. + * @return {boolean} Whether the event was handled and thus should *not* be + * propagated to other plugins or handleKeyboardShortcut. + */ +goog.editor.Plugin.prototype.handleKeyDown; + + +/** + * Handles keypress. It is run before handleKeyboardShortcut and if it returns + * true handleKeyboardShortcut will not be called. + * @param {!goog.events.BrowserEvent} e The browser event. + * @return {boolean} Whether the event was handled and thus should *not* be + * propagated to other plugins or handleKeyboardShortcut. + */ +goog.editor.Plugin.prototype.handleKeyPress; + + +/** + * Handles keyup. + * @param {!goog.events.BrowserEvent} e The browser event. + * @return {boolean} Whether the event was handled and thus should *not* be + * propagated to other plugins. + */ +goog.editor.Plugin.prototype.handleKeyUp; + + +/** + * Handles selection change. + * @param {!goog.events.BrowserEvent=} opt_e The browser event. + * @param {!Node=} opt_target The node the selection changed to. + * @return {boolean} Whether the event was handled and thus should *not* be + * propagated to other plugins. + */ +goog.editor.Plugin.prototype.handleSelectionChange; + + +/** + * Handles keyboard shortcuts. Preferred to using handleKey* as it will use + * the proper event based on browser and will be more performant. If + * handleKeyPress/handleKeyDown returns true, this will not be called. If the + * plugin handles the shortcut, it is responsible for dispatching appropriate + * events (change, selection change at the time of this comment). If the plugin + * calls execCommand on the editable field, then execCommand already takes care + * of dispatching events. + * NOTE: For performance reasons this is only called when any key is pressed + * in conjunction with ctrl/meta keys OR when a small subset of keys (defined + * in goog.editor.Field.POTENTIAL_SHORTCUT_KEYCODES_) are pressed without + * ctrl/meta keys. We specifically don't invoke it when altKey is pressed since + * alt key is used in many i8n UIs to enter certain characters. + * @param {!goog.events.BrowserEvent} e The browser event. + * @param {string} key The key pressed. + * @param {boolean} isModifierPressed Whether the ctrl/meta key was pressed or + * not. + * @return {boolean} Whether the event was handled and thus should *not* be + * propagated to other plugins. We also call preventDefault on the event if + * the return value is true. + */ +goog.editor.Plugin.prototype.handleKeyboardShortcut; + + +/** + * Handles execCommand. This default implementation handles dispatching + * BEFORECHANGE, CHANGE, and SELECTIONCHANGE events, and calls + * execCommandInternal to perform the actual command. Plugins that want to + * do their own event dispatching should override execCommand, otherwise + * it is preferred to only override execCommandInternal. + * + * This version of execCommand will only work for single field plugins. + * Multi-field plugins must override execCommand. + * + * @param {string} command The command to execute. + * @param {...*} var_args Any additional parameters needed to + * execute the command. + * @return {*} The result of the execCommand, if any. + */ +goog.editor.Plugin.prototype.execCommand = function(command, var_args) { + // TODO(user): Replace all uses of isSilentCommand with plugins that just + // override this base execCommand method. + var silent = this.isSilentCommand(command); + if (!silent) { + // Stop listening to mutation events in Firefox while text formatting + // is happening. This prevents us from trying to size the field in the + // middle of an execCommand, catching the field in a strange intermediary + // state where both replacement nodes and original nodes are appended to + // the dom. Note that change events get turned back on by + // fieldObj.dispatchChange. + if (goog.userAgent.GECKO) { + this.getFieldObject().stopChangeEvents(true, true); + } + + this.getFieldObject().dispatchBeforeChange(); + } + + try { + var result = this.execCommandInternal.apply(this, arguments); + } finally { + // If the above execCommandInternal call throws an exception, we still need + // to turn change events back on (see http://b/issue?id=1471355). + // NOTE: If if you add to or change the methods called in this finally + // block, please add them as expected calls to the unit test function + // testExecCommandException(). + if (!silent) { + // dispatchChange includes a call to startChangeEvents, which unwinds the + // call to stopChangeEvents made before the try block. + this.getFieldObject().dispatchChange(); + this.getFieldObject().dispatchSelectionChangeEvent(); + } + } + + return result; +}; + + +/** + * Handles execCommand. This default implementation does nothing, and is + * called by execCommand, which handles event dispatching. This method should + * be overriden by plugins that don't need to do their own event dispatching. + * If custom event dispatching is needed, execCommand shoul be overriden + * instead. + * + * @param {string} command The command to execute. + * @param {...*} var_args Any additional parameters needed to + * execute the command. + * @return {*} The result of the execCommand, if any. + * @protected + */ +goog.editor.Plugin.prototype.execCommandInternal; + + +/** + * Gets the state of this command if this plugin serves that command. + * @param {string} command The command to check. + * @return {*} The value of the command. + */ +goog.editor.Plugin.prototype.queryCommandValue; + + +/** + * Prepares the given HTML for editing. Strips out content that should not + * appear in an editor, and normalizes content as appropriate. The inverse + * of cleanContentsHtml. + * + * This op is invoked even on disabled plugins. + * + * @param {string} originalHtml The original HTML. + * @param {Object} styles A map of strings. If the plugin wants to add + * any styles to the field element, it should add them as key-value + * pairs to this object. + * @return {string} New HTML that's ok for editing. + */ +goog.editor.Plugin.prototype.prepareContentsHtml; + + +/** + * Cleans the contents of the node passed to it. The node contents are modified + * directly, and the modifications will subsequently be used, for operations + * such as saving the innerHTML of the editor etc. Since the plugins act on + * the DOM directly, this method can be very expensive. + * + * This op is invoked even on disabled plugins. + * + * @param {!Element} fieldCopy The copy of the editable field which + * needs to be cleaned up. + */ +goog.editor.Plugin.prototype.cleanContentsDom; + + +/** + * Cleans the html contents of Trogedit. Both cleanContentsDom and + * and cleanContentsHtml will be called on contents extracted from Trogedit. + * The inverse of prepareContentsHtml. + * + * This op is invoked even on disabled plugins. + * + * @param {string} originalHtml The trogedit HTML. + * @return {string} Cleaned-up HTML. + */ +goog.editor.Plugin.prototype.cleanContentsHtml; + + +/** + * Whether the string corresponds to a command this plugin handles. + * @param {string} command Command string to check. + * @return {boolean} Whether the plugin handles this type of command. + */ +goog.editor.Plugin.prototype.isSupportedCommand = function(command) { + return false; +}; diff --git a/float-no-zero/closure-library/closure/goog/editor/plugins/abstractbubbleplugin.js b/float-no-zero/closure-library/closure/goog/editor/plugins/abstractbubbleplugin.js new file mode 100644 index 0000000000..cc230eed27 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/editor/plugins/abstractbubbleplugin.js @@ -0,0 +1,630 @@ +// Copyright 2005 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Base class for bubble plugins. + */ + +goog.provide('goog.editor.plugins.AbstractBubblePlugin'); + +goog.require('goog.dom'); +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.Range'); +goog.require('goog.dom.TagName'); +goog.require('goog.editor.Plugin'); +goog.require('goog.editor.style'); +goog.require('goog.events'); +goog.require('goog.events.EventHandler'); +goog.require('goog.events.EventType'); +goog.require('goog.events.KeyCodes'); +goog.require('goog.events.actionEventWrapper'); +goog.require('goog.functions'); +goog.require('goog.string.Unicode'); +goog.require('goog.ui.Component.EventType'); +goog.require('goog.ui.editor.Bubble'); +goog.require('goog.userAgent'); + + + +/** + * Base class for bubble plugins. This is used for to connect user behavior + * in the editor to a goog.ui.editor.Bubble UI element that allows + * the user to modify the properties of an element on their page (e.g. the alt + * text of an image tag). + * + * Subclasses should override the abstract method getBubbleTargetFromSelection() + * with code to determine if the current selection should activate the bubble + * type. The other abstract method createBubbleContents() should be overriden + * with code to create the inside markup of the bubble. The base class creates + * the rest of the bubble. + * + * @constructor + * @extends {goog.editor.Plugin} + */ +goog.editor.plugins.AbstractBubblePlugin = function() { + goog.base(this); + + /** + * Place to register events the plugin listens to. + * @type {goog.events.EventHandler} + * @protected + */ + this.eventRegister = new goog.events.EventHandler(this); +}; +goog.inherits(goog.editor.plugins.AbstractBubblePlugin, goog.editor.Plugin); + + +/** + * The css class name of option link elements. + * @type {string} + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.OPTION_LINK_CLASSNAME_ = + goog.getCssName('tr_option-link'); + + +/** + * The css class name of link elements. + * @type {string} + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.LINK_CLASSNAME_ = + goog.getCssName('tr_bubble_link'); + + +/** + * The constant string used to separate option links. + * @type {string} + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.DASH_NBSP_STRING = + goog.string.Unicode.NBSP + '-' + goog.string.Unicode.NBSP; + + +/** + * Default factory function for creating a bubble UI component. + * @param {!Element} parent The parent element for the bubble. + * @param {number} zIndex The z index to draw the bubble at. + * @return {!goog.ui.editor.Bubble} The new bubble component. + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.defaultBubbleFactory_ = function( + parent, zIndex) { + return new goog.ui.editor.Bubble(parent, zIndex); +}; + + +/** + * Factory function that creates a bubble UI component. It takes as parameters + * the bubble parent element and the z index to draw the bubble at. + * @type {function(!Element, number): !goog.ui.editor.Bubble} + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.bubbleFactory_ = + goog.editor.plugins.AbstractBubblePlugin.defaultBubbleFactory_; + + +/** + * Sets the bubble factory function. + * @param {function(!Element, number): !goog.ui.editor.Bubble} + * bubbleFactory Function that creates a bubble for the given bubble parent + * element and z index. + */ +goog.editor.plugins.AbstractBubblePlugin.setBubbleFactory = function( + bubbleFactory) { + goog.editor.plugins.AbstractBubblePlugin.bubbleFactory_ = bubbleFactory; +}; + + +/** + * Map from field id to shared bubble object. + * @type {Object.} + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.bubbleMap_ = {}; + + +/** + * The optional parent of the bubble. If null or not set, we will use the + * application document. This is useful when you have an editor embedded in + * a scrolling DIV. + * @type {Element|undefined} + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.bubbleParent_; + + +/** + * The id of the panel this plugin added to the shared bubble. Null when + * this plugin doesn't currently have a panel in a bubble. + * @type {string?} + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.panelId_ = null; + + +/** + * Whether this bubble should support tabbing through the link elements. False + * by default. + * @type {boolean} + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.keyboardNavigationEnabled_ = + false; + + +/** + * Sets whether the bubble should support tabbing through the link elements. + * @param {boolean} keyboardNavigationEnabled Whether the bubble should support + * tabbing through the link elements. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.enableKeyboardNavigation = + function(keyboardNavigationEnabled) { + this.keyboardNavigationEnabled_ = keyboardNavigationEnabled; +}; + + +/** + * Sets the bubble parent. + * @param {Element} bubbleParent An element where the bubble will be + * anchored. If null, we will use the application document. This + * is useful when you have an editor embedded in a scrolling div. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.setBubbleParent = function( + bubbleParent) { + this.bubbleParent_ = bubbleParent; +}; + + +/** + * @return {goog.dom.DomHelper} The dom helper for the bubble window. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.getBubbleDom = function() { + return this.dom_; +}; + + +/** @override */ +goog.editor.plugins.AbstractBubblePlugin.prototype.getTrogClassId = + goog.functions.constant('AbstractBubblePlugin'); + + +/** + * Returns the element whose properties the bubble manipulates. + * @return {Element} The target element. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.getTargetElement = + function() { + return this.targetElement_; +}; + + +/** @override */ +goog.editor.plugins.AbstractBubblePlugin.prototype.handleKeyUp = function(e) { + // For example, when an image is selected, pressing any key overwrites + // the image and the panel should be hidden. + // Therefore we need to track key presses when the bubble is showing. + if (this.isVisible()) { + this.handleSelectionChange(); + } + return false; +}; + + +/** + * Pops up a property bubble for the given selection if appropriate and closes + * open property bubbles if no longer needed. This should not be overridden. + * @override + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.handleSelectionChange = + function(opt_e, opt_target) { + var selectedElement; + if (opt_e) { + selectedElement = /** @type {Element} */ (opt_e.target); + } else if (opt_target) { + selectedElement = /** @type {Element} */ (opt_target); + } else { + var range = this.getFieldObject().getRange(); + if (range) { + var startNode = range.getStartNode(); + var endNode = range.getEndNode(); + var startOffset = range.getStartOffset(); + var endOffset = range.getEndOffset(); + // Sometimes in IE, the range will be collapsed, but think the end node + // and start node are different (although in the same visible position). + // In this case, favor the position IE thinks is the start node. + if (goog.userAgent.IE && range.isCollapsed() && startNode != endNode) { + range = goog.dom.Range.createCaret(startNode, startOffset); + } + if (startNode.nodeType == goog.dom.NodeType.ELEMENT && + startNode == endNode && startOffset == endOffset - 1) { + var element = startNode.childNodes[startOffset]; + if (element.nodeType == goog.dom.NodeType.ELEMENT) { + selectedElement = element; + } + } + } + selectedElement = selectedElement || range && range.getContainerElement(); + } + return this.handleSelectionChangeInternal(selectedElement); +}; + + +/** + * Pops up a property bubble for the given selection if appropriate and closes + * open property bubbles if no longer needed. + * @param {Element?} selectedElement The selected element. + * @return {boolean} Always false, allowing every bubble plugin to handle the + * event. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype. + handleSelectionChangeInternal = function(selectedElement) { + if (selectedElement) { + var bubbleTarget = this.getBubbleTargetFromSelection(selectedElement); + if (bubbleTarget) { + if (bubbleTarget != this.targetElement_ || !this.panelId_) { + // Make sure any existing panel of the same type is closed before + // creating a new one. + if (this.panelId_) { + this.closeBubble(); + } + this.createBubble(bubbleTarget); + } + return false; + } + } + + if (this.panelId_) { + this.closeBubble(); + } + + return false; +}; + + +/** + * Should be overriden by subclasses to return the bubble target element or + * null if an element of their required type isn't found. + * @param {Element} selectedElement The target of the selection change event or + * the parent container of the current entire selection. + * @return {Element?} The HTML bubble target element or null if no element of + * the required type is not found. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype. + getBubbleTargetFromSelection = goog.abstractMethod; + + +/** @override */ +goog.editor.plugins.AbstractBubblePlugin.prototype.disable = function(field) { + // When the field is made uneditable, dispose of the bubble. We do this + // because the next time the field is made editable again it may be in + // a different document / iframe. + if (field.isUneditable()) { + var bubble = goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[field.id]; + if (bubble) { + bubble.dispose(); + delete goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[field.id]; + } + } +}; + + +/** + * @return {goog.ui.editor.Bubble} The shared bubble object for the field this + * plugin is registered on. Creates it if necessary. + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.getSharedBubble_ = + function() { + var bubbleParent = /** @type {!Element} */ (this.bubbleParent_ || + this.getFieldObject().getAppWindow().document.body); + this.dom_ = goog.dom.getDomHelper(bubbleParent); + + var bubble = goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[ + this.getFieldObject().id]; + if (!bubble) { + bubble = goog.editor.plugins.AbstractBubblePlugin.bubbleFactory_.call(null, + bubbleParent, + this.getFieldObject().getBaseZindex()); + goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[ + this.getFieldObject().id] = bubble; + } + return bubble; +}; + + +/** + * Creates and shows the property bubble. + * @param {Element} targetElement The target element of the bubble. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.createBubble = function( + targetElement) { + var bubble = this.getSharedBubble_(); + if (!bubble.hasPanelOfType(this.getBubbleType())) { + this.targetElement_ = targetElement; + + this.panelId_ = bubble.addPanel(this.getBubbleType(), this.getBubbleTitle(), + targetElement, + goog.bind(this.createBubbleContents, this), + this.shouldPreferBubbleAboveElement()); + this.eventRegister.listen(bubble, goog.ui.Component.EventType.HIDE, + this.handlePanelClosed_); + + this.onShow(); + + if (this.keyboardNavigationEnabled_) { + this.eventRegister.listen(bubble.getContentElement(), + goog.events.EventType.KEYDOWN, this.onBubbleKey_); + } + } +}; + + +/** + * @return {string} The type of bubble shown by this plugin. Usually the tag + * name of the element this bubble targets. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.getBubbleType = function() { + return ''; +}; + + +/** + * @return {string} The title for bubble shown by this plugin. Defaults to no + * title. Should be overridden by subclasses. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.getBubbleTitle = function() { + return ''; +}; + + +/** + * @return {boolean} Whether the bubble should prefer placement above the + * target element. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype. + shouldPreferBubbleAboveElement = goog.functions.FALSE; + + +/** + * Should be overriden by subclasses to add the type specific contents to the + * bubble. + * @param {Element} bubbleContainer The container element of the bubble to + * which the contents should be added. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.createBubbleContents = + goog.abstractMethod; + + +/** + * Register the handler for the target's CLICK event. + * @param {Element} target The event source element. + * @param {Function} handler The event handler. + * @protected + * @deprecated Use goog.editor.plugins.AbstractBubblePlugin. + * registerActionHandler to register click and enter events. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.registerClickHandler = + function(target, handler) { + this.registerActionHandler(target, handler); +}; + + +/** + * Register the handler for the target's CLICK and ENTER key events. + * @param {Element} target The event source element. + * @param {Function} handler The event handler. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.registerActionHandler = + function(target, handler) { + this.eventRegister.listenWithWrapper(target, goog.events.actionEventWrapper, + handler); +}; + + +/** + * Closes the bubble. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.closeBubble = function() { + if (this.panelId_) { + this.getSharedBubble_().removePanel(this.panelId_); + this.handlePanelClosed_(); + } +}; + + +/** + * Called after the bubble is shown. The default implementation does nothing. + * Override it to provide your own one. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.onShow = goog.nullFunction; + + +/** + * Handles when the bubble panel is closed. Invoked when the entire bubble is + * hidden and also directly when the panel is closed manually. + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.handlePanelClosed_ = + function() { + this.targetElement_ = null; + this.panelId_ = null; + this.eventRegister.removeAll(); +}; + + +/** + * In case the keyboard navigation is enabled, this will focus to the first link + * element in the bubble when TAB is clicked. The user could still go through + * the rest of tabbable UI elements using shift + TAB. + * @override + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.handleKeyDown = function(e) { + if (this.keyboardNavigationEnabled_ && + this.isVisible() && + e.keyCode == goog.events.KeyCodes.TAB && !e.shiftKey) { + var bubbleEl = this.getSharedBubble_().getContentElement(); + var linkEl = goog.dom.getElementByClass( + goog.editor.plugins.AbstractBubblePlugin.LINK_CLASSNAME_, bubbleEl); + if (linkEl) { + linkEl.focus(); + e.preventDefault(); + return true; + } + } + return false; +}; + + +/** + * Handles a key event on the bubble. This ensures that the focus loops through + * the link elements found in the bubble and then the focus is got by the field + * element. + * @param {goog.events.BrowserEvent} e The event. + * @private + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.onBubbleKey_ = function(e) { + if (this.isVisible() && + e.keyCode == goog.events.KeyCodes.TAB) { + var bubbleEl = this.getSharedBubble_().getContentElement(); + var links = goog.dom.getElementsByClass( + goog.editor.plugins.AbstractBubblePlugin.LINK_CLASSNAME_, bubbleEl); + var tabbingOutOfBubble = e.shiftKey ? + links[0] == e.target : + links.length && links[links.length - 1] == e.target; + if (tabbingOutOfBubble) { + this.getFieldObject().focus(); + e.preventDefault(); + } + } +}; + + +/** + * @return {boolean} Whether the bubble is visible. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.isVisible = function() { + return !!this.panelId_; +}; + + +/** + * Reposition the property bubble. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.reposition = function() { + var bubble = this.getSharedBubble_(); + if (bubble) { + bubble.reposition(); + } +}; + + +/** + * Helper method that creates option links (such as edit, test, remove) + * @param {string} id String id for the span id. + * @return {Element} The option link element. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.createLinkOption = function( + id) { + // Dash plus link are together in a span so we can hide/show them easily + return this.dom_.createDom(goog.dom.TagName.SPAN, + { + id: id, + className: + goog.editor.plugins.AbstractBubblePlugin.OPTION_LINK_CLASSNAME_ + }, + this.dom_.createTextNode( + goog.editor.plugins.AbstractBubblePlugin.DASH_NBSP_STRING)); +}; + + +/** + * Helper method that creates a link with text set to linkText and optionaly + * wires up a listener for the CLICK event or the link. + * @param {string} linkId The id of the link. + * @param {string} linkText Text of the link. + * @param {Function=} opt_onClick Optional function to call when the link is + * clicked. + * @param {Element=} opt_container If specified, location to insert link. If no + * container is specified, the old link is removed and replaced. + * @return {Element} The link element. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.createLink = function( + linkId, linkText, opt_onClick, opt_container) { + var link = this.createLinkHelper(linkId, linkText, false, opt_container); + if (opt_onClick) { + this.registerActionHandler(link, opt_onClick); + } + return link; +}; + + +/** + * Helper method to create a link to insert into the bubble. + * @param {string} linkId The id of the link. + * @param {string} linkText Text of the link. + * @param {boolean} isAnchor Set to true to create an actual anchor tag + * instead of a span. Actual links are right clickable (e.g. to open in + * a new window) and also update window status on hover. + * @param {Element=} opt_container If specified, location to insert link. If no + * container is specified, the old link is removed and replaced. + * @return {Element} The link element. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.createLinkHelper = function( + linkId, linkText, isAnchor, opt_container) { + var link = this.dom_.createDom( + isAnchor ? goog.dom.TagName.A : goog.dom.TagName.SPAN, + {className: goog.editor.plugins.AbstractBubblePlugin.LINK_CLASSNAME_}, + linkText); + if (this.keyboardNavigationEnabled_) { + link.setAttribute('tabindex', 0); + } + link.setAttribute('role', 'link'); + this.setupLink(link, linkId, opt_container); + goog.editor.style.makeUnselectable(link, this.eventRegister); + return link; +}; + + +/** + * Inserts a link in the given container if it is specified or removes + * the old link with this id and replaces it with the new link + * @param {Element} link Html element to insert. + * @param {string} linkId Id of the link. + * @param {Element=} opt_container If specified, location to insert link. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.setupLink = function( + link, linkId, opt_container) { + if (opt_container) { + opt_container.appendChild(link); + } else { + var oldLink = this.dom_.getElement(linkId); + if (oldLink) { + goog.dom.replaceNode(link, oldLink); + } + } + + link.id = linkId; +}; diff --git a/float-no-zero/closure-library/closure/goog/editor/plugins/abstractdialogplugin.js b/float-no-zero/closure-library/closure/goog/editor/plugins/abstractdialogplugin.js new file mode 100644 index 0000000000..954e1e2b3d --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/editor/plugins/abstractdialogplugin.js @@ -0,0 +1,334 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview An abstract superclass for TrogEdit dialog plugins. Each + * Trogedit dialog has its own plugin. + * + * @author nicksantos@google.com (Nick Santos) + * @author marcosalmeida@google.com (Marcos Almeida) + */ + +goog.provide('goog.editor.plugins.AbstractDialogPlugin'); +goog.provide('goog.editor.plugins.AbstractDialogPlugin.EventType'); + +goog.require('goog.dom'); +goog.require('goog.dom.Range'); +goog.require('goog.editor.Field.EventType'); +goog.require('goog.editor.Plugin'); +goog.require('goog.editor.range'); +goog.require('goog.events'); +goog.require('goog.ui.editor.AbstractDialog.EventType'); + + +// *** Public interface ***************************************************** // + + + +/** + * An abstract superclass for a Trogedit plugin that creates exactly one + * dialog. By default dialogs are not reused -- each time execCommand is called, + * a new instance of the dialog object is created (and the old one disposed of). + * To enable reusing of the dialog object, subclasses should call + * setReuseDialog() after calling the superclass constructor. + * @param {string} command The command that this plugin handles. + * @constructor + * @extends {goog.editor.Plugin} + */ +goog.editor.plugins.AbstractDialogPlugin = function(command) { + goog.editor.Plugin.call(this); + this.command_ = command; +}; +goog.inherits(goog.editor.plugins.AbstractDialogPlugin, goog.editor.Plugin); + + +/** @override */ +goog.editor.plugins.AbstractDialogPlugin.prototype.isSupportedCommand = + function(command) { + return command == this.command_; +}; + + +/** + * Handles execCommand. Dialog plugins don't make any changes when they open a + * dialog, just when the dialog closes (because only modal dialogs are + * supported). Hence this method does not dispatch the change events that the + * superclass method does. + * @param {string} command The command to execute. + * @param {...*} var_args Any additional parameters needed to + * execute the command. + * @return {*} The result of the execCommand, if any. + * @override + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.execCommand = function( + command, var_args) { + return this.execCommandInternal.apply(this, arguments); +}; + + +// *** Events *************************************************************** // + + +/** + * Event type constants for events the dialog plugins fire. + * @enum {string} + */ +goog.editor.plugins.AbstractDialogPlugin.EventType = { + // This event is fired when a dialog has been opened. + OPENED: 'dialogOpened', + // This event is fired when a dialog has been closed. + CLOSED: 'dialogClosed' +}; + + +// *** Protected interface ************************************************** // + + +/** + * Creates a new instance of this plugin's dialog. Must be overridden by + * subclasses. + * @param {!goog.dom.DomHelper} dialogDomHelper The dom helper to be used to + * create the dialog. + * @param {*=} opt_arg The dialog specific argument. Concrete subclasses should + * declare a specific type. + * @return {goog.ui.editor.AbstractDialog} The newly created dialog. + * @protected + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.createDialog = + goog.abstractMethod; + + +/** + * Returns the current dialog that was created and opened by this plugin. + * @return {goog.ui.editor.AbstractDialog} The current dialog that was created + * and opened by this plugin. + * @protected + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.getDialog = function() { + return this.dialog_; +}; + + +/** + * Sets whether this plugin should reuse the same instance of the dialog each + * time execCommand is called or create a new one. This is intended for use by + * subclasses only, hence protected. + * @param {boolean} reuse Whether to reuse the dialog. + * @protected + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.setReuseDialog = + function(reuse) { + this.reuseDialog_ = reuse; +}; + + +/** + * Handles execCommand by opening the dialog. Dispatches + * {@link goog.editor.plugins.AbstractDialogPlugin.EventType.OPENED} after the + * dialog is shown. + * @param {string} command The command to execute. + * @param {*=} opt_arg The dialog specific argument. Should be the same as + * {@link createDialog}. + * @return {*} Always returns true, indicating the dialog was shown. + * @protected + * @override + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.execCommandInternal = + function(command, opt_arg) { + // If this plugin should not reuse dialog instances, first dispose of the + // previous dialog. + if (!this.reuseDialog_) { + this.disposeDialog_(); + } + // If there is no dialog yet (or we aren't reusing the previous one), create + // one. + if (!this.dialog_) { + this.dialog_ = this.createDialog( + // TODO(user): Add Field.getAppDomHelper. (Note dom helper will + // need to be updated if setAppWindow is called by clients.) + goog.dom.getDomHelper(this.getFieldObject().getAppWindow()), + opt_arg); + } + + // Since we're opening a dialog, we need to clear the selection because the + // focus will be going to the dialog, and if we leave an selection in the + // editor while another selection is active in the dialog as the user is + // typing, some browsers will screw up the original selection. But first we + // save it so we can restore it when the dialog closes. + // getRange may return null if there is no selection in the field. + var tempRange = this.getFieldObject().getRange(); + // saveUsingDom() did not work as well as saveUsingNormalizedCarets(), + // not sure why. + this.savedRange_ = tempRange && goog.editor.range.saveUsingNormalizedCarets( + tempRange); + goog.dom.Range.clearSelection( + this.getFieldObject().getEditableDomHelper().getWindow()); + + // Listen for the dialog closing so we can clean up. + goog.events.listenOnce(this.dialog_, + goog.ui.editor.AbstractDialog.EventType.AFTER_HIDE, + this.handleAfterHide, + false, + this); + + this.getFieldObject().setModalMode(true); + this.dialog_.show(); + this.dispatchEvent(goog.editor.plugins.AbstractDialogPlugin.EventType.OPENED); + + // Since the selection has left the document, dispatch a selection + // change event. + this.getFieldObject().dispatchSelectionChangeEvent(); + + return true; +}; + + +/** + * Cleans up after the dialog has closed, including restoring the selection to + * what it was before the dialog was opened. If a subclass modifies the editable + * field's content such that the original selection is no longer valid (usually + * the case when the user clicks OK, and sometimes also on Cancel), it is that + * subclass' responsibility to place the selection in the desired place during + * the OK or Cancel (or other) handler. In that case, this method will leave the + * selection in place. + * @param {goog.events.Event} e The AFTER_HIDE event object. + * @protected + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.handleAfterHide = function( + e) { + this.getFieldObject().setModalMode(false); + this.restoreOriginalSelection(); + + if (!this.reuseDialog_) { + this.disposeDialog_(); + } + + this.dispatchEvent(goog.editor.plugins.AbstractDialogPlugin.EventType.CLOSED); + + // Since the selection has returned to the document, dispatch a selection + // change event. + this.getFieldObject().dispatchSelectionChangeEvent(); + + // When the dialog closes due to pressing enter or escape, that happens on the + // keydown event. But the browser will still fire a keyup event after that, + // which is caught by the editable field and causes it to try to fire a + // selection change event. To avoid that, we "debounce" the selection change + // event, meaning the editable field will not fire that event if the keyup + // that caused it immediately after this dialog was hidden ("immediately" + // means a small number of milliseconds defined by the editable field). + this.getFieldObject().debounceEvent( + goog.editor.Field.EventType.SELECTIONCHANGE); +}; + + +/** + * Restores the selection in the editable field to what it was before the dialog + * was opened. This is not guaranteed to work if the contents of the field + * have changed. + * @protected + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.restoreOriginalSelection = + function() { + this.getFieldObject().restoreSavedRange(this.savedRange_); + this.savedRange_ = null; +}; + + +/** + * Cleans up the structure used to save the original selection before the dialog + * was opened. Should be used by subclasses that don't restore the original + * selection via restoreOriginalSelection. + * @protected + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.disposeOriginalSelection = + function() { + if (this.savedRange_) { + this.savedRange_.dispose(); + this.savedRange_ = null; + } +}; + + +/** @override */ +goog.editor.plugins.AbstractDialogPlugin.prototype.disposeInternal = + function() { + this.disposeDialog_(); + goog.base(this, 'disposeInternal'); +}; + + +// *** Private implementation *********************************************** // + + +/** + * The command that this plugin handles. + * @type {string} + * @private + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.command_; + + +/** + * The current dialog that was created and opened by this plugin. + * @type {goog.ui.editor.AbstractDialog} + * @private + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.dialog_; + + +/** + * Whether this plugin should reuse the same instance of the dialog each time + * execCommand is called or create a new one. + * @type {boolean} + * @private + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.reuseDialog_ = false; + + +/** + * Mutex to prevent recursive calls to disposeDialog_. + * @type {boolean} + * @private + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.isDisposingDialog_ = false; + + +/** + * SavedRange representing the selection before the dialog was opened. + * @type {goog.dom.SavedRange} + * @private + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.savedRange_; + + +/** + * Disposes of the dialog if needed. It is this abstract class' responsibility + * to dispose of the dialog. The "if needed" refers to the fact this method + * might be called twice (nested calls, not sequential) in the dispose flow, so + * if the dialog was already disposed once it should not be disposed again. + * @private + */ +goog.editor.plugins.AbstractDialogPlugin.prototype.disposeDialog_ = function() { + // Wrap disposing the dialog in a mutex. Otherwise disposing it would cause it + // to get hidden (if it is still open) and fire AFTER_HIDE, which in + // turn would cause the dialog to be disposed again (closure only flags an + // object as disposed after the dispose call chain completes, so it doesn't + // prevent recursive dispose calls). + if (this.dialog_ && !this.isDisposingDialog_) { + this.isDisposingDialog_ = true; + this.dialog_.dispose(); + this.dialog_ = null; + this.isDisposingDialog_ = false; + } +}; diff --git a/float-no-zero/closure-library/closure/goog/editor/plugins/abstracttabhandler.js b/float-no-zero/closure-library/closure/goog/editor/plugins/abstracttabhandler.js new file mode 100644 index 0000000000..e5668199d7 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/editor/plugins/abstracttabhandler.js @@ -0,0 +1,78 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Abstract Editor plugin class to handle tab keys. Has one + * abstract method which should be overriden to handle a tab key press. + * + * @author robbyw@google.com (Robby Walker) + * @author ajp@google.com (Andy Perelson) + */ + +goog.provide('goog.editor.plugins.AbstractTabHandler'); + +goog.require('goog.editor.Plugin'); +goog.require('goog.events.KeyCodes'); + + + +/** + * Plugin to handle tab keys. Specific tab behavior defined by subclasses. + * + * @constructor + * @extends {goog.editor.Plugin} + */ +goog.editor.plugins.AbstractTabHandler = function() { + goog.editor.Plugin.call(this); +}; +goog.inherits(goog.editor.plugins.AbstractTabHandler, goog.editor.Plugin); + + +/** @override */ +goog.editor.plugins.AbstractTabHandler.prototype.getTrogClassId = + goog.abstractMethod; + + +/** @override */ +goog.editor.plugins.AbstractTabHandler.prototype.handleKeyboardShortcut = + function(e, key, isModifierPressed) { + // If a dialog doesn't have selectable field, Moz grabs the event and + // performs actions in editor window. This solves that problem and allows + // the event to be passed on to proper handlers. + if (goog.userAgent.GECKO && this.getFieldObject().inModalMode()) { + return false; + } + + // Don't handle Ctrl+Tab since the user is most likely trying to switch + // browser tabs. See bug 1305086. + // FF3 on Mac sends Ctrl-Tab to trogedit and we end up inserting a tab, but + // then it also switches the tabs. See bug 1511681. Note that we don't use + // isModifierPressed here since isModifierPressed is true only if metaKey + // is true on Mac. + if (e.keyCode == goog.events.KeyCodes.TAB && !e.metaKey && !e.ctrlKey) { + return this.handleTabKey(e); + } + + return false; +}; + + +/** + * Handle a tab key press. + * @param {goog.events.Event} e The key event. + * @return {boolean} Whether this event was handled by this plugin. + * @protected + */ +goog.editor.plugins.AbstractTabHandler.prototype.handleTabKey = + goog.abstractMethod; diff --git a/float-no-zero/closure-library/closure/goog/editor/plugins/basictextformatter.js b/float-no-zero/closure-library/closure/goog/editor/plugins/basictextformatter.js new file mode 100644 index 0000000000..d765d51427 --- /dev/null +++ b/float-no-zero/closure-library/closure/goog/editor/plugins/basictextformatter.js @@ -0,0 +1,1750 @@ +// Copyright 2006 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Functions to style text. + * + */ + +goog.provide('goog.editor.plugins.BasicTextFormatter'); +goog.provide('goog.editor.plugins.BasicTextFormatter.COMMAND'); + +goog.require('goog.array'); +goog.require('goog.dom'); +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.Range'); +goog.require('goog.dom.TagName'); +goog.require('goog.editor.BrowserFeature'); +goog.require('goog.editor.Command'); +goog.require('goog.editor.Link'); +goog.require('goog.editor.Plugin'); +goog.require('goog.editor.node'); +goog.require('goog.editor.range'); +goog.require('goog.editor.style'); +goog.require('goog.iter'); +goog.require('goog.iter.StopIteration'); +goog.require('goog.log'); +goog.require('goog.object'); +goog.require('goog.string'); +goog.require('goog.string.Unicode'); +goog.require('goog.style'); +goog.require('goog.ui.editor.messages'); +goog.require('goog.userAgent'); + + + +/** + * Functions to style text (e.g. underline, make bold, etc.) + * @constructor + * @extends {goog.editor.Plugin} + */ +goog.editor.plugins.BasicTextFormatter = function() { + goog.editor.Plugin.call(this); +}; +goog.inherits(goog.editor.plugins.BasicTextFormatter, goog.editor.Plugin); + + +/** @override */ +goog.editor.plugins.BasicTextFormatter.prototype.getTrogClassId = function() { + return 'BTF'; +}; + + +/** + * Logging object. + * @type {goog.log.Logger} + * @protected + * @override + */ +goog.editor.plugins.BasicTextFormatter.prototype.logger = + goog.log.getLogger('goog.editor.plugins.BasicTextFormatter'); + + +/** + * Commands implemented by this plugin. + * @enum {string} + */ +goog.editor.plugins.BasicTextFormatter.COMMAND = { + LINK: '+link', + FORMAT_BLOCK: '+formatBlock', + INDENT: '+indent', + OUTDENT: '+outdent', + STRIKE_THROUGH: '+strikeThrough', + HORIZONTAL_RULE: '+insertHorizontalRule', + SUBSCRIPT: '+subscript', + SUPERSCRIPT: '+superscript', + UNDERLINE: '+underline', + BOLD: '+bold', + ITALIC: '+italic', + FONT_SIZE: '+fontSize', + FONT_FACE: '+fontName', + FONT_COLOR: '+foreColor', + BACKGROUND_COLOR: '+backColor', + ORDERED_LIST: '+insertOrderedList', + UNORDERED_LIST: '+insertUnorderedList', + JUSTIFY_CENTER: '+justifyCenter', + JUSTIFY_FULL: '+justifyFull', + JUSTIFY_RIGHT: '+justifyRight', + JUSTIFY_LEFT: '+justifyLeft' +}; + + +/** + * Inverse map of execCommand strings to + * {@link goog.editor.plugins.BasicTextFormatter.COMMAND} constants. Used to + * determine whether a string corresponds to a command this plugin + * handles in O(1) time. + * @type {Object} + * @private + */ +goog.editor.plugins.BasicTextFormatter.SUPPORTED_COMMANDS_ = + goog.object.transpose(goog.editor.plugins.BasicTextFormatter.COMMAND); + + +/** + * Whether the string corresponds to a command this plugin handles. + * @param {string} command Command string to check. + * @return {boolean} Whether the string corresponds to a command + * this plugin handles. + * @override + */ +goog.editor.plugins.BasicTextFormatter.prototype.isSupportedCommand = function( + command) { + // TODO(user): restore this to simple check once table editing + // is moved out into its own plugin + return command in goog.editor.plugins.BasicTextFormatter.SUPPORTED_COMMANDS_; +}; + + +/** + * @return {goog.dom.AbstractRange} The closure range object that wraps the + * current user selection. + * @private + */ +goog.editor.plugins.BasicTextFormatter.prototype.getRange_ = function() { + return this.getFieldObject().getRange(); +}; + + +/** + * @return {Document} The document object associated with the currently active + * field. + * @private + */ +goog.editor.plugins.BasicTextFormatter.prototype.getDocument_ = function() { + return this.getFieldDomHelper().getDocument(); +}; + + +/** + * Execute a user-initiated command. + * @param {string} command Command to execute. + * @param {...*} var_args For color commands, this + * should be the hex color (with the #). For FORMAT_BLOCK, this should be + * the goog.editor.plugins.BasicTextFormatter.BLOCK_COMMAND. + * It will be unused for other commands. + * @return {Object|undefined} The result of the command. + * @override + */ +goog.editor.plugins.BasicTextFormatter.prototype.execCommandInternal = function( + command, var_args) { + var preserveDir, styleWithCss, needsFormatBlockDiv, hasDummySelection; + var result; + var opt_arg = arguments[1]; + + switch (command) { + case goog.editor.plugins.BasicTextFormatter.COMMAND.BACKGROUND_COLOR: + // Don't bother for no color selected, color picker is resetting itself. + if (!goog.isNull(opt_arg)) { + if (goog.editor.BrowserFeature.EATS_EMPTY_BACKGROUND_COLOR) { + this.applyBgColorManually_(opt_arg); + } else if (goog.userAgent.OPERA) { + // backColor will color the block level element instead of + // the selected span of text in Opera. + this.execCommandHelper_('hiliteColor', opt_arg); + } else { + this.execCommandHelper_(command, opt_arg); + } + } + break; + + case goog.editor.plugins.BasicTextFormatter.COMMAND.LINK: + result = this.toggleLink_(opt_arg); + break; + + case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_CENTER: + case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_FULL: + case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_RIGHT: + case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_LEFT: + this.justify_(command); + break; + + default: + if (goog.userAgent.IE && + command == + goog.editor.plugins.BasicTextFormatter.COMMAND.FORMAT_BLOCK && + opt_arg) { + // IE requires that the argument be in the form of an opening + // tag, like

, including angle brackets. WebKit will accept + // the arguemnt with or without brackets, and Firefox pre-3 supports + // only a fixed subset of tags with brackets, and prefers without. + // So we only add them IE only. + opt_arg = '<' + opt_arg + '>'; + } + + if (command == + goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_COLOR && + goog.isNull(opt_arg)) { + // If we don't have a color, then FONT_COLOR is a no-op. + break; + } + + switch (command) { + case goog.editor.plugins.BasicTextFormatter.COMMAND.INDENT: + case goog.editor.plugins.BasicTextFormatter.COMMAND.OUTDENT: + if (goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS) { + if (goog.userAgent.GECKO) { + styleWithCss = true; + } + if (goog.userAgent.OPERA) { + if (command == + goog.editor.plugins.BasicTextFormatter.COMMAND.OUTDENT) { + // styleWithCSS actually sets negative margins on
+ // to outdent them. If the command is enabled without + // styleWithCSS flipped on, then the caret is in a blockquote so + // styleWithCSS must not be used. But if the command is not + // enabled, styleWithCSS should be used so that elements such as + // a
with a margin-left style can still be outdented. + // (Opera bug: CORE-21118) + styleWithCss = + !this.getDocument_().queryCommandEnabled('outdent'); + } else { + // Always use styleWithCSS for indenting. Otherwise, Opera will + // make separate
s around *each* indented line, + // which adds big default
margins between each + // indented line. + styleWithCss = true; + } + } + } + // Fall through. + + case goog.editor.plugins.BasicTextFormatter.COMMAND.ORDERED_LIST: + case goog.editor.plugins.BasicTextFormatter.COMMAND.UNORDERED_LIST: + if (goog.editor.BrowserFeature.LEAVES_P_WHEN_REMOVING_LISTS && + this.queryCommandStateInternal_(this.getDocument_(), + command)) { + // IE leaves behind P tags when unapplying lists. + // If we're not in P-mode, then we want divs + // So, unlistify, then convert the Ps into divs. + needsFormatBlockDiv = this.getFieldObject().queryCommandValue( + goog.editor.Command.DEFAULT_TAG) != goog.dom.TagName.P; + } else if (!goog.editor.BrowserFeature.CAN_LISTIFY_BR) { + // IE doesn't convert BRed line breaks into separate list items. + // So convert the BRs to divs, then do the listify. + this.convertBreaksToDivs_(); + } + + // This fix only works in Gecko. + if (goog.userAgent.GECKO && + goog.editor.BrowserFeature.FORGETS_FORMATTING_WHEN_LISTIFYING && + !this.queryCommandValue(command)) { + hasDummySelection |= this.beforeInsertListGecko_(); + } + // Fall through to preserveDir block + + case goog.editor.plugins.BasicTextFormatter.COMMAND.FORMAT_BLOCK: + // Both FF & IE may lose directionality info. Save/restore it. + // TODO(user): Does Safari also need this? + // TODO (gmark, jparent): This isn't ideal because it uses a string + // literal, so if the plugin name changes, it would break. We need a + // better solution. See also other places in code that use + // this.getPluginByClassId('Bidi'). + preserveDir = !!this.getFieldObject().getPluginByClassId('Bidi'); + break; + + case goog.editor.plugins.BasicTextFormatter.COMMAND.SUBSCRIPT: + case goog.editor.plugins.BasicTextFormatter.COMMAND.SUPERSCRIPT: + if (goog.editor.BrowserFeature.NESTS_SUBSCRIPT_SUPERSCRIPT) { + // This browser nests subscript and superscript when both are + // applied, instead of canceling out the first when applying the + // second. + this.applySubscriptSuperscriptWorkarounds_(command); + } + break; + + case goog.editor.plugins.BasicTextFormatter.COMMAND.UNDERLINE: + case goog.editor.plugins.BasicTextFormatter.COMMAND.BOLD: + case goog.editor.plugins.BasicTextFormatter.COMMAND.ITALIC: + // If we are applying the formatting, then we want to have + // styleWithCSS false so that we generate html tags (like ). If we + // are unformatting something, we want to have styleWithCSS true so + // that we can unformat both html tags and inline styling. + // TODO(user): What about WebKit and Opera? + styleWithCss = goog.userAgent.GECKO && + goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS && + this.queryCommandValue(command); + break; + + case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_COLOR: + case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_FACE: + // It is very expensive in FF (order of magnitude difference) to use + // font tags instead of styled spans. Whenever possible, + // force FF to use spans. + // Font size is very expensive too, but FF always uses font tags, + // regardless of which styleWithCSS value you use. + styleWithCss = goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS && + goog.userAgent.GECKO; + } + + /** + * Cases where we just use the default execCommand (in addition + * to the above fall-throughs) + * goog.editor.plugins.BasicTextFormatter.COMMAND.STRIKE_THROUGH: + * goog.editor.plugins.BasicTextFormatter.COMMAND.HORIZONTAL_RULE: + * goog.editor.plugins.BasicTextFormatter.COMMAND.SUBSCRIPT: + * goog.editor.plugins.BasicTextFormatter.COMMAND.SUPERSCRIPT: + * goog.editor.plugins.BasicTextFormatter.COMMAND.UNDERLINE: + * goog.editor.plugins.BasicTextFormatter.COMMAND.BOLD: + * goog.editor.plugins.BasicTextFormatter.COMMAND.ITALIC: + * goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_SIZE: + * goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_FACE: + */ + this.execCommandHelper_(command, opt_arg, preserveDir, !!styleWithCss); + + if (hasDummySelection) { + this.getDocument_().execCommand('Delete', false, true); + } + + if (needsFormatBlockDiv) { + this.getDocument_().execCommand('FormatBlock', false, '
'); + } + } + // FF loses focus, so we have to set the focus back to the document or the + // user can't type after selecting from menu. In IE, focus is set correctly + // and resetting it here messes it up. + if (goog.userAgent.GECKO && !this.getFieldObject().inModalMode()) { + this.focusField_(); + } + return result; +}; + + +/** + * Focuses on the field. + * @private + */ +goog.editor.plugins.BasicTextFormatter.prototype.focusField_ = function() { + this.getFieldDomHelper().getWindow().focus(); +}; + + +/** + * Gets the command value. + * @param {string} command The command value to get. + * @return {string|boolean|null} The current value of the command in the given + * selection. NOTE: This return type list is not documented in MSDN or MDC + * and has been constructed from experience. Please update it + * if necessary. + * @override + */ +goog.editor.plugins.BasicTextFormatter.prototype.queryCommandValue = function( + command) { + var styleWithCss; + switch (command) { + case goog.editor.plugins.BasicTextFormatter.COMMAND.LINK: + return this.isNodeInState_(goog.dom.TagName.A); + + case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_CENTER: + case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_FULL: + case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_RIGHT: + case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_LEFT: + return this.isJustification_(command); + + case goog.editor.plugins.BasicTextFormatter.COMMAND.FORMAT_BLOCK: + // TODO(nicksantos): See if we can use queryCommandValue here. + return goog.editor.plugins.BasicTextFormatter.getSelectionBlockState_( + this.getFieldObject().getRange()); + + case goog.editor.plugins.BasicTextFormatter.COMMAND.INDENT: + case goog.editor.plugins.BasicTextFormatter.COMMAND.OUTDENT: + case goog.editor.plugins.BasicTextFormatter.COMMAND.HORIZONTAL_RULE: + // TODO: See if there are reasonable results to return for + // these commands. + return false; + + case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_SIZE: + case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_FACE: + case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_COLOR: + case goog.editor.plugins.BasicTextFormatter.COMMAND.BACKGROUND_COLOR: + // We use queryCommandValue here since we don't just want to know if a + // color/fontface/fontsize is applied, we want to know WHICH one it is. + return this.queryCommandValueInternal_(this.getDocument_(), command, + goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS && + goog.userAgent.GECKO); + + case goog.editor.plugins.BasicTextFormatter.COMMAND.UNDERLINE: + case goog.editor.plugins.BasicTextFormatter.COMMAND.BOLD: + case goog.editor.plugins.BasicTextFormatter.COMMAND.ITALIC: + styleWithCss = goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS && + goog.userAgent.GECKO; + + default: + /** + * goog.editor.plugins.BasicTextFormatter.COMMAND.STRIKE_THROUGH + * goog.editor.plugins.BasicTextFormatter.COMMAND.SUBSCRIPT + * goog.editor.plugins.BasicTextFormatter.COMMAND.SUPERSCRIPT + * goog.editor.plugins.BasicTextFormatter.COMMAND.UNDERLINE + * goog.editor.plugins.BasicTextFormatter.COMMAND.BOLD + * goog.editor.plugins.BasicTextFormatter.COMMAND.ITALIC + * goog.editor.plugins.BasicTextFormatter.COMMAND.ORDERED_LIST + * goog.editor.plugins.BasicTextFormatter.COMMAND.UNORDERED_LIST + */ + // This only works for commands that use the default execCommand + return this.queryCommandStateInternal_(this.getDocument_(), command, + styleWithCss); + } +}; + + +/** + * @override + */ +goog.editor.plugins.BasicTextFormatter.prototype.prepareContentsHtml = + function(html) { + // If the browser collapses empty nodes and the field has only a script + // tag in it, then it will collapse this node. Which will mean the user + // can't click into it to edit it. + if (goog.editor.BrowserFeature.COLLAPSES_EMPTY_NODES && + html.match(/^\s* + + + + + diff --git a/float-no-zero/examples/accessible.js b/float-no-zero/examples/accessible.js new file mode 100644 index 0000000000..0b035bdd41 --- /dev/null +++ b/float-no-zero/examples/accessible.js @@ -0,0 +1,13 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/animation-require.js b/float-no-zero/examples/animation-require.js new file mode 100644 index 0000000000..5e7ecc288b --- /dev/null +++ b/float-no-zero/examples/animation-require.js @@ -0,0 +1,7 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.animation'); +goog.require('ol.easing'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/animation.html b/float-no-zero/examples/animation.html new file mode 100644 index 0000000000..3eae57f489 --- /dev/null +++ b/float-no-zero/examples/animation.html @@ -0,0 +1,64 @@ + + + + + + + + + + + Animation example + + + + + +
+ +
+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+ +
+

Animation example

+

Demonstrates animated pan, zoom, and rotation.

+
+

See the animation.js source to see how this is done.

+
+
animation
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/animation.js b/float-no-zero/examples/animation.js new file mode 100644 index 0000000000..f92a2e2765 --- /dev/null +++ b/float-no-zero/examples/animation.js @@ -0,0 +1,133 @@ +var london = ol.proj.transform([-0.12755, 51.507222], 'EPSG:4326', 'EPSG:3857'); +var moscow = ol.proj.transform([37.6178, 55.7517], 'EPSG:4326', 'EPSG:3857'); +var istanbul = ol.proj.transform([28.9744, 41.0128], 'EPSG:4326', 'EPSG:3857'); +var rome = ol.proj.transform([12.5, 41.9], 'EPSG:4326', 'EPSG:3857'); +var bern = ol.proj.transform([7.4458, 46.95], 'EPSG:4326', 'EPSG:3857'); +var madrid = ol.proj.transform([-3.683333, 40.4], 'EPSG:4326', 'EPSG:3857'); + +var view = new ol.View2D({ + // the view's initial state + center: istanbul, + zoom: 6 +}); + +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + preload: 4, + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: view +}); + +var rotateLeft = document.getElementById('rotate-left'); +rotateLeft.addEventListener('click', function() { + var rotateLeft = ol.animation.rotate({ + duration: 2000, + rotation: -4 * Math.PI + }); + map.beforeRender(rotateLeft); +}, false); +var rotateRight = document.getElementById('rotate-right'); +rotateRight.addEventListener('click', function() { + var rotateRight = ol.animation.rotate({ + duration: 2000, + rotation: 4 * Math.PI + }); + map.beforeRender(rotateRight); +}, false); + + +var panToLondon = document.getElementById('pan-to-london'); +panToLondon.addEventListener('click', function() { + var pan = ol.animation.pan({ + duration: 2000, + source: /** @type {ol.Coordinate} */ (view.getCenter()) + }); + map.beforeRender(pan); + view.setCenter(london); +}, false); + +var elasticToMoscow = document.getElementById('elastic-to-moscow'); +elasticToMoscow.addEventListener('click', function() { + var pan = ol.animation.pan({ + duration: 2000, + easing: ol.easing.elastic, + source: /** @type {ol.Coordinate} */ (view.getCenter()) + }); + map.beforeRender(pan); + view.setCenter(moscow); +}, false); + +var bounceToIstanbul = document.getElementById('bounce-to-istanbul'); +bounceToIstanbul.addEventListener('click', function() { + var pan = ol.animation.pan({ + duration: 2000, + easing: ol.easing.bounce, + source: /** @type {ol.Coordinate} */ (view.getCenter()) + }); + map.beforeRender(pan); + view.setCenter(istanbul); +}, false); + +var spinToRome = document.getElementById('spin-to-rome'); +spinToRome.addEventListener('click', function() { + var duration = 2000; + var start = +new Date(); + var pan = ol.animation.pan({ + duration: duration, + source: /** @type {ol.Coordinate} */ (view.getCenter()), + start: start + }); + var rotate = ol.animation.rotate({ + duration: duration, + rotation: 2 * Math.PI, + start: start + }); + map.beforeRender(pan, rotate); + view.setCenter(rome); +}, false); + +var flyToBern = document.getElementById('fly-to-bern'); +flyToBern.addEventListener('click', function() { + var duration = 2000; + var start = +new Date(); + var pan = ol.animation.pan({ + duration: duration, + source: /** @type {ol.Coordinate} */ (view.getCenter()), + start: start + }); + var bounce = ol.animation.bounce({ + duration: duration, + resolution: 4 * view.getResolution(), + start: start + }); + map.beforeRender(pan, bounce); + view.setCenter(bern); +}, false); + +var spiralToMadrid = document.getElementById('spiral-to-madrid'); +spiralToMadrid.addEventListener('click', function() { + var duration = 2000; + var start = +new Date(); + var pan = ol.animation.pan({ + duration: duration, + source: /** @type {ol.Coordinate} */ (view.getCenter()), + start: start + }); + var bounce = ol.animation.bounce({ + duration: duration, + resolution: 2 * view.getResolution(), + start: start + }); + var rotate = ol.animation.rotate({ + duration: duration, + rotation: -4 * Math.PI, + start: start + }); + map.beforeRender(pan, bounce, rotate); + view.setCenter(madrid); +}, false); diff --git a/float-no-zero/examples/bind-input-require.js b/float-no-zero/examples/bind-input-require.js new file mode 100644 index 0000000000..bdb701005e --- /dev/null +++ b/float-no-zero/examples/bind-input-require.js @@ -0,0 +1,6 @@ +goog.require('ol.BrowserFeature'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.dom.Input'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/bind-input.html b/float-no-zero/examples/bind-input.html new file mode 100644 index 0000000000..051351c34e --- /dev/null +++ b/float-no-zero/examples/bind-input.html @@ -0,0 +1,89 @@ + + + + + + + + + + + Bind HTML input example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Bind HTML input example

+

Demonstrates two-way binding of HTML input elements to OpenLayers objects.

+
+

See the bind-input.js source to see how this is done.

+ +
+
input, bind, openstreetmap
+
+ +
+
+
+ Layer + + + + + + + + + + + +
+
+
+ +
+
+
+ View + + + + +
+
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/bind-input.js b/float-no-zero/examples/bind-input.js new file mode 100644 index 0000000000..9d9efd559a --- /dev/null +++ b/float-no-zero/examples/bind-input.js @@ -0,0 +1,57 @@ +if (!ol.BrowserFeature.HAS_WEBGL) { + var inputs = document.getElementsByClassName('webgl'); + for (var i = 0, len = inputs.length; i < len; i++) { + inputs[i].disabled = true; + } + var info = document.getElementById('no-webgl'); + /** + * display warning message + */ + info.style.display = ''; +} + +var layer = new ol.layer.Tile({ + source: new ol.source.OSM() +}); + +var view = new ol.View2D({ + center: [0, 0], + zoom: 2 +}); + +var map = new ol.Map({ + layers: [layer], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: view +}); + +var visible = new ol.dom.Input(document.getElementById('visible')); +visible.bindTo('checked', layer, 'visible'); + +var opacity = new ol.dom.Input(document.getElementById('opacity')); +opacity.bindTo('value', layer, 'opacity') + .transform(parseFloat, String); + +var hue = new ol.dom.Input(document.getElementById('hue')); +hue.bindTo('value', layer, 'hue') + .transform(parseFloat, String); + +var saturation = new ol.dom.Input(document.getElementById('saturation')); +saturation.bindTo('value', layer, 'saturation') + .transform(parseFloat, String); + +var contrast = new ol.dom.Input(document.getElementById('contrast')); +contrast.bindTo('value', layer, 'contrast') + .transform(parseFloat, String); + +var brightness = new ol.dom.Input(document.getElementById('brightness')); +brightness.bindTo('value', layer, 'brightness') + .transform(parseFloat, String); + + +var rotation = new ol.dom.Input(document.getElementById('rotation')); +rotation.bindTo('value', view, 'rotation').transform(parseFloat, String); + +var resolution = new ol.dom.Input(document.getElementById('resolution')); +resolution.bindTo('value', view, 'resolution').transform(parseFloat, String); diff --git a/float-no-zero/examples/bing-maps-require.js b/float-no-zero/examples/bing-maps-require.js new file mode 100644 index 0000000000..a99a9ac828 --- /dev/null +++ b/float-no-zero/examples/bing-maps-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.BingMaps'); diff --git a/float-no-zero/examples/bing-maps.html b/float-no-zero/examples/bing-maps.html new file mode 100644 index 0000000000..33c8f9cbef --- /dev/null +++ b/float-no-zero/examples/bing-maps.html @@ -0,0 +1,59 @@ + + + + + + + + + + + Bing Maps example + + + + + +
+ +
+
+
+ + +
+
+ +
+ +
+

Bing Maps example

+

Example of a Bing Maps layer.

+
+

See the bing-maps.js source to see how this is done.

+
+
bing, bing-maps
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/bing-maps.js b/float-no-zero/examples/bing-maps.js new file mode 100644 index 0000000000..ce4e94cf1b --- /dev/null +++ b/float-no-zero/examples/bing-maps.js @@ -0,0 +1,37 @@ +var styles = [ + 'Road', + 'Aerial', + 'AerialWithLabels', + 'collinsBart', + 'ordnanceSurvey' +]; +var layers = []; +var i, ii; +for (i = 0, ii = styles.length; i < ii; ++i) { + layers.push(new ol.layer.Tile({ + visible: false, + preload: Infinity, + source: new ol.source.BingMaps({ + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3', + imagerySet: styles[i] + }) + })); +} +var map = new ol.Map({ + layers: layers, + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [-6655.5402445057125, 6709968.258934638], + zoom: 13 + }) +}); + +$('#layer-select').change(function() { + var style = $(this).find(':selected').val(); + var i, ii; + for (i = 0, ii = layers.length; i < ii; ++i) { + layers[i].setVisible(styles[i] == style); + } +}); +$('#layer-select').trigger('change'); diff --git a/float-no-zero/examples/brightness-contrast-require.js b/float-no-zero/examples/brightness-contrast-require.js new file mode 100644 index 0000000000..30f445845f --- /dev/null +++ b/float-no-zero/examples/brightness-contrast-require.js @@ -0,0 +1,5 @@ +goog.require('ol.BrowserFeature'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.MapQuest'); diff --git a/float-no-zero/examples/brightness-contrast.html b/float-no-zero/examples/brightness-contrast.html new file mode 100644 index 0000000000..98d62567ec --- /dev/null +++ b/float-no-zero/examples/brightness-contrast.html @@ -0,0 +1,74 @@ + + + + + + + + + + + Brightness/contrast example + + + + + + +
+ +
+
+
+ + + +
+ + + +
+
+ + + +
+
+
+ +
+ +
+

Brightness/contrast example

+

Example of brightness/contrast control on the client (WebGL only).

+
+

See the brightness-contrast.js source to see how this is done.

+
+
brightness, contrast, webgl
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/brightness-contrast.js b/float-no-zero/examples/brightness-contrast.js new file mode 100644 index 0000000000..39e266f4b0 --- /dev/null +++ b/float-no-zero/examples/brightness-contrast.js @@ -0,0 +1,68 @@ +function setResetBrightnessButtonHTML() { + resetBrightness.innerHTML = 'Brightness (' + + layer.getBrightness().toFixed(3) + ')'; +} + +function setResetContrastButtonHTML() { + resetContrast.innerHTML = 'Contrast (' + layer.getContrast().toFixed(3) + ')'; +} + +if (!ol.BrowserFeature.HAS_WEBGL) { + var info = document.getElementById('no-webgl'); + /** + * display error message + */ + info.style.display = ''; +} else { + var layer = new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }); + + var map = new ol.Map({ + layers: [layer], + renderer: 'webgl', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) + }); + + var increaseBrightness = document.getElementById('increase-brightness'); + var resetBrightness = document.getElementById('reset-brightness'); + var decreaseBrightness = document.getElementById('decrease-brightness'); + + setResetBrightnessButtonHTML(); + + increaseBrightness.addEventListener('click', function() { + layer.setBrightness(Math.min(layer.getBrightness() + 0.125, 1)); + setResetBrightnessButtonHTML(); + }, false); + resetBrightness.addEventListener('click', function() { + layer.setBrightness(0); + setResetBrightnessButtonHTML(); + }, false); + decreaseBrightness.addEventListener('click', function() { + layer.setBrightness(Math.max(layer.getBrightness() - 0.125, -1)); + setResetBrightnessButtonHTML(); + }, false); + + var increaseContrast = document.getElementById('increase-contrast'); + var resetContrast = document.getElementById('reset-contrast'); + var decreaseContrast = document.getElementById('decrease-contrast'); + + setResetContrastButtonHTML(); + + increaseContrast.addEventListener('click', function() { + layer.setContrast(layer.getContrast() + 0.125); + setResetContrastButtonHTML(); + }, false); + resetContrast.addEventListener('click', function() { + layer.setContrast(1); + setResetContrastButtonHTML(); + }, false); + decreaseContrast.addEventListener('click', function() { + layer.setContrast(Math.max(layer.getContrast() - 0.125, 0)); + setResetContrastButtonHTML(); + }, false); +} diff --git a/float-no-zero/examples/canvas-tiles-require.js b/float-no-zero/examples/canvas-tiles-require.js new file mode 100644 index 0000000000..a99e4453ee --- /dev/null +++ b/float-no-zero/examples/canvas-tiles-require.js @@ -0,0 +1,7 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.OSM'); +goog.require('ol.source.TileDebug'); +goog.require('ol.tilegrid.XYZ'); diff --git a/float-no-zero/examples/canvas-tiles.html b/float-no-zero/examples/canvas-tiles.html new file mode 100644 index 0000000000..c28386bc3d --- /dev/null +++ b/float-no-zero/examples/canvas-tiles.html @@ -0,0 +1,52 @@ + + + + + + + + + + + Canvas tiles example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Canvas tiles example

+

Renders tiles with coordinates for debugging.

+
+

The black grid tiles are generated on the client with an HTML5 canvas. Note that the tile coordinates are ol3 normalized tile coordinates (origin bottom left), not OSM tile coordinates (origin top left).

+

See the canvas-tiles.js source to see how this is done.

+
+
layers, openstreetmap, canvas
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/canvas-tiles.js b/float-no-zero/examples/canvas-tiles.js new file mode 100644 index 0000000000..294c3ffcea --- /dev/null +++ b/float-no-zero/examples/canvas-tiles.js @@ -0,0 +1,22 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }), + new ol.layer.Tile({ + source: new ol.source.TileDebug({ + projection: 'EPSG:3857', + tileGrid: new ol.tilegrid.XYZ({ + maxZoom: 22 + }) + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform( + [-0.1275, 51.507222], 'EPSG:4326', 'EPSG:3857'), + zoom: 10 + }) +}); diff --git a/float-no-zero/examples/custom-controls-require.js b/float-no-zero/examples/custom-controls-require.js new file mode 100644 index 0000000000..1f1e18cad2 --- /dev/null +++ b/float-no-zero/examples/custom-controls-require.js @@ -0,0 +1,7 @@ +goog.require('ol'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.control'); +goog.require('ol.control.Control'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/custom-controls.html b/float-no-zero/examples/custom-controls.html new file mode 100644 index 0000000000..45ddf6e63f --- /dev/null +++ b/float-no-zero/examples/custom-controls.html @@ -0,0 +1,91 @@ + + + + + + + + + + + + ol3 custom controls example + + + + + +
+ +
+
+
+
+
+ +
+
+

Custom controls

+

This example shows how to create custom controls.

+
+

+ This example creates a "rotate to north" button. + See the custom-controls.js + source to see how this is done. +

+
+
+ custom, control +
+
+
+
+ + + + + + + + diff --git a/float-no-zero/examples/custom-controls.js b/float-no-zero/examples/custom-controls.js new file mode 100644 index 0000000000..1582f0c288 --- /dev/null +++ b/float-no-zero/examples/custom-controls.js @@ -0,0 +1,71 @@ +/** + * Define a namespace for the application. + */ +window.app = {}; +var app = window.app; + + +// +// Define rotate to north control. +// + + + +/** + * @constructor + * @extends {ol.control.Control} + * @param {Object=} opt_options Control options. + */ +app.RotateNorthControl = function(opt_options) { + + var options = opt_options || {}; + + var anchor = document.createElement('a'); + anchor.href = '#rotate-north'; + anchor.innerHTML = 'N'; + + var this_ = this; + var handleRotateNorth = function(e) { + // prevent #rotate-north anchor from getting appended to the url + e.preventDefault(); + this_.getMap().getView().getView2D().setRotation(0); + }; + + anchor.addEventListener('click', handleRotateNorth, false); + anchor.addEventListener('touchstart', handleRotateNorth, false); + + var element = document.createElement('div'); + element.className = 'rotate-north ol-unselectable'; + element.appendChild(anchor); + + ol.control.Control.call(this, { + element: element, + target: options.target + }); + +}; +ol.inherits(app.RotateNorthControl, ol.control.Control); + + +// +// Create map, giving it a rotate to north control. +// + + +var map = new ol.Map({ + controls: ol.control.defaults().extend([ + new app.RotateNorthControl() + ]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2, + rotation: 1 + }) +}); diff --git a/float-no-zero/examples/d3-require.js b/float-no-zero/examples/d3-require.js new file mode 100644 index 0000000000..1616fbb6eb --- /dev/null +++ b/float-no-zero/examples/d3-require.js @@ -0,0 +1,9 @@ +goog.require('ol'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.extent'); +goog.require('ol.layer.Image'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.ImageCanvas'); +goog.require('ol.source.Stamen'); diff --git a/float-no-zero/examples/d3.html b/float-no-zero/examples/d3.html new file mode 100644 index 0000000000..bad878f6ff --- /dev/null +++ b/float-no-zero/examples/d3.html @@ -0,0 +1,54 @@ + + + + + + + + + + + d3 integration example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

d3 integration example

+

Example of using ol3 and d3 together.

+
+

The example loads TopoJSON geometries and uses d3 (d3.geo.path) to render these geometries to a canvas element that is then used as the image of an ol3 image layer.

+

See the d3.js source to see how this is done.

+
+
d3
+
+ +
+ +
+ + + + + + + + + diff --git a/float-no-zero/examples/d3.js b/float-no-zero/examples/d3.js new file mode 100644 index 0000000000..cc87db2fbb --- /dev/null +++ b/float-no-zero/examples/d3.js @@ -0,0 +1,84 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.Stamen({ + layer: 'watercolor' + }) + }) + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform([-97, 38], 'EPSG:4326', 'EPSG:3857'), + zoom: 4 + }) +}); + + +/** + * Load the topojson data and create an ol.layer.Image for that data. + */ +d3.json('data/topojson/us.json', function(error, us) { + var features = topojson.feature(us, us.objects.counties); + + /** + * This function uses d3 to render the topojson features to a canvas. + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.Size} size Size. + * @param {ol.proj.Projection} projection Projection. + * @return {HTMLCanvasElement} + */ + var canvasFunction = function(extent, resolution, pixelRatio, + size, projection) { + var canvasWidth = size[0]; + var canvasHeight = size[1]; + + var canvas = d3.select(document.createElement('canvas')); + canvas.attr('width', canvasWidth).attr('height', canvasHeight); + + var context = canvas.node().getContext('2d'); + + var d3Projection = d3.geo.mercator().scale(1).translate([0, 0]); + var d3Path = d3.geo.path().projection(d3Projection); + + var pixelBounds = d3Path.bounds(features); + var pixelBoundsWidth = pixelBounds[1][0] - pixelBounds[0][0]; + var pixelBoundsHeight = pixelBounds[1][1] - pixelBounds[0][1]; + + var geoBounds = d3.geo.bounds(features); + var geoBoundsLeftBottom = ol.proj.transform( + geoBounds[0], 'EPSG:4326', projection); + var geoBoundsRightTop = ol.proj.transform( + geoBounds[1], 'EPSG:4326', projection); + var geoBoundsWidth = geoBoundsRightTop[0] - geoBoundsLeftBottom[0]; + if (geoBoundsWidth < 0) { + geoBoundsWidth += ol.extent.getWidth(projection.getExtent()); + } + var geoBoundsHeight = geoBoundsRightTop[1] - geoBoundsLeftBottom[1]; + + var widthResolution = geoBoundsWidth / pixelBoundsWidth; + var heightResolution = geoBoundsHeight / pixelBoundsHeight; + var r = Math.max(widthResolution, heightResolution); + var scale = r / (resolution / pixelRatio); + + var center = ol.proj.transform(ol.extent.getCenter(extent), + projection, 'EPSG:4326'); + d3Projection.scale(scale).center(center) + .translate([canvasWidth / 2, canvasHeight / 2]); + d3Path = d3Path.projection(d3Projection).context(context); + d3Path(features); + context.stroke(); + + return canvas[0][0]; + }; + + var layer = new ol.layer.Image({ + source: new ol.source.ImageCanvas({ + canvasFunction: canvasFunction, + projection: 'EPSG:3857' + }) + }); + map.addLayer(layer); +}); diff --git a/float-no-zero/examples/data/IGNWMTSCapabilities.xml b/float-no-zero/examples/data/IGNWMTSCapabilities.xml new file mode 100644 index 0000000000..03def672fe --- /dev/null +++ b/float-no-zero/examples/data/IGNWMTSCapabilities.xml @@ -0,0 +1 @@ +Service de visualisation WMTSCe service permet la visualisation de couches de données raster IGN au travers d'un flux WMTSUnités administrativesLimites administrativesSurfaces bâtiesRéseaux de transportRoutesRéseaux ferroviairesAérodromesRéseau hydrographiqueParcelles cadastralesBâtimentsServices d'utilité publique et services publicsRéseaux de transportHydrographiePhotographies aériennesCartesCartes historiquesAltitudeOGC WMTS1.0.0licencesConditions Générales d'Utilisation disponibles ici : http://professionnels.ign.fr/sites/default/files/CGU_API_Pro.pdfIGNGéoportail SAVcustodian73 avenue de ParisSaint Mandé94160Francegeop_services@geoportail.frKVPKVPLimites administrativesReprésentation des limites administratives (régions, départements, cantons, communes)Unités administratives-63.3725 -21.475655.9259 72.679ADMINISTRATIVEUNITS.BOUNDARIESimage/pngPM10336576336671116801152672134412136823041344268713273646082688537614547292005376107351510943183841062421472162190436768212644294317438247352042528858711887648147024850711717436122926427245854848491141081689168288160336AéroportsLocalisation des aéroports, aérodromes et héliports, des pistes, bâtiments et équipements dédiés.Réseaux de transports-68.709 -21.475655.9259 76.5354AEROPORT_SYMBO_PYR-PNG_WLD_WM_2013-03-28image/pngPM103365763366711168011526721344121368230413432679132736460026885359145479919253761072015109601837510632214391621920367442127242879174384073488425448575918876961469768510417151968391647716723288839144721689168288168336Sylvoécorégions d'alluvions récentesAffichage des cinq sylvoécorégions d’alluvions récentes correspondant aux cinq vallées des bassins des grands fleuves français et de leurs affluents, à enjeux importants.Occupation des terres-5.15047 41.32529.57054 51.0991ALLUVIONS-RECENTS_SYMBO_PYR-PNG_FXX_WM_20120807image/pngPM1033438249754511677765994108212136215301989215713273330613986431414547561237973862915109581223815955172591621916244683191834510615233139739476270879951241409167191248272Zones franches urbainesZones franches créées au sein de quartiers de plus de 8 500 habitants particulièrement défavorisés, en tenant compte des éléments de nature à faciliter l’implantation d’entreprises ou le développement d’activités économiques.Zones de gestion-63.3725 -21.475655.9259 51.3121AREAMANAGEMENT.ZFUimage/pngPM103345743316751167711496631343121362229813262686132724459626535373145457919353071073915109221838610615214791621844367722123142951619352044739714189879143821709167287165341Zones urbaines sensiblesZones urbaines caractérisées par la présence de grands ensembles ou de quartiers d’habitat dégradé et par un déséquilibre accentué entre l’habitat et l’emploi.Zones de gestion-63.3725 -21.475655.9259 51.3121AREAMANAGEMENT.ZUSimage/pngPM103345743316751167711496631343121362229813262686132724459626535373145457919353071073915109221838610615214791621844367722123142951619352044739714189879143821709167287165341BâtimentsAffichage des constructions couvrant le territoire français.Bâtiments-63.1614 -21.399855.8465 72.679BATI_SYMBO_PYR-PNG_WLD_20120704image/pngPM10338574332671116811148664134212136622971329268413273745942658536814547591895317107361510950183781063421473162190036757212694293817438177351542539858761887634147030850791717446122827437245654848501121091699101225218336BâtimentsAffichage des constructions couvrant le territoire français.Bâtiments-63.3725 -21.475655.9259 72.679BATI_SYMBO_PYR-PNG_WLD_20130131image/pngPM10338574332671116811148664134212136622971329268413273745942658536814547591895317107361510943183841062421472162190436768212644294317438247352042528858711887648147024850711717276122827437245654848501121091699101225218336BâtimentsAffichage des constructions couvrant le territoire français.Bâtiments-63.3725 -21.475655.9259 72.679BATI_SYMBO_PYR-PNG_WLD_20130204image/pngPM10338574332671116811148664134212136823041328268713273646002656536714547191925312107361510943183841062421472162190436768212644294317438247352042528858711887648147024850711717276122827437245654848501121091699101225218336AltitudeLa couche altitude se compose d'un MNT (Modèle Numérique de Terrain) affiché en teintes hypsométriques et issu de la BD ALTI®.Altitude-178.206 -22.5952167.432 50.9308BDALTI_PYR-JPEG_WLD_WM_WMTS_20120617image/jpegPM103425785988116841156101976121368231220395313273646244079061454729248811581262136061742720123885144124791712892494Carte du reliefLa couche altitude se compose d'un MNT (Modèle Numérique de Terrain) affiché en teintes hypsométriques et issu de la BD ALTI®.Cartes-178.206 -22.5952167.432 50.9308BDALTI_PYR-JPEG_WLD_WM_WMTS_20120618image/jpegPM103425785988116841156101976121368231220395313273646244079061454729248811581262136061742720123885144124791712892494Carte forestière v1 (1987-2004)La cartographie forestière est une base de données cartographique des formations végétales forestières et naturelles. Elle couvre l'ensemble du territoire de France métropolitaine. Elle est réalisée par interprétation de photographies aériennes infrarouges et affinée par des contrôles sur le terrain (le seuil minimal de surface cartographiée est de 2,25 ha).Inventaire forestier-5.34206 41.20659.82939 51.2203BDFORETV1_PYR-PNG_FXX_WM_1image/pngPM1034138349653911683766993107912136715321987215913273430653974431914546961307948863915109381226015897172781621876245213179534557621233133742476267885951241349170191248269Carte forestière (v2 : 2006-)Localisation de 32 types de formations végétales sur le territoire. Carte en cours de réalisation depuis 2006.Occupation des terres-5.34206 41.20659.82939 51.2203BDFORETV2_PYR-PNG_FXX_WM_20120625image/pngPM1034138349653911683766993107912136715321987215913273430653974431914546961307948863915109381226015897172781621876245213179534557621233133742476267885951241349170191248269Parcelles cadastralesLimites des parcelles cadastrales issues de plans scannés et de plans numériques.Parcelles cadastrales-63.1607 14.38119.66314 51.091BDPARCEL_PYR-PNG_WLD_WM_20120712image/pngPM103424703325391168494166410781213691882132921561327393765265843131454787530531786271510956150601063417255162191230121212693451017438256024342539690201887651120487850791380411917530224097517015927608220350605481951340318552164621292033742584167885117831349171235166269Parcelles cadastralesLimites des parcelles cadastrales issues de plans scannés et de plans numériques.Parcelles cadastrales-63.1607 14.38119.66314 51.091BDPARCEL_PYR-PNG_WLD_WM_20120716image/pngPM103424703325391168494166410781213691882132921561327393765265843131454787530531786271510956150601063417255162191230121212693451017438256024342539690201887651120487850791380411917530224097517015927608220350605481951340318552164621292033742584167885117831349171235166269Parcelles cadastralesLimites des parcelles cadastrales issues de plans scannés et de plans numériques.Parcelles cadastrales-63.1607 -21.392255.8464 51.091BDPARCEL_PYR-PNG_WLD_WM_20120723image/pngPM10342574332670116841148664134112136922971329268313273945942658536614547891885317107331510956183771063421467162191236755212694293417438257351142539858681887651147023850791717361917530229404617015934347320350605588093340318686946621352041742714183885143831679171287166335Parcelles cadastralesLimites des parcelles cadastrales issues de plans scannés et de plans numériques.Parcelles cadastrales-63.1607 -21.392255.8464 51.091BDPARCEL_PYR-PNG_WLD_WM_20121220image/pngPM10342574332670116841148664134112136922971329268313273945942658536614547891885317107331510956183771063421467162191236755212694293417438257351142539858681887651147023850791717361917530229404617015934347320350605588093340318686946621352041742714183885143831679171287166335Guyane Françoise (1780)Carte de Guyane française établie par M. Bonne, Ingénieur-Hydrographe de la Marine. Cette carte figure dans l'"atlas de toutes les parties connues du globe terrestre", ouvrage rédigé par l'abbé Guillaume-Thomas RAYNAL et publié à Genève en 1780.Cartes historiques-55.9127 -0.49941-50.0835 7.88966BONNE_PYR-JPG_GUF_WM_20121214image/jpegPM000001010010489513352369212113342247855515161111630322223761644446812212888929244256176184Guyane française (1780)Carte de Guyane française établie par M. Bonne, Ingénieur-Hydrographe de la Marine. Cette carte figure dans l'"atlas de toutes les parties connues du globe terrestre", ouvrage rédigé par l'abbé Guillaume-Thomas RAYNAL et publié à Genève en 1780.Cartes historiques-55.9127 -0.49941-50.0835 7.88966BONNE_PYR-JPG_GUF_WM_20130124image/jpegPM000001010010489513352369212113342247855515161111630322223761644446812212888929244256176184BâtimentsAffichage des constructions couvrant le territoire français.Bâtiments-63.3725 -21.475655.9259 72.679BUILDINGS.BUILDINGSimage/pngPM10338574332671116811148664134212136823041328268713273646002656536714547191925312107361510943183841062421472162190436768212644294317438247352042528858711887648147024850711717276122827437245654848501121091699101225218336Parcelles cadastralesLimites des parcelles cadastrales issues de plans scannés et de plans numériques.Parcelles cadastrales-63.1607 -21.392255.8464 51.091CADASTRALPARCELS.PARCELSimage/pngPM10342574332670116841148664134112136922971329268313273945942658536614547891885317107331510956183771063421467162191236755212694293417438257351142539858681887651147023850791717361917530229404617015934347320350605588093340318686946621352041742714183885143831679171287166335Carte France Raster ®Carte à grande échelle spécialement adaptée à l'affichage de données urbaines.Cartes-63.7576 -21.565556.0405 51.0019CARTE-FRANCERASTER_PYR-JPEG_WLD_WM_20120706image/jpegPM1034157433067111683114966013421213662299134326851327324598264453711454659197531110742151093118394106322146716218893677121264429341743804647794252969075188760914705185058171737621233034742476168885951231369170191247272Carte Mondiale pour la mini-vueCarte Mondiale pour la mini-vueMini-Vue-179.5 -75179.5 75CARTE-MINIVUE_PYR-JPG_WLD_WM_20120706image/jpegPM10102203043060841130165226032685206472110501288422100256Cartes IGNCartes IGNCartes-180 -60180 80CARTE_PYR-JPG_WLD_WM_20120509image/jpegPM1034257433267011684114866413411213682297132926831327364595265853661454729190531610733151094418381106322146716218893676321264429342020430508411101653220326745064742714183885143831679171287166335Cartes IGNCartes IGNCartes-180 -90180 90CARTE_PYR-JPG_WLD_WM_20121005image/jpegPM000011010210341777599011681155410198112136331082039631327265294407926145452101078115851151094420215163317021621889404313264689517438177351542539858761887634147030850791717522020430508411101653220326745064732970123880194124791703882495Cartes IGNCartes IGNCartes-180 -90180 90CARTE_PYR-JPG_WLD_WM_20121121image/jpegPM000011010210341777599011681155410198112136331082039631327266177407328145452123558115851151094420215163317021621889404313264689517438177351542539858761887634147030850791717522020430508411101653220326745064732970123880194124791703882495Cartes IGNCartes IGNCartes-180 -90180 90CARTE_PYR-JPG_WLD_WM_20121122image/jpegPM000011010210341777599011681154410198112136330882039631327266177407926145452123558115851151094420215163317021621889404313264689517438177351542539858761887634147030850791717522020430508411101653220326745064732970123880194124791703882495Cartes IGNCartes IGNCartes-180 -67.7557180 80CARTE_PYR-JPG_WLD_WM_20130115image/jpegPM000011010210341777599011681154410198112136330882039631327266177407926145452123558115851151094420215163317021621889404313264689517436967355242447859031887392147104849121718072020430508411101653220326745064732970123880194124791703882495Cartes IGNCartes IGNCartes-180 -67.7557180 80CARTE_PYR-JPG_WLD_WM_20130205image/jpegPM000011010210341777599011681154410198112136330882039631327266177407926145452123558115851151094420215163317021621889404313264689517436967355242447859031887392147104849121718072020430508411101653220326745064732970123880194124791703882495Cartes IGNCartes IGNCartes-180 -67.7557180 80CARTE_PYR-JPG_WLD_WM_20130227image/jpegPM000011010210341777599011681154410198112136330882039631327266177407926145452123558115851151094420215163317021621889404313264689517436967355242447859031887392147104849121718072020430508411101653220326745064732970123880194124791703882495Cartes IGNCartes IGNCartes-180 -67.7557180 85.0511CARTE_PYR-JPG_WLD_WM_WM_20130603image/jpegPM000011010210341777599011681154410198112136330882039631327266177407926145452123558115851151094420215163317021621889404313264689517436967355242447859031887392147104849121718072030430608401201650240326048064732970123880194124791703882495Carte de CassiniCarte de Cassini en couleur (feuilles gravées et aquarellées), issue de l’exemplaire dit de « Marie-Antoinette » du XVIIIe siècle.Cartes historiques-6.00063 42.0199.2809 51.2455CASSINI_PYR-JPG_WLD_WM_2012-06-01image/jpegPM103413804945381168376098910761213661520197921531327333040395943071454676080791886141510934121611583717228621233033742476167885951231349170190247269Carte de Cassini (XVIIIe siècle)Carte de Cassini en couleur (feuilles gravées et aquarellées), issue de l’exemplaire dit de « Marie-Antoinette » du XVIIIe siècle.Cartes historiques-6.00063 42.0199.2809 51.2455CASSINI_PYR-JPG_WLD_WM_20130125image/jpegPM103413804945381168376098910761213661520197921531327333040395943071454676080791886141510934121611583717228621233033742476167885951231349170190247269IrisZones Iris définies par l'INSEE pour les besoins des recensements sur l'ensemble des communes de plus de 10 000 habitants et la plupart des communes de 5 000 à 10 000 habitants.Divers-5.15047 41.32529.57054 51.0991CONTOURS_IRIS_WM_20120830image/pngPM10334382497545116777659941082121362153019892157132733306139784314145475612379578629615233139739476270879951241409167191248272Lignes électriquesAffichage des lignes électriques.Energie-63.3725 -21.475655.9259 51.3121ELEC_SYMBO_PYR-PNG_WLD_WM_20130313image/pngPM103423824975371168576599410741213681536199221601327364600268853681454799192537610736151095918384106392147216219203675221280429271743840735044255985855188769614700885136171695615233139739476270879951241409167191248272MNT BDAlti V1BDAlti V1 au pas de 25mMNT-64 -23168 52ELEVATION.ELEVATIONGRIDCOVERAGEimage/x-bil;bits=32WGS84G000011011310216642659197911432128513193959202273155154310103056202061613404112372780822478541601644949108321329989Trait de côte HistolittFormalisation de la limite entre le domaine terrestre et le domaine marin.AltitudeLittoral-63.2529 -21.5155.9472 51.1388ELEVATION.LEVEL0image/pngPM1033457433267611677114966413441213622298132826881327334597265653681454749194531310737151094918381106342146616219073676321269429331743814735264253885866188764414703685076171732619352044739714189879143831719167287166342Carte du reliefLa couche altitude se compose d'un MNT (Modèle Numérique de Terrain) affiché en teintes hypsométriques et issu de la BD ALTI®.Cartes-178.206 -22.5952167.432 50.9308ELEVATION.SLOPESimage/jpegPM103425785988116841156101976121368231220395313273646244079061454729248811581262136061742720123885144124791712892494Litto3D ®Modèle numérique continu terre-mer sur la frange littorale.Littoral5.75296 42.97866.25761 43.2733ELEVATION.SLOPES.HIGHRESimage/pngPM10375376528529117507521056105912150015052113211913300130104226423814600360218453847615120061204316907169531624012240863381533907623233333746476666893941321329187188264264AltitudeImages en teintes hypsométriques de la BDAlti à 25mgéographie55.2057 -21.392355.8466 -20.8627ELEVATION.SLOPES_WLD_2.0_3857_JPGimage/jpegPM1057257466867011114511481337134112229022972675268313458145945351536763535414177171838381431431671679286287334335Carte Europe politiqueCarte Europe politiqueCartes-41.4623 23.810174.8102 68.9745EUROPEPOLITIQUE_PYR-JPEG_WLD_WM_WMTS_3Dimage/jpegPM000001000110200442387731201123133543661156131222612272445725554891850110961829100221193365Carte Europe politiqueCarte Europe politiqueCartes-41.4623 23.810174.8102 68.9745EUROPEPOLITIQUE_PYR-JPEG_WLD_WM_WMTS_3D_V1image/jpegPM000001000110200442387731201123133543661156131222612272445725554891850110961829100221193365Réseau ferroviaireCarte du réseau ferroviaireVoies ferrées-26.711 20.991854.9094 72.679FERRE_SYMBO_PYR-PNG_WLD_WM_20120713image/pngPM103383824975411168176599410781213661530198921571327333061397843141454756123795786296122827437245654848501121091699101225218336Réseau ferroviaireCarte du réseau ferroviaireVoies ferrées-26.711 20.991854.9094 72.679FERRE_SYMBO_PYR-PNG_WLD_WM_20120809image/pngPM10338382497541116817659941078121366153019892157132733306139784314145475612379578629151095812174159711725116219162434831950344946122827437245654848501121091699101225218336Réseau ferroviaireCarte du réseau ferroviaireVoies ferrées-26.711 20.991854.9094 72.679FERRE_SYMBO_PYR-PNG_WLD_WM_20120814image/pngPM103383824975411168176599410781213661530198921571327333061397843141454756123795786291510958121741597117251162191624348319503449417438334869763900689881887666973941278011379616122827437245654848501121091699101225218336Réseau ferroviaireCarte du réseau ferroviaireVoies ferrées-26.711 20.991854.9094 72.679FERRE_SYMBO_PYR-PNG_WLD_WM_20130312image/pngPM103383824975411168176599410781213661530198921571327363048399243121454716088798486241510943121751596817248162190424352319363449617438244870463872689911887664973921277441379686122827437245654848501121091699101225218336ForêtReprésentation simplifiée des forêts.Forêt-63.3725 -21.475655.9259 51.3121FORESTCOVER_SYMBO_PYR-PNG_WLD_WM_20130523image/pngPM10336576328671116801152664134412136823041328268713273646002656536714547191925312107361510952183831063221471162191236760212644293517438247352042528858711887648147024850711717439168288160336Paris haute résolutionPrises de vues aériennes de Paris à haute résolution.Photographies2.19509 48.80952.42968 48.9124GEN_ORTHOPARIS_FXX_PYR-PNG_WM_20120705image/pngPM1214081409207220751328162819414541511456325639829183021511265112791658316605162253022559331673321017450614511866335664201890123902371326701328411918024618047426534026568220360492360948530681531364Carte topographique - environs de Paris (1906)Carte topographique de Paris et de ses environs éditée en 1906.Cartes historiques1.62941 48.47263 49.1548GEOGRAPHICALGRIDSYSTEMS.1900TYPEMAPSimage/jpegPM1035035351652011701707103310411214031415206620821328072831413241641456155663826583281511231113261653116657France administrativeCarte de la France administrative (régions, départements, arrondissements, cantons, communes)Cartes-63.2459 -21.637156.052 51.5596GEOGRAPHICALGRIDSYSTEMS.ADMINISTRATIVEUNITSimage/jpegPM10339575332671621352041742714183884143831679169287166335Guyane française (1780)Carte de Guyane française établie par M. Bonne, Ingénieur-Hydrographe de la Marine. Cette carte figure dans l'"atlas de toutes les parties connues du globe terrestre", ouvrage rédigé par l'abbé Guillaume-Thomas RAYNAL et publié à Genève en 1780.Cartes historiques-55.9127 -0.49941-50.0835 7.88966GEOGRAPHICALGRIDSYSTEMS.BONNEimage/jpegPM000001010010489513352369212113342247855515161111630322223761644446812212888929244256176184Carte de Cassini (XVIIIe siècle)Carte de Cassini en couleur (feuilles gravées et aquarellées), issue de l’exemplaire dit de « Marie-Antoinette » du XVIIIe siècle.Cartes historiques-6.00063 42.0199.2809 51.2455GEOGRAPHICALGRIDSYSTEMS.CASSINIimage/jpegPM103413804945381168376098910761213661520197921531327333040395943071454676080791886141510934121611583717228621233033742476167885951231349170190247269Carte littorale (SHOM/IGN)Assemblage des cartes marines du Service hydrographique et océanographique de la marine (SHOM) et des cartes terrestres de l’IGN.CartesLittoral-61.9629 -21.534856.1621 51.454GEOGRAPHICALGRIDSYSTEMS.COASTALMAPSimage/pngPM103405743356711168111496711343121362229913432687132726459826865374145452919653721074815109041839210744214961621808367842148842992621352041742714183885143831679170287167335Cartographie AJACCIO 1976Zone d'Ajaccio - Cartographie 1976EDUGEO8.507 41.66549.13252 42.0381GEOGRAPHICALGRIDSYSTEMS.EDUGEO.AJACCIO1976image/pngPM10379381536537117597621072107512151915252144215113303930514289430314607961028579860715121591220417158172151624318244093431634430623233333747476767894951341349189190268268Cartographie BELFORT MONTBELLIARD 1973Zone d'Ajaccio - BELFORT MONTBELLIARD 1973EDUGEO6.50535 47.36767.25597 47.8735GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BELFORT-MONTBELLIARD1973image/pngPM10356358530532117127171061106512142514342122213013285128694244426114570357388488852215114071147616976170441622815229523395234088622223333744446666889891321339178179265266Cartographie BERRY SUD 1952Zone de BERRY SUD - Cartographie 1952EDUGEO1.00082 46.1681.75144 46.6854GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BERRY-SUD1952image/pngPM10361363514516117227271029103312144514542059206713289129084118413514578358178237827115115671163516475165431623134232713295033086622223232745456464890901281299180181257258Cartographie BETHUNE 1956Zone de BETHUNE 1956EDUGEO2.37696 50.173.37778 50.6484GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BETHUNE1956image/pngPM10344346518521116886931037104312137713862075208613275527724150417214551055448300834515110201108816600166911622041221773320033382621213232743436465886861291309172173259260Cartographie BIARRITZ 1979Zone de Biarritz 1979EDUGEO-1.87654 43.1433-1.25103 43.6885GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BIARRITZ1979image/pngPM10373375506508117477511013101612149415022026203313298830054053406714597760118106813515119541202216213162701623908240453242632540623233131746466363893931261279186187253254Cartographie BOURG St-MAURICE 1974Zone de BOURG St-MAURICE - Cartographie 1974EDUGEO6.50535 45.38277.13087 45.7331GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BOURG-ST-MAURICE1974image/pngPM10365366530532117307331061106412146114672122212913292329344244425814584658698488851615116921173816976170331623384234763395234066622223333745456666891911321339182183265266Cartographie CAEN 1969Zone de CAEN - Cartographie 1969EDUGEO-0.875721 49.035-0.125103 49.4434GEOGRAPHICALGRIDSYSTEMS.EDUGEO.CAEN1969image/pngPM10349351509511116997031019102312139814062038204613279728124076409314559556248152818615111911124816304163721622382224963260832745621213131743436363887871271279174175254255Cartographie Cap d'AGDE 1971Zone du Cap d'Agde 1971EDUGEO3.00247 43.14333.62799 43.5073GEOGRAPHICALGRIDSYSTEMS.EDUGEO.CAP-DAGDE1971image/pngPM10374375520522117487511041104412149715022082208913299430054164417814598860118328835715119771202216657167141623954240453331433428623233232746466565893931301309187187260261Cartographie CLERMONT FERRAND 1966Zone de CLERMONT FERRAND 1966EDUGEO2.75227 45.64573.37778 45.9944GEOGRAPHICALGRIDSYSTEMS.EDUGEO.CLERMONT-FERRAND1966image/pngPM10364365519521117287311039104312145714622079208613291429254158417214582958518317834515116581170316634166911623316234073326933382622223232745456465891911291309182182259260Cartographie CREIL SUD PICARDIE 1979Zone de CREIL SUD PICARDIE 1979EDUGEO2.25185 49.0353.12757 49.6058GEOGRAPHICALGRIDSYSTEMS.EDUGEO.CREIL-SUD-PICARDIE1979image/pngPM10349351518520116987031036104112139614062073208313279228124147416714558456248294833415111681124816588166681622337224963317733337621213232743436465887871291309174175259260Cartographie Dijon 1962Zone de Dijon 1962EDUGEO4.75391 46.94225.37943 47.5368GEOGRAPHICALGRIDSYSTEMS.EDUGEO.DIJON1962image/pngPM10357360525527117157201051105412143114412102210913286328834204421814572657668408843615114531153316816168731622906230663363333747622223232744456565889901311319178180262263Cartographie GRENOBLE 1965Zone de Grenoble 1965EDUGEO5.50453 44.94166.13005 45.3827GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GRENOBLE1965image/pngPM10366368527529117337371055105812146714742110211713293429484221423514586958978442847015117381179416885169411623476235893377033883622233233745466566891921311329183184263264Cartographie GRENOBLE 1976Zone de Grenoble 1976EDUGEO5.50453 45.03016.25515 45.4705GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GRENOBLE1976image/pngPM10366368527529117327361055105912146514722110211913293129454221423814586358918442847615117261178316885169531623453235673377033906622233233745466566891921311329183184263264Cartographie GRENOBLE 1991Zone de Grenoble 1991EDUGEO5.50453 44.94166.13005 45.3827GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GRENOBLE1991image/pngPM10366368527529117337371055105812146714742110211713293429484221423514586958978442847015117381179416885169411623476235893377033883622233233745466566891921311329183184263264Cartographie Guadeloupe 1955Zone de Guadeloupe 1955EDUGEO-61.6758 16.1695-61.3005 16.6495GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GUADELOUPE1955image/pngPM104634653363371192793067367512185518611346135013371137232692270114742374465385540215148461489210770108041629693297842154021608628292121757584242811511684849231232168168Cartographie Guyane 1958Zone de Guyane 1958EDUGEO-54.4198 5.12238-53.419 5.99398GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GUYANE1958image/pngPM104944973573601198999471472012197919891428144013395939792857288014791879585715576015158371591711430115211631674318342286123043630312222761624445812312489909247248178180Cartographie LA REUNION 1980Zone de la Réunion 1980EDUGEO55.0453 -21.495455.6708 -20.6783GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LA-REUNION1980image/pngPM10572574668670111144114913371340122288229826742681134577459753485362149154919410697107251518308183882139421451163661636776427884290263535414177171838381431431671679286287334335Cartographie LA ROCHELLE-ROCHEFORT 1959Zone de LA ROCHELLE-ROCHEFORT 1959EDUGEO-1.37613 45.7331-0.750618 46.4273GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LA-ROCHELLE-ROCHEFORT1959image/pngPM10362365508509117257301016101912145014612032203913290029234064407814580058468129815715116011169216258163151623202233843251732631622223131745456363890911271279181182254254Cartographie Limoges 1966Zone de Limoges 1966EDUGEO1.00082 45.64571.50124 45.9944GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LIMOGES1966image/pngPM10364365514516117287311029103212145714622059206513291429254118413014582958518237826015116581170316475165201623316234073295033041622223232745456464891911281299182182257258Cartographie LYON 1947Zone de LYON - Cartographie 1947EDUGEO4.50371 45.47055.37943 46.0813GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LYON1947image/pngPM10363366524527117277321049105412145514652099210913291129314198421814582358638396843615116461172616793168731623293234533358733747622223232745456565890911311319181183262263Cartographie LYON 1980Zone de LYON - Cartographie 1980EDUGEO4.62881 45.47055.12922 45.9944GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LYON1980image/pngPM10364366525526117287321050105312145714652100210613291429314201421214582958638402842515116581172616805168501623316234533361033701622223232745456565891911311319182183262263Cartographie LYON 1985Zone de LYON - Cartographie 1985EDUGEO4.62881 45.55825.12922 45.9944GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LYON1985image/pngPM10364366525526117287321050105312145714642100210613291429284201421214582958578402842515116581171516805168501623316234303361033701622223232745456565891911311319182183262263Cartographie MARNE LA VALLÉE 1966Zone de MARNE LA VALLÉE 1966EDUGEO2.37696 48.70593.12757 49.035GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARNE-LA-VALLEE1966image/pngPM10351352518520117037051037104112140614112075208313281228234150416714562456468300833415112481129316600166681622496225873320033337621223232743446465887881291309175176259260Cartographie MARNE LA VALLÉE 1978Zone de MARNE LA VALLÉE 1978EDUGEO2.37696 48.70592.75227 49.035GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARNE-LA-VALLEE1978image/pngPM10351352518519117037051037103912140614112075207913281228234150415814562456468300831715112481129316600166341622496225873320033269621223232743446464887881291299175176259259Cartographie MARNE LA VALLÉE 1987Zone de MARNE LA VALLÉE 1987EDUGEO2.37696 48.70593.12757 49.035GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARNE-LA-VALLEE1987image/pngPM10351352518520117037051037104112140614112075208313281228234150416714562456468300833415112481129316600166681622496225873320033337621223232743446465887881291309175176259260Cartographie MARSEILLE MARTIGUES 1947Zone de MARSEILLE MARTIGUES 1947EDUGEO4.50371 43.0525.62963 43.6885GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARSEILLE-MARTIGUES1947image/pngPM10373376524528117477521049105612149415042099211213298830084198422414597760178396844815119541203416793168961623908240683358733792623233233746476566893941311329186188262264Cartographie MARSEILLE MARTIGUES 1980Zone de MARSEILLE MARTIGUES 1980EDUGEO5.00412 43.0525.62963 43.5073GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARSEILLE-MARTIGUES1980image/pngPM10374376526528117487521052105612149715042104211213299430084209422414598860178419844815119771203416839168961623954240683367833792623233233746476566893941311329187188263264Cartographie MARSEILLE MARTIGUES 1986Zone de MARSEILLE MARTIGUES 1986EDUGEO4.87902 43.0525.62963 43.6885GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARSEILLE-MARTIGUES1986image/pngPM10373376525528117477521051105612149415042103211213298830084207422414597760178414844815119541203416828168961623908240683365633792623233233746476566893941311329186188262264Cartographie METZ NANCY 1983Zone de METZ NANCY 1983EDUGEO5.75474 48.45766.50535 49.362GEOGRAPHICALGRIDSYSTEMS.EDUGEO.METZ-NANCY1983image/pngPM10350354528530117007081056106112140014162113212213280028324226424414560156648453848815112021132816907169761622405226563381533952621223333743446666887881321329175177264265Cartographie NANTES 1972Zone de NANTES 1972EDUGEO-2.50206 47.0276-1.25103 47.4522GEOGRAPHICALGRIDSYSTEMS.EDUGEO.NANTES1972image/pngPM10358360504508117167201009101612143314402019203313286628804039406714573257608078813515114641152116156162701622929230433231232540622223131744456363889901261279179180252254Cartographie 1964Zone de Paris - Cartographie 1964EDUGEO2.00165 48.78842.50206 49.117GEOGRAPHICALGRIDSYSTEMS.EDUGEO.PARIS1964image/pngPM10351352517519117027051035103812140414102070207613280928204141415214561856418283830515112371128216566166111622474225653313233223621223232743446464887881291299175176258259Cartographie 1979Zone de Paris - Cartographie 1979EDUGEO2.00165 48.70592.62716 49.035GEOGRAPHICALGRIDSYSTEMS.EDUGEO.PARIS1979image/pngPM10351352517519117037051035103812140614112070207713281228234141415514562456468283831115112481129316566166231622496225873313233246621223232743446464887881291299175176258259Cartographie REIMS 1974Zone de REIMS 1974EDUGEO3.75309 49.0354.50371 49.4434GEOGRAPHICALGRIDSYSTEMS.EDUGEO.REIMS1974image/pngPM10349351522524116997031045104912139814062090209913279728124181419814559556248362839615111911124816725167931622382224963345133587621213232743436565887871301319174175261262Cartographie REIMS 1983Zone de REIMS 1983EDUGEO3.75309 49.0354.50371 49.6058GEOGRAPHICALGRIDSYSTEMS.EDUGEO.REIMS1983image/pngPM10349351522524116987031045104912139614062090209913279228124181419814558456248362839615111681124816725167931622337224963345133587621213232743436565887871301319174175261262Cartographie Roissy 1973Zone de Roissy - Cartographie 1973EDUGEO2.25185 48.87072.75227 49.117GEOGRAPHICALGRIDSYSTEMS.EDUGEO.ROISSY1973image/pngPM10351352518519117027041036103912140414082073207913280928174147415814561856358294831715112371127116588166341622474225423317733269621223232743446464887881291299175176259259Cartographie Roissy 1978Zone de Roissy - Cartographie 1978EDUGEO2.25185 48.87072.75227 49.2805GEOGRAPHICALGRIDSYSTEMS.EDUGEO.ROISSY1978image/pngPM10350352518519117007041036103912140114082073207913280328174147415814560756358294831715112141127116588166341622428225423317733269621223232743446464887881291299175176259259Cartographie STRASBOURG 1956Zone de STRASBOURG 1956EDUGEO7.25597 48.20818.13169 48.7884GEOGRAPHICALGRIDSYSTEMS.EDUGEO.STRASBOURG1956image/pngPM10352355532535117057101065107012141014202130214013282028404261428114564156818522856215112821136217044171241622565227243408834248622223333744446666888881331339176177266267Cartographie STRASBOURG 1978Zone de STRASBOURG 1978EDUGEO7.25597 48.12468.00659 48.8707GEOGRAPHICALGRIDSYSTEMS.EDUGEO.STRASBOURG1978image/pngPM10352355532534117047101065106912140814212130213913281728434261427814563556868522855615112711137317044171121622542227473408834225622223333744446666888881331339176177266267Cartographie TOULON HYERES 1976Zone de TOULON HYERES 1976EDUGEO5.62963 42.86896.38025 43.2345GEOGRAPHICALGRIDSYSTEMS.EDUGEO.TOULON-HYERES1976image/pngPM10375376528530117507531056106012150115072112212013300230144224424114600560288448848215120111205616896169641624022241133379233929623233333746476666893941321329187188264265Cartographie TOULOUSE 1948Zone de TOULOUSE 1948EDUGEO1.12593 43.41651.75144 43.7789GEOGRAPHICALGRIDSYSTEMS.EDUGEO.TOULOUSE1948image/pngPM10373374515516117467491030103312149214982060206713298529974121413514597159948243827115119431198816486165431623886239773297233086623233232746466464893931281299186187257258Cartographie Vannes Golf du Morbihan 1960Zone de Vannes Golf du Morbihan - Cartographie 1960EDUGEO-3.37778 47.3676-2.50206 47.8735GEOGRAPHICALGRIDSYSTEMS.EDUGEO.VANNES-GOLF-DU-MORBIHAN1960image/pngPM10356358502504117127171004100912142514342009201913285128694019403914570357388038807815114071147616076161561622815229523215332312622223131744446263889891251269178179251252Cartographie Vannes Golf du Morbihan 1971Zone de Vannes Golf du Morbihan - Cartographie 1971EDUGEO-3.37778 47.3676-2.50206 47.8735GEOGRAPHICALGRIDSYSTEMS.EDUGEO.VANNES-GOLF-DU-MORBIHAN1971image/pngPM10356358502504117127171004100912142514342009201913285128694019403914570357388038807815114071147616076161561622815229523215332312622223131744446263889891251269178179251252Cartographie Versailles 1979Zone de Versailles - Cartographie 1979EDUGEO1.87654 48.54052.50206 49.035GEOGRAPHICALGRIDSYSTEMS.EDUGEO.VERSAILLES1979image/pngPM10351353517519117037071034103812140614142069207613281228294138415214562456588277830515112481131616554166111622496226333310933223621223232743446464887881291299175176258259Carte de l'état-major - environs de Paris (1818 - 1824)Carte des environs de Paris au 1 : 10 000 établie entre 1818 et 1824.Cartes historiques1.82682 48.38472.79738 49.5142GEOGRAPHICALGRIDSYSTEMS.ETATMAJOR10image/jpegPM10349354517519116987081034103912139714172068207913279528344137415914559056698275831915111811133816550166381622363226763310033277621223232743446464887881291299174177258259Carte de l'état-major (1820-1866)Carte française en couleurs du XIXè siècle en couleurs superposable aux cartes et données modernes.Cartes historiques-6.08889 41.184410.961 51.2745GEOGRAPHICALGRIDSYSTEMS.ETATMAJOR40image/jpegPM103423824955401168476599110801213681531198321601327363063396643211454726127793386421510944122551586617285621233033742476167885951231359171191247270Carte France Raster ®Carte à grande échelle spécialement adaptée à l'affichage de données urbaines.Cartes-63.7576 -21.565556.0405 51.0019GEOGRAPHICALGRIDSYSTEMS.FRANCERASTERimage/jpegPM1034157433067111683114966013421213662299134326851327324598264453711454659197531110742151093118394106322146716218893677121264429341743804647794252969075188760914705185058171737621233034742476168885951231369170191247272Cartographie Le Havre 1975Zone du Havre 1975EDUGEO-0.125103 49.28050.500412 49.6868GEOGRAPHICALGRIDSYSTEMS.LE-HAVRE1975image/pngPM10348350511513116977001023102612139414012046205313278928034093410714557856078186821415111571121416372164291622314224283274532859621213132743436364887871271289174175255256Cartographie Le Havre 1979Zone du Havre 1979EDUGEO-0.125103 49.28050.625515 49.6868GEOGRAPHICALGRIDSYSTEMS.LE-HAVRE1979image/pngPM10348350511513116977001023102712139414012046205513278928034093411014557856078186822015111571121416372164401622314224283274532881621213132743436364887871271289174175255256Cartes IGNCartes IGNCartes-180 -67.7557180 85.0511GEOGRAPHICALGRIDSYSTEMS.MAPSimage/jpegPM000011010210341777599011681154410198112136330882039631327266177407926145452123558115851151094420215163317021621889404313264689517436967355242447859031887392147104849121718072030430608401201650240326048064732970123880194124791703882495Carte Mondiale pour la mini-vueCarte Mondiale pour la mini-vueMini-Vue-179.5 -75179.5 75GEOGRAPHICALGRIDSYSTEMS.MAPS.OVERVIEWimage/jpegPM10102203043060841130165226032685206472110501288422100256PYRAMIDE SCAN EXPRESS CLASSIQUECartographie topographique multi-échelles du territoire français issue des bases de données vecteur de l’IGN –réalisée selon un processus cartographique innovant fortement automatisé.testCartes-22.5 39.884122.5 55.7766GEOGRAPHICALGRIDSYSTEMS.MAPS.SCAN-EXPRESS.CLASSIQUEimage/jpegPM10332386478546116817729861090121362154419722180132723307939554332145472612679518634151094412253159031726816218632453031753345751743776490246355269103620242835740485671880961121439166193239273PYRAMIDE SCAN EXPRESS STANDARDCartographie topographique multi-échelles du territoire français issue des bases de données vecteur de l’IGN –réalisée selon un processus cartographique innovant fortement automatisé.Cartes-22.5 39.884122.5 55.7766GEOGRAPHICALGRIDSYSTEMS.MAPS.SCAN-EXPRESS.STANDARDimage/jpegPM10332386478546116817729861090121362154419722180132723307939554332145472612679518634151094412253159031726816218632453031753345751743776490246355269103620242835740485671880961121439166193239273Dénominations géographiquesAffichage des noms des villes, villages, lieux-dits ...Divers-63.3725 -21.475655.9259 72.679GEOGRAPHICALNAMES.NAMESimage/pngPM10336576328671116801152664134412136823041328268713273646002656536714547191925312107361510943183841062421472162190436768212644294317438087352042528858711887632147024850711717436122827437245654788481121091579105217218314HydrographieAffichage des lacs, réservoirs, rivières et cours d'eau en France.Hydrographie-63.3725 -21.475655.9259 72.679HYDROGRAPHY.HYDROGRAPHYimage/pngPM10339576328672116801152660134412136423001324268813273646002656536814547191925320107361510943183841062421472162190436768212644294417438247352042528858711887664147024850711717436122827437245654848501121091699101225218336HydrographieAffichage des lacs, réservoirs, rivières et cours d'eau en France.Hydrographie-63.1614 -21.399855.8465 72.679HYDRO_SYMBO_PYR-PNG_WLD_WM_20120629image/pngPM10494506356366116831148664134212136822971329268413273745942658536814547791895317107361510950183781063421473162190036757212694293817438177351542539858761887634147030850791717446122827437245654848501121091699101225218336HydrographieAffichage des lacs, réservoirs, rivières et cours d'eau en France.Hydrographie-63.3725 -21.475655.9259 72.679HYDRO_SYMBO_PYR-PNG_WLD_WM_20130319image/pngPM10494506356366116831148664134212136822971329268413273745942658536814547791895317107361510943183841062421472162190436768212644294417438247352042528858711887664147024850711717436122827437245654848501121091699101225218336HydrographieAffichage des lacs, réservoirs, rivières et cours d'eau en France.Hydrographie-63.3725 -21.475655.9259 72.679HYDRO_SYMBO_PYR-PNG_WLD_WM_20130320image/pngPM10339576328672116801152660134412136423001324268813273646002656536814547191925320107361510943183841062421472162190436768212644294417438247352042528858711887664147024850711717436122827437245654848501121091699101225218336IFREMER - Berck St-Quentin 1934Photographie aérienne de Berck St-Quentin en 1934 (archives de l'IFREMER).Littoral1.51075 50.2511.66952 50.4143IFREMER-BERK_PYR-PNG_FXX_1934-V1image/pngPM103453465165161169069210321033121381138420652066132763276941304133145527553882608267151105411077165211653516221082215433043330711744217443096608666142188843488619132173132285IFREMER - Groix 1938Photographies aériennes de Groix en 1938 (archives de l'IFREMER).Littoral-3.52232 47.6057-3.39634 47.6661IFREMER-GROIX_PYR-PNG_FXX_1938-V1image/pngPM103573575015021171471510031004121429143020072009132859286040154018145718572180318037151143611443160631607416228722288732126321491745745457756425364299189149191550128506128598IFREMER - Abords de LorientPhotographie aérienne des abords de Lorient en 1924 (archives de l'IFREMER).Littoral-3.56436 47.6222-3.25248 47.7997IFREMER-QUIBERON_PYR-PNG_FXX_1924-V1image/pngPM103563575015021171371510031005121427143020072010132854286040144021145709572080298043151141911441160591608716228392288332119321751745678457666423864350189135791532128477128700IFREMER - Somme 1935Photographie aérienne de la Baie de Somme en 1935 (archives de l'IFREMER).Littoral1.48669 50.16991.65766 50.2795IFREMER-SOMME_PYR-PNG_FXX_WM_1935-V1image/pngPM103463465165161169269310321033121384138620642066132768277241294133145536554482598267151107311088165191653416221462217733038330691744293443556607766139188858788711132155132278Corine Land Cover 2006Visualisation de l’occupation du sol en France métropolitaine. Outil de référence pour mesurer les impacts environnementaux.Occupation des terres-5.15047 41.32529.57054 51.0991LANDCOVER.CORINELANDCOVERimage/pngPM10340382497539116837659941078121368153019892157132737306139784314619233135741476268883951241369169191248270Régions forestières nationalesCette cartographie représente des zones homogènes du point de vue des types de forêt ou de paysage sur la base de conditions physiques dominantes (climat, sol, relief).Occupation des terres-5.15047 41.32529.57054 51.0991LANDCOVER.FORESTAREASimage/pngPM1033438249754511677765994108212136215301989215713273330613978431414547561237957862915109501224615915172591621908244843183034510615233139739476270879951241409167191248272ForêtReprésentation simplifiée des forêts.Forêt-63.3725 -21.475655.9259 51.3121LANDCOVER.FORESTCOVERimage/pngPM10336576328671116801152664134412136823041328268713273646002656536714547191925312107361510952183831063221471162191236760212644293517438247352042528858711887648147024850711717439168288160336Carte forestière v1 (1987-2004)La cartographie forestière est une base de données cartographique des formations végétales forestières et naturelles. Elle couvre l'ensemble du territoire de France métropolitaine. Elle est réalisée par interprétation de photographies aériennes infrarouges et affinée par des contrôles sur le terrain (le seuil minimal de surface cartographiée est de 2,25 ha).Occupation des terres-5.34206 41.20659.82939 51.2203LANDCOVER.FORESTINVENTORY.V1image/pngPM1034138349653911683766993107912136715321987215913273430653974431914546961307948863915109381226015897172781621876245213179534557621233133742476267885951241349170191248269Carte forestière (v2 : 2006-)Localisation de 32 types de formations végétales sur le territoire. Carte en cours de réalisation depuis 2006.Occupation des terres-5.34206 41.20659.82939 51.2203LANDCOVER.FORESTINVENTORY.V2image/pngPM1034138349653911683766993107912136715321987215913273430653974431914546961307948863915109381226015897172781621876245213179534557621233133742476267885951241349170191248269SylvoécorégionsDécoupage de la France métropolitaine prenant en compte les facteurs biogéographiques déterminant la production forestière et la répartition des grands types d’habitat forestier.Occupation des terres-5.15047 41.32529.57054 51.0991LANDCOVER.SYLVOECOREGIONSimage/pngPM1033638449654411672768992108812135915361984216013273630723968432014547261287952864015109431225515904172641621904244963182434512616321647732484879880961111449160192240272Sylvoécorégions d'alluvions récentesAffichage des cinq sylvoécorégions d’alluvions récentes correspondant aux cinq vallées des bassins des grands fleuves français et de leurs affluents, à enjeux importants.Occupation des terres-5.15047 41.32529.57054 51.0991LANDCOVER.SYLVOECOREGIONS.ALLUVIUMimage/pngPM1033438249754511677765994108212136215301989215713273330613986431414547561237973862915109581223815955172591621916244683191834510615233139739476270879951241409167191248272Registre parcellaire graphique (RPG) 2007Registre parcellaire graphique : zones de cultures déclarées par les exploitants en 2007.Agriculture-63.2635 -21.41956.0237 51.2203LANDUSE.AGRICULTURE2007image/pngPM103415743326711168311486641342121367229713282685132734459526565370145469919053121074115109381838010625214831621876367612125142966621352041742714183885143831679170287166335Registre parcellaire graphique (RPG) 2008Registre parcellaire graphique : zones de cultures déclarées par les exploitants en 2008.Agriculture-63.2635 -21.41956.0237 51.2203LANDUSE.AGRICULTURE2008image/pngPM103415743326711168311486641342121367229713282685132734459526565370145469919053121074115109381838010625214831621876367612125142966621352041742714183885143831679170287166335Registre parcellaire graphique (RPG) 2009Registre parcellaire graphique : zones de cultures déclarées par les exploitants en 2009.Agriculture-63.2635 -21.41956.0237 51.2203LANDUSE.AGRICULTURE2009image/pngPM103415743326711168311486641342121367229713282685132734459526565370145469919053121074115109381838010625214831621876367612125142966621352041742714183885143831679170287166335Registre parcellaire graphique (RPG) 2010Registre parcellaire graphique : zones de culture déclarées par les exploitants en 2010.Agriculture-5.34206 41.20659.82939 51.2203LANDUSE.AGRICULTURE2010image/pngPM1034138349653911683766993107912136715321987215913273430653974431914546961307948863915109381226015897172781621876245213179534557621233133742476267885951241349170191248269Limites administrativesReprésentation des limites administratives (régions, départements, cantons, communes)Unités administratives-26.711 20.991854.9094 72.679LIMADM_SYMBO_PYR-PNG_WLD_20120620image/pngPM103383824975411168176599410781213661530198921571327253061397843141454676123795786296122827437245654848501121091699101225218336Limites administrativesReprésentation des limites administratives (régions, départements, cantons, communes)Unités administratives-63.1614 -21.399855.8465 72.679LIMADM_SYMBO_PYR-PNG_WLD_20120704image/pngPM10338574332677116811148664134612136622971329268413272545942658536814546791895317107361510950183781063421473162190036757212694293817438177351542539858761887650147030850791717446122827437245654848501121091699101225218336Limites administrativesReprésentation des limites administratives (régions, départements, cantons, communes)Unités administratives-63.3725 -21.475655.9259 72.679LIMADM_SYMBO_PYR-PNG_WLD_20130204image/pngPM10338574332677116811148664134612136622971329268413272545942658536814546791895317107361510943183841062421472162190436768212644294317438247352042528858711887648147024850711717436122827437245654848501121091699101225218336Limites administrativesReprésentation des limites administratives (régions, départements, cantons, communes)Unités administratives-63.3725 -21.475655.9259 72.679LIMADM_SYMBO_PYR-PNG_WLD_20130205image/pngPM10336576336671116801152672134412136823041344268713273646082688537614547292005376107351510943183841062421472162190436768212644294317438247352042528858711887648147024850711717436122827437245654848501121091699101225218336Limites administrativesReprésentation des limites administratives (régions, départements, cantons, communes)Unités administratives-63.3725 -21.475655.9259 72.679LIMADM_SYMBO_PYR-PNG_WLD_20130219image/pngPM10336576336671116801152672134412136823041344268713273646082688537614547292005376107351510943183841062421472162190436768212644294317438247352042528858711887648147024850711717436122926427245854848491141081689168288160336MNT LITTO3DMNT LITTO3D au pas de 1MLittoral5.45 42.956.3 43.3LITTO3D_PYR-RAW_WLD_WGS84G_2012-06-25image/x-bil;bits=32WGS84G000111002210265267105510591153153521102119121062107042204239132125214184408478144250428216880169571585018565337603391421144322884441616588323361616656673333131132866662632649132133527529Crues du bassin de la Seine - PHECCarte des plus hautes eaux connues (PHEC) sur le bassin de la Seine : crue de la seine et de ses affluents en 1910, ainsi que d'autres crues à des dates postérieures sur d'autres cours d'eau.Zone à risques0.419457 47.41635.43248 50.064LSEP-CRUE_PYR-PNG_WLD_WM_20120904image/pngPM10342358513529116927161026105812138514332052211613277128674105422514555057348211844315111011146916422168861622203229393284433764614223240736446472881891281369171179256264Crues du bassin de la Seine - PHECCarte des plus hautes eaux connues (PHEC) sur le bassin de la Seine : crue de la seine et de ses affluents en 1910, ainsi que d'autres crues à des dates postérieures sur d'autres cours d'eau.Zone à risques0.419457 47.41635.43248 50.064LSEP-CRUE_PYR-PNG_WLD_WM_20121009image/pngPM10342358513529116927161026105812138514332052211613277128674105422514555057348211844315111011146916422168861622203229393284433764614223240736446472881891281369171179256264Crues du bassin de la Seine - PHECCarte des plus hautes eaux connues (PHEC) sur le bassin de la Seine : crue de la seine et de ses affluents en 1910, ainsi que d'autres crues à des dates postérieures sur d'autres cours d'eau.Risques naturels0.419457 47.41635.43248 50.064LSEP-CRUE_PYR-PNG_WLD_WM_20130128image/pngPM10342360512529116887201024105812138414392048211613277128724104422514555057368208844315111011147216416168861622203229443284033764614243240736486472880961281369168184256264Corine Land Cover 2006Visualisation de l’occupation du sol en France métropolitaine. Outil de référence pour mesurer les impacts environnementaux.Occupation des terres-5.15047 41.32529.57054 51.0991MEDDE-CLC_PYR-PNG_FXX_WM_20120703image/pngPM10340382497539116837659941078121368153019892157132737306139784314619233135741476268883951241369169191248270Ortholittorale 2000Donnée issue du Référentiel géographique du littoral. Zone de couverture de l'orthophotographie : côte de la mer du Nord, de la Manche et de l'Atlantique.Littoral-5.21565 43.3012.60783 51.1233MEDDE-ORTHOLITTORAL_PYR_PNG_WLD_WM_20120926image/pngPM10342375497519116847509941038121369150019882077132738300039774155145476600179548310151095212003159091662116219042400631818332421743808480126363766485188761796024127274132970621233132742466264885931241299171187248259Arrêtés de protection de biotopeConservation de l'habitat d'espèces protégées. Outil réglementaires de niveau départemental.Ecologie-63.2635 -21.41955.8659 51.2203MNHN-APB_PYR-PNG_WLD_WM_20120615image/pngPM103415743326701168311486641341121367229713282683132734459526565367145469919053121073415109381838010625214691621876367612125142938621352041742714183885143831679170287166335Arrêtés de protection de biotopeConservation de l'habitat d'espèces protégées. Outil réglementaires de niveau départemental.Ecologie-63.3725 -21.475655.9259 51.3121MNHN-APB_PYR-PNG_WLD_WM_20121005image/pngPM103345743316831168511496631351121370229813262686132740459626535373145481919353071073115109621838610631214631621940367562126342911619352052739714189879143821789159287165341Réserves de biosphèreRéserves naturelles reconnues par le Programme sur l'Homme et la Biosphère créé par l'Unesco.Ecologie-63.25 15.71849.72255 51.1534MNHN-BIOS_PYR-PNG_WLD_WM_20120629image/pngPM1034246633253911684933664107912136818661328215813273637332656431714547374675313863415109471493410626172681621895298692125334537621292033742584167885116831349171233166269Conservatoire du littoral : Périmètres d'interventionLes sites du conservatoire du littoral ont pour vocation la sauvegarde des espaces côtiers et lacustres. Leur accès au public est encouragé mais reste défini dans des limites compatibles avec la vulnérabilité de chaque site.Littoral-63.1614 -21.399855.8465 51.0991MNHN-CDL_PYR-PNG_WLD_WM_20121212_2image/pngPM103345743326771167711486641346121362229713292684132733459426585368145475918953171073615109501837810634214731621908367572126942938879143831759167287166342Conservatoire du littoral : Périmètres d'interventionLes sites du conservatoire du littoral ont pour vocation la sauvegarde des espaces côtiers et lacustres. Leur accès au public est encouragé mais reste défini dans des limites compatibles avec la vulnérabilité de chaque site.Littoral-63.1614 -21.399855.8465 51.0991MNHN-CDL_PYR-PNG_WLD_WM_20130116image/pngPM103345743326771167711486641346121362229713292684132733459426585368145475918953171073615109501837810634214731621908367572126942938879143831759167287166342Conservatoire du littoral : Périmètres d'interventionLes sites du conservatoire du littoral ont pour vocation la sauvegarde des espaces côtiers et lacustres. Leur accès au public est encouragé mais reste défini dans des limites compatibles avec la vulnérabilité de chaque site.Littoral-63.3725 -21.475655.9259 51.3121MNHN-CDL_PYR-PNG_WLD_WM_20130319image/pngPM103365763286721168011526641344121368230413282688132736460026565368145471919253121073615109521838410632214711621912367602127242935880144801689168288160336Conservatoire du littoral : Parcelles protégéesLes sites du conservatoire du littoral ont pour vocation la sauvegarde des espaces côtiers et lacustres. Leur accès au public est encouragé mais reste défini dans des limites compatibles avec la vulnérabilité de chaque site.Littoral-63.3725 -21.475655.9259 51.3121MNHN-CEN_PYR-PNG_WLD_WM_20121213image/pngPM103365763286711168011526641344121368230413282687132736460026565367145471919253121073615109431838410624214721621904367682126442943880144801689168288160336Parcs naturels marinsZones maritimes identifiées pour leur biodiversité ou par les activités humaines faisant l'objet de protection.Ecologie-63.3725 -21.475655.9259 51.3121MNHN-PNM_PYR-PNG_WLD_WM_20120717image/pngPM103345743316751167711496631343121362229813262686132724459626535373145457919353071073915109221838610615214791621844367722123142951619352044739714189879143821709167287165341Parcs naturels marinsZones maritimes identifiées pour leur biodiversité ou par les activités humaines faisant l'objet de protection.Ecologie-63.3725 -21.475655.9259 51.3121MNHN-PNM_PYR-PNG_WLD_WM_20121002image/pngPM103345743316751167711496631343121362229813262686132724459626535373145457919353071073915109221838610615214791621844367722123142951619352044739714189879143821709167287165341Parcs naturels régionauxLes parcs naturels régionaux ont pour but de valoriser de vastes espaces de fort intérêt culturel et naturel, et de veiller au développement durable de ces territoires dont le caractère rural est souvent très affirmé.Ecologie-61.388 1.984799.82939 51.2203MNHN-PNR_PYR-PNG_WLD_WM_20120622image/pngPM10341506337539116831012674107912136720251349215913273440502699431914546981015398863915109381620310796172781621876324062159234557621312133742634267885126841349170253168269Parcs naturels régionauxLes parcs naturels régionaux ont pour but de valoriser de vastes espaces de fort intérêt culturel et naturel, et de veiller au développement durable de ces territoires dont le caractère rural est souvent très affirmé.Ecologie-63.3725 -21.475655.9259 51.3121MNHN-PNR_PYR-PNG_WLD_WM_20121005image/pngPM10334510331539116851005663107912137020101342215813274040042701431714548180095403863515109621600210807172551621940319882161534495619352036739714173879127821469159255165277Parcs nationauxZones naturelles labellisées en raison de leur richesse naturelle exceptionnelle.Ecologie-54.7027 -21.487155.9848 51.1534MNHN-PN_PYR-PNG_WLD_WM_20120628image/pngPM103425743566711168411497121342121368229814252684132736459628515369145473919357021073915109471838711404214791621895367742280942959621352241742714483885143891679171287178335Parcs nationauxLes parcs nationaux sont de vastes espaces protégés terrestres ou marins dont le patrimoine naturel est exceptionnel, et dont le but est à la fois de protéger des processus écologiques à large échelle et de fournir des possibilités de découverte de la nature.Ecologie-61.9679 -21.387755.8779 51.0863MNHN-PN_PYR-PNG_WLD_WM_20120719image/pngPM103425743356701168411486711341121369229713422683132739459426855367145478918853711073515109571837710743214701621914367552148742940621352041742714183885143831679171287167335Parcs nationauxLes parcs nationaux sont de vastes espaces protégés terrestres ou marins dont le patrimoine naturel est exceptionnel, et dont le but est à la fois de protéger des processus écologiques à large échelle et de fournir des possibilités de découverte de la nature.Ecologie-63.3725 -21.475655.9259 51.3121MNHN-PN_PYR-PNG_WLD_WM_20120810image/pngPM103345743316751167711496631343121362229813262686132724459626535373145457919353071073915109221838610615214791621844367722123142951619352044739714189879143821709167287165341Zones humides d'importance internationaleUn site Ramsar est un espace désigné en application de la Convention relative aux zones humides d'importance internationale, particulièrement comme habitats des oiseaux d'eau, dont le traité a été signé en 1971 sur les bords de la mer Caspienne (Iran).Ecologie-63.3725 -50.571480.7449 51.3121MNHN-RAMSAR_PYR-PNG_WLD_WM_20121213image/pngPM1033668833673611672136067214721213592704134429441327365408268858721454881081653761174315109912163110752234721621984432642150346943616471647732953295880176801919160352160368Réserves biologiquesUne réserve biologique est un espace protégé en milieu forestier ou en milieu associé à la forêt (landes, mares, tourbières, dunes). Ce statut s'applique aux forêts gérées par l'Office National des Forêts et a pour but la protection d'habitats remarquables ou représentatifs.Ecologie-61.388 -21.46955.8906 51.2203MNHN-RB_PYR-PNG_WLD_WM_20120622image/pngPM103415743376701168311496741341121367229813492683132734459626995367145469919253981073515109381838510796214711621876367712159242942621352141742714283885143841679170287168335Réserves biologiquesUne réserve biologique est un espace protégé en milieu forestier ou en milieu associé à la forêt (landes, mares, tourbières, dunes). Ce statut s'applique aux forêts gérées par l'Office National des Forêts et a pour but la protection d'habitats remarquables ou représentatifs.Ecologie-63.3725 -21.475655.9259 51.3121MNHN-RB_PYR-PNG_WLD_WM_20121002image/pngPM103345743316831168511496631351121370229813422686132740459627015373145497919354031073115109941838610807214631622004367562161542927619352052739714189879143821789159287165341Réserves nationales de chasse et de faune sauvageLes réserves nationales de chasse et de faune sauvage sont des espaces protégés terrestres ou marins dont la gestion est principalement assurée par l'Office National de la Chasse et de la Faune Sauvage.Ecologie-2.99155 41.6879.6157 51.0863MNHN-RNCF_PYR-PNG_WLD_WM_20120717image/pngPM10342381503539116847621006107812136915252013215713273930504027431414547861018055862915109571220216111172591621914244043222334518621233133742476267885951251349171190251269Réserves Naturelles de CorseLes réserves naturelles sont des espaces protégés terrestres ou marins dont le patrimoine naturel est exceptionnel, tant sur le plan de la biodiversité que parfois sur celui de la géodiversité.Ecologie-5.15047 41.32529.57054 51.0991MNHN-RNC_PYR-PNG_WLD_WM_20120907image/pngPM10374382529545117497651066108212149815302141215713300530614282431414601961238573862915120381224617155172511624084244923431834502615233139739476270887951321409183191264272Réserves naturelles nationalesLes réserves naturelles sont des espaces protégés terrestres ou marins dont le patrimoine naturel est exceptionnel, tant sur le plan de la biodiversité que parfois sur celui de la géodiversité.Ecologie-63.25 -21.487155.8779 51.0863MNHN-RN_PYR-PNG_WLD_WM_20120720image/pngPM103425743326701168411496641341121369229813282683132739459626565367145478919353131073515109571838710626214701621914367742125342940621352041742714183885143831679171287166335Réserves naturelles nationalesLes réserves naturelles sont des espaces protégés terrestres ou marins dont le patrimoine naturel est exceptionnel, tant sur le plan de la biodiversité que parfois sur celui de la géodiversité.Ecologie-63.3725 -50.571480.7449 51.3121MNHN-RN_PYR-PNG_WLD_WM_20121107image/pngPM1033567933173911678135866314711213652709132629341327385410265358691454761082053151173915109522163210639234711621912432562128746943618422052736844197881169821869163339165373Sites Natura 2000 au titre de la Directive HabitatsLe réseau Natura 2000 s'inscrit au coeur de la politique de conservation de la nature de l'Union européenne et est un élément clé de l'objectif visant à enrayer l'érosion de la biodiversité.Ecologie-5.34206 41.20659.82939 51.2203MNHN-SIC_PYR-PNG_WLD_WM_20120719image/pngPM1034138349653911683766993107912136715321987215913273430653974431914546961307948863915109381226015897172781621876245213179534557621233133742476267885951241349170191248269Sites Natura 2000 au titre de la Directive HabitatsLe réseau Natura 2000 s'inscrit au coeur de la politique de conservation de la nature de l'Union européenne et est un élément clé de l'objectif visant à enrayer l'érosion de la biodiversité.Ecologie-5.15047 41.32529.57054 51.0991MNHN-SIC_PYR-PNG_WLD_WM_20121001image/pngPM1033438249754511677765994108212136215301989215713273330613978431414547561237957862915109501224615915172591621908244923183034510615233139739476270879951241409167191248272Zones écologiques de nature remarquable (ZNIEFF1)Inventaire des espaces naturels abritant la nature remarquableEcologie-63.3725 -21.475655.9259 51.3121MNHN-ZNIEFF1_PYR-PNG_WLD_WM_20121210image/pngPM10336512344544116801016696108012136820241400215913273640482808431914547180965616863215109521618411231172551621912323672247134511616311639739633972880128801369168256168272Zones fonctionnelles de nature remarquable (ZNIEFF2)Inventaire des espaces fonctionnels indispensables à la nature remarquable.Ecologie-63.3725 -21.475655.9259 51.3121MNHN-ZNIEFF2_PYR-PNG_WLD_WM20121204image/pngPM10336512344544116801016696108012136820241400215913273640482808431914547980965624863215109601619111247172551621920323832249534503616311639739633972880128801369168256168272Sites NATURA 2000 au titre de la Directive OiseauxLe réseau Natura 2000 s'inscrit au coeur de la politique de conservation de la nature de l'Union européenne et est un élément clé de l'objectif visant à enrayer l'érosion de la biodiversité.Ecologie-5.34206 41.20659.82939 51.2203MNHN-ZPS_PYR-PNG_WLD_WM_20120717image/pngPM1034138349653911683766993107912136715321987215913273430653974431914546961307948863915109381226015897172781621876245213179534557621233133742476267885951241349170191248269Sites NATURA 2000 au titre de la Directive OiseauxLe réseau Natura 2000 s'inscrit au coeur de la politique de conservation de la nature de l'Union européenne et est un élément clé de l'objectif visant à enrayer l'érosion de la biodiversité.Ecologie-63.3725 -21.475655.9259 51.3121MNHN-ZPS_PYR-PNG_WLD_WM_20121001image/pngPM10334390491539116777739911079121362153819822158132724306839734317145457612979478635151092212258158951726316218442451631799345196192728367395557738791031221389167199245269MNT BDAlti V1BDAlti V1 au pas de 25mMNT-64 -23168 52MNT_PYR-RAW_WLD_WGS84G_2012-07-04image/x-bil;bits=32WGS84G000011011310216642659197911432128513193959202273155154310103056202061613404112372780822478541601644949108321329989Carte Monde 12 feuillesCarte de mondeCartes-180 -66.5133180 85.0511MONDE12F_PYR-JPEG_WLD_WM_WMTS_3Dimage/jpegPM00001101022030430608401201650240326048064Carte Monde 12 feuillesCarte de mondeCartes-180 -60180 80MONDE12F_PYR-JPEG_WLD_WM_WMTS_3D_V1image/jpegPM2020430508411101653220326745064Carte Monde 12 feuillesCarte de mondeCartes-180 -60180 80MONDE12F_PYR-JPEG_WLD_WM_WMTS_3D_V2image/jpegPM00001101022020430508411101653220326745064Carte Monde 12 feuillesCarte de mondeCartes-180 -66.5133180 85.0511MONDE12F_PYR-JPEG_WLD_WM_WMTS_3D_V2-20130601image/jpegPM00001101022030430608401201650240326048064Crues du bassin de la Seine - PHECCarte des plus hautes eaux connues (PHEC) sur le bassin de la Seine : crue de la seine et de ses affluents en 1910, ainsi que d'autres crues à des dates postérieures sur d'autres cours d'eau.Risques naturels0.419457 47.41635.43248 50.064NATURALRISKZONES.1910FLOODEDWATERSHEDSimage/pngPM10342360512529116887201024105812138414392048211613277128724104422514555057368208844315111011147216416168861622203229443284033764614243240736486472880961281369168184256264BDORTHO-NCLa BDORTHO-NC est une orthophotographie du territoire de Nouvelle-Calédonie réalisée par la DITTT pour le compte du Gouvernement de Nouvelle-Calédonie.Photographies-178 -84178 84NCL-DITTT-ORTHO_PYR-JPEG_WLD_WM_WMTS_20121214image/jpegPM00000101011031992510181162198511203612125397022407313454846357816792414909692701563315848151819318540312663169716363863708062533633951772773741601250661267911814554614832025013225358220303307074015015503103161620637312401278724812549154962509Dénominations géographiquesAffichage des noms des villes, villages, lieux-dits ...Divers-63.3725 -21.475655.9259 72.679NOMS_SYMBO_PYR-PNG_WLD_WM_20120814image/pngPM10334574331675116771149671134312136222981342268613273245962685537314547391935371107396122827437245654788481121091579105217218314Dénominations géographiquesAffichage des noms des villes, villages, lieux-dits ...Divers-63.3725 -21.475655.9259 72.679NOMS_SYMBO_PYR-PNG_WLD_WM_20120815image/pngPM1033457433167511677114967113431213622298134226861327324596268553731454739193537110739151095418378106312147116219083675621263429356122827437245654788481121091579105217218314Dénominations géographiquesAffichage des noms des villes, villages, lieux-dits ...Divers-63.3725 -21.475655.9259 72.679NOMS_SYMBO_PYR-PNG_WLD_WM_20120829image/pngPM10334574331675116771149671134312136222981342268613273245962685537314547391935371107391510954183781063121471162190836756212634293517438167351242526858701887633147025850691717416122827437245654788481121091579105217218314Dénominations géographiquesAffichage des noms des villes, villages, lieux-dits ...Divers-63.3725 -21.475655.9259 72.679NOMS_SYMBO_PYR-PNG_WLD_WM_20120912image/pngPM10334574331675116771149671134312136222981342268613273245962685537314547391935371107391510954183781063121471162190836756212634293517438167351242526858701887633147025850691717416122827437245654788481121091579105217218314Dénominations géographiquesAffichage des noms des villes, villages, lieux-dits ...Divers-63.3725 -21.475655.9259 72.679NOMS_SYMBO_PYR-PNG_WLD_WM_20130311image/pngPM10336576328671116801152664134412136823041328268713273646002656536714547191925312107361510943183841062421472162190436768212644294317438087352042528858711887632147024850711717436122827437245654788481121091579105217218314Photographie - Biarritz 1977Photographie de Biarritz 1977EDUGEO-1.8265 43.3165-1.18848 43.7157ORTHO-EDUGEO_PYR-PNG_WLD_WMimage/pngPM10373375506508117467501013101712149315002027203413298730004054406814597560008108813715119501200116217162751623901240023243532551623233131746466363893931261279186187253254Suisse - photographies aériennes du canton de Genève (SITG)Photographie aérienne du canton de Genève.Photographies5.95007 46.12416.31198 46.3658ORTHOGENEVE_PYR-PNG_CHE_WM_20100612image/pngPM1036236352852911725727105710591214511455211521191329022910423142391458045820846284791511609116411692516958162321923282338513391717464384656567702678341892876931301354041356681918575218626127080927133620371504372522541618542672622223333745456666890901321329181181264264Photographie - AJACCIO 1975Photographie - Ajaccio 1975EDUGEO8.65713 41.83348.98239 42.0846ORTHOIMAGERY.EDUGEO.AJACCIO1975image/pngPM10379380536537117597611073107512151915232146215013303830464292430014607660928585860015121531218417171172011624307243683434334403623233333747476767894951341349189190268268Photographie - AJACCIO 1990Photographie - Ajaccio 1990EDUGEO8.64462 41.78688.98239 42.0939ORTHOIMAGERY.EDUGEO.AJACCIO1990image/pngPM10379380536537117597611073107512151915232146215013303830474292430014607660958585860015121521219017170172011624305243803434134403623233333747476767894951341349189190268268SPOT ARCACHON 2010Zone d'ARCACHON - 2010EDUGEO-1.87654 44.2289-0.750618 45.0301ORTHOIMAGERY.EDUGEO.ARCACHON2010image/pngPM10368371506509117367421013101912147214852026203913294529714053407814589159438106815715117831188616213163151623567237723242632631623233131746466363892921261279184185253254SPOT ARRAS LENS BETHUNE 2008Zone de ARRAS LENS BETHUNE - 2008EDUGEO1.75144 49.9293.25268 50.8068ORTHOIMAGERY.EDUGEO.ARRAS-LENS-BETHUNE2008image/pngPM10343347516521116876951033104212137413902067208513274927804135417014549855618271834015109971112316543166801621995222463308633360621213232742436465885861291309171173258260Photographie - BELFORT MONTBELLIARD 1951Photographie - BELFORT MONTBELLIARD 1951EDUGEO6.69301 47.46076.96824 47.6801ORTHOIMAGERY.EDUGEO.BELFORT-MONTBELLIARD1951image/pngPM10357358531531117147161062106312142914322124212713285828654248425414571757318496850915114341146316993170181622868229273398634036622223333744446666889891321329178179265265Photographie - BERRY SUD 1950Photographie - BERRY SUD 1950EDUGEO1.23852 46.36691.48873 46.4531ORTHOIMAGERY.EDUGEO.BERRY-SUD1950image/pngPM10362362515516117247251031103212144914512062206413289929024124412914579858048248825915115971160916496165191623195232183299333039622223232745456464890901281299181181257258Photographie - BERRY SUD 1970Photographie - BERRY SUD 1970EDUGEO1.01333 46.60811.42617 46.7283ORTHOIMAGERY.EDUGEO.BERRY-SUD1970image/pngPM10361361514516117227231029103212144514472059206413289028944119412814578057888238825615115611157716476165131623123231543295233027622223232745456464890901281299180180257258Photographie - BETHUNE 1963Photographie - BETHUNE 1963EDUGEO2.62716 50.39392.95243 50.5054ORTHOIMAGERY.EDUGEO.BETHUNE1963image/pngPM10345345519520116906911038104012138013822077208113276027644155416314552055288311832615110411105716623166521622082221143324633305621213232743436465886861291309172172259260Photographie - BETHUNE 1964Photographie - BETHUNE 1964EDUGEO2.83984 50.333.29021 50.4098ORTHOIMAGERY.EDUGEO.BETHUNE1964image/pngPM10345345520521116906911040104212138113832080208513276327664160417014552755338321834115110541106616642166831622109221323328433366621213232743436565886861301309172172260260Photographie - BETHUNE 1988Photographie - BETHUNE 1988EDUGEO2.5521 50.3223.24017 50.4895ORTHOIMAGERY.EDUGEO.BETHUNE1988image/pngPM10345345519521116906911038104212138013832077208413276027664154416914552155338308833915110431106716616166781622086221343323233357621213232743436465886861291309172172259260Photographie - Biarritz 1977Photographie de Biarritz 1977EDUGEO-1.8265 43.3165-1.18848 43.7157ORTHOIMAGERY.EDUGEO.BIARRITZ1977image/pngPM10373375506508117467501013101712149315002027203413298730004054406814597560008108813715119501200116217162751623901240023243532551623233131746466363893931261279186187253254Photographie - BIARRTITZ 1979Photographie - Biarritz 1979EDUGEO-1.13844 43.6795-0.975803 43.7609ORTHOIMAGERY.EDUGEO.BIARRTITZ1979image/pngPM10373373508509117467471017101812149314942035203613298629884070407314597259778140814715119451195516280162951623890239113256032590623233131746466363893931271279186186254254SPOT BORDEAUX 2003Zone de Bordeaux 2003EDUGEO-1.12593 44.67540.125103 45.5582ORTHOIMAGERY.EDUGEO.BORDEAUX2003image/pngPM10366369508512117327391017102412146414782035204913292829574070409814585759148140819715117151182916281163951623430236583256332790622233132745466364891921271289183184254256Photographie - BOURG SAINT MAURICE 1956Photographie - BOURG SAINT MAURICE 1956EDUGEO6.61795 45.47936.85564 45.6282ORTHOIMAGERY.EDUGEO.BOURG-ST-MAURICE1956image/pngPM10365366530531117317321061106312146314652123212613292629314246425214585358628493850415117061172516986170081623412234513397234016622223333745456666891911321329182183265265Photographie - CAEN 1991Photographie - CAEN 1991EDUGEO-0.975803 49.0350.0250206 49.4109ORTHOIMAGERY.EDUGEO.CAEN1991image/pngPM10349351509512116997031018102412139914062036204813279928124073409614559856248147819315111961124816295163861622392224963259032772621213132743436364887871271289174175254256Photographie - Le Cap d'Agde 1968Photographie du Cap d'Agde 1968EDUGEO3.02749 43.18893.60297 43.3984ORTHOIMAGERY.EDUGEO.CAP-D-AGDE1968image/pngPM10374375520522117497511041104412149815022082208813299730044164417714599560088329835515119901201716659167111623981240343331933423623233232746466565893931301309187187260261SPOT Cap d'Agde 2008Zone du Cap d'Agde - 2008EDUGEO3.12757 43.14333.75309 43.5073ORTHOIMAGERY.EDUGEO.CAP-D-AGDE2008image/pngPM10374375520522117487511041104512149715022083209013299430054167418114598860118334836215119771202216668167251623954240453333733451623233232746466565893931301309187187260261Photographie - Le Cap d'Agde 1981Photographie du Cap d'Agde 1981EDUGEO3.01498 43.18893.66552 43.3984ORTHOIMAGERY.EDUGEO.CAP-DAGE1981image/pngPM10374375520522117497511041104412149815022082208913299730044164417914599560088329835815119901201716658167171623981240343331633435623233232746466565893931301309187187260261Photographie - CLERMONT FERRAND 1965Photographie - CLERMONT FERRAND 1965EDUGEO2.82733 45.71563.29021 45.9596ORTHOIMAGERY.EDUGEO.CLERMONT-FERRAND1965image/pngPM10364365520521117287301040104212145714612080208513291529234160417014583158478320834115116621169416641166831623325233893328233366622223232745456565891911301309182182260260Photographie - CLERMONT FERRAND 1985Photographie - CLERMONT FERRAND 1985EDUGEO2.88988 45.70693.2777 45.9423ORTHOIMAGERY.EDUGEO.CLERMONT-FERRAND1985image/pngPM10364365520521117297301040104212145814612080208513291629234161417014583258478323834115116651169516647166821623330233913329433364622223232745456565891911301309182182260260Photographie - CREIL SUD PICARDIE 1975Photographie - CREIL SUD PICARDIE 1975EDUGEO2.25185 49.0762.96494 49.5085ORTHOIMAGERY.EDUGEO.CREIL-SUD-PICARDIE1975image/pngPM10349351518520116987021036104012139714052073208113279528104147416314559156218294832615111821124216588166531622364224853317733307621213232743436465887871291309174175259260Photographie - Dijon 1971Photographie de Dijon 1971EDUGEO4.87902 47.18935.24181 47.3676ORTHOIMAGERY.EDUGEO.DIJON1971image/pngPM10358359525526117177181051105312143414372103210713286928754207421514573857508414843015114761150016828168611622952230003365633722622223232744446565889891311319179179262263Photographie - Grenoble 1966Photographie de Grenoble 1966EDUGEO5.61712 45.06555.94239 45.286ORTHOIMAGERY.EDUGEO.GRENOBLE1966image/pngPM10367368527528117347361055105712146814722111211513293729444223423114587558898447846215117501177916895169241623501235583379033849622233233745466566891921311329183184263264Photographie - Grenoble 1989Photographie de Grenoble 1989EDUGEO5.54206 45.05665.96741 45.3387ORTHOIMAGERY.EDUGEO.GRENOBLE1989image/pngPM10366368527528117337361055105712146714722111211513293529454222423114587158908444846315117431178016888169271623487235603377633854622233233745466566891921311329183184263264Photographie - GUADELOUPE 1984Photographie - GUADELOUPE 1984EDUGEO-61.7633 15.9411-61.4756 16.3376ORTHOIMAGERY.EDUGEO.GUADELOUPE1984image/pngPM104644663363371192993267267412185918641345134813371937282690269714743874565381539415148761491310762107881629752298272152421576629292121758584242811611684849232233168168Photographie - GUYANE 1955Photographie - Guyane 1955EDUGEO-54.1321 5.384-53.5065 5.79487ORTHOIMAGERY.EDUGEO.GUYANE1955image/pngPM104954963583591199099371671912198119861432143913396339732864287814792779465728575615158551589311456115131631711317862291323027630312222761624444812312489899247248179179Photographie - LA REUNION 1961Photographie - LA REUNION 1961EDUGEO55.258 -21.390655.5833 -20.8538ORTHOIMAGERY.EDUGEO.LA-REUNION1961image/pngPM10572574669670111145114813381340122290229726762680134581459453535360149162918810706107211518325183772141321443163665136755428274288663535414177171838381431431671679286287334335Photographie - LA REUNION 1980Photographie - LA REUNION 1980EDUGEO55.1579 -21.437255.6583 -20.7836ORTHOIMAGERY.EDUGEO.LA-REUNION1980image/pngPM10572574668670111144114813371340122289229726752681134579459553515362149159919110702107251518318183822140421450163663736764428094290063535414177171838381431431671679286287334335Photographie - LA REUNION 1989Photographie - LA REUNION 1989EDUGEO55.2079 -21.402255.7334 -20.8538ORTHOIMAGERY.EDUGEO.LA-REUNION1989image/pngPM10572574669670111145114813381341122290229726762682134581459453525364149162918910704107281518325183792140921456163665136758428184291363535414177171838381431431671679286287334335SPOT Ls Réunion 2010Zone de la Réunion - 2010EDUGEO55.0453 -21.495455.921 -20.6783ORTHOIMAGERY.EDUGEO.LA-REUNION2010image/pngPM10572574668671111144114913371342122288229826742684134577459753485368149154919410697107371518308183882139421474163661636776427884294863535414177171838381431431671679286287334335Photographie - LA ROCHELLE ROCHEFORT 1950Photographie LA ROCHELLE ROCHEFORT 1950EDUGEO-1.06338 45.05665.96741 45.9944ORTHOIMAGERY.EDUGEO.LA-ROCHELLE-ROCHEFORT1950image/pngPM10364368508528117287361017105712145714722035211513291429454071423114582958908143846315116581178016287169271623316235603257433854622233133745466366891921271329182184254264Photographie - LA-ROCHELLE-ROCHEFORT 1973Photographie de La Rochelle Rochefort 1973EDUGEO-1.37613 46.0726-1.03835 46.2286ORTHOIMAGERY.EDUGEO.LA-ROCHELLE-ROCHEFORT1973image/pngPM10363364508509117267281016101812145314562032203613290629124064407214581358248129814415116271164816258162891623255232963251732578622223131745456363890911271279181182254254Photographie - Le Havre 1955Photographie du Havre 1955EDUGEO0.0500412 49.45970.387819 49.5409ORTHOIMAGERY.EDUGEO.LE-HAVRE1955image/pngPM10349349512513116986991024102612139713982048205213279427974097410414558855948194820915111771118916388164191622355223783277732838621213232743436464887871281289174174256256Photographie - Le Havre 1964Photographie du Havre 1964EDUGEO0.0500412 49.44340.375309 49.622ORTHOIMAGERY.EDUGEO.LE-HAVRE1964image/pngPM10348349512513116976991024102612139513982048205213279127974097410414558355958194820915111661119116388164181622332223823277732836621213232743436464887871281289174174256256SPOT LE HAVRE 2008Zone du HAVRE - 2008EDUGEO-0.375309 49.0351.00082 49.8484ORTHOIMAGERY.EDUGEO.LE-HAVRE2008image/pngPM10347351510514116957031021102912139114062043205913278328124087411814556756248174823715111341124816349164751622269224963269932950621213132743436364886871271289173175255257Photographie - Limoges 1974Photographie de Limoges 1974EDUGEO1.00082 45.70691.42617 45.9596ORTHOIMAGERY.EDUGEO.LIMOGES1974image/pngPM10364365514516117287301029103212145714612059206413291529234118412814583158478237825615116621169516475165131623325233913295033027622223232745456464891911281299182182257258Photographie - LYON 1965Photographie - LYON 1965EDUGEO4.71638 45.54945.07918 45.8987ORTHOIMAGERY.EDUGEO.LYON1965image/pngPM103643665255261172973210501052121458146421012105132917292942034211145835585884068423151167011716168131684616233412343233626336921746683468656725367385189336693731134506134770622223232745456565891911311319182183262263Photographie - LYON 1984Photographie - LYON 1984EDUGEO4.70387 45.70695.17926 45.8726ORTHOIMAGERY.EDUGEO.LYON1984image/pngPM10364365525526117297301050105312145914612101210613291829234203421314583758478406842715116741169516812168551623348233913362433710622223232745456565891911311319182182262263Photographie - LYON 1988Photographie - LYON 1988EDUGEO4.62881 45.53195.12922 45.9161ORTHOIMAGERY.EDUGEO.LYON1988image/pngPM10364366525526117297321050105312145814642100210613291729294201421214583458598402842515116681171816805168501623337234373361033701622223232745456565891911311319182183262263SPOT LYON 2008Zone de LYON - 2008EDUGEO4.50371 45.20675.75474 45.9944ORTHOIMAGERY.EDUGEO.LYON2008image/pngPM10364367524528117287351049105612145714702099211313291429404198422614582958808396845315116581176016793169071623316235213358733815622223233745456566891911311329182183262264Photographie - Marne La Vallée 1965Photographie de Marne la Vallée 1965EDUGEO2.40198 48.8462.93992 48.9858ORTHOIMAGERY.EDUGEO.MARNE-LA-VALLEE1965image/pngPM10351352518520117037041037104012140614092075208113281328184150416214562756378301832515112551127416602166511622510225493320533303621223232743446465887881291309175176259260Photographie - Marne La Vallée 1977Photographie de Marne la Vallée 1977EDUGEO2.48955 48.81312.92741 48.9694ORTHOIMAGERY.EDUGEO.MARNE-LA-VALLEE1977image/pngPM10351352519520117037041038104012140714092076208113281428194152416214562856398305832515112571127916610166501622515225583322133300621223232743446465887881291309175176259260Photographie - Marne la Vallée 1987Photographie de Marne la Vallée 1987EDUGEO2.47704 48.86252.92741 48.9447ORTHOIMAGERY.EDUGEO.MARNE-LA-VALLEE1987image/pngPM10351352519520117037041038104012140714092076208113281528184152416214563056368304832515112601127216609166501622521225443321833300621223232743446465887881291309175176259260Photographie - MARSEILLE MARTIGUES 1969Photographie MARSEILLE MARTIGUES1969EDUGEO5.20428 43.17985.69219 43.3984ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES1969image/pngPM10374375526528117497511053105612149815022107211213299730044214422514599560098428845115119901201816857169021623981240363371533804623233233746466566893931311329187187263264Photographie - MARSEILLE MARTIGUES 1980Photographie MARSEILLE MARTIGUES1980EDUGEO4.67885 43.31655.29186 43.5708ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES1980image/pngPM10374375525527117487501050105412149615002101210813299230004202421614598460008404843215119691200116809168651623938240023361933731623233232746466565893931311319187187262263Photographie - MARSEILLE MARTIGUES 1987Photographie MARSEILLE MARTIGUES1987EDUGEO4.65383 43.31655.1042 43.5708ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES1987image/pngPM10374375525526117487501050105312149615002100210613299230004201421214598460008403842415119691200116807168481623938240023361533697623233232746466565893931311319187187262263Photographie - MARSEILLE MARTIGUES 1988Photographie MARSEILLE MARTIGUES1988EDUGEO4.91655 43.37115.39194 43.5708ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES1988image/pngPM10374374525527117487491051105412149614992103210913299229984207421814598459978415843715119691199416831168741623938239883366333749623233232746466565893931311319187187262263SPOT MARSEILLE-MARTIGUES 2010Zone de MARSEILLE-MARTIGUES - 2010EDUGEO5.25433 43.14335.75474 43.4165ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES2010image/pngPM10374375526528117497511053105612149815022107211313299730054215422614599460118431845315119881202216862169071623977240453372433815623233233746466566893931311329187187263264Photographie - La Martinique 1988Photographie de la Martinique 1988EDUGEO-61.1378 14.3713-60.8251 14.7104ORTHOIMAGERY.EDUGEO.MARTINIQUE1988image/pngPM104694703383381193994167667712187818821352135513375737652704271114751575305409542315150301506110819108471630060301232163821695629292121758584242811711784849234235169169Photographie - METZ NANCY 1982Photographie - METZ NANCY 1982EDUGEO5.9549 48.59026.43029 49.3376ORTHOIMAGERY.EDUGEO.METZ-NANCY1982image/pngPM103503535285301170070610571060121400141321152121132801282742314242145603565484638484151120611309169261696916224122261933852339381744825452396770467877188965090479135408135754621223333743446666887881321329175176264265Photographie - Nantes 1971Photographie de Nantes 1971EDUGEO-2.27687 47.1042-1.40115 47.3591ORTHOIMAGERY.EDUGEO.NANTES1971image/pngPM10358359505508117177191011101612143414382022203213286928774044406414573857558088812815114771151116176162561622954230223235332512622223131744446363889891261279179179252254Photographie - Paris 1949Photographie - Paris 1949EDUGEO2.20181 48.76362.52708 48.9529ORTHOIMAGERY.EDUGEO.PARIS1949image/pngPM103513525185191170370510361038121407141020732076132814282141464153145629564282928307151125911285165841661416225192257133168332281745039451436633766456189007890287132675132912621223232743446464887881291299175176259259Photographie - Paris 1965Photographie - Paris 1965EDUGEO2.02667 48.8462.48955 48.9858ORTHOIMAGERY.EDUGEO.PARIS1965image/pngPM10351352517519117037041035103812140614092071207613281328184142415214562756378284830515112551127416568166101622510225493313633221621223232743446464887881291299175176258259SPOT PARIS 2010Zone de Paris - SPOT 2010EDUGEO1.87654 48.54053.00247 49.362ORTHOIMAGERY.EDUGEO.PARIS2010SPOTimage/pngPM10350353517520117007071034104112140014142069208213280028294138416414560156588277832815112021131616554166571622405226333310933314621223232743446465887881291309175176258260Photographie - Reims 1963Photographie de Reims 1963EDUGEO3.95325 49.1174.21597 49.2968ORTHOIMAGERY.EDUGEO.REIMS1963image/pngPM10350351523523117007021046104712140114042092209513280228094185419114560556188371838315112111123716743167671622423224743348733535621213232743436565887871301309175175261261Photographie - Reims 1973Photographie de Reims 1973EDUGEO3.95325 49.12524.22848 49.2886ORTHOIMAGERY.EDUGEO.REIMS1973image/pngPM10350351523524117007021046104812140114042092209613280328084185419214560656178371838415112131123516743167681622426224713348733537621213232743436565887871301319175175261262Photographie - Reims 1988Photographie de Reims 1988EDUGEO3.91572 49.12524.2535 49.2805ORTHOIMAGERY.EDUGEO.REIMS1988image/pngPM10350351523524117007021046104812140114042092209613280328084185419214560756178370838515112141123516740167711622428224713348033542621213232743436565887871301319175175261262SPOT REIMS 2010Zone de Paris - REIMS 2010EDUGEO3.50288 48.95294.75391 49.362ORTHOIMAGERY.EDUGEO.REIMS2010image/pngPM10350351521525117007031043105112140014072087210213280028144175420414560156298351840815112021125916702168161622405225193340533633621213232743436565887871301319175175260262Photographie - ROISSY 1965Photographie - ROISSY 1965EDUGEO2.35194 48.90362.70222 49.0432ORTHOIMAGERY.EDUGEO.ROISSY1965image/pngPM103513525185191170270410371039121405140820742078132811281641494157145623563382998314151124711266165981662916224942253333196332591744989450666639266519188997890132132784133039621223232743446464887881291299175176259259Photographie - ROISSY 1987Photographie - ROISSY 1987EDUGEO2.45202 48.94472.65218 49.035ORTHOIMAGERY.EDUGEO.ROISSY1987image/pngPM103513515185191170370310371039121406140720752078132812281541514156145624563083038312151124811260166071662516224962252133214332501744993450436642866501188998790087132857133003621213232743436464887871291299175175259259Photographie - Strasbourg 1975Photographie de Strasbourg 1975EDUGEO7.31852 48.40787.93153 48.6563ORTHOIMAGERY.EDUGEO.STRASBOURG1975image/pngPM10353354532534117067081065106912141214162131213813282528334262427614565056678525855215113001133417050171051622601226693410034211622223333744446666888881331339176177266267Photographie - Strasbourg 1985Photographie de Strasbourg 1985EDUGEO7.46865 48.39957.894 48.6232ORTHOIMAGERY.EDUGEO.STRASBOURG1985image/pngPM10353354533534117067081066106812141314172132213713282628344265427514565256688531855115113051133617063171021622610226723412734205622223333744446666888881331339176177266267SPOT STRASBOURG 2010Zone de Paris - STRASBOURG 2010EDUGEO7.13087 48.04118.2568 48.8707ORTHOIMAGERY.EDUGEO.STRASBOURG2010image/pngPM10352355532535117047111064107012140814232129214113281728464258428314563556928516856715112711138517033171351622542227703406634271622223333744446666888881331339176177266267Photographie - TOULON-HYERES 1972Photographie de TOULON-HYERES 1972EDUGEO5.74223 42.96966.33021 43.2163ORTHOIMAGERY.EDUGEO.TOULON-HYERES1972image/pngPM10375376528530117507521056106012150115052113212013300330114226424014600660228453848015120131204416906169601624027240883381333920623233333746476666893941321329187188264265Photographie -Toulouse 1954Photographie de Toulouse 1954EDUGEO1.23852 43.56181.55128 43.7247ORTHOIMAGERY.EDUGEO.TOULOUSE1954image/pngPM10373374515516117467481031103212149314962062206513298729924124413114597459858248826215119491197016496165251623899239403299333050623233232746466464893931281299186187257258SPOT Vallée du Drac 2010Zone de la Vallée du Drac - 2010EDUGEO5.12922 44.76436.25515 45.0301ORTHOIMAGERY.EDUGEO.VALEE-DU-DRAC2010image/pngPM10368369526529117367381053105912147214772106211913294529544212423814589159088425847615117831181716850169531623567236353370133906623233233746466566892921311329184184263264Photographie - VANNES GOLF DU MORBIHAN 1970Photographie - VANNES GOLF DU MORBIHAN 1970EDUGEO-3.20264 47.4607-2.62716 47.7138ORTHOIMAGERY.EDUGEO.VANNES-GOLF-DU-MORBIHAN1970image/pngPM103573585025041171471610051009121428143220112018132857286540234036145714573180468072151142911463160921614416228582292732184322891745717458546436964579189143591708128739129158622223131744446263889891251269178179251252Photographie - Versailles 1965Photographie - Versailles 1965EDUGEO1.98914 48.60672.32692 48.8789ORTHOIMAGERY.EDUGEO.VERSAILLES1965image/pngPM103523535175181170470610351037121408141320702074132817282641414148145635565382828297151127011307165651659516225402261533130331911745080452306626066383189016090460132520132766622223232744446464888881291299176176258259Photographie - Versailles 1989Photographie de Versailles 1989EDUGEO1.87654 48.63152.33943 48.8789ORTHOIMAGERY.EDUGEO.VERSAILLES1989image/pngPM10352353517518117047061034103712140814132069207413281728264138414914563556528277829815112701130416554165961622540226083310933193622223232744446464888881291299176176258259Photographies aériennesPhotographies aériennesPhotographies-178 -84178 84ORTHOIMAGERY.ORTHOPHOTOSimage/jpegPM0000010101103199251018116219851120361212539702240731327394635417924145478927082158481510956185401653169716219123707233063395174382574144660126791188765114827213202535821917877229406017015934347320303307074015015503103161620637312401278724812549154962509Ortholittorale 2000Donnée issue du Référentiel géographique du littoral. Zone de couverture de l'orthophotographie : côte de la mer du Nord, de la Manche et de l'Atlantique.Littoral-5.21565 43.3012.60783 51.1233ORTHOIMAGERY.ORTHOPHOTOS.COAST2000image/pngPM10342375497519116847509941038121369150019882077132738300039774155145476600179548310151095212003159091662116219042400631818332421743808480126363766485188761796024127274132970621233132742466264885931241299171187248259Photographies arériennes - (CRS84)OrthophotographiesPhotographies-178.187 -21.401355.8464 51.091ORTHOIMAGERY.ORTHOPHOTOS.CRS84image/jpegWGS84G10221633101341114421267202683128852534415366131770506982107331435411013916521467157082202793304293416141654055966085868172833081118132017173661339083727791167855158233591103165670Suisse - photographies aériennes du canton de Genève (SITG)Photographie aérienne du canton de Genève.Photographies5.95007 46.12416.31198 46.3658ORTHOIMAGERY.ORTHOPHOTOS.GENEVEimage/pngPM1036236352852911725727105710591214511455211521191329022910423142391458045820846284791511609116411692516958162321923282338513391717464384656567702678341892876931301354041356681918575218626127080927133620371504372522541618542672622223333745456666890901321329181181264264IFREMER - Authie 1935Photographie aérienne d'Authie en 1935 (archives de l'IFREMER).Littoral1.52005 50.17041.67164 50.5759ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.AUTHIE.1935image/pngPM103443465165161168969310321033121378138620652066132757277241304133145515554482618267151103111088165231653516220622217733046330711744124443556609366142188824988711132186132285IFREMER - Authie 1935Photographie aérienne d'Authie en 1935 (archives de l'IFREMER).Littoral1.52005 50.17041.67164 50.5759ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.AUTHIE.1935-V1image/pngPM103443465165161168969310321033121378138620652066132757277241304133145515554482618267151103111088165231653516220622217733046330711744124443556609366142188824988711132186132285IFREMER - Berck St-Quentin 1934Photographie aérienne de Berck St-Quentin en 1934 (archives de l'IFREMER).Littoral1.51075 50.2511.66952 50.4143ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.BERCK.1934image/pngPM103453465165161169069210321033121381138420652066132763276941304133145527553882608267151105411077165211653516221082215433043330711744217443096608666142188843488619132173132285IFREMER - Canche-Authie 1935Photographie aérienne de Canche-Authie en 1935 (archives de l'IFREMER).Littoral1.52005 50.3141.68189 50.576ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.CANCHE.1935image/pngPM103443455165161168969110321033121378138320652067132757276741304134145515553482618268151103111068165221653616220622213633045330731744124442736609166146188824988547132183132293IFREMER - Canche-Authie 1935Photographie aérienne de Canche-Authie en 1935 (archives de l'IFREMER).Littoral1.52005 50.3141.68189 50.576ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.CANCHE.1935-V1image/pngPM103443455165161168969110321033121378138320652067132757276741304134145515553482618268151103111068165221653616220622213633045330731744124442736609166146188824988547132183132293IFREMER - Douelan 1938Photographie aérienne de Douelan en 1938 (archives de l'IFREMER).Littoral-3.54994 47.6947-3.44699 47.7806ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.DOUELAN.1938image/pngPM103563575015021171371410031004121427142820072008132855285740154017145710571580308035151142011431160601607016228412286332121321401745682457266424364281189136591453128486128562IFREMER - Douelan 1938Photographie aérienne de Douelan en 1938 (archives de l'IFREMER).Littoral-3.54994 47.6947-3.44699 47.7806ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.DOUELAN.1938-V1image/pngPM103563575015021171371410031004121427142820072008132855285740154017145710571580308035151142011431160601607016228412286332121321401745682457266424364281189136591453128486128562IFREMER - Groix 1938Photographies aériennes de Groix en 1938 (archives de l'IFREMER).Littoral-3.52232 47.6057-3.39634 47.6661ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.GROIX.1938image/pngPM103573575015021171471510031004121429143020072009132859286040154018145718572180318037151143611443160631607416228722288732126321491745745457756425364299189149191550128506128598IFREMER - Le Pouldu Kernevel 1938Photographie aérienne de Le Pouldou Kernevel en 1938 (archives de l'IFREMER).LittoralPhotographies-3.49123 47.6797-3.35182 47.7408ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.LEPOULDOU.1938image/pngPM103573575025021171471410041004121428142920082009132856285840164019145713571680338039151142611433160661607816228522286732132321571745705457346426464315189141191468128529128630IFREMER - Le Pouldu Kernevel 1938Photographie aérienne de Le Pouldou Kernevel en 1938 (archives de l'IFREMER).LittoralPhotographies-3.49123 47.6797-3.35182 47.7408ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.LEPOULDOU.1938-V1image/pngPM103573575025021171471410041004121428142920082009132856285840164019145713571680338039151142611433160661607816228522286732132321571745705457346426464315189141191468128529128630IFREMER - Port Louis Gâvres 1938Photographie aérienne de Port Louis Gâvres en 1938 (archives de l'IFREMER).Littoral-3.39707 47.6579-3.21579 47.739ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.PORTLOUIS.1938image/pngPM103573575025021171471410041005121428142920092011132856285940184022145713571880378045151142611436160751609116228532287232150321821745707457446430064364189141491489128600128729IFREMER - Port Louis Gâvres 1938Photographie aérienne de Port Louis Gâvres en 1938 (archives de l'IFREMER).Littoral-3.39707 47.6579-3.21579 47.739ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.PORTLOUIS.1938-V1image/pngPM103573575025021171471410041005121428142920092011132856285940184022145713571880378045151142611436160751609116228532287232150321821745707457446430064364189141491489128600128729IFREMER - Abords de LorientPhotographie aérienne des abords de Lorient en 1924 (archives de l'IFREMER).Littoral-3.56436 47.6222-3.25248 47.7997ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.QUIBERON.1924image/pngPM103563575015021171371510031005121427143020072010132854286040144021145709572080298043151141911441160591608716228392288332119321751745678457666423864350189135791532128477128700IFREMER - Somme 1935Photographie aérienne de la Baie de Somme en 1935 (archives de l'IFREMER).Littoral1.48669 50.16991.65766 50.2795ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.SOMME.1935image/pngPM103463465165161169269310321033121384138620642066132768277241294133145536554482598267151107311088165191653416221462217733038330691744293443556607766139188858788711132155132278IFREMER - Rivière du Ter 1939Photographie aérienne de la Rivière du Ter en 1939 (archives de l'IFREMER).Littoral-3.44022 47.7006-3.34067 47.7595ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.TER.1939image/pngPM103563575025021171371410041004121427142820082009132855285740174019145711571580358039151142311431160701607916228462286232141321591745693457246428364319189138791448128567128638IFREMER - Rivière du Ter 1939Photographie aérienne de la Rivière du Ter en 1939 (archives de l'IFREMER).Littoral-3.44022 47.7006-3.34067 47.7595ORTHOIMAGERY.ORTHOPHOTOS.IFREMER.TER.1939-V1image/pngPM103563575025021171371410041004121427142820082009132855285740174019145711571580358039151142311431160701607916228462286232141321591745693457246428364319189138791448128567128638Planet ObserverImage satellite retravaillée pour obtenir une couverture mondiale esthétique.planet observerortho image-180 -90180 88ORTHOIMAGERY.ORTHOPHOTOS.LOW_RES.CRS84image/jpegWGS84G_PO01112112141011024120481112048140961214096181922141831811641161325132164616411287112812568125615129151211024BDORTHO-NCLa BDORTHO-NC est une orthophotographie du territoire de Nouvelle-Calédonie réalisée par la DITTT pour le compte du Gouvernement de Nouvelle-Calédonie.Photographies-178 -84178 84ORTHOIMAGERY.ORTHOPHOTOS.NCLimage/jpegPM00000101011031992510181162198511203612125397022407313454846357816792414909692701563315848151819318540312663169716363863708062533633951772773741601250661267911814554614832025013225358220303307074015015503103161620637312401278724812549154962509Paris haute résolutionPrises de vues aériennes de Paris à haute résolution.Photographies2.19509 48.80952.42968 48.9124ORTHOIMAGERY.ORTHOPHOTOS.PARISimage/pngPM1214081409207220751328162819414541511456325639829183021511265112791658316605162253022559331673321017450614511866335664201890123902371326701328411918024618047426534026568220360492360948530681531364GEOSUD / RapidEye (2010)Image satellitaire de la France métropolitaine effectuée en 2010 par les satellites de télédétection RapidEye dans le cadre du projet EQUIPEX GEOSUD.Images satellitaires-5.80725 41.201410.961 50.9218ORTHOIMAGERY.ORTHOPHOTOS.RAPIDEYEimage/jpegPM0000010001103423824965391168476599310791213681531198621591327363063397243191454726126794586381510944122531589017277211123223445578510111516621233133742476267885951241349171191248269Photographies aériennes 2000-2005Prises de vues aériennes des territoires réalisées entre 2000 et 2005.Photographies-178.187 -21.401355.8561 51.091ORTHOIMAGERY.ORTHOPHOTOS2000-2005image/jpegPM1034257456701168411481013411213692297202683132739459441536614547891898210733151095618378165214671621912367573304293517438257351566085871188765114703013201717436213504174271083885143116791712872335Planet ObserverImage satellite retravaillée pour obtenir une couverture mondiale esthétique.planet observerortho image-180 -90180 88PHOTO-LOWRES_PYR-JPEG_WLD_WGS84G_2012-05-04image/jpegWGS84G_PO01112112141011024120481112048140961214096181922141831811641161325132164616411287112812568125615129151211024Photographies aériennes 2000-2005Prises de vues aériennes des territoires réalisées entre 2000 et 2005.Photographies-178.187 -21.401355.8561 51.091PHOTOHISTO_PYR-JPEG_WLD_WM_20121015image/jpegPM1034257456701168411481013411213692297202683132739459441536614547891898210733151095618378165214671621912367573304293517438257351566085871188765114703013201717436213504174271083885143116791712872335Photographies arériennes (CRS84)Orthophotographiesortho-images-178.187 -21.401355.8464 50.3854PHOTO_PYR-JPEG_WLD_WGS84G_2012-05-25image/jpegWGS84G10225633101341114501267202683129012534415366131803506982107331436061013916521467157212202793304293416144254055966085868172885181118132017173661439083728791167856158233591123165670Photographies arériennes (CRS84)Orthophotographiesortho-images-178.187 -21.401355.8464 51.091PHOTO_PYR-JPEG_WLD_WGS84G_2012-06-11image/jpegWGS84G10221633101341114421267202683128852534415366131770506982107331435411013916521467157082202793304293416141654055966085868172833081118132017173661339083727791167855158233591103165670Photographies arériennes - (CRS84)OrthophotographiesPhotographies-178.187 -21.401355.8464 51.091PHOTO_PYR-JPEG_WLD_WGS84G_2012-10-01image/jpegWGS84G10221633101341114421267202683128852534415366131770506982107331435411013916521467157082202793304293416141654055966085868172833081118132017173661339083727791167855158233591103165670Photographies arériennes - (CRS84)OrthophotographiesPhotographies-178.187 -21.401355.8464 51.091PHOTO_PYR-JPEG_WLD_WGS84G_20121008image/jpegWGS84G10221633101341114421267202683128852534415366131770506982107331435411013916521467157082202793304293416141654055966085868172833081118132017173661339083727791167855158233591103165670Photographies aériennesPhotographies aériennesPhotographies-63.1607 -21.401355.8464 60.6416PHOTO_PYR-JPEG_WLD_WM_2012-05-14image/jpegPM103425745670116841148101341121369229720268313273945944153661454789189821073315109561837816521467162191236757330429341743825735156608586818876511470301320171736191787722409891701592733926213504174271083885143116791712872335Photographies aériennesPhotographies aériennesPhotographies-180 -90180 90PHOTO_PYR-JPEG_WLD_WM_WMT_20121004image/jpegPM000001010110319925101811621985112036121253970224073132739459441536614547891898210733151095618378165214671621912367573304293417438257351566085868188765114703013201717361917877229406017015934347320303307074015015503103161620637312401278724812549154962509Photographies aériennesPhotographies aériennesPhotographies-178 -84178 84PHOTO_PYR-JPEG_WLD_WM_WMT_20130603image/jpegPM0000010101103199251018116219851120361212539702240731327394635417924145478927082158481510956185401653169716219123707233063395174382574144660126791188765114827213202535821917877229406017015934347320303307074015015503103161620637312401278724812549154962509Arrêtés de protection de biotopeConservation de l'habitat d'espèces protégées. Outil réglementaires de niveau départemental.Ecologie-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.APBimage/pngPM103345743316831168511496631351121370229813262686132740459626535373145481919353071073115109621838610631214631621940367562126342911619352052739714189879143821789159287165341Réserves de biosphèreRéserves naturelles reconnues par le Programme sur l'Homme et la Biosphère créé par l'Unesco.Ecologie-63.25 15.71849.72255 51.1534PROTECTEDAREAS.BIOSimage/pngPM1034246633253911684933664107912136818661328215813273637332656431714547374675313863415109471493410626172681621895298692125334537621292033742584167885116831349171233166269Conservatoire du littoral : Périmètres d'interventionLes sites du conservatoire du littoral ont pour vocation la sauvegarde des espaces côtiers et lacustres. Leur accès au public est encouragé mais reste défini dans des limites compatibles avec la vulnérabilité de chaque site.Littoral-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.CDLimage/pngPM103365763286721168011526641344121368230413282688132736460026565368145471919253121073615109521838410632214711621912367602127242935880144801689168288160336Conservatoire du littoral : Parcelles protégéesLes sites du conservatoire du littoral ont pour vocation la sauvegarde des espaces côtiers et lacustres. Leur accès au public est encouragé mais reste défini dans des limites compatibles avec la vulnérabilité de chaque site.Littoral-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.CENimage/pngPM103365763286711168011526641344121368230413282687132736460026565367145471919253121073615109431838410624214721621904367682126442943880144801689168288160336Parcs nationauxLes parcs nationaux sont de vastes espaces protégés terrestres ou marins dont le patrimoine naturel est exceptionnel, et dont le but est à la fois de protéger des processus écologiques à large échelle et de fournir des possibilités de découverte de la nature.Ecologie-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.PNimage/pngPM103345743316751167711496631343121362229813262686132724459626535373145457919353071073915109221838610615214791621844367722123142951619352044739714189879143821709167287165341Parcs naturels marinsZones maritimes identifiées pour leur biodiversité ou par les activités humaines faisant l'objet de protection.Ecologie-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.PNMimage/pngPM103345743316751167711496631343121362229813262686132724459626535373145457919353071073915109221838610615214791621844367722123142951619352044739714189879143821709167287165341Parcs naturels régionauxLes parcs naturels régionaux ont pour but de valoriser de vastes espaces de fort intérêt culturel et naturel, et de veiller au développement durable de ces territoires dont le caractère rural est souvent très affirmé.Ecologie-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.PNRimage/pngPM10334510331539116851005663107912137020101342215813274040042701431714548180095403863515109621600210807172551621940319882161534495619352036739714173879127821469159255165277Zones humides d'importance internationaleUn site Ramsar est un espace désigné en application de la Convention relative aux zones humides d'importance internationale, particulièrement comme habitats des oiseaux d'eau, dont le traité a été signé en 1971 sur les bords de la mer Caspienne (Iran).Ecologie-63.3725 -50.571480.7449 51.3121PROTECTEDAREAS.RAMSARimage/pngPM1033668833673611672136067214721213592704134429441327365408268858721454881081653761174315109912163110752234721621984432642150346943616471647732953295880176801919160352160368Réserves biologiquesUne réserve biologique est un espace protégé en milieu forestier ou en milieu associé à la forêt (landes, mares, tourbières, dunes). Ce statut s'applique aux forêts gérées par l'Office National des Forêts et a pour but la protection d'habitats remarquables ou représentatifs.Ecologie-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.RBimage/pngPM103345743316831168511496631351121370229813422686132740459627015373145497919354031073115109941838610807214631622004367562161542927619352052739714189879143821789159287165341Réserves naturelles nationalesLes réserves naturelles sont des espaces protégés terrestres ou marins dont le patrimoine naturel est exceptionnel, tant sur le plan de la biodiversité que parfois sur celui de la géodiversité.Ecologie-63.3725 -50.571480.7449 51.3121PROTECTEDAREAS.RNimage/pngPM1033567933173911678135866314711213652709132629341327385410265358691454761082053151173915109522163210639234711621912432562128746943618422052736844197881169821869163339165373Réserves Naturelles de CorseLes réserves naturelles sont des espaces protégés terrestres ou marins dont le patrimoine naturel est exceptionnel, tant sur le plan de la biodiversité que parfois sur celui de la géodiversité.Ecologie-5.15047 41.32529.57054 51.0991PROTECTEDAREAS.RNCimage/pngPM10374382529545117497651066108212149815302141215713300530614282431414601961238573862915120381224617155172511624084244923431834502615233139739476270887951321409183191264272Réserves nationales de chasse et de faune sauvageLes réserves nationales de chasse et de faune sauvage sont des espaces protégés terrestres ou marins dont la gestion est principalement assurée par l'Office National de la Chasse et de la Faune Sauvage.Ecologie-2.99155 41.6879.6157 51.0863PROTECTEDAREAS.RNCFimage/pngPM10342381503539116847621006107812136915252013215713273930504027431414547861018055862915109571220216111172591621914244043222334518621233133742476267885951251349171190251269Sites Natura 2000 au titre de la Directive HabitatsLe réseau Natura 2000 s'inscrit au coeur de la politique de conservation de la nature de l'Union européenne et est un élément clé de l'objectif visant à enrayer l'érosion de la biodiversité.Ecologie-5.15047 41.32529.57054 51.0991PROTECTEDAREAS.SICimage/pngPM1033438249754511677765994108212136215301989215713273330613978431414547561237957862915109501224615915172591621908244923183034510615233139739476270879951241409167191248272Zones écologiques de nature remarquable (ZNIEFF1)Inventaire des espaces naturels abritant la nature remarquableEcologie-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.ZNIEFF1image/pngPM10336512344544116801016696108012136820241400215913273640482808431914547180965616863215109521618411231172551621912323672247134511616311639739633972880128801369168256168272Zones fonctionnelles de nature remarquable (ZNIEFF2)Inventaire des espaces fonctionnels indispensables à la nature remarquable.Ecologie-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.ZNIEFF2image/pngPM10336512344544116801016696108012136820241400215913273640482808431914547980965624863215109601619111247172551621920323832249534503616311639739633972880128801369168256168272Sites NATURA 2000 au titre de la Directive OiseauxLe réseau Natura 2000 s'inscrit au coeur de la politique de conservation de la nature de l'Union européenne et est un élément clé de l'objectif visant à enrayer l'érosion de la biodiversité.Ecologie-63.3725 -21.475655.9259 51.3121PROTECTEDAREAS.ZPSimage/pngPM10334390491539116777739911079121362153819822158132724306839734317145457612979478635151092212258158951726316218442451631799345196192728367395557738791031221389167199245269GEOSUD / RapidEye (2010)Image satellitaire de la France métropolitaine effectuée en 2010 par les satellites de télédétection RapidEye dans le cadre du projet EQUIPEX GEOSUD.Images satellitaires-5.80725 41.201410.961 50.9218RAPIDEYE_PYR-JPEG_WLD_WM_2010image/jpegPM0000010001103423824965391168476599310791213681531198621591327363063397243191454726126794586381510944122531589017277211123223445578510111516621233133742476267885951241349171191248269Régions forestières nationalesCette cartographie représente des zones homogènes du point de vue des types de forêt ou de paysage sur la base de conditions physiques dominantes (climat, sol, relief).Occupation des terres-5.15047 41.32529.57054 51.0991REGIONS-FORESTIERES-NATIONALES_SYMBO_PYR-PNG_FXX_WM_20120809image/pngPM1033438249754511677765994108212136215301989215713273330613978431414547561237957862915109501224615915172591621908244843183034510615233139739476270879951241409167191248272RoutesAffichage du réseau routier français et européen.Réseau routier-63.1614 -21.399855.8465 72.679ROUTE_SYMBO_PYR-PNG_WLD_20120629image/pngPM10340574332671116831148664134212136822971329268413273345942658536814547591895317107361510950183781063421473162190036757212694293817438177351542539858761887634147030850791717446122827437245654848501121091699101225218336RoutesAffichage du réseau routier français et européen.Réseau routier-63.3725 -21.475655.9259 72.679ROUTE_SYMBO_PYR-PNG_WLD_20130121image/pngPM10340576330672116821150662134312136323001326268613273646002688536714547191925376107361510943183841062421472162190436768212644294317438247352042528858711887648147024850711717436122926427245854848491141081689102226218336RoutesAffichage du réseau routier français et européen.Réseau routier-63.3725 -21.475655.9259 72.679ROUTE_SYMBO_PYR-PNG_WLD_20130131image/pngPM10340576330672116821150662134312136323001326268613273646002656536714547191925312107361510943183841062421472162190436768212644294317438247352042528858711887648147024850711717436122926427245854848491141081689102226218336RoutesAffichage du réseau routier français et européen.Réseau routier-5.15047 41.32529.57054 51.0991ROUTE_SYMBO_PYR-PNG_WLD_ERM_20120530image/pngPM103383824975411168176599410781213661530198921579167191248272Référentiel parcellaire graphique (RPG) 2007Référentiel parcellaire graphique : zones de cultures déclarées par les exploitants en 2007.Agriculture-63.2635 -21.41956.0237 51.2203RPG2007_PYR-PNG_WLD_20120615image/pngPM103415743326711168311486641342121367229713282685132734459526565370145469919053121074115109381838010625214831621876367612125142966621352041742714183885143831679170287166335Registre parcellaire graphique (RPG) 2007Registre parcellaire graphique : zones de cultures déclarées par les exploitants en 2007.Agriculture-63.2635 -21.41956.0237 51.2203RPG2007_PYR-PNG_WLD_20121001image/pngPM103415743326711168311486641342121367229713282685132734459526565370145469919053121074115109381838010625214831621876367612125142966621352041742714183885143831679170287166335Référentiel parcellaire graphique (RPG) 2008Référentiel parcellaire graphique : zones de cultures déclarées par les exploitants en 2008.Agriculture-63.2635 -21.41956.0237 51.2203RPG2008_PYR-PNG_WLD_20120615image/pngPM103415743326711168311486641342121367229713282685132734459526565370145469919053121074115109381838010625214831621876367612125142966621352041742714183885143831679170287166335Registre parcellaire graphique (RPG) 2008Registre parcellaire graphique : zones de cultures déclarées par les exploitants en 2008.Agriculture-63.2635 -21.41956.0237 51.2203RPG2008_PYR-PNG_WLD_20121001image/pngPM103415743326711168311486641342121367229713282685132734459526565370145469919053121074115109381838010625214831621876367612125142966621352041742714183885143831679170287166335Référentiel parcellaire graphique (RPG) 2009Référentiel parcellaire graphique : zones de cultures déclarées par les exploitants en 2009.Agriculture-63.2635 -21.41956.0237 51.2203RPG2009_PYR-PNG_WLD_20120615image/pngPM103415743326711168311486641342121367229713282685132734459526565370145469919053121074115109381838010625214831621876367612125142966621352041742714183885143831679170287166335Registre parcellaire graphique (RPG) 2009Registre parcellaire graphique : zones de cultures déclarées par les exploitants en 2009.Agriculture-63.2635 -21.41956.0237 51.2203RPG2009_PYR-PNG_WLD_20121001image/pngPM103415743326711168311486641342121367229713282685132734459526565370145469919053121074115109381838010625214831621876367612125142966621352041742714183885143831679170287166335Référentiel parcellaire graphique (RPG) 2010Référentiel parcellaire graphique : zones de culture déclarées par les exploitants en 2010.Agriculture-5.34206 41.20659.82939 51.2203RPG2010_PYR-PNG_WLD_20120709image/pngPM1034138349653911683766993107912136715321987215913273430653974431914546961307948863915109381226015897172781621876245213179534557621233133742476267885951241349170191248269Registre parcellaire graphique (RPG) 2010Registre parcellaire graphique : zones de culture déclarées par les exploitants en 2010.Agriculture-5.34206 41.20659.82939 51.2203RPG2010_PYR-PNG_WLD_20120924image/pngPM1034138349653911683766993107912136715321987215913273430653974431914546961307948863915109381226015897172781621876245213179534557621233133742476267885951241349170191248269Cartographie LA REUNION 1980Zone de la Réunion 1980EDUGEO55.0453 -21.495455.6708 -20.6783SCAN-EDUGEO_PYR-PNG_FXX_WMimage/pngPM10572574668670111144114913371340122288229826742681134577459753485362149154919410697107251518308183882139421451163661636776427884290263535414177171838381431431671679286287334335PYRAMIDE SCAN EXPRESS CLASSIQUECartographie topographique multi-échelles du territoire français issue des bases de données vecteur de l’IGN –réalisée selon un processus cartographique innovant fortement automatisé.testCartes-22.5 39.884122.5 55.7766SCAN-EXPRESS-CLASSIQUE_PYR-JPG_WLD_WM_WMTS_20130612image/jpegPM10332386478546116817729861090121362154419722180132723307939554332145472612679518634151094412253159031726816218632453031753345751743776490246355269103620242835740485671880961121439166193239273PYRAMIDE SCAN EXPRESS STANDARDCartographie topographique multi-échelles du territoire français issue des bases de données vecteur de l’IGN –réalisée selon un processus cartographique innovant fortement automatisé.Cartes-22.5 39.884122.5 55.7766SCAN-EXPRESS-STANDARD_PYR-JPG_WLD_WM_WMTS_20130612image/jpegPM10332386478546116817729861090121362154419722180132723307939554332145472612679518634151094412253159031726816218632453031753345751743776490246355269103620242835740485671880961121439166193239273Carte SCAN 1000Le produit SCAN 1000® version 2 est une collection d'images numériques en couleurs, obtenues par rastérisation des données vecteur de la carte nationale France (901) à l'échelle 1 :1,000,000ième. Le produit couvre l'ensemble du territoire français métropolitain et la Corse.Cartes-6.24618 41.086410.8338 51.252SCAN1000_PYR-JPEG_WLD_WM_WMTS_3Dimage/jpegPM000001000110341383493539211123223445578510111516621233033742476167885951231349170191246269Carte SCAN 1000Le produit SCAN 1000® version 2 est une collection d'images numériques en couleurs, obtenues par rastérisation des données vecteur de la carte nationale France (901) à l'échelle 1 :1,000,000ième. Le produit couvre l'ensemble du territoire français métropolitain et la Corse.Cartes-6.24618 41.086410.8338 51.02SCAN1000_PYR-JPEG_WLD_WM_WMTS_3D_V1image/jpegPM000001000110341383493539211123223445578510111516621233033742476167885951231349170191246269Carte SCAN 1000Le produit SCAN 1000® version 2 est une collection d'images numériques en couleurs, obtenues par rastérisation des données vecteur de la carte nationale France (901) à l'échelle 1 :1,000,000ième. Le produit couvre l'ensemble du territoire français métropolitain et la Corse.Cartes-6.24618 41.086410.8338 51.252SCAN1000_PYR-JPEG_WLD_WM_WMTS_3D_V2image/jpegPM000001000110341383493539211123223445578510111516621233033742476167885951231349170191246269Carte SCAN 100Le produit SCAN 100® version 2 est une collection d'images numériques en couleurs, obtenues par rasterisation des données vecteur servant à la réalisation des cartes de la série au 1:100,000ième de l'IGN. Le produit SCAN 100® version 2 se compose d'images numériques sans habillage ni surcharge et d'indications de géoréférencement.Cartes-63.3788 -21.700656.0391 51.1615SCAN100_PYR-JPEG_WLD_WM_WMTS_3Dimage/jpegPM1034057533167111681115066313421213632301132626851327264602265353711454529204530710742621352041742714183885143821679170287165335Carte SCAN 100Le produit SCAN 100® version 2 est une collection d'images numériques en couleurs, obtenues par rasterisation des données vecteur servant à la réalisation des cartes de la série au 1:100,000ième de l'IGN. Le produit SCAN 100® version 2 se compose d'images numériques sans habillage ni surcharge et d'indications de géoréférencement.Cartes-63.3788 -21.700656.0391 51.1615SCAN100_PYR-JPEG_WLD_WM_WMTS_3D_20110801image/jpegPM1034057533167111681115066313421213632301132626851327264602265353711454529204530710742621352041742714183885143821679170287165335Carte SCAN 100Le produit SCAN 100® version 2 est une collection d'images numériques en couleurs, obtenues par rasterisation des données vecteur servant à la réalisation des cartes de la série au 1:100,000ième de l'IGN. Le produit SCAN 100® version 2 se compose d'images numériques sans habillage ni surcharge et d'indications de géoréférencement.Cartes-63.3788 -21.700656.0391 51.1615SCAN100_PYR-JPEG_WLD_WM_WMTS_3D_20121201image/jpegPM1034057533167111681115066313421213632301132626851327264602265353711454529204530710742621352041742714183885143821679170287165335Carte SCAN 100Le produit SCAN 100® version 2 est une collection d'images numériques en couleurs, obtenues par rasterisation des données vecteur servant à la réalisation des cartes de la série au 1:100,000ième de l'IGN. Le produit SCAN 100® version 2 se compose d'images numériques sans habillage ni surcharge et d'indications de géoréférencement.Cartes-5.71319 -21.700656.0391 51.1615SCAN100_PYR-JPEG_WLD_WM_WMTS_3D_V1image/jpegPM10340575496671116811150993134212136323011987268513272646023974537114545292047948107426213531417427162838851431241679170287248335Carte SCAN 25 TouristiqueLe produit SCAN 25® version 2 est une collection d'images cartographiques numériques en couleurs, obtenues par rasterisation des données servant à la réalisation des cartes de la série au 1 : 25 000. Le produit SCAN 25® version 2 se compose d'images numériques sans habillage ni surchage et d'indications de géoréférencementCartes-5.66635 41.209710.8198 50.9307SCAN25_PYR-JPEG_WLD_WM_WMTS_3Dimage/jpegPM1034257456701168411481013411213682297202683132736459540536614547291908110733151094418381163214671621889367633264293462134314074271083885143116791712872335Carte SCAN 25 TouristiqueLe produit SCAN 25® version 2 est une collection d'images cartographiques numériques en couleurs, obtenues par rasterisation des données servant à la réalisation des cartes de la série au 1 : 25 000. Le produit SCAN 25® version 2 se compose d'images numériques sans habillage ni surchage et d'indications de géoréférencementCartes-178.206 -21.428455.847 50.9307SCAN25_PYR-JPEG_WLD_WM_WMTS_3D_2012-07-01image/jpegPM1034257456701168411481013411213682297202683132736459540536614547291908110733151094418381163214671621889367633264293462134314074271083885143116791712872335Carte SCAN 25 TouristiqueLe produit SCAN 25® version 2 est une collection d'images cartographiques numériques en couleurs, obtenues par rasterisation des données servant à la réalisation des cartes de la série au 1 : 25 000. Le produit SCAN 25® version 2 se compose d'images numériques sans habillage ni surchage et d'indications de géoréférencementCartes-178.206 -21.428455.847 50.9307SCAN25_PYR-JPEG_WLD_WM_WMTS_3D_2012-10-01image/jpegPM1034257456701168411481013411213682297202683132736459540536614547291908110733151094418381163214671621889367633264293462134314074271083885143116791712872335Carte SCAN 25 TouristiqueLe produit SCAN 25® version 2 est une collection d'images cartographiques numériques en couleurs, obtenues par rasterisation des données servant à la réalisation des cartes de la série au 1 : 25 000. Le produit SCAN 25® version 2 se compose d'images numériques sans habillage ni surchage et d'indications de géoréférencementCartes-5.66635 41.209710.8198 50.9307SCAN25_PYR-JPEG_WLD_WM_WMTS_3D_2013-01-01image/jpegPM1034257456701168411481013411213682297202683132736459540536614547291908110733151094418381163214671621889367633264293462134314074271083885143116791712872335Carte SCAN 25 TouristiqueLe produit SCAN 25® version 2 est une collection d'images cartographiques numériques en couleurs, obtenues par rasterisation des données servant à la réalisation des cartes de la série au 1 : 25 000. Le produit SCAN 25® version 2 se compose d'images numériques sans habillage ni surchage et d'indications de géoréférencementCartes-63.1891 -21.428455.847 50.9307SCAN25_PYR-JPEG_WLD_WM_WMTS_3D_V1image/jpegPM10342574332670116841148664134112136822971329268313273645952658536614547291905316107331510944183811063221467162188936763212644293434445488910517171920621352041742714183885143831679171287166335France administrativeCarte de la France administrative (régions, départements, arrondissements, cantons, communes)Cartes-63.2459 -21.637156.052 51.5596SCANADM_PYR-JPEG_WLD_WM_20120624image/jpegPM10339575332671621352041742714183884143831679169287166335Carte de l'état-major - environs de Paris (1818 - 1824)Carte des environs de Paris au 1 : 10 000 établie entre 1818 et 1824.Cartes historiques1.82682 48.38472.79738 49.5142SCANEM10_PYR-JPEG_FXX_WM_1824image/jpegPM10349354517519116987081034103912139714172068207913279528344137415914559056698275831915111811133816550166381622363226763310033277621223232743446464887881291299174177258259Carte de l'état-major (1820-1866)Carte française en couleurs du XIXè siècle en couleurs superposable aux cartes et données modernes.Cartes historiques-6.08889 41.184410.961 51.2745SCANEM40_PYR-JPEG_FXX_WM_20130124image/jpegPM103423824955401168476599110801213681531198321601327363063396643211454726127793386421510944122551586617285621233033742476167885951231359171191247270Litto3D ®Modèle numérique continu terre-mer sur la frange littorale.Littoral5.75296 42.97866.25761 43.2733SCANLITTO3D_PYR-PNG_WLD_WM_20120704image/pngPM10375376528529117507521056105912150015052113211913300130104226423814600360218453847615120061204316907169531624012240863381533907623233333746476666893941321329187188264264Carte littorale (SHOM/IGN)Assemblage des cartes marines du Service hydrographique et océanographique de la marine (SHOM) et des cartes terrestres de l’IGN.CartesLittoral-61.9629 -21.534856.1621 51.454SCANLITTO_PYR-JPEG_WLD_WM_20120709image/pngPM103405743356711168111496711343121362229913432687132726459826865374145452919653721074815109041839210744214961621808367842148842992621352041742714183885143831679170287167335Carte SCANREGLe produit SCAN Régional® version 2 est une collection d'images cartographiques numériques en couleur, obtenues par rastérisation des données vecteur de la série « Cartes régionales » éditées par l'IGN. Ces images couvrent l'ensemble du territoire français métropolitain.Cartes-5.71319 40.852311.4297 51.1615SCANREG_PYR-JPEG_WLD_WM_WMTS_3Dimage/jpegPM000001000110340384496541116817689931082121363153719872164132726307439744328211123233445678510121516621243133742486267885961241359170192248270Carte SCANREGLe produit SCAN Régional® version 2 est une collection d'images cartographiques numériques en couleur, obtenues par rastérisation des données vecteur de la série « Cartes régionales » éditées par l'IGN. Ces images couvrent l'ensemble du territoire français métropolitain.Cartes-5.71319 40.852311.4297 51.1615SCANREG_PYR-JPEG_WLD_WM_WMTS_3D_2013image/jpegPM000001000110340384496541116817689931082121363153719872164132726307439744328211123233445678510121516621243133742486267885961241359170192248270Carte SCANREGLe produit SCAN Régional® version 2 est une collection d'images cartographiques numériques en couleur, obtenues par rastérisation des données vecteur de la série « Cartes régionales » éditées par l'IGN. Ces images couvrent l'ensemble du territoire français métropolitain.Cartes-5.71319 40.852311.4297 51.1615SCANREG_PYR-JPEG_WLD_WM_WMTS_3D_V1image/jpegPM000001000110340384496541116817689931082121363153719872164132726307439744328211123233445678510121516621243133742486267885961241359170192248270Carte topographique type 1900Cartes au 1 : 50 000 (1ère édition issue de la Cartothèque de l'IGN) N°XXIII-14 Paris (format utile original 53 x 40 cm) Et ses 8 feuilles environnantes : XXII-13 Pontoise XXII-14 Versailles XXII-15 Rambouillet XXIII-13 L'Isle-Adam XXIII-15 Corbeil XXIV-13 Dammartin-en-Goëlle XXIV-14 Lagny XXIV-15 Brie-Comte-Robert Dressées, héliogravées et publiées par le Service géographique de l'armée en 1906, d'après les travaux exécutés sur le terrain entre 1878 et 1901.Cartes1.62941 48.47263 49.1548SCANTYPE1900_PYR-JPG_WLD_WM_20120510image/jpegPM1035035351652011701707103310411214031415206620821328072831413241641456155663826583281511231113261653116657621223232743446465887881291309175176258260Carte topographique type 1900Cartes au 1 : 50 000 (1ère édition issue de la Cartothèque de l'IGN) N°XXIII-14 Paris (format utile original 53 x 40 cm) Et ses 8 feuilles environnantes : XXII-13 Pontoise XXII-14 Versailles XXII-15 Rambouillet XXIII-13 L'Isle-Adam XXIII-15 Corbeil XXIV-13 Dammartin-en-Goëlle XXIV-14 Lagny XXIV-15 Brie-Comte-Robert Dressées, héliogravées et publiées par le Service géographique de l'armée en 1906, d'après les travaux exécutés sur le terrain entre 1878 et 1901.Cartes1.62941 48.47263 49.1548SCANTYPE1900_PYR-JPG_WLD_WM_20120705image/jpegPM1035035351652011701707103310411214031415206620821328072831413241641456155663826583281511231113261653116657Carte topographique - environs de Paris (1906)Carte topographique de Paris et de ses environs éditée en 1906.Cartes historiques1.62941 48.47263 49.1548SCANTYPE1900_PYR-JPG_WM_20130124image/jpegPM1035035351652011701707103310411214031415206620821328072831413241641456155663826583281511231113261653116657Trait de côte HistolittFormalisation de la limite entre le domaine terrestre et le domaine marin.AltitudeLittoral-63.2529 -21.5155.9472 51.1388SHOM-TDC_PYR-PNG_WLD_WM_20120904image/pngPM1033457433267611677114966413441213622298132826881327334597265653681454749194531310737151094918381106342146616219073676321269429331743814735264253885866188764414703685076171732619352044739714189879143831719167287166342SPOT BORDEAUX 2003Zone de Bordeaux 2003EDUGEO-1.12593 44.67540.125103 45.5582SPOT-EDUGEO_PYR-PNG_WLD_WMimage/pngPM10366369508512117327391017102412146414782035204913292829574070409814585759148140819715117151182916281163951623430236583256332790622233132745466364891921271289183184254256Spot 5Cette couche est formée d'images prises par le satellite SPOT 5 en 2009 et 2010 depuis une altitude de 800 km. La résolution des images initiales est de 2,5 mètres/pixel, ce qui permet d'identifier l'existence de bâtiments, routes et chemins, et sa précision est homogène avec celle du référentiel à Grande Echelle. Le satellite SPOT 5 est exploité depuis 2002 par le Centre national d'études spatiales (CNES) et les images sont distribuées par la société Spot Image (Astrium GEO-Information Services). L'expertise de l'IGN menée à la demande du CNES a permis d'affiner les performances géométriques du capteur SPOT5, dans l'intérêt de tous les utilisateurs. La couche " SPOT 5 " visible sur Géoportail est issue de la co-édition Reference3D® entre Spot Image et l'IGN. Aucune légende n'est associée à cette couche. La radiométrie des images est traitée par des couleurs naturelles.Photographies-2 42.00014.99991 46SPOT5_PYR-JPEG_WLD_WMimage/jpegPM10364380506526117287601012105212145715202025210413291430414050420914582860828100841915116571216416201168391623315243283240333678622233132745476365891951261319182190253263Spot 5Cette couche est formée d'images prises par le satellite SPOT 5 en 2009 et 2010 depuis une altitude de 800 km. La résolution des images initiales est de 2,5 mètres/pixel, ce qui permet d'identifier l'existence de bâtiments, routes et chemins, et sa précision est homogène avec celle du référentiel à Grande Echelle. Le satellite SPOT 5 est exploité depuis 2002 par le Centre national d'études spatiales (CNES) et les images sont distribuées par la société Spot Image (Astrium GEO-Information Services). L'expertise de l'IGN menée à la demande du CNES a permis d'affiner les performances géométriques du capteur SPOT5, dans l'intérêt de tous les utilisateurs. La couche " SPOT 5 " visible sur Géoportail est issue de la co-édition Reference3D® entre Spot Image et l'IGN. Aucune légende n'est associée à cette couche. La radiométrie des images est traitée par des couleurs naturelles.Photographies-2 42.00014.99991 46SPOT5_PYR-JPEG_WLD_WM_20120624image/jpegPM10364380506526117287601012105212145715202025210413291430414050420914582860828100841915116571216416201168391623315243283240333678622233132745476365891951261319182190253263IrisZones Iris définies par l'INSEE pour les besoins des recensements sur l'ensemble des communes de plus de 10 000 habitants et la plupart des communes de 5 000 à 10 000 habitants.Divers-5.15047 41.32529.57054 51.0991STATISTICALUNITS.IRISimage/pngPM10334382497545116777659941082121362153019892157132733306139784314145475612379578629615233139739476270879951241409167191248272SylvoécorégionsDécoupage de la France métropolitaine prenant en compte les facteurs biogéographiques déterminant la production forestière et la répartition des grands types d’habitat forestier.Occupation des terres-5.15047 41.32529.57054 51.0991SYLVOECOREGIONS_SYMBO_PYR-PNG_FXX_WM_20120807image/pngPM1033438249754511677765994108212136215301989215713273330613978431414547561237957862915109501224615915172591621908244923183034510615233139739476270879951241409167191248272SylvoécorégionsDécoupage de la France métropolitaine prenant en compte les facteurs biogéographiques déterminant la production forestière et la répartition des grands types d’habitat forestier.Occupation des terres-5.15047 41.32529.57054 51.0991SYLVOECOREGIONS_SYMBO_PYR-PNG_FXX_WM_20121031image/pngPM1033638449654411672768992108812135915361984216013273630723968432014547261287952864015109431225515904172641621904244963182434512616321647732484879880961111449160192240272Réseau ferroviaireCarte du réseau ferroviaireVoies ferrées-26.711 20.991854.9094 72.679TRANSPORTNETWORKS.RAILWAYSimage/pngPM103383824975411168176599410781213661530198921571327363048399243121454716088798486241510943121751596817248162190424352319363449617438244870463872689911887664973921277441379686122827437245654848501121091699101225218336RoutesAffichage du réseau routier français et européen.Réseau routier-63.3725 -21.475655.9259 72.679TRANSPORTNETWORKS.ROADSimage/pngPM10340576330672116821150662134312136323001326268613273646002656536714547191925312107361510943183841062421472162190436768212644294317438247352042528858711887648147024850711717436122926427245854848491141081689102226218336AéroportsLocalisation des aéroports, aérodromes et héliports, des pistes, bâtiments et équipements dédiés.Réseaux de transports-68.709 -21.475655.9259 76.5354TRANSPORTNETWORKS.RUNWAYSimage/pngPM103365763366711168011526721344121368230413432679132736460026885359145479919253761072015109601837510632214391621920367442127242879174384073488425448575918876961469768510417151968391647716723288839144721689168288168336MNT LITTO3DMNT LITTO3D au pas de 1MLittoral5.45 42.956.3 43.3UNDERWATER.ELEVATION.ELEVATIONGRIDCOVERAGEimage/x-bil;bits=32WGS84G000111002210265267105510591153153521102119121062107042204239132125214184408478144250428216880169571585018565337603391421144322884441616588323361616656673333131132866662632649132133527529Lignes électriquesAffichage des lignes électriques.Energie-63.3725 -21.475655.9259 51.3121UTILITYANDGOVERNMENTALSERVICES.ALLimage/pngPM103423824975371168576599410741213681536199221601327364600268853681454799192537610736151095918384106392147216219203675221280429271743840735044255985855188769614700885136171695615233139739476270879951241409167191248272Zones franches urbainesZones franches créées au sein de quartiers de plus de 8 500 habitants particulièrement défavorisés, en tenant compte des éléments de nature à faciliter l’implantation d’entreprises ou le développement d’activités économiques.Zones de gestion-63.3725 -21.475655.9259 51.3121ZFU_BDD_WLD_WM_20120925image/pngPM103345743316751167711496631343121362229813262686132724459626535373145457919353071073915109221838610615214791621844367722123142951619352044739714189879143821709167287165341Zones urbaines sensiblesZones urbaines caractérisées par la présence de grands ensembles ou de quartiers d’habitat dégradé et par un déséquilibre accentué entre l’habitat et l’emploi.Zones de gestion-63.3725 -21.475655.9259 51.3121ZUS_BDD_WLD_WM_20120925image/pngPM103345743316751167711496631343121362229813262686132724459626535373145457919353071073915109221838610615214791621844367722123142951619352044739714189879143821709167287165341PMEPSG:38570559082264.0287178958533332-20037508 20037508256256111279541132.0143588959472254-20037508 200375082562562210545978.7734655447186469-20037508 200375082562561024102411272989.3867327723085907-20037508 200375082562562048204812136494.6933663861796617-20037508 20037508256256409640961368247.3466831930771477-20037508 20037508256256819281921434123.6733415965449154-20037508 2003750825625616384163841517061.8366707982724577-20037508 200375082562563276832768168530.9183353991362289-20037508 200375082562566553665536174265.4591676995681144-20037508 20037508256256131072131072182132.7295838497840572-20037508 20037508256256262144262144191066.3647919248918304-20037508 200375082562565242885242882139770566.0071793960087234-20037508 200375082562564420533.1823959624461134-20037508 200375082562561048576104857621266.5911979812228585-20037508 2003750825625620971522097152369885283.0035897239868063-20037508 2003750825625688434942641.5017948619934032-20037508 200375082562561616517471320.7508974309967016-20037508 20037508256256323268735660.3754487154983508-20037508 20037508256256646474367830.1877243577491754-20037508 2003750825625612812882183915.0938621788745877-20037508 2003750825625625625691091957.5469310886252288-20037508 20037508256256512512WGS84GIGNF:WGS84G0279541132.0143588675418869-180 90256256211139770566.0071794337709434-180 902562564210272989.3867327723315839-180 902562562048102411136494.6933663861657919-180 90256256409620481268247.3466831930828960-180 90256256819240961334123.6733415965414480-180 902562561638481921417061.8366707982707240-180 902562563276816384158530.9183353991353620-180 902562566553632768164265.4591676995676810-180 9025625613107265536172132.7295838497838405-180 90256256262144131072181066.3647919248919202-180 9025625652428826214419533.1823959624459601-180 902562561048576524288269885283.0035897168854717-180 9025625684334942641.5017948584427359-180 90256256168417471320.7508974292213679-180 90256256321658735660.3754487146106840-180 90256256643264367830.1877243573053420-180 902562561286472183915.0938621786526710-180 9025625625612881091957.5469310893263355-180 902562565122569545978.7734655446631677-180 902562561024512WGS84G_POIGNF:WGS84G0279541132.0143588675418869-180 90256256211139770566.0071794337709434-180 902562564210272989.3867327723315839-180 902562562048102411136494.6933663861657919-180 90256256409620481268247.3466831930828960-180 9025625681924096269885283.0035897168854717-180 9025625684334942641.5017948584427359-180 90256256168417471320.7508974292213679-180 90256256321658735660.3754487146106840-180 90256256643264367830.1877243573053420-180 902562561286472183915.0938621786526710-180 9025625625612881091957.5469310893263355-180 902562565122569545978.7734655446631677-180 902562561024512 diff --git a/float-no-zero/examples/data/WMTSCapabilities.xml b/float-no-zero/examples/data/WMTSCapabilities.xml new file mode 100644 index 0000000000..44836d9af4 --- /dev/null +++ b/float-no-zero/examples/data/WMTSCapabilities.xml @@ -0,0 +1,374 @@ + + + + Web Map Tile Service + OGC WMTS + 1.0.0 + none + http://data.wien.gv.at/nutzungsbedingungen + + + Magistrat Wien + + + Gerhard Sommer + + + + + + + + + + RESTful + + + + + + + RESTful + + + + + + + RESTful + + + + + + + RESTful + + + + + + + RESTful + + + + + + + + + + + + + RESTful + + + + + + + RESTful + + + + + + + RESTful + + + + + + + RESTful + + + + + + + RESTful + + + + + + + + + + Luftbild + + 16.17 48.10 + 16.58 48.33 + + lb + + image/jpeg + + google3857 + + + + + + + + + MZK Flächen + + 16.17 48.10 + 16.58 48.33 + + fmzk + + image/jpeg + + google3857 + + + + + + + + + Flächenwidmungs- und Bebauungsplan + + 16.17 48.10 + 16.58 48.33 + + flwbplmzk + + image/jpeg + + google3857 + + + + + + + + + Beschriftung + + 16.17 48.10 + 16.58 48.33 + + beschriftung + + image/png + + google3857 + + + + + + + + + + google3857 + + 1799448.394855 6124949.747770 + 1848250.442089 6162571.828177 + + urn:ogc:def:crs:EPSG:6.18:3:3857 + urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible + + 0 + 559082264.029 + -20037508.3428 20037508.3428 + 256 + 256 + 1 + 1 + + + 1 + 279541132.015 + -20037508.3428 20037508.3428 + 256 + 256 + 2 + 2 + + + 2 + 139770566.007 + -20037508.3428 20037508.3428 + 256 + 256 + 4 + 4 + + + 3 + 69885283.0036 + -20037508.3428 20037508.3428 + 256 + 256 + 8 + 8 + + + 4 + 34942641.5018 + -20037508.3428 20037508.3428 + 256 + 256 + 16 + 16 + + + 5 + 17471320.7509 + -20037508.3428 20037508.3428 + 256 + 256 + 32 + 32 + + + 6 + 8735660.37545 + -20037508.3428 20037508.3428 + 256 + 256 + 64 + 64 + + + 7 + 4367830.18773 + -20037508.3428 20037508.3428 + 256 + 256 + 128 + 128 + + + 8 + 2183915.09386 + -20037508.3428 20037508.3428 + 256 + 256 + 256 + 256 + + + 9 + 1091957.54693 + -20037508.3428 20037508.3428 + 256 + 256 + 512 + 512 + + + 10 + 545978.773466 + -20037508.3428 20037508.3428 + 256 + 256 + 1024 + 1024 + + + 11 + 272989.386733 + -20037508.3428 20037508.3428 + 256 + 256 + 2048 + 2048 + + + 12 + 136494.693366 + -20037508.3428 20037508.3428 + 256 + 256 + 4096 + 4096 + + + 13 + 68247.3466832 + -20037508.3428 20037508.3428 + 256 + 256 + 8192 + 8192 + + + 14 + 34123.6733416 + -20037508.3428 20037508.3428 + 256 + 256 + 16384 + 16384 + + + 15 + 17061.8366708 + -20037508.3428 20037508.3428 + 256 + 256 + 32768 + 32768 + + + 16 + 8530.91833540 + -20037508.3428 20037508.3428 + 256 + 256 + 65536 + 65536 + + + 17 + 4265.45916770 + -20037508.3428 20037508.3428 + 256 + 256 + 131072 + 131072 + + + 18 + 2132.72958385 + -20037508.3428 20037508.3428 + 256 + 256 + 262144 + 262144 + + + 19 + 1066.36479193 + -20037508.3428 20037508.3428 + 256 + 256 + 524288 + 524288 + + + + + \ No newline at end of file diff --git a/float-no-zero/examples/data/geojson/countries.geojson b/float-no-zero/examples/data/geojson/countries.geojson new file mode 100644 index 0000000000..b27f2ecacb --- /dev/null +++ b/float-no-zero/examples/data/geojson/countries.geojson @@ -0,0 +1,181 @@ +{"type":"FeatureCollection","features":[ +{"type":"Feature","id":"AFG","properties":{"name":"Afghanistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[62.230651,35.270664],[62.984662,35.404041],[63.193538,35.857166],[63.982896,36.007957],[64.546479,36.312073],[64.746105,37.111818],[65.588948,37.305217],[65.745631,37.661164],[66.217385,37.39379],[66.518607,37.362784],[67.075782,37.356144],[67.83,37.144994],[68.135562,37.023115],[68.859446,37.344336],[69.196273,37.151144],[69.518785,37.608997],[70.116578,37.588223],[70.270574,37.735165],[70.376304,38.138396],[70.806821,38.486282],[71.348131,38.258905],[71.239404,37.953265],[71.541918,37.905774],[71.448693,37.065645],[71.844638,36.738171],[72.193041,36.948288],[72.63689,37.047558],[73.260056,37.495257],[73.948696,37.421566],[74.980002,37.41999],[75.158028,37.133031],[74.575893,37.020841],[74.067552,36.836176],[72.920025,36.720007],[71.846292,36.509942],[71.262348,36.074388],[71.498768,35.650563],[71.613076,35.153203],[71.115019,34.733126],[71.156773,34.348911],[70.881803,33.988856],[69.930543,34.02012],[70.323594,33.358533],[69.687147,33.105499],[69.262522,32.501944],[69.317764,31.901412],[68.926677,31.620189],[68.556932,31.71331],[67.792689,31.58293],[67.683394,31.303154],[66.938891,31.304911],[66.381458,30.738899],[66.346473,29.887943],[65.046862,29.472181],[64.350419,29.560031],[64.148002,29.340819],[63.550261,29.468331],[62.549857,29.318572],[60.874248,29.829239],[61.781222,30.73585],[61.699314,31.379506],[60.941945,31.548075],[60.863655,32.18292],[60.536078,32.981269],[60.9637,33.528832],[60.52843,33.676446],[60.803193,34.404102],[61.210817,35.650072]]]}}, +{"type":"Feature","id":"AGO","properties":{"name":"Angola"},"geometry":{"type":"MultiPolygon","coordinates":[[[[16.326528,-5.87747],[16.57318,-6.622645],[16.860191,-7.222298],[17.089996,-7.545689],[17.47297,-8.068551],[18.134222,-7.987678],[18.464176,-7.847014],[19.016752,-7.988246],[19.166613,-7.738184],[19.417502,-7.155429],[20.037723,-7.116361],[20.091622,-6.94309],[20.601823,-6.939318],[20.514748,-7.299606],[21.728111,-7.290872],[21.746456,-7.920085],[21.949131,-8.305901],[21.801801,-8.908707],[21.875182,-9.523708],[22.208753,-9.894796],[22.155268,-11.084801],[22.402798,-10.993075],[22.837345,-11.017622],[23.456791,-10.867863],[23.912215,-10.926826],[24.017894,-11.237298],[23.904154,-11.722282],[24.079905,-12.191297],[23.930922,-12.565848],[24.016137,-12.911046],[21.933886,-12.898437],[21.887843,-16.08031],[22.562478,-16.898451],[23.215048,-17.523116],[21.377176,-17.930636],[18.956187,-17.789095],[18.263309,-17.309951],[14.209707,-17.353101],[14.058501,-17.423381],[13.462362,-16.971212],[12.814081,-16.941343],[12.215461,-17.111668],[11.734199,-17.301889],[11.640096,-16.673142],[11.778537,-15.793816],[12.123581,-14.878316],[12.175619,-14.449144],[12.500095,-13.5477],[12.738479,-13.137906],[13.312914,-12.48363],[13.633721,-12.038645],[13.738728,-11.297863],[13.686379,-10.731076],[13.387328,-10.373578],[13.120988,-9.766897],[12.87537,-9.166934],[12.929061,-8.959091],[13.236433,-8.562629],[12.93304,-7.596539],[12.728298,-6.927122],[12.227347,-6.294448],[12.322432,-6.100092],[12.735171,-5.965682],[13.024869,-5.984389],[13.375597,-5.864241],[16.326528,-5.87747]]],[[[12.436688,-5.684304],[12.182337,-5.789931],[11.914963,-5.037987],[12.318608,-4.60623],[12.62076,-4.438023],[12.995517,-4.781103],[12.631612,-4.991271],[12.468004,-5.248362],[12.436688,-5.684304]]]]}}, +{"type":"Feature","id":"ALB","properties":{"name":"Albania"},"geometry":{"type":"Polygon","coordinates":[[[20.590247,41.855404],[20.463175,41.515089],[20.605182,41.086226],[21.02004,40.842727],[20.99999,40.580004],[20.674997,40.435],[20.615,40.110007],[20.150016,39.624998],[19.98,39.694993],[19.960002,39.915006],[19.406082,40.250773],[19.319059,40.72723],[19.40355,41.409566],[19.540027,41.719986],[19.371769,41.877548],[19.304486,42.195745],[19.738051,42.688247],[19.801613,42.500093],[20.0707,42.58863],[20.283755,42.32026],[20.52295,42.21787],[20.590247,41.855404]]]}}, +{"type":"Feature","id":"ARE","properties":{"name":"United Arab Emirates"},"geometry":{"type":"Polygon","coordinates":[[[51.579519,24.245497],[51.757441,24.294073],[51.794389,24.019826],[52.577081,24.177439],[53.404007,24.151317],[54.008001,24.121758],[54.693024,24.797892],[55.439025,25.439145],[56.070821,26.055464],[56.261042,25.714606],[56.396847,24.924732],[55.886233,24.920831],[55.804119,24.269604],[55.981214,24.130543],[55.528632,23.933604],[55.525841,23.524869],[55.234489,23.110993],[55.208341,22.70833],[55.006803,22.496948],[52.000733,23.001154],[51.617708,24.014219],[51.579519,24.245497]]]}}, +{"type":"Feature","id":"ARG","properties":{"name":"Argentina"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.5,-55.2],[-66.45,-55.25],[-66.95992,-54.89681],[-67.56244,-54.87001],[-68.63335,-54.8695],[-68.63401,-52.63637],[-68.25,-53.1],[-67.75,-53.85],[-66.45,-54.45],[-65.05,-54.7],[-65.5,-55.2]]],[[[-64.964892,-22.075862],[-64.377021,-22.798091],[-63.986838,-21.993644],[-62.846468,-22.034985],[-62.685057,-22.249029],[-60.846565,-23.880713],[-60.028966,-24.032796],[-58.807128,-24.771459],[-57.777217,-25.16234],[-57.63366,-25.603657],[-58.618174,-27.123719],[-57.60976,-27.395899],[-56.486702,-27.548499],[-55.695846,-27.387837],[-54.788795,-26.621786],[-54.625291,-25.739255],[-54.13005,-25.547639],[-53.628349,-26.124865],[-53.648735,-26.923473],[-54.490725,-27.474757],[-55.162286,-27.881915],[-56.2909,-28.852761],[-57.625133,-30.216295],[-57.874937,-31.016556],[-58.14244,-32.044504],[-58.132648,-33.040567],[-58.349611,-33.263189],[-58.427074,-33.909454],[-58.495442,-34.43149],[-57.22583,-35.288027],[-57.362359,-35.97739],[-56.737487,-36.413126],[-56.788285,-36.901572],[-57.749157,-38.183871],[-59.231857,-38.72022],[-61.237445,-38.928425],[-62.335957,-38.827707],[-62.125763,-39.424105],[-62.330531,-40.172586],[-62.145994,-40.676897],[-62.745803,-41.028761],[-63.770495,-41.166789],[-64.73209,-40.802677],[-65.118035,-41.064315],[-64.978561,-42.058001],[-64.303408,-42.359016],[-63.755948,-42.043687],[-63.458059,-42.563138],[-64.378804,-42.873558],[-65.181804,-43.495381],[-65.328823,-44.501366],[-65.565269,-45.036786],[-66.509966,-45.039628],[-67.293794,-45.551896],[-67.580546,-46.301773],[-66.597066,-47.033925],[-65.641027,-47.236135],[-65.985088,-48.133289],[-67.166179,-48.697337],[-67.816088,-49.869669],[-68.728745,-50.264218],[-69.138539,-50.73251],[-68.815561,-51.771104],[-68.149995,-52.349983],[-68.571545,-52.299444],[-69.498362,-52.142761],[-71.914804,-52.009022],[-72.329404,-51.425956],[-72.309974,-50.67701],[-72.975747,-50.74145],[-73.328051,-50.378785],[-73.415436,-49.318436],[-72.648247,-48.878618],[-72.331161,-48.244238],[-72.447355,-47.738533],[-71.917258,-46.884838],[-71.552009,-45.560733],[-71.659316,-44.973689],[-71.222779,-44.784243],[-71.329801,-44.407522],[-71.793623,-44.207172],[-71.464056,-43.787611],[-71.915424,-43.408565],[-72.148898,-42.254888],[-71.746804,-42.051386],[-71.915734,-40.832339],[-71.680761,-39.808164],[-71.413517,-38.916022],[-70.814664,-38.552995],[-71.118625,-37.576827],[-71.121881,-36.658124],[-70.364769,-36.005089],[-70.388049,-35.169688],[-69.817309,-34.193571],[-69.814777,-33.273886],[-70.074399,-33.09121],[-70.535069,-31.36501],[-69.919008,-30.336339],[-70.01355,-29.367923],[-69.65613,-28.459141],[-69.001235,-27.521214],[-68.295542,-26.89934],[-68.5948,-26.506909],[-68.386001,-26.185016],[-68.417653,-24.518555],[-67.328443,-24.025303],[-66.985234,-22.986349],[-67.106674,-22.735925],[-66.273339,-21.83231],[-64.964892,-22.075862]]]]}}, +{"type":"Feature","id":"ARM","properties":{"name":"Armenia"},"geometry":{"type":"Polygon","coordinates":[[[43.582746,41.092143],[44.97248,41.248129],[45.179496,40.985354],[45.560351,40.81229],[45.359175,40.561504],[45.891907,40.218476],[45.610012,39.899994],[46.034534,39.628021],[46.483499,39.464155],[46.50572,38.770605],[46.143623,38.741201],[45.735379,39.319719],[45.739978,39.473999],[45.298145,39.471751],[45.001987,39.740004],[44.79399,39.713003],[44.400009,40.005],[43.656436,40.253564],[43.752658,40.740201],[43.582746,41.092143]]]}}, +{"type":"Feature","id":"ATA","properties":{"name":"Antarctica"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.572095,-80.040179],[-59.865849,-80.549657],[-60.159656,-81.000327],[-62.255393,-80.863178],[-64.488125,-80.921934],[-65.741666,-80.588827],[-65.741666,-80.549657],[-66.290031,-80.255773],[-64.037688,-80.294944],[-61.883246,-80.39287],[-61.138976,-79.981371],[-60.610119,-79.628679],[-59.572095,-80.040179]]],[[[-159.208184,-79.497059],[-161.127601,-79.634209],[-162.439847,-79.281465],[-163.027408,-78.928774],[-163.066604,-78.869966],[-163.712896,-78.595667],[-163.712896,-78.595667],[-163.105801,-78.223338],[-161.245113,-78.380176],[-160.246208,-78.693645],[-159.482405,-79.046338],[-159.208184,-79.497059]]],[[[-45.154758,-78.04707],[-43.920828,-78.478103],[-43.48995,-79.08556],[-43.372438,-79.516645],[-43.333267,-80.026123],[-44.880537,-80.339644],[-46.506174,-80.594357],[-48.386421,-80.829485],[-50.482107,-81.025442],[-52.851988,-80.966685],[-54.164259,-80.633528],[-53.987991,-80.222028],[-51.853134,-79.94773],[-50.991326,-79.614623],[-50.364595,-79.183487],[-49.914131,-78.811209],[-49.306959,-78.458569],[-48.660616,-78.047018],[-48.660616,-78.047019],[-48.151396,-78.04707],[-46.662857,-77.831476],[-45.154758,-78.04707]]],[[[-121.211511,-73.50099],[-119.918851,-73.657725],[-118.724143,-73.481353],[-119.292119,-73.834097],[-120.232217,-74.08881],[-121.62283,-74.010468],[-122.621735,-73.657778],[-122.621735,-73.657777],[-122.406245,-73.324619],[-121.211511,-73.50099]]],[[[-125.559566,-73.481353],[-124.031882,-73.873268],[-124.619469,-73.834097],[-125.912181,-73.736118],[-127.28313,-73.461769],[-127.28313,-73.461768],[-126.558472,-73.246226],[-125.559566,-73.481353]]],[[[-98.98155,-71.933334],[-97.884743,-72.070535],[-96.787937,-71.952971],[-96.20035,-72.521205],[-96.983765,-72.442864],[-98.198083,-72.482035],[-99.432013,-72.442864],[-100.783455,-72.50162],[-101.801868,-72.305663],[-102.330725,-71.894164],[-102.330725,-71.894164],[-101.703967,-71.717792],[-100.430919,-71.854993],[-98.98155,-71.933334]]],[[[-68.451346,-70.955823],[-68.333834,-71.406493],[-68.510128,-71.798407],[-68.784297,-72.170736],[-69.959471,-72.307885],[-71.075889,-72.503842],[-72.388134,-72.484257],[-71.8985,-72.092343],[-73.073622,-72.229492],[-74.19004,-72.366693],[-74.953895,-72.072757],[-75.012625,-71.661258],[-73.915819,-71.269345],[-73.915819,-71.269344],[-73.230331,-71.15178],[-72.074717,-71.190951],[-71.780962,-70.681473],[-71.72218,-70.309196],[-71.741791,-69.505782],[-71.173815,-69.035475],[-70.253252,-68.87874],[-69.724447,-69.251017],[-69.489422,-69.623346],[-69.058518,-70.074016],[-68.725541,-70.505153],[-68.451346,-70.955823]]],[[[-58.614143,-64.152467],[-59.045073,-64.36801],[-59.789342,-64.211223],[-60.611928,-64.309202],[-61.297416,-64.54433],[-62.0221,-64.799094],[-62.51176,-65.09303],[-62.648858,-65.484942],[-62.590128,-65.857219],[-62.120079,-66.190326],[-62.805567,-66.425505],[-63.74569,-66.503847],[-64.294106,-66.837004],[-64.881693,-67.150474],[-65.508425,-67.58161],[-65.665082,-67.953887],[-65.312545,-68.365335],[-64.783715,-68.678908],[-63.961103,-68.913984],[-63.1973,-69.227556],[-62.785955,-69.619419],[-62.570516,-69.991747],[-62.276736,-70.383661],[-61.806661,-70.716768],[-61.512906,-71.089045],[-61.375809,-72.010074],[-61.081977,-72.382351],[-61.003661,-72.774265],[-60.690269,-73.166179],[-60.827367,-73.695242],[-61.375809,-74.106742],[-61.96337,-74.439848],[-63.295201,-74.576997],[-63.74569,-74.92974],[-64.352836,-75.262847],[-65.860987,-75.635124],[-67.192818,-75.79191],[-68.446282,-76.007452],[-69.797724,-76.222995],[-70.600724,-76.634494],[-72.206776,-76.673665],[-73.969536,-76.634494],[-75.555977,-76.712887],[-77.24037,-76.712887],[-76.926979,-77.104802],[-75.399294,-77.28107],[-74.282876,-77.55542],[-73.656119,-77.908112],[-74.772536,-78.221633],[-76.4961,-78.123654],[-77.925858,-78.378419],[-77.984666,-78.789918],[-78.023785,-79.181833],[-76.848637,-79.514939],[-76.633224,-79.887216],[-75.360097,-80.259545],[-73.244852,-80.416331],[-71.442946,-80.69063],[-70.013163,-81.004151],[-68.191646,-81.317672],[-65.704279,-81.474458],[-63.25603,-81.748757],[-61.552026,-82.042692],[-59.691416,-82.37585],[-58.712121,-82.846106],[-58.222487,-83.218434],[-57.008117,-82.865691],[-55.362894,-82.571755],[-53.619771,-82.258235],[-51.543644,-82.003521],[-49.76135,-81.729171],[-47.273931,-81.709586],[-44.825708,-81.846735],[-42.808363,-82.081915],[-42.16202,-81.65083],[-40.771433,-81.356894],[-38.244818,-81.337309],[-36.26667,-81.121715],[-34.386397,-80.906172],[-32.310296,-80.769023],[-30.097098,-80.592651],[-28.549802,-80.337938],[-29.254901,-79.985195],[-29.685805,-79.632503],[-29.685805,-79.260226],[-31.624808,-79.299397],[-33.681324,-79.456132],[-35.639912,-79.456132],[-35.914107,-79.083855],[-35.77701,-78.339248],[-35.326546,-78.123654],[-33.896763,-77.888526],[-32.212369,-77.65345],[-30.998051,-77.359515],[-29.783732,-77.065579],[-28.882779,-76.673665],[-27.511752,-76.497345],[-26.160336,-76.360144],[-25.474822,-76.281803],[-23.927552,-76.24258],[-22.458598,-76.105431],[-21.224694,-75.909474],[-20.010375,-75.674346],[-18.913543,-75.439218],[-17.522982,-75.125698],[-16.641589,-74.79254],[-15.701491,-74.498604],[-15.40771,-74.106742],[-16.46532,-73.871614],[-16.112784,-73.460114],[-15.446855,-73.146542],[-14.408805,-72.950585],[-13.311973,-72.715457],[-12.293508,-72.401936],[-11.510067,-72.010074],[-11.020433,-71.539767],[-10.295774,-71.265416],[-9.101015,-71.324224],[-8.611381,-71.65733],[-7.416622,-71.696501],[-7.377451,-71.324224],[-6.868232,-70.93231],[-5.790985,-71.030289],[-5.536375,-71.402617],[-4.341667,-71.461373],[-3.048981,-71.285053],[-1.795492,-71.167438],[-0.659489,-71.226246],[-0.228637,-71.637745],[0.868195,-71.304639],[1.886686,-71.128267],[3.022638,-70.991118],[4.139055,-70.853917],[5.157546,-70.618789],[6.273912,-70.462055],[7.13572,-70.246512],[7.742866,-69.893769],[8.48711,-70.148534],[9.525135,-70.011333],[10.249845,-70.48164],[10.817821,-70.834332],[11.953824,-70.638375],[12.404287,-70.246512],[13.422778,-69.972162],[14.734998,-70.030918],[15.126757,-70.403247],[15.949342,-70.030918],[17.026589,-69.913354],[18.201711,-69.874183],[19.259373,-69.893769],[20.375739,-70.011333],[21.452985,-70.07014],[21.923034,-70.403247],[22.569403,-70.697182],[23.666184,-70.520811],[24.841357,-70.48164],[25.977309,-70.48164],[27.093726,-70.462055],[28.09258,-70.324854],[29.150242,-70.20729],[30.031583,-69.93294],[30.971733,-69.75662],[31.990172,-69.658641],[32.754053,-69.384291],[33.302443,-68.835642],[33.870419,-68.502588],[34.908495,-68.659271],[35.300202,-69.012014],[36.16201,-69.247142],[37.200035,-69.168748],[37.905108,-69.52144],[38.649404,-69.776205],[39.667894,-69.541077],[40.020431,-69.109941],[40.921358,-68.933621],[41.959434,-68.600514],[42.938702,-68.463313],[44.113876,-68.267408],[44.897291,-68.051866],[45.719928,-67.816738],[46.503343,-67.601196],[47.44344,-67.718759],[48.344419,-67.366068],[48.990736,-67.091718],[49.930885,-67.111303],[50.753471,-66.876175],[50.949325,-66.523484],[51.791547,-66.249133],[52.614133,-66.053176],[53.613038,-65.89639],[54.53355,-65.818049],[55.414943,-65.876805],[56.355041,-65.974783],[57.158093,-66.249133],[57.255968,-66.680218],[58.137361,-67.013324],[58.744508,-67.287675],[59.939318,-67.405239],[60.605221,-67.679589],[61.427806,-67.953887],[62.387489,-68.012695],[63.19049,-67.816738],[64.052349,-67.405239],[64.992447,-67.620729],[65.971715,-67.738345],[66.911864,-67.855909],[67.891133,-67.934302],[68.890038,-67.934302],[69.712624,-68.972791],[69.673453,-69.227556],[69.555941,-69.678226],[68.596258,-69.93294],[67.81274,-70.305268],[67.949889,-70.697182],[69.066307,-70.677545],[68.929157,-71.069459],[68.419989,-71.441788],[67.949889,-71.853287],[68.71377,-72.166808],[69.869307,-72.264787],[71.024895,-72.088415],[71.573285,-71.696501],[71.906288,-71.324224],[72.454627,-71.010703],[73.08141,-70.716768],[73.33602,-70.364024],[73.864877,-69.874183],[74.491557,-69.776205],[75.62756,-69.737034],[76.626465,-69.619419],[77.644904,-69.462684],[78.134539,-69.07077],[78.428371,-68.698441],[79.113859,-68.326216],[80.093127,-68.071503],[80.93535,-67.875546],[81.483792,-67.542388],[82.051767,-67.366068],[82.776426,-67.209282],[83.775331,-67.30726],[84.676206,-67.209282],[85.655527,-67.091718],[86.752359,-67.150474],[87.477017,-66.876175],[87.986289,-66.209911],[88.358411,-66.484261],[88.828408,-66.954568],[89.67063,-67.150474],[90.630365,-67.228867],[91.5901,-67.111303],[92.608539,-67.189696],[93.548637,-67.209282],[94.17542,-67.111303],[95.017591,-67.170111],[95.781472,-67.385653],[96.682399,-67.248504],[97.759646,-67.248504],[98.68021,-67.111303],[99.718182,-67.248504],[100.384188,-66.915346],[100.893356,-66.58224],[101.578896,-66.30789],[102.832411,-65.563284],[103.478676,-65.700485],[104.242557,-65.974783],[104.90846,-66.327527],[106.181561,-66.934931],[107.160881,-66.954568],[108.081393,-66.954568],[109.15864,-66.837004],[110.235835,-66.699804],[111.058472,-66.425505],[111.74396,-66.13157],[112.860378,-66.092347],[113.604673,-65.876805],[114.388088,-66.072762],[114.897308,-66.386283],[115.602381,-66.699804],[116.699161,-66.660633],[117.384701,-66.915346],[118.57946,-67.170111],[119.832924,-67.268089],[120.871,-67.189696],[121.654415,-66.876175],[122.320369,-66.562654],[123.221296,-66.484261],[124.122274,-66.621462],[125.160247,-66.719389],[126.100396,-66.562654],[127.001427,-66.562654],[127.882768,-66.660633],[128.80328,-66.758611],[129.704259,-66.58224],[130.781454,-66.425505],[131.799945,-66.386283],[132.935896,-66.386283],[133.85646,-66.288304],[134.757387,-66.209963],[135.031582,-65.72007],[135.070753,-65.308571],[135.697485,-65.582869],[135.873805,-66.033591],[136.206705,-66.44509],[136.618049,-66.778197],[137.460271,-66.954568],[138.596223,-66.895761],[139.908442,-66.876175],[140.809421,-66.817367],[142.121692,-66.817367],[143.061842,-66.797782],[144.374061,-66.837004],[145.490427,-66.915346],[146.195552,-67.228867],[145.999699,-67.601196],[146.646067,-67.895131],[147.723263,-68.130259],[148.839629,-68.385024],[150.132314,-68.561292],[151.483705,-68.71813],[152.502247,-68.874813],[153.638199,-68.894502],[154.284567,-68.561292],[155.165857,-68.835642],[155.92979,-69.149215],[156.811132,-69.384291],[158.025528,-69.482269],[159.181013,-69.599833],[159.670699,-69.991747],[160.80665,-70.226875],[161.570479,-70.579618],[162.686897,-70.736353],[163.842434,-70.716768],[164.919681,-70.775524],[166.11444,-70.755938],[167.309095,-70.834332],[168.425616,-70.971481],[169.463589,-71.20666],[170.501665,-71.402617],[171.20679,-71.696501],[171.089227,-72.088415],[170.560422,-72.441159],[170.109958,-72.891829],[169.75737,-73.24452],[169.287321,-73.65602],[167.975101,-73.812806],[167.387489,-74.165498],[166.094803,-74.38104],[165.644391,-74.772954],[164.958851,-75.145283],[164.234193,-75.458804],[163.822797,-75.870303],[163.568239,-76.24258],[163.47026,-76.693302],[163.489897,-77.065579],[164.057873,-77.457442],[164.273363,-77.82977],[164.743464,-78.182514],[166.604126,-78.319611],[166.995781,-78.750748],[165.193876,-78.907483],[163.666217,-79.123025],[161.766385,-79.162248],[160.924162,-79.730482],[160.747894,-80.200737],[160.316964,-80.573066],[159.788211,-80.945395],[161.120016,-81.278501],[161.629287,-81.690001],[162.490992,-82.062278],[163.705336,-82.395435],[165.095949,-82.708956],[166.604126,-83.022477],[168.895665,-83.335998],[169.404782,-83.825891],[172.283934,-84.041433],[172.477049,-84.117914],[173.224083,-84.41371],[175.985672,-84.158997],[178.277212,-84.472518],[180,-84.71338],[-179.942499,-84.721443],[-179.058677,-84.139412],[-177.256772,-84.452933],[-177.140807,-84.417941],[-176.084673,-84.099259],[-175.947235,-84.110449],[-175.829882,-84.117914],[-174.382503,-84.534323],[-173.116559,-84.117914],[-172.889106,-84.061019],[-169.951223,-83.884647],[-168.999989,-84.117914],[-168.530199,-84.23739],[-167.022099,-84.570497],[-164.182144,-84.82521],[-161.929775,-85.138731],[-158.07138,-85.37391],[-155.192253,-85.09956],[-150.942099,-85.295517],[-148.533073,-85.609038],[-145.888918,-85.315102],[-143.107718,-85.040752],[-142.892279,-84.570497],[-146.829068,-84.531274],[-150.060732,-84.296146],[-150.902928,-83.904232],[-153.586201,-83.68869],[-153.409907,-83.23802],[-153.037759,-82.82652],[-152.665637,-82.454192],[-152.861517,-82.042692],[-154.526299,-81.768394],[-155.29018,-81.41565],[-156.83745,-81.102129],[-154.408787,-81.160937],[-152.097662,-81.004151],[-150.648293,-81.337309],[-148.865998,-81.043373],[-147.22075,-80.671045],[-146.417749,-80.337938],[-146.770286,-79.926439],[-148.062947,-79.652089],[-149.531901,-79.358205],[-151.588416,-79.299397],[-153.390322,-79.162248],[-155.329376,-79.064269],[-155.975668,-78.69194],[-157.268302,-78.378419],[-158.051768,-78.025676],[-158.365134,-76.889207],[-157.875474,-76.987238],[-156.974573,-77.300759],[-155.329376,-77.202728],[-153.742832,-77.065579],[-152.920247,-77.496664],[-151.33378,-77.398737],[-150.00195,-77.183143],[-148.748486,-76.908845],[-147.612483,-76.575738],[-146.104409,-76.47776],[-146.143528,-76.105431],[-146.496091,-75.733154],[-146.20231,-75.380411],[-144.909624,-75.204039],[-144.322037,-75.537197],[-142.794353,-75.34124],[-141.638764,-75.086475],[-140.209007,-75.06689],[-138.85759,-74.968911],[-137.5062,-74.733783],[-136.428901,-74.518241],[-135.214583,-74.302699],[-134.431194,-74.361455],[-133.745654,-74.439848],[-132.257168,-74.302699],[-130.925311,-74.479019],[-129.554284,-74.459433],[-128.242038,-74.322284],[-126.890622,-74.420263],[-125.402082,-74.518241],[-124.011496,-74.479019],[-122.562152,-74.498604],[-121.073613,-74.518241],[-119.70256,-74.479019],[-118.684145,-74.185083],[-117.469801,-74.028348],[-116.216312,-74.243891],[-115.021552,-74.067519],[-113.944331,-73.714828],[-113.297988,-74.028348],[-112.945452,-74.38104],[-112.299083,-74.714198],[-111.261059,-74.420263],[-110.066325,-74.79254],[-108.714909,-74.910103],[-107.559346,-75.184454],[-106.149148,-75.125698],[-104.876074,-74.949326],[-103.367949,-74.988497],[-102.016507,-75.125698],[-100.645531,-75.302018],[-100.1167,-74.870933],[-100.763043,-74.537826],[-101.252703,-74.185083],[-102.545337,-74.106742],[-103.113313,-73.734413],[-103.328752,-73.362084],[-103.681289,-72.61753],[-102.917485,-72.754679],[-101.60524,-72.813436],[-100.312528,-72.754679],[-99.13738,-72.911414],[-98.118889,-73.20535],[-97.688037,-73.558041],[-96.336595,-73.616849],[-95.043961,-73.4797],[-93.672907,-73.283743],[-92.439003,-73.166179],[-91.420564,-73.401307],[-90.088733,-73.322914],[-89.226951,-72.558722],[-88.423951,-73.009393],[-87.268337,-73.185764],[-86.014822,-73.087786],[-85.192236,-73.4797],[-83.879991,-73.518871],[-82.665646,-73.636434],[-81.470913,-73.851977],[-80.687447,-73.4797],[-80.295791,-73.126956],[-79.296886,-73.518871],[-77.925858,-73.420892],[-76.907367,-73.636434],[-76.221879,-73.969541],[-74.890049,-73.871614],[-73.852024,-73.65602],[-72.833533,-73.401307],[-71.619215,-73.264157],[-70.209042,-73.146542],[-68.935916,-73.009393],[-67.956622,-72.79385],[-67.369061,-72.480329],[-67.134036,-72.049244],[-67.251548,-71.637745],[-67.56494,-71.245831],[-67.917477,-70.853917],[-68.230843,-70.462055],[-68.485452,-70.109311],[-68.544209,-69.717397],[-68.446282,-69.325535],[-67.976233,-68.953206],[-67.5845,-68.541707],[-67.427843,-68.149844],[-67.62367,-67.718759],[-67.741183,-67.326845],[-67.251548,-66.876175],[-66.703184,-66.58224],[-66.056815,-66.209963],[-65.371327,-65.89639],[-64.568276,-65.602506],[-64.176542,-65.171423],[-63.628152,-64.897073],[-63.001394,-64.642308],[-62.041686,-64.583552],[-61.414928,-64.270031],[-60.709855,-64.074074],[-59.887269,-63.95651],[-59.162585,-63.701745],[-58.594557,-63.388224],[-57.811143,-63.27066],[-57.223582,-63.525425],[-57.59573,-63.858532],[-58.614143,-64.152467]]]]}}, +{"type":"Feature","id":"ATF","properties":{"name":"French Southern and Antarctic Lands"},"geometry":{"type":"Polygon","coordinates":[[[68.935,-48.625],[69.58,-48.94],[70.525,-49.065],[70.56,-49.255],[70.28,-49.71],[68.745,-49.775],[68.72,-49.2425],[68.8675,-48.83],[68.935,-48.625]]]}}, +{"type":"Feature","id":"AUS","properties":{"name":"Australia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[145.397978,-40.792549],[146.364121,-41.137695],[146.908584,-41.000546],[147.689259,-40.808258],[148.289068,-40.875438],[148.359865,-42.062445],[148.017301,-42.407024],[147.914052,-43.211522],[147.564564,-42.937689],[146.870343,-43.634597],[146.663327,-43.580854],[146.048378,-43.549745],[145.43193,-42.693776],[145.29509,-42.03361],[144.718071,-41.162552],[144.743755,-40.703975],[145.397978,-40.792549]]],[[[143.561811,-13.763656],[143.922099,-14.548311],[144.563714,-14.171176],[144.894908,-14.594458],[145.374724,-14.984976],[145.271991,-15.428205],[145.48526,-16.285672],[145.637033,-16.784918],[145.888904,-16.906926],[146.160309,-17.761655],[146.063674,-18.280073],[146.387478,-18.958274],[147.471082,-19.480723],[148.177602,-19.955939],[148.848414,-20.39121],[148.717465,-20.633469],[149.28942,-21.260511],[149.678337,-22.342512],[150.077382,-22.122784],[150.482939,-22.556142],[150.727265,-22.402405],[150.899554,-23.462237],[151.609175,-24.076256],[152.07354,-24.457887],[152.855197,-25.267501],[153.136162,-26.071173],[153.161949,-26.641319],[153.092909,-27.2603],[153.569469,-28.110067],[153.512108,-28.995077],[153.339095,-29.458202],[153.069241,-30.35024],[153.089602,-30.923642],[152.891578,-31.640446],[152.450002,-32.550003],[151.709117,-33.041342],[151.343972,-33.816023],[151.010555,-34.31036],[150.714139,-35.17346],[150.32822,-35.671879],[150.075212,-36.420206],[149.946124,-37.109052],[149.997284,-37.425261],[149.423882,-37.772681],[148.304622,-37.809061],[147.381733,-38.219217],[146.922123,-38.606532],[146.317922,-39.035757],[145.489652,-38.593768],[144.876976,-38.417448],[145.032212,-37.896188],[144.485682,-38.085324],[143.609974,-38.809465],[142.745427,-38.538268],[142.17833,-38.380034],[141.606582,-38.308514],[140.638579,-38.019333],[139.992158,-37.402936],[139.806588,-36.643603],[139.574148,-36.138362],[139.082808,-35.732754],[138.120748,-35.612296],[138.449462,-35.127261],[138.207564,-34.384723],[137.71917,-35.076825],[136.829406,-35.260535],[137.352371,-34.707339],[137.503886,-34.130268],[137.890116,-33.640479],[137.810328,-32.900007],[136.996837,-33.752771],[136.372069,-34.094766],[135.989043,-34.890118],[135.208213,-34.47867],[135.239218,-33.947953],[134.613417,-33.222778],[134.085904,-32.848072],[134.273903,-32.617234],[132.990777,-32.011224],[132.288081,-31.982647],[131.326331,-31.495803],[129.535794,-31.590423],[128.240938,-31.948489],[127.102867,-32.282267],[126.148714,-32.215966],[125.088623,-32.728751],[124.221648,-32.959487],[124.028947,-33.483847],[123.659667,-33.890179],[122.811036,-33.914467],[122.183064,-34.003402],[121.299191,-33.821036],[120.580268,-33.930177],[119.893695,-33.976065],[119.298899,-34.509366],[119.007341,-34.464149],[118.505718,-34.746819],[118.024972,-35.064733],[117.295507,-35.025459],[116.625109,-35.025097],[115.564347,-34.386428],[115.026809,-34.196517],[115.048616,-33.623425],[115.545123,-33.487258],[115.714674,-33.259572],[115.679379,-32.900369],[115.801645,-32.205062],[115.689611,-31.612437],[115.160909,-30.601594],[114.997043,-30.030725],[115.040038,-29.461095],[114.641974,-28.810231],[114.616498,-28.516399],[114.173579,-28.118077],[114.048884,-27.334765],[113.477498,-26.543134],[113.338953,-26.116545],[113.778358,-26.549025],[113.440962,-25.621278],[113.936901,-25.911235],[114.232852,-26.298446],[114.216161,-25.786281],[113.721255,-24.998939],[113.625344,-24.683971],[113.393523,-24.384764],[113.502044,-23.80635],[113.706993,-23.560215],[113.843418,-23.059987],[113.736552,-22.475475],[114.149756,-21.755881],[114.225307,-22.517488],[114.647762,-21.82952],[115.460167,-21.495173],[115.947373,-21.068688],[116.711615,-20.701682],[117.166316,-20.623599],[117.441545,-20.746899],[118.229559,-20.374208],[118.836085,-20.263311],[118.987807,-20.044203],[119.252494,-19.952942],[119.805225,-19.976506],[120.85622,-19.683708],[121.399856,-19.239756],[121.655138,-18.705318],[122.241665,-18.197649],[122.286624,-17.798603],[122.312772,-17.254967],[123.012574,-16.4052],[123.433789,-17.268558],[123.859345,-17.069035],[123.503242,-16.596506],[123.817073,-16.111316],[124.258287,-16.327944],[124.379726,-15.56706],[124.926153,-15.0751],[125.167275,-14.680396],[125.670087,-14.51007],[125.685796,-14.230656],[126.125149,-14.347341],[126.142823,-14.095987],[126.582589,-13.952791],[127.065867,-13.817968],[127.804633,-14.276906],[128.35969,-14.86917],[128.985543,-14.875991],[129.621473,-14.969784],[129.4096,-14.42067],[129.888641,-13.618703],[130.339466,-13.357376],[130.183506,-13.10752],[130.617795,-12.536392],[131.223495,-12.183649],[131.735091,-12.302453],[132.575298,-12.114041],[132.557212,-11.603012],[131.824698,-11.273782],[132.357224,-11.128519],[133.019561,-11.376411],[133.550846,-11.786515],[134.393068,-12.042365],[134.678632,-11.941183],[135.298491,-12.248606],[135.882693,-11.962267],[136.258381,-12.049342],[136.492475,-11.857209],[136.95162,-12.351959],[136.685125,-12.887223],[136.305407,-13.29123],[135.961758,-13.324509],[136.077617,-13.724278],[135.783836,-14.223989],[135.428664,-14.715432],[135.500184,-14.997741],[136.295175,-15.550265],[137.06536,-15.870762],[137.580471,-16.215082],[138.303217,-16.807604],[138.585164,-16.806622],[139.108543,-17.062679],[139.260575,-17.371601],[140.215245,-17.710805],[140.875463,-17.369069],[141.07111,-16.832047],[141.274095,-16.38887],[141.398222,-15.840532],[141.702183,-15.044921],[141.56338,-14.561333],[141.63552,-14.270395],[141.519869,-13.698078],[141.65092,-12.944688],[141.842691,-12.741548],[141.68699,-12.407614],[141.928629,-11.877466],[142.118488,-11.328042],[142.143706,-11.042737],[142.51526,-10.668186],[142.79731,-11.157355],[142.866763,-11.784707],[143.115947,-11.90563],[143.158632,-12.325656],[143.522124,-12.834358],[143.597158,-13.400422],[143.561811,-13.763656]]]]}}, +{"type":"Feature","id":"AUT","properties":{"name":"Austria"},"geometry":{"type":"Polygon","coordinates":[[[16.979667,48.123497],[16.903754,47.714866],[16.340584,47.712902],[16.534268,47.496171],[16.202298,46.852386],[16.011664,46.683611],[15.137092,46.658703],[14.632472,46.431817],[13.806475,46.509306],[12.376485,46.767559],[12.153088,47.115393],[11.164828,46.941579],[11.048556,46.751359],[10.442701,46.893546],[9.932448,46.920728],[9.47997,47.10281],[9.632932,47.347601],[9.594226,47.525058],[9.896068,47.580197],[10.402084,47.302488],[10.544504,47.566399],[11.426414,47.523766],[12.141357,47.703083],[12.62076,47.672388],[12.932627,47.467646],[13.025851,47.637584],[12.884103,48.289146],[13.243357,48.416115],[13.595946,48.877172],[14.338898,48.555305],[14.901447,48.964402],[15.253416,49.039074],[16.029647,48.733899],[16.499283,48.785808],[16.960288,48.596982],[16.879983,48.470013],[16.979667,48.123497]]]}}, +{"type":"Feature","id":"AZE","properties":{"name":"Azerbaijan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[45.001987,39.740004],[45.298145,39.471751],[45.739978,39.473999],[45.735379,39.319719],[46.143623,38.741201],[45.457722,38.874139],[44.952688,39.335765],[44.79399,39.713003],[45.001987,39.740004]]],[[[47.373315,41.219732],[47.815666,41.151416],[47.987283,41.405819],[48.584353,41.80887],[49.110264,41.282287],[49.618915,40.572924],[50.08483,40.526157],[50.392821,40.256561],[49.569202,40.176101],[49.395259,39.399482],[49.223228,39.049219],[48.856532,38.815486],[48.883249,38.320245],[48.634375,38.270378],[48.010744,38.794015],[48.355529,39.288765],[48.060095,39.582235],[47.685079,39.508364],[46.50572,38.770605],[46.483499,39.464155],[46.034534,39.628021],[45.610012,39.899994],[45.891907,40.218476],[45.359175,40.561504],[45.560351,40.81229],[45.179496,40.985354],[44.97248,41.248129],[45.217426,41.411452],[45.962601,41.123873],[46.501637,41.064445],[46.637908,41.181673],[46.145432,41.722802],[46.404951,41.860675],[46.686071,41.827137],[47.373315,41.219732]]]]}}, +{"type":"Feature","id":"BDI","properties":{"name":"Burundi"},"geometry":{"type":"Polygon","coordinates":[[[29.339998,-4.499983],[29.276384,-3.293907],[29.024926,-2.839258],[29.632176,-2.917858],[29.938359,-2.348487],[30.469696,-2.413858],[30.527677,-2.807632],[30.743013,-3.034285],[30.752263,-3.35933],[30.50556,-3.568567],[30.116333,-4.090138],[29.753512,-4.452389],[29.339998,-4.499983]]]}}, +{"type":"Feature","id":"BEL","properties":{"name":"Belgium"},"geometry":{"type":"Polygon","coordinates":[[[3.314971,51.345781],[4.047071,51.267259],[4.973991,51.475024],[5.606976,51.037298],[6.156658,50.803721],[6.043073,50.128052],[5.782417,50.090328],[5.674052,49.529484],[4.799222,49.985373],[4.286023,49.907497],[3.588184,50.378992],[3.123252,50.780363],[2.658422,50.796848],[2.513573,51.148506],[3.314971,51.345781]]]}}, +{"type":"Feature","id":"BEN","properties":{"name":"Benin"},"geometry":{"type":"Polygon","coordinates":[[[2.691702,6.258817],[1.865241,6.142158],[1.618951,6.832038],[1.664478,9.12859],[1.463043,9.334624],[1.425061,9.825395],[1.077795,10.175607],[0.772336,10.470808],[0.899563,10.997339],[1.24347,11.110511],[1.447178,11.547719],[1.935986,11.64115],[2.154474,11.94015],[2.490164,12.233052],[2.848643,12.235636],[3.61118,11.660167],[3.572216,11.327939],[3.797112,10.734746],[3.60007,10.332186],[3.705438,10.06321],[3.220352,9.444153],[2.912308,9.137608],[2.723793,8.506845],[2.749063,7.870734],[2.691702,6.258817]]]}}, +{"type":"Feature","id":"BFA","properties":{"name":"Burkina Faso"},"geometry":{"type":"Polygon","coordinates":[[[-2.827496,9.642461],[-3.511899,9.900326],[-3.980449,9.862344],[-4.330247,9.610835],[-4.779884,9.821985],[-4.954653,10.152714],[-5.404342,10.370737],[-5.470565,10.95127],[-5.197843,11.375146],[-5.220942,11.713859],[-4.427166,12.542646],[-4.280405,13.228444],[-4.006391,13.472485],[-3.522803,13.337662],[-3.103707,13.541267],[-2.967694,13.79815],[-2.191825,14.246418],[-2.001035,14.559008],[-1.066363,14.973815],[-0.515854,15.116158],[-0.266257,14.924309],[0.374892,14.928908],[0.295646,14.444235],[0.429928,13.988733],[0.993046,13.33575],[1.024103,12.851826],[2.177108,12.625018],[2.154474,11.94015],[1.935986,11.64115],[1.447178,11.547719],[1.24347,11.110511],[0.899563,10.997339],[0.023803,11.018682],[-0.438702,11.098341],[-0.761576,10.93693],[-1.203358,11.009819],[-2.940409,10.96269],[-2.963896,10.395335],[-2.827496,9.642461]]]}}, +{"type":"Feature","id":"BGD","properties":{"name":"Bangladesh"},"geometry":{"type":"Polygon","coordinates":[[[92.672721,22.041239],[92.652257,21.324048],[92.303234,21.475485],[92.368554,20.670883],[92.082886,21.192195],[92.025215,21.70157],[91.834891,22.182936],[91.417087,22.765019],[90.496006,22.805017],[90.586957,22.392794],[90.272971,21.836368],[89.847467,22.039146],[89.70205,21.857116],[89.418863,21.966179],[89.031961,22.055708],[88.876312,22.879146],[88.52977,23.631142],[88.69994,24.233715],[88.084422,24.501657],[88.306373,24.866079],[88.931554,25.238692],[88.209789,25.768066],[88.563049,26.446526],[89.355094,26.014407],[89.832481,25.965082],[89.920693,25.26975],[90.872211,25.132601],[91.799596,25.147432],[92.376202,24.976693],[91.915093,24.130414],[91.46773,24.072639],[91.158963,23.503527],[91.706475,22.985264],[91.869928,23.624346],[92.146035,23.627499],[92.672721,22.041239]]]}}, +{"type":"Feature","id":"BGR","properties":{"name":"Bulgaria"},"geometry":{"type":"Polygon","coordinates":[[[22.65715,44.234923],[22.944832,43.823785],[23.332302,43.897011],[24.100679,43.741051],[25.569272,43.688445],[26.065159,43.943494],[27.2424,44.175986],[27.970107,43.812468],[28.558081,43.707462],[28.039095,43.293172],[27.673898,42.577892],[27.99672,42.007359],[27.135739,42.141485],[26.117042,41.826905],[26.106138,41.328899],[25.197201,41.234486],[24.492645,41.583896],[23.692074,41.309081],[22.952377,41.337994],[22.881374,41.999297],[22.380526,42.32026],[22.545012,42.461362],[22.436595,42.580321],[22.604801,42.898519],[22.986019,43.211161],[22.500157,43.642814],[22.410446,44.008063],[22.65715,44.234923]]]}}, +{"type":"Feature","id":"BHS","properties":{"name":"The Bahamas"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-77.53466,23.75975],[-77.78,23.71],[-78.03405,24.28615],[-78.40848,24.57564],[-78.19087,25.2103],[-77.89,25.17],[-77.54,24.34],[-77.53466,23.75975]]],[[[-77.82,26.58],[-78.91,26.42],[-78.98,26.79],[-78.51,26.87],[-77.85,26.84],[-77.82,26.58]]],[[[-77,26.59],[-77.17255,25.87918],[-77.35641,26.00735],[-77.34,26.53],[-77.78802,26.92516],[-77.79,27.04],[-77,26.59]]]]}}, +{"type":"Feature","id":"BIH","properties":{"name":"Bosnia and Herzegovina"},"geometry":{"type":"Polygon","coordinates":[[[19.005486,44.860234],[19.36803,44.863],[19.11761,44.42307],[19.59976,44.03847],[19.454,43.5681],[19.21852,43.52384],[19.03165,43.43253],[18.70648,43.20011],[18.56,42.65],[17.674922,43.028563],[17.297373,43.446341],[16.916156,43.667722],[16.456443,44.04124],[16.23966,44.351143],[15.750026,44.818712],[15.959367,45.233777],[16.318157,45.004127],[16.534939,45.211608],[17.002146,45.233777],[17.861783,45.06774],[18.553214,45.08159],[19.005486,44.860234]]]}}, +{"type":"Feature","id":"BLR","properties":{"name":"Belarus"},"geometry":{"type":"Polygon","coordinates":[[[23.484128,53.912498],[24.450684,53.905702],[25.536354,54.282423],[25.768433,54.846963],[26.588279,55.167176],[26.494331,55.615107],[27.10246,55.783314],[28.176709,56.16913],[29.229513,55.918344],[29.371572,55.670091],[29.896294,55.789463],[30.873909,55.550976],[30.971836,55.081548],[30.757534,54.811771],[31.384472,54.157056],[31.791424,53.974639],[31.731273,53.794029],[32.405599,53.618045],[32.693643,53.351421],[32.304519,53.132726],[31.497644,53.167427],[31.305201,53.073996],[31.540018,52.742052],[31.785998,52.101678],[30.927549,52.042353],[30.619454,51.822806],[30.555117,51.319503],[30.157364,51.416138],[29.254938,51.368234],[28.992835,51.602044],[28.617613,51.427714],[28.241615,51.572227],[27.454066,51.592303],[26.337959,51.832289],[25.327788,51.910656],[24.553106,51.888461],[24.005078,51.617444],[23.527071,51.578454],[23.508002,52.023647],[23.199494,52.486977],[23.799199,52.691099],[23.804935,53.089731],[23.527536,53.470122],[23.484128,53.912498]]]}}, +{"type":"Feature","id":"BLZ","properties":{"name":"Belize"},"geometry":{"type":"Polygon","coordinates":[[[-89.14308,17.808319],[-89.150909,17.955468],[-89.029857,18.001511],[-88.848344,17.883198],[-88.490123,18.486831],[-88.300031,18.499982],[-88.296336,18.353273],[-88.106813,18.348674],[-88.123479,18.076675],[-88.285355,17.644143],[-88.197867,17.489475],[-88.302641,17.131694],[-88.239518,17.036066],[-88.355428,16.530774],[-88.551825,16.265467],[-88.732434,16.233635],[-88.930613,15.887273],[-89.229122,15.886938],[-89.150806,17.015577],[-89.14308,17.808319]]]}}, +{"type":"Feature","id":"BMU","properties":{"name":"Bermuda"},"geometry":{"type":"Polygon","coordinates":[[[-64.7799734332998,32.3072000581802],[-64.7873319183061,32.3039237143428],[-64.7946942710173,32.3032682700388],[-64.8094297981283,32.3098175728414],[-64.8167896352437,32.3058845718466],[-64.8101968029642,32.3022833180511],[-64.7962291465484,32.2934409732427],[-64.7815086336978,32.2868973114514],[-64.7997025513437,32.2796896417328],[-64.8066707691087,32.2747767569465],[-64.8225587873683,32.2669111289395],[-64.8287548840306,32.2669075473817],[-64.8306732143498,32.2583944840235],[-64.8399924854972,32.254782282336],[-64.8566090462354,32.2547740387514],[-64.8682296789446,32.2616393614322],[-64.8628241459563,32.2724481933959],[-64.8748651338951,32.2757120264753],[-64.8717752856644,32.2819371582026],[-64.8671422127295,32.2930760547989],[-64.8559068764437,32.2960321186471],[-64.8597429072279,32.3015842021933],[-64.8439233486717,32.3140553852543],[-64.8350242329311,32.3242161760006],[-64.8338690593672,32.3294587561557],[-64.8520298651164,32.3110911879954],[-64.8635922932573,32.3048469433363],[-64.8686668994079,32.30910745083],[-64.8721354593415,32.3041908606301],[-64.8779667328485,32.3038632800462],[-64.8780046844321,32.2907757831692],[-64.8849776658292,32.2819261366004],[-64.8783230004629,32.2613001418681],[-64.863194968877,32.2465799485801],[-64.8519819555722,32.2485519134663],[-64.842311980074,32.2492123317296],[-64.8388242605209,32.2475773472534],[-64.8334002575532,32.2462714714698],[-64.8256389530584,32.2472637398594],[-64.8205697556026,32.2531698880328],[-64.8105087275579,32.2561208974156],[-64.7900177727338,32.2659446936992],[-64.7745415970416,32.2718413023427],[-64.7644742436426,32.2855931353214],[-64.7551803442276,32.2908326702531],[-64.7423982971436,32.2996734994024],[-64.7206991797682,32.3137542201258],[-64.7117851247134,32.3176823360806],[-64.6962778813133,32.3275029115532],[-64.6768921127452,32.3324095397555],[-64.6567136927777,32.3451776458469],[-64.6532168823499,32.3494356627941],[-64.6605720384429,32.3589423487763],[-64.65125819471,32.3615600906466],[-64.6462011670816,32.36975169749],[-64.6613227512832,32.3763135008721],[-64.6690666074397,32.388444543924],[-64.6834270548595,32.3854968316788],[-64.6954617672714,32.3763221285869],[-64.70438689565,32.3704254760469],[-64.7117569982798,32.368132600249],[-64.7061764744404,32.3600110593559],[-64.700531552697,32.3590601356818],[-64.6940348033967,32.3640708659835],[-64.6895164826082,32.3633598579866],[-64.6864150099255,32.3547797587266],[-64.6824635995504,32.3540628176846],[-64.6835876652835,32.3626447677968],[-64.6801998697415,32.3631199096979],[-64.6672170444687,32.3597751617473],[-64.6598811264978,32.3497625771755],[-64.6737331235384,32.3390281851635],[-64.6887090648183,32.3342439408053],[-64.706732854446,32.3429010723036],[-64.7149301576112,32.3552188753513],[-64.7185967666669,32.3552239212394],[-64.7214189847314,32.3518830231342],[-64.7270616067222,32.3466461715475],[-64.734962460882,32.3442819830499],[-64.7383521549094,32.3407216514918],[-64.7411729976333,32.3311790864627],[-64.7423019216485,32.323311561213],[-64.7462482354281,32.318538611581],[-64.7566773739613,32.3130509130175],[-64.768738200563,32.3088369816572],[-64.7799734332998,32.3072000581802]]]}}, +{"type":"Feature","id":"BOL","properties":{"name":"Bolivia"},"geometry":{"type":"Polygon","coordinates":[[[-62.846468,-22.034985],[-63.986838,-21.993644],[-64.377021,-22.798091],[-64.964892,-22.075862],[-66.273339,-21.83231],[-67.106674,-22.735925],[-67.82818,-22.872919],[-68.219913,-21.494347],[-68.757167,-20.372658],[-68.442225,-19.405068],[-68.966818,-18.981683],[-69.100247,-18.260125],[-69.590424,-17.580012],[-68.959635,-16.500698],[-69.389764,-15.660129],[-69.160347,-15.323974],[-69.339535,-14.953195],[-68.948887,-14.453639],[-68.929224,-13.602684],[-68.88008,-12.899729],[-68.66508,-12.5613],[-69.529678,-10.951734],[-68.786158,-11.03638],[-68.271254,-11.014521],[-68.048192,-10.712059],[-67.173801,-10.306812],[-66.646908,-9.931331],[-65.338435,-9.761988],[-65.444837,-10.511451],[-65.321899,-10.895872],[-65.402281,-11.56627],[-64.316353,-12.461978],[-63.196499,-12.627033],[-62.80306,-13.000653],[-62.127081,-13.198781],[-61.713204,-13.489202],[-61.084121,-13.479384],[-60.503304,-13.775955],[-60.459198,-14.354007],[-60.264326,-14.645979],[-60.251149,-15.077219],[-60.542966,-15.09391],[-60.15839,-16.258284],[-58.24122,-16.299573],[-58.388058,-16.877109],[-58.280804,-17.27171],[-57.734558,-17.552468],[-57.498371,-18.174188],[-57.676009,-18.96184],[-57.949997,-19.400004],[-57.853802,-19.969995],[-58.166392,-20.176701],[-58.183471,-19.868399],[-59.115042,-19.356906],[-60.043565,-19.342747],[-61.786326,-19.633737],[-62.265961,-20.513735],[-62.291179,-21.051635],[-62.685057,-22.249029],[-62.846468,-22.034985]]]}}, +{"type":"Feature","id":"BRA","properties":{"name":"Brazil"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.2909,-28.852761],[-55.162286,-27.881915],[-54.490725,-27.474757],[-53.648735,-26.923473],[-53.628349,-26.124865],[-54.13005,-25.547639],[-54.625291,-25.739255],[-54.428946,-25.162185],[-54.293476,-24.5708],[-54.29296,-24.021014],[-54.652834,-23.839578],[-55.027902,-24.001274],[-55.400747,-23.956935],[-55.517639,-23.571998],[-55.610683,-22.655619],[-55.797958,-22.35693],[-56.473317,-22.0863],[-56.88151,-22.282154],[-57.937156,-22.090176],[-57.870674,-20.732688],[-58.166392,-20.176701],[-57.853802,-19.969995],[-57.949997,-19.400004],[-57.676009,-18.96184],[-57.498371,-18.174188],[-57.734558,-17.552468],[-58.280804,-17.27171],[-58.388058,-16.877109],[-58.24122,-16.299573],[-60.15839,-16.258284],[-60.542966,-15.09391],[-60.251149,-15.077219],[-60.264326,-14.645979],[-60.459198,-14.354007],[-60.503304,-13.775955],[-61.084121,-13.479384],[-61.713204,-13.489202],[-62.127081,-13.198781],[-62.80306,-13.000653],[-63.196499,-12.627033],[-64.316353,-12.461978],[-65.402281,-11.56627],[-65.321899,-10.895872],[-65.444837,-10.511451],[-65.338435,-9.761988],[-66.646908,-9.931331],[-67.173801,-10.306812],[-68.048192,-10.712059],[-68.271254,-11.014521],[-68.786158,-11.03638],[-69.529678,-10.951734],[-70.093752,-11.123972],[-70.548686,-11.009147],[-70.481894,-9.490118],[-71.302412,-10.079436],[-72.184891,-10.053598],[-72.563033,-9.520194],[-73.226713,-9.462213],[-73.015383,-9.032833],[-73.571059,-8.424447],[-73.987235,-7.52383],[-73.723401,-7.340999],[-73.724487,-6.918595],[-73.120027,-6.629931],[-73.219711,-6.089189],[-72.964507,-5.741251],[-72.891928,-5.274561],[-71.748406,-4.593983],[-70.928843,-4.401591],[-70.794769,-4.251265],[-69.893635,-4.298187],[-69.444102,-1.556287],[-69.420486,-1.122619],[-69.577065,-0.549992],[-70.020656,-0.185156],[-70.015566,0.541414],[-69.452396,0.706159],[-69.252434,0.602651],[-69.218638,0.985677],[-69.804597,1.089081],[-69.816973,1.714805],[-67.868565,1.692455],[-67.53781,2.037163],[-67.259998,1.719999],[-67.065048,1.130112],[-66.876326,1.253361],[-66.325765,0.724452],[-65.548267,0.789254],[-65.354713,1.095282],[-64.611012,1.328731],[-64.199306,1.492855],[-64.083085,1.916369],[-63.368788,2.2009],[-63.422867,2.411068],[-64.269999,2.497006],[-64.408828,3.126786],[-64.368494,3.79721],[-64.816064,4.056445],[-64.628659,4.148481],[-63.888343,4.02053],[-63.093198,3.770571],[-62.804533,4.006965],[-62.08543,4.162124],[-60.966893,4.536468],[-60.601179,4.918098],[-60.733574,5.200277],[-60.213683,5.244486],[-59.980959,5.014061],[-60.111002,4.574967],[-59.767406,4.423503],[-59.53804,3.958803],[-59.815413,3.606499],[-59.974525,2.755233],[-59.718546,2.24963],[-59.646044,1.786894],[-59.030862,1.317698],[-58.540013,1.268088],[-58.429477,1.463942],[-58.11345,1.507195],[-57.660971,1.682585],[-57.335823,1.948538],[-56.782704,1.863711],[-56.539386,1.899523],[-55.995698,1.817667],[-55.9056,2.021996],[-56.073342,2.220795],[-55.973322,2.510364],[-55.569755,2.421506],[-55.097587,2.523748],[-54.524754,2.311849],[-54.088063,2.105557],[-53.778521,2.376703],[-53.554839,2.334897],[-53.418465,2.053389],[-52.939657,2.124858],[-52.556425,2.504705],[-52.249338,3.241094],[-51.657797,4.156232],[-51.317146,4.203491],[-51.069771,3.650398],[-50.508875,1.901564],[-49.974076,1.736483],[-49.947101,1.04619],[-50.699251,0.222984],[-50.388211,-0.078445],[-48.620567,-0.235489],[-48.584497,-1.237805],[-47.824956,-0.581618],[-46.566584,-0.941028],[-44.905703,-1.55174],[-44.417619,-2.13775],[-44.581589,-2.691308],[-43.418791,-2.38311],[-41.472657,-2.912018],[-39.978665,-2.873054],[-38.500383,-3.700652],[-37.223252,-4.820946],[-36.452937,-5.109404],[-35.597796,-5.149504],[-35.235389,-5.464937],[-34.89603,-6.738193],[-34.729993,-7.343221],[-35.128212,-8.996401],[-35.636967,-9.649282],[-37.046519,-11.040721],[-37.683612,-12.171195],[-38.423877,-13.038119],[-38.673887,-13.057652],[-38.953276,-13.79337],[-38.882298,-15.667054],[-39.161092,-17.208407],[-39.267339,-17.867746],[-39.583521,-18.262296],[-39.760823,-19.599113],[-40.774741,-20.904512],[-40.944756,-21.937317],[-41.754164,-22.370676],[-41.988284,-22.97007],[-43.074704,-22.967693],[-44.647812,-23.351959],[-45.352136,-23.796842],[-46.472093,-24.088969],[-47.648972,-24.885199],[-48.495458,-25.877025],[-48.641005,-26.623698],[-48.474736,-27.175912],[-48.66152,-28.186135],[-48.888457,-28.674115],[-49.587329,-29.224469],[-50.696874,-30.984465],[-51.576226,-31.777698],[-52.256081,-32.24537],[-52.7121,-33.196578],[-53.373662,-33.768378],[-53.650544,-33.202004],[-53.209589,-32.727666],[-53.787952,-32.047243],[-54.572452,-31.494511],[-55.60151,-30.853879],[-55.973245,-30.883076],[-56.976026,-30.109686],[-57.625133,-30.216295]]]}}, +{"type":"Feature","id":"BRN","properties":{"name":"Brunei"},"geometry":{"type":"Polygon","coordinates":[[[114.204017,4.525874],[114.599961,4.900011],[115.45071,5.44773],[115.4057,4.955228],[115.347461,4.316636],[114.869557,4.348314],[114.659596,4.007637],[114.204017,4.525874]]]}}, +{"type":"Feature","id":"BTN","properties":{"name":"Bhutan"},"geometry":{"type":"Polygon","coordinates":[[[91.696657,27.771742],[92.103712,27.452614],[92.033484,26.83831],[91.217513,26.808648],[90.373275,26.875724],[89.744528,26.719403],[88.835643,27.098966],[88.814248,27.299316],[89.47581,28.042759],[90.015829,28.296439],[90.730514,28.064954],[91.258854,28.040614],[91.696657,27.771742]]]}}, +{"type":"Feature","id":"BWA","properties":{"name":"Botswana"},"geometry":{"type":"Polygon","coordinates":[[[25.649163,-18.536026],[25.850391,-18.714413],[26.164791,-19.293086],[27.296505,-20.39152],[27.724747,-20.499059],[27.727228,-20.851802],[28.02137,-21.485975],[28.794656,-21.639454],[29.432188,-22.091313],[28.017236,-22.827754],[27.11941,-23.574323],[26.786407,-24.240691],[26.485753,-24.616327],[25.941652,-24.696373],[25.765849,-25.174845],[25.664666,-25.486816],[25.025171,-25.71967],[24.211267,-25.670216],[23.73357,-25.390129],[23.312097,-25.26869],[22.824271,-25.500459],[22.579532,-25.979448],[22.105969,-26.280256],[21.605896,-26.726534],[20.889609,-26.828543],[20.66647,-26.477453],[20.758609,-25.868136],[20.165726,-24.917962],[19.895768,-24.76779],[19.895458,-21.849157],[20.881134,-21.814327],[20.910641,-18.252219],[21.65504,-18.219146],[23.196858,-17.869038],[23.579006,-18.281261],[24.217365,-17.889347],[24.520705,-17.887125],[25.084443,-17.661816],[25.264226,-17.73654],[25.649163,-18.536026]]]}}, +{"type":"Feature","id":"CAF","properties":{"name":"Central African Republic"},"geometry":{"type":"Polygon","coordinates":[[[15.27946,7.421925],[16.106232,7.497088],[16.290562,7.754307],[16.456185,7.734774],[16.705988,7.508328],[17.96493,7.890914],[18.389555,8.281304],[18.911022,8.630895],[18.81201,8.982915],[19.094008,9.074847],[20.059685,9.012706],[21.000868,9.475985],[21.723822,10.567056],[22.231129,10.971889],[22.864165,11.142395],[22.977544,10.714463],[23.554304,10.089255],[23.55725,9.681218],[23.394779,9.265068],[23.459013,8.954286],[23.805813,8.666319],[24.567369,8.229188],[25.114932,7.825104],[25.124131,7.500085],[25.796648,6.979316],[26.213418,6.546603],[26.465909,5.946717],[27.213409,5.550953],[27.374226,5.233944],[27.044065,5.127853],[26.402761,5.150875],[25.650455,5.256088],[25.278798,5.170408],[25.128833,4.927245],[24.805029,4.897247],[24.410531,5.108784],[23.297214,4.609693],[22.84148,4.710126],[22.704124,4.633051],[22.405124,4.02916],[21.659123,4.224342],[20.927591,4.322786],[20.290679,4.691678],[19.467784,5.031528],[18.932312,4.709506],[18.542982,4.201785],[18.453065,3.504386],[17.8099,3.560196],[17.133042,3.728197],[16.537058,3.198255],[16.012852,2.26764],[15.907381,2.557389],[15.862732,3.013537],[15.405396,3.335301],[15.03622,3.851367],[14.950953,4.210389],[14.478372,4.732605],[14.558936,5.030598],[14.459407,5.451761],[14.53656,6.226959],[14.776545,6.408498],[15.27946,7.421925]]]}}, +{"type":"Feature","id":"CAN","properties":{"name":"Canada"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-63.6645,46.55001],[-62.9393,46.41587],[-62.01208,46.44314],[-62.50391,46.03339],[-62.87433,45.96818],[-64.1428,46.39265],[-64.39261,46.72747],[-64.01486,47.03601],[-63.6645,46.55001]]],[[[-61.806305,49.10506],[-62.29318,49.08717],[-63.58926,49.40069],[-64.51912,49.87304],[-64.17322,49.95718],[-62.85829,49.70641],[-61.835585,49.28855],[-61.806305,49.10506]]],[[[-123.510002,48.510011],[-124.012891,48.370846],[-125.655013,48.825005],[-125.954994,49.179996],[-126.850004,49.53],[-127.029993,49.814996],[-128.059336,49.994959],[-128.444584,50.539138],[-128.358414,50.770648],[-127.308581,50.552574],[-126.695001,50.400903],[-125.755007,50.295018],[-125.415002,49.950001],[-124.920768,49.475275],[-123.922509,49.062484],[-123.510002,48.510011]]],[[[-56.134036,50.68701],[-56.795882,49.812309],[-56.143105,50.150117],[-55.471492,49.935815],[-55.822401,49.587129],[-54.935143,49.313011],[-54.473775,49.556691],[-53.476549,49.249139],[-53.786014,48.516781],[-53.086134,48.687804],[-52.958648,48.157164],[-52.648099,47.535548],[-53.069158,46.655499],[-53.521456,46.618292],[-54.178936,46.807066],[-53.961869,47.625207],[-54.240482,47.752279],[-55.400773,46.884994],[-55.997481,46.91972],[-55.291219,47.389562],[-56.250799,47.632545],[-57.325229,47.572807],[-59.266015,47.603348],[-59.419494,47.899454],[-58.796586,48.251525],[-59.231625,48.523188],[-58.391805,49.125581],[-57.35869,50.718274],[-56.73865,51.287438],[-55.870977,51.632094],[-55.406974,51.588273],[-55.600218,51.317075],[-56.134036,50.68701]]],[[[-132.710008,54.040009],[-132.710009,54.040009],[-132.710008,54.040009],[-132.710008,54.040009],[-131.74999,54.120004],[-132.04948,52.984621],[-131.179043,52.180433],[-131.57783,52.182371],[-132.180428,52.639707],[-132.549992,53.100015],[-133.054611,53.411469],[-133.239664,53.85108],[-133.180004,54.169975],[-132.710008,54.040009]]],[[[-79.26582,62.158675],[-79.65752,61.63308],[-80.09956,61.7181],[-80.36215,62.01649],[-80.315395,62.085565],[-79.92939,62.3856],[-79.52002,62.36371],[-79.26582,62.158675]]],[[[-81.89825,62.7108],[-83.06857,62.15922],[-83.77462,62.18231],[-83.99367,62.4528],[-83.25048,62.91409],[-81.87699,62.90458],[-81.89825,62.7108]]],[[[-85.161308,65.657285],[-84.975764,65.217518],[-84.464012,65.371772],[-83.882626,65.109618],[-82.787577,64.766693],[-81.642014,64.455136],[-81.55344,63.979609],[-80.817361,64.057486],[-80.103451,63.725981],[-80.99102,63.411246],[-82.547178,63.651722],[-83.108798,64.101876],[-84.100417,63.569712],[-85.523405,63.052379],[-85.866769,63.637253],[-87.221983,63.541238],[-86.35276,64.035833],[-86.224886,64.822917],[-85.883848,65.738778],[-85.161308,65.657285]]],[[[-75.86588,67.14886],[-76.98687,67.09873],[-77.2364,67.58809],[-76.81166,68.14856],[-75.89521,68.28721],[-75.1145,68.01036],[-75.10333,67.58202],[-75.21597,67.44425],[-75.86588,67.14886]]],[[[-95.647681,69.10769],[-96.269521,68.75704],[-97.617401,69.06003],[-98.431801,68.9507],[-99.797401,69.40003],[-98.917401,69.71003],[-98.218261,70.14354],[-97.157401,69.86003],[-96.557401,69.68003],[-96.257401,69.49003],[-95.647681,69.10769]]],[[[-90.5471,69.49766],[-90.55151,68.47499],[-89.21515,69.25873],[-88.01966,68.61508],[-88.31749,67.87338],[-87.35017,67.19872],[-86.30607,67.92146],[-85.57664,68.78456],[-85.52197,69.88211],[-84.10081,69.80539],[-82.62258,69.65826],[-81.28043,69.16202],[-81.2202,68.66567],[-81.96436,68.13253],[-81.25928,67.59716],[-81.38653,67.11078],[-83.34456,66.41154],[-84.73542,66.2573],[-85.76943,66.55833],[-86.0676,66.05625],[-87.03143,65.21297],[-87.32324,64.77563],[-88.48296,64.09897],[-89.91444,64.03273],[-90.70398,63.61017],[-90.77004,62.96021],[-91.93342,62.83508],[-93.15698,62.02469],[-94.24153,60.89865],[-94.62931,60.11021],[-94.6846,58.94882],[-93.21502,58.78212],[-92.76462,57.84571],[-92.29703,57.08709],[-90.89769,57.28468],[-89.03953,56.85172],[-88.03978,56.47162],[-87.32421,55.99914],[-86.07121,55.72383],[-85.01181,55.3026],[-83.36055,55.24489],[-82.27285,55.14832],[-82.4362,54.28227],[-82.12502,53.27703],[-81.40075,52.15788],[-79.91289,51.20842],[-79.14301,51.53393],[-78.60191,52.56208],[-79.12421,54.14145],[-79.82958,54.66772],[-78.22874,55.13645],[-77.0956,55.83741],[-76.54137,56.53423],[-76.62319,57.20263],[-77.30226,58.05209],[-78.51688,58.80458],[-77.33676,59.85261],[-77.77272,60.75788],[-78.10687,62.31964],[-77.41067,62.55053],[-75.69621,62.2784],[-74.6682,62.18111],[-73.83988,62.4438],[-72.90853,62.10507],[-71.67708,61.52535],[-71.37369,61.13717],[-69.59042,61.06141],[-69.62033,60.22125],[-69.2879,58.95736],[-68.37455,58.80106],[-67.64976,58.21206],[-66.20178,58.76731],[-65.24517,59.87071],[-64.58352,60.33558],[-63.80475,59.4426],[-62.50236,58.16708],[-61.39655,56.96745],[-61.79866,56.33945],[-60.46853,55.77548],[-59.56962,55.20407],[-57.97508,54.94549],[-57.3332,54.6265],[-56.93689,53.78032],[-56.15811,53.64749],[-55.75632,53.27036],[-55.68338,52.14664],[-56.40916,51.7707],[-57.12691,51.41972],[-58.77482,51.0643],[-60.03309,50.24277],[-61.72366,50.08046],[-63.86251,50.29099],[-65.36331,50.2982],[-66.39905,50.22897],[-67.23631,49.51156],[-68.51114,49.06836],[-69.95362,47.74488],[-71.10458,46.82171],[-70.25522,46.98606],[-68.65,48.3],[-66.55243,49.1331],[-65.05626,49.23278],[-64.17099,48.74248],[-65.11545,48.07085],[-64.79854,46.99297],[-64.47219,46.23849],[-63.17329,45.73902],[-61.52072,45.88377],[-60.51815,47.00793],[-60.4486,46.28264],[-59.80287,45.9204],[-61.03988,45.26525],[-63.25471,44.67014],[-64.24656,44.26553],[-65.36406,43.54523],[-66.1234,43.61867],[-66.16173,44.46512],[-64.42549,45.29204],[-66.02605,45.25931],[-67.13741,45.13753],[-67.79134,45.70281],[-67.79046,47.06636],[-68.23444,47.35486],[-68.905,47.185],[-69.237216,47.447781],[-69.99997,46.69307],[-70.305,45.915],[-70.66,45.46],[-71.08482,45.30524],[-71.405,45.255],[-71.50506,45.0082],[-73.34783,45.00738],[-74.867,45.00048],[-75.31821,44.81645],[-76.375,44.09631],[-76.5,44.018459],[-76.820034,43.628784],[-77.737885,43.629056],[-78.72028,43.625089],[-79.171674,43.466339],[-79.01,43.27],[-78.92,42.965],[-78.939362,42.863611],[-80.247448,42.3662],[-81.277747,42.209026],[-82.439278,41.675105],[-82.690089,41.675105],[-83.02981,41.832796],[-83.142,41.975681],[-83.12,42.08],[-82.9,42.43],[-82.43,42.98],[-82.137642,43.571088],[-82.337763,44.44],[-82.550925,45.347517],[-83.592851,45.816894],[-83.469551,45.994686],[-83.616131,46.116927],[-83.890765,46.116927],[-84.091851,46.275419],[-84.14212,46.512226],[-84.3367,46.40877],[-84.6049,46.4396],[-84.543749,46.538684],[-84.779238,46.637102],[-84.87608,46.900083],[-85.652363,47.220219],[-86.461991,47.553338],[-87.439793,47.94],[-88.378114,48.302918],[-89.272917,48.019808],[-89.6,48.01],[-90.83,48.27],[-91.64,48.14],[-92.61,48.45],[-93.63087,48.60926],[-94.32914,48.67074],[-94.64,48.84],[-94.81758,49.38905],[-95.15609,49.38425],[-95.15907,49],[-97.22872,49.0007],[-100.65,49],[-104.04826,48.99986],[-107.05,49],[-110.05,49],[-113,49],[-116.04818,49],[-117.03121,49],[-120,49],[-122.84,49],[-122.97421,49.002538],[-124.91024,49.98456],[-125.62461,50.41656],[-127.43561,50.83061],[-127.99276,51.71583],[-127.85032,52.32961],[-129.12979,52.75538],[-129.30523,53.56159],[-130.51497,54.28757],[-130.53611,54.80278],[-129.98,55.285],[-130.00778,55.91583],[-131.70781,56.55212],[-132.73042,57.69289],[-133.35556,58.41028],[-134.27111,58.86111],[-134.945,59.27056],[-135.47583,59.78778],[-136.47972,59.46389],[-137.4525,58.905],[-138.34089,59.56211],[-139.039,60],[-140.013,60.27682],[-140.99778,60.30639],[-140.9925,66.00003],[-140.986,69.712],[-139.12052,69.47102],[-137.54636,68.99002],[-136.50358,68.89804],[-135.62576,69.31512],[-134.41464,69.62743],[-132.92925,69.50534],[-131.43136,69.94451],[-129.79471,70.19369],[-129.10773,69.77927],[-128.36156,70.01286],[-128.13817,70.48384],[-127.44712,70.37721],[-125.75632,69.48058],[-124.42483,70.1584],[-124.28968,69.39969],[-123.06108,69.56372],[-122.6835,69.85553],[-121.47226,69.79778],[-119.94288,69.37786],[-117.60268,69.01128],[-116.22643,68.84151],[-115.2469,68.90591],[-113.89794,68.3989],[-115.30489,67.90261],[-113.49727,67.68815],[-110.798,67.80612],[-109.94619,67.98104],[-108.8802,67.38144],[-107.79239,67.88736],[-108.81299,68.31164],[-108.16721,68.65392],[-106.95,68.7],[-106.15,68.8],[-105.34282,68.56122],[-104.33791,68.018],[-103.22115,68.09775],[-101.45433,67.64689],[-99.90195,67.80566],[-98.4432,67.78165],[-98.5586,68.40394],[-97.66948,68.57864],[-96.11991,68.23939],[-96.12588,67.29338],[-95.48943,68.0907],[-94.685,68.06383],[-94.23282,69.06903],[-95.30408,69.68571],[-96.47131,70.08976],[-96.39115,71.19482],[-95.2088,71.92053],[-93.88997,71.76015],[-92.87818,71.31869],[-91.51964,70.19129],[-92.40692,69.69997],[-90.5471,69.49766]]],[[[-114.16717,73.12145],[-114.66634,72.65277],[-112.44102,72.9554],[-111.05039,72.4504],[-109.92035,72.96113],[-109.00654,72.63335],[-108.18835,71.65089],[-107.68599,72.06548],[-108.39639,73.08953],[-107.51645,73.23598],[-106.52259,73.07601],[-105.40246,72.67259],[-104.77484,71.6984],[-104.46476,70.99297],[-102.78537,70.49776],[-100.98078,70.02432],[-101.08929,69.58447],[-102.73116,69.50402],[-102.09329,69.11962],[-102.43024,68.75282],[-104.24,68.91],[-105.96,69.18],[-107.12254,69.11922],[-109,68.78],[-111.534149,68.630059],[-113.3132,68.53554],[-113.85496,69.00744],[-115.22,69.28],[-116.10794,69.16821],[-117.34,69.96],[-116.67473,70.06655],[-115.13112,70.2373],[-113.72141,70.19237],[-112.4161,70.36638],[-114.35,70.6],[-116.48684,70.52045],[-117.9048,70.54056],[-118.43238,70.9092],[-116.11311,71.30918],[-117.65568,71.2952],[-119.40199,71.55859],[-118.56267,72.30785],[-117.86642,72.70594],[-115.18909,73.31459],[-114.16717,73.12145]]],[[[-104.5,73.42],[-105.38,72.76],[-106.94,73.46],[-106.6,73.6],[-105.26,73.64],[-104.5,73.42]]],[[[-76.34,73.102685],[-76.251404,72.826385],[-77.314438,72.855545],[-78.39167,72.876656],[-79.486252,72.742203],[-79.775833,72.802902],[-80.876099,73.333183],[-80.833885,73.693184],[-80.353058,73.75972],[-78.064438,73.651932],[-76.34,73.102685]]],[[[-86.562179,73.157447],[-85.774371,72.534126],[-84.850112,73.340278],[-82.31559,73.750951],[-80.600088,72.716544],[-80.748942,72.061907],[-78.770639,72.352173],[-77.824624,72.749617],[-75.605845,72.243678],[-74.228616,71.767144],[-74.099141,71.33084],[-72.242226,71.556925],[-71.200015,70.920013],[-68.786054,70.525024],[-67.91497,70.121948],[-66.969033,69.186087],[-68.805123,68.720198],[-66.449866,68.067163],[-64.862314,67.847539],[-63.424934,66.928473],[-61.851981,66.862121],[-62.163177,66.160251],[-63.918444,64.998669],[-65.14886,65.426033],[-66.721219,66.388041],[-68.015016,66.262726],[-68.141287,65.689789],[-67.089646,65.108455],[-65.73208,64.648406],[-65.320168,64.382737],[-64.669406,63.392927],[-65.013804,62.674185],[-66.275045,62.945099],[-68.783186,63.74567],[-67.369681,62.883966],[-66.328297,62.280075],[-66.165568,61.930897],[-68.877367,62.330149],[-71.023437,62.910708],[-72.235379,63.397836],[-71.886278,63.679989],[-73.378306,64.193963],[-74.834419,64.679076],[-74.818503,64.389093],[-77.70998,64.229542],[-78.555949,64.572906],[-77.897281,65.309192],[-76.018274,65.326969],[-73.959795,65.454765],[-74.293883,65.811771],[-73.944912,66.310578],[-72.651167,67.284576],[-72.92606,67.726926],[-73.311618,68.069437],[-74.843307,68.554627],[-76.869101,68.894736],[-76.228649,69.147769],[-77.28737,69.76954],[-78.168634,69.826488],[-78.957242,70.16688],[-79.492455,69.871808],[-81.305471,69.743185],[-84.944706,69.966634],[-87.060003,70.260001],[-88.681713,70.410741],[-89.51342,70.762038],[-88.467721,71.218186],[-89.888151,71.222552],[-90.20516,72.235074],[-89.436577,73.129464],[-88.408242,73.537889],[-85.826151,73.803816],[-86.562179,73.157447]]],[[[-100.35642,73.84389],[-99.16387,73.63339],[-97.38,73.76],[-97.12,73.47],[-98.05359,72.99052],[-96.54,72.56],[-96.72,71.66],[-98.35966,71.27285],[-99.32286,71.35639],[-100.01482,71.73827],[-102.5,72.51],[-102.48,72.83],[-100.43836,72.70588],[-101.54,73.36],[-100.35642,73.84389]]],[[[-93.196296,72.771992],[-94.269047,72.024596],[-95.409856,72.061881],[-96.033745,72.940277],[-96.018268,73.43743],[-95.495793,73.862417],[-94.503658,74.134907],[-92.420012,74.100025],[-90.509793,73.856732],[-92.003965,72.966244],[-93.196296,72.771992]]],[[[-120.46,71.383602],[-123.09219,70.90164],[-123.62,71.34],[-125.928949,71.868688],[-125.5,72.292261],[-124.80729,73.02256],[-123.94,73.68],[-124.91775,74.29275],[-121.53788,74.44893],[-120.10978,74.24135],[-117.55564,74.18577],[-116.58442,73.89607],[-115.51081,73.47519],[-116.76794,73.22292],[-119.22,72.52],[-120.46,71.82],[-120.46,71.383602]]],[[[-93.612756,74.979997],[-94.156909,74.592347],[-95.608681,74.666864],[-96.820932,74.927623],[-96.288587,75.377828],[-94.85082,75.647218],[-93.977747,75.29649],[-93.612756,74.979997]]],[[[-98.5,76.72],[-97.735585,76.25656],[-97.704415,75.74344],[-98.16,75],[-99.80874,74.89744],[-100.88366,75.05736],[-100.86292,75.64075],[-102.50209,75.5638],[-102.56552,76.3366],[-101.48973,76.30537],[-99.98349,76.64634],[-98.57699,76.58859],[-98.5,76.72]]],[[[-108.21141,76.20168],[-107.81943,75.84552],[-106.92893,76.01282],[-105.881,75.9694],[-105.70498,75.47951],[-106.31347,75.00527],[-109.7,74.85],[-112.22307,74.41696],[-113.74381,74.39427],[-113.87135,74.72029],[-111.79421,75.1625],[-116.31221,75.04343],[-117.7104,75.2222],[-116.34602,76.19903],[-115.40487,76.47887],[-112.59056,76.14134],[-110.81422,75.54919],[-109.0671,75.47321],[-110.49726,76.42982],[-109.5811,76.79417],[-108.54859,76.67832],[-108.21141,76.20168]]],[[[-94.684086,77.097878],[-93.573921,76.776296],[-91.605023,76.778518],[-90.741846,76.449597],[-90.969661,76.074013],[-89.822238,75.847774],[-89.187083,75.610166],[-87.838276,75.566189],[-86.379192,75.482421],[-84.789625,75.699204],[-82.753445,75.784315],[-81.128531,75.713983],[-80.057511,75.336849],[-79.833933,74.923127],[-80.457771,74.657304],[-81.948843,74.442459],[-83.228894,74.564028],[-86.097452,74.410032],[-88.15035,74.392307],[-89.764722,74.515555],[-92.422441,74.837758],[-92.768285,75.38682],[-92.889906,75.882655],[-93.893824,76.319244],[-95.962457,76.441381],[-97.121379,76.751078],[-96.745123,77.161389],[-94.684086,77.097878]]],[[[-116.198587,77.645287],[-116.335813,76.876962],[-117.106051,76.530032],[-118.040412,76.481172],[-119.899318,76.053213],[-121.499995,75.900019],[-122.854924,76.116543],[-122.854925,76.116543],[-121.157535,76.864508],[-119.103939,77.51222],[-117.570131,77.498319],[-116.198587,77.645287]]],[[[-93.840003,77.519997],[-94.295608,77.491343],[-96.169654,77.555111],[-96.436304,77.834629],[-94.422577,77.820005],[-93.720656,77.634331],[-93.840003,77.519997]]],[[[-110.186938,77.697015],[-112.051191,77.409229],[-113.534279,77.732207],[-112.724587,78.05105],[-111.264443,78.152956],[-109.854452,77.996325],[-110.186938,77.697015]]],[[[-109.663146,78.601973],[-110.881314,78.40692],[-112.542091,78.407902],[-112.525891,78.550555],[-111.50001,78.849994],[-110.963661,78.804441],[-109.663146,78.601973]]],[[[-95.830295,78.056941],[-97.309843,77.850597],[-98.124289,78.082857],[-98.552868,78.458105],[-98.631984,78.87193],[-97.337231,78.831984],[-96.754399,78.765813],[-95.559278,78.418315],[-95.830295,78.056941]]],[[[-100.060192,78.324754],[-99.670939,77.907545],[-101.30394,78.018985],[-102.949809,78.343229],[-105.176133,78.380332],[-104.210429,78.67742],[-105.41958,78.918336],[-105.492289,79.301594],[-103.529282,79.165349],[-100.825158,78.800462],[-100.060192,78.324754]]],[[[-87.02,79.66],[-85.81435,79.3369],[-87.18756,79.0393],[-89.03535,78.28723],[-90.80436,78.21533],[-92.87669,78.34333],[-93.95116,78.75099],[-93.93574,79.11373],[-93.14524,79.3801],[-94.974,79.37248],[-96.07614,79.70502],[-96.70972,80.15777],[-96.01644,80.60233],[-95.32345,80.90729],[-94.29843,80.97727],[-94.73542,81.20646],[-92.40984,81.25739],[-91.13289,80.72345],[-89.45,80.509322],[-87.81,80.32],[-87.02,79.66]]],[[[-68.5,83.106322],[-65.82735,83.02801],[-63.68,82.9],[-61.85,82.6286],[-61.89388,82.36165],[-64.334,81.92775],[-66.75342,81.72527],[-67.65755,81.50141],[-65.48031,81.50657],[-67.84,80.9],[-69.4697,80.61683],[-71.18,79.8],[-73.2428,79.63415],[-73.88,79.430162],[-76.90773,79.32309],[-75.52924,79.19766],[-76.22046,79.01907],[-75.39345,78.52581],[-76.34354,78.18296],[-77.88851,77.89991],[-78.36269,77.50859],[-79.75951,77.20968],[-79.61965,76.98336],[-77.91089,77.022045],[-77.88911,76.777955],[-80.56125,76.17812],[-83.17439,76.45403],[-86.11184,76.29901],[-87.6,76.42],[-89.49068,76.47239],[-89.6161,76.95213],[-87.76739,77.17833],[-88.26,77.9],[-87.65,77.970222],[-84.97634,77.53873],[-86.34,78.18],[-87.96192,78.37181],[-87.15198,78.75867],[-85.37868,78.9969],[-85.09495,79.34543],[-86.50734,79.73624],[-86.93179,80.25145],[-84.19844,80.20836],[-83.408696,80.1],[-81.84823,80.46442],[-84.1,80.58],[-87.59895,80.51627],[-89.36663,80.85569],[-90.2,81.26],[-91.36786,81.5531],[-91.58702,81.89429],[-90.1,82.085],[-88.93227,82.11751],[-86.97024,82.27961],[-85.5,82.652273],[-84.260005,82.6],[-83.18,82.32],[-82.42,82.86],[-81.1,83.02],[-79.30664,83.13056],[-76.25,83.172059],[-75.71878,83.06404],[-72.83153,83.23324],[-70.665765,83.169781],[-68.5,83.106322]]]]}}, +{"type":"Feature","id":"CHE","properties":{"name":"Switzerland"},"geometry":{"type":"Polygon","coordinates":[[[9.594226,47.525058],[9.632932,47.347601],[9.47997,47.10281],[9.932448,46.920728],[10.442701,46.893546],[10.363378,46.483571],[9.922837,46.314899],[9.182882,46.440215],[8.966306,46.036932],[8.489952,46.005151],[8.31663,46.163642],[7.755992,45.82449],[7.273851,45.776948],[6.843593,45.991147],[6.5001,46.429673],[6.022609,46.27299],[6.037389,46.725779],[6.768714,47.287708],[6.736571,47.541801],[7.192202,47.449766],[7.466759,47.620582],[8.317301,47.61358],[8.522612,47.830828],[9.594226,47.525058]]]}}, +{"type":"Feature","id":"CHL","properties":{"name":"Chile"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.63401,-52.63637],[-68.63335,-54.8695],[-67.56244,-54.87001],[-66.95992,-54.89681],[-67.29103,-55.30124],[-68.14863,-55.61183],[-68.639991,-55.580018],[-69.2321,-55.49906],[-69.95809,-55.19843],[-71.00568,-55.05383],[-72.2639,-54.49514],[-73.2852,-53.95752],[-74.66253,-52.83749],[-73.8381,-53.04743],[-72.43418,-53.7154],[-71.10773,-54.07433],[-70.59178,-53.61583],[-70.26748,-52.93123],[-69.34565,-52.5183],[-68.63401,-52.63637]]],[[[-68.219913,-21.494347],[-67.82818,-22.872919],[-67.106674,-22.735925],[-66.985234,-22.986349],[-67.328443,-24.025303],[-68.417653,-24.518555],[-68.386001,-26.185016],[-68.5948,-26.506909],[-68.295542,-26.89934],[-69.001235,-27.521214],[-69.65613,-28.459141],[-70.01355,-29.367923],[-69.919008,-30.336339],[-70.535069,-31.36501],[-70.074399,-33.09121],[-69.814777,-33.273886],[-69.817309,-34.193571],[-70.388049,-35.169688],[-70.364769,-36.005089],[-71.121881,-36.658124],[-71.118625,-37.576827],[-70.814664,-38.552995],[-71.413517,-38.916022],[-71.680761,-39.808164],[-71.915734,-40.832339],[-71.746804,-42.051386],[-72.148898,-42.254888],[-71.915424,-43.408565],[-71.464056,-43.787611],[-71.793623,-44.207172],[-71.329801,-44.407522],[-71.222779,-44.784243],[-71.659316,-44.973689],[-71.552009,-45.560733],[-71.917258,-46.884838],[-72.447355,-47.738533],[-72.331161,-48.244238],[-72.648247,-48.878618],[-73.415436,-49.318436],[-73.328051,-50.378785],[-72.975747,-50.74145],[-72.309974,-50.67701],[-72.329404,-51.425956],[-71.914804,-52.009022],[-69.498362,-52.142761],[-68.571545,-52.299444],[-69.461284,-52.291951],[-69.94278,-52.537931],[-70.845102,-52.899201],[-71.006332,-53.833252],[-71.429795,-53.856455],[-72.557943,-53.53141],[-73.702757,-52.835069],[-73.702757,-52.83507],[-74.946763,-52.262754],[-75.260026,-51.629355],[-74.976632,-51.043396],[-75.479754,-50.378372],[-75.608015,-48.673773],[-75.18277,-47.711919],[-74.126581,-46.939253],[-75.644395,-46.647643],[-74.692154,-45.763976],[-74.351709,-44.103044],[-73.240356,-44.454961],[-72.717804,-42.383356],[-73.3889,-42.117532],[-73.701336,-43.365776],[-74.331943,-43.224958],[-74.017957,-41.794813],[-73.677099,-39.942213],[-73.217593,-39.258689],[-73.505559,-38.282883],[-73.588061,-37.156285],[-73.166717,-37.12378],[-72.553137,-35.50884],[-71.861732,-33.909093],[-71.43845,-32.418899],[-71.668721,-30.920645],[-71.370083,-30.095682],[-71.489894,-28.861442],[-70.905124,-27.64038],[-70.724954,-25.705924],[-70.403966,-23.628997],[-70.091246,-21.393319],[-70.16442,-19.756468],[-70.372572,-18.347975],[-69.858444,-18.092694],[-69.590424,-17.580012],[-69.100247,-18.260125],[-68.966818,-18.981683],[-68.442225,-19.405068],[-68.757167,-20.372658],[-68.219913,-21.494347]]]]}}, +{"type":"Feature","id":"CHN","properties":{"name":"China"},"geometry":{"type":"MultiPolygon","coordinates":[[[[110.339188,18.678395],[109.47521,18.197701],[108.655208,18.507682],[108.626217,19.367888],[109.119056,19.821039],[110.211599,20.101254],[110.786551,20.077534],[111.010051,19.69593],[110.570647,19.255879],[110.339188,18.678395]]],[[[127.657407,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.987282,47.790132],[132.506672,47.78897],[133.373596,48.183442],[135.026311,48.47823],[134.500814,47.57844],[134.112362,47.212467],[133.769644,46.116927],[133.097127,45.144066],[131.883454,45.321162],[131.025212,44.967953],[131.288555,44.11152],[131.144688,42.92999],[130.633866,42.903015],[130.640016,42.395009],[129.994267,42.985387],[129.596669,42.424982],[128.052215,41.994285],[128.208433,41.466772],[127.343783,41.503152],[126.869083,41.816569],[126.182045,41.107336],[125.079942,40.569824],[124.265625,39.928493],[122.86757,39.637788],[122.131388,39.170452],[121.054554,38.897471],[121.585995,39.360854],[121.376757,39.750261],[122.168595,40.422443],[121.640359,40.94639],[120.768629,40.593388],[119.639602,39.898056],[119.023464,39.252333],[118.042749,39.204274],[117.532702,38.737636],[118.059699,38.061476],[118.87815,37.897325],[118.911636,37.448464],[119.702802,37.156389],[120.823457,37.870428],[121.711259,37.481123],[122.357937,37.454484],[122.519995,36.930614],[121.104164,36.651329],[120.637009,36.11144],[119.664562,35.609791],[119.151208,34.909859],[120.227525,34.360332],[120.620369,33.376723],[121.229014,32.460319],[121.908146,31.692174],[121.891919,30.949352],[121.264257,30.676267],[121.503519,30.142915],[122.092114,29.83252],[121.938428,29.018022],[121.684439,28.225513],[121.125661,28.135673],[120.395473,27.053207],[119.585497,25.740781],[118.656871,24.547391],[117.281606,23.624501],[115.890735,22.782873],[114.763827,22.668074],[114.152547,22.22376],[113.80678,22.54834],[113.241078,22.051367],[111.843592,21.550494],[110.785466,21.397144],[110.444039,20.341033],[109.889861,20.282457],[109.627655,21.008227],[109.864488,21.395051],[108.522813,21.715212],[108.05018,21.55238],[107.04342,21.811899],[106.567273,22.218205],[106.725403,22.794268],[105.811247,22.976892],[105.329209,23.352063],[104.476858,22.81915],[103.504515,22.703757],[102.706992,22.708795],[102.170436,22.464753],[101.652018,22.318199],[101.80312,21.174367],[101.270026,21.201652],[101.180005,21.436573],[101.150033,21.849984],[100.416538,21.558839],[99.983489,21.742937],[99.240899,22.118314],[99.531992,22.949039],[98.898749,23.142722],[98.660262,24.063286],[97.60472,23.897405],[97.724609,25.083637],[98.671838,25.918703],[98.712094,26.743536],[98.68269,27.508812],[98.246231,27.747221],[97.911988,28.335945],[97.327114,28.261583],[96.248833,28.411031],[96.586591,28.83098],[96.117679,29.452802],[95.404802,29.031717],[94.56599,29.277438],[93.413348,28.640629],[92.503119,27.896876],[91.696657,27.771742],[91.258854,28.040614],[90.730514,28.064954],[90.015829,28.296439],[89.47581,28.042759],[88.814248,27.299316],[88.730326,28.086865],[88.120441,27.876542],[86.954517,27.974262],[85.82332,28.203576],[85.011638,28.642774],[84.23458,28.839894],[83.898993,29.320226],[83.337115,29.463732],[82.327513,30.115268],[81.525804,30.422717],[81.111256,30.183481],[79.721367,30.882715],[78.738894,31.515906],[78.458446,32.618164],[79.176129,32.48378],[79.208892,32.994395],[78.811086,33.506198],[78.912269,34.321936],[77.837451,35.49401],[76.192848,35.898403],[75.896897,36.666806],[75.158028,37.133031],[74.980002,37.41999],[74.829986,37.990007],[74.864816,38.378846],[74.257514,38.606507],[73.928852,38.505815],[73.675379,39.431237],[73.960013,39.660008],[73.822244,39.893973],[74.776862,40.366425],[75.467828,40.562072],[76.526368,40.427946],[76.904484,41.066486],[78.187197,41.185316],[78.543661,41.582243],[80.11943,42.123941],[80.25999,42.349999],[80.18015,42.920068],[80.866206,43.180362],[79.966106,44.917517],[81.947071,45.317027],[82.458926,45.53965],[83.180484,47.330031],[85.16429,47.000956],[85.720484,47.452969],[85.768233,48.455751],[86.598776,48.549182],[87.35997,49.214981],[87.751264,49.297198],[88.013832,48.599463],[88.854298,48.069082],[90.280826,47.693549],[90.970809,46.888146],[90.585768,45.719716],[90.94554,45.286073],[92.133891,45.115076],[93.480734,44.975472],[94.688929,44.352332],[95.306875,44.241331],[95.762455,43.319449],[96.349396,42.725635],[97.451757,42.74889],[99.515817,42.524691],[100.845866,42.663804],[101.83304,42.514873],[103.312278,41.907468],[104.522282,41.908347],[104.964994,41.59741],[106.129316,42.134328],[107.744773,42.481516],[109.243596,42.519446],[110.412103,42.871234],[111.129682,43.406834],[111.829588,43.743118],[111.667737,44.073176],[111.348377,44.457442],[111.873306,45.102079],[112.436062,45.011646],[113.463907,44.808893],[114.460332,45.339817],[115.985096,45.727235],[116.717868,46.388202],[117.421701,46.672733],[118.874326,46.805412],[119.66327,46.69268],[119.772824,47.048059],[118.866574,47.74706],[118.064143,48.06673],[117.295507,47.697709],[116.308953,47.85341],[115.742837,47.726545],[115.485282,48.135383],[116.191802,49.134598],[116.678801,49.888531],[117.879244,49.510983],[119.288461,50.142883],[119.279366,50.582908],[120.18205,51.643566],[120.738191,51.964115],[120.725789,52.516226],[120.177089,52.753886],[121.003085,53.251401],[122.245748,53.431726],[123.571507,53.458804],[125.068211,53.161045],[125.946349,52.792799],[126.564399,51.784255],[126.939157,51.353894],[127.287456,50.739797],[127.657407,49.76027]]]]}}, +{"type":"Feature","id":"CIV","properties":{"name":"Ivory Coast"},"geometry":{"type":"Polygon","coordinates":[[[-2.856125,4.994476],[-3.311084,4.984296],[-4.00882,5.179813],[-4.649917,5.168264],[-5.834496,4.993701],[-6.528769,4.705088],[-7.518941,4.338288],[-7.712159,4.364566],[-7.635368,5.188159],[-7.539715,5.313345],[-7.570153,5.707352],[-7.993693,6.12619],[-8.311348,6.193033],[-8.60288,6.467564],[-8.385452,6.911801],[-8.485446,7.395208],[-8.439298,7.686043],[-8.280703,7.68718],[-8.221792,8.123329],[-8.299049,8.316444],[-8.203499,8.455453],[-7.8321,8.575704],[-8.079114,9.376224],[-8.309616,9.789532],[-8.229337,10.12902],[-8.029944,10.206535],[-7.89959,10.297382],[-7.622759,10.147236],[-6.850507,10.138994],[-6.666461,10.430811],[-6.493965,10.411303],[-6.205223,10.524061],[-6.050452,10.096361],[-5.816926,10.222555],[-5.404342,10.370737],[-4.954653,10.152714],[-4.779884,9.821985],[-4.330247,9.610835],[-3.980449,9.862344],[-3.511899,9.900326],[-2.827496,9.642461],[-2.56219,8.219628],[-2.983585,7.379705],[-3.24437,6.250472],[-2.810701,5.389051],[-2.856125,4.994476]]]}}, +{"type":"Feature","id":"CMR","properties":{"name":"Cameroon"},"geometry":{"type":"Polygon","coordinates":[[[13.075822,2.267097],[12.951334,2.321616],[12.35938,2.192812],[11.751665,2.326758],[11.276449,2.261051],[9.649158,2.283866],[9.795196,3.073404],[9.404367,3.734527],[8.948116,3.904129],[8.744924,4.352215],[8.488816,4.495617],[8.500288,4.771983],[8.757533,5.479666],[9.233163,6.444491],[9.522706,6.453482],[10.118277,7.03877],[10.497375,7.055358],[11.058788,6.644427],[11.745774,6.981383],[11.839309,7.397042],[12.063946,7.799808],[12.218872,8.305824],[12.753672,8.717763],[12.955468,9.417772],[13.1676,9.640626],[13.308676,10.160362],[13.57295,10.798566],[14.415379,11.572369],[14.468192,11.904752],[14.577178,12.085361],[14.181336,12.483657],[14.213531,12.802035],[14.495787,12.859396],[14.893386,12.219048],[14.960152,11.555574],[14.923565,10.891325],[15.467873,9.982337],[14.909354,9.992129],[14.627201,9.920919],[14.171466,10.021378],[13.954218,9.549495],[14.544467,8.965861],[14.979996,8.796104],[15.120866,8.38215],[15.436092,7.692812],[15.27946,7.421925],[14.776545,6.408498],[14.53656,6.226959],[14.459407,5.451761],[14.558936,5.030598],[14.478372,4.732605],[14.950953,4.210389],[15.03622,3.851367],[15.405396,3.335301],[15.862732,3.013537],[15.907381,2.557389],[16.012852,2.26764],[15.940919,1.727673],[15.146342,1.964015],[14.337813,2.227875],[13.075822,2.267097]]]}}, +{"type":"Feature","id":"COD","properties":{"name":"Democratic Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[30.83386,3.509166],[30.773347,2.339883],[31.174149,2.204465],[30.85267,1.849396],[30.468508,1.583805],[30.086154,1.062313],[29.875779,0.59738],[29.819503,-0.20531],[29.587838,-0.587406],[29.579466,-1.341313],[29.291887,-1.620056],[29.254835,-2.21511],[29.117479,-2.292211],[29.024926,-2.839258],[29.276384,-3.293907],[29.339998,-4.499983],[29.519987,-5.419979],[29.419993,-5.939999],[29.620032,-6.520015],[30.199997,-7.079981],[30.740015,-8.340007],[30.346086,-8.238257],[29.002912,-8.407032],[28.734867,-8.526559],[28.449871,-9.164918],[28.673682,-9.605925],[28.49607,-10.789884],[28.372253,-11.793647],[28.642417,-11.971569],[29.341548,-12.360744],[29.616001,-12.178895],[29.699614,-13.257227],[28.934286,-13.248958],[28.523562,-12.698604],[28.155109,-12.272481],[27.388799,-12.132747],[27.16442,-11.608748],[26.553088,-11.92444],[25.75231,-11.784965],[25.418118,-11.330936],[24.78317,-11.238694],[24.314516,-11.262826],[24.257155,-10.951993],[23.912215,-10.926826],[23.456791,-10.867863],[22.837345,-11.017622],[22.402798,-10.993075],[22.155268,-11.084801],[22.208753,-9.894796],[21.875182,-9.523708],[21.801801,-8.908707],[21.949131,-8.305901],[21.746456,-7.920085],[21.728111,-7.290872],[20.514748,-7.299606],[20.601823,-6.939318],[20.091622,-6.94309],[20.037723,-7.116361],[19.417502,-7.155429],[19.166613,-7.738184],[19.016752,-7.988246],[18.464176,-7.847014],[18.134222,-7.987678],[17.47297,-8.068551],[17.089996,-7.545689],[16.860191,-7.222298],[16.57318,-6.622645],[16.326528,-5.87747],[13.375597,-5.864241],[13.024869,-5.984389],[12.735171,-5.965682],[12.322432,-6.100092],[12.182337,-5.789931],[12.436688,-5.684304],[12.468004,-5.248362],[12.631612,-4.991271],[12.995517,-4.781103],[13.25824,-4.882957],[13.600235,-4.500138],[14.144956,-4.510009],[14.209035,-4.793092],[14.582604,-4.970239],[15.170992,-4.343507],[15.75354,-3.855165],[16.00629,-3.535133],[15.972803,-2.712392],[16.407092,-1.740927],[16.865307,-1.225816],[17.523716,-0.74383],[17.638645,-0.424832],[17.663553,-0.058084],[17.82654,0.288923],[17.774192,0.855659],[17.898835,1.741832],[18.094276,2.365722],[18.393792,2.900443],[18.453065,3.504386],[18.542982,4.201785],[18.932312,4.709506],[19.467784,5.031528],[20.290679,4.691678],[20.927591,4.322786],[21.659123,4.224342],[22.405124,4.02916],[22.704124,4.633051],[22.84148,4.710126],[23.297214,4.609693],[24.410531,5.108784],[24.805029,4.897247],[25.128833,4.927245],[25.278798,5.170408],[25.650455,5.256088],[26.402761,5.150875],[27.044065,5.127853],[27.374226,5.233944],[27.979977,4.408413],[28.428994,4.287155],[28.696678,4.455077],[29.159078,4.389267],[29.715995,4.600805],[29.9535,4.173699],[30.83386,3.509166]]]}}, +{"type":"Feature","id":"COG","properties":{"name":"Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[12.995517,-4.781103],[12.62076,-4.438023],[12.318608,-4.60623],[11.914963,-5.037987],[11.093773,-3.978827],[11.855122,-3.426871],[11.478039,-2.765619],[11.820964,-2.514161],[12.495703,-2.391688],[12.575284,-1.948511],[13.109619,-2.42874],[13.992407,-2.470805],[14.29921,-1.998276],[14.425456,-1.333407],[14.316418,-0.552627],[13.843321,0.038758],[14.276266,1.19693],[14.026669,1.395677],[13.282631,1.314184],[13.003114,1.830896],[13.075822,2.267097],[14.337813,2.227875],[15.146342,1.964015],[15.940919,1.727673],[16.012852,2.26764],[16.537058,3.198255],[17.133042,3.728197],[17.8099,3.560196],[18.453065,3.504386],[18.393792,2.900443],[18.094276,2.365722],[17.898835,1.741832],[17.774192,0.855659],[17.82654,0.288923],[17.663553,-0.058084],[17.638645,-0.424832],[17.523716,-0.74383],[16.865307,-1.225816],[16.407092,-1.740927],[15.972803,-2.712392],[16.00629,-3.535133],[15.75354,-3.855165],[15.170992,-4.343507],[14.582604,-4.970239],[14.209035,-4.793092],[14.144956,-4.510009],[13.600235,-4.500138],[13.25824,-4.882957],[12.995517,-4.781103]]]}}, +{"type":"Feature","id":"COL","properties":{"name":"Colombia"},"geometry":{"type":"Polygon","coordinates":[[[-75.373223,-0.152032],[-75.801466,0.084801],[-76.292314,0.416047],[-76.57638,0.256936],[-77.424984,0.395687],[-77.668613,0.825893],[-77.855061,0.809925],[-78.855259,1.380924],[-78.990935,1.69137],[-78.617831,1.766404],[-78.662118,2.267355],[-78.42761,2.629556],[-77.931543,2.696606],[-77.510431,3.325017],[-77.12769,3.849636],[-77.496272,4.087606],[-77.307601,4.667984],[-77.533221,5.582812],[-77.318815,5.845354],[-77.476661,6.691116],[-77.881571,7.223771],[-77.753414,7.70984],[-77.431108,7.638061],[-77.242566,7.935278],[-77.474723,8.524286],[-77.353361,8.670505],[-76.836674,8.638749],[-76.086384,9.336821],[-75.6746,9.443248],[-75.664704,9.774003],[-75.480426,10.61899],[-74.906895,11.083045],[-74.276753,11.102036],[-74.197223,11.310473],[-73.414764,11.227015],[-72.627835,11.731972],[-72.238195,11.95555],[-71.75409,12.437303],[-71.399822,12.376041],[-71.137461,12.112982],[-71.331584,11.776284],[-71.973922,11.608672],[-72.227575,11.108702],[-72.614658,10.821975],[-72.905286,10.450344],[-73.027604,9.73677],[-73.304952,9.152],[-72.78873,9.085027],[-72.660495,8.625288],[-72.439862,8.405275],[-72.360901,8.002638],[-72.479679,7.632506],[-72.444487,7.423785],[-72.198352,7.340431],[-71.960176,6.991615],[-70.674234,7.087785],[-70.093313,6.960376],[-69.38948,6.099861],[-68.985319,6.206805],[-68.265052,6.153268],[-67.695087,6.267318],[-67.34144,6.095468],[-67.521532,5.55687],[-67.744697,5.221129],[-67.823012,4.503937],[-67.621836,3.839482],[-67.337564,3.542342],[-67.303173,3.318454],[-67.809938,2.820655],[-67.447092,2.600281],[-67.181294,2.250638],[-66.876326,1.253361],[-67.065048,1.130112],[-67.259998,1.719999],[-67.53781,2.037163],[-67.868565,1.692455],[-69.816973,1.714805],[-69.804597,1.089081],[-69.218638,0.985677],[-69.252434,0.602651],[-69.452396,0.706159],[-70.015566,0.541414],[-70.020656,-0.185156],[-69.577065,-0.549992],[-69.420486,-1.122619],[-69.444102,-1.556287],[-69.893635,-4.298187],[-70.394044,-3.766591],[-70.692682,-3.742872],[-70.047709,-2.725156],[-70.813476,-2.256865],[-71.413646,-2.342802],[-71.774761,-2.16979],[-72.325787,-2.434218],[-73.070392,-2.308954],[-73.659504,-1.260491],[-74.122395,-1.002833],[-74.441601,-0.53082],[-75.106625,-0.057205],[-75.373223,-0.152032]]]}}, +{"type":"Feature","id":"CRI","properties":{"name":"Costa Rica"},"geometry":{"type":"Polygon","coordinates":[[[-82.965783,8.225028],[-83.508437,8.446927],[-83.711474,8.656836],[-83.596313,8.830443],[-83.632642,9.051386],[-83.909886,9.290803],[-84.303402,9.487354],[-84.647644,9.615537],[-84.713351,9.908052],[-84.97566,10.086723],[-84.911375,9.795992],[-85.110923,9.55704],[-85.339488,9.834542],[-85.660787,9.933347],[-85.797445,10.134886],[-85.791709,10.439337],[-85.659314,10.754331],[-85.941725,10.895278],[-85.71254,11.088445],[-85.561852,11.217119],[-84.903003,10.952303],[-84.673069,11.082657],[-84.355931,10.999226],[-84.190179,10.79345],[-83.895054,10.726839],[-83.655612,10.938764],[-83.40232,10.395438],[-83.015677,9.992982],[-82.546196,9.566135],[-82.932891,9.476812],[-82.927155,9.07433],[-82.719183,8.925709],[-82.868657,8.807266],[-82.829771,8.626295],[-82.913176,8.423517],[-82.965783,8.225028]]]}}, +{"type":"Feature","id":"CUB","properties":{"name":"Cuba"},"geometry":{"type":"Polygon","coordinates":[[[-82.268151,23.188611],[-81.404457,23.117271],[-80.618769,23.10598],[-79.679524,22.765303],[-79.281486,22.399202],[-78.347434,22.512166],[-77.993296,22.277194],[-77.146422,21.657851],[-76.523825,21.20682],[-76.19462,21.220565],[-75.598222,21.016624],[-75.67106,20.735091],[-74.933896,20.693905],[-74.178025,20.284628],[-74.296648,20.050379],[-74.961595,19.923435],[-75.63468,19.873774],[-76.323656,19.952891],[-77.755481,19.855481],[-77.085108,20.413354],[-77.492655,20.673105],[-78.137292,20.739949],[-78.482827,21.028613],[-78.719867,21.598114],[-79.285,21.559175],[-80.217475,21.827324],[-80.517535,22.037079],[-81.820943,22.192057],[-82.169992,22.387109],[-81.795002,22.636965],[-82.775898,22.68815],[-83.494459,22.168518],[-83.9088,22.154565],[-84.052151,21.910575],[-84.54703,21.801228],[-84.974911,21.896028],[-84.447062,22.20495],[-84.230357,22.565755],[-83.77824,22.788118],[-83.267548,22.983042],[-82.510436,23.078747],[-82.268151,23.188611]]]}}, +{"type":"Feature","id":"-99","properties":{"name":"Northern Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[32.73178,35.140026],[32.802474,35.145504],[32.946961,35.386703],[33.667227,35.373216],[34.576474,35.671596],[33.900804,35.245756],[33.973617,35.058506],[33.86644,35.093595],[33.675392,35.017863],[33.525685,35.038688],[33.475817,35.000345],[33.455922,35.101424],[33.383833,35.162712],[33.190977,35.173125],[32.919572,35.087833],[32.73178,35.140026]]]}}, +{"type":"Feature","id":"CYP","properties":{"name":"Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[33.973617,35.058506],[34.004881,34.978098],[32.979827,34.571869],[32.490296,34.701655],[32.256667,35.103232],[32.73178,35.140026],[32.919572,35.087833],[33.190977,35.173125],[33.383833,35.162712],[33.455922,35.101424],[33.475817,35.000345],[33.525685,35.038688],[33.675392,35.017863],[33.86644,35.093595],[33.973617,35.058506]]]}}, +{"type":"Feature","id":"CZE","properties":{"name":"Czech Republic"},"geometry":{"type":"Polygon","coordinates":[[[16.960288,48.596982],[16.499283,48.785808],[16.029647,48.733899],[15.253416,49.039074],[14.901447,48.964402],[14.338898,48.555305],[13.595946,48.877172],[13.031329,49.307068],[12.521024,49.547415],[12.415191,49.969121],[12.240111,50.266338],[12.966837,50.484076],[13.338132,50.733234],[14.056228,50.926918],[14.307013,51.117268],[14.570718,51.002339],[15.016996,51.106674],[15.490972,50.78473],[16.238627,50.697733],[16.176253,50.422607],[16.719476,50.215747],[16.868769,50.473974],[17.554567,50.362146],[17.649445,50.049038],[18.392914,49.988629],[18.853144,49.49623],[18.554971,49.495015],[18.399994,49.315001],[18.170498,49.271515],[18.104973,49.043983],[17.913512,48.996493],[17.886485,48.903475],[17.545007,48.800019],[17.101985,48.816969],[16.960288,48.596982]]]}}, +{"type":"Feature","id":"DEU","properties":{"name":"Germany"},"geometry":{"type":"Polygon","coordinates":[[[9.921906,54.983104],[9.93958,54.596642],[10.950112,54.363607],[10.939467,54.008693],[11.956252,54.196486],[12.51844,54.470371],[13.647467,54.075511],[14.119686,53.757029],[14.353315,53.248171],[14.074521,52.981263],[14.4376,52.62485],[14.685026,52.089947],[14.607098,51.745188],[15.016996,51.106674],[14.570718,51.002339],[14.307013,51.117268],[14.056228,50.926918],[13.338132,50.733234],[12.966837,50.484076],[12.240111,50.266338],[12.415191,49.969121],[12.521024,49.547415],[13.031329,49.307068],[13.595946,48.877172],[13.243357,48.416115],[12.884103,48.289146],[13.025851,47.637584],[12.932627,47.467646],[12.62076,47.672388],[12.141357,47.703083],[11.426414,47.523766],[10.544504,47.566399],[10.402084,47.302488],[9.896068,47.580197],[9.594226,47.525058],[8.522612,47.830828],[8.317301,47.61358],[7.466759,47.620582],[7.593676,48.333019],[8.099279,49.017784],[6.65823,49.201958],[6.18632,49.463803],[6.242751,49.902226],[6.043073,50.128052],[6.156658,50.803721],[5.988658,51.851616],[6.589397,51.852029],[6.84287,52.22844],[7.092053,53.144043],[6.90514,53.482162],[7.100425,53.693932],[7.936239,53.748296],[8.121706,53.527792],[8.800734,54.020786],[8.572118,54.395646],[8.526229,54.962744],[9.282049,54.830865],[9.921906,54.983104]]]}}, +{"type":"Feature","id":"DJI","properties":{"name":"Djibouti"},"geometry":{"type":"Polygon","coordinates":[[[43.081226,12.699639],[43.317852,12.390148],[43.286381,11.974928],[42.715874,11.735641],[43.145305,11.46204],[42.776852,10.926879],[42.55493,11.10511],[42.31414,11.0342],[41.75557,11.05091],[41.73959,11.35511],[41.66176,11.6312],[42,12.1],[42.35156,12.54223],[42.779642,12.455416],[43.081226,12.699639]]]}}, +{"type":"Feature","id":"DNK","properties":{"name":"Denmark"},"geometry":{"type":"MultiPolygon","coordinates":[[[[12.690006,55.609991],[12.089991,54.800015],[11.043543,55.364864],[10.903914,55.779955],[12.370904,56.111407],[12.690006,55.609991]]],[[[10.912182,56.458621],[10.667804,56.081383],[10.369993,56.190007],[9.649985,55.469999],[9.921906,54.983104],[9.282049,54.830865],[8.526229,54.962744],[8.120311,55.517723],[8.089977,56.540012],[8.256582,56.809969],[8.543438,57.110003],[9.424469,57.172066],[9.775559,57.447941],[10.580006,57.730017],[10.546106,57.215733],[10.25,56.890016],[10.369993,56.609982],[10.912182,56.458621]]]]}}, +{"type":"Feature","id":"DOM","properties":{"name":"Dominican Republic"},"geometry":{"type":"Polygon","coordinates":[[[-71.712361,19.714456],[-71.587304,19.884911],[-70.806706,19.880286],[-70.214365,19.622885],[-69.950815,19.648],[-69.76925,19.293267],[-69.222126,19.313214],[-69.254346,19.015196],[-68.809412,18.979074],[-68.317943,18.612198],[-68.689316,18.205142],[-69.164946,18.422648],[-69.623988,18.380713],[-69.952934,18.428307],[-70.133233,18.245915],[-70.517137,18.184291],[-70.669298,18.426886],[-70.99995,18.283329],[-71.40021,17.598564],[-71.657662,17.757573],[-71.708305,18.044997],[-71.687738,18.31666],[-71.945112,18.6169],[-71.701303,18.785417],[-71.624873,19.169838],[-71.712361,19.714456]]]}}, +{"type":"Feature","id":"DZA","properties":{"name":"Algeria"},"geometry":{"type":"Polygon","coordinates":[[[11.999506,23.471668],[8.572893,21.565661],[5.677566,19.601207],[4.267419,19.155265],[3.158133,19.057364],[3.146661,19.693579],[2.683588,19.85623],[2.060991,20.142233],[1.823228,20.610809],[-1.550055,22.792666],[-4.923337,24.974574],[-8.6844,27.395744],[-8.665124,27.589479],[-8.66559,27.656426],[-8.674116,28.841289],[-7.059228,29.579228],[-6.060632,29.7317],[-5.242129,30.000443],[-4.859646,30.501188],[-3.690441,30.896952],[-3.647498,31.637294],[-3.06898,31.724498],[-2.616605,32.094346],[-1.307899,32.262889],[-1.124551,32.651522],[-1.388049,32.864015],[-1.733455,33.919713],[-1.792986,34.527919],[-2.169914,35.168396],[-1.208603,35.714849],[-0.127454,35.888662],[0.503877,36.301273],[1.466919,36.605647],[3.161699,36.783905],[4.815758,36.865037],[5.32012,36.716519],[6.26182,37.110655],[7.330385,37.118381],[7.737078,36.885708],[8.420964,36.946427],[8.217824,36.433177],[8.376368,35.479876],[8.140981,34.655146],[7.524482,34.097376],[7.612642,33.344115],[8.430473,32.748337],[8.439103,32.506285],[9.055603,32.102692],[9.48214,30.307556],[9.805634,29.424638],[9.859998,28.95999],[9.683885,28.144174],[9.756128,27.688259],[9.629056,27.140953],[9.716286,26.512206],[9.319411,26.094325],[9.910693,25.365455],[9.948261,24.936954],[10.303847,24.379313],[10.771364,24.562532],[11.560669,24.097909],[11.999506,23.471668]]]}}, +{"type":"Feature","id":"ECU","properties":{"name":"Ecuador"},"geometry":{"type":"Polygon","coordinates":[[[-80.302561,-3.404856],[-79.770293,-2.657512],[-79.986559,-2.220794],[-80.368784,-2.685159],[-80.967765,-2.246943],[-80.764806,-1.965048],[-80.933659,-1.057455],[-80.58337,-0.906663],[-80.399325,-0.283703],[-80.020898,0.36034],[-80.09061,0.768429],[-79.542762,0.982938],[-78.855259,1.380924],[-77.855061,0.809925],[-77.668613,0.825893],[-77.424984,0.395687],[-76.57638,0.256936],[-76.292314,0.416047],[-75.801466,0.084801],[-75.373223,-0.152032],[-75.233723,-0.911417],[-75.544996,-1.56161],[-76.635394,-2.608678],[-77.837905,-3.003021],[-78.450684,-3.873097],[-78.639897,-4.547784],[-79.205289,-4.959129],[-79.624979,-4.454198],[-80.028908,-4.346091],[-80.442242,-4.425724],[-80.469295,-4.059287],[-80.184015,-3.821162],[-80.302561,-3.404856]]]}}, +{"type":"Feature","id":"EGY","properties":{"name":"Egypt"},"geometry":{"type":"Polygon","coordinates":[[[34.9226,29.50133],[34.64174,29.09942],[34.42655,28.34399],[34.15451,27.8233],[33.92136,27.6487],[33.58811,27.97136],[33.13676,28.41765],[32.42323,29.85108],[32.32046,29.76043],[32.73482,28.70523],[33.34876,27.69989],[34.10455,26.14227],[34.47387,25.59856],[34.79507,25.03375],[35.69241,23.92671],[35.49372,23.75237],[35.52598,23.10244],[36.69069,22.20485],[36.86623,22],[32.9,22],[29.02,22],[25,22],[25,25.6825],[25,29.238655],[24.70007,30.04419],[24.95762,30.6616],[24.80287,31.08929],[25.16482,31.56915],[26.49533,31.58568],[27.45762,31.32126],[28.45048,31.02577],[28.91353,30.87005],[29.68342,31.18686],[30.09503,31.4734],[30.97693,31.55586],[31.68796,31.4296],[31.96041,30.9336],[32.19247,31.26034],[32.99392,31.02407],[33.7734,30.96746],[34.26544,31.21936],[34.9226,29.50133]]]}}, +{"type":"Feature","id":"ERI","properties":{"name":"Eritrea"},"geometry":{"type":"Polygon","coordinates":[[[42.35156,12.54223],[42.00975,12.86582],[41.59856,13.45209],[41.155194,13.77332],[40.8966,14.11864],[40.026219,14.519579],[39.34061,14.53155],[39.0994,14.74064],[38.51295,14.50547],[37.90607,14.95943],[37.59377,14.2131],[36.42951,14.42211],[36.323189,14.822481],[36.75386,16.291874],[36.85253,16.95655],[37.16747,17.26314],[37.904,17.42754],[38.41009,17.998307],[38.990623,16.840626],[39.26611,15.922723],[39.814294,15.435647],[41.179275,14.49108],[41.734952,13.921037],[42.276831,13.343992],[42.589576,13.000421],[43.081226,12.699639],[42.779642,12.455416],[42.35156,12.54223]]]}}, +{"type":"Feature","id":"ESP","properties":{"name":"Spain"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.984433,42.592775],[-9.392884,43.026625],[-7.97819,43.748338],[-6.754492,43.567909],[-5.411886,43.57424],[-4.347843,43.403449],[-3.517532,43.455901],[-1.901351,43.422802],[-1.502771,43.034014],[0.338047,42.579546],[0.701591,42.795734],[1.826793,42.343385],[2.985999,42.473015],[3.039484,41.89212],[2.091842,41.226089],[0.810525,41.014732],[0.721331,40.678318],[0.106692,40.123934],[-0.278711,39.309978],[0.111291,38.738514],[-0.467124,38.292366],[-0.683389,37.642354],[-1.438382,37.443064],[-2.146453,36.674144],[-3.415781,36.6589],[-4.368901,36.677839],[-4.995219,36.324708],[-5.37716,35.94685],[-5.866432,36.029817],[-6.236694,36.367677],[-6.520191,36.942913],[-7.453726,37.097788],[-7.537105,37.428904],[-7.166508,37.803894],[-7.029281,38.075764],[-7.374092,38.373059],[-7.098037,39.030073],[-7.498632,39.629571],[-7.066592,39.711892],[-7.026413,40.184524],[-6.86402,40.330872],[-6.851127,41.111083],[-6.389088,41.381815],[-6.668606,41.883387],[-7.251309,41.918346],[-7.422513,41.792075],[-8.013175,41.790886],[-8.263857,42.280469],[-8.671946,42.134689],[-9.034818,41.880571]]]}}, +{"type":"Feature","id":"EST","properties":{"name":"Estonia"},"geometry":{"type":"Polygon","coordinates":[[[24.312863,57.793424],[24.428928,58.383413],[24.061198,58.257375],[23.42656,58.612753],[23.339795,59.18724],[24.604214,59.465854],[25.864189,59.61109],[26.949136,59.445803],[27.981114,59.475388],[28.131699,59.300825],[27.420166,58.724581],[27.716686,57.791899],[27.288185,57.474528],[26.463532,57.476389],[25.60281,57.847529],[25.164594,57.970157],[24.312863,57.793424]]]}}, +{"type":"Feature","id":"ETH","properties":{"name":"Ethiopia"},"geometry":{"type":"Polygon","coordinates":[[[37.90607,14.95943],[38.51295,14.50547],[39.0994,14.74064],[39.34061,14.53155],[40.02625,14.51959],[40.8966,14.11864],[41.1552,13.77333],[41.59856,13.45209],[42.00975,12.86582],[42.35156,12.54223],[42,12.1],[41.66176,11.6312],[41.73959,11.35511],[41.75557,11.05091],[42.31414,11.0342],[42.55493,11.10511],[42.776852,10.926879],[42.55876,10.57258],[42.92812,10.02194],[43.29699,9.54048],[43.67875,9.18358],[46.94834,7.99688],[47.78942,8.003],[44.9636,5.00162],[43.66087,4.95755],[42.76967,4.25259],[42.12861,4.23413],[41.855083,3.918912],[41.1718,3.91909],[40.76848,4.25702],[39.85494,3.83879],[39.559384,3.42206],[38.89251,3.50074],[38.67114,3.61607],[38.43697,3.58851],[38.120915,3.598605],[36.855093,4.447864],[36.159079,4.447864],[35.817448,4.776966],[35.817448,5.338232],[35.298007,5.506],[34.70702,6.59422],[34.25032,6.82607],[34.0751,7.22595],[33.56829,7.71334],[32.95418,7.78497],[33.2948,8.35458],[33.8255,8.37916],[33.97498,8.68456],[33.96162,9.58358],[34.25745,10.63009],[34.73115,10.91017],[34.83163,11.31896],[35.26049,12.08286],[35.86363,12.57828],[36.27022,13.56333],[36.42951,14.42211],[37.59377,14.2131],[37.90607,14.95943]]]}}, +{"type":"Feature","id":"FIN","properties":{"name":"Finland"},"geometry":{"type":"Polygon","coordinates":[[[28.59193,69.064777],[28.445944,68.364613],[29.977426,67.698297],[29.054589,66.944286],[30.21765,65.80598],[29.54443,64.948672],[30.444685,64.204453],[30.035872,63.552814],[31.516092,62.867687],[31.139991,62.357693],[30.211107,61.780028],[28.069998,60.503517],[26.255173,60.423961],[24.496624,60.057316],[22.869695,59.846373],[22.290764,60.391921],[21.322244,60.72017],[21.544866,61.705329],[21.059211,62.607393],[21.536029,63.189735],[22.442744,63.81781],[24.730512,64.902344],[25.398068,65.111427],[25.294043,65.534346],[23.903379,66.006927],[23.56588,66.396051],[23.539473,67.936009],[21.978535,68.616846],[20.645593,69.106247],[21.244936,69.370443],[22.356238,68.841741],[23.66205,68.891247],[24.735679,68.649557],[25.689213,69.092114],[26.179622,69.825299],[27.732292,70.164193],[29.015573,69.766491],[28.59193,69.064777]]]}}, +{"type":"Feature","id":"FJI","properties":{"name":"Fiji"},"geometry":{"type":"MultiPolygon","coordinates":[[[[178.3736,-17.33992],[178.71806,-17.62846],[178.55271,-18.15059],[177.93266,-18.28799],[177.38146,-18.16432],[177.28504,-17.72465],[177.67087,-17.38114],[178.12557,-17.50481],[178.3736,-17.33992]]],[[[179.364143,-16.801354],[178.725059,-17.012042],[178.596839,-16.63915],[179.096609,-16.433984],[179.413509,-16.379054],[180,-16.067133],[180,-16.555217],[179.364143,-16.801354]]],[[[-179.917369,-16.501783],[-180,-16.555217],[-180,-16.067133],[-179.79332,-16.020882],[-179.917369,-16.501783]]]]}}, +{"type":"Feature","id":"FLK","properties":{"name":"Falkland Islands"},"geometry":{"type":"Polygon","coordinates":[[[-61.2,-51.85],[-60,-51.25],[-59.15,-51.5],[-58.55,-51.1],[-57.75,-51.55],[-58.05,-51.9],[-59.4,-52.2],[-59.85,-51.85],[-60.7,-52.3],[-61.2,-51.85]]]}}, +{"type":"Feature","id":"FRA","properties":{"name":"France"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.560016,42.152492],[9.229752,41.380007],[8.775723,41.583612],[8.544213,42.256517],[8.746009,42.628122],[9.390001,43.009985],[9.560016,42.152492]]],[[[3.588184,50.378992],[4.286023,49.907497],[4.799222,49.985373],[5.674052,49.529484],[5.897759,49.442667],[6.18632,49.463803],[6.65823,49.201958],[8.099279,49.017784],[7.593676,48.333019],[7.466759,47.620582],[7.192202,47.449766],[6.736571,47.541801],[6.768714,47.287708],[6.037389,46.725779],[6.022609,46.27299],[6.5001,46.429673],[6.843593,45.991147],[6.802355,45.70858],[7.096652,45.333099],[6.749955,45.028518],[7.007562,44.254767],[7.549596,44.127901],[7.435185,43.693845],[6.529245,43.128892],[4.556963,43.399651],[3.100411,43.075201],[2.985999,42.473015],[1.826793,42.343385],[0.701591,42.795734],[0.338047,42.579546],[-1.502771,43.034014],[-1.901351,43.422802],[-1.384225,44.02261],[-1.193798,46.014918],[-2.225724,47.064363],[-2.963276,47.570327],[-4.491555,47.954954],[-4.59235,48.68416],[-3.295814,48.901692],[-1.616511,48.644421],[-1.933494,49.776342],[-0.989469,49.347376],[1.338761,50.127173],[1.639001,50.946606],[2.513573,51.148506],[2.658422,50.796848],[3.123252,50.780363],[3.588184,50.378992]]]]}}, +{"type":"Feature","id":"GAB","properties":{"name":"Gabon"},"geometry":{"type":"Polygon","coordinates":[[[11.093773,-3.978827],[10.066135,-2.969483],[9.405245,-2.144313],[8.797996,-1.111301],[8.830087,-0.779074],[9.04842,-0.459351],[9.291351,0.268666],[9.492889,1.01012],[9.830284,1.067894],[11.285079,1.057662],[11.276449,2.261051],[11.751665,2.326758],[12.35938,2.192812],[12.951334,2.321616],[13.075822,2.267097],[13.003114,1.830896],[13.282631,1.314184],[14.026669,1.395677],[14.276266,1.19693],[13.843321,0.038758],[14.316418,-0.552627],[14.425456,-1.333407],[14.29921,-1.998276],[13.992407,-2.470805],[13.109619,-2.42874],[12.575284,-1.948511],[12.495703,-2.391688],[11.820964,-2.514161],[11.478039,-2.765619],[11.855122,-3.426871],[11.093773,-3.978827]]]}}, +{"type":"Feature","id":"GBR","properties":{"name":"United Kingdom"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-5.661949,54.554603],[-6.197885,53.867565],[-6.95373,54.073702],[-7.572168,54.059956],[-7.366031,54.595841],[-7.572168,55.131622],[-6.733847,55.17286],[-5.661949,54.554603]]],[[[-3.005005,58.635],[-4.073828,57.553025],[-3.055002,57.690019],[-1.959281,57.6848],[-2.219988,56.870017],[-3.119003,55.973793],[-2.085009,55.909998],[-2.005676,55.804903],[-1.114991,54.624986],[-0.430485,54.464376],[0.184981,53.325014],[0.469977,52.929999],[1.681531,52.73952],[1.559988,52.099998],[1.050562,51.806761],[1.449865,51.289428],[0.550334,50.765739],[-0.787517,50.774989],[-2.489998,50.500019],[-2.956274,50.69688],[-3.617448,50.228356],[-4.542508,50.341837],[-5.245023,49.96],[-5.776567,50.159678],[-4.30999,51.210001],[-3.414851,51.426009],[-3.422719,51.426848],[-4.984367,51.593466],[-5.267296,51.9914],[-4.222347,52.301356],[-4.770013,52.840005],[-4.579999,53.495004],[-3.093831,53.404547],[-3.09208,53.404441],[-2.945009,53.985],[-3.614701,54.600937],[-3.630005,54.615013],[-4.844169,54.790971],[-5.082527,55.061601],[-4.719112,55.508473],[-5.047981,55.783986],[-5.586398,55.311146],[-5.644999,56.275015],[-6.149981,56.78501],[-5.786825,57.818848],[-5.009999,58.630013],[-4.211495,58.550845],[-3.005005,58.635]]]]}}, +{"type":"Feature","id":"GEO","properties":{"name":"Georgia"},"geometry":{"type":"Polygon","coordinates":[[[41.554084,41.535656],[41.703171,41.962943],[41.45347,42.645123],[40.875469,43.013628],[40.321394,43.128634],[39.955009,43.434998],[40.076965,43.553104],[40.922185,43.382159],[42.394395,43.220308],[43.756017,42.740828],[43.9312,42.554974],[44.537623,42.711993],[45.470279,42.502781],[45.77641,42.092444],[46.404951,41.860675],[46.145432,41.722802],[46.637908,41.181673],[46.501637,41.064445],[45.962601,41.123873],[45.217426,41.411452],[44.97248,41.248129],[43.582746,41.092143],[42.619549,41.583173],[41.554084,41.535656]]]}}, +{"type":"Feature","id":"GHA","properties":{"name":"Ghana"},"geometry":{"type":"Polygon","coordinates":[[[1.060122,5.928837],[-0.507638,5.343473],[-1.063625,5.000548],[-1.964707,4.710462],[-2.856125,4.994476],[-2.810701,5.389051],[-3.24437,6.250472],[-2.983585,7.379705],[-2.56219,8.219628],[-2.827496,9.642461],[-2.963896,10.395335],[-2.940409,10.96269],[-1.203358,11.009819],[-0.761576,10.93693],[-0.438702,11.098341],[0.023803,11.018682],[-0.049785,10.706918],[0.36758,10.191213],[0.365901,9.465004],[0.461192,8.677223],[0.712029,8.312465],[0.490957,7.411744],[0.570384,6.914359],[0.836931,6.279979],[1.060122,5.928837]]]}}, +{"type":"Feature","id":"GIN","properties":{"name":"Guinea"},"geometry":{"type":"Polygon","coordinates":[[[-8.439298,7.686043],[-8.722124,7.711674],[-8.926065,7.309037],[-9.208786,7.313921],[-9.403348,7.526905],[-9.33728,7.928534],[-9.755342,8.541055],[-10.016567,8.428504],[-10.230094,8.406206],[-10.505477,8.348896],[-10.494315,8.715541],[-10.65477,8.977178],[-10.622395,9.26791],[-10.839152,9.688246],[-11.117481,10.045873],[-11.917277,10.046984],[-12.150338,9.858572],[-12.425929,9.835834],[-12.596719,9.620188],[-12.711958,9.342712],[-13.24655,8.903049],[-13.685154,9.494744],[-14.074045,9.886167],[-14.330076,10.01572],[-14.579699,10.214467],[-14.693232,10.656301],[-14.839554,10.876572],[-15.130311,11.040412],[-14.685687,11.527824],[-14.382192,11.509272],[-14.121406,11.677117],[-13.9008,11.678719],[-13.743161,11.811269],[-13.828272,12.142644],[-13.718744,12.247186],[-13.700476,12.586183],[-13.217818,12.575874],[-12.499051,12.33209],[-12.278599,12.35444],[-12.203565,12.465648],[-11.658301,12.386583],[-11.513943,12.442988],[-11.456169,12.076834],[-11.297574,12.077971],[-11.036556,12.211245],[-10.87083,12.177887],[-10.593224,11.923975],[-10.165214,11.844084],[-9.890993,12.060479],[-9.567912,12.194243],[-9.327616,12.334286],[-9.127474,12.30806],[-8.905265,12.088358],[-8.786099,11.812561],[-8.376305,11.393646],[-8.581305,11.136246],[-8.620321,10.810891],[-8.407311,10.909257],[-8.282357,10.792597],[-8.335377,10.494812],[-8.029944,10.206535],[-8.229337,10.12902],[-8.309616,9.789532],[-8.079114,9.376224],[-7.8321,8.575704],[-8.203499,8.455453],[-8.299049,8.316444],[-8.221792,8.123329],[-8.280703,7.68718],[-8.439298,7.686043]]]}}, +{"type":"Feature","id":"GMB","properties":{"name":"Gambia"},"geometry":{"type":"Polygon","coordinates":[[[-16.841525,13.151394],[-16.713729,13.594959],[-15.624596,13.623587],[-15.39877,13.860369],[-15.081735,13.876492],[-14.687031,13.630357],[-14.376714,13.62568],[-14.046992,13.794068],[-13.844963,13.505042],[-14.277702,13.280585],[-14.712197,13.298207],[-15.141163,13.509512],[-15.511813,13.27857],[-15.691001,13.270353],[-15.931296,13.130284],[-16.841525,13.151394]]]}}, +{"type":"Feature","id":"GNB","properties":{"name":"Guinea Bissau"},"geometry":{"type":"Polygon","coordinates":[[[-15.130311,11.040412],[-15.66418,11.458474],[-16.085214,11.524594],[-16.314787,11.806515],[-16.308947,11.958702],[-16.613838,12.170911],[-16.677452,12.384852],[-16.147717,12.547762],[-15.816574,12.515567],[-15.548477,12.62817],[-13.700476,12.586183],[-13.718744,12.247186],[-13.828272,12.142644],[-13.743161,11.811269],[-13.9008,11.678719],[-14.121406,11.677117],[-14.382192,11.509272],[-14.685687,11.527824],[-15.130311,11.040412]]]}}, +{"type":"Feature","id":"GNQ","properties":{"name":"Equatorial Guinea"},"geometry":{"type":"Polygon","coordinates":[[[9.492889,1.01012],[9.305613,1.160911],[9.649158,2.283866],[11.276449,2.261051],[11.285079,1.057662],[9.830284,1.067894],[9.492889,1.01012]]]}}, +{"type":"Feature","id":"GRC","properties":{"name":"Greece"},"geometry":{"type":"MultiPolygon","coordinates":[[[[23.69998,35.705004],[24.246665,35.368022],[25.025015,35.424996],[25.769208,35.354018],[25.745023,35.179998],[26.290003,35.29999],[26.164998,35.004995],[24.724982,34.919988],[24.735007,35.084991],[23.514978,35.279992],[23.69998,35.705004]]],[[[26.604196,41.562115],[26.294602,40.936261],[26.056942,40.824123],[25.447677,40.852545],[24.925848,40.947062],[23.714811,40.687129],[24.407999,40.124993],[23.899968,39.962006],[23.342999,39.960998],[22.813988,40.476005],[22.626299,40.256561],[22.849748,39.659311],[23.350027,39.190011],[22.973099,38.970903],[23.530016,38.510001],[24.025025,38.219993],[24.040011,37.655015],[23.115003,37.920011],[23.409972,37.409991],[22.774972,37.30501],[23.154225,36.422506],[22.490028,36.41],[21.670026,36.844986],[21.295011,37.644989],[21.120034,38.310323],[20.730032,38.769985],[20.217712,39.340235],[20.150016,39.624998],[20.615,40.110007],[20.674997,40.435],[20.99999,40.580004],[21.02004,40.842727],[21.674161,40.931275],[22.055378,41.149866],[22.597308,41.130487],[22.76177,41.3048],[22.952377,41.337994],[23.692074,41.309081],[24.492645,41.583896],[25.197201,41.234486],[26.106138,41.328899],[26.117042,41.826905],[26.604196,41.562115]]]]}}, +{"type":"Feature","id":"GRL","properties":{"name":"Greenland"},"geometry":{"type":"Polygon","coordinates":[[[-46.76379,82.62796],[-43.40644,83.22516],[-39.89753,83.18018],[-38.62214,83.54905],[-35.08787,83.64513],[-27.10046,83.51966],[-20.84539,82.72669],[-22.69182,82.34165],[-26.51753,82.29765],[-31.9,82.2],[-31.39646,82.02154],[-27.85666,82.13178],[-24.84448,81.78697],[-22.90328,82.09317],[-22.07175,81.73449],[-23.16961,81.15271],[-20.62363,81.52462],[-15.76818,81.91245],[-12.77018,81.71885],[-12.20855,81.29154],[-16.28533,80.58004],[-16.85,80.35],[-20.04624,80.17708],[-17.73035,80.12912],[-18.9,79.4],[-19.70499,78.75128],[-19.67353,77.63859],[-18.47285,76.98565],[-20.03503,76.94434],[-21.67944,76.62795],[-19.83407,76.09808],[-19.59896,75.24838],[-20.66818,75.15585],[-19.37281,74.29561],[-21.59422,74.22382],[-20.43454,73.81713],[-20.76234,73.46436],[-22.17221,73.30955],[-23.56593,73.30663],[-22.31311,72.62928],[-22.29954,72.18409],[-24.27834,72.59788],[-24.79296,72.3302],[-23.44296,72.08016],[-22.13281,71.46898],[-21.75356,70.66369],[-23.53603,70.471],[-24.30702,70.85649],[-25.54341,71.43094],[-25.20135,70.75226],[-26.36276,70.22646],[-23.72742,70.18401],[-22.34902,70.12946],[-25.02927,69.2588],[-27.74737,68.47046],[-30.67371,68.12503],[-31.77665,68.12078],[-32.81105,67.73547],[-34.20196,66.67974],[-36.35284,65.9789],[-37.04378,65.93768],[-38.37505,65.69213],[-39.81222,65.45848],[-40.66899,64.83997],[-40.68281,64.13902],[-41.1887,63.48246],[-42.81938,62.68233],[-42.41666,61.90093],[-42.86619,61.07404],[-43.3784,60.09772],[-44.7875,60.03676],[-46.26364,60.85328],[-48.26294,60.85843],[-49.23308,61.40681],[-49.90039,62.38336],[-51.63325,63.62691],[-52.14014,64.27842],[-52.27659,65.1767],[-53.66166,66.09957],[-53.30161,66.8365],[-53.96911,67.18899],[-52.9804,68.35759],[-51.47536,68.72958],[-51.08041,69.14781],[-50.87122,69.9291],[-52.013585,69.574925],[-52.55792,69.42616],[-53.45629,69.283625],[-54.68336,69.61003],[-54.75001,70.28932],[-54.35884,70.821315],[-53.431315,70.835755],[-51.39014,70.56978],[-53.10937,71.20485],[-54.00422,71.54719],[-55,71.406537],[-55.83468,71.65444],[-54.71819,72.58625],[-55.32634,72.95861],[-56.12003,73.64977],[-57.32363,74.71026],[-58.59679,75.09861],[-58.58516,75.51727],[-61.26861,76.10238],[-63.39165,76.1752],[-66.06427,76.13486],[-68.50438,76.06141],[-69.66485,76.37975],[-71.40257,77.00857],[-68.77671,77.32312],[-66.76397,77.37595],[-71.04293,77.63595],[-73.297,78.04419],[-73.15938,78.43271],[-69.37345,78.91388],[-65.7107,79.39436],[-65.3239,79.75814],[-68.02298,80.11721],[-67.15129,80.51582],[-63.68925,81.21396],[-62.23444,81.3211],[-62.65116,81.77042],[-60.28249,82.03363],[-57.20744,82.19074],[-54.13442,82.19962],[-53.04328,81.88833],[-50.39061,82.43883],[-48.00386,82.06481],[-46.59984,81.985945],[-44.523,81.6607],[-46.9007,82.19979],[-46.76379,82.62796]]]}}, +{"type":"Feature","id":"GTM","properties":{"name":"Guatemala"},"geometry":{"type":"Polygon","coordinates":[[[-90.095555,13.735338],[-90.608624,13.909771],[-91.23241,13.927832],[-91.689747,14.126218],[-92.22775,14.538829],[-92.20323,14.830103],[-92.087216,15.064585],[-92.229249,15.251447],[-91.74796,16.066565],[-90.464473,16.069562],[-90.438867,16.41011],[-90.600847,16.470778],[-90.711822,16.687483],[-91.08167,16.918477],[-91.453921,17.252177],[-91.002269,17.254658],[-91.00152,17.817595],[-90.067934,17.819326],[-89.14308,17.808319],[-89.150806,17.015577],[-89.229122,15.886938],[-88.930613,15.887273],[-88.604586,15.70638],[-88.518364,15.855389],[-88.225023,15.727722],[-88.68068,15.346247],[-89.154811,15.066419],[-89.22522,14.874286],[-89.145535,14.678019],[-89.353326,14.424133],[-89.587343,14.362586],[-89.534219,14.244816],[-89.721934,14.134228],[-90.064678,13.88197],[-90.095555,13.735338]]]}}, +{"type":"Feature","id":"GUF","properties":{"name":"French Guiana"},"geometry":{"type":"Polygon","coordinates":[[[-52.556425,2.504705],[-52.939657,2.124858],[-53.418465,2.053389],[-53.554839,2.334897],[-53.778521,2.376703],[-54.088063,2.105557],[-54.524754,2.311849],[-54.27123,2.738748],[-54.184284,3.194172],[-54.011504,3.62257],[-54.399542,4.212611],[-54.478633,4.896756],[-53.958045,5.756548],[-53.618453,5.646529],[-52.882141,5.409851],[-51.823343,4.565768],[-51.657797,4.156232],[-52.249338,3.241094],[-52.556425,2.504705]]]}}, +{"type":"Feature","id":"GUY","properties":{"name":"Guyana"},"geometry":{"type":"Polygon","coordinates":[[[-59.758285,8.367035],[-59.101684,7.999202],[-58.482962,7.347691],[-58.454876,6.832787],[-58.078103,6.809094],[-57.542219,6.321268],[-57.147436,5.97315],[-57.307246,5.073567],[-57.914289,4.812626],[-57.86021,4.576801],[-58.044694,4.060864],[-57.601569,3.334655],[-57.281433,3.333492],[-57.150098,2.768927],[-56.539386,1.899523],[-56.782704,1.863711],[-57.335823,1.948538],[-57.660971,1.682585],[-58.11345,1.507195],[-58.429477,1.463942],[-58.540013,1.268088],[-59.030862,1.317698],[-59.646044,1.786894],[-59.718546,2.24963],[-59.974525,2.755233],[-59.815413,3.606499],[-59.53804,3.958803],[-59.767406,4.423503],[-60.111002,4.574967],[-59.980959,5.014061],[-60.213683,5.244486],[-60.733574,5.200277],[-61.410303,5.959068],[-61.139415,6.234297],[-61.159336,6.696077],[-60.543999,6.856584],[-60.295668,7.043911],[-60.637973,7.415],[-60.550588,7.779603],[-59.758285,8.367035]]]}}, +{"type":"Feature","id":"HND","properties":{"name":"Honduras"},"geometry":{"type":"Polygon","coordinates":[[[-87.316654,12.984686],[-87.489409,13.297535],[-87.793111,13.38448],[-87.723503,13.78505],[-87.859515,13.893312],[-88.065343,13.964626],[-88.503998,13.845486],[-88.541231,13.980155],[-88.843073,14.140507],[-89.058512,14.340029],[-89.353326,14.424133],[-89.145535,14.678019],[-89.22522,14.874286],[-89.154811,15.066419],[-88.68068,15.346247],[-88.225023,15.727722],[-88.121153,15.688655],[-87.901813,15.864458],[-87.61568,15.878799],[-87.522921,15.797279],[-87.367762,15.84694],[-86.903191,15.756713],[-86.440946,15.782835],[-86.119234,15.893449],[-86.001954,16.005406],[-85.683317,15.953652],[-85.444004,15.885749],[-85.182444,15.909158],[-84.983722,15.995923],[-84.52698,15.857224],[-84.368256,15.835158],[-84.063055,15.648244],[-83.773977,15.424072],[-83.410381,15.270903],[-83.147219,14.995829],[-83.489989,15.016267],[-83.628585,14.880074],[-83.975721,14.749436],[-84.228342,14.748764],[-84.449336,14.621614],[-84.649582,14.666805],[-84.820037,14.819587],[-84.924501,14.790493],[-85.052787,14.551541],[-85.148751,14.560197],[-85.165365,14.35437],[-85.514413,14.079012],[-85.698665,13.960078],[-85.801295,13.836055],[-86.096264,14.038187],[-86.312142,13.771356],[-86.520708,13.778487],[-86.755087,13.754845],[-86.733822,13.263093],[-86.880557,13.254204],[-87.005769,13.025794],[-87.316654,12.984686]]]}}, +{"type":"Feature","id":"HRV","properties":{"name":"Croatia"},"geometry":{"type":"Polygon","coordinates":[[[18.829838,45.908878],[19.072769,45.521511],[19.390476,45.236516],[19.005486,44.860234],[18.553214,45.08159],[17.861783,45.06774],[17.002146,45.233777],[16.534939,45.211608],[16.318157,45.004127],[15.959367,45.233777],[15.750026,44.818712],[16.23966,44.351143],[16.456443,44.04124],[16.916156,43.667722],[17.297373,43.446341],[17.674922,43.028563],[18.56,42.65],[18.450016,42.479991],[17.50997,42.849995],[16.930006,43.209998],[16.015385,43.507215],[15.174454,44.243191],[15.37625,44.317915],[14.920309,44.738484],[14.901602,45.07606],[14.258748,45.233777],[13.952255,44.802124],[13.656976,45.136935],[13.679403,45.484149],[13.71506,45.500324],[14.411968,45.466166],[14.595109,45.634941],[14.935244,45.471695],[15.327675,45.452316],[15.323954,45.731783],[15.67153,45.834154],[15.768733,46.238108],[16.564808,46.503751],[16.882515,46.380632],[17.630066,45.951769],[18.456062,45.759481],[18.829838,45.908878]]]}}, +{"type":"Feature","id":"HTI","properties":{"name":"Haiti"},"geometry":{"type":"Polygon","coordinates":[[[-73.189791,19.915684],[-72.579673,19.871501],[-71.712361,19.714456],[-71.624873,19.169838],[-71.701303,18.785417],[-71.945112,18.6169],[-71.687738,18.31666],[-71.708305,18.044997],[-72.372476,18.214961],[-72.844411,18.145611],[-73.454555,18.217906],[-73.922433,18.030993],[-74.458034,18.34255],[-74.369925,18.664908],[-73.449542,18.526053],[-72.694937,18.445799],[-72.334882,18.668422],[-72.79165,19.101625],[-72.784105,19.483591],[-73.415022,19.639551],[-73.189791,19.915684]]]}}, +{"type":"Feature","id":"HUN","properties":{"name":"Hungary"},"geometry":{"type":"Polygon","coordinates":[[[16.202298,46.852386],[16.534268,47.496171],[16.340584,47.712902],[16.903754,47.714866],[16.979667,48.123497],[17.488473,47.867466],[17.857133,47.758429],[18.696513,47.880954],[18.777025,48.081768],[19.174365,48.111379],[19.661364,48.266615],[19.769471,48.202691],[20.239054,48.327567],[20.473562,48.56285],[20.801294,48.623854],[21.872236,48.319971],[22.085608,48.422264],[22.64082,48.15024],[22.710531,47.882194],[22.099768,47.672439],[21.626515,46.994238],[21.021952,46.316088],[20.220192,46.127469],[19.596045,46.17173],[18.829838,45.908878],[18.456062,45.759481],[17.630066,45.951769],[16.882515,46.380632],[16.564808,46.503751],[16.370505,46.841327],[16.202298,46.852386]]]}}, +{"type":"Feature","id":"IDN","properties":{"name":"Indonesia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[120.715609,-10.239581],[120.295014,-10.25865],[118.967808,-9.557969],[119.90031,-9.36134],[120.425756,-9.665921],[120.775502,-9.969675],[120.715609,-10.239581]]],[[[124.43595,-10.140001],[123.579982,-10.359987],[123.459989,-10.239995],[123.550009,-9.900016],[123.980009,-9.290027],[124.968682,-8.89279],[125.07002,-9.089987],[125.08852,-9.393173],[124.43595,-10.140001]]],[[[117.900018,-8.095681],[118.260616,-8.362383],[118.87846,-8.280683],[119.126507,-8.705825],[117.970402,-8.906639],[117.277731,-9.040895],[116.740141,-9.032937],[117.083737,-8.457158],[117.632024,-8.449303],[117.900018,-8.095681]]],[[[122.903537,-8.094234],[122.756983,-8.649808],[121.254491,-8.933666],[119.924391,-8.810418],[119.920929,-8.444859],[120.715092,-8.236965],[121.341669,-8.53674],[122.007365,-8.46062],[122.903537,-8.094234]]],[[[108.623479,-6.777674],[110.539227,-6.877358],[110.759576,-6.465186],[112.614811,-6.946036],[112.978768,-7.594213],[114.478935,-7.776528],[115.705527,-8.370807],[114.564511,-8.751817],[113.464734,-8.348947],[112.559672,-8.376181],[111.522061,-8.302129],[110.58615,-8.122605],[109.427667,-7.740664],[108.693655,-7.6416],[108.277763,-7.766657],[106.454102,-7.3549],[106.280624,-6.9249],[105.365486,-6.851416],[106.051646,-5.895919],[107.265009,-5.954985],[108.072091,-6.345762],[108.486846,-6.421985],[108.623479,-6.777674]]],[[[134.724624,-6.214401],[134.210134,-6.895238],[134.112776,-6.142467],[134.290336,-5.783058],[134.499625,-5.445042],[134.727002,-5.737582],[134.724624,-6.214401]]],[[[127.249215,-3.459065],[126.874923,-3.790983],[126.183802,-3.607376],[125.989034,-3.177273],[127.000651,-3.129318],[127.249215,-3.459065]]],[[[130.471344,-3.093764],[130.834836,-3.858472],[129.990547,-3.446301],[129.155249,-3.362637],[128.590684,-3.428679],[127.898891,-3.393436],[128.135879,-2.84365],[129.370998,-2.802154],[130.471344,-3.093764]]],[[[134.143368,-1.151867],[134.422627,-2.769185],[135.457603,-3.367753],[136.293314,-2.307042],[137.440738,-1.703513],[138.329727,-1.702686],[139.184921,-2.051296],[139.926684,-2.409052],[141.00021,-2.600151],[141.017057,-5.859022],[141.033852,-9.117893],[140.143415,-8.297168],[139.127767,-8.096043],[138.881477,-8.380935],[137.614474,-8.411683],[138.039099,-7.597882],[138.668621,-7.320225],[138.407914,-6.232849],[137.92784,-5.393366],[135.98925,-4.546544],[135.164598,-4.462931],[133.66288,-3.538853],[133.367705,-4.024819],[132.983956,-4.112979],[132.756941,-3.746283],[132.753789,-3.311787],[131.989804,-2.820551],[133.066845,-2.460418],[133.780031,-2.479848],[133.696212,-2.214542],[132.232373,-2.212526],[131.836222,-1.617162],[130.94284,-1.432522],[130.519558,-0.93772],[131.867538,-0.695461],[132.380116,-0.369538],[133.985548,-0.78021],[134.143368,-1.151867]]],[[[125.240501,1.419836],[124.437035,0.427881],[123.685505,0.235593],[122.723083,0.431137],[121.056725,0.381217],[120.183083,0.237247],[120.04087,-0.519658],[120.935905,-1.408906],[121.475821,-0.955962],[123.340565,-0.615673],[123.258399,-1.076213],[122.822715,-0.930951],[122.38853,-1.516858],[121.508274,-1.904483],[122.454572,-3.186058],[122.271896,-3.5295],[123.170963,-4.683693],[123.162333,-5.340604],[122.628515,-5.634591],[122.236394,-5.282933],[122.719569,-4.464172],[121.738234,-4.851331],[121.489463,-4.574553],[121.619171,-4.188478],[120.898182,-3.602105],[120.972389,-2.627643],[120.305453,-2.931604],[120.390047,-4.097579],[120.430717,-5.528241],[119.796543,-5.6734],[119.366906,-5.379878],[119.653606,-4.459417],[119.498835,-3.494412],[119.078344,-3.487022],[118.767769,-2.801999],[119.180974,-2.147104],[119.323394,-1.353147],[119.825999,0.154254],[120.035702,0.566477],[120.885779,1.309223],[121.666817,1.013944],[122.927567,0.875192],[124.077522,0.917102],[125.065989,1.643259],[125.240501,1.419836]]],[[[128.688249,1.132386],[128.635952,0.258486],[128.12017,0.356413],[127.968034,-0.252077],[128.379999,-0.780004],[128.100016,-0.899996],[127.696475,-0.266598],[127.39949,1.011722],[127.600512,1.810691],[127.932378,2.174596],[128.004156,1.628531],[128.594559,1.540811],[128.688249,1.132386]]],[[[117.875627,1.827641],[118.996747,0.902219],[117.811858,0.784242],[117.478339,0.102475],[117.521644,-0.803723],[116.560048,-1.487661],[116.533797,-2.483517],[116.148084,-4.012726],[116.000858,-3.657037],[114.864803,-4.106984],[114.468652,-3.495704],[113.755672,-3.43917],[113.256994,-3.118776],[112.068126,-3.478392],[111.703291,-2.994442],[111.04824,-3.049426],[110.223846,-2.934032],[110.070936,-1.592874],[109.571948,-1.314907],[109.091874,-0.459507],[108.952658,0.415375],[109.069136,1.341934],[109.66326,2.006467],[109.830227,1.338136],[110.514061,0.773131],[111.159138,0.976478],[111.797548,0.904441],[112.380252,1.410121],[112.859809,1.49779],[113.80585,1.217549],[114.621355,1.430688],[115.134037,2.821482],[115.519078,3.169238],[115.865517,4.306559],[117.015214,4.306094],[117.882035,4.137551],[117.313232,3.234428],[118.04833,2.28769],[117.875627,1.827641]]],[[[105.817655,-5.852356],[104.710384,-5.873285],[103.868213,-5.037315],[102.584261,-4.220259],[102.156173,-3.614146],[101.399113,-2.799777],[100.902503,-2.050262],[100.141981,-0.650348],[99.26374,0.183142],[98.970011,1.042882],[98.601351,1.823507],[97.699598,2.453184],[97.176942,3.308791],[96.424017,3.86886],[95.380876,4.970782],[95.293026,5.479821],[95.936863,5.439513],[97.484882,5.246321],[98.369169,4.26837],[99.142559,3.59035],[99.693998,3.174329],[100.641434,2.099381],[101.658012,2.083697],[102.498271,1.3987],[103.07684,0.561361],[103.838396,0.104542],[103.437645,-0.711946],[104.010789,-1.059212],[104.369991,-1.084843],[104.53949,-1.782372],[104.887893,-2.340425],[105.622111,-2.428844],[106.108593,-3.061777],[105.857446,-4.305525],[105.817655,-5.852356]]]]}}, +{"type":"Feature","id":"IND","properties":{"name":"India"},"geometry":{"type":"Polygon","coordinates":[[[77.837451,35.49401],[78.912269,34.321936],[78.811086,33.506198],[79.208892,32.994395],[79.176129,32.48378],[78.458446,32.618164],[78.738894,31.515906],[79.721367,30.882715],[81.111256,30.183481],[80.476721,29.729865],[80.088425,28.79447],[81.057203,28.416095],[81.999987,27.925479],[83.304249,27.364506],[84.675018,27.234901],[85.251779,26.726198],[86.024393,26.630985],[87.227472,26.397898],[88.060238,26.414615],[88.174804,26.810405],[88.043133,27.445819],[88.120441,27.876542],[88.730326,28.086865],[88.814248,27.299316],[88.835643,27.098966],[89.744528,26.719403],[90.373275,26.875724],[91.217513,26.808648],[92.033484,26.83831],[92.103712,27.452614],[91.696657,27.771742],[92.503119,27.896876],[93.413348,28.640629],[94.56599,29.277438],[95.404802,29.031717],[96.117679,29.452802],[96.586591,28.83098],[96.248833,28.411031],[97.327114,28.261583],[97.402561,27.882536],[97.051989,27.699059],[97.133999,27.083774],[96.419366,27.264589],[95.124768,26.573572],[95.155153,26.001307],[94.603249,25.162495],[94.552658,24.675238],[94.106742,23.850741],[93.325188,24.078556],[93.286327,23.043658],[93.060294,22.703111],[93.166128,22.27846],[92.672721,22.041239],[92.146035,23.627499],[91.869928,23.624346],[91.706475,22.985264],[91.158963,23.503527],[91.46773,24.072639],[91.915093,24.130414],[92.376202,24.976693],[91.799596,25.147432],[90.872211,25.132601],[89.920693,25.26975],[89.832481,25.965082],[89.355094,26.014407],[88.563049,26.446526],[88.209789,25.768066],[88.931554,25.238692],[88.306373,24.866079],[88.084422,24.501657],[88.69994,24.233715],[88.52977,23.631142],[88.876312,22.879146],[89.031961,22.055708],[88.888766,21.690588],[88.208497,21.703172],[86.975704,21.495562],[87.033169,20.743308],[86.499351,20.151638],[85.060266,19.478579],[83.941006,18.30201],[83.189217,17.671221],[82.192792,17.016636],[82.191242,16.556664],[81.692719,16.310219],[80.791999,15.951972],[80.324896,15.899185],[80.025069,15.136415],[80.233274,13.835771],[80.286294,13.006261],[79.862547,12.056215],[79.857999,10.357275],[79.340512,10.308854],[78.885345,9.546136],[79.18972,9.216544],[78.277941,8.933047],[77.941165,8.252959],[77.539898,7.965535],[76.592979,8.899276],[76.130061,10.29963],[75.746467,11.308251],[75.396101,11.781245],[74.864816,12.741936],[74.616717,13.992583],[74.443859,14.617222],[73.534199,15.990652],[73.119909,17.92857],[72.820909,19.208234],[72.824475,20.419503],[72.630533,21.356009],[71.175273,20.757441],[70.470459,20.877331],[69.16413,22.089298],[69.644928,22.450775],[69.349597,22.84318],[68.176645,23.691965],[68.842599,24.359134],[71.04324,24.356524],[70.844699,25.215102],[70.282873,25.722229],[70.168927,26.491872],[69.514393,26.940966],[70.616496,27.989196],[71.777666,27.91318],[72.823752,28.961592],[73.450638,29.976413],[74.42138,30.979815],[74.405929,31.692639],[75.258642,32.271105],[74.451559,32.7649],[74.104294,33.441473],[73.749948,34.317699],[74.240203,34.748887],[75.757061,34.504923],[76.871722,34.653544],[77.837451,35.49401]]]}}, +{"type":"Feature","id":"IRL","properties":{"name":"Ireland"},"geometry":{"type":"Polygon","coordinates":[[[-6.197885,53.867565],[-6.032985,53.153164],[-6.788857,52.260118],[-8.561617,51.669301],[-9.977086,51.820455],[-9.166283,52.864629],[-9.688525,53.881363],[-8.327987,54.664519],[-7.572168,55.131622],[-7.366031,54.595841],[-7.572168,54.059956],[-6.95373,54.073702],[-6.197885,53.867565]]]}}, +{"type":"Feature","id":"IRN","properties":{"name":"Iran"},"geometry":{"type":"Polygon","coordinates":[[[53.921598,37.198918],[54.800304,37.392421],[55.511578,37.964117],[56.180375,37.935127],[56.619366,38.121394],[57.330434,38.029229],[58.436154,37.522309],[59.234762,37.412988],[60.377638,36.527383],[61.123071,36.491597],[61.210817,35.650072],[60.803193,34.404102],[60.52843,33.676446],[60.9637,33.528832],[60.536078,32.981269],[60.863655,32.18292],[60.941945,31.548075],[61.699314,31.379506],[61.781222,30.73585],[60.874248,29.829239],[61.369309,29.303276],[61.771868,28.699334],[62.72783,28.259645],[62.755426,27.378923],[63.233898,27.217047],[63.316632,26.756532],[61.874187,26.239975],[61.497363,25.078237],[59.616134,25.380157],[58.525761,25.609962],[57.397251,25.739902],[56.970766,26.966106],[56.492139,27.143305],[55.72371,26.964633],[54.71509,26.480658],[53.493097,26.812369],[52.483598,27.580849],[51.520763,27.86569],[50.852948,28.814521],[50.115009,30.147773],[49.57685,29.985715],[48.941333,30.31709],[48.567971,29.926778],[48.014568,30.452457],[48.004698,30.985137],[47.685286,30.984853],[47.849204,31.709176],[47.334661,32.469155],[46.109362,33.017287],[45.416691,33.967798],[45.64846,34.748138],[46.151788,35.093259],[46.07634,35.677383],[45.420618,35.977546],[44.77267,37.17045],[44.225756,37.971584],[44.421403,38.281281],[44.109225,39.428136],[44.79399,39.713003],[44.952688,39.335765],[45.457722,38.874139],[46.143623,38.741201],[46.50572,38.770605],[47.685079,39.508364],[48.060095,39.582235],[48.355529,39.288765],[48.010744,38.794015],[48.634375,38.270378],[48.883249,38.320245],[49.199612,37.582874],[50.147771,37.374567],[50.842354,36.872814],[52.264025,36.700422],[53.82579,36.965031],[53.921598,37.198918]]]}}, +{"type":"Feature","id":"IRQ","properties":{"name":"Iraq"},"geometry":{"type":"Polygon","coordinates":[[[45.420618,35.977546],[46.07634,35.677383],[46.151788,35.093259],[45.64846,34.748138],[45.416691,33.967798],[46.109362,33.017287],[47.334661,32.469155],[47.849204,31.709176],[47.685286,30.984853],[48.004698,30.985137],[48.014568,30.452457],[48.567971,29.926778],[47.974519,29.975819],[47.302622,30.05907],[46.568713,29.099025],[44.709499,29.178891],[41.889981,31.190009],[40.399994,31.889992],[39.195468,32.161009],[38.792341,33.378686],[41.006159,34.419372],[41.383965,35.628317],[41.289707,36.358815],[41.837064,36.605854],[42.349591,37.229873],[42.779126,37.385264],[43.942259,37.256228],[44.293452,37.001514],[44.772699,37.170445],[45.420618,35.977546]]]}}, +{"type":"Feature","id":"ISL","properties":{"name":"Iceland"},"geometry":{"type":"Polygon","coordinates":[[[-14.508695,66.455892],[-14.739637,65.808748],[-13.609732,65.126671],[-14.909834,64.364082],[-17.794438,63.678749],[-18.656246,63.496383],[-19.972755,63.643635],[-22.762972,63.960179],[-21.778484,64.402116],[-23.955044,64.89113],[-22.184403,65.084968],[-22.227423,65.378594],[-24.326184,65.611189],[-23.650515,66.262519],[-22.134922,66.410469],[-20.576284,65.732112],[-19.056842,66.276601],[-17.798624,65.993853],[-16.167819,66.526792],[-14.508695,66.455892]]]}}, +{"type":"Feature","id":"ISR","properties":{"name":"Israel"},"geometry":{"type":"Polygon","coordinates":[[[35.719918,32.709192],[35.545665,32.393992],[35.18393,32.532511],[34.974641,31.866582],[35.225892,31.754341],[34.970507,31.616778],[34.927408,31.353435],[35.397561,31.489086],[35.420918,31.100066],[34.922603,29.501326],[34.265433,31.219361],[34.556372,31.548824],[34.488107,31.605539],[34.752587,32.072926],[34.955417,32.827376],[35.098457,33.080539],[35.126053,33.0909],[35.460709,33.08904],[35.552797,33.264275],[35.821101,33.277426],[35.836397,32.868123],[35.700798,32.716014],[35.719918,32.709192]]]}}, +{"type":"Feature","id":"ITA","properties":{"name":"Italy"},"geometry":{"type":"MultiPolygon","coordinates":[[[[15.520376,38.231155],[15.160243,37.444046],[15.309898,37.134219],[15.099988,36.619987],[14.335229,36.996631],[13.826733,37.104531],[12.431004,37.61295],[12.570944,38.126381],[13.741156,38.034966],[14.761249,38.143874],[15.520376,38.231155]]],[[[9.210012,41.209991],[9.809975,40.500009],[9.669519,39.177376],[9.214818,39.240473],[8.806936,38.906618],[8.428302,39.171847],[8.388253,40.378311],[8.159998,40.950007],[8.709991,40.899984],[9.210012,41.209991]]],[[[12.376485,46.767559],[13.806475,46.509306],[13.69811,46.016778],[13.93763,45.591016],[13.141606,45.736692],[12.328581,45.381778],[12.383875,44.885374],[12.261453,44.600482],[12.589237,44.091366],[13.526906,43.587727],[14.029821,42.761008],[15.14257,41.95514],[15.926191,41.961315],[16.169897,41.740295],[15.889346,41.541082],[16.785002,41.179606],[17.519169,40.877143],[18.376687,40.355625],[18.480247,40.168866],[18.293385,39.810774],[17.73838,40.277671],[16.869596,40.442235],[16.448743,39.795401],[17.17149,39.4247],[17.052841,38.902871],[16.635088,38.843572],[16.100961,37.985899],[15.684087,37.908849],[15.687963,38.214593],[15.891981,38.750942],[16.109332,38.964547],[15.718814,39.544072],[15.413613,40.048357],[14.998496,40.172949],[14.703268,40.60455],[14.060672,40.786348],[13.627985,41.188287],[12.888082,41.25309],[12.106683,41.704535],[11.191906,42.355425],[10.511948,42.931463],[10.200029,43.920007],[9.702488,44.036279],[8.888946,44.366336],[8.428561,44.231228],[7.850767,43.767148],[7.435185,43.693845],[7.549596,44.127901],[7.007562,44.254767],[6.749955,45.028518],[7.096652,45.333099],[6.802355,45.70858],[6.843593,45.991147],[7.273851,45.776948],[7.755992,45.82449],[8.31663,46.163642],[8.489952,46.005151],[8.966306,46.036932],[9.182882,46.440215],[9.922837,46.314899],[10.363378,46.483571],[10.442701,46.893546],[11.048556,46.751359],[11.164828,46.941579],[12.153088,47.115393],[12.376485,46.767559]]]]}}, +{"type":"Feature","id":"JAM","properties":{"name":"Jamaica"},"geometry":{"type":"Polygon","coordinates":[[[-77.569601,18.490525],[-76.896619,18.400867],[-76.365359,18.160701],[-76.199659,17.886867],[-76.902561,17.868238],[-77.206341,17.701116],[-77.766023,17.861597],[-78.337719,18.225968],[-78.217727,18.454533],[-77.797365,18.524218],[-77.569601,18.490525]]]}}, +{"type":"Feature","id":"JOR","properties":{"name":"Jordan"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.719918,32.709192],[36.834062,32.312938],[38.792341,33.378686],[39.195468,32.161009],[39.004886,32.010217],[37.002166,31.508413],[37.998849,30.5085],[37.66812,30.338665],[37.503582,30.003776],[36.740528,29.865283],[36.501214,29.505254],[36.068941,29.197495],[34.956037,29.356555],[34.922603,29.501326],[35.420918,31.100066],[35.397561,31.489086],[35.545252,31.782505],[35.545665,32.393992]]]}}, +{"type":"Feature","id":"JPN","properties":{"name":"Japan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[134.638428,34.149234],[134.766379,33.806335],[134.203416,33.201178],[133.79295,33.521985],[133.280268,33.28957],[133.014858,32.704567],[132.363115,32.989382],[132.371176,33.463642],[132.924373,34.060299],[133.492968,33.944621],[133.904106,34.364931],[134.638428,34.149234]]],[[[140.976388,37.142074],[140.59977,36.343983],[140.774074,35.842877],[140.253279,35.138114],[138.975528,34.6676],[137.217599,34.606286],[135.792983,33.464805],[135.120983,33.849071],[135.079435,34.596545],[133.340316,34.375938],[132.156771,33.904933],[130.986145,33.885761],[132.000036,33.149992],[131.33279,31.450355],[130.686318,31.029579],[130.20242,31.418238],[130.447676,32.319475],[129.814692,32.61031],[129.408463,33.296056],[130.353935,33.604151],[130.878451,34.232743],[131.884229,34.749714],[132.617673,35.433393],[134.608301,35.731618],[135.677538,35.527134],[136.723831,37.304984],[137.390612,36.827391],[138.857602,37.827485],[139.426405,38.215962],[140.05479,39.438807],[139.883379,40.563312],[140.305783,41.195005],[141.368973,41.37856],[141.914263,39.991616],[141.884601,39.180865],[140.959489,38.174001],[140.976388,37.142074]]],[[[143.910162,44.1741],[144.613427,43.960883],[145.320825,44.384733],[145.543137,43.262088],[144.059662,42.988358],[143.18385,41.995215],[141.611491,42.678791],[141.067286,41.584594],[139.955106,41.569556],[139.817544,42.563759],[140.312087,43.333273],[141.380549,43.388825],[141.671952,44.772125],[141.967645,45.551483],[143.14287,44.510358],[143.910162,44.1741]]]]}}, +{"type":"Feature","id":"KAZ","properties":{"name":"Kazakhstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[70.388965,42.081308],[69.070027,41.384244],[68.632483,40.668681],[68.259896,40.662325],[67.985856,41.135991],[66.714047,41.168444],[66.510649,41.987644],[66.023392,41.994646],[66.098012,42.99766],[64.900824,43.728081],[63.185787,43.650075],[62.0133,43.504477],[61.05832,44.405817],[60.239972,44.784037],[58.689989,45.500014],[58.503127,45.586804],[55.928917,44.995858],[55.968191,41.308642],[55.455251,41.259859],[54.755345,42.043971],[54.079418,42.324109],[52.944293,42.116034],[52.50246,41.783316],[52.446339,42.027151],[52.692112,42.443895],[52.501426,42.792298],[51.342427,43.132975],[50.891292,44.031034],[50.339129,44.284016],[50.305643,44.609836],[51.278503,44.514854],[51.316899,45.245998],[52.16739,45.408391],[53.040876,45.259047],[53.220866,46.234646],[53.042737,46.853006],[52.042023,46.804637],[51.191945,47.048705],[50.034083,46.60899],[49.10116,46.39933],[48.593241,46.561034],[48.694734,47.075628],[48.057253,47.743753],[47.315231,47.715847],[46.466446,48.394152],[47.043672,49.152039],[46.751596,49.356006],[47.54948,50.454698],[48.577841,49.87476],[48.702382,50.605128],[50.766648,51.692762],[52.328724,51.718652],[54.532878,51.02624],[55.716941,50.621717],[56.777961,51.043551],[58.363291,51.063653],[59.642282,50.545442],[59.932807,50.842194],[61.337424,50.79907],[61.588003,51.272659],[59.967534,51.96042],[60.927269,52.447548],[60.739993,52.719986],[61.699986,52.979996],[60.978066,53.664993],[61.436591,54.006265],[65.178534,54.354228],[65.666876,54.601267],[68.1691,54.970392],[69.068167,55.38525],[70.865267,55.169734],[71.180131,54.133285],[72.22415,54.376655],[73.508516,54.035617],[73.425679,53.48981],[74.384845,53.546861],[76.8911,54.490524],[76.525179,54.177003],[77.800916,53.404415],[80.03556,50.864751],[80.568447,51.388336],[81.945986,50.812196],[83.383004,51.069183],[83.935115,50.889246],[84.416377,50.3114],[85.11556,50.117303],[85.54127,49.692859],[86.829357,49.826675],[87.35997,49.214981],[86.598776,48.549182],[85.768233,48.455751],[85.720484,47.452969],[85.16429,47.000956],[83.180484,47.330031],[82.458926,45.53965],[81.947071,45.317027],[79.966106,44.917517],[80.866206,43.180362],[80.18015,42.920068],[80.25999,42.349999],[79.643645,42.496683],[79.142177,42.856092],[77.658392,42.960686],[76.000354,42.988022],[75.636965,42.8779],[74.212866,43.298339],[73.645304,43.091272],[73.489758,42.500894],[71.844638,42.845395],[71.186281,42.704293],[70.962315,42.266154]]]}}, +{"type":"Feature","id":"KEN","properties":{"name":"Kenya"},"geometry":{"type":"Polygon","coordinates":[[[40.993,-0.85829],[41.58513,-1.68325],[40.88477,-2.08255],[40.63785,-2.49979],[40.26304,-2.57309],[40.12119,-3.27768],[39.80006,-3.68116],[39.60489,-4.34653],[39.20222,-4.67677],[37.7669,-3.67712],[37.69869,-3.09699],[34.07262,-1.05982],[33.903711,-0.95],[33.893569,0.109814],[34.18,0.515],[34.6721,1.17694],[35.03599,1.90584],[34.59607,3.05374],[34.47913,3.5556],[34.005,4.249885],[34.620196,4.847123],[35.298007,5.506],[35.817448,5.338232],[35.817448,4.776966],[36.159079,4.447864],[36.855093,4.447864],[38.120915,3.598605],[38.43697,3.58851],[38.67114,3.61607],[38.89251,3.50074],[39.559384,3.42206],[39.85494,3.83879],[40.76848,4.25702],[41.1718,3.91909],[41.855083,3.918912],[40.98105,2.78452],[40.993,-0.85829]]]}}, +{"type":"Feature","id":"KGZ","properties":{"name":"Kyrgyzstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[71.186281,42.704293],[71.844638,42.845395],[73.489758,42.500894],[73.645304,43.091272],[74.212866,43.298339],[75.636965,42.8779],[76.000354,42.988022],[77.658392,42.960686],[79.142177,42.856092],[79.643645,42.496683],[80.25999,42.349999],[80.11943,42.123941],[78.543661,41.582243],[78.187197,41.185316],[76.904484,41.066486],[76.526368,40.427946],[75.467828,40.562072],[74.776862,40.366425],[73.822244,39.893973],[73.960013,39.660008],[73.675379,39.431237],[71.784694,39.279463],[70.549162,39.604198],[69.464887,39.526683],[69.55961,40.103211],[70.648019,39.935754],[71.014198,40.244366],[71.774875,40.145844],[73.055417,40.866033],[71.870115,41.3929],[71.157859,41.143587],[70.420022,41.519998],[71.259248,42.167711],[70.962315,42.266154]]]}}, +{"type":"Feature","id":"KHM","properties":{"name":"Cambodia"},"geometry":{"type":"Polygon","coordinates":[[[103.49728,10.632555],[103.09069,11.153661],[102.584932,12.186595],[102.348099,13.394247],[102.988422,14.225721],[104.281418,14.416743],[105.218777,14.273212],[106.043946,13.881091],[106.496373,14.570584],[107.382727,14.202441],[107.614548,13.535531],[107.491403,12.337206],[105.810524,11.567615],[106.24967,10.961812],[105.199915,10.88931],[104.334335,10.486544],[103.49728,10.632555]]]}}, +{"type":"Feature","id":"KOR","properties":{"name":"South Korea"},"geometry":{"type":"Polygon","coordinates":[[[128.349716,38.612243],[129.21292,37.432392],[129.46045,36.784189],[129.468304,35.632141],[129.091377,35.082484],[128.18585,34.890377],[127.386519,34.475674],[126.485748,34.390046],[126.37392,34.93456],[126.559231,35.684541],[126.117398,36.725485],[126.860143,36.893924],[126.174759,37.749686],[126.237339,37.840378],[126.68372,37.804773],[127.073309,38.256115],[127.780035,38.304536],[128.205746,38.370397],[128.349716,38.612243]]]}}, +{"type":"Feature","id":"CS-KM","properties":{"name":"Kosovo"},"geometry":{"type":"Polygon","coordinates":[[[20.76216,42.05186],[20.71731,41.84711],[20.59023,41.85541],[20.52295,42.21787],[20.28374,42.32025],[20.0707,42.58863],[20.25758,42.81275],[20.49679,42.88469],[20.63508,43.21671],[20.81448,43.27205],[20.95651,43.13094],[21.143395,43.068685],[21.27421,42.90959],[21.43866,42.86255],[21.63302,42.67717],[21.77505,42.6827],[21.66292,42.43922],[21.54332,42.32025],[21.576636,42.245224],[21.3527,42.2068],[20.76216,42.05186]]]}}, +{"type":"Feature","id":"KWT","properties":{"name":"Kuwait"},"geometry":{"type":"Polygon","coordinates":[[[47.974519,29.975819],[48.183189,29.534477],[48.093943,29.306299],[48.416094,28.552004],[47.708851,28.526063],[47.459822,29.002519],[46.568713,29.099025],[47.302622,30.05907],[47.974519,29.975819]]]}}, +{"type":"Feature","id":"LAO","properties":{"name":"Laos"},"geometry":{"type":"Polygon","coordinates":[[[105.218777,14.273212],[105.544338,14.723934],[105.589039,15.570316],[104.779321,16.441865],[104.716947,17.428859],[103.956477,18.240954],[103.200192,18.309632],[102.998706,17.961695],[102.413005,17.932782],[102.113592,18.109102],[101.059548,17.512497],[101.035931,18.408928],[101.282015,19.462585],[100.606294,19.508344],[100.548881,20.109238],[100.115988,20.41785],[100.329101,20.786122],[101.180005,21.436573],[101.270026,21.201652],[101.80312,21.174367],[101.652018,22.318199],[102.170436,22.464753],[102.754896,21.675137],[103.203861,20.766562],[104.435,20.758733],[104.822574,19.886642],[104.183388,19.624668],[103.896532,19.265181],[105.094598,18.666975],[105.925762,17.485315],[106.556008,16.604284],[107.312706,15.908538],[107.564525,15.202173],[107.382727,14.202441],[106.496373,14.570584],[106.043946,13.881091],[105.218777,14.273212]]]}}, +{"type":"Feature","id":"LBN","properties":{"name":"Lebanon"},"geometry":{"type":"Polygon","coordinates":[[[35.821101,33.277426],[35.552797,33.264275],[35.460709,33.08904],[35.126053,33.0909],[35.482207,33.90545],[35.979592,34.610058],[35.998403,34.644914],[36.448194,34.593935],[36.61175,34.201789],[36.06646,33.824912],[35.821101,33.277426]]]}}, +{"type":"Feature","id":"LBR","properties":{"name":"Liberia"},"geometry":{"type":"Polygon","coordinates":[[[-7.712159,4.364566],[-7.974107,4.355755],[-9.004794,4.832419],[-9.91342,5.593561],[-10.765384,6.140711],[-11.438779,6.785917],[-11.199802,7.105846],[-11.146704,7.396706],[-10.695595,7.939464],[-10.230094,8.406206],[-10.016567,8.428504],[-9.755342,8.541055],[-9.33728,7.928534],[-9.403348,7.526905],[-9.208786,7.313921],[-8.926065,7.309037],[-8.722124,7.711674],[-8.439298,7.686043],[-8.485446,7.395208],[-8.385452,6.911801],[-8.60288,6.467564],[-8.311348,6.193033],[-7.993693,6.12619],[-7.570153,5.707352],[-7.539715,5.313345],[-7.635368,5.188159],[-7.712159,4.364566]]]}}, +{"type":"Feature","id":"LBY","properties":{"name":"Libya"},"geometry":{"type":"Polygon","coordinates":[[[14.8513,22.86295],[14.143871,22.491289],[13.581425,23.040506],[11.999506,23.471668],[11.560669,24.097909],[10.771364,24.562532],[10.303847,24.379313],[9.948261,24.936954],[9.910693,25.365455],[9.319411,26.094325],[9.716286,26.512206],[9.629056,27.140953],[9.756128,27.688259],[9.683885,28.144174],[9.859998,28.95999],[9.805634,29.424638],[9.48214,30.307556],[9.970017,30.539325],[10.056575,30.961831],[9.950225,31.37607],[10.636901,31.761421],[10.94479,32.081815],[11.432253,32.368903],[11.488787,33.136996],[12.66331,32.79278],[13.08326,32.87882],[13.91868,32.71196],[15.24563,32.26508],[15.71394,31.37626],[16.61162,31.18218],[18.02109,30.76357],[19.08641,30.26639],[19.57404,30.52582],[20.05335,30.98576],[19.82033,31.75179],[20.13397,32.2382],[20.85452,32.7068],[21.54298,32.8432],[22.89576,32.63858],[23.2368,32.19149],[23.60913,32.18726],[23.9275,32.01667],[24.92114,31.89936],[25.16482,31.56915],[24.80287,31.08929],[24.95762,30.6616],[24.70007,30.04419],[25,29.238655],[25,25.6825],[25,22],[25,20.00304],[23.85,20],[23.83766,19.58047],[19.84926,21.49509],[15.86085,23.40972],[14.8513,22.86295]]]}}, +{"type":"Feature","id":"LKA","properties":{"name":"Sri Lanka"},"geometry":{"type":"Polygon","coordinates":[[[81.787959,7.523055],[81.637322,6.481775],[81.21802,6.197141],[80.348357,5.96837],[79.872469,6.763463],[79.695167,8.200843],[80.147801,9.824078],[80.838818,9.268427],[81.304319,8.564206],[81.787959,7.523055]]]}}, +{"type":"Feature","id":"LSO","properties":{"name":"Lesotho"},"geometry":{"type":"Polygon","coordinates":[[[28.978263,-28.955597],[29.325166,-29.257387],[29.018415,-29.743766],[28.8484,-30.070051],[28.291069,-30.226217],[28.107205,-30.545732],[27.749397,-30.645106],[26.999262,-29.875954],[27.532511,-29.242711],[28.074338,-28.851469],[28.5417,-28.647502],[28.978263,-28.955597]]]}}, +{"type":"Feature","id":"LTU","properties":{"name":"Lithuania"},"geometry":{"type":"Polygon","coordinates":[[[22.731099,54.327537],[22.651052,54.582741],[22.757764,54.856574],[22.315724,55.015299],[21.268449,55.190482],[21.0558,56.031076],[22.201157,56.337802],[23.878264,56.273671],[24.860684,56.372528],[25.000934,56.164531],[25.533047,56.100297],[26.494331,55.615107],[26.588279,55.167176],[25.768433,54.846963],[25.536354,54.282423],[24.450684,53.905702],[23.484128,53.912498],[23.243987,54.220567],[22.731099,54.327537]]]}}, +{"type":"Feature","id":"LUX","properties":{"name":"Luxembourg"},"geometry":{"type":"Polygon","coordinates":[[[6.043073,50.128052],[6.242751,49.902226],[6.18632,49.463803],[5.897759,49.442667],[5.674052,49.529484],[5.782417,50.090328],[6.043073,50.128052]]]}}, +{"type":"Feature","id":"LVA","properties":{"name":"Latvia"},"geometry":{"type":"Polygon","coordinates":[[[21.0558,56.031076],[21.090424,56.783873],[21.581866,57.411871],[22.524341,57.753374],[23.318453,57.006236],[24.12073,57.025693],[24.312863,57.793424],[25.164594,57.970157],[25.60281,57.847529],[26.463532,57.476389],[27.288185,57.474528],[27.770016,57.244258],[27.855282,56.759326],[28.176709,56.16913],[27.10246,55.783314],[26.494331,55.615107],[25.533047,56.100297],[25.000934,56.164531],[24.860684,56.372528],[23.878264,56.273671],[22.201157,56.337802],[21.0558,56.031076]]]}}, +{"type":"Feature","id":"MAR","properties":{"name":"Morocco"},"geometry":{"type":"Polygon","coordinates":[[[-5.193863,35.755182],[-4.591006,35.330712],[-3.640057,35.399855],[-2.604306,35.179093],[-2.169914,35.168396],[-1.792986,34.527919],[-1.733455,33.919713],[-1.388049,32.864015],[-1.124551,32.651522],[-1.307899,32.262889],[-2.616605,32.094346],[-3.06898,31.724498],[-3.647498,31.637294],[-3.690441,30.896952],[-4.859646,30.501188],[-5.242129,30.000443],[-6.060632,29.7317],[-7.059228,29.579228],[-8.674116,28.841289],[-8.66559,27.656426],[-8.817809,27.656426],[-8.817828,27.656426],[-8.794884,27.120696],[-9.413037,27.088476],[-9.735343,26.860945],[-10.189424,26.860945],[-10.551263,26.990808],[-11.392555,26.883424],[-11.71822,26.104092],[-12.030759,26.030866],[-12.500963,24.770116],[-13.89111,23.691009],[-14.221168,22.310163],[-14.630833,21.86094],[-14.750955,21.5006],[-17.002962,21.420734],[-17.020428,21.42231],[-16.973248,21.885745],[-16.589137,22.158234],[-16.261922,22.67934],[-16.326414,23.017768],[-15.982611,23.723358],[-15.426004,24.359134],[-15.089332,24.520261],[-14.824645,25.103533],[-14.800926,25.636265],[-14.43994,26.254418],[-13.773805,26.618892],[-13.139942,27.640148],[-13.121613,27.654148],[-12.618837,28.038186],[-11.688919,28.148644],[-10.900957,28.832142],[-10.399592,29.098586],[-9.564811,29.933574],[-9.814718,31.177736],[-9.434793,32.038096],[-9.300693,32.564679],[-8.657476,33.240245],[-7.654178,33.697065],[-6.912544,34.110476],[-6.244342,35.145865],[-5.929994,35.759988],[-5.193863,35.755182]]]}}, +{"type":"Feature","id":"MDA","properties":{"name":"Moldova"},"geometry":{"type":"Polygon","coordinates":[[[26.619337,48.220726],[26.857824,48.368211],[27.522537,48.467119],[28.259547,48.155562],[28.670891,48.118149],[29.122698,47.849095],[29.050868,47.510227],[29.415135,47.346645],[29.559674,46.928583],[29.908852,46.674361],[29.83821,46.525326],[30.024659,46.423937],[29.759972,46.349988],[29.170654,46.379262],[29.072107,46.517678],[28.862972,46.437889],[28.933717,46.25883],[28.659987,45.939987],[28.485269,45.596907],[28.233554,45.488283],[28.054443,45.944586],[28.160018,46.371563],[28.12803,46.810476],[27.551166,47.405117],[27.233873,47.826771],[26.924176,48.123264],[26.619337,48.220726]]]}}, +{"type":"Feature","id":"MDG","properties":{"name":"Madagascar"},"geometry":{"type":"Polygon","coordinates":[[[49.543519,-12.469833],[49.808981,-12.895285],[50.056511,-13.555761],[50.217431,-14.758789],[50.476537,-15.226512],[50.377111,-15.706069],[50.200275,-16.000263],[49.860606,-15.414253],[49.672607,-15.710204],[49.863344,-16.451037],[49.774564,-16.875042],[49.498612,-17.106036],[49.435619,-17.953064],[49.041792,-19.118781],[48.548541,-20.496888],[47.930749,-22.391501],[47.547723,-23.781959],[47.095761,-24.94163],[46.282478,-25.178463],[45.409508,-25.601434],[44.833574,-25.346101],[44.03972,-24.988345],[43.763768,-24.460677],[43.697778,-23.574116],[43.345654,-22.776904],[43.254187,-22.057413],[43.433298,-21.336475],[43.893683,-21.163307],[43.89637,-20.830459],[44.374325,-20.072366],[44.464397,-19.435454],[44.232422,-18.961995],[44.042976,-18.331387],[43.963084,-17.409945],[44.312469,-16.850496],[44.446517,-16.216219],[44.944937,-16.179374],[45.502732,-15.974373],[45.872994,-15.793454],[46.312243,-15.780018],[46.882183,-15.210182],[47.70513,-14.594303],[48.005215,-14.091233],[47.869047,-13.663869],[48.293828,-13.784068],[48.84506,-13.089175],[48.863509,-12.487868],[49.194651,-12.040557],[49.543519,-12.469833]]]}}, +{"type":"Feature","id":"MEX","properties":{"name":"Mexico"},"geometry":{"type":"Polygon","coordinates":[[[-97.140008,25.869997],[-97.528072,24.992144],[-97.702946,24.272343],[-97.776042,22.93258],[-97.872367,22.444212],[-97.699044,21.898689],[-97.38896,21.411019],[-97.189333,20.635433],[-96.525576,19.890931],[-96.292127,19.320371],[-95.900885,18.828024],[-94.839063,18.562717],[-94.42573,18.144371],[-93.548651,18.423837],[-92.786114,18.524839],[-92.037348,18.704569],[-91.407903,18.876083],[-90.77187,19.28412],[-90.53359,19.867418],[-90.451476,20.707522],[-90.278618,20.999855],[-89.601321,21.261726],[-88.543866,21.493675],[-87.658417,21.458846],[-87.05189,21.543543],[-86.811982,21.331515],[-86.845908,20.849865],[-87.383291,20.255405],[-87.621054,19.646553],[-87.43675,19.472403],[-87.58656,19.04013],[-87.837191,18.259816],[-88.090664,18.516648],[-88.300031,18.499982],[-88.490123,18.486831],[-88.848344,17.883198],[-89.029857,18.001511],[-89.150909,17.955468],[-89.14308,17.808319],[-90.067934,17.819326],[-91.00152,17.817595],[-91.002269,17.254658],[-91.453921,17.252177],[-91.08167,16.918477],[-90.711822,16.687483],[-90.600847,16.470778],[-90.438867,16.41011],[-90.464473,16.069562],[-91.74796,16.066565],[-92.229249,15.251447],[-92.087216,15.064585],[-92.20323,14.830103],[-92.22775,14.538829],[-93.359464,15.61543],[-93.875169,15.940164],[-94.691656,16.200975],[-95.250227,16.128318],[-96.053382,15.752088],[-96.557434,15.653515],[-97.263592,15.917065],[-98.01303,16.107312],[-98.947676,16.566043],[-99.697397,16.706164],[-100.829499,17.171071],[-101.666089,17.649026],[-101.918528,17.91609],[-102.478132,17.975751],[-103.50099,18.292295],[-103.917527,18.748572],[-104.99201,19.316134],[-105.493038,19.946767],[-105.731396,20.434102],[-105.397773,20.531719],[-105.500661,20.816895],[-105.270752,21.076285],[-105.265817,21.422104],[-105.603161,21.871146],[-105.693414,22.26908],[-106.028716,22.773752],[-106.90998,23.767774],[-107.915449,24.548915],[-108.401905,25.172314],[-109.260199,25.580609],[-109.444089,25.824884],[-109.291644,26.442934],[-109.801458,26.676176],[-110.391732,27.162115],[-110.641019,27.859876],[-111.178919,27.941241],[-111.759607,28.467953],[-112.228235,28.954409],[-112.271824,29.266844],[-112.809594,30.021114],[-113.163811,30.786881],[-113.148669,31.170966],[-113.871881,31.567608],[-114.205737,31.524045],[-114.776451,31.799532],[-114.9367,31.393485],[-114.771232,30.913617],[-114.673899,30.162681],[-114.330974,29.750432],[-113.588875,29.061611],[-113.424053,28.826174],[-113.271969,28.754783],[-113.140039,28.411289],[-112.962298,28.42519],[-112.761587,27.780217],[-112.457911,27.525814],[-112.244952,27.171727],[-111.616489,26.662817],[-111.284675,25.73259],[-110.987819,25.294606],[-110.710007,24.826004],[-110.655049,24.298595],[-110.172856,24.265548],[-109.771847,23.811183],[-109.409104,23.364672],[-109.433392,23.185588],[-109.854219,22.818272],[-110.031392,22.823078],[-110.295071,23.430973],[-110.949501,24.000964],[-111.670568,24.484423],[-112.182036,24.738413],[-112.148989,25.470125],[-112.300711,26.012004],[-112.777297,26.32196],[-113.464671,26.768186],[-113.59673,26.63946],[-113.848937,26.900064],[-114.465747,27.14209],[-115.055142,27.722727],[-114.982253,27.7982],[-114.570366,27.741485],[-114.199329,28.115003],[-114.162018,28.566112],[-114.931842,29.279479],[-115.518654,29.556362],[-115.887365,30.180794],[-116.25835,30.836464],[-116.721526,31.635744],[-117.12776,32.53534],[-115.99135,32.61239],[-114.72139,32.72083],[-114.815,32.52528],[-113.30498,32.03914],[-111.02361,31.33472],[-109.035,31.34194],[-108.24194,31.34222],[-108.24,31.754854],[-106.50759,31.75452],[-106.1429,31.39995],[-105.63159,31.08383],[-105.03737,30.64402],[-104.70575,30.12173],[-104.45697,29.57196],[-103.94,29.27],[-103.11,28.97],[-102.48,29.76],[-101.6624,29.7793],[-100.9576,29.38071],[-100.45584,28.69612],[-100.11,28.11],[-99.52,27.54],[-99.3,26.84],[-99.02,26.37],[-98.24,26.06],[-97.53,25.84],[-97.140008,25.869997]]]}}, +{"type":"Feature","id":"MKD","properties":{"name":"Macedonia"},"geometry":{"type":"Polygon","coordinates":[[[20.59023,41.85541],[20.71731,41.84711],[20.76216,42.05186],[21.3527,42.2068],[21.576636,42.245224],[21.91708,42.30364],[22.380526,42.32026],[22.881374,41.999297],[22.952377,41.337994],[22.76177,41.3048],[22.597308,41.130487],[22.055378,41.149866],[21.674161,40.931275],[21.02004,40.842727],[20.60518,41.08622],[20.46315,41.51509],[20.59023,41.85541]]]}}, +{"type":"Feature","id":"MLI","properties":{"name":"Mali"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-11.834208,14.799097],[-11.666078,15.388208],[-11.349095,15.411256],[-10.650791,15.132746],[-10.086846,15.330486],[-9.700255,15.264107],[-9.550238,15.486497],[-5.537744,15.50169],[-5.315277,16.201854],[-5.488523,16.325102],[-5.971129,20.640833],[-6.453787,24.956591],[-4.923337,24.974574],[-1.550055,22.792666],[1.823228,20.610809],[2.060991,20.142233],[2.683588,19.85623],[3.146661,19.693579],[3.158133,19.057364],[4.267419,19.155265],[4.27021,16.852227],[3.723422,16.184284],[3.638259,15.56812],[2.749993,15.409525],[1.385528,15.323561],[1.015783,14.968182],[0.374892,14.928908],[-0.266257,14.924309],[-0.515854,15.116158],[-1.066363,14.973815],[-2.001035,14.559008],[-2.191825,14.246418],[-2.967694,13.79815],[-3.103707,13.541267],[-3.522803,13.337662],[-4.006391,13.472485],[-4.280405,13.228444],[-4.427166,12.542646],[-5.220942,11.713859],[-5.197843,11.375146],[-5.470565,10.95127],[-5.404342,10.370737],[-5.816926,10.222555],[-6.050452,10.096361],[-6.205223,10.524061],[-6.493965,10.411303],[-6.666461,10.430811],[-6.850507,10.138994],[-7.622759,10.147236],[-7.89959,10.297382],[-8.029944,10.206535],[-8.335377,10.494812],[-8.282357,10.792597],[-8.407311,10.909257],[-8.620321,10.810891],[-8.581305,11.136246],[-8.376305,11.393646],[-8.786099,11.812561],[-8.905265,12.088358],[-9.127474,12.30806],[-9.327616,12.334286],[-9.567912,12.194243],[-9.890993,12.060479],[-10.165214,11.844084],[-10.593224,11.923975],[-10.87083,12.177887],[-11.036556,12.211245],[-11.297574,12.077971],[-11.456169,12.076834],[-11.513943,12.442988],[-11.467899,12.754519],[-11.553398,13.141214],[-11.927716,13.422075],[-12.124887,13.994727],[-12.17075,14.616834]]]}}, +{"type":"Feature","id":"MMR","properties":{"name":"Myanmar"},"geometry":{"type":"Polygon","coordinates":[[[99.543309,20.186598],[98.959676,19.752981],[98.253724,19.708203],[97.797783,18.62708],[97.375896,18.445438],[97.859123,17.567946],[98.493761,16.837836],[98.903348,16.177824],[98.537376,15.308497],[98.192074,15.123703],[98.430819,14.622028],[99.097755,13.827503],[99.212012,13.269294],[99.196354,12.804748],[99.587286,11.892763],[99.038121,10.960546],[98.553551,9.93296],[98.457174,10.675266],[98.764546,11.441292],[98.428339,12.032987],[98.509574,13.122378],[98.103604,13.64046],[97.777732,14.837286],[97.597072,16.100568],[97.16454,16.928734],[96.505769,16.427241],[95.369352,15.71439],[94.808405,15.803454],[94.188804,16.037936],[94.533486,17.27724],[94.324817,18.213514],[93.540988,19.366493],[93.663255,19.726962],[93.078278,19.855145],[92.368554,20.670883],[92.303234,21.475485],[92.652257,21.324048],[92.672721,22.041239],[93.166128,22.27846],[93.060294,22.703111],[93.286327,23.043658],[93.325188,24.078556],[94.106742,23.850741],[94.552658,24.675238],[94.603249,25.162495],[95.155153,26.001307],[95.124768,26.573572],[96.419366,27.264589],[97.133999,27.083774],[97.051989,27.699059],[97.402561,27.882536],[97.327114,28.261583],[97.911988,28.335945],[98.246231,27.747221],[98.68269,27.508812],[98.712094,26.743536],[98.671838,25.918703],[97.724609,25.083637],[97.60472,23.897405],[98.660262,24.063286],[98.898749,23.142722],[99.531992,22.949039],[99.240899,22.118314],[99.983489,21.742937],[100.416538,21.558839],[101.150033,21.849984],[101.180005,21.436573],[100.329101,20.786122],[100.115988,20.41785],[99.543309,20.186598]]]}}, +{"type":"Feature","id":"MNE","properties":{"name":"Montenegro"},"geometry":{"type":"Polygon","coordinates":[[[19.801613,42.500093],[19.738051,42.688247],[19.30449,42.19574],[19.37177,41.87755],[19.16246,41.95502],[18.88214,42.28151],[18.45,42.48],[18.56,42.65],[18.70648,43.20011],[19.03165,43.43253],[19.21852,43.52384],[19.48389,43.35229],[19.63,43.21378],[19.95857,43.10604],[20.3398,42.89852],[20.25758,42.81275],[20.0707,42.58863],[19.801613,42.500093]]]}}, +{"type":"Feature","id":"MNG","properties":{"name":"Mongolia"},"geometry":{"type":"Polygon","coordinates":[[[87.751264,49.297198],[88.805567,49.470521],[90.713667,50.331812],[92.234712,50.802171],[93.104219,50.49529],[94.147566,50.480537],[94.815949,50.013433],[95.814028,49.977467],[97.259728,49.726061],[98.231762,50.422401],[97.82574,51.010995],[98.861491,52.047366],[99.981732,51.634006],[100.88948,51.516856],[102.065223,51.259921],[102.255909,50.510561],[103.676545,50.089966],[104.621552,50.275329],[105.886591,50.406019],[106.888804,50.274296],[107.868176,49.793705],[108.475167,49.282548],[109.402449,49.292961],[110.662011,49.130128],[111.581231,49.377968],[112.89774,49.543565],[114.362456,50.248303],[114.96211,50.140247],[115.485695,49.805177],[116.678801,49.888531],[116.191802,49.134598],[115.485282,48.135383],[115.742837,47.726545],[116.308953,47.85341],[117.295507,47.697709],[118.064143,48.06673],[118.866574,47.74706],[119.772824,47.048059],[119.66327,46.69268],[118.874326,46.805412],[117.421701,46.672733],[116.717868,46.388202],[115.985096,45.727235],[114.460332,45.339817],[113.463907,44.808893],[112.436062,45.011646],[111.873306,45.102079],[111.348377,44.457442],[111.667737,44.073176],[111.829588,43.743118],[111.129682,43.406834],[110.412103,42.871234],[109.243596,42.519446],[107.744773,42.481516],[106.129316,42.134328],[104.964994,41.59741],[104.522282,41.908347],[103.312278,41.907468],[101.83304,42.514873],[100.845866,42.663804],[99.515817,42.524691],[97.451757,42.74889],[96.349396,42.725635],[95.762455,43.319449],[95.306875,44.241331],[94.688929,44.352332],[93.480734,44.975472],[92.133891,45.115076],[90.94554,45.286073],[90.585768,45.719716],[90.970809,46.888146],[90.280826,47.693549],[88.854298,48.069082],[88.013832,48.599463],[87.751264,49.297198]]]}}, +{"type":"Feature","id":"MOZ","properties":{"name":"Mozambique"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[35.312398,-11.439146],[36.514082,-11.720938],[36.775151,-11.594537],[37.471284,-11.568751],[37.827645,-11.268769],[38.427557,-11.285202],[39.52103,-10.896854],[40.316589,-10.317096],[40.478387,-10.765441],[40.437253,-11.761711],[40.560811,-12.639177],[40.59962,-14.201975],[40.775475,-14.691764],[40.477251,-15.406294],[40.089264,-16.100774],[39.452559,-16.720891],[38.538351,-17.101023],[37.411133,-17.586368],[36.281279,-18.659688],[35.896497,-18.84226],[35.1984,-19.552811],[34.786383,-19.784012],[34.701893,-20.497043],[35.176127,-21.254361],[35.373428,-21.840837],[35.385848,-22.14],[35.562546,-22.09],[35.533935,-23.070788],[35.371774,-23.535359],[35.60747,-23.706563],[35.458746,-24.12261],[35.040735,-24.478351],[34.215824,-24.816314],[33.01321,-25.357573],[32.574632,-25.727318],[32.660363,-26.148584],[32.915955,-26.215867],[32.83012,-26.742192],[32.071665,-26.73382],[31.985779,-26.29178],[31.837778,-25.843332],[31.752408,-25.484284],[31.930589,-24.369417],[31.670398,-23.658969],[31.191409,-22.25151],[32.244988,-21.116489],[32.508693,-20.395292],[32.659743,-20.30429],[32.772708,-19.715592],[32.611994,-19.419383],[32.654886,-18.67209],[32.849861,-17.979057],[32.847639,-16.713398],[32.328239,-16.392074],[31.852041,-16.319417],[31.636498,-16.07199],[31.173064,-15.860944],[30.338955,-15.880839],[30.274256,-15.507787],[30.179481,-14.796099],[33.214025,-13.97186],[33.7897,-14.451831],[34.064825,-14.35995],[34.459633,-14.61301],[34.517666,-15.013709],[34.307291,-15.478641],[34.381292,-16.18356],[35.03381,-16.8013],[35.339063,-16.10744],[35.771905,-15.896859],[35.686845,-14.611046],[35.267956,-13.887834],[34.907151,-13.565425],[34.559989,-13.579998],[34.280006,-12.280025],[34.559989,-11.52002]]]}}, +{"type":"Feature","id":"MRT","properties":{"name":"Mauritania"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-12.830658,15.303692],[-13.435738,16.039383],[-14.099521,16.304302],[-14.577348,16.598264],[-15.135737,16.587282],[-15.623666,16.369337],[-16.12069,16.455663],[-16.463098,16.135036],[-16.549708,16.673892],[-16.270552,17.166963],[-16.146347,18.108482],[-16.256883,19.096716],[-16.377651,19.593817],[-16.277838,20.092521],[-16.536324,20.567866],[-17.063423,20.999752],[-16.845194,21.333323],[-12.929102,21.327071],[-13.118754,22.77122],[-12.874222,23.284832],[-11.937224,23.374594],[-11.969419,25.933353],[-8.687294,25.881056],[-8.6844,27.395744],[-4.923337,24.974574],[-6.453787,24.956591],[-5.971129,20.640833],[-5.488523,16.325102],[-5.315277,16.201854],[-5.537744,15.50169],[-9.550238,15.486497],[-9.700255,15.264107],[-10.086846,15.330486],[-10.650791,15.132746],[-11.349095,15.411256],[-11.666078,15.388208],[-11.834208,14.799097],[-12.17075,14.616834]]]}}, +{"type":"Feature","id":"MWI","properties":{"name":"Malawi"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[34.280006,-12.280025],[34.559989,-13.579998],[34.907151,-13.565425],[35.267956,-13.887834],[35.686845,-14.611046],[35.771905,-15.896859],[35.339063,-16.10744],[35.03381,-16.8013],[34.381292,-16.18356],[34.307291,-15.478641],[34.517666,-15.013709],[34.459633,-14.61301],[34.064825,-14.35995],[33.7897,-14.451831],[33.214025,-13.97186],[32.688165,-13.712858],[32.991764,-12.783871],[33.306422,-12.435778],[33.114289,-11.607198],[33.31531,-10.79655],[33.485688,-10.525559],[33.231388,-9.676722],[32.759375,-9.230599],[33.739729,-9.417151],[33.940838,-9.693674],[34.280006,-10.16],[34.559989,-11.52002]]]}}, +{"type":"Feature","id":"MYS","properties":{"name":"Malaysia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[101.075516,6.204867],[101.154219,5.691384],[101.814282,5.810808],[102.141187,6.221636],[102.371147,6.128205],[102.961705,5.524495],[103.381215,4.855001],[103.438575,4.181606],[103.332122,3.726698],[103.429429,3.382869],[103.502448,2.791019],[103.854674,2.515454],[104.247932,1.631141],[104.228811,1.293048],[103.519707,1.226334],[102.573615,1.967115],[101.390638,2.760814],[101.27354,3.270292],[100.695435,3.93914],[100.557408,4.76728],[100.196706,5.312493],[100.30626,6.040562],[100.085757,6.464489],[100.259596,6.642825],[101.075516,6.204867]]],[[[118.618321,4.478202],[117.882035,4.137551],[117.015214,4.306094],[115.865517,4.306559],[115.519078,3.169238],[115.134037,2.821482],[114.621355,1.430688],[113.80585,1.217549],[112.859809,1.49779],[112.380252,1.410121],[111.797548,0.904441],[111.159138,0.976478],[110.514061,0.773131],[109.830227,1.338136],[109.66326,2.006467],[110.396135,1.663775],[111.168853,1.850637],[111.370081,2.697303],[111.796928,2.885897],[112.995615,3.102395],[113.712935,3.893509],[114.204017,4.525874],[114.659596,4.007637],[114.869557,4.348314],[115.347461,4.316636],[115.4057,4.955228],[115.45071,5.44773],[116.220741,6.143191],[116.725103,6.924771],[117.129626,6.928053],[117.643393,6.422166],[117.689075,5.98749],[118.347691,5.708696],[119.181904,5.407836],[119.110694,5.016128],[118.439727,4.966519],[118.618321,4.478202]]]]}}, +{"type":"Feature","id":"NAM","properties":{"name":"Namibia"},"geometry":{"type":"Polygon","coordinates":[[[16.344977,-28.576705],[15.601818,-27.821247],[15.210472,-27.090956],[14.989711,-26.117372],[14.743214,-25.39292],[14.408144,-23.853014],[14.385717,-22.656653],[14.257714,-22.111208],[13.868642,-21.699037],[13.352498,-20.872834],[12.826845,-19.673166],[12.608564,-19.045349],[11.794919,-18.069129],[11.734199,-17.301889],[12.215461,-17.111668],[12.814081,-16.941343],[13.462362,-16.971212],[14.058501,-17.423381],[14.209707,-17.353101],[18.263309,-17.309951],[18.956187,-17.789095],[21.377176,-17.930636],[23.215048,-17.523116],[24.033862,-17.295843],[24.682349,-17.353411],[25.07695,-17.578823],[25.084443,-17.661816],[24.520705,-17.887125],[24.217365,-17.889347],[23.579006,-18.281261],[23.196858,-17.869038],[21.65504,-18.219146],[20.910641,-18.252219],[20.881134,-21.814327],[19.895458,-21.849157],[19.895768,-24.76779],[19.894734,-28.461105],[19.002127,-28.972443],[18.464899,-29.045462],[17.836152,-28.856378],[17.387497,-28.783514],[17.218929,-28.355943],[16.824017,-28.082162],[16.344977,-28.576705]]]}}, +{"type":"Feature","id":"NCL","properties":{"name":"New Caledonia"},"geometry":{"type":"Polygon","coordinates":[[[165.77999,-21.080005],[166.599991,-21.700019],[167.120011,-22.159991],[166.740035,-22.399976],[166.189732,-22.129708],[165.474375,-21.679607],[164.829815,-21.14982],[164.167995,-20.444747],[164.029606,-20.105646],[164.459967,-20.120012],[165.020036,-20.459991],[165.460009,-20.800022],[165.77999,-21.080005]]]}}, +{"type":"Feature","id":"NER","properties":{"name":"Niger"},"geometry":{"type":"Polygon","coordinates":[[[2.154474,11.94015],[2.177108,12.625018],[1.024103,12.851826],[0.993046,13.33575],[0.429928,13.988733],[0.295646,14.444235],[0.374892,14.928908],[1.015783,14.968182],[1.385528,15.323561],[2.749993,15.409525],[3.638259,15.56812],[3.723422,16.184284],[4.27021,16.852227],[4.267419,19.155265],[5.677566,19.601207],[8.572893,21.565661],[11.999506,23.471668],[13.581425,23.040506],[14.143871,22.491289],[14.8513,22.86295],[15.096888,21.308519],[15.471077,21.048457],[15.487148,20.730415],[15.903247,20.387619],[15.685741,19.95718],[15.300441,17.92795],[15.247731,16.627306],[13.972202,15.684366],[13.540394,14.367134],[13.956699,13.996691],[13.954477,13.353449],[14.595781,13.330427],[14.495787,12.859396],[14.213531,12.802035],[14.181336,12.483657],[13.995353,12.461565],[13.318702,13.556356],[13.083987,13.596147],[12.302071,13.037189],[11.527803,13.32898],[10.989593,13.387323],[10.701032,13.246918],[10.114814,13.277252],[9.524928,12.851102],[9.014933,12.826659],[7.804671,13.343527],[7.330747,13.098038],[6.820442,13.115091],[6.445426,13.492768],[5.443058,13.865924],[4.368344,13.747482],[4.107946,13.531216],[3.967283,12.956109],[3.680634,12.552903],[3.61118,11.660167],[2.848643,12.235636],[2.490164,12.233052],[2.154474,11.94015]]]}}, +{"type":"Feature","id":"NGA","properties":{"name":"Nigeria"},"geometry":{"type":"Polygon","coordinates":[[[8.500288,4.771983],[7.462108,4.412108],[7.082596,4.464689],[6.698072,4.240594],[5.898173,4.262453],[5.362805,4.887971],[5.033574,5.611802],[4.325607,6.270651],[3.57418,6.2583],[2.691702,6.258817],[2.749063,7.870734],[2.723793,8.506845],[2.912308,9.137608],[3.220352,9.444153],[3.705438,10.06321],[3.60007,10.332186],[3.797112,10.734746],[3.572216,11.327939],[3.61118,11.660167],[3.680634,12.552903],[3.967283,12.956109],[4.107946,13.531216],[4.368344,13.747482],[5.443058,13.865924],[6.445426,13.492768],[6.820442,13.115091],[7.330747,13.098038],[7.804671,13.343527],[9.014933,12.826659],[9.524928,12.851102],[10.114814,13.277252],[10.701032,13.246918],[10.989593,13.387323],[11.527803,13.32898],[12.302071,13.037189],[13.083987,13.596147],[13.318702,13.556356],[13.995353,12.461565],[14.181336,12.483657],[14.577178,12.085361],[14.468192,11.904752],[14.415379,11.572369],[13.57295,10.798566],[13.308676,10.160362],[13.1676,9.640626],[12.955468,9.417772],[12.753672,8.717763],[12.218872,8.305824],[12.063946,7.799808],[11.839309,7.397042],[11.745774,6.981383],[11.058788,6.644427],[10.497375,7.055358],[10.118277,7.03877],[9.522706,6.453482],[9.233163,6.444491],[8.757533,5.479666],[8.500288,4.771983]]]}}, +{"type":"Feature","id":"NIC","properties":{"name":"Nicaragua"},"geometry":{"type":"Polygon","coordinates":[[[-85.71254,11.088445],[-86.058488,11.403439],[-86.52585,11.806877],[-86.745992,12.143962],[-87.167516,12.458258],[-87.668493,12.90991],[-87.557467,13.064552],[-87.392386,12.914018],[-87.316654,12.984686],[-87.005769,13.025794],[-86.880557,13.254204],[-86.733822,13.263093],[-86.755087,13.754845],[-86.520708,13.778487],[-86.312142,13.771356],[-86.096264,14.038187],[-85.801295,13.836055],[-85.698665,13.960078],[-85.514413,14.079012],[-85.165365,14.35437],[-85.148751,14.560197],[-85.052787,14.551541],[-84.924501,14.790493],[-84.820037,14.819587],[-84.649582,14.666805],[-84.449336,14.621614],[-84.228342,14.748764],[-83.975721,14.749436],[-83.628585,14.880074],[-83.489989,15.016267],[-83.147219,14.995829],[-83.233234,14.899866],[-83.284162,14.676624],[-83.182126,14.310703],[-83.4125,13.970078],[-83.519832,13.567699],[-83.552207,13.127054],[-83.498515,12.869292],[-83.473323,12.419087],[-83.626104,12.32085],[-83.719613,11.893124],[-83.650858,11.629032],[-83.85547,11.373311],[-83.808936,11.103044],[-83.655612,10.938764],[-83.895054,10.726839],[-84.190179,10.79345],[-84.355931,10.999226],[-84.673069,11.082657],[-84.903003,10.952303],[-85.561852,11.217119],[-85.71254,11.088445]]]}}, +{"type":"Feature","id":"NLD","properties":{"name":"Netherlands"},"geometry":{"type":"Polygon","coordinates":[[[6.074183,53.510403],[6.90514,53.482162],[7.092053,53.144043],[6.84287,52.22844],[6.589397,51.852029],[5.988658,51.851616],[6.156658,50.803721],[5.606976,51.037298],[4.973991,51.475024],[4.047071,51.267259],[3.314971,51.345755],[3.830289,51.620545],[4.705997,53.091798],[6.074183,53.510403]]]}}, +{"type":"Feature","id":"NOR","properties":{"name":"Norway"},"geometry":{"type":"MultiPolygon","coordinates":[[[[28.165547,71.185474],[31.293418,70.453788],[30.005435,70.186259],[31.101079,69.55808],[29.399581,69.156916],[28.59193,69.064777],[29.015573,69.766491],[27.732292,70.164193],[26.179622,69.825299],[25.689213,69.092114],[24.735679,68.649557],[23.66205,68.891247],[22.356238,68.841741],[21.244936,69.370443],[20.645593,69.106247],[20.025269,69.065139],[19.87856,68.407194],[17.993868,68.567391],[17.729182,68.010552],[16.768879,68.013937],[16.108712,67.302456],[15.108411,66.193867],[13.55569,64.787028],[13.919905,64.445421],[13.571916,64.049114],[12.579935,64.066219],[11.930569,63.128318],[11.992064,61.800362],[12.631147,61.293572],[12.300366,60.117933],[11.468272,59.432393],[11.027369,58.856149],[10.356557,59.469807],[8.382,58.313288],[7.048748,58.078884],[5.665835,58.588155],[5.308234,59.663232],[4.992078,61.970998],[5.9129,62.614473],[8.553411,63.454008],[10.527709,64.486038],[12.358347,65.879726],[14.761146,67.810642],[16.435927,68.563205],[19.184028,69.817444],[21.378416,70.255169],[23.023742,70.202072],[24.546543,71.030497],[26.37005,70.986262],[28.165547,71.185474]]],[[[24.72412,77.85385],[22.49032,77.44493],[20.72601,77.67704],[21.41611,77.93504],[20.8119,78.25463],[22.88426,78.45494],[23.28134,78.07954],[24.72412,77.85385]]],[[[18.25183,79.70175],[21.54383,78.95611],[19.02737,78.5626],[18.47172,77.82669],[17.59441,77.63796],[17.1182,76.80941],[15.91315,76.77045],[13.76259,77.38035],[14.66956,77.73565],[13.1706,78.02493],[11.22231,78.8693],[10.44453,79.65239],[13.17077,80.01046],[13.71852,79.66039],[15.14282,79.67431],[15.52255,80.01608],[16.99085,80.05086],[18.25183,79.70175]]],[[[25.447625,80.40734],[27.407506,80.056406],[25.924651,79.517834],[23.024466,79.400012],[20.075188,79.566823],[19.897266,79.842362],[18.462264,79.85988],[17.368015,80.318896],[20.455992,80.598156],[21.907945,80.357679],[22.919253,80.657144],[25.447625,80.40734]]]]}}, +{"type":"Feature","id":"NPL","properties":{"name":"Nepal"},"geometry":{"type":"Polygon","coordinates":[[[88.120441,27.876542],[88.043133,27.445819],[88.174804,26.810405],[88.060238,26.414615],[87.227472,26.397898],[86.024393,26.630985],[85.251779,26.726198],[84.675018,27.234901],[83.304249,27.364506],[81.999987,27.925479],[81.057203,28.416095],[80.088425,28.79447],[80.476721,29.729865],[81.111256,30.183481],[81.525804,30.422717],[82.327513,30.115268],[83.337115,29.463732],[83.898993,29.320226],[84.23458,28.839894],[85.011638,28.642774],[85.82332,28.203576],[86.954517,27.974262],[88.120441,27.876542]]]}}, +{"type":"Feature","id":"NZL","properties":{"name":"New Zealand"},"geometry":{"type":"MultiPolygon","coordinates":[[[[173.020375,-40.919052],[173.247234,-41.331999],[173.958405,-40.926701],[174.247587,-41.349155],[174.248517,-41.770008],[173.876447,-42.233184],[173.22274,-42.970038],[172.711246,-43.372288],[173.080113,-43.853344],[172.308584,-43.865694],[171.452925,-44.242519],[171.185138,-44.897104],[170.616697,-45.908929],[169.831422,-46.355775],[169.332331,-46.641235],[168.411354,-46.619945],[167.763745,-46.290197],[166.676886,-46.219917],[166.509144,-45.852705],[167.046424,-45.110941],[168.303763,-44.123973],[168.949409,-43.935819],[169.667815,-43.555326],[170.52492,-43.031688],[171.12509,-42.512754],[171.569714,-41.767424],[171.948709,-41.514417],[172.097227,-40.956104],[172.79858,-40.493962],[173.020375,-40.919052]]],[[[174.612009,-36.156397],[175.336616,-37.209098],[175.357596,-36.526194],[175.808887,-36.798942],[175.95849,-37.555382],[176.763195,-37.881253],[177.438813,-37.961248],[178.010354,-37.579825],[178.517094,-37.695373],[178.274731,-38.582813],[177.97046,-39.166343],[177.206993,-39.145776],[176.939981,-39.449736],[177.032946,-39.879943],[176.885824,-40.065978],[176.508017,-40.604808],[176.01244,-41.289624],[175.239567,-41.688308],[175.067898,-41.425895],[174.650973,-41.281821],[175.22763,-40.459236],[174.900157,-39.908933],[173.824047,-39.508854],[173.852262,-39.146602],[174.574802,-38.797683],[174.743474,-38.027808],[174.697017,-37.381129],[174.292028,-36.711092],[174.319004,-36.534824],[173.840997,-36.121981],[173.054171,-35.237125],[172.636005,-34.529107],[173.007042,-34.450662],[173.551298,-35.006183],[174.32939,-35.265496],[174.612009,-36.156397]]]]}}, +{"type":"Feature","id":"OMN","properties":{"name":"Oman"},"geometry":{"type":"MultiPolygon","coordinates":[[[[58.861141,21.114035],[58.487986,20.428986],[58.034318,20.481437],[57.826373,20.243002],[57.665762,19.736005],[57.7887,19.06757],[57.694391,18.94471],[57.234264,18.947991],[56.609651,18.574267],[56.512189,18.087113],[56.283521,17.876067],[55.661492,17.884128],[55.269939,17.632309],[55.2749,17.228354],[54.791002,16.950697],[54.239253,17.044981],[53.570508,16.707663],[53.108573,16.651051],[52.782184,17.349742],[52.00001,19.000003],[54.999982,19.999994],[55.666659,22.000001],[55.208341,22.70833],[55.234489,23.110993],[55.525841,23.524869],[55.528632,23.933604],[55.981214,24.130543],[55.804119,24.269604],[55.886233,24.920831],[56.396847,24.924732],[56.84514,24.241673],[57.403453,23.878594],[58.136948,23.747931],[58.729211,23.565668],[59.180502,22.992395],[59.450098,22.660271],[59.80806,22.533612],[59.806148,22.310525],[59.442191,21.714541],[59.282408,21.433886],[58.861141,21.114035]]],[[[56.391421,25.895991],[56.261042,25.714606],[56.070821,26.055464],[56.362017,26.395934],[56.485679,26.309118],[56.391421,25.895991]]]]}}, +{"type":"Feature","id":"PAK","properties":{"name":"Pakistan"},"geometry":{"type":"Polygon","coordinates":[[[75.158028,37.133031],[75.896897,36.666806],[76.192848,35.898403],[77.837451,35.49401],[76.871722,34.653544],[75.757061,34.504923],[74.240203,34.748887],[73.749948,34.317699],[74.104294,33.441473],[74.451559,32.7649],[75.258642,32.271105],[74.405929,31.692639],[74.42138,30.979815],[73.450638,29.976413],[72.823752,28.961592],[71.777666,27.91318],[70.616496,27.989196],[69.514393,26.940966],[70.168927,26.491872],[70.282873,25.722229],[70.844699,25.215102],[71.04324,24.356524],[68.842599,24.359134],[68.176645,23.691965],[67.443667,23.944844],[67.145442,24.663611],[66.372828,25.425141],[64.530408,25.237039],[62.905701,25.218409],[61.497363,25.078237],[61.874187,26.239975],[63.316632,26.756532],[63.233898,27.217047],[62.755426,27.378923],[62.72783,28.259645],[61.771868,28.699334],[61.369309,29.303276],[60.874248,29.829239],[62.549857,29.318572],[63.550261,29.468331],[64.148002,29.340819],[64.350419,29.560031],[65.046862,29.472181],[66.346473,29.887943],[66.381458,30.738899],[66.938891,31.304911],[67.683394,31.303154],[67.792689,31.58293],[68.556932,31.71331],[68.926677,31.620189],[69.317764,31.901412],[69.262522,32.501944],[69.687147,33.105499],[70.323594,33.358533],[69.930543,34.02012],[70.881803,33.988856],[71.156773,34.348911],[71.115019,34.733126],[71.613076,35.153203],[71.498768,35.650563],[71.262348,36.074388],[71.846292,36.509942],[72.920025,36.720007],[74.067552,36.836176],[74.575893,37.020841],[75.158028,37.133031]]]}}, +{"type":"Feature","id":"PAN","properties":{"name":"Panama"},"geometry":{"type":"Polygon","coordinates":[[[-77.881571,7.223771],[-78.214936,7.512255],[-78.429161,8.052041],[-78.182096,8.319182],[-78.435465,8.387705],[-78.622121,8.718124],[-79.120307,8.996092],[-79.557877,8.932375],[-79.760578,8.584515],[-80.164481,8.333316],[-80.382659,8.298409],[-80.480689,8.090308],[-80.00369,7.547524],[-80.276671,7.419754],[-80.421158,7.271572],[-80.886401,7.220541],[-81.059543,7.817921],[-81.189716,7.647906],[-81.519515,7.70661],[-81.721311,8.108963],[-82.131441,8.175393],[-82.390934,8.292362],[-82.820081,8.290864],[-82.850958,8.073823],[-82.965783,8.225028],[-82.913176,8.423517],[-82.829771,8.626295],[-82.868657,8.807266],[-82.719183,8.925709],[-82.927155,9.07433],[-82.932891,9.476812],[-82.546196,9.566135],[-82.187123,9.207449],[-82.207586,8.995575],[-81.808567,8.950617],[-81.714154,9.031955],[-81.439287,8.786234],[-80.947302,8.858504],[-80.521901,9.111072],[-79.9146,9.312765],[-79.573303,9.61161],[-79.021192,9.552931],[-79.05845,9.454565],[-78.500888,9.420459],[-78.055928,9.24773],[-77.729514,8.946844],[-77.353361,8.670505],[-77.474723,8.524286],[-77.242566,7.935278],[-77.431108,7.638061],[-77.753414,7.70984],[-77.881571,7.223771]]]}}, +{"type":"Feature","id":"PER","properties":{"name":"Peru"},"geometry":{"type":"Polygon","coordinates":[[[-69.590424,-17.580012],[-69.858444,-18.092694],[-70.372572,-18.347975],[-71.37525,-17.773799],[-71.462041,-17.363488],[-73.44453,-16.359363],[-75.237883,-15.265683],[-76.009205,-14.649286],[-76.423469,-13.823187],[-76.259242,-13.535039],[-77.106192,-12.222716],[-78.092153,-10.377712],[-79.036953,-8.386568],[-79.44592,-7.930833],[-79.760578,-7.194341],[-80.537482,-6.541668],[-81.249996,-6.136834],[-80.926347,-5.690557],[-81.410943,-4.736765],[-81.09967,-4.036394],[-80.302561,-3.404856],[-80.184015,-3.821162],[-80.469295,-4.059287],[-80.442242,-4.425724],[-80.028908,-4.346091],[-79.624979,-4.454198],[-79.205289,-4.959129],[-78.639897,-4.547784],[-78.450684,-3.873097],[-77.837905,-3.003021],[-76.635394,-2.608678],[-75.544996,-1.56161],[-75.233723,-0.911417],[-75.373223,-0.152032],[-75.106625,-0.057205],[-74.441601,-0.53082],[-74.122395,-1.002833],[-73.659504,-1.260491],[-73.070392,-2.308954],[-72.325787,-2.434218],[-71.774761,-2.16979],[-71.413646,-2.342802],[-70.813476,-2.256865],[-70.047709,-2.725156],[-70.692682,-3.742872],[-70.394044,-3.766591],[-69.893635,-4.298187],[-70.794769,-4.251265],[-70.928843,-4.401591],[-71.748406,-4.593983],[-72.891928,-5.274561],[-72.964507,-5.741251],[-73.219711,-6.089189],[-73.120027,-6.629931],[-73.724487,-6.918595],[-73.723401,-7.340999],[-73.987235,-7.52383],[-73.571059,-8.424447],[-73.015383,-9.032833],[-73.226713,-9.462213],[-72.563033,-9.520194],[-72.184891,-10.053598],[-71.302412,-10.079436],[-70.481894,-9.490118],[-70.548686,-11.009147],[-70.093752,-11.123972],[-69.529678,-10.951734],[-68.66508,-12.5613],[-68.88008,-12.899729],[-68.929224,-13.602684],[-68.948887,-14.453639],[-69.339535,-14.953195],[-69.160347,-15.323974],[-69.389764,-15.660129],[-68.959635,-16.500698],[-69.590424,-17.580012]]]}}, +{"type":"Feature","id":"PHL","properties":{"name":"Philippines"},"geometry":{"type":"MultiPolygon","coordinates":[[[[126.376814,8.414706],[126.478513,7.750354],[126.537424,7.189381],[126.196773,6.274294],[125.831421,7.293715],[125.363852,6.786485],[125.683161,6.049657],[125.396512,5.581003],[124.219788,6.161355],[123.93872,6.885136],[124.243662,7.36061],[123.610212,7.833527],[123.296071,7.418876],[122.825506,7.457375],[122.085499,6.899424],[121.919928,7.192119],[122.312359,8.034962],[122.942398,8.316237],[123.487688,8.69301],[123.841154,8.240324],[124.60147,8.514158],[124.764612,8.960409],[125.471391,8.986997],[125.412118,9.760335],[126.222714,9.286074],[126.306637,8.782487],[126.376814,8.414706]]],[[[123.982438,10.278779],[123.623183,9.950091],[123.309921,9.318269],[122.995883,9.022189],[122.380055,9.713361],[122.586089,9.981045],[122.837081,10.261157],[122.947411,10.881868],[123.49885,10.940624],[123.337774,10.267384],[124.077936,11.232726],[123.982438,10.278779]]],[[[118.504581,9.316383],[117.174275,8.3675],[117.664477,9.066889],[118.386914,9.6845],[118.987342,10.376292],[119.511496,11.369668],[119.689677,10.554291],[119.029458,10.003653],[118.504581,9.316383]]],[[[121.883548,11.891755],[122.483821,11.582187],[123.120217,11.58366],[123.100838,11.165934],[122.637714,10.741308],[122.00261,10.441017],[121.967367,10.905691],[122.03837,11.415841],[121.883548,11.891755]]],[[[125.502552,12.162695],[125.783465,11.046122],[125.011884,11.311455],[125.032761,10.975816],[125.277449,10.358722],[124.801819,10.134679],[124.760168,10.837995],[124.459101,10.88993],[124.302522,11.495371],[124.891013,11.415583],[124.87799,11.79419],[124.266762,12.557761],[125.227116,12.535721],[125.502552,12.162695]]],[[[121.527394,13.06959],[121.26219,12.20556],[120.833896,12.704496],[120.323436,13.466413],[121.180128,13.429697],[121.527394,13.06959]]],[[[121.321308,18.504065],[121.937601,18.218552],[122.246006,18.47895],[122.336957,18.224883],[122.174279,17.810283],[122.515654,17.093505],[122.252311,16.262444],[121.662786,15.931018],[121.50507,15.124814],[121.728829,14.328376],[122.258925,14.218202],[122.701276,14.336541],[123.950295,13.782131],[123.855107,13.237771],[124.181289,12.997527],[124.077419,12.536677],[123.298035,13.027526],[122.928652,13.55292],[122.671355,13.185836],[122.03465,13.784482],[121.126385,13.636687],[120.628637,13.857656],[120.679384,14.271016],[120.991819,14.525393],[120.693336,14.756671],[120.564145,14.396279],[120.070429,14.970869],[119.920929,15.406347],[119.883773,16.363704],[120.286488,16.034629],[120.390047,17.599081],[120.715867,18.505227],[121.321308,18.504065]]]]}}, +{"type":"Feature","id":"PNG","properties":{"name":"Papua New Guinea"},"geometry":{"type":"MultiPolygon","coordinates":[[[[155.880026,-6.819997],[155.599991,-6.919991],[155.166994,-6.535931],[154.729192,-5.900828],[154.514114,-5.139118],[154.652504,-5.042431],[154.759991,-5.339984],[155.062918,-5.566792],[155.547746,-6.200655],[156.019965,-6.540014],[155.880026,-6.819997]]],[[[151.982796,-5.478063],[151.459107,-5.56028],[151.30139,-5.840728],[150.754447,-6.083763],[150.241197,-6.317754],[149.709963,-6.316513],[148.890065,-6.02604],[148.318937,-5.747142],[148.401826,-5.437756],[149.298412,-5.583742],[149.845562,-5.505503],[149.99625,-5.026101],[150.139756,-5.001348],[150.236908,-5.53222],[150.807467,-5.455842],[151.089672,-5.113693],[151.647881,-4.757074],[151.537862,-4.167807],[152.136792,-4.14879],[152.338743,-4.312966],[152.318693,-4.867661],[151.982796,-5.478063]]],[[[147.191874,-7.388024],[148.084636,-8.044108],[148.734105,-9.104664],[149.306835,-9.071436],[149.266631,-9.514406],[150.038728,-9.684318],[149.738798,-9.872937],[150.801628,-10.293687],[150.690575,-10.582713],[150.028393,-10.652476],[149.78231,-10.393267],[148.923138,-10.280923],[147.913018,-10.130441],[147.135443,-9.492444],[146.567881,-8.942555],[146.048481,-8.067414],[144.744168,-7.630128],[143.897088,-7.91533],[143.286376,-8.245491],[143.413913,-8.983069],[142.628431,-9.326821],[142.068259,-9.159596],[141.033852,-9.117893],[141.017057,-5.859022],[141.00021,-2.600151],[142.735247,-3.289153],[144.583971,-3.861418],[145.27318,-4.373738],[145.829786,-4.876498],[145.981922,-5.465609],[147.648073,-6.083659],[147.891108,-6.614015],[146.970905,-6.721657],[147.191874,-7.388024]]],[[[153.140038,-4.499983],[152.827292,-4.766427],[152.638673,-4.176127],[152.406026,-3.789743],[151.953237,-3.462062],[151.384279,-3.035422],[150.66205,-2.741486],[150.939965,-2.500002],[151.479984,-2.779985],[151.820015,-2.999972],[152.239989,-3.240009],[152.640017,-3.659983],[153.019994,-3.980015],[153.140038,-4.499983]]]]}}, +{"type":"Feature","id":"POL","properties":{"name":"Poland"},"geometry":{"type":"Polygon","coordinates":[[[15.016996,51.106674],[14.607098,51.745188],[14.685026,52.089947],[14.4376,52.62485],[14.074521,52.981263],[14.353315,53.248171],[14.119686,53.757029],[14.8029,54.050706],[16.363477,54.513159],[17.622832,54.851536],[18.620859,54.682606],[18.696255,54.438719],[19.66064,54.426084],[20.892245,54.312525],[22.731099,54.327537],[23.243987,54.220567],[23.484128,53.912498],[23.527536,53.470122],[23.804935,53.089731],[23.799199,52.691099],[23.199494,52.486977],[23.508002,52.023647],[23.527071,51.578454],[24.029986,50.705407],[23.922757,50.424881],[23.426508,50.308506],[22.51845,49.476774],[22.776419,49.027395],[22.558138,49.085738],[21.607808,49.470107],[20.887955,49.328772],[20.415839,49.431453],[19.825023,49.217125],[19.320713,49.571574],[18.909575,49.435846],[18.853144,49.49623],[18.392914,49.988629],[17.649445,50.049038],[17.554567,50.362146],[16.868769,50.473974],[16.719476,50.215747],[16.176253,50.422607],[16.238627,50.697733],[15.490972,50.78473],[15.016996,51.106674]]]}}, +{"type":"Feature","id":"PRI","properties":{"name":"Puerto Rico"},"geometry":{"type":"Polygon","coordinates":[[[-66.282434,18.514762],[-65.771303,18.426679],[-65.591004,18.228035],[-65.847164,17.975906],[-66.599934,17.981823],[-67.184162,17.946553],[-67.242428,18.37446],[-67.100679,18.520601],[-66.282434,18.514762]]]}}, +{"type":"Feature","id":"PRK","properties":{"name":"North Korea"},"geometry":{"type":"Polygon","coordinates":[[[130.640016,42.395009],[130.780007,42.220007],[130.400031,42.280004],[129.965949,41.941368],[129.667362,41.601104],[129.705189,40.882828],[129.188115,40.661808],[129.0104,40.485436],[128.633368,40.189847],[127.967414,40.025413],[127.533436,39.75685],[127.50212,39.323931],[127.385434,39.213472],[127.783343,39.050898],[128.349716,38.612243],[128.205746,38.370397],[127.780035,38.304536],[127.073309,38.256115],[126.68372,37.804773],[126.237339,37.840378],[126.174759,37.749686],[125.689104,37.94001],[125.568439,37.752089],[125.27533,37.669071],[125.240087,37.857224],[124.981033,37.948821],[124.712161,38.108346],[124.985994,38.548474],[125.221949,38.665857],[125.132859,38.848559],[125.38659,39.387958],[125.321116,39.551385],[124.737482,39.660344],[124.265625,39.928493],[125.079942,40.569824],[126.182045,41.107336],[126.869083,41.816569],[127.343783,41.503152],[128.208433,41.466772],[128.052215,41.994285],[129.596669,42.424982],[129.994267,42.985387],[130.640016,42.395009]]]}}, +{"type":"Feature","id":"PRT","properties":{"name":"Portugal"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.671946,42.134689],[-8.263857,42.280469],[-8.013175,41.790886],[-7.422513,41.792075],[-7.251309,41.918346],[-6.668606,41.883387],[-6.389088,41.381815],[-6.851127,41.111083],[-6.86402,40.330872],[-7.026413,40.184524],[-7.066592,39.711892],[-7.498632,39.629571],[-7.098037,39.030073],[-7.374092,38.373059],[-7.029281,38.075764],[-7.166508,37.803894],[-7.537105,37.428904],[-7.453726,37.097788],[-7.855613,36.838269],[-8.382816,36.97888],[-8.898857,36.868809],[-8.746101,37.651346],[-8.839998,38.266243],[-9.287464,38.358486],[-9.526571,38.737429],[-9.446989,39.392066],[-9.048305,39.755093],[-8.977353,40.159306],[-8.768684,40.760639],[-8.790853,41.184334],[-8.990789,41.543459],[-9.034818,41.880571]]]}}, +{"type":"Feature","id":"PRY","properties":{"name":"Paraguay"},"geometry":{"type":"Polygon","coordinates":[[[-62.685057,-22.249029],[-62.291179,-21.051635],[-62.265961,-20.513735],[-61.786326,-19.633737],[-60.043565,-19.342747],[-59.115042,-19.356906],[-58.183471,-19.868399],[-58.166392,-20.176701],[-57.870674,-20.732688],[-57.937156,-22.090176],[-56.88151,-22.282154],[-56.473317,-22.0863],[-55.797958,-22.35693],[-55.610683,-22.655619],[-55.517639,-23.571998],[-55.400747,-23.956935],[-55.027902,-24.001274],[-54.652834,-23.839578],[-54.29296,-24.021014],[-54.293476,-24.5708],[-54.428946,-25.162185],[-54.625291,-25.739255],[-54.788795,-26.621786],[-55.695846,-27.387837],[-56.486702,-27.548499],[-57.60976,-27.395899],[-58.618174,-27.123719],[-57.63366,-25.603657],[-57.777217,-25.16234],[-58.807128,-24.771459],[-60.028966,-24.032796],[-60.846565,-23.880713],[-62.685057,-22.249029]]]}}, +{"type":"Feature","id":"QAT","properties":{"name":"Qatar"},"geometry":{"type":"Polygon","coordinates":[[[50.810108,24.754743],[50.743911,25.482424],[51.013352,26.006992],[51.286462,26.114582],[51.589079,25.801113],[51.6067,25.21567],[51.389608,24.627386],[51.112415,24.556331],[50.810108,24.754743]]]}}, +{"type":"Feature","id":"ROU","properties":{"name":"Romania"},"geometry":{"type":"Polygon","coordinates":[[[22.710531,47.882194],[23.142236,48.096341],[23.760958,47.985598],[24.402056,47.981878],[24.866317,47.737526],[25.207743,47.891056],[25.945941,47.987149],[26.19745,48.220881],[26.619337,48.220726],[26.924176,48.123264],[27.233873,47.826771],[27.551166,47.405117],[28.12803,46.810476],[28.160018,46.371563],[28.054443,45.944586],[28.233554,45.488283],[28.679779,45.304031],[29.149725,45.464925],[29.603289,45.293308],[29.626543,45.035391],[29.141612,44.82021],[28.837858,44.913874],[28.558081,43.707462],[27.970107,43.812468],[27.2424,44.175986],[26.065159,43.943494],[25.569272,43.688445],[24.100679,43.741051],[23.332302,43.897011],[22.944832,43.823785],[22.65715,44.234923],[22.474008,44.409228],[22.705726,44.578003],[22.459022,44.702517],[22.145088,44.478422],[21.562023,44.768947],[21.483526,45.18117],[20.874313,45.416375],[20.762175,45.734573],[20.220192,46.127469],[21.021952,46.316088],[21.626515,46.994238],[22.099768,47.672439],[22.710531,47.882194]]]}}, +{"type":"Feature","id":"RUS","properties":{"name":"Russia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[143.648007,50.7476],[144.654148,48.976391],[143.173928,49.306551],[142.558668,47.861575],[143.533492,46.836728],[143.505277,46.137908],[142.747701,46.740765],[142.09203,45.966755],[141.906925,46.805929],[142.018443,47.780133],[141.904445,48.859189],[142.1358,49.615163],[142.179983,50.952342],[141.594076,51.935435],[141.682546,53.301966],[142.606934,53.762145],[142.209749,54.225476],[142.654786,54.365881],[142.914616,53.704578],[143.260848,52.74076],[143.235268,51.75666],[143.648007,50.7476]]],[[[22.731099,54.327537],[20.892245,54.312525],[19.66064,54.426084],[19.888481,54.86616],[21.268449,55.190482],[22.315724,55.015299],[22.757764,54.856574],[22.651052,54.582741],[22.731099,54.327537]]],[[[-175.01425,66.58435],[-174.33983,66.33556],[-174.57182,67.06219],[-171.85731,66.91308],[-169.89958,65.97724],[-170.89107,65.54139],[-172.53025,65.43791],[-172.555,64.46079],[-172.95533,64.25269],[-173.89184,64.2826],[-174.65392,64.63125],[-175.98353,64.92288],[-176.20716,65.35667],[-177.22266,65.52024],[-178.35993,65.39052],[-178.90332,65.74044],[-178.68611,66.11211],[-179.88377,65.87456],[-179.43268,65.40411],[-180,64.979709],[-180,68.963636],[-177.55,68.2],[-174.92825,67.20589],[-175.01425,66.58435]]],[[[180,70.832199],[178.903425,70.78114],[178.7253,71.0988],[180,71.515714],[180,70.832199]]],[[[-178.69378,70.89302],[-180,70.832199],[-180,71.515714],[-179.871875,71.55762],[-179.02433,71.55553],[-177.577945,71.26948],[-177.663575,71.13277],[-178.69378,70.89302]]],[[[143.60385,73.21244],[142.08763,73.20544],[140.038155,73.31692],[139.86312,73.36983],[140.81171,73.76506],[142.06207,73.85758],[143.48283,73.47525],[143.60385,73.21244]]],[[[150.73167,75.08406],[149.575925,74.68892],[147.977465,74.778355],[146.11919,75.17298],[146.358485,75.49682],[148.22223,75.345845],[150.73167,75.08406]]],[[[145.086285,75.562625],[144.3,74.82],[140.61381,74.84768],[138.95544,74.61148],[136.97439,75.26167],[137.51176,75.94917],[138.831075,76.13676],[141.471615,76.09289],[145.086285,75.562625]]],[[[57.535693,70.720464],[56.944979,70.632743],[53.677375,70.762658],[53.412017,71.206662],[51.601895,71.474759],[51.455754,72.014881],[52.478275,72.229442],[52.444169,72.774731],[54.427614,73.627548],[53.50829,73.749814],[55.902459,74.627486],[55.631933,75.081412],[57.868644,75.60939],[61.170044,76.251883],[64.498368,76.439055],[66.210977,76.809782],[68.15706,76.939697],[68.852211,76.544811],[68.180573,76.233642],[64.637326,75.737755],[61.583508,75.260885],[58.477082,74.309056],[56.986786,73.333044],[55.419336,72.371268],[55.622838,71.540595],[57.535693,70.720464]]],[[[106.97013,76.97419],[107.24,76.48],[108.1538,76.72335],[111.07726,76.71],[113.33151,76.22224],[114.13417,75.84764],[113.88539,75.32779],[112.77918,75.03186],[110.15125,74.47673],[109.4,74.18],[110.64,74.04],[112.11919,73.78774],[113.01954,73.97693],[113.52958,73.33505],[113.96881,73.59488],[115.56782,73.75285],[118.77633,73.58772],[119.02,73.12],[123.20066,72.97122],[123.25777,73.73503],[125.38,73.56],[126.97644,73.56549],[128.59126,73.03871],[129.05157,72.39872],[128.46,71.98],[129.71599,71.19304],[131.28858,70.78699],[132.2535,71.8363],[133.85766,71.38642],[135.56193,71.65525],[137.49755,71.34763],[138.23409,71.62803],[139.86983,71.48783],[139.14791,72.41619],[140.46817,72.84941],[149.5,72.2],[150.35118,71.60643],[152.9689,70.84222],[157.00688,71.03141],[158.99779,70.86672],[159.83031,70.45324],[159.70866,69.72198],[160.94053,69.43728],[162.27907,69.64204],[164.05248,69.66823],[165.94037,69.47199],[167.83567,69.58269],[169.57763,68.6938],[170.81688,69.01363],[170.0082,69.65276],[170.45345,70.09703],[173.64391,69.81743],[175.72403,69.87725],[178.6,69.4],[180,68.963636],[180,64.979709],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.633866,42.903015],[131.144688,42.92999],[131.288555,44.11152],[131.02519,44.96796],[131.883454,45.321162],[133.09712,45.14409],[133.769644,46.116927],[134.11235,47.21248],[134.50081,47.57845],[135.026311,48.47823],[133.373596,48.183442],[132.50669,47.78896],[130.98726,47.79013],[130.582293,48.729687],[129.397818,49.4406],[127.6574,49.76027],[127.287456,50.739797],[126.939157,51.353894],[126.564399,51.784255],[125.946349,52.792799],[125.068211,53.161045],[123.57147,53.4588],[122.245748,53.431726],[121.003085,53.251401],[120.177089,52.753886],[120.725789,52.516226],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.288461,50.142883],[117.879244,49.510983],[116.678801,49.888531],[115.485695,49.805177],[114.96211,50.140247],[114.362456,50.248303],[112.89774,49.543565],[111.581231,49.377968],[110.662011,49.130128],[109.402449,49.292961],[108.475167,49.282548],[107.868176,49.793705],[106.888804,50.274296],[105.886591,50.406019],[104.62158,50.27532],[103.676545,50.089966],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.516856],[99.981732,51.634006],[98.861491,52.047366],[97.82574,51.010995],[98.231762,50.422401],[97.25976,49.72605],[95.81402,49.97746],[94.815949,50.013433],[94.147566,50.480537],[93.10421,50.49529],[92.234712,50.802171],[90.713667,50.331812],[88.805567,49.470521],[87.751264,49.297198],[87.35997,49.214981],[86.829357,49.826675],[85.54127,49.692859],[85.11556,50.117303],[84.416377,50.3114],[83.935115,50.889246],[83.383004,51.069183],[81.945986,50.812196],[80.568447,51.388336],[80.03556,50.864751],[77.800916,53.404415],[76.525179,54.177003],[76.8911,54.490524],[74.38482,53.54685],[73.425679,53.48981],[73.508516,54.035617],[72.22415,54.376655],[71.180131,54.133285],[70.865267,55.169734],[69.068167,55.38525],[68.1691,54.970392],[65.66687,54.60125],[65.178534,54.354228],[61.4366,54.00625],[60.978066,53.664993],[61.699986,52.979996],[60.739993,52.719986],[60.927269,52.447548],[59.967534,51.96042],[61.588003,51.272659],[61.337424,50.79907],[59.932807,50.842194],[59.642282,50.545442],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.532878,51.02624],[52.328724,51.718652],[50.766648,51.692762],[48.702382,50.605128],[48.577841,49.87476],[47.54948,50.454698],[46.751596,49.356006],[47.043672,49.152039],[46.466446,48.394152],[47.31524,47.71585],[48.05725,47.74377],[48.694734,47.075628],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.987283,41.405819],[47.815666,41.151416],[47.373315,41.219732],[46.686071,41.827137],[46.404951,41.860675],[45.7764,42.09244],[45.470279,42.502781],[44.537623,42.711993],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.076965,43.553104],[39.955009,43.434998],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.223538,47.10219],[38.255112,47.5464],[38.77057,47.82562],[39.738278,47.898937],[39.89562,48.23241],[39.67465,48.78382],[40.080789,49.30743],[40.06904,49.60105],[38.594988,49.926462],[38.010631,49.915662],[37.39346,50.383953],[36.626168,50.225591],[35.356116,50.577197],[35.37791,50.77394],[35.022183,51.207572],[34.224816,51.255993],[34.141978,51.566413],[34.391731,51.768882],[33.7527,52.335075],[32.715761,52.238465],[32.412058,52.288695],[32.15944,52.06125],[31.78597,52.10168],[31.540018,52.742052],[31.305201,53.073996],[31.49764,53.16743],[32.304519,53.132726],[32.693643,53.351421],[32.405599,53.618045],[31.731273,53.794029],[31.791424,53.974639],[31.384472,54.157056],[30.757534,54.811771],[30.971836,55.081548],[30.873909,55.550976],[29.896294,55.789463],[29.371572,55.670091],[29.229513,55.918344],[28.176709,56.16913],[27.855282,56.759326],[27.770016,57.244258],[27.288185,57.474528],[27.716686,57.791899],[27.42015,58.72457],[28.131699,59.300825],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.211107,61.780028],[31.139991,62.357693],[31.516092,62.867687],[30.035872,63.552814],[30.444685,64.204453],[29.54443,64.948672],[30.21765,65.80598],[29.054589,66.944286],[29.977426,67.698297],[28.445944,68.364613],[28.59193,69.064777],[29.39955,69.15692],[31.10108,69.55811],[32.13272,69.90595],[33.77547,69.30142],[36.51396,69.06342],[40.29234,67.9324],[41.05987,67.45713],[41.12595,66.79158],[40.01583,66.26618],[38.38295,65.99953],[33.91871,66.75961],[33.18444,66.63253],[34.81477,65.90015],[34.878574,65.436213],[34.94391,64.41437],[36.23129,64.10945],[37.01273,63.84983],[37.14197,64.33471],[36.539579,64.76446],[37.17604,65.14322],[39.59345,64.52079],[40.4356,64.76446],[39.7626,65.49682],[42.09309,66.47623],[43.01604,66.41858],[43.94975,66.06908],[44.53226,66.75634],[43.69839,67.35245],[44.18795,67.95051],[43.45282,68.57079],[46.25,68.25],[46.82134,67.68997],[45.55517,67.56652],[45.56202,67.01005],[46.34915,66.66767],[47.89416,66.88455],[48.13876,67.52238],[50.22766,67.99867],[53.71743,68.85738],[54.47171,68.80815],[53.48582,68.20131],[54.72628,68.09702],[55.44268,68.43866],[57.31702,68.46628],[58.802,68.88082],[59.94142,68.27844],[61.07784,68.94069],[60.03,69.52],[60.55,69.85],[63.504,69.54739],[64.888115,69.234835],[68.51216,68.09233],[69.18068,68.61563],[68.16444,69.14436],[68.13522,69.35649],[66.93008,69.45461],[67.25976,69.92873],[66.72492,70.70889],[66.69466,71.02897],[68.54006,71.9345],[69.19636,72.84336],[69.94,73.04],[72.58754,72.77629],[72.79603,72.22006],[71.84811,71.40898],[72.47011,71.09019],[72.79188,70.39114],[72.5647,69.02085],[73.66787,68.4079],[73.2387,67.7404],[71.28,66.32],[72.42301,66.17267],[72.82077,66.53267],[73.92099,66.78946],[74.18651,67.28429],[75.052,67.76047],[74.46926,68.32899],[74.93584,68.98918],[73.84236,69.07146],[73.60187,69.62763],[74.3998,70.63175],[73.1011,71.44717],[74.89082,72.12119],[74.65926,72.83227],[75.15801,72.85497],[75.68351,72.30056],[75.28898,71.33556],[76.35911,71.15287],[75.90313,71.87401],[77.57665,72.26717],[79.65202,72.32011],[81.5,71.75],[80.61071,72.58285],[80.51109,73.6482],[82.25,73.85],[84.65526,73.80591],[86.8223,73.93688],[86.00956,74.45967],[87.16682,75.11643],[88.31571,75.14393],[90.26,75.64],[92.90058,75.77333],[93.23421,76.0472],[95.86,76.14],[96.67821,75.91548],[98.92254,76.44689],[100.75967,76.43028],[101.03532,76.86189],[101.99084,77.28754],[104.3516,77.69792],[106.06664,77.37389],[104.705,77.1274],[106.97013,76.97419]]],[[[105.07547,78.30689],[99.43814,77.921],[101.2649,79.23399],[102.08635,79.34641],[102.837815,79.28129],[105.37243,78.71334],[105.07547,78.30689]]],[[[51.136187,80.54728],[49.793685,80.415428],[48.894411,80.339567],[48.754937,80.175468],[47.586119,80.010181],[46.502826,80.247247],[47.072455,80.559424],[44.846958,80.58981],[46.799139,80.771918],[48.318477,80.78401],[48.522806,80.514569],[49.09719,80.753986],[50.039768,80.918885],[51.522933,80.699726],[51.136187,80.54728]]],[[[99.93976,78.88094],[97.75794,78.7562],[94.97259,79.044745],[93.31288,79.4265],[92.5454,80.14379],[91.18107,80.34146],[93.77766,81.0246],[95.940895,81.2504],[97.88385,80.746975],[100.186655,79.780135],[99.93976,78.88094]]]]}}, +{"type":"Feature","id":"RWA","properties":{"name":"Rwanda"},"geometry":{"type":"Polygon","coordinates":[[[30.419105,-1.134659],[30.816135,-1.698914],[30.758309,-2.28725],[30.469696,-2.413858],[29.938359,-2.348487],[29.632176,-2.917858],[29.024926,-2.839258],[29.117479,-2.292211],[29.254835,-2.21511],[29.291887,-1.620056],[29.579466,-1.341313],[29.821519,-1.443322],[30.419105,-1.134659]]]}}, +{"type":"Feature","id":"ESH","properties":{"name":"Western Sahara"},"geometry":{"type":"Polygon","coordinates":[[[-8.794884,27.120696],[-8.817828,27.656426],[-8.66559,27.656426],[-8.665124,27.589479],[-8.6844,27.395744],[-8.687294,25.881056],[-11.969419,25.933353],[-11.937224,23.374594],[-12.874222,23.284832],[-13.118754,22.77122],[-12.929102,21.327071],[-16.845194,21.333323],[-17.063423,20.999752],[-17.020428,21.42231],[-17.002962,21.420734],[-14.750955,21.5006],[-14.630833,21.86094],[-14.221168,22.310163],[-13.89111,23.691009],[-12.500963,24.770116],[-12.030759,26.030866],[-11.71822,26.104092],[-11.392555,26.883424],[-10.551263,26.990808],[-10.189424,26.860945],[-9.735343,26.860945],[-9.413037,27.088476],[-8.794884,27.120696]]]}}, +{"type":"Feature","id":"SAU","properties":{"name":"Saudi Arabia"},"geometry":{"type":"Polygon","coordinates":[[[42.779332,16.347891],[42.649573,16.774635],[42.347989,17.075806],[42.270888,17.474722],[41.754382,17.833046],[41.221391,18.6716],[40.939341,19.486485],[40.247652,20.174635],[39.801685,20.338862],[39.139399,21.291905],[39.023696,21.986875],[39.066329,22.579656],[38.492772,23.688451],[38.02386,24.078686],[37.483635,24.285495],[37.154818,24.858483],[37.209491,25.084542],[36.931627,25.602959],[36.639604,25.826228],[36.249137,26.570136],[35.640182,27.37652],[35.130187,28.063352],[34.632336,28.058546],[34.787779,28.607427],[34.83222,28.957483],[34.956037,29.356555],[36.068941,29.197495],[36.501214,29.505254],[36.740528,29.865283],[37.503582,30.003776],[37.66812,30.338665],[37.998849,30.5085],[37.002166,31.508413],[39.004886,32.010217],[39.195468,32.161009],[40.399994,31.889992],[41.889981,31.190009],[44.709499,29.178891],[46.568713,29.099025],[47.459822,29.002519],[47.708851,28.526063],[48.416094,28.552004],[48.807595,27.689628],[49.299554,27.461218],[49.470914,27.109999],[50.152422,26.689663],[50.212935,26.277027],[50.113303,25.943972],[50.239859,25.60805],[50.527387,25.327808],[50.660557,24.999896],[50.810108,24.754743],[51.112415,24.556331],[51.389608,24.627386],[51.579519,24.245497],[51.617708,24.014219],[52.000733,23.001154],[55.006803,22.496948],[55.208341,22.70833],[55.666659,22.000001],[54.999982,19.999994],[52.00001,19.000003],[49.116672,18.616668],[48.183344,18.166669],[47.466695,17.116682],[47.000005,16.949999],[46.749994,17.283338],[46.366659,17.233315],[45.399999,17.333335],[45.216651,17.433329],[44.062613,17.410359],[43.791519,17.319977],[43.380794,17.579987],[43.115798,17.08844],[43.218375,16.66689],[42.779332,16.347891]]]}}, +{"type":"Feature","id":"SDN","properties":{"name":"Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.824963,9.484061],[33.842131,9.981915],[33.721959,10.325262],[33.206938,10.720112],[33.086766,11.441141],[33.206938,12.179338],[32.743419,12.248008],[32.67475,12.024832],[32.073892,11.97333],[32.314235,11.681484],[32.400072,11.080626],[31.850716,10.531271],[31.352862,9.810241],[30.837841,9.707237],[29.996639,10.290927],[29.618957,10.084919],[29.515953,9.793074],[29.000932,9.604232],[28.966597,9.398224],[27.97089,9.398224],[27.833551,9.604232],[27.112521,9.638567],[26.752006,9.466893],[26.477328,9.55273],[25.962307,10.136421],[25.790633,10.411099],[25.069604,10.27376],[24.794926,9.810241],[24.537415,8.917538],[24.194068,8.728696],[23.88698,8.61973],[23.805813,8.666319],[23.459013,8.954286],[23.394779,9.265068],[23.55725,9.681218],[23.554304,10.089255],[22.977544,10.714463],[22.864165,11.142395],[22.87622,11.38461],[22.50869,11.67936],[22.49762,12.26024],[22.28801,12.64605],[21.93681,12.58818],[22.03759,12.95546],[22.29658,13.37232],[22.18329,13.78648],[22.51202,14.09318],[22.30351,14.32682],[22.56795,14.94429],[23.02459,15.68072],[23.88689,15.61084],[23.83766,19.58047],[23.85,20],[25,20.00304],[25,22],[29.02,22],[32.9,22],[36.86623,22],[37.18872,21.01885],[36.96941,20.83744],[37.1147,19.80796],[37.48179,18.61409],[37.86276,18.36786],[38.41009,17.998307],[37.904,17.42754],[37.16747,17.26314],[36.85253,16.95655],[36.75389,16.29186],[36.32322,14.82249],[36.42951,14.42211],[36.27022,13.56333],[35.86363,12.57828],[35.26049,12.08286],[34.83163,11.31896],[34.73115,10.91017],[34.25745,10.63009],[33.96162,9.58358],[33.963393,9.464285]]]}}, +{"type":"Feature","id":"SDS","properties":{"name":"South Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.97498,8.68456],[33.8255,8.37916],[33.2948,8.35458],[32.95418,7.78497],[33.56829,7.71334],[34.0751,7.22595],[34.25032,6.82607],[34.70702,6.59422],[35.298007,5.506],[34.620196,4.847123],[34.005,4.249885],[33.39,3.79],[32.68642,3.79232],[31.88145,3.55827],[31.24556,3.7819],[30.83385,3.50917],[29.95349,4.1737],[29.715995,4.600805],[29.159078,4.389267],[28.696678,4.455077],[28.428994,4.287155],[27.979977,4.408413],[27.374226,5.233944],[27.213409,5.550953],[26.465909,5.946717],[26.213418,6.546603],[25.796648,6.979316],[25.124131,7.500085],[25.114932,7.825104],[24.567369,8.229188],[23.88698,8.61973],[24.194068,8.728696],[24.537415,8.917538],[24.794926,9.810241],[25.069604,10.27376],[25.790633,10.411099],[25.962307,10.136421],[26.477328,9.55273],[26.752006,9.466893],[27.112521,9.638567],[27.833551,9.604232],[27.97089,9.398224],[28.966597,9.398224],[29.000932,9.604232],[29.515953,9.793074],[29.618957,10.084919],[29.996639,10.290927],[30.837841,9.707237],[31.352862,9.810241],[31.850716,10.531271],[32.400072,11.080626],[32.314235,11.681484],[32.073892,11.97333],[32.67475,12.024832],[32.743419,12.248008],[33.206938,12.179338],[33.086766,11.441141],[33.206938,10.720112],[33.721959,10.325262],[33.842131,9.981915],[33.824963,9.484061],[33.963393,9.464285]]]}}, +{"type":"Feature","id":"SEN","properties":{"name":"Senegal"},"geometry":{"type":"Polygon","coordinates":[[[-16.713729,13.594959],[-17.126107,14.373516],[-17.625043,14.729541],[-17.185173,14.919477],[-16.700706,15.621527],[-16.463098,16.135036],[-16.12069,16.455663],[-15.623666,16.369337],[-15.135737,16.587282],[-14.577348,16.598264],[-14.099521,16.304302],[-13.435738,16.039383],[-12.830658,15.303692],[-12.17075,14.616834],[-12.124887,13.994727],[-11.927716,13.422075],[-11.553398,13.141214],[-11.467899,12.754519],[-11.513943,12.442988],[-11.658301,12.386583],[-12.203565,12.465648],[-12.278599,12.35444],[-12.499051,12.33209],[-13.217818,12.575874],[-13.700476,12.586183],[-15.548477,12.62817],[-15.816574,12.515567],[-16.147717,12.547762],[-16.677452,12.384852],[-16.841525,13.151394],[-15.931296,13.130284],[-15.691001,13.270353],[-15.511813,13.27857],[-15.141163,13.509512],[-14.712197,13.298207],[-14.277702,13.280585],[-13.844963,13.505042],[-14.046992,13.794068],[-14.376714,13.62568],[-14.687031,13.630357],[-15.081735,13.876492],[-15.39877,13.860369],[-15.624596,13.623587],[-16.713729,13.594959]]]}}, +{"type":"Feature","id":"SLB","properties":{"name":"Solomon Islands"},"geometry":{"type":"MultiPolygon","coordinates":[[[[162.119025,-10.482719],[162.398646,-10.826367],[161.700032,-10.820011],[161.319797,-10.204751],[161.917383,-10.446701],[162.119025,-10.482719]]],[[[160.852229,-9.872937],[160.462588,-9.89521],[159.849447,-9.794027],[159.640003,-9.63998],[159.702945,-9.24295],[160.362956,-9.400304],[160.688518,-9.610162],[160.852229,-9.872937]]],[[[161.679982,-9.599982],[161.529397,-9.784312],[160.788253,-8.917543],[160.579997,-8.320009],[160.920028,-8.320009],[161.280006,-9.120011],[161.679982,-9.599982]]],[[[159.875027,-8.33732],[159.917402,-8.53829],[159.133677,-8.114181],[158.586114,-7.754824],[158.21115,-7.421872],[158.359978,-7.320018],[158.820001,-7.560003],[159.640003,-8.020027],[159.875027,-8.33732]]],[[[157.538426,-7.34782],[157.33942,-7.404767],[156.90203,-7.176874],[156.491358,-6.765943],[156.542828,-6.599338],[157.14,-7.021638],[157.538426,-7.34782]]]]}}, +{"type":"Feature","id":"SLE","properties":{"name":"Sierra Leone"},"geometry":{"type":"Polygon","coordinates":[[[-11.438779,6.785917],[-11.708195,6.860098],[-12.428099,7.262942],[-12.949049,7.798646],[-13.124025,8.163946],[-13.24655,8.903049],[-12.711958,9.342712],[-12.596719,9.620188],[-12.425929,9.835834],[-12.150338,9.858572],[-11.917277,10.046984],[-11.117481,10.045873],[-10.839152,9.688246],[-10.622395,9.26791],[-10.65477,8.977178],[-10.494315,8.715541],[-10.505477,8.348896],[-10.230094,8.406206],[-10.695595,7.939464],[-11.146704,7.396706],[-11.199802,7.105846],[-11.438779,6.785917]]]}}, +{"type":"Feature","id":"SLV","properties":{"name":"El Salvador"},"geometry":{"type":"Polygon","coordinates":[[[-87.793111,13.38448],[-87.904112,13.149017],[-88.483302,13.163951],[-88.843228,13.259734],[-89.256743,13.458533],[-89.812394,13.520622],[-90.095555,13.735338],[-90.064678,13.88197],[-89.721934,14.134228],[-89.534219,14.244816],[-89.587343,14.362586],[-89.353326,14.424133],[-89.058512,14.340029],[-88.843073,14.140507],[-88.541231,13.980155],[-88.503998,13.845486],[-88.065343,13.964626],[-87.859515,13.893312],[-87.723503,13.78505],[-87.793111,13.38448]]]}}, +{"type":"Feature","id":"-99","properties":{"name":"Somaliland"},"geometry":{"type":"Polygon","coordinates":[[[48.93813,9.451749],[48.486736,8.837626],[47.78942,8.003],[46.948328,7.996877],[43.67875,9.18358],[43.296975,9.540477],[42.92812,10.02194],[42.55876,10.57258],[42.776852,10.926879],[43.145305,11.46204],[43.47066,11.27771],[43.666668,10.864169],[44.117804,10.445538],[44.614259,10.442205],[45.556941,10.698029],[46.645401,10.816549],[47.525658,11.127228],[48.021596,11.193064],[48.378784,11.375482],[48.948206,11.410622],[48.942005,11.394266],[48.938491,10.982327],[48.938233,9.9735],[48.93813,9.451749]]]}}, +{"type":"Feature","id":"SOM","properties":{"name":"Somalia"},"geometry":{"type":"Polygon","coordinates":[[[49.72862,11.5789],[50.25878,11.67957],[50.73202,12.0219],[51.1112,12.02464],[51.13387,11.74815],[51.04153,11.16651],[51.04531,10.6409],[50.83418,10.27972],[50.55239,9.19874],[50.07092,8.08173],[49.4527,6.80466],[48.59455,5.33911],[47.74079,4.2194],[46.56476,2.85529],[45.56399,2.04576],[44.06815,1.05283],[43.13597,0.2922],[42.04157,-0.91916],[41.81095,-1.44647],[41.58513,-1.68325],[40.993,-0.85829],[40.98105,2.78452],[41.855083,3.918912],[42.12861,4.23413],[42.76967,4.25259],[43.66087,4.95755],[44.9636,5.00162],[47.78942,8.003],[48.486736,8.837626],[48.93813,9.451749],[48.938233,9.9735],[48.938491,10.982327],[48.942005,11.394266],[48.948205,11.410617],[49.26776,11.43033],[49.72862,11.5789]]]}}, +{"type":"Feature","id":"SRB","properties":{"name":"Republic of Serbia"},"geometry":{"type":"Polygon","coordinates":[[[20.874313,45.416375],[21.483526,45.18117],[21.562023,44.768947],[22.145088,44.478422],[22.459022,44.702517],[22.705726,44.578003],[22.474008,44.409228],[22.65715,44.234923],[22.410446,44.008063],[22.500157,43.642814],[22.986019,43.211161],[22.604801,42.898519],[22.436595,42.580321],[22.545012,42.461362],[22.380526,42.32026],[21.91708,42.30364],[21.576636,42.245224],[21.54332,42.32025],[21.66292,42.43922],[21.77505,42.6827],[21.63302,42.67717],[21.43866,42.86255],[21.27421,42.90959],[21.143395,43.068685],[20.95651,43.13094],[20.81448,43.27205],[20.63508,43.21671],[20.49679,42.88469],[20.25758,42.81275],[20.3398,42.89852],[19.95857,43.10604],[19.63,43.21378],[19.48389,43.35229],[19.21852,43.52384],[19.454,43.5681],[19.59976,44.03847],[19.11761,44.42307],[19.36803,44.863],[19.00548,44.86023],[19.390476,45.236516],[19.072769,45.521511],[18.82982,45.90888],[19.596045,46.17173],[20.220192,46.127469],[20.762175,45.734573],[20.874313,45.416375]]]}}, +{"type":"Feature","id":"SUR","properties":{"name":"Suriname"},"geometry":{"type":"Polygon","coordinates":[[[-57.147436,5.97315],[-55.949318,5.772878],[-55.84178,5.953125],[-55.03325,6.025291],[-53.958045,5.756548],[-54.478633,4.896756],[-54.399542,4.212611],[-54.006931,3.620038],[-54.181726,3.18978],[-54.269705,2.732392],[-54.524754,2.311849],[-55.097587,2.523748],[-55.569755,2.421506],[-55.973322,2.510364],[-56.073342,2.220795],[-55.9056,2.021996],[-55.995698,1.817667],[-56.539386,1.899523],[-57.150098,2.768927],[-57.281433,3.333492],[-57.601569,3.334655],[-58.044694,4.060864],[-57.86021,4.576801],[-57.914289,4.812626],[-57.307246,5.073567],[-57.147436,5.97315]]]}}, +{"type":"Feature","id":"SVK","properties":{"name":"Slovakia"},"geometry":{"type":"Polygon","coordinates":[[[18.853144,49.49623],[18.909575,49.435846],[19.320713,49.571574],[19.825023,49.217125],[20.415839,49.431453],[20.887955,49.328772],[21.607808,49.470107],[22.558138,49.085738],[22.280842,48.825392],[22.085608,48.422264],[21.872236,48.319971],[20.801294,48.623854],[20.473562,48.56285],[20.239054,48.327567],[19.769471,48.202691],[19.661364,48.266615],[19.174365,48.111379],[18.777025,48.081768],[18.696513,47.880954],[17.857133,47.758429],[17.488473,47.867466],[16.979667,48.123497],[16.879983,48.470013],[16.960288,48.596982],[17.101985,48.816969],[17.545007,48.800019],[17.886485,48.903475],[17.913512,48.996493],[18.104973,49.043983],[18.170498,49.271515],[18.399994,49.315001],[18.554971,49.495015],[18.853144,49.49623]]]}}, +{"type":"Feature","id":"SVN","properties":{"name":"Slovenia"},"geometry":{"type":"Polygon","coordinates":[[[13.806475,46.509306],[14.632472,46.431817],[15.137092,46.658703],[16.011664,46.683611],[16.202298,46.852386],[16.370505,46.841327],[16.564808,46.503751],[15.768733,46.238108],[15.67153,45.834154],[15.323954,45.731783],[15.327675,45.452316],[14.935244,45.471695],[14.595109,45.634941],[14.411968,45.466166],[13.71506,45.500324],[13.93763,45.591016],[13.69811,46.016778],[13.806475,46.509306]]]}}, +{"type":"Feature","id":"SWE","properties":{"name":"Sweden"},"geometry":{"type":"Polygon","coordinates":[[[22.183173,65.723741],[21.213517,65.026005],[21.369631,64.413588],[19.778876,63.609554],[17.847779,62.7494],[17.119555,61.341166],[17.831346,60.636583],[18.787722,60.081914],[17.869225,58.953766],[16.829185,58.719827],[16.44771,57.041118],[15.879786,56.104302],[14.666681,56.200885],[14.100721,55.407781],[12.942911,55.361737],[12.625101,56.30708],[11.787942,57.441817],[11.027369,58.856149],[11.468272,59.432393],[12.300366,60.117933],[12.631147,61.293572],[11.992064,61.800362],[11.930569,63.128318],[12.579935,64.066219],[13.571916,64.049114],[13.919905,64.445421],[13.55569,64.787028],[15.108411,66.193867],[16.108712,67.302456],[16.768879,68.013937],[17.729182,68.010552],[17.993868,68.567391],[19.87856,68.407194],[20.025269,69.065139],[20.645593,69.106247],[21.978535,68.616846],[23.539473,67.936009],[23.56588,66.396051],[23.903379,66.006927],[22.183173,65.723741]]]}}, +{"type":"Feature","id":"SWZ","properties":{"name":"Swaziland"},"geometry":{"type":"Polygon","coordinates":[[[32.071665,-26.73382],[31.86806,-27.177927],[31.282773,-27.285879],[30.685962,-26.743845],[30.676609,-26.398078],[30.949667,-26.022649],[31.04408,-25.731452],[31.333158,-25.660191],[31.837778,-25.843332],[31.985779,-26.29178],[32.071665,-26.73382]]]}}, +{"type":"Feature","id":"SYR","properties":{"name":"Syria"},"geometry":{"type":"Polygon","coordinates":[[[38.792341,33.378686],[36.834062,32.312938],[35.719918,32.709192],[35.700798,32.716014],[35.836397,32.868123],[35.821101,33.277426],[36.06646,33.824912],[36.61175,34.201789],[36.448194,34.593935],[35.998403,34.644914],[35.905023,35.410009],[36.149763,35.821535],[36.41755,36.040617],[36.685389,36.259699],[36.739494,36.81752],[37.066761,36.623036],[38.167727,36.90121],[38.699891,36.712927],[39.52258,36.716054],[40.673259,37.091276],[41.212089,37.074352],[42.349591,37.229873],[41.837064,36.605854],[41.289707,36.358815],[41.383965,35.628317],[41.006159,34.419372],[38.792341,33.378686]]]}}, +{"type":"Feature","id":"TCD","properties":{"name":"Chad"},"geometry":{"type":"Polygon","coordinates":[[[14.495787,12.859396],[14.595781,13.330427],[13.954477,13.353449],[13.956699,13.996691],[13.540394,14.367134],[13.97217,15.68437],[15.247731,16.627306],[15.300441,17.92795],[15.685741,19.95718],[15.903247,20.387619],[15.487148,20.730415],[15.47106,21.04845],[15.096888,21.308519],[14.8513,22.86295],[15.86085,23.40972],[19.84926,21.49509],[23.83766,19.58047],[23.88689,15.61084],[23.02459,15.68072],[22.56795,14.94429],[22.30351,14.32682],[22.51202,14.09318],[22.18329,13.78648],[22.29658,13.37232],[22.03759,12.95546],[21.93681,12.58818],[22.28801,12.64605],[22.49762,12.26024],[22.50869,11.67936],[22.87622,11.38461],[22.864165,11.142395],[22.231129,10.971889],[21.723822,10.567056],[21.000868,9.475985],[20.059685,9.012706],[19.094008,9.074847],[18.81201,8.982915],[18.911022,8.630895],[18.389555,8.281304],[17.96493,7.890914],[16.705988,7.508328],[16.456185,7.734774],[16.290562,7.754307],[16.106232,7.497088],[15.27946,7.421925],[15.436092,7.692812],[15.120866,8.38215],[14.979996,8.796104],[14.544467,8.965861],[13.954218,9.549495],[14.171466,10.021378],[14.627201,9.920919],[14.909354,9.992129],[15.467873,9.982337],[14.923565,10.891325],[14.960152,11.555574],[14.89336,12.21905],[14.495787,12.859396]]]}}, +{"type":"Feature","id":"TGO","properties":{"name":"Togo"},"geometry":{"type":"Polygon","coordinates":[[[1.865241,6.142158],[1.060122,5.928837],[0.836931,6.279979],[0.570384,6.914359],[0.490957,7.411744],[0.712029,8.312465],[0.461192,8.677223],[0.365901,9.465004],[0.36758,10.191213],[-0.049785,10.706918],[0.023803,11.018682],[0.899563,10.997339],[0.772336,10.470808],[1.077795,10.175607],[1.425061,9.825395],[1.463043,9.334624],[1.664478,9.12859],[1.618951,6.832038],[1.865241,6.142158]]]}}, +{"type":"Feature","id":"THA","properties":{"name":"Thailand"},"geometry":{"type":"Polygon","coordinates":[[[102.584932,12.186595],[101.687158,12.64574],[100.83181,12.627085],[100.978467,13.412722],[100.097797,13.406856],[100.018733,12.307001],[99.478921,10.846367],[99.153772,9.963061],[99.222399,9.239255],[99.873832,9.207862],[100.279647,8.295153],[100.459274,7.429573],[101.017328,6.856869],[101.623079,6.740622],[102.141187,6.221636],[101.814282,5.810808],[101.154219,5.691384],[101.075516,6.204867],[100.259596,6.642825],[100.085757,6.464489],[99.690691,6.848213],[99.519642,7.343454],[98.988253,7.907993],[98.503786,8.382305],[98.339662,7.794512],[98.150009,8.350007],[98.25915,8.973923],[98.553551,9.93296],[99.038121,10.960546],[99.587286,11.892763],[99.196354,12.804748],[99.212012,13.269294],[99.097755,13.827503],[98.430819,14.622028],[98.192074,15.123703],[98.537376,15.308497],[98.903348,16.177824],[98.493761,16.837836],[97.859123,17.567946],[97.375896,18.445438],[97.797783,18.62708],[98.253724,19.708203],[98.959676,19.752981],[99.543309,20.186598],[100.115988,20.41785],[100.548881,20.109238],[100.606294,19.508344],[101.282015,19.462585],[101.035931,18.408928],[101.059548,17.512497],[102.113592,18.109102],[102.413005,17.932782],[102.998706,17.961695],[103.200192,18.309632],[103.956477,18.240954],[104.716947,17.428859],[104.779321,16.441865],[105.589039,15.570316],[105.544338,14.723934],[105.218777,14.273212],[104.281418,14.416743],[102.988422,14.225721],[102.348099,13.394247],[102.584932,12.186595]]]}}, +{"type":"Feature","id":"TJK","properties":{"name":"Tajikistan"},"geometry":{"type":"Polygon","coordinates":[[[71.014198,40.244366],[70.648019,39.935754],[69.55961,40.103211],[69.464887,39.526683],[70.549162,39.604198],[71.784694,39.279463],[73.675379,39.431237],[73.928852,38.505815],[74.257514,38.606507],[74.864816,38.378846],[74.829986,37.990007],[74.980002,37.41999],[73.948696,37.421566],[73.260056,37.495257],[72.63689,37.047558],[72.193041,36.948288],[71.844638,36.738171],[71.448693,37.065645],[71.541918,37.905774],[71.239404,37.953265],[71.348131,38.258905],[70.806821,38.486282],[70.376304,38.138396],[70.270574,37.735165],[70.116578,37.588223],[69.518785,37.608997],[69.196273,37.151144],[68.859446,37.344336],[68.135562,37.023115],[67.83,37.144994],[68.392033,38.157025],[68.176025,38.901553],[67.44222,39.140144],[67.701429,39.580478],[68.536416,39.533453],[69.011633,40.086158],[69.329495,40.727824],[70.666622,40.960213],[70.45816,40.496495],[70.601407,40.218527],[71.014198,40.244366]]]}}, +{"type":"Feature","id":"TKM","properties":{"name":"Turkmenistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[61.123071,36.491597],[60.377638,36.527383],[59.234762,37.412988],[58.436154,37.522309],[57.330434,38.029229],[56.619366,38.121394],[56.180375,37.935127],[55.511578,37.964117],[54.800304,37.392421],[53.921598,37.198918],[53.735511,37.906136],[53.880929,38.952093],[53.101028,39.290574],[53.357808,39.975286],[52.693973,40.033629],[52.915251,40.876523],[53.858139,40.631034],[54.736845,40.951015],[54.008311,41.551211],[53.721713,42.123191],[52.91675,41.868117],[52.814689,41.135371],[52.50246,41.783316],[52.944293,42.116034],[54.079418,42.324109],[54.755345,42.043971],[55.455251,41.259859],[55.968191,41.308642],[57.096391,41.32231],[56.932215,41.826026],[57.78653,42.170553],[58.629011,42.751551],[59.976422,42.223082],[60.083341,41.425146],[60.465953,41.220327],[61.547179,41.26637],[61.882714,41.084857],[62.37426,40.053886],[63.518015,39.363257],[64.170223,38.892407],[65.215999,38.402695],[66.54615,37.974685],[66.518607,37.362784],[66.217385,37.39379],[65.745631,37.661164],[65.588948,37.305217],[64.746105,37.111818],[64.546479,36.312073],[63.982896,36.007957],[63.193538,35.857166],[62.984662,35.404041],[62.230651,35.270664],[61.210817,35.650072]]]}}, +{"type":"Feature","id":"TLS","properties":{"name":"East Timor"},"geometry":{"type":"Polygon","coordinates":[[[124.968682,-8.89279],[125.086246,-8.656887],[125.947072,-8.432095],[126.644704,-8.398247],[126.957243,-8.273345],[127.335928,-8.397317],[126.967992,-8.668256],[125.925885,-9.106007],[125.08852,-9.393173],[125.07002,-9.089987],[124.968682,-8.89279]]]}}, +{"type":"Feature","id":"TTO","properties":{"name":"Trinidad and Tobago"},"geometry":{"type":"Polygon","coordinates":[[[-61.68,10.76],[-61.105,10.89],[-60.895,10.855],[-60.935,10.11],[-61.77,10],[-61.95,10.09],[-61.66,10.365],[-61.68,10.76]]]}}, +{"type":"Feature","id":"TUN","properties":{"name":"Tunisia"},"geometry":{"type":"Polygon","coordinates":[[[9.48214,30.307556],[9.055603,32.102692],[8.439103,32.506285],[8.430473,32.748337],[7.612642,33.344115],[7.524482,34.097376],[8.140981,34.655146],[8.376368,35.479876],[8.217824,36.433177],[8.420964,36.946427],[9.509994,37.349994],[10.210002,37.230002],[10.18065,36.724038],[11.028867,37.092103],[11.100026,36.899996],[10.600005,36.41],[10.593287,35.947444],[10.939519,35.698984],[10.807847,34.833507],[10.149593,34.330773],[10.339659,33.785742],[10.856836,33.76874],[11.108501,33.293343],[11.488787,33.136996],[11.432253,32.368903],[10.94479,32.081815],[10.636901,31.761421],[9.950225,31.37607],[10.056575,30.961831],[9.970017,30.539325],[9.48214,30.307556]]]}}, +{"type":"Feature","id":"TUR","properties":{"name":"Turkey"},"geometry":{"type":"MultiPolygon","coordinates":[[[[36.913127,41.335358],[38.347665,40.948586],[39.512607,41.102763],[40.373433,41.013673],[41.554084,41.535656],[42.619549,41.583173],[43.582746,41.092143],[43.752658,40.740201],[43.656436,40.253564],[44.400009,40.005],[44.79399,39.713003],[44.109225,39.428136],[44.421403,38.281281],[44.225756,37.971584],[44.772699,37.170445],[44.293452,37.001514],[43.942259,37.256228],[42.779126,37.385264],[42.349591,37.229873],[41.212089,37.074352],[40.673259,37.091276],[39.52258,36.716054],[38.699891,36.712927],[38.167727,36.90121],[37.066761,36.623036],[36.739494,36.81752],[36.685389,36.259699],[36.41755,36.040617],[36.149763,35.821535],[35.782085,36.274995],[36.160822,36.650606],[35.550936,36.565443],[34.714553,36.795532],[34.026895,36.21996],[32.509158,36.107564],[31.699595,36.644275],[30.621625,36.677865],[30.391096,36.262981],[29.699976,36.144357],[28.732903,36.676831],[27.641187,36.658822],[27.048768,37.653361],[26.318218,38.208133],[26.8047,38.98576],[26.170785,39.463612],[27.28002,40.420014],[28.819978,40.460011],[29.240004,41.219991],[31.145934,41.087622],[32.347979,41.736264],[33.513283,42.01896],[35.167704,42.040225],[36.913127,41.335358]]],[[[27.192377,40.690566],[26.358009,40.151994],[26.043351,40.617754],[26.056942,40.824123],[26.294602,40.936261],[26.604196,41.562115],[26.117042,41.826905],[27.135739,42.141485],[27.99672,42.007359],[28.115525,41.622886],[28.988443,41.299934],[28.806438,41.054962],[27.619017,40.999823],[27.192377,40.690566]]]]}}, +{"type":"Feature","id":"TWN","properties":{"name":"Taiwan"},"geometry":{"type":"Polygon","coordinates":[[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]]]}}, +{"type":"Feature","id":"TZA","properties":{"name":"United Republic of Tanzania"},"geometry":{"type":"Polygon","coordinates":[[[33.903711,-0.95],[34.07262,-1.05982],[37.69869,-3.09699],[37.7669,-3.67712],[39.20222,-4.67677],[38.74054,-5.90895],[38.79977,-6.47566],[39.44,-6.84],[39.47,-7.1],[39.19469,-7.7039],[39.25203,-8.00781],[39.18652,-8.48551],[39.53574,-9.11237],[39.9496,-10.0984],[40.31659,-10.3171],[39.521,-10.89688],[38.427557,-11.285202],[37.82764,-11.26879],[37.47129,-11.56876],[36.775151,-11.594537],[36.514082,-11.720938],[35.312398,-11.439146],[34.559989,-11.52002],[34.28,-10.16],[33.940838,-9.693674],[33.73972,-9.41715],[32.759375,-9.230599],[32.191865,-8.930359],[31.556348,-8.762049],[31.157751,-8.594579],[30.74,-8.34],[30.2,-7.08],[29.62,-6.52],[29.419993,-5.939999],[29.519987,-5.419979],[29.339998,-4.499983],[29.753512,-4.452389],[30.11632,-4.09012],[30.50554,-3.56858],[30.75224,-3.35931],[30.74301,-3.03431],[30.52766,-2.80762],[30.46967,-2.41383],[30.758309,-2.28725],[30.816135,-1.698914],[30.419105,-1.134659],[30.76986,-1.01455],[31.86617,-1.02736],[33.903711,-0.95]]]}}, +{"type":"Feature","id":"UGA","properties":{"name":"Uganda"},"geometry":{"type":"Polygon","coordinates":[[[31.86617,-1.02736],[30.76986,-1.01455],[30.419105,-1.134659],[29.821519,-1.443322],[29.579466,-1.341313],[29.587838,-0.587406],[29.8195,-0.2053],[29.875779,0.59738],[30.086154,1.062313],[30.468508,1.583805],[30.85267,1.849396],[31.174149,2.204465],[30.77332,2.33989],[30.83385,3.50917],[31.24556,3.7819],[31.88145,3.55827],[32.68642,3.79232],[33.39,3.79],[34.005,4.249885],[34.47913,3.5556],[34.59607,3.05374],[35.03599,1.90584],[34.6721,1.17694],[34.18,0.515],[33.893569,0.109814],[33.903711,-0.95],[31.86617,-1.02736]]]}}, +{"type":"Feature","id":"UKR","properties":{"name":"Ukraine"},"geometry":{"type":"Polygon","coordinates":[[[31.785998,52.101678],[32.159412,52.061267],[32.412058,52.288695],[32.715761,52.238465],[33.7527,52.335075],[34.391731,51.768882],[34.141978,51.566413],[34.224816,51.255993],[35.022183,51.207572],[35.377924,50.773955],[35.356116,50.577197],[36.626168,50.225591],[37.39346,50.383953],[38.010631,49.915662],[38.594988,49.926462],[40.069058,49.601055],[40.080789,49.30743],[39.674664,48.783818],[39.895632,48.232405],[39.738278,47.898937],[38.770585,47.825608],[38.255112,47.5464],[38.223538,47.10219],[37.425137,47.022221],[36.759855,46.6987],[35.823685,46.645964],[34.962342,46.273197],[35.020788,45.651219],[35.510009,45.409993],[36.529998,45.46999],[36.334713,45.113216],[35.239999,44.939996],[33.882511,44.361479],[33.326421,44.564877],[33.546924,45.034771],[32.454174,45.327466],[32.630804,45.519186],[33.588162,45.851569],[33.298567,46.080598],[31.74414,46.333348],[31.675307,46.706245],[30.748749,46.5831],[30.377609,46.03241],[29.603289,45.293308],[29.149725,45.464925],[28.679779,45.304031],[28.233554,45.488283],[28.485269,45.596907],[28.659987,45.939987],[28.933717,46.25883],[28.862972,46.437889],[29.072107,46.517678],[29.170654,46.379262],[29.759972,46.349988],[30.024659,46.423937],[29.83821,46.525326],[29.908852,46.674361],[29.559674,46.928583],[29.415135,47.346645],[29.050868,47.510227],[29.122698,47.849095],[28.670891,48.118149],[28.259547,48.155562],[27.522537,48.467119],[26.857824,48.368211],[26.619337,48.220726],[26.19745,48.220881],[25.945941,47.987149],[25.207743,47.891056],[24.866317,47.737526],[24.402056,47.981878],[23.760958,47.985598],[23.142236,48.096341],[22.710531,47.882194],[22.64082,48.15024],[22.085608,48.422264],[22.280842,48.825392],[22.558138,49.085738],[22.776419,49.027395],[22.51845,49.476774],[23.426508,50.308506],[23.922757,50.424881],[24.029986,50.705407],[23.527071,51.578454],[24.005078,51.617444],[24.553106,51.888461],[25.327788,51.910656],[26.337959,51.832289],[27.454066,51.592303],[28.241615,51.572227],[28.617613,51.427714],[28.992835,51.602044],[29.254938,51.368234],[30.157364,51.416138],[30.555117,51.319503],[30.619454,51.822806],[30.927549,52.042353],[31.785998,52.101678]]]}}, +{"type":"Feature","id":"URY","properties":{"name":"Uruguay"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.976026,-30.109686],[-55.973245,-30.883076],[-55.60151,-30.853879],[-54.572452,-31.494511],[-53.787952,-32.047243],[-53.209589,-32.727666],[-53.650544,-33.202004],[-53.373662,-33.768378],[-53.806426,-34.396815],[-54.935866,-34.952647],[-55.67409,-34.752659],[-56.215297,-34.859836],[-57.139685,-34.430456],[-57.817861,-34.462547],[-58.427074,-33.909454],[-58.349611,-33.263189],[-58.132648,-33.040567],[-58.14244,-32.044504],[-57.874937,-31.016556],[-57.625133,-30.216295]]]}}, +{"type":"Feature","id":"USA","properties":{"name":"United States of America"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.54211,19.08348],[-155.68817,18.91619],[-155.93665,19.05939],[-155.90806,19.33888],[-156.07347,19.70294],[-156.02368,19.81422],[-155.85008,19.97729],[-155.91907,20.17395],[-155.86108,20.26721],[-155.78505,20.2487],[-155.40214,20.07975],[-155.22452,19.99302],[-155.06226,19.8591],[-154.80741,19.50871],[-154.83147,19.45328],[-155.22217,19.23972],[-155.54211,19.08348]]],[[[-156.07926,20.64397],[-156.41445,20.57241],[-156.58673,20.783],[-156.70167,20.8643],[-156.71055,20.92676],[-156.61258,21.01249],[-156.25711,20.91745],[-155.99566,20.76404],[-156.07926,20.64397]]],[[[-156.75824,21.17684],[-156.78933,21.06873],[-157.32521,21.09777],[-157.25027,21.21958],[-156.75824,21.17684]]],[[[-157.65283,21.32217],[-157.70703,21.26442],[-157.7786,21.27729],[-158.12667,21.31244],[-158.2538,21.53919],[-158.29265,21.57912],[-158.0252,21.71696],[-157.94161,21.65272],[-157.65283,21.32217]]],[[[-159.34512,21.982],[-159.46372,21.88299],[-159.80051,22.06533],[-159.74877,22.1382],[-159.5962,22.23618],[-159.36569,22.21494],[-159.34512,21.982]]],[[[-94.81758,49.38905],[-94.64,48.84],[-94.32914,48.67074],[-93.63087,48.60926],[-92.61,48.45],[-91.64,48.14],[-90.83,48.27],[-89.6,48.01],[-89.272917,48.019808],[-88.378114,48.302918],[-87.439793,47.94],[-86.461991,47.553338],[-85.652363,47.220219],[-84.87608,46.900083],[-84.779238,46.637102],[-84.543749,46.538684],[-84.6049,46.4396],[-84.3367,46.40877],[-84.14212,46.512226],[-84.091851,46.275419],[-83.890765,46.116927],[-83.616131,46.116927],[-83.469551,45.994686],[-83.592851,45.816894],[-82.550925,45.347517],[-82.337763,44.44],[-82.137642,43.571088],[-82.43,42.98],[-82.9,42.43],[-83.12,42.08],[-83.142,41.975681],[-83.02981,41.832796],[-82.690089,41.675105],[-82.439278,41.675105],[-81.277747,42.209026],[-80.247448,42.3662],[-78.939362,42.863611],[-78.92,42.965],[-79.01,43.27],[-79.171674,43.466339],[-78.72028,43.625089],[-77.737885,43.629056],[-76.820034,43.628784],[-76.5,44.018459],[-76.375,44.09631],[-75.31821,44.81645],[-74.867,45.00048],[-73.34783,45.00738],[-71.50506,45.0082],[-71.405,45.255],[-71.08482,45.30524],[-70.66,45.46],[-70.305,45.915],[-69.99997,46.69307],[-69.237216,47.447781],[-68.905,47.185],[-68.23444,47.35486],[-67.79046,47.06636],[-67.79134,45.70281],[-67.13741,45.13753],[-66.96466,44.8097],[-68.03252,44.3252],[-69.06,43.98],[-70.11617,43.68405],[-70.645476,43.090238],[-70.81489,42.8653],[-70.825,42.335],[-70.495,41.805],[-70.08,41.78],[-70.185,42.145],[-69.88497,41.92283],[-69.96503,41.63717],[-70.64,41.475],[-71.12039,41.49445],[-71.86,41.32],[-72.295,41.27],[-72.87643,41.22065],[-73.71,40.931102],[-72.24126,41.11948],[-71.945,40.93],[-73.345,40.63],[-73.982,40.628],[-73.952325,40.75075],[-74.25671,40.47351],[-73.96244,40.42763],[-74.17838,39.70926],[-74.90604,38.93954],[-74.98041,39.1964],[-75.20002,39.24845],[-75.52805,39.4985],[-75.32,38.96],[-75.071835,38.782032],[-75.05673,38.40412],[-75.37747,38.01551],[-75.94023,37.21689],[-76.03127,37.2566],[-75.72205,37.93705],[-76.23287,38.319215],[-76.35,39.15],[-76.542725,38.717615],[-76.32933,38.08326],[-76.989998,38.239992],[-76.30162,37.917945],[-76.25874,36.9664],[-75.9718,36.89726],[-75.86804,36.55125],[-75.72749,35.55074],[-76.36318,34.80854],[-77.397635,34.51201],[-78.05496,33.92547],[-78.55435,33.86133],[-79.06067,33.49395],[-79.20357,33.15839],[-80.301325,32.509355],[-80.86498,32.0333],[-81.33629,31.44049],[-81.49042,30.72999],[-81.31371,30.03552],[-80.98,29.18],[-80.535585,28.47213],[-80.53,28.04],[-80.056539,26.88],[-80.088015,26.205765],[-80.13156,25.816775],[-80.38103,25.20616],[-80.68,25.08],[-81.17213,25.20126],[-81.33,25.64],[-81.71,25.87],[-82.24,26.73],[-82.70515,27.49504],[-82.85526,27.88624],[-82.65,28.55],[-82.93,29.1],[-83.70959,29.93656],[-84.1,30.09],[-85.10882,29.63615],[-85.28784,29.68612],[-85.7731,30.15261],[-86.4,30.4],[-87.53036,30.27433],[-88.41782,30.3849],[-89.18049,30.31598],[-89.593831,30.159994],[-89.413735,29.89419],[-89.43,29.48864],[-89.21767,29.29108],[-89.40823,29.15961],[-89.77928,29.30714],[-90.15463,29.11743],[-90.880225,29.148535],[-91.626785,29.677],[-92.49906,29.5523],[-93.22637,29.78375],[-93.84842,29.71363],[-94.69,29.48],[-95.60026,28.73863],[-96.59404,28.30748],[-97.14,27.83],[-97.37,27.38],[-97.38,26.69],[-97.33,26.21],[-97.14,25.87],[-97.53,25.84],[-98.24,26.06],[-99.02,26.37],[-99.3,26.84],[-99.52,27.54],[-100.11,28.11],[-100.45584,28.69612],[-100.9576,29.38071],[-101.6624,29.7793],[-102.48,29.76],[-103.11,28.97],[-103.94,29.27],[-104.45697,29.57196],[-104.70575,30.12173],[-105.03737,30.64402],[-105.63159,31.08383],[-106.1429,31.39995],[-106.50759,31.75452],[-108.24,31.754854],[-108.24194,31.34222],[-109.035,31.34194],[-111.02361,31.33472],[-113.30498,32.03914],[-114.815,32.52528],[-114.72139,32.72083],[-115.99135,32.61239],[-117.12776,32.53534],[-117.295938,33.046225],[-117.944,33.621236],[-118.410602,33.740909],[-118.519895,34.027782],[-119.081,34.078],[-119.438841,34.348477],[-120.36778,34.44711],[-120.62286,34.60855],[-120.74433,35.15686],[-121.71457,36.16153],[-122.54747,37.55176],[-122.51201,37.78339],[-122.95319,38.11371],[-123.7272,38.95166],[-123.86517,39.76699],[-124.39807,40.3132],[-124.17886,41.14202],[-124.2137,41.99964],[-124.53284,42.76599],[-124.14214,43.70838],[-124.020535,44.615895],[-123.89893,45.52341],[-124.079635,46.86475],[-124.39567,47.72017],[-124.68721,48.184433],[-124.566101,48.379715],[-123.12,48.04],[-122.58736,47.096],[-122.34,47.36],[-122.5,48.18],[-122.84,49],[-120,49],[-117.03121,49],[-116.04818,49],[-113,49],[-110.05,49],[-107.05,49],[-104.04826,48.99986],[-100.65,49],[-97.22872,49.0007],[-95.15907,49],[-95.15609,49.38425],[-94.81758,49.38905]]],[[[-153.006314,57.115842],[-154.00509,56.734677],[-154.516403,56.992749],[-154.670993,57.461196],[-153.76278,57.816575],[-153.228729,57.968968],[-152.564791,57.901427],[-152.141147,57.591059],[-153.006314,57.115842]]],[[[-165.579164,59.909987],[-166.19277,59.754441],[-166.848337,59.941406],[-167.455277,60.213069],[-166.467792,60.38417],[-165.67443,60.293607],[-165.579164,59.909987]]],[[[-171.731657,63.782515],[-171.114434,63.592191],[-170.491112,63.694975],[-169.682505,63.431116],[-168.689439,63.297506],[-168.771941,63.188598],[-169.52944,62.976931],[-170.290556,63.194438],[-170.671386,63.375822],[-171.553063,63.317789],[-171.791111,63.405846],[-171.731657,63.782515]]],[[[-155.06779,71.147776],[-154.344165,70.696409],[-153.900006,70.889989],[-152.210006,70.829992],[-152.270002,70.600006],[-150.739992,70.430017],[-149.720003,70.53001],[-147.613362,70.214035],[-145.68999,70.12001],[-144.920011,69.989992],[-143.589446,70.152514],[-142.07251,69.851938],[-140.985988,69.711998],[-140.985988,69.711998],[-140.992499,66.000029],[-140.99777,60.306397],[-140.012998,60.276838],[-139.039,60.000007],[-138.34089,59.56211],[-137.4525,58.905],[-136.47972,59.46389],[-135.47583,59.78778],[-134.945,59.27056],[-134.27111,58.86111],[-133.355549,58.410285],[-132.73042,57.69289],[-131.70781,56.55212],[-130.00778,55.91583],[-129.979994,55.284998],[-130.53611,54.802753],[-131.085818,55.178906],[-131.967211,55.497776],[-132.250011,56.369996],[-133.539181,57.178887],[-134.078063,58.123068],[-135.038211,58.187715],[-136.628062,58.212209],[-137.800006,58.499995],[-139.867787,59.537762],[-140.825274,59.727517],[-142.574444,60.084447],[-143.958881,59.99918],[-145.925557,60.45861],[-147.114374,60.884656],[-148.224306,60.672989],[-148.018066,59.978329],[-148.570823,59.914173],[-149.727858,59.705658],[-150.608243,59.368211],[-151.716393,59.155821],[-151.859433,59.744984],[-151.409719,60.725803],[-150.346941,61.033588],[-150.621111,61.284425],[-151.895839,60.727198],[-152.57833,60.061657],[-154.019172,59.350279],[-153.287511,58.864728],[-154.232492,58.146374],[-155.307491,57.727795],[-156.308335,57.422774],[-156.556097,56.979985],[-158.117217,56.463608],[-158.433321,55.994154],[-159.603327,55.566686],[-160.28972,55.643581],[-161.223048,55.364735],[-162.237766,55.024187],[-163.069447,54.689737],[-164.785569,54.404173],[-164.942226,54.572225],[-163.84834,55.039431],[-162.870001,55.348043],[-161.804175,55.894986],[-160.563605,56.008055],[-160.07056,56.418055],[-158.684443,57.016675],[-158.461097,57.216921],[-157.72277,57.570001],[-157.550274,58.328326],[-157.041675,58.918885],[-158.194731,58.615802],[-158.517218,58.787781],[-159.058606,58.424186],[-159.711667,58.93139],[-159.981289,58.572549],[-160.355271,59.071123],[-161.355003,58.670838],[-161.968894,58.671665],[-162.054987,59.266925],[-161.874171,59.633621],[-162.518059,59.989724],[-163.818341,59.798056],[-164.662218,60.267484],[-165.346388,60.507496],[-165.350832,61.073895],[-166.121379,61.500019],[-165.734452,62.074997],[-164.919179,62.633076],[-164.562508,63.146378],[-163.753332,63.219449],[-163.067224,63.059459],[-162.260555,63.541936],[-161.53445,63.455817],[-160.772507,63.766108],[-160.958335,64.222799],[-161.518068,64.402788],[-160.777778,64.788604],[-161.391926,64.777235],[-162.45305,64.559445],[-162.757786,64.338605],[-163.546394,64.55916],[-164.96083,64.446945],[-166.425288,64.686672],[-166.845004,65.088896],[-168.11056,65.669997],[-166.705271,66.088318],[-164.47471,66.57666],[-163.652512,66.57666],[-163.788602,66.077207],[-161.677774,66.11612],[-162.489715,66.735565],[-163.719717,67.116395],[-164.430991,67.616338],[-165.390287,68.042772],[-166.764441,68.358877],[-166.204707,68.883031],[-164.430811,68.915535],[-163.168614,69.371115],[-162.930566,69.858062],[-161.908897,70.33333],[-160.934797,70.44769],[-159.039176,70.891642],[-158.119723,70.824721],[-156.580825,71.357764],[-155.06779,71.147776]]]]}}, +{"type":"Feature","id":"UZB","properties":{"name":"Uzbekistan"},"geometry":{"type":"Polygon","coordinates":[[[66.518607,37.362784],[66.54615,37.974685],[65.215999,38.402695],[64.170223,38.892407],[63.518015,39.363257],[62.37426,40.053886],[61.882714,41.084857],[61.547179,41.26637],[60.465953,41.220327],[60.083341,41.425146],[59.976422,42.223082],[58.629011,42.751551],[57.78653,42.170553],[56.932215,41.826026],[57.096391,41.32231],[55.968191,41.308642],[55.928917,44.995858],[58.503127,45.586804],[58.689989,45.500014],[60.239972,44.784037],[61.05832,44.405817],[62.0133,43.504477],[63.185787,43.650075],[64.900824,43.728081],[66.098012,42.99766],[66.023392,41.994646],[66.510649,41.987644],[66.714047,41.168444],[67.985856,41.135991],[68.259896,40.662325],[68.632483,40.668681],[69.070027,41.384244],[70.388965,42.081308],[70.962315,42.266154],[71.259248,42.167711],[70.420022,41.519998],[71.157859,41.143587],[71.870115,41.3929],[73.055417,40.866033],[71.774875,40.145844],[71.014198,40.244366],[70.601407,40.218527],[70.45816,40.496495],[70.666622,40.960213],[69.329495,40.727824],[69.011633,40.086158],[68.536416,39.533453],[67.701429,39.580478],[67.44222,39.140144],[68.176025,38.901553],[68.392033,38.157025],[67.83,37.144994],[67.075782,37.356144],[66.518607,37.362784]]]}}, +{"type":"Feature","id":"VEN","properties":{"name":"Venezuela"},"geometry":{"type":"Polygon","coordinates":[[[-71.331584,11.776284],[-71.360006,11.539994],[-71.94705,11.423282],[-71.620868,10.96946],[-71.633064,10.446494],[-72.074174,9.865651],[-71.695644,9.072263],[-71.264559,9.137195],[-71.039999,9.859993],[-71.350084,10.211935],[-71.400623,10.968969],[-70.155299,11.375482],[-70.293843,11.846822],[-69.943245,12.162307],[-69.5843,11.459611],[-68.882999,11.443385],[-68.233271,10.885744],[-68.194127,10.554653],[-67.296249,10.545868],[-66.227864,10.648627],[-65.655238,10.200799],[-64.890452,10.077215],[-64.329479,10.389599],[-64.318007,10.641418],[-63.079322,10.701724],[-61.880946,10.715625],[-62.730119,10.420269],[-62.388512,9.948204],[-61.588767,9.873067],[-60.830597,9.38134],[-60.671252,8.580174],[-60.150096,8.602757],[-59.758285,8.367035],[-60.550588,7.779603],[-60.637973,7.415],[-60.295668,7.043911],[-60.543999,6.856584],[-61.159336,6.696077],[-61.139415,6.234297],[-61.410303,5.959068],[-60.733574,5.200277],[-60.601179,4.918098],[-60.966893,4.536468],[-62.08543,4.162124],[-62.804533,4.006965],[-63.093198,3.770571],[-63.888343,4.02053],[-64.628659,4.148481],[-64.816064,4.056445],[-64.368494,3.79721],[-64.408828,3.126786],[-64.269999,2.497006],[-63.422867,2.411068],[-63.368788,2.2009],[-64.083085,1.916369],[-64.199306,1.492855],[-64.611012,1.328731],[-65.354713,1.095282],[-65.548267,0.789254],[-66.325765,0.724452],[-66.876326,1.253361],[-67.181294,2.250638],[-67.447092,2.600281],[-67.809938,2.820655],[-67.303173,3.318454],[-67.337564,3.542342],[-67.621836,3.839482],[-67.823012,4.503937],[-67.744697,5.221129],[-67.521532,5.55687],[-67.34144,6.095468],[-67.695087,6.267318],[-68.265052,6.153268],[-68.985319,6.206805],[-69.38948,6.099861],[-70.093313,6.960376],[-70.674234,7.087785],[-71.960176,6.991615],[-72.198352,7.340431],[-72.444487,7.423785],[-72.479679,7.632506],[-72.360901,8.002638],[-72.439862,8.405275],[-72.660495,8.625288],[-72.78873,9.085027],[-73.304952,9.152],[-73.027604,9.73677],[-72.905286,10.450344],[-72.614658,10.821975],[-72.227575,11.108702],[-71.973922,11.608672],[-71.331584,11.776284]]]}}, +{"type":"Feature","id":"VNM","properties":{"name":"Vietnam"},"geometry":{"type":"Polygon","coordinates":[[[108.05018,21.55238],[106.715068,20.696851],[105.881682,19.75205],[105.662006,19.058165],[106.426817,18.004121],[107.361954,16.697457],[108.269495,16.079742],[108.877107,15.276691],[109.33527,13.426028],[109.200136,11.666859],[108.36613,11.008321],[107.220929,10.364484],[106.405113,9.53084],[105.158264,8.59976],[104.795185,9.241038],[105.076202,9.918491],[104.334335,10.486544],[105.199915,10.88931],[106.24967,10.961812],[105.810524,11.567615],[107.491403,12.337206],[107.614548,13.535531],[107.382727,14.202441],[107.564525,15.202173],[107.312706,15.908538],[106.556008,16.604284],[105.925762,17.485315],[105.094598,18.666975],[103.896532,19.265181],[104.183388,19.624668],[104.822574,19.886642],[104.435,20.758733],[103.203861,20.766562],[102.754896,21.675137],[102.170436,22.464753],[102.706992,22.708795],[103.504515,22.703757],[104.476858,22.81915],[105.329209,23.352063],[105.811247,22.976892],[106.725403,22.794268],[106.567273,22.218205],[107.04342,21.811899],[108.05018,21.55238]]]}}, +{"type":"Feature","id":"VUT","properties":{"name":"Vanuatu"},"geometry":{"type":"MultiPolygon","coordinates":[[[[167.844877,-16.466333],[167.515181,-16.59785],[167.180008,-16.159995],[167.216801,-15.891846],[167.844877,-16.466333]]],[[[167.107712,-14.93392],[167.270028,-15.740021],[167.001207,-15.614602],[166.793158,-15.668811],[166.649859,-15.392704],[166.629137,-14.626497],[167.107712,-14.93392]]]]}}, +{"type":"Feature","id":"PSE","properties":{"name":"West Bank"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.545252,31.782505],[35.397561,31.489086],[34.927408,31.353435],[34.970507,31.616778],[35.225892,31.754341],[34.974641,31.866582],[35.18393,32.532511],[35.545665,32.393992]]]}}, +{"type":"Feature","id":"YEM","properties":{"name":"Yemen"},"geometry":{"type":"Polygon","coordinates":[[[53.108573,16.651051],[52.385206,16.382411],[52.191729,15.938433],[52.168165,15.59742],[51.172515,15.17525],[49.574576,14.708767],[48.679231,14.003202],[48.238947,13.94809],[47.938914,14.007233],[47.354454,13.59222],[46.717076,13.399699],[45.877593,13.347764],[45.62505,13.290946],[45.406459,13.026905],[45.144356,12.953938],[44.989533,12.699587],[44.494576,12.721653],[44.175113,12.58595],[43.482959,12.6368],[43.222871,13.22095],[43.251448,13.767584],[43.087944,14.06263],[42.892245,14.802249],[42.604873,15.213335],[42.805015,15.261963],[42.702438,15.718886],[42.823671,15.911742],[42.779332,16.347891],[43.218375,16.66689],[43.115798,17.08844],[43.380794,17.579987],[43.791519,17.319977],[44.062613,17.410359],[45.216651,17.433329],[45.399999,17.333335],[46.366659,17.233315],[46.749994,17.283338],[47.000005,16.949999],[47.466695,17.116682],[48.183344,18.166669],[49.116672,18.616668],[52.00001,19.000003],[52.782184,17.349742],[53.108573,16.651051]]]}}, +{"type":"Feature","id":"ZAF","properties":{"name":"South Africa"},"geometry":{"type":"Polygon","coordinates":[[[31.521001,-29.257387],[31.325561,-29.401978],[30.901763,-29.909957],[30.622813,-30.423776],[30.055716,-31.140269],[28.925553,-32.172041],[28.219756,-32.771953],[27.464608,-33.226964],[26.419452,-33.61495],[25.909664,-33.66704],[25.780628,-33.944646],[25.172862,-33.796851],[24.677853,-33.987176],[23.594043,-33.794474],[22.988189,-33.916431],[22.574157,-33.864083],[21.542799,-34.258839],[20.689053,-34.417175],[20.071261,-34.795137],[19.616405,-34.819166],[19.193278,-34.462599],[18.855315,-34.444306],[18.424643,-33.997873],[18.377411,-34.136521],[18.244499,-33.867752],[18.25008,-33.281431],[17.92519,-32.611291],[18.24791,-32.429131],[18.221762,-31.661633],[17.566918,-30.725721],[17.064416,-29.878641],[17.062918,-29.875954],[16.344977,-28.576705],[16.824017,-28.082162],[17.218929,-28.355943],[17.387497,-28.783514],[17.836152,-28.856378],[18.464899,-29.045462],[19.002127,-28.972443],[19.894734,-28.461105],[19.895768,-24.76779],[20.165726,-24.917962],[20.758609,-25.868136],[20.66647,-26.477453],[20.889609,-26.828543],[21.605896,-26.726534],[22.105969,-26.280256],[22.579532,-25.979448],[22.824271,-25.500459],[23.312097,-25.26869],[23.73357,-25.390129],[24.211267,-25.670216],[25.025171,-25.71967],[25.664666,-25.486816],[25.765849,-25.174845],[25.941652,-24.696373],[26.485753,-24.616327],[26.786407,-24.240691],[27.11941,-23.574323],[28.017236,-22.827754],[29.432188,-22.091313],[29.839037,-22.102216],[30.322883,-22.271612],[30.659865,-22.151567],[31.191409,-22.25151],[31.670398,-23.658969],[31.930589,-24.369417],[31.752408,-25.484284],[31.837778,-25.843332],[31.333158,-25.660191],[31.04408,-25.731452],[30.949667,-26.022649],[30.676609,-26.398078],[30.685962,-26.743845],[31.282773,-27.285879],[31.86806,-27.177927],[32.071665,-26.73382],[32.83012,-26.742192],[32.580265,-27.470158],[32.462133,-28.301011],[32.203389,-28.752405],[31.521001,-29.257387]],[[28.978263,-28.955597],[28.5417,-28.647502],[28.074338,-28.851469],[27.532511,-29.242711],[26.999262,-29.875954],[27.749397,-30.645106],[28.107205,-30.545732],[28.291069,-30.226217],[28.8484,-30.070051],[29.018415,-29.743766],[29.325166,-29.257387],[28.978263,-28.955597]]]}}, +{"type":"Feature","id":"ZMB","properties":{"name":"Zambia"},"geometry":{"type":"Polygon","coordinates":[[[32.759375,-9.230599],[33.231388,-9.676722],[33.485688,-10.525559],[33.31531,-10.79655],[33.114289,-11.607198],[33.306422,-12.435778],[32.991764,-12.783871],[32.688165,-13.712858],[33.214025,-13.97186],[30.179481,-14.796099],[30.274256,-15.507787],[29.516834,-15.644678],[28.947463,-16.043051],[28.825869,-16.389749],[28.467906,-16.4684],[27.598243,-17.290831],[27.044427,-17.938026],[26.706773,-17.961229],[26.381935,-17.846042],[25.264226,-17.73654],[25.084443,-17.661816],[25.07695,-17.578823],[24.682349,-17.353411],[24.033862,-17.295843],[23.215048,-17.523116],[22.562478,-16.898451],[21.887843,-16.08031],[21.933886,-12.898437],[24.016137,-12.911046],[23.930922,-12.565848],[24.079905,-12.191297],[23.904154,-11.722282],[24.017894,-11.237298],[23.912215,-10.926826],[24.257155,-10.951993],[24.314516,-11.262826],[24.78317,-11.238694],[25.418118,-11.330936],[25.75231,-11.784965],[26.553088,-11.92444],[27.16442,-11.608748],[27.388799,-12.132747],[28.155109,-12.272481],[28.523562,-12.698604],[28.934286,-13.248958],[29.699614,-13.257227],[29.616001,-12.178895],[29.341548,-12.360744],[28.642417,-11.971569],[28.372253,-11.793647],[28.49607,-10.789884],[28.673682,-9.605925],[28.449871,-9.164918],[28.734867,-8.526559],[29.002912,-8.407032],[30.346086,-8.238257],[30.740015,-8.340007],[31.157751,-8.594579],[31.556348,-8.762049],[32.191865,-8.930359],[32.759375,-9.230599]]]}}, +{"type":"Feature","id":"ZWE","properties":{"name":"Zimbabwe"},"geometry":{"type":"Polygon","coordinates":[[[31.191409,-22.25151],[30.659865,-22.151567],[30.322883,-22.271612],[29.839037,-22.102216],[29.432188,-22.091313],[28.794656,-21.639454],[28.02137,-21.485975],[27.727228,-20.851802],[27.724747,-20.499059],[27.296505,-20.39152],[26.164791,-19.293086],[25.850391,-18.714413],[25.649163,-18.536026],[25.264226,-17.73654],[26.381935,-17.846042],[26.706773,-17.961229],[27.044427,-17.938026],[27.598243,-17.290831],[28.467906,-16.4684],[28.825869,-16.389749],[28.947463,-16.043051],[29.516834,-15.644678],[30.274256,-15.507787],[30.338955,-15.880839],[31.173064,-15.860944],[31.636498,-16.07199],[31.852041,-16.319417],[32.328239,-16.392074],[32.847639,-16.713398],[32.849861,-17.979057],[32.654886,-18.67209],[32.611994,-19.419383],[32.772708,-19.715592],[32.659743,-20.30429],[32.508693,-20.395292],[32.244988,-21.116489],[31.191409,-22.25151]]]}} +]} diff --git a/float-no-zero/examples/data/gml/topp-states-wfs.xml b/float-no-zero/examples/data/gml/topp-states-wfs.xml new file mode 100644 index 0000000000..29edac4510 --- /dev/null +++ b/float-no-zero/examples/data/gml/topp-states-wfs.xml @@ -0,0 +1,2 @@ + +24.955967 -124.7314220000000149.371735 -66.96984936.986771000000005 -91.51612942.50936100000001 -87.50788937.51099000000001 -88.071564 37.476273000000006 -88.087883 37.442852 -88.311707 37.40930899999999 -88.359177 37.420292 -88.419853 37.400757 -88.467644 37.296852 -88.511322 37.257782000000006 -88.501427 37.205669 -88.450699 37.156909999999996 -88.422516 37.098670999999996 -88.45047 37.072143999999994 -88.476799 37.06818 -88.4907 37.064769999999996 -88.517273 37.072815000000006 -88.559273 37.109047000000004 -88.61422 37.13540999999999 -88.68837 37.141182 -88.739113 37.152107 -88.746506 37.202194000000006 -88.863289 37.218407 -88.932503 37.22003599999999 -88.993172 37.185860000000005 -89.065033 37.112137000000004 -89.116821 37.093185000000005 -89.146347 37.064235999999994 -89.169548 37.025711 -89.174332 36.99844 -89.150246 36.988113 -89.12986 36.986771000000005 -89.193512 37.02897299999999 -89.210052 37.041732999999994 -89.237679 37.087124 -89.264053 37.091244 -89.284233 37.085384000000005 -89.303291 37.060908999999995 -89.3097 37.027733 -89.264244 37.008686 -89.262001 36.999207 -89.282768 37.009682 -89.310982 37.049212999999995 -89.38295 37.09908299999999 -89.37999 37.137203 -89.423798 37.165318 -89.440521 37.224266 -89.468216 37.253731 -89.465309 37.256001 -89.489594 37.276402000000004 -89.513885 37.304962 -89.513885 37.329441 -89.50058 37.339409 -89.468742 37.355717 -89.435738 37.411018 -89.427574 37.453186 -89.453621 37.491726 -89.494781 37.571957 -89.524971 37.615928999999994 -89.513367 37.650375 -89.51918 37.67984 -89.513374 37.694798000000006 -89.521523 37.706103999999996 -89.581436 37.745453 -89.666458 37.78397 -89.675858 37.804794 -89.691055 37.840992 -89.728447 37.905063999999996 -89.851715 37.905486999999994 -89.861046 37.891875999999996 -89.866814 37.875904000000006 -89.900551 37.878044 -89.937874 37.911884 -89.978912 37.963634 -89.958229 37.969318 -90.010811 37.993206 -90.041924 38.032272000000006 -90.119339 38.05395100000001 -90.134712 38.08890500000001 -90.207527 38.122169000000014 -90.254059 38.16681700000001 -90.289635 38.18871300000001 -90.336716 38.23429899999999 -90.364769 38.32355899999999 -90.369347 38.36533 -90.358688 38.39084600000001 -90.339607 38.427357 -90.301842 38.518688 -90.265785 38.532768000000004 -90.26123 38.562805 -90.240944 38.61027100000001 -90.183708 38.658772 -90.183578 38.70036300000001 -90.20224 38.72396499999999 -90.196571 38.773098000000005 -90.163399 38.785484 -90.135178 38.80051 -90.121727 38.830467 -90.113121 38.85303099999999 -90.132812 38.91450900000001 -90.243927 38.92471699999999 -90.278931 38.92490799999999 -90.31974 38.96233000000001 -90.413071 38.959179000000006 -90.469841 38.89160899999999 -90.530426 38.87132600000001 -90.570328 38.880795000000006 -90.627213 38.93525299999999 -90.668877 39.037791999999996 -90.70607 39.058178 -90.707588 39.09370000000001 -90.690399 39.14421100000001 -90.716736 39.195873000000006 -90.718193 39.22474700000001 -90.732338 39.24780999999999 -90.738083 39.29680300000001 -90.779343 39.35045199999999 -90.850494 39.40058500000001 -90.947891 39.444412 -91.036339 39.473984 -91.064384 39.52892700000001 -91.093613 39.552593 -91.156189 39.600021 -91.203247 39.68591699999999 -91.317665 39.724639999999994 -91.367088 39.76127199999999 -91.373421 39.80377200000001 -91.381714 39.86304899999999 -91.449188 39.885242000000005 -91.450989 39.90182899999999 -91.434052 39.92183700000001 -91.430389 39.94606400000001 -91.447243 40.005753 -91.487289 40.066711 -91.504005 40.134544000000005 -91.516129 40.200458999999995 -91.506546 40.25137699999999 -91.498932 40.309624000000014 -91.486694 40.371902000000006 -91.448593 40.386875 -91.418816 40.392360999999994 -91.385757 40.40298799999999 -91.372757 40.44725 -91.385399 40.50365400000001 -91.374794 40.52849599999999 -91.382103 40.54799299999999 -91.412872 40.572970999999995 -91.411118 40.60343900000001 -91.37561 40.639545 -91.262062 40.64381800000001 -91.214912 40.65631099999999 -91.162498 40.68214800000001 -91.129158 40.70540199999999 -91.119987 40.76154700000001 -91.092751 40.833729000000005 -91.088905 40.87958499999999 -91.04921 40.92392699999999 -90.983276 40.950503999999995 -90.960709 41.07036199999999 -90.954651 41.10435899999999 -90.957787 41.14437100000001 -90.990341 41.16582500000001 -91.018257 41.17625799999999 -91.05632 41.23152200000001 -91.101524 41.267818000000005 -91.102348 41.334895999999986 -91.07328 41.40137899999999 -91.055786 41.423508 -91.027489 41.431084 -91.000694 41.421234 -90.949654 41.44462200000001 -90.844139 41.449820999999986 -90.7799 41.450062 -90.708214 41.46231800000001 -90.658791 41.50958600000001 -90.6007 41.52597 -90.54084 41.527546 -90.454994 41.543578999999994 -90.434967 41.567272 -90.423004 41.586849 -90.348366 41.60279800000001 -90.339348 41.64909 -90.341133 41.722736 -90.326027 41.75646599999999 -90.304886 41.78173799999999 -90.25531 41.80613700000001 -90.195839 41.93077500000001 -90.154518 41.98396299999999 -90.14267 42.03342799999999 -90.150536 42.06104300000001 -90.168098 42.103745 -90.166649 42.12050199999999 -90.176086 42.12268800000001 -90.191574 42.15972099999999 -90.230934 42.19731899999999 -90.323601 42.21020899999999 -90.367729 42.24264500000001 -90.407173 42.263924 -90.417984 42.340633 -90.427681 42.360073 -90.441597 42.38878299999999 -90.491043 42.42183700000001 -90.563583 42.46055999999999 -90.605827 42.47564299999999 -90.648346 42.494698 -90.651772 42.50936100000001 -90.638329 42.508362000000005 -90.419975 42.504108 -89.923569 42.50345999999999 -89.834618 42.49749 -89.400497 42.497906 -89.359444 42.49086399999999 -88.939079 42.490905999999995 -88.764954 42.489655 -88.70652 42.49197000000001 -88.297897 42.48961299999999 -88.194702 42.48913200000001 -87.79731 42.314212999999995 -87.836945 42.15645599999999 -87.760239 42.059822 -87.670547 41.847331999999994 -87.612625 41.723591 -87.529861 41.46971500000001 -87.532646 41.30130399999999 -87.532448 41.173756 -87.531731 41.00993 -87.532021 40.74541099999999 -87.532669 40.494609999999994 -87.53717 40.48324600000001 -87.535675 40.16619499999999 -87.535339 39.887302000000005 -87.535774 39.609341 -87.535576 39.47744800000001 -87.538567 39.350525000000005 -87.540215 39.338268 -87.597664 39.30740399999999 -87.625237 39.297661000000005 -87.610619 39.281418 -87.615799 39.258162999999996 -87.606895 39.248752999999994 -87.584564 39.20846599999999 -87.588593 39.198128 -87.594208 39.196068 -87.607925 39.168507000000005 -87.644257 39.146679000000006 -87.670326 39.130652999999995 -87.659454 39.11346800000001 -87.662262 39.10394299999999 -87.631668 39.08897400000001 -87.630867 39.08460600000001 -87.612007 39.062434999999994 -87.58532 38.995743000000004 -87.581749 38.99408299999999 -87.591858 38.97707700000001 -87.547905 38.96370300000001 -87.53347 38.93191899999999 -87.530182 38.90486100000001 -87.5392 38.869811999999996 -87.559059 38.857890999999995 -87.550507 38.795559 -87.507889 38.77669900000001 -87.519028 38.769722 -87.508003 38.73663300000001 -87.508316 38.68597399999999 -87.543892 38.672169 -87.588478 38.642810999999995 -87.625191 38.622917 -87.628647 38.599209 -87.619827 38.593177999999995 -87.640594 38.573871999999994 -87.652855 38.54742400000001 -87.672943 38.51536899999999 -87.65139 38.50044299999999 -87.653534 38.50400500000001 -87.679909 38.48153300000001 -87.692818 38.466125000000005 -87.756096 38.45709600000001 -87.758659 38.44548 -87.738953 38.41796500000001 -87.748428 38.378124000000014 -87.784019 38.35252399999999 -87.834503 38.28609800000001 -87.850082 38.28536199999999 -87.863007 38.316788 -87.874039 38.315552 -87.883446 38.300658999999996 -87.888466 38.281048 -87.914108 38.302345 -87.913651 38.30477099999999 -87.925919 38.241085 -87.980019 38.234814 -87.986008 38.200714000000005 -87.977928 38.171131 -87.932289 38.15752800000001 -87.931992 38.13691299999999 -87.950569 38.131760000000014 -87.973503 38.10330200000001 -88.018547 38.09234599999999 -88.012329 38.09674799999999 -87.964867 38.073307 -87.975296 38.054084999999986 -88.034729 38.04512 -88.043091 38.03830300000001 -88.041473 38.03353100000001 -88.021698 38.00823600000001 -88.029213 37.975055999999995 -88.021706 37.956264000000004 -88.042511 37.934498000000005 -88.041771 37.929783 -88.064621 37.944 -88.078941 37.92366 -88.084 37.917591 -88.030441 37.905758000000006 -88.026588 37.896004000000005 -88.044868 37.90617 -88.100082 37.895306000000005 -88.101456 37.867808999999994 -88.075737 37.843745999999996 -88.034241 37.827522 -88.042137 37.831249 -88.089264 37.817612 -88.086029 37.805683 -88.035576 37.735400999999996 -88.072472 37.700745 -88.133636 37.660686 -88.15937 37.628479 -88.157631 37.583572000000004 -88.134171 37.51099000000001 -88.071564Illinois17E N CenIL143986.611993.3351.1430602E72924880.04202240.05552233.05878369.04199206.03741715.0652603.0538071.05417967.0385040.01360159.0828906.00.4860.5141747776.038.78811999999999 -77.12262738.99343099999999 -76.91120938.966556999999995 -77.008232 38.88998799999999 -76.911209 38.78811999999999 -77.045448 38.81391500000001 -77.035248 38.829364999999996 -77.045189 38.838413 -77.040405 38.86243099999999 -77.039078 38.886101 -77.067886 38.91560000000001 -77.078949 38.93206000000001 -77.122627 38.99343099999999 -77.042389 38.966556999999995 -77.008232District of Columbia11S AtlDC159.05517.991606900.0122087.0249634.0282970.0323930.0229975.0106694.036621.0111422.0303994.023442.065498.022407.00.4660.53472696.038.44949 -75.79143539.84000800000001 -75.04599838.55747600000001 -75.70742 38.649551 -75.71106 38.83017000000001 -75.724937 39.141548 -75.752922 39.24775299999999 -75.761658 39.295849000000004 -75.764664 39.38300699999999 -75.772697 39.72375500000001 -75.791435 39.72444200000001 -75.775269 39.77481800000001 -75.745934 39.820347 -75.695114 39.83819600000001 -75.644341 39.84000800000001 -75.583794 39.826435000000004 -75.470345 39.798869999999994 -75.42083 39.789658 -75.412117 39.778130000000004 -75.428009 39.763248000000004 -75.460754 39.74171799999999 -75.475128 39.71997099999999 -75.476334 39.71474499999999 -75.489639 39.61279300000001 -75.610725 39.566722999999996 -75.562996 39.46376799999999 -75.590187 39.36694 -75.515572 39.25763699999999 -75.402481 39.073036 -75.397728 39.01238599999999 -75.324852 38.945910999999995 -75.307899 38.808670000000006 -75.190941 38.799812 -75.083138 38.44949 -75.045998 38.449963 -75.068298 38.45045099999999 -75.093094 38.455208 -75.350204 38.463066 -75.69915 38.55747600000001 -75.70742Delaware10S AtlDE5062.4561385.022666168.0175867.0247497.0322968.0343200.0247566.0258087.042968.08069.0335147.013945.087973.044140.00.4850.515102776.037.204796 -82.64727840.63713799999999 -77.72775338.480372999999986 -79.231903 38.437183000000005 -79.272598 38.41251 -79.317238 38.46202500000001 -79.48658 38.553687999999994 -79.536743 38.592239000000006 -79.642632 38.55006 -79.669655 38.52065999999999 -79.66584 38.500237 -79.692879 38.43011899999999 -79.684319 38.394566 -79.720261 38.351719 -79.733055 38.35387 -79.764229 38.31420499999999 -79.800552 38.29874799999999 -79.803001 38.28499600000001 -79.786736 38.268542999999994 -79.793846 38.250156000000004 -79.831375 38.17914200000001 -79.916382 38.16248300000001 -79.910561 38.121185 -79.935547 38.10318799999999 -79.928513 38.06724199999999 -79.957733 38.038498000000004 -79.966713 37.989746 -80.000717 37.955524 -80.055023 37.914536 -80.106705 37.891155 -80.118721 37.877106 -80.160217 37.860062 -80.172432 37.842845999999994 -80.171806 37.80224200000001 -80.223946 37.778735999999995 -80.220757 37.757110999999995 -80.254898 37.725928999999994 -80.250244 37.682548999999995 -80.303322 37.671379 -80.295914 37.652122000000006 -80.305077 37.640423 -80.301147 37.640579 -80.254639 37.624142000000006 -80.219147 37.596771000000004 -80.246613 37.566593 -80.31694 37.533276 -80.326126 37.528244 -80.308525 37.53613300000001 -80.280952 37.511024000000006 -80.288139 37.491051 -80.347733 37.475975000000005 -80.352379 37.465599 -80.388527 37.43478 -80.425598 37.422695000000004 -80.474983 37.433735 -80.487015 37.460471999999996 -80.488098 37.47492200000001 -80.50898 37.469086000000004 -80.542969 37.445930000000004 -80.597702 37.388256 -80.705414 37.392596999999995 -80.729942 37.387615 -80.746529 37.378960000000006 -80.747894 37.371292 -80.763199 37.386073999999994 -80.770226 37.391632 -80.799446 37.412941000000004 -80.799812 37.423339999999996 -80.850723 37.388577 -80.877556 37.350821999999994 -80.848618 37.339291 -80.855629 37.301249999999996 -80.93438 37.291672000000005 -80.968086 37.296356 -80.978729 37.306122 -80.98613 37.285942000000006 -81.025124 37.274806999999996 -81.140923 37.240097000000006 -81.223114 37.293591000000006 -81.31205 37.338837 -81.358971 37.311038999999994 -81.391121 37.282509000000005 -81.403519 37.254307 -81.475533 37.252735 -81.495705 37.234257 -81.505707 37.206238 -81.556824 37.204796 -81.666054 37.235321 -81.701897 37.250378 -81.738625 37.272144 -81.752022 37.287041 -81.792824 37.279427 -81.815544 37.285393 -81.83905 37.30691899999999 -81.858841 37.325344 -81.863976 37.34047700000001 -81.897316 37.371616 -81.926979 37.41540500000001 -81.920891 37.466476 -81.988358 37.48279599999999 -81.976578 37.492915999999994 -81.948151 37.506535 -81.935608 37.531063 -81.959732 37.543144 -81.97673 37.530411 -82.026505 37.551345999999995 -82.049286 37.525234 -82.055817 37.548203 -82.084541 37.557345999999995 -82.142654 37.565815 -82.146667 37.56979 -82.137619 37.590430999999995 -82.131927 37.593464 -82.159454 37.640564 -82.185692 37.623913 -82.205582 37.656673 -82.23851 37.668957000000006 -82.295761 37.744072 -82.329536 37.758326999999994 -82.319633 37.784302 -82.339981 37.811623 -82.405937 37.872260999999995 -82.421638 37.894760000000005 -82.437737 37.922169 -82.500336 37.942420999999996 -82.493523 37.95430399999999 -82.480301 37.975815 -82.475906 38.01557199999999 -82.524803 38.10987499999999 -82.59333 38.146243999999996 -82.646248 38.16935000000001 -82.647278 38.178009 -82.613884 38.19374099999999 -82.606766 38.23872800000001 -82.616348 38.245304000000004 -82.589233 38.255889999999994 -82.574699 38.292427 -82.58017 38.307728 -82.572418 38.368382 -82.598358 38.41243700000001 -82.586723 38.403819999999996 -82.575539 38.400429 -82.547668 38.40575000000001 -82.49511 38.430308999999994 -82.415016 38.42838699999999 -82.39489 38.441868 -82.329308 38.46514500000001 -82.314369 38.57999799999999 -82.2901 38.594807 -82.271027 38.58475100000001 -82.213791 38.59494799999999 -82.18438 38.63210699999999 -82.17379 38.67781099999999 -82.18911 38.71021999999999 -82.184105 38.778858000000014 -82.216881 38.804539000000005 -82.197853 38.838707 -82.146233 38.89931899999999 -82.13945 38.95201499999999 -82.101341 38.97711899999999 -82.085152 38.98898700000001 -82.05864 39.014061 -82.043022 39.01518200000001 -81.999817 38.992928000000006 -81.975327 38.991096 -81.937874 38.98419200000001 -81.927971 38.932143999999994 -81.89875 38.89466100000001 -81.931992 38.884365 -81.91539 38.87337099999999 -81.892838 38.885628 -81.866943 38.93780899999999 -81.841057 38.948387 -81.823921 38.92348100000001 -81.783371 38.93009900000001 -81.762444 38.96844899999999 -81.781876 39.01675 -81.775826 39.044028999999995 -81.813606 39.066338 -81.824417 39.07693900000001 -81.81971 39.077179 -81.786507 39.09464299999999 -81.753708 39.125797000000006 -81.74485 39.17567399999999 -81.759056 39.21319199999999 -81.723221 39.219944 -81.698051 39.26015100000001 -81.689674 39.27042 -81.667671 39.26584199999999 -81.572838 39.332581000000005 -81.557541 39.352633999999995 -81.540802 39.40678399999999 -81.465164 39.410954000000004 -81.448112 39.40594899999999 -81.434135 39.34561500000001 -81.376076 39.35356899999999 -81.338997 39.38699700000001 -81.28418 39.388397 -81.237785 39.40828300000001 -81.225113 39.415820999999994 -81.20047 39.437725 -81.180733 39.46770900000001 -81.117256 39.496376 -81.098412 39.532589 -81.037552 39.54406700000001 -81.032738 39.58172999999999 -80.983818 39.606865 -80.932785 39.60727700000001 -80.912766 39.62400400000001 -80.881287 39.66233399999999 -80.872925 39.680274999999995 -80.863594 39.70332300000001 -80.83297 39.71875800000001 -80.832481 39.73625899999999 -80.856636 39.759918 -80.870911 39.808926000000014 -80.81929 39.83959200000001 -80.826103 39.85664700000001 -80.798714 39.87227200000001 -80.791039 39.90482700000001 -80.812325 39.915829 -80.808029 39.91976500000001 -80.796211 39.913239000000004 -80.768318 39.92119199999999 -80.759079 39.94694100000001 -80.763252 39.98340200000001 -80.739082 40.03559100000001 -80.738434 40.15401800000001 -80.702263 40.16811000000001 -80.701088 40.194080000000014 -80.678757 40.245609 -80.650314 40.276432 -80.614891 40.306174999999996 -80.604721 40.37320700000001 -80.609451 40.38859600000001 -80.629448 40.39815899999999 -80.628052 40.48047299999999 -80.602036 40.50439800000001 -80.625458 40.539139000000006 -80.633644 40.56821400000001 -80.668823 40.58207300000001 -80.667931 40.61391800000001 -80.637543 40.61999900000001 -80.611755 40.615910000000014 -80.574623 40.63713799999999 -80.522209 40.478717999999986 -80.524567 40.40296599999999 -80.523773 40.16244900000001 -80.526253 40.022751 -80.525169 39.95834400000001 -80.524857 39.721126999999996 -80.524467 39.719761000000005 -80.429283 39.721588 -79.918488 39.72172900000001 -79.765358 39.72019599999999 -79.481209 39.19728900000001 -79.490089 39.21315799999999 -79.461418 39.21198699999999 -79.449509 39.269195999999994 -79.385078 39.291988 -79.346428 39.300438000000014 -79.295509 39.325142 -79.28006 39.34854100000001 -79.260406 39.39339799999999 -79.163261 39.41386399999999 -79.158371 39.416934999999995 -79.131645 39.44721200000001 -79.104324 39.46453500000001 -79.096962 39.47077899999999 -79.104843 39.47075699999999 -79.070877 39.48573300000001 -79.064659 39.483723 -79.049103 39.43843100000001 -78.970688 39.460364999999996 -78.955643 39.5257 -78.871071 39.56322900000001 -78.838371 39.566734 -78.806808 39.585609000000005 -78.82267 39.61533 -78.798729 39.63074499999999 -78.798409 39.644153999999986 -78.772964 39.62652600000001 -78.767876 39.62687700000001 -78.732643 39.621455999999995 -78.730759 39.60870399999999 -78.736511 39.601528 -78.774002 39.581703000000005 -78.761711 39.57655299999999 -78.732979 39.559483 -78.716576 39.536838999999986 -78.666687 39.53790699999999 -78.649406 39.52985799999999 -78.637344 39.53559100000001 -78.60463 39.520981000000006 -78.564453 39.52506600000001 -78.509048 39.519844000000006 -78.481544 39.533641999999986 -78.456078 39.548225 -78.446136 39.549316000000005 -78.421089 39.58074199999999 -78.462082 39.592613 -78.450897 39.58752100000001 -78.404266 39.62086099999999 -78.432159 39.61440300000001 -78.384903 39.631226 -78.377937 39.632278000000014 -78.357048 39.640499000000005 -78.34819 39.61831699999999 -78.273285 39.641075 -78.257996 39.65847400000001 -78.2295 39.67389700000001 -78.227867 39.67584600000001 -78.204575 39.69454999999999 -78.183243 39.67550700000001 -78.094612 39.622772 -78.026695 39.598873 -77.995483 39.61122900000001 -77.964516 39.585915 -77.945259 39.59184300000001 -77.935738 39.61491799999999 -77.947823 39.618122 -77.938889 39.59602699999999 -77.903534 39.600605 -77.891022 39.61647400000001 -77.888718 39.60207 -77.855804 39.605278 -77.84269 39.572643 -77.840149 39.565357000000006 -77.853241 39.56435400000001 -77.885452 39.557995000000005 -77.890198 39.545815000000005 -77.869843 39.51455300000001 -77.864914 39.531834 -77.844131 39.52551299999999 -77.835747 39.529156 -77.829208 39.51194000000001 -77.825546 39.50190699999999 -77.84816 39.493809 -77.82547 39.49801600000001 -77.771835 39.480728 -77.799782 39.459002999999996 -77.785393 39.46303900000001 -77.804474 39.450817 -77.796082 39.439919 -77.804977 39.43221700000001 -77.802559 39.42506399999999 -77.757271 39.40333899999999 -77.741119 39.396095 -77.737518 39.378376 -77.756508 39.36027100000001 -77.745735 39.338493 -77.754585 39.326717 -77.750374 39.31769600000001 -77.727753 39.28454199999999 -77.759743 39.24644900000001 -77.768517 39.19650300000001 -77.805733 39.14162099999999 -77.820328 39.13207600000001 -77.830963 39.265536999999995 -78.033607 39.39101400000001 -78.229782 39.42336700000001 -78.277153 39.456902000000014 -78.347816 39.38073 -78.350502 39.36158800000001 -78.365746 39.35085699999999 -78.3442 39.341358000000014 -78.341118 39.257439000000005 -78.413818 39.244850000000014 -78.399399 39.21204 -78.42334 39.19752500000001 -78.424339 39.17049 -78.402634 39.14852099999999 -78.43084 39.118931 -78.44825 39.111839 -78.485519 39.09357800000001 -78.501869 39.05702600000001 -78.536919 39.035037999999986 -78.564445 39.02338 -78.549469 39.01382799999999 -78.553474 38.967197 -78.598961 38.979603 -78.631111 38.95044300000001 -78.647232 38.92157399999999 -78.680489 38.90488099999999 -78.719246 38.93021400000001 -78.724403 38.92917299999999 -78.737991 38.911381000000006 -78.749512 38.88010800000001 -78.793312 38.83363299999999 -78.816116 38.76329000000001 -78.866814 38.84664900000001 -78.987701 38.799847 -79.033989 38.79051999999999 -79.055046 38.76194000000001 -79.056801 38.707153000000005 -79.087479 38.659088 -79.088791 38.66365099999999 -79.121307 38.65812700000001 -79.12767 38.480372999999986 -79.231903West Virginia54S AtlWV62384.2375.1991793477.0500259.0688557.0861536.0931941.0661702.0493164.0106918.07237.0671085.071142.0205950.0124172.00.480.52317564.037.970130999999995 -79.49008939.725368 -75.04599838.649551 -75.71106 38.55747600000001 -75.70742 38.463066 -75.69915 38.455208 -75.350204 38.45045099999999 -75.093094 38.36962500000001 -75.155243 38.273765999999995 -75.150986 38.201415999999995 -75.262863 38.06891999999999 -75.373428 38.01671200000001 -75.37278 37.996418000000006 -75.626434 37.970130999999995 -75.648216 37.979656000000006 -75.86573 38.09724800000001 -75.769554 38.17493400000001 -75.897797 38.231594 -75.838074 38.24004400000001 -75.861671 38.26360299999999 -75.794174 38.258872999999994 -75.894958 38.35723100000001 -75.872437 38.375462 -75.886826 38.282055000000014 -75.949928 38.282523999999995 -75.995285 38.32189600000001 -76.020805 38.25893400000001 -76.06546 38.436935000000005 -76.294273 38.47872899999999 -76.291985 38.54334299999999 -76.192215 38.59508099999999 -76.251053 38.571922 -76.031937 38.622005 -76.028061 38.591858 -76.046921 38.610783 -76.075996 38.707977 -76.124039 38.70909499999999 -76.174042 38.76279099999999 -76.223312 38.769886000000014 -76.26712 38.67937499999999 -76.337624 38.69902400000001 -76.350533 38.834 -76.272415 38.765254999999996 -76.195175 38.78860900000001 -76.165855 38.885456000000005 -76.114372 38.88954899999999 -76.075867 38.89801800000001 -76.102898 38.94813199999999 -76.095497 38.920715 -76.113869 38.973354 -76.199669 39.118595 -76.111282 39.092918 -76.221771 39.13082499999999 -76.238892 39.204853000000014 -76.218437 39.32129699999999 -76.112373 39.35836800000001 -76.037422 39.37913900000001 -75.849739 39.39455000000001 -75.978798 39.471180000000004 -75.952637 39.524021000000005 -75.974762 39.56992700000001 -76.03141 39.542362 -76.078506 39.401936000000006 -76.154526 39.374888999999996 -76.226662 39.393280000000004 -76.364029 39.231144 -76.39904 39.24261899999999 -76.531296 39.259354 -76.604027 39.23144500000001 -76.565132 39.19811999999999 -76.576981 39.180983999999995 -76.60733 39.15868800000001 -76.595139 39.19626600000001 -76.563919 39.11835500000001 -76.423935 38.908237000000014 -76.472038 38.758972 -76.549126 38.709633 -76.525253 38.522099 -76.508896 38.39128099999999 -76.385811 38.34602000000001 -76.405457 38.32049900000001 -76.421463 38.33565899999999 -76.471924 38.41013699999999 -76.520081 38.450424 -76.647255 38.21306200000001 -76.343781 38.045704 -76.33017 38.22263699999999 -76.577271 38.23428000000001 -76.760239 38.391346 -76.864182 38.29984999999999 -76.908577 38.331028 -76.97303 38.426852999999994 -77.002396 38.39066299999999 -77.220924 38.41359299999999 -77.255875 38.487099 -77.277756 38.64812499999999 -77.12999 38.67779899999999 -77.125114 38.703982999999994 -77.093147 38.71527900000001 -77.081879 38.71202099999999 -77.057121 38.71878100000001 -77.046471 38.78811999999999 -77.045448 38.88998799999999 -76.911209 38.966556999999995 -77.008232 38.99343099999999 -77.042389 38.93206000000001 -77.122627 38.96477899999999 -77.152046 38.97587999999999 -77.243729 39.02757299999999 -77.255989 39.062588000000005 -77.3246 39.068512 -77.346519 39.066776000000004 -77.433037 39.080837 -77.459694 39.103958000000006 -77.479248 39.116653000000014 -77.513046 39.157444 -77.516617 39.17693299999999 -77.478638 39.218632000000014 -77.461998 39.22905700000001 -77.464958 39.249911999999995 -77.494064 39.268939999999986 -77.542191 39.298393000000004 -77.568962 39.29971699999999 -77.616524 39.31868 -77.679588 39.31769600000001 -77.727753 39.326717 -77.750374 39.338493 -77.754585 39.36027100000001 -77.745735 39.378376 -77.756508 39.396095 -77.737518 39.40333899999999 -77.741119 39.42506399999999 -77.757271 39.43221700000001 -77.802559 39.439919 -77.804977 39.450817 -77.796082 39.46303900000001 -77.804474 39.459002999999996 -77.785393 39.480728 -77.799782 39.49801600000001 -77.771835 39.493809 -77.82547 39.50190699999999 -77.84816 39.51194000000001 -77.825546 39.529156 -77.829208 39.52551299999999 -77.835747 39.531834 -77.844131 39.51455300000001 -77.864914 39.545815000000005 -77.869843 39.557995000000005 -77.890198 39.56435400000001 -77.885452 39.565357000000006 -77.853241 39.572643 -77.840149 39.605278 -77.84269 39.60207 -77.855804 39.61647400000001 -77.888718 39.600605 -77.891022 39.59602699999999 -77.903534 39.618122 -77.938889 39.61491799999999 -77.947823 39.59184300000001 -77.935738 39.585915 -77.945259 39.61122900000001 -77.964516 39.598873 -77.995483 39.622772 -78.026695 39.67550700000001 -78.094612 39.69454999999999 -78.183243 39.67584600000001 -78.204575 39.67389700000001 -78.227867 39.65847400000001 -78.2295 39.641075 -78.257996 39.61831699999999 -78.273285 39.640499000000005 -78.34819 39.632278000000014 -78.357048 39.631226 -78.377937 39.61440300000001 -78.384903 39.62086099999999 -78.432159 39.58752100000001 -78.404266 39.592613 -78.450897 39.58074199999999 -78.462082 39.549316000000005 -78.421089 39.548225 -78.446136 39.533641999999986 -78.456078 39.519844000000006 -78.481544 39.52506600000001 -78.509048 39.520981000000006 -78.564453 39.53559100000001 -78.60463 39.52985799999999 -78.637344 39.53790699999999 -78.649406 39.536838999999986 -78.666687 39.559483 -78.716576 39.57655299999999 -78.732979 39.581703000000005 -78.761711 39.601528 -78.774002 39.60870399999999 -78.736511 39.621455999999995 -78.730759 39.62687700000001 -78.732643 39.62652600000001 -78.767876 39.644153999999986 -78.772964 39.63074499999999 -78.798409 39.61533 -78.798729 39.585609000000005 -78.82267 39.566734 -78.806808 39.56322900000001 -78.838371 39.5257 -78.871071 39.460364999999996 -78.955643 39.43843100000001 -78.970688 39.483723 -79.049103 39.48573300000001 -79.064659 39.47075699999999 -79.070877 39.47077899999999 -79.104843 39.46453500000001 -79.096962 39.44721200000001 -79.104324 39.416934999999995 -79.131645 39.41386399999999 -79.158371 39.39339799999999 -79.163261 39.34854100000001 -79.260406 39.325142 -79.28006 39.300438000000014 -79.295509 39.291988 -79.346428 39.269195999999994 -79.385078 39.21198699999999 -79.449509 39.21315799999999 -79.461418 39.19728900000001 -79.490089 39.72019599999999 -79.481209 39.719234 -79.396851 39.722252 -78.930428 39.723029999999994 -78.818016 39.723659999999995 -78.385048 39.724007 -78.334816 39.725368 -78.096222 39.719528 -77.476082 39.719978 -77.464722 39.72058100000001 -77.221344 39.72079099999999 -76.997108 39.72115299999999 -76.790794 39.72016099999999 -76.570145 39.72174799999999 -76.233444 39.72212200000001 -76.139549 39.72375500000001 -75.791435 39.38300699999999 -75.772697 39.295849000000004 -75.764664 39.24775299999999 -75.761658 39.141548 -75.752922 38.83017000000001 -75.724937 38.649551 -75.7110638.90772200000001 -76.293129 38.967567 -76.29451 38.956661 -76.339066 38.941925 -76.314453 38.91208599999999 -76.322632 38.924057000000005 -76.342545 38.875889 -76.329712 38.85410300000001 -76.375565 38.95818700000001 -76.356796 39.040595999999994 -76.299812 38.97889699999999 -76.248146 38.92357999999999 -76.246735 38.94923 -76.273514 38.90772200000001 -76.29312938.449963 -75.068298 38.44949 -75.045998 38.322945000000004 -75.087692 38.449963 -75.06829838.02758800000001 -75.270721 38.037903 -75.244461 38.094177 -75.209755 38.204845000000006 -75.164742 38.320201999999995 -75.094398 38.124187000000006 -75.17318 38.028526 -75.242584 38.02758800000001 -75.270721Maryland24S AtlMD25316.3456188.7944781468.01245814.01748991.02318671.02462797.01783061.01732837.0376449.0202169.02481342.0111536.0586994.0260308.00.4850.515684773.036.988972000000004 -109.05519941.00341 -102.03675837.641459999999995 -102.043999 37.386261000000005 -102.041557 36.988972000000004 -102.036758 36.998504999999994 -102.997223 36.999741 -103.077377 36.994445999999996 -103.993111 36.993183 -105.145615 36.992580000000004 -105.212532 36.994541 -105.712891 36.99227500000001 -105.991425 36.991493000000006 -106.471588 36.989491 -106.860657 36.999072999999996 -106.889778 36.997519999999994 -107.410217 36.998772 -107.471855 36.999474000000006 -108.371834 36.996643000000006 -109.047821 37.630829000000006 -109.044937 37.887428 -109.042542 38.15294299999999 -109.042801 38.24493000000001 -109.055199 38.494663 -109.053284 39.36098899999999 -109.050751 39.51819599999999 -109.052864 39.65741 -109.051888 40.210544999999996 -109.050591 40.665329000000014 -109.045479 40.99847399999999 -109.047638 41.00341 -107.918037 41.000168 -107.303436 40.998489000000006 -106.864838 41.001316 -106.328545 41.000111000000004 -106.202896 40.996365 -105.278259 40.994305 -104.933968 41.00322700000001 -104.051201 40.999663999999996 -103.571823 41.000331999999986 -103.382469 40.99813499999999 -102.651802 41.000225 -102.620789 40.998076999999995 -102.047279 40.743134 -102.046532 40.69732300000001 -102.04557 40.431084 -102.047157 40.34265099999999 -102.047081 39.99892800000001 -102.051071 39.56869900000001 -102.048981 39.56280899999999 -102.04834 39.12675100000001 -102.047417 39.03699900000001 -102.048515 38.69253900000001 -102.047112 38.615486000000004 -102.047127 38.263329 -102.04509 38.253806999999995 -102.045601 37.734386 -102.043518 37.641459999999995 -102.043999Colorado08MtnCO268659.501960.3643294394.0854214.01282489.01631295.01663099.01233023.01216639.0210274.046983.01633281.099438.0421079.0181760.00.4950.505512677.036.496517 -89.56815339.14200600000001 -81.95973236.655033 -86.510674 36.652058 -86.770538 36.650768 -87.068184 36.651264 -87.112701 36.649231 -87.346603 36.645168 -87.64064 36.64444 -87.693512 36.64147199999999 -87.853516 36.66937299999999 -87.870689 36.67963 -88.071312 36.582668 -88.041061 36.538146999999995 -88.035049 36.496517 -88.042732 36.498149999999995 -88.495979 36.499489 -88.512634 36.498985000000005 -88.810661 36.499847 -88.826302 36.499793999999994 -88.830315 36.502548000000004 -89.346596 36.502617 -89.414711 36.510563000000005 -89.418137 36.616187999999994 -89.373878 36.625702000000004 -89.363548 36.628849 -89.342323 36.622017 -89.322273 36.575249 -89.283424 36.569266999999996 -89.241615 36.581894000000005 -89.21006 36.631298 -89.200119 36.653003999999996 -89.177094 36.67157 -89.167831 36.713367000000005 -89.197495 36.72742100000001 -89.196297 36.760925 -89.1772 36.759040999999996 -89.151367 36.768032000000005 -89.125473 36.792412 -89.125839 36.80441999999999 -89.164375 36.829384000000005 -89.173462 36.843422000000004 -89.166496 36.86644 -89.129585 36.953869 -89.104965 36.977451 -89.107147 36.988113 -89.12986 36.99844 -89.150246 37.025711 -89.174332 37.064235999999994 -89.169548 37.093185000000005 -89.146347 37.112137000000004 -89.116821 37.185860000000005 -89.065033 37.22003599999999 -88.993172 37.218407 -88.932503 37.202194000000006 -88.863289 37.152107 -88.746506 37.141182 -88.739113 37.13540999999999 -88.68837 37.109047000000004 -88.61422 37.072815000000006 -88.559273 37.064769999999996 -88.517273 37.06818 -88.4907 37.072143999999994 -88.476799 37.098670999999996 -88.45047 37.156909999999996 -88.422516 37.205669 -88.450699 37.257782000000006 -88.501427 37.296852 -88.511322 37.400757 -88.467644 37.420292 -88.419853 37.40930899999999 -88.359177 37.442852 -88.311707 37.476273000000006 -88.087883 37.51099000000001 -88.071564 37.583572000000004 -88.134171 37.628479 -88.157631 37.660686 -88.15937 37.700745 -88.133636 37.735400999999996 -88.072472 37.805683 -88.035576 37.801308000000006 -88.011192 37.77618 -87.95871 37.799507000000006 -87.939583 37.809685 -87.920143 37.838570000000004 -87.910202 37.875179 -87.936821 37.904160000000005 -87.934456 37.919865 -87.921867 37.924553 -87.89901 37.890902999999994 -87.857162 37.878212000000005 -87.823624 37.898087000000004 -87.753761 37.894543 -87.72818 37.899711999999994 -87.709389 37.897007 -87.679703 37.836330000000004 -87.6847 37.828132999999994 -87.65168 37.843777 -87.607574 37.864868 -87.59362 37.890724000000006 -87.594704 37.923412 -87.627121 37.971115 -87.604309 37.91558499999999 -87.504791 37.936477999999994 -87.452278 37.93492500000001 -87.387543 37.89367300000001 -87.310555 37.870773 -87.272743 37.84907200000001 -87.226761 37.838593 -87.175781 37.82692 -87.158081 37.789688 -87.131882 37.784203000000005 -87.10643 37.807086999999996 -87.071312 37.907955 -87.036484 37.924713 -87.013161 37.930565 -86.989037 37.937988000000004 -86.93158 37.953644 -86.900085 37.986866000000006 -86.863281 37.991505000000004 -86.826317 37.978745 -86.802826 37.898303999999996 -86.753838 37.894566 -86.728889 37.91179700000001 -86.68914 37.913139 -86.668671 37.902514999999994 -86.660324 37.860584 -86.670685 37.847324 -86.665939 37.845943000000005 -86.645584 37.857918 -86.614799 37.921013 -86.598328 37.925606 -86.581802 37.921454999999995 -86.541107 37.927811000000005 -86.522758 37.942181000000005 -86.516922 37.987415 -86.530869 38.018631 -86.527855 38.046986000000004 -86.519112 38.051585999999986 -86.503136 38.05909700000001 -86.458389 38.075931999999995 -86.44249 38.08863400000001 -86.442543 38.11164500000001 -86.474358 38.12909300000001 -86.464867 38.129692000000006 -86.452545 38.10815400000001 -86.407204 38.12323000000001 -86.3937 38.13420500000001 -86.344063 38.143963000000014 -86.335442 38.155495 -86.343147 38.167957 -86.387123 38.194743999999986 -86.388329 38.19322600000001 -86.364372 38.177223 -86.341629 38.150238 -86.297699 38.07842299999999 -86.291466 38.05810500000001 -86.277725 38.04065299999999 -86.252182 38.01768899999999 -86.190651 38.01126500000001 -86.105019 37.966713 -86.05275 37.992878000000005 -86.031654 38.001693999999986 -86.006699 38.01176799999999 -85.958618 38.03397799999999 -85.930908 38.06480400000001 -85.914787 38.17993200000001 -85.912109 38.23849100000001 -85.852371 38.27622199999999 -85.839943 38.28611000000001 -85.806587 38.28232199999999 -85.786247 38.27024499999999 -85.746964 38.300883999999996 -85.681427 38.33768499999999 -85.654266 38.383621000000005 -85.643631 38.446606 -85.612679 38.47135499999999 -85.50724 38.518112 -85.466423 38.53695300000001 -85.432411 38.56141299999999 -85.417503 38.584778 -85.424446 38.694614 -85.45372 38.72478100000001 -85.446732 38.738358000000005 -85.418228 38.73694599999999 -85.335052 38.744316 -85.271439 38.69575499999999 -85.205208 38.69511399999999 -85.16098 38.714077 -85.119705 38.750361999999996 -85.068504 38.764229 -85.025124 38.78057899999999 -84.975662 38.793346000000014 -84.818832 38.83439999999999 -84.824478 38.866581 -84.787498 38.884322999999995 -84.788719 38.89712900000001 -84.803276 38.901981000000006 -84.859795 38.909369999999996 -84.875305 38.92754400000001 -84.875931 38.95457099999999 -84.846367 38.98271600000001 -84.834496 39.00577200000001 -84.844276 39.032837 -84.876343 39.050591 -84.890045 39.064987 -84.886757 39.10363000000001 -84.827911 39.10252800000001 -84.811531 39.106976 -84.789978 39.14200600000001 -84.742928 39.08956499999999 -84.667542 39.07487499999999 -84.622704 39.07020600000001 -84.593124 39.094134999999994 -84.515358 39.107304 -84.492111 39.111766999999986 -84.444977 39.084663000000006 -84.425743 39.04727600000001 -84.4198 39.035683000000006 -84.391373 39.03774999999999 -84.34584 39.01401100000001 -84.313377 38.94447299999999 -84.290199 38.91741200000001 -84.261589 38.87448900000001 -84.235359 38.812622000000005 -84.228767 38.78842900000001 -84.176819 38.765434 -84.088936 38.763664000000006 -84.053871 38.77757600000001 -83.962234 38.757889000000006 -83.912613 38.744845999999995 -83.857628 38.71180699999999 -83.837608 38.693771 -83.790543 38.650745 -83.770302 38.635479000000004 -83.712906 38.62085300000001 -83.678612 38.623806 -83.655838 38.63578799999999 -83.643272 38.664897999999994 -83.633324 38.677898 -83.618462 38.69603699999999 -83.526642 38.69006300000001 -83.50016 38.663700000000006 -83.453705 38.654922 -83.371513 38.631912 -83.330116 38.60648699999999 -83.320419 38.59624099999999 -83.306625 38.59656100000001 -83.290138 38.60918000000001 -83.27285 38.62409600000001 -83.24511 38.60976400000001 -83.182037 38.61926299999999 -83.14325 38.66475700000001 -83.111343 38.68565000000001 -83.060982 38.714436000000006 -83.027046 38.719565999999986 -82.972588 38.74633800000001 -82.92141 38.74269899999999 -82.890419 38.718929 -82.873299 38.683223999999996 -82.880119 38.65231700000001 -82.860138 38.60038 -82.853966 38.571583000000004 -82.827103 38.557209 -82.802475 38.552986000000004 -82.742058 38.539063 -82.695694 38.50206 -82.669876 38.472588 -82.613861 38.41243700000001 -82.586723 38.368382 -82.598358 38.307728 -82.572418 38.292427 -82.58017 38.255889999999994 -82.574699 38.245304000000004 -82.589233 38.23872800000001 -82.616348 38.19374099999999 -82.606766 38.178009 -82.613884 38.16935000000001 -82.647278 38.146243999999996 -82.646248 38.10987499999999 -82.59333 38.01557199999999 -82.524803 37.975815 -82.475906 37.95430399999999 -82.480301 37.942420999999996 -82.493523 37.922169 -82.500336 37.894760000000005 -82.437737 37.872260999999995 -82.421638 37.811623 -82.405937 37.784302 -82.339981 37.758326999999994 -82.319633 37.744072 -82.329536 37.668957000000006 -82.295761 37.656673 -82.23851 37.623913 -82.205582 37.640564 -82.185692 37.593464 -82.159454 37.590430999999995 -82.131927 37.56979 -82.137619 37.565815 -82.146667 37.557345999999995 -82.142654 37.548203 -82.084541 37.525234 -82.055817 37.551345999999995 -82.049286 37.530411 -82.026505 37.543144 -81.97673 37.531063 -81.959732 37.30475199999999 -82.289085 37.26040999999999 -82.353973 37.250595000000004 -82.406013 37.19927199999999 -82.550163 37.193813000000006 -82.568146 37.109916999999996 -82.719215 37.093018 -82.721497 37.075382000000005 -82.70929 37.065830000000005 -82.720177 37.033894000000004 -82.723717 37.005505 -82.81234 36.974491 -82.866676 36.932068 -82.860748 36.893600000000006 -82.878159 36.863986999999995 -82.95092 36.858704 -83.046745 36.850905999999995 -83.068062 36.779064000000005 -83.128326 36.75108 -83.124496 36.739971 -83.138618 36.734173 -83.203758 36.709446 -83.32148 36.68813299999999 -83.385948 36.672241 -83.404243 36.661747000000005 -83.460312 36.661395999999996 -83.530983 36.616894 -83.646889 36.598620999999994 -83.675262 36.584166999999994 -83.695694 36.591209000000006 -83.935677 36.592006999999995 -84.006821 36.595371 -84.254555 36.595417 -84.256844 36.605002999999996 -84.781929 36.605366000000004 -84.791115 36.620914 -84.998512 36.625553 -85.272537 36.626037999999994 -85.300133 36.618137000000004 -85.437408 36.626628999999994 -85.7855 36.63306 -85.980629 36.643246000000005 -86.199005 36.650890000000004 -86.415451 36.655033 -86.51067436.498108 -89.533195 36.518738 -89.566986 36.541409 -89.568153 36.557743 -89.556137 36.564555999999996 -89.530365 36.559116 -89.493126 36.547775 -89.481674 36.525555 -89.471375 36.504695999999996 -89.481682 36.498547 -89.475822 36.498108 -89.533195Kentucky21E S CenKY103961.9041772.5424551524.01237346.01718663.02195130.02356394.01656590.01502949.0273091.048158.01970934.0148125.0556744.0361621.00.4820.518646517.036.988853000000006 -102.05107140.00297900000001 -94.6009937.001408 -95.071693 37.000538000000006 -95.406372 37.000938000000005 -95.525764 36.998035 -95.785492 37.000011 -95.957703 36.998264000000006 -96.005791 37.000538000000006 -96.518898 37.000134 -96.74839 36.999779000000004 -97.137375 36.996441000000004 -97.46508 36.998543 -97.803917 36.998645999999994 -98.104187 36.999035000000006 -98.346794 36.99834799999999 -98.539864 36.998042999999996 -98.999138 36.99453 -99.43708 36.995434 -99.544243 36.995388000000005 -99.998848 36.997623000000004 -100.088158 36.997806999999995 -100.633812 36.996635 -100.950142 36.99744 -101.071159 36.996666000000005 -101.553238 36.988853000000006 -102.024071 36.988972000000004 -102.036758 37.386261000000005 -102.041557 37.641459999999995 -102.043999 37.734386 -102.043518 38.253806999999995 -102.045601 38.263329 -102.04509 38.615486000000004 -102.047127 38.69253900000001 -102.047112 39.03699900000001 -102.048515 39.12675100000001 -102.047417 39.56280899999999 -102.04834 39.56869900000001 -102.048981 39.99892800000001 -102.051071 40.00100699999999 -101.406952 40.001823 -101.321709 40.00019499999999 -100.754425 39.999168 -100.734619 40.000580000000014 -100.190697 40.000473 -100.180496 40.00297900000001 -99.627472 39.99956499999999 -99.177834 39.998324999999994 -99.064384 39.998447 -98.720284 39.997116000000005 -98.504143 39.99842100000001 -98.26384 39.99843999999999 -97.929268 39.999718 -97.816269 39.997375000000005 -97.361595 39.996151 -96.907982 39.994473 -96.801117 39.994170999999994 -96.453743 39.99450300000001 -96.240311 39.995159 -96.000977 39.99348800000001 -95.780434 39.99259599999999 -95.329445 39.999409000000014 -95.308441 39.94210799999999 -95.240707 39.93817899999999 -95.207344 39.91018299999999 -95.19371 39.90805800000001 -95.150299 39.869868999999994 -95.100471 39.86654300000001 -95.062996 39.877849999999995 -95.033257 39.896984 -95.021523 39.90082899999999 -94.964775 39.89608799999999 -94.937996 39.849391999999995 -94.936264 39.83313799999999 -94.92363 39.828339 -94.898079 39.817406000000005 -94.88826 39.793780999999996 -94.899078 39.78278 -94.933022 39.77543299999999 -94.934868 39.757847 -94.921555 39.760684999999995 -94.876823 39.75412399999999 -94.870941 39.73931099999999 -94.877617 39.72676100000001 -94.905434 39.72703200000001 -94.930611 39.73650699999999 -94.952896 39.732044 -94.96154 39.68499399999999 -94.978325 39.66191900000001 -95.028046 39.62569400000001 -95.055771 39.586781 -95.053368 39.56069600000001 -95.108742 39.53285199999999 -95.101791 39.485332 -95.047356 39.46294399999999 -95.040268 39.43946500000001 -94.985962 39.411449000000005 -94.958252 39.381268000000006 -94.925507 39.380641999999995 -94.898041 39.34012200000001 -94.911102 39.32302899999999 -94.90744 39.286045 -94.880867 39.261765 -94.833237 39.21100200000001 -94.82058 39.19687999999999 -94.78981 39.17125300000001 -94.730293 39.17491899999999 -94.675278 39.158424 -94.646172 39.151646 -94.612419 39.141223999999994 -94.60099 39.112797 -94.607903 39.04466199999999 -94.609047 38.83710099999999 -94.612236 38.737213 -94.612915 38.47145800000001 -94.618484 38.39201399999999 -94.61882 38.05575200000001 -94.617096 38.03035399999999 -94.616501 37.679824999999994 -94.619057 37.65033 -94.618759 37.360714 -94.61853 37.327679 -94.618744 37.060085 -94.620438 36.996983 -94.620155 37.00071 -95.032509 37.001408 -95.071693Kansas20W N CenKS211921.6411188.8652477574.0658600.0944726.01214645.01262929.0907383.0928575.0135598.07585.01172214.057772.0346339.0166429.00.490.51453411.036.541481000000005 -83.67526239.456902000000014 -75.24258436.546059 -79.144325 36.54978199999999 -79.217064 36.547657 -79.5103 36.547889999999995 -79.717445 36.545024999999995 -80.024055 36.547134 -80.048096 36.551044000000005 -80.43531 36.557297000000005 -80.611053 36.563438000000005 -80.838158 36.565212 -80.903442 36.57286499999999 -81.345299 36.589648999999994 -81.669998 36.607555000000005 -81.652435 36.611481 -81.829056 36.613495 -81.918449 36.595837 -81.929459 36.595043000000004 -82.154327 36.593967000000006 -82.216805 36.591697999999994 -82.296997 36.591446000000005 -82.610962 36.590946 -82.849937 36.591198000000006 -82.986809 36.588001000000006 -83.211029 36.589848 -83.248489 36.60038 -83.275131 36.598755 -83.464302 36.598620999999994 -83.675262 36.616894 -83.646889 36.661395999999996 -83.530983 36.661747000000005 -83.460312 36.672241 -83.404243 36.68813299999999 -83.385948 36.709446 -83.32148 36.734173 -83.203758 36.739971 -83.138618 36.75108 -83.124496 36.779064000000005 -83.128326 36.850905999999995 -83.068062 36.858704 -83.046745 36.863986999999995 -82.95092 36.893600000000006 -82.878159 36.932068 -82.860748 36.974491 -82.866676 37.005505 -82.81234 37.033894000000004 -82.723717 37.065830000000005 -82.720177 37.075382000000005 -82.70929 37.093018 -82.721497 37.109916999999996 -82.719215 37.193813000000006 -82.568146 37.19927199999999 -82.550163 37.250595000000004 -82.406013 37.26040999999999 -82.353973 37.30475199999999 -82.289085 37.531063 -81.959732 37.506535 -81.935608 37.492915999999994 -81.948151 37.48279599999999 -81.976578 37.466476 -81.988358 37.41540500000001 -81.920891 37.371616 -81.926979 37.34047700000001 -81.897316 37.325344 -81.863976 37.30691899999999 -81.858841 37.285393 -81.83905 37.279427 -81.815544 37.287041 -81.792824 37.272144 -81.752022 37.250378 -81.738625 37.235321 -81.701897 37.204796 -81.666054 37.206238 -81.556824 37.234257 -81.505707 37.252735 -81.495705 37.254307 -81.475533 37.282509000000005 -81.403519 37.311038999999994 -81.391121 37.338837 -81.358971 37.293591000000006 -81.31205 37.240097000000006 -81.223114 37.274806999999996 -81.140923 37.285942000000006 -81.025124 37.306122 -80.98613 37.296356 -80.978729 37.291672000000005 -80.968086 37.301249999999996 -80.93438 37.339291 -80.855629 37.350821999999994 -80.848618 37.388577 -80.877556 37.423339999999996 -80.850723 37.412941000000004 -80.799812 37.391632 -80.799446 37.386073999999994 -80.770226 37.371292 -80.763199 37.378960000000006 -80.747894 37.387615 -80.746529 37.392596999999995 -80.729942 37.388256 -80.705414 37.445930000000004 -80.597702 37.469086000000004 -80.542969 37.47492200000001 -80.50898 37.460471999999996 -80.488098 37.433735 -80.487015 37.422695000000004 -80.474983 37.43478 -80.425598 37.465599 -80.388527 37.475975000000005 -80.352379 37.491051 -80.347733 37.511024000000006 -80.288139 37.53613300000001 -80.280952 37.528244 -80.308525 37.533276 -80.326126 37.566593 -80.31694 37.596771000000004 -80.246613 37.624142000000006 -80.219147 37.640579 -80.254639 37.640423 -80.301147 37.652122000000006 -80.305077 37.671379 -80.295914 37.682548999999995 -80.303322 37.725928999999994 -80.250244 37.757110999999995 -80.254898 37.778735999999995 -80.220757 37.80224200000001 -80.223946 37.842845999999994 -80.171806 37.860062 -80.172432 37.877106 -80.160217 37.891155 -80.118721 37.914536 -80.106705 37.955524 -80.055023 37.989746 -80.000717 38.038498000000004 -79.966713 38.06724199999999 -79.957733 38.10318799999999 -79.928513 38.121185 -79.935547 38.16248300000001 -79.910561 38.17914200000001 -79.916382 38.250156000000004 -79.831375 38.268542999999994 -79.793846 38.28499600000001 -79.786736 38.29874799999999 -79.803001 38.31420499999999 -79.800552 38.35387 -79.764229 38.351719 -79.733055 38.394566 -79.720261 38.43011899999999 -79.684319 38.500237 -79.692879 38.52065999999999 -79.66584 38.55006 -79.669655 38.592239000000006 -79.642632 38.553687999999994 -79.536743 38.46202500000001 -79.48658 38.41251 -79.317238 38.437183000000005 -79.272598 38.480372999999986 -79.231903 38.65812700000001 -79.12767 38.66365099999999 -79.121307 38.659088 -79.088791 38.707153000000005 -79.087479 38.76194000000001 -79.056801 38.79051999999999 -79.055046 38.799847 -79.033989 38.84664900000001 -78.987701 38.76329000000001 -78.866814 38.83363299999999 -78.816116 38.88010800000001 -78.793312 38.911381000000006 -78.749512 38.92917299999999 -78.737991 38.93021400000001 -78.724403 38.90488099999999 -78.719246 38.92157399999999 -78.680489 38.95044300000001 -78.647232 38.979603 -78.631111 38.967197 -78.598961 39.01382799999999 -78.553474 39.02338 -78.549469 39.035037999999986 -78.564445 39.05702600000001 -78.536919 39.09357800000001 -78.501869 39.111839 -78.485519 39.118931 -78.44825 39.14852099999999 -78.43084 39.17049 -78.402634 39.19752500000001 -78.424339 39.21204 -78.42334 39.244850000000014 -78.399399 39.257439000000005 -78.413818 39.341358000000014 -78.341118 39.35085699999999 -78.3442 39.36158800000001 -78.365746 39.38073 -78.350502 39.456902000000014 -78.347816 39.42336700000001 -78.277153 39.39101400000001 -78.229782 39.265536999999995 -78.033607 39.13207600000001 -77.830963 39.14162099999999 -77.820328 39.19650300000001 -77.805733 39.24644900000001 -77.768517 39.28454199999999 -77.759743 39.31769600000001 -77.727753 39.31868 -77.679588 39.29971699999999 -77.616524 39.298393000000004 -77.568962 39.268939999999986 -77.542191 39.249911999999995 -77.494064 39.22905700000001 -77.464958 39.218632000000014 -77.461998 39.17693299999999 -77.478638 39.157444 -77.516617 39.116653000000014 -77.513046 39.103958000000006 -77.479248 39.080837 -77.459694 39.066776000000004 -77.433037 39.068512 -77.346519 39.062588000000005 -77.3246 39.02757299999999 -77.255989 38.97587999999999 -77.243729 38.96477899999999 -77.152046 38.93206000000001 -77.122627 38.91560000000001 -77.078949 38.886101 -77.067886 38.86243099999999 -77.039078 38.838413 -77.040405 38.829364999999996 -77.045189 38.81391500000001 -77.035248 38.78811999999999 -77.045448 38.71878100000001 -77.046471 38.71202099999999 -77.057121 38.71527900000001 -77.081879 38.703982999999994 -77.093147 38.67779899999999 -77.125114 38.64812499999999 -77.12999 38.62270000000001 -77.197258 38.66076699999999 -77.194748 38.650723 -77.227592 38.50191100000001 -77.303619 38.436825 -77.338486 38.362671000000006 -77.289482 38.34398300000001 -77.321823 38.33137099999999 -77.2407 38.375350999999995 -77.054535 38.280272999999994 -76.999359 38.202473 -76.936462 38.12022400000001 -76.595604 38.074112000000014 -76.549034 38.02533 -76.558044 38.00317000000001 -76.573692 38.012744999999995 -76.524544 37.956951000000004 -76.367744 37.890029999999996 -76.259201 37.850178 -76.251923 37.798812999999996 -76.324539 37.719111999999996 -76.309944 37.70013 -76.357002 37.677814 -76.323059 37.622924999999995 -76.344872 37.656384 -76.507088 37.770115000000004 -76.58046 37.796349000000006 -76.631775 37.916675999999995 -76.771851 37.919506 -76.818504 37.798480999999995 -76.732353 37.774754 -76.681732 37.641907 -76.569496 37.551201000000006 -76.314644 37.52515 -76.34864 37.55257400000001 -76.512856 37.515202 -76.434181 37.515755 -76.355667 37.390190000000004 -76.254593 37.330321999999995 -76.275192 37.334571999999994 -76.300972 37.393547 -76.33902 37.457966 -76.446869 37.418892 -76.463936 37.412136000000004 -76.417084 37.373028000000005 -76.403755 37.377491000000006 -76.455551 37.293426999999994 -76.392738 37.255432 -76.461136 37.412200999999996 -76.653488 37.418491 -76.704681 37.371646999999996 -76.669983 37.291298 -76.595039 37.207297999999994 -76.424667 37.152393000000004 -76.412994 37.173030999999995 -76.396873 37.146427 -76.363785 37.177009999999996 -76.337318 37.122097 -76.285675 37.107708 -76.395691 37.074344999999994 -76.278931 37.020489 -76.293343 36.990414 -76.384552 36.96526 -76.426117 37.067642000000006 -76.53112 37.088367000000005 -76.515266 37.117771000000005 -76.564491 37.080173 -76.568443 37.13227500000001 -76.624916 37.178577000000004 -76.610031 37.225837999999996 -76.648094 37.232521000000006 -76.697151 37.193389999999994 -76.746101 37.240387 -76.795929 37.2439 -76.85717 37.322945000000004 -76.875488 37.259426000000005 -76.878426 37.23661 -76.94149 37.201054 -76.900864 37.207302 -76.797394 37.15066899999999 -76.72921 37.197987 -76.685966 37.147712999999996 -76.671539 37.054134000000005 -76.665642 37.024494000000004 -76.577827 36.994843 -76.613373 37.006195000000005 -76.555046 36.961723000000006 -76.48951 36.912186000000005 -76.517174 36.91908599999999 -76.482178 36.895568999999995 -76.486618 36.841801000000004 -76.560516 36.795615999999995 -76.561852 36.869473 -76.507195 36.901413000000005 -76.410805 36.913342 -76.348145 36.860187999999994 -76.341919 36.835926 -76.394089 36.826138 -76.401184 36.845844 -76.317436 36.828342000000006 -76.292702 36.942001000000005 -76.307617 36.962734 -76.284225 36.935069999999996 -76.202332 36.904442 -76.191666 36.931618 -76.118431 36.923134000000005 -75.995361 36.555874 -75.878166 36.556197999999995 -75.901985 36.599022000000005 -75.892853 36.721565 -75.950798 36.556652 -75.998665 36.556717000000006 -76.027168 36.603592000000006 -76.061859 36.55695299999999 -76.045959 36.557163 -76.127396 36.556056999999996 -76.330254 36.555813 -76.497559 36.555251999999996 -76.563583 36.554157000000004 -76.921631 36.554146 -76.924133 36.556286 -77.177353 36.553917 -77.320053 36.553439999999995 -77.763931 36.552944 -77.898857 36.552475 -78.051666 36.545531999999994 -78.321251 36.541481000000005 -78.458809 36.546074000000004 -78.737389 36.543533 -78.7967 36.546059 -79.14432538.02758800000001 -75.270721 38.028526 -75.242584 37.962875 -75.298859 37.888783000000004 -75.33918 37.875652 -75.386078 37.90191299999999 -75.34481 37.900974000000005 -75.378571 37.918797 -75.346687 38.02758800000001 -75.27072137.552181000000004 -75.867371 37.561554 -75.941101 37.58588399999999 -75.929558 37.580344999999994 -75.887276 37.592175 -75.905991 37.711792 -75.799721 37.789833 -75.7826 37.824516 -75.696083 37.858124000000004 -75.686707 37.930569000000006 -75.733978 37.941181 -75.658447 37.970130999999995 -75.648216 37.996418000000006 -75.626434 38.01671200000001 -75.37278 37.697131999999996 -75.61792 37.677193 -75.589905 37.589512 -75.699493 37.559753 -75.650269 37.558182 -75.727524 37.510540000000006 -75.7565 37.493472999999994 -75.705269 37.469044 -75.813026 37.426204999999996 -75.820488 37.408108 -75.790771 37.418148 -75.826675 37.36739300000001 -75.89711 37.14250199999999 -75.931389 37.126232 -75.970985 37.308780999999996 -76.018471 37.484641999999994 -75.934448 37.479350999999994 -75.965446 37.521832 -75.954704 37.556889 -75.930756 37.552181000000004 -75.867371Virginia51S AtlVA102537.3284263.826180651.01627615.02289067.03030948.03149703.02343200.02278600.0499251.0125792.03025109.0141926.0777181.0420070.00.490.51898089.035.989586 -95.76720440.609748999999994 -89.10496536.953869 -89.104965 36.86644 -89.129585 36.843422000000004 -89.166496 36.829384000000005 -89.173462 36.80441999999999 -89.164375 36.792412 -89.125839 36.768032000000005 -89.125473 36.759040999999996 -89.151367 36.760925 -89.1772 36.72742100000001 -89.196297 36.713367000000005 -89.197495 36.67157 -89.167831 36.653003999999996 -89.177094 36.631298 -89.200119 36.581894000000005 -89.21006 36.569266999999996 -89.241615 36.575249 -89.283424 36.622017 -89.322273 36.628849 -89.342323 36.625702000000004 -89.363548 36.616187999999994 -89.373878 36.510563000000005 -89.418137 36.502617 -89.414711 36.456379 -89.448517 36.445953 -89.470833 36.465462 -89.491989 36.498547 -89.475822 36.504695999999996 -89.481682 36.525555 -89.471375 36.547775 -89.481674 36.559116 -89.493126 36.564555999999996 -89.530365 36.557743 -89.556137 36.541409 -89.568153 36.518738 -89.566986 36.498108 -89.533195 36.47180899999999 -89.516022 36.440960000000004 -89.545181 36.401058000000006 -89.520004 36.35593 -89.519333 36.345721999999995 -89.544556 36.354752000000005 -89.60569 36.334782000000004 -89.622795 36.308037 -89.606766 36.280865000000006 -89.542236 36.264538 -89.535378 36.257278 -89.541649 36.240898 -89.61808 36.25489399999999 -89.670586 36.25213599999999 -89.694542 36.240795000000006 -89.695656 36.220867 -89.676788 36.18374300000001 -89.618561 36.15201999999999 -89.589455 36.129791 -89.589424 36.099316 -89.667389 36.08297 -89.678169 36.025795 -89.688843 35.999877999999995 -89.721756 35.996838 -89.963203 35.991158 -90.283455 35.989586 -90.37896 36.091656 -90.315239 36.115905999999995 -90.284752 36.118763 -90.263702 36.137089 -90.23484 36.161148 -90.232224 36.172565000000006 -90.219223 36.196940999999995 -90.161308 36.21207 -90.131218 36.257996000000006 -90.109917 36.272273999999996 -90.066093 36.300472 -90.049751 36.325333 -90.067635 36.362606 -90.050201 36.382553 -90.052063 36.39738800000001 -90.080177 36.404915 -90.116829 36.422565000000006 -90.123833 36.453896 -90.117226 36.45741700000001 -90.137276 36.491814000000005 -90.150162 36.492751999999996 -90.224373 36.490962999999994 -90.581619 36.489204 -90.804314 36.487953000000005 -91.133827 36.491039 -91.411659 36.490376 -91.45285 36.490955 -91.688416 36.491371 -92.127487 36.491596 -92.146164 36.490855999999994 -92.522888 36.489918 -92.777466 36.489819 -92.852104 36.490616 -93.297142 36.490196 -93.328163 36.489891 -93.59626 36.489716 -93.857323 36.49095199999999 -94.080849 36.489338000000004 -94.617035 36.670471000000006 -94.62085 36.763538 -94.62146 36.996983 -94.620155 37.060085 -94.620438 37.327679 -94.618744 37.360714 -94.61853 37.65033 -94.618759 37.679824999999994 -94.619057 38.03035399999999 -94.616501 38.05575200000001 -94.617096 38.39201399999999 -94.61882 38.47145800000001 -94.618484 38.737213 -94.612915 38.83710099999999 -94.612236 39.04466199999999 -94.609047 39.112797 -94.607903 39.141223999999994 -94.60099 39.151646 -94.612419 39.158424 -94.646172 39.17491899999999 -94.675278 39.17125300000001 -94.730293 39.19687999999999 -94.78981 39.21100200000001 -94.82058 39.261765 -94.833237 39.286045 -94.880867 39.32302899999999 -94.90744 39.34012200000001 -94.911102 39.380641999999995 -94.898041 39.381268000000006 -94.925507 39.411449000000005 -94.958252 39.43946500000001 -94.985962 39.46294399999999 -95.040268 39.485332 -95.047356 39.53285199999999 -95.101791 39.56069600000001 -95.108742 39.586781 -95.053368 39.62569400000001 -95.055771 39.66191900000001 -95.028046 39.68499399999999 -94.978325 39.732044 -94.96154 39.73650699999999 -94.952896 39.72703200000001 -94.930611 39.72676100000001 -94.905434 39.73931099999999 -94.877617 39.75412399999999 -94.870941 39.760684999999995 -94.876823 39.757847 -94.921555 39.77543299999999 -94.934868 39.78278 -94.933022 39.793780999999996 -94.899078 39.817406000000005 -94.88826 39.828339 -94.898079 39.83313799999999 -94.92363 39.849391999999995 -94.936264 39.89608799999999 -94.937996 39.90082899999999 -94.964775 39.896984 -95.021523 39.877849999999995 -95.033257 39.86654300000001 -95.062996 39.869868999999994 -95.100471 39.90805800000001 -95.150299 39.91018299999999 -95.19371 39.93817899999999 -95.207344 39.94210799999999 -95.240707 39.999409000000014 -95.308441 40.02497500000001 -95.34481 40.028751 -95.370987 40.043750999999986 -95.390274 40.048111000000006 -95.413506 40.08037899999999 -95.403526 40.09536399999999 -95.384285 40.11541700000001 -95.392555 40.131744 -95.422218 40.17399599999999 -95.460693 40.213257 -95.466377 40.226856 -95.476562 40.266215999999986 -95.546875 40.309776 -95.595268 40.30910900000001 -95.646561 40.32234600000001 -95.645287 40.33141699999999 -95.617668 40.346497 -95.615936 40.358799000000005 -95.633919 40.396389 -95.636551 40.48533599999999 -95.695091 40.512203 -95.6847 40.53033099999999 -95.657791 40.558727000000005 -95.662674 40.565833999999995 -95.675423 40.56116900000001 -95.687141 40.52412799999999 -95.691795 40.53237200000001 -95.736763 40.549705999999986 -95.763138 40.589045999999996 -95.767204 40.58433500000001 -95.382294 40.581897999999995 -95.217171 40.57722899999999 -94.920364 40.57575600000001 -94.639633 40.57421500000001 -94.484993 40.57097200000001 -94.238159 40.57402400000001 -94.01783 40.57844499999999 -93.786079 40.58080699999999 -93.562691 40.58048199999999 -93.370056 40.58433500000001 -93.100731 40.58964499999999 -92.717621 40.59143800000001 -92.64624 40.599548 -92.361328 40.60006000000001 -92.192993 40.60823400000001 -91.946198 40.609748999999994 -91.741547 40.593399000000005 -91.716812 40.581165 -91.689796 40.55163999999999 -91.691917 40.53286399999999 -91.622375 40.50483299999999 -91.616699 40.484477999999996 -91.585869 40.463718 -91.579224 40.455399 -91.533051 40.44124600000001 -91.538689 40.43504300000001 -91.529449 40.41012599999999 -91.527534 40.40511699999999 -91.500221 40.390761999999995 -91.490158 40.39096799999999 -91.476883 40.371902000000006 -91.448593 40.309624000000014 -91.486694 40.25137699999999 -91.498932 40.200458999999995 -91.506546 40.134544000000005 -91.516129 40.066711 -91.504005 40.005753 -91.487289 39.94606400000001 -91.447243 39.92183700000001 -91.430389 39.90182899999999 -91.434052 39.885242000000005 -91.450989 39.86304899999999 -91.449188 39.80377200000001 -91.381714 39.76127199999999 -91.373421 39.724639999999994 -91.367088 39.68591699999999 -91.317665 39.600021 -91.203247 39.552593 -91.156189 39.52892700000001 -91.093613 39.473984 -91.064384 39.444412 -91.036339 39.40058500000001 -90.947891 39.35045199999999 -90.850494 39.29680300000001 -90.779343 39.24780999999999 -90.738083 39.22474700000001 -90.732338 39.195873000000006 -90.718193 39.14421100000001 -90.716736 39.09370000000001 -90.690399 39.058178 -90.707588 39.037791999999996 -90.70607 38.93525299999999 -90.668877 38.880795000000006 -90.627213 38.87132600000001 -90.570328 38.89160899999999 -90.530426 38.959179000000006 -90.469841 38.96233000000001 -90.413071 38.92490799999999 -90.31974 38.92471699999999 -90.278931 38.91450900000001 -90.243927 38.85303099999999 -90.132812 38.830467 -90.113121 38.80051 -90.121727 38.785484 -90.135178 38.773098000000005 -90.163399 38.72396499999999 -90.196571 38.70036300000001 -90.20224 38.658772 -90.183578 38.61027100000001 -90.183708 38.562805 -90.240944 38.532768000000004 -90.26123 38.518688 -90.265785 38.427357 -90.301842 38.39084600000001 -90.339607 38.36533 -90.358688 38.32355899999999 -90.369347 38.23429899999999 -90.364769 38.18871300000001 -90.336716 38.16681700000001 -90.289635 38.122169000000014 -90.254059 38.08890500000001 -90.207527 38.05395100000001 -90.134712 38.032272000000006 -90.119339 37.993206 -90.041924 37.969318 -90.010811 37.963634 -89.958229 37.911884 -89.978912 37.878044 -89.937874 37.875904000000006 -89.900551 37.891875999999996 -89.866814 37.905486999999994 -89.861046 37.905063999999996 -89.851715 37.840992 -89.728447 37.804794 -89.691055 37.78397 -89.675858 37.745453 -89.666458 37.706103999999996 -89.581436 37.694798000000006 -89.521523 37.67984 -89.513374 37.650375 -89.51918 37.615928999999994 -89.513367 37.571957 -89.524971 37.491726 -89.494781 37.453186 -89.453621 37.411018 -89.427574 37.355717 -89.435738 37.339409 -89.468742 37.329441 -89.50058 37.304962 -89.513885 37.276402000000004 -89.513885 37.256001 -89.489594 37.253731 -89.465309 37.224266 -89.468216 37.165318 -89.440521 37.137203 -89.423798 37.09908299999999 -89.37999 37.049212999999995 -89.38295 37.009682 -89.310982 36.999207 -89.282768 37.008686 -89.262001 37.027733 -89.264244 37.060908999999995 -89.3097 37.085384000000005 -89.303291 37.091244 -89.284233 37.087124 -89.264053 37.041732999999994 -89.237679 37.02897299999999 -89.210052 36.986771000000005 -89.193512 36.988113 -89.12986 36.977451 -89.107147 36.953869 -89.104965Missouri29W N CenMO178445.9512100.1155117073.01368334.01961206.02464315.02652758.01861192.01816079.0312042.047129.02367395.0155388.0659782.0386746.00.4820.518864999.031.335534999999993 -114.82096937.003929 -109.04500633.027668000000006 -114.519844 33.036743 -114.558304 33.026962 -114.609138 33.03352700000001 -114.633179 33.04437299999999 -114.644371 33.038883 -114.663162 33.095344999999995 -114.710564 33.122337 -114.708672 33.167213000000004 -114.67733 33.22456 -114.67926 33.239222999999996 -114.68692 33.267982 -114.676903 33.305676000000005 -114.734634 33.352385999999996 -114.702812 33.41103 -114.724144 33.41908599999999 -114.644302 33.439396 -114.629784 33.468571 -114.6203 33.486098999999996 -114.597298 33.509418 -114.586273 33.560047 -114.528633 33.580482 -114.539459 33.622112 -114.526382 33.665482 -114.524475 33.68271300000001 -114.535645 33.708347 -114.494888 33.743179 -114.509499 33.771694 -114.503769 33.826012000000006 -114.520332 33.84194599999999 -114.510933 33.86290700000001 -114.520172 33.925017999999994 -114.497398 33.95239599999999 -114.524841 33.965046 -114.517418 34.029827 -114.428192 34.078316 -114.423241 34.102638 -114.409378 34.141281000000006 -114.322014 34.171215000000004 -114.284584 34.186206999999996 -114.234993 34.266964 -114.149132 34.272605999999996 -114.124451 34.314533 -114.133347 34.336433 -114.152634 34.36519199999999 -114.181297 34.40547599999999 -114.257057 34.41205600000001 -114.282608 34.43574099999999 -114.302078 34.454860999999994 -114.331848 34.459666999999996 -114.375717 34.477074 -114.383072 34.536552 -114.376038 34.583714 -114.408951 34.598952999999995 -114.43351 34.610885999999994 -114.421478 34.709866000000005 -114.464844 34.744750999999994 -114.497009 34.74890499999999 -114.524757 34.759952999999996 -114.541245 34.831856 -114.56942 34.87553 -114.626465 34.919498000000004 -114.629677 34.943607 -114.620209 34.99764999999999 -114.631477 34.998913 -114.62027 35.041861999999995 -114.63298 35.076057000000006 -114.594833 35.118656 -114.635109 35.133906999999994 -114.625641 35.132560999999995 -114.581818 35.140068 -114.571457 35.174347 -114.560242 35.220184 -114.558784 35.304771 -114.58709 35.358383 -114.588783 35.450768 -114.644592 35.515761999999995 -114.67141 35.546645999999996 -114.648987 35.584843000000006 -114.652328 35.61135899999999 -114.639061 35.646595000000005 -114.653259 35.656409999999994 -114.667679 35.693111 -114.664284 35.732609 -114.688011 35.764717000000005 -114.681931 35.847458 -114.689056 35.870975 -114.661652 35.880489 -114.660789 35.911629000000005 -114.698463 35.987667 -114.735397 36.036777 -114.716858 36.058773 -114.728149 36.085983 -114.727333 36.105202000000006 -114.711945 36.141987 -114.620796 36.138355000000004 -114.598122 36.155108999999996 -114.529762 36.124729 -114.465805 36.121071 -114.443138 36.151009 -114.379997 36.137496999999996 -114.34343 36.111453999999995 -114.315292 36.087124 -114.303055 36.062248 -114.306786 36.018345 -114.232674 36.017269 -114.205971 36.041743999999994 -114.128227 36.121105 -114.106979 36.193993000000006 -114.044312 36.216038 -114.036598 36.84187300000001 -114.042915 36.996562999999995 -114.043137 36.99624300000001 -112.899216 36.998008999999996 -112.541763 36.995506000000006 -112.236511 37.001720000000006 -111.355453 37.002491000000006 -110.739372 37.003929 -110.483398 36.991749 -110.451546 36.992065 -109.996399 36.996643000000006 -109.047821 35.996655000000004 -109.047195 34.954612999999995 -109.045998 34.59174 -109.048012 33.783249 -109.049721 33.205101 -109.049904 32.77948000000001 -109.050728 32.441967000000005 -109.048882 31.343348000000006 -109.045006 31.337559 -110.451942 31.335534999999993 -111.07132 31.431438 -111.368866 32.04356 -113.328377 32.487114000000005 -114.820969 32.615993 -114.808601 32.72081 -114.72126 32.734966 -114.711906 32.741378999999995 -114.693253 32.726237999999995 -114.603157 32.735839999999996 -114.602737 32.737392 -114.571175 32.748783 -114.571426 32.74889 -114.559967 32.760707999999994 -114.560799 32.760704000000004 -114.542221 32.771187 -114.542404 32.771366 -114.529312 32.788002000000006 -114.534294 32.809867999999994 -114.525436 32.845378999999994 -114.460655 32.935867 -114.475662 32.977749 -114.467606 33.027668000000006 -114.519844Arizona04MtnAZ294333.462942.7723665228.0940106.01368843.01810691.01854537.01358263.01178320.0239083.032856.01603896.0123902.0455896.0185109.00.4940.506468178.033.621021 -102.99722337.001408 -94.42833734.929050000000004 -94.439102 34.735504000000006 -94.44574 34.508326999999994 -94.452408 34.19665500000001 -94.461479 33.939198000000005 -94.468376 33.631966000000006 -94.476486 33.623047 -94.50061 33.63081 -94.510559 33.621021 -94.525055 33.643009000000006 -94.51799 33.632694 -94.550194 33.635536 -94.562149 33.642830000000004 -94.562195 33.648247 -94.541931 33.661621 -94.545418 33.652157 -94.576462 33.655449000000004 -94.588387 33.662132 -94.585159 33.66301300000001 -94.565208 33.671913 -94.560722 33.670471000000006 -94.578506 33.678982000000005 -94.585106 33.665606999999994 -94.600945 33.683899 -94.631737 33.67010500000001 -94.638763 33.663737999999995 -94.658539 33.666061 -94.669426 33.671459 -94.667953 33.67765 -94.644325 33.692291 -94.655479 33.696537000000006 -94.668457 33.69028900000001 -94.690987 33.701267 -94.741653 33.707770999999994 -94.754478 33.719048 -94.742111 33.716797 -94.762718 33.736706 -94.749771 33.733665 -94.783157 33.742267999999996 -94.782028 33.752842 -94.764175 33.75326200000001 -94.783508 33.739582 -94.803223 33.749404999999996 -94.81916 33.749320999999995 -94.85788 33.774963 -94.881638 33.789597 -94.913879 33.803478 -94.908546 33.816196000000005 -94.918236 33.81580700000001 -94.940399 33.840824 -94.939888 33.848076000000006 -94.959908 33.866215 -94.968704 33.856182000000004 -94.989281 33.869946 -95.012772 33.866451 -95.037361 33.884445 -95.042862 33.896694 -95.063141 33.917648 -95.063477 33.888462000000004 -95.083603 33.89691500000001 -95.089714 33.918453 -95.082268 33.921738000000005 -95.09536 33.91228099999999 -95.119225 33.917145000000005 -95.126678 33.940867999999995 -95.127968 33.943546 -95.148315 33.964862999999994 -95.234039 33.936443 -95.251289 33.905022 -95.250992 33.897800000000004 -95.263618 33.91793800000001 -95.277351 33.886902000000006 -95.28643 33.886623 -95.301956 33.897114 -95.336227 33.870918 -95.33004 33.865753 -95.451607 33.886433 -95.468124 33.881718000000006 -95.498856 33.897735999999995 -95.512886 33.88574199999999 -95.544037 33.893158 -95.547493 33.897816000000006 -95.526733 33.906643 -95.519577 33.904033999999996 -95.546318 33.93607299999999 -95.562775 33.944553 -95.606071 33.936690999999996 -95.61483 33.920238 -95.612984 33.92010500000001 -95.633492 33.894825 -95.699707 33.903397 -95.746864 33.89344 -95.760696 33.87900500000001 -95.764252 33.85140199999999 -95.768517 33.864673999999994 -95.795479 33.843025 -95.825974 33.841038 -95.846558 33.89053 -95.933075 33.889973 -95.943069 33.86503999999999 -95.958763 33.857952 -95.977394 33.875378 -95.994209 33.87339 -96.002617 33.856978999999995 -96.001793 33.844207999999995 -96.014069 33.856021999999996 -96.026749 33.841278 -96.047974 33.844578 -96.091522 33.829257999999996 -96.109444 33.835589999999996 -96.148964 33.828982999999994 -96.169205 33.815792 -96.183128 33.808434000000005 -96.180725 33.823944 -96.154518 33.820319999999995 -96.141418 33.798229000000006 -96.161316 33.769356 -96.168816 33.758583 -96.187027 33.756691000000004 -96.212547 33.773388 -96.278076 33.761932 -96.28968 33.71405 -96.300789 33.701801 -96.316277 33.705528 -96.347588 33.74039500000001 -96.370819 33.788326 -96.419464 33.778130000000004 -96.487373 33.78809 -96.500748 33.815685 -96.510574 33.825419999999994 -96.562134 33.842957 -96.601196 33.862899999999996 -96.614166 33.896145000000004 -96.584488 33.913544 -96.666237 33.904324 -96.677704 33.847904 -96.693382 33.833870000000005 -96.711678 33.831738 -96.748825 33.869949000000005 -96.797592 33.871769 -96.814117 33.858031999999994 -96.844009 33.861678999999995 -96.861015 33.88400300000001 -96.878937 33.92459100000001 -96.882851 33.950027000000006 -96.898453 33.961772999999994 -96.929565 33.947849000000005 -96.936203 33.937321 -96.968185 33.944202000000004 -96.987862 33.876423 -96.987709 33.85051300000001 -97.005852 33.840560999999994 -97.025597 33.856728000000004 -97.0709 33.851101 -97.082176 33.837811 -97.078247 33.823448 -97.050026 33.807570999999996 -97.087669 33.742413 -97.083466 33.731669999999994 -97.0905 33.725933 -97.115562 33.728668 -97.152473 33.752769 -97.189163 33.819649 -97.208321 33.836158999999995 -97.195015 33.84779399999999 -97.168594 33.863147999999995 -97.164169 33.899204 -97.187767 33.905688999999995 -97.211334 33.894238 -97.246063 33.87297100000001 -97.250687 33.858729999999994 -97.263908 33.872574 -97.272278 33.89584000000001 -97.314087 33.870391999999995 -97.314957 33.861915999999994 -97.341805 33.831024 -97.363319 33.820708999999994 -97.410118 33.836212 -97.452736 33.890429999999995 -97.457062 33.902382 -97.462761 33.907707 -97.477531 33.916771 -97.518204 33.903904 -97.554588 33.902530999999996 -97.575668 33.917885 -97.592354 33.969437 -97.600182 33.988613 -97.671066 33.971546000000004 -97.704262 33.939293000000006 -97.729019 33.932097999999996 -97.756363 33.890457 -97.790207 33.857071000000005 -97.852547 33.855114 -97.869751 33.874022999999994 -97.909065 33.883480000000006 -97.954735 33.90250399999999 -97.976379 33.912052 -97.976128 33.932518 -97.950684 33.94865 -97.962997 33.959751 -97.947754 33.971160999999995 -97.950226 34.00128599999999 -97.982681 33.98698400000001 -98.023491 33.989799000000005 -98.055557 34.005314 -98.086205 34.06982000000001 -98.110687 34.134556 -98.094124 34.148987000000005 -98.114868 34.138431999999995 -98.136864 34.115368000000004 -98.172844 34.122871 -98.277 34.13942 -98.320488 34.142120000000006 -98.350403 34.11578 -98.384254 34.087231 -98.390953 34.082454999999996 -98.407135 34.065830000000005 -98.421341 34.05437499999999 -98.448189 34.066413999999995 -98.499519 34.105335 -98.557579 34.14193 -98.576332 34.151398 -98.607246 34.158435999999995 -98.625992 34.147037999999995 -98.66172 34.149998 -98.682213 34.130714 -98.705292 34.131962 -98.778534 34.145934999999994 -98.811066 34.16082 -98.891342 34.194565 -98.952507 34.209496 -98.996193 34.198921 -99.035217 34.208359 -99.07843 34.201469 -99.127945 34.21272999999999 -99.176155 34.223736 -99.190483 34.255646 -99.204597 34.305122 -99.196304 34.331993 -99.20549 34.368213999999995 -99.254105 34.398285 -99.267174 34.412707999999995 -99.323296 34.450194999999994 -99.364204 34.428993000000006 -99.392792 34.396744 -99.394157 34.369106 -99.409958 34.364704 -99.438377 34.383522 -99.479439 34.404067999999995 -99.502136 34.41518000000001 -99.553864 34.408913 -99.57785 34.384857 -99.58522 34.368556999999996 -99.601448 34.377444999999994 -99.684906 34.443993000000006 -99.777687 34.501778 -99.829933 34.518626999999995 -99.860573 34.548176 -99.8806 34.579109 -99.931908 34.579571 -99.94474 34.561863 -99.972099 34.562321 -99.996094 34.747185 -99.998878 35.030998 -99.996071 35.182182 -99.997185 35.424572 -99.994354 35.618809 -100.0 35.883793 -99.997726 36.057548999999995 -99.997154 36.492519 -100.001144 36.493877 -100.006866 36.48944899999999 -100.549416 36.489609 -100.956909 36.488022 -101.089668 36.492003999999994 -101.620316 36.492954 -102.03421 36.490207999999996 -102.165222 36.492344 -102.996918 36.998504999999994 -102.997223 36.988972000000004 -102.036758 36.988853000000006 -102.024071 36.996666000000005 -101.553238 36.99744 -101.071159 36.996635 -100.950142 36.997806999999995 -100.633812 36.997623000000004 -100.088158 36.995388000000005 -99.998848 36.995434 -99.544243 36.99453 -99.43708 36.998042999999996 -98.999138 36.99834799999999 -98.539864 36.999035000000006 -98.346794 36.998645999999994 -98.104187 36.998543 -97.803917 36.996441000000004 -97.46508 36.999779000000004 -97.137375 37.000134 -96.74839 37.000538000000006 -96.518898 36.998264000000006 -96.005791 37.000011 -95.957703 36.998035 -95.785492 37.000938000000005 -95.525764 37.000538000000006 -95.406372 37.001408 -95.071693 37.00071 -95.032509 36.996983 -94.620155 36.763538 -94.62146 36.670471000000006 -94.62085 36.489338000000004 -94.617035 36.478714 -94.607231 36.164444 -94.552895 36.106753999999995 -94.542198 35.760227 -94.485718 35.641003 -94.468269 35.400454999999994 -94.428337 34.929050000000004 -94.439102Oklahoma40W S CenOK177877.5363170.9983145585.0855321.01206135.01530819.01614766.01146497.01078894.0190902.07817.01369138.0100931.0405802.0205601.00.4870.513528722.033.881992 -84.32385336.589648999999994 -75.45697834.989067000000006 -83.988548 34.988224 -84.11824 34.98900999999999 -84.323853 35.210544999999996 -84.291039 35.261604000000005 -84.225945 35.24099 -84.179726 35.245552 -84.101646 35.272575 -84.042778 35.292522000000005 -84.030861 35.32529100000001 -84.029205 35.37286 -84.00631 35.407623 -84.01265 35.45546 -83.954704 35.476479 -83.910011 35.510586 -83.881226 35.519062000000005 -83.8302 35.552605 -83.775879 35.564972 -83.672874 35.571738999999994 -83.613861 35.555176 -83.561035 35.559551 -83.505798 35.597279 -83.45829 35.625217000000006 -83.387093 35.653259000000006 -83.343025 35.65632600000001 -83.298416 35.691010000000006 -83.259125 35.700706 -83.253304 35.718216 -83.243851 35.728886 -83.185349 35.76268399999999 -83.143661 35.763808999999995 -83.118187 35.782578 -83.059959 35.773990999999995 -82.987007 35.791850999999994 -82.962753 35.872215 -82.906822 35.927868000000004 -82.91407 35.948359999999994 -82.895973 35.94742599999999 -82.85627 35.920872 -82.80867 35.956573000000006 -82.776443 35.987503000000004 -82.773598 35.999545999999995 -82.763229 36.051722999999996 -82.64389 36.054339999999996 -82.628044 36.042987999999994 -82.604401 36.022448999999995 -82.592232 36.003547999999995 -82.605804 35.963299000000006 -82.599304 35.956108 -82.554146 35.972542000000004 -82.506935 35.993176000000005 -82.475197 36.075317 -82.408424 36.098698 -82.373856 36.122150000000005 -82.311928 36.120377000000005 -82.262306 36.147014999999996 -82.207733 36.139622 -82.154053 36.096256 -82.11808 36.100139999999996 -82.077759 36.129711 -82.020454 36.263321000000005 -81.933113 36.290752 -81.911156 36.334655999999995 -81.830574 36.329342 -81.730492 36.333725 -81.709457 36.361858 -81.740379 36.391785 -81.741074 36.471779 -81.69828 36.519341 -81.702797 36.589648999999994 -81.669998 36.57286499999999 -81.345299 36.565212 -80.903442 36.563438000000005 -80.838158 36.557297000000005 -80.611053 36.551044000000005 -80.43531 36.547134 -80.048096 36.545024999999995 -80.024055 36.547889999999995 -79.717445 36.547657 -79.5103 36.54978199999999 -79.217064 36.546059 -79.144325 36.543533 -78.7967 36.546074000000004 -78.737389 36.541481000000005 -78.458809 36.545531999999994 -78.321251 36.552475 -78.051666 36.552944 -77.898857 36.553439999999995 -77.763931 36.553917 -77.320053 36.556286 -77.177353 36.554146 -76.924133 36.554157000000004 -76.921631 36.555251999999996 -76.563583 36.555813 -76.497559 36.556056999999996 -76.330254 36.557163 -76.127396 36.55695299999999 -76.045959 36.514374000000004 -76.033211 36.503567000000004 -76.091064 36.43621400000001 -75.976074 36.415119000000004 -75.969765 36.418915 -76.00161 36.365471 -75.951256 36.423244 -75.928123 36.350948 -75.924591 36.112815999999995 -75.800056 36.072818999999996 -75.798851 36.105667 -75.855164 36.244800999999995 -75.913765 36.25945299999999 -75.957512 36.294337999999996 -75.941933 36.31959500000001 -76.008972 36.193771 -75.957184 36.169726999999995 -75.981339 36.315239000000005 -76.183167 36.296608000000006 -76.218903 36.174419 -76.112709 36.14769 -76.141937 36.163360999999995 -76.234978 36.21423 -76.298927 36.110371 -76.275505 36.079792 -76.48053 36.058605 -76.420425 36.00716799999999 -76.52301 36.010132 -76.594002 36.065708 -76.649017 36.037116999999995 -76.633209 36.04961 -76.690155 36.156822000000005 -76.726509 36.294518 -76.688736 36.358329999999995 -76.776642 36.392444999999995 -76.92408 36.315166000000005 -76.741348 36.266132 -76.707497 36.233917000000005 -76.745064 36.144592 -76.760674 35.99297 -76.693764 35.936626000000004 -76.741127 35.94154399999999 -76.69722 35.977467000000004 -76.40947 35.932343 -76.371483 35.97687500000001 -76.213768 35.962914 -76.089638 35.920424999999994 -76.026047 35.75680199999999 -76.075912 35.683848999999995 -76.043068 35.696842000000004 -76.167305 35.663639 -76.104744 35.669094 -76.02121 35.892708 -75.987854 35.923519 -75.818054 35.869339 -75.748962 35.665172999999996 -75.72937 35.578686000000005 -75.779053 35.631268000000006 -75.891495 35.414604 -76.052979 35.341533999999996 -76.181618 35.416218 -76.498802 35.450199 -76.533752 35.504425 -76.458435 35.550865 -76.446526 35.57764400000001 -76.518944 35.541786 -76.492538 35.520336 -76.638199 35.43789700000001 -76.628769 35.411934 -76.705376 35.550186 -77.103767 35.43650100000001 -76.983185 35.350426 -76.694901 35.272919 -76.614517 35.312079999999995 -76.591209 35.303687999999994 -76.540977 35.248768 -76.507126 35.172520000000006 -76.640091 35.138560999999996 -76.605225 35.064350000000005 -76.624222 35.024086 -76.678009 34.98222 -76.849464 35.027428 -76.94149 35.07003400000001 -76.943245 35.092155000000005 -77.047882 35.087986 -77.104675 35.066036 -77.110588 35.052887 -77.00119 34.93647 -76.913109 34.906334 -76.647049 34.969997000000006 -76.670059 34.974636000000004 -76.529778 35.016659000000004 -76.44503 34.946247 -76.424057 34.943111 -76.364014 34.975956 -76.329407 34.948814 -76.314713 34.785061 -76.469902 34.719753 -76.625313 34.698916999999994 -77.050529 34.764331999999996 -77.148956 34.684914000000006 -77.129395 34.660636999999994 -77.156601 34.457008 -77.538635 34.420936999999995 -77.586761 34.43504299999999 -77.609726 34.412628 -77.602615 34.305046000000004 -77.750526 34.192738000000006 -77.864388 34.06918 -77.894402 34.062034999999995 -77.926758 34.189243000000005 -77.960732 33.992580000000004 -77.958527 33.914291000000006 -78.034805 33.881992 -78.57972 33.948673 -78.655716 34.304573000000005 -79.074501 34.619061 -79.447144 34.63409 -79.455971 34.800663 -79.667503 34.805256 -79.685959 34.807919 -79.919952 34.814762 -80.325279 34.815228000000005 -80.561546 34.816113 -80.800064 34.940639000000004 -80.785652 35.00201800000001 -80.840164 35.059734000000006 -80.894714 35.10124999999999 -80.927795 35.037200999999996 -81.039886 35.066483000000005 -81.065552 35.105408 -81.028442 35.132011000000006 -81.049042 35.151531000000006 -81.049301 35.163757000000004 -81.322823 35.162853 -81.362175 35.182472000000004 -81.765358 35.183116999999996 -81.87059 35.188282 -81.971443 35.193127000000004 -82.210175 35.195007000000004 -82.278328 35.184189 -82.32077 35.192673 -82.350861 35.182948999999994 -82.360123 35.18272399999999 -82.371376 35.208241 -82.38961 35.16955900000001 -82.43792 35.173500000000004 -82.466743 35.154560000000004 -82.524635 35.14949 -82.57003 35.119457 -82.654495 35.121464 -82.68605 35.097801000000004 -82.688034 35.091232000000005 -82.697357 35.085423000000006 -82.771347 35.055369999999996 -82.887695 35.024204 -83.007278 35.000277999999994 -83.106285 34.992023 -83.513008 34.989536 -83.549416 34.989391 -83.937996 34.989067000000006 -83.98854836.556717000000006 -76.027168 36.556652 -75.998665 36.54253 -75.911919 36.47397599999999 -75.924805 36.478016 -75.97728 36.517925000000005 -75.976288 36.556717000000006 -76.02716836.556197999999995 -75.901985 36.555874 -75.878166 36.22925600000001 -75.773155 35.788360999999995 -75.544968 36.049862000000005 -75.702736 36.050323000000006 -75.740868 36.225193000000004 -75.783173 36.556197999999995 -75.90198535.670497999999995 -75.491219 35.768856 -75.533623 35.617397 -75.456978 35.227917000000005 -75.526299 35.189826999999994 -75.74929 35.234989 -75.691566 35.281357 -75.521484 35.564494999999994 -75.475418 35.670497999999995 -75.49121935.069435 -76.017006 35.116184000000004 -75.975693 35.167282 -75.853935 35.192284 -75.763702 35.164021000000005 -75.811539 35.132492 -75.903946 35.069435 -76.002876 35.069435 -76.01700634.58783 -76.544273 34.61066099999999 -76.555145 34.613922 -76.53775 34.697632 -76.484482 34.760684999999995 -76.432297 34.812870000000004 -76.37468 34.87701 -76.287704 34.693282999999994 -76.469261 34.58783 -76.544273North Carolina37S AtlNC126177.63510309.6526628629.01812051.02517024.03214286.03414343.02484061.02527980.0529828.033902.03238414.0163081.0883563.0701142.00.4850.5151013599.034.988682 -90.30535136.67963 -81.65243535.45546 -83.954704 35.407623 -84.01265 35.37286 -84.00631 35.32529100000001 -84.029205 35.292522000000005 -84.030861 35.272575 -84.042778 35.245552 -84.101646 35.24099 -84.179726 35.261604000000005 -84.225945 35.210544999999996 -84.291039 34.98900999999999 -84.323853 34.988682 -84.618752 34.990680999999995 -84.771194 34.992756 -84.800476 34.99260700000001 -84.967911 34.992554 -84.972847 34.989075 -85.267761 34.989902 -85.359985 34.990047000000004 -85.467422 34.990086000000005 -85.608994 34.992301999999995 -85.869591 34.995377000000005 -86.303513 34.995186000000004 -86.313065 34.99699 -86.782372 34.998160999999996 -86.83342 35.00787699999999 -87.207573 35.007262999999995 -87.222748 35.010464 -87.607788 35.015949000000006 -87.986046 35.013458 -88.194923 35.004368 -88.193954 35.00374600000001 -88.351685 35.004954999999995 -88.383102 35.003094000000004 -88.784988 35.00235000000001 -88.812492 35.000145 -89.006134 35.000793 -89.198067 34.999714 -89.3423 35.000641 -89.646477 34.999168 -89.717186 35.000693999999996 -90.305351 35.048458 -90.291809 35.040897 -90.195709 35.077827 -90.169083 35.10864599999999 -90.178345 35.129611999999995 -90.164474 35.13653600000001 -90.14373 35.12505 -90.082924 35.147385 -90.064537 35.166916 -90.062431 35.191833 -90.073303 35.212738 -90.068962 35.254397999999995 -90.090103 35.263847 -90.105942 35.264056999999994 -90.152122 35.282566 -90.169746 35.30624400000001 -90.15699 35.314685999999995 -90.106346 35.345591999999996 -90.098701 35.365982 -90.105621 35.381508 -90.087135 35.406527999999994 -90.075478 35.418282000000005 -90.085159 35.41768999999999 -90.112244 35.4076 -90.132469 35.383044999999996 -90.140167 35.384254 -90.167816 35.423716999999996 -90.172676 35.442524000000006 -90.137276 35.473568 -90.101959 35.478207 -90.08223 35.472342999999995 -90.074844 35.426506 -90.073936 35.41341 -90.060295 35.417103 -90.046783 35.445454 -89.999565 35.51244 -90.041817 35.542846999999995 -90.040901 35.552414 -90.033051 35.561676000000006 -89.989586 35.532291 -89.962273 35.526900999999995 -89.947548 35.52923199999999 -89.931175 35.546059 -89.921661 35.578593999999995 -89.958031 35.603104 -89.957047 35.633335 -89.877441 35.629745 -89.863838 35.645222000000004 -89.849197 35.671062000000006 -89.857246 35.673306 -89.865181 35.655972000000006 -89.893402 35.676266 -89.929741 35.712486 -89.952034 35.734268 -89.951035 35.754836999999995 -89.909782 35.748192 -89.859871 35.758269999999996 -89.827042 35.774223000000006 -89.799904 35.805553 -89.790382 35.817420999999996 -89.759796 35.807036999999994 -89.735939 35.827515000000005 -89.700829 35.842037000000005 -89.701439 35.871418000000006 -89.757713 35.884102 -89.766273 35.896812 -89.762909 35.915012000000004 -89.737976 35.911427 -89.714684 35.885647000000006 -89.66465 35.894287000000006 -89.649338 35.913799 -89.645401 35.93782 -89.664192 35.966324 -89.713135 35.999877999999995 -89.721756 36.025795 -89.688843 36.08297 -89.678169 36.099316 -89.667389 36.129791 -89.589424 36.15201999999999 -89.589455 36.18374300000001 -89.618561 36.220867 -89.676788 36.240795000000006 -89.695656 36.25213599999999 -89.694542 36.25489399999999 -89.670586 36.240898 -89.61808 36.257278 -89.541649 36.264538 -89.535378 36.280865000000006 -89.542236 36.308037 -89.606766 36.334782000000004 -89.622795 36.354752000000005 -89.60569 36.345721999999995 -89.544556 36.35593 -89.519333 36.401058000000006 -89.520004 36.440960000000004 -89.545181 36.47180899999999 -89.516022 36.498108 -89.533195 36.498547 -89.475822 36.465462 -89.491989 36.445953 -89.470833 36.456379 -89.448517 36.502617 -89.414711 36.502548000000004 -89.346596 36.499793999999994 -88.830315 36.499847 -88.826302 36.498985000000005 -88.810661 36.499489 -88.512634 36.498149999999995 -88.495979 36.496517 -88.042732 36.538146999999995 -88.035049 36.582668 -88.041061 36.67963 -88.071312 36.66937299999999 -87.870689 36.64147199999999 -87.853516 36.64444 -87.693512 36.645168 -87.64064 36.649231 -87.346603 36.651264 -87.112701 36.650768 -87.068184 36.652058 -86.770538 36.655033 -86.510674 36.650890000000004 -86.415451 36.643246000000005 -86.199005 36.63306 -85.980629 36.626628999999994 -85.7855 36.618137000000004 -85.437408 36.626037999999994 -85.300133 36.625553 -85.272537 36.620914 -84.998512 36.605366000000004 -84.791115 36.605002999999996 -84.781929 36.595417 -84.256844 36.595371 -84.254555 36.592006999999995 -84.006821 36.591209000000006 -83.935677 36.584166999999994 -83.695694 36.598620999999994 -83.675262 36.598755 -83.464302 36.60038 -83.275131 36.589848 -83.248489 36.588001000000006 -83.211029 36.591198000000006 -82.986809 36.590946 -82.849937 36.591446000000005 -82.610962 36.591697999999994 -82.296997 36.593967000000006 -82.216805 36.595043000000004 -82.154327 36.595837 -81.929459 36.613495 -81.918449 36.611481 -81.829056 36.607555000000005 -81.652435 36.589648999999994 -81.669998 36.519341 -81.702797 36.471779 -81.69828 36.391785 -81.741074 36.361858 -81.740379 36.333725 -81.709457 36.329342 -81.730492 36.334655999999995 -81.830574 36.290752 -81.911156 36.263321000000005 -81.933113 36.129711 -82.020454 36.100139999999996 -82.077759 36.096256 -82.11808 36.139622 -82.154053 36.147014999999996 -82.207733 36.120377000000005 -82.262306 36.122150000000005 -82.311928 36.098698 -82.373856 36.075317 -82.408424 35.993176000000005 -82.475197 35.972542000000004 -82.506935 35.956108 -82.554146 35.963299000000006 -82.599304 36.003547999999995 -82.605804 36.022448999999995 -82.592232 36.042987999999994 -82.604401 36.054339999999996 -82.628044 36.051722999999996 -82.64389 35.999545999999995 -82.763229 35.987503000000004 -82.773598 35.956573000000006 -82.776443 35.920872 -82.80867 35.94742599999999 -82.85627 35.948359999999994 -82.895973 35.927868000000004 -82.91407 35.872215 -82.906822 35.791850999999994 -82.962753 35.773990999999995 -82.987007 35.782578 -83.059959 35.763808999999995 -83.118187 35.76268399999999 -83.143661 35.728886 -83.185349 35.718216 -83.243851 35.700706 -83.253304 35.691010000000006 -83.259125 35.65632600000001 -83.298416 35.653259000000006 -83.343025 35.625217000000006 -83.387093 35.597279 -83.45829 35.559551 -83.505798 35.555176 -83.561035 35.571738999999994 -83.613861 35.564972 -83.672874 35.552605 -83.775879 35.519062000000005 -83.8302 35.510586 -83.881226 35.476479 -83.910011 35.45546 -83.954704Tennessee47E S CenTN105823.5672311.5564829958.01334052.01835272.02326184.02503774.01777371.01747015.0321170.029542.02230659.0152128.0596400.0456189.00.4820.518736654.025.845197999999996 -106.64951336.493877 -93.50721731.393817999999996 -105.99836 31.478127999999998 -106.212753 31.733762999999996 -106.383041 31.786198 -106.538971 31.817728000000002 -106.614441 31.844634999999997 -106.615578 31.895101999999994 -106.643532 31.913998000000007 -106.633202 31.972117999999995 -106.632057 31.980227999999997 -106.649513 32.00098800000001 -106.623077 32.000645000000006 -106.377846 32.001553 -106.002708 32.004268999999994 -104.921799 32.003151 -104.850563 32.007278 -104.018814 32.005889999999994 -103.980896 32.00610399999999 -103.728973 32.004154 -103.332092 32.001900000000006 -103.057968 32.084995000000006 -103.055191 32.515429999999995 -103.059547 32.95353299999999 -103.048836 33.377728000000005 -103.042603 33.565742 -103.038239 33.826088 -103.032761 34.307743 -103.029144 34.745266 -103.022156 34.964718000000005 -103.02475 35.17720799999999 -103.02565 35.623604 -103.021797 35.742287000000005 -103.022118 36.056026 -103.02356 36.491566000000006 -103.026802 36.492344 -102.996918 36.490207999999996 -102.165222 36.492954 -102.03421 36.492003999999994 -101.620316 36.488022 -101.089668 36.489609 -100.956909 36.48944899999999 -100.549416 36.493877 -100.006866 36.492519 -100.001144 36.057548999999995 -99.997154 35.883793 -99.997726 35.618809 -100.0 35.424572 -99.994354 35.182182 -99.997185 35.030998 -99.996071 34.747185 -99.998878 34.562321 -99.996094 34.561863 -99.972099 34.579571 -99.94474 34.579109 -99.931908 34.548176 -99.8806 34.518626999999995 -99.860573 34.501778 -99.829933 34.443993000000006 -99.777687 34.377444999999994 -99.684906 34.368556999999996 -99.601448 34.384857 -99.58522 34.408913 -99.57785 34.41518000000001 -99.553864 34.404067999999995 -99.502136 34.383522 -99.479439 34.364704 -99.438377 34.369106 -99.409958 34.396744 -99.394157 34.428993000000006 -99.392792 34.450194999999994 -99.364204 34.412707999999995 -99.323296 34.398285 -99.267174 34.368213999999995 -99.254105 34.331993 -99.20549 34.305122 -99.196304 34.255646 -99.204597 34.223736 -99.190483 34.21272999999999 -99.176155 34.201469 -99.127945 34.208359 -99.07843 34.198921 -99.035217 34.209496 -98.996193 34.194565 -98.952507 34.16082 -98.891342 34.145934999999994 -98.811066 34.131962 -98.778534 34.130714 -98.705292 34.149998 -98.682213 34.147037999999995 -98.66172 34.158435999999995 -98.625992 34.151398 -98.607246 34.14193 -98.576332 34.105335 -98.557579 34.066413999999995 -98.499519 34.05437499999999 -98.448189 34.065830000000005 -98.421341 34.082454999999996 -98.407135 34.087231 -98.390953 34.11578 -98.384254 34.142120000000006 -98.350403 34.13942 -98.320488 34.122871 -98.277 34.115368000000004 -98.172844 34.138431999999995 -98.136864 34.148987000000005 -98.114868 34.134556 -98.094124 34.06982000000001 -98.110687 34.005314 -98.086205 33.989799000000005 -98.055557 33.98698400000001 -98.023491 34.00128599999999 -97.982681 33.971160999999995 -97.950226 33.959751 -97.947754 33.94865 -97.962997 33.932518 -97.950684 33.912052 -97.976128 33.90250399999999 -97.976379 33.883480000000006 -97.954735 33.874022999999994 -97.909065 33.855114 -97.869751 33.857071000000005 -97.852547 33.890457 -97.790207 33.932097999999996 -97.756363 33.939293000000006 -97.729019 33.971546000000004 -97.704262 33.988613 -97.671066 33.969437 -97.600182 33.917885 -97.592354 33.902530999999996 -97.575668 33.903904 -97.554588 33.916771 -97.518204 33.907707 -97.477531 33.902382 -97.462761 33.890429999999995 -97.457062 33.836212 -97.452736 33.820708999999994 -97.410118 33.831024 -97.363319 33.861915999999994 -97.341805 33.870391999999995 -97.314957 33.89584000000001 -97.314087 33.872574 -97.272278 33.858729999999994 -97.263908 33.87297100000001 -97.250687 33.894238 -97.246063 33.905688999999995 -97.211334 33.899204 -97.187767 33.863147999999995 -97.164169 33.84779399999999 -97.168594 33.836158999999995 -97.195015 33.819649 -97.208321 33.752769 -97.189163 33.728668 -97.152473 33.725933 -97.115562 33.731669999999994 -97.0905 33.742413 -97.083466 33.807570999999996 -97.087669 33.823448 -97.050026 33.837811 -97.078247 33.851101 -97.082176 33.856728000000004 -97.0709 33.840560999999994 -97.025597 33.85051300000001 -97.005852 33.876423 -96.987709 33.944202000000004 -96.987862 33.937321 -96.968185 33.947849000000005 -96.936203 33.961772999999994 -96.929565 33.950027000000006 -96.898453 33.92459100000001 -96.882851 33.88400300000001 -96.878937 33.861678999999995 -96.861015 33.858031999999994 -96.844009 33.871769 -96.814117 33.869949000000005 -96.797592 33.831738 -96.748825 33.833870000000005 -96.711678 33.847904 -96.693382 33.904324 -96.677704 33.913544 -96.666237 33.896145000000004 -96.584488 33.862899999999996 -96.614166 33.842957 -96.601196 33.825419999999994 -96.562134 33.815685 -96.510574 33.78809 -96.500748 33.778130000000004 -96.487373 33.788326 -96.419464 33.74039500000001 -96.370819 33.705528 -96.347588 33.701801 -96.316277 33.71405 -96.300789 33.761932 -96.28968 33.773388 -96.278076 33.756691000000004 -96.212547 33.758583 -96.187027 33.769356 -96.168816 33.798229000000006 -96.161316 33.820319999999995 -96.141418 33.823944 -96.154518 33.808434000000005 -96.180725 33.815792 -96.183128 33.828982999999994 -96.169205 33.835589999999996 -96.148964 33.829257999999996 -96.109444 33.844578 -96.091522 33.841278 -96.047974 33.856021999999996 -96.026749 33.844207999999995 -96.014069 33.856978999999995 -96.001793 33.87339 -96.002617 33.875378 -95.994209 33.857952 -95.977394 33.86503999999999 -95.958763 33.889973 -95.943069 33.89053 -95.933075 33.841038 -95.846558 33.843025 -95.825974 33.864673999999994 -95.795479 33.85140199999999 -95.768517 33.87900500000001 -95.764252 33.89344 -95.760696 33.903397 -95.746864 33.894825 -95.699707 33.92010500000001 -95.633492 33.920238 -95.612984 33.936690999999996 -95.61483 33.944553 -95.606071 33.93607299999999 -95.562775 33.904033999999996 -95.546318 33.906643 -95.519577 33.897816000000006 -95.526733 33.893158 -95.547493 33.88574199999999 -95.544037 33.897735999999995 -95.512886 33.881718000000006 -95.498856 33.886433 -95.468124 33.865753 -95.451607 33.870918 -95.33004 33.897114 -95.336227 33.886623 -95.301956 33.886902000000006 -95.28643 33.91793800000001 -95.277351 33.897800000000004 -95.263618 33.905022 -95.250992 33.936443 -95.251289 33.964862999999994 -95.234039 33.943546 -95.148315 33.940867999999995 -95.127968 33.917145000000005 -95.126678 33.91228099999999 -95.119225 33.921738000000005 -95.09536 33.918453 -95.082268 33.89691500000001 -95.089714 33.888462000000004 -95.083603 33.917648 -95.063477 33.896694 -95.063141 33.884445 -95.042862 33.866451 -95.037361 33.869946 -95.012772 33.856182000000004 -94.989281 33.866215 -94.968704 33.848076000000006 -94.959908 33.840824 -94.939888 33.81580700000001 -94.940399 33.816196000000005 -94.918236 33.803478 -94.908546 33.789597 -94.913879 33.774963 -94.881638 33.749320999999995 -94.85788 33.749404999999996 -94.81916 33.739582 -94.803223 33.75326200000001 -94.783508 33.752842 -94.764175 33.742267999999996 -94.782028 33.733665 -94.783157 33.736706 -94.749771 33.716797 -94.762718 33.719048 -94.742111 33.707770999999994 -94.754478 33.701267 -94.741653 33.69028900000001 -94.690987 33.696537000000006 -94.668457 33.692291 -94.655479 33.67765 -94.644325 33.671459 -94.667953 33.666061 -94.669426 33.663737999999995 -94.658539 33.67010500000001 -94.638763 33.683899 -94.631737 33.665606999999994 -94.600945 33.678982000000005 -94.585106 33.670471000000006 -94.578506 33.671913 -94.560722 33.66301300000001 -94.565208 33.662132 -94.585159 33.655449000000004 -94.588387 33.652157 -94.576462 33.661621 -94.545418 33.648247 -94.541931 33.642830000000004 -94.562195 33.635536 -94.562149 33.632694 -94.550194 33.643009000000006 -94.51799 33.621021 -94.525055 33.63081 -94.510559 33.623047 -94.50061 33.631966000000006 -94.476486 33.636444 -94.435913 33.616844 -94.436333 33.604347000000004 -94.451553 33.596503999999996 -94.443329 33.59714099999999 -94.428467 33.573486 -94.40657 33.57495900000001 -94.393417 33.593327 -94.379112 33.590042 -94.370628 33.572661999999994 -94.372307 33.560303000000005 -94.395264 33.547684000000004 -94.370758 33.57313499999999 -94.328751 33.556934 -94.302383 33.579853 -94.29882 33.589332999999996 -94.278984 33.584605999999994 -94.272079 33.561736999999994 -94.274544 33.592422 -94.237236 33.585719999999995 -94.223038 33.561535000000006 -94.235367 33.557987 -94.210884 33.58507899999999 -94.205345 33.593773 -94.159515 33.567085000000006 -94.155167 33.572998 -94.098701 33.583954000000006 -94.086655 33.577213 -94.061432 33.555912000000006 -94.035927 33.270325 -94.036507 33.023289000000005 -94.03875 32.882346999999996 -94.041603 32.694812999999996 -94.040199 32.389224999999996 -94.035233 32.199448000000004 -94.034767 31.994512999999998 -94.035065 31.989134000000007 -94.009888 31.977942 -94.004395 31.946158999999994 -93.977211 31.923164 -93.969986 31.909456000000006 -93.93573 31.909701999999996 -93.917923 31.892593000000005 -93.923462 31.894454999999994 -93.899261 31.870065999999994 -93.892525 31.87142 -93.881264 31.850112999999993 -93.877403 31.817272000000003 -93.864822 31.802017000000006 -93.834328 31.774637 -93.822067 31.753281 -93.831161 31.730351999999996 -93.80999 31.712350999999998 -93.814949 31.707565000000002 -93.808769 31.711394999999996 -93.792267 31.674566 -93.811844 31.653767000000002 -93.806427 31.647965999999997 -93.814728 31.618092000000004 -93.819588 31.615189 -93.835579 31.590182999999996 -93.832619 31.577110000000005 -93.816322 31.559062999999995 -93.810516 31.533734999999993 -93.780128 31.530724000000006 -93.763306 31.537717999999998 -93.747543 31.521877000000003 -93.731659 31.520568999999995 -93.705795 31.495402999999996 -93.718994 31.490556999999995 -93.750435 31.485500000000002 -93.751244 31.459474999999998 -93.726784 31.461457999999993 -93.698418 31.446251000000004 -93.701927 31.438131 -93.687004 31.427735999999996 -93.696129 31.415921999999995 -93.694443 31.406130000000005 -93.687492 31.398329000000004 -93.664017 31.372394999999997 -93.661072 31.373827000000006 -93.634857 31.328385999999995 -93.67704 31.312679000000003 -93.681587 31.286671 -93.656128 31.290262 -93.645592 31.273903000000004 -93.630829 31.275805000000005 -93.616455 31.270032999999998 -93.611877 31.242188 -93.611 31.229687 -93.590546 31.199066000000002 -93.602921 31.180199 -93.593941 31.17214 -93.576942 31.190928999999997 -93.550591 31.185773999999995 -93.528923 31.178076000000004 -93.526932 31.176339999999996 -93.537018 31.162943 -93.528328 31.159166 -93.544189 31.132441 -93.537506 31.125924999999995 -93.528091 31.116072000000003 -93.535088 31.109342999999996 -93.556679 31.100536000000005 -93.559982 31.094751000000002 -93.543121 31.082373000000004 -93.544106 31.074670999999995 -93.516998 31.056979999999996 -93.525742 31.038908000000006 -93.507217 31.014140999999995 -93.547119 31.018062999999998 -93.564941 31.012923999999998 -93.567894 30.997270999999998 -93.570847 30.991690000000006 -93.560951 30.976177000000007 -93.572456 30.970190000000002 -93.548676 30.956884000000002 -93.537338 30.960731999999993 -93.532188 30.935820000000007 -93.52562 30.926970999999995 -93.529984 30.924885000000003 -93.549622 30.905333999999996 -93.546516 30.901932000000002 -93.564476 30.886234 -93.568497 30.871880000000004 -93.560844 30.860282999999995 -93.552803 30.845147999999995 -93.566444 30.842342000000002 -93.555641 30.828344 -93.550682 30.802040000000005 -93.581871 30.772183999999996 -93.585175 30.745789000000002 -93.618454 30.732010000000002 -93.607651 30.732547999999994 -93.61779 30.710329 -93.612411 30.686802 -93.617607 30.672859000000003 -93.659988 30.639691999999997 -93.677971 30.640040999999997 -93.692879 30.623424999999997 -93.684586 30.615795000000006 -93.692696 30.597831999999997 -93.671585 30.598834999999994 -93.69342 30.587379 -93.717812 30.568152999999995 -93.71788 30.545517000000004 -93.735306 30.522858 -93.70546 30.505114000000006 -93.714638 30.496240999999998 -93.707275 30.488628000000006 -93.714851 30.470046999999994 -93.697975 30.462513 -93.703423 30.442633 -93.696571 30.43298 -93.721535 30.408822999999998 -93.742561 30.381788 -93.754944 30.367411000000004 -93.747833 30.354145000000003 -93.759338 30.340872000000005 -93.759178 30.304916000000006 -93.729774 30.297387999999998 -93.699211 30.239372000000003 -93.707359 30.220305999999994 -93.714844 30.180860999999993 -93.704361 30.175675999999996 -93.696167 30.150807999999998 -93.699661 30.148231999999993 -93.683144 30.141253000000006 -93.685959 30.141226000000003 -93.698639 30.117929000000004 -93.696922 30.114739999999998 -93.708382 30.095669 -93.715858 30.060519999999997 -93.712479 30.005964000000006 -93.760201 29.990654000000006 -93.857277 29.964602 -93.856331 29.818363000000005 -93.951767 29.674570000000003 -93.834961 29.674076 -94.065407 29.5599 -94.356995 29.551969999999997 -94.377007 29.432905000000005 -94.682518 29.363992999999994 -94.766548 29.383261000000005 -94.785248 29.475111 -94.681915 29.533051999999998 -94.572693 29.517522999999997 -94.501282 29.556780000000003 -94.469795 29.545147 -94.510811 29.553984 -94.533699 29.578998999999996 -94.564438 29.538556999999997 -94.788086 29.658516000000006 -94.706421 29.754568000000006 -94.700279 29.792986 -94.735725 29.759856999999997 -94.829414 29.668538999999996 -94.887161 29.682209 -94.932587 29.803979999999996 -95.088264 29.711578000000003 -95.040398 29.679700999999994 -94.989334 29.559264999999996 -95.014122 29.500333999999995 -94.911156 29.460527 -94.982811 29.464681999999996 -94.943756 29.424234 -94.952507 29.420113 -94.913445 29.447823 -94.916992 29.399323999999993 -94.891136 29.370931999999996 -94.815353 29.393831000000006 -94.891472 29.308774999999997 -94.898788 29.325922000000006 -94.951134 29.195876999999996 -95.066368 29.200030999999996 -95.160522 29.117548 -95.16478 29.105222999999995 -95.197342 28.978392 -95.248405 28.803241999999997 -95.526581 28.726954000000006 -95.683029 28.752681999999993 -95.671318 28.738871000000003 -95.786354 28.690454000000003 -95.937309 28.622673000000006 -95.956146 28.718987 -95.702148 28.488386000000006 -96.206581 28.596424 -95.991646 28.653132999999997 -95.983749 28.571320999999998 -96.237587 28.597116 -96.239029 28.611231000000004 -96.157471 28.634859000000006 -96.240456 28.762671999999995 -96.151062 28.686719999999994 -96.212173 28.661724000000007 -96.285973 28.708980999999994 -96.270378 28.634089000000003 -96.326157 28.617981 -96.364159 28.670252000000005 -96.391777 28.726028 -96.392731 28.712013 -96.427086 28.755035000000007 -96.449677 28.697248000000002 -96.432259 28.719493999999997 -96.403397 28.638664000000006 -96.418785 28.610088000000005 -96.375397 28.556944 -96.491203 28.596991000000003 -96.437157 28.655933000000005 -96.454384 28.598055000000002 -96.483269 28.608181000000002 -96.511894 28.649541999999997 -96.511734 28.636267000000004 -96.570396 28.691840999999997 -96.570557 28.808173999999994 -96.572212 28.690689000000006 -96.576485 28.71736 -96.591499 28.714141999999995 -96.646515 28.679074999999997 -96.660011 28.623633999999996 -96.606705 28.558941000000004 -96.610344 28.574099000000004 -96.566704 28.506221999999994 -96.48658 28.469627000000003 -96.563194 28.460826999999995 -96.518501 28.499454 -96.476501 28.434059000000005 -96.390724 28.306263 -96.661308 28.340197000000003 -96.702362 28.395885000000007 -96.703812 28.403458 -96.740768 28.477507000000003 -96.787094 28.449640000000002 -96.823875 28.446254999999994 -96.788338 28.410911999999996 -96.759102 28.391630000000006 -96.77536 28.404996999999995 -96.853493 28.352469999999997 -96.788231 28.312859000000003 -96.78627 28.271372 -96.793335 28.229349 -96.777931 28.211447000000007 -96.803688 28.114355000000003 -96.950905 28.256798000000003 -96.91272 28.210751000000002 -96.975304 28.186770999999993 -96.941071 28.115046000000007 -96.975105 28.137398000000005 -97.033615 28.199797000000004 -97.023567 28.130426 -97.131836 28.161810000000003 -97.135414 28.159459999999996 -97.167992 28.116381000000004 -97.157059 28.064724 -97.260284 28.048653 -97.241234 28.025931999999997 -97.270294 28.04052 -97.236214 28.054266 -97.123077 28.107749999999996 -97.026405 28.020236999999995 -97.023804 27.915385999999998 -97.114624 27.812219999999996 -97.195465 27.822318999999993 -97.247025 27.831109999999995 -97.213341 27.871145 -97.283485 27.839954000000006 -97.361046 27.873177999999996 -97.345619 27.852962000000005 -97.479355 27.875468999999995 -97.496681 27.863625999999996 -97.521698 27.843243 -97.499535 27.820282000000006 -97.479813 27.831427000000005 -97.388542 27.770840000000007 -97.396561 27.712225000000004 -97.317795 27.715328 -97.34951 27.690634000000003 -97.320015 27.6408 -97.353363 27.633185999999995 -97.399216 27.631439 -97.347504 27.707863000000003 -97.309212 27.688830999999993 -97.249794 27.562320999999997 -97.331459 27.321023999999994 -97.412262 27.319667999999993 -97.500435 27.439215000000004 -97.507538 27.344100999999995 -97.528381 27.300134999999997 -97.600113 27.419666000000007 -97.750076 27.294372999999993 -97.680008 27.287719999999993 -97.784744 27.230206999999993 -97.548157 27.265133000000006 -97.427216 27.081541 -97.503502 26.996508000000006 -97.478996 26.977857999999998 -97.568565 26.846052 -97.558052 26.793780999999996 -97.495575 26.600984999999994 -97.451698 26.518225 -97.425858 26.476805 -97.474709 26.385059 -97.421188 26.35906 -97.368698 26.182449000000005 -97.353363 26.068315999999996 -97.25312 26.002274999999997 -97.276321 26.009068 -97.213097 25.954569000000006 -97.172226 25.965124000000003 -97.307144 25.938663000000005 -97.304436 25.917021000000005 -97.380989 25.845361999999994 -97.385643 25.845197999999996 -97.434349 25.933231000000006 -97.590088 25.954172 -97.574936 25.962002 -97.612923 26.023444999999995 -97.647972 26.060141 -97.867432 26.059394999999995 -98.04007 26.034626000000003 -98.076347 26.065758000000002 -98.083214 26.055375999999995 -98.200691 26.098104000000006 -98.291946 26.120895000000004 -98.271355 26.132808999999995 -98.292274 26.111647000000005 -98.327934 26.158680000000004 -98.347191 26.156031 -98.384521 26.220911 -98.453392 26.201544 -98.488518 26.260453999999996 -98.599968 26.242056000000005 -98.677917 26.375071000000005 -98.819832 26.360328999999993 -98.908897 26.395308999999997 -98.93927 26.419531000000006 -99.106728 26.488339999999994 -99.101471 26.545728999999994 -99.168678 26.579888999999994 -99.165817 26.857360999999997 -99.285522 26.94663 -99.390518 26.995549999999994 -99.392715 27.028648000000004 -99.455063 27.199197999999996 -99.437157 27.269884000000005 -99.465271 27.318652999999998 -99.543587 27.490754999999993 -99.490494 27.504284 -99.526741 27.612627000000003 -99.549187 27.661558 -99.714493 27.780107 -99.815727 27.797686 -99.874733 27.986880999999997 -99.941856 28.003460000000004 -99.993309 28.154281999999995 -100.096924 28.201935000000006 -100.214073 28.241456999999997 -100.223465 28.280354000000003 -100.29792 28.320359999999994 -100.292892 28.394182 -100.35157 28.478651 -100.37677 28.500811 -100.345802 28.544190999999998 -100.419533 28.589732999999995 -100.403175 28.660988000000003 -100.49791 28.894222 -100.58979 28.922349999999994 -100.647224 29.080072 -100.66877 29.166571000000005 -100.768608 29.242502 -100.796989 29.373255 -101.009056 29.473552999999995 -101.06736 29.526473999999993 -101.261429 29.628749999999997 -101.254585 29.580910000000003 -101.308929 29.652431000000007 -101.305862 29.657162 -101.368401 29.745434000000003 -101.4161 29.769904999999994 -101.401276 29.760586000000004 -101.448425 29.788691 -101.470467 29.763018000000002 -101.538345 29.810119999999998 -101.543953 29.765150000000006 -101.58149 29.756960000000007 -101.639671 29.787166999999997 -101.759094 29.779999000000004 -101.805206 29.814125000000004 -101.819099 29.788501999999994 -101.924225 29.818772999999993 -101.97332 29.784571 -102.063995 29.880116 -102.324333 29.845288999999994 -102.367561 29.767945999999995 -102.384796 29.785455999999996 -102.503098 29.749499999999998 -102.551949 29.778248000000005 -102.5765 29.732338 -102.637611 29.744225 -102.676361 29.530146000000002 -102.804726 29.411844000000002 -102.822205 29.353370999999996 -102.883011 29.269203000000005 -102.908325 29.229035999999994 -102.866173 29.190862999999993 -102.988098 28.978682000000006 -103.153465 29.007453999999996 -103.266586 28.986373999999998 -103.28035 29.050338999999994 -103.335518 29.032107999999994 -103.37545 29.072134000000005 -103.474075 29.146646000000004 -103.526237 29.190631999999994 -103.720314 29.230349000000004 -103.739853 29.229794999999996 -103.782158 29.281239999999997 -103.767761 29.267259999999993 -103.786995 29.328119 -104.045631 29.400715000000005 -104.164383 29.484041000000005 -104.204735 29.550611000000004 -104.377594 29.679466000000005 -104.535248 29.807935999999998 -104.57756 29.909283000000002 -104.67437 30.057302000000007 -104.696495 30.148964000000007 -104.674759 30.238489 -104.702614 30.35047 -104.813957 30.376447999999996 -104.806473 30.392263 -104.852997 30.570556999999994 -104.890678 30.641324999999995 -104.986931 30.684334000000007 -104.997543 30.687870000000004 -105.060562 30.812085999999994 -105.21434 30.797652999999997 -105.258186 30.831948999999994 -105.287598 30.816507 -105.313782 30.853081000000003 -105.390312 30.902510000000007 -105.409065 30.998284999999996 -105.554382 31.086427999999998 -105.603218 31.170779999999993 -105.76973 31.393817999999996 -105.9983629.257571999999996 -94.913429 29.342450999999997 -94.76738 29.319490000000002 -94.748405 29.096958 -95.105415 29.257571999999996 -94.91342928.345845999999995 -96.397881 28.066322 -96.834625 28.172161000000003 -96.803841 28.183535000000006 -96.738907 28.318245000000005 -96.532135 28.325832000000005 -96.463051 28.391439000000005 -96.422554 28.345845999999995 -96.39788128.045933000000005 -96.939964 28.131405 -96.872421 28.101840999999993 -96.837425 28.049402 -96.853806 27.840953999999996 -97.049606 27.914381000000006 -97.024429 27.984526000000002 -96.949387 28.000853000000006 -96.973 28.045933000000005 -96.93996427.283717999999993 -97.359116 27.210453 -97.379379 27.284643000000003 -97.376091 27.440819000000005 -97.335503 27.581132999999994 -97.248672 27.651748999999995 -97.258682 27.612064000000004 -97.203583 27.707459999999998 -97.170181 27.811273999999997 -97.075294 27.819215999999997 -97.113037 27.830472999999998 -97.053566 27.574006999999995 -97.223717 27.283717999999993 -97.35911626.601022999999998 -97.301132 26.706646000000006 -97.358025 26.820375 -97.381332 26.921988 -97.395309 27.111227 -97.400909 27.201651 -97.388786 27.204448999999997 -97.378532 27.097244000000003 -97.386925 26.949022 -97.381332 26.802663999999993 -97.358025 26.600669999999994 -97.295837 26.418142000000003 -97.232109 26.259241000000003 -97.194992 26.077720999999997 -97.171799 26.071920000000006 -97.179337 26.250541999999996 -97.208916 26.348551 -97.226311 26.419303999999997 -97.251251 26.478904999999997 -97.26725 26.539963 -97.278549 26.601022999999998 -97.301132Texas48W S CenTX688219.0717337.5491.712202E74377106.06115966.08433346.000000018688674.06192585.05860490.01142908.0168814.07687338.0590269.02139266.01042397.00.4930.5072487642.031.343348000000006 -109.05072836.999741 -102.99691832.441967000000005 -109.048882 32.77948000000001 -109.050728 33.205101 -109.049904 33.783249 -109.049721 34.59174 -109.048012 34.954612999999995 -109.045998 35.996655000000004 -109.047195 36.996643000000006 -109.047821 36.999474000000006 -108.371834 36.998772 -107.471855 36.997519999999994 -107.410217 36.999072999999996 -106.889778 36.989491 -106.860657 36.991493000000006 -106.471588 36.99227500000001 -105.991425 36.994541 -105.712891 36.992580000000004 -105.212532 36.993183 -105.145615 36.994445999999996 -103.993111 36.999741 -103.077377 36.998504999999994 -102.997223 36.492344 -102.996918 36.491566000000006 -103.026802 36.056026 -103.02356 35.742287000000005 -103.022118 35.623604 -103.021797 35.17720799999999 -103.02565 34.964718000000005 -103.02475 34.745266 -103.022156 34.307743 -103.029144 33.826088 -103.032761 33.565742 -103.038239 33.377728000000005 -103.042603 32.95353299999999 -103.048836 32.515429999999995 -103.059547 32.084995000000006 -103.055191 32.001900000000006 -103.057968 32.004154 -103.332092 32.00610399999999 -103.728973 32.005889999999994 -103.980896 32.007278 -104.018814 32.003151 -104.850563 32.004268999999994 -104.921799 32.001553 -106.002708 32.000645000000006 -106.377846 32.00098800000001 -106.623077 31.980227999999997 -106.649513 31.972117999999995 -106.632057 31.913998000000007 -106.633202 31.895101999999994 -106.643532 31.844634999999997 -106.615578 31.817728000000002 -106.614441 31.786198 -106.538971 31.784981000000002 -107.282997 31.786804000000004 -108.20266 31.343742000000006 -108.21006 31.343348000000006 -109.045006 32.441967000000005 -109.048882New Mexico35MtnNM304472.805586.0541379559.0358259.0497680.0677870.0701689.0491847.0433150.087085.06019.0576213.049368.0169914.068673.00.4910.509237629.030.233400000000003 -88.47292335.015949000000006 -84.89408931.980545000000006 -85.070137 31.907264999999995 -85.115219 31.854723000000007 -85.135635 31.783651000000006 -85.13163 31.778689999999997 -85.130234 31.731401000000005 -85.115356 31.708405999999997 -85.118744 31.684076000000005 -85.111275 31.621098000000003 -85.059357 31.55422 -85.042793 31.519488999999993 -85.04277 31.475917999999993 -85.066383 31.440490999999994 -85.061478 31.367059999999995 -85.088013 31.332159000000004 -85.082634 31.302903999999998 -85.081299 31.271259 -85.103432 31.226895999999996 -85.093674 31.196742999999998 -85.103027 31.172031000000004 -85.093437 31.162183999999996 -85.068733 31.126531999999997 -85.038139 31.07992 -85.017067 31.001068000000004 -85.001678 31.000820000000004 -85.485077 31.000816 -85.486664 30.993146999999993 -86.031883 30.995045000000005 -86.181534 30.991358000000005 -86.383972 30.997911000000002 -86.701897 30.998011000000005 -86.779404 31.002975000000006 -87.163147 31.002449 -87.598595 30.954178 -87.589882 30.876717 -87.625725 30.848110000000005 -87.615929 30.785506999999996 -87.541916 30.748301999999995 -87.526619 30.705612000000002 -87.460159 30.692618999999993 -87.418915 30.667823999999996 -87.398666 30.619905000000003 -87.393303 30.556298999999996 -87.422089 30.531194999999997 -87.445374 30.481504 -87.418839 30.440163 -87.405273 30.359522 -87.466461 30.319053999999994 -87.587585 30.278214000000006 -87.593422 30.233728 -87.795341 30.233400000000003 -88.002563 30.272436 -87.779953 30.299221000000003 -87.757515 30.421098999999998 -87.903473 30.620993 -87.913391 30.744000999999997 -88.019791 30.336957999999996 -88.135681 30.404094999999998 -88.32032 30.393353000000005 -88.401405 30.736266999999998 -88.417229 31.000511000000003 -88.429184 31.120699000000002 -88.434547 31.435450000000003 -88.450783 31.702084999999997 -88.465073 31.888723 -88.472923 32.22761199999999 -88.437691 32.309082000000004 -88.425758 32.58033399999999 -88.393799 32.924628999999996 -88.348007 32.98737 -88.339432 33.288773000000006 -88.304794 33.538685 -88.274551 33.742615 -88.248161 34.059017 -88.202606 34.090343000000004 -88.19931 34.32404699999999 -88.167572 34.465176 -88.151215 34.58040200000001 -88.13636 34.895542000000006 -88.090431 34.899849 -88.108849 34.93022499999999 -88.143066 35.004368 -88.193954 35.013458 -88.194923 35.015949000000006 -87.986046 35.010464 -87.607788 35.007262999999995 -87.222748 35.00787699999999 -87.207573 34.998160999999996 -86.83342 34.99699 -86.782372 34.995186000000004 -86.313065 34.995377000000005 -86.303513 34.992301999999995 -85.869591 34.990086000000005 -85.608994 34.862244000000004 -85.583092 34.622406 -85.534729 34.584602000000004 -85.525871 34.52293 -85.511894 34.29007 -85.460327 34.086822999999995 -85.416611 33.959728 -85.395782 33.905308000000005 -85.384056 33.654816 -85.335335 33.490482 -85.305031 33.425762000000006 -85.293877 33.129115999999996 -85.233902 33.120018 -85.233559 32.871685 -85.180779 32.807316 -85.162361 32.776939 -85.128151 32.756184000000005 -85.133362 32.744251000000006 -85.124947 32.734257 -85.11393 32.689837999999995 -85.107796 32.676018 -85.090538 32.645775 -85.103867 32.628315 -85.086388 32.602867 -85.084213 32.581115999999994 -85.070839 32.518787 -84.99572 32.454693000000006 -84.989883 32.429306 -84.965454 32.396666999999994 -84.971031 32.386948000000004 -84.984558 32.371357 -84.971733 32.346931 -85.002159 32.32944500000001 -85.005402 32.292987999999994 -84.921143 32.268585 -84.894676 32.259026000000006 -84.894089 32.249404999999996 -84.905434 32.247237999999996 -84.923752 32.228404999999995 -84.916077 32.217827 -84.928444 32.212097 -84.975815 32.191776000000004 -84.960457 32.178726 -85.007896 32.166122 -85.024452 32.126484000000005 -85.053383 32.09074 -85.046257 32.069489000000004 -85.056725 32.049853999999996 -85.06208 32.017219999999995 -85.05677 31.980545000000006 -85.070137Alabama01E S CenAL131443.1194332.2684040587.01103835.01506790.01936162.02104425.01455669.01374395.0267191.013279.01741794.0128587.0474797.0360499.00.4790.521630032.030.194738 -91.64356235.004954999999995 -88.09043131.435450000000003 -88.450783 31.120699000000002 -88.434547 31.000511000000003 -88.429184 30.736266999999998 -88.417229 30.393353000000005 -88.401405 30.352686000000006 -88.399216 30.325875999999994 -88.464226 30.38055 -88.577744 30.342123 -88.683243 30.430079000000006 -88.873756 30.416602999999995 -88.930191 30.398089999999996 -88.885696 30.314644 -89.276077 30.372190000000003 -89.273483 30.380228000000002 -89.334999 30.365088999999998 -89.357483 30.318657 -89.318497 30.256288999999995 -89.415565 30.200768999999994 -89.438072 30.194738 -89.57383 30.241224000000003 -89.609947 30.247632999999993 -89.606255 30.256769000000006 -89.621605 30.290160999999998 -89.625885 30.295635000000004 -89.639114 30.311649000000003 -89.637024 30.323566 -89.61853 30.343235000000007 -89.62014 30.355114 -89.633392 30.355097 -89.646629 30.378872 -89.65461 30.399880999999993 -89.675308 30.44516 -89.6754 30.462525999999997 -89.683388 30.467995000000002 -89.694534 30.478054 -89.695618 30.481223999999997 -89.71312 30.495846 -89.718994 30.497646000000003 -89.732254 30.515429999999995 -89.755112 30.551056000000003 -89.772728 30.553753 -89.790779 30.624081000000004 -89.820236 30.649266999999995 -89.805466 30.651055999999997 -89.819283 30.670685000000006 -89.829453 30.666062999999994 -89.845375 30.675693999999993 -89.83532 30.679331000000005 -89.841713 30.700361 -89.84127 30.703592 -89.83065 30.712236000000004 -89.843979 30.729174 -89.835541 30.732866 -89.823326 30.742459999999994 -89.825493 30.74798 -89.813278 30.789536999999996 -89.824615 30.811511999999993 -89.81086 30.812466 -89.796494 30.828918 -89.796021 30.830344999999994 -89.774727 30.861393000000007 -89.78495 30.861897999999997 -89.765778 30.900285999999994 -89.763237 30.902608999999998 -89.746727 30.909921999999995 -89.745682 30.920857999999996 -89.75798 30.925923999999995 -89.740402 30.949663 -89.748466 30.965215999999998 -89.739449 30.975308999999996 -89.719749 30.984431999999998 -89.726707 31.001340999999996 -89.723549 31.007261 -89.732643 31.007002 -89.833481 31.007191000000006 -90.259285 31.005211000000003 -90.343567 31.002150999999998 -90.542557 31.001527999999993 -90.560158 31.001368 -90.829613 31.000240000000005 -91.056908 31.000283999999994 -91.1791 31.001186000000004 -91.632179 31.011781999999997 -91.627655 31.032471 -91.57267 31.057982999999993 -91.551964 31.081958999999998 -91.564857 31.127517999999995 -91.619995 31.178307000000004 -91.59137 31.213755000000006 -91.600845 31.240928999999994 -91.636879 31.270943000000003 -91.643562 31.277518999999998 -91.634094 31.270296000000002 -91.556801 31.282898000000003 -91.51696 31.298687 -91.502357 31.323285999999996 -91.505638 31.346815000000007 -91.542671 31.368703999999994 -91.544289 31.382580000000004 -91.534454 31.388059999999996 -91.559258 31.421235999999993 -91.567612 31.43293 -91.552353 31.434166000000005 -91.534683 31.409069000000002 -91.53405 31.391921999999994 -91.522896 31.375079999999997 -91.494591 31.377611 -91.480721 31.403899999999993 -91.465805 31.420205999999993 -91.473175 31.452915000000004 -91.507782 31.52552 -91.506363 31.534713999999994 -91.502838 31.542699999999996 -91.464355 31.562579999999997 -91.423462 31.586186999999995 -91.404137 31.602427000000006 -91.415268 31.604192999999995 -91.497032 31.62178 -91.508759 31.643704999999997 -91.50769 31.650729999999996 -91.49765 31.626801 -91.45726 31.625364000000005 -91.408287 31.654439999999994 -91.389069 31.716517999999994 -91.387833 31.751576999999997 -91.36496 31.753310999999997 -91.370384 31.758379000000005 -91.339798 31.749723000000003 -91.282509 31.759600000000006 -91.263878 31.773764 -91.262573 31.763458 -91.336143 31.770703999999995 -91.36702 31.79567 -91.347122 31.843317 -91.334732 31.862983999999997 -91.30336 31.861332000000004 -91.292534 31.827371999999997 -91.276688 31.818658999999997 -91.250618 31.835226000000006 -91.241272 31.865425000000002 -91.26458 31.878511000000003 -91.24437 31.914288999999997 -91.201431 31.988291000000004 -91.163033 31.991827 -91.108002 32.021057 -91.07238 32.031994 -91.073135 32.043655 -91.086884 32.06610499999999 -91.143013 32.085674 -91.145584 32.088245 -91.125618 32.056843 -91.089302 32.058552000000006 -91.06501 32.093993999999995 -91.073814 32.10767 -91.041084 32.134060000000005 -91.011284 32.169262 -91.00383 32.169899 -91.024414 32.184532000000004 -91.054474 32.158671999999996 -91.045311 32.134392000000005 -91.054047 32.148579 -91.083008 32.134991 -91.108711 32.144783000000004 -91.15654 32.171988999999996 -91.166847 32.205864000000005 -91.157265 32.225605 -91.115952 32.21488600000001 -91.100571 32.232388 -91.087914 32.232742 -91.062462 32.249438999999995 -91.041649 32.223404 -90.977219 32.269065999999995 -90.971016 32.287132 -90.983818 32.297653 -90.980766 32.303698999999995 -90.971657 32.297405 -90.929245 32.305317 -90.916374 32.37965 -90.875351 32.381355 -90.885155 32.345898000000005 -90.914925 32.356396000000004 -90.984566 32.366234000000006 -90.998863 32.397082999999995 -91.009209 32.419017999999994 -90.969986 32.440037000000004 -90.965485 32.452965000000006 -90.98745 32.442417000000006 -91.026909 32.446999000000005 -91.05851 32.498569 -91.117683 32.524067 -91.118744 32.548637 -91.088783 32.496956 -91.037201 32.490814 -91.019684 32.495281000000006 -90.99205 32.511641999999995 -90.995071 32.542159999999996 -91.063087 32.561611 -91.073265 32.576389000000006 -91.058868 32.582672 -91.032326 32.615466999999995 -90.998657 32.625977000000006 -90.996132 32.642673 -91.007881 32.641502 -91.027466 32.614352999999994 -91.04763 32.606387999999995 -91.063812 32.597527 -91.110992 32.644852 -91.146263 32.663174 -91.139557 32.723518 -91.059029 32.749397 -91.09771 32.751125 -91.136467 32.76268 -91.156342 32.841212999999996 -91.142151 32.877162999999996 -91.079529 32.953711999999996 -91.075592 32.987621000000004 -91.092674 32.987350000000006 -91.111816 32.975224 -91.132355 32.937466 -91.129936 32.91778600000001 -91.137177 32.905022 -91.169701 32.914162000000005 -91.198311 32.935852 -91.20916 33.000294 -91.161865 33.013039000000006 -91.162132 33.021709 -91.160675 33.040431999999996 -91.156685 33.04727200000001 -91.123985 33.065571000000006 -91.11779 33.090652000000006 -91.14679 33.113224 -91.190536 33.140465000000006 -91.195503 33.150288 -91.177628 33.131069 -91.12133 33.145084 -91.095856 33.161602 -91.086319 33.225697 -91.092003 33.245780999999994 -91.054543 33.281921 -91.040428 33.293575000000004 -91.053833 33.29235799999999 -91.076324 33.249210000000005 -91.102905 33.268505000000005 -91.122505 33.322384 -91.141747 33.359402 -91.130424 33.393406 -91.106941 33.410179 -91.07869 33.431797 -91.061516 33.460010999999994 -91.060982 33.466206 -91.073761 33.462856 -91.0858 33.414897999999994 -91.099129 33.388878000000005 -91.137634 33.39183 -91.184982 33.414299 -91.204163 33.422112 -91.19883 33.443123 -91.130516 33.452831 -91.119713 33.469673 -91.118958 33.493190999999996 -91.128799 33.51178 -91.164978 33.504368 -91.174179 33.466644 -91.17173 33.447388000000004 -91.18177 33.443443 -91.232849 33.459453999999994 -91.22715 33.473395999999994 -91.207642 33.512012 -91.180405 33.52334999999999 -91.182846 33.538506 -91.204102 33.539276 -91.213486 33.55635100000001 -91.227631 33.590481 -91.22673 33.57468 -91.187805 33.57724399999999 -91.168022 33.616161000000005 -91.15065 33.637032000000005 -91.154404 33.669945 -91.205307 33.690723000000006 -91.215141 33.708965000000006 -91.211678 33.718315000000004 -91.1633 33.677527999999995 -91.121048 33.662586000000005 -91.083771 33.683216 -91.037834 33.70549 -91.038826 33.719357 -91.056213 33.70823300000001 -91.104568 33.71244 -91.128944 33.723225 -91.138 33.771820000000005 -91.142891 33.780086999999995 -91.136986 33.776439999999994 -91.105415 33.786525999999995 -91.066391 33.769554 -91.043404 33.76397299999999 -91.018433 33.77154899999999 -90.995377 33.78533899999999 -90.984039 33.798897 -90.990372 33.816586 -91.028854 33.843525 -91.054817 33.867081 -91.061371 33.936306 -91.018463 33.974644 -91.075706 33.994468999999995 -91.088852 34.006096 -91.069695 33.985699 -91.031059 33.990528 -91.009544 33.968372 -91.000259 33.960815 -90.986816 33.967461 -90.96479 33.978874000000005 -90.961128 33.994606000000005 -90.975273 34.010998 -90.973366 34.031288 -90.95047 34.040710000000004 -90.886345 34.10095200000001 -90.866333 34.102749 -90.906311 34.125941999999995 -90.942245 34.155804 -90.953346 34.185649999999995 -90.928917 34.147544999999994 -90.846611 34.148658999999995 -90.828865 34.166172 -90.80751 34.190544 -90.822922 34.20483 -90.921486 34.23467599999999 -90.933708 34.250195000000005 -90.928436 34.219162 -90.863411 34.229534 -90.83136 34.277339999999995 -90.823837 34.299347 -90.806419 34.299957000000006 -90.792526 34.278976 -90.758255 34.317719 -90.747757 34.363913999999994 -90.761856 34.37216600000001 -90.75531 34.377871999999996 -90.687485 34.3634 -90.681137 34.320145 -90.689377 34.31797400000001 -90.679337 34.330006 -90.657814 34.36591 -90.657242 34.40459799999999 -90.60379 34.432998999999995 -90.579124 34.453945000000004 -90.574402 34.496506 -90.59005 34.520222000000004 -90.580345 34.532509000000005 -90.565681 34.543327000000005 -90.537148 34.555649 -90.530617 34.604744 -90.577614 34.627815 -90.58799 34.645611 -90.5793 34.700287 -90.561058 34.685947 -90.539062 34.65180599999999 -90.547546 34.636894 -90.538963 34.638065 -90.508812 34.672039 -90.466225 34.704254000000006 -90.469978 34.702068 -90.513565 34.713252999999995 -90.533279 34.790336999999994 -90.547745 34.807323 -90.52726 34.805603000000005 -90.516045 34.789833 -90.501282 34.765784999999994 -90.498734 34.748371000000006 -90.516968 34.729855 -90.504417 34.726833 -90.485924 34.741198999999995 -90.451431 34.76075 -90.448868 34.79966400000001 -90.466705 34.82521800000001 -90.451904 34.857727 -90.474716 34.88092399999999 -90.470528 34.88618099999999 -90.438087 34.872643 -90.427841 34.835353999999995 -90.433548 34.832268 -90.42231 34.841038 -90.403931 34.860577000000006 -90.341423 34.850266000000005 -90.322823 34.851776 -90.301552 34.864959999999996 -90.299446 34.88269 -90.296272 34.896511000000004 -90.266708 34.920731 -90.242844 34.938903999999994 -90.241898 34.94976 -90.248169 34.978481 -90.299507 35.000693999999996 -90.305351 34.999168 -89.717186 35.000641 -89.646477 34.999714 -89.3423 35.000793 -89.198067 35.000145 -89.006134 35.00235000000001 -88.812492 35.003094000000004 -88.784988 35.004954999999995 -88.383102 35.00374600000001 -88.351685 35.004368 -88.193954 34.93022499999999 -88.143066 34.899849 -88.108849 34.895542000000006 -88.090431 34.58040200000001 -88.13636 34.465176 -88.151215 34.32404699999999 -88.167572 34.090343000000004 -88.19931 34.059017 -88.202606 33.742615 -88.248161 33.538685 -88.274551 33.288773000000006 -88.304794 32.98737 -88.339432 32.924628999999996 -88.348007 32.58033399999999 -88.393799 32.309082000000004 -88.425758 32.22761199999999 -88.437691 31.888723 -88.472923 31.702084999999997 -88.465073 31.435450000000003 -88.450783Mississippi28E S CenMS121506.433598.3372573216.0674378.0911374.01230617.01342599.0890741.0777422.0184019.08020.01028773.094712.0294070.0222644.00.4780.522399625.030.361057000000002 -85.60899435.000277999999994 -80.8949231.778689999999997 -85.130234 31.783651000000006 -85.13163 31.854723000000007 -85.135635 31.907264999999995 -85.115219 31.980545000000006 -85.070137 32.017219999999995 -85.05677 32.049853999999996 -85.06208 32.069489000000004 -85.056725 32.09074 -85.046257 32.126484000000005 -85.053383 32.166122 -85.024452 32.178726 -85.007896 32.191776000000004 -84.960457 32.212097 -84.975815 32.217827 -84.928444 32.228404999999995 -84.916077 32.247237999999996 -84.923752 32.249404999999996 -84.905434 32.259026000000006 -84.894089 32.268585 -84.894676 32.292987999999994 -84.921143 32.32944500000001 -85.005402 32.346931 -85.002159 32.371357 -84.971733 32.386948000000004 -84.984558 32.396666999999994 -84.971031 32.429306 -84.965454 32.454693000000006 -84.989883 32.518787 -84.99572 32.581115999999994 -85.070839 32.602867 -85.084213 32.628315 -85.086388 32.645775 -85.103867 32.676018 -85.090538 32.689837999999995 -85.107796 32.734257 -85.11393 32.744251000000006 -85.124947 32.756184000000005 -85.133362 32.776939 -85.128151 32.807316 -85.162361 32.871685 -85.180779 33.120018 -85.233559 33.129115999999996 -85.233902 33.425762000000006 -85.293877 33.490482 -85.305031 33.654816 -85.335335 33.905308000000005 -85.384056 33.959728 -85.395782 34.086822999999995 -85.416611 34.29007 -85.460327 34.52293 -85.511894 34.584602000000004 -85.525871 34.622406 -85.534729 34.862244000000004 -85.583092 34.990086000000005 -85.608994 34.990047000000004 -85.467422 34.989902 -85.359985 34.989075 -85.267761 34.992554 -84.972847 34.99260700000001 -84.967911 34.992756 -84.800476 34.990680999999995 -84.771194 34.988682 -84.618752 34.98900999999999 -84.323853 34.988224 -84.11824 34.989067000000006 -83.988548 34.989391 -83.937996 34.989536 -83.549416 34.992023 -83.513008 35.000277999999994 -83.106285 34.98407400000001 -83.100578 34.95459700000001 -83.115669 34.960803999999996 -83.121529 34.954285 -83.127441 34.936035000000004 -83.113228 34.940701000000004 -83.125763 34.930386 -83.137688 34.932190000000006 -83.155151 34.917561000000006 -83.158478 34.910557 -83.182304 34.884079 -83.203636 34.88909099999999 -83.219551 34.873729999999995 -83.232925 34.877990999999994 -83.243195 34.862292999999994 -83.235809 34.850075000000004 -83.250427 34.839619 -83.250542 34.839138000000005 -83.267891 34.814987 -83.270233 34.80543900000001 -83.302872 34.787150999999994 -83.322807 34.75214 -83.32354 34.727287000000004 -83.350449 34.709553 -83.3508 34.677597000000006 -83.339905 34.662848999999994 -83.299011 34.613224 -83.237106 34.598839 -83.165001 34.576733000000004 -83.159073 34.567768 -83.137489 34.534915999999996 -83.108246 34.518871000000004 -83.079147 34.489959999999996 -83.055122 34.470726 -83.00808 34.476395 -82.982094 34.477881999999994 -82.90519 34.457438999999994 -82.868179 34.412571 -82.844231 34.370941 -82.836578 34.339794 -82.808723 34.290409 -82.783012 34.28085299999999 -82.764313 34.233265 -82.758171 34.205444 -82.742737 34.169685 -82.735924 34.108242000000004 -82.6605 34.034519 -82.603088 34.013301999999996 -82.596283 33.968784 -82.573753 33.959166999999994 -82.576759 33.930908 -82.517685 33.878101 -82.456779 33.86013 -82.424675 33.854015000000004 -82.390747 33.83588399999999 -82.36586 33.835266000000004 -82.351463 33.803787 -82.311272 33.782520000000005 -82.305664 33.761466999999996 -82.266373 33.690208 -82.235054 33.680603000000005 -82.214363 33.623706999999996 -82.192345 33.615082 -82.16729 33.593773 -82.139137 33.594643000000005 -82.116562 33.57373 -82.065842 33.547371 -82.038704 33.538596999999996 -82.020302 33.520354999999995 -81.996696 33.490601 -81.981079 33.470882 -81.936546 33.451195 -81.916801 33.436004999999994 -81.927437 33.415302 -81.913727 33.408024 -81.940498 33.376419 -81.925972 33.377007000000006 -81.945229 33.350296 -81.936874 33.349354000000005 -81.911575 33.332054 -81.912254 33.335094 -81.893646 33.30669399999999 -81.877037 33.315524999999994 -81.865707 33.308201 -81.840271 33.296947 -81.860878 33.269279 -81.826736 33.273163 -81.840004 33.260468 -81.83696 33.243354999999994 -81.854126 33.22629499999999 -81.810928 33.207779 -81.801727 33.21722 -81.779999 33.213734 -81.770042 33.195232000000004 -81.759758 33.169685 -81.763573 33.144547 -81.74054 33.122787 -81.704445 33.087723 -81.61113 33.070637000000005 -81.595993 33.060660999999996 -81.560204 33.043530000000004 -81.547829 33.043774 -81.52977 33.012637999999995 -81.508919 33.004658000000006 -81.492905 32.959518 -81.49807 32.95526099999999 -81.51001 32.947063 -81.510406 32.897411000000005 -81.477219 32.89756800000001 -81.465202 32.875930999999994 -81.483376 32.871239 -81.45871 32.844414 -81.45549 32.84151799999999 -81.432503 32.831608 -81.424133 32.82014100000001 -81.430481 32.80933 -81.421005 32.785988 -81.430412 32.756561000000005 -81.416245 32.749645 -81.42321 32.741637999999995 -81.407799 32.701397 -81.420708 32.686531 -81.407364 32.650642000000005 -81.399651 32.625434999999996 -81.412277 32.595707000000004 -81.385078 32.588188 -81.36644 32.581801999999996 -81.366875 32.58335099999999 -81.351662 32.57118199999999 -81.340576 32.567108000000005 -81.299156 32.55463399999999 -81.274475 32.533749 -81.268158 32.520432 -81.236412 32.464375000000004 -81.195328 32.420128000000005 -81.200096 32.386639 -81.178421 32.37159 -81.179291 32.338547000000005 -81.157646 32.348274 -81.142052 32.332424 -81.132057 32.276447000000005 -81.124214 32.257515 -81.148338 32.224247000000005 -81.147858 32.190392 -81.114883 32.117408999999995 -81.119278 32.105239999999995 -81.105042 32.005779000000004 -80.89492 31.947711999999996 -80.973724 31.890095000000002 -80.971046 31.864124000000004 -81.140022 31.905677999999995 -81.180168 31.899907999999996 -81.207428 31.919683000000006 -81.197472 31.928220999999994 -81.204079 31.903204000000002 -81.239853 31.949219 -81.284462 31.89448 -81.245117 31.920439000000002 -81.206657 31.892927 -81.220276 31.897458999999998 -81.18042 31.853300000000004 -81.14164 31.823138999999998 -81.039185 31.777321 -81.061218 31.726851999999994 -81.137001 31.799593 -81.174187 31.784626000000003 -81.196541 31.735581999999994 -81.175354 31.799449999999993 -81.289902 31.645847000000003 -81.135117 31.599676000000002 -81.18737 31.639954000000003 -81.240898 31.556662000000003 -81.239326 31.504929000000004 -81.194954 31.466673 -81.208755 31.337370000000007 -81.313248 31.344328000000004 -81.365761 31.311252999999994 -81.410522 31.263861000000006 -81.394951 31.296920999999998 -81.388992 31.275588999999997 -81.301018 31.242464 -81.310432 31.148714 -81.381187 31.130898000000002 -81.528564 31.086316999999994 -81.525436 31.043591000000006 -81.475517 31.076525000000004 -81.535606 30.985579 -81.491035 30.961884999999995 -81.52874 30.944665999999998 -81.485008 30.864543999999995 -81.529449 30.757278 -81.498566 30.721216 -81.528778 30.706340999999995 -81.536774 30.724650999999994 -81.601349 30.716085000000007 -81.60495 30.731538999999998 -81.628159 30.728846000000004 -81.642654 30.745133999999993 -81.716942 30.763655 -81.736847 30.769397999999995 -81.757881 30.761351000000005 -81.776878 30.787851000000003 -81.803368 30.798851 -81.873169 30.828075 -81.899307 30.813242000000002 -81.907684 30.824016999999998 -81.94397 30.820198000000005 -81.953194 30.795773999999994 -81.961716 30.778118000000006 -81.981644 30.791086000000007 -82.015701 30.764022999999995 -82.01313 30.757299000000003 -82.032043 30.650677 -82.045074 30.598455 -82.013817 30.570755000000005 -82.005966 30.477481999999995 -82.022675 30.442642000000006 -82.035286 30.433831999999995 -82.046265 30.378668000000005 -82.038521 30.363557999999998 -82.052933 30.361057000000002 -82.164803 30.368397 -82.180397 30.42362 -82.205727 30.489782000000005 -82.199348 30.502739000000005 -82.219528 30.531214000000006 -82.238556 30.566845 -82.221199 30.577084 -82.412247 30.582468000000006 -82.463287 30.588835000000003 -82.583107 30.595502999999994 -82.696503 30.621129999999994 -83.132576 30.633077999999998 -83.301445 30.634096 -83.31073 30.650582999999997 -83.609177 30.660292 -83.737961 30.675341000000003 -84.000839 30.678381 -84.075668 30.690224 -84.281761 30.693897000000007 -84.374542 30.712473000000003 -84.863083 30.714312000000007 -84.864662 30.743697999999995 -84.888367 30.753899000000004 -84.915421 30.775897999999998 -84.926971 30.802435000000003 -84.93264 30.846733 -84.927002 30.894769999999994 -84.937851 30.926907 -84.969086 30.963477999999995 -84.97364 30.979134000000002 -85.000214 31.001068000000004 -85.001678 31.07992 -85.017067 31.126531999999997 -85.038139 31.162183999999996 -85.068733 31.172031000000004 -85.093437 31.196742999999998 -85.103027 31.226895999999996 -85.093674 31.271259 -85.103432 31.302903999999998 -85.081299 31.332159000000004 -85.082634 31.367059999999995 -85.088013 31.440490999999994 -85.061478 31.475917999999993 -85.066383 31.519488999999993 -85.04277 31.55422 -85.042793 31.621098000000003 -85.059357 31.684076000000005 -85.111275 31.708405999999997 -85.118744 31.731401000000005 -85.115356 31.778689999999997 -85.13023430.903648000000004 -81.485237 30.970366 -81.416588 30.938568000000004 -81.403236 30.716189999999997 -81.455902 30.736647000000005 -81.479645 30.860022999999998 -81.47007 30.881500000000003 -81.503487 30.903648000000004 -81.485237Georgia13S AtlGA148574.8883934.9916457339.01707476.02359351.03134562.03322777.02346478.02372513.0465734.086587.03081555.0187390.0802419.0536597.00.4850.515935083.032.067963000000006 -83.350835.208241 -78.5797233.195232000000004 -81.759758 33.213734 -81.770042 33.21722 -81.779999 33.207779 -81.801727 33.22629499999999 -81.810928 33.243354999999994 -81.854126 33.260468 -81.83696 33.273163 -81.840004 33.269279 -81.826736 33.296947 -81.860878 33.308201 -81.840271 33.315524999999994 -81.865707 33.30669399999999 -81.877037 33.335094 -81.893646 33.332054 -81.912254 33.349354000000005 -81.911575 33.350296 -81.936874 33.377007000000006 -81.945229 33.376419 -81.925972 33.408024 -81.940498 33.415302 -81.913727 33.436004999999994 -81.927437 33.451195 -81.916801 33.470882 -81.936546 33.490601 -81.981079 33.520354999999995 -81.996696 33.538596999999996 -82.020302 33.547371 -82.038704 33.57373 -82.065842 33.594643000000005 -82.116562 33.593773 -82.139137 33.615082 -82.16729 33.623706999999996 -82.192345 33.680603000000005 -82.214363 33.690208 -82.235054 33.761466999999996 -82.266373 33.782520000000005 -82.305664 33.803787 -82.311272 33.835266000000004 -82.351463 33.83588399999999 -82.36586 33.854015000000004 -82.390747 33.86013 -82.424675 33.878101 -82.456779 33.930908 -82.517685 33.959166999999994 -82.576759 33.968784 -82.573753 34.013301999999996 -82.596283 34.034519 -82.603088 34.108242000000004 -82.6605 34.169685 -82.735924 34.205444 -82.742737 34.233265 -82.758171 34.28085299999999 -82.764313 34.290409 -82.783012 34.339794 -82.808723 34.370941 -82.836578 34.412571 -82.844231 34.457438999999994 -82.868179 34.477881999999994 -82.90519 34.476395 -82.982094 34.470726 -83.00808 34.489959999999996 -83.055122 34.518871000000004 -83.079147 34.534915999999996 -83.108246 34.567768 -83.137489 34.576733000000004 -83.159073 34.598839 -83.165001 34.613224 -83.237106 34.662848999999994 -83.299011 34.677597000000006 -83.339905 34.709553 -83.3508 34.727287000000004 -83.350449 34.75214 -83.32354 34.787150999999994 -83.322807 34.80543900000001 -83.302872 34.814987 -83.270233 34.839138000000005 -83.267891 34.839619 -83.250542 34.850075000000004 -83.250427 34.862292999999994 -83.235809 34.877990999999994 -83.243195 34.873729999999995 -83.232925 34.88909099999999 -83.219551 34.884079 -83.203636 34.910557 -83.182304 34.917561000000006 -83.158478 34.932190000000006 -83.155151 34.930386 -83.137688 34.940701000000004 -83.125763 34.936035000000004 -83.113228 34.954285 -83.127441 34.960803999999996 -83.121529 34.95459700000001 -83.115669 34.98407400000001 -83.100578 35.000277999999994 -83.106285 35.024204 -83.007278 35.055369999999996 -82.887695 35.085423000000006 -82.771347 35.091232000000005 -82.697357 35.097801000000004 -82.688034 35.121464 -82.68605 35.119457 -82.654495 35.14949 -82.57003 35.154560000000004 -82.524635 35.173500000000004 -82.466743 35.16955900000001 -82.43792 35.208241 -82.38961 35.18272399999999 -82.371376 35.182948999999994 -82.360123 35.192673 -82.350861 35.184189 -82.32077 35.195007000000004 -82.278328 35.193127000000004 -82.210175 35.188282 -81.971443 35.183116999999996 -81.87059 35.182472000000004 -81.765358 35.162853 -81.362175 35.163757000000004 -81.322823 35.151531000000006 -81.049301 35.132011000000006 -81.049042 35.105408 -81.028442 35.066483000000005 -81.065552 35.037200999999996 -81.039886 35.10124999999999 -80.927795 35.059734000000006 -80.894714 35.00201800000001 -80.840164 34.940639000000004 -80.785652 34.816113 -80.800064 34.815228000000005 -80.561546 34.814762 -80.325279 34.807919 -79.919952 34.805256 -79.685959 34.800663 -79.667503 34.63409 -79.455971 34.619061 -79.447144 34.304573000000005 -79.074501 33.948673 -78.655716 33.881992 -78.57972 33.865536000000006 -78.622856 33.853359 -78.586197 33.71619 -78.855133 33.57246000000001 -79.000938 33.430611 -79.121101 33.317088999999996 -79.150383 33.342265999999995 -79.158348 33.296870999999996 -79.271072 33.183521 -79.202141 33.141338000000005 -79.22979 33.154827 -79.348976 33.138794000000004 -79.298058 33.10453 -79.288101 33.013699 -79.410835 33.015842000000006 -79.582565 32.980796999999995 -79.617439 32.92493399999999 -79.587852 32.899071000000006 -79.607018 32.79406 -79.752518 32.790531 -79.907677 32.929783 -79.800056 32.859215000000006 -79.907333 32.914047 -79.930443 32.904236 -79.962311 32.81062300000001 -79.948174 32.733852 -79.891846 32.67724200000001 -79.896584 32.605605999999995 -79.996803 32.561417000000006 -80.210983 32.503883 -80.290833 32.511768000000004 -80.347351 32.65522 -80.391045 32.668980000000005 -80.416168 32.504772 -80.399979 32.510245999999995 -80.480881 32.557655 -80.550568 32.509677999999994 -80.539055 32.518692 -80.646584 32.498272 -80.64373 32.43084 -80.486244 32.37331399999999 -80.44297 32.318489 -80.460564 32.272621 -80.626198 32.285465 -80.678185 32.360016 -80.742134 32.473118 -80.799553 32.504864 -80.784958 32.516093999999995 -80.830688 32.532509000000005 -80.867348 32.400516999999994 -80.822037 32.247921000000005 -80.780731 32.067963000000006 -80.893082 32.105239999999995 -81.105042 32.117408999999995 -81.119278 32.190392 -81.114883 32.224247000000005 -81.147858 32.257515 -81.148338 32.276447000000005 -81.124214 32.332424 -81.132057 32.348274 -81.142052 32.338547000000005 -81.157646 32.37159 -81.179291 32.386639 -81.178421 32.420128000000005 -81.200096 32.464375000000004 -81.195328 32.520432 -81.236412 32.533749 -81.268158 32.55463399999999 -81.274475 32.567108000000005 -81.299156 32.57118199999999 -81.340576 32.58335099999999 -81.351662 32.581801999999996 -81.366875 32.588188 -81.36644 32.595707000000004 -81.385078 32.625434999999996 -81.412277 32.650642000000005 -81.399651 32.686531 -81.407364 32.701397 -81.420708 32.741637999999995 -81.407799 32.749645 -81.42321 32.756561000000005 -81.416245 32.785988 -81.430412 32.80933 -81.421005 32.82014100000001 -81.430481 32.831608 -81.424133 32.84151799999999 -81.432503 32.844414 -81.45549 32.871239 -81.45871 32.875930999999994 -81.483376 32.89756800000001 -81.465202 32.897411000000005 -81.477219 32.947063 -81.510406 32.95526099999999 -81.51001 32.959518 -81.49807 33.004658000000006 -81.492905 33.012637999999995 -81.508919 33.043774 -81.52977 33.043530000000004 -81.547829 33.060660999999996 -81.560204 33.070637000000005 -81.595993 33.087723 -81.61113 33.122787 -81.704445 33.144547 -81.74054 33.169685 -81.763573 33.195232000000004 -81.75975832.258446000000006 -80.767975 32.272003 -80.719254 32.21991 -80.666786 32.104488 -80.819435 32.258446000000006 -80.767975South Carolina45S AtlSC77987.8234910.6363486703.0928206.01258044.01688510.01798193.01268959.01234700.0277209.018092.01603425.094673.0455692.0337824.00.4840.516506464.033.010025 -94.61703536.492751999999996 -89.64540134.19665500000001 -94.461479 34.508326999999994 -94.452408 34.735504000000006 -94.44574 34.929050000000004 -94.439102 35.400454999999994 -94.428337 35.641003 -94.468269 35.760227 -94.485718 36.106753999999995 -94.542198 36.164444 -94.552895 36.478714 -94.607231 36.489338000000004 -94.617035 36.49095199999999 -94.080849 36.489716 -93.857323 36.489891 -93.59626 36.490196 -93.328163 36.490616 -93.297142 36.489819 -92.852104 36.489918 -92.777466 36.490855999999994 -92.522888 36.491596 -92.146164 36.491371 -92.127487 36.490955 -91.688416 36.490376 -91.45285 36.491039 -91.411659 36.487953000000005 -91.133827 36.489204 -90.804314 36.490962999999994 -90.581619 36.492751999999996 -90.224373 36.491814000000005 -90.150162 36.45741700000001 -90.137276 36.453896 -90.117226 36.422565000000006 -90.123833 36.404915 -90.116829 36.39738800000001 -90.080177 36.382553 -90.052063 36.362606 -90.050201 36.325333 -90.067635 36.300472 -90.049751 36.272273999999996 -90.066093 36.257996000000006 -90.109917 36.21207 -90.131218 36.196940999999995 -90.161308 36.172565000000006 -90.219223 36.161148 -90.232224 36.137089 -90.23484 36.118763 -90.263702 36.115905999999995 -90.284752 36.091656 -90.315239 35.989586 -90.37896 35.991158 -90.283455 35.996838 -89.963203 35.999877999999995 -89.721756 35.966324 -89.713135 35.93782 -89.664192 35.913799 -89.645401 35.894287000000006 -89.649338 35.885647000000006 -89.66465 35.911427 -89.714684 35.915012000000004 -89.737976 35.896812 -89.762909 35.884102 -89.766273 35.871418000000006 -89.757713 35.842037000000005 -89.701439 35.827515000000005 -89.700829 35.807036999999994 -89.735939 35.817420999999996 -89.759796 35.805553 -89.790382 35.774223000000006 -89.799904 35.758269999999996 -89.827042 35.748192 -89.859871 35.754836999999995 -89.909782 35.734268 -89.951035 35.712486 -89.952034 35.676266 -89.929741 35.655972000000006 -89.893402 35.673306 -89.865181 35.671062000000006 -89.857246 35.645222000000004 -89.849197 35.629745 -89.863838 35.633335 -89.877441 35.603104 -89.957047 35.578593999999995 -89.958031 35.546059 -89.921661 35.52923199999999 -89.931175 35.526900999999995 -89.947548 35.532291 -89.962273 35.561676000000006 -89.989586 35.552414 -90.033051 35.542846999999995 -90.040901 35.51244 -90.041817 35.445454 -89.999565 35.417103 -90.046783 35.41341 -90.060295 35.426506 -90.073936 35.472342999999995 -90.074844 35.478207 -90.08223 35.473568 -90.101959 35.442524000000006 -90.137276 35.423716999999996 -90.172676 35.384254 -90.167816 35.383044999999996 -90.140167 35.4076 -90.132469 35.41768999999999 -90.112244 35.418282000000005 -90.085159 35.406527999999994 -90.075478 35.381508 -90.087135 35.365982 -90.105621 35.345591999999996 -90.098701 35.314685999999995 -90.106346 35.30624400000001 -90.15699 35.282566 -90.169746 35.264056999999994 -90.152122 35.263847 -90.105942 35.254397999999995 -90.090103 35.212738 -90.068962 35.191833 -90.073303 35.166916 -90.062431 35.147385 -90.064537 35.12505 -90.082924 35.13653600000001 -90.14373 35.129611999999995 -90.164474 35.10864599999999 -90.178345 35.077827 -90.169083 35.040897 -90.195709 35.048458 -90.291809 35.000693999999996 -90.305351 34.978481 -90.299507 34.94976 -90.248169 34.938903999999994 -90.241898 34.920731 -90.242844 34.896511000000004 -90.266708 34.88269 -90.296272 34.864959999999996 -90.299446 34.851776 -90.301552 34.850266000000005 -90.322823 34.860577000000006 -90.341423 34.841038 -90.403931 34.832268 -90.42231 34.835353999999995 -90.433548 34.872643 -90.427841 34.88618099999999 -90.438087 34.88092399999999 -90.470528 34.857727 -90.474716 34.82521800000001 -90.451904 34.79966400000001 -90.466705 34.76075 -90.448868 34.741198999999995 -90.451431 34.726833 -90.485924 34.729855 -90.504417 34.748371000000006 -90.516968 34.765784999999994 -90.498734 34.789833 -90.501282 34.805603000000005 -90.516045 34.807323 -90.52726 34.790336999999994 -90.547745 34.713252999999995 -90.533279 34.702068 -90.513565 34.704254000000006 -90.469978 34.672039 -90.466225 34.638065 -90.508812 34.636894 -90.538963 34.65180599999999 -90.547546 34.685947 -90.539062 34.700287 -90.561058 34.645611 -90.5793 34.627815 -90.58799 34.604744 -90.577614 34.555649 -90.530617 34.543327000000005 -90.537148 34.532509000000005 -90.565681 34.520222000000004 -90.580345 34.496506 -90.59005 34.453945000000004 -90.574402 34.432998999999995 -90.579124 34.40459799999999 -90.60379 34.36591 -90.657242 34.330006 -90.657814 34.31797400000001 -90.679337 34.320145 -90.689377 34.3634 -90.681137 34.377871999999996 -90.687485 34.37216600000001 -90.75531 34.363913999999994 -90.761856 34.317719 -90.747757 34.278976 -90.758255 34.299957000000006 -90.792526 34.299347 -90.806419 34.277339999999995 -90.823837 34.229534 -90.83136 34.219162 -90.863411 34.250195000000005 -90.928436 34.23467599999999 -90.933708 34.20483 -90.921486 34.190544 -90.822922 34.166172 -90.80751 34.148658999999995 -90.828865 34.147544999999994 -90.846611 34.185649999999995 -90.928917 34.155804 -90.953346 34.125941999999995 -90.942245 34.102749 -90.906311 34.10095200000001 -90.866333 34.040710000000004 -90.886345 34.031288 -90.95047 34.010998 -90.973366 33.994606000000005 -90.975273 33.978874000000005 -90.961128 33.967461 -90.96479 33.960815 -90.986816 33.968372 -91.000259 33.990528 -91.009544 33.985699 -91.031059 34.006096 -91.069695 33.994468999999995 -91.088852 33.974644 -91.075706 33.936306 -91.018463 33.867081 -91.061371 33.843525 -91.054817 33.816586 -91.028854 33.798897 -90.990372 33.78533899999999 -90.984039 33.77154899999999 -90.995377 33.76397299999999 -91.018433 33.769554 -91.043404 33.786525999999995 -91.066391 33.776439999999994 -91.105415 33.780086999999995 -91.136986 33.771820000000005 -91.142891 33.723225 -91.138 33.71244 -91.128944 33.70823300000001 -91.104568 33.719357 -91.056213 33.70549 -91.038826 33.683216 -91.037834 33.662586000000005 -91.083771 33.677527999999995 -91.121048 33.718315000000004 -91.1633 33.708965000000006 -91.211678 33.690723000000006 -91.215141 33.669945 -91.205307 33.637032000000005 -91.154404 33.616161000000005 -91.15065 33.57724399999999 -91.168022 33.57468 -91.187805 33.590481 -91.22673 33.55635100000001 -91.227631 33.539276 -91.213486 33.538506 -91.204102 33.52334999999999 -91.182846 33.512012 -91.180405 33.473395999999994 -91.207642 33.459453999999994 -91.22715 33.443443 -91.232849 33.447388000000004 -91.18177 33.466644 -91.17173 33.504368 -91.174179 33.51178 -91.164978 33.493190999999996 -91.128799 33.469673 -91.118958 33.452831 -91.119713 33.443123 -91.130516 33.422112 -91.19883 33.414299 -91.204163 33.39183 -91.184982 33.388878000000005 -91.137634 33.414897999999994 -91.099129 33.462856 -91.0858 33.466206 -91.073761 33.460010999999994 -91.060982 33.431797 -91.061516 33.410179 -91.07869 33.393406 -91.106941 33.359402 -91.130424 33.322384 -91.141747 33.268505000000005 -91.122505 33.249210000000005 -91.102905 33.29235799999999 -91.076324 33.293575000000004 -91.053833 33.281921 -91.040428 33.245780999999994 -91.054543 33.225697 -91.092003 33.161602 -91.086319 33.145084 -91.095856 33.131069 -91.12133 33.150288 -91.177628 33.140465000000006 -91.195503 33.113224 -91.190536 33.090652000000006 -91.14679 33.065571000000006 -91.11779 33.04727200000001 -91.123985 33.040431999999996 -91.156685 33.021709 -91.160675 33.013039000000006 -91.162132 33.013476999999995 -91.254616 33.013419999999996 -91.427528 33.013874 -91.454353 33.010025 -92.063309 33.016701 -92.717079 33.018135 -92.978828 33.019238 -93.232376 33.021393 -93.478897 33.021152 -93.511742 33.022594 -93.809753 33.023289000000005 -94.03875 33.270325 -94.036507 33.555912000000006 -94.035927 33.577213 -94.061432 33.583954000000006 -94.086655 33.572998 -94.098701 33.567085000000006 -94.155167 33.593773 -94.159515 33.58507899999999 -94.205345 33.557987 -94.210884 33.561535000000006 -94.235367 33.585719999999995 -94.223038 33.592422 -94.237236 33.561736999999994 -94.274544 33.584605999999994 -94.272079 33.589332999999996 -94.278984 33.579853 -94.29882 33.556934 -94.302383 33.57313499999999 -94.328751 33.547684000000004 -94.370758 33.560303000000005 -94.395264 33.572661999999994 -94.372307 33.590042 -94.370628 33.593327 -94.379112 33.57495900000001 -94.393417 33.573486 -94.40657 33.59714099999999 -94.428467 33.596503999999996 -94.443329 33.604347000000004 -94.451553 33.616844 -94.436333 33.636444 -94.435913 33.631966000000006 -94.476486 33.939198000000005 -94.468376 34.19665500000001 -94.461479Arkansas05W S CenAR134875.0752867.3022350725.0651555.0891179.01133076.01217649.0849722.0764635.0153025.05096.0994289.072079.0298794.0210650.00.4820.518414226.028.939419 -94.04160333.023289000000005 -89.02175930.239372000000003 -93.707359 30.297387999999998 -93.699211 30.304916000000006 -93.729774 30.340872000000005 -93.759178 30.354145000000003 -93.759338 30.367411000000004 -93.747833 30.381788 -93.754944 30.408822999999998 -93.742561 30.43298 -93.721535 30.442633 -93.696571 30.462513 -93.703423 30.470046999999994 -93.697975 30.488628000000006 -93.714851 30.496240999999998 -93.707275 30.505114000000006 -93.714638 30.522858 -93.70546 30.545517000000004 -93.735306 30.568152999999995 -93.71788 30.587379 -93.717812 30.598834999999994 -93.69342 30.597831999999997 -93.671585 30.615795000000006 -93.692696 30.623424999999997 -93.684586 30.640040999999997 -93.692879 30.639691999999997 -93.677971 30.672859000000003 -93.659988 30.686802 -93.617607 30.710329 -93.612411 30.732547999999994 -93.61779 30.732010000000002 -93.607651 30.745789000000002 -93.618454 30.772183999999996 -93.585175 30.802040000000005 -93.581871 30.828344 -93.550682 30.842342000000002 -93.555641 30.845147999999995 -93.566444 30.860282999999995 -93.552803 30.871880000000004 -93.560844 30.886234 -93.568497 30.901932000000002 -93.564476 30.905333999999996 -93.546516 30.924885000000003 -93.549622 30.926970999999995 -93.529984 30.935820000000007 -93.52562 30.960731999999993 -93.532188 30.956884000000002 -93.537338 30.970190000000002 -93.548676 30.976177000000007 -93.572456 30.991690000000006 -93.560951 30.997270999999998 -93.570847 31.012923999999998 -93.567894 31.018062999999998 -93.564941 31.014140999999995 -93.547119 31.038908000000006 -93.507217 31.056979999999996 -93.525742 31.074670999999995 -93.516998 31.082373000000004 -93.544106 31.094751000000002 -93.543121 31.100536000000005 -93.559982 31.109342999999996 -93.556679 31.116072000000003 -93.535088 31.125924999999995 -93.528091 31.132441 -93.537506 31.159166 -93.544189 31.162943 -93.528328 31.176339999999996 -93.537018 31.178076000000004 -93.526932 31.185773999999995 -93.528923 31.190928999999997 -93.550591 31.17214 -93.576942 31.180199 -93.593941 31.199066000000002 -93.602921 31.229687 -93.590546 31.242188 -93.611 31.270032999999998 -93.611877 31.275805000000005 -93.616455 31.273903000000004 -93.630829 31.290262 -93.645592 31.286671 -93.656128 31.312679000000003 -93.681587 31.328385999999995 -93.67704 31.373827000000006 -93.634857 31.372394999999997 -93.661072 31.398329000000004 -93.664017 31.406130000000005 -93.687492 31.415921999999995 -93.694443 31.427735999999996 -93.696129 31.438131 -93.687004 31.446251000000004 -93.701927 31.461457999999993 -93.698418 31.459474999999998 -93.726784 31.485500000000002 -93.751244 31.490556999999995 -93.750435 31.495402999999996 -93.718994 31.520568999999995 -93.705795 31.521877000000003 -93.731659 31.537717999999998 -93.747543 31.530724000000006 -93.763306 31.533734999999993 -93.780128 31.559062999999995 -93.810516 31.577110000000005 -93.816322 31.590182999999996 -93.832619 31.615189 -93.835579 31.618092000000004 -93.819588 31.647965999999997 -93.814728 31.653767000000002 -93.806427 31.674566 -93.811844 31.711394999999996 -93.792267 31.707565000000002 -93.808769 31.712350999999998 -93.814949 31.730351999999996 -93.80999 31.753281 -93.831161 31.774637 -93.822067 31.802017000000006 -93.834328 31.817272000000003 -93.864822 31.850112999999993 -93.877403 31.87142 -93.881264 31.870065999999994 -93.892525 31.894454999999994 -93.899261 31.892593000000005 -93.923462 31.909701999999996 -93.917923 31.909456000000006 -93.93573 31.923164 -93.969986 31.946158999999994 -93.977211 31.977942 -94.004395 31.989134000000007 -94.009888 31.994512999999998 -94.035065 32.199448000000004 -94.034767 32.389224999999996 -94.035233 32.694812999999996 -94.040199 32.882346999999996 -94.041603 33.023289000000005 -94.03875 33.022594 -93.809753 33.021152 -93.511742 33.021393 -93.478897 33.019238 -93.232376 33.018135 -92.978828 33.016701 -92.717079 33.010025 -92.063309 33.013874 -91.454353 33.013419999999996 -91.427528 33.013476999999995 -91.254616 33.013039000000006 -91.162132 33.000294 -91.161865 32.935852 -91.20916 32.914162000000005 -91.198311 32.905022 -91.169701 32.91778600000001 -91.137177 32.937466 -91.129936 32.975224 -91.132355 32.987350000000006 -91.111816 32.987621000000004 -91.092674 32.953711999999996 -91.075592 32.877162999999996 -91.079529 32.841212999999996 -91.142151 32.76268 -91.156342 32.751125 -91.136467 32.749397 -91.09771 32.723518 -91.059029 32.663174 -91.139557 32.644852 -91.146263 32.597527 -91.110992 32.606387999999995 -91.063812 32.614352999999994 -91.04763 32.641502 -91.027466 32.642673 -91.007881 32.625977000000006 -90.996132 32.615466999999995 -90.998657 32.582672 -91.032326 32.576389000000006 -91.058868 32.561611 -91.073265 32.542159999999996 -91.063087 32.511641999999995 -90.995071 32.495281000000006 -90.99205 32.490814 -91.019684 32.496956 -91.037201 32.548637 -91.088783 32.524067 -91.118744 32.498569 -91.117683 32.446999000000005 -91.05851 32.442417000000006 -91.026909 32.452965000000006 -90.98745 32.440037000000004 -90.965485 32.419017999999994 -90.969986 32.397082999999995 -91.009209 32.366234000000006 -90.998863 32.356396000000004 -90.984566 32.345898000000005 -90.914925 32.381355 -90.885155 32.37965 -90.875351 32.305317 -90.916374 32.297405 -90.929245 32.303698999999995 -90.971657 32.297653 -90.980766 32.287132 -90.983818 32.269065999999995 -90.971016 32.223404 -90.977219 32.249438999999995 -91.041649 32.232742 -91.062462 32.232388 -91.087914 32.21488600000001 -91.100571 32.225605 -91.115952 32.205864000000005 -91.157265 32.171988999999996 -91.166847 32.144783000000004 -91.15654 32.134991 -91.108711 32.148579 -91.083008 32.134392000000005 -91.054047 32.158671999999996 -91.045311 32.184532000000004 -91.054474 32.169899 -91.024414 32.169262 -91.00383 32.134060000000005 -91.011284 32.10767 -91.041084 32.093993999999995 -91.073814 32.058552000000006 -91.06501 32.056843 -91.089302 32.088245 -91.125618 32.085674 -91.145584 32.06610499999999 -91.143013 32.043655 -91.086884 32.031994 -91.073135 32.021057 -91.07238 31.991827 -91.108002 31.988291000000004 -91.163033 31.914288999999997 -91.201431 31.878511000000003 -91.24437 31.865425000000002 -91.26458 31.835226000000006 -91.241272 31.818658999999997 -91.250618 31.827371999999997 -91.276688 31.861332000000004 -91.292534 31.862983999999997 -91.30336 31.843317 -91.334732 31.79567 -91.347122 31.770703999999995 -91.36702 31.763458 -91.336143 31.773764 -91.262573 31.759600000000006 -91.263878 31.749723000000003 -91.282509 31.758379000000005 -91.339798 31.753310999999997 -91.370384 31.751576999999997 -91.36496 31.716517999999994 -91.387833 31.654439999999994 -91.389069 31.625364000000005 -91.408287 31.626801 -91.45726 31.650729999999996 -91.49765 31.643704999999997 -91.50769 31.62178 -91.508759 31.604192999999995 -91.497032 31.602427000000006 -91.415268 31.586186999999995 -91.404137 31.562579999999997 -91.423462 31.542699999999996 -91.464355 31.534713999999994 -91.502838 31.52552 -91.506363 31.452915000000004 -91.507782 31.420205999999993 -91.473175 31.403899999999993 -91.465805 31.377611 -91.480721 31.375079999999997 -91.494591 31.391921999999994 -91.522896 31.409069000000002 -91.53405 31.434166000000005 -91.534683 31.43293 -91.552353 31.421235999999993 -91.567612 31.388059999999996 -91.559258 31.382580000000004 -91.534454 31.368703999999994 -91.544289 31.346815000000007 -91.542671 31.323285999999996 -91.505638 31.298687 -91.502357 31.282898000000003 -91.51696 31.270296000000002 -91.556801 31.277518999999998 -91.634094 31.270943000000003 -91.643562 31.240928999999994 -91.636879 31.213755000000006 -91.600845 31.178307000000004 -91.59137 31.127517999999995 -91.619995 31.081958999999998 -91.564857 31.057982999999993 -91.551964 31.032471 -91.57267 31.011781999999997 -91.627655 31.001186000000004 -91.632179 31.000283999999994 -91.1791 31.000240000000005 -91.056908 31.001368 -90.829613 31.001527999999993 -90.560158 31.002150999999998 -90.542557 31.005211000000003 -90.343567 31.007191000000006 -90.259285 31.007002 -89.833481 31.007261 -89.732643 31.001340999999996 -89.723549 30.984431999999998 -89.726707 30.975308999999996 -89.719749 30.965215999999998 -89.739449 30.949663 -89.748466 30.925923999999995 -89.740402 30.920857999999996 -89.75798 30.909921999999995 -89.745682 30.902608999999998 -89.746727 30.900285999999994 -89.763237 30.861897999999997 -89.765778 30.861393000000007 -89.78495 30.830344999999994 -89.774727 30.828918 -89.796021 30.812466 -89.796494 30.811511999999993 -89.81086 30.789536999999996 -89.824615 30.74798 -89.813278 30.742459999999994 -89.825493 30.732866 -89.823326 30.729174 -89.835541 30.712236000000004 -89.843979 30.703592 -89.83065 30.700361 -89.84127 30.679331000000005 -89.841713 30.675693999999993 -89.83532 30.666062999999994 -89.845375 30.670685000000006 -89.829453 30.651055999999997 -89.819283 30.649266999999995 -89.805466 30.624081000000004 -89.820236 30.553753 -89.790779 30.551056000000003 -89.772728 30.515429999999995 -89.755112 30.497646000000003 -89.732254 30.495846 -89.718994 30.481223999999997 -89.71312 30.478054 -89.695618 30.467995000000002 -89.694534 30.462525999999997 -89.683388 30.44516 -89.6754 30.399880999999993 -89.675308 30.378872 -89.65461 30.355097 -89.646629 30.355114 -89.633392 30.343235000000007 -89.62014 30.323566 -89.61853 30.311649000000003 -89.637024 30.295635000000004 -89.639114 30.290160999999998 -89.625885 30.256769000000006 -89.621605 30.247632999999993 -89.606255 30.241224000000003 -89.609947 30.194738 -89.57383 30.180817000000005 -89.7285 30.230897999999996 -89.759155 30.269656999999995 -89.943466 30.368784000000005 -90.075485 30.380756000000005 -90.23967 30.303650000000005 -90.308945 30.185677999999996 -90.424446 30.091879000000006 -90.395485 30.061852000000002 -90.275902 30.041409 -90.111473 30.053462999999994 -89.990479 30.155893000000006 -89.891159 30.105172999999994 -89.798203 30.158731000000003 -89.740028 30.120897 -89.724869 30.163185 -89.669144 30.122229000000004 -89.649338 30.055026999999995 -89.716782 30.010485000000003 -89.8489 29.951088 -89.820786 29.969201999999996 -89.714958 29.897323999999998 -89.712143 29.875474999999994 -89.627357 29.897953 -89.585808 30.008758999999998 -89.574326 30.044205000000005 -89.435806 29.985530999999995 -89.453575 29.951083999999994 -89.377747 29.940074999999993 -89.431 29.845741000000004 -89.402153 29.827894 -89.421104 29.796570000000003 -89.363991 29.782731999999996 -89.417374 29.830743999999996 -89.482185 29.754524000000004 -89.540443 29.766693000000004 -89.650528 29.710655000000003 -89.592819 29.697537999999994 -89.611778 29.664406 -89.511887 29.635962000000006 -89.479134 29.664947999999995 -89.597893 29.702751000000006 -89.676643 29.693869000000007 -89.695267 29.626320000000007 -89.635201 29.645964000000006 -89.728256 29.637164999999996 -89.748482 29.605813999999995 -89.723145 29.610033 -89.771713 29.471469999999997 -89.544571 29.401235999999997 -89.537018 29.397722 -89.384468 29.340675000000005 -89.337006 29.350447000000003 -89.264725 29.29759 -89.262505 29.348831000000004 -89.193352 29.290667999999997 -89.12989 29.211662000000004 -89.120178 29.223191999999997 -89.033218 29.163218999999998 -89.098228 29.146894000000003 -89.021759 29.085052000000005 -89.057709 29.135084000000006 -89.126495 29.082790000000003 -89.111359 29.05699 -89.153976 29.016448999999994 -89.144348 29.120942999999997 -89.241112 29.059235 -89.257446 28.939419 -89.394844 29.147987 -89.263237 29.179964 -89.319038 29.104266999999993 -89.339684 29.100149000000002 -89.388611 29.146038000000004 -89.393082 29.216097000000005 -89.467018 29.255514000000005 -89.459061 29.234772000000007 -89.493141 29.279352000000003 -89.61953 29.331536999999997 -89.610657 29.322316999999998 -89.794876 29.374066999999997 -89.753639 29.420692000000003 -89.821678 29.477407 -89.817459 29.472459999999998 -89.966667 29.503325000000004 -89.971855 29.493719 -90.006622 29.553633000000005 -90.113007 29.533593999999994 -90.137215 29.595093000000006 -90.151718 29.544514000000007 -90.208069 29.495723999999996 -90.174057 29.446938000000003 -90.036011 29.428061999999997 -90.055252 29.373985000000005 -90.029869 29.351208 -90.05587 29.308646999999993 -90.032928 29.321500999999998 -90.111565 29.214346000000006 -90.077805 29.223448000000005 -90.043037 29.176212000000007 -90.077728 29.098444 -90.227684 29.184421999999998 -90.263878 29.254514999999998 -90.242836 29.274933000000004 -90.27874 29.245307999999994 -90.284019 29.312726999999995 -90.347565 29.272121 -90.396347 29.325767999999997 -90.406746 29.352219000000005 -90.450432 29.303717000000006 -90.476387 29.304811 -90.611008 29.260701999999995 -90.583046 29.222738000000007 -90.621178 29.254065999999995 -90.649963 29.162341999999995 -90.638031 29.181691999999998 -90.683769 29.140046999999996 -90.676704 29.126712999999995 -90.782806 29.160397000000003 -90.772598 29.182114 -90.839287 29.137184000000005 -90.882545 29.181684000000004 -90.920319 29.220781000000002 -90.814201 29.256578000000005 -90.818459 29.267443 -90.897255 29.343298000000004 -90.936432 29.359800000000007 -91.078285 29.313914999999994 -91.102089 29.405705999999995 -91.213631 29.489372000000003 -91.262619 29.552368 -91.432915 29.531470999999996 -91.547752 29.641918000000004 -91.548378 29.643753000000004 -91.643433 29.768929999999997 -91.615654 29.725629999999995 -91.863136 29.765747000000005 -91.881058 29.808189 -91.846512 29.786683999999994 -91.823814 29.838835000000003 -91.827385 29.841680999999994 -91.966965 29.805848999999995 -91.973206 29.73053 -92.137024 29.773314999999997 -92.129974 29.762908999999993 -92.19957 29.606800000000007 -92.059631 29.541351000000006 -92.297241 29.588403999999997 -92.607285 29.788773000000006 -93.233505 29.758573999999996 -93.721832 29.725645 -93.801659 29.809765 -93.899734 29.850303999999994 -93.79129 30.005964000000006 -93.760201 30.060519999999997 -93.712479 30.095669 -93.715858 30.114739999999998 -93.708382 30.117929000000004 -93.696922 30.141226000000003 -93.698639 30.141253000000006 -93.685959 30.148231999999993 -93.683144 30.150807999999998 -93.699661 30.175675999999996 -93.696167 30.180860999999993 -93.704361 30.220305999999994 -93.714844 30.239372000000003 -93.70735929.596264000000005 -92.016243 29.650718999999995 -91.902428 29.578401999999997 -91.76973 29.577053000000006 -91.7015 29.534039000000007 -91.764847 29.494297000000003 -91.757996 29.486866000000006 -91.848969 29.596264000000005 -92.01624329.341691999999995 -91.341209 29.316238 -91.300385 29.381181999999995 -91.226448 29.297392000000002 -91.189171 29.323502000000005 -91.161461 29.283457 -91.17112 29.284537999999998 -91.18792 29.307766 -91.200356 29.273453000000003 -91.194954 29.266313999999994 -91.152489 29.245047 -91.163559 29.259704999999997 -91.13459 29.226777999999996 -91.128204 29.253806999999995 -91.276054 29.341691999999995 -91.34120929.258872999999994 -90.934479 29.241874999999993 -90.970749 29.272836999999996 -90.953529 29.276128999999997 -90.981285 29.21973 -90.980286 29.226169999999996 -90.944885 29.185575 -90.961929 29.184093000000004 -91.003143 29.224581 -90.994469 29.211037000000005 -91.04435 29.275409999999994 -91.033005 29.252899 -91.067589 29.190692999999996 -91.055458 29.226864000000006 -91.122459 29.293295 -91.127411 29.297325 -91.007271 29.323582000000002 -90.998856 29.258872999999994 -90.934479Louisiana22W S CenLA112836.00819978.724219973.01089882.01499269.02031386.02188587.01468894.01239339.0247348.049252.01641614.0175303.0480026.0243755.00.4810.519628817.024.955967 -87.62572531.002975000000006 -80.05114728.784925 -80.785889 28.736064999999996 -80.762642 28.785916999999998 -80.832329 28.785431000000003 -80.850929 28.398709999999994 -80.747414 27.869877000000002 -80.49247 27.825405000000003 -80.509583 27.845419000000007 -80.482079 27.703277999999997 -80.401604 27.555349000000007 -80.357605 27.264324000000002 -80.239868 27.185357999999994 -80.190323 27.214741000000004 -80.22422 27.241014000000007 -80.289864 27.247938000000005 -80.327019 27.212528000000006 -80.290649 27.202517 -80.221504 27.108739999999997 -80.148201 26.973709 -80.090599 26.973502999999994 -80.114845 26.796858 -80.051147 26.326020999999997 -80.08493 25.977166999999994 -80.128014 25.759654999999995 -80.193329 25.613369000000006 -80.301682 25.489627999999996 -80.330215 25.400810000000007 -80.3022 25.249505999999997 -80.417038 25.191820000000007 -80.421028 25.211920000000006 -80.552094 25.151897000000005 -80.694038 25.185230000000004 -80.85701 25.130098000000004 -80.976082 25.133785000000003 -81.119217 25.164288 -81.14843 25.268479999999997 -81.183983 25.320368000000002 -81.14077 25.214028999999996 -81.011765 25.202136999999993 -80.951233 25.246325999999996 -80.915482 25.322063 -80.974487 25.396433000000002 -81.143524 25.680716000000004 -81.258575 25.710038999999995 -81.20015 25.802723 -81.256409 25.914282 -81.530937 25.923204 -81.718483 25.999798 -81.705887 26.110792000000004 -81.794907 26.284103 -81.814049 26.331834999999998 -81.849541 26.439195999999995 -81.864403 26.467205000000007 -81.942207 26.517027 -81.968307 26.534626000000003 -81.928963 26.642636999999993 -81.884468 26.709919 -81.774109 26.663417999999993 -81.897293 26.550365 -81.944641 26.524323999999993 -82.02166 26.715442999999993 -82.083847 26.766623999999993 -82.068459 26.866366999999997 -82.051956 26.921446000000003 -82.098061 26.962719000000007 -81.991631 27.031345 -81.979385 27.031341999999995 -81.993042 26.976213 -82.012878 26.936725999999993 -82.153397 27.004071999999994 -82.257645 27.024220999999997 -82.282364 26.997569999999996 -82.257767 26.913353 -82.176682 26.789783 -82.154015 26.849542999999997 -82.290024 26.948556999999994 -82.355614 26.998177999999996 -82.398354 26.947598999999997 -82.368851 26.903291999999993 -82.343811 26.946956999999998 -82.380219 27.236664000000005 -82.507111 27.259951 -82.531311 27.210125000000005 -82.514664 27.273954000000003 -82.570137 27.331478000000004 -82.532921 27.386359999999996 -82.565742 27.473528 -82.686104 27.503142999999994 -82.639069 27.493270999999993 -82.666008 27.524114999999995 -82.681885 27.477749000000003 -82.488449 27.511673000000002 -82.514381 27.522543 -82.427361 27.512009000000006 -82.575752 27.536323999999993 -82.638947 27.552398999999994 -82.569786 27.581925999999996 -82.554443 27.554879999999997 -82.626556 27.607794 -82.540222 27.643703000000002 -82.552681 27.791323000000006 -82.404564 27.905918 -82.399002 27.939856000000006 -82.461182 27.821644000000006 -82.483315 27.830928999999998 -82.51078 27.935429 -82.539177 28.028550999999993 -82.645744 28.006866000000002 -82.650864 28.045873999999998 -82.698517 28.010217999999995 -82.672897 27.975055999999995 -82.700844 27.966285999999997 -82.64492 27.940264 -82.725662 27.878159999999994 -82.564445 27.848225 -82.623833 27.715418 -82.644798 27.705280000000002 -82.678505 27.829351000000003 -82.794014 27.717466 -82.72834 27.685559999999995 -82.74118 27.850340000000003 -82.84446 28.172736999999998 -82.77932 28.428231999999994 -82.673653 28.692483999999993 -82.636253 28.808122999999995 -82.681557 28.814018000000004 -82.636696 28.884451 -82.636795 29.008409999999998 -82.755493 29.154886000000005 -82.802322 29.179143999999994 -83.036903 29.265411 -83.074081 29.299412000000004 -83.142357 29.327944000000002 -83.109146 29.343441 -83.174782 29.433701999999997 -83.234474 29.519644 -83.380173 29.669376 -83.405113 29.737100999999996 -83.550583 29.910746000000003 -83.654312 30.077274000000003 -83.971855 30.099740999999995 -84.074738 30.081518000000003 -84.147964 30.107906 -84.233177 30.069419999999994 -84.354027 29.977183999999994 -84.360519 29.991586999999996 -84.43779 29.959339 -84.433205 29.946934 -84.339043 29.909959999999998 -84.347015 29.929419999999993 -84.464638 29.746649000000005 -84.858124 29.777760999999998 -84.928604 29.719708999999995 -84.988373 29.701345000000003 -85.214844 29.682806 -85.36496 29.776556 -85.409683 29.862859999999998 -85.414131 29.875206000000006 -85.393074 29.794155000000003 -85.402626 29.691041999999996 -85.358124 29.701498 -85.306671 29.809586999999993 -85.300606 29.923595000000006 -85.384872 30.092388 -85.628571 30.098090999999997 -85.568604 30.021659999999997 -85.471436 30.031349000000006 -85.415092 30.045551000000003 -85.432465 30.024067000000002 -85.382774 30.036083000000005 -85.382736 30.058364999999995 -85.395752 30.050961 -85.464394 30.131484999999998 -85.529793 30.178572000000003 -85.7099 30.251490000000004 -85.66613 30.250951999999998 -85.60025 30.310806 -85.56955 30.264861999999994 -85.717201 30.296729999999997 -85.752777 30.280158999999998 -85.850487 30.232613 -85.830009 30.228745000000004 -85.757988 30.128639000000007 -85.726463 30.274229000000005 -85.987076 30.387459000000007 -86.387512 30.409773 -86.505363 30.405812999999995 -86.388161 30.399688999999995 -86.240089 30.428329000000005 -86.241623 30.385603000000003 -86.1147 30.426264000000003 -86.122993 30.487657999999996 -86.219666 30.461968999999996 -86.387932 30.501040000000003 -86.45269 30.423451999999997 -86.610283 30.417765000000003 -86.79039 30.355022000000005 -87.193413 30.463367000000005 -86.932549 30.514238000000006 -87.014435 30.590237000000002 -86.986229 30.587272999999996 -87.019615 30.450367 -87.069305 30.564471999999995 -87.124565 30.557541 -87.171585 30.464836000000005 -87.160133 30.357185 -87.273926 30.323470999999998 -87.424103 30.40204 -87.409279 30.431301000000005 -87.346832 30.456971999999993 -87.34742 30.481504 -87.418839 30.531194999999997 -87.445374 30.556298999999996 -87.422089 30.619905000000003 -87.393303 30.667823999999996 -87.398666 30.692618999999993 -87.418915 30.705612000000002 -87.460159 30.748301999999995 -87.526619 30.785506999999996 -87.541916 30.848110000000005 -87.615929 30.876717 -87.625725 30.954178 -87.589882 31.002449 -87.598595 31.002975000000006 -87.163147 30.998011000000005 -86.779404 30.997911000000002 -86.701897 30.991358000000005 -86.383972 30.995045000000005 -86.181534 30.993146999999993 -86.031883 31.000816 -85.486664 31.000820000000004 -85.485077 31.001068000000004 -85.001678 30.979134000000002 -85.000214 30.963477999999995 -84.97364 30.926907 -84.969086 30.894769999999994 -84.937851 30.846733 -84.927002 30.802435000000003 -84.93264 30.775897999999998 -84.926971 30.753899000000004 -84.915421 30.743697999999995 -84.888367 30.714312000000007 -84.864662 30.712473000000003 -84.863083 30.693897000000007 -84.374542 30.690224 -84.281761 30.678381 -84.075668 30.675341000000003 -84.000839 30.660292 -83.737961 30.650582999999997 -83.609177 30.634096 -83.31073 30.633077999999998 -83.301445 30.621129999999994 -83.132576 30.595502999999994 -82.696503 30.588835000000003 -82.583107 30.582468000000006 -82.463287 30.577084 -82.412247 30.566845 -82.221199 30.531214000000006 -82.238556 30.502739000000005 -82.219528 30.489782000000005 -82.199348 30.42362 -82.205727 30.368397 -82.180397 30.361057000000002 -82.164803 30.363557999999998 -82.052933 30.378668000000005 -82.038521 30.433831999999995 -82.046265 30.442642000000006 -82.035286 30.477481999999995 -82.022675 30.570755000000005 -82.005966 30.598455 -82.013817 30.650677 -82.045074 30.757299000000003 -82.032043 30.764022999999995 -82.01313 30.791086000000007 -82.015701 30.778118000000006 -81.981644 30.795773999999994 -81.961716 30.820198000000005 -81.953194 30.824016999999998 -81.94397 30.813242000000002 -81.907684 30.828075 -81.899307 30.798851 -81.873169 30.787851000000003 -81.803368 30.761351000000005 -81.776878 30.769397999999995 -81.757881 30.763655 -81.736847 30.745133999999993 -81.716942 30.728846000000004 -81.642654 30.731538999999998 -81.628159 30.716085000000007 -81.60495 30.724650999999994 -81.601349 30.706340999999995 -81.536774 30.721216 -81.528778 30.598367999999994 -81.49897 30.555975000000004 -81.518303 30.454525000000004 -81.457718 30.380301000000003 -81.480988 30.356947000000005 -81.443451 30.246539999999996 -81.432961 29.912806000000003 -81.302963 29.828992999999997 -81.316696 29.737694000000005 -81.243996 29.668774 -81.233978 29.429985000000002 -81.1101 29.351543000000007 -81.097275 28.784925 -80.78588930.399535999999998 -86.833923 30.403769999999994 -86.791595 30.414351999999994 -86.620872 30.406591000000006 -86.534805 30.400948 -86.52282 30.393187999999995 -86.532692 30.402359000000004 -86.738686 30.390366 -86.793007 30.386838999999995 -86.834625 30.321231999999995 -87.242378 30.321231999999995 -87.267075 30.332520000000002 -87.290352 30.339573 -87.286118 30.334635000000006 -87.202171 30.351566000000005 -87.139381 30.369202 -87.047676 30.381195000000005 -86.929161 30.399535999999998 -86.83392328.788576000000006 -80.736061 28.821799999999996 -80.763557 28.895123999999996 -80.817406 29.013130000000004 -80.891304 29.071560000000005 -80.916512 29.061249000000004 -80.899323 28.991361999999995 -80.862663 28.788576000000006 -80.73606128.784098 -80.726128 28.589879999999994 -80.579918 28.463184 -80.526176 28.408979000000002 -80.587883 28.412378000000004 -80.621857 28.548378 -80.577675 28.603649000000004 -80.599358 28.618378000000007 -80.660271 28.588076 -80.692108 28.618686999999994 -80.78067 28.687444999999997 -80.786156 28.706346999999994 -80.735222 28.736614000000003 -80.754295 28.657073999999994 -80.641426 28.784098 -80.72612828.581490000000002 -80.68885 28.600616000000002 -80.654022 28.573291999999995 -80.609421 28.427130000000005 -80.662956 28.301556000000005 -80.667336 28.144653000000005 -80.605797 28.385118000000006 -80.721268 28.581490000000002 -80.6888526.585724 -82.102127 26.497208 -82.067139 26.493585999999993 -82.097641 26.642279000000002 -82.135895 26.683082999999996 -82.183495 26.693342 -82.128838 26.585724 -82.10212725.354546 -80.24968 25.157832999999997 -80.355888 24.955967 -80.588036 25.211134 -80.353287 25.267585999999994 -80.330521 25.296104 -80.361824 25.354546 -80.24968Florida12S AtlFL139852.12330456.7971.2937926E73511825.05134869.06261719.06676207.04943568.04468021.0818546.0116352.05810467.0356769.01683987.0675050.00.4840.5161603894.041.69744499999999 -90.4080248.173923 -82.41992248.173923 -88.497459 48.033287 -88.625252 47.960361000000006 -88.901466 47.850761000000006 -89.028534 47.82418100000001 -89.139793 47.844719 -89.192825 47.88396499999999 -89.201698 47.93933899999999 -89.156013 48.173923 -88.49745947.290257 -88.500565 47.355976 -88.43779 47.447922000000005 -88.211288 47.47089 -87.78801 47.416045999999994 -87.704269 47.39312000000001 -87.737396 47.35809699999999 -87.916931 47.200829 -88.222168 46.988167000000004 -88.41272 47.111546000000004 -88.470543 47.134838 -88.594139 47.243668000000014 -88.595512 47.290257 -88.50056545.96948599999999 -85.859734 45.95799600000001 -85.914841 45.91820899999999 -85.916992 45.96423300000001 -86.067764 45.946957 -86.259178 45.905708000000004 -86.315498 45.834419 -86.343658 45.762767999999994 -86.458138 45.748980999999986 -86.529251 45.72411299999999 -86.521873 45.710194 -86.575989 45.62125 -86.629654 45.65006600000001 -86.684921 45.692532 -86.696785 45.81390400000001 -86.584595 45.82609600000001 -86.76133 45.71480600000001 -86.901489 45.69627800000001 -87.123627 45.55482900000001 -87.260582 45.42396500000001 -87.332108 45.16274999999999 -87.583755 45.108517000000006 -87.592407 45.140690000000006 -87.672707 45.176624000000004 -87.729561 45.199093000000005 -87.736092 45.211693 -87.721519 45.236794 -87.719559 45.247108 -87.705032 45.27222800000001 -87.704361 45.34819400000001 -87.645248 45.36188100000001 -87.64357 45.39129600000001 -87.689484 45.352924 -87.759926 45.358349000000004 -87.827896 45.346176000000014 -87.841171 45.370193 -87.861984 45.37210099999999 -87.868423 45.36211399999999 -87.873863 45.365883 -87.883499 45.406147000000004 -87.849419 45.44512900000001 -87.860153 45.46649199999999 -87.813499 45.4991 -87.789268 45.54455899999999 -87.805023 45.568625999999995 -87.828484 45.568554000000006 -87.786194 45.60042200000001 -87.774956 45.613235 -87.775925 45.654487999999986 -87.819817 45.66542799999999 -87.816933 45.67595299999999 -87.780823 45.68413899999999 -87.777351 45.701362999999986 -87.801033 45.71143000000001 -87.80143 45.72245799999999 -87.842239 45.75074000000001 -87.873505 45.766491 -87.969055 45.79508999999999 -87.989944 45.786156000000005 -88.051514 45.79157599999999 -88.088608 45.819447 -88.129822 45.834923 -88.121658 45.87368799999999 -88.065292 45.891850000000005 -88.095634 45.92066199999999 -88.093719 45.926334 -88.111259 45.93634 -88.150307 45.953564 -88.180061 45.947948 -88.214859 45.96710200000001 -88.257034 45.961989999999986 -88.299019 45.966758999999996 -88.32119 45.99463299999999 -88.369804 45.98346699999999 -88.403389 46.000805000000014 -88.454185 45.999194999999986 -88.483681 46.013003999999995 -88.49395 46.018654 -88.51548 46.01934399999999 -88.548225 46.00900300000001 -88.575226 46.015559999999994 -88.597404 45.99416400000001 -88.615372 45.99343099999999 -88.643539 46.02018699999999 -88.677254 46.018967 -88.703476 46.02962500000001 -88.72628 46.02119099999999 -88.772888 46.032658 -88.777351 46.036404000000005 -88.793686 46.026848 -88.804268 46.073646999999994 -88.925064 46.100437 -88.985168 46.145691 -89.09967 46.30407700000001 -89.924973 46.34048100000001 -90.111488 46.365207999999996 -90.115005 46.39395099999999 -90.141624 46.442432 -90.161217 46.506348 -90.211349 46.50884199999999 -90.258224 46.52253300000001 -90.269608 46.525104999999996 -90.300003 46.54435000000001 -90.302216 46.55161699999999 -90.31353 46.53971100000001 -90.385345 46.56866500000001 -90.40802 46.678687999999994 -90.018692 46.76899 -89.886086 46.824768000000006 -89.791084 46.850266000000005 -89.386574 46.923439 -89.214455 46.996669999999995 -89.125053 46.997169000000014 -88.994743 47.03099399999999 -88.929558 47.104625999999996 -88.884705 47.225887 -88.629379 47.13118700000001 -88.617981 47.10657900000001 -88.511093 47.03266099999999 -88.512871 46.99080699999999 -88.44104 46.92837499999999 -88.445839 46.855221 -88.476395 46.799465 -88.446487 46.945965 -88.177704 46.90103099999999 -88.189064 46.91194200000001 -88.03656 46.90984 -87.900528 46.836929 -87.663635 46.50805700000001 -87.371399 46.50153700000001 -87.110535 46.53635800000001 -87.006256 46.44442000000001 -86.871231 46.486694 -86.759338 46.42231799999999 -86.638062 46.56113400000001 -86.462227 46.67308399999999 -86.147942 46.65529599999999 -86.096573 46.694828 -85.857376 46.67416800000001 -85.503716 46.75676300000001 -85.22998 46.770927 -84.954681 46.69431700000001 -85.026886 46.549004 -85.01889 46.50555800000001 -85.051567 46.476425000000006 -85.016556 46.48782299999999 -84.931244 46.444035000000014 -84.803589 46.482922 -84.629761 46.407906 -84.572617 46.480637 -84.415924 46.488646999999986 -84.311577 46.248703000000006 -84.181618 46.207291 -84.273102 46.17142899999999 -84.247002 46.17608999999999 -84.119713 46.12892500000001 -84.029564 46.09445199999999 -84.061966 46.02596700000001 -83.989494 46.005882000000014 -83.901947 45.96021999999999 -83.906456 45.978519000000006 -84.113258 45.99917199999999 -84.354454 45.978329 -84.501595 46.038216000000006 -84.616798 46.03590399999999 -84.688972 45.85566700000001 -84.731682 45.890625 -84.851044 46.024742 -85.061562 46.10004799999999 -85.378151 46.101916999999986 -85.509445 45.972881 -85.655281 45.96948599999999 -85.85973446.01401100000001 -83.854675 45.988392000000005 -83.801102 46.02731700000001 -83.756416 46.036170999999996 -83.673592 46.071774000000005 -83.680313 46.08408700000001 -83.732445 46.103950999999995 -83.649887 46.08849699999999 -83.5895 46.01176799999999 -83.533997 45.987526 -83.473198 45.92569399999999 -83.516167 45.91748000000001 -83.579819 45.953575 -83.629707 45.936745 -83.804878 45.99742900000001 -83.852806 45.970833 -83.885887 46.01401100000001 -83.85467541.765465000000006 -86.834801 41.90740600000001 -86.617569 42.126408 -86.49881 42.24938599999999 -86.374252 42.42229499999999 -86.28495 42.77480299999999 -86.217812 43.12102899999999 -86.273781 43.47515899999999 -86.463127 43.66318100000001 -86.541222 43.772659000000004 -86.447731 43.766636000000005 -86.404266 43.781452 -86.434021 43.82011800000001 -86.428734 43.95017999999999 -86.459465 43.94558699999999 -86.438065 44.053616000000005 -86.518517 44.183201 -86.386337 44.351226999999994 -86.271866 44.52227400000001 -86.237946 44.700733000000014 -86.25853 44.734443999999996 -86.108391 44.777930999999995 -86.082825 44.850616 -86.09787 44.89826199999999 -86.06736 44.98597699999999 -85.79567 45.196529 -85.61013 45.18056100000001 -85.56543 44.95836299999999 -85.652924 44.778435 -85.637962 44.763161 -85.526009 44.86053799999999 -85.451279 45.01060100000001 -85.384796 45.21159 -85.390167 45.273537000000005 -85.373177 45.32037700000001 -85.305405 45.370216 -85.092804 45.37316899999999 -84.98584 45.40988899999999 -84.921623 45.464642 -85.081757 45.569771 -85.120384 45.630177 -85.077957 45.683704000000006 -84.983353 45.73773600000001 -84.971977 45.780293 -84.724136 45.653625000000005 -84.46524 45.665595999999994 -84.321434 45.63089400000001 -84.205544 45.57133099999999 -84.135216 45.498737000000006 -84.105896 45.49176 -83.92289 45.409435 -83.782814 45.41238000000001 -83.712326 45.34948700000001 -83.592377 45.36078599999999 -83.49585 45.328922000000006 -83.489616 45.27289200000001 -83.394043 45.25716800000001 -83.420784 45.213627 -83.39872 45.09860599999999 -83.312737 45.052761000000004 -83.444466 45.01111599999999 -83.433998 44.997871 -83.464928 44.92628500000001 -83.429382 44.860634000000005 -83.319756 44.703171 -83.280846 44.515446 -83.320068 44.335117 -83.356995 44.261257 -83.529175 44.17010099999999 -83.56826 44.07047700000001 -83.598427 43.99714700000001 -83.704819 43.96282199999999 -83.873627 43.916977 -83.918388 43.698261 -83.938141 43.59962100000001 -83.699196 43.60739899999999 -83.654648 43.72592499999999 -83.530945 43.70282399999999 -83.494286 43.745723999999996 -83.466446 43.844437 -83.367203 43.94044500000001 -83.326065 44.06994599999999 -82.940208 44.03355400000001 -82.806038 43.97249600000001 -82.727966 43.787848999999994 -82.618561 43.69454999999999 -82.605812 43.172225999999995 -82.503899 42.97243499999999 -82.419922 42.898651 -82.472038 42.76286300000001 -82.473328 42.634018 -82.518272 42.63169500000001 -82.645966 42.66935000000001 -82.634102 42.681194000000005 -82.729889 42.635761 -82.820488 42.61289199999999 -82.802444 42.495720000000006 -82.888222 42.458031000000005 -82.874992 42.36300299999999 -82.929474 42.292666999999994 -83.107666 42.115706999999986 -83.193947 42.03393600000001 -83.19014 41.725081999999986 -83.482758 41.71699100000001 -83.764015 41.71594200000001 -83.868698 41.707989 -84.359261 41.7071 -84.384445 41.69744499999999 -84.790421 41.760909999999996 -84.788521 41.76182600000001 -84.82605 41.76281700000001 -85.193169 41.763531 -85.297234 41.76257699999999 -85.65947 41.763485 -85.799232 41.764579999999995 -86.068298 41.764815999999996 -86.234558 41.76549499999999 -86.525162 41.765465000000006 -86.834801Michigan26E N CenMI147135.82112547.9129295297.02439171.03419331.04512781.04782516.03388716.03327685.0429086.066653.04166196.0374341.01138730.0717162.00.4850.5151735861.044.35372899999999 -116.062549.0 -104.0425844.70223999999999 -111.474632 44.691494000000006 -111.480011 44.67010099999999 -111.4599 44.652634000000006 -111.457474 44.64078900000001 -111.469376 44.637767999999994 -111.506897 44.616051 -111.500954 44.593277 -111.513733 44.55126999999999 -111.492111 44.55002200000001 -111.462036 44.538002000000006 -111.458534 44.536224000000004 -111.481781 44.52877799999999 -111.489449 44.55294799999999 -111.566437 44.543071999999995 -111.604454 44.550835000000006 -111.684067 44.53384399999999 -111.716202 44.51890900000001 -111.766121 44.51854700000001 -111.791809 44.504065999999995 -111.807037 44.55635100000001 -111.871696 44.549812 -111.939575 44.529762000000005 -111.977005 44.53513000000001 -112.022797 44.52293 -112.02626 44.52869799999999 -112.058548 44.518317999999994 -112.099075 44.52833899999999 -112.123367 44.53153599999999 -112.19883 44.53858199999999 -112.216934 44.55957799999999 -112.229568 44.560058999999995 -112.255844 44.54178999999999 -112.281509 44.525188000000014 -112.341675 44.49726899999999 -112.339745 44.44936000000001 -112.366753 44.449375 -112.419922 44.46892500000001 -112.457687 44.463089 -112.501007 44.477588999999995 -112.53849 44.48089200000001 -112.652351 44.49702500000001 -112.713486 44.484409 -112.732872 44.47400999999999 -112.779022 44.458099000000004 -112.795387 44.42117300000001 -112.825851 44.39490900000001 -112.817871 44.364292000000006 -112.816559 44.35372899999999 -112.843437 44.370068 -112.869942 44.39294100000001 -112.886467 44.407279999999986 -112.937439 44.43562700000001 -112.984406 44.43780100000001 -113.011169 44.45270199999999 -113.005814 44.48186100000001 -113.019463 44.510695999999996 -113.006866 44.53304299999999 -113.036972 44.556377 -113.038811 44.582764 -113.082184 44.624371 -113.053436 44.67560599999999 -113.072289 44.69599500000001 -113.098099 44.71525199999999 -113.100845 44.737457000000006 -113.126572 44.761517 -113.137413 44.811916 -113.239471 44.810562000000004 -113.256287 44.780304 -113.31781 44.779076 -113.33976 44.80764400000001 -113.349152 44.833775 -113.420502 44.851315 -113.444695 44.930744000000004 -113.495308 44.939648000000005 -113.486465 44.940848999999986 -113.462532 44.949596000000014 -113.447884 44.998267999999996 -113.440147 45.027523 -113.45797 45.04342299999999 -113.454552 45.05839499999999 -113.48542 45.071293 -113.489273 45.082137999999986 -113.519722 45.107910000000004 -113.509338 45.10762399999999 -113.551384 45.117785999999995 -113.573486 45.13462100000001 -113.570694 45.14981800000001 -113.593208 45.18106800000001 -113.600037 45.20686699999999 -113.644699 45.26236 -113.689224 45.27786599999999 -113.687813 45.321608999999995 -113.738182 45.382464999999996 -113.74041 45.410252000000014 -113.774124 45.44571300000001 -113.78476 45.477787000000006 -113.768265 45.50713300000001 -113.7714 45.51694499999999 -113.780029 45.51498799999999 -113.832809 45.583809 -113.802849 45.600716000000006 -113.821579 45.60964200000001 -113.85112 45.61357100000001 -113.902397 45.63733300000001 -113.901291 45.655204999999995 -113.922623 45.671291 -113.925789 45.67945900000001 -113.963234 45.69745599999999 -113.970238 45.68641299999999 -114.00856 45.672459 -114.018967 45.652592 -114.010078 45.64085399999999 -114.01712 45.625225 -114.055603 45.58645999999999 -114.082054 45.57120900000001 -114.117226 45.550465 -114.131134 45.544005999999996 -114.171753 45.52799999999999 -114.193893 45.53537399999999 -114.241081 45.503029 -114.246964 45.48594299999999 -114.261322 45.45750799999999 -114.325516 45.46346700000001 -114.349327 45.485825000000006 -114.370537 45.49909199999999 -114.418129 45.52771799999999 -114.432632 45.547932 -114.461784 45.54673399999999 -114.495667 45.558277000000004 -114.526466 45.548823999999996 -114.559998 45.59648100000001 -114.540031 45.62435500000001 -114.563751 45.652477000000005 -114.500816 45.67414099999999 -114.509781 45.694484999999986 -114.496635 45.72308000000001 -114.53405 45.746082 -114.541031 45.762482000000006 -114.562614 45.81014999999999 -114.516449 45.84276600000001 -114.498238 45.83955 -114.472878 45.85270299999999 -114.442307 45.84653499999999 -114.406601 45.870968000000005 -114.391914 45.910731999999996 -114.412605 45.921558000000005 -114.428535 45.95406 -114.404366 45.972054000000014 -114.411522 45.98988700000001 -114.483528 46.00984600000001 -114.473602 46.02349100000001 -114.493393 46.050895999999995 -114.464828 46.08231000000001 -114.455101 46.107437000000004 -114.47644 46.11622199999999 -114.505638 46.136143000000004 -114.518013 46.157497000000006 -114.508682 46.15534199999999 -114.466087 46.169048000000004 -114.439949 46.22033300000001 -114.438622 46.24386200000001 -114.471901 46.25304 -114.472862 46.28478999999999 -114.430862 46.39299 -114.408859 46.39962399999999 -114.39608 46.428257 -114.383087 46.487449999999995 -114.409775 46.506203 -114.359528 46.51746700000001 -114.349174 46.58795900000001 -114.342377 46.622917 -114.323769 46.654304999999994 -114.33374 46.661674000000005 -114.383072 46.645793999999995 -114.44059 46.62365299999999 -114.483772 46.637969999999996 -114.539444 46.62912800000001 -114.609879 46.66090399999999 -114.643791 46.67100099999999 -114.644089 46.687186999999994 -114.624977 46.734802 -114.672935 46.73384100000001 -114.697479 46.695212999999995 -114.747154 46.70312100000001 -114.781967 46.755798 -114.776878 46.76661300000001 -114.793076 46.77562 -114.839836 46.79712699999999 -114.865646 46.799515000000014 -114.901367 46.85252800000001 -114.947449 46.89096799999999 -114.939606 46.90724599999999 -114.923164 46.92529300000001 -114.963768 46.958889 -115.00061 46.96308099999999 -115.036369 46.97343799999999 -115.054672 47.02660399999999 -115.080368 47.06362899999999 -115.134537 47.09182000000001 -115.147713 47.09764899999999 -115.171524 47.12410399999999 -115.192101 47.17962600000001 -115.295258 47.24522400000001 -115.324249 47.25509600000001 -115.342682 47.263667999999996 -115.407227 47.27444800000001 -115.425659 47.28171900000001 -115.500946 47.292057 -115.522079 47.334686000000005 -115.554535 47.370075000000014 -115.598549 47.38011599999999 -115.637794 47.399238999999994 -115.665489 47.42254600000001 -115.749336 47.43403599999999 -115.749115 47.44537399999999 -115.731491 47.44924900000001 -115.655098 47.457863 -115.642197 47.475303999999994 -115.639153 47.489609 -115.69178 47.520962 -115.700531 47.53376 -115.741837 47.59079 -115.691093 47.616150000000005 -115.697289 47.63995 -115.73307 47.69562500000001 -115.732666 47.70980499999999 -115.774727 47.744911 -115.789536 47.75635500000001 -115.835739 47.805256000000014 -115.84832 47.827526000000006 -115.868805 47.841148000000004 -115.902916 47.867199 -115.936836 47.925217 -115.997925 47.965014999999994 -116.024307 47.976269 -116.052483 48.208549000000005 -116.054497 48.498726000000005 -116.055679 48.99999600000001 -116.0625 49.0 -114.728333 49.0 -114.0625 48.99999600000001 -112.1875 49.0 -111.281876 49.0 -110.75 48.99999600000001 -109.5 48.99999600000001 -108.25 48.99999600000001 -107.1875 48.99999600000001 -106.125 48.99999600000001 -105.0625 49.0 -104.0625 48.64579800000001 -104.051826 48.390995000000004 -104.05162 48.00006099999999 -104.047935 47.400002 -104.046822 47.33381700000001 -104.045441 46.64293699999999 -104.046951 46.54253 -104.046219 46.280876000000006 -104.047348 45.942993 -104.048416 45.88305299999999 -104.049026 45.212886999999995 -104.043358 44.997817999999995 -104.04258 44.997349000000014 -104.059349 45.001091 -105.04126 44.999832 -105.084465 44.99722700000001 -106.020576 44.996173999999996 -106.258644 44.99981299999999 -107.893715 45.000159999999994 -108.258568 44.99764300000001 -108.624573 44.99958000000001 -109.798653 45.00285299999999 -109.994789 44.99868799999999 -110.392006 44.99234799999999 -110.428894 44.995766 -111.05265 44.66456199999999 -111.050842 44.47339600000001 -111.050789 44.486198 -111.093857 44.500832 -111.128143 44.52797699999999 -111.133583 44.54526100000001 -111.169464 44.564926000000014 -111.177986 44.57324600000001 -111.218727 44.60263800000001 -111.233452 44.61805699999999 -111.219017 44.62698399999999 -111.22319 44.64228800000001 -111.269882 44.673878 -111.269424 44.683013999999986 -111.294884 44.70526899999999 -111.31469 44.72793999999999 -111.318436 44.72625400000001 -111.34919 44.74516299999999 -111.371521 44.73777000000001 -111.384171 44.708946 -111.394295 44.713257 -111.442841 44.70223999999999 -111.474632Montana30MtnMT376990.8943858.589799065.0211666.0306163.0395769.0403296.0293243.0250373.041442.02050.0350723.026217.0123090.043619.00.4950.505150091.043.09096099999999 -71.0879947.45329699999999 -66.96984944.074073999999996 -69.777786 43.99992399999999 -69.860435 43.756001 -69.792038 43.727901 -69.830902 43.74424400000001 -69.852295 43.842262000000005 -69.846664 43.876633 -69.887299 43.790649 -69.903641 43.768764000000004 -69.973412 43.786125 -70.000008 43.84565699999999 -69.987877 43.84551999999999 -70.026909 43.78972999999999 -70.157135 43.68571499999999 -70.236305 43.577156 -70.222748 43.534823999999986 -70.342117 43.430217999999996 -70.366432 43.349383999999986 -70.457481 43.335632000000004 -70.539444 43.09096099999999 -70.666176 43.12178399999999 -70.819168 43.159088 -70.831047 43.235138000000006 -70.813705 43.280936999999994 -70.901581 43.301987 -70.906296 43.366299 -70.970192 43.39610300000001 -70.979591 43.438046000000014 -70.961975 43.47013100000001 -70.971283 43.51630800000001 -70.95977 43.53191000000001 -70.96476 43.54887400000001 -70.950111 43.564064 -70.957016 43.571751000000006 -70.974365 43.791088 -70.984932 44.282082 -71.009079 44.66848400000001 -71.029205 45.301422 -71.08799 45.338818 -70.959862 45.22539499999999 -70.87693 45.278088 -70.843361 45.354629999999986 -70.813148 45.39067800000001 -70.829613 45.42512500000001 -70.797447 45.391918000000004 -70.635414 45.51290900000001 -70.72039 45.660618 -70.55275 45.72200000000001 -70.396866 45.79026400000001 -70.416695 45.89896400000001 -70.254448 45.94458 -70.247948 45.96874199999999 -70.310776 46.05311599999999 -70.280502 46.06662 -70.305328 46.13739799999999 -70.229805 46.190212 -70.283974 46.33480499999999 -70.191536 46.426083000000006 -70.047089 46.57056399999999 -70.014626 46.691329999999994 -69.985458 47.45329699999999 -69.230789 47.421992999999986 -69.047478 47.257328 -69.037231 47.18222 -68.895386 47.29692499999999 -68.515182 47.285056999999995 -68.391769 47.35733400000001 -68.335327 47.35210799999999 -68.231323 47.060959 -67.79155 45.94700599999999 -67.78083 45.91652300000001 -67.756157 45.87841800000001 -67.795113 45.827740000000006 -67.759911 45.794448999999986 -67.803596 45.67805100000001 -67.803978 45.65922499999999 -67.753502 45.68123600000001 -67.718582 45.605132999999995 -67.615692 45.592495000000014 -67.439857 45.50348700000001 -67.416641 45.485748 -67.504662 45.37578199999999 -67.419113 45.28020900000001 -67.478508 45.18951000000001 -67.439995 45.12217699999999 -67.346169 45.18270899999999 -67.274658 45.15618900000001 -67.166473 45.121914000000004 -67.15123 44.959216999999995 -67.065933 44.904503000000005 -67.147278 44.828575 -66.969849 44.78054399999999 -67.008293 44.65370200000001 -67.200935 44.65344200000001 -67.309036 44.691322000000014 -67.389076 44.598254999999995 -67.571556 44.54016100000001 -67.6194 44.553932 -67.811775 44.535999000000004 -67.859116 44.452319999999986 -67.900597 44.471149 -67.968895 44.50524899999999 -67.963989 44.484734 -67.987076 44.38487599999999 -68.016945 44.381294 -68.074928 44.47515899999999 -68.13681 44.49056999999999 -68.246155 44.431309 -68.364304 44.465228999999994 -68.429108 44.398971999999986 -68.552719 44.28975700000001 -68.530609 44.25980799999999 -68.559959 44.34625199999999 -68.740837 44.327354000000014 -68.813377 44.413914000000005 -68.814293 44.507209999999986 -68.741875 44.552246 -68.745804 44.608833000000004 -68.824074 44.664017 -68.824333 44.610896999999994 -68.86113 44.56958 -68.808426 44.494518 -68.812202 44.430256000000014 -68.959702 44.271033999999986 -68.98555 44.24401499999999 -69.022003 44.068985 -69.074974 43.94670500000001 -69.21965 43.94210799999999 -69.294159 44.01588799999999 -69.346962 44.025047 -69.394997 43.887077000000005 -69.483742 43.844779999999986 -69.589836 43.852141999999986 -69.664963 43.98017100000001 -69.655754 44.033535 -69.613441 43.93790100000001 -69.721146 43.893294999999995 -69.749039 43.784392999999994 -69.725182 43.76161999999999 -69.75087 43.79118700000001 -69.778183 44.026791 -69.800522 44.04765699999999 -69.767265 44.074073999999996 -69.77778644.377174 -68.388458 44.39887200000001 -68.350792 44.42877999999999 -68.355988 44.43748500000001 -68.23925 44.33441500000001 -68.165314 44.289951 -68.305244 44.224998 -68.321251 44.27072100000001 -68.403427 44.377174 -68.388458Maine23N EngME79939.20710236.7791227928.0328685.0465312.0597850.0630078.0456299.0424101.079763.05084.0571842.040722.0172830.094926.00.4870.513274322.045.930859 -104.062549.0 -96.55158245.938297000000006 -98.730057 45.939583 -99.006447 45.94278 -99.716949 45.943561999999986 -99.875389 45.940392 -100.514 45.94250500000001 -102.00235 45.94166200000001 -102.945953 45.941113 -102.994377 45.942993 -104.048416 46.280876000000006 -104.047348 46.54253 -104.046219 46.64293699999999 -104.046951 47.33381700000001 -104.045441 47.400002 -104.046822 48.00006099999999 -104.047935 48.390995000000004 -104.05162 48.64579800000001 -104.051826 49.0 -104.0625 48.99999600000001 -102.9375 49.0 -102.02182 49.0 -101.5 48.99999600000001 -100.1875 49.0 -99.53315 49.0 -99.0 48.99999600000001 -97.9375 49.0 -97.229095 48.931842999999986 -97.216026 48.873772 -97.175385 48.835995 -97.17086 48.815552 -97.180077 48.810383 -97.164368 48.80152899999999 -97.173599 48.781184999999994 -97.147171 48.76355699999999 -97.138901 48.75566900000001 -97.147552 48.74723399999999 -97.132156 48.72625400000001 -97.13446 48.70859899999999 -97.109756 48.69525899999999 -97.116394 48.674544999999995 -97.096825 48.629963000000004 -97.107285 48.62980999999999 -97.127098 48.62078500000001 -97.122612 48.61403999999999 -97.144371 48.58692199999999 -97.140465 48.58365599999999 -97.157845 48.57287199999999 -97.151779 48.56227899999999 -97.167595 48.549553 -97.146271 48.545094000000006 -97.160088 48.53841399999999 -97.15519 48.53466399999999 -97.139038 48.517967 -97.14798 48.51732999999999 -97.134247 48.43812600000001 -97.143265 48.437118999999996 -97.119286 48.41612599999999 -97.122253 48.41962799999999 -97.151299 48.41000700000001 -97.149475 48.40790200000001 -97.128777 48.38822200000001 -97.15847 48.38442599999999 -97.134857 48.37247099999999 -97.133438 48.36323200000001 -97.150047 48.36150699999999 -97.130775 48.326008 -97.136787 48.319942 -97.112244 48.310986000000014 -97.132286 48.303635000000014 -97.114403 48.29489899999999 -97.113373 48.29305600000001 -97.130165 48.28616299999999 -97.112335 48.277893000000006 -97.111366 48.2645 -97.136307 48.25918999999999 -97.123436 48.233540000000005 -97.127205 48.22806499999999 -97.108887 48.22177099999999 -97.139404 48.20762300000001 -97.11055 48.20375799999999 -97.130478 48.19507999999999 -97.136925 48.175242999999995 -97.135941 48.16778600000001 -97.137093 48.15924100000001 -97.115715 48.148415 -97.136162 48.142791999999986 -97.120567 48.116386000000006 -97.121521 48.100989999999996 -97.098679 48.07036199999999 -97.092369 48.048182999999995 -97.066719 47.95494500000001 -97.047699 47.917912 -97.014977 47.875590999999986 -97.02021 47.87021999999999 -96.999985 47.82805300000001 -96.976875 47.809685 -96.983536 47.794464000000005 -96.957474 47.763531 -96.931656 47.71411900000001 -96.923302 47.67394999999999 -96.889069 47.61528000000001 -96.872978 47.60117700000001 -96.85186 47.56300400000001 -96.858307 47.54459399999999 -96.848831 47.52138099999999 -96.860329 47.50064499999999 -96.851257 47.46156300000001 -96.866325 47.436779 -96.855469 47.41311300000001 -96.86689 47.408962 -96.849648 47.38414399999999 -96.83947 47.36098100000001 -96.850273 47.34227000000001 -96.838104 47.314629 -96.84639 47.29391100000001 -96.837357 47.25686999999999 -96.849266 47.240486000000004 -96.836708 47.170094000000006 -96.826134 47.151917 -96.838806 47.092636 -96.818794 47.07886500000001 -96.826607 47.03396599999999 -96.82225 47.010265000000004 -96.834938 47.00347099999999 -96.824173 46.969814000000014 -96.816414 46.96967699999999 -96.793068 46.95587900000001 -96.801529 46.948238 -96.789352 46.93222 -96.787567 46.936297999999994 -96.762711 46.92281700000001 -96.756554 46.86738600000001 -96.777702 46.844898 -96.767891 46.81206900000001 -96.796837 46.762348 -96.780022 46.70708099999999 -96.781197 46.678841000000006 -96.793335 46.62980999999999 -96.789886 46.62414899999999 -96.783958 46.600021 -96.770683 46.58865700000001 -96.75087 46.48947100000001 -96.73996 46.46875800000001 -96.714539 46.42720800000001 -96.709328 46.41225800000001 -96.687874 46.359474000000006 -96.651749 46.350853 -96.61451 46.336365 -96.601723 46.23872399999999 -96.597832 46.215453999999994 -96.586105 46.191959 -96.58754 46.17721599999999 -96.570816 46.09557000000001 -96.551582 46.02132 -96.575867 45.947722999999996 -96.561455 45.934151000000014 -96.566574 45.936543 -97.232941 45.930859 -97.97834 45.931534 -98.014328 45.938297000000006 -98.730057North Dakota38W N CenND178695.2134427.798638800.0166270.0240878.0318201.0320599.0237047.0209546.031332.01638.0287558.016083.0104938.033936.00.4980.502155209.042.48846399999999 -104.06054745.943561999999986 -96.43908742.99532300000001 -102.787933 42.99937399999999 -103.005409 42.99865 -103.500984 43.003094000000004 -104.05571 43.47916000000001 -104.05867 43.503738 -104.057426 43.85292799999999 -104.05899 44.14584400000001 -104.059242 44.181842999999986 -104.060547 44.57436799999999 -104.058975 44.997349000000014 -104.059349 44.997817999999995 -104.04258 45.212886999999995 -104.043358 45.88305299999999 -104.049026 45.942993 -104.048416 45.941113 -102.994377 45.94166200000001 -102.945953 45.94250500000001 -102.00235 45.940392 -100.514 45.943561999999986 -99.875389 45.94278 -99.716949 45.939583 -99.006447 45.938297000000006 -98.730057 45.931534 -98.014328 45.930859 -97.97834 45.936543 -97.232941 45.934151000000014 -96.566574 45.817893999999995 -96.587608 45.80830399999999 -96.604263 45.73901000000001 -96.657043 45.65072599999999 -96.832443 45.609161 -96.854637 45.58412899999999 -96.842735 45.517517 -96.768898 45.45823300000001 -96.737686 45.410675 -96.692825 45.39656099999999 -96.604744 45.375168 -96.532211 45.32854499999999 -96.477257 45.29888500000001 -96.457268 45.27522999999999 -96.454163 44.97203099999999 -96.45575 44.80138400000001 -96.454887 44.62884500000001 -96.45639 44.53837999999999 -96.454781 44.199093000000005 -96.457077 43.84877 -96.456284 43.49974399999999 -96.460136 43.499874000000005 -96.597992 43.481944999999996 -96.583473 43.435562000000004 -96.588791 43.40074899999999 -96.557388 43.38424699999999 -96.524734 43.356987000000004 -96.522575 43.30767800000001 -96.540245 43.29009199999999 -96.578812 43.263630000000006 -96.570404 43.25328099999999 -96.55925 43.23965100000001 -96.566673 43.225505999999996 -96.558289 43.217926000000006 -96.486931 43.20909900000001 -96.472801 43.12632400000001 -96.451195 43.087886999999995 -96.460495 43.07559599999999 -96.461784 43.06189699999999 -96.479263 43.05152100000001 -96.519699 43.012061999999986 -96.498711 42.986469 -96.516838 42.952393 -96.514626 42.91387599999999 -96.543953 42.89691500000001 -96.537201 42.846667999999994 -96.555901 42.83435399999999 -96.572815 42.835387999999995 -96.587334 42.799564000000004 -96.600563 42.77683999999999 -96.632668 42.74860799999999 -96.640396 42.708359 -96.626228 42.668518000000006 -96.562729 42.66241099999999 -96.540855 42.629761 -96.512535 42.58048600000001 -96.48819 42.573891 -96.500633 42.56403399999999 -96.489029 42.517135999999994 -96.479935 42.48924600000001 -96.439087 42.48846399999999 -96.494392 42.52050399999999 -96.546906 42.518291000000005 -96.584442 42.507239999999996 -96.605156 42.522696999999994 -96.628983 42.550735 -96.63636 42.61230499999999 -96.713745 42.621910000000014 -96.714958 42.641166999999996 -96.694283 42.657718999999986 -96.698746 42.66859400000001 -96.722343 42.67002099999999 -96.799026 42.681343 -96.81012 42.70408599999999 -96.809822 42.73170099999999 -96.907913 42.721149 -96.970451 42.72730999999999 -96.977547 42.75206800000001 -96.969681 42.75831600000001 -96.979271 42.759544000000005 -97.014816 42.77392599999999 -97.130142 42.798621999999995 -97.161095 42.81257600000001 -97.211502 42.841206 -97.224113 42.85183000000001 -97.242859 42.850018000000006 -97.271126 42.861774 -97.311081 42.867435 -97.388969 42.85044500000001 -97.456924 42.857158999999996 -97.482819 42.860138000000006 -97.505791 42.847992000000005 -97.570312 42.86128600000001 -97.634628 42.836838 -97.68541 42.85800900000001 -97.724907 42.84616500000001 -97.771843 42.849597999999986 -97.796684 42.866589000000005 -97.818298 42.855807999999996 -97.888313 42.83127200000001 -97.889595 42.79232400000001 -97.929131 42.77368899999999 -97.963211 42.76681099999999 -97.994797 42.769192000000004 -98.032791 42.80836099999999 -98.121468 42.82022499999999 -98.122765 42.83579599999999 -98.144516 42.839573 -98.167473 42.881798 -98.309982 42.920139000000006 -98.390846 42.937163999999996 -98.457085 42.991783 -98.497292 42.99239 -99.253593 42.992332000000005 -99.532402 42.99108899999999 -100.197739 42.98683500000001 -101.231308 42.989891 -102.086273 42.99532300000001 -102.787933South Dakota46W N CenSD196575.213169.429696004.0180306.0259034.0342498.0353506.0250825.0233478.032610.0971.0321891.013983.0119594.041921.00.4920.508162746.040.994305 -111.0526545.00285299999999 -104.05120141.69824600000001 -104.053108 41.564246999999995 -104.054993 41.38810699999999 -104.053505 41.00322700000001 -104.051201 40.994305 -104.933968 40.996365 -105.278259 41.000111000000004 -106.202896 41.001316 -106.328545 40.998489000000006 -106.864838 41.000168 -107.303436 41.00341 -107.918037 40.99847399999999 -109.047638 40.997646 -110.001457 40.99794 -110.062477 40.996635 -111.050285 41.25847999999999 -111.050911 41.57864799999999 -111.050323 41.996264999999994 -111.047951 42.503322999999995 -111.046028 43.01996199999999 -111.048447 43.284813000000014 -111.04673 43.51560599999999 -111.045998 43.982631999999995 -111.049629 44.47339600000001 -111.050789 44.66456199999999 -111.050842 44.995766 -111.05265 44.99234799999999 -110.428894 44.99868799999999 -110.392006 45.00285299999999 -109.994789 44.99958000000001 -109.798653 44.99764300000001 -108.624573 45.000159999999994 -108.258568 44.99981299999999 -107.893715 44.996173999999996 -106.258644 44.99722700000001 -106.020576 44.999832 -105.084465 45.001091 -105.04126 44.997349000000014 -104.059349 44.57436799999999 -104.058975 44.181842999999986 -104.060547 44.14584400000001 -104.059242 43.85292799999999 -104.05899 43.503738 -104.057426 43.47916000000001 -104.05867 43.003094000000004 -104.05571 42.61470399999999 -104.055725 41.99985100000001 -104.053009 41.69824600000001 -104.053108Wyoming56MtnWY251500.8011848.149453588.0119825.0168839.0227007.0226581.0164561.0153679.028109.02963.0207868.013112.071419.029157.00.50.583202.042.48913200000001 -92.88518546.952549000000005 -86.96759844.96162799999999 -87.748451 44.927334 -87.83989 44.873356 -87.830917 44.720482000000004 -87.985687 44.677273000000014 -87.983078 44.639126000000005 -88.013184 44.595821 -87.975655 44.622242 -88.012917 44.57145700000001 -88.040314 44.535503000000006 -87.966125 44.53914599999999 -87.926308 44.61691300000001 -87.868683 44.64405400000001 -87.76413 44.68929299999999 -87.723724 44.833054000000004 -87.614365 44.85134099999999 -87.552689 44.82302899999999 -87.551575 44.89110199999999 -87.433647 44.81156899999999 -87.367363 44.79472000000001 -87.314369 44.676918 -87.372978 44.53394700000001 -87.473442 44.327854 -87.537407 44.175758 -87.517242 44.097836 -87.644287 43.89390900000001 -87.726036 43.67318 -87.702644 43.546299000000005 -87.785957 43.458713999999986 -87.802872 43.358588999999995 -87.875244 43.19720799999999 -87.889748 43.075863 -87.859985 43.02576099999999 -87.891899 42.96457699999999 -87.836357 42.841544999999996 -87.819771 42.77752699999999 -87.756729 42.66662199999999 -87.791435 42.48913200000001 -87.79731 42.48961299999999 -88.194702 42.49197000000001 -88.297897 42.489655 -88.70652 42.490905999999995 -88.764954 42.49086399999999 -88.939079 42.497906 -89.359444 42.49749 -89.400497 42.50345999999999 -89.834618 42.504108 -89.923569 42.508362000000005 -90.419975 42.50936100000001 -90.638329 42.528560999999996 -90.62558 42.555713999999995 -90.639091 42.571392 -90.664253 42.637932000000006 -90.694664 42.657005 -90.745483 42.678246 -90.892418 42.68068299999999 -90.919281 42.707066 -90.999054 42.744923 -91.06604 42.78337500000001 -91.081902 42.871452000000005 -91.0933 42.925906999999995 -91.138992 43.00133099999999 -91.152084 43.081199999999995 -91.159622 43.08290500000001 -91.168442 43.147594 -91.161224 43.25791899999999 -91.068924 43.280703999999986 -91.066299 43.313320000000004 -91.078369 43.353970000000004 -91.176918 43.37053700000001 -91.198112 43.424076000000014 -91.210785 43.46471 -91.235771 43.500834999999995 -91.223434 43.54874000000001 -91.240425 43.598918999999995 -91.232857 43.67735300000001 -91.258255 43.72242700000001 -91.258781 43.78810899999999 -91.250969 43.84722500000001 -91.291809 43.947227 -91.373215 43.985657 -91.425758 44.03425200000001 -91.528275 44.03499199999999 -91.569016 44.04085900000001 -91.601639 44.066933000000006 -91.652084 44.13726399999999 -91.753067 44.19122300000001 -91.848587 44.25753 -91.888535 44.288376 -91.922188 44.317554 -91.922592 44.339146 -91.938705 44.364520999999996 -91.972221 44.41562300000001 -92.091164 44.43842699999999 -92.205963 44.456249000000014 -92.248924 44.49221399999999 -92.296509 44.540524000000005 -92.320297 44.55286799999999 -92.340691 44.57519099999999 -92.509026 44.61032499999999 -92.60878 44.642685 -92.630173 44.713627 -92.736946 44.746193000000005 -92.805382 44.835403000000014 -92.760826 44.862267 -92.764061 44.899529 -92.771667 44.91503499999999 -92.753723 44.935688 -92.749565 45.001037999999994 -92.766922 45.022152000000006 -92.762787 45.065642999999994 -92.796555 45.11303699999999 -92.745216 45.15645599999999 -92.744728 45.186645999999996 -92.762375 45.212410000000006 -92.755211 45.297638000000006 -92.746384 45.31823700000001 -92.707176 45.363113 -92.684662 45.39550399999999 -92.648544 45.439491000000004 -92.644768 45.45526100000001 -92.65461 45.47009299999999 -92.685211 45.54728299999999 -92.727943 45.56430399999999 -92.761963 45.56344200000001 -92.834824 45.57887600000001 -92.876617 45.64499699999999 -92.885185 45.71060600000001 -92.85981 45.73093399999999 -92.833427 45.763386 -92.7789 45.83734899999999 -92.748558 45.84502800000001 -92.733894 45.891006000000004 -92.706039 45.915752 -92.666008 45.95132100000001 -92.552475 45.98263499999999 -92.523781 45.981250999999986 -92.462151 46.02555799999999 -92.424805 46.01630399999999 -92.364769 46.022651999999994 -92.346031 46.05693400000001 -92.327179 46.07328799999999 -92.289177 46.15665799999999 -92.28875 46.416042000000004 -92.28849 46.65884399999999 -92.287079 46.646930999999995 -92.208961 46.74268699999999 -92.095779 46.68386100000001 -92.003967 46.680195 -91.921272 46.756924 -91.555588 46.952549000000005 -90.861542 46.92030299999999 -90.7743 46.88319000000001 -90.77726 46.58555999999999 -90.926056 46.645756000000006 -90.73053 46.587582 -90.540695 46.56866500000001 -90.40802 46.53971100000001 -90.385345 46.55161699999999 -90.31353 46.54435000000001 -90.302216 46.525104999999996 -90.300003 46.52253300000001 -90.269608 46.50884199999999 -90.258224 46.506348 -90.211349 46.442432 -90.161217 46.39395099999999 -90.141624 46.365207999999996 -90.115005 46.34048100000001 -90.111488 46.30407700000001 -89.924973 46.145691 -89.09967 46.100437 -88.985168 46.073646999999994 -88.925064 46.026848 -88.804268 46.036404000000005 -88.793686 46.032658 -88.777351 46.02119099999999 -88.772888 46.02962500000001 -88.72628 46.018967 -88.703476 46.02018699999999 -88.677254 45.99343099999999 -88.643539 45.99416400000001 -88.615372 46.015559999999994 -88.597404 46.00900300000001 -88.575226 46.01934399999999 -88.548225 46.018654 -88.51548 46.013003999999995 -88.49395 45.999194999999986 -88.483681 46.000805000000014 -88.454185 45.98346699999999 -88.403389 45.99463299999999 -88.369804 45.966758999999996 -88.32119 45.961989999999986 -88.299019 45.96710200000001 -88.257034 45.947948 -88.214859 45.953564 -88.180061 45.93634 -88.150307 45.926334 -88.111259 45.92066199999999 -88.093719 45.891850000000005 -88.095634 45.87368799999999 -88.065292 45.834923 -88.121658 45.819447 -88.129822 45.79157599999999 -88.088608 45.786156000000005 -88.051514 45.79508999999999 -87.989944 45.766491 -87.969055 45.75074000000001 -87.873505 45.72245799999999 -87.842239 45.71143000000001 -87.80143 45.701362999999986 -87.801033 45.68413899999999 -87.777351 45.67595299999999 -87.780823 45.66542799999999 -87.816933 45.654487999999986 -87.819817 45.613235 -87.775925 45.60042200000001 -87.774956 45.568554000000006 -87.786194 45.568625999999995 -87.828484 45.54455899999999 -87.805023 45.4991 -87.789268 45.46649199999999 -87.813499 45.44512900000001 -87.860153 45.406147000000004 -87.849419 45.365883 -87.883499 45.36211399999999 -87.873863 45.37210099999999 -87.868423 45.370193 -87.861984 45.346176000000014 -87.841171 45.358349000000004 -87.827896 45.352924 -87.759926 45.39129600000001 -87.689484 45.36188100000001 -87.64357 45.34819400000001 -87.645248 45.27222800000001 -87.704361 45.247108 -87.705032 45.236794 -87.719559 45.211693 -87.721519 45.199093000000005 -87.736092 45.176624000000004 -87.729561 45.140690000000006 -87.672707 45.10907 -87.66478 45.09465399999999 -87.581169 45.05681999999999 -87.618416 44.992008 -87.620232 44.96162799999999 -87.74845145.29042100000001 -87.034409 45.29867200000001 -86.986137 45.24028799999999 -86.967598 45.218422000000004 -86.995621 45.249031 -87.044998 45.149981999999994 -87.025337 45.14731599999999 -87.079765 45.09551999999999 -87.044792 45.092186 -87.08757 45.053291 -87.083794 45.06477000000001 -87.11245 44.982811 -87.178589 44.93332699999999 -87.168686 44.87324100000001 -87.205551 44.798775000000006 -87.311028 44.83774600000001 -87.378639 44.911204999999995 -87.405319 45.015221 -87.342056 45.052628 -87.283379 45.17507599999999 -87.230804 45.15498400000001 -87.177803 45.29647800000001 -87.065948 45.29042100000001 -87.034409Wisconsin55E N CenWI139556.5728223.2954796441.01249223.01789141.02345442.02450999.01763163.01710612.0264651.057559.02335941.0129191.0688168.0425748.00.4890.5111180518.041.994698 -117.2359089999999949.0 -111.04599843.67914999999999 -117.025307 43.75381899999999 -117.02280400000001 43.80025900000001 -117.036125 43.831683999999996 -117.026634 43.83988600000001 -117.009514 43.853088000000014 -117.01522800000001 43.859466999999995 -116.984779 43.87358499999999 -116.977158 43.904556000000014 -116.97715 43.92869200000001 -116.958725 43.96331000000001 -116.966965 44.014317000000005 -116.932602 44.07400899999999 -116.975822 44.090411999999986 -116.962448 44.093140000000005 -116.945892 44.14642699999999 -116.90126000000001 44.17741799999999 -116.912056 44.197956000000005 -116.980873 44.225295999999986 -116.975128 44.24717699999999 -116.99170699999999 44.24945099999999 -117.02935 44.23167000000001 -117.05102500000001 44.24396100000001 -117.080383 44.26719299999999 -117.099556 44.26992000000001 -117.111687 44.25074799999999 -117.142273 44.25344799999999 -117.169716 44.28483600000001 -117.212563 44.300781 -117.21644599999999 44.33955399999999 -117.200592 44.39009899999999 -117.23590899999999 44.427971000000014 -117.21620899999999 44.47310300000001 -117.22339600000001 44.48590100000001 -117.20295 44.511921 -117.18637799999999 44.534771000000006 -117.14415 44.559402000000006 -117.14292900000001 44.57263900000001 -117.129494 44.689452999999986 -117.07834600000001 44.697674000000006 -117.065506 44.749233000000004 -117.038567 44.77615399999999 -116.950493 44.82906 -116.908623 44.848674999999986 -116.89636999999999 44.868729 -116.86608100000001 44.920265 -116.834404 44.954971 -116.846565 44.97275500000001 -116.83040600000001 44.97186300000001 -116.84716800000001 44.980087 -116.854897 45.00016400000001 -116.847107 45.017067 -116.853523 45.04987700000001 -116.80632 45.075874 -116.786224 45.099602000000004 -116.777107 45.10642200000001 -116.760284 45.137428 -116.735603 45.26247000000001 -116.687836 45.33552900000001 -116.671288 45.45998 -116.564796 45.493763 -116.553528 45.56617399999999 -116.477577 45.60637299999999 -116.46944400000001 45.66460799999999 -116.513939 45.710846000000004 -116.527298 45.74754300000001 -116.559654 45.78075000000001 -116.653419 45.819289999999995 -116.702202 45.819885 -116.772728 45.845989 -116.790283 45.90372099999999 -116.855492 45.980639999999994 -116.897217 45.995299999999986 -116.91815199999999 46.065811 -116.956741 46.078632 -116.98622900000001 46.097397 -116.960655 46.165604 -116.928444 46.197674000000006 -116.96650700000001 46.249427999999995 -116.97174100000001 46.30256700000001 -117.00065599999999 46.335544999999996 -117.026985 46.348816 -117.06319400000001 46.388690999999994 -117.04348 46.42809700000001 -117.037567 46.53671600000001 -117.040932 47.11942300000001 -117.039963 47.258601999999996 -117.041382 47.361541999999986 -117.040779 47.971191000000005 -117.036438 48.046284000000014 -117.037834 48.83815000000001 -117.028046 49.0 -117.030975 48.99999600000001 -116.0625 48.498726000000005 -116.055679 48.208549000000005 -116.054497 47.976269 -116.052483 47.965014999999994 -116.024307 47.925217 -115.997925 47.867199 -115.936836 47.841148000000004 -115.902916 47.827526000000006 -115.868805 47.805256000000014 -115.84832 47.75635500000001 -115.835739 47.744911 -115.789536 47.70980499999999 -115.774727 47.69562500000001 -115.732666 47.63995 -115.73307 47.616150000000005 -115.697289 47.59079 -115.691093 47.53376 -115.741837 47.520962 -115.700531 47.489609 -115.69178 47.475303999999994 -115.639153 47.457863 -115.642197 47.44924900000001 -115.655098 47.44537399999999 -115.731491 47.43403599999999 -115.749115 47.42254600000001 -115.749336 47.399238999999994 -115.665489 47.38011599999999 -115.637794 47.370075000000014 -115.598549 47.334686000000005 -115.554535 47.292057 -115.522079 47.28171900000001 -115.500946 47.27444800000001 -115.425659 47.263667999999996 -115.407227 47.25509600000001 -115.342682 47.24522400000001 -115.324249 47.17962600000001 -115.295258 47.12410399999999 -115.192101 47.09764899999999 -115.171524 47.09182000000001 -115.147713 47.06362899999999 -115.134537 47.02660399999999 -115.080368 46.97343799999999 -115.054672 46.96308099999999 -115.036369 46.958889 -115.00061 46.92529300000001 -114.963768 46.90724599999999 -114.923164 46.89096799999999 -114.939606 46.85252800000001 -114.947449 46.799515000000014 -114.901367 46.79712699999999 -114.865646 46.77562 -114.839836 46.76661300000001 -114.793076 46.755798 -114.776878 46.70312100000001 -114.781967 46.695212999999995 -114.747154 46.73384100000001 -114.697479 46.734802 -114.672935 46.687186999999994 -114.624977 46.67100099999999 -114.644089 46.66090399999999 -114.643791 46.62912800000001 -114.609879 46.637969999999996 -114.539444 46.62365299999999 -114.483772 46.645793999999995 -114.44059 46.661674000000005 -114.383072 46.654304999999994 -114.33374 46.622917 -114.323769 46.58795900000001 -114.342377 46.51746700000001 -114.349174 46.506203 -114.359528 46.487449999999995 -114.409775 46.428257 -114.383087 46.39962399999999 -114.39608 46.39299 -114.408859 46.28478999999999 -114.430862 46.25304 -114.472862 46.24386200000001 -114.471901 46.22033300000001 -114.438622 46.169048000000004 -114.439949 46.15534199999999 -114.466087 46.157497000000006 -114.508682 46.136143000000004 -114.518013 46.11622199999999 -114.505638 46.107437000000004 -114.47644 46.08231000000001 -114.455101 46.050895999999995 -114.464828 46.02349100000001 -114.493393 46.00984600000001 -114.473602 45.98988700000001 -114.483528 45.972054000000014 -114.411522 45.95406 -114.404366 45.921558000000005 -114.428535 45.910731999999996 -114.412605 45.870968000000005 -114.391914 45.84653499999999 -114.406601 45.85270299999999 -114.442307 45.83955 -114.472878 45.84276600000001 -114.498238 45.81014999999999 -114.516449 45.762482000000006 -114.562614 45.746082 -114.541031 45.72308000000001 -114.53405 45.694484999999986 -114.496635 45.67414099999999 -114.509781 45.652477000000005 -114.500816 45.62435500000001 -114.563751 45.59648100000001 -114.540031 45.548823999999996 -114.559998 45.558277000000004 -114.526466 45.54673399999999 -114.495667 45.547932 -114.461784 45.52771799999999 -114.432632 45.49909199999999 -114.418129 45.485825000000006 -114.370537 45.46346700000001 -114.349327 45.45750799999999 -114.325516 45.48594299999999 -114.261322 45.503029 -114.246964 45.53537399999999 -114.241081 45.52799999999999 -114.193893 45.544005999999996 -114.171753 45.550465 -114.131134 45.57120900000001 -114.117226 45.58645999999999 -114.082054 45.625225 -114.055603 45.64085399999999 -114.01712 45.652592 -114.010078 45.672459 -114.018967 45.68641299999999 -114.00856 45.69745599999999 -113.970238 45.67945900000001 -113.963234 45.671291 -113.925789 45.655204999999995 -113.922623 45.63733300000001 -113.901291 45.61357100000001 -113.902397 45.60964200000001 -113.85112 45.600716000000006 -113.821579 45.583809 -113.802849 45.51498799999999 -113.832809 45.51694499999999 -113.780029 45.50713300000001 -113.7714 45.477787000000006 -113.768265 45.44571300000001 -113.78476 45.410252000000014 -113.774124 45.382464999999996 -113.74041 45.321608999999995 -113.738182 45.27786599999999 -113.687813 45.26236 -113.689224 45.20686699999999 -113.644699 45.18106800000001 -113.600037 45.14981800000001 -113.593208 45.13462100000001 -113.570694 45.117785999999995 -113.573486 45.10762399999999 -113.551384 45.107910000000004 -113.509338 45.082137999999986 -113.519722 45.071293 -113.489273 45.05839499999999 -113.48542 45.04342299999999 -113.454552 45.027523 -113.45797 44.998267999999996 -113.440147 44.949596000000014 -113.447884 44.940848999999986 -113.462532 44.939648000000005 -113.486465 44.930744000000004 -113.495308 44.851315 -113.444695 44.833775 -113.420502 44.80764400000001 -113.349152 44.779076 -113.33976 44.780304 -113.31781 44.810562000000004 -113.256287 44.811916 -113.239471 44.761517 -113.137413 44.737457000000006 -113.126572 44.71525199999999 -113.100845 44.69599500000001 -113.098099 44.67560599999999 -113.072289 44.624371 -113.053436 44.582764 -113.082184 44.556377 -113.038811 44.53304299999999 -113.036972 44.510695999999996 -113.006866 44.48186100000001 -113.019463 44.45270199999999 -113.005814 44.43780100000001 -113.011169 44.43562700000001 -112.984406 44.407279999999986 -112.937439 44.39294100000001 -112.886467 44.370068 -112.869942 44.35372899999999 -112.843437 44.364292000000006 -112.816559 44.39490900000001 -112.817871 44.42117300000001 -112.825851 44.458099000000004 -112.795387 44.47400999999999 -112.779022 44.484409 -112.732872 44.49702500000001 -112.713486 44.48089200000001 -112.652351 44.477588999999995 -112.53849 44.463089 -112.501007 44.46892500000001 -112.457687 44.449375 -112.419922 44.44936000000001 -112.366753 44.49726899999999 -112.339745 44.525188000000014 -112.341675 44.54178999999999 -112.281509 44.560058999999995 -112.255844 44.55957799999999 -112.229568 44.53858199999999 -112.216934 44.53153599999999 -112.19883 44.52833899999999 -112.123367 44.518317999999994 -112.099075 44.52869799999999 -112.058548 44.52293 -112.02626 44.53513000000001 -112.022797 44.529762000000005 -111.977005 44.549812 -111.939575 44.55635100000001 -111.871696 44.504065999999995 -111.807037 44.51854700000001 -111.791809 44.51890900000001 -111.766121 44.53384399999999 -111.716202 44.550835000000006 -111.684067 44.543071999999995 -111.604454 44.55294799999999 -111.566437 44.52877799999999 -111.489449 44.536224000000004 -111.481781 44.538002000000006 -111.458534 44.55002200000001 -111.462036 44.55126999999999 -111.492111 44.593277 -111.513733 44.616051 -111.500954 44.637767999999994 -111.506897 44.64078900000001 -111.469376 44.652634000000006 -111.457474 44.67010099999999 -111.4599 44.691494000000006 -111.480011 44.70223999999999 -111.474632 44.713257 -111.442841 44.708946 -111.394295 44.73777000000001 -111.384171 44.74516299999999 -111.371521 44.72625400000001 -111.34919 44.72793999999999 -111.318436 44.70526899999999 -111.31469 44.683013999999986 -111.294884 44.673878 -111.269424 44.64228800000001 -111.269882 44.62698399999999 -111.22319 44.61805699999999 -111.219017 44.60263800000001 -111.233452 44.57324600000001 -111.218727 44.564926000000014 -111.177986 44.54526100000001 -111.169464 44.52797699999999 -111.133583 44.500832 -111.128143 44.486198 -111.093857 44.47339600000001 -111.050789 43.982631999999995 -111.049629 43.51560599999999 -111.045998 43.284813000000014 -111.04673 43.01996199999999 -111.048447 42.503322999999995 -111.046028 41.996264999999994 -111.047951 42.00023999999999 -111.49382 42.002376999999996 -112.099724 41.99913000000001 -112.146324 42.001228 -112.988754 41.995476 -114.038223 41.99601000000001 -114.268616 41.99659700000001 -115.023979 41.994698 -115.946617 41.99490399999999 -116.991356 41.99490399999999 -117.01790600000001 43.67914999999999 -117.025307Idaho16MtnID214324.9782131.1441006749.0263194.0360723.0500956.0505793.0359136.0329881.052958.08572.0443703.029070.0144809.068391.00.4980.502201595.042.725769000000014 -73.43643245.013306 -71.50584442.745979000000005 -73.258507 42.747401999999994 -73.269722 42.803471 -73.296616 42.83702500000001 -73.280029 42.94021599999999 -73.276451 43.310779999999994 -73.250519 43.512764000000004 -73.238838 43.559315 -73.260429 43.57496599999999 -73.291847 43.593121 -73.282181 43.619586999999996 -73.294548 43.624649000000005 -73.303978 43.61493300000001 -73.364128 43.56907699999999 -73.388557 43.582413 -73.418762 43.63204999999999 -73.423401 43.71421799999999 -73.371429 43.756496 -73.357109 43.778366000000005 -73.359436 43.80444700000001 -73.385178 43.885918000000004 -73.375557 43.914749 -73.405769 43.98813999999999 -73.417839 44.01816600000001 -73.408684 44.045624000000004 -73.436432 44.06384299999999 -73.435646 44.10655600000001 -73.409187 44.136173000000014 -73.408295 44.172054 -73.382492 44.20119500000001 -73.377762 44.26008999999999 -73.305756 44.36734000000001 -73.330215 44.405483000000004 -73.300423 44.432804000000004 -73.293747 44.54428100000001 -73.334877 44.55392499999999 -73.348236 44.57912099999999 -73.371719 44.61976200000001 -73.382248 44.634303999999986 -73.37056 44.66123200000001 -73.37352 44.68032500000001 -73.358574 44.72419400000001 -73.373581 44.799251999999996 -73.327209 44.81907699999999 -73.369476 44.847893 -73.382729 44.93256400000001 -73.336838 44.981933999999995 -73.351181 45.0061 -73.345146 45.00844599999999 -73.188972 45.005325 -72.547668 45.007294 -71.902328 45.013306 -71.505844 44.976517 -71.541397 44.94364899999999 -71.517448 44.89962399999999 -71.506836 44.81597099999999 -71.575569 44.77914799999999 -71.583969 44.74166099999999 -71.631599 44.67781099999999 -71.608147 44.65054699999999 -71.589218 44.637394 -71.568497 44.59653499999999 -71.554573 44.57887600000001 -71.537262 44.551146999999986 -71.592758 44.53881799999999 -71.591911 44.52574899999999 -71.575714 44.49448000000001 -71.58709 44.47444899999999 -71.614693 44.476673000000005 -71.637024 44.469116000000014 -71.648178 44.440079 -71.656868 44.421284000000014 -71.677353 44.39819 -71.767036 44.38411300000001 -71.798195 44.350300000000004 -71.821663 44.34413900000001 -71.835281 44.336051999999995 -71.928825 44.325726 -71.939369 44.32748799999999 -71.994896 44.299374 -72.035957 44.26143300000001 -72.060028 44.234318 -72.044853 44.18211400000001 -72.059746 44.156372000000005 -72.045189 44.12068199999999 -72.035385 44.10038800000001 -72.04998 44.096035 -72.032913 44.083309000000014 -72.035194 44.03197499999999 -72.077385 44.008858000000004 -72.08567 43.98916199999999 -72.110374 43.976448000000005 -72.113274 43.95792399999999 -72.092178 43.939098 -72.11367 43.90914900000001 -72.122116 43.878849 -72.170555 43.801620000000014 -72.185303 43.764565000000005 -72.206558 43.75062199999999 -72.219589 43.735229000000004 -72.260521 43.69846000000001 -72.304504 43.597294000000005 -72.333549 43.572304 -72.373962 43.517483 -72.395462 43.48455799999999 -72.38298 43.41008400000001 -72.396713 43.37705199999999 -72.412605 43.350933 -72.398094 43.32333 -72.410698 43.307308000000006 -72.402885 43.232178000000005 -72.436066 43.155945 -72.452866 43.11619200000001 -72.438072 43.078959999999995 -72.443932 43.046425 -72.462219 42.99952300000001 -72.457626 42.97606300000001 -72.473808 42.96550400000001 -72.50473 42.95159100000001 -72.520683 42.912532999999996 -72.525276 42.86056099999999 -72.553894 42.80765199999999 -72.539383 42.789176999999995 -72.513535 42.76865000000001 -72.507736 42.761505 -72.47979 42.746758 -72.462639 42.725769000000014 -72.456238 42.73728199999999 -72.923454 42.74031400000001 -73.020149 42.745979000000005 -73.258507Vermont50N EngVT23955.748947.04562758.0144895.0210650.0275492.0287266.0209604.0199808.035731.02033.0283146.017600.084759.038046.00.490.51146370.043.49814599999999 -97.22909549.371735 -89.53058643.49960300000001 -91.730217 43.499187000000006 -92.07737 43.49949599999999 -92.452995 43.500294 -92.557831 43.501316 -93.027016 43.501495000000006 -93.054184 43.50053399999999 -93.500618 43.500809000000004 -93.653481 43.50034299999999 -93.973717 43.49899300000001 -94.246544 43.49814599999999 -94.454987 43.50007199999999 -94.859573 43.499413000000004 -94.920197 43.500370000000004 -95.396278 43.49957699999999 -95.464493 43.498977999999994 -95.866615 43.49856600000001 -96.060738 43.49974399999999 -96.460136 43.84877 -96.456284 44.199093000000005 -96.457077 44.53837999999999 -96.454781 44.62884500000001 -96.45639 44.80138400000001 -96.454887 44.97203099999999 -96.45575 45.27522999999999 -96.454163 45.29888500000001 -96.457268 45.32854499999999 -96.477257 45.375168 -96.532211 45.39656099999999 -96.604744 45.410675 -96.692825 45.45823300000001 -96.737686 45.517517 -96.768898 45.58412899999999 -96.842735 45.609161 -96.854637 45.65072599999999 -96.832443 45.73901000000001 -96.657043 45.80830399999999 -96.604263 45.817893999999995 -96.587608 45.934151000000014 -96.566574 45.947722999999996 -96.561455 46.02132 -96.575867 46.09557000000001 -96.551582 46.17721599999999 -96.570816 46.191959 -96.58754 46.215453999999994 -96.586105 46.23872399999999 -96.597832 46.336365 -96.601723 46.350853 -96.61451 46.359474000000006 -96.651749 46.41225800000001 -96.687874 46.42720800000001 -96.709328 46.46875800000001 -96.714539 46.48947100000001 -96.73996 46.58865700000001 -96.75087 46.600021 -96.770683 46.62414899999999 -96.783958 46.62980999999999 -96.789886 46.678841000000006 -96.793335 46.70708099999999 -96.781197 46.762348 -96.780022 46.81206900000001 -96.796837 46.844898 -96.767891 46.86738600000001 -96.777702 46.92281700000001 -96.756554 46.936297999999994 -96.762711 46.93222 -96.787567 46.948238 -96.789352 46.95587900000001 -96.801529 46.96967699999999 -96.793068 46.969814000000014 -96.816414 47.00347099999999 -96.824173 47.010265000000004 -96.834938 47.03396599999999 -96.82225 47.07886500000001 -96.826607 47.092636 -96.818794 47.151917 -96.838806 47.170094000000006 -96.826134 47.240486000000004 -96.836708 47.25686999999999 -96.849266 47.29391100000001 -96.837357 47.314629 -96.84639 47.34227000000001 -96.838104 47.36098100000001 -96.850273 47.38414399999999 -96.83947 47.408962 -96.849648 47.41311300000001 -96.86689 47.436779 -96.855469 47.46156300000001 -96.866325 47.50064499999999 -96.851257 47.52138099999999 -96.860329 47.54459399999999 -96.848831 47.56300400000001 -96.858307 47.60117700000001 -96.85186 47.61528000000001 -96.872978 47.67394999999999 -96.889069 47.71411900000001 -96.923302 47.763531 -96.931656 47.794464000000005 -96.957474 47.809685 -96.983536 47.82805300000001 -96.976875 47.87021999999999 -96.999985 47.875590999999986 -97.02021 47.917912 -97.014977 47.95494500000001 -97.047699 48.048182999999995 -97.066719 48.07036199999999 -97.092369 48.100989999999996 -97.098679 48.116386000000006 -97.121521 48.142791999999986 -97.120567 48.148415 -97.136162 48.15924100000001 -97.115715 48.16778600000001 -97.137093 48.175242999999995 -97.135941 48.19507999999999 -97.136925 48.20375799999999 -97.130478 48.20762300000001 -97.11055 48.22177099999999 -97.139404 48.22806499999999 -97.108887 48.233540000000005 -97.127205 48.25918999999999 -97.123436 48.2645 -97.136307 48.277893000000006 -97.111366 48.28616299999999 -97.112335 48.29305600000001 -97.130165 48.29489899999999 -97.113373 48.303635000000014 -97.114403 48.310986000000014 -97.132286 48.319942 -97.112244 48.326008 -97.136787 48.36150699999999 -97.130775 48.36323200000001 -97.150047 48.37247099999999 -97.133438 48.38442599999999 -97.134857 48.38822200000001 -97.15847 48.40790200000001 -97.128777 48.41000700000001 -97.149475 48.41962799999999 -97.151299 48.41612599999999 -97.122253 48.437118999999996 -97.119286 48.43812600000001 -97.143265 48.51732999999999 -97.134247 48.517967 -97.14798 48.53466399999999 -97.139038 48.53841399999999 -97.15519 48.545094000000006 -97.160088 48.549553 -97.146271 48.56227899999999 -97.167595 48.57287199999999 -97.151779 48.58365599999999 -97.157845 48.58692199999999 -97.140465 48.61403999999999 -97.144371 48.62078500000001 -97.122612 48.62980999999999 -97.127098 48.629963000000004 -97.107285 48.674544999999995 -97.096825 48.69525899999999 -97.116394 48.70859899999999 -97.109756 48.72625400000001 -97.13446 48.74723399999999 -97.132156 48.75566900000001 -97.147552 48.76355699999999 -97.138901 48.781184999999994 -97.147171 48.80152899999999 -97.173599 48.810383 -97.164368 48.815552 -97.180077 48.835995 -97.17086 48.873772 -97.175385 48.931842999999986 -97.216026 49.0 -97.229095 49.0 -96.406616 49.0 -95.276421 49.00000399999999 -95.157516 49.371735 -95.151627 49.33081100000001 -94.83181 48.87717799999999 -94.681038 48.777637 -94.694221 48.71370300000001 -94.570107 48.710815 -94.430435 48.70774499999999 -94.292145 48.652023000000014 -94.230637 48.62478300000001 -93.843735 48.525454999999994 -93.812515 48.511639 -93.780937 48.53432799999999 -93.513985 48.54957999999999 -93.465187 48.59277 -93.457619 48.63722999999999 -93.304092 48.62666300000001 -93.091301 48.62844100000001 -92.946785 48.54030599999999 -92.728851 48.54044300000001 -92.64167 48.502917999999994 -92.626228 48.494815999999986 -92.698669 48.460464 -92.70649 48.440166000000005 -92.497375 48.402264 -92.456192 48.357594000000006 -92.473167 48.22087500000001 -92.369965 48.244438 -92.276772 48.29840899999999 -92.300125 48.352417 -92.275986 48.36685600000001 -92.125824 48.35561000000001 -92.035049 48.25049999999999 -91.979401 48.206249000000014 -91.788689 48.19687999999999 -91.711815 48.11494099999999 -91.703606 48.10456500000001 -91.568657 48.043678 -91.571442 48.08140599999999 -91.239334 48.195449999999994 -91.027039 48.254311 -90.864388 48.08855399999999 -90.743256 48.12181100000001 -90.567352 48.092861 -90.556732 48.112885000000006 -90.14518 48.08619300000001 -90.026611 48.02367000000001 -89.986931 47.99261899999999 -89.900299 48.0266 -89.749222 48.00176999999999 -89.530586 47.99267599999999 -89.625557 47.95950300000001 -89.636284 47.82467299999999 -89.99958 47.71004500000001 -90.509514 47.461151 -91.021317 47.12500800000001 -91.468483 46.92715100000001 -91.800789 46.791957999999994 -92.088303 46.668262 -92.214432 46.66663399999999 -92.302956 46.65884399999999 -92.287079 46.416042000000004 -92.28849 46.15665799999999 -92.28875 46.07328799999999 -92.289177 46.05693400000001 -92.327179 46.022651999999994 -92.346031 46.01630399999999 -92.364769 46.02555799999999 -92.424805 45.981250999999986 -92.462151 45.98263499999999 -92.523781 45.95132100000001 -92.552475 45.915752 -92.666008 45.891006000000004 -92.706039 45.84502800000001 -92.733894 45.83734899999999 -92.748558 45.763386 -92.7789 45.73093399999999 -92.833427 45.71060600000001 -92.85981 45.64499699999999 -92.885185 45.57887600000001 -92.876617 45.56344200000001 -92.834824 45.56430399999999 -92.761963 45.54728299999999 -92.727943 45.47009299999999 -92.685211 45.45526100000001 -92.65461 45.439491000000004 -92.644768 45.39550399999999 -92.648544 45.363113 -92.684662 45.31823700000001 -92.707176 45.297638000000006 -92.746384 45.212410000000006 -92.755211 45.186645999999996 -92.762375 45.15645599999999 -92.744728 45.11303699999999 -92.745216 45.065642999999994 -92.796555 45.022152000000006 -92.762787 45.001037999999994 -92.766922 44.935688 -92.749565 44.91503499999999 -92.753723 44.899529 -92.771667 44.862267 -92.764061 44.835403000000014 -92.760826 44.746193000000005 -92.805382 44.713627 -92.736946 44.642685 -92.630173 44.61032499999999 -92.60878 44.57519099999999 -92.509026 44.55286799999999 -92.340691 44.540524000000005 -92.320297 44.49221399999999 -92.296509 44.456249000000014 -92.248924 44.43842699999999 -92.205963 44.41562300000001 -92.091164 44.364520999999996 -91.972221 44.339146 -91.938705 44.317554 -91.922592 44.288376 -91.922188 44.25753 -91.888535 44.19122300000001 -91.848587 44.13726399999999 -91.753067 44.066933000000006 -91.652084 44.04085900000001 -91.601639 44.03499199999999 -91.569016 44.03425200000001 -91.528275 43.985657 -91.425758 43.947227 -91.373215 43.84722500000001 -91.291809 43.78810899999999 -91.250969 43.72242700000001 -91.258781 43.67735300000001 -91.258255 43.598918999999995 -91.232857 43.54874000000001 -91.240425 43.500834999999995 -91.223434 43.50065599999999 -91.610954 43.49960300000001 -91.730217Minnesota27W N CenMN206207.09912845.4114375099.01130683.01647853.02145183.02229916.01605702.01593019.0246546.077722.02192417.0118919.0606584.0303141.00.490.511043304.041.98778899999999 -124.5583949999999946.23625899999999 -116.4694440000000141.99445700000001 -121.440407 42.0009 -122.28357700000001 42.00234599999999 -123.22094 41.99799300000001 -123.512032 41.99311399999999 -123.81796299999999 41.997814000000005 -124.205246 42.09884299999999 -124.351036 42.246059 -124.41384099999999 42.42977500000001 -124.4366 42.553196000000014 -124.390549 42.62286800000001 -124.39986400000001 42.832626000000005 -124.55839499999999 42.955624 -124.484123 43.26175699999999 -124.38554400000001 43.300365 -124.40484599999999 43.459270000000004 -124.27276599999999 43.605166999999994 -124.224777 43.85727700000001 -124.157097 44.269672000000014 -124.117088 44.66229999999999 -124.053177 44.81490299999999 -124.074341 45.03627399999999 -124.006348 45.293139999999994 -123.955376 45.48526000000001 -123.97931700000001 45.508140999999995 -123.93543199999999 45.47422399999999 -123.89086900000001 45.499256 -123.858269 45.568703 -123.95217099999999 45.703007000000014 -123.93483 45.775654 -123.97538 45.871212000000014 -123.955025 45.942093 -123.995255 46.012493000000006 -123.919937 46.20288099999999 -123.97608199999999 46.11161799999999 -123.792847 46.1446 -123.775833 46.193821000000014 -123.819725 46.210109999999986 -123.76016200000001 46.170063 -123.715912 46.174667 -123.668999 46.23625899999999 -123.515785 46.14432099999999 -123.36232 46.144904999999994 -123.303482 46.144188000000014 -123.247566 46.170174 -123.211205 46.18375399999999 -123.174965 46.17947799999999 -123.117325 46.155902999999995 -123.04937000000001 46.110648999999995 -122.97294600000001 46.07949400000001 -122.898537 46.02734799999999 -122.874199 45.944053999999994 -122.80652599999999 45.904236 -122.805008 45.86805000000001 -122.78286 45.85061300000001 -122.78330199999999 45.80050700000001 -122.786797 45.76073099999999 -122.76307700000001 45.727847999999994 -122.771339 45.64955900000001 -122.759331 45.63120699999999 -122.69511399999999 45.606990999999994 -122.650002 45.594978 -122.564224 45.56493800000001 -122.435951 45.566329999999994 -122.355255 45.543251 -122.30194900000001 45.548271 -122.243721 45.590664000000004 -122.08084099999999 45.617985000000004 -121.998817 45.63593700000001 -121.97146599999999 45.642189 -121.925629 45.677017000000006 -121.887093 45.70084399999999 -121.809853 45.689876999999996 -121.757507 45.688953 -121.705231 45.719727000000006 -121.52787000000001 45.69512599999999 -121.441368 45.69076200000001 -121.420845 45.69984400000001 -121.366631 45.696799999999996 -121.318794 45.67849699999999 -121.27520799999999 45.66580200000001 -121.213089 45.657444 -121.20212599999999 45.61340000000001 -121.190872 45.600674 -121.173134 45.607215999999994 -121.124023 45.64676700000001 -121.07235 45.65299999999999 -121.032303 45.645309 -120.9673 45.65047100000001 -120.947395 45.63563199999999 -120.906761 45.665339999999986 -120.86024499999999 45.71066300000001 -120.695824 45.732765 -120.657234 45.743763 -120.622589 45.74107000000001 -120.568916 45.69578200000001 -120.49799300000001 45.68942999999999 -120.442223 45.71673200000001 -120.282478 45.719933 -120.206291 45.76141000000001 -120.154755 45.78035 -120.067497 45.81128699999999 -119.993172 45.83184399999999 -119.86859100000001 45.841755000000006 -119.832413 45.85268400000001 -119.677307 45.89955499999999 -119.620979 45.913459999999986 -119.58815799999999 45.89934500000001 -119.511086 45.914412999999996 -119.43772899999999 45.917755 -119.378311 45.932807999999994 -119.301636 45.92249699999999 -119.17761999999999 45.92585399999999 -119.13913 45.966419 -119.031105 45.999202999999994 -118.981018 46.001778 -117.991478 46.00001900000001 -117.981628 46.00040100000001 -117.60180700000001 45.999966 -117.48065199999999 45.995299999999986 -116.91815199999999 45.980639999999994 -116.897217 45.90372099999999 -116.855492 45.845989 -116.790283 45.819885 -116.772728 45.819289999999995 -116.702202 45.78075000000001 -116.653419 45.74754300000001 -116.559654 45.710846000000004 -116.527298 45.66460799999999 -116.513939 45.60637299999999 -116.46944400000001 45.56617399999999 -116.477577 45.493763 -116.553528 45.45998 -116.564796 45.33552900000001 -116.671288 45.26247000000001 -116.687836 45.137428 -116.735603 45.10642200000001 -116.760284 45.099602000000004 -116.777107 45.075874 -116.786224 45.04987700000001 -116.80632 45.017067 -116.853523 45.00016400000001 -116.847107 44.980087 -116.854897 44.97186300000001 -116.84716800000001 44.97275500000001 -116.83040600000001 44.954971 -116.846565 44.920265 -116.834404 44.868729 -116.86608100000001 44.848674999999986 -116.89636999999999 44.82906 -116.908623 44.77615399999999 -116.950493 44.749233000000004 -117.038567 44.697674000000006 -117.065506 44.689452999999986 -117.07834600000001 44.57263900000001 -117.129494 44.559402000000006 -117.14292900000001 44.534771000000006 -117.14415 44.511921 -117.18637799999999 44.48590100000001 -117.20295 44.47310300000001 -117.22339600000001 44.427971000000014 -117.21620899999999 44.39009899999999 -117.23590899999999 44.33955399999999 -117.200592 44.300781 -117.21644599999999 44.28483600000001 -117.212563 44.25344799999999 -117.169716 44.25074799999999 -117.142273 44.26992000000001 -117.111687 44.26719299999999 -117.099556 44.24396100000001 -117.080383 44.23167000000001 -117.05102500000001 44.24945099999999 -117.02935 44.24717699999999 -116.99170699999999 44.225295999999986 -116.975128 44.197956000000005 -116.980873 44.17741799999999 -116.912056 44.14642699999999 -116.90126000000001 44.093140000000005 -116.945892 44.090411999999986 -116.962448 44.07400899999999 -116.975822 44.014317000000005 -116.932602 43.96331000000001 -116.966965 43.92869200000001 -116.958725 43.904556000000014 -116.97715 43.87358499999999 -116.977158 43.859466999999995 -116.984779 43.853088000000014 -117.01522800000001 43.83988600000001 -117.009514 43.831683999999996 -117.026634 43.80025900000001 -117.036125 43.75381899999999 -117.02280400000001 43.67914999999999 -117.025307 41.99490399999999 -117.01790600000001 41.99674200000001 -118.184326 41.98924299999999 -119.309906 41.98895999999999 -119.350655 41.989315000000005 -119.992401 41.98778899999999 -120.87082699999999 41.99445700000001 -121.440407Oregon41PacificOR248646.6726172.3312842321.0750844.01103313.01397073.01445248.01063797.0949326.0165256.043435.01319960.087183.0380532.0206287.00.4920.508452821.042.69851299999999 -72.55389445.301422 -70.73464242.720383 -72.280388 42.725769000000014 -72.456238 42.746758 -72.462639 42.761505 -72.47979 42.76865000000001 -72.507736 42.789176999999995 -72.513535 42.80765199999999 -72.539383 42.86056099999999 -72.553894 42.912532999999996 -72.525276 42.95159100000001 -72.520683 42.96550400000001 -72.50473 42.97606300000001 -72.473808 42.99952300000001 -72.457626 43.046425 -72.462219 43.078959999999995 -72.443932 43.11619200000001 -72.438072 43.155945 -72.452866 43.232178000000005 -72.436066 43.307308000000006 -72.402885 43.32333 -72.410698 43.350933 -72.398094 43.37705199999999 -72.412605 43.41008400000001 -72.396713 43.48455799999999 -72.38298 43.517483 -72.395462 43.572304 -72.373962 43.597294000000005 -72.333549 43.69846000000001 -72.304504 43.735229000000004 -72.260521 43.75062199999999 -72.219589 43.764565000000005 -72.206558 43.801620000000014 -72.185303 43.878849 -72.170555 43.90914900000001 -72.122116 43.939098 -72.11367 43.95792399999999 -72.092178 43.976448000000005 -72.113274 43.98916199999999 -72.110374 44.008858000000004 -72.08567 44.03197499999999 -72.077385 44.083309000000014 -72.035194 44.096035 -72.032913 44.10038800000001 -72.04998 44.12068199999999 -72.035385 44.156372000000005 -72.045189 44.18211400000001 -72.059746 44.234318 -72.044853 44.26143300000001 -72.060028 44.299374 -72.035957 44.32748799999999 -71.994896 44.325726 -71.939369 44.336051999999995 -71.928825 44.34413900000001 -71.835281 44.350300000000004 -71.821663 44.38411300000001 -71.798195 44.39819 -71.767036 44.421284000000014 -71.677353 44.440079 -71.656868 44.469116000000014 -71.648178 44.476673000000005 -71.637024 44.47444899999999 -71.614693 44.49448000000001 -71.58709 44.52574899999999 -71.575714 44.53881799999999 -71.591911 44.551146999999986 -71.592758 44.57887600000001 -71.537262 44.59653499999999 -71.554573 44.637394 -71.568497 44.65054699999999 -71.589218 44.67781099999999 -71.608147 44.74166099999999 -71.631599 44.77914799999999 -71.583969 44.81597099999999 -71.575569 44.89962399999999 -71.506836 44.94364899999999 -71.517448 44.976517 -71.541397 45.013306 -71.505844 45.059844999999996 -71.503471 45.11694700000001 -71.430885 45.202758999999986 -71.403 45.23603800000001 -71.447037 45.23488599999999 -71.386856 45.29344900000001 -71.297714 45.237922999999995 -71.153572 45.301422 -71.08799 44.66848400000001 -71.029205 44.282082 -71.009079 43.791088 -70.984932 43.571751000000006 -70.974365 43.564064 -70.957016 43.54887400000001 -70.950111 43.53191000000001 -70.96476 43.51630800000001 -70.95977 43.47013100000001 -70.971283 43.438046000000014 -70.961975 43.39610300000001 -70.979591 43.366299 -70.970192 43.301987 -70.906296 43.280936999999994 -70.901581 43.235138000000006 -70.813705 43.159088 -70.831047 43.12178399999999 -70.819168 43.127621000000005 -70.885246 43.10144 -70.87513 43.083935 -70.905914 43.058796 -70.886993 43.089653 -70.810928 43.058673999999996 -70.734642 42.866974 -70.814384 42.863338 -70.850243 42.886787 -70.898613 42.88505900000001 -70.921837 42.85108199999999 -71.025925 42.80422999999999 -71.066063 42.81819200000001 -71.121101 42.80722800000001 -71.181557 42.73867000000001 -71.186844 42.743464999999986 -71.240974 42.725978999999995 -71.252907 42.69851299999999 -71.287689 42.705291999999986 -71.901421 42.707122999999996 -71.930695 42.720383 -72.280388New Hampshire33N EngNH23230.674875.2651109252.0292601.0411186.0543544.0565708.0415538.0443317.069904.04067.0574237.038108.0148720.078699.00.490.51193338.040.371902000000006 -96.64039643.501495000000006 -90.1426740.70540199999999 -91.119987 40.68214800000001 -91.129158 40.65631099999999 -91.162498 40.64381800000001 -91.214912 40.639545 -91.262062 40.60343900000001 -91.37561 40.572970999999995 -91.411118 40.54799299999999 -91.412872 40.52849599999999 -91.382103 40.50365400000001 -91.374794 40.44725 -91.385399 40.40298799999999 -91.372757 40.392360999999994 -91.385757 40.386875 -91.418816 40.371902000000006 -91.448593 40.39096799999999 -91.476883 40.390761999999995 -91.490158 40.40511699999999 -91.500221 40.41012599999999 -91.527534 40.43504300000001 -91.529449 40.44124600000001 -91.538689 40.455399 -91.533051 40.463718 -91.579224 40.484477999999996 -91.585869 40.50483299999999 -91.616699 40.53286399999999 -91.622375 40.55163999999999 -91.691917 40.581165 -91.689796 40.593399000000005 -91.716812 40.609748999999994 -91.741547 40.60823400000001 -91.946198 40.60006000000001 -92.192993 40.599548 -92.361328 40.59143800000001 -92.64624 40.58964499999999 -92.717621 40.58433500000001 -93.100731 40.58048199999999 -93.370056 40.58080699999999 -93.562691 40.57844499999999 -93.786079 40.57402400000001 -94.01783 40.57097200000001 -94.238159 40.57421500000001 -94.484993 40.57575600000001 -94.639633 40.57722899999999 -94.920364 40.581897999999995 -95.217171 40.58433500000001 -95.382294 40.589045999999996 -95.767204 40.620903 -95.757271 40.64311599999999 -95.767723 40.730434 -95.876335 40.792598999999996 -95.851509 40.848331 -95.846153 40.870299999999986 -95.834114 40.901107999999994 -95.836258 40.97425799999999 -95.837318 41.002650999999986 -95.860611 41.03500399999999 -95.859253 41.06587200000001 -95.878517 41.10918799999999 -95.857986 41.16420400000001 -95.876396 41.166866 -95.859512 41.18053800000001 -95.85891 41.194064999999995 -95.91581 41.207854999999995 -95.921959 41.225246 -95.91069 41.302059000000014 -95.929939 41.308471999999995 -95.910912 41.286865000000006 -95.897301 41.30139199999999 -95.888817 41.34008 -95.942604 41.39481000000001 -95.939766 41.46238700000001 -95.934776 41.47239300000001 -95.952896 41.48195999999999 -96.006607 41.492999999999995 -96.013161 41.51152400000001 -95.996399 41.528110999999996 -95.993675 41.53667100000001 -96.004303 41.52434199999999 -96.049881 41.537529000000006 -96.085548 41.563152 -96.091644 41.576008 -96.080544 41.59901400000001 -96.111015 41.65468999999999 -96.099014 41.68410499999999 -96.119972 41.69492299999999 -96.12191 41.70499799999999 -96.085266 41.73157499999999 -96.09948 41.75298699999999 -96.09903 41.791481000000005 -96.076126 41.86263299999999 -96.13533 41.90416300000001 -96.159676 41.92491899999999 -96.145576 41.96626699999999 -96.147034 41.98069799999999 -96.184921 41.99662799999999 -96.202545 42.001270000000005 -96.235794 42.02844999999999 -96.238426 42.04890800000001 -96.265182 42.12346299999999 -96.284821 42.168194 -96.35186 42.214049999999986 -96.363205 42.22953000000001 -96.337402 42.26031499999999 -96.332352 42.28208900000001 -96.342575 42.29803100000001 -96.368393 42.32879600000001 -96.389473 42.34928500000001 -96.423866 42.38092399999999 -96.411453 42.414783 -96.41732 42.441799 -96.397583 42.46740700000001 -96.395767 42.48924600000001 -96.439087 42.517135999999994 -96.479935 42.56403399999999 -96.489029 42.573891 -96.500633 42.58048600000001 -96.48819 42.629761 -96.512535 42.66241099999999 -96.540855 42.668518000000006 -96.562729 42.708359 -96.626228 42.74860799999999 -96.640396 42.77683999999999 -96.632668 42.799564000000004 -96.600563 42.835387999999995 -96.587334 42.83435399999999 -96.572815 42.846667999999994 -96.555901 42.89691500000001 -96.537201 42.91387599999999 -96.543953 42.952393 -96.514626 42.986469 -96.516838 43.012061999999986 -96.498711 43.05152100000001 -96.519699 43.06189699999999 -96.479263 43.07559599999999 -96.461784 43.087886999999995 -96.460495 43.12632400000001 -96.451195 43.20909900000001 -96.472801 43.217926000000006 -96.486931 43.225505999999996 -96.558289 43.23965100000001 -96.566673 43.25328099999999 -96.55925 43.263630000000006 -96.570404 43.29009199999999 -96.578812 43.30767800000001 -96.540245 43.356987000000004 -96.522575 43.38424699999999 -96.524734 43.40074899999999 -96.557388 43.435562000000004 -96.588791 43.481944999999996 -96.583473 43.499874000000005 -96.597992 43.49974399999999 -96.460136 43.49856600000001 -96.060738 43.498977999999994 -95.866615 43.49957699999999 -95.464493 43.500370000000004 -95.396278 43.499413000000004 -94.920197 43.50007199999999 -94.859573 43.49814599999999 -94.454987 43.49899300000001 -94.246544 43.50034299999999 -93.973717 43.500809000000004 -93.653481 43.50053399999999 -93.500618 43.501495000000006 -93.054184 43.501316 -93.027016 43.500294 -92.557831 43.49949599999999 -92.452995 43.499187000000006 -92.07737 43.49960300000001 -91.730217 43.50065599999999 -91.610954 43.500834999999995 -91.223434 43.46471 -91.235771 43.424076000000014 -91.210785 43.37053700000001 -91.198112 43.353970000000004 -91.176918 43.313320000000004 -91.078369 43.280703999999986 -91.066299 43.25791899999999 -91.068924 43.147594 -91.161224 43.08290500000001 -91.168442 43.081199999999995 -91.159622 43.00133099999999 -91.152084 42.925906999999995 -91.138992 42.871452000000005 -91.0933 42.78337500000001 -91.081902 42.744923 -91.06604 42.707066 -90.999054 42.68068299999999 -90.919281 42.678246 -90.892418 42.657005 -90.745483 42.637932000000006 -90.694664 42.571392 -90.664253 42.555713999999995 -90.639091 42.528560999999996 -90.62558 42.50936100000001 -90.638329 42.494698 -90.651772 42.47564299999999 -90.648346 42.46055999999999 -90.605827 42.42183700000001 -90.563583 42.38878299999999 -90.491043 42.360073 -90.441597 42.340633 -90.427681 42.263924 -90.417984 42.24264500000001 -90.407173 42.21020899999999 -90.367729 42.19731899999999 -90.323601 42.15972099999999 -90.230934 42.12268800000001 -90.191574 42.12050199999999 -90.176086 42.103745 -90.166649 42.06104300000001 -90.168098 42.03342799999999 -90.150536 41.98396299999999 -90.14267 41.93077500000001 -90.154518 41.80613700000001 -90.195839 41.78173799999999 -90.25531 41.75646599999999 -90.304886 41.722736 -90.326027 41.64909 -90.341133 41.60279800000001 -90.339348 41.586849 -90.348366 41.567272 -90.423004 41.543578999999994 -90.434967 41.527546 -90.454994 41.52597 -90.54084 41.50958600000001 -90.6007 41.46231800000001 -90.658791 41.450062 -90.708214 41.449820999999986 -90.7799 41.44462200000001 -90.844139 41.421234 -90.949654 41.431084 -91.000694 41.423508 -91.027489 41.40137899999999 -91.055786 41.334895999999986 -91.07328 41.267818000000005 -91.102348 41.23152200000001 -91.101524 41.17625799999999 -91.05632 41.16582500000001 -91.018257 41.14437100000001 -90.990341 41.10435899999999 -90.957787 41.07036199999999 -90.954651 40.950503999999995 -90.960709 40.92392699999999 -90.983276 40.87958499999999 -91.04921 40.833729000000005 -91.088905 40.76154700000001 -91.092751 40.70540199999999 -91.119987Iowa19W N CenIA144715.9891037.6592776755.0740819.01064325.01344802.01431953.01013757.0970933.0156930.016373.01340242.063641.0429860.0217271.00.4840.516579075.041.238155000000006 -73.49927542.886787 -69.9183241.77209500000001 -71.319832 41.784324999999995 -71.340302 41.813061000000005 -71.345985 41.85780299999999 -71.335045 41.87568300000001 -71.342995 41.89593099999999 -71.333588 41.88834 -71.384453 41.979164 -71.382904 42.01361499999999 -71.379143 42.00915499999999 -71.497925 42.004177 -71.798317 42.01787899999999 -71.802826 42.02570299999999 -72.095451 42.026306000000005 -72.136826 42.030669999999986 -72.508041 42.03002900000001 -72.571693 42.021511000000004 -72.582375 42.022705 -72.608292 42.030440999999996 -72.609993 42.03375199999999 -72.756355 42.002071 -72.768036 41.99708899999999 -72.818138 42.033412999999996 -72.81691 42.03591499999999 -73.006546 42.03621699999999 -73.046082 42.047337 -73.484665 42.07737 -73.499275 42.504673 -73.351273 42.745979000000005 -73.258507 42.74031400000001 -73.020149 42.73728199999999 -72.923454 42.725769000000014 -72.456238 42.720383 -72.280388 42.707122999999996 -71.930695 42.705291999999986 -71.901421 42.69851299999999 -71.287689 42.725978999999995 -71.252907 42.743464999999986 -71.240974 42.73867000000001 -71.186844 42.80722800000001 -71.181557 42.81819200000001 -71.121101 42.80422999999999 -71.066063 42.85108199999999 -71.025925 42.88505900000001 -70.921837 42.886787 -70.898613 42.863338 -70.850243 42.866974 -70.814384 42.66342900000001 -70.740204 42.646209999999996 -70.593712 42.58254600000001 -70.633965 42.54634100000001 -70.813637 42.447970999999995 -70.894112 42.432297000000005 -70.961128 42.285529999999994 -71.034668 42.23441700000001 -70.923714 42.26566700000001 -70.893181 42.26040599999999 -70.825172 42.248538999999994 -70.775108 42.153065 -70.686554 41.968086 -70.619225 41.930847 -70.540863 41.805656 -70.538231 41.743515 -70.424042 41.721554 -70.274368 41.711704 -70.34166 41.712463000000014 -70.205795 41.781409999999994 -70.019753 41.856243000000006 -70.000984 42.00209000000001 -70.101028 42.06001699999999 -70.255676 42.07239200000001 -70.13562 42.026196 -70.051003 41.903988 -69.964706 41.76754399999999 -69.91832 41.67138299999999 -69.954964 41.612460999999996 -70.398148 41.56964500000001 -70.433449 41.53969599999999 -70.637665 41.55601899999999 -70.665413 41.73553100000001 -70.620285 41.626587 -70.839951 41.63380799999999 -70.892647 41.52001999999999 -71.001701 41.49295799999999 -71.117645 41.65517 -71.141724 41.67839799999999 -71.199318 41.707592000000005 -71.229485 41.749641 -71.267136 41.77209500000001 -71.31983241.429550000000006 -70.604858 41.46445499999999 -70.568222 41.41727399999999 -70.55336 41.41017199999999 -70.576385 41.39854399999999 -70.515686 41.341442 -70.486671 41.33404200000001 -70.739204 41.29804999999999 -70.770241 41.348488 -70.844444 41.352406 -70.783051 41.32486700000001 -70.771454 41.382057 -70.752296 41.454826 -70.668015 41.47455199999999 -70.606369 41.429550000000006 -70.60485841.31181000000001 -70.032257 41.32465400000001 -70.00705 41.33708999999999 -70.027161 41.29672600000001 -70.088173 41.349597999999986 -70.035027 41.391842 -70.049805 41.294769 -69.966522 41.251693999999986 -69.968987 41.238155000000006 -70.103645 41.270081000000005 -70.213806 41.29396399999999 -70.207634 41.27750800000001 -70.098412 41.31181000000001 -70.032257Massachusetts25N EngMA20300.3492606.7386016425.01514746.02247110.02888745.03127680.02268095.02148065.0318026.0247381.03027950.0218000.0718354.0345333.00.480.52808423.039.99259599999999 -104.05572543.003094000000004 -95.30844140.00100699999999 -101.406952 39.99892800000001 -102.051071 40.34265099999999 -102.047081 40.431084 -102.047157 40.69732300000001 -102.04557 40.743134 -102.046532 40.998076999999995 -102.047279 41.000225 -102.620789 40.99813499999999 -102.651802 41.000331999999986 -103.382469 40.999663999999996 -103.571823 41.00322700000001 -104.051201 41.38810699999999 -104.053505 41.564246999999995 -104.054993 41.69824600000001 -104.053108 41.99985100000001 -104.053009 42.61470399999999 -104.055725 43.003094000000004 -104.05571 42.99865 -103.500984 42.99937399999999 -103.005409 42.99532300000001 -102.787933 42.989891 -102.086273 42.98683500000001 -101.231308 42.99108899999999 -100.197739 42.992332000000005 -99.532402 42.99239 -99.253593 42.991783 -98.497292 42.937163999999996 -98.457085 42.920139000000006 -98.390846 42.881798 -98.309982 42.839573 -98.167473 42.83579599999999 -98.144516 42.82022499999999 -98.122765 42.80836099999999 -98.121468 42.769192000000004 -98.032791 42.76681099999999 -97.994797 42.77368899999999 -97.963211 42.79232400000001 -97.929131 42.83127200000001 -97.889595 42.855807999999996 -97.888313 42.866589000000005 -97.818298 42.849597999999986 -97.796684 42.84616500000001 -97.771843 42.85800900000001 -97.724907 42.836838 -97.68541 42.86128600000001 -97.634628 42.847992000000005 -97.570312 42.860138000000006 -97.505791 42.857158999999996 -97.482819 42.85044500000001 -97.456924 42.867435 -97.388969 42.861774 -97.311081 42.850018000000006 -97.271126 42.85183000000001 -97.242859 42.841206 -97.224113 42.81257600000001 -97.211502 42.798621999999995 -97.161095 42.77392599999999 -97.130142 42.759544000000005 -97.014816 42.75831600000001 -96.979271 42.75206800000001 -96.969681 42.72730999999999 -96.977547 42.721149 -96.970451 42.73170099999999 -96.907913 42.70408599999999 -96.809822 42.681343 -96.81012 42.67002099999999 -96.799026 42.66859400000001 -96.722343 42.657718999999986 -96.698746 42.641166999999996 -96.694283 42.621910000000014 -96.714958 42.61230499999999 -96.713745 42.550735 -96.63636 42.522696999999994 -96.628983 42.507239999999996 -96.605156 42.518291000000005 -96.584442 42.52050399999999 -96.546906 42.48846399999999 -96.494392 42.48924600000001 -96.439087 42.46740700000001 -96.395767 42.441799 -96.397583 42.414783 -96.41732 42.38092399999999 -96.411453 42.34928500000001 -96.423866 42.32879600000001 -96.389473 42.29803100000001 -96.368393 42.28208900000001 -96.342575 42.26031499999999 -96.332352 42.22953000000001 -96.337402 42.214049999999986 -96.363205 42.168194 -96.35186 42.12346299999999 -96.284821 42.04890800000001 -96.265182 42.02844999999999 -96.238426 42.001270000000005 -96.235794 41.99662799999999 -96.202545 41.98069799999999 -96.184921 41.96626699999999 -96.147034 41.92491899999999 -96.145576 41.90416300000001 -96.159676 41.86263299999999 -96.13533 41.791481000000005 -96.076126 41.75298699999999 -96.09903 41.73157499999999 -96.09948 41.70499799999999 -96.085266 41.69492299999999 -96.12191 41.68410499999999 -96.119972 41.65468999999999 -96.099014 41.59901400000001 -96.111015 41.576008 -96.080544 41.563152 -96.091644 41.537529000000006 -96.085548 41.52434199999999 -96.049881 41.53667100000001 -96.004303 41.528110999999996 -95.993675 41.51152400000001 -95.996399 41.492999999999995 -96.013161 41.48195999999999 -96.006607 41.47239300000001 -95.952896 41.46238700000001 -95.934776 41.39481000000001 -95.939766 41.34008 -95.942604 41.30139199999999 -95.888817 41.286865000000006 -95.897301 41.308471999999995 -95.910912 41.302059000000014 -95.929939 41.225246 -95.91069 41.207854999999995 -95.921959 41.194064999999995 -95.91581 41.18053800000001 -95.85891 41.166866 -95.859512 41.16420400000001 -95.876396 41.10918799999999 -95.857986 41.06587200000001 -95.878517 41.03500399999999 -95.859253 41.002650999999986 -95.860611 40.97425799999999 -95.837318 40.901107999999994 -95.836258 40.870299999999986 -95.834114 40.848331 -95.846153 40.792598999999996 -95.851509 40.730434 -95.876335 40.64311599999999 -95.767723 40.620903 -95.757271 40.589045999999996 -95.767204 40.549705999999986 -95.763138 40.53237200000001 -95.736763 40.52412799999999 -95.691795 40.56116900000001 -95.687141 40.565833999999995 -95.675423 40.558727000000005 -95.662674 40.53033099999999 -95.657791 40.512203 -95.6847 40.48533599999999 -95.695091 40.396389 -95.636551 40.358799000000005 -95.633919 40.346497 -95.615936 40.33141699999999 -95.617668 40.32234600000001 -95.645287 40.30910900000001 -95.646561 40.309776 -95.595268 40.266215999999986 -95.546875 40.226856 -95.476562 40.213257 -95.466377 40.17399599999999 -95.460693 40.131744 -95.422218 40.11541700000001 -95.392555 40.09536399999999 -95.384285 40.08037899999999 -95.403526 40.048111000000006 -95.413506 40.043750999999986 -95.390274 40.028751 -95.370987 40.02497500000001 -95.34481 39.999409000000014 -95.308441 39.99259599999999 -95.329445 39.99348800000001 -95.780434 39.995159 -96.000977 39.99450300000001 -96.240311 39.994170999999994 -96.453743 39.994473 -96.801117 39.996151 -96.907982 39.997375000000005 -97.361595 39.999718 -97.816269 39.99843999999999 -97.929268 39.99842100000001 -98.26384 39.997116000000005 -98.504143 39.998447 -98.720284 39.998324999999994 -99.064384 39.99956499999999 -99.177834 40.00297900000001 -99.627472 40.000473 -100.180496 40.000580000000014 -100.190697 39.999168 -100.734619 40.00019499999999 -100.754425 40.001823 -101.321709 40.00100699999999 -101.406952Nebraska31W N CenNE199113.2031244.9571578385.0415427.0602363.0769439.0808946.0571600.0590216.086820.08988.0772813.029326.0249094.0108841.00.4870.513328831.040.505898 -79.76346645.0061 -71.87047642.267269 -79.763466 42.41930400000001 -79.444252 42.493404 -79.355118 42.574557999999996 -79.142471 42.69918799999999 -79.043991 42.792686 -78.859444 42.974174000000005 -78.93679 43.022301 -78.883034 43.06657000000001 -78.925835 43.09054900000001 -79.061348 43.14468400000001 -79.039558 43.26816199999999 -79.062469 43.371937 -78.464905 43.36551299999999 -77.992271 43.335109999999986 -77.745277 43.24148600000001 -77.575989 43.27565000000001 -77.377602 43.27852999999999 -76.914841 43.342667000000006 -76.737152 43.323375999999996 -76.718796 43.414085 -76.619957 43.500652 -76.454994 43.554084999999986 -76.223114 43.633129 -76.184921 43.68263200000001 -76.206017 43.83506399999999 -76.240341 43.91243 -76.194069 43.93214800000001 -76.129417 44.013172 -76.134872 44.06554399999999 -76.201889 44.04196200000001 -76.297226 44.09830099999999 -76.363213 44.390209 -75.848351 44.51747499999999 -75.758972 44.81057000000001 -75.329201 44.948578 -74.968819 44.99286699999999 -74.736481 44.990803 -74.021935 45.0061 -73.345146 44.981933999999995 -73.351181 44.93256400000001 -73.336838 44.847893 -73.382729 44.81907699999999 -73.369476 44.799251999999996 -73.327209 44.72419400000001 -73.373581 44.68032500000001 -73.358574 44.66123200000001 -73.37352 44.634303999999986 -73.37056 44.61976200000001 -73.382248 44.57912099999999 -73.371719 44.55392499999999 -73.348236 44.54428100000001 -73.334877 44.432804000000004 -73.293747 44.405483000000004 -73.300423 44.36734000000001 -73.330215 44.26008999999999 -73.305756 44.20119500000001 -73.377762 44.172054 -73.382492 44.136173000000014 -73.408295 44.10655600000001 -73.409187 44.06384299999999 -73.435646 44.045624000000004 -73.436432 44.01816600000001 -73.408684 43.98813999999999 -73.417839 43.914749 -73.405769 43.885918000000004 -73.375557 43.80444700000001 -73.385178 43.778366000000005 -73.359436 43.756496 -73.357109 43.71421799999999 -73.371429 43.63204999999999 -73.423401 43.582413 -73.418762 43.56907699999999 -73.388557 43.61493300000001 -73.364128 43.624649000000005 -73.303978 43.619586999999996 -73.294548 43.593121 -73.282181 43.57496599999999 -73.291847 43.559315 -73.260429 43.512764000000004 -73.238838 43.310779999999994 -73.250519 42.94021599999999 -73.276451 42.83702500000001 -73.280029 42.803471 -73.296616 42.747401999999994 -73.269722 42.745979000000005 -73.258507 42.504673 -73.351273 42.07737 -73.499275 42.047337 -73.484665 41.665592000000004 -73.517578 41.522651999999994 -73.530823 41.365204000000006 -73.544724 41.293526000000014 -73.55069 41.21065899999999 -73.478554 41.100258 -73.725662 41.012519999999995 -73.654152 40.99829500000001 -73.65358 40.88658899999999 -73.780464 40.832233 -73.796768 40.802704000000006 -73.92028 40.70389900000001 -74.006599 40.737629 -74.006676 40.79738599999999 -73.977478 40.885941 -73.922813 40.92721599999999 -73.909386 40.96077299999999 -73.896568 40.99843200000001 -73.897118 41.123515999999995 -74.213448 41.137530999999996 -74.242767 41.19575499999999 -74.372383 41.35047900000001 -74.700455 41.374966 -74.705666 41.401543000000004 -74.740829 41.421966999999995 -74.740433 41.43005400000001 -74.755219 41.429824999999994 -74.79319 41.447063000000014 -74.864456 41.44458 -74.895668 41.461803 -74.898949 41.484261000000004 -74.932953 41.48351299999999 -74.972176 41.539467 -75.015274 41.56571199999999 -75.025475 41.604389 -75.070251 41.612990999999994 -75.072838 41.637226 -75.051712 41.714747999999986 -75.065788 41.72662 -75.057358 41.770172 -75.061707 41.778954 -75.097542 41.79711900000001 -75.097214 41.81406000000001 -75.080231 41.83689899999999 -75.118164 41.84909400000001 -75.125137 41.85570100000001 -75.148666 41.867751999999996 -75.171669 41.868786 -75.254898 41.947517000000005 -75.284073 41.96118899999999 -75.324448 41.992760000000004 -75.346039 41.998271999999986 -75.383194 41.996284 -75.48011 41.999424000000005 -76.105186 42.000580000000014 -76.14537 42.002937 -76.564247 42.00246000000001 -76.928711 42.00290699999999 -76.968887 41.998760000000004 -77.613136 41.997265 -77.745293 41.99813499999999 -78.204529 41.99935500000001 -78.305351 41.999786 -78.918777 42.00109900000001 -79.059723 42.00053 -79.612595 42.003052 -79.761887 42.267269 -79.76346640.594482 -73.752632 40.557545000000005 -73.928009 40.618134 -73.761818 40.636829000000006 -73.765358 40.65249600000001 -73.846481 40.63102699999999 -73.916153 40.59016399999999 -73.880234 40.581154 -74.004456 40.63923299999999 -74.028137 40.739281000000005 -73.956024 40.79701600000001 -73.899437 40.78874999999999 -73.754341 40.844898 -73.749901 40.90304599999999 -73.598701 40.87964600000001 -73.478523 40.922459 -73.431084 40.90094400000001 -73.214966 40.95129800000001 -73.141426 40.968334 -73.021721 40.98118600000001 -72.632034 41.149235000000004 -72.317505 41.142437 -72.281624 41.11010400000001 -72.354752 41.02593999999999 -72.416817 40.966080000000005 -72.551437 40.905201000000005 -72.605278 40.92004800000001 -72.476578 41.02391800000001 -72.293556 41.03527500000001 -72.203827 41.000473 -72.077492 41.08476999999999 -71.924187 41.07440600000001 -71.870476 41.030472 -71.919189 40.814941000000005 -72.521629 40.661224000000004 -73.422958 40.594482 -73.75263240.626282 -73.293495 40.63297700000001 -73.29158 40.63297700000001 -73.240875 40.67506800000001 -73.051468 40.737246999999996 -72.877357 40.76403400000001 -72.782654 40.76786000000001 -72.757782 40.75829300000001 -72.764481 40.69994 -72.956764 40.67124200000001 -73.03138 40.625324000000006 -73.249489 40.626282 -73.29349540.505898 -74.23735 40.537800000000004 -74.23735 40.624393 -74.16671 40.649460000000005 -74.07328 40.60160400000001 -74.059608 40.544636 -74.123413 40.510456000000005 -74.194054 40.505898 -74.23735New York36Mid AtlNY120316.1716262.711.8235907E74548344.06746555.08739138.09496769.06763332.04467866.0881693.02113133.08498119.0636280.02104413.01035767.00.4790.5212564485.039.719234 -80.52625342.267269 -74.70045539.719528 -77.476082 39.725368 -78.096222 39.724007 -78.334816 39.723659999999995 -78.385048 39.723029999999994 -78.818016 39.722252 -78.930428 39.719234 -79.396851 39.72019599999999 -79.481209 39.72172900000001 -79.765358 39.721588 -79.918488 39.719761000000005 -80.429283 39.721126999999996 -80.524467 39.95834400000001 -80.524857 40.022751 -80.525169 40.16244900000001 -80.526253 40.40296599999999 -80.523773 40.478717999999986 -80.524567 40.63713799999999 -80.522209 40.854107 -80.520515 40.897209000000004 -80.521133 41.12957 -80.52314 41.48923500000001 -80.520203 41.495048999999995 -80.524132 41.850719 -80.52285 41.986816000000005 -80.520798 42.267269 -79.763466 42.003052 -79.761887 42.00053 -79.612595 42.00109900000001 -79.059723 41.999786 -78.918777 41.99935500000001 -78.305351 41.99813499999999 -78.204529 41.997265 -77.745293 41.998760000000004 -77.613136 42.00290699999999 -76.968887 42.00246000000001 -76.928711 42.002937 -76.564247 42.000580000000014 -76.14537 41.999424000000005 -76.105186 41.996284 -75.48011 41.998271999999986 -75.383194 41.992760000000004 -75.346039 41.96118899999999 -75.324448 41.947517000000005 -75.284073 41.868786 -75.254898 41.867751999999996 -75.171669 41.85570100000001 -75.148666 41.84909400000001 -75.125137 41.83689899999999 -75.118164 41.81406000000001 -75.080231 41.79711900000001 -75.097214 41.778954 -75.097542 41.770172 -75.061707 41.72662 -75.057358 41.714747999999986 -75.065788 41.637226 -75.051712 41.612990999999994 -75.072838 41.604389 -75.070251 41.56571199999999 -75.025475 41.539467 -75.015274 41.48351299999999 -74.972176 41.484261000000004 -74.932953 41.461803 -74.898949 41.44458 -74.895668 41.447063000000014 -74.864456 41.429824999999994 -74.79319 41.43005400000001 -74.755219 41.421966999999995 -74.740433 41.401543000000004 -74.740829 41.374966 -74.705666 41.35047900000001 -74.700455 41.311871 -74.792053 41.29512 -74.794533 41.282612 -74.825584 41.22672299999999 -74.866798 41.20667599999999 -74.863274 41.141009999999994 -74.915154 41.111759000000006 -74.950378 41.09928500000001 -74.984978 41.08166499999999 -74.989265 41.082581000000005 -74.966675 41.062388999999996 -75.001534 41.028107000000006 -75.035637 41.01061999999999 -75.070358 41.00015300000001 -75.116997 40.97743199999999 -75.139679 40.962841 -75.135902 40.90325200000001 -75.080116 40.884528999999986 -75.074066 40.871948 -75.05687 40.85557600000001 -75.055 40.83918800000001 -75.099922 40.821293 -75.089592 40.791561 -75.100922 40.772609999999986 -75.130699 40.774711999999994 -75.170692 40.747906 -75.194023 40.723759 -75.188133 40.68596299999999 -75.205734 40.669692999999995 -75.184441 40.65063900000001 -75.209297 40.634106 -75.198318 40.614643 -75.200768 40.58366799999999 -75.193893 40.570583 -75.197952 40.55669800000001 -75.182663 40.564696999999995 -75.124908 40.545254 -75.08017 40.52090100000001 -75.064064 40.45615000000001 -75.070503 40.42006699999999 -75.057838 40.401218 -75.021652 40.40851599999999 -75.000862 40.40434300000001 -74.973228 40.34536700000001 -74.950577 40.33366799999999 -74.932892 40.31392700000001 -74.921539 40.29948400000001 -74.88105 40.248344 -74.843155 40.177616 -74.73922 40.14919699999999 -74.725876 40.12424899999999 -74.746689 40.116051 -74.829414 40.077946 -74.872314 40.05790300000001 -74.956589 40.033962 -74.983871 40.00752299999999 -75.046059 39.98527899999999 -75.068428 39.97561999999999 -75.084969 39.97657799999999 -75.111343 39.95580699999999 -75.140244 39.934628000000004 -75.147537 39.89677399999999 -75.136185 39.88148899999999 -75.14328 39.87729300000001 -75.185982 39.850291999999996 -75.247368 39.845425000000006 -75.254112 39.84840399999999 -75.346298 39.798869999999994 -75.42083 39.826435000000004 -75.470345 39.84000800000001 -75.583794 39.83819600000001 -75.644341 39.820347 -75.695114 39.77481800000001 -75.745934 39.72444200000001 -75.775269 39.72375500000001 -75.791435 39.72212200000001 -76.139549 39.72174799999999 -76.233444 39.72016099999999 -76.570145 39.72115299999999 -76.790794 39.72079099999999 -76.997108 39.72058100000001 -77.221344 39.719978 -77.464722 39.719528 -77.476082Pennsylvania42Mid AtlPA116082.7371274.5841.1881643E73155989.04495966.05694265.06187378.04416669.03818385.0689656.0343724.05434532.0344795.01426851.0916786.00.4790.5212147891.040.99829500000001 -73.72566242.047337 -71.78873441.522651999999994 -73.530823 41.665592000000004 -73.517578 42.047337 -73.484665 42.03621699999999 -73.046082 42.03591499999999 -73.006546 42.033412999999996 -72.81691 41.99708899999999 -72.818138 42.002071 -72.768036 42.03375199999999 -72.756355 42.030440999999996 -72.609993 42.022705 -72.608292 42.021511000000004 -72.582375 42.03002900000001 -72.571693 42.030669999999986 -72.508041 42.026306000000005 -72.136826 42.02570299999999 -72.095451 42.01787899999999 -71.802826 42.004177 -71.798317 41.72150400000001 -71.788734 41.641659000000004 -71.793091 41.601208000000014 -71.79068 41.415729999999996 -71.80323 41.40375499999999 -71.846481 41.34186199999999 -71.837357 41.325249000000014 -71.848259 41.32266999999999 -71.867165 41.281048 -72.281891 41.28954300000001 -72.326828 41.35825 -72.378883 41.27800400000001 -72.378624 41.26360299999999 -72.52771 41.26996600000001 -72.907188 41.160942000000006 -73.104866 40.99829500000001 -73.65358 41.012519999999995 -73.654152 41.100258 -73.725662 41.21065899999999 -73.478554 41.293526000000014 -73.55069 41.365204000000006 -73.544724 41.522651999999994 -73.530823Connecticut09N EngCT12549.571748.4953287116.0864493.01230479.01592873.01694243.01248972.01300825.0186944.065805.01692874.095819.0402039.0195403.00.4850.515446558.041.32266999999999 -71.86716542.01361499999999 -71.11764541.601208000000014 -71.79068 41.641659000000004 -71.793091 41.72150400000001 -71.788734 42.004177 -71.798317 42.00915499999999 -71.497925 42.01361499999999 -71.379143 41.979164 -71.382904 41.88834 -71.384453 41.89593099999999 -71.333588 41.87568300000001 -71.342995 41.85780299999999 -71.335045 41.813061000000005 -71.345985 41.784324999999995 -71.340302 41.77209500000001 -71.319832 41.749641 -71.267136 41.707592000000005 -71.229485 41.67944700000001 -71.284508 41.74124900000001 -71.367889 41.761055 -71.394081 41.703190000000006 -71.369514 41.65211099999999 -71.419746 41.48658800000001 -71.427818 41.39198300000001 -71.490387 41.32716400000001 -71.722755 41.32266999999999 -71.867165 41.325249000000014 -71.848259 41.34186199999999 -71.837357 41.40375499999999 -71.846481 41.415729999999996 -71.80323 41.601208000000014 -71.7906841.67839799999999 -71.199318 41.65517 -71.141724 41.49295799999999 -71.117645 41.46321499999999 -71.200447 41.67839799999999 -71.19931841.62116599999999 -71.269676 41.63553999999999 -71.219955 41.47474700000001 -71.239182 41.483517000000006 -71.288513 41.44575499999999 -71.350029 41.62116599999999 -71.269676Rhode Island44N EngRI2706.52538.0561003464.0258886.0377977.0481496.0521968.0377122.0375766.058141.012187.0487913.034690.0131213.075612.00.480.52128740.038.95657 -75.57058741.35047900000001 -73.89656839.71474499999999 -75.489639 39.71997099999999 -75.476334 39.74171799999999 -75.475128 39.763248000000004 -75.460754 39.778130000000004 -75.428009 39.789658 -75.412117 39.798869999999994 -75.42083 39.84840399999999 -75.346298 39.845425000000006 -75.254112 39.850291999999996 -75.247368 39.87729300000001 -75.185982 39.88148899999999 -75.14328 39.89677399999999 -75.136185 39.934628000000004 -75.147537 39.95580699999999 -75.140244 39.97657799999999 -75.111343 39.97561999999999 -75.084969 39.98527899999999 -75.068428 40.00752299999999 -75.046059 40.033962 -74.983871 40.05790300000001 -74.956589 40.077946 -74.872314 40.116051 -74.829414 40.12424899999999 -74.746689 40.14919699999999 -74.725876 40.177616 -74.73922 40.248344 -74.843155 40.29948400000001 -74.88105 40.31392700000001 -74.921539 40.33366799999999 -74.932892 40.34536700000001 -74.950577 40.40434300000001 -74.973228 40.40851599999999 -75.000862 40.401218 -75.021652 40.42006699999999 -75.057838 40.45615000000001 -75.070503 40.52090100000001 -75.064064 40.545254 -75.08017 40.564696999999995 -75.124908 40.55669800000001 -75.182663 40.570583 -75.197952 40.58366799999999 -75.193893 40.614643 -75.200768 40.634106 -75.198318 40.65063900000001 -75.209297 40.669692999999995 -75.184441 40.68596299999999 -75.205734 40.723759 -75.188133 40.747906 -75.194023 40.774711999999994 -75.170692 40.772609999999986 -75.130699 40.791561 -75.100922 40.821293 -75.089592 40.83918800000001 -75.099922 40.85557600000001 -75.055 40.871948 -75.05687 40.884528999999986 -75.074066 40.90325200000001 -75.080116 40.962841 -75.135902 40.97743199999999 -75.139679 41.00015300000001 -75.116997 41.01061999999999 -75.070358 41.028107000000006 -75.035637 41.062388999999996 -75.001534 41.082581000000005 -74.966675 41.08166499999999 -74.989265 41.09928500000001 -74.984978 41.111759000000006 -74.950378 41.141009999999994 -74.915154 41.20667599999999 -74.863274 41.22672299999999 -74.866798 41.282612 -74.825584 41.29512 -74.794533 41.311871 -74.792053 41.35047900000001 -74.700455 41.19575499999999 -74.372383 41.137530999999996 -74.242767 41.123515999999995 -74.213448 40.99843200000001 -73.897118 40.96077299999999 -73.896568 40.92721599999999 -73.909386 40.885941 -73.922813 40.79738599999999 -73.977478 40.737629 -74.006676 40.70389900000001 -74.006599 40.64696900000001 -74.129471 40.705524 -74.115944 40.675377 -74.14727 40.591083999999995 -74.208664 40.51419799999999 -74.27932 40.46364199999999 -74.269325 40.443478 -74.224915 40.45135099999999 -74.122299 40.32350500000001 -73.978859 40.10172700000001 -74.03965 40.115971 -74.091843 40.088066 -74.08419 40.091251 -74.034714 40.05673999999999 -74.050209 40.051445 -74.122597 40.042156000000006 -74.077751 39.87848700000001 -74.159645 39.718154999999996 -74.171844 39.62392800000001 -74.238091 39.571968 -74.323753 39.52350999999999 -74.329262 39.54250300000001 -74.412796 39.50251 -74.401527 39.42663999999999 -74.460823 39.38095899999999 -74.447906 39.287136000000004 -74.65863 39.28151700000001 -74.622925 39.25071299999999 -74.624985 39.02626000000001 -74.802681 38.989731000000006 -74.879639 38.95657 -74.876686 38.971625999999986 -74.968506 39.11374699999999 -74.890587 39.170525 -74.917038 39.19825 -75.014786 39.18457799999999 -75.120331 39.37485899999999 -75.416031 39.49040199999999 -75.553116 39.56645599999999 -75.517044 39.61762200000001 -75.570587 39.71474499999999 -75.489639New Jersey34Mid AtlNJ21208.3681128.5957484736.01962314.02687478.03622220.03862516.02817265.02723918.0451438.0266063.03741297.0218598.0846794.0460013.00.4840.5161052748.037.77618 -88.10145641.76549499999999 -84.78749838.177223 -86.341629 38.19322600000001 -86.364372 38.194743999999986 -86.388329 38.167957 -86.387123 38.155495 -86.343147 38.143963000000014 -86.335442 38.13420500000001 -86.344063 38.12323000000001 -86.3937 38.10815400000001 -86.407204 38.129692000000006 -86.452545 38.12909300000001 -86.464867 38.11164500000001 -86.474358 38.08863400000001 -86.442543 38.075931999999995 -86.44249 38.05909700000001 -86.458389 38.051585999999986 -86.503136 38.046986000000004 -86.519112 38.018631 -86.527855 37.987415 -86.530869 37.942181000000005 -86.516922 37.927811000000005 -86.522758 37.921454999999995 -86.541107 37.925606 -86.581802 37.921013 -86.598328 37.857918 -86.614799 37.845943000000005 -86.645584 37.847324 -86.665939 37.860584 -86.670685 37.902514999999994 -86.660324 37.913139 -86.668671 37.91179700000001 -86.68914 37.894566 -86.728889 37.898303999999996 -86.753838 37.978745 -86.802826 37.991505000000004 -86.826317 37.986866000000006 -86.863281 37.953644 -86.900085 37.937988000000004 -86.93158 37.930565 -86.989037 37.924713 -87.013161 37.907955 -87.036484 37.807086999999996 -87.071312 37.784203000000005 -87.10643 37.789688 -87.131882 37.82692 -87.158081 37.838593 -87.175781 37.84907200000001 -87.226761 37.870773 -87.272743 37.89367300000001 -87.310555 37.93492500000001 -87.387543 37.936477999999994 -87.452278 37.91558499999999 -87.504791 37.971115 -87.604309 37.923412 -87.627121 37.890724000000006 -87.594704 37.864868 -87.59362 37.843777 -87.607574 37.828132999999994 -87.65168 37.836330000000004 -87.6847 37.897007 -87.679703 37.899711999999994 -87.709389 37.894543 -87.72818 37.898087000000004 -87.753761 37.878212000000005 -87.823624 37.890902999999994 -87.857162 37.924553 -87.89901 37.919865 -87.921867 37.904160000000005 -87.934456 37.875179 -87.936821 37.838570000000004 -87.910202 37.809685 -87.920143 37.799507000000006 -87.939583 37.77618 -87.95871 37.801308000000006 -88.011192 37.805683 -88.035576 37.817612 -88.086029 37.831249 -88.089264 37.827522 -88.042137 37.843745999999996 -88.034241 37.867808999999994 -88.075737 37.895306000000005 -88.101456 37.90617 -88.100082 37.896004000000005 -88.044868 37.905758000000006 -88.026588 37.917591 -88.030441 37.92366 -88.084 37.944 -88.078941 37.929783 -88.064621 37.934498000000005 -88.041771 37.956264000000004 -88.042511 37.975055999999995 -88.021706 38.00823600000001 -88.029213 38.03353100000001 -88.021698 38.03830300000001 -88.041473 38.04512 -88.043091 38.054084999999986 -88.034729 38.073307 -87.975296 38.09674799999999 -87.964867 38.09234599999999 -88.012329 38.10330200000001 -88.018547 38.131760000000014 -87.973503 38.13691299999999 -87.950569 38.15752800000001 -87.931992 38.171131 -87.932289 38.200714000000005 -87.977928 38.234814 -87.986008 38.241085 -87.980019 38.30477099999999 -87.925919 38.302345 -87.913651 38.281048 -87.914108 38.300658999999996 -87.888466 38.315552 -87.883446 38.316788 -87.874039 38.28536199999999 -87.863007 38.28609800000001 -87.850082 38.35252399999999 -87.834503 38.378124000000014 -87.784019 38.41796500000001 -87.748428 38.44548 -87.738953 38.45709600000001 -87.758659 38.466125000000005 -87.756096 38.48153300000001 -87.692818 38.50400500000001 -87.679909 38.50044299999999 -87.653534 38.51536899999999 -87.65139 38.54742400000001 -87.672943 38.573871999999994 -87.652855 38.593177999999995 -87.640594 38.599209 -87.619827 38.622917 -87.628647 38.642810999999995 -87.625191 38.672169 -87.588478 38.68597399999999 -87.543892 38.73663300000001 -87.508316 38.769722 -87.508003 38.77669900000001 -87.519028 38.795559 -87.507889 38.857890999999995 -87.550507 38.869811999999996 -87.559059 38.90486100000001 -87.5392 38.93191899999999 -87.530182 38.96370300000001 -87.53347 38.97707700000001 -87.547905 38.99408299999999 -87.591858 38.995743000000004 -87.581749 39.062434999999994 -87.58532 39.08460600000001 -87.612007 39.08897400000001 -87.630867 39.10394299999999 -87.631668 39.11346800000001 -87.662262 39.130652999999995 -87.659454 39.146679000000006 -87.670326 39.168507000000005 -87.644257 39.196068 -87.607925 39.198128 -87.594208 39.20846599999999 -87.588593 39.248752999999994 -87.584564 39.258162999999996 -87.606895 39.281418 -87.615799 39.297661000000005 -87.610619 39.30740399999999 -87.625237 39.338268 -87.597664 39.350525000000005 -87.540215 39.47744800000001 -87.538567 39.609341 -87.535576 39.887302000000005 -87.535774 40.16619499999999 -87.535339 40.48324600000001 -87.535675 40.494609999999994 -87.53717 40.74541099999999 -87.532669 41.00993 -87.532021 41.173756 -87.531731 41.30130399999999 -87.532448 41.46971500000001 -87.532646 41.723591 -87.529861 41.67158900000001 -87.463669 41.676331000000005 -87.419266 41.65807699999999 -87.441933 41.63415499999999 -87.394707 41.62615199999999 -87.233818 41.716465 -86.942429 41.765465000000006 -86.834801 41.76549499999999 -86.525162 41.764815999999996 -86.234558 41.764579999999995 -86.068298 41.763485 -85.799232 41.76257699999999 -85.65947 41.763531 -85.297234 41.76281700000001 -85.193169 41.76182600000001 -84.82605 41.760909999999996 -84.788521 41.69744499999999 -84.790421 41.530440999999996 -84.791412 41.42784900000001 -84.791939 41.28376800000001 -84.791016 41.253082000000006 -84.791626 40.988293 -84.790565 40.937659999999994 -84.791061 40.728813 -84.793098 40.58869200000001 -84.793289 40.353004 -84.794594 40.31945400000001 -84.795425 40.01394300000001 -84.803604 39.91711799999999 -84.80619 39.73325 -84.808739 39.563998999999995 -84.811081 39.51311100000001 -84.81115 39.31227899999999 -84.812073 39.302975 -84.812119 39.10252800000001 -84.811531 39.10363000000001 -84.827911 39.064987 -84.886757 39.050591 -84.890045 39.032837 -84.876343 39.00577200000001 -84.844276 38.98271600000001 -84.834496 38.95457099999999 -84.846367 38.92754400000001 -84.875931 38.909369999999996 -84.875305 38.901981000000006 -84.859795 38.89712900000001 -84.803276 38.884322999999995 -84.788719 38.866581 -84.787498 38.83439999999999 -84.824478 38.793346000000014 -84.818832 38.78057899999999 -84.975662 38.764229 -85.025124 38.750361999999996 -85.068504 38.714077 -85.119705 38.69511399999999 -85.16098 38.69575499999999 -85.205208 38.744316 -85.271439 38.73694599999999 -85.335052 38.738358000000005 -85.418228 38.72478100000001 -85.446732 38.694614 -85.45372 38.584778 -85.424446 38.56141299999999 -85.417503 38.53695300000001 -85.432411 38.518112 -85.466423 38.47135499999999 -85.50724 38.446606 -85.612679 38.383621000000005 -85.643631 38.33768499999999 -85.654266 38.300883999999996 -85.681427 38.27024499999999 -85.746964 38.28232199999999 -85.786247 38.28611000000001 -85.806587 38.27622199999999 -85.839943 38.23849100000001 -85.852371 38.17993200000001 -85.912109 38.06480400000001 -85.914787 38.03397799999999 -85.930908 38.01176799999999 -85.958618 38.001693999999986 -86.006699 37.992878000000005 -86.031654 37.966713 -86.05275 38.01126500000001 -86.105019 38.01768899999999 -86.190651 38.04065299999999 -86.252182 38.05810500000001 -86.277725 38.07842299999999 -86.291466 38.150238 -86.297699 38.177223 -86.341629Indiana18E N CenIN92903.666882.3275544159.01480351.02065355.02688281.02855878.02023242.02040232.0332386.034117.02628695.0160143.0746029.0518252.00.4850.515891110.034.998913 -119.99527741.99674200000001 -114.03659838.411883999999986 -119.151466 38.527195000000006 -119.31783300000001 38.703002999999995 -119.57468399999999 38.92234400000001 -119.888329 38.99419800000001 -119.99423999999999 39.063582999999994 -119.994133 39.106224 -119.99352300000001 39.158806 -119.994507 39.31163799999999 -119.99427800000001 39.443591999999995 -119.99498 39.720702999999986 -119.995132 41.177670000000006 -119.995277 41.989315000000005 -119.992401 41.98895999999999 -119.350655 41.98924299999999 -119.309906 41.99674200000001 -118.184326 41.99490399999999 -117.01790600000001 41.99490399999999 -116.991356 41.994698 -115.946617 41.99659700000001 -115.023979 41.99601000000001 -114.268616 41.995476 -114.038223 40.997761 -114.037308 40.111110999999994 -114.03727 39.90884 -114.039009 39.53874200000001 -114.039276 38.67904300000001 -114.043449 38.571140000000014 -114.044273 38.13769099999999 -114.046463 37.598507 -114.046448 36.996562999999995 -114.043137 36.84187300000001 -114.042915 36.216038 -114.036598 36.193993000000006 -114.044312 36.121105 -114.106979 36.041743999999994 -114.128227 36.017269 -114.205971 36.018345 -114.232674 36.062248 -114.306786 36.087124 -114.303055 36.111453999999995 -114.315292 36.137496999999996 -114.34343 36.151009 -114.379997 36.121071 -114.443138 36.124729 -114.465805 36.155108999999996 -114.529762 36.138355000000004 -114.598122 36.141987 -114.620796 36.105202000000006 -114.711945 36.085983 -114.727333 36.058773 -114.728149 36.036777 -114.716858 35.987667 -114.735397 35.911629000000005 -114.698463 35.880489 -114.660789 35.870975 -114.661652 35.847458 -114.689056 35.764717000000005 -114.681931 35.732609 -114.688011 35.693111 -114.664284 35.656409999999994 -114.667679 35.646595000000005 -114.653259 35.61135899999999 -114.639061 35.584843000000006 -114.652328 35.546645999999996 -114.648987 35.515761999999995 -114.67141 35.450768 -114.644592 35.358383 -114.588783 35.304771 -114.58709 35.220184 -114.558784 35.174347 -114.560242 35.140068 -114.571457 35.132560999999995 -114.581818 35.133906999999994 -114.625641 35.118656 -114.635109 35.076057000000006 -114.594833 35.041861999999995 -114.63298 34.998913 -114.62027 35.795722999999995 -115.625359 36.001259000000005 -115.884918 36.959655999999995 -117.15952300000001 37.457367000000005 -117.837761 37.886745000000005 -118.416466 38.411883999999986 -119.151466Nevada32MtnNV284397.1911971.0491201833.0307400.0466297.0611880.0589953.0475643.0443571.093635.016096.0607437.040083.0222792.067743.00.5090.491159997.036.991749 -114.04646342.002376999999996 -109.04254238.13769099999999 -114.046463 38.571140000000014 -114.044273 38.67904300000001 -114.043449 39.53874200000001 -114.039276 39.90884 -114.039009 40.111110999999994 -114.03727 40.997761 -114.037308 41.995476 -114.038223 42.001228 -112.988754 41.99913000000001 -112.146324 42.002376999999996 -112.099724 42.00023999999999 -111.49382 41.996264999999994 -111.047951 41.57864799999999 -111.050323 41.25847999999999 -111.050911 40.996635 -111.050285 40.99794 -110.062477 40.997646 -110.001457 40.99847399999999 -109.047638 40.665329000000014 -109.045479 40.210544999999996 -109.050591 39.65741 -109.051888 39.51819599999999 -109.052864 39.36098899999999 -109.050751 38.494663 -109.053284 38.24493000000001 -109.055199 38.15294299999999 -109.042801 37.887428 -109.042542 37.630829000000006 -109.044937 36.996643000000006 -109.047821 36.992065 -109.996399 36.991749 -110.451546 37.003929 -110.483398 37.002491000000006 -110.739372 37.001720000000006 -111.355453 36.995506000000006 -112.236511 36.998008999999996 -112.541763 36.99624300000001 -112.899216 36.996562999999995 -114.043137 37.598507 -114.046448 38.13769099999999 -114.046463Utah49MtnUT212815.5467086.1521722850.0410862.0537273.0855759.0867091.0564185.0541226.0111197.016971.0736059.041389.0196289.0102232.00.4970.503304592.032.535725 -124.39147242.00234599999999 -114.12445138.16936899999999 -121.664154 38.066856 -121.781296 38.072990000000004 -121.90169499999999 38.13958400000001 -121.983475 38.071158999999994 -122.23116300000001 38.15950000000001 -122.271919 38.206017 -122.314674 38.19366500000001 -122.337822 38.159392999999994 -122.28427099999999 38.097565 -122.27169 38.161418999999995 -122.397377 38.113888 -122.428116 38.113495 -122.48784599999999 38.15075300000001 -122.527557 38.08553699999999 -122.473457 38.018730000000005 -122.505363 37.983031999999994 -122.440697 37.931843 -122.48893699999999 37.834293 -122.457176 37.822177999999994 -122.514641 37.906994 -122.665298 37.894465999999994 -122.690628 38.00774799999999 -122.821091 38.030697 -122.920074 37.990829000000005 -122.95549 37.994536999999994 -123.00962100000001 38.15334300000001 -122.938164 38.29731000000001 -122.993538 38.294224000000014 -123.047684 38.433685 -123.12043 38.547421000000014 -123.29682199999999 38.75774799999999 -123.52276599999999 38.92486199999999 -123.720772 39.041900999999996 -123.68232 39.34791200000001 -123.812592 39.55199400000001 -123.753525 39.687229 -123.78240199999999 39.82652300000001 -123.836975 39.99871400000001 -124.0065 40.10051300000001 -124.093414 40.25257099999999 -124.34414699999999 40.327698 -124.334946 40.435383 -124.391472 40.978363 -124.108269 41.128986 -124.148521 41.313987999999995 -124.070419 41.45832100000001 -124.05677 41.727355999999986 -124.143021 41.77691999999999 -124.241905 41.84849199999999 -124.206306 41.997814000000005 -124.205246 41.99311399999999 -123.81796299999999 41.99799300000001 -123.512032 42.00234599999999 -123.22094 42.0009 -122.28357700000001 41.99445700000001 -121.440407 41.98778899999999 -120.87082699999999 41.989315000000005 -119.992401 41.177670000000006 -119.995277 39.720702999999986 -119.995132 39.443591999999995 -119.99498 39.31163799999999 -119.99427800000001 39.158806 -119.994507 39.106224 -119.99352300000001 39.063582999999994 -119.994133 38.99419800000001 -119.99423999999999 38.92234400000001 -119.888329 38.703002999999995 -119.57468399999999 38.527195000000006 -119.31783300000001 38.411883999999986 -119.151466 37.886745000000005 -118.416466 37.457367000000005 -117.837761 36.959655999999995 -117.15952300000001 36.001259000000005 -115.884918 35.795722999999995 -115.625359 34.998913 -114.62027 34.99764999999999 -114.631477 34.943607 -114.620209 34.919498000000004 -114.629677 34.87553 -114.626465 34.831856 -114.56942 34.759952999999996 -114.541245 34.74890499999999 -114.524757 34.744750999999994 -114.497009 34.709866000000005 -114.464844 34.610885999999994 -114.421478 34.598952999999995 -114.43351 34.583714 -114.408951 34.536552 -114.376038 34.477074 -114.383072 34.459666999999996 -114.375717 34.454860999999994 -114.331848 34.43574099999999 -114.302078 34.41205600000001 -114.282608 34.40547599999999 -114.257057 34.36519199999999 -114.181297 34.336433 -114.152634 34.314533 -114.133347 34.272605999999996 -114.124451 34.266964 -114.149132 34.186206999999996 -114.234993 34.171215000000004 -114.284584 34.141281000000006 -114.322014 34.102638 -114.409378 34.078316 -114.423241 34.029827 -114.428192 33.965046 -114.517418 33.95239599999999 -114.524841 33.925017999999994 -114.497398 33.86290700000001 -114.520172 33.84194599999999 -114.510933 33.826012000000006 -114.520332 33.771694 -114.503769 33.743179 -114.509499 33.708347 -114.494888 33.68271300000001 -114.535645 33.665482 -114.524475 33.622112 -114.526382 33.580482 -114.539459 33.560047 -114.528633 33.509418 -114.586273 33.486098999999996 -114.597298 33.468571 -114.6203 33.439396 -114.629784 33.41908599999999 -114.644302 33.41103 -114.724144 33.352385999999996 -114.702812 33.305676000000005 -114.734634 33.267982 -114.676903 33.239222999999996 -114.68692 33.22456 -114.67926 33.167213000000004 -114.67733 33.122337 -114.708672 33.095344999999995 -114.710564 33.038883 -114.663162 33.04437299999999 -114.644371 33.03352700000001 -114.633179 33.026962 -114.609138 33.036743 -114.558304 33.027668000000006 -114.519844 32.977749 -114.467606 32.935867 -114.475662 32.845378999999994 -114.460655 32.809867999999994 -114.525436 32.788002000000006 -114.534294 32.771366 -114.529312 32.771187 -114.542404 32.760704000000004 -114.542221 32.760707999999994 -114.560799 32.74889 -114.559967 32.748783 -114.571426 32.737392 -114.571175 32.735839999999996 -114.602737 32.726237999999995 -114.603157 32.741378999999995 -114.693253 32.734966 -114.711906 32.72081 -114.72126 32.61940800000001 -116.10612499999999 32.535725 -117.127235 32.718391 -117.198944 32.602818 -117.119743 32.678878999999995 -117.123665 32.738884 -117.197906 32.680042 -117.247337 32.851173 -117.284454 32.888126 -117.253998 33.111442999999994 -117.327568 33.234055 -117.40927099999999 33.394504999999995 -117.596451 33.747547 -118.10582 33.773906999999994 -118.245712 33.703888000000006 -118.285988 33.738434 -118.40418199999999 33.77543300000001 -118.42804699999999 33.812309 -118.387268 33.882954 -118.411201 34.037243000000004 -118.54093900000001 34.018249999999995 -118.787193 34.04007300000001 -118.93843100000001 34.146336000000005 -119.215393 34.238094000000004 -119.265823 34.374866 -119.482056 34.416439 -119.605331 34.404799999999994 -119.868462 34.46167 -120.010521 34.471912 -120.139183 34.442513000000005 -120.455208 34.521389 -120.508408 34.57235300000001 -120.640289 34.704041000000004 -120.60062400000001 34.75992599999999 -120.630669 34.855637 -120.607155 34.903831 -120.66494 34.972660000000005 -120.643333 35.074841000000006 -120.61576099999999 35.140052999999995 -120.637405 35.209278 -120.86032900000001 35.259429999999995 -120.88258400000001 35.364563000000004 -120.848984 35.427792 -120.874199 35.456608 -120.990929 35.629352999999995 -121.145531 35.663567 -121.269226 35.801067 -121.328041 35.879887 -121.444496 36.181171000000006 -121.688751 36.306979999999996 -121.88121000000001 36.582813 -121.954216 36.640468999999996 -121.91035500000001 36.607754 -121.866318 36.648262 -121.807503 36.819035 -121.76033000000001 36.85037199999999 -121.790649 36.962147 -121.882469 36.947556000000006 -122.06025700000001 37.000918999999996 -122.17236299999999 37.106834000000006 -122.273552 37.239182 -122.413551 37.35247 -122.38816800000001 37.479541999999995 -122.440376 37.522964 -122.504593 37.700321 -122.497124 37.783012 -122.497131 37.808696999999995 -122.399849 37.725291999999996 -122.34539000000001 37.702518 -122.36525 37.609852000000004 -122.358589 37.452602 -122.088234 37.460781 -121.974266 37.497375000000005 -122.091949 37.735271 -122.198654 37.77853399999999 -122.31133299999999 37.89183800000001 -122.306473 37.90942 -122.37041500000001 37.973522 -122.378601 38.01487399999999 -122.294441 38.057232 -121.99955 38.023574999999994 -121.697891 38.08618200000001 -121.65668500000001 38.09421900000001 -121.57582099999999 38.063747000000006 -121.56848099999999 38.06355300000001 -121.54641000000001 38.113879999999995 -121.57177 38.13744399999999 -121.55308500000001 38.09654599999999 -121.65851599999999 38.16936899999999 -121.66415434.075226 -119.866859 34.021339 -119.666962 34.055779 -119.571632 34.034588 -119.522141 34.006493000000006 -119.538422 33.965278999999995 -119.711578 33.968410000000006 -119.84631300000001 34.004665 -119.88810000000001 34.03187200000001 -119.873024 34.059177000000005 -119.926727 34.075226 -119.86685933.92416 -120.16642 34.010887 -120.237579 34.04110300000001 -120.045837 33.94775799999999 -119.962425 33.89481000000001 -120.108215 33.92416 -120.1664233.480793000000006 -118.593864 33.410984 -118.36148800000001 33.334419 -118.29368600000001 33.30746499999999 -118.30313100000001 33.324757000000005 -118.454475 33.41952499999999 -118.48043100000001 33.434456 -118.555519 33.480793000000006 -118.59386432.819157000000004 -118.350052 32.806076000000004 -118.419197 32.892039999999994 -118.51076499999999 33.020988 -118.598602 33.035938 -118.570572 32.987350000000006 -118.540672 32.819157000000004 -118.350052California06PacificCA403970.14320023.3682.9760021E77139394.01.0381206E71.4897627E71.4862394E71.1306576E79982242.02036025.0685797.01.3996309E7996502.03664771.01798201.00.5010.4993792553.038.400429 -84.81211941.986816000000005 -80.52020338.60918000000001 -83.27285 38.59656100000001 -83.290138 38.59624099999999 -83.306625 38.60648699999999 -83.320419 38.631912 -83.330116 38.654922 -83.371513 38.663700000000006 -83.453705 38.69006300000001 -83.50016 38.69603699999999 -83.526642 38.677898 -83.618462 38.664897999999994 -83.633324 38.63578799999999 -83.643272 38.623806 -83.655838 38.62085300000001 -83.678612 38.635479000000004 -83.712906 38.650745 -83.770302 38.693771 -83.790543 38.71180699999999 -83.837608 38.744845999999995 -83.857628 38.757889000000006 -83.912613 38.77757600000001 -83.962234 38.763664000000006 -84.053871 38.765434 -84.088936 38.78842900000001 -84.176819 38.812622000000005 -84.228767 38.87448900000001 -84.235359 38.91741200000001 -84.261589 38.94447299999999 -84.290199 39.01401100000001 -84.313377 39.03774999999999 -84.34584 39.035683000000006 -84.391373 39.04727600000001 -84.4198 39.084663000000006 -84.425743 39.111766999999986 -84.444977 39.107304 -84.492111 39.094134999999994 -84.515358 39.07020600000001 -84.593124 39.07487499999999 -84.622704 39.08956499999999 -84.667542 39.14200600000001 -84.742928 39.106976 -84.789978 39.10252800000001 -84.811531 39.302975 -84.812119 39.31227899999999 -84.812073 39.51311100000001 -84.81115 39.563998999999995 -84.811081 39.73325 -84.808739 39.91711799999999 -84.80619 40.01394300000001 -84.803604 40.31945400000001 -84.795425 40.353004 -84.794594 40.58869200000001 -84.793289 40.728813 -84.793098 40.937659999999994 -84.791061 40.988293 -84.790565 41.253082000000006 -84.791626 41.28376800000001 -84.791016 41.42784900000001 -84.791939 41.530440999999996 -84.791412 41.69744499999999 -84.790421 41.7071 -84.384445 41.707989 -84.359261 41.71594200000001 -83.868698 41.71699100000001 -83.764015 41.725081999999986 -83.482758 41.62604099999999 -83.153824 41.53814299999999 -83.003517 41.537598 -82.795921 41.50736599999999 -82.784798 41.45605900000001 -83.07048 41.429417 -82.909019 41.450474000000014 -82.717041 41.391289 -82.548943 41.43145799999999 -82.341499 41.51526999999999 -82.015739 41.50187700000001 -81.962044 41.49110400000001 -81.738647 41.63166799999999 -81.478424 41.72423900000001 -81.362434 41.85020399999999 -80.999954 41.986816000000005 -80.520798 41.850719 -80.52285 41.495048999999995 -80.524132 41.48923500000001 -80.520203 41.12957 -80.52314 40.897209000000004 -80.521133 40.854107 -80.520515 40.63713799999999 -80.522209 40.615910000000014 -80.574623 40.61999900000001 -80.611755 40.61391800000001 -80.637543 40.58207300000001 -80.667931 40.56821400000001 -80.668823 40.539139000000006 -80.633644 40.50439800000001 -80.625458 40.48047299999999 -80.602036 40.39815899999999 -80.628052 40.38859600000001 -80.629448 40.37320700000001 -80.609451 40.306174999999996 -80.604721 40.276432 -80.614891 40.245609 -80.650314 40.194080000000014 -80.678757 40.16811000000001 -80.701088 40.15401800000001 -80.702263 40.03559100000001 -80.738434 39.98340200000001 -80.739082 39.94694100000001 -80.763252 39.92119199999999 -80.759079 39.913239000000004 -80.768318 39.91976500000001 -80.796211 39.915829 -80.808029 39.90482700000001 -80.812325 39.87227200000001 -80.791039 39.85664700000001 -80.798714 39.83959200000001 -80.826103 39.808926000000014 -80.81929 39.759918 -80.870911 39.73625899999999 -80.856636 39.71875800000001 -80.832481 39.70332300000001 -80.83297 39.680274999999995 -80.863594 39.66233399999999 -80.872925 39.62400400000001 -80.881287 39.60727700000001 -80.912766 39.606865 -80.932785 39.58172999999999 -80.983818 39.54406700000001 -81.032738 39.532589 -81.037552 39.496376 -81.098412 39.46770900000001 -81.117256 39.437725 -81.180733 39.415820999999994 -81.20047 39.40828300000001 -81.225113 39.388397 -81.237785 39.38699700000001 -81.28418 39.35356899999999 -81.338997 39.34561500000001 -81.376076 39.40594899999999 -81.434135 39.410954000000004 -81.448112 39.40678399999999 -81.465164 39.352633999999995 -81.540802 39.332581000000005 -81.557541 39.26584199999999 -81.572838 39.27042 -81.667671 39.26015100000001 -81.689674 39.219944 -81.698051 39.21319199999999 -81.723221 39.17567399999999 -81.759056 39.125797000000006 -81.74485 39.09464299999999 -81.753708 39.077179 -81.786507 39.07693900000001 -81.81971 39.066338 -81.824417 39.044028999999995 -81.813606 39.01675 -81.775826 38.96844899999999 -81.781876 38.93009900000001 -81.762444 38.92348100000001 -81.783371 38.948387 -81.823921 38.93780899999999 -81.841057 38.885628 -81.866943 38.87337099999999 -81.892838 38.884365 -81.91539 38.89466100000001 -81.931992 38.932143999999994 -81.89875 38.98419200000001 -81.927971 38.991096 -81.937874 38.992928000000006 -81.975327 39.01518200000001 -81.999817 39.014061 -82.043022 38.98898700000001 -82.05864 38.97711899999999 -82.085152 38.95201499999999 -82.101341 38.89931899999999 -82.13945 38.838707 -82.146233 38.804539000000005 -82.197853 38.778858000000014 -82.216881 38.71021999999999 -82.184105 38.67781099999999 -82.18911 38.63210699999999 -82.17379 38.59494799999999 -82.18438 38.58475100000001 -82.213791 38.594807 -82.271027 38.57999799999999 -82.2901 38.46514500000001 -82.314369 38.441868 -82.329308 38.42838699999999 -82.39489 38.430308999999994 -82.415016 38.40575000000001 -82.49511 38.400429 -82.547668 38.403819999999996 -82.575539 38.41243700000001 -82.586723 38.472588 -82.613861 38.50206 -82.669876 38.539063 -82.695694 38.552986000000004 -82.742058 38.557209 -82.802475 38.571583000000004 -82.827103 38.60038 -82.853966 38.65231700000001 -82.860138 38.683223999999996 -82.880119 38.718929 -82.873299 38.74269899999999 -82.890419 38.74633800000001 -82.92141 38.719565999999986 -82.972588 38.714436000000006 -83.027046 38.68565000000001 -83.060982 38.66475700000001 -83.111343 38.61926299999999 -83.14325 38.60976400000001 -83.182037 38.62409600000001 -83.24511 38.60918000000001 -83.27285Ohio39E N CenOH105012.0732001.6179980887.02673875.03748665.04816445.05164442.03638837.03581182.0477421.098938.04524383.0324867.01206763.0830481.00.4830.5171727359.045.543251 -124.7314220000000149.00000399999999 -116.9181519999999948.22539499999999 -122.40074899999999 48.228542000000004 -122.461586 48.12867399999999 -122.453156 48.060280000000006 -122.36007699999999 48.13415499999999 -122.513245 48.21064000000001 -122.540802 48.25397100000001 -122.507858 48.24677299999999 -122.403137 48.289897999999994 -122.37705199999999 48.414421000000004 -122.563087 48.413071 -122.665749 48.49450300000001 -122.698128 48.51899700000001 -122.60689500000001 48.458575999999994 -122.52195 48.462368 -122.472557 48.559616000000005 -122.504021 48.59956700000001 -122.428268 48.63874100000001 -122.486519 48.711895 -122.52527599999999 48.75809100000001 -122.51557199999999 48.80318500000001 -122.696114 48.910156 -122.75295299999999 48.95089300000001 -122.821129 48.955974999999995 -122.74265299999999 48.999911999999995 -122.76383200000001 48.99997300000001 -120.855827 49.0 -118.842453 49.00000399999999 -118.19923399999999 48.99999600000001 -117.4375 49.0 -117.030975 48.83815000000001 -117.028046 48.046284000000014 -117.037834 47.971191000000005 -117.036438 47.361541999999986 -117.040779 47.258601999999996 -117.041382 47.11942300000001 -117.039963 46.53671600000001 -117.040932 46.42809700000001 -117.037567 46.388690999999994 -117.04348 46.348816 -117.06319400000001 46.335544999999996 -117.026985 46.30256700000001 -117.00065599999999 46.249427999999995 -116.97174100000001 46.197674000000006 -116.96650700000001 46.165604 -116.928444 46.097397 -116.960655 46.078632 -116.98622900000001 46.065811 -116.956741 45.995299999999986 -116.91815199999999 45.999966 -117.48065199999999 46.00040100000001 -117.60180700000001 46.00001900000001 -117.981628 46.001778 -117.991478 45.999202999999994 -118.981018 45.966419 -119.031105 45.92585399999999 -119.13913 45.92249699999999 -119.17761999999999 45.932807999999994 -119.301636 45.917755 -119.378311 45.914412999999996 -119.43772899999999 45.89934500000001 -119.511086 45.913459999999986 -119.58815799999999 45.89955499999999 -119.620979 45.85268400000001 -119.677307 45.841755000000006 -119.832413 45.83184399999999 -119.86859100000001 45.81128699999999 -119.993172 45.78035 -120.067497 45.76141000000001 -120.154755 45.719933 -120.206291 45.71673200000001 -120.282478 45.68942999999999 -120.442223 45.69578200000001 -120.49799300000001 45.74107000000001 -120.568916 45.743763 -120.622589 45.732765 -120.657234 45.71066300000001 -120.695824 45.665339999999986 -120.86024499999999 45.63563199999999 -120.906761 45.65047100000001 -120.947395 45.645309 -120.9673 45.65299999999999 -121.032303 45.64676700000001 -121.07235 45.607215999999994 -121.124023 45.600674 -121.173134 45.61340000000001 -121.190872 45.657444 -121.20212599999999 45.66580200000001 -121.213089 45.67849699999999 -121.27520799999999 45.696799999999996 -121.318794 45.69984400000001 -121.366631 45.69076200000001 -121.420845 45.69512599999999 -121.441368 45.719727000000006 -121.52787000000001 45.688953 -121.705231 45.689876999999996 -121.757507 45.70084399999999 -121.809853 45.677017000000006 -121.887093 45.642189 -121.925629 45.63593700000001 -121.97146599999999 45.617985000000004 -121.998817 45.590664000000004 -122.08084099999999 45.548271 -122.243721 45.543251 -122.30194900000001 45.566329999999994 -122.355255 45.56493800000001 -122.435951 45.594978 -122.564224 45.606990999999994 -122.650002 45.63120699999999 -122.69511399999999 45.64955900000001 -122.759331 45.727847999999994 -122.771339 45.76073099999999 -122.76307700000001 45.80050700000001 -122.786797 45.85061300000001 -122.78330199999999 45.86805000000001 -122.78286 45.904236 -122.805008 45.944053999999994 -122.80652599999999 46.02734799999999 -122.874199 46.07949400000001 -122.898537 46.110648999999995 -122.97294600000001 46.155902999999995 -123.04937000000001 46.17947799999999 -123.117325 46.18375399999999 -123.174965 46.170174 -123.211205 46.144188000000014 -123.247566 46.144904999999994 -123.303482 46.275192000000004 -123.469528 46.258835000000005 -123.61882800000001 46.285595 -123.724205 46.240612 -123.884514 46.310452 -123.992065 46.267437 -124.077843 46.639927 -124.064232 46.583721 -124.021767 46.383858000000004 -124.01173399999999 46.404517999999996 -123.840187 46.481292999999994 -123.939423 46.511257 -123.892296 46.61740499999999 -123.956436 46.67324099999999 -123.925194 46.718468 -123.839691 46.74516700000001 -123.89426399999999 46.716038 -124.041878 46.729206000000005 -124.089767 46.78965400000001 -124.100784 46.900172999999995 -124.137543 46.90833699999999 -124.104477 46.87433200000001 -124.103455 46.82395199999999 -124.02752699999999 46.88744 -124.045647 46.96414899999999 -123.81137799999999 46.976574 -123.994583 47.03122300000001 -124.033112 47.042866000000004 -124.111076 46.929801999999995 -124.160751 47.167174999999986 -124.19144399999999 47.27526499999999 -124.230133 47.349434 -124.31813 47.527107 -124.347778 47.63896199999999 -124.372299 47.80845600000001 -124.482719 47.873940000000005 -124.605362 48.150204 -124.73142200000001 48.232212000000004 -124.703857 48.37777299999999 -124.71582000000001 48.35748699999999 -124.562202 48.159355000000005 -123.98989900000001 48.11121700000001 -123.395561 48.14891800000001 -123.121933 48.09436400000001 -122.920311 48.066981999999996 -122.923561 48.13332 -122.839828 48.14417599999999 -122.767601 48.08550600000001 -122.80165099999999 47.91734299999999 -122.660294 47.86461600000001 -122.652321 47.80917400000001 -122.744598 47.80273399999999 -122.788528 47.85726199999999 -122.808243 47.827515000000005 -122.857529 47.67270300000001 -122.898094 47.605659 -122.981476 47.456458999999995 -123.11264800000001 47.34873200000001 -123.152794 47.35320999999999 -123.009209 47.438648 -122.831993 47.356235999999996 -123.034943 47.37175400000001 -123.11142000000001 47.516121 -123.02507 47.614791999999994 -122.91570300000001 47.66087300000001 -122.751678 47.75708399999999 -122.721794 47.85019299999999 -122.60990100000001 47.936375 -122.611954 47.90964500000001 -122.530632 47.75516099999999 -122.472343 47.69715099999999 -122.620255 47.571372999999994 -122.58521300000001 47.583687 -122.55401599999999 47.52291500000001 -122.541458 47.507397 -122.50322 47.39854399999999 -122.55720500000001 47.37410700000001 -122.542885 47.33411000000001 -122.587013 47.283512 -122.551918 47.25156799999999 -122.57929200000001 47.293578999999994 -122.61030600000001 47.27075199999999 -122.60567499999999 47.29226700000001 -122.69850199999999 47.39873499999999 -122.62751 47.398762000000005 -122.636192 47.341633 -122.740303 47.26633799999999 -122.768463 47.22331199999999 -122.718559 47.162678 -122.759995 47.23500799999999 -122.82386 47.33754300000001 -122.772087 47.36092400000001 -122.800934 47.29941600000001 -122.87912 47.20816400000001 -123.11417399999999 47.090239999999994 -123.07994099999999 47.100956 -123.03009 47.048145000000005 -122.921898 47.12604099999999 -122.788803 47.08262300000001 -122.726944 47.09850700000001 -122.698837 47.180240999999995 -122.590569 47.28763599999999 -122.529526 47.31645599999999 -122.545349 47.25965099999999 -122.422859 47.277901000000014 -122.391609 47.30130399999999 -122.440369 47.31902299999999 -122.419601 47.34450100000001 -122.324142 47.390293000000014 -122.31850399999999 47.510422000000005 -122.391396 47.59558899999999 -122.38098099999999 47.66435999999999 -122.413574 47.77435700000001 -122.39325 47.95039700000001 -122.30167399999999 47.969296000000014 -122.22887399999999 48.007622 -122.215744 48.128322999999995 -122.367073 48.22539499999999 -122.4007489999999948.443974 -122.96669 48.479603 -123.093941 48.52202199999999 -123.158424 48.56274400000001 -123.16860199999999 48.62382500000001 -123.13975500000001 48.608554999999996 -123.102425 48.55765500000001 -123.01080300000001 48.533896999999996 -123.007408 48.52711099999999 -122.96669 48.51353800000001 -123.020981 48.489783999999986 -123.017593 48.443974 -122.9666948.276825 -122.731903 48.396953999999994 -122.66433 48.40496400000001 -122.603104 48.32122000000001 -122.524475 48.28368800000001 -122.52737400000001 48.296527999999995 -122.622231 48.225594 -122.730751 48.206501 -122.60965 48.077042000000006 -122.544937 48.09425400000001 -122.49494899999999 48.03233 -122.378738 47.964068999999995 -122.354149 47.904731999999996 -122.385712 47.91824 -122.441536 47.987694000000005 -122.47036 47.967715999999996 -122.543701 48.031616000000014 -122.607361 48.181366 -122.694275 48.218998 -122.767494 48.276825 -122.731903Washington53PacificWA172447.20512226.634866692.01264934.01872431.02413747.02452945.01830031.01700872.0282240.0104403.02293961.0139216.0637487.0302635.00.4960.504736744.0 \ No newline at end of file diff --git a/float-no-zero/examples/data/gpx/fells_loop.gpx b/float-no-zero/examples/data/gpx/fells_loop.gpx new file mode 100644 index 0000000000..fdfb0d43ce --- /dev/null +++ b/float-no-zero/examples/data/gpx/fells_loop.gpx @@ -0,0 +1,1077 @@ + + + + + + 44.586548 + + 5066 + + Crossing + + + + 57.607200 + + 5067 + + Dot + + + + 44.826904 + + 5096 + + Dot + + + + 50.594727 + + 5142 + + Dot + + + + 127.711200 + + 5156 + + Dot + + + + 96.926400 + + 5224 + + Dot + + + + 82.600800 + + 5229 + + Dot + + + + 82.905600 + + 5237 + + Dot + + + + 66.696655 + + 5254 + + Dot + + + + 74.627442 + + 5258 + + Dot + + + + 65.254761 + + 5264 + + Dot + + + + 77.419200 + + 526708 + + Dot + + + + 74.676000 + + 526750 + + Dot + + + + 78.713135 + + 527614 + + Dot + + + + 78.713135 + + 527631 + + Dot + + + + 68.275200 + + 5278 + + Dot + + + + 64.008000 + + 5289 + + Dot + + + + 52.997925 + + 5374FIRE + + Dot + + + + 56.388000 + + 5376 + + Dot + + + + 56.388000 + + 6006 + + Dot + + + + 46.028564 + + 6006BLUE + + Dot + + + + 37.616943 + + 6014MEADOW + + Dot + + + + 56.388000 + + 6029 + + Dot + + + + 50.292000 + + 6053 + + Dot + + + + 25.603200 + + 6066 + + Dot + + + + 34.442400 + + 6067 + + Dot + + + + 30.480000 + + 6071 + + Dot + + + + 15.240000 + + 6073 + + Dot + + + + 37.795200 + + 6084 + + Dot + + + + 64.008000 + + 6130 + + Dot + + + + 64.008000 + + 6131 + + Dot + + + + 62.788800 + + 6153 + + Dot + + + + 55.473600 + + 6171 + + Dot + + + + 62.484000 + + 6176 + + Dot + + + + 62.179200 + + 6177 + + Dot + + + + 69.799200 + + 6272 + + Dot + + + + 73.152000 + + 6272 + + Dot + + + + 70.104000 + + 6278 + + Dot + + + + 57.564209 + + 6280 + + Dot + + + + 66.696655 + + 6283 + + Dot + + + + 72.945191 + + 6289 + + Dot + + + + 72.847200 + + 6297 + + Dot + + + + 53.644800 + + 6328 + + Dot + + + + 43.891200 + + 6354 + + Dot + + + + 48.768000 + + 635722 + + Dot + + + + 49.072800 + + 635783 + + Dot + + + + 62.484000 + + 6373 + + Dot + + + + 3.962400 + + 6634 + + Dot + + + + 13.411200 + + 6979 + + Dot + + + + 34.012085 + + 6997 + + Dot + + + + 87.782400 + + BEAR HILL + BEAR HILL TOWER + + Tall Tower + + + + 23.469600 + + BELLEVUE + BELLEVUE + + Parking Area + + + + 43.384766 + + 6016 + + Trailhead + + + + 89.916000 + + 5236BRIDGE + + Bridge + + + + 55.473600 + + 5376BRIDGE + + Bridge + + + + 52.730400 + + 6181CROSS + + Crossing + + + + 45.110400 + + 6042CROSS + + Crossing + + + + DARKHOLLPO + + Fishing Area + + + 56.083200 + + 6121DEAD + + Danger Area + + + + 117.043200 + + 5179DEAD + + Danger Area + + + + 69.494400 + + 5299DEAD + + Danger Area + + + + 56.997600 + + 5376DEAD + + Danger Area + + + + 46.939200 + + 6353DEAD + + Danger Area + + + + 61.264800 + + 6155DEAD + + Danger Area + + + + 110.947200 + + GATE14 + + Truck Stop + + + + 77.724000 + + GATE16 + + Truck Stop + + + + 65.836800 + + GATE17 + + Truck Stop + + + + 57.302400 + + GATE19 + + Truck Stop + + + + 49.377600 + + GATE21 + + Truck Stop + + + + 81.076800 + + GATE24 + + Truck Stop + + + + 21.515015 + + GATE5 + + Truck Stop + + + + 26.561890 + + GATE6 + + Trailhead + + + + 32.004000 + + 6077LOGS + + Amusement Park + + + + 119.809082 + + 5148NANEPA + + Trailhead + + + + 73.761600 + + 5267OBSTAC + + Amusement Park + + + + 45.307495 + + PANTHRCAVE + + Tunnel + + + + 77.992066 + + 5252PURPLE + + Summit + + + + 67.970400 + + 5287WATER + + Swimming Area + + + + 81.076800 + + 5239ROAD + + Truck Stop + + + + 67.360800 + + 5278ROAD + + Truck Stop + + + + 53.949600 + + 5058ROAD + ROAD CROSSING + + Dot + + + + 69.799200 + + SHEEPFOLD + + Parking Area + + + + 64.008000 + + SOAPBOX + + Cemetery + + + + 64.533692 + + 5376STREAM + + Bridge + + + + 61.649902 + + 5144SUMMIT + + Summit + + + + 67.360800 + + 5150TANK + WATER TANK + + Museum + + + + BELLEVUE + + 1 + + 23.469600 + + BELLEVUE + BELLEVUE + + Parking Area + + + + 26.561890 + + GATE6 + + Trailhead + + + + 45.307495 + + PANTHRCAVE + + Tunnel + + + + 37.616943 + + 6014MEADOW + + Dot + + + + 56.388000 + + 6006 + + Dot + + + + 46.028564 + + 6006BLUE + + Dot + + + + 44.826904 + + 5096 + + Dot + + + + 44.586548 + + 5066 + + Crossing + + + + 57.607200 + + 5067 + + Dot + + + + 53.949600 + + 5058ROAD + ROAD CROSSING + + Dot + + + + 67.360800 + + 5150TANK + WATER TANK + + Museum + + + + 50.594727 + + 5142 + + Dot + + + + 61.649902 + + 5144SUMMIT + + Summit + + + + 127.711200 + + 5156 + + Dot + + + + 119.809082 + + 5148NANEPA + + Trailhead + + + + 74.627442 + + 5258 + + Dot + + + + 77.992066 + + 5252PURPLE + + Summit + + + + 78.713135 + + 527631 + + Dot + + + + 78.713135 + + 527614 + + Dot + + + + 73.761600 + + 5267OBSTAC + + Amusement Park + + + + 68.275200 + + 5278 + + Dot + + + + 64.008000 + + 5289 + + Dot + + + + 52.997925 + + 5374FIRE + + Dot + + + + 56.388000 + + 5376 + + Dot + + + + 64.533692 + + 5376STREAM + + Bridge + + + + 53.644800 + + 6328 + + Dot + + + + 48.768000 + + 635722 + + Dot + + + + 49.072800 + + 635783 + + Dot + + + + 62.484000 + + 6373 + + Dot + + + + 87.782400 + + BEAR HILL + BEAR HILL TOWER + + Tall Tower + + + + 72.945191 + + 6289 + + Dot + + + + 72.847200 + + 6297 + + Dot + + + + 66.696655 + + 6283 + + Dot + + + + 57.564209 + + 6280 + + Dot + + + + 62.179200 + + 6177 + + Dot + + + + 62.484000 + + 6176 + + Dot + + + + 62.788800 + + 6153 + + Dot + + + + 55.473600 + + 6171 + + Dot + + + + 64.008000 + + 6131 + + Dot + + + + 64.008000 + + 6130 + + Dot + + + + 56.388000 + + 6029 + + Dot + + + + 56.388000 + + 6006 + + Dot + + + + 37.616943 + + 6014MEADOW + + Dot + + + + 45.307495 + + PANTHRCAVE + + Tunnel + + + + 26.561890 + + GATE6 + + Trailhead + + + + 23.469600 + + BELLEVUE + BELLEVUE + + Parking Area + + + + \ No newline at end of file diff --git a/float-no-zero/examples/data/icon.png b/float-no-zero/examples/data/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ed886623d54cc7972175302fad216a541dd349c3 GIT binary patch literal 2532 zcmVl`s>Ic zA2Um+7X$7oqFa)IzWEUk6VNryGP~1lhNA9aZgG8N(O=v9FJUr%jwG zCn})F6VQ8Ouv7&w%#kw}1V9uay1alSLQlk@wRJ@e4|}3#*~j|}0FdM!W{IbKch}B9 zXBwG{SD@eQf!-E}rCGKlBL_f-ivolS7le=xV#p7{<3pykEoD_mvwK#4dY&(n?8S!l zjCcC@8E8*KX>LXO*j4Cf!?1MIIfyZg)D%{~KhmA$a6eEDHo<~e5%8&3yVlXf;w(ShnY|zl)K3>@JR4i z4^`wfz`XAJxXq170@|5QFqv=>Q%;PpV8ZAfk!#T~V00y6Mluis1kC4>^q4Z0W*Z#< zF4<$o(=fYIw!N8`82jB2Tq5a+l|0);L89u~5RpK3&_tLbgBepHSt1EY=f(_A-UQrE zmZ8H`3|o4^Eji33!2wW&f`KyZf8zsu^WFzauE~=`@s$;ZiCLjc3;h6a49w9qSHCO` z%3P$d+WP!D%&MJ<4_|l(bv4rm2f&?}B7)JG7BO+08ifD^o)0)EdlLp6GJD#+`RBKv zdI{hC%7ga4pf7+OYc`;=B4p3;-#f-mDBLfyyeUac{%0V7>?~=45Yh&Yk_isIyyQpt zGxf`GyIg4LxKgm~diPDrH6nZ-4|e{119q+X9Rfaoe!oq&)T~&#xMkSu`p`c< z_hG!U{{DY zg{Htz0Q#$4uvNKs>8ku}W!V_~vVIk1SSNq|Wb0ZSXg+QO{=tKf;L)#rC%<;Vtoe9y z-eM;u=gcr90NVu2PNCck?eQ>+=(56YDiFj)MW28+1^JmO~qGbxU<>qBdOa=2f=4QWe z91MWt`9eMtxZQZRtE--Z^-sQNuUYYpMfvsIG(m5m)ln7)feK^7^2 zxWDF0`2MVKmCUm9);*157tfTOe|h1`Tbz&$?Szi%9rc~QaRCiYpW|ZqI+ksDmHLvx z#^CUaTk-YU`wHG|KJpPZe!k6qe)H2U1=)}dTLWTW0@0{Ow02&@o^ywhRMUOxSCZKG z@1yu{$K`_U$1a`0KU+`Q&zh-cql)ECTG9thr!nYL6>Y2?KM4;_pJV&M!PT4K=j~N? zyt#J^{&09F#`uD0dA)&By(7zO3s&YewS4YEY&^KlIXssKSSbzU?8BUX&Z7UrsTi(A z+Y$8masQ-y@=W;Pa~xz;=`GMqO{faBmDTn$H(@@jX8r0`0FDMMQxycs#dsBD*vTZwaa38 zjau$=bYfVrlN~L5|7Zi=Kh{vx%X7jkdhcgNn?lZr@w%^55DF%>V*$vbjI^S2joi!w zuzHpATDe(M<}U-Q8HZF`56leZ0#hiew&8ZAwxpU#owWhicrV6;Dv>raFuBbHcBM}P zy53|8=EDLdj*0h7LDag6=(R4pIkCji1K{@wi?r#l45I3*Gog_wd(;?=c;;N<-A1!d z1F~??WXhU^pn~ZP)pgS_d0H)!(Ozho%&7ZOQIg;tLu#)qM~dl)W_n=sCdnlFXN68E zi-!y)nUFmGKu>oRy@_7i^FtHL5uipx7)4ji)lc#xp{LOv>wwD0=OhbSSDXv{j{*RZ z?`=4h2`h&7fy=boWHi9qk^y4`hpxorqk-#x2?rVO)=0W*+Itz+&WPTXdFQ zA$Z*|Qskuyd9G?ugzBSXPH`^~bCbGZ9(p_wjb4S$R=1}9*kle!M3F~#9n!<`QwVsu zNgU$nxhL~b;uqABkZIZ#(5`LNmRlsMel?P2UTI^=T40LiT9ak?&4twFw9$iIOa_yl zM7Se9(9Hpl@4Kfh!O&NV7uNZ9b5PtIP!NRvh)Mc$wIb#mj$jv>o& z^ofSUT377PRQl+KD?3u;v@jg$?W>sJXpaQoZmyp1Xkk8SU5U>KMMk-6m7b1;QRbL} z4aXGyRiBldlX@*|nrUria>I$tumMDu?C#VR^*K|d%c@_p56YQ>6*C26`7&;+o`WXo z&5Q!=QujN__f8)gmF(X-;??OHhU0XZg^Pj(KqK?p_t!PX83N(skKI+XP?%^hdq zkzX6)OU@u;jORHu7Ht-|DLj&MxSTUZUjv)7yOZ&VJPc|}XNp3vp299OY5>v4cPA)> zmgssSCIoXJ`uu@qZ&H2Cx%3oroiR&mk3Y@EdYgywEo%tJ4tX!=smyYdX_jpcx0p>X z*$)_8BRo<(^xi`urzlYW)A1Xj+`V0#REFCJz;pRH-`_Lgo>zES*&w{62_B+3;yywE zOiM?msqJs@%P$Gl0SHz8+XrA@Sc#!n<$o*F(e-=FOMuEKNd;sG0XLBgpm&yNLOFfo zxFxcBu_|D2>G`_b2awBb#E4Ds|5Upf-ez(Q1nK{v3=j}YwwX6uy0J)@=ue4v67vd= z6EQ;!sd!H53$f6FrHFj{FT5?5d72UL3_k0BevVh3T)9}_v7SdI0uJ1OxQvaj5 zCZZM&fJh|}X#!u+B@IghC0a~QbQ?jNrReVTrZd~JCgksVtn)$>>9=-R-*#CsRIGTu um$D>g8M7h)`DH`Tl67m3SZw@XfB^usYL{3O78I=j0000 + + Skimap.org OpenSkiMap + Created from OpenStreetMap data. Renderer v0.5 + + + Copyright Notice + + OpenStreetMap Contributors. It is available under the Creative Commons Attribution-ShareAlike (CC-BY-SA) Version 2.0 License.]]> + + Copyright (c) OpenStreetMap Contributors. CC-BY-SA 2.0 License. + + OSMCopyright.png + + + + + + + POI + Points of Interest + + Parking + + + #style-Parking + + 7.5584046,46.4880564,0 + + + + Coop + #style-Parking + + 7.5609149,46.493261,0 + + + + #style-Parking + + 7.5865419,46.4861414,0 + + + + #style-Parking + + 7.4447639,46.4572778,0 + + + + #style-Parking + + 7.4450385,46.4601225,0 + + + + #style-Parking + + 7.4393367,46.45965,0 + + + + #style-Parking + + 7.4413296,46.4571887,0 + + + + #style-Parking + + 7.440856,46.4512387,0 + + + + #style-Parking + + 7.4379632,46.452765,0 + + + + #style-Parking + + 7.4439042,46.4554444,0 + + + + #style-Parking + + 7.4442161,46.4540646,0 + + + + #style-Parking + + 7.4701427,46.4536698,0 + + + + #style-Parking + + 7.5806365,46.5135164,0 + + + + #style-Parking + + 7.6038938,46.5174355,0 + + + + #style-Parking + + 7.6033249,46.5169628,0 + + + + #style-Parking + + 7.6062434,46.5290881,0 + + + + + Fuel + + + Garage Inniger + #style-Fuel + + 7.5660783,46.4900069,0 + + + + #style-Fuel + + 7.5926292,46.5284662,0 + + + + #style-Fuel + + 7.442845,46.458965,0 + + + + + Cinema + + + Ciné Rex + #style-Cinema + + 7.5630412,46.4929077,0 + + + + + Hotel + + + Hotel Crea + #style-Hotel + + 7.5676532,46.4982767,0 + + + + Hotel Hari + #style-Hotel + + 7.5650953,46.4963004,0 + + + + Bellevue + #style-Hotel + + 7.5563578,46.4921191,0 + + + + Kreuz + #style-Hotel + + 7.4409986,46.4570553,0 + + + + Krone + #style-Hotel + + 7.4426496,46.4567252,0 + + + + Wildstrubel + #style-Hotel + + 7.4430785,46.4574807,0 + + + + Hotel des Alpes + #style-Hotel + + 7.5387572,46.4794195,0 + + + + Viktoria Eden + #style-Hotel + + 7.5600327,46.4933357,0 + + + + Berghaus Bärtschi + #style-Hotel + + 7.5632096,46.4454517,0 + + + + Tenne + #style-Hotel + + 7.4461369,46.4589363,0 + + + + Parkhotel Bellevue + #style-Hotel + + 7.4398359,46.455012,0 + + + + Simmenhof + #style-Hotel + + 7.4346619,46.4729836,0 + + + + Iffigenalp + #style-Hotel + + 7.4415194,46.4002088,0 + + + + Reka Feriendorf + #style-Hotel + + 7.4317292,46.4681013,0 + + + + Bären + #style-Hotel + + 7.5583384,46.4923431,0 + + + + Spillgerten + #style-Hotel + + 7.4824764,46.5681752,0 + + + + Hotel Steinmattli + #style-Hotel + + 7.555973,46.4892051,0 + + + + Alpina + #style-Hotel + + 7.5670248,46.4845444,0 + + + + + Restaurant + + + Sillerenbühl + #style-Restaurant + + 7.5177184,46.4713607,0 + + + + Berghaus Stoss + #style-Restaurant + + 7.4294222,46.4403995,0 + + + + Geilsbrüggli + #style-Restaurant + + 7.5134309,46.4571755,0 + + + + #style-Restaurant + + 7.4954338,46.4528516,0 + + + + Standhütte + #style-Restaurant + + 7.4947421,46.443782,0 + + + + #style-Restaurant + + 7.56919,46.4384245,0 + + + + Wallegstübli + #style-Restaurant + + 7.4251977,46.4550003,0 + + + + Betelberghütte + #style-Restaurant + + 7.4209174,46.4353096,0 + + + + Chüejer Stuba + #style-Restaurant + + 7.5083945,46.4586075,0 + + + + Hotel des Alpes + #style-Restaurant + + 7.5387572,46.4794195,0 + + + + Berghaus Tschentenalp + #style-Restaurant + + 7.5457297,46.4987315,0 + + + + Stierenberg + #style-Restaurant + + 7.4394912,46.5665216,0 + + + + #style-Restaurant + + 7.4761515,46.4266593,0 + + + + Tenne + #style-Restaurant + + 7.4461369,46.4589363,0 + + + + Andy&apos;s Pub, Terrasse + #style-Restaurant + + 7.4436412,46.4558537,0 + + + + Pizzeria Roberto + #style-Restaurant + + 7.4426305,46.457097,0 + + + + Krone + #style-Restaurant + + 7.4427032,46.4566172,0 + + + + Anker + #style-Restaurant + + 7.442741,46.4572569,0 + + + + Pizzeria Antica Posta + #style-Restaurant + + 7.4418719,46.457229,0 + + + + Rohrbach + #style-Restaurant + + 7.6024672,46.5500964,0 + + + + Bunderalp Berghaus + #style-Restaurant + + 7.6011565,46.4904257,0 + + + + Hohliebestübli + #style-Restaurant + + 7.5737679,46.48547,0 + + + + Restaurant Siebenbrunnen + #style-Restaurant + + 7.4901423,46.4168265,0 + + + + Berghölzli + #style-Restaurant + + 7.4229564,46.4967046,0 + + + + Gasthaus Elsigbach + #style-Restaurant + + 7.606331,46.5289162,0 + + + + Wildstrubel + #style-Restaurant + + 7.5599318,46.4813358,0 + + + + Kuspo + #style-Restaurant + + 7.4527733,46.4494679,0 + + + + Bühlberg + #style-Restaurant + + 7.469499,46.4536402,0 + + + + #style-Restaurant + + 7.5124053,46.4727902,0 + + + + Berghaus Höchst + #style-Restaurant + + 7.6035985,46.516601,0 + + + + #style-Restaurant + + 7.5059586,46.4504356,0 + + + + + Hospital + + + + Toilet + + + + + Ski_Runs + + Ski_Run_Downhill + + Ski_Run_Downhill_Easy + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.429755,46.4386039,0 7.4293368,46.4393223,0 7.429232,46.4404117,0 7.4293996,46.441124,0 7.4300282,46.4415011,0 7.4296801,46.4435027,0 7.4304432,46.4436726,0 7.4309129,46.4436944,0 7.4311473,46.4436377,0 + + + + 25 + 25, Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4878089,46.443423,0 7.4877097,46.4433227,0 7.4862994,46.4433438,0 7.4839067,46.4431223,0 7.482119,46.4430627,0 7.4773624,46.442722,0 7.4739186,46.4425618,0 7.4726715,46.4431339,0 7.4712165,46.4431469,0 + + + + 21 + 21, Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4979152,46.4417323,0 7.4975394,46.4421891,0 7.4973136,46.4422123,0 7.4966307,46.4419276,0 7.4956492,46.4412029,0 7.4950704,46.4411561,0 7.4935875,46.4409666,0 7.4916014,46.4405342,0 7.4899677,46.4413831,0 7.4890906,46.4415271,0 7.4877254,46.4414311,0 7.4850666,46.4418636,0 7.482119,46.4430627,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4862994,46.4433438,0 7.4862235,46.4429825,0 7.486705,46.4424627,0 7.4890906,46.4415271,0 7.4895612,46.4412262,0 7.489583,46.4406462,0 7.4890687,46.4396996,0 7.4889051,46.4389092,0 7.488508,46.4385783,0 + + + + 29 + 29, Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4951921,46.4444865,0 7.4948475,46.4446679,0 7.4910249,46.4455562,0 7.490986,46.4460492,0 7.4907888,46.4463504,0 7.4907043,46.4468387,0 7.4909002,46.4469646,0 7.4931591,46.4473935,0 7.4934449,46.4474943,0 7.4935055,46.4476487,0 7.4918349,46.4503992,0 7.4914431,46.450472,0 7.4913811,46.4506976,0 + + + + 27 + 27, Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4753104,46.4467318,0 7.4742803,46.4466354,0 7.4734687,46.4464045,0 7.4728137,46.4460338,0 7.4722901,46.4454816,0 7.4719258,46.4449058,0 7.4712165,46.4431469,0 7.4702165,46.4426691,0 7.469432,46.4425057,0 7.4683009,46.4424017,0 7.4681436,46.4424662,0 7.4682319,46.4426424,0 + + + + 34 + 34, Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4914805,46.4507107,0 7.4913811,46.4506976,0 7.4891761,46.4507056,0 7.4885692,46.4500736,0 7.4861844,46.4492757,0 7.4861011,46.4492478,0 7.484473,46.448703,0 7.4838871,46.4485069,0 7.4832597,46.4477197,0 7.4815483,46.4467728,0 7.4810792,46.4465722,0 7.4804303,46.4464648,0 7.4794506,46.4464069,0 7.4786449,46.4466018,0 7.4778745,46.4467856,0 7.4773741,46.4467058,0 7.4766312,46.4464834,0 7.4753104,46.4467318,0 7.4751279,46.4473859,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5183847,46.4722004,0 7.517934,46.471763,0 7.517821,46.4717479,0 7.5175412,46.4714731,0 7.5159991,46.4705791,0 7.5149527,46.4698298,0 7.5145904,46.4695704,0 7.514402,46.4689378,0 7.5134881,46.4678641,0 7.5128847,46.4677487,0 7.5125031,46.4673228,0 7.5119884,46.4670388,0 7.5118409,46.4666988,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4977486,46.4514628,0 7.497407,46.4524101,0 7.4968324,46.4531477,0 7.4968557,46.453831,0 7.4979505,46.4552131,0 7.5010796,46.4572863,0 7.5044316,46.4577113,0 7.5048258,46.4577613,0 7.5065939,46.4574074,0 7.5087808,46.4574575,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.49497,46.4533356,0 7.494742,46.4530283,0 7.4942068,46.4527205,0 7.4938455,46.451717,0 7.4928553,46.4509811,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4981254,46.4509924,0 7.4981368,46.4511522,0 7.4977486,46.4514628,0 7.4950854,46.451349,0 7.4928553,46.4509811,0 7.4914805,46.4507107,0 7.4915714,46.4504852,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4981254,46.4509924,0 7.4981445,46.4508305,0 7.4953246,46.4501477,0 7.4939146,46.450458,0 7.4928553,46.4509811,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5065878,46.4609089,0 7.5067588,46.4608409,0 7.5083597,46.4611852,0 7.5098203,46.4621242,0 7.5110321,46.4621081,0 7.5117865,46.462373,0 7.5122119,46.4631514,0 7.5129021,46.4633842,0 7.5135922,46.4634885,0 7.5141059,46.4636811,0 7.5149084,46.4637212,0 7.5157912,46.4643071,0 7.5168907,46.4644435,0 7.5179821,46.4643312,0 7.5187686,46.4646121,0 7.5204138,46.4662252,0 7.5208392,46.4662332,0 7.521409,46.4661208,0 7.5222597,46.4662894,0 7.5230542,46.4669796,0 7.523608,46.4678463,0 7.5241429,46.4682155,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5326801,46.4684788,0 7.532755,46.468548,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5316173,46.4680148,0 7.5324807,46.4685101,0 7.5326801,46.4684788,0 7.5328962,46.4684417,0 7.5329356,46.4685522,0 7.5327143,46.4686321,0 7.532755,46.468548,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4931915,46.4549659,0 7.4929375,46.454661,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4925723,46.455196,0 7.492699,46.454997,0 7.4929375,46.454661,0 7.4942068,46.4527205,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.492699,46.454997,0 7.4910376,46.4540056,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5132264,46.4562522,0 7.5130985,46.4572035,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4851581,46.4533824,0 7.4845569,46.4536013,0 7.4839198,46.4538334,0 7.482829,46.4540915,0 7.4815336,46.4540876,0 7.4800837,46.4537836,0 7.4779806,46.4533427,0 7.4772153,46.4531822,0 7.4764495,46.4530216,0 7.4753254,46.4534852,0 7.474042,46.4536903,0 7.4726118,46.4532512,0 7.472292,46.4528248,0 7.4722433,46.4525611,0 7.4719968,46.4512258,0 7.4713736,46.45107,0 7.4709826,46.4512884,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4910376,46.4540056,0 7.490236,46.4537956,0 7.4895041,46.4536038,0 7.4851581,46.4533824,0 7.4822321,46.4520159,0 7.4770883,46.4509952,0 7.4722247,46.4508951,0 7.4717194,46.4509989,0 7.4713736,46.45107,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4951921,46.4444865,0 7.4952107,46.4438631,0 7.4956323,46.4435254,0 7.495863,46.4431325,0 7.4958466,46.442669,0 7.4956544,46.4421238,0 7.4950704,46.4411561,0 7.4949338,46.4409187,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5749906,46.4438887,0 7.5747715,46.4435867,0 7.5745699,46.4428739,0 7.5733777,46.441992,0 7.572843,46.4418712,0 7.5718612,46.4418531,0 7.5706985,46.4416291,0 7.5686003,46.4406872,0 7.568574,46.4409349,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5747715,46.4435867,0 7.574491,46.4435383,0 7.5730797,46.442439,0 7.5710547,46.4418652,0 7.5706985,46.4416291,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5687446,46.4376384,0 7.5689165,46.4376761,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5796203,46.43089,0 7.5799907,46.430675,0 7.5796593,46.4304735,0 7.578977,46.4304601,0 7.5783532,46.4302854,0 7.5755031,46.4292776,0 7.5748052,46.4286596,0 7.5743958,46.4286596,0 7.5737135,46.4284983,0 7.5734796,46.4281759,0 7.5725634,46.4274234,0 7.5717446,46.4273025,0 7.5712377,46.4269128,0 7.5701071,46.4264963,0 7.5693858,46.4272756,0 7.568684,46.4286999,0 7.5675338,46.4293717,0 7.5661994,46.4295295,0 7.5655793,46.4299569,0 7.5652203,46.4312391,0 7.5641106,46.4323413,0 7.5639801,46.433466,0 7.5648939,46.434973,0 7.5668522,46.4368849,0 7.5682133,46.437843,0 7.5685649,46.4378322,0 7.5687446,46.4376384,0 7.5688149,46.4375738,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5686003,46.4406872,0 7.5679939,46.4406328,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5065878,46.4609089,0 7.5056954,46.4603339,0 7.5058002,46.4601367,0 7.5057016,46.4599519,0 7.5066207,46.4591145,0 7.5076954,46.4577884,0 7.5087808,46.4574575,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5118409,46.4666988,0 7.5115891,46.4663378,0 7.5114205,46.4658587,0 7.510968,46.4655037,0 7.5107994,46.4648471,0 7.5087141,46.4627352,0 7.5081285,46.461697,0 7.5065878,46.4609089,0 + + + + Kuonisbergliweg + Kuonisbergliweg, Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5508319,46.4815667,0 7.550886,46.481604,0 7.551017,46.481662,0 7.5517182,46.4815741,0 7.551993,46.481463,0 7.552258,46.481249,0 7.552478,46.481152,0 7.5528719,46.4810715,0 7.552972,46.481051,0 7.553187,46.480938,0 7.553375,46.480816,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5087808,46.4574575,0 7.5087624,46.4574732,0 7.5107571,46.4570949,0 7.512456,46.4571319,0 7.5130985,46.4572035,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4845569,46.4536013,0 7.4839705,46.4533006,0 7.4836023,46.4532825,0 7.4830277,46.4536666,0 7.4828207,46.453771,0 7.4826873,46.4537037,0 7.4825462,46.4531781,0 7.4822413,46.4531495,0 7.4808929,46.4536839,0 7.4800837,46.4537836,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.471843,46.4529933,0 7.4722433,46.4525611,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4781023,46.4524789,0 7.4772153,46.4531822,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.553375,46.480816,0 7.5536347,46.4807515,0 7.5541829,46.4807074,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4726118,46.4532512,0 7.4711386,46.4537235,0 7.4702555,46.4537971,0 7.4698184,46.4537065,0 7.4705402,46.4532965,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4966949,46.4456829,0 7.4987868,46.4474642,0 7.4990254,46.4485493,0 7.4986786,46.4497374,0 7.4981254,46.4509924,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4851581,46.4533824,0 7.4819071,46.4527893,0 7.4795821,46.4527576,0 7.4781023,46.4524789,0 7.4750189,46.4518982,0 7.4730834,46.4513691,0 7.4719968,46.4512258,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4779806,46.4533427,0 7.4774841,46.453759,0 7.4769609,46.4539583,0 7.4764209,46.4537428,0 7.4760416,46.4536833,0 7.475667,46.4538882,0 7.4750873,46.4539986,0 7.474042,46.4536903,0 + + + + , Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.5541829,46.4807074,0 7.5541599,46.4812366,0 7.5544557,46.4816299,0 7.555156,46.4817335,0 7.5553097,46.4822055,0 7.5554386,46.4823711,0 7.5559054,46.4825407,0 7.5568671,46.4822132,0 7.5569895,46.4818235,0 + + + + 2 + 2, Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4314691,46.4551589,0 7.4322178,46.4554411,0 7.4328404,46.4555345,0 7.4337122,46.4559081,0 7.4347085,46.4560638,0 7.4353574,46.456162,0 7.4358604,46.4560015,0 7.4367179,46.4557467,0 7.4372508,46.4549744,0 7.4376135,46.4546647,0 7.4373964,46.4539233,0 7.4375265,46.4532365,0 7.4372187,46.4531533,0 + + + + 33 + 33, Downhill Run Difficulty: Easy + #style-Ski_Run_Downhill_Easy + + relativeToGround + 7.4861011,46.4492478,0 7.4844268,46.4491036,0 7.4832187,46.4488441,0 7.4823814,46.4481279,0 7.4814712,46.4478087,0 7.4801554,46.4478027,0 7.4781901,46.4484089,0 7.4742765,46.4489608,0 7.4741321,46.4490468,0 7.473553,46.4493747,0 7.4717194,46.4509989,0 + + + + + Ski_Run_Downhill_Intermediate + + + 10 + 10, Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4144876,46.4472294,0 7.4149494,46.4475565,0 7.4152025,46.4477358,0 7.4154562,46.4478744,0 7.4167849,46.4483173,0 7.4184458,46.4500257,0 7.4214671,46.4526673,0 7.4235868,46.4533633,0 7.4242828,46.4539644,0 7.4253268,46.4544231,0 7.4260386,46.4555146,0 7.4271775,46.4562739,0 7.4277562,46.456385,0 7.4290744,46.4572198,0 7.4301992,46.4575186,0 7.4306302,46.4578101,0 7.4308495,46.4581425,0 7.4308935,46.458415,0 7.4307004,46.4584832,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.409078,46.428856,0 7.4088684,46.4289664,0 7.4097542,46.4296455,0 7.410372,46.429866,0 7.411328,46.4299305,0 7.4122236,46.4299962,0 7.4128546,46.4302951,0 7.4136666,46.4313138,0 7.4162843,46.432802,0 7.4231145,46.4368711,0 7.4240783,46.4371015,0 7.424352,46.4373373,0 7.4244344,46.4376043,0 7.4240992,46.4384424,0 7.4241315,46.4385919,0 7.4242878,46.4386938,0 7.4245455,46.4386572,0 7.4257962,46.4380443,0 7.4269373,46.437921,0 7.4275298,46.4379127,0 7.4279308,46.4380355,0 7.4281223,46.438196,0 7.4281845,46.4387147,0 7.4285697,46.4391626,0 7.4287027,46.4394043,0 7.4286423,46.4398709,0 7.4286906,46.4401292,0 7.4289808,46.4403209,0 7.429232,46.4404117,0 7.429151,46.440554,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4948475,46.4446679,0 7.4937003,46.444504,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4877097,46.4433227,0 7.4872195,46.4435325,0 7.4865607,46.4435325,0 7.4841571,46.443395,0 7.4823979,46.4436194,0 7.4816834,46.4439676,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4841571,46.443395,0 7.4839067,46.4431223,0 + + + + 42 + 42, Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.507632,46.44102,0 7.5076886,46.4408745,0 7.5079708,46.4410277,0 7.5086923,46.4410277,0 7.5091432,46.4420156,0 7.5088441,46.4425016,0 7.5066391,46.4435205,0 7.5059548,46.4445545,0 7.5060916,46.4454973,0 7.5055594,46.4485083,0 7.5066087,46.4500898,0 7.5079037,46.4503452,0 7.508768,46.4505156,0 7.5108818,46.4516561,0 7.5119614,46.4529182,0 7.5130411,46.4538915,0 7.5136795,46.4546008,0 7.5135329,46.455249,0 7.5134633,46.4557785,0 7.5132264,46.4562522,0 7.5133239,46.456517,0 7.5135374,46.456532,0 7.5134775,46.4563718,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.494809,46.462495,0 7.4945658,46.4625743,0 7.4944643,46.4625499,0 7.4944832,46.4624806,0 7.4939029,46.4614558,0 7.491698,46.459654,0 7.4913687,46.4586774,0 7.4918389,46.45772,0 7.4931915,46.4549659,0 7.49497,46.4533356,0 + + + + 55 + 55, Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4944832,46.4624806,0 7.4946897,46.4623555,0 7.4948693,46.462373,0 7.4953055,46.4625448,0 7.4966403,46.4646571,0 7.4987475,46.4646495,0 7.5003928,46.4650414,0 7.5015139,46.4653964,0 7.5032905,46.4674926,0 7.5062062,46.4683885,0 7.5078412,46.4692527,0 7.5081555,46.4737303,0 7.5098447,46.4750362,0 7.5119216,46.4781195,0 7.511841,46.4787868,0 7.5153242,46.4822775,0 7.5197463,46.483668,0 7.5198736,46.4840895,0 7.5194921,46.4842678,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.6214035,46.5184624,0 7.6206061,46.5185013,0 7.6200227,46.5186374,0 7.619556,46.5189097,0 7.6191476,46.5193181,0 7.6182141,46.5193375,0 7.6178835,46.5192792,0 7.6178641,46.5181707,0 7.6177474,46.5177623,0 7.6176307,46.5175484,0 7.6168139,46.5171789,0 7.6164833,46.5166538,0 7.616036,46.5164399,0 7.6147525,46.5162065,0 7.6136877,46.5157618,0 7.6125232,46.5155388,0 7.6076942,46.5164486,0 7.6060633,46.5169747,0 7.605432,46.5170536,0 7.6044409,46.516792,0 7.6038575,46.516854,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.6222677,46.5125575,0 7.6219536,46.5125696,0 7.6204665,46.5130361,0 7.6200208,46.5128293,0 7.6186894,46.5128372,0 7.6177891,46.5125865,0 7.6155716,46.5135034,0 7.6147737,46.5140404,0 7.6139445,46.5144307,0 7.6130136,46.5146209,0 7.6108572,46.5152546,0 7.6087275,46.5157391,0 7.608396,46.5153693,0 7.6079624,46.5152801,0 7.6056234,46.515944,0 7.6038575,46.516854,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.6255371,46.5095259,0 7.6255618,46.5090433,0 7.6249926,46.5088453,0 7.6244357,46.5089072,0 7.6237799,46.5088329,0 7.6231982,46.5089814,0 7.622926,46.5089319,0 7.6216266,46.5090062,0 7.6211935,46.5088824,0 7.621144,46.5086349,0 7.6213173,46.5083751,0 7.6212554,46.5081771,0 7.6209552,46.5080301,0 7.6206413,46.5079572,0 7.6201032,46.5079796,0 7.619909,46.5078859,0 7.6192046,46.507952,0 7.6186945,46.5082071,0 7.618242,46.5086102,0 7.6170479,46.5090519,0 7.6134008,46.5099145,0 7.6119518,46.5104353,0 7.6115669,46.5107069,0 7.6102018,46.5110563,0 7.6098364,46.5112294,0 7.6103941,46.5118447,0 7.6116247,46.512287,0 7.6117594,46.5127485,0 7.6116055,46.5130946,0 7.6111248,46.5135561,0 7.6102983,46.513823,0 7.6087831,46.5148332,0 7.6079624,46.5152801,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.6223085,46.5128439,0 7.6220228,46.5131772,0 7.621511,46.5141056,0 7.6214266,46.5149416,0 7.6207744,46.5165722,0 7.620101,46.517142,0 7.6197686,46.517605,0 7.6197092,46.5182816,0 7.621015,46.5182816,0 7.621478,46.5181985,0 7.6224277,46.5178305,0 7.6240841,46.5179513,0 7.6247575,46.5179513,0 7.6255728,46.5178449,0 7.6264944,46.5187665,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4304432,46.4436726,0 7.4305366,46.443984,0 7.4310658,46.4445755,0 7.4306634,46.4459898,0 7.4299914,46.4465483,0 7.4303109,46.4472287,0 7.4299762,46.4484049,0 7.4302564,46.4493078,0 7.4315017,46.4511447,0 7.4317586,46.452333,0 7.4318155,46.4525963,0 7.4324157,46.4535271,0 7.432081,46.4536883,0 7.4310303,46.4533336,0 7.4311741,46.453932,0 7.4314691,46.4551589,0 + + + + Tschuggen + Tschuggen, Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4124787,46.433968,0 7.4140186,46.4327481,0 7.4162843,46.432802,0 7.4176098,46.434637,0 7.4180369,46.4362139,0 7.4170285,46.4381829,0 7.416902,46.4392336,0 7.4160927,46.4416618,0 7.4163856,46.4433081,0 7.4158679,46.4447115,0 7.4172976,46.4466046,0 7.4210461,46.449263,0 7.4230297,46.4499123,0 7.4246353,46.4516699,0 7.4266629,46.4522852,0 7.4293861,46.4546281,0 7.4314691,46.4551589,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5241429,46.4682155,0 7.5254618,46.4675494,0 7.5271632,46.4670117,0 7.5281584,46.4670197,0 7.5307345,46.4680148,0 7.5316173,46.4680148,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4913687,46.4586774,0 7.4912344,46.4582615,0 7.4921282,46.4561049,0 7.4910376,46.4540056,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4979152,46.4417323,0 7.4956492,46.4412029,0 7.4949338,46.4409187,0 7.4918344,46.4396017,0 7.488508,46.4385783,0 7.4862388,46.4377746,0 7.4860119,46.4374343,0 7.4861862,46.4374136,0 7.4864068,46.4375038,0 + + + + 26 + 26, Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4951921,46.4444865,0 7.494774,46.444374,0 7.4937003,46.444504,0 7.4906334,46.4443422,0 7.4888241,46.4444869,0 7.4871181,46.4440733,0 7.4863944,46.4442402,0 7.4830048,46.443886,0 7.4816834,46.4439676,0 7.4795401,46.4450123,0 7.4783043,46.4457271,0 7.4766312,46.4464834,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.488878,46.370053,0 7.4894455,46.3702172,0 7.4899918,46.3703752,0 7.4913225,46.3705818,0 7.4927658,46.3712292,0 7.4942814,46.3711794,0 7.4954185,46.370487,0 7.4959412,46.3696855,0 7.4968794,46.3691378,0 7.4980271,46.3691169,0 7.4985995,46.3690143,0 7.4991844,46.3686383,0 7.4992309,46.3684758,0 7.4987031,46.368402,0 7.4977817,46.3683076,0 7.4988279,46.3674945,0 7.4990444,46.3655523,0 7.4983227,46.3649547,0 7.4983115,46.3639782,0 7.4985155,46.3636965,0 7.4981554,46.3629178,0 7.4983227,46.3625145,0 7.4992609,46.3612196,0 7.5004156,46.3600741,0 7.5016225,46.3579494,0 7.5019726,46.3576574,0 7.5020488,46.357115,0 7.5018589,46.3561892,0 7.502039,46.3546121,0 7.5014259,46.3535992,0 7.5030858,46.3539977,0 7.5049621,46.353898,0 7.5024363,46.350461,0 7.5032301,46.3474473,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4899918,46.3703752,0 7.4900977,46.3710331,0 7.4897799,46.3720807,0 7.4893209,46.3741029,0 7.4888265,46.3742978,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5798737,46.4320992,0 7.5797957,46.4311319,0 7.5796203,46.43089,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5798737,46.4320992,0 7.5798711,46.4325194,0 7.5799962,46.432821,0 7.5804649,46.4331279,0 7.5815978,46.4342533,0 7.5818635,46.434668,0 7.5818869,46.4349533,0 7.5808556,46.4367572,0 7.5800508,46.4371395,0 7.5785547,46.437191,0 7.576949,46.4381409,0 7.576699,46.4385663,0 7.5763943,46.4385663,0 7.5759959,46.4382224,0 7.57373,46.4376025,0 7.5731128,46.4379471,0 7.570222,46.4383563,0 7.5696588,46.4383437,0 7.5691665,46.4381822,0 7.5685649,46.4378322,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5804649,46.4331279,0 7.5785664,46.434178,0 7.5767537,46.4348241,0 7.5762068,46.4355026,0 7.5753864,46.4358579,0 7.5743629,46.4359495,0 7.5725659,46.4366656,0 7.5696588,46.4383437,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5731128,46.4379471,0 7.5727761,46.4382333,0 7.5727077,46.438534,0 7.5728577,46.4387621,0 7.5731354,46.4393476,0 7.5730157,46.4396247,0 7.5726324,46.4399562,0 7.5721003,46.4402378,0 7.5709796,46.4402849,0 7.5686003,46.4406872,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4942814,46.3711794,0 7.4942998,46.3716666,0 7.4926402,46.3719589,0 7.4897799,46.3720807,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4899918,46.3703752,0 7.4932364,46.3691539,0 7.4938051,46.3683088,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.6164187,46.5309288,0 7.6157406,46.5308985,0 7.6152942,46.5307285,0 7.6147089,46.5306361,0 7.6141852,46.5303588,0 7.6140774,46.5301278,0 7.614447,46.5292652,0 7.61437,46.5288801,0 7.6138155,46.5281716,0 7.6140774,46.5273244,0 7.6145086,46.5267853,0 7.6148167,46.5264618,0 7.6143084,46.5259997,0 7.614062,46.526277,0 7.6136153,46.5263232,0 7.6133842,46.526508,0 7.613338,46.5267699,0 7.6129553,46.5269559,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.6230501,46.5217836,0 7.6227543,46.5219743,0 7.6224002,46.522133,0 7.6221374,46.5222917,0 7.6220837,46.5224246,0 7.6222393,46.5226387,0 7.6222768,46.52279,0 7.6224217,46.5229598,0 7.6226577,46.5230521,0 7.6229367,46.5232477,0 7.6229933,46.5233276,0 7.6229423,46.5234075,0 7.6228178,46.5233511,0 7.6226145,46.5232171,0 7.6225402,46.5232813,0 7.6226676,46.5234991,0 7.6227387,46.5237748,0 7.6227055,46.5240428,0 7.622677,46.5241963,0 7.6224463,46.5244646,0 7.6223114,46.5245824,0 7.6221921,46.5247769,0 7.6214839,46.5257434,0 7.6210848,46.5263482,0 7.6197054,46.5273804,0 7.6187807,46.5279121,0 7.617833,46.5283281,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4296801,46.4435027,0 7.4283947,46.4438683,0 7.4276134,46.4448795,0 7.4282822,46.4462702,0 7.4276225,46.4479365,0 7.4270854,46.4485039,0 7.4283468,46.4503228,0 7.4289924,46.4517144,0 7.4295822,46.4524001,0 7.4290117,46.4528401,0 7.429563,46.4533341,0 7.4311741,46.453932,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5465752,46.4729147,0 7.5468033,46.4729927,0 7.5471194,46.473351,0 7.5477099,46.4747335,0 7.5477488,46.4754147,0 7.5475016,46.4763233,0 7.5473399,46.4765628,0 7.5474617,46.4766434,0 7.5494984,46.4768773,0 7.5499886,46.4772338,0 7.550697,46.4782474,0 7.551339,46.4789507,0 7.5516645,46.4797119,0 7.5514629,46.4801692,0 7.547108,46.4815103,0 7.5470161,46.4816959,0 7.5469546,46.4819903,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5126782,46.4560798,0 7.5132264,46.4562522,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4871181,46.4440733,0 7.4865607,46.4435325,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5183847,46.4722004,0 7.5189475,46.4725535,0 7.519035,46.4731315,0 7.5188279,46.4738282,0 7.5187137,46.4739436,0 7.5188805,46.4742245,0 7.5191219,46.4746667,0 7.5187133,46.4762815,0 7.5185001,46.4767863,0 7.5178777,46.4770115,0 7.5180839,46.4781219,0 7.5180828,46.47883,0 7.5182874,46.480318,0 7.5183371,46.4806788,0 7.5191752,46.4813467,0 7.5196958,46.4814845,0 7.5213221,46.4813858,0 7.5216438,46.4815441,0 7.5206847,46.4840895,0 7.5202806,46.4840895,0 7.5198736,46.4840895,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4951921,46.4444865,0 7.4964088,46.4441724,0 7.4962012,46.4450654,0 7.4965848,46.4456381,0 7.4966949,46.4456829,0 7.4968375,46.445741,0 7.4994665,46.4454308,0 7.502031,46.4464909,0 7.5033031,46.4476891,0 7.5034979,46.4480839,0 7.5033917,46.4492225,0 7.5043972,46.4500412,0 7.5050304,46.4507279,0 7.5054974,46.4518283,0 7.5064786,46.4530981,0 7.5069655,46.4535058,0 7.5078037,46.4537953,0 7.5097169,46.4542769,0 7.5126782,46.4560798,0 7.5128506,46.4564315,0 7.5128984,46.4568706,0 7.5131163,46.4569628,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5185001,46.4767863,0 7.5187069,46.4771038,0 7.5180839,46.4781219,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5465752,46.4729147,0 7.5465588,46.4727969,0 7.5463224,46.4727762,0 7.5457549,46.4722521,0 7.5454878,46.4722027,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5180828,46.47883,0 7.5187473,46.4791376,0 7.5191845,46.4795753,0 7.5186215,46.4800315,0 7.5182874,46.480318,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.4918389,46.45772,0 7.4953567,46.4572878,0 7.4978347,46.4561065,0 7.4983647,46.4560378,0 7.4991114,46.4562022,0 7.4996241,46.4568782,0 + + + + , Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5189475,46.4725535,0 7.520193,46.4732475,0 7.5214428,46.4736263,0 7.5205581,46.4749161,0 7.5201512,46.4752867,0 7.519466,46.4755006,0 7.5187133,46.4762815,0 + + + + 38 + 38, Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.490236,46.4537956,0 7.4895639,46.4533929,0 7.4892057,46.4526215,0 7.4891761,46.4507056,0 + + + + 52 + 52, Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5003928,46.4650414,0 7.5023418,46.4647048,0 7.5008661,46.4641698,0 7.4994242,46.4632353,0 7.4992965,46.462876,0 7.4999102,46.4623177,0 7.5002146,46.4620329,0 7.5000366,46.4616093,0 7.5000901,46.4612612,0 7.4995804,46.4611479,0 7.4993116,46.4600075,0 7.4993116,46.4590555,0 7.4989271,46.4580207,0 7.4984584,46.4575571,0 7.4986987,46.4571762,0 7.4996241,46.4568782,0 7.5010796,46.4572863,0 + + + + 80 + 80, Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.5464542,46.4719979,0 7.5467662,46.4722875,0 7.5465752,46.4729147,0 + + + + 84 + 84, Downhill Run Difficulty: Intermediate + #style-Ski_Run_Downhill_Intermediate + + relativeToGround + 7.546737,46.4678791,0 7.5477148,46.4684613,0 7.547106,46.4704934,0 7.5464542,46.4719979,0 7.5454878,46.4722027,0 7.5453695,46.4722278,0 7.5448716,46.4723836,0 7.5446572,46.4723806,0 7.5443664,46.4725512,0 7.5440913,46.4725106,0 7.5440027,46.472332,0 + + + + + Ski_Run_Downhill_Advanced + + + 40 + 40, Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.5091432,46.4420156,0 7.5110414,46.4433129,0 7.5131315,46.4442903,0 7.5133879,46.4452478,0 7.5138387,46.4464089,0 7.5144526,46.4482402,0 7.5148288,46.449759,0 7.5147337,46.4509702,0 7.5151598,46.4521343,0 7.5147089,46.4532426,0 7.513803,46.4540077,0 7.5136795,46.4546008,0 + + + + , Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.5796203,46.43089,0 7.5790744,46.4310512,0 7.5786846,46.4309841,0 7.5786456,46.4308094,0 7.5786261,46.4306213,0 7.5783532,46.4302854,0 7.5779052,46.4304352,0 7.5774045,46.430602,0 7.5768107,46.4309467,0 7.5761544,46.4311244,0 7.5750606,46.4314798,0 7.5744512,46.4321798,0 7.5740527,46.4330468,0 7.5730292,46.4338276,0 7.5724197,46.4338222,0 7.5706227,46.4345814,0 7.5697555,46.4354376,0 7.5682133,46.437843,0 + + + + , Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.5761544,46.4311244,0 7.574334,46.4310113,0 7.5719744,46.4327452,0 7.5707477,46.4341668,0 7.5706227,46.4345814,0 + + + + , Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.5780116,46.4306132,0 7.5779052,46.4304352,0 + + + + 51 + 51, Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.4948693,46.462373,0 7.4995804,46.4611479,0 7.5044316,46.4577113,0 + + + + 30 + 30, Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.4907043,46.4468387,0 7.4893805,46.447632,0 7.4884723,46.4480082,0 7.4862639,46.4481923,0 7.484473,46.448703,0 + + + + 4 + 4, Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.4317586,46.452333,0 7.4337182,46.4524766,0 7.434805,46.4526768,0 7.4356699,46.4530141,0 7.436796,46.453005,0 + + + + 41 + 41, Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.5110414,46.4433129,0 7.5110529,46.4437445,0 7.5106546,46.4441126,0 7.5107095,46.4447933,0 7.5100632,46.445353,0 7.5079719,46.4459569,0 7.5066993,46.4469162,0 7.5061861,46.4474935,0 7.5071655,46.4486165,0 7.5105129,46.4501148,0 7.5108818,46.4516561,0 + + + + 54 + 54, Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.5079037,46.4503452,0 7.5092498,46.4524805,0 7.5097169,46.4542769,0 + + + + 57 + 57, Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.4966403,46.4646571,0 7.5032905,46.4674926,0 + + + + 80 + 80, Downhill Run Difficulty: Advanced + #style-Ski_Run_Downhill_Advanced + + relativeToGround + 7.5465752,46.4729147,0 7.5475189,46.4734417,0 7.5477398,46.4739818,0 7.5496151,46.4749576,0 7.5498033,46.4759118,0 7.5509021,46.476891,0 7.5509823,46.4774471,0 7.5541829,46.4807074,0 + + + + + Ski_Run_Downhill_Expert + + + + Ski_Run_Downhill_Generic + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5535228,46.4865284,0 7.5535075,46.4866379,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.6222148,46.5124924,0 7.6218631,46.5122645,0 7.6205305,46.5119903,0 7.620247,46.5118688,0 7.6199634,46.5115987,0 7.6199364,46.5109372,0 7.6197599,46.5108209,0 7.6194083,46.5108438,0 7.6191407,46.5109967,0 7.6180937,46.5111776,0 7.6178583,46.5110883,0 + + + + Oeystrasse + Oeystrasse, Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5535075,46.4866379,0 7.5541077,46.486711,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5541077,46.486711,0 7.5548912,46.486666,0 7.5549402,46.4863477,0 7.5553483,46.4864375,0 7.5563116,46.4862579,0 7.556932,46.4864783,0 7.5570137,46.4867477,0 7.557332,46.4869844,0 7.5583606,46.4869191,0 7.55863,46.4870334,0 7.5590626,46.4870252,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5466507,46.4822665,0 7.5467405,46.4820455,0 7.5469546,46.4819903,0 7.546887,46.4821013,0 + + + + 55 + 55, Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5202806,46.4840895,0 7.5206995,46.4843934,0 7.521236,46.4846116,0 7.5215509,46.4848385,0 7.5235622,46.4848575,0 7.5243291,46.4849987,0 7.5254277,46.4849455,0 7.5258912,46.484845,0 7.5262259,46.4849337,0 7.5263644,46.4850796,0 7.5270499,46.4847209,0 7.5281228,46.4845732,0 7.5287322,46.4845909,0 7.5299857,46.4847785,0 7.5301055,46.4847918,0 7.5322129,46.484865,0 7.5335432,46.4842858,0 7.5344616,46.4843804,0 7.5353629,46.4842622,0 7.5359808,46.4840021,0 7.5364272,46.4839903,0 7.5368933,46.4838149,0 7.5374056,46.4843272,0 7.5383498,46.4843331,0 7.5392338,46.4841794,0 7.5411564,46.483553,0 7.5426756,46.483618,0 7.5434451,46.4835786,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5590626,46.4870252,0 7.5600259,46.4871885,0 7.5608912,46.4871232,0 7.5611443,46.4873681,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5548912,46.486666,0 7.5561531,46.4869638,0 7.5573714,46.4873324,0 7.5584605,46.4875866,0 7.5585589,46.487845,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5434451,46.4835786,0 7.5437149,46.4835647,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5442346,46.4836269,0 7.5443418,46.4836053,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5437149,46.4835647,0 7.5439543,46.4836822,0 7.5442346,46.4836269,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5443418,46.4836053,0 7.5452866,46.4835281,0 7.5460156,46.4835284,0 7.5483036,46.4841284,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5483036,46.4841284,0 7.5486892,46.4843265,0 7.5502237,46.4845773,0 7.5505897,46.4845683,0 7.5510877,46.4853643,0 7.5523785,46.486287,0 7.5528849,46.4864761,0 7.5535228,46.4865284,0 + + + + , Downhill Run Difficulty: Unknown + #style-Ski_Run_Downhill_Generic + + relativeToGround + 7.5033917,46.4492225,0 7.503756,46.4493929,0 7.5041471,46.4492925,0 7.5047479,46.4492921,0 7.5054788,46.4495257,0 7.5060307,46.4500934,0 7.5059038,46.4503571,0 7.5047888,46.4499534,0 7.5044793,46.4499425,0 7.5043972,46.4500412,0 + + + + + Ski_Run_Downhill_Easy_Gladed + + + + Ski_Run_Downhill_Intermediate_Gladed + + + + Ski_Run_Downhill_Advanced_Gladed + + + + Ski_Run_Downhill_Expert_Gladed + + + + Ski_Run_Downhill_Generic_Gladed + + + + Ski_Run_Downhill_Easy_Lit + + + + Ski_Run_Downhill_Intermediate_Lit + + + + Ski_Run_Downhill_Advanced_Lit + + + + Ski_Run_Downhill_Expert_Lit + + + + Ski_Run_Downhill_Generic_Lit + + + + + Ski_Run_Nordic + + Ski_Run_Nordic_Easy + + + + Ski_Run_Nordic_Intermediate + + + + Ski_Run_Nordic_Advanced + + + + Ski_Run_Nordic_Expert + + + + Ski_Run_Nordic_Generic + + + + Ski_Run_Nordic_Easy_Gladed + + + + Ski_Run_Nordic_Intermediate_Gladed + + + + Ski_Run_Nordic_Advanced_Gladed + + + + Ski_Run_Nordic_Expert_Gladed + + + + Ski_Run_Nordic_Generic_Gladed + + + + Ski_Run_Nordic_Easy_Lit + + + + Ski_Run_Nordic_Intermediate_Lit + + + + Ski_Run_Nordic_Advanced_Lit + + + + Ski_Run_Nordic_Expert_Lit + + + + Ski_Run_Nordic_Generic_Lit + + + + + + Ski_Routes + + + + Ski_Lift + + Ski_Lift_Chairlift + + + Walleg + Walleg (Chairlift) Capacity: people + Chairlift + #style-Ski_Lift_Chairlift + + relativeToGround + 7.4307004,46.4584832,0 7.414217,46.447336,0 + + + + Metschberg + Metschberg (Chairlift) Capacity:4 people + Chairlift + #style-Ski_Lift_Chairlift + + relativeToGround + 7.4682319,46.4426424,0 7.4878089,46.443423,0 + + + + Luegli + Luegli (Chairlift) Capacity:4 people + Chairlift + #style-Ski_Lift_Chairlift + + relativeToGround + 7.5134775,46.4563718,0 7.507632,46.44102,0 + + + + Lavey + Lavey (Chairlift) Capacity:5 people + Chairlift + #style-Ski_Lift_Chairlift + + relativeToGround + 7.5137218,46.4574839,0 7.494809,46.462495,0 + + + + Aebi-Sillerenbühl + Aebi-Sillerenbühl (Chairlift) Capacity:6 people + Chairlift + #style-Ski_Lift_Chairlift + + relativeToGround + 7.5194921,46.4842678,0 7.5183847,46.4722004,0 + + + + Metschstand + Metschstand (Chairlift) Capacity:6 people + Chairlift + #style-Ski_Lift_Chairlift + + relativeToGround + 7.4751279,46.4473859,0 7.4951921,46.4444865,0 + + + + Bühlberg + Bühlberg (Chairlift) Capacity: people + Chairlift + #style-Ski_Lift_Chairlift + + relativeToGround + 7.4709826,46.4512884,0 7.4925723,46.455196,0 + + + + (Chairlift) Capacity:2 people + Chairlift + #style-Ski_Lift_Chairlift + + relativeToGround + 7.5437149,46.4835647,0 7.5466507,46.4822665,0 + + + + Boden-Chuenisbärgli + Boden-Chuenisbärgli (Chairlift) Capacity:4 people + Chairlift + #style-Ski_Lift_Chairlift + + relativeToGround + 7.5570355,46.4818791,0 7.5465752,46.4729147,0 + + + + + Ski_Lift_Gondola + + + Stoss-Leiterli + Stoss-Leiterli (Gondola) Capacity: people + Gondola + #style-Ski_Lift_Gondola + + relativeToGround + 7.429151,46.440554,0 7.4162843,46.432802,0 7.409078,46.428856,0 + + + + Lenk-Stoss + Lenk-Stoss (Gondola) Capacity: people + Gondola + #style-Ski_Lift_Gondola + + relativeToGround + 7.436796,46.453005,0 7.429151,46.440554,0 + + + + Funitel Violettes-Plaine morte + Funitel Violettes-Plaine morte (Gondola) Capacity: people + Gondola + #style-Ski_Lift_Gondola + + relativeToGround + 7.4988727,46.3427065,0 7.4929566,46.358426,0 7.488878,46.370053,0 + + + + + Ski_Lift_Cable_Car + + + Geils-Hahnenmoos + Geils-Hahnenmoos (Cable Car) Capacity:4 people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.512872,46.457057,0 7.495256,46.453167,0 + + + + Metschbahn + Metschbahn (Cable Car) Capacity: people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.456975,46.44131,0 7.467957,46.442374,0 + + + + Elsigbach-Elsigenalp + Elsigbach-Elsigenalp (Cable Car) Capacity: people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.606468,46.529129,0 7.622388,46.522452,0 + + + + Gemmibahn + Gemmibahn (Cable Car) Capacity: people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.625227,46.383782,0 7.616339,46.398008,0 + + + + Sillerenbahn + Sillerenbahn (Cable Car) Capacity: people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.560206,46.487728,0 7.546887,46.4821013,0 7.532755,46.468548,0 7.517934,46.471763,0 + + + + Engstligenalp + Engstligenalp (Cable Car) Capacity: people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.566433,46.459076,0 7.56516,46.449387,0 + + + + Tschentenbahn + Tschentenbahn (Cable Car) Capacity: people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.55769,46.492944,0 7.5458795,46.4988409,0 + + + + (Cable Car) Capacity: people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.616339,46.398008,0 7.6132768,46.4028233,0 + + + + Iffigenalp-Rawil-Weisshorn + Iffigenalp-Rawil-Weisshorn (Cable Car) Capacity: people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.4432715,46.4012898,0 7.4554936,46.3839921,0 + + + + Iffigenalp-Rawil-Weisshorn + Iffigenalp-Rawil-Weisshorn (Cable Car) Capacity: people + Cable Car + #style-Ski_Lift_Cable_Car + + relativeToGround + 7.4554936,46.3839921,0 7.4728668,46.3822403,0 + + + + + Ski_Lift_Mixed_Lift + + + + Ski_Lift_Drag_Lift + + + Balmen + Balmen (Drag Lift) + Drag Lift + #style-Ski_Lift_Drag_Lift + + relativeToGround + 7.4311473,46.4436377,0 7.429755,46.4386039,0 + + + + (Drag Lift) + Drag Lift + #style-Ski_Lift_Drag_Lift + + relativeToGround + 7.5655255,46.449212,0 7.5679939,46.4406328,0 7.568652,46.4383091,0 + + + + (Drag Lift) + Drag Lift + #style-Ski_Lift_Drag_Lift + + relativeToGround + 7.568574,46.4409349,0 7.5749906,46.4438887,0 + + + + (Drag Lift) + Drag Lift + #style-Ski_Lift_Drag_Lift + + relativeToGround + 7.5689165,46.4376761,0 7.5758497,46.4318298,0 7.5777092,46.4308174,0 7.5779358,46.4307636,0 7.5786456,46.4308094,0 7.5796203,46.43089,0 7.5801782,46.4310221,0 7.5779827,46.4329768,0 7.5690523,46.4378121,0 7.5689165,46.4376761,0 + + + + (Drag Lift) + Drag Lift + #style-Ski_Lift_Drag_Lift + + relativeToGround + 7.5688149,46.4375738,0 7.5758005,46.4317871,0 7.5780116,46.4306132,0 + + + + Erli + Erli (Drag Lift) + Drag Lift + #style-Ski_Lift_Drag_Lift + + relativeToGround + 7.62299,46.3828465,0 7.6192261,46.3858283,0 + + + + + Ski_Lift_TBar + + + Guetfläck + Guetfläck (T-Bar) + T-Bar + #style-Ski_Lift_TBar + + relativeToGround + 7.4864068,46.4375038,0 7.4979322,46.4414643,0 + + + + (T-Bar) + T-Bar + #style-Ski_Lift_TBar + + relativeToGround + 7.4915714,46.4504852,0 7.4981254,46.4509924,0 + + + + (T-Bar) + T-Bar + #style-Ski_Lift_TBar + + relativeToGround + 7.6039602,46.5170216,0 7.6223253,46.5126763,0 + + + + (T-Bar) + T-Bar + #style-Ski_Lift_TBar + + relativeToGround + 7.6178567,46.5109719,0 7.6255759,46.5097159,0 + + + + Lac + Lac (T-Bar) + T-Bar + #style-Ski_Lift_TBar + + relativeToGround + 7.4938051,46.3683088,0 7.4894455,46.3702172,0 + + + + (T-Bar) + T-Bar + #style-Ski_Lift_TBar + + relativeToGround + 7.5074665,46.4712735,0 7.5028327,46.4648778,0 + + + + (T-Bar) + T-Bar + #style-Ski_Lift_TBar + + relativeToGround + 7.5440027,46.472332,0 7.546737,46.4678791,0 + + + + + Ski_Lift_JBar + + + Glacier 2 + Glacier 2 (J-Bar) + J-Bar + #style-Ski_Lift_JBar + + relativeToGround + 7.4888265,46.3742978,0 7.4889324,46.3707894,0 + + + + + Ski_Lift_Platter + + + Aebi + Aebi (Platter) + Platter + #style-Ski_Lift_Platter + + relativeToGround + 7.5212812,46.4844127,0 7.5220797,46.4823123,0 + + + + + Ski_Lift_Rope_Tow + + + (Rope Tow) + Rope Tow + #style-Ski_Lift_Rope_Tow + + relativeToGround + 7.5484827,46.4812398,0 7.5508319,46.4815667,0 + + + + (Rope Tow) + Rope Tow + #style-Ski_Lift_Rope_Tow + + relativeToGround + 7.5469546,46.4819903,0 7.5473199,46.4814378,0 + + + + + Ski_Lift_Magic_Carpet + + + (Magic Carpet) + Magic Carpet + #style-Ski_Lift_Magic_Carpet + + relativeToGround + 7.4705402,46.4532965,0 7.471843,46.4529933,0 + + + + + + Ski_Boundary + + + + Paths + + Tracks + + + Hörnliweg + #style-Tracks + + relativeToGround + 7.565494,46.5008679,0 7.5656791,46.500969,0 7.5658624,46.5011096,0 7.5661445,46.5013261,0 7.5666733,46.5015614,0 7.5667884,46.5017876,0 7.566748,46.5018344,0 7.5665807,46.5016761,0 7.5664381,46.5016324,0 7.566207,46.5016563,0 7.566185,46.501694,0 7.566361,46.501751,0 7.5664099,46.5018833,0 7.5665353,46.5022409,0 7.5667755,46.5024593,0 7.567001,46.502815,0 7.5669076,46.5033531,0 7.567179,46.5039149,0 7.5672453,46.5041525,0 7.5672579,46.5041977,0 7.5678887,46.5054809,0 7.5681607,46.5064122,0 7.5688551,46.5069114,0 7.5691378,46.50727,0 7.569223,46.5076089,0 + + + + #style-Tracks + + relativeToGround + 7.55826,46.4885102,0 7.5584046,46.4880564,0 + + + + #style-Tracks + + relativeToGround + 7.4722325,46.5557203,0 7.4723727,46.5554306,0 7.4724179,46.5554155,0 7.4725118,46.5554491,0 7.4727424,46.5554155,0 7.4729023,46.5555256,0 7.4730437,46.555317,0 7.4733032,46.5553483,0 7.4740136,46.5550725,0 7.4739997,46.5552336,0 7.4742734,46.5551527,0 7.4745005,46.5549001,0 7.4749441,46.5543583,0 7.4751759,46.5539538,0 7.4755333,46.553592,0 7.4758117,46.5533618,0 7.4763245,46.5528235,0 7.4764189,46.5523924,0 7.4765056,46.5521307,0 7.4766873,46.5520046,0 7.4768397,46.551354,0 7.4770067,46.5513012,0 7.4770917,46.5510639,0 7.4770507,46.5509437,0 7.4770712,46.5508704,0 7.4771386,46.5508675,0 7.4775372,46.5504953,0 7.4774844,46.5504337,0 7.4774962,46.5501231,0 7.4774346,46.5499824,0 7.4776193,46.5494988,0 7.4775987,46.5492526,0 7.4777043,46.5491032,0 7.477672,46.5489039,0 7.4778918,46.5485492,0 7.4777218,46.548388,0 7.4778537,46.5476319,0 7.4779563,46.5475235,0 7.4782259,46.5460844,0 7.4783314,46.5459819,0 7.4785542,46.5459877,0 7.4787066,46.5462515,0 7.4787887,46.5462486,0 7.4788473,46.545554,0 7.4790231,46.5455334,0 7.4790817,46.54517,0 7.478568,46.5448331,0 7.4780354,46.5446806,0 7.4778625,46.5448301,0 7.4774258,46.5445428,0 7.477209,46.5447317,0 7.4774324,46.5448121,0 7.4774294,46.5450385,0 7.4772894,46.5450534,0 7.4773102,46.5454377,0 7.4768455,46.5459619,0 7.4764762,46.5460662,0 7.4762915,46.5451696,0 7.475651,46.54469,0 7.4754752,46.5447048,0 7.4752578,46.5449461,0 7.4748378,46.5449342,0 7.4744892,46.5447019,0 7.4737832,46.5448538,0 7.4734436,46.5442044,0 7.4738309,46.5439482,0 7.4740882,46.5440764,0 7.4743068,46.5439397,0 7.4742902,46.543847,0 + + + + #style-Tracks + + relativeToGround + 7.57743,46.513533,0 7.57697,46.513383,0 7.576639,46.513398,0 7.575972,46.513236,0 7.5754347,46.51317,0 7.5735754,46.5130497,0 7.573283,46.513028,0 7.5727554,46.5131053,0 7.5725651,46.51319,0 7.572003,46.513318,0 7.57147,46.5134376,0 7.57086,46.513632,0 7.5704027,46.5136993,0 7.5698483,46.5135546,0 7.569485,46.513179,0 7.568995,46.512935,0 7.5682886,46.5130065,0 7.5676272,46.512977,0 7.567304,46.512969,0 7.566875,46.512785,0 7.566209,46.512784,0 7.565811,46.512851,0 7.5654903,46.5129931,0 7.565151,46.513025,0 + + + + #style-Tracks + + relativeToGround + 7.5243291,46.4849987,0 7.5247153,46.4845022,0 7.525197,46.4841121,0 + + + + #style-Tracks + + relativeToGround + 7.5439138,46.4880345,0 7.5436907,46.4883773,0 7.5436564,46.4888146,0 7.5445919,46.4885664,0 7.5449953,46.4886255,0 7.5454416,46.4885664,0 7.5460167,46.4881409,0 7.5460596,46.4878868,0 7.546257,46.4878336,0 7.5465059,46.4880227,0 7.546566,46.4882709,0 7.5471926,46.4885959,0 7.5477419,46.4888205,0 7.5486174,46.488986,0 7.5491066,46.4891869,0 7.5493813,46.4894646,0 7.5494156,46.4900083,0 7.5491066,46.4903747,0 7.5488834,46.4907942,0 7.5489435,46.4908828,0 7.5492268,46.4907528,0 7.5491152,46.4909124,0 7.5492783,46.4912079,0 7.549201,46.4915033,0 7.549304,46.4916747,0 7.5492783,46.4918933,0 7.5495186,46.4920647,0 7.550437,46.4920765,0 7.550909,46.4922242,0 7.5519562,46.492886,0 7.5520592,46.4934237,0 7.5523596,46.4936542,0 7.5524712,46.4936955,0 7.5525656,46.4936365,0 + + + + #style-Tracks + + relativeToGround + 7.5525656,46.4936365,0 7.5523274,46.4934746,0 7.5523274,46.4930905,0 7.5524115,46.4926899,0 7.5523257,46.4923796,0 7.5520468,46.4919365,0 7.5518322,46.4917444,0 7.5515532,46.4916706,0 7.5516391,46.4915228,0 7.551918,46.4915672,0 7.5524974,46.4918774,0 7.5528622,46.492099,0 7.553263,46.4922691,0 7.5533831,46.4923341,0 7.553469,46.4925764,0 7.5535806,46.4925409,0 7.5536063,46.4923164,0 7.5535291,46.4920859,0 7.5527051,46.4912587,0 7.5523274,46.4909928,0 7.5524562,46.4906559,0 7.552336,46.4902305,0 7.5524133,46.4901418,0 + + + + Panoramaweg + #style-Tracks + + relativeToGround + 7.5487911,46.4869921,0 7.5491129,46.4871325,0 7.5495421,46.4872654,0 7.5500785,46.4874058,0 7.5505077,46.4875462,0 7.5511729,46.4879007,0 7.5515698,46.4881962,0 7.5519668,46.4885951,0 7.5521814,46.4889718,0 7.5523638,46.489415,0 7.5523852,46.4897843,0 7.5524133,46.4901418,0 + + + + #style-Tracks + + relativeToGround + 7.5662091,46.4580919,0 7.5662713,46.458293,0 7.5669387,46.4587127,0 7.5669473,46.4590261,0 7.5667928,46.4591384,0 + + + + #style-Tracks + + relativeToGround + 7.4445475,46.5790933,0 7.4458753,46.5773845,0 7.4458753,46.57704,0 7.4458753,46.5764872,0 7.4454415,46.5759023,0 7.4449725,46.5753015,0 7.4445622,46.5747407,0 7.4442338,46.5745324,0 7.4439055,46.5743321,0 7.4437531,46.5740276,0 7.4435655,46.5738594,0 7.4435772,46.5737072,0 7.4437179,46.5733947,0 7.4436593,46.5731144,0 7.4434131,46.572858,0 7.4434131,46.5725455,0 7.4432606,46.5724094,0 7.443073,46.5721289,0 7.4428151,46.5718886,0 7.4427096,46.5716242,0 7.4423461,46.5711435,0 7.4418908,46.5708556,0 7.4414336,46.5705832,0 7.4412694,46.5703749,0 7.4410584,46.5698701,0 7.4408942,46.5694536,0 7.4408042,46.5690943,0 7.4407082,46.5687701,0 7.4404839,46.5684761,0 7.4403197,46.5681076,0 7.4402211,46.5678374,0 7.4401859,46.5675851,0 7.4401068,46.5672666,0 7.4399319,46.5670379,0 7.4398305,46.566828,0 7.4394297,46.5665636,0 7.4392764,46.5663903,0 + + + + #style-Tracks + + relativeToGround + 7.582288,46.50904,0 7.5818959,46.50922,0 7.5814771,46.5092119,0 7.58117,46.509261,0 7.580918,46.509277,0 7.5809353,46.5092018,0 7.581108,46.50897,0 7.581143,46.5088664,0 7.5811,46.508754,0 7.5810428,46.5086824,0 7.5809629,46.5086397,0 7.5806824,46.5085984,0 + + + + #style-Tracks + + relativeToGround + 7.5811311,46.5115993,0 7.5812245,46.5113495,0 7.581362,46.511302,0 7.581983,46.511495,0 7.5817095,46.5110604,0 + + + + #style-Tracks + + relativeToGround + 7.5659698,46.4470345,0 7.5650031,46.4460937,0 7.563934,46.445205,0 + + + + #style-Tracks + + relativeToGround + 7.5707798,46.4401998,0 7.569089,46.4414773,0 7.5687886,46.4416607,0 7.5684624,46.4417139,0 + + + + #style-Tracks + + relativeToGround + 7.5684624,46.4417139,0 7.5669518,46.4423053,0 7.5657759,46.4423822,0 7.5653982,46.4425064,0 7.5652008,46.4427608,0 7.5642996,46.4433581,0 7.564128,46.4436183,0 7.5631237,46.4440856,0 7.5624986,46.444518,0 + + + + #style-Tracks + + relativeToGround + 7.5633834,46.4449349,0 7.5632267,46.4453985,0 + + + + #style-Tracks + + relativeToGround + 7.5578623,46.4428613,0 7.5580572,46.4430058,0 7.558304,46.443065,0 7.5586366,46.4431167,0 7.5589907,46.4430946,0 7.5594091,46.4431389,0 7.5597284,46.4432301,0 7.5599777,46.4432794,0 7.5603342,46.4434764,0 + + + + #style-Tracks + + relativeToGround + 7.5014286,46.4245354,0 7.5006562,46.4241982,0 + + + + #style-Tracks + + relativeToGround + 7.5000468,46.4239793,0 7.4995318,46.4237071,0 7.4992657,46.4238313,0 7.4993,46.4240858,0 7.4987765,46.4239438,0 7.4983301,46.4237012,0 7.4979697,46.4233462,0 7.4974804,46.4232456,0 7.4969912,46.4232634,0 7.4965191,46.4230385,0 7.4949055,46.4225356,0 7.4928284,46.422293,0 7.4925108,46.4221865,0 7.4922705,46.4213819,0 7.4910088,46.421583,0 7.4907513,46.4216955,0 7.4911204,46.4219025,0 7.4904766,46.422222,0 7.4900475,46.4225415,0 7.4898844,46.4229202,0 7.4899359,46.4234704,0 7.489584,46.4236657,0 7.4893952,46.4239615,0 7.4878846,46.4243757,0 7.4875584,46.4246478,0 7.487052,46.4247839,0 7.4866143,46.4247898,0 7.4864512,46.4250915,0 7.4869662,46.4252809,0 7.4869576,46.4255589,0 7.4862624,46.4258547,0 7.4859791,46.4260973,0 7.4859276,46.4263813,0 7.4843457,46.4265489,0 + + + + #style-Tracks + + relativeToGround + 7.5006562,46.4241982,0 7.5003643,46.424139,0 + + + + #style-Tracks + + relativeToGround + 7.5003643,46.424139,0 7.5000468,46.4239793,0 + + + + #style-Tracks + + relativeToGround + 7.4843457,46.4265489,0 7.4840821,46.4265818,0 + + + + #style-Tracks + + relativeToGround + 7.4840821,46.4265818,0 7.4831295,46.4267008,0 7.482194,46.4265943,0 7.4811898,46.4266712,0 7.4788895,46.4265588,0 7.478323,46.4266475,0 7.4783109,46.4266478,0 7.4770527,46.4266771,0 7.4761172,46.426896,0 + + + + #style-Tracks + + relativeToGround + 7.5659698,46.4470345,0 7.5655203,46.4480124,0 7.5655891,46.448399,0 7.5651457,46.4489852,0 7.5649628,46.449227,0 7.56516,46.449387,0 + + + + #style-Tracks + + relativeToGround + 7.5623083,46.444399,0 7.5621882,46.4442866,0 + + + + #style-Tracks + + relativeToGround + 7.5621882,46.4442866,0 7.5619659,46.4441994,0 7.5603342,46.4434764,0 + + + + #style-Tracks + + relativeToGround + 7.5638662,46.4451512,0 7.5633834,46.4449349,0 7.5624986,46.444518,0 7.5623083,46.444399,0 + + + + #style-Tracks + + relativeToGround + 7.563934,46.445205,0 7.5638662,46.4451512,0 + + + + #style-Tracks + + relativeToGround + 7.5650031,46.4460937,0 7.5644603,46.4461059,0 7.563467,46.446806,0 7.5631545,46.4467541,0 7.562727,46.446683,0 7.5621935,46.4470208,0 7.5616868,46.4474721,0 7.5615495,46.4474679,0 7.561039,46.447273,0 7.560624,46.447319,0 7.560726,46.447719,0 7.56098,46.448121,0 7.560985,46.448126,0 + + + + #style-Tracks + + relativeToGround + 7.5619659,46.4441994,0 7.5616754,46.4444958,0 7.5609186,46.4449775,0 7.56084,46.4452181,0 7.5609195,46.4455156,0 + + + + #style-Tracks + + relativeToGround + 7.6216319,46.5569936,0 7.621301,46.556518,0 7.621064,46.556056,0 7.620255,46.555568,0 7.61985,46.555023,0 7.619469,46.554934,0 7.61885,46.55517,0 7.618224,46.555101,0 7.616902,46.554591,0 7.616307,46.554441,0 7.6157588,46.5541889,0 7.615575,46.554088,0 7.615245,46.553345,0 7.615047,46.553178,0 7.614621,46.5530406,0 7.614502,46.552815,0 7.6145042,46.5525758,0 7.6144034,46.5523715,0 7.6143229,46.5523162,0 7.6137389,46.5522484,0 7.6133449,46.5520084,0 7.6131605,46.5518493,0 7.612778,46.551181,0 7.612155,46.550717,0 7.611452,46.550374,0 7.6106649,46.5501724,0 7.6104511,46.5495174,0 7.6104444,46.5492243,0 7.61033,46.549085,0 7.6099347,46.5488565,0 7.6099128,46.5485968,0 7.609773,46.5483856,0 7.6095989,46.5482497,0 7.6093448,46.5481847,0 7.609047,46.548181,0 7.6080786,46.5483557,0 7.6079368,46.5483324,0 7.607811,46.548242,0 7.6076426,46.5479874,0 7.6077006,46.5479132,0 7.607992,46.54754,0 7.6083158,46.5473431,0 7.6085167,46.5470549,0 7.6084328,46.5468316,0 7.6078638,46.54661,0 7.6078362,46.5465457,0 7.6079946,46.5463545,0 7.6082273,46.5462439,0 7.6085278,46.5461917,0 7.6087459,46.546067,0 7.6088015,46.5458812,0 7.608665,46.545726,0 7.6076322,46.5450348,0 7.6070738,46.5450152,0 7.6065814,46.5447507,0 7.606325,46.544763,0 + + + + #style-Tracks + + relativeToGround + 7.614076,46.555321,0 7.6141065,46.555273,0 7.6139027,46.555118,0 7.613895,46.554985,0 7.614333,46.554527,0 7.614442,46.554234,0 7.61451,46.554227,0 7.614586,46.55458,0 7.614753,46.554636,0 7.615356,46.554676,0 7.615528,46.554846,0 7.615611,46.554802,0 7.615595,46.554721,0 7.615483,46.554504,0 7.615205,46.5542,0 7.615198,46.554095,0 7.615281,46.554102,0 7.615478,46.55423,0 7.6157588,46.5541889,0 + + + + #style-Tracks + + relativeToGround + 7.562625,46.528737,0 7.56258,46.528984,0 7.5624755,46.5290639,0 7.5622926,46.5292237,0 7.5622248,46.5293516,0 7.5622072,46.5294627,0 7.5623111,46.5297611,0 7.5622992,46.5298085,0 7.5622281,46.5298254,0 7.5620681,46.5297868,0 7.5619444,46.5298217,0 7.5617042,46.5300155,0 7.5616171,46.5301839,0 7.5614941,46.5302822,0 7.5612441,46.5305146,0 7.5613218,46.5305287,0 7.5615238,46.5304796,0 7.5615986,46.5304887,0 7.5617029,46.5305871,0 7.5617754,46.5305914,0 7.5619127,46.5304947,0 7.5619779,46.5305096,0 7.5619084,46.5306169,0 7.5618508,46.5308156,0 7.5617721,46.5308511,0 7.5616366,46.5308149,0 7.5615781,46.5308304,0 7.5615803,46.5309603,0 7.5618485,46.5310641,0 7.562042,46.530987,0 7.562019,46.531133,0 7.5617081,46.5312275,0 7.5621951,46.5313441,0 7.5622535,46.5314364,0 7.561869,46.531579,0 7.5618187,46.5316877,0 7.5624312,46.5316881,0 7.5624457,46.5317378,0 7.5619692,46.5322001,0 7.561704,46.532197,0 7.5616572,46.5322558,0 + + + + #style-Tracks + + relativeToGround + 7.448503,46.459865,0 7.4481932,46.4599236,0 7.447857,46.459965,0 7.4477077,46.4598442,0 + + + + #style-Tracks + + relativeToGround + 7.422303,46.459911,0 7.422095,46.459751,0 7.421974,46.45922,0 7.42177,46.459237,0 7.421713,46.459428,0 7.421433,46.459584,0 7.421153,46.459927,0 7.421124,46.460335,0 7.421335,46.460904,0 7.421273,46.461004,0 7.421129,46.46101,0 7.420944,46.460704,0 7.420039,46.459998,0 7.419421,46.459828,0 7.419236,46.459693,0 7.419076,46.459556,0 7.418931,46.459118,0 7.418705,46.458838,0 7.417878,46.458255,0 7.417994,46.458118,0 7.4184,46.457984,0 7.418286,46.45737,0 7.418312,46.457205,0 7.418543,46.456938,0 7.418476,46.456862,0 7.417901,46.457018,0 7.417152,46.457407,0 7.41648,46.457492,0 7.416225,46.457234,0 7.416697,46.456572,0 7.416569,46.456405,0 7.416079,46.456122,0 7.415381,46.455862,0 7.415504,46.455627,0 7.415751,46.455464,0 7.416825,46.455187,0 7.416938,46.4549,0 7.416739,46.454633,0 7.415345,46.453554,0 7.414514,46.453405,0 7.413282,46.452981,0 7.411303,46.451664,0 7.410109,46.45107,0 7.40973,46.450997,0 7.409619,46.450662,0 7.409465,46.450521,0 7.408415,46.450157,0 7.408251,46.450016,0 7.408062,46.449662,0 7.407399,46.449145,0 7.4071281,46.4487423,0 + + + + #style-Tracks + + relativeToGround + 7.464328,46.457064,0 7.463382,46.457176,0 7.462897,46.457377,0 7.462649,46.457567,0 + + + + #style-Tracks + + relativeToGround + 7.469627,46.453826,0 7.469009,46.453963,0 + + + + #style-Tracks + + relativeToGround + 7.448482,46.460149,0 7.448486,46.460146,0 7.448833,46.459856,0 7.448785,46.459794,0 7.448503,46.459865,0 + + + + #style-Tracks + + relativeToGround + 7.5903867,46.5152344,0 7.5903489,46.5153277,0 7.590271,46.515499,0 7.590262,46.515674,0 7.590325,46.515841,0 7.590276,46.515941,0 7.590159,46.516075,0 + + + + #style-Tracks + + relativeToGround + 7.589031,46.518301,0 7.589029,46.518367,0 7.589031,46.51853,0 7.589068,46.51861,0 7.589181,46.518754,0 7.58928,46.518836,0 7.589371,46.518996,0 7.589441,46.519072,0 7.589449,46.519104,0 7.589424,46.519186,0 7.589486,46.519322,0 7.589476,46.519587,0 7.589486,46.519672,0 7.589452,46.51985,0 7.589515,46.519951,0 7.589558,46.520058,0 7.589665,46.520142,0 7.58973,46.520286,0 7.589863,46.520462,0 7.589887,46.520566,0 7.589898,46.520727,0 7.589946,46.520843,0 7.5900055,46.5210825,0 7.589943,46.521137,0 7.5898983,46.5211664,0 7.5898629,46.5212153,0 + + + + #style-Tracks + + relativeToGround + 7.6093448,46.5481847,0 7.6094427,46.5483293,0 7.6094101,46.548591,0 7.609356,46.548667,0 7.609166,46.548845,0 7.6089752,46.5489862,0 7.6088952,46.5490921,0 7.6086869,46.549561,0 7.608622,46.5497762,0 7.608591,46.54994,0 7.6086371,46.5501173,0 + + + + Lischenstrasse + #style-Tracks + + relativeToGround + 7.5802181,46.4985699,0 7.5801466,46.4985211,0 7.580027,46.4983298,0 7.5798853,46.498233,0 7.5797367,46.4978481,0 7.5796769,46.4977522,0 7.579526,46.497591,0 7.5792835,46.4974686,0 7.5791957,46.4973171,0 7.5790319,46.4971786,0 7.5788853,46.4971104,0 + + + + #style-Tracks + + relativeToGround + 7.578695,46.517886,0 7.578953,46.518042,0 7.579168,46.51811,0 7.579338,46.518213,0 7.579463,46.51835,0 7.579476,46.518507,0 7.579533,46.518679,0 7.579717,46.518822,0 7.579934,46.518941,0 7.580101,46.519058,0 7.580151,46.519196,0 7.580164,46.519362,0 7.580285,46.519495,0 7.5807866,46.5197277,0 7.581016,46.519826,0 7.581209,46.5199,0 7.581276,46.519904,0 7.5812961,46.5198713,0 7.581275,46.519829,0 7.581047,46.519686,0 7.58093,46.519564,0 7.580785,46.51945,0 7.580735,46.519297,0 7.580866,46.519152,0 7.580853,46.519022,0 7.580703,46.518801,0 7.580678,46.518635,0 7.580573,46.518538,0 + + + + #style-Tracks + + relativeToGround + 7.5807866,46.5197277,0 7.5808963,46.5198879,0 7.580874,46.519925,0 7.580826,46.519954,0 7.580638,46.520001,0 7.5803428,46.5199976,0 7.5801735,46.5200411,0 + + + + #style-Tracks + + relativeToGround + 7.6128563,46.5576717,0 7.612698,46.557657,0 7.612517,46.557642,0 7.612308,46.557685,0 7.612183,46.557782,0 7.61231,46.557889,0 + + + + #style-Tracks + + relativeToGround + 7.6045687,46.4880471,0 7.6045863,46.4881633,0 7.6045673,46.4882513,0 7.6044723,46.4884403,0 7.6043857,46.488565,0 + + + + #style-Tracks + + relativeToGround + 7.5897212,46.4818723,0 7.5895673,46.4819072,0 7.589368,46.482049,0 7.589186,46.482293,0 7.5889665,46.4825243,0 7.588688,46.482802,0 7.588667,46.482876,0 7.588272,46.483302,0 7.587817,46.483767,0 7.587592,46.484096,0 7.587544,46.484295,0 7.5873982,46.4845334,0 7.58722,46.484682,0 7.586952,46.484887,0 7.586723,46.484991,0 7.586202,46.485288,0 7.585801,46.485609,0 7.5853807,46.486011,0 7.585214,46.486292,0 7.5851904,46.4864815,0 + + + + #style-Tracks + + relativeToGround + 7.5773923,46.4947336,0 7.577378,46.494574,0 7.577124,46.494315,0 7.5770454,46.4942655,0 + + + + #style-Tracks + + relativeToGround + 7.4393406,46.4117801,0 7.4392719,46.411641,0 7.4393529,46.411519,0 7.4396951,46.4114482,0 + + + + #style-Tracks + + relativeToGround + 7.4864609,46.3705861,0 7.4871769,46.3704428,0 7.4885874,46.3703193,0 7.4891387,46.370344,0 + + + + #style-Tracks + + relativeToGround + 7.4891387,46.370344,0 7.4902628,46.3705021,0 7.4912509,46.3708331,0 7.4922462,46.3712679,0 7.4926614,46.3714013,0 7.4932557,46.3710307,0 7.4943369,46.3708875,0 7.4952462,46.370512,0 7.4956472,46.3701464,0 7.4958119,46.3696573,0 7.4961341,46.3693312,0 7.4969503,46.369099,0 7.4977594,46.3690793,0 7.4982964,46.3690496,0 7.4989479,46.368768,0 7.4992988,46.3682987,0 + + + + #style-Tracks + + relativeToGround + 7.4922705,46.4213819,0 7.4920912,46.4210829,0 7.492428,46.4207877,0 7.4926512,46.4205796,0 7.493215,46.420485,0 7.4936048,46.420432,0 7.4938281,46.4200158,0 7.4938848,46.4191076,0 7.4936426,46.4187141,0 7.4928631,46.4181881,0 7.4924317,46.4180405,0 7.4916144,46.4174502,0 7.4910922,46.4173707,0 7.4904754,46.4171777,0 7.4902029,46.4168183,0 7.4901878,46.4164474,0 + + + + #style-Tracks + + relativeToGround + 7.5640376,46.4659612,0 7.5641356,46.4658925,0 7.5644622,46.465664,0 7.5647672,46.4653051,0 7.5649746,46.4650798,0 7.5651461,46.4649462,0 7.5660472,46.4644537,0 7.5661701,46.464399,0 + + + + #style-Tracks + + relativeToGround + 7.5661701,46.464399,0 7.566232,46.46429,0 7.5662324,46.4640747,0 7.566153,46.463848,0 7.5658337,46.4636438,0 7.5656605,46.4634444,0 7.5655755,46.463216,0 7.5656183,46.4631362,0 7.5658357,46.4630618,0 7.5667984,46.4630235,0 7.5669353,46.4631081,0 7.5670907,46.4632844,0 7.5673083,46.4635677,0 7.5677701,46.4639593,0 7.5677916,46.4643203,0 7.5678558,46.4645145,0 7.5681316,46.4648778,0 7.5682555,46.4648917,0 7.5682601,46.4647927,0 7.5682358,46.4644346,0 7.5683003,46.4641251,0 7.5683716,46.464057,0 7.5684816,46.4640586,0 7.5687293,46.4644566,0 7.5687758,46.4647994,0 7.568836,46.4649425,0 7.5690456,46.4651543,0 7.5692344,46.4655112,0 7.5691868,46.465725,0 7.569286,46.4658155,0 7.569435,46.465632,0 7.569508,46.465472,0 7.5695098,46.4652372,0 7.5695761,46.4650048,0 7.5695761,46.4646523,0 7.5696509,46.4645017,0 + + + + #style-Tracks + + relativeToGround + 7.4248311,46.4957794,0 7.4245438,46.4955981,0 7.4236484,46.495249,0 7.4234662,46.4949758,0 7.423193,46.4947178,0 7.4228743,46.4944901,0 7.42196,46.4940534,0 + + + + #style-Tracks + + relativeToGround + 7.5735275,46.4691135,0 7.57336,46.469298,0 7.573238,46.469411,0 7.5731997,46.4695416,0 7.573284,46.4697528,0 7.5733001,46.4698644,0 7.573262,46.469952,0 7.5731973,46.4700178,0 7.573187,46.470135,0 7.5732019,46.4702022,0 7.573187,46.470352,0 7.5732409,46.4705046,0 7.573242,46.4705791,0 7.5732157,46.470724,0 7.5733061,46.4708862,0 7.5734015,46.4709989,0 7.5735742,46.4710778,0 + + + + Hohliebeweg + #style-Tracks + + relativeToGround + 7.5733697,46.4768436,0 7.573353,46.476752,0 7.5733911,46.4766038,0 7.573493,46.476286,0 7.5734351,46.4760864,0 7.5733474,46.4760144,0 7.5732267,46.4758689,0 7.573313,46.47557,0 7.573431,46.475316,0 7.573552,46.475106,0 7.573604,46.474837,0 7.57359,46.4746865,0 7.573548,46.474581,0 7.5732579,46.4742404,0 7.5731951,46.4737075,0 7.5731212,46.4734883,0 7.5730983,46.4732924,0 7.5731432,46.4730867,0 7.5732774,46.472861,0 7.5734388,46.472535,0 7.5736016,46.4723781,0 7.5738331,46.4722663,0 7.5739683,46.4721113,0 7.5740242,46.4719814,0 7.573929,46.471627,0 7.5735742,46.4710778,0 + + + + #style-Tracks + + relativeToGround + 7.5733911,46.4766038,0 7.5737293,46.4768559,0 7.5738944,46.4769527,0 7.5740528,46.4769137,0 7.5742429,46.476773,0 + + + + #style-Tracks + + relativeToGround + 7.5751232,46.4803012,0 7.574269,46.480065,0 7.574085,46.480036,0 7.573709,46.479919,0 7.573569,46.479818,0 7.573342,46.479577,0 7.573053,46.47915,0 7.5729777,46.4790803,0 7.5728374,46.4790077,0 7.5727664,46.4789417,0 7.5727002,46.4787992,0 7.5726607,46.4787749,0 7.5726211,46.4788179,0 7.572565,46.4789796,0 7.5725895,46.4791432,0 7.572533,46.479272,0 7.572535,46.479423,0 7.572453,46.480005,0 7.5724148,46.4801166,0 7.572435,46.480232,0 7.5724691,46.4803328,0 7.5725689,46.4804525,0 + + + + #style-Tracks + + relativeToGround + 7.5740293,46.4894136,0 7.574015,46.489153,0 7.5741006,46.4890715,0 + + + + #style-Tracks + + relativeToGround + 7.5741006,46.4890715,0 7.574056,46.488667,0 7.57397,46.488541,0 7.573774,46.488517,0 7.57331,46.488254,0 7.573174,46.488224,0 + + + + #style-Tracks + + relativeToGround + 7.592367,46.5149672,0 7.5922017,46.5152686,0 + + + + #style-Tracks + + relativeToGround + 7.5463905,46.4726263,0 7.546366,46.472721,0 7.5463738,46.472813,0 7.5464139,46.4728843,0 7.546528,46.472992,0 + + + + #style-Tracks + + relativeToGround + 7.5477933,46.4743096,0 7.54757,46.474233,0 7.547457,46.474213,0 7.547301,46.474235,0 7.547152,46.474314,0 7.547062,46.474311,0 7.546977,46.474161,0 7.546801,46.473923,0 7.546706,46.47382,0 7.54664,46.473763,0 7.546483,46.473653,0 7.546253,46.47342,0 7.546126,46.47332,0 7.546031,46.473211,0 7.545932,46.473064,0 7.545876,46.472971,0 7.545769,46.472472,0 7.545809,46.472383,0 7.545972,46.472179,0 7.5460217,46.4721319,0 7.546117,46.472286,0 7.546154,46.472453,0 7.546266,46.472588,0 7.5463905,46.4726263,0 7.5464571,46.47259,0 7.5465039,46.4724999,0 7.5465251,46.472387,0 + + + + #style-Tracks + + relativeToGround + 7.550773,46.4757458,0 7.5506962,46.4757786,0 7.5505663,46.4760656,0 7.550485,46.4762,0 7.5501625,46.4766475,0 7.549997,46.476819,0 7.549832,46.476925,0 7.549748,46.476959,0 7.5494582,46.4770455,0 + + + + #style-Tracks + + relativeToGround + 7.5494582,46.4770455,0 7.5493221,46.4771051,0 7.5491396,46.4772255,0 7.548826,46.4773225,0 7.5486479,46.4774293,0 7.548434,46.477516,0 7.548247,46.477632,0 7.5479858,46.4777277,0 7.5476525,46.4777526,0 + + + + #style-Tracks + + relativeToGround + 7.5788121,46.4963841,0 7.578966,46.4963599,0 7.5790202,46.4963178,0 7.579056,46.496135,0 7.5789867,46.4959231,0 7.5790707,46.495913,0 7.5793381,46.4961651,0 7.5795192,46.4962795,0 7.579574,46.496281,0 7.5795861,46.4962396,0 7.5795507,46.496092,0 7.5795179,46.4960341,0 7.5795848,46.495996,0 7.5797434,46.4960857,0 7.5799401,46.4961536,0 7.580077,46.496183,0 7.58027,46.496287,0 7.5803426,46.4962898,0 7.5803678,46.4962349,0 7.5802526,46.496084,0 7.5801532,46.4959733,0 7.580083,46.495718,0 7.579987,46.4956342,0 7.5798442,46.4954093,0 7.5797401,46.4953337,0 + + + + #style-Tracks + + relativeToGround + 7.551122,46.463773,0 7.5510751,46.4639061,0 7.551126,46.464136,0 7.551157,46.46429,0 7.551131,46.464488,0 7.551011,46.464817,0 7.5511177,46.4651568,0 7.551141,46.465532,0 7.551148,46.465689,0 7.551205,46.465825,0 7.551178,46.465985,0 7.551117,46.466111,0 7.55102,46.466282,0 7.5509148,46.4667058,0 7.5508464,46.4667767,0 7.55076,46.466756,0 7.550766,46.466644,0 7.550804,46.466472,0 7.550801,46.46641,0 7.550818,46.466297,0 7.550888,46.46611,0 7.5508992,46.4659542,0 7.5507243,46.4657912,0 7.550437,46.465633,0 7.550125,46.465271,0 7.550097,46.4651635,0 7.549923,46.46466,0 7.549876,46.464615,0 7.549742,46.46452,0 7.549705,46.464381,0 7.5496948,46.4642671,0 7.549453,46.463839,0 7.549126,46.463452,0 7.548957,46.463311,0 7.548793,46.463125,0 7.548655,46.462876,0 7.548514,46.462743,0 7.548238,46.462601,0 7.548131,46.462514,0 7.548045,46.462474,0 7.547837,46.462405,0 7.547614,46.462349,0 7.5474366,46.4622477,0 7.547348,46.462173,0 7.547249,46.462054,0 7.547227,46.461882,0 7.547246,46.461712,0 7.547194,46.461545,0 7.546998,46.461234,0 7.546996,46.460975,0 7.546968,46.460886,0 7.5467453,46.4607696,0 7.5466425,46.4607158,0 + + + + #style-Tracks + + relativeToGround + 7.5324614,46.4521053,0 7.5326827,46.452079,0 7.532898,46.452116,0 7.5330862,46.4521987,0 7.5332827,46.4523798,0 7.533559,46.452494,0 7.534264,46.452695,0 7.5346068,46.4526309,0 7.5347041,46.4526012,0 + + + + #style-Tracks + + relativeToGround + 7.5505555,46.461797,0 7.5503452,46.461619,0 7.550283,46.461427,0 7.550137,46.4612643,0 7.549677,46.4609514,0 7.5496432,46.4608955,0 + + + + #style-Tracks + + relativeToGround + 7.5525656,46.4936365,0 7.5528161,46.4936972,0 7.5529717,46.4937895,0 7.5532023,46.4938745,0 7.5533579,46.4938597,0 7.5536959,46.4937378,0 7.5540177,46.4937341,0 7.5542269,46.4937489,0 7.5543128,46.4938375,0 7.5542538,46.4939262,0 7.5540499,46.494133,0 7.5538943,46.4943583,0 7.5538032,46.494602,0 7.5537978,46.4948273,0 7.553771,46.4950525,0 7.5538192,46.4951855,0 7.5540445,46.4955289,0 7.554184,46.4957985,0 7.5543771,46.4960496,0 7.554581,46.4961826,0 7.5548278,46.4962638,0 7.5550262,46.4962564,0 7.5551872,46.4962786,0 7.5552623,46.4963451,0 7.5553696,46.4965592,0 7.5554768,46.4968325,0 7.5555734,46.4971981,0 7.5556592,46.497416,0 7.5556592,46.4975489,0 7.5555466,46.4976892,0 7.5553588,46.4978997,0 7.5553213,46.4980807,0 7.5553427,46.4981656,0 7.5554339,46.4981804,0 7.5557343,46.4981656,0 + + + + Dauberhorn - Gemmibahn + #style-Tracks + + relativeToGround + 7.6026829,46.3875479,0 7.602328,46.387297,0 7.6021778,46.3868011,0 7.6021457,46.3865273,0 7.6018452,46.3866235,0 7.6017809,46.3864903,0 7.6014697,46.3864385,0 7.6010835,46.3865347,0 7.60059,46.3866605,0 7.6001286,46.3867049,0 7.5997639,46.3868011,0 7.5994205,46.3868603,0 7.5989592,46.3867715,0 7.5984335,46.3867789,0 7.5978219,46.3869047,0 7.5970387,46.3870009,0 7.5962984,46.3870824,0 7.5958693,46.3873858,0 7.5956869,46.3876152,0 7.5957298,46.3879926,0 7.5956976,46.3883034,0 7.5950539,46.3883404,0 7.5943029,46.3885476,0 7.5939166,46.388666,0 7.5934124,46.3888807,0 7.5931978,46.3890657,0 7.5930369,46.3890805,0 7.5928438,46.3893247,0 7.5926292,46.3895171,0 7.5924468,46.3896281,0 7.5925433,46.3898279,0 7.5926506,46.3901091,0 7.5927043,46.3904791,0 7.5915885,46.3912709,0 7.591095,46.3912339,0 7.5907302,46.3909897,0 7.5902152,46.3909083,0 7.5895822,46.3908121,0 7.5890779,46.3908935,0 7.5887668,46.3911895,0 7.5887132,46.3913375,0 7.5882947,46.3914855,0 7.5875437,46.3916927,0 7.5872004,46.3918111,0 7.5868034,46.3919887,0 7.5864494,46.3920775,0 7.5863099,46.3922477,0 7.5848937,46.3921071,0 7.5844216,46.3922773,0 7.5837564,46.3924919,0 7.5830698,46.3926251,0 7.5825977,46.3927657,0 7.5824904,46.3930691,0 7.582587,46.3933725,0 7.5828123,46.3936093,0 7.5831878,46.3937499,0 7.5833809,46.3940088,0 7.5835955,46.394364,0 7.5840139,46.3947192,0 7.5842285,46.3949264,0 7.5844109,46.3950966,0 + + + + #style-Tracks + + relativeToGround + 7.4800756,46.5665507,0 7.4797926,46.5665166,0 7.4796178,46.5666915,0 7.4795866,46.567193,0 + + + + #style-Tracks + + relativeToGround + 7.4854834,46.5161258,0 7.4855385,46.5162773,0 7.4860047,46.516287,0 7.4862334,46.5162894,0 7.4863353,46.5163123,0 7.4863709,46.516376,0 7.4863073,46.5165008,0 7.4861876,46.516595,0 7.4859915,46.5169922,0 7.4858387,46.5171984,0 7.4857878,46.5173207,0 7.4856325,46.5174683,0 7.4855638,46.517476,0 7.485551,46.517504,0 7.4855638,46.5175778,0 7.4855638,46.517644,0 7.4854939,46.5177249,0 7.485479,46.5178293,0 7.4854094,46.5178741,0 7.48529,46.5179586,0 7.4852304,46.5180432,0 7.4851856,46.518073,0 7.4851508,46.5181625,0 7.4850513,46.518267,0 7.4849668,46.5183863,0 7.4849469,46.5185057,0 7.4849767,46.51863,0 7.4850463,46.5187444,0 7.4851309,46.5188389,0 7.4850762,46.5189035,0 7.4850165,46.5189334,0 7.4847927,46.5189682,0 7.4847032,46.5190129,0 7.4846684,46.5190676,0 7.4846187,46.5193412,0 7.4846734,46.5194357,0 7.4847032,46.5195848,0 7.4847281,46.5197092,0 7.4847032,46.5198982,0 7.4845988,46.5200026,0 7.4843849,46.5200722,0 7.4843799,46.5201369,0 7.4847529,46.5200871,0 7.4848822,46.5200374,0 7.4849668,46.5199429,0 7.4854691,46.5197042,0 7.485847,46.5197092,0 7.4863394,46.5197689,0 7.4866477,46.5197539,0 7.4868615,46.5196445,0 7.4869113,46.51956,0 7.4869361,46.5193412,0 7.4869859,46.5192467,0 7.4872097,46.5190577,0 7.4877169,46.5187991,0 7.4883535,46.5185405,0 7.4886569,46.5185355,0 7.4888409,46.5185057,0 7.4893133,46.5182371,0 7.4898007,46.518068,0 7.4903527,46.5178791,0 7.490661,46.5178293,0 7.4906511,46.5179039,0 7.4905417,46.5179735,0 7.4904273,46.5181774,0 7.4903079,46.5183664,0 7.4901438,46.5186549,0 7.4898255,46.5192914,0 7.4897708,46.5196296,0 7.4894476,46.5202562,0 7.4894128,46.5204949,0 7.4894526,46.5207834,0 7.4894277,46.5209176,0 7.4892984,46.5213304,0 7.4891591,46.5213951,0 7.4891392,46.5214547,0 7.4892089,46.5214846,0 7.4895669,46.5214199,0 7.4901388,46.5213056,0 7.490472,46.5212956,0 7.4908351,46.5212508,0 7.4912976,46.5212011,0 7.4914169,46.5212857,0 7.4918049,46.5213304,0 7.4919292,46.5213851,0 7.4920336,46.5215194,0 + + + + #style-Tracks + + relativeToGround + 7.4021735,46.5042278,0 7.4022338,46.5039567,0 7.4030306,46.5030461,0 7.4037515,46.5022493,0 7.4056866,46.5010162,0 7.4058004,46.5007506,0 7.4059332,46.4997451,0 7.4060281,46.4994985,0 7.406692,46.499195,0 7.4082666,46.4986638,0 7.4103534,46.4975065,0 7.4132181,46.495894,0 7.4147413,46.4949366,0 7.4158357,46.4942866,0 7.4175094,46.4931639,0 7.4190972,46.4920117,0 7.4198912,46.4915094,0 7.4200628,46.4913764,0 7.420213,46.4910662,0 7.4206636,46.4907264,0 7.4214576,46.4903571,0 7.4219511,46.4900912,0 7.4222944,46.4897809,0 7.4230025,46.4897514,0 7.4239037,46.4894116,0 7.4249123,46.4888355,0 7.4254272,46.4882593,0 7.4258779,46.4874467,0 7.426071,46.4870331,0 7.4261353,46.485925,0 7.4260066,46.4852306,0 7.4258564,46.4843146,0 7.4257277,46.483561,0 7.4256418,46.4830439,0 7.425556,46.4822756,0 7.4257277,46.4817141,0 7.4258993,46.4813891,0 7.4261139,46.4812709,0 7.4263714,46.4811675,0 7.4265645,46.4809458,0 7.4266932,46.480606,0 7.4266932,46.4802514,0 7.426543,46.4798229,0 7.4264787,46.4794387,0 7.426822,46.4788476,0 7.4272511,46.47836,0 7.4274872,46.4778576,0 7.4276803,46.4774587,0 7.4279378,46.4770301,0 7.4280236,46.4764982,0 7.4280486,46.4762655,0 7.4280665,46.4760992,0 7.4282269,46.4757891,0 + + + + #style-Tracks + + relativeToGround + 7.5590626,46.4870252,0 7.5596203,46.4873634,0 7.5598972,46.487543,0 + + + + #style-Tracks + + relativeToGround + 7.42196,46.4940534,0 7.4214143,46.4939178,0 7.4213342,46.4938979,0 7.4209566,46.4938507,0 7.4206648,46.4939098,0 7.4203558,46.494022,0 7.4195919,46.4942879,0 7.4191112,46.4943588,0 7.4184675,46.4944416,0 7.4180469,46.4945775,0 7.4175132,46.4950208,0 + + + + #style-Tracks + + relativeToGround + 7.4262468,46.4595065,0 7.4262361,46.4592922,0 7.4262361,46.4590705,0 7.4262468,46.4587453,0 7.4261824,46.4585088,0 7.4257425,46.4580062,0 + + + + #style-Tracks + + relativeToGround + 7.4528183,46.5206213,0 7.4518921,46.5203291,0 7.4515129,46.5200991,0 7.4509055,46.5198462,0 7.4505617,46.5197602,0 7.4499281,46.5196986,0 7.4496551,46.5195907,0 7.4494311,46.5194705,0 7.4490583,46.5193646,0 7.4486957,46.5192179,0 7.4482353,46.5189694,0 7.4478544,46.5188064,0 7.4475591,46.5187391,0 7.4471488,46.5186023,0 7.4469498,46.5184034,0 7.4465396,46.5182355,0 7.4459925,46.5180117,0 7.4456879,46.5179496,0 7.4451533,46.5175952,0 7.444426,46.5172906,0 7.4441524,46.5170979,0 7.4437608,46.5165882,0 7.443077,46.5160473,0 7.4429775,46.5158546,0 7.4426046,46.5155873,0 7.4424367,46.51532,0 7.4417405,46.5148414,0 7.4415602,46.5144995,0 7.4413488,46.5142321,0 7.4411126,46.513424,0 7.4407645,46.513051,0 7.4405096,46.5126905,0 7.440437,46.5125172,0 7.4399804,46.5119635,0 7.4394754,46.5115556,0 7.439116,46.5109922,0 7.4387663,46.5104289,0 7.4387469,46.5101957,0 7.4386789,46.5098266,0 7.4385332,46.5094964,0 7.4384361,46.5092438,0 7.4386206,46.5089039,0 7.4385138,46.5086416,0 7.4384069,46.5082725,0 7.438572,46.507952,0 7.4387954,46.5077286,0 7.438504,46.5076023,0 7.4381641,46.5073109,0 7.4378824,46.506835,0 7.4375813,46.5061259,0 7.4372316,46.5051255,0 7.4373967,46.5046204,0 7.4378533,46.504057,0 7.4381641,46.5035228,0 7.4382224,46.5033285,0 7.4385915,46.5029011,0 7.4395434,46.5021144,0 7.4396599,46.5018327,0 7.4397085,46.5013179,0 7.4400193,46.5009779,0 7.4410198,46.5002689,0 7.4410459,46.5001952,0 + + + + Hörnliweg + #style-Tracks + + relativeToGround + 7.5634771,46.498246,0 7.563543,46.498316,0 7.5638087,46.4985406,0 7.5638266,46.4989595,0 7.5643825,46.4994173,0 7.5647636,46.4997905,0 7.5650245,46.5000946,0 7.5652805,46.5002911,0 7.565369,46.500541,0 7.5654359,46.5006704,0 7.5654456,46.5007267,0 7.565494,46.5008679,0 + + + + #style-Tracks + + relativeToGround + 7.5704442,46.5055077,0 7.5702808,46.5053663,0 7.5701857,46.5052743,0 7.5700595,46.505126,0 7.5699587,46.5049793,0 7.5697775,46.5047638,0 7.5696764,46.5046204,0 7.5696176,46.5045153,0 7.569522,46.504287,0 7.5693937,46.504028,0 7.5693182,46.5038638,0 7.5692352,46.5036487,0 7.5691654,46.5034532,0 7.5690593,46.5033257,0 7.5688693,46.5031471,0 7.568744,46.5029817,0 7.5687151,46.5029089,0 7.5686907,46.5028223,0 + + + + #style-Tracks + + relativeToGround + 7.4293897,46.4761015,0 7.4294959,46.4760031,0 7.4295844,46.47592,0 7.4297078,46.4758018,0 7.429925,46.4756596,0 7.4300725,46.4755229,0 7.4302362,46.475316,0 7.4303756,46.4750833,0 7.4304722,46.4749115,0 7.4305178,46.4747323,0 7.4306707,46.4745217,0 7.4308584,46.4742853,0 7.4311427,46.4740562,0 7.431352,46.4738216,0 7.4314887,46.4735446,0 7.431588,46.4733063,0 7.431706,46.4730477,0 7.4317516,46.4728703,0 + + + + #style-Tracks + + relativeToGround + 7.4268244,46.4763947,0 7.4269585,46.4764612,0 7.4271248,46.4764871,0 7.4273876,46.4764354,0 7.4276022,46.4763578,0 7.4277363,46.4762802,0 7.4278812,46.4762507,0 7.4280486,46.4762655,0 + + + + #style-Tracks + + relativeToGround + 7.4340985,46.4707201,0 7.434238,46.4705945,0 7.4344365,46.4703802,0 7.4346457,46.4702213,0 7.4350534,46.4703728,0 7.4353769,46.4704585,0 + + + + #style-Tracks + + relativeToGround + 7.4353769,46.4704585,0 7.435482,46.4704761,0 7.4355162,46.4704903,0 7.4356185,46.4705018,0 7.4364604,46.4704052,0 7.4370811,46.4707552,0 + + + + #style-Tracks + + relativeToGround + 7.5318629,46.4633692,0 7.5317263,46.4629743,0 7.5313508,46.4623387,0 7.5311041,46.4613854,0 7.5310075,46.4608607,0 7.5306964,46.4603581,0 7.5305891,46.4600477,0 7.5305462,46.4596042,0 7.5303852,46.4589982,0 7.5299883,46.4585769,0 7.5287008,46.4575126,0 7.5283682,46.4569361,0 7.5281322,46.4561453,0 7.5281429,46.4557461,0 7.5282287,46.4554727,0 7.5285399,46.4551622,0 7.5292158,46.4544453,0 7.5298273,46.4542235,0 7.530396,46.4541053,0 7.530632,46.4540535,0 7.5307286,46.4539279,0 7.5307071,46.4537948,0 7.5306427,46.4537061,0 7.5304389,46.4537357,0 7.5303101,46.4538096,0 7.5301814,46.4537357,0 7.5301063,46.4535435,0 7.5301385,46.4533218,0 7.5303423,46.4529891,0 7.5306642,46.4528857,0 7.5310719,46.4528931,0 7.5316191,46.4528487,0 7.5320053,46.4529004,0 7.532413,46.4530113,0 7.5328314,46.4530852,0 7.5330996,46.4530409,0 7.5331318,46.4528931,0 7.5329602,46.4526639,0 7.5328207,46.4524274,0 7.5326383,46.4522352,0 7.5324614,46.4521053,0 7.5322521,46.4520652,0 7.532016,46.4518508,0 7.5318658,46.4516512,0 7.531544,46.4512817,0 7.531029,46.4509564,0 7.5306213,46.4507494,0 7.5297415,46.450269,0 7.5292051,46.4499881,0 7.5288319,46.4496296,0 7.5282717,46.4492858,0 7.5278318,46.4490788,0 7.5274455,46.4489384,0 7.5270724,46.4487277,0 7.526555,46.4485983,0 7.5261903,46.4484875,0 7.5257504,46.4481844,0 7.5251519,46.4476484,0 7.5248921,46.447423,0 7.5246775,46.4471938,0 7.5244844,46.4471568,0 7.5242483,46.4472677,0 7.5241303,46.4473343,0 7.5239265,46.4473416,0 7.5236046,46.4472899,0 7.5233042,46.4472382,0 7.5229716,46.4472455,0 7.5226712,46.4472899,0 7.5224674,46.447386,0 7.5219416,46.4476152,0 + + + + #style-Tracks + + relativeToGround + 7.5388594,46.4323326,0 7.5392281,46.4322406,0 7.5397646,46.4321519,0 7.540065,46.4321667,0 7.54058,46.4322406,0 7.5410091,46.4322998,0 7.5412666,46.4325068,0 7.5416314,46.4326695,0 7.5418889,46.432773,0 7.5421035,46.43298,0 7.5425326,46.4332462,0 7.5428974,46.4333645,0 7.5433695,46.4334385,0 7.5435626,46.4335568,0 7.5439917,46.4337934,0 7.5445067,46.434104,0 7.5450861,46.4343406,0 7.5456225,46.4346364,0 7.5460088,46.4347842,0 7.5463306,46.4348434,0 7.5465452,46.4349173,0 7.5468671,46.4350356,0 7.5471889,46.4350208,0 7.5475323,46.4350356,0 7.5481116,46.4351539,0 7.5486051,46.4353314,0 7.5489914,46.4354793,0 7.5493562,46.4356567,0 7.5496351,46.435775,0 7.5499784,46.4358342,0 7.5503003,46.4357455,0 7.5506222,46.4355532,0 7.5507938,46.435361,0 7.5510942,46.435287,0 7.5513732,46.4353314,0 7.5516521,46.4355384,0 7.5519955,46.4357011,0 7.5523817,46.435775,0 7.5533044,46.4360264,0 7.5539696,46.4361891,0 7.5545275,46.4362335,0 7.5549352,46.436337,0 7.5550639,46.4365144,0 7.5549827,46.4367111,0 + + + + Gemmistrasse + #style-Tracks + + relativeToGround + 7.6237311,46.3837753,0 7.6234774,46.3838704,0 7.622544,46.3843698,0 7.6219235,46.3846108,0 7.6214367,46.3853915,0 7.6206176,46.3859502,0 7.6201284,46.3864565,0 7.6198804,46.3866291,0 7.6195346,46.3874896,0 7.6197172,46.3877987,0 7.6196075,46.3879736,0 7.6189509,46.3878995,0 7.6184904,46.3879967,0 7.6186038,46.3882094,0 7.6188989,46.3883671,0 7.6192004,46.3885456,0 7.619828,46.3888194,0 7.6202518,46.3889822,0 7.6205629,46.3889933,0 7.6210833,46.3890969,0 7.6215929,46.3890747,0 7.6224029,46.3887047,0 7.6229286,46.3884716,0 7.6235295,46.3881904,0 7.6238352,46.3880831,0 7.6242107,46.3883125,0 7.62461,46.3883714,0 + + + + Bütscheggenweg + #style-Tracks + + relativeToGround + 7.5645004,46.5024523,0 7.5643032,46.5024079,0 7.5642002,46.5024009,0 7.5639082,46.5024017,0 7.563623,46.502347,0 7.5633927,46.5022879,0 7.5632576,46.5022067,0 7.563109,46.5020934,0 7.563005,46.50203,0 7.562912,46.501915,0 7.5628685,46.5017841,0 7.562789,46.5017139,0 7.5625977,46.5016474,0 + + + + Bütscheggenweg + #style-Tracks + + relativeToGround + 7.5658571,46.5029369,0 7.565378,46.502792,0 7.5652788,46.5027476,0 7.5650875,46.5026587,0 7.5648487,46.5025808,0 7.5645004,46.5024523,0 + + + + #style-Tracks + + relativeToGround + 7.5883223,46.5173041,0 7.5883922,46.5173254,0 7.588884,46.51737,0 7.589137,46.517445,0 7.589223,46.517428,0 7.5892426,46.5172029,0 7.589195,46.517181,0 7.589143,46.517165,0 7.588956,46.517047,0 7.588803,46.516895,0 7.588737,46.516809,0 7.588709,46.516743,0 7.5886797,46.5165501,0 + + + + #style-Tracks + + relativeToGround + 7.5879633,46.5171897,0 7.5882182,46.5172418,0 7.5883223,46.5173041,0 7.5884541,46.5174144,0 7.588621,46.517648,0 7.588713,46.51781,0 7.588762,46.517866,0 7.58888,46.517958,0 7.588934,46.518028,0 7.58896,46.518155,0 7.589031,46.518301,0 7.589079,46.518323,0 7.5892056,46.5183555,0 7.589288,46.518439,0 + + + + #style-Tracks + + relativeToGround + 7.5826523,46.4989336,0 7.5825898,46.4990355,0 7.5826343,46.4991879,0 7.5826984,46.499309,0 7.582719,46.499403,0 7.5828014,46.4995759,0 7.582807,46.499739,0 7.5828446,46.4998144,0 7.5829721,46.4999336,0 7.58306,46.5000875,0 7.583046,46.500152,0 7.582917,46.500426,0 7.5826608,46.5005706,0 7.5823436,46.5007509,0 7.5822184,46.50073,0 7.5820124,46.5005653,0 7.5818994,46.5004572,0 + + + + #style-Tracks + + relativeToGround + 7.578672,46.5205961,0 7.5787651,46.520547,0 7.5788446,46.5204993,0 7.578937,46.520553,0 7.5793743,46.5206724,0 7.579642,46.520806,0 7.579854,46.520889,0 7.580014,46.520939,0 7.580248,46.520982,0 7.580479,46.520835,0 7.580655,46.520778,0 7.581053,46.520755,0 7.581774,46.520671,0 7.581938,46.520619,0 7.582083,46.520557,0 7.582782,46.520178,0 7.5828672,46.5200806,0 7.582853,46.519966,0 7.582691,46.5197745,0 + + + + #style-Tracks + + relativeToGround + 7.5785017,46.5014825,0 7.5782187,46.5013039,0 7.5773506,46.5011965,0 + + + + #style-Tracks + + relativeToGround + 7.5543278,46.5106844,0 7.552418,46.510272,0 7.552234,46.510298,0 7.5518293,46.510394,0 7.551497,46.510395,0 7.5511102,46.5103357,0 7.5504234,46.5103985,0 7.5498621,46.5103121,0 7.5489084,46.5104103,0 7.547537,46.510344,0 7.547371,46.510243,0 7.5472993,46.5100845,0 7.547166,46.509991,0 7.5470386,46.5099552,0 + + + + #style-Tracks + + relativeToGround + 7.5665772,46.5111305,0 7.5661335,46.5110512,0 7.565676,46.511024,0 7.564624,46.510737,0 7.5637674,46.5108027,0 7.5627058,46.5109232,0 7.5620088,46.5104446,0 7.5618541,46.5104123,0 7.5611605,46.5106807,0 7.5608878,46.5107049,0 7.5601998,46.5106693,0 7.5595979,46.5109139,0 7.5590547,46.5110383,0 7.558377,46.511309,0 7.5576766,46.5114214,0 7.557316,46.511429,0 7.5558858,46.5107802,0 7.5548832,46.5106228,0 7.5543278,46.5106844,0 + + + + #style-Tracks + + relativeToGround + 7.5572602,46.5039626,0 7.5565998,46.5037653,0 7.556337,46.503737,0 7.5561181,46.5036637,0 7.555636,46.503467,0 7.5542456,46.5027933,0 7.553992,46.502666,0 7.55387,46.502572,0 7.553751,46.5024,0 7.553569,46.502294,0 7.552955,46.502105,0 7.552762,46.501995,0 7.552663,46.50191,0 7.552167,46.501397,0 7.551822,46.501019,0 7.551661,46.500913,0 7.551534,46.500853,0 7.551234,46.500736,0 7.550892,46.500652,0 7.550273,46.500621,0 7.549463,46.500519,0 7.548911,46.500354,0 7.548753,46.500326,0 7.548575,46.500277,0 7.548373,46.500246,0 7.547924,46.500091,0 7.547575,46.499861,0 7.5472465,46.4995287,0 7.546982,46.499337,0 7.5461074,46.4989712,0 7.5459336,46.498931,0 7.5457608,46.498928,0 7.545644,46.4989186,0 + + + + #style-Tracks + + relativeToGround + 7.5470386,46.5099552,0 7.546909,46.50992,0 7.546808,46.509814,0 7.546857,46.509759,0 7.547272,46.509792,0 7.547587,46.509838,0 7.547864,46.509808,0 7.5484138,46.5095411,0 7.548895,46.509268,0 7.5490654,46.5092289,0 7.549337,46.509187,0 7.549454,46.509095,0 7.549336,46.509014,0 7.548898,46.509065,0 7.5486376,46.5090759,0 7.5473181,46.5086821,0 7.5471077,46.5085813,0 7.546657,46.508168,0 7.546354,46.508088,0 7.5457686,46.5080083,0 7.545412,46.507947,0 7.5453714,46.5078755,0 7.545397,46.507821,0 7.545586,46.507789,0 7.545796,46.507852,0 7.5459958,46.5078633,0 7.5462241,46.5078289,0 7.5471737,46.5073725,0 7.547784,46.507391,0 7.5479861,46.5073411,0 7.5484178,46.5072077,0 7.5490615,46.507294,0 7.5496816,46.5071724,0 7.55049,46.507205,0 7.5510042,46.5071606,0 7.5518441,46.5068113,0 7.5523092,46.5067029,0 7.5526955,46.5066625,0 7.5531485,46.5066932,0 7.553226,46.506592,0 7.5530968,46.5065076,0 7.552063,46.506265,0 7.5516405,46.5060492,0 7.551345,46.505969,0 7.5511689,46.5059586,0 7.5508777,46.5059993,0 7.550618,46.5059837,0 7.5502813,46.5058175,0 7.5500701,46.5055161,0 7.550038,46.505387,0 7.550148,46.505321,0 7.550443,46.505316,0 7.5508943,46.5054926,0 7.551208,46.5055229,0 7.5522791,46.5054416,0 7.5525466,46.5054651,0 7.5526722,46.505418,0 7.5527,46.505346,0 7.552515,46.505299,0 7.552095,46.505311,0 7.5511044,46.5049005,0 7.5509361,46.5047297,0 7.5506706,46.5043701,0 7.5503646,46.5043215,0 7.549279,46.504364,0 7.5488652,46.504323,0 7.5486825,46.5042853,0 7.548669,46.5042092,0 7.5487161,46.5041464,0 7.5494069,46.5041857,0 7.550184,46.50395,0 7.5507692,46.5038245,0 7.5512873,46.5038139,0 7.5524549,46.5039821,0 7.5532009,46.5040121,0 7.5546574,46.5041122,0 7.5555299,46.5041995,0 7.5566327,46.5042191,0 7.557042,46.504217,0 7.5572457,46.5041657,0 7.557353,46.504123,0 7.5574117,46.5040674,0 7.557406,46.5040271,0 7.5572602,46.5039626,0 + + + + #style-Tracks + + relativeToGround + 7.6155446,46.4496036,0 7.6158266,46.4496374,0 7.6163109,46.4496955,0 7.6171772,46.4499824,0 7.61826,46.4503153,0 7.6194595,46.4502464,0 7.6204757,46.4507399,0 7.621342,46.4512335,0 7.6221583,46.4518188,0 7.6229818,46.4535272,0 7.6229158,46.4551282,0 7.6233595,46.4571271,0 7.6247231,46.458704,0 7.6254607,46.4588344,0 7.6255846,46.458493,0 7.6262756,46.458691,0 7.6262981,46.459034,0 7.627519,46.4599796,0 7.6276489,46.4609378,0 7.6285887,46.4615968,0 7.6286387,46.4621247,0 7.6291384,46.4623542,0 7.6290218,46.4626755,0 7.6293217,46.4633181,0 7.6295049,46.4646607,0 7.6298548,46.4655902,0 7.6306877,46.467013,0 7.6310876,46.4674031,0 7.6317373,46.4675179,0 7.6327368,46.4678736,0 7.6337197,46.4684702,0 7.6346693,46.4691128,0 7.6356855,46.4702257,0 7.6365351,46.4709715,0 7.6373014,46.4713042,0 7.6380844,46.4719926,0 7.6395504,46.4729908,0 + + + + #style-Tracks + + relativeToGround + 7.617833,46.5283281,0 7.6175991,46.528688,0 7.6175883,46.5289759,0 7.6181999,46.529559,0 7.6185325,46.5300831,0 7.6184037,46.5301495,0 7.6178136,46.5297366,0 7.617009,46.5297288,0 7.6164189,46.5295295,0 7.6158824,46.5295295,0 7.6157644,46.5297288,0 7.6158932,46.5301274,0 7.6163545,46.5303713,0 7.6167086,46.5307105,0 7.6170658,46.5311194,0 + + + + #style-Tracks + + relativeToGround + 7.6109659,46.5266158,0 7.6117361,46.526354,0 7.6118901,46.5263694,0 7.6118131,46.5265542,0 7.6112585,46.5273552,0 7.6113048,46.5275554,0 7.6121982,46.5271857,0 7.6127681,46.5270625,0 7.6129553,46.5269559,0 + + + + #style-Tracks + + relativeToGround + 7.5189956,46.4843231,0 7.5190332,46.4840125,0 7.518926,46.4835988,0 7.518132,46.4833772,0 7.5167158,46.482934,0 7.5166944,46.4827123,0 7.5173166,46.482343,0 7.5171235,46.4822395,0 7.5169079,46.4822839,0 7.5161794,46.4823282,0 7.5153211,46.4821213,0 7.5151279,46.4820031,0 7.5148061,46.4812791,0 7.5132611,46.4802153,0 7.5121453,46.4796981,0 7.5121882,46.4795356,0 7.5129178,46.4798459,0 7.513304,46.479905,0 7.5146559,46.4803335,0 7.5159648,46.4805551,0 7.5169304,46.4809541,0 7.5174883,46.4808802,0 7.5181964,46.4809393,0 7.5186041,46.4813235,0 7.5194839,46.481486,0 7.5195482,46.4816337,0 7.5202778,46.4815303,0 7.5212402,46.481257,0 7.5217584,46.4814417,0 7.5225738,46.4816485,0 7.5231102,46.4815155,0 7.5235179,46.4811905,0 7.5247624,46.4810279,0 7.5264791,46.4803187,0 7.5276163,46.4792548,0 7.5279596,46.4786638,0 7.5284746,46.478383,0 7.5281742,46.4782501,0 7.5278953,46.478383,0 7.5264361,46.4787524,0 7.5253418,46.4787377,0 7.5242904,46.4786786,0 7.5232604,46.4786786,0 7.5222734,46.4785308,0 7.5212852,46.4786933,0 7.5198573,46.4781924,0 7.5196984,46.4778806,0 7.5187543,46.4780727,0 7.517896,46.4772305,0 7.5171021,46.476669,0 7.516351,46.4764621,0 7.5160292,46.4753686,0 7.5151923,46.4750886,0 7.5149348,46.4745854,0 7.5143555,46.4742307,0 7.5140551,46.4737578,0 7.5129393,46.4733293,0 7.5126818,46.4727382,0 7.512832,46.4725165,0 7.5127247,46.4723096,0 7.5120166,46.4720141,0 7.5119522,46.4717037,0 7.5114158,46.471482,0 7.5114587,46.470551,0 7.5113085,46.470152,0 7.5127676,46.4702998,0 7.5131538,46.4700633,0 7.5143984,46.4702259,0 7.5149134,46.4701232,0 7.5149527,46.4698298,0 + + + + #style-Tracks + + relativeToGround + 7.580325,46.5027273,0 7.580134,46.5028204,0 7.5799106,46.5029702,0 7.5795711,46.5032229,0 7.579505,46.50336,0 7.5794962,46.5034404,0 + + + + #style-Tracks + + relativeToGround + 7.5887308,46.5121362,0 7.5878146,46.5121861,0 7.5875342,46.512005,0 + + + + #style-Tracks + + relativeToGround + 7.5486892,46.4843265,0 7.5482932,46.4846238,0 + + + + #style-Tracks + + relativeToGround + 7.5452866,46.4835281,0 7.5445192,46.4833872,0 + + + + #style-Tracks + + relativeToGround + 7.5439543,46.4836822,0 7.5442929,46.4838529,0 7.5444163,46.4839361,0 7.5444886,46.4839589,0 7.544905,46.4840167,0 7.5455029,46.4842106,0 + + + + #style-Tracks + + relativeToGround + 7.5482932,46.4846238,0 7.5469389,46.4843438,0 7.546616,46.484368,0 7.546398,46.4842227,0 7.5456648,46.4841873,0 7.5455029,46.4842106,0 7.5451848,46.4842565,0 7.5450642,46.484286,0 + + + + #style-Tracks + + relativeToGround + 7.57139,46.4855698,0 7.5712639,46.4854836,0 7.571188,46.4854049,0 7.571083,46.4852752,0 7.5710397,46.4852471,0 7.5708579,46.4851424,0 7.5702202,46.4846207,0 7.5699875,46.4843914,0 7.5697506,46.4843808,0 + + + + + Winter_Hiking + + + + Summer_Hiking + + + Haselweg + Haselweg, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5647157,46.4954991,0 7.5652338,46.4952461,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5654624,46.4590852,0 7.5657857,46.4590406,0 7.5660894,46.4588054,0 7.5661792,46.4586043,0 7.5661147,46.4582042,0 7.5662091,46.4580919,0 7.5662434,46.4579559,0 7.565883,46.4574237,0 7.5652732,46.457071,0 7.5649731,46.4568975,0 7.5644095,46.4567614,0 7.5638831,46.4564126,0 7.5632094,46.4558142,0 7.5631766,46.4555546,0 7.5628849,46.4551459,0 7.562303,46.4547165,0 7.5619564,46.454653,0 7.561394,46.4546978,0 7.5610892,46.4543912,0 7.5610362,46.4541518,0 7.5607503,46.4539705,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.569223,46.5076089,0 7.5689582,46.5076903,0 7.5679113,46.5074419,0 7.5678265,46.5072529,0 7.56764,46.5072284,0 7.5673403,46.507312,0 7.567078,46.50724,0 7.5666536,46.5072812,0 7.5655643,46.5070497,0 7.5654691,46.5069622,0 7.5645959,46.5067976,0 7.5646229,46.5066189,0 7.5643876,46.5063719,0 7.5638487,46.5060826,0 7.5636134,46.506044,0 7.5635323,46.5059295,0 7.5622206,46.5058099,0 7.5617203,46.5055797,0 7.5615608,46.5056736,0 7.5614142,46.5054717,0 7.561247,46.5055566,0 7.5606426,46.5053148,0 7.5602722,46.5052865,0 7.5589439,46.5043505,0 7.5585357,46.5043073,0 7.5582688,46.5040954,0 7.557406,46.5040271,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6155345,46.3998258,0 7.6153734,46.4003914,0 7.6157251,46.4016849,0 7.6155493,46.4025742,0 7.6149472,46.4029894,0 7.6144356,46.4033422,0 7.6127356,46.4038677,0 7.6115633,46.4035443,0 7.6120396,46.4045298,0 7.6123253,46.4051208,0 7.613146,46.4064546,0 7.613439,46.408031,0 7.61467,46.4095668,0 7.615139,46.4106177,0 7.6161251,46.4113811,0 7.6171756,46.4129423,0 7.6173782,46.4140618,0 7.6173696,46.4148133,0 7.6174554,46.4152985,0 7.6170005,46.415979,0 7.6168546,46.4165589,0 7.6165714,46.4166773,0 7.6161937,46.4166891,0 7.6160392,46.4169495,0 7.6164169,46.4174229,0 7.6171207,46.4176714,0 7.6173009,46.4179081,0 7.6173267,46.4184998,0 7.6176528,46.418908,0 7.6182752,46.418677,0 7.6185884,46.4183755,0 7.6188287,46.4183578,0 7.6193806,46.4173872,0 7.6199672,46.4174714,0 7.6210491,46.4180023,0 7.6225795,46.4190323,0 7.6229658,46.4189554,0 7.6232576,46.4190796,0 7.6234722,46.4190027,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5666254,46.4971783,0 7.5668656,46.497203,0 7.5672608,46.4970805,0 7.5678102,46.4970381,0 7.5683727,46.4970519,0 7.5693504,46.49736,0 7.5695856,46.4975015,0 7.5697801,46.497493,0 7.5698535,46.4975297,0 7.5697316,46.4975853,0 7.5698707,46.4976373,0 7.5701022,46.4975877,0 7.5701367,46.4975929,0 7.5707109,46.4976791,0 7.5708665,46.4976169,0 7.5711207,46.497742,0 7.5713865,46.4977649,0 7.5715411,46.4976389,0 7.5719446,46.4978024,0 7.5720307,46.4977428,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5654624,46.4590852,0 7.5649892,46.4595141,0 + + + + Ueschinengrat + Ueschinengrat, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.613129,46.4372863,0 7.6146783,46.4377111,0 7.6156779,46.4377915,0 7.6171439,46.4379063,0 7.6186432,46.438067,0 7.6196094,46.4384918,0 7.6204424,46.438951,0 7.6213586,46.4392265,0 7.6214919,46.4394561,0 7.6218251,46.4394906,0 7.6218584,46.4397317,0 7.6221416,46.4400531,0 7.6221583,46.4404205,0 7.6225248,46.4405812,0 7.6225914,46.4408797,0 7.6228746,46.4409371,0 7.6231078,46.4411207,0 7.6232245,46.4413044,0 7.622858,46.4414996,0 7.6230246,46.4420276,0 7.6232578,46.442372,0 7.6237242,46.442659,0 7.6240241,46.4432215,0 7.624274,46.443761,0 7.6243739,46.4443579,0 7.6243739,46.4447712,0 7.6240907,46.4450237,0 7.6241907,46.4454599,0 7.6245239,46.4457354,0 7.6250903,46.4460913,0 7.6252569,46.4464586,0 7.6249737,46.4467341,0 7.6252902,46.4469292,0 7.6251403,46.4471702,0 7.6259566,46.4474687,0 7.6266396,46.4476868,0 7.6276058,46.4479393,0 7.6279557,46.4485247,0 7.6283555,46.4490068,0 7.6292717,46.4496036,0 7.630038,46.4502694,0 7.6311875,46.4509006,0 7.6315374,46.451222,0 7.6317206,46.4517041,0 7.632237,46.4521517,0 7.6324869,46.4523353,0 7.6323703,46.4527256,0 7.63297,46.4532994,0 7.6333699,46.4535519,0 7.6342695,46.4543094,0 7.6345527,46.4547341,0 7.6349525,46.4553997,0 7.6355855,46.4559736,0 7.6366517,46.4571671,0 7.6377512,46.4582,0 7.638301,46.4591984,0 7.638884,46.4598181,0 7.6388674,46.4601624,0 7.638884,46.4603575,0 7.6391173,46.4604263,0 7.6394005,46.4605067,0 7.6398503,46.4611263,0 7.6401834,46.4615395,0 7.6410164,46.461746,0 7.6423158,46.462205,0 7.6431321,46.4625722,0 7.6439484,46.4633985,0 7.6445315,46.4637312,0 7.644948,46.4642017,0 7.6453644,46.4646722,0 7.6460475,46.4651541,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.613129,46.4372863,0 7.614645,46.4371601,0 7.6147949,46.436896,0 7.6150948,46.4367812,0 7.6165941,46.4367812,0 7.6169939,46.4366434,0 7.6178935,46.4359661,0 7.619193,46.4364368,0 7.6179269,46.4347261,0 7.6185766,46.4346802,0 7.6184933,46.4342439,0 7.6185932,46.4339224,0 7.6188098,46.4336469,0 7.619193,46.4339683,0 7.6194095,46.4337961,0 7.619876,46.434152,0 7.6199926,46.4339798,0 7.620559,46.4341865,0 7.6205257,46.4338191,0 7.620659,46.4335206,0 7.6207756,46.4333484,0 7.6211754,46.4332335,0 7.6210588,46.432958,0 7.6217751,46.4331417,0 7.6231578,46.4331761,0 7.6237242,46.4335435,0 7.6239741,46.4325446,0 7.6243047,46.4319653,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.613129,46.4372863,0 7.6114798,46.4367468,0 7.6103046,46.4371303,0 7.6100952,46.437372,0 7.6096793,46.4373191,0 7.609981,46.4374867,0 7.6092641,46.4375619,0 7.609614,46.4376767,0 7.6091475,46.4379407,0 7.6094474,46.4381244,0 7.6091142,46.4382048,0 7.6091308,46.4384114,0 7.6087977,46.4385492,0 7.6086644,46.4388706,0 7.6091808,46.4387214,0 7.6107634,46.4388132,0 7.6111799,46.4389166,0 7.6113632,46.4392265,0 7.6116963,46.4392839,0 7.6114131,46.4396628,0 7.6116797,46.4399268,0 7.6115797,46.4404319,0 7.6118796,46.441224,0 7.6118463,46.4416144,0 7.6116297,46.4417636,0 7.6115631,46.4420621,0 7.61093,46.4418669,0 7.61098,46.4420735,0 7.610147,46.4419587,0 7.6098305,46.4422802,0 7.6098139,46.4426016,0 7.6108634,46.444025,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6108634,46.444025,0 7.6112632,46.4445875,0 7.6115964,46.4452533,0 7.6121961,46.4457584,0 7.6125293,46.4463323,0 7.6131124,46.4478704,0 7.6135455,46.4484099,0 7.6141619,46.4488116,0 7.6144784,46.4491675,0 7.6150781,46.4493396,0 7.6155446,46.4496036,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4787161,46.5654517,0 7.4789409,46.56562,0 7.4788957,46.5659074,0 7.4785552,46.566147,0 7.4784732,46.566416,0 7.4785488,46.5665905,0 7.4795866,46.567193,0 7.4797515,46.5672887,0 7.4800482,46.5673099,0 7.4802419,46.5674885,0 7.4801802,46.5674932,0 7.4801654,46.5675985,0 7.4803315,46.5678527,0 7.4805001,46.5679469,0 7.4808497,46.568056,0 7.4811398,46.5680585,0 7.4815241,46.5681539,0 7.4816035,46.5684949,0 7.4818155,46.5686213,0 7.4821328,46.5687589,0 7.4821799,46.5687366,0 7.482268,46.5689251,0 7.4824725,46.569209,0 7.4825891,46.5692747,0 7.4827415,46.5698549,0 7.4827143,46.5698945,0 7.4827948,46.5699664,0 7.4828345,46.5699627,0 7.4831308,46.5704896,0 7.4831135,46.5707772,0 7.4833007,46.5711876,0 7.4832126,46.5711901,0 7.483256,46.5713463,0 7.4830366,46.571619,0 7.4831097,46.5718632,0 7.4832201,46.5720294,0 7.4832994,46.5726753,0 7.4834246,46.5730509,0 7.4833007,46.5733249,0 7.483473,46.5735716,0 7.4839689,46.5737985,0 7.4840594,46.5739559,0 7.4843152,46.5741399,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.569223,46.5076089,0 7.5694207,46.5076825,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4682319,46.4426424,0 7.468149,46.4425956,0 7.4681436,46.4424662,0 7.467957,46.442374,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4393848,46.4651486,0 7.4393956,46.4653186,0 7.4393366,46.4654848,0 7.4392534,46.465595,0 7.4387103,46.4661122,0 7.4372103,46.4679225,0 7.4370442,46.4681471,0 7.4360816,46.4694487,0 7.4353769,46.4704585,0 + + + + Simmendamm + Simmendamm, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4440412,46.4544542,0 7.4442289,46.4544062,0 7.4523989,46.4496459,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4677582,46.4299748,0 7.4671079,46.4296049,0 7.4655576,46.4299747,0 7.4594593,46.4346501,0 7.4575621,46.4367506,0 7.4565457,46.4372249,0 7.4560037,46.438038,0 7.454784,46.438309,0 7.4537676,46.4392576,0 7.4535952,46.4392812,0 7.4532036,46.4391925,0 7.4529461,46.4390077,0 7.4525438,46.4389005,0 7.4516104,46.4388968,0 7.4507038,46.4388413,0 7.4504133,46.4388159,0 7.4502317,46.4387637,0 7.450119,46.4387267,0 7.4499634,46.4388549,0 7.449765,46.4390631,0 7.4495343,46.439259,0 7.4490998,46.4394476,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6092641,46.4375619,0 7.6088204,46.4375169,0 7.607629,46.437716,0 7.6078456,46.4379897,0 7.6053183,46.4381887,0 7.6040186,46.4382136,0 7.6040186,46.4378901,0 7.6036864,46.4378485,0 7.6032243,46.4377906,0 7.6029354,46.437293,0 7.6032965,46.4360489,0 7.6032604,46.4355015,0 7.6030437,46.4349292,0 7.6026466,46.4345809,0 7.602105,46.4335109,0 7.6010219,46.4318935,0 7.5998305,46.430948,0 7.5993611,46.4304005,0 7.5989279,46.428783,0 7.5988557,46.428136,0 7.5986391,46.427713,0 7.5978087,46.4267175,0 7.5975198,46.4261203,0 7.5974476,46.4256226,0 7.5971588,46.4252741,0 7.5969061,46.4242538,0 7.5961118,46.4229597,0 7.5956063,46.4231588,0 7.5952092,46.4234325,0 7.5947398,46.4247764,0 7.5943427,46.4250004,0 7.594451,46.426394,0 7.5941261,46.4271406,0 7.5937289,46.4276881,0 7.5925014,46.4288577,0 7.5915627,46.430077,0 7.5914183,46.4305249,0 7.5915266,46.4314208,0 7.5912459,46.4320011,0 7.5912016,46.4320926,0 7.5911503,46.4321334,0 7.5910484,46.4321962,0 7.5908982,46.4322258,0 7.5908285,46.4322665,0 7.5907266,46.4322776,0 7.5906407,46.4323293,0 7.5905495,46.4323404,0 7.5905388,46.4323959,0 7.5905989,46.4324636,0 7.5906139,46.4325216,0 7.5905817,46.4326288,0 7.5906139,46.4327028,0 7.590571,46.4327471,0 7.590512,46.4327323,0 7.5905012,46.4326732,0 7.5904154,46.4326547,0 7.5903886,46.4325992,0 7.5903296,46.4325992,0 7.5903189,46.4326695,0 7.5902759,46.4327249,0 7.5902652,46.4328063,0 7.5901526,46.4329763,0 7.5900505,46.4331525,0 7.5900506,46.4332241,0 7.5899969,46.4332504,0 7.5899648,46.4333091,0 7.5899112,46.4333498,0 7.5898736,46.4333017,0 7.5897985,46.4332795,0 7.5897395,46.4332388,0 7.5897073,46.4331649,0 7.5896322,46.433176,0 7.5895858,46.4332561,0 7.5896161,46.4333609,0 7.5895893,46.4334459,0 7.5894628,46.4335199,0 7.5894069,46.433383,0 7.5893318,46.4333128,0 7.5892084,46.4332795,0 7.5891387,46.4332721,0 7.5891212,46.4333221,0 7.5890529,46.4333793,0 7.5890046,46.4333941,0 7.5889724,46.4333645,0 7.5888812,46.4332093,0 7.5887685,46.4331242,0 7.5886237,46.4330836,0 7.5885384,46.4330396,0 7.5884896,46.4329985,0 7.5883662,46.4329431,0 7.5881892,46.4329394,0 7.5880336,46.432932,0 7.5879102,46.432895,0 7.5878244,46.4328913,0 7.5877171,46.4329061,0 7.587642,46.4328654,0 7.5875347,46.4328765,0 7.5874489,46.4329394,0 7.5874543,46.4330614,0 7.5875455,46.4331908,0 7.5875347,46.4332869,0 7.5875783,46.4333968,0 7.587642,46.4334496,0 7.5876796,46.4335309,0 7.5877815,46.4335383,0 7.5878878,46.4335835,0 7.5879531,46.433627,0 7.58798,46.4337232,0 7.5879811,46.4338264,0 7.5880229,46.4339006,0 7.5880014,46.43403,0 7.5879707,46.4341598,0 7.5879853,46.4342408,0 7.5880551,46.4343221,0 7.5881758,46.4343754,0 7.5882053,46.4344478,0 7.5881731,46.4345254,0 7.5880898,46.4345803,0 7.5880551,46.4346585,0 7.5879531,46.4347251,0 7.5878304,46.4347381,0 7.5877547,46.4347214,0 7.5876527,46.4347325,0 7.5875562,46.4347694,0 7.5874543,46.4347879,0 7.5873416,46.4348693,0 7.5873187,46.4349658,0 7.5872152,46.4350689,0 7.5871002,46.4351835,0 7.5870787,46.4352501,0 7.5869822,46.4353018,0 7.586832,46.4352981,0 7.5866818,46.4352538,0 7.586655,46.4351687,0 7.5865477,46.4350911,0 7.5863103,46.4350611,0 7.5861507,46.4350837,0 7.5859415,46.4350874,0 7.5856894,46.4351465,0 7.5855445,46.4352501,0 7.5854855,46.4353536,0 7.5854508,46.4354567,0 7.5854372,46.4356013,0 7.5853997,46.4357565,0 7.5852945,46.4359217,0 7.585169,46.4360116,0 7.5850134,46.4361189,0 7.5848418,46.4361336,0 7.5846755,46.4361299,0 7.5845038,46.4361558,0 7.5842285,46.4362702,0 7.5841122,46.4364516,0 7.5840908,46.4365921,0 7.5840532,46.4367067,0 7.5839567,46.436751,0 7.5838816,46.4367584,0 7.5838185,46.4367223,0 7.5837796,46.4366549,0 7.5836616,46.4366105,0 7.5835704,46.4365588,0 7.5834417,46.4365588,0 7.5833265,46.4365998,0 7.5832164,46.4366697,0 7.5830258,46.4367223,0 7.582916,46.4366993,0 7.5828623,46.4366586,0 7.582755,46.4366771,0 7.5827336,46.4367251,0 7.5827228,46.4367954,0 7.5826531,46.4368508,0 7.5825741,46.4368657,0 7.5824707,46.4368545,0 7.5823098,46.4368804,0 7.582122,46.436947,0 7.5819504,46.436995,0 7.5818699,46.4370024,0 7.5818002,46.436995,0 7.5817519,46.4369543,0 7.5817358,46.43691,0 7.5816768,46.4368915,0 7.58165,46.4368435,0 7.5816392,46.4367806,0 7.581607,46.4367362,0 7.5815909,46.4366734,0 7.5815427,46.4366475,0 7.5814461,46.4366475,0 7.5813388,46.4366771,0 7.5811725,46.436751,0 7.5810062,46.4367621,0 7.5808556,46.4367572,0 7.5806522,46.4367954,0 7.5804912,46.4367769,0 7.5803472,46.4367976,0 7.5802171,46.4368459,0 7.5802016,46.4369137,0 7.5801211,46.4369359,0 7.580046,46.4369211,0 7.5799333,46.4369322,0 7.5799119,46.4369765,0 7.5798421,46.4370061,0 7.5797779,46.4370077,0 7.5797188,46.4370357,0 7.5796383,46.4370579,0 7.5795526,46.4370554,0 7.5794988,46.4370357,0 7.5794237,46.4370135,0 7.5793379,46.4369876,0 7.5792908,46.4369913,0 7.5792252,46.4370135,0 7.5791609,46.4370431,0 7.5791072,46.4370579,0 7.5790268,46.4370616,0 7.5789356,46.4370357,0 7.5788122,46.4370579,0 7.5787049,46.4371429,0 7.5785547,46.437191,0 7.5784206,46.437239,0 7.5783294,46.437239,0 7.5782436,46.4372131,0 7.578147,46.4371836,0 7.5780451,46.437154,0 7.5779217,46.4371688,0 7.5777876,46.4371614,0 7.5776899,46.4371324,0 7.5775891,46.4371577,0 7.5774908,46.4372214,0 7.5773692,46.437239,0 7.5772726,46.437202,0 7.5771278,46.437276,0 7.5771009,46.4373351,0 7.5770366,46.437398,0 7.5770526,46.4374867,0 7.5771009,46.4375385,0 7.5771438,46.4376087,0 7.5771009,46.4376605,0 7.5770312,46.4376645,0 7.57694,46.4376198,0 7.5768756,46.4376531,0 7.5768273,46.4377122,0 7.576763,46.43769,0 7.5767201,46.4376568,0 7.5766181,46.4376457,0 7.576543,46.43769,0 7.5764518,46.4377159,0 7.5763445,46.4377048,0 7.5762212,46.4377233,0 7.5761943,46.4377714,0 7.5760871,46.4378083,0 7.576012,46.4378342,0 7.5760495,46.4378934,0 7.5761085,46.4379673,0 7.5761675,46.4379932,0 7.576189,46.438056,0 7.5762335,46.4381256,0 7.5762051,46.4381743,0 7.5759959,46.4382224,0 7.5757276,46.4382076,0 7.5754594,46.4382076,0 7.5753682,46.4381706,0 7.5752341,46.4381078,0 7.5751161,46.4381109,0 7.5750571,46.4381706,0 7.5750036,46.4381659,0 7.5748908,46.438141,0 7.5747835,46.4381189,0 7.5747406,46.4380819,0 7.5746816,46.438056,0 7.5746011,46.4380856,0 7.5745099,46.4380967,0 7.5744621,46.4380832,0 7.574349,46.4380819,0 7.5742941,46.4380642,0 7.5742095,46.4380043,0 7.5741344,46.4379303,0 7.5740003,46.4378601,0 7.5739037,46.4378194,0 7.5737428,46.4378083,0 7.5736095,46.437843,0 7.5735448,46.4379215,0 7.5734209,46.4379562,0 7.5733458,46.4380412,0 7.5733201,46.4381126,0 7.5732493,46.4381891,0 7.5732117,46.4382741,0 7.5731259,46.438422,0 7.5731152,46.4385847,0 7.5730776,46.4386438,0 7.572965,46.4387067,0 7.5728577,46.4387621,0 7.5727826,46.4388397,0 7.5727075,46.438995,0 7.5727348,46.4391616,0 7.5727665,46.439361,0 7.5726216,46.4395532,0 7.5725251,46.4396567,0 7.5725251,46.4397824,0 7.5725734,46.4399044,0 7.5726324,46.4399562,0 7.5726914,46.4400708,0 7.5726753,46.4401706,0 7.5725895,46.4402704,0 7.5723588,46.4404035,0 7.5716278,46.4407909,0 7.5706985,46.4416291,0 7.5701108,46.4423354,0 7.5693728,46.4429852,0 7.5688535,46.4437668,0 7.5675552,46.4450099,0 7.5667762,46.4458951,0 7.5659698,46.4470345,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4742902,46.543847,0 7.4740706,46.5437738,0 7.474096,46.5437005,0 7.4741839,46.5437162,0 7.4741585,46.5436234,0 7.4739037,46.5435112,0 7.473769,46.543193,0 7.4735787,46.5432623,0 7.4733698,46.5429187,0 7.4728954,46.5428416,0 7.4729051,46.5427908,0 7.4733112,46.542578,0 7.4735425,46.5427068,0 7.4735435,46.5426288,0 7.4732848,46.5422881,0 7.4731111,46.5423086,0 7.4730184,46.5422354,0 7.4730584,46.5420968,0 7.4730262,46.5419884,0 7.4727734,46.5419123,0 7.4729002,46.5417844,0 7.4724395,46.5414984,0 7.472902,46.5410832,0 7.4728875,46.5409579,0 7.4731061,46.5409579,0 7.4732465,46.5406833,0 7.4733172,46.5406909,0 7.4732599,46.5407253,0 7.4732991,46.5407434,0 7.4734232,46.5405983,0 7.4734576,46.5406871,0 7.4735388,46.5406947,0 7.4736859,46.5409144,0 7.4738822,46.5409576,0 7.4737586,46.5410479,0 7.473906,46.5410955,0 7.4739511,46.5410218,0 7.4740866,46.5410242,0 7.4741531,46.5411691,0 7.4743005,46.5411953,0 7.4743741,46.5412571,0 7.4742957,46.5411097,0 7.4743694,46.5409933,0 7.47431,46.5408602,0 7.4745595,46.5406986,0 7.4743504,46.5404181,0 7.4742957,46.5401187,0 7.4739061,46.5395675,0 7.4739061,46.5391722,0 7.4728853,46.5387885,0 7.4727226,46.5388327,0 7.4726063,46.538735,0 7.4720691,46.5387211,0 7.4719273,46.5385443,0 7.4718017,46.5385002,0 7.4718668,46.5384583,0 7.4718622,46.538356,0 7.471925,46.5382746,0 7.4721784,46.5382374,0 7.4720691,46.5374375,0 7.4722691,46.5372631,0 7.4722249,46.5371584,0 7.4723249,46.5371515,0 7.4720552,46.5368073,0 7.4719436,46.5365911,0 7.4717622,46.5365515,0 7.4717715,46.5366236,0 7.4716668,46.5365515,0 7.4715087,46.5365422,0 7.4714273,46.5365957,0 7.4711902,46.5365911,0 7.4712785,46.5362539,0 7.4714273,46.5360818,0 7.4713041,46.5360283,0 7.4712739,46.5359469,0 7.4711948,46.5358795,0 7.471125,46.5358865,0 7.4710599,46.5357516,0 7.4708669,46.5357167,0 7.4710948,46.5356353,0 7.4708367,46.535161,0 7.4710785,46.5351354,0 7.4711413,46.5348796,0 7.4709762,46.5347843,0 7.4711413,46.5346843,0 7.4710437,46.5345936,0 7.4714436,46.534368,0 7.4714041,46.5342797,0 7.4711832,46.5341936,0 7.4712739,46.5341448,0 7.4714785,46.534175,0 7.4714901,46.5340588,0 7.4715901,46.5339774,0 7.4714483,46.5339169,0 7.4715855,46.5338913,0 7.4715134,46.5337518,0 7.4716529,46.5335844,0 7.4715599,46.5334518,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4715599,46.5334518,0 7.4716933,46.5334754,0 7.4717591,46.5334871,0 7.4723134,46.5334289,0 7.4724659,46.5335346,0 7.4725436,46.5334476,0 7.472668,46.5334811,0 7.4727831,46.5334182,0 7.4727617,46.5334784,0 7.4729946,46.5335748,0 7.473016,46.5334463,0 7.473285,46.5334463,0 7.473562,46.5335266,0 7.4734933,46.5336569,0 7.4737722,46.5335744,0 7.4740695,46.533687,0 7.4742803,46.533611,0 7.4743445,46.5334447,0 7.4746862,46.5332667,0 7.4746312,46.5333989,0 7.4749193,46.5334225,0 7.4757731,46.5331973,0 7.4759525,46.5333426,0 7.4764802,46.5331855,0 7.4767827,46.5331868,0 7.4768233,46.5333151,0 7.4773418,46.533209,0 7.4774374,46.5330375,0 7.4775343,46.533027,0 7.4776076,46.5331331,0 7.4782663,46.5329118,0 7.4782532,46.532735,0 7.478481,46.5327075,0 7.478663,46.5327926,0 7.4789262,46.5326447,0 7.4791488,46.5326538,0 7.4791645,46.5325674,0 7.4797027,46.5324338,0 7.4804792,46.5328542,0 7.4806337,46.532828,0 7.480728,46.5329026,0 7.4809244,46.5328372,0 7.4809991,46.5327481,0 7.4812112,46.5327403,0 7.4812845,46.5326591,0 7.4813998,46.5326735,0 7.4815255,46.5327795,0 7.4816237,46.5327678,0 7.481642,46.5328673,0 7.4817546,46.532807,0 7.4818319,46.532976,0 7.4823072,46.5327795,0 7.4826136,46.5327953,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4826136,46.5327953,0 7.4832671,46.5330604,0 7.483638,46.5331012,0 7.4836392,46.5332404,0 7.4837808,46.5331216,0 7.4844133,46.5333052,0 7.4846353,46.5331804,0 7.4847205,46.5333172,0 7.4850038,46.533196,0 7.485209,46.5334301,0 7.4854334,46.5332644,0 7.4856758,46.5334481,0 7.4858403,46.5332236,0 7.4860635,46.5335045,0 7.4864127,46.5332812,0 7.4865448,46.5334001,0 7.4867464,46.5333544,0 7.4866924,46.5331996,0 7.4861523,46.5329248,0 7.4859435,46.5324759,0 7.4860743,46.5324471,0 7.486058,46.5321473,0 7.4864378,46.5318491,0 7.486282,46.5312689,0 7.4864986,46.5312408,0 7.4864363,46.5309826,0 7.4866945,46.5306265,0 7.4874629,46.530166,0 7.4876105,46.5306214,0 7.4874752,46.5308091,0 7.4880044,46.5309844,0 7.4879828,46.5311506,0 7.4884043,46.5312983,0 7.4889058,46.5313136,0 7.4890597,46.5315536,0 7.4894966,46.5316213,0 7.4894966,46.5317628,0 7.4901334,46.5321536,0 7.4907426,46.5323505,0 7.4913734,46.5323105,0 7.4918656,46.5323874,0 7.4920133,46.5319413,0 7.4923364,46.5318582,0 7.4925056,46.5319905,0 7.4940365,46.5316302,0 7.4942096,46.531841,0 7.494616,46.5317695,0 7.4954627,46.5322662,0 7.4954213,46.5326011,0 7.4961739,46.5326726,0 7.4965389,46.5330865,0 7.4963094,46.5331091,0 7.4962191,46.5338617,0 7.4959858,46.5339068,0 7.496046,46.5344826,0 7.4957449,46.5346632,0 7.495775,46.5352728,0 7.4950262,46.5360781,0 7.4937806,46.5359652,0 7.4934006,46.5361985,0 7.4927044,46.5360856,0 7.4926442,46.5362286,0 7.4925012,46.5361496,0 7.4922228,46.5363114,0 7.4921437,46.5362361,0 7.4919029,46.5364506,0 7.4918126,46.536413,0 7.4911804,46.5366802,0 7.4903827,46.5375419,0 7.4906687,46.5376886,0 7.490759,46.5379107,0 7.4911127,46.5378956,0 7.4915755,46.5381251,0 7.491775,46.5383472,0 7.4939236,46.5380913,0 7.4945671,46.5382079,0 7.4950563,46.5380348,0 7.4952181,46.5376886,0 7.4955605,46.5376096,0 7.4956885,46.5379784,0 7.4964938,46.5377225,0 7.4968926,46.5378994,0 7.4970545,46.5376736,0 7.4982774,46.5377902,0 7.4983038,46.5377075,0 7.4981231,46.5376661,0 7.4985446,46.5375456,0 7.4988005,46.5376284,0 7.498867,46.5378034,0 7.4990317,46.5377973,0 7.4990378,46.5379102,0 7.4997,46.5380597,0 7.4996664,46.5385602,0 7.4992514,46.5388867,0 7.499343,46.5390179,0 7.4997183,46.5389294,0 7.4996664,46.539024,0 7.4998464,46.5390728,0 7.5001241,46.5388287,0 7.5001882,46.5385998,0 7.5000265,46.5384686,0 7.5003987,46.5381391,0 7.5006276,46.5381208,0 7.5007252,46.5379804,0 7.5006642,46.5379224,0 7.5008015,46.5379194,0 7.5009022,46.5381024,0 7.5012501,46.5379224,0 7.5012806,46.5377058,0 7.5019458,46.5372664,0 7.5023699,46.5375013,0 7.5021197,46.5386273,0 7.5025042,46.5385144,0 7.5024676,46.5388592,0 7.5028063,46.5393444,0 7.5028378,46.5395826,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4450569,46.4629393,0 7.4444602,46.463138,0 7.443613,46.463674,0 7.4426102,46.4637086,0 7.4421779,46.4636567,0 7.4419013,46.463795,0 7.4417802,46.4640717,0 7.4414823,46.4643468,0 7.4411283,46.4644539,0 7.4406961,46.4643705,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6229468,46.3732175,0 7.6226819,46.3729271,0 7.6224073,46.3727198,0 7.6219266,46.3722934,0 7.6215061,46.3719381,0 7.6212314,46.3716301,0 7.6210426,46.3715235,0 7.6209545,46.3713816,0 7.6209319,46.3712759,0 7.6208667,46.3711625,0 7.6206931,46.3710179,0 7.62051,46.3708845,0 7.620338,46.3707338,0 7.6202476,46.3705534,0 7.6201733,46.3702665,0 7.6200628,46.3699434,0 7.6199611,46.3697469,0 7.6197608,46.3695189,0 7.6195411,46.3693534,0 7.6193051,46.3691457,0 7.6190999,46.3688752,0 7.6188746,46.3687665,0 7.6186973,46.3685452,0 7.618483,46.3684123,0 7.6182273,46.368213,0 7.6181587,46.3680412,0 7.6181758,46.3679524,0 7.6181158,46.3678932,0 7.6178325,46.3677569,0 7.6177124,46.3676859,0 7.6172403,46.3675615,0 7.6170085,46.3673897,0 7.6165021,46.3669159,0 7.6163219,46.3668093,0 7.6162103,46.3666316,0 7.6155752,46.366294,0 7.6149829,46.3661993,0 7.6144079,46.3660512,0 7.6141847,46.3660157,0 7.6141847,46.365838,0 7.6141332,46.3658025,0 7.6140474,46.365761,0 7.6137985,46.3657492,0 7.6133779,46.3656781,0 7.6130517,46.3653879,0 7.612923,46.365299,0 7.6128372,46.3650503,0 7.6127084,46.3649259,0 7.6125024,46.3648489,0 7.6121591,46.3648074,0 7.611996,46.3646949,0 7.6117214,46.3646297,0 7.611627,46.3646179,0 7.6114553,46.3645054,0 7.611318,46.3644698,0 7.6111978,46.3644935,0 7.6111206,46.3643632,0 7.6110691,46.364304,0 7.6109489,46.3642803,0 7.6107686,46.3642566,0 7.6105627,46.3642033,0 7.6104511,46.3641263,0 7.6102279,46.3640434,0 7.6099361,46.3639841,0 7.6099018,46.3639486,0 7.6098588,46.3639841,0 7.6099189,46.3640848,0 7.6099618,46.3641796,0 7.6103223,46.3643336,0 7.6103824,46.3644402,0 7.6105627,46.3645409,0 7.6107772,46.3647956,0 7.6110176,46.3649377,0 7.6112493,46.3651569,0 7.6114038,46.3653049,0 7.6114381,46.3653642,0 7.6113437,46.365376,0 7.6111806,46.3652813,0 7.6108459,46.3652102,0 7.6106742,46.3651154,0 7.6103738,46.3650443,0 7.609876,46.3648903,0 7.609567,46.3647245,0 7.6094039,46.3646594,0 7.6093009,46.3645764,0 7.6091121,46.3645172,0 7.6088546,46.3644994,0 7.6085456,46.3644876,0 7.6083053,46.3644165,0 7.6081165,46.3643514,0 7.6080221,46.3642092,0 7.6078933,46.3640138,0 7.6077989,46.3639545,0 7.6076702,46.3638835,0 7.6074728,46.3638657,0 7.6073783,46.3638005,0 7.6072238,46.3636643,0 7.6069921,46.3634985,0 7.6068805,46.3633563,0 7.6067775,46.3632734,0 7.6066574,46.3631845,0 7.6066488,46.3630779,0 7.6066059,46.3630187,0 7.6064342,46.3628884,0 7.606357,46.3628114,0 7.606254,46.3627403,0 7.6061338,46.3627225,0 7.6059707,46.3626811,0 7.6057819,46.3626396,0 7.6056274,46.3626041,0 7.6055158,46.3625745,0 7.6053699,46.3624975,0 7.605224,46.3624382,0 7.6051639,46.3624027,0 7.6050094,46.3623731,0 7.6048807,46.3623908,0 7.6047691,46.3623198,0 7.6046747,46.3623375,0 7.6045717,46.362379,0 7.6044773,46.3624027,0 7.6042026,46.3623968,0 7.6039794,46.3623849,0 7.6038249,46.3624442,0 7.6036361,46.362456,0 7.6034645,46.3624264,0 7.603267,46.3623968,0 7.6031812,46.3624264,0 7.6031211,46.3625626,0 7.603001,46.3625863,0 7.6028465,46.3626159,0 7.6025547,46.3625448,0 7.6022199,46.3624086,0 7.6019624,46.3623257,0 7.6018079,46.3623198,0 7.6016792,46.362225,0 7.6016792,46.3621184,0 7.6017822,46.3620118,0 7.6018251,46.3619111,0 7.6018251,46.3618281,0 7.6021255,46.3617393,0 7.60228,46.361686,0 7.6024517,46.3616741,0 7.6026062,46.3616564,0 7.6027349,46.3616327,0 7.6029666,46.3615498,0 7.6031211,46.3615675,0 7.6032499,46.3614905,0 7.6032499,46.3614313,0 7.6031383,46.3612951,0 7.6030954,46.3612121,0 7.6029323,46.3613187,0 7.6029151,46.3614076,0 7.602795,46.3614668,0 7.6027521,46.3615142,0 7.602589,46.3614491,0 7.602486,46.3613602,0 7.6026147,46.3612536,0 7.6027521,46.3611351,0 7.6028207,46.3609515,0 7.6029838,46.3607501,0 7.6030267,46.3606968,0 7.6030096,46.3604895,0 7.6030611,46.3602585,0 7.6030954,46.3601282,0 7.6030696,46.3599149,0 7.6029924,46.3595714,0 7.6030525,46.359293,0 7.6031898,46.3591034,0 7.60331,46.3587954,0 7.6034387,46.3584637,0 7.6033958,46.3581853,0 7.6033443,46.3579187,0 7.6033529,46.3577588,0 7.60331,46.3576699,0 7.6030954,46.3576521,0 7.6028722,46.3576166,0 7.6026062,46.35751,0 7.6023487,46.3573263,0 7.601971,46.3572434,0 7.6016534,46.3570183,0 7.6014904,46.3568287,0 7.6013015,46.3565029,0 7.6011899,46.3563489,0 7.6010698,46.3562719,0 7.6008895,46.356266,0 7.6007865,46.3562008,0 7.6005805,46.3559402,0 7.6005548,46.3557328,0 7.6005119,46.355567,0 7.6004089,46.3553359,0 7.600263,46.3551286,0 7.6001857,46.3549272,0 7.6002286,46.3548146,0 7.6000999,46.3547376,0 7.6002716,46.3546547,0 7.6002029,46.3545066,0 7.6000484,46.3542637,0 7.5999111,46.3540564,0 7.5999282,46.3539142,0 7.5998853,46.353849,0 7.5999025,46.3533218,0 7.5998338,46.3531737,0 7.5998081,46.3530433,0 7.5996707,46.3528656,0 7.5997051,46.3526287,0 7.5996707,46.3523443,0 7.5995763,46.3521073,0 7.5994476,46.35174,0 7.5993789,46.3514734,0 7.5993017,46.3513668,0 7.5993017,46.3512246,0 7.5995162,46.3509639,0 7.5994218,46.3506677,0 7.599439,46.3505492,0 7.5993961,46.3504426,0 7.599336,46.3502293,0 7.5992416,46.3501286,0 7.5991214,46.3499272,0 7.599027,46.3497494,0 7.5989755,46.3497079,0 7.5988039,46.3492162,0 7.5989068,46.348997,0 7.5989841,46.3488015,0 7.598924,46.34876,0 7.5988468,46.3487126,0 7.5987695,46.3486534,0 7.5988039,46.3483097,0 7.5988897,46.3481202,0 7.5989154,46.3480313,0 7.5990699,46.3476995,0 7.5991386,46.3475929,0 7.5992244,46.3475158,0 7.5994132,46.3474862,0 7.599542,46.3474566,0 7.5997137,46.3473203,0 7.5996536,46.3472374,0 7.5995506,46.3471722,0 7.5996278,46.3467397,0 7.5996278,46.3464197,0 7.5997652,46.346319,0 7.5999969,46.346005,0 7.6000226,46.345845,0 7.6001085,46.345768,0 7.6001171,46.3456673,0 7.6000656,46.345531,0 7.6000141,46.3453355,0 7.6000656,46.3452881,0 7.6002372,46.3451992,0 7.6003831,46.3450866,0 7.6003917,46.3448615,0 7.6004775,46.3447074,0 7.600572,46.3446067,0 7.6005119,46.3444704,0 7.6003831,46.3442749,0 7.600529,46.3442808,0 7.6006664,46.3442749,0 7.6007694,46.3442334,0 7.6007694,46.3440972,0 7.6008724,46.3439194,0 7.6011556,46.343789,0 7.6014303,46.3437416,0 7.6015762,46.3436705,0 7.6016019,46.3439609,0 7.6017135,46.3440438,0 7.6018852,46.3437831,0 7.601971,46.343635,0 7.6021427,46.3435698,0 7.6022542,46.3435994,0 7.6024002,46.343558,0 7.6025289,46.3435461,0 7.6027521,46.3435165,0 7.602898,46.3434276,0 7.6030096,46.3434217,0 7.6030868,46.3433861,0 7.6031898,46.3433269,0 7.60337,46.3432973,0 7.60337,46.343238,0 7.6034215,46.3431906,0 7.6035589,46.3431906,0 7.6036533,46.3431432,0 7.6036705,46.3430958,0 7.6039022,46.3429417,0 7.6042112,46.3428825,0 7.6042713,46.3428232,0 7.6044086,46.3427521,0 7.6045116,46.3426573,0 7.6045631,46.342527,0 7.6045631,46.3424203,0 7.6045373,46.3423611,0 7.6045116,46.3422959,0 7.6044343,46.3422011,0 7.6043485,46.3421418,0 7.6043485,46.3420826,0 7.6044086,46.3419581,0 7.6044086,46.3418752,0 7.6044601,46.3416737,0 7.6044601,46.3416085,0 7.6044944,46.341496,0 7.6044858,46.3414012,0 7.6044944,46.3413123,0 7.6044429,46.341176,0 7.6044429,46.3410693,0 7.6044601,46.3409212,0 7.6044172,46.3408205,0 7.6043142,46.340619,0 7.6043142,46.340536,0 7.6042198,46.3403642,0 7.6041769,46.3402279,0 7.6041597,46.3400798,0 7.6041597,46.3399316,0 7.6041425,46.339825,0 7.6040567,46.3396946,0 7.6039623,46.3395643,0 7.6038764,46.3394457,0 7.603782,46.339345,0 7.6036705,46.3392087,0 7.6034988,46.3391554,0 7.6033786,46.3391198,0 7.60331,46.3391672,0 7.6031898,46.3391435,0 7.6030353,46.3391791,0 7.6029323,46.3391791,0 7.6029151,46.3391554,0 7.6027778,46.3392028,0 7.6027177,46.3392324,0 7.6027177,46.3392561,0 + + + + Gemmiweg + Gemmiweg, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6144451,46.3984215,0 7.6144629,46.3983312,0 7.6143611,46.398261,0 7.6140943,46.3980976,0 7.6139827,46.3980162,0 7.6139853,46.3978615,0 7.6139363,46.3976182,0 7.6133218,46.3975412,0 7.6124978,46.3971683,0 7.612206,46.3968545,0 7.6120139,46.3966832,0 7.6116052,46.3966355,0 7.611382,46.3964875,0 7.6117254,46.3962803,0 7.6120344,46.3962507,0 7.6122232,46.3963218,0 7.6123777,46.3963099,0 7.6124635,46.3962034,0 7.6121545,46.3961324,0 7.6121373,46.3960021,0 7.6123262,46.3959666,0 7.6123777,46.3957772,0 7.6128068,46.3951379,0 7.6131244,46.3949011,0 7.6132531,46.3945341,0 7.6134129,46.3943691,0 7.6134935,46.3947235,0 7.6136045,46.3948874,0 7.6136651,46.3945637,0 7.6138969,46.394463,0 7.6142193,46.3946836,0 7.6141604,46.3948245,0 7.6141127,46.3950487,0 7.6145638,46.394795,0 7.6151903,46.3940846,0 7.6153196,46.3934043,0 7.615535,46.3933165,0 7.6156972,46.3932504,0 7.6160405,46.3931675,0 7.6163495,46.3934161,0 7.6165875,46.3938373,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4393848,46.4651486,0 7.4391324,46.4649312,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4444111,46.4575848,0 7.4448112,46.457744,0 + + + + Schulstrasse + Schulstrasse, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4455274,46.4564945,0 7.4451624,46.4562853,0 + + + + Kronenplatz + Kronenplatz, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4425957,46.4564794,0 7.4428776,46.4565207,0 7.4429918,46.455969,0 7.4427674,46.4559269,0 7.4425496,46.4558861,0 7.4424659,46.4563108,0 7.442629,46.4563359,0 7.4425957,46.4564794,0 + + + + Kronenplatz + Kronenplatz, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4433217,46.4560368,0 7.4429918,46.455969,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.445441,46.4596274,0 7.4460723,46.4588277,0 7.4461285,46.4588623,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5597509,46.4884691,0 7.5600553,46.4879829,0 7.5605373,46.4880844,0 7.5607923,46.4876673,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4991265,46.3699083,0 7.4988246,46.3699358,0 7.498686,46.370369,0 7.4982529,46.370369,0 7.4976898,46.3704989,0 7.4968928,46.3705249,0 7.4968495,46.3707934,0 7.4958706,46.3712786,0 7.4948224,46.3714951,0 7.4936871,46.3716586,0 7.4926614,46.3714013,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5802311,46.4989017,0 7.5803456,46.4986969,0 7.5802886,46.4986171,0 7.5802181,46.4985699,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5659698,46.4470345,0 7.568545,46.4382212,0 + + + + Hängebrücke Hohstalden + Hängebrücke Hohstalden, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.61705,46.560728,0 7.6174601,46.5593795,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.579346,46.50235,0 7.579269,46.50252,0 7.579288,46.502698,0 7.57914,46.502895,0 7.579196,46.503146,0 7.5789389,46.5032379,0 7.5787664,46.5034171,0 7.5777661,46.503767,0 + + + + Bonderlenbach Walking Path + Bonderlenbach Walking Path, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5774594,46.4953694,0 7.5773913,46.4953126,0 7.577239,46.495303,0 7.5771044,46.495242,0 7.576939,46.4951141,0 7.577052,46.494997,0 7.5772593,46.4948772,0 7.5773923,46.4947336,0 7.577531,46.494696,0 7.5776088,46.4943938,0 7.57769,46.49426,0 7.5778693,46.4941249,0 7.577957,46.493648,0 + + + + Bonderlenbach Walking Path + Bonderlenbach Walking Path, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5788628,46.4927947,0 7.5789515,46.4926509,0 7.5791509,46.4925641,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.563427,46.498168,0 7.5642551,46.4979457,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5707894,46.5079608,0 7.5707636,46.5078013,0 7.5696221,46.5072814,0 7.5695448,46.5076713,0 7.5694207,46.5076825,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5655643,46.5070497,0 7.564925,46.5070055,0 7.564616,46.5070823,0 7.5642126,46.5070527,0 7.5633286,46.5066747,0 7.5635174,46.5065565,0 7.564041,46.506592,0 7.5636204,46.506397,0 7.5629681,46.5064088,0 7.5604532,46.5069996,0 7.5600241,46.5066688,0 7.5589855,46.5063202,0 7.5580242,46.5058299,0 7.5574663,46.5057413,0 7.5568998,46.5057531,0 7.5559986,46.5055995,0 7.5532009,46.5040121,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5676637,46.4896332,0 7.5676054,46.4894827,0 7.567476,46.489347,0 7.5669614,46.4890433,0 7.566749,46.488896,0 7.566351,46.488737,0 7.566058,46.48822,0 7.566112,46.488037,0 7.5659924,46.4879446,0 7.565645,46.487817,0 7.56517,46.487748,0 7.564918,46.4876,0 7.563815,46.486383,0 7.563781,46.48615,0 7.563258,46.485336,0 7.563173,46.485097,0 7.5635808,46.4847034,0 7.56399,46.484315,0 7.564052,46.484108,0 7.563941,46.483716,0 7.563332,46.48324,0 7.563376,46.482928,0 7.5637511,46.4825866,0 7.563831,46.482399,0 7.56378,46.482257,0 7.563003,46.481689,0 7.563023,46.481459,0 7.5633366,46.4810949,0 7.5634558,46.4809124,0 7.563457,46.48083,0 7.5633171,46.4806886,0 7.5630604,46.4805584,0 7.562948,46.480452,0 7.562808,46.479719,0 7.562709,46.479606,0 7.562005,46.479358,0 7.5618487,46.4792297,0 7.561782,46.47908,0 7.5617721,46.4788605,0 7.5618,46.47874,0 7.5624466,46.4780984,0 7.562288,46.477703,0 7.562083,46.477529,0 7.562101,46.477352,0 7.562461,46.476986,0 7.562711,46.47685,0 7.562794,46.476692,0 7.562781,46.476621,0 7.562696,46.476563,0 7.5622314,46.476513,0 7.5621583,46.4764818,0 7.561977,46.476351,0 7.5618962,46.4759014,0 7.561704,46.47567,0 7.561627,46.475207,0 7.561799,46.474588,0 7.561714,46.474406,0 7.5612418,46.474131,0 7.5611,46.473945,0 7.561488,46.47345,0 7.561538,46.47326,0 7.561166,46.472885,0 7.561107,46.472688,0 7.561294,46.472118,0 7.5612735,46.4718594,0 7.5611621,46.4717378,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5611621,46.4717378,0 7.5610469,46.4717054,0 7.5609132,46.4715494,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5621068,46.4705513,0 7.5622317,46.4705599,0 7.5627956,46.4700239,0 7.563029,46.469433,0 7.5632876,46.4691042,0 7.5635408,46.4688811,0 7.5635817,46.469008,0 7.5640286,46.4684621,0 7.564014,46.467933,0 7.5640877,46.4678364,0 7.5641633,46.4678644,0 7.564247,46.467826,0 7.564276,46.467683,0 7.564102,46.467479,0 7.5643394,46.4671283,0 7.564496,46.466775,0 7.5644585,46.4665703,0 7.5642804,46.4663023,0 7.5641749,46.4659848,0 7.5641356,46.4658925,0 7.5642694,46.4656671,0 7.5642626,46.4652282,0 7.563344,46.464121,0 7.56346,46.463889,0 7.5637092,46.4637241,0 7.563776,46.4636,0 7.563387,46.463496,0 7.563191,46.463134,0 7.5631304,46.4625612,0 7.563308,46.462064,0 7.563156,46.461487,0 7.563216,46.461386,0 7.563167,46.461144,0 7.5627558,46.4606653,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5627558,46.4606653,0 7.562395,46.460344,0 7.562311,46.459841,0 7.562104,46.459635,0 7.562128,46.459302,0 7.562277,46.459023,0 7.562066,46.458465,0 7.562088,46.458007,0 7.562559,46.457277,0 7.562258,46.456812,0 7.5625,46.456613,0 7.563527,46.456393,0 7.5638831,46.4564126,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5435227,46.4827013,0 7.5436247,46.4830653,0 7.5435592,46.4832093,0 7.5435643,46.4834307,0 7.5434451,46.4835786,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5436127,46.4825783,0 7.5435227,46.4827013,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5405449,46.4792038,0 7.5407348,46.4794281,0 7.5407722,46.4795516,0 7.5408429,46.4796713,0 7.5412903,46.480107,0 7.5414256,46.4803418,0 7.5418407,46.4804783,0 7.5427092,46.4811396,0 7.5431686,46.4820548,0 7.5434355,46.482271,0 7.5435897,46.4824673,0 7.5436127,46.4825783,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5392734,46.4802349,0 7.5395718,46.4800879,0 7.5395976,46.4799933,0 7.5400439,46.4798633,0 7.540207,46.4795973,0 7.5401555,46.4790949,0 7.54034,46.479224,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5287322,46.4845909,0 7.5294532,46.4849041,0 7.5297364,46.4848864,0 7.5299855,46.4847806,0 7.5301035,46.4847938,0 7.5299338,46.4850755,0 7.5309724,46.4849159,0 7.5322129,46.484865,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5564947,46.4921923,0 7.5561256,46.49234,0 7.5558595,46.4922159,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5289364,46.4906938,0 7.5297775,46.4904456,0 7.5303783,46.4905165,0 7.5325241,46.4899728,0 7.5333567,46.4895533,0 7.5343609,46.4893051,0 7.5350647,46.4892401,0 7.5353651,46.4892814,0 7.5353565,46.4891751,0 7.5358801,46.488986,0 7.5377512,46.4885191,0 7.5381632,46.4883359,0 7.539073,46.4883359,0 7.5392876,46.4882355,0 7.5399056,46.4881586,0 7.5406694,46.4881527,0 7.5425577,46.4885605,0 7.5426865,46.4886019,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5605804,46.4538416,0 7.5601817,46.4540178,0 7.5599834,46.4542594,0 7.5600283,46.4548461,0 7.560247,46.455188,0 7.560294,46.455557,0 7.5600484,46.4561044,0 7.5601535,46.4562692,0 7.560098,46.4567024,0 7.5602085,46.4572266,0 7.5611106,46.4583043,0 7.561229,46.4584659,0 7.5612212,46.4586588,0 7.5614828,46.4589198,0 7.5614623,46.4593025,0 7.5619777,46.4604155,0 7.5619267,46.4606423,0 7.5620549,46.4609595,0 7.5622266,46.4611132,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5607503,46.4539705,0 7.5605804,46.4538416,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5592176,46.4928554,0 7.5588805,46.4931539,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.58757,46.5206516,0 7.587624,46.520509,0 7.587569,46.520492,0 7.5873231,46.5205316,0 7.5872162,46.5205068,0 7.5870656,46.5205131,0 7.5870192,46.5204851,0 7.586853,46.520522,0 7.5867788,46.5204989,0 7.5867531,46.5204556,0 7.586698,46.520419,0 7.58654,46.520501,0 7.586356,46.520353,0 7.586116,46.520307,0 7.585928,46.520346,0 7.586103,46.520418,0 7.586086,46.520493,0 7.585796,46.520522,0 7.585176,46.5203633,0 7.5847859,46.5202177,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6265519,46.5699584,0 7.6262293,46.5697064,0 7.6258508,46.5695701,0 7.6252722,46.5695891,0 7.6245642,46.5694303,0 7.6239117,46.5688845,0 7.623715,46.5687,0 7.6236341,46.568349,0 7.62342,46.567928,0 7.6233636,46.567667,0 7.6230644,46.5674407,0 7.623046,46.567261,0 7.622904,46.567049,0 7.6228902,46.5669243,0 7.6225899,46.5663963,0 7.6221994,46.5658716,0 7.621795,46.565414,0 7.6214698,46.5652029,0 7.6213299,46.5649714,0 7.62114,46.564566,0 7.620754,46.564259,0 7.62047,46.563916,0 7.620153,46.563799,0 7.619982,46.563521,0 7.619814,46.563445,0 7.619689,46.563286,0 7.619159,46.562907,0 7.619115,46.562645,0 7.618927,46.562489,0 7.618964,46.562351,0 7.618862,46.56205,0 7.6183889,46.5610409,0 7.6180638,46.5608003,0 7.617347,46.560459,0 7.6172232,46.5604252,0 7.617017,46.560369,0 7.616846,46.5603423,0 7.6164317,46.5601639,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.618372,46.559119,0 7.618307,46.559387,0 7.618404,46.55956,0 7.618755,46.559665,0 7.618969,46.559649,0 7.619314,46.559828,0 7.619385,46.559913,0 7.619791,46.560116,0 7.619984,46.560295,0 7.6200836,46.5604261,0 7.620185,46.560498,0 7.6202482,46.5605223,0 7.6202935,46.5605318,0 7.6203308,46.5605679,0 7.6203162,46.5606165,0 7.620289,46.560703,0 7.620332,46.561026,0 7.620423,46.561139,0 7.620723,46.56129,0 7.620805,46.561706,0 7.6208667,46.5617554,0 7.6211,46.5618215,0 7.6212232,46.5618909,0 7.6212343,46.5621671,0 7.621288,46.5622445,0 7.6213723,46.5623164,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4499634,46.4388549,0 7.449004,46.4378119,0 7.4487208,46.4371258,0 7.4489182,46.4368774,0 7.4492358,46.4367177,0 7.4496821,46.4368892,0 7.4495619,46.4359014,0 7.4491671,46.4354518,0 7.4478625,46.4349549,0 7.4459484,46.4347183,0 7.4453047,46.434393,0 7.4449099,46.4337068,0 7.4447811,46.4330857,0 7.4444636,46.4330029,0 7.444043,46.4326302,0 7.4439314,46.4322634,0 7.4433821,46.4320268,0 7.4429959,46.4309502,0 7.4428843,46.4308082,0 7.4424895,46.4306544,0 7.4423521,46.4301752,0 7.4420946,46.430193,0 7.4416226,46.4297729,0 7.4408072,46.4295304,0 7.4405239,46.4290098,0 7.440481,46.4285247,0 7.4401892,46.4282999,0 7.4398373,46.4281756,0 7.439597,46.4278621,0 7.4393824,46.4273119,0 7.4392794,46.4266256,0 7.4386958,46.4261287,0 7.4388331,46.4257737,0 7.4388331,46.4254187,0 7.4386614,46.4251229,0 7.4386786,46.4236556,0 7.4386013,46.4233006,0 7.4382065,46.4226498,0 7.4386271,46.4224013,0 7.4388245,46.4221351,0 7.4388588,46.4218866,0 7.4398802,46.4208511,0 7.4397858,46.4204666,0 7.4394511,46.4201944,0 7.4392451,46.4198808,0 7.4397772,46.4188394,0 7.4395626,46.4185613,0 7.4395712,46.4181412,0 7.439185,46.4174962,0 7.4391678,46.4168808,0 7.4397257,46.4163187,0 7.4401034,46.4161767,0 7.4406613,46.4157625,0 7.4424637,46.4134132,0 7.4419144,46.413218,0 7.4419793,46.4126531,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4411642,46.3998745,0 7.4407992,46.3997408,0 7.4405978,46.3996171,0 7.440568,46.3996036,0 7.439607,46.3991398,0 7.4392012,46.3987612,0 7.4388588,46.3986409,0 7.4356488,46.3977589,0 7.4353398,46.3974985,0 7.4336403,46.3965928,0 7.4334086,46.3963205,0 7.432679,46.3958055,0 7.429941,46.3951426,0 7.4290913,46.3947104,0 7.4276236,46.3936508,0 7.4269198,46.3933371,0 7.4264391,46.3932246,0 7.4253662,46.3927096,0 7.4246882,46.392082,0 7.4240187,46.3917564,0 7.4232806,46.3916558,0 7.4219673,46.3907737,0 7.4212979,46.3905547,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4212979,46.3905547,0 7.4212979,46.3903416,0 7.4214094,46.3901462,0 7.4214094,46.3899982,0 7.4215296,46.3898028,0 7.4214867,46.3895838,0 7.421358,46.3895009,0 7.4211262,46.3895542,0 7.421049,46.3893411,0 7.4209288,46.3892049,0 7.4200018,46.3892641,0 7.4197358,46.3894654,0 7.4195813,46.3894772,0 7.4193152,46.3894654,0 7.4192208,46.3893055,0 7.4184483,46.3887786,0 7.4182337,46.3885951,0 7.4179419,46.3884412,0 7.417693,46.3884353,0 7.4176415,46.3887727,0 7.4177187,46.389051,0 7.4174355,46.3889622,0 7.4171952,46.3887727,0 7.4168175,46.3886129,0 7.4165171,46.3884708,0 7.4158905,46.388305,0 7.4157446,46.3881096,0 7.415633,46.3878787,0 7.4155644,46.387636,0 7.4154271,46.3874584,0 7.4151867,46.3876419,0 7.4148177,46.387488,0 7.4143628,46.3873696,0 7.4140967,46.3872038,0 7.4139851,46.3869492,0 7.4138306,46.3867479,0 7.4134358,46.3866532,0 7.413041,46.386671,0 7.4126719,46.386742,0 7.4119252,46.3866059,0 7.4115818,46.3866118,0 7.4112042,46.3866769,0 7.4108609,46.3868723,0 7.4105519,46.3869611,0 7.4103168,46.387076,0 7.4097279,46.3873637,0 7.4093932,46.3874406,0 7.4086121,46.3875117,0 7.4077366,46.3879202,0 7.4061402,46.3884116,0 7.4056166,46.3883524,0 7.4053334,46.3883524,0 7.4050673,46.3883879,0 7.4047583,46.3885537,0 7.404003,46.3885063,0 7.40287,46.388897,0 7.4025954,46.3889681,0 7.4022435,46.3890924,0 7.4017027,46.3891931,0 7.4012993,46.3891516,0 7.4006041,46.3888319,0 7.399411,46.3885833,0 7.3993252,46.3883761,0 7.3993338,46.3878965,0 7.3996256,46.3874466,0 7.399454,46.3872334,0 7.3994025,46.3869848,0 7.399557,46.3864638,0 7.3994883,46.3861796,0 7.3992308,46.3858007,0 7.3990334,46.3855461,0 7.3991879,46.3843086,0 7.3984326,46.383687,0 7.3977631,46.3834205,0 7.3966215,46.3832903,0 7.395892,46.3830297,0 7.3950852,46.3828758,0 7.394081,46.3824613,0 7.3934115,46.3821535,0 7.3931282,46.3819462,0 7.3927077,46.3816975,0 7.3925703,46.381591,0 7.3922528,46.381135,0 7.3916005,46.3808508,0 7.3911799,46.3807679,0 7.3904932,46.3805548,0 7.389592,46.3801521,0 7.3894886,46.3800737,0 7.3893345,46.3799567,0 7.3893345,46.3797791,0 7.3891371,46.379708,0 7.3889874,46.3795666,0 7.3889998,46.3793528,0 7.388974,46.3792521,0 7.3888281,46.3791929,0 7.3884676,46.3791929,0 7.3881758,46.3792284,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.3842169,46.3434602,0 7.3841439,46.3438004,0 7.3847101,46.3439064,0 7.3844032,46.3440306,0 7.3846307,46.3442059,0 7.384472,46.3446077,0 7.384091,46.3450132,0 7.3840434,46.3454953,0 7.3842868,46.3461382,0 7.3847683,46.34635,0 7.3851228,46.346803,0 7.3853715,46.3470586,0 7.3858901,46.3476723,0 7.3863028,46.3482859,0 7.387033,46.3486256,0 7.3874669,46.3491406,0 7.3872658,46.3495497,0 7.3875304,46.3498966,0 7.3881654,46.3499259,0 7.3878744,46.3501523,0 7.3882289,46.350145,0 7.3881178,46.3506308,0 7.3887263,46.3506271,0 7.3882359,46.3513098,0 7.3884405,46.3514744,0 7.3891496,46.3518433,0 7.3901285,46.3522524,0 7.3905994,46.3524715,0 7.3915043,46.3526687,0 7.3927689,46.3530376,0 7.3934092,46.3533919,0 7.3941976,46.3536694,0 7.3955522,46.3541442,0 7.3963459,46.3546299,0 7.3968221,46.3548052,0 7.3973618,46.3551668,0 7.3978287,46.3553046,0 7.3984467,46.3557607,0 7.3985926,46.3559384,0 7.398687,46.3560984,0 7.3988501,46.3563531,0 7.3991162,46.3565071,0 7.3995453,46.3570462,0 7.3996397,46.3574372,0 7.4000088,46.3576623,0 7.4003092,46.3577274,0 7.4005667,46.3579407,0 7.4003435,46.3582605,0 7.4003006,46.3586515,0 7.4005152,46.3586633,0 7.4005924,46.3588292,0 7.400807,46.3590069,0 7.4008585,46.3594452,0 7.4006525,46.3596526,0 7.4006354,46.3599665,0 7.4007384,46.3602034,0 7.4012877,46.3606773,0 7.4013735,46.3608965,0 7.4014851,46.361702,0 7.4016138,46.361939,0 7.4014851,46.3622647,0 7.400807,46.3625668,0 7.400807,46.3627327,0 7.4015881,46.3626557,0 7.4019057,46.362703,0 7.4023005,46.3630347,0 7.4025408,46.3632657,0 7.4027725,46.3633546,0 7.402867,46.3635797,0 7.4031588,46.3636152,0 7.4041544,46.3637159,0 7.4044462,46.3636803,0 7.4047638,46.3637218,0 7.4051844,46.3637218,0 7.405708,46.3635263,0 7.4062144,46.3634493,0 7.4067637,46.3632894,0 7.4070984,46.3636211,0 7.4073645,46.363787,0 7.408137,46.3639587,0 7.4091326,46.3640535,0 7.4095961,46.3640594,0 7.4099137,46.3642608,0 7.4103686,46.3645806,0 7.4104801,46.3648472,0 7.4109522,46.3652025,0 7.411141,46.365475,0 7.4114586,46.3656882,0 7.4116989,46.3658185,0 7.4121796,46.3660673,0 7.4128662,46.3660791,0 7.4131237,46.366239,0 7.4131409,46.3665055,0 7.4137589,46.3666773,0 7.413982,46.3668313,0 7.4143511,46.3669794,0 7.4148918,46.3672873,0 7.4155098,46.367542,0 7.4156128,46.3677315,0 7.4158617,46.36785,0 7.4164025,46.367927,0 7.4170204,46.3681106,0 7.4173981,46.3682231,0 7.4177672,46.3684304,0 7.4183165,46.368537,0 7.4186684,46.3686791,0 7.4189259,46.3685962,0 7.4191319,46.3687028,0 7.4194838,46.3687561,0 7.4198014,46.3686673,0 7.4200588,46.3687028,0 7.4202648,46.3689279,0 7.4202219,46.3692003,0 7.4205824,46.3693661,0 7.4211661,46.3695675,0 7.4221531,46.3697866,0 7.4224707,46.3701419,0 7.4230801,46.3700294,0 7.4233719,46.3700294,0 7.4235693,46.370444,0 7.4238783,46.370592,0 7.4241444,46.3708052,0 7.4243933,46.3709711,0 7.4246508,46.3710658,0 7.4257408,46.3708645,0 7.4260842,46.3708585,0 7.4263395,46.3709363,0 7.426376,46.3709474,0 7.4265734,46.3713382,0 7.4268652,46.3716284,0 7.4272343,46.3716521,0 7.4276377,46.3717409,0 7.4278179,46.3719482,0 7.4277664,46.3721969,0 7.4278351,46.3724338,0 7.4280926,46.3725582,0 7.4285733,46.3726648,0 7.4291397,46.3730083,0 7.4294316,46.3732984,0 7.4298865,46.3735649,0 7.4302813,46.3736597,0 7.4305216,46.3738433,0 7.4307791,46.3739735,0 7.4315087,46.3746072,0 7.431646,46.3748737,0 7.4324099,46.3751697,0 7.4329506,46.3755014,0 7.4332682,46.3756316,0 7.4339892,46.3755724,0 7.4346415,46.3757441,0 7.434899,46.3759277,0 7.4352938,46.3760165,0 7.43562,46.3761172,0 7.4360062,46.376135,0 7.4369589,46.3766798,0 7.4371821,46.3768929,0 7.4377743,46.3772186,0 7.4381777,46.37877,0 7.4383837,46.3789951,0 7.4382378,46.3794865,0 7.4385039,46.3796878,0 7.4392334,46.3799365,0 7.4395081,46.3801971,0 7.4395596,46.3809135,0 7.4407097,46.3815412,0 7.4406668,46.3818254,0 7.4408127,46.3820504,0 7.440787,46.3822991,0 7.44089,46.3825359,0 7.4416453,46.3827194,0 7.4417826,46.3829622,0 7.4422289,46.3833056,0 7.4428984,46.3833056,0 7.4436194,46.3831102,0 7.4444262,46.3831931,0 7.4447867,46.3831576,0 7.4451128,46.3830806,0 7.4454218,46.3831872,0 7.4457995,46.3831931,0 7.4468123,46.3828023,0 7.4474989,46.382151,0 7.448855,46.3817129,0 7.449207,46.3817425,0 7.4499108,46.3816004,0 7.4501425,46.3814227,0 7.4511811,46.3813695,0 7.4526402,46.381026,0 7.4528805,46.3811445,0 7.4531037,46.3812214,0 7.4537903,46.3812273,0 7.4545456,46.381026,0 7.4549834,46.3810142,0 7.4554039,46.3810912,0 7.4559189,46.3810675,0 7.4566742,46.3811563,0 7.4570347,46.3813043,0 7.4575669,46.3813635,0 7.4580389,46.381701,0 7.4583908,46.3817129,0 7.4590689,46.3818964,0 7.4594294,46.3818905,0 7.4598757,46.3819083,0 7.4603649,46.3819734,0 7.4605709,46.3820148,0 7.4609143,46.382151,0 7.4611073,46.3822106,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4681028,46.3828006,0 7.4685635,46.3827568,0 7.4690493,46.382662,0 7.469454,46.382552,0 7.4695566,46.3824441,0 7.4698788,46.3824318,0 7.4702351,46.3823567,0 7.4705841,46.3822218,0 7.4707965,46.3819506,0 7.4709561,46.3816876,0 7.4712107,46.3814354,0 7.4719174,46.3811665,0 7.4720289,46.3809119,0 7.4715655,46.3805211,0 7.4715578,46.3803844,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4773344,46.3802503,0 7.4784834,46.3804797,0 7.479522,46.3806514,0 7.481436,46.3807817,0 7.4856331,46.3808231,0 7.4888174,46.3808527,0 7.4920618,46.3819599,0 7.4971688,46.3817823,0 7.5060608,46.3832329,0 7.5186865,46.3873596,0 7.5244114,46.3897988,0 7.5249779,46.3906927,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5249779,46.3906927,0 7.5245058,46.3908348,0 7.5242569,46.3912137,0 7.5239479,46.3913499,0 7.5235617,46.3916636,0 7.5234329,46.3920425,0 7.5237677,46.3923503,0 7.5237248,46.3924806,0 7.5233729,46.3925398,0 7.5233128,46.3926522,0 7.5233214,46.3927825,0 7.522815,46.3936231,0 7.5228407,46.3938717,0 7.5227377,46.3940375,0 7.5228922,46.3945347,0 7.5232012,46.3946354,0 7.5235617,46.3946354,0 7.5238535,46.3947893,0 7.5238535,46.3952806,0 7.5239479,46.3954404,0 7.5242054,46.3954937,0 7.5242827,46.3960205,0 7.5242655,46.3965414,0 7.5241797,46.3968078,0 7.5242741,46.3970446,0 7.5246861,46.3970209,0 7.5250294,46.3969144,0 7.5254586,46.3969025,0 7.5259478,46.3968611,0 7.5260508,46.3976069,0 7.5264628,46.3978259,0 7.5265314,46.3979798,0 7.5264284,46.3982048,0 7.5266087,46.3985836,0 7.5269091,46.3987138,0 7.5269863,46.3989092,0 7.5269606,46.3991459,0 7.5271923,46.3992761,0 7.527158,46.3995366,0 7.5278961,46.3999036,0 7.5280936,46.4003061,0 7.5284329,46.4005085,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5284329,46.4005085,0 7.5284283,46.4009631,0 7.5287888,46.4013656,0 7.529072,46.401555,0 7.5293038,46.401774,0 7.5294411,46.4019811,0 7.5297501,46.4022001,0 7.5299475,46.4027328,0 7.5313036,46.4036384,0 7.5324194,46.4058933,0 7.5325138,46.4064674,0 7.5330717,46.4068048,0 7.5332262,46.4073492,0 7.5332691,46.4084382,0 7.5336468,46.4092075,0 7.533561,46.4094147,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.533561,46.4094147,0 7.5338185,46.4089767,0 7.5343077,46.408521,0 7.5394146,46.405408,0 7.5409853,46.4053429,0 7.5429079,46.4057513,0 7.5435517,46.4062484,0 7.5440838,46.4066509,0 7.5445301,46.4068166,0 7.5453541,46.4068225,0 7.5462296,46.4065858,0 7.5478604,46.4051417,0 7.5478432,46.4048043,0 7.548032,46.4044966,0 7.5486243,46.404177,0 7.5488045,46.4039166,0 7.5510447,46.4031175,0 7.5512764,46.402863,0 7.5519116,46.4027447,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5519116,46.4027447,0 7.5535424,46.4026973,0 7.5542977,46.4025789,0 7.5558941,46.4026204,0 7.5565464,46.4025197,0 7.5572932,46.4021232,0 7.5587351,46.401774,0 7.5594904,46.4015076,0 7.5599539,46.4011288,0 7.560941,46.4004718,0 7.5616619,46.399945,0 7.5617821,46.3993827,0 7.5619967,46.3991992,0 7.5620653,46.3988618,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5620653,46.3988618,0 7.5626404,46.3984415,0 7.5632241,46.3979147,0 7.563576,46.3978911,0 7.5648291,46.3976128,0 7.5652325,46.3976661,0 7.5661595,46.3980686,0 7.5670607,46.3982225,0 7.5689404,46.3990808,0 7.5700218,46.3994182,0 7.5704167,46.3994774,0 7.5709231,46.3998325,0 7.5716698,46.4000397,0 7.5719616,46.4003001,0 7.5723822,46.4003238,0 7.5727598,46.4002528,0 7.5731547,46.4002824,0 7.5734637,46.4000693,0 7.5739014,46.4000279,0 7.5741675,46.4001048,0 7.574279,46.4002114,0 7.5746567,46.4000811,0 + + + + Lämmernweg nord + Lämmernweg nord, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5746567,46.4000811,0 7.5745487,46.4005859,0 7.5747632,46.4010476,0 7.574892,46.4016217,0 7.575304,46.4014797,0 7.5758619,46.4012488,0 7.5763339,46.4004024,0 7.5762395,46.4000887,0 7.5764198,46.4000828,0 7.5762653,46.3998105,0 7.5760335,46.3995738,0 7.5760335,46.3991476,0 7.576703,46.3991535,0 7.5767803,46.3989819,0 7.577218,46.3991239,0 7.5771751,46.3988398,0 7.5767202,46.3983899,0 7.5771236,46.3984255,0 7.5772008,46.3983544,0 7.576909,46.3981887,0 7.5773607,46.3980323,0 7.5788917,46.397502,0 7.578866,46.3977743,0 7.5787458,46.3982064,0 7.5789775,46.3984136,0 7.5797243,46.3986326,0 7.5805225,46.39868,0 7.5812263,46.3988812,0 7.5831575,46.3990825,0 7.5835695,46.3991949,0 7.5845737,46.3996507,0 7.5849428,46.3997099,0 7.5857152,46.3996389,0 7.5857839,46.3994317,0 7.5853118,46.39897,0 7.5853204,46.3988635,0 7.5856723,46.3986445,0 7.5858268,46.3984669,0 7.5856122,46.3981946,0 7.5855693,46.3979282,0 7.5863418,46.3973777,0 7.5863075,46.3968687,0 7.5869941,46.396993,0 7.5880039,46.3968541,0 7.5881256,46.3965134,0 7.587925,46.3962126,0 7.5885906,46.3960459,0 7.5897493,46.3961228,0 7.5905303,46.3962767,0 7.5912256,46.3965431,0 7.5920152,46.3967325,0 7.5922813,46.396845,0 7.5926933,46.3969515,0 7.5933113,46.3969456,0 7.5947618,46.3974014,0 7.594985,46.3973718,0 7.595354,46.3974014,0 7.5972509,46.397875,0 7.597577,46.3980052,0 7.5983066,46.3981117,0 7.5987186,46.3980821,0 7.5994739,46.3979282,0 7.5999116,46.3979342,0 7.6005983,46.3979993,0 7.6023149,46.3979697,0 7.6037569,46.3976855,0 7.6041946,46.3976915,0 7.6045207,46.3978217,0 7.6046409,46.3979697,0 7.605422,46.3979697,0 7.6055936,46.3981768,0 7.6057052,46.3984195,0 7.6060056,46.3986267,0 7.6068811,46.3998224,0 7.6069841,46.4001006,0 7.6073961,46.4005563,0 7.6074905,46.4008108,0 7.6073875,46.4010831,0 7.6077308,46.4019354,0 7.6086578,46.40248,0 7.6087779,46.4026694,0 7.6097478,46.4032139,0 7.6101427,46.4035453,0 7.6102628,46.4037821,0 7.6120396,46.4045298,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6223005,46.4319807,0 7.6218319,46.4319245,0 7.6216002,46.4320073,0 7.6212483,46.4319067,0 7.6209393,46.4319067,0 7.6207762,46.4316878,0 7.6202698,46.4313152,0 7.6197205,46.430623,0 7.6196261,46.4300788,0 7.6191626,46.4296173,0 7.6190338,46.4291086,0 7.6188193,46.4290435,0 7.6188107,46.4287595,0 7.6186304,46.4285288,0 7.6188193,46.428097,0 7.6185618,46.4276,0 7.6169911,46.4264404,0 7.6170512,46.4261683,0 7.6174202,46.4257778,0 7.6176691,46.4257009,0 7.617446,46.4256003,0 7.6173258,46.4253223,0 7.6176262,46.4246182,0 7.6176262,46.4243342,0 7.6162014,46.4234113,0 7.6136437,46.4206423,0 7.6134892,46.4203819,0 7.6120301,46.4194826,0 7.6116696,46.4191039,0 7.6108971,46.4190388,0 7.6101933,46.418879,0 7.6100216,46.4187252,0 7.607687,46.4193583,0 7.6072665,46.4193997,0 7.6064167,46.4196778,0 7.6054211,46.4197784,0 7.6040049,46.4202695,0 7.6035757,46.4206245,0 7.6026831,46.4207547,0 7.6014643,46.4205239,0 7.6012669,46.420589,0 7.6007875,46.420399,0 7.6007789,46.4207135,0 7.6009446,46.420851,0 7.6012669,46.4208434,0 7.6013207,46.4211927,0 7.6010655,46.421439,0 7.6011759,46.4216698,0 7.6009562,46.4215633,0 7.6010091,46.4218257,0 7.6006785,46.4218724,0 7.6008396,46.4220273,0 7.6003657,46.4220445,0 7.6001339,46.4223759,0 7.5995094,46.4226935,0 7.5992772,46.4224137,0 7.5988342,46.4231467,0 7.5985281,46.4229856,0 7.5984798,46.4231628,0 7.5983912,46.423195,0 7.5983769,46.4233697,0 7.5971899,46.4232574,0 7.5961118,46.4229597,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5723588,46.4404035,0 7.572171,46.4403665,0 7.5717311,46.4401927,0 7.5716185,46.4400929,0 7.5714683,46.440019,0 7.5712591,46.4400116,0 7.5709855,46.4400375,0 7.5707798,46.4401998,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5603342,46.4434764,0 7.5606322,46.4434199,0 7.5607824,46.4433164,0 7.5610291,46.4433016,0 7.5612115,46.443309,0 7.5614261,46.4431907,0 7.5616943,46.4431759,0 7.5619779,46.4431581,0 7.5621449,46.443102,0 7.5622951,46.443028,0 7.5623917,46.4429171,0 7.5624561,46.4428062,0 7.562617,46.4427323,0 7.5628316,46.4427175,0 7.5631105,46.4426658,0 7.5633684,46.442614,0 7.5636792,46.4424809,0 7.5637328,46.4423479,0 7.5637757,46.4422074,0 7.563883,46.4421335,0 7.5640586,46.4420609,0 7.5642263,46.4419265,0 7.5643336,46.4417934,0 7.564516,46.4415864,0 7.5645482,46.4413572,0 7.5644447,46.4411958,0 7.5644624,46.4410245,0 7.5645027,46.440655,0 7.5644731,46.4404256,0 7.5644087,46.4401964,0 7.5644194,46.4401003,0 7.5645375,46.4399377,0 7.5645911,46.4398046,0 7.5645482,46.4396345,0 7.5644636,46.439478,0 7.5644553,46.4393461,0 7.5644516,46.4392871,0 7.5645298,46.4391761,0 7.5645267,46.4390209,0 7.5644927,46.4389173,0 7.5643867,46.438837,0 7.5642585,46.4387399,0 7.5641727,46.4385773,0 7.5640654,46.4384812,0 7.5640869,46.4383481,0 7.5640869,46.4381928,0 7.5640654,46.4380523,0 7.5638186,46.4379192,0 7.5635397,46.4377714,0 7.5633895,46.437727,0 7.5631964,46.4377344,0 7.5629818,46.437764,0 7.5627028,46.4377418,0 7.5625097,46.4377048,0 7.5622308,46.43769,0 7.5617587,46.4376679,0 7.5615015,46.4377341,0 7.5611472,46.437727,0 7.5608253,46.4376457,0 7.56039,46.4375687,0 7.5600421,46.4374534,0 7.5597417,46.4372982,0 7.5593769,46.4371133,0 7.5590597,46.4370482,0 7.5587593,46.4370482,0 7.5585293,46.4370246,0 7.5583577,46.4370616,0 7.558186,46.4371651,0 7.5580517,46.4372548,0 7.5579285,46.4372908,0 7.5577354,46.4372982,0 7.5575368,46.4372948,0 7.5573921,46.4372612,0 7.5573062,46.4371799,0 7.5571113,46.4371429,0 7.5569842,46.437187,0 7.5568771,46.4372242,0 7.5567376,46.4371799,0 7.5566089,46.4370985,0 7.5563643,46.4370678,0 7.5562333,46.4370172,0 7.5560724,46.4368398,0 7.5557827,46.436581,0 7.5555361,46.4364881,0 7.5553107,46.4364848,0 7.5551605,46.4366179,0 7.5549827,46.4367111,0 7.5553321,46.4370542,0 7.5555682,46.4373647,0 7.5557613,46.437483,0 7.5558256,46.4377566,0 7.5558839,46.4380538,0 7.5557827,46.4382076,0 7.5556969,46.438385,0 7.5556647,46.4385181,0 7.5556325,46.4386586,0 7.5555096,46.4386959,0 7.555418,46.4387917,0 7.5554659,46.4389223,0 7.5553965,46.4390283,0 7.5552034,46.43908,0 7.5550514,46.4391953,0 7.5549995,46.4393684,0 7.5550639,46.4395902,0 7.5551497,46.4397972,0 7.5553947,46.4399761,0 7.5555789,46.4400781,0 7.5556218,46.4403,0 7.5557981,46.4405675,0 7.5560402,46.4406696,0 7.556169,46.4407879,0 7.556253,46.4409697,0 7.5562763,46.4412685,0 7.5565981,46.4416233,0 7.5568881,46.4420225,0 7.5571238,46.442237,0 7.5574242,46.4423848,0 7.5576174,46.4424736,0 7.5577465,46.4425962,0 7.5578623,46.4428613,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5578623,46.4428613,0 7.5574675,46.4428376,0 7.5562401,46.4421989,0 7.5553904,46.4415956,0 7.5545922,46.4411993,0 7.5531674,46.4401583,0 7.5520945,46.4397857,0 7.5515452,46.4394486,0 7.5512276,46.4389458,0 7.5500603,46.4382479,0 7.5478888,46.4365917,0 7.5459061,46.435521,0 7.5430308,46.4344326,0 7.5427647,46.434196,0 7.5416146,46.4337878,0 7.5403786,46.4336045,0 7.5392456,46.4328177,0 7.5388594,46.4323326,0 7.5385161,46.4322143,0 7.538353,46.4320369,0 7.5376578,46.4320132,0 7.5371514,46.4324391,0 7.5367651,46.4324864,0 7.5366364,46.4326994,0 7.5354691,46.4325811,0 7.5352631,46.4330603,0 7.5350056,46.4329065,0 7.5343533,46.4329656,0 7.5341473,46.4326994,0 7.5336151,46.4325042,0 7.5332289,46.4325752,0 7.5329113,46.4324805,0 7.5324993,46.4327408,0 7.5314608,46.4328532,0 7.5309286,46.4325988,0 7.5305853,46.4326048,0 7.5302935,46.4323208,0 7.5299759,46.4321848,0 7.5298472,46.4319836,0 7.5296326,46.4310016,0 7.529727,46.4307473,0 7.5300188,46.4304278,0 7.5297613,46.4302385,0 7.5296583,46.4300374,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5099774,46.4268191,0 7.5097027,46.4267599,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.510046,46.4269729,0 7.5099774,46.4268191,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5097027,46.4267599,0 7.5091706,46.4267008,0 7.5088101,46.4268782,0 7.5086899,46.4270261,0 7.5082865,46.4270261,0 7.507514,46.4268901,0 7.507205,46.4267422,0 7.5070591,46.4265351,0 7.5070935,46.4263635,0 7.5055828,46.4258015,0 7.5046387,46.4252572,0 7.504201,46.4251566,0 7.5038748,46.4249614,0 7.5029049,46.4247543,0 7.50245,46.4245827,0 7.5018921,46.424636,0 7.5014286,46.4245354,0 + + + + Krummenbach + Krummenbach, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4421122,46.4525537,0 7.4426894,46.4528647,0 7.4433701,46.4534102,0 7.4441109,46.4543138,0 + + + + Krummenbach + Krummenbach, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4419716,46.4526353,0 7.4421122,46.4525537,0 + + + + Krummenbach + Krummenbach, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4408543,46.4522683,0 7.4415573,46.4524314,0 7.4419716,46.4526353,0 + + + + Krummenbach + Krummenbach, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4409061,46.4521561,0 7.4408543,46.4522683,0 + + + + Chäligang - Klettersteig + Chäligang - Klettersteig, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.560727,46.450533,0 7.5606144,46.4505986,0 7.5603311,46.4507338,0 7.5603426,46.4509315,0 7.5605864,46.4511387,0 7.5605865,46.4512611,0 7.560682,46.4513342,0 7.5607896,46.4513261,0 7.5611184,46.4513877,0 7.561297,46.4513409,0 7.5614312,46.4513311,0 7.5614866,46.4514444,0 7.5615925,46.4516057,0 7.5617415,46.4517005,0 7.5619471,46.4517731,0 7.561897,46.4519024,0 7.561663,46.4519071,0 7.5615552,46.4517685,0 7.561466,46.4516993,0 7.5612982,46.4516854,0 7.5611181,46.4516115,0 7.5608041,46.4515715,0 7.5606409,46.451533,0 7.5604993,46.4515084,0 7.5601961,46.451513,0 7.5603839,46.4516038,0 7.560233,46.4517454,0 7.5600529,46.4516916,0 7.5598755,46.4516727,0 + + + + Lischmattenstrasse + Lischmattenstrasse, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4394643,46.4538143,0 7.4390415,46.45383,0 7.4382168,46.4536333,0 7.437853,46.4534971,0 7.4376096,46.4533399,0 7.4375083,46.4531784,0 + + + + Kronenplatz + Kronenplatz, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4433518,46.4557718,0 7.442802,46.4557537,0 7.4423281,46.4556781,0 7.4422089,46.4564137,0 7.4423398,46.456437,0 7.4423078,46.4566492,0 7.4425442,46.4567004,0 + + + + Kronenplatz + Kronenplatz, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4427674,46.4559269,0 7.442802,46.4557537,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4382168,46.4536333,0 7.4375687,46.4542067,0 7.437657,46.4544786,0 7.4381129,46.4544954,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.60993,46.555202,0 7.6100086,46.5551481,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6100086,46.5551481,0 7.610275,46.555066,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6095758,46.5550283,0 7.609867,46.5551309,0 7.60993,46.555202,0 7.6099053,46.5554036,0 7.6099572,46.5557181,0 7.6101794,46.5559656,0 7.6108008,46.5563903,0 7.611201,46.5569152,0 7.6114692,46.5571666,0 7.6117685,46.5573938,0 7.612146,46.5574221,0 7.612332,46.5574959,0 7.6126626,46.5575627,0 7.6128563,46.5576717,0 7.613043,46.557777,0 7.613162,46.557793,0 7.613359,46.557997,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6093995,46.5548684,0 7.6095758,46.5550283,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5655203,46.4480124,0 7.5666754,46.448165,0 7.5673192,46.4478693,0 7.5689671,46.4480468,0 7.5695336,46.4481946,0 7.5695508,46.4500988,0 7.5691388,46.4506665,0 7.5698941,46.4505482,0 7.571027,46.4506665,0 7.5716794,46.4504891,0 7.571954,46.4505305,0 7.5729153,46.4498386,0 7.5735419,46.4491881,0 7.5738251,46.4491408,0 7.5767777,46.4471419,0 7.5782368,46.4464796,0 7.5799277,46.4461365,0 7.5812409,46.4461957,0 7.5844767,46.445971,0 7.5848286,46.4460833,0 7.5858243,46.4459355,0 7.5871375,46.4459355,0 7.5876954,46.4458113,0 7.5882103,46.4458349,0 7.5883391,46.4457344,0 7.5885708,46.4457699,0 7.5887854,46.4456575,0 7.5897639,46.4458704,0 7.5897553,46.4456989,0 7.5898583,46.4457521,0 7.5901244,46.4456871,0 7.5909655,46.4452672,0 7.5923474,46.4448946,0 7.592356,46.4448,0 7.592768,46.4446048,0 7.5932658,46.4445811,0 7.5939181,46.4442322,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5939181,46.4442322,0 7.5959351,46.4431026,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5959351,46.4431026,0 7.5961202,46.4418992,0 7.5961202,46.4410298,0 7.595837,46.440184,0 7.5952104,46.4388413,0 7.5955194,46.4386284,0 7.5955366,46.4382735,0 7.5956911,46.4379541,0 7.5960086,46.4378476,0 7.5962232,46.4374336,0 7.5963949,46.4374336,0 7.5964635,46.437197,0 7.596867,46.4373153,0 7.598163,46.4381493,0 7.5981802,46.4380251,0 7.5983862,46.4380251,0 7.5989269,46.4382794,0 7.5993475,46.4388118,0 7.5999225,46.4390306,0 7.6001886,46.4393323,0 7.6002916,46.4396103,0 7.6005491,46.4395748,0 7.6009868,46.439764,0 7.6019567,46.439486,0 7.6027034,46.4389951,0 7.6029008,46.4388768,0 7.60333,46.4383681,0 7.6034845,46.438309,0 7.6036864,46.4378485,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5612557,46.4542097,0 7.56213,46.454218,0 7.562429,46.454144,0 7.563113,46.454125,0 7.563817,46.454263,0 7.563935,46.454456,0 7.564016,46.454315,0 7.564211,46.454463,0 7.564278,46.454308,0 7.564431,46.454381,0 7.564714,46.454334,0 7.564919,46.454464,0 7.564952,46.454256,0 7.565156,46.454369,0 7.565617,46.454428,0 7.5655305,46.4542175,0 7.566296,46.4542338,0 7.5666072,46.454436,0 7.566648,46.454824,0 7.56674,46.454724,0 7.5668857,46.4548685,0 7.56691,46.454801,0 7.567052,46.45484,0 7.567039,46.4546492,0 7.566979,46.454446,0 7.566903,46.454271,0 7.56665,46.454115,0 7.566702,46.453914,0 7.566393,46.453903,0 7.566252,46.453641,0 7.5659897,46.4535926,0 7.5657596,46.4534666,0 7.565605,46.453159,0 7.5654002,46.4529654,0 7.5652784,46.453026,0 7.5651459,46.4530153,0 7.5649962,46.453114,0 7.5648026,46.4530815,0 7.5646282,46.4530737,0 7.5646996,46.4529048,0 7.5645424,46.4527662,0 7.5645097,46.4524439,0 7.5645156,46.4522983,0 7.5643691,46.4522325,0 7.5643648,46.4520902,0 7.5642225,46.4520855,0 7.564087,46.452081,0 7.563577,46.451855,0 7.563358,46.451667,0 7.562807,46.451031,0 7.562811,46.450662,0 7.562459,46.450526,0 7.562297,46.450575,0 7.562138,46.450756,0 7.56196,46.450604,0 7.561888,46.450871,0 7.561585,46.450997,0 7.561227,46.450721,0 7.561186,46.450498,0 7.560727,46.450533,0 7.56057,46.450445,0 7.56074,46.450354,0 7.560304,46.450156,0 7.560038,46.450138,0 7.560136,46.449986,0 7.5603797,46.4499063,0 7.5604193,46.4498809,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5603797,46.4499063,0 7.560335,46.449238,0 7.560977,46.449165,0 7.561242,46.449273,0 7.560913,46.448711,0 7.560942,46.448252,0 7.560985,46.448126,0 7.561464,46.447771,0 7.5615495,46.4474679,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.610275,46.555066,0 7.6105103,46.555047,0 7.6107934,46.5551847,0 7.6109108,46.5551734,0 7.6110474,46.5552324,0 7.6114422,46.5551757,0 7.6119279,46.5551549,0 7.6122496,46.5548187,0 7.6123306,46.5545839,0 7.612552,46.554217,0 7.612904,46.554303,0 7.61296,46.554373,0 7.6130079,46.5544692,0 7.6130907,46.5545095,0 7.6132761,46.5545054,0 7.6134222,46.5545429,0 7.6135505,46.5546015,0 7.613591,46.554708,0 7.6135566,46.5548319,0 7.6135434,46.5549507,0 7.613595,46.5551225,0 7.6136905,46.555167,0 7.613754,46.55517,0 7.6138063,46.5551517,0 7.613901,46.555171,0 7.6139027,46.555118,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.617521,46.559201,0 7.6174601,46.5593795,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4246182,46.4549791,0 7.411038,46.4488524,0 7.4096398,46.4473342,0 7.4094562,46.4479668,0 7.4081709,46.4475873,0 7.4071281,46.4487423,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5359591,46.4821973,0 7.5356587,46.4821315,0 7.5352401,46.4817035,0 7.5341426,46.4802405,0 7.5343946,46.47985,0 7.5341784,46.4798098,0 7.5334093,46.4782263,0 7.5320814,46.4778883,0 7.5322482,46.4776474,0 7.5324047,46.4775918,0 7.5324047,46.4774868,0 7.5322359,46.477493,0 7.5319641,46.4772829,0 7.5311872,46.4771753,0 7.5311809,46.4769707,0 7.5303944,46.4766186,0 7.5299839,46.4762294,0 7.5298295,46.47583,0 7.5293827,46.4753729,0 7.5295227,46.4751876,0 7.5292591,46.475342,0 7.5294671,46.4757332,0 7.5293889,46.4760874,0 7.5295206,46.4765218,0 7.5292797,46.4765918,0 7.527116,46.4756238,0 7.5268425,46.4756158,0 7.5267259,46.4754911,0 7.5259256,46.4754067,0 7.5254631,46.4754831,0 7.5253666,46.4753584,0 7.525447,46.4752619,0 7.5251052,46.4753504,0 7.5249725,46.4752498,0 7.5247593,46.47529,0 7.5245301,46.4750689,0 7.5222742,46.4741891,0 7.5200561,46.4732089,0 7.5179775,46.47215,0 7.517934,46.471763,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.469009,46.453963,0 7.468853,46.454502,0 7.468722,46.454633,0 7.468855,46.454838,0 7.468892,46.455254,0 7.468526,46.45547,0 7.468214,46.455827,0 7.467811,46.456011,0 7.467729,46.456012,0 7.467757,46.45589,0 7.4676573,46.4558604,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4563512,46.4596817,0 7.455519,46.460138,0 7.454885,46.460326,0 7.454269,46.460142,0 7.453772,46.460157,0 7.453588,46.460227,0 7.453646,46.46034,0 7.453343,46.460297,0 7.45308,46.460158,0 7.452336,46.460143,0 7.452167,46.460202,0 7.4516199,46.4601237,0 7.451444,46.460176,0 7.451314,46.459955,0 7.451083,46.460086,0 7.450785,46.459827,0 7.450364,46.460159,0 7.450148,46.460235,0 7.449941,46.460206,0 7.449216,46.460572,0 7.449004,46.460411,0 7.44851,46.460273,0 7.448482,46.460149,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.462649,46.457567,0 7.462344,46.457799,0 7.461469,46.458186,0 7.460724,46.458266,0 7.459338,46.45872,0 7.458959,46.458929,0 7.4592,46.459053,0 7.458746,46.459142,0 7.458955,46.45922,0 7.458388,46.459277,0 7.458083,46.459431,0 7.457836,46.45934,0 7.457735,46.459414,0 7.457338,46.459278,0 7.45734,46.459367,0 7.457047,46.459355,0 7.4569312,46.4594356,0 7.4568436,46.4593926,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5805282,46.4980101,0 7.580457,46.497915,0 7.580459,46.4978244,0 7.580511,46.497795,0 7.580503,46.497773,0 7.580458,46.497732,0 7.5804891,46.4976849,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5919258,46.5139835,0 7.59165,46.514158,0 7.591592,46.514182,0 7.591323,46.514218,0 7.5911034,46.5143796,0 7.590773,46.514376,0 7.590312,46.514486,0 7.590308,46.514779,0 7.59027,46.515012,0 7.590204,46.515141,0 7.590222,46.51527,0 7.590202,46.515354,0 7.5903489,46.5153277,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5892426,46.5172029,0 7.589245,46.51707,0 7.5896037,46.5169541,0 7.590129,46.516719,0 7.590166,46.516508,0 7.590272,46.516442,0 7.590262,46.516414,0 7.590288,46.516298,0 7.590159,46.516075,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6058722,46.5395795,0 7.605907,46.539608,0 7.606061,46.539669,0 7.606172,46.539786,0 7.606187,46.539933,0 7.606162,46.540082,0 7.606252,46.540169,0 7.606368,46.540183,0 7.606546,46.540228,0 7.606795,46.540172,0 7.6069728,46.5401954,0 7.6069839,46.540212,0 7.606977,46.54025,0 7.606945,46.540322,0 7.606899,46.540361,0 7.606783,46.540417,0 7.606721,46.540496,0 7.606687,46.54052,0 7.606704,46.540646,0 7.606769,46.540707,0 7.606912,46.540757,0 7.60689,46.540889,0 7.606769,46.541122,0 7.606776,46.541186,0 7.606741,46.541226,0 7.606698,46.541421,0 7.606723,46.541467,0 7.606758,46.541487,0 7.606836,46.541643,0 7.606804,46.541701,0 7.606704,46.541808,0 7.606563,46.541924,0 7.606524,46.54199,0 7.606496,46.54206,0 7.606482,46.542063,0 7.606335,46.542319,0 7.606275,46.542406,0 7.606165,46.542443,0 7.606051,46.542553,0 7.605977,46.542663,0 7.605846,46.542743,0 7.60584,46.542865,0 7.605849,46.542887,0 7.605854,46.543004,0 7.605862,46.543182,0 7.605813,46.543282,0 7.605779,46.543294,0 7.605665,46.543297,0 7.605658,46.543321,0 7.605681,46.54336,0 7.605737,46.543391,0 7.605848,46.543431,0 7.605892,46.543428,0 7.605933,46.54344,0 7.605991,46.543483,0 7.60606,46.543547,0 7.606112,46.543597,0 7.606128,46.54365,0 7.606131,46.543807,0 7.606054,46.543956,0 7.6060019,46.5440194,0 7.605943,46.544046,0 7.605853,46.544099,0 7.605849,46.544168,0 7.605627,46.544263,0 7.605574,46.544402,0 7.605544,46.544518,0 7.605557,46.544576,0 7.605547,46.544633,0 7.605483,46.544684,0 7.605391,46.54472,0 7.605297,46.544742,0 7.605232,46.544778,0 7.605228,46.5448,0 7.605172,46.544869,0 7.6050221,46.5448767,0 7.604923,46.544864,0 7.60484,46.544879,0 7.604813,46.544902,0 7.604666,46.544998,0 7.604385,46.545125,0 7.6043368,46.5451739,0 7.604278,46.545281,0 7.60427,46.54534,0 7.604196,46.545481,0 7.604145,46.545502,0 7.604087,46.545512,0 7.603974,46.54558,0 7.603963,46.545603,0 7.603971,46.545623,0 7.603991,46.545636,0 7.604007,46.545671,0 7.604075,46.545699,0 7.604147,46.545758,0 7.604227,46.545806,0 7.604331,46.545844,0 7.604501,46.545838,0 7.60457,46.545911,0 7.604731,46.545867,0 7.604802,46.545883,0 7.604924,46.545865,0 7.604943,46.545883,0 7.605024,46.545883,0 7.605061,46.545915,0 7.605529,46.545902,0 7.605706,46.545864,0 7.605893,46.545934,0 7.606173,46.545897,0 7.6063485,46.5458893,0 7.6064439,46.5457843,0 7.606512,46.545831,0 7.606506,46.545981,0 7.606369,46.546097,0 7.606301,46.546263,0 7.606217,46.546344,0 7.606064,46.546443,0 7.606008,46.546533,0 7.606166,46.546699,0 7.606052,46.546836,0 7.6061285,46.5469487,0 7.606261,46.546939,0 7.606655,46.546994,0 7.607231,46.547225,0 7.607152,46.547353,0 7.607194,46.54744,0 7.60725,46.547455,0 7.607299,46.547533,0 7.607272,46.54762,0 7.607157,46.547774,0 7.607063,46.547823,0 7.607008,46.54784,0 7.606921,46.547907,0 7.606908,46.547935,0 7.607034,46.547886,0 7.607103,46.547916,0 7.6077006,46.5479132,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5816826,46.510603,0 7.5816199,46.5104057,0 7.5815976,46.510255,0 7.5814942,46.5099865,0 7.5814306,46.5099385,0 7.5813666,46.5097595,0 7.5812168,46.5096608,0 7.581074,46.509605,0 7.580956,46.509462,0 7.58117,46.509261,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5817563,46.5106037,0 7.5816826,46.510603,0 7.581587,46.510645,0 7.5815173,46.5107508,0 7.581501,46.510818,0 7.581546,46.5109334,0 7.5817095,46.5110604,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5820585,46.510608,0 7.5817563,46.5106037,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5751846,46.4916084,0 7.575377,46.491636,0 7.575561,46.491752,0 7.5756106,46.4917412,0 7.575728,46.491716,0 7.575891,46.491602,0 7.576027,46.491461,0 7.576068,46.491431,0 7.5763871,46.4912304,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5785473,46.524736,0 7.5785046,46.5247628,0 7.5783963,46.5246919,0 7.578219,46.52477,0 7.578012,46.524791,0 7.577872,46.524792,0 7.577779,46.524725,0 7.5777363,46.5246185,0 7.577476,46.524428,0 7.577197,46.524302,0 7.577086,46.524206,0 7.5770596,46.5241235,0 7.5771338,46.5239975,0 7.5771004,46.523902,0 7.5770609,46.5237564,0 7.576847,46.5235427,0 7.576721,46.523295,0 7.576719,46.523211,0 7.5764009,46.5230245,0 7.5762273,46.5227649,0 7.576096,46.522687,0 7.5759724,46.5226336,0 7.5757443,46.5226509,0 7.5756484,46.522612,0 7.5758244,46.5224861,0 7.575548,46.522413,0 7.5752814,46.5223836,0 7.5750582,46.522382,0 7.5749471,46.5223416,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6212158,46.4102508,0 7.6212492,46.4100544,0 7.6211982,46.4097513,0 7.6210007,46.4091406,0 7.6207267,46.4087452,0 7.6204904,46.4083771,0 7.620217,46.4075677,0 7.620217,46.4073832,0 7.6198856,46.4070185,0 7.6198283,46.4067857,0 7.619621,46.4066037,0 7.619344,46.4063771,0 7.6189554,46.4061266,0 7.618675,46.4058191,0 7.6178658,46.4053226,0 7.6174956,46.405028,0 7.6149472,46.4029894,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.605321,46.550618,0 7.6061811,46.5507498,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6047518,46.55048,0 7.605321,46.550618,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.605639,46.551512,0 7.605518,46.551205,0 7.605264,46.550932,0 7.605187,46.550759,0 7.6052305,46.5506929,0 7.605321,46.550618,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6172232,46.5604252,0 7.617237,46.560489,0 7.6173791,46.5605246,0 7.6174549,46.560685,0 7.617571,46.560749,0 7.617485,46.560801,0 7.617071,46.560756,0 7.6169366,46.5607994,0 7.6169276,46.5608025,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.613359,46.557997,0 7.613697,46.558202,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.613697,46.558202,0 7.6138249,46.5582483,0 7.6139093,46.5582304,0 7.6140763,46.5582933,0 7.614314,46.558345,0 7.614538,46.558564,0 7.614538,46.558685,0 7.614618,46.558742,0 7.614736,46.559067,0 7.615214,46.559535,0 7.616327,46.560016,0 7.6164317,46.5601639,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6070675,46.5503877,0 7.6072145,46.5505602,0 7.6073825,46.5506985,0 7.6073485,46.5507163,0 7.6068988,46.5507717,0 7.6068687,46.550799,0 7.606966,46.5508537,0 7.6070453,46.5509456,0 7.6069006,46.5509478,0 7.6065934,46.5508793,0 7.6064744,46.5508128,0 7.6061811,46.5507498,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5453714,46.5078755,0 7.545088,46.507775,0 7.5449722,46.5077871,0 7.5448429,46.507819,0 7.5445859,46.5078239,0 7.5442708,46.507799,0 7.544171,46.5077577,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5596756,46.5135221,0 7.5598557,46.5136074,0 7.5600289,46.5136176,0 7.5602821,46.5135897,0 7.5605638,46.5135813,0 7.5607673,46.5135679,0 7.5610239,46.5134916,0 7.5612473,46.5134206,0 7.5614853,46.5133285,0 7.5616609,46.5132468,0 7.5621499,46.5130522,0 7.562457,46.512863,0 7.562552,46.512868,0 7.562705,46.51281,0 7.562819,46.512666,0 7.562913,46.512718,0 7.563163,46.512741,0 7.56333,46.51267,0 7.563476,46.512661,0 7.563577,46.512724,0 7.563753,46.512733,0 7.564089,46.512938,0 7.564319,46.512998,0 7.56442,46.513007,0 7.564595,46.513001,0 7.56478,46.513029,0 7.565151,46.513025,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6260233,46.4823623,0 7.6258492,46.4823721,0 7.6255624,46.482439,0 7.6255071,46.4823834,0 7.6254122,46.4823258,0 7.6253676,46.4823044,0 7.625279,46.4822506,0 7.6251996,46.4822146,0 7.6250474,46.4821868,0 7.6250248,46.4823099,0 7.6247359,46.4822272,0 7.6247046,46.4824268,0 7.6245089,46.4823389,0 7.6243517,46.4822979,0 7.6242366,46.4822368,0 7.6242534,46.4824095,0 7.6242673,46.4825683,0 7.624107,46.4827243,0 7.623839,46.4830581,0 7.6236473,46.4832026,0 7.6233765,46.4833475,0 7.6232286,46.4834129,0 7.6228172,46.483644,0 7.622597,46.4838189,0 7.6224068,46.4839382,0 7.6221757,46.4841363,0 7.6218884,46.4843664,0 7.6217534,46.4844727,0 7.6215819,46.4845375,0 7.6213635,46.484593,0 7.6209341,46.4846251,0 7.6207812,46.4845936,0 7.6207351,46.4845971,0 7.6204754,46.4847285,0 7.6203775,46.48474,0 7.6202873,46.4847746,0 7.6202196,46.4847767,0 7.6200436,46.4847224,0 7.6198617,46.4847643,0 7.6195668,46.4847474,0 7.6193562,46.4847566,0 7.6190013,46.4847732,0 7.6186967,46.484811,0 7.6181212,46.4848624,0 7.6179412,46.4849032,0 7.6176836,46.4849937,0 7.6174843,46.4850212,0 7.6171033,46.4850063,0 7.6167943,46.4849573,0 7.6166793,46.4849163,0 7.6164843,46.4849707,0 7.6162531,46.4850023,0 7.6161673,46.4850224,0 7.6160972,46.4850741,0 7.6159545,46.4851447,0 7.6157593,46.4852007,0 7.6155646,46.4852336,0 7.6153623,46.4851233,0 7.6151993,46.4850703,0 7.6148583,46.4850343,0 7.6146363,46.4850853,0 7.6144973,46.4851353,0 7.6143253,46.4850743,0 7.6142553,46.4850173,0 7.6141723,46.4850003,0 7.6141023,46.4850283,0 7.6140603,46.4849993,0 7.6139823,46.4850153,0 7.61393,46.4850566,0 7.6138763,46.4850313,0 7.6138204,46.485091,0 7.6138023,46.4850633,0 7.6137593,46.4850763,0 7.6137203,46.4851253,0 7.6136753,46.4850863,0 7.6136393,46.4851503,0 7.6135663,46.4851123,0 7.6134953,46.4851663,0 7.6134643,46.4851073,0 7.6133643,46.4850353,0 7.6131953,46.4851953,0 7.6131063,46.4852473,0 7.6130853,46.4852793,0 7.6130183,46.4852923,0 7.6129953,46.4852803,0 7.6129803,46.4852453,0 7.6129063,46.4852833,0 7.6128523,46.4852753,0 7.6127303,46.4853543,0 7.6126483,46.4853683,0 7.6125433,46.4852773,0 7.6125053,46.4852903,0 7.6124663,46.4854113,0 7.6123263,46.4853613,0 7.6122583,46.4854193,0 7.612167,46.4853973,0 7.6120713,46.4855123,0 7.6119925,46.4855088,0 7.6119353,46.4854393,0 7.6118633,46.4854613,0 7.6118213,46.4854213,0 7.6114833,46.4856083,0 7.6113663,46.4856453,0 7.6112993,46.4857083,0 7.6113003,46.4857633,0 7.6113783,46.4858083,0 7.6114313,46.4858753,0 7.6114213,46.4859843,0 7.6113973,46.4860683,0 7.6112723,46.4862103,0 7.6112803,46.4862563,0 7.6112453,46.4863273,0 7.6112083,46.4862903,0 7.6111353,46.4862603,0 7.6109813,46.4862273,0 7.6108473,46.4862523,0 7.6105723,46.4864223,0 7.6105023,46.4864773,0 7.6104753,46.4865503,0 7.6104843,46.4865943,0 7.6103863,46.4866243,0 7.6103183,46.4866933,0 7.6101963,46.4867383,0 7.6098853,46.4869373,0 7.6098613,46.4870003,0 7.6096883,46.4871263,0 7.6096513,46.4871703,0 7.6094163,46.4872503,0 7.6093613,46.4872833,0 7.6093253,46.4873503,0 7.6091903,46.4874413,0 7.6088393,46.4876083,0 7.6083365,46.4877988,0 7.6080993,46.4878713,0 7.6079583,46.4879443,0 7.6076133,46.4880403,0 7.6072793,46.4881793,0 7.6070183,46.4882273,0 7.6063493,46.4884033,0 7.6062343,46.4884653,0 7.6059453,46.4885003,0 7.6057283,46.4885073,0 7.6053583,46.4886603,0 7.6049373,46.4887813,0 7.6048723,46.4887823,0 7.6046523,46.4888563,0 7.6046073,46.4888983,0 7.6044753,46.4888563,0 7.6043778,46.4887387,0 7.6043431,46.4886956,0 7.6043857,46.488565,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6155646,46.4852336,0 7.615535,46.485289,0 7.615492,46.485321,0 7.615502,46.485336,0 7.615555,46.485348,0 7.61559,46.485422,0 7.615556,46.485471,0 7.615536,46.48548,0 7.615488,46.485564,0 7.615401,46.485584,0 7.615524,46.485579,0 7.61562,46.485595,0 7.615819,46.485559,0 7.615941,46.485561,0 7.616144,46.485543,0 7.616285,46.485512,0 7.616448,46.485431,0 7.616671,46.485489,0 7.616797,46.485459,0 7.6168,46.485484,0 7.616873,46.485518,0 7.616883,46.485555,0 7.616845,46.485562,0 7.616772,46.485599,0 7.616718,46.485614,0 7.616657,46.485688,0 7.616609,46.48571,0 7.61657,46.48576,0 7.61656,46.485821,0 7.616501,46.485897,0 7.616542,46.485957,0 7.616525,46.485996,0 7.616622,46.486006,0 7.616723,46.485977,0 7.616802,46.485984,0 7.616924,46.486036,0 7.616961,46.486095,0 7.617153,46.486238,0 7.61727,46.486222,0 7.617359,46.486187,0 7.617604,46.486188,0 7.61774,46.486219,0 7.617793,46.486254,0 7.617831,46.486349,0 7.617833,46.48642,0 7.617861,46.486485,0 7.618009,46.486485,0 7.618205,46.486437,0 7.618295,46.486464,0 7.618329,46.486456,0 7.618436,46.486472,0 7.618602,46.486572,0 7.618792,46.486605,0 7.618953,46.486676,0 7.6192585,46.4867677,0 7.619325,46.48681,0 7.619549,46.48683,0 7.6197,46.486865,0 7.6199131,46.4869774,0 7.620189,46.487069,0 7.620236,46.487135,0 7.620337,46.487182,0 7.620472,46.487222,0 7.620583,46.487237,0 7.620652,46.487236,0 7.62087,46.487189,0 7.620953,46.48718,0 7.621037,46.487226,0 7.621099,46.48729,0 7.621169,46.487408,0 7.621125,46.487441,0 7.621083,46.487496,0 7.621073,46.487531,0 7.621001,46.487586,0 7.620807,46.487651,0 7.620689,46.48773,0 7.6205198,46.4878324,0 7.620482,46.487876,0 7.620496,46.487948,0 7.620563,46.487987,0 7.620704,46.488001,0 7.620883,46.488074,0 7.621437,46.48835,0 7.621532,46.488359,0 7.621586,46.488383,0 7.62157,46.488455,0 7.621615,46.48847,0 7.621711,46.488469,0 7.621795,46.488546,0 7.6219173,46.4885762,0 7.622028,46.4885985,0 7.6222705,46.4887699,0 7.622325,46.48893,0 7.622321,46.489149,0 7.622263,46.48936,0 7.622314,46.489402,0 7.62232,46.48944,0 7.622254,46.489487,0 7.622105,46.489527,0 7.621746,46.489663,0 7.621668,46.489673,0 7.621407,46.490046,0 7.621412,46.490111,0 7.6214,46.49014,0 7.621378,46.490162,0 7.62133,46.490311,0 7.621239,46.490413,0 7.621209,46.490417,0 7.621155,46.490499,0 7.6210982,46.4905384,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6210982,46.4905384,0 7.620964,46.4905577,0 7.6209202,46.490512,0 7.6207783,46.4905281,0 7.6206561,46.4906049,0 7.6205331,46.4906336,0 7.6203543,46.4906494,0 7.6202419,46.4906959,0 7.6200854,46.490772,0 7.6200422,46.4908145,0 7.6199348,46.490882,0 7.6198603,46.4909638,0 7.6198001,46.4910073,0 7.6198169,46.4910749,0 7.61978,46.491125,0 7.619825,46.491157,0 7.6199204,46.491208,0 7.6199692,46.4912974,0 7.6199436,46.4913231,0 7.6200376,46.4914214,0 7.6200257,46.4914703,0 7.620043,46.4915465,0 7.6200862,46.4916029,0 7.6201401,46.491697,0 7.6202303,46.4919044,0 7.620279,46.49209,0 7.6202839,46.4921193,0 7.620283,46.492293,0 7.6202503,46.492356,0 7.6202655,46.4924072,0 7.6202963,46.492469,0 7.6203822,46.4924904,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.590707,46.478723,0 7.590711,46.478539,0 7.590772,46.478439,0 7.590744,46.478278,0 7.590758,46.478056,0 7.59075,46.477896,0 7.5907974,46.4776477,0 7.59091,46.477543,0 7.590919,46.47749,0 7.590799,46.477172,0 7.590746,46.477112,0 7.590719,46.4770114,0 7.590691,46.4769634,0 7.590748,46.476776,0 7.590759,46.476723,0 7.5907497,46.476653,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5907497,46.476653,0 7.59074,46.47658,0 7.590712,46.476443,0 7.590647,46.476366,0 7.590672,46.475923,0 7.590589,46.475456,0 7.5904172,46.4757219,0 7.590124,46.47586,0 7.59005,46.475799,0 7.58971,46.475946,0 7.589323,46.475984,0 7.589385,46.476094,0 7.589159,46.476482,0 7.5888497,46.4765801,0 7.588444,46.476598,0 7.588278,46.476609,0 7.587762,46.476493,0 7.587559,46.476305,0 7.587223,46.476143,0 7.586993,46.476253,0 7.586734,46.476292,0 7.586469,46.47637,0 7.586058,46.476531,0 7.5858106,46.4766097,0 7.585545,46.476709,0 7.585407,46.476925,0 7.585245,46.47706,0 7.5850914,46.4772674,0 7.585041,46.477479,0 7.5848927,46.4776871,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5897212,46.4818723,0 7.589943,46.481844,0 7.5900556,46.4818181,0 7.590092,46.481759,0 7.589998,46.481475,0 7.58998,46.481335,0 7.590041,46.481122,0 7.5900774,46.481021,0 7.590016,46.480837,0 7.5900969,46.4806249,0 7.590166,46.480569,0 7.590156,46.4804,0 7.590309,46.480142,0 7.590366,46.480088,0 7.590412,46.479927,0 7.590453,46.479764,0 7.590448,46.479591,0 7.590517,46.479423,0 7.590573,46.479359,0 7.590686,46.479229,0 7.5907469,46.4790091,0 7.590726,46.478903,0 7.590707,46.478723,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6011402,46.490361,0 7.6011243,46.4902803,0 7.6011843,46.4901643,0 7.6014333,46.4899023,0 7.6016833,46.4894923,0 7.6017903,46.4891893,0 7.6017893,46.4889183,0 7.6015133,46.4888943,0 7.6012443,46.4886913,0 7.6012193,46.4886393,0 7.6012223,46.4882563,0 7.6012023,46.4882303,0 7.6009833,46.4882253,0 7.6009323,46.4882113,0 7.6006563,46.4882393,0 7.6003743,46.4883773,0 7.6001003,46.4884293,0 7.5999913,46.4883763,0 7.5997933,46.4883763,0 7.5996383,46.4884183,0 7.5995314,46.4883839,0 7.5993911,46.4885099,0 7.5992613,46.4884893,0 7.5990153,46.4885893,0 7.5989113,46.4885563,0 7.5987673,46.4886813,0 7.5987023,46.4886663,0 7.5985929,46.4886894,0 7.5984759,46.4887644,0 7.5984259,46.4889354,0 7.5983769,46.4888704,0 7.5982989,46.4888604,0 7.5982569,46.4887774,0 7.5982034,46.4887503,0 7.5981799,46.4887724,0 7.5981329,46.4887394,0 7.5980599,46.4887434,0 7.5980329,46.4888104,0 7.5979589,46.4885316,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5979589,46.4885316,0 7.5978355,46.488491,0 7.5977604,46.4884577,0 7.5976853,46.488454,0 7.5975887,46.488491,0 7.5974899,46.4885634,0 7.5972776,46.4886018,0 7.5970898,46.4887237,0 7.5969075,46.488768,0 7.5967733,46.4888603,0 7.5966285,46.4888714,0 7.5965319,46.4887827,0 7.5964461,46.4887163,0 7.5963764,46.4887089,0 7.5963281,46.4886055,0 7.596404,46.4883944,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5922214,46.488268,0 7.5923677,46.4881323,0 7.5925617,46.4879943,0 7.5926257,46.4879633,0 7.5927327,46.4878773,0 7.5928177,46.4877743,0 7.5928317,46.4877043,0 7.5927997,46.4874863,0 7.5927757,46.4874453,0 7.5924828,46.4871774,0 7.5922205,46.4870198,0 7.592117,46.4869065,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4419793,46.4126531,0 7.4419058,46.4125374,0 7.4412531,46.4122448,0 7.4409621,46.4121367,0 7.4400956,46.4120547,0 7.4397671,46.4120185,0 7.4393406,46.4117801,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4396951,46.4114482,0 7.4412106,46.4111941,0 7.4415882,46.4111763,0 7.4425324,46.4115077,0 7.4430285,46.4114178,0 7.4434583,46.4112146,0 7.4437284,46.4109221,0 7.4441582,46.410684,0 7.4448156,46.4103702,0 7.4448583,46.4102856,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4448583,46.4102856,0 7.4453851,46.4101867,0 7.4457995,46.4099307,0 7.4460429,46.4095548,0 7.4466952,46.4082055,0 7.4468089,46.4080037,0 7.44678,46.4078413,0 7.4465215,46.407632,0 7.4462232,46.4075539,0 7.4462137,46.4073898,0 7.4464603,46.4072978,0 7.4464994,46.4071501,0 7.4465756,46.4070943,0 7.4464327,46.4070516,0 7.4463232,46.4069827,0 7.4462423,46.4067824,0 7.4464797,46.406528,0 7.4467295,46.4064004,0 7.447149,46.4061475,0 7.4472186,46.4059651,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4411642,46.3998745,0 7.4411731,46.3997126,0 7.4414034,46.3994827,0 7.4414034,46.3994032,0 7.4415671,46.3992862,0 7.4417733,46.3992444,0 7.44184,46.3991273,0 7.4417611,46.398935,0 7.4418824,46.3986925,0 7.4421067,46.3983329,0 7.4421916,46.398036,0 7.4423553,46.3976848,0 7.4425069,46.3974548,0 7.4427736,46.3970869,0 7.4427069,46.3969447,0 7.4427615,46.3967106,0 7.4428949,46.3964346,0 7.4429858,46.3962548,0 7.4429797,46.3961378,0 7.4427979,46.396121,0 7.4422643,46.3962047,0 7.4420582,46.3962716,0 7.4412337,46.3962966,0 7.440876,46.3962381,0 7.4410942,46.3961127,0 7.4412943,46.3958702,0 7.4414641,46.3957782,0 7.4416884,46.3955022,0 7.4417187,46.3953475,0 7.4417066,46.3951802,0 7.4415429,46.3953182,0 7.4413913,46.3953559,0 7.4411973,46.3953349,0 7.4411912,46.395289,0 7.4413307,46.395243,0 7.4413913,46.3951092,0 7.4413338,46.3950921,0 7.4412586,46.3951415,0 7.4411655,46.3951292,0 7.4412443,46.3950823,0 7.4411691,46.3950304,0 7.4413696,46.3950131,0 7.4412228,46.394902,0 7.4412908,46.3948699,0 7.4414841,46.3948576,0 7.441656,46.3948897,0 7.4415378,46.3947218,0 7.4413194,46.3945465,0 7.4413489,46.394489,0 7.4414744,46.3945078,0 7.4415672,46.3945642,0 7.4418946,46.394632,0 7.4421838,46.394647,0 7.4419055,46.3945228,0 7.4424075,46.3944927,0 7.4422547,46.394425,0 7.4420801,46.3943911,0 7.441911,46.3942293,0 7.441649,46.3941992,0 7.4414854,46.3940675,0 7.4417309,46.3941465,0 7.4418728,46.3941503,0 7.4419273,46.3941089,0 7.4420583,46.3941277,0 7.442151,46.3942105,0 7.4422656,46.394218,0 7.4426803,46.3941013,0 7.4427076,46.3939847,0 7.4428604,46.3939245,0 7.4429859,46.3939056,0 7.4431441,46.3938078,0 7.4433296,46.3937815,0 7.4435752,46.3938454,0 7.4438589,46.3940185,0 7.4440117,46.3941013,0 7.4443773,46.3942067,0 7.4445519,46.3942519,0 7.4447047,46.3942105,0 7.4450102,46.3942669,0 7.4452121,46.3942632,0 7.4454413,46.3941653,0 7.4455668,46.3941728,0 7.4456977,46.3940938,0 7.445796,46.3940938,0 7.4459433,46.394154,0 7.4463853,46.3942406,0 7.4464671,46.3943271,0 7.4466144,46.3943271,0 7.4467181,46.3943083,0 7.4468982,46.3943685,0 7.4469636,46.3944551,0 7.4468927,46.3945906,0 7.4470182,46.3946395,0 7.4472201,46.3946583,0 7.4473892,46.3945906,0 7.4477494,46.3945341,0 7.4478421,46.3945454,0 7.447924,46.3945793,0 7.4479785,46.394504,0 7.448104,46.3945078,0 7.4482241,46.3945341,0 7.4483114,46.3944438,0 7.448426,46.3945002,0 7.4484914,46.394425,0 7.4486333,46.3944739,0 7.4485951,46.3946056,0 7.4487315,46.3946169,0 7.4487534,46.3946771,0 7.4486933,46.3947373,0 7.4487861,46.3947975,0 7.4489552,46.3947938,0 7.4488734,46.394632,0 7.4491844,46.3947147,0 7.4496482,46.3947599,0 7.4497955,46.3947298,0 7.449921,46.3946696,0 7.4497628,46.3946508,0 7.4495991,46.3945943,0 7.4494845,46.3944965,0 7.4492172,46.3944099,0 7.4491748,46.3943592,0 7.4491922,46.3943312,0 7.4492415,46.3943032,0 7.4490414,46.3942392,0 7.4491081,46.3941812,0 7.4490733,46.3940272,0 7.4490211,46.3939532,0 7.4489346,46.3938937,0 7.4487649,46.3939565,0 7.4485469,46.3939165,0 7.448529,46.3938473,0 7.4486543,46.3938029,0 7.4486793,46.3937634,0 7.4486264,46.3937261,0 7.4485247,46.3937017,0 7.4487236,46.3936285,0 7.448896,46.3936072,0 7.4489755,46.3935584,0 7.4488253,46.3935432,0 7.4488739,46.3934791,0 7.4487148,46.3934852,0 7.448812,46.3933907,0 7.4489313,46.3934121,0 7.4490286,46.3933938,0 7.448896,46.3932993,0 7.4490639,46.3932627,0 7.4492495,46.3931621,0 7.4494042,46.3931652,0 7.449749,46.3932871,0 7.4498904,46.3932993,0 7.4500451,46.3934151,0 7.4501512,46.3934365,0 7.4502175,46.393409,0 7.4501865,46.3933603,0 7.4499921,46.3932962,0 7.4501512,46.393278,0 7.4500805,46.3932017,0 7.450213,46.3932078,0 7.4502219,46.3931194,0 7.4503898,46.3931713,0 7.4506285,46.3931682,0 7.450823,46.393092,0 7.4509556,46.3929579,0 7.4510837,46.3929122,0 7.4511677,46.3928969,0 7.4511147,46.392839,0 7.4511191,46.3927628,0 7.4510749,46.392714,0 7.45096,46.3926713,0 7.4511368,46.3926195,0 7.4511633,46.3925707,0 7.4511191,46.3925403,0 7.4508186,46.3923695,0 7.4505269,46.392269,0 7.450655,46.3922293,0 7.4507655,46.392208,0 7.4508672,46.3921104,0 7.4510395,46.3920556,0 7.4507876,46.3920129,0 7.4505887,46.3920281,0 7.4504429,46.3919794,0 7.4505931,46.3919123,0 7.4505003,46.3917934,0 7.4503766,46.3917751,0 7.4502793,46.3916715,0 7.4501114,46.3916562,0 7.4500672,46.3915831,0 7.4498727,46.3915373,0 7.4497357,46.3914367,0 7.4496341,46.3913209,0 7.449665,46.3911319,0 7.4493556,46.3912904,0 7.4492495,46.3910435,0 7.4491081,46.3908667,0 7.4491258,46.3908027,0 7.449223,46.3906929,0 7.4491877,46.3905893,0 7.4485866,46.3901869,0 7.4485291,46.3900558,0 7.4485159,46.389882,0 7.4485733,46.3897692,0 7.4487324,46.3896778,0 7.4488695,46.3895955,0 7.4490197,46.3895315,0 7.4491612,46.3892601,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4491612,46.3892601,0 7.4494042,46.3890803,0 7.4496031,46.3889065,0 7.4499788,46.3887297,0 7.4500893,46.3886626,0 7.4503014,46.3885803,0 7.4503766,46.3885895,0 7.450434,46.3886596,0 7.4505622,46.3886017,0 7.4507965,46.3884553,0 7.4509114,46.3884248,0 7.4508804,46.3886321,0 7.4508274,46.388809,0 7.4508274,46.3889614,0 7.4508672,46.3890224,0 7.4510793,46.3890772,0 7.4512075,46.3891626,0 7.4513887,46.3891687,0 7.4518086,46.3892357,0 7.4520296,46.3891748,0 7.4522726,46.3892297,0 7.4525997,46.3892205,0 7.4529533,46.3891626,0 7.4531168,46.3890528,0 7.4533334,46.388998,0 7.4536207,46.3889248,0 7.4537621,46.3889522,0 7.4538903,46.3889583,0 7.4539742,46.3889035,0 7.4542306,46.3887907,0 7.4543941,46.3887388,0 7.4544074,46.3886138,0 7.4546416,46.388687,0 7.4547786,46.3887968,0 7.4548493,46.3886687,0 7.4549598,46.3887236,0 7.4550571,46.3886626,0 7.4550482,46.388626,0 7.4553532,46.3885529,0 7.4557289,46.3884553,0 7.4559764,46.388437,0 7.4561664,46.3883456,0 7.4564095,46.3881962,0 7.4565333,46.3881931,0 7.4567366,46.3881078,0 7.4567763,46.3880102,0 7.4569576,46.3879828,0 7.4570813,46.3878883,0 7.457152,46.3876871,0 7.4571388,46.387617,0 7.4571918,46.3875407,0 7.4573553,46.3875255,0 7.4574747,46.3875529,0 7.4575542,46.3875011,0 7.4578327,46.3872633,0 7.4579432,46.3872176,0 7.4580713,46.3871901,0 7.4581332,46.3871383,0 7.4581465,46.3870591,0 7.458226,46.3870042,0 7.458447,46.386928,0 7.4584868,46.3868853,0 7.4584603,46.3868335,0 7.4583586,46.3867786,0 7.4583277,46.3867267,0 7.4583674,46.3866536,0 7.4585177,46.3865042,0 7.4585708,46.3864493,0 7.458584,46.3863944,0 7.4584912,46.3863579,0 7.4584426,46.3862908,0 7.4583763,46.3860316,0 7.4583807,46.3859646,0 7.4584912,46.3858579,0 7.4586768,46.3856719,0 7.4587917,46.3856231,0 7.4588801,46.3855225,0 7.4590304,46.3854554,0 7.4592072,46.3852908,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4592072,46.3852908,0 7.4593044,46.3851567,0 7.4594017,46.3851536,0 7.4594459,46.3851018,0 7.459437,46.3850256,0 7.4595475,46.3849311,0 7.4596492,46.3849158,0 7.4597508,46.384928,0 7.4598657,46.3848975,0 7.4601398,46.3846567,0 7.4602591,46.3846079,0 7.4603696,46.3846292,0 7.4606524,46.3845164,0 7.4608734,46.3842359,0 7.4608867,46.384117,0 7.4609,46.3840225,0 7.4610016,46.3839128,0 7.4610237,46.3837725,0 7.4612049,46.3834554,0 7.4612447,46.3833182,0 7.4613331,46.3832054,0 7.4612403,46.3830316,0 7.4612933,46.3830072,0 7.4612005,46.3829066,0 7.4612226,46.3827298,0 7.4611386,46.3825865,0 7.4611386,46.3824828,0 7.4610414,46.3823304,0 7.4611073,46.3822106,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4611073,46.3822106,0 7.4612404,46.3822517,0 7.4614568,46.3823456,0 7.4616159,46.382348,0 7.4615585,46.3822694,0 7.4616911,46.3822938,0 7.4617211,46.3821629,0 7.4618236,46.3820919,0 7.4619784,46.3822176,0 7.4622961,46.3823287,0 7.4629055,46.38253,0 7.463308,46.3826662,0 7.4634069,46.3828895,0 7.4636321,46.382777,0 7.4639005,46.38287,0 7.4639274,46.3829525,0 7.4640506,46.382901,0 7.4640671,46.3829953,0 7.4643743,46.3829246,0 7.4643871,46.3830368,0 7.4645354,46.3829903,0 7.4645177,46.3831343,0 7.4646506,46.3831618,0 7.4646264,46.3833123,0 7.4648386,46.3832036,0 7.4650285,46.3832415,0 7.4649901,46.3833249,0 7.4652644,46.3832425,0 7.4652205,46.3834252,0 7.4657122,46.3832997,0 7.4661585,46.3832997,0 7.4664332,46.3832642,0 7.4664675,46.3834418,0 7.4663216,46.3836313,0 7.4666563,46.383578,0 7.4669653,46.3834536,0 7.4672915,46.3833826,0 7.4674803,46.3831754,0 7.4675693,46.3829127,0 7.4676724,46.3828786,0 7.4678802,46.3828314,0 7.4681028,46.3828006,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4715578,46.3803844,0 7.4716905,46.3801436,0 7.4721055,46.3799782,0 7.4722339,46.3800409,0 7.472586,46.3799856,0 7.472571,46.3798732,0 7.4733791,46.3800682,0 7.4740397,46.3799886,0 7.4740981,46.3801672,0 7.4743717,46.3802091,0 7.4747225,46.3801399,0 7.4753201,46.3804002,0 7.4756569,46.3803819,0 7.4760285,46.3805054,0 7.4773344,46.3802503,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4773344,46.3802503,0 7.4775896,46.3800954,0 7.478055,46.3799769,0 7.4786994,46.3798188,0 7.4797233,46.3793595,0 7.4798307,46.3792508,0 7.4798737,46.3786976,0 7.4799238,46.3784851,0 7.4801171,46.3782629,0 7.480246,46.3778331,0 7.4804321,46.3776553,0 7.4803963,46.3775269,0 7.4810479,46.3771514,0 7.4812842,46.3769291,0 7.4815634,46.3765389,0 7.4815634,46.3763364,0 7.4819429,46.3760548,0 7.4822293,46.3759511,0 7.4822794,46.3758473,0 7.4826875,46.3756053,0 7.4829596,46.3755015,0 7.4832961,46.3752496,0 7.4832961,46.3750174,0 7.4834393,46.3747062,0 7.4836613,46.3745481,0 7.4833677,46.374311,0 7.4832031,46.3742665,0 7.48311,46.374143,0 7.4833677,46.3740541,0 7.4835038,46.3740936,0 7.4838618,46.3740195,0 7.4839763,46.3738466,0 7.4841697,46.3737923,0 7.4841553,46.3736886,0 7.4842771,46.3735947,0 7.4842484,46.3735058,0 7.4840121,46.3732489,0 7.4840837,46.3731847,0 7.4843415,46.3729821,0 7.4845635,46.3729179,0 7.4846279,46.3727944,0 7.4846422,46.3727154,0 7.4847711,46.3726857,0 7.4849215,46.3726709,0 7.4849429,46.3725424,0 7.4849501,46.3723448,0 7.4853009,46.371752,0 7.4861673,46.3711938,0 7.4864609,46.3705861,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.574892,46.4016217,0 7.5752629,46.4028429,0 7.5758871,46.4029302,0 7.5773776,46.4030385,0 7.5779149,46.4031005,0 7.5783777,46.4034398,0 7.58076,46.4045863,0 7.582163,46.4048456,0 7.582205,46.4049976,0 7.5843654,46.405166,0 7.5848908,46.406216,0 7.5892869,46.4093376,0 7.5906357,46.409781,0 7.5916796,46.4096886,0 7.5924095,46.4102984,0 7.5930562,46.4102984,0 7.5939153,46.4108249,0 7.5942811,46.4113213,0 7.5946519,46.4119154,0 7.5946557,46.4121992,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5946557,46.4121992,0 7.5947645,46.4125775,0 7.5944483,46.4128069,0 7.5945428,46.4130565,0 7.5944653,46.413244,0 7.5944498,46.4133897,0 7.5946916,46.4136176,0 7.5947536,46.4140872,0 7.5948451,46.414329,0 7.5947955,46.4146018,0 7.5947645,46.4149149,0 7.5946374,46.4151908,0 7.5945723,46.4153086,0 7.5944064,46.4153582,0 7.5941894,46.4154868,0 7.5940592,46.4157705,0 7.5939368,46.4158464,0 7.5936888,46.4159673,0 7.5935586,46.4162881,0 7.5934367,46.4165774,0 7.5933156,46.4167476,0 7.5932134,46.4168574,0 7.5932172,46.4169406,0 7.5931264,46.4170012,0 7.5929485,46.4170466,0 7.5928161,46.417285,0 7.5927139,46.4175423,0 7.5921387,46.4175991,0 7.5919533,46.4177126,0 7.5918322,46.4176974,0 7.5917225,46.4174855,0 7.5915598,46.4174099,0 7.5913985,46.4174799,0 7.5913628,46.4174184,0 7.5911734,46.4175225,0 7.5908727,46.4180783,0 7.5901597,46.4188029,0 7.590028,46.4190354,0 7.5902314,46.4192795,0 7.5904387,46.4202889,0 7.5907177,46.4209379,0 7.5915276,46.4219047,0 7.5920628,46.4226534,0 7.5930543,46.4233989,0 7.5938905,46.4242919,0 7.5943427,46.4250004,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5296583,46.4300374,0 7.5307656,46.4296824,0 7.531478,46.4296114,0 7.5326109,46.4289607,0 7.5328856,46.4290672,0 7.5332632,46.4290672,0 7.5335465,46.4288779,0 7.5331946,46.4285643,0 7.5331087,46.4283632,0 7.5331946,46.4279491,0 7.5328942,46.4278071,0 7.5325423,46.4278366,0 7.5318213,46.4276592,0 7.531435,46.4276296,0 7.531272,46.4277657,0 7.5310316,46.427742,0 7.5309029,46.4274699,0 7.5305682,46.4272214,0 7.5304909,46.4270025,0 7.5302506,46.4269019,0 7.5299588,46.4269137,0 7.5293322,46.4264937,0 7.5287056,46.426334,0 7.5284739,46.4261683,0 7.5281134,46.4261269,0 7.5278559,46.4259671,0 7.5274697,46.4258843,0 7.5272551,46.4257305,0 7.5266629,46.4255471,0 7.5250836,46.4254406,0 7.5240622,46.4256358,0 7.5224915,46.4262275,0 7.5212212,46.4263813,0 7.5209294,46.4265588,0 7.5206461,46.4265055,0 7.5199766,46.4265588,0 7.5191784,46.4264286,0 7.5184059,46.426399,0 7.5181485,46.4264878,0 7.5179253,46.4263754,0 7.5172987,46.4268546,0 7.5166378,46.4266889,0 7.5163632,46.4265469,0 7.5160456,46.4265706,0 7.5149899,46.4262275,0 7.5148096,46.4260796,0 7.5149212,46.4258133,0 7.5144492,46.4257778,0 7.5146122,46.4253637,0 7.5137625,46.4253578,0 7.5135222,46.425269,0 7.512827,46.425482,0 7.5115052,46.4264937,0 7.511076,46.4266475,0 7.5105353,46.4270143,0 7.5101834,46.4270912,0 7.510046,46.4269729,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4901878,46.4164474,0 7.4912908,46.4158099,0 7.4918247,46.4154004,0 7.4920565,46.4151024,0 7.4923119,46.4150314,0 7.4928417,46.4151449,0 7.4930356,46.4152159,0 7.4930734,46.4151024,0 7.4929174,46.4148895,0 7.4929174,46.4147902,0 7.4934093,46.4148611,0 7.4939864,46.4152443,0 7.4942844,46.4152679,0 7.4943175,46.4150693,0 7.4943175,46.415022,0 7.4945634,46.4150503,0 7.4947574,46.4150929,0 7.4947621,46.4149557,0 7.4947526,46.4148611,0 7.495202,46.4148375,0 7.4958737,46.4152253,0 7.4960031,46.4154518,0 7.4961514,46.4154639,0 7.4962301,46.4154094,0 7.4963966,46.4155093,0 7.4965601,46.4156365,0 7.4966479,46.4156244,0 7.496554,46.4154488,0 7.496324,46.4152399,0 7.4962543,46.4148888,0 7.4963542,46.4147949,0 7.496327,46.4144831,0 7.4964178,46.4142561,0 7.49633,46.414023,0 7.4955157,46.41336,0 7.4950404,46.4133025,0 7.4946469,46.4130603,0 7.4943684,46.4127152,0 7.4942654,46.4124034,0 7.494217,46.4122944,0 7.4942715,46.4122581,0 7.4943472,46.412246,0 7.4948194,46.412358,0 7.4949375,46.4123368,0 7.4948557,46.41214,0 7.4944592,46.4116193,0 7.4944228,46.4115406,0 7.4948467,46.411362,0 7.4946559,46.4111229,0 7.4947316,46.4110744,0 7.494662,46.4109321,0 7.4945197,46.4108776,0 7.4945924,46.4107656,0 7.4945288,46.4107081,0 7.4943714,46.4108655,0 7.4940687,46.4106839,0 7.493663,46.4105416,0 7.4935631,46.4104902,0 7.4938628,46.4104054,0 7.4938356,46.4103509,0 7.4937357,46.4102571,0 7.4936085,46.4102026,0 7.4938931,46.4099695,0 7.4941837,46.410024,0 7.4945046,46.4099331,0 7.4952069,46.4099543,0 7.495437,46.4098938,0 7.4955611,46.4097969,0 7.4960122,46.4098393,0 7.4967357,46.4101027,0 7.496993,46.4101662,0 7.4971806,46.4100626,0 7.4972836,46.4100058,0 7.4973169,46.4099271,0 7.497217,46.4099241,0 7.4971613,46.409743,0 7.4968063,46.4094717,0 7.49627,46.4092268,0 7.4959926,46.4091075,0 7.4958764,46.4088269,0 7.4956563,46.4085867,0 7.4954188,46.4080324,0 7.4954703,46.4075632,0 7.495328,46.4072756,0 7.4953704,46.4070486,0 7.4957276,46.4069396,0 7.4958638,46.4065884,0 7.4968083,46.4062312,0 7.4977044,46.405992,0 7.4979405,46.4060405,0 7.4981282,46.4057529,0 7.4980919,46.4054744,0 7.4983825,46.4051989,0 7.4987034,46.4048326,0 7.4986943,46.4040485,0 7.4994231,46.4034022,0 7.4994988,46.4029718,0 7.499688,46.4024609,0 7.500109,46.4020447,0 7.5001941,46.4017278,0 7.5000191,46.4013778,0 7.5000806,46.400952,0 7.4998678,46.400673,0 7.4998163,46.4004746,0 7.4995795,46.4003655,0 7.4992645,46.4003866,0 7.4988702,46.4002985,0 7.4986284,46.400275,0 7.498196,46.4003894,0 7.4980919,46.4004863,0 7.4978473,46.4004233,0 7.4971159,46.4005347,0 7.496772,46.400588,0 7.4961786,46.4005565,0 7.4961084,46.4006292,0 7.4957064,46.4005468,0 7.4952463,46.4004524,0 7.4947861,46.4003652,0 7.4933998,46.3997392,0 7.4932165,46.3997687,0 7.4931219,46.3994967,0 7.491218,46.3992425,0 7.4899173,46.3989114,0 7.4893556,46.3990769,0 7.4888885,46.3988759,0 7.4864525,46.3987104,0 7.4846692,46.3988084,0 7.4843689,46.3989585,0 7.4823134,46.3989123,0 7.481863,46.3985312,0 7.4809507,46.3978383,0 7.478745,46.3969722,0 7.4771745,46.3951246,0 7.4767934,46.3946857,0 7.4768165,46.3940852,0 7.4755347,46.3924454,0 7.471643,46.3901935,0 7.4706267,46.3891542,0 7.4701879,46.3881957,0 7.4692872,46.3876183,0 7.4675434,46.3874105,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4675434,46.3874105,0 7.4669887,46.3873872,0 7.465311,46.386759,0 7.464535,46.3867072,0 7.4624656,46.3860347,0 7.4615639,46.3857169,0 7.4609857,46.3855182,0 7.4604773,46.3854862,0 7.4600662,46.3855409,0 7.4598666,46.3854598,0 7.4597279,46.3853215,0 7.4592072,46.3852908,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4715578,46.3803844,0 7.4713128,46.3802364,0 7.4710557,46.3801046,0 7.4707899,46.3799475,0 7.4698841,46.3796959,0 7.4694796,46.3795216,0 7.4681501,46.3786158,0 7.4675495,46.378284,0 7.4674162,46.3781604,0 7.4666402,46.3783304,0 7.4661228,46.3783304,0 7.4655094,46.3783895,0 7.4651103,46.3781752,0 7.4646468,46.3781259,0 7.4641455,46.3780629,0 7.4636854,46.377983,0 7.463201,46.3777408,0 7.4629927,46.3777214,0 7.4624696,46.3775035,0 7.4618424,46.3773751,0 7.4614379,46.3773025,0 7.4612345,46.377024,0 7.4610577,46.3768084,0 7.4610577,46.3766437,0 7.4611473,46.3765372,0 7.4614089,46.3764863,0 7.4615938,46.3762582,0 7.4617497,46.3761721,0 7.4619008,46.376207,0 7.4618642,46.3764452,0 7.4619998,46.3764452,0 7.4621249,46.3763998,0 7.4621408,46.3764214,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5888202,46.5408269,0 7.5888528,46.5408766,0 7.588875,46.54106,0 7.588924,46.54119,0 7.588901,46.54133,0 7.588834,46.541485,0 7.588767,46.541914,0 7.588787,46.541944,0 7.588761,46.542065,0 7.588373,46.542474,0 7.588166,46.542546,0 7.587836,46.5425,0 7.587632,46.542542,0 7.587456,46.542619,0 7.587403,46.542651,0 7.58737,46.542709,0 7.58737,46.542829,0 7.587412,46.542915,0 7.586862,46.543252,0 7.586847,46.543396,0 7.586674,46.543453,0 7.5862511,46.5434681,0 7.586041,46.543592,0 7.58596,46.5437,0 7.58591,46.543846,0 7.58599,46.543953,0 7.585999,46.544003,0 7.585923,46.544054,0 7.58558,46.544154,0 7.585515,46.544354,0 7.585589,46.544496,0 7.585709,46.54456,0 7.585731,46.544603,0 7.585658,46.544812,0 7.585706,46.544917,0 7.585653,46.545091,0 7.585334,46.545331,0 7.585114,46.545657,0 7.5849503,46.5458153,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6020138,46.5498841,0 7.601882,46.549922,0 7.601685,46.54992,0 7.601626,46.54996,0 7.601722,46.550054,0 7.601309,46.550264,0 7.6011991,46.550366,0 7.601219,46.55041,0 7.601399,46.550388,0 7.6015586,46.550506,0 7.601421,46.550513,0 7.6013647,46.5506373,0 7.601262,46.550705,0 7.601287,46.550811,0 7.601333,46.550808,0 7.6017485,46.5512085,0 7.601757,46.5512704,0 7.601563,46.551184,0 7.601708,46.551289,0 7.6015783,46.5512632,0 7.6018501,46.5513874,0 7.6016629,46.5513788,0 7.601709,46.551462,0 7.601649,46.55154,0 7.6018448,46.5515183,0 7.601677,46.551598,0 7.601566,46.551819,0 7.60172,46.551885,0 7.601752,46.551971,0 7.601523,46.552262,0 7.6014463,46.5522722,0 7.601403,46.552354,0 7.601349,46.55238,0 7.601272,46.552371,0 7.601262,46.552236,0 7.601138,46.552184,0 7.600934,46.552206,0 7.600846,46.552289,0 7.600269,46.552471,0 7.6002,46.5525494,0 7.600149,46.55276,0 7.600296,46.552897,0 7.6009266,46.5531762,0 7.6009329,46.5533856,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6009266,46.5531762,0 7.600218,46.55332,0 7.6001175,46.5534133,0 7.599965,46.553401,0 7.599942,46.553433,0 7.599895,46.553426,0 7.59987,46.553456,0 7.599729,46.553497,0 7.599659,46.553448,0 7.599272,46.553485,0 7.598813,46.55346,0 7.598656,46.5534106,0 7.598414,46.553382,0 7.598358,46.553294,0 7.598138,46.553232,0 7.5979213,46.5532318,0 7.5977704,46.5533893,0 7.597562,46.55353,0 7.5971441,46.5537263,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.585006,46.545887,0 7.585308,46.545812,0 7.585676,46.545648,0 7.586004,46.545501,0 7.586149,46.54546,0 7.586274,46.545474,0 7.586592,46.545575,0 7.586746,46.545413,0 7.587392,46.545051,0 7.587454,46.545042,0 7.58755,46.545093,0 7.587657,46.545196,0 7.587685,46.545255,0 7.587735,46.545312,0 7.587937,46.545379,0 7.588127,46.545313,0 7.588555,46.545203,0 7.588655,46.545235,0 7.588914,46.54519,0 7.58927,46.544999,0 7.589602,46.544965,0 7.589747,46.544873,0 7.590138,46.544825,0 7.590246,46.544838,0 7.590336,46.544905,0 7.590498,46.54495,0 7.59092,46.544973,0 7.591352,46.544928,0 7.5915543,46.5450082,0 7.5919183,46.5450711,0 7.5920883,46.5451263,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5849503,46.5458153,0 7.585006,46.545887,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5800023,46.5344493,0 7.5798945,46.5343797,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5798945,46.5343797,0 7.5799446,46.5343023,0 7.580358,46.534014,0 7.580229,46.53383,0 7.580478,46.53353,0 7.58063,46.533409,0 7.580662,46.533282,0 7.580985,46.533044,0 7.581097,46.532718,0 7.581299,46.53254,0 7.581403,46.532292,0 7.581436,46.532046,0 7.581655,46.531986,0 7.581711,46.531738,0 7.582004,46.531552,0 7.582176,46.531554,0 7.582523,46.531376,0 7.582614,46.531184,0 7.582583,46.53111,0 7.582906,46.530769,0 7.582863,46.530726,0 7.5829341,46.5305863,0 7.583097,46.530457,0 7.583587,46.53036,0 7.583919,46.530348,0 7.5840885,46.5302561,0 7.5842076,46.5301916,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.574907,46.522174,0 7.575241,46.522126,0 7.575519,46.522007,0 7.575683,46.5219091,0 7.576177,46.5216802,0 7.5766449,46.5215308,0 7.5769984,46.5213232,0 7.5771978,46.5209949,0 7.5773429,46.5207243,0 7.5778537,46.5203175,0 7.5781433,46.5201358,0 7.5782994,46.5200566,0 7.5784074,46.5199962,0 7.5786242,46.5200434,0 7.5788573,46.5200418,0 7.5791451,46.5200439,0 7.5795373,46.5200993,0 7.5797431,46.5200959,0 7.5799979,46.5200668,0 7.5801735,46.5200411,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5749471,46.5223416,0 7.574907,46.522174,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6160369,46.3979777,0 7.6157131,46.3979155,0 7.6154834,46.3978111,0 7.6151754,46.3978003,0 7.6150423,46.3977139,0 7.6148727,46.3976239,0 7.6147448,46.3976527,0 7.6145725,46.3976563,0 7.6144133,46.3977751,0 7.6141693,46.3976716,0 7.6139253,46.3976149,0 7.6138913,46.3974511,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5867784,46.5343331,0 7.586636,46.5343169,0 7.5862536,46.534387,0 7.5858189,46.5340589,0 7.5855344,46.5338818,0 7.5852999,46.5338814,0 7.5852102,46.5338558,0 7.5849817,46.5337454,0 7.5844205,46.5337057,0 7.5841258,46.5338472,0 7.5837589,46.5338793,0 7.583468,46.534194,0 7.5831458,46.5339879,0 7.5829768,46.5340463,0 7.5827503,46.5340428,0 7.5824606,46.5341234,0 7.5822823,46.533987,0 7.582175,46.534088,0 7.582192,46.534143,0 7.582098,46.534248,0 7.582032,46.534242,0 7.5817344,46.5340341,0 7.581564,46.534071,0 7.581458,46.534159,0 7.5813587,46.5343647,0 7.581224,46.5343566,0 7.5811,46.534221,0 7.5809361,46.5341512,0 7.5807098,46.5341913,0 7.5805463,46.5342494,0 7.580228,46.534435,0 7.5800023,46.5344493,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5760918,46.4642406,0 7.5761528,46.4641344,0 7.5760963,46.4639355,0 7.575963,46.4637864,0 7.5761054,46.4635605,0 7.576007,46.463488,0 7.5760865,46.4634391,0 7.5762155,46.4634251,0 7.5762909,46.4634787,0 7.5763343,46.4633983,0 7.5761492,46.4633829,0 7.5759358,46.4633025,0 7.5756982,46.4632692,0 7.5753259,46.4633112,0 7.5752247,46.4634065,0 7.5750741,46.4633328,0 7.574982,46.4633792,0 7.5748702,46.4634855,0 7.5746599,46.4634921,0 7.5743257,46.463372,0 7.5741265,46.4632372,0 7.5739792,46.4632088,0 7.5737606,46.4632926,0 7.5735824,46.4628614,0 7.5733497,46.4628337,0 7.5731491,46.4627127,0 7.5728305,46.4626798,0 7.5725916,46.4625619,0 7.5724166,46.4626136,0 7.5722627,46.4626243,0 7.5721752,46.4626614,0 7.571934,46.462583,0 7.5718543,46.4625871,0 7.5714721,46.4625473,0 7.5712765,46.4625598,0 7.571208,46.462656,0 7.571101,46.462616,0 7.571067,46.462726,0 7.5707706,46.4627343,0 7.57068,46.462818,0 7.570409,46.462675,0 7.570349,46.462904,0 7.569704,46.462655,0 7.5695604,46.462966,0 7.5697132,46.4634117,0 7.569812,46.4637868,0 7.569815,46.46394,0 7.5697137,46.4643644,0 7.5696509,46.4645017,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5697137,46.4643644,0 7.5696709,46.4640308,0 7.569641,46.463862,0 7.569569,46.463753,0 7.5695632,46.4636037,0 7.569509,46.46342,0 7.5695177,46.4633725,0 7.5695743,46.4633062,0 7.569566,46.4631985,0 7.5694414,46.4631404,0 7.569341,46.4630756,0 7.569295,46.462921,0 7.569227,46.462647,0 7.569219,46.462572,0 7.5696607,46.4623892,0 7.5698225,46.462294,0 7.5698465,46.4622325,0 7.5698383,46.4621907,0 7.5697712,46.4621462,0 7.569602,46.462112,0 7.5692687,46.4619905,0 7.5691654,46.461936,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5696509,46.4645017,0 7.5698207,46.4647295,0 7.5699592,46.4650421,0 7.5699802,46.46521,0 7.5702017,46.4657804,0 7.5705419,46.466011,0 7.5707753,46.4661825,0 7.570989,46.4663287,0 7.5710874,46.4664496,0 7.5712645,46.4664834,0 7.5713153,46.4665155,0 7.5713181,46.4665988,0 7.5712129,46.4666974,0 7.5713008,46.4667194,0 7.5713972,46.4667082,0 7.5715031,46.4667483,0 7.5715626,46.4668221,0 7.5717327,46.4668831,0 7.5717584,46.467238,0 7.571919,46.4672926,0 7.5719463,46.4674066,0 7.5720619,46.4674788,0 7.5721567,46.4676028,0 7.5722702,46.4678185,0 7.5723853,46.4679969,0 7.5724291,46.468146,0 7.572494,46.468344,0 7.5724388,46.4686796,0 7.5724432,46.4687755,0 7.5724457,46.4688768,0 7.572539,46.4690708,0 7.5725353,46.4691595,0 7.5725692,46.4692211,0 7.5725419,46.469325,0 7.572579,46.4694265,0 7.572718,46.469569,0 7.5729752,46.4697186,0 7.5730414,46.4698077,0 7.573089,46.4698415,0 7.5731178,46.4699205,0 7.5730953,46.4699843,0 7.5730765,46.4700483,0 7.573187,46.470135,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5733474,46.4760144,0 7.573387,46.476093,0 7.573364,46.476147,0 7.573205,46.47634,0 7.5731633,46.4764965,0 7.573011,46.476853,0 7.573171,46.477301,0 7.573158,46.477392,0 7.573204,46.477643,0 7.573264,46.477724,0 7.57326,46.47782,0 7.573312,46.477974,0 7.573405,46.478005,0 7.573513,46.478382,0 7.573327,46.478605,0 7.573124,46.478741,0 7.5730652,46.4788205,0 7.572965,46.478971,0 7.5729777,46.4790803,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.572435,46.480232,0 7.5723796,46.4802457,0 7.572367,46.480409,0 7.5724103,46.4805829,0 7.5724509,46.4806753,0 7.572588,46.4807929,0 7.5728106,46.4809482,0 7.572871,46.481109,0 7.5730504,46.4810728,0 7.5731338,46.4810853,0 7.573273,46.481198,0 7.5733182,46.4812789,0 7.573379,46.481352,0 7.5734294,46.4814738,0 7.573584,46.481614,0 7.5736388,46.4817822,0 7.5735255,46.4818236,0 7.5735632,46.481887,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4991732,46.4109774,0 7.4971806,46.4100626,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5630315,46.4863658,0 7.5630346,46.4863294,0 7.5629344,46.4861077,0 7.5628594,46.4858963,0 7.5628286,46.4857459,0 7.5627536,46.4854418,0 7.5629093,46.4851483,0 7.5631453,46.4849427,0 7.5634035,46.4848222,0 7.5635808,46.4847034,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5609581,46.485938,0 7.5605165,46.4858118,0 7.5600333,46.4857315,0 7.5598958,46.4857688,0 7.559625,46.485895,0 7.5595375,46.4858721,0 7.5593626,46.4856971,0 7.5591709,46.4856971,0 7.5590842,46.4856691,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5583125,46.4854727,0 7.5582182,46.4854102,0 7.5579355,46.4853406,0 7.5577332,46.4852617,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4491612,46.3892601,0 7.4489159,46.389038,0 7.448525,46.3888934,0 7.4484874,46.3885331,0 7.4481152,46.3884317,0 7.4478024,46.3883001,0 7.4481997,46.3879463,0 7.4479682,46.3878061,0 7.448763,46.3874695,0 7.4490379,46.387263,0 7.4491418,46.3869723,0 7.448928,46.3867195,0 7.4480727,46.3866647,0 7.4475718,46.3865635,0 7.4472541,46.3866225,0 7.4469059,46.3864371,0 7.4462221,46.3860969,0 7.4456494,46.3858171,0 7.445017,46.3854714,0 7.4447187,46.385348,0 7.4441818,46.3852245,0 7.4437523,46.3850681,0 7.4433466,46.3848706,0 7.4431576,46.3845101,0 7.4427768,46.3840883,0 7.4424288,46.383557,0 7.4422289,46.3833056,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.54034,46.479224,0 7.5405449,46.4792038,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5405449,46.4792038,0 7.5405797,46.4790433,0 7.5405327,46.4789723,0 7.5404097,46.4788593,0 7.5402977,46.4788013,0 7.5402217,46.4787403,0 7.5401727,46.4786613,0 7.5401477,46.4785803,0 7.5401417,46.4784913,0 7.5401847,46.4783583,0 7.5401077,46.4781393,0 7.5398797,46.4779323,0 7.5397957,46.4778963,0 7.5396827,46.4778273,0 7.5395287,46.4776643,0 7.5392937,46.4774943,0 7.5392307,46.4773863,0 7.5392767,46.4772613,0 7.5393877,46.4770953,0 7.5393527,46.4769173,0 7.5392957,46.4768123,0 7.5390797,46.4766623,0 7.5386757,46.4762033,0 7.5386637,46.4761703,0 7.5386847,46.4760593,0 7.5384857,46.4757803,0 7.5384877,46.4757453,0 7.5385827,46.4756555,0 7.5387457,46.475635,0 7.5388027,46.4755263,0 7.5387747,46.4754113,0 7.5387965,46.475197,0 7.5387556,46.4750208,0 7.5387107,46.4748276,0 7.5386463,46.4746207,0 7.5387322,46.4744286,0 7.5384961,46.4739853,0 7.5383245,46.4736011,0 7.5382601,46.4728917,0 7.5378953,46.4726701,0 7.5375949,46.4724927,0 7.5373374,46.4721972,0 7.5371872,46.4718425,0 7.5370799,46.4714878,0 7.5368224,46.4710149,0 7.5366508,46.4708671,0 7.5363933,46.4707489,0 7.5361572,46.4705125,0 7.5359427,46.4703942,0 7.5354491,46.4701873,0 7.5351487,46.4700691,0 7.5347839,46.4699509,0 7.5345265,46.4698474,0 7.534269,46.469271,0 7.5341188,46.4688868,0 7.5337111,46.4687094,0 7.5332913,46.4687698,0 7.5313936,46.467867,0 7.5306426,46.4676454,0 7.5300418,46.4673793,0 7.5295697,46.467069,0 7.528926,46.4667142,0 7.5285183,46.4665073,0 7.5280033,46.4664926,0 7.5275956,46.46633,0 7.5271021,46.4661822,0 7.5267373,46.4661822,0 7.5254284,46.46599,0 7.5249778,46.4657092,0 7.5243126,46.4652806,0 7.5243555,46.4650737,0 7.5236474,46.4643051,0 7.5229393,46.4638469,0 7.5222956,46.4632853,0 7.522081,46.4630045,0 7.5218664,46.4628419,0 7.5213944,46.4623393,0 7.5208365,46.4623393,0 7.5206863,46.4622802,0 7.5207935,46.4619698,0 7.5201927,46.4617777,0 7.5201284,46.4615116,0 7.5199352,46.4612012,0 7.519785,46.460876,0 7.5191198,46.4602552,0 7.5182186,46.4598413,0 7.5172959,46.4598266,0 7.5165878,46.459664,0 7.5163518,46.4594275,0 7.5160299,46.458851,0 7.515472,46.4580971,0 7.5148069,46.4578606,0 7.5148593,46.4576658,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5405449,46.4792038,0 7.5406524,46.4792776,0 7.5407781,46.479334,0 7.5408591,46.4794291,0 7.5409698,46.4795263,0 7.5411333,46.4796215,0 7.5412319,46.4796548,0 7.5413719,46.4796758,0 7.5416056,46.4797181,0 7.5418305,46.4797854,0 7.54201,46.4798595,0 7.5421246,46.4798622,0 7.5422038,46.4797679,0 7.5422344,46.4798088,0 7.5422886,46.4799859,0 7.5423131,46.4800371,0 7.5426664,46.4798968,0 7.5429766,46.4798709,0 7.5432583,46.4799198,0 7.5434381,46.4799008,0 + + + + weltcuptrail + weltcuptrail, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.546366,46.472721,0 7.546582,46.472858,0 7.547273,46.473451,0 7.547355,46.4734738,0 7.547384,46.473463,0 7.547498,46.473357,0 7.547742,46.47342,0 7.547824,46.473408,0 7.547981,46.473591,0 7.547883,46.473721,0 7.547835,46.473855,0 7.5478299,46.473905,0 7.547809,46.473981,0 7.5477828,46.4740075,0 7.547779,46.474138,0 7.547809,46.474276,0 7.5477933,46.4743096,0 + + + + weltcuptrail + weltcuptrail, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5480239,46.4745659,0 7.548071,46.474601,0 7.548147,46.474528,0 7.548245,46.474637,0 7.5483324,46.4746403,0 7.548341,46.47449,0 7.548407,46.474385,0 7.548466,46.474353,0 7.54865,46.474336,0 7.54875,46.47437,0 7.548891,46.474445,0 7.549013,46.474522,0 7.54923,46.474725,0 7.549299,46.4748896,0 + + + + weltcuptrail + weltcuptrail, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5493338,46.4748532,0 7.549414,46.47493,0 7.549582,46.475164,0 7.549651,46.475295,0 7.549684,46.475505,0 7.54967,46.475541,0 7.549721,46.475697,0 7.549688,46.475774,0 7.5496779,46.4758944,0 7.549687,46.476009,0 7.549675,46.476086,0 7.549617,46.476191,0 7.549632,46.476283,0 7.549615,46.476398,0 7.549678,46.47656,0 7.549695,46.476669,0 7.5497552,46.4767867,0 7.549748,46.476959,0 + + + + Weltcuptrail + Weltcuptrail, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.549748,46.476959,0 7.549775,46.477008,0 7.549895,46.477112,0 7.550177,46.477211,0 7.55031,46.477289,0 7.55055,46.47749,0 7.55062,46.47756,0 7.550649,46.47761,0 7.5507845,46.4777077,0 7.55114,46.477912,0 7.551194,46.477987,0 7.551282,46.478149,0 7.551346,46.478194,0 7.551429,46.478302,0 7.551526,46.478356,0 7.551621,46.478457,0 7.551717,46.478663,0 7.551707,46.47887,0 7.551658,46.47893,0 7.551561,46.479008,0 7.551522,46.479094,0 7.551569,46.479147,0 7.551878,46.47925,0 7.5518842,46.4794254,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.551653,46.479461,0 7.5518381,46.4797245,0 7.5520744,46.4800436,0 + + + + weltcuptrail + weltcuptrail, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5520744,46.4800436,0 7.5523543,46.4803948,0 7.552633,46.480644,0 7.552654,46.480686,0 7.552661,46.480821,0 7.552597,46.480934,0 7.5528719,46.4810715,0 7.553538,46.481365,0 + + + + weltcuptrail + weltcuptrail, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.553538,46.481365,0 7.5536631,46.4813963,0 7.5538861,46.4814296,0 7.5539842,46.4814906,0 7.554022,46.481474,0 7.5540645,46.48153,0 7.5541435,46.48172,0 7.5543894,46.4818397,0 7.554494,46.4819297,0 7.5545233,46.4819795,0 7.5545342,46.4819645,0 7.5545621,46.4819692,0 7.5545859,46.4820172,0 7.554821,46.481838,0 7.554956,46.481708,0 7.555151,46.48159,0 7.555222,46.481636,0 7.55523,46.48166,0 7.5553253,46.4817137,0 7.55537,46.481745,0 7.555477,46.481777,0 7.5556084,46.4817019,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5545859,46.4820172,0 7.55461,46.482137,0 7.554617,46.482234,0 7.554605,46.482389,0 7.554629,46.482655,0 7.554708,46.482908,0 7.5547019,46.4829911,0 7.5548169,46.4831683,0 7.55481,46.483357,0 7.5548512,46.4833925,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5589672,46.4720202,0 7.5588162,46.471941,0 7.5582203,46.4719026,0 7.5581135,46.4719351,0 7.558022,46.471878,0 7.5578016,46.4719941,0 7.5576517,46.4720351,0 7.5576179,46.4720443,0 7.5575959,46.4718987,0 7.557722,46.471563,0 7.5579085,46.471328,0 7.557727,46.471356,0 7.5578843,46.4712066,0 7.558052,46.470647,0 7.5583051,46.4703056,0 7.5580457,46.4703479,0 7.5579895,46.470307,0 7.55807,46.470201,0 7.557818,46.469769,0 7.557864,46.469491,0 7.5576416,46.4695163,0 7.5576139,46.4694301,0 7.557456,46.469458,0 7.5575474,46.4693574,0 7.5575239,46.4692166,0 7.5573659,46.4692865,0 7.557391,46.469176,0 7.5574551,46.4689968,0 7.5573844,46.4690143,0 7.557431,46.468801,0 7.5573958,46.4687989,0 7.5574087,46.4686203,0 7.557343,46.468344,0 7.5569532,46.4683026,0 7.5566536,46.4684285,0 7.5563305,46.4683727,0 7.5557709,46.4686531,0 7.555443,46.468453,0 7.555369,46.46828,0 7.555448,46.468245,0 7.555318,46.468132,0 7.555263,46.468036,0 7.5552562,46.4679723,0 7.555104,46.467981,0 7.555108,46.467899,0 7.5552802,46.4677086,0 7.555261,46.4676825,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5534638,46.4774581,0 7.5534455,46.4773887,0 7.5536469,46.4769512,0 7.5541106,46.4766077,0 7.554105,46.476402,0 7.5542249,46.476267,0 7.554407,46.476171,0 7.554414,46.476057,0 7.554147,46.475643,0 7.55415,46.475587,0 7.554261,46.475443,0 7.554396,46.475107,0 7.554392,46.474963,0 7.55435,46.474903,0 7.5544589,46.4747756,0 7.554432,46.47466,0 7.554649,46.474518,0 7.554669,46.474458,0 7.554782,46.474308,0 7.5551416,46.4740944,0 7.555307,46.473841,0 7.555855,46.47362,0 7.5563039,46.4733363,0 7.5564953,46.4732154,0 7.5571264,46.4724475,0 7.5575742,46.4721367,0 7.5576179,46.4720443,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5467453,46.4607696,0 7.54649,46.46086,0 7.546379,46.460852,0 7.546278,46.460823,0 7.545332,46.460219,0 7.5452056,46.4601933,0 7.5450453,46.4602259,0 7.544678,46.460625,0 7.5446722,46.4605383,0 7.5445511,46.460897,0 7.544186,46.460965,0 7.5441541,46.4609626,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.543932,46.457905,0 7.5439224,46.4576498,0 7.5439863,46.457507,0 7.5443697,46.4571846,0 7.544414,46.457028,0 7.5444229,46.4568876,0 7.5443132,46.4567359,0 7.5441254,46.4565893,0 7.5437854,46.4563725,0 7.543601,46.456324,0 7.5433883,46.456225,0 7.543038,46.45609,0 7.5429552,46.4560635,0 7.5426803,46.4560349,0 7.5424803,46.4559119,0 7.5424073,46.4558342,0 7.5423486,46.4557438,0 7.5422303,46.4556441,0 7.542099,46.4555716,0 7.541851,46.455355,0 7.541218,46.4550142,0 7.5410982,46.454977,0 7.5409976,46.454893,0 7.540705,46.454773,0 7.540596,46.4546219,0 7.5405802,46.4545527,0 7.540341,46.454266,0 7.540211,46.454177,0 7.5399529,46.4540621,0 7.5398294,46.4540301,0 7.5397101,46.4539652,0 7.5395719,46.4538225,0 7.5396175,46.4537215,0 7.5392434,46.4536621,0 7.5390846,46.4536203,0 7.5389972,46.4535609,0 7.5386669,46.4535118,0 7.5385755,46.4534562,0 7.5383003,46.4533948,0 7.537794,46.453134,0 7.5376568,46.4530828,0 7.5373042,46.4529123,0 7.53703,46.452881,0 7.5369754,46.4528616,0 7.5368853,46.4528814,0 7.536805,46.4528509,0 7.5367046,46.452847,0 7.5366355,46.4527915,0 7.5365538,46.4526502,0 7.5364786,46.4525963,0 7.5363413,46.4525663,0 7.53618,46.452558,0 7.535878,46.452489,0 7.5356819,46.4524571,0 7.535526,46.452412,0 7.535344,46.452435,0 7.5352519,46.4524668,0 7.5347041,46.4526012,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5441541,46.4609626,0 7.5440914,46.4606083,0 7.5438826,46.4599873,0 7.5438935,46.459889,0 7.5437841,46.4595562,0 7.543707,46.459351,0 7.543697,46.458911,0 7.543855,46.4586,0 7.5438914,46.4582169,0 7.543963,46.457984,0 7.543932,46.457905,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5441541,46.4609626,0 7.5443022,46.4612074,0 7.544328,46.461298,0 7.544419,46.461445,0 7.544713,46.461762,0 7.545105,46.462076,0 7.545267,46.462233,0 7.545313,46.462295,0 7.545411,46.462463,0 7.545425,46.462521,0 7.545408,46.462596,0 7.545312,46.462754,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.545312,46.462754,0 7.545134,46.462514,0 7.5450942,46.4625956,0 7.545048,46.462549,0 7.545021,46.462594,0 7.544907,46.462658,0 7.5448176,46.4625996,0 7.544809,46.462548,0 7.544682,46.462664,0 7.5445887,46.462662,0 7.544541,46.462678,0 7.5445217,46.4627506,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5445217,46.4627506,0 7.544556,46.462863,0 7.544642,46.462973,0 7.544646,46.463071,0 7.544535,46.463181,0 7.5444536,46.4632176,0 7.544159,46.463337,0 7.544005,46.463444,0 7.543837,46.463533,0 7.543703,46.463733,0 7.543456,46.463916,0 7.54331,46.464225,0 7.543007,46.464459,0 7.542768,46.464717,0 7.542685,46.464932,0 7.54251,46.465228,0 7.542382,46.46565,0 7.542912,46.466323,0 7.543704,46.466981,0 7.543754,46.467237,0 7.543974,46.46768,0 7.543981,46.467838,0 7.543918,46.467971,0 7.544025,46.468221,0 7.544473,46.468587,0 7.544433,46.468807,0 7.5444844,46.4688834,0 7.544452,46.468936,0 7.5444486,46.4690083,0 7.544404,46.469095,0 7.544283,46.4691718,0 7.544292,46.469265,0 7.5442081,46.4693977,0 7.544297,46.4696186,0 7.544416,46.469775,0 7.5445187,46.4698185,0 7.544622,46.46995,0 7.544745,46.47001,0 7.54538,46.470662,0 7.546082,46.471594,0 7.5460595,46.4716439,0 7.546271,46.471879,0 7.546345,46.472015,0 7.546457,46.472109,0 7.5465251,46.472387,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5882589,46.4861244,0 7.5885014,46.4860791,0 7.5886623,46.4860126,0 7.5888769,46.4859609,0 7.5890164,46.4859609,0 7.5890486,46.4860644,0 7.589349,46.4861973,0 7.5894348,46.4862269,0 7.5895528,46.4862121,0 7.5898425,46.4860644,0 7.5902395,46.4860791,0 7.5903575,46.486057,0 7.5905292,46.486057,0 7.5905935,46.4861382,0 7.5905721,46.486286,0 7.5904004,46.4863746,0 7.5902609,46.4864928,0 7.5901966,46.4866258,0 7.5903146,46.4867735,0 7.5904862,46.4868695,0 7.590615,46.4868474,0 7.5907652,46.4867735,0 7.5909583,46.4866923,0 7.5911836,46.486611,0 7.5912587,46.4869139,0 7.5912821,46.4869728,0 7.5913231,46.4870764,0 7.5914948,46.4870173,0 7.5916986,46.4868991,0 7.5918939,46.4869026,0 7.592117,46.4869065,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.592399,46.488507,0 7.5926427,46.4885981,0 7.5928466,46.4886055,0 7.5930183,46.4886793,0 7.5933508,46.4886202,0 7.5935225,46.4886276,0 7.5935547,46.4886646,0 7.5936727,46.4886572,0 7.5939302,46.4887901,0 7.5941448,46.4887384,0 7.5943701,46.4887089,0 7.5945847,46.4889231,0 7.5949924,46.4890561,0 7.5952391,46.4890191,0 7.5954108,46.4889896,0 7.5956146,46.48896,0 7.5957005,46.4888345,0 7.5958292,46.488731,0 7.5959365,46.4885981,0 7.5960104,46.4885348,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.624132,46.520973,0 7.6238068,46.5208419,0 7.6234849,46.5205687,0 7.623163,46.5203989,0 7.6226695,46.5204358,0 7.62253,46.5204727,0 7.6223584,46.5204248,0 7.6221062,46.5202107,0 7.6217951,46.5200667,0 7.6214893,46.5199338,0 7.6211728,46.5198046,0 7.6209046,46.5197825,0 7.6205506,46.5197714,0 7.6202448,46.5197419,0 7.6199712,46.519753,0 7.6196923,46.5198268,0 7.6194026,46.5199744,0 7.6190968,46.5200556,0 7.6188232,46.520063,0 7.6186247,46.520004,0 7.6183672,46.5199855,0 7.618099,46.5200224,0 7.6179649,46.5200003,0 7.6177235,46.5198711,0 7.6174768,46.5197566,0 7.6172836,46.519716,0 7.6169779,46.5196717,0 7.6167794,46.5196127,0 7.6166345,46.5194909,0 7.6165219,46.5192731,0 7.6164522,46.5189815,0 7.6163931,46.518568,0 7.616377,46.5183429,0 7.6163019,46.5181103,0 7.6161088,46.5178002,0 7.6159479,46.5175234,0 7.6156797,46.5173277,0 7.6154919,46.5172022,0 7.6154651,46.5170878,0 7.6154651,46.517014,0 7.6153959,46.5168917,0 7.6151502,46.5168899,0 7.6148965,46.5169087,0 7.6146497,46.5168515,0 7.6145317,46.516774,0 7.6143708,46.5164713,0 7.6141455,46.5162314,0 7.613829,46.5159508,0 7.6133569,46.5157256,0 7.6131048,46.5156149,0 7.612917,46.5155115,0 7.6127453,46.5154524,0 7.6126273,46.5154487,0 7.6122518,46.5154487,0 7.6118602,46.5153823,0 7.6114311,46.5153528,0 7.6110234,46.5153269,0 7.6109214,46.5153454,0 7.6108034,46.5154783,0 7.6106586,46.5154894,0 7.6104869,46.5154377,0 7.6103206,46.515338,0 7.610267,46.5152236,0 7.6102992,46.5150907,0 7.6104601,46.5147547,0 7.6106103,46.5144003,0 7.6106693,46.5141862,0 7.610723,46.5140681,0 7.610841,46.5139352,0 7.6109429,46.5137063,0 7.6110638,46.5135387,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.609237,46.5005217,0 7.6090546,46.5002927,0 7.608883,46.500049,0 7.6087757,46.4998792,0 7.6086147,46.4998127,0 7.6079495,46.4996945,0 7.607574,46.4996059,0 7.6074453,46.4994951,0 7.6073487,46.4993326,0 7.6071127,46.4991628,0 7.6068552,46.499052,0 7.6067694,46.4989338,0 7.6067265,46.4985793,0 7.6067694,46.4982987,0 7.6067694,46.4981805,0 7.6066835,46.4980476,0 7.6064368,46.4979811,0 7.6060827,46.4979368,0 7.6058038,46.4979442,0 7.6054926,46.4978999,0 7.6052566,46.4978334,0 7.6050098,46.4978186,0 7.6047202,46.497826,0 7.6045778,46.4977876,0 7.6044734,46.4977595,0 7.604173,46.4976931,0 7.603937,46.497634,0 7.6037868,46.4975454,0 7.6036473,46.4974937,0 7.6035293,46.4973533,0 7.6033576,46.4972499,0 7.6031323,46.4971761,0 7.6028963,46.4971244,0 7.6027353,46.4970284,0 7.6027031,46.4969397,0 7.6025228,46.4967002,0 7.6022815,46.4966125,0 7.6021656,46.4965905,0 7.6020622,46.4965404,0 7.6017895,46.4965373,0 7.6015231,46.4965373,0 7.6013884,46.4965122,0 7.6012693,46.4965561,0 7.6008681,46.4964997,0 7.6004513,46.4963524,0 7.6001975,46.4962991,0 7.5998966,46.4962396,0 7.5995268,46.4961017,0 7.5993169,46.4960296,0 7.5989376,46.496086,0 7.5986368,46.4959669,0 7.5982795,46.4960264,0 7.5979599,46.4960452,0 7.5976026,46.4961361,0 7.5973174,46.4962333,0 7.5971733,46.496227,0 7.5971513,46.4960891,0 7.5970416,46.4959387,0 7.596816,46.4958509,0 7.5968442,46.4957225,0 7.5968849,46.4957005,0 7.5969696,46.4958353,0 7.5970573,46.4957131,0 7.5972328,46.4955407,0 7.5972516,46.4954247,0 7.5974898,46.4953652,0 7.5978314,46.4951615,0 7.5981354,46.4951239,0 7.5982607,46.495127,0 7.5983767,46.4950299,0 7.5988938,46.4949108,0 7.5991915,46.4947384,0 7.5994359,46.4947321,0 7.599624,46.4947321,0 7.5998684,46.4945378,0 7.5997681,46.4942244,0 7.5995237,46.4939424,0 7.599367,46.4938891,0 7.5991508,46.4939111,0 7.5990442,46.4937136,0 7.5990881,46.4935162,0 7.5990317,46.4933814,0 7.598853,46.4932811,0 7.5985396,46.4930116,0 7.5979849,46.4925979,0 7.5971767,46.4928758,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5557343,46.4981656,0 7.5557397,46.4982247,0 7.55567,46.4982801,0 7.555568,46.4983096,0 7.5554661,46.4983761,0 7.5554232,46.4984906,0 7.5553964,46.4986457,0 7.5553857,46.4988008,0 7.5554286,46.4989522,0 7.5554232,46.4990888,0 7.5554822,46.499159,0 7.5556753,46.499303,0 7.5558845,46.4995024,0 7.5559489,46.4995356,0 7.5560187,46.4997609,0 7.5559489,46.4997978,0 7.5560938,46.4999566,0 7.5562279,46.5000046,0 7.5562118,46.500108,0 7.5560669,46.500167,0 7.5556968,46.5001449,0 7.5555037,46.5000932,0 7.5552462,46.500108,0 7.5550048,46.5000304,0 7.554876,46.4999123,0 7.5546346,46.4999972,0 7.5545649,46.500156,0 7.5546829,46.5005068,0 7.5547473,46.5005622,0 7.5545005,46.5007431,0 7.5545381,46.5009462,0 7.5548868,46.5011013,0 7.5549941,46.5013228,0 + + + + Via Ferrata Dauberhorn + Via Ferrata Dauberhorn, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.615535,46.3933165,0 7.6153571,46.3931316,0 7.6148421,46.392954,0 7.6139623,46.39288,0 7.6134473,46.3929836,0 7.6128036,46.3930724,0 7.6122672,46.3931316,0 7.6120311,46.3928356,0 7.6117736,46.3925988,0 7.6112801,46.3924212,0 7.6111084,46.3922288,0 7.611087,46.3919624,0 7.6113016,46.391696,0 7.6112801,46.3913112,0 7.6113445,46.390956,0 7.6112586,46.39066,0 7.6112801,46.3902012,0 7.6111728,46.389846,0 7.6108295,46.38955,0 7.610572,46.3892244,0 7.610572,46.3888248,0 7.6105398,46.3886545,0 7.6103145,46.3883363,0 7.6101858,46.3880403,0 7.6097459,46.3876851,0 7.6094884,46.3875667,0 7.6091558,46.3875667,0 7.6088339,46.3874705,0 7.6088125,46.3873743,0 7.609188,46.3874261,0 7.6093382,46.3874557,0 7.6095742,46.3874335,0 7.6099497,46.3874853,0 7.6099605,46.3876185,0 7.6099712,46.3881735,0 7.6098854,46.3883659,0 7.6095528,46.3885953,0 7.6094777,46.3884399,0 7.6094884,46.3880847,0 7.6094884,46.3879071,0 7.6096279,46.3873151,0 7.6099712,46.3873077,0 7.6101428,46.3876925,0 7.6101321,46.3885065,0 7.6099175,46.3892762,0 7.6095742,46.3900384,0 7.6088125,46.3906748,0 7.6087481,46.3897424,0 7.6089198,46.3888692,0 7.6091129,46.3883511,0 7.609542,46.3869968,0 7.609424,46.3867526,0 7.6091021,46.38676,0 7.6085121,46.3868858,0 7.6081687,46.3872855,0 7.6079327,46.3880329,0 7.6077289,46.3895722,0 7.6074821,46.3904454,0 7.6072139,46.3912964,0 7.606538,46.390068,0 7.6069393,46.3852733,0 7.6064139,46.3847204,0 7.605748,46.3839582,0 7.6053188,46.3836037,0 7.6041132,46.383141,0 7.6048643,46.3836591,0 7.6043278,46.3840735,0 7.6056797,46.3849913,0 7.6043064,46.3843844,0 + + + + Via Ferrata Dauberhorn + Via Ferrata Dauberhorn, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6043064,46.3843844,0 7.6048126,46.3847763,0 7.6042547,46.3845839,0 7.6050486,46.3850872,0 7.6058425,46.3852944,0 7.6066794,46.3852944,0 7.6065292,46.3857976,0 7.6058425,46.3860789,0 7.6052846,46.3862713,0 7.6052632,46.3864785,0 7.6045551,46.3867005,0 7.6042976,46.3868781,0 7.6040186,46.3870409,0 7.6034393,46.3870853,0 7.6030959,46.3870705,0 7.6028384,46.3874554,0 7.6026829,46.3875479,0 7.6022051,46.3877699,0 7.6020231,46.3879142,0 + + + + Lämmernweg süd + Lämmernweg süd, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5773607,46.3980323,0 7.5767505,46.3977455,0 7.5767827,46.3975531,0 7.5771046,46.3971092,0 7.5777805,46.3966134,0 7.578671,46.3962953,0 7.5799799,46.3960807,0 7.5813317,46.3957403,0 7.5844109,46.3950966,0 7.5849366,46.394993,0 7.5874471,46.3949782,0 7.5887775,46.3952742,0 7.5891478,46.3953803,0 7.5896036,46.3955109,0 7.5912022,46.3955923,0 7.5928438,46.3956663,0 7.5953221,46.3960955,0 7.5978327,46.3964729,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4394297,46.5665636,0 7.4395718,46.5667101,0 7.4396474,46.5668294,0 7.4396594,46.5670283,0 7.43954,46.5671159,0 7.4394047,46.5671875,0 7.4392894,46.5672074,0 7.4391501,46.5671954,0 7.4389114,46.5673228,0 7.4388159,46.5673267,0 7.4387125,46.567275,0 7.4385454,46.5672352,0 7.4383464,46.5672551,0 7.4380719,46.5673307,0 7.4378372,46.5674421,0 7.4374911,46.5675217,0 7.4371967,46.5675575,0 7.4370017,46.5675336,0 7.4367789,46.5676848,0 7.4365203,46.5677087,0 7.4361185,46.5676768,0 7.4359076,46.567832,0 7.435649,46.5677922,0 7.4354302,46.5678758,0 7.4352074,46.5680031,0 7.4350443,46.5679633,0 7.4344435,46.5681304,0 7.4341173,46.5683413,0 7.4341213,46.5684407,0 7.4340775,46.5686038,0 7.433791,46.5688664,0 7.4334568,46.5690216,0 7.4333256,46.5691887,0 7.4332579,46.5693836,0 7.4332221,46.5695706,0 7.4329834,46.5699486,0 7.4325935,46.5701714,0 7.4324224,46.57043,0 7.4323389,46.5706607,0 7.432323,46.5708119,0 7.4320246,46.5709154,0 7.4319888,46.5710069,0 7.4320485,46.5712058,0 7.4320087,46.5712456,0 7.431384,46.5713013,0 7.4307395,46.5714246,0 7.4300552,46.5712933,0 7.4297688,46.5712615,0 7.4294624,46.5712973,0 7.4290526,46.5715161,0 7.4283604,46.5715877,0 7.4282728,46.5715479,0 7.4280023,46.5715798,0 7.4278113,46.5716554,0 7.4274175,46.5716713,0 7.4271111,46.5717349,0 7.4268724,46.5719498,0 7.4266138,46.5720055,0 7.4264746,46.5720055,0 7.4259096,46.5722163,0 7.4258221,46.5722044,0 7.4256749,46.5721049,0 7.425472,46.5719975,0 7.4253486,46.5719975,0 7.4250622,46.5720612,0 7.4247757,46.5721049,0 7.4246325,46.5721686,0 7.4244216,46.5722124,0 7.4240874,46.5722402,0 7.4239562,46.5722879,0 7.4238408,46.5724312,0 7.4236856,46.5724789,0 7.4235185,46.5724471,0 7.4231963,46.5723635,0 7.4231008,46.5724988,0 7.4231286,46.5728648,0 7.4230928,46.5729404,0 7.4230212,46.5729802,0 7.4229257,46.5729524,0 7.4227706,46.5728211,0 7.4226114,46.5727296,0 7.4224284,46.5726341,0 7.4222096,46.572471,0 7.4215889,46.5722482,0 7.4215452,46.5723277,0 7.4215929,46.5723834,0 7.4215571,46.5727773,0 7.4214815,46.5728728,0 7.4213343,46.5729484,0 7.4211274,46.5729325,0 7.4209086,46.5729245,0 7.420646,46.5727892,0 7.420467,46.5727057,0 7.4202283,46.5726261,0 7.4197151,46.5725465,0 7.419548,46.5725028,0 7.419353,46.5725426,0 7.4192615,46.5724908,0 7.4188477,46.5723596,0 7.4185573,46.5721845,0 7.4179088,46.5719179,0 7.4174234,46.5718185,0 7.4172126,46.571727,0 7.416954,46.5717111,0 7.4165123,46.5716076,0 7.4162418,46.5714405,0 7.4161264,46.5713928,0 7.4156689,46.5715042,0 7.4153228,46.5715559,0 7.4149886,46.571528,0 7.4146743,46.571544,0 7.4142366,46.5714684,0 7.4134688,46.5716116,0 7.4130749,46.5717031,0 7.4125378,46.5717707,0 7.4118853,46.5718145,0 7.4110339,46.5716872,0 7.4109225,46.5716315,0 7.4106321,46.5716713,0 7.4103218,46.5716753,0 7.4097767,46.5716156,0 7.4092555,46.5715241,0 7.408607,46.5713689,0 7.408249,46.5712655,0 7.4079745,46.5712177,0 7.4076681,46.5710307,0 7.4073777,46.5708955,0 7.4071628,46.5707363,0 7.4070594,46.5707562,0 7.4071589,46.5708517,0 7.407314,46.5709711,0 7.4075209,46.5712575,0 7.407688,46.5714286,0 7.4078829,46.5716434,0 7.4081057,46.5718543,0 7.4081654,46.5720254,0 7.4081376,46.5721049,0 7.4079585,46.5719935,0 7.407684,46.5718782,0 7.4070793,46.5717906,0 7.4064666,46.5714843,0 7.406021,46.5713172,0 7.4052651,46.5711382,0 7.404915,46.5710228,0 7.4045649,46.5709432,0 7.4043023,46.5708437,0 7.4040039,46.5706846,0 7.4038567,46.5706528,0 7.4035344,46.5704578,0 7.4032838,46.5704459,0 7.4031525,46.5702549,0 7.4031008,46.5701873,0 7.4028024,46.5699048,0 7.4027268,46.5698969,0 7.4023329,46.5696462,0 7.4020425,46.5695348,0 7.4018197,46.5694871,0 7.401569,46.5693279,0 7.4014815,46.56932,0 7.4013423,46.5692404,0 7.4011195,46.5689937,0 7.4010399,46.5689977,0 7.4007733,46.5687789,0 7.4006858,46.5686357,0 7.4006062,46.5684288,0 7.4004391,46.5683094,0 7.4001487,46.5681344,0 7.3999975,46.5679593,0 7.3998662,46.5678758,0 7.3997509,46.5677524,0 7.3995639,46.567641,0 7.3993451,46.5674302,0 7.3990148,46.5673029,0 7.3984857,46.5671079,0 7.3981833,46.5669528,0 7.3980083,46.5668851,0 7.3978571,46.5668016,0 7.3973797,46.5667817,0 7.3971051,46.5666544,0 7.3968147,46.5664793,0 7.3964208,46.566344,0 7.3961543,46.5663241,0 7.3961145,46.5662764,0 7.3956251,46.5661809,0 7.3953745,46.5661093,0 7.3949528,46.5660536,0 7.3946385,46.5659939,0 7.3942446,46.5658825,0 7.3938348,46.565787,0 7.3933614,46.5656876,0 7.3930789,46.5655921,0 7.3927089,46.5654767,0 7.3922474,46.5653932,0 7.3918774,46.5653454,0 7.3916745,46.565238,0 7.3916387,46.5650073,0 7.3913045,46.5648402,0 7.3911772,46.5648521,0 7.3907833,46.564681,0 7.3905883,46.5646651,0 7.3906082,46.5648123,0 7.3909146,46.565047,0 7.391022,46.5653733,0 7.3909544,46.5655563,0 7.3911175,46.5658229,0 7.3915392,46.5658865,0 7.3919211,46.5661133,0 7.3919092,46.5663043,0 7.3917182,46.5663281,0 7.3913244,46.5662167,0 7.3909026,46.5661929,0 7.3904849,46.5662525,0 7.3901452,46.5663573,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4920336,46.5215194,0 7.4920087,46.5216089,0 7.4916557,46.5219819,0 7.4912678,46.5220963,0 7.491044,46.5220913,0 7.4906312,46.522335,0 7.4903278,46.5224941,0 7.4898653,46.5229069,0 7.4892835,46.5233495,0 7.4883087,46.5239214,0 7.4876324,46.5242944,0 7.4875777,46.5244237,0 7.4875578,46.5246624,0 7.4874981,46.5247967,0 7.4872644,46.524931,0 7.4871052,46.524921,0 7.4868019,46.5248116,0 7.4862598,46.524747,0 7.4861802,46.5247768,0 7.4861454,46.524926,0 7.4861554,46.5253239,0 7.4860261,46.5256571,0 7.4859564,46.5257714,0 7.4858968,46.5258112,0 7.485668,46.525851,0 7.4854392,46.5258361,0 7.4852154,46.5258013,0 7.4850463,46.5258063,0 7.4848424,46.5258958,0 7.4844297,46.5260201,0 7.484191,46.5260002,0 7.4837782,46.5262041,0 7.483445,46.5262787,0 7.4831466,46.5262091,0 7.4827189,46.5262588,0 7.4817392,46.5265423,0 7.4814607,46.5266964,0 7.4812469,46.5268854,0 7.4807297,46.5270744,0 7.480302,46.5271788,0 7.4800981,46.5273479,0 7.479556,46.5275717,0 7.4792775,46.5276612,0 7.4791482,46.5277607,0 7.4786608,46.5278353,0 7.4783127,46.5279546,0 7.4781536,46.5281536,0 7.4776612,46.5283575,0 7.4771142,46.5283973,0 7.4767561,46.5285116,0 7.476224,46.528626,0 7.4753935,46.5286807,0 7.4750951,46.5287056,0 7.4749906,46.52882,0 7.4750454,46.5289642,0 7.4750006,46.5291482,0 7.4748713,46.529362,0 7.4747171,46.5294814,0 7.4744436,46.5296008,0 7.4740706,46.5297301,0 7.4737921,46.5298444,0 7.4731953,46.5298942,0 7.4731207,46.5298842,0 7.472882,46.5300334,0 7.4728025,46.5302025,0 7.472703,46.5303169,0 7.4719023,46.5305705,0 7.4717432,46.5306998,0 7.4716537,46.5310579,0 7.4713603,46.5315602,0 7.4712409,46.5316696,0 7.4711116,46.5316994,0 7.4711912,46.531784,0 7.4711812,46.5318834,0 7.4712359,46.5319481,0 7.4713652,46.531968,0 7.471589,46.5321122,0 7.471599,46.5321768,0 7.4715642,46.5323111,0 7.4716338,46.5325001,0 7.4716935,46.5325299,0 7.4716785,46.5326095,0 7.4715741,46.5327189,0 7.4715393,46.5328482,0 7.4715244,46.5329676,0 7.4715642,46.5331217,0 7.4716835,46.5332908,0 7.4716933,46.5334754,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4751759,46.5539538,0 7.475336,46.5540147,0 7.4755769,46.5537815,0 7.4758178,46.5538048,0 7.4759654,46.5540224,0 7.4758722,46.5540768,0 7.4759499,46.5545431,0 7.4757789,46.5555377,0 7.4757945,46.5557786,0 7.4757246,46.5560117,0 7.4758023,46.5561516,0 7.4757028,46.5567762,0 7.4756876,46.5570949,0 7.4758849,46.5573377,0 7.475976,46.5578234,0 7.4759608,46.5582331,0 7.4760974,46.5586126,0 7.4763554,46.5587491,0 7.4763554,46.5589464,0 7.4766134,46.5592803,0 7.4772205,46.559599,0 7.4774633,46.5598571,0 7.4778882,46.5599785,0 7.47804,46.5601606,0 7.4781007,46.5604489,0 7.4784498,46.5608132,0 7.4787685,46.5611167,0 7.4793452,46.5616479,0 7.4800282,46.5620425,0 7.4803621,46.5621639,0 7.4807111,46.562513,0 7.4810754,46.5630442,0 7.48147,46.5633477,0 7.4816369,46.5636816,0 7.4821226,46.5641673,0 7.4826386,46.5644556,0 7.483276,46.5651841,0 7.4837465,46.5655939,0 7.4843839,46.5659885,0 7.4848392,46.5666107,0 7.4854159,46.567066,0 7.4855981,46.5674303,0 7.4862658,46.5682195,0 7.4866453,46.56869,0 7.4867515,46.5689176,0 7.4869488,46.569206,0 7.4868881,46.5694792,0 7.4866453,46.5697675,0 7.4867667,46.5700407,0 7.4867375,46.5701979,0 7.4866159,46.5701456,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4528183,46.5206213,0 7.4533716,46.5207021,0 7.4542419,46.5206399,0 7.4545279,46.520584,0 7.4548014,46.5206151,0 7.4551371,46.5207394,0 7.4557836,46.5207891,0 7.4566787,46.5207829,0 7.4572817,46.5208202,0 7.4578536,46.5207954,0 7.4583945,46.5206897,0 7.4586369,46.5206772,0 7.4588296,46.5207145,0 7.4591964,46.5206959,0 7.4596502,46.5206586,0 7.4601413,46.5207394,0 7.4604024,46.5207208,0 7.4610924,46.5204721,0 7.4613908,46.5203105,0 7.4618881,46.5202421,0 7.4627025,46.5198069,0 7.4632174,46.5198895,0 7.4636909,46.5198059,0 7.4639455,46.5197423,0 7.4643274,46.5195314,0 7.4645502,46.5194877,0 7.4647293,46.5193643,0 7.4653181,46.519245,0 7.4656483,46.5191933,0 7.4657677,46.519249,0 7.4660143,46.5192211,0 7.4662252,46.5191535,0 7.4665793,46.5191336,0 7.4671243,46.5190222,0 7.4672715,46.5190659,0 7.4677728,46.5191376,0 7.4680951,46.519233,0 7.4684969,46.5192927,0 7.4687317,46.5193484,0 7.469046,46.5193962,0 7.4693443,46.5193484,0 7.4697104,46.5193604,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5644603,46.4461059,0 7.5645107,46.4465933,0 7.5642589,46.446939,0 7.5639358,46.4470668,0 7.5637291,46.4472922,0 7.56347,46.4474613,0 7.5637404,46.4476568,0 7.5639733,46.447871,0 7.5642364,46.44801,0 7.5643529,46.4480589,0 7.5643905,46.4482881,0 7.5643341,46.4484234,0 7.5645483,46.448709,0 7.5648114,46.4488029,0 7.5651457,46.4489852,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5614623,46.4593025,0 7.5611273,46.4593835,0 7.560775,46.4592943,0 7.5603616,46.4591768,0 7.5601173,46.4593272,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6045778,46.4977876,0 7.6046204,46.4977082,0 7.6049205,46.4975268,0 7.6050087,46.4974899,0 7.6051066,46.4975268,0 7.6050665,46.4973744,0 7.6049991,46.4971754,0 7.6049301,46.4970679,0 7.6047729,46.4969989,0 7.6044584,46.4969508,0 7.6042706,46.4969203,0 7.6042706,46.4967968,0 7.6044664,46.4966941,0 7.6044532,46.4966183,0 7.604413,46.4964618,0 7.6044291,46.4962673,0 7.6043749,46.4958962,0 7.6043509,46.4956034,0 7.6043288,46.4952464,0 7.6041383,46.4949355,0 7.6040039,46.4946908,0 7.6038595,46.4943719,0 7.603683,46.4940329,0 7.6035305,46.4937601,0 7.6033761,46.4934713,0 7.6033059,46.4931384,0 7.6030772,46.493014,0 7.6028792,46.4927175,0 7.602652,46.4923963,0 7.6025894,46.4922122,0 7.60237,46.4919497,0 7.6021075,46.4915932,0 7.6019273,46.4914444,0 7.6019195,46.4913464,0 7.6017354,46.4910056,0 7.6014985,46.4907235,0 7.6012378,46.4904267,0 7.6011402,46.490361,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.561897,46.4519024,0 7.562231,46.4519425,0 7.5622941,46.4520086,0 7.5625157,46.4520579,0 7.5627528,46.4519979,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.560335,46.449238,0 7.5600857,46.4492598,0 7.5598715,46.449117,0 7.5596084,46.4490493,0 7.5593942,46.4489366,0 7.5593266,46.4488765,0 7.5591725,46.4486059,0 7.5593792,46.4484631,0 7.5597023,46.4483128,0 7.5599917,46.4481512,0 7.5604201,46.4480836,0 7.5608598,46.4481813,0 7.560985,46.448126,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6042768,46.486003,0 7.6044596,46.4859007,0 7.6047448,46.4859446,0 7.6050206,46.4858788,0 7.6052901,46.4858161,0 7.6055001,46.485719,0 7.605633,46.4855823,0 7.6054326,46.4855797,0 7.6054207,46.4855607,0 7.6056389,46.4855403,0 7.6056593,46.4855377,0 7.6058197,46.4854916,0 7.6059853,46.4853622,0 7.6061485,46.4851949,0 7.6063972,46.4851147,0 7.6065223,46.4850104,0 7.6065753,46.4848692,0 7.606816,46.4848274,0 7.6069893,46.4848066,0 7.6069796,46.4846285,0 7.606771,46.4844584,0 7.6065801,46.4842642,0 7.6063843,46.484115,0 7.606256,46.4839337,0 7.6060855,46.4838297,0 7.6060184,46.4837626,0 7.6060141,46.4837445,0 7.6059921,46.4837075,0 7.6058481,46.4835616,0 7.6058982,46.4834733,0 7.6056119,46.4834351,0 7.6054002,46.4833029,0 7.6053025,46.4831814,0 7.6052052,46.4830648,0 7.6050153,46.4830218,0 7.6047188,46.4829161,0 7.6046228,46.4829174,0 7.6045128,46.4828032,0 7.6044513,46.4827961,0 7.6043955,46.4827634,0 7.6044703,46.4828142,0 7.6045465,46.482924,0 7.6044778,46.4829415,0 7.6043781,46.4828328,0 7.6043175,46.4827661,0 7.6042463,46.4827656,0 7.6041887,46.4826955,0 7.6040464,46.4825943,0 7.6040113,46.4825787,0 7.6039903,46.4825597,0 7.6038715,46.4825311,0 7.6038475,46.482703,0 7.6039627,46.4827992,0 7.6040605,46.4830684,0 7.6041515,46.4832651,0 7.6041476,46.4833395,0 7.6040977,46.483453,0 7.6039332,46.4834921,0 7.6039313,46.4834285,0 7.6040497,46.4833297,0 7.6040067,46.4832338,0 7.6039313,46.4831124,0 7.6039078,46.4830821,0 7.603763,46.4829225,0 7.6036245,46.4827777,0 7.6037187,46.4825648,0 7.6038679,46.4823875,0 7.6037994,46.4823287,0 7.6038178,46.4822847,0 7.6039364,46.4821673,0 7.6037835,46.4818871,0 7.6037431,46.4817036,0 7.603841,46.4815727,0 7.6038643,46.4815482,0 7.6039425,46.4814369,0 7.6038936,46.4812669,0 7.6039181,46.4811323,0 7.6038031,46.4809953,0 7.6036538,46.4807665,0 7.6036844,46.4806895,0 7.6037015,46.4804925,0 7.6038973,46.4803298,0 7.6039291,46.4800937,0 7.6038899,46.4799799,0 7.603956,46.479898,0 7.6040637,46.4797976,0 7.6042545,46.4797316,0 7.6041982,46.4795677,0 7.6042007,46.4795187,0 7.6041383,46.4792924,0 7.6042166,46.4790942,0 7.6045198,46.4787531,0 7.6047549,46.4784167,0 7.6049491,46.4781901,0 7.6050274,46.4781117,0 7.6049512,46.4779239,0 7.6049965,46.4777746,0 7.6050332,46.4775887,0 7.6050863,46.477561,0 7.60505,46.4773811,0 7.6049021,46.4772892,0 7.6047002,46.4773577,0 7.6047076,46.4775228,0 7.60471,46.4776452,0 7.6046109,46.4778287,0 7.6045338,46.4776733,0 7.6044727,46.4775265,0 7.6045718,46.477392,0 7.6046623,46.4773014,0 7.6049033,46.4771399,0 7.605214,46.4770372,0 7.6053486,46.4770335,0 7.6053364,46.4767656,0 7.6050538,46.4765845,0 7.6047027,46.4765907,0 7.6043295,46.4765246,0 7.6042133,46.4764573,0 7.6040066,46.4762726,0 7.6039821,46.4761698,0 7.6040629,46.4758762,0 7.6039234,46.4757062,0 7.6037375,46.475568,0 7.6034536,46.4754444,0 7.6030976,46.4754884,0 7.6028175,46.4755043,0 7.6026658,46.4754676,0 7.602393,46.4754187,0 7.6020468,46.4753686,0 7.601785,46.4753172,0 7.6017104,46.4752792,0 7.6017006,46.4750994,0 7.6018303,46.4748584,0 7.6018621,46.4746162,0 7.601703,46.4745061,0 7.60144,46.4744156,0 7.601248,46.4743128,0 7.6008565,46.47427,0 7.6007966,46.4742431,0 7.6007293,46.4742162,0 7.6006033,46.4741648,0 7.6005372,46.47427,0 7.6003415,46.4743948,0 7.5999989,46.474544,0 7.5998839,46.4746052,0 7.5997023,46.4745672,0 7.5996295,46.4745073,0 7.5995414,46.4745061,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6073503,46.5155013,0 7.6071538,46.515465,0 7.606817,46.5154259,0 7.6065284,46.5153838,0 7.6061659,46.5153941,0 7.60594,46.5155194,0 7.6059144,46.5154506,0 7.6057305,46.5154896,0 7.6054882,46.5154968,0 7.6052941,46.5154126,0 7.6049911,46.5153746,0 7.6047252,46.5152986,0 7.6044397,46.5153243,0 7.6041881,46.5153089,0 7.603904,46.5152803,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5109074,46.4975939,0 7.5106958,46.4976333,0 7.5103212,46.4976753,0 7.510222,46.4976293,0 7.5098982,46.4976558,0 7.5096505,46.4976143,0 7.5095384,46.4976181,0 7.5091324,46.4975663,0 7.5088809,46.497604,0 7.5085719,46.4976313,0 7.5082007,46.4977481,0 7.5079323,46.4977971,0 7.5077203,46.4979365,0 7.5074575,46.4980448,0 7.507172,46.4981654,0 7.5070421,46.498269,0 7.5068461,46.4983538,0 7.5066002,46.4983557,0 7.5064655,46.4984311,0 7.5062762,46.498416,0 7.5062112,46.4984424,0 7.5060416,46.4984716,0 7.5059521,46.4985469,0 7.5057421,46.4986138,0 7.5055384,46.4987028,0 7.5053641,46.4987009,0 7.505203,46.4987386,0 7.5050561,46.4986877,0 7.5049346,46.4985756,0 7.5048093,46.4985426,0 7.5046887,46.4987404,0 7.5046925,46.4988422,0 7.5046143,46.4989044,0 7.5045493,46.4988328,0 7.504423,46.4987762,0 7.5041934,46.4987215,0 7.504058,46.4986995,0 7.5040786,46.4985685,0 7.5039829,46.4985596,0 7.5037725,46.4985479,0 7.5036621,46.4985258,0 7.5035502,46.4985199,0 7.5034943,46.4985184,0 7.5031999,46.4985287,0 7.5030115,46.4984581,0 7.5028319,46.498355,0 7.5027097,46.4982844,0 7.5025891,46.4982505,0 7.5024065,46.4984066,0 7.5022402,46.4985802,0 7.5021254,46.4987245,0 7.5021195,46.4988496,0 7.5020165,46.4989394,0 7.5020224,46.4991616,0 7.5021328,46.4993324,0 7.5021211,46.4993741,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5415101,46.4829137,0 7.5411092,46.4830045,0 7.5405377,46.4830449,0 7.5399432,46.4831921,0 7.5395854,46.4833624,0 7.5389331,46.4834865,0 7.5383761,46.4836019,0 7.537822,46.4836856,0 7.5371957,46.4838472,0 7.5368933,46.4838149,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5605804,46.4538416,0 7.5606075,46.4535339,0 7.5606906,46.4534892,0 7.5606227,46.4533264,0 7.5607983,46.4530402,0 7.5605217,46.4530282,0 7.5602932,46.4529945,0 7.5601489,46.4529392,0 7.5598771,46.452997,0 7.5600647,46.4528719,0 7.5600527,46.4527228,0 7.559995,46.4525761,0 7.5599204,46.4524606,0 7.5598411,46.4522947,0 7.5597232,46.4521792,0 7.5596078,46.4520566,0 7.5597112,46.4519026,0 7.5597881,46.4518401,0 7.5598699,46.4518281,0 7.55993,46.4518088,0 7.5599325,46.4517247,0 7.5598755,46.4516727,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5952104,46.4388413,0 7.5950256,46.4384877,0 7.5948831,46.4383082,0 7.5947934,46.4380997,0 7.5943235,46.4378331,0 7.5942576,46.4376351,0 7.5943499,46.4373606,0 7.5942655,46.4370122,0 7.5942971,46.4366611,0 7.5941916,46.4363998,0 7.5938564,46.4360514,0 7.5936689,46.4358772,0 7.5934235,46.4354338,0 7.5932202,46.4351381,0 7.5930117,46.4349323,0 7.5925736,46.4346314,0 7.5923492,46.4345284,0 7.5919374,46.4340348,0 7.5918899,46.4339108,0 7.5919454,46.433726,0 7.5918477,46.4333697,0 7.5916233,46.4332747,0 7.5914307,46.4327969,0 7.5913409,46.4325145,0 7.5913013,46.4322426,0 7.5912459,46.4320011,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5296583,46.4300374,0 7.5292858,46.4300524,0 7.5290588,46.4300577,0 7.5289348,46.4300867,0 7.5287368,46.4300762,0 7.5285785,46.4301184,0 7.5285204,46.4302715,0 7.5283462,46.4303111,0 7.5282274,46.4304193,0 7.5280031,46.4305117,0 7.5277813,46.4306278,0 7.5275095,46.4308363,0 7.5272006,46.4309762,0 7.5269367,46.4311716,0 7.5266701,46.4313062,0 7.5262715,46.431813,0 7.5259997,46.4321112,0 7.525873,46.4322221,0 7.5256011,46.4324781,0 7.5255826,46.4325599,0 7.5254058,46.4326101,0 7.5254111,46.4327157,0 7.5252289,46.4327447,0 7.5251392,46.4328793,0 7.5251366,46.4329374,0 7.5250389,46.4329691,0 7.5250811,46.4330694,0 7.5249967,46.4331063,0 7.5249967,46.4331565,0 7.524928,46.4332568,0 7.5249175,46.4333096,0 7.524775,46.4332884,0 7.5247281,46.4333904,0 7.5245886,46.433383,0 7.524138,46.4334496,0 7.5238591,46.4335457,0 7.5237089,46.4336123,0 7.5234836,46.4336862,0 7.5233065,46.4337749,0 7.5231939,46.4338415,0 7.523033,46.4339043,0 7.5227218,46.4340411,0 7.5225931,46.4341409,0 7.5225394,46.4342075,0 7.5223624,46.4343221,0 7.5223088,46.4344441,0 7.5221961,46.4345291,0 7.5220942,46.4346327,0 7.5219815,46.4347362,0 7.5215148,46.4349654,0 7.5211608,46.4351613,0 7.5210267,46.4352648,0 7.5209087,46.4353055,0 7.5208228,46.4353277,0 7.5207477,46.4353758,0 7.5206619,46.4353721,0 7.520619,46.4353351,0 7.5206136,46.4353129,0 7.5205707,46.4352685,0 7.520501,46.4352981,0 7.5204634,46.4353203,0 7.5204205,46.4353129,0 7.520399,46.4352685,0 7.5203829,46.435239,0 7.5203883,46.4352094,0 7.5204312,46.4351428,0 7.5204527,46.4351022,0 7.5204473,46.4350763,0 7.5203937,46.4350652,0 7.5203025,46.4350874,0 7.5202542,46.4350837,0 7.5201791,46.4350837,0 7.5200879,46.4351133,0 7.5200503,46.4351281,0 7.5199538,46.4351281,0 7.519884,46.435165,0 7.5198411,46.4351872,0 7.5198036,46.4352242,0 7.5197446,46.4352205,0 7.5197124,46.4351576,0 7.5197285,46.435117,0 7.519766,46.4350615,0 7.5197177,46.435043,0 7.519648,46.4350615,0 7.5196051,46.43508,0 7.5195783,46.435043,0 7.5195944,46.4350024,0 7.5195783,46.4349765,0 7.51953,46.4349654,0 7.519471,46.4350024,0 7.5194173,46.4350098,0 7.5193959,46.4349876,0 7.5193637,46.4349617,0 7.5193047,46.4349728,0 7.5192457,46.434958,0 7.5192028,46.4349173,0 7.5192135,46.4348804,0 7.5191813,46.4348397,0 7.5191813,46.4347916,0 7.5191438,46.434751,0 7.519074,46.4347399,0 7.5189936,46.4347399,0 7.5189292,46.4347251,0 7.5188594,46.4347288,0 7.5188112,46.4347657,0 7.5187682,46.4348212,0 7.5187146,46.4348508,0 7.5186341,46.4348508,0 7.5185161,46.4348582,0 7.5184625,46.4348841,0 7.5184625,46.4349432,0 7.5185054,46.4350282,0 7.5185537,46.4350874,0 7.5185751,46.4351355,0 7.5185751,46.435202,0 7.5185215,46.4352427,0 7.5184464,46.4352575,0 7.5182586,46.4352612,0 7.5180441,46.4352722,0 7.517808,46.4353499,0 7.5176471,46.4354275,0 7.5175827,46.4354793,0 7.5175022,46.4355052,0 7.5174915,46.4354719,0 7.5175076,46.4354386,0 7.5174325,46.4354608,0 7.5173628,46.4354571,0 7.5173091,46.4354904,0 7.5172662,46.4354682,0 7.5173252,46.4354349,0 7.5172769,46.4354201,0 7.5172072,46.4354386,0 7.5171482,46.4354608,0 7.5171267,46.4355015,0 7.5171106,46.4356272,0 7.5170731,46.4357122,0 7.5169819,46.4357676,0 7.5168961,46.4357676,0 7.516778,46.435812,0 7.5166761,46.4358305,0 7.5165635,46.4358083,0 7.5164991,46.4357972,0 7.5164079,46.4358231,0 7.5162684,46.4358342,0 7.5162041,46.4358896,0 7.5161611,46.4359451,0 7.5161772,46.4360005,0 7.5161504,46.4360634,0 7.5161129,46.436141,0 7.5160646,46.4362335,0 7.5160914,46.4362815,0 7.5160109,46.4363555,0 7.515968,46.4364183,0 7.5159251,46.4364922,0 7.5158607,46.4365181,0 7.5157749,46.4364738,0 7.5157105,46.4363702,0 7.515614,46.436263,0 7.515555,46.4362409,0 7.5155174,46.4362889,0 7.5155174,46.4363629,0 7.5155442,46.4364331,0 7.515555,46.4365033,0 7.5155496,46.4365736,0 7.5155925,46.4366253,0 7.5156408,46.4367067,0 7.5156676,46.4367843,0 7.5156462,46.436825,0 7.5155657,46.4368952,0 7.5155389,46.4369618,0 7.5155764,46.4370283,0 7.5155657,46.4370837,0 7.5155281,46.4370468,0 7.5154691,46.4369913,0 7.5154584,46.4370431,0 7.5154048,46.4370505,0 7.5153511,46.436995,0 7.5153457,46.4370579,0 7.5153779,46.437117,0 7.5153726,46.4371688,0 7.5153511,46.4371947,0 7.5152814,46.4371836,0 7.5152277,46.4372353,0 7.5151848,46.4372575,0 7.5151526,46.4373093,0 7.5151044,46.437313,0 7.5151151,46.4372538,0 7.5150507,46.4372575,0 7.5150078,46.4372908,0 7.5149434,46.437276,0 7.5149434,46.4372131,0 7.514922,46.4371799,0 7.514863,46.4371836,0 7.5148254,46.4372316,0 7.5148147,46.4372871,0 7.5147878,46.4372575,0 7.5147718,46.4372316,0 7.5147449,46.4373203,0 7.5147449,46.4374202,0 7.514702,46.4375422,0 7.5146001,46.4376679,0 7.5144928,46.4377159,0 7.5144231,46.4377085,0 7.5142085,46.4377566,0 7.5141441,46.4377972,0 7.5141173,46.4378342,0 7.5140315,46.4378675,0 7.5139564,46.4379155,0 7.5138544,46.4379377,0 7.5137096,46.4379747,0 7.5135862,46.4380671,0 7.5134736,46.4380597,0 7.5132107,46.4380819,0 7.5131088,46.438141,0 7.5130337,46.4382113,0 7.5129639,46.4382298,0 7.5128084,46.438215,0 7.5125884,46.438263,0 7.5123631,46.4383185,0 7.5121915,46.4383148,0 7.51217,46.4383444,0 7.5120466,46.4383739,0 7.5119501,46.4383739,0 7.511757,46.4383776,0 7.5116952,46.4384008,0 7.5115799,46.4384442,0 7.5114083,46.4385662,0 7.5112956,46.438666,0 7.5110864,46.4387067,0 7.5109255,46.4387436,0 7.5108128,46.4388508,0 7.5107109,46.4389987,0 7.5106197,46.4390431,0 7.5105285,46.4392242,0 7.510389,46.4394017,0 7.510094,46.4396382,0 7.5098633,46.439812,0 7.5097077,46.4399155,0 7.5096434,46.4400523,0 7.5094395,46.4402223,0 7.5090587,46.4404256,0 7.5088387,46.4405365,0 7.5085919,46.4405809,0 7.5084096,46.4406068,0 7.508254,46.4406511,0 7.5080823,46.4406622,0 7.5078892,46.4406585,0 7.5077015,46.4406844,0 7.5075781,46.4407362,0 7.5075244,46.4408138,0 7.5075191,46.4409025,0 7.507503,46.440969,0 7.5074279,46.4410393,0 7.5072723,46.4411206,0 7.5071704,46.4411724,0 7.507047,46.4412093,0 7.5069343,46.4412943,0 7.5068217,46.4413276,0 7.5067037,46.4413128,0 7.5064676,46.4412907,0 7.506119,46.4413054,0 7.5058132,46.4413239,0 7.5056415,46.4413387,0 7.5054323,46.4412943,0 7.5052714,46.4412463,0 7.5051265,46.4412352,0 7.5049656,46.4412685,0 7.5048529,46.4413054,0 7.5047296,46.441372,0 7.5045901,46.4413979,0 7.5045204,46.4414311,0 7.5045311,46.4414829,0 7.5046062,46.4414829,0 7.504633,46.4415198,0 7.5047671,46.4415235,0 7.5048905,46.4415642,0 7.50503,46.4415901,0 7.505148,46.4415605,0 7.5052285,46.4415494,0 7.505325,46.4415605,0 7.5053357,46.4415975,0 7.5052928,46.4416492,0 7.505148,46.4417527,0 7.5050407,46.4417971,0 7.5049173,46.4419191,0 7.5047671,46.4420558,0 7.5046491,46.4421409,0 7.5045043,46.4421593,0 7.5043809,46.4421002,0 7.5043004,46.4420374,0 7.5042468,46.4420004,0 7.5040644,46.4419893,0 7.5037908,46.4419154,0 7.5037532,46.4418636,0 7.5036674,46.441834,0 7.503603,46.4418045,0 7.5034367,46.4417638,0 7.5033402,46.4417084,0 7.5031685,46.4416492,0 7.5030451,46.441579,0 7.5028413,46.4415346,0 7.5026535,46.4415161,0 7.5024765,46.4415161,0 7.5023746,46.4415346,0 7.502219,46.4415568,0 7.5017952,46.4415568,0 7.5013553,46.4415272,0 7.5009423,46.4414903,0 7.5006848,46.4414755,0 7.5004905,46.4414532,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5531803,46.3637433,0 7.5528114,46.3639866,0 7.5525992,46.3642187,0 7.5525078,46.3645431,0 7.5526612,46.3646039,0 7.5525567,46.3646918,0 7.5527167,46.3648923,0 7.5526579,46.3649621,0 7.5531019,46.3651356,0 7.5533435,46.3653158,0 7.5534937,46.365487,0 7.553399,46.3657461,0 7.5533859,46.3658632,0 7.5540813,46.3660367,0 7.554398,46.3662507,0 7.554558,46.3662935,0 7.5544894,46.3665075,0 7.5575791,46.3665852,0 7.5581286,46.3669084,0 7.5585494,46.3672031,0 7.5593082,46.3680655,0 7.5601499,46.3683251,0 7.5608066,46.3683911,0 7.5614315,46.3685451,0 7.5621392,46.3686595,0 7.5623815,46.3688178,0 7.5628725,46.3687255,0 7.5632742,46.3687123,0 7.5640022,46.368933,0 7.5641483,46.3691113,0 7.5642859,46.3690848,0 7.5646324,46.3693502,0 7.5652508,46.369491,0 7.5654485,46.3693986,0 7.5658555,46.3695314,0 7.5661611,46.3693956,0 7.5664049,46.3694558,0 7.5665516,46.3694074,0 7.5667742,46.3694346,0 7.5668756,46.369562,0 7.5671841,46.3695809,0 7.5675053,46.3697029,0 7.5678332,46.3697682,0 7.5682137,46.3697683,0 7.5685091,46.3698694,0 7.5691078,46.3696964,0 7.5691873,46.3698198,0 7.569288,46.3698413,0 7.569423,46.3697524,0 7.5694081,46.3698386,0 7.5695654,46.3698578,0 7.5697199,46.3699574,0 7.569829,46.3700234,0 7.5699239,46.3700186,0 7.5700752,46.3700821,0 7.5702149,46.3700415,0 7.5702412,46.3701205,0 7.5703156,46.3701287,0 7.5704896,46.3701844,0 7.5705317,46.3701552,0 7.5706147,46.3701703,0 7.5706274,46.3701162,0 7.570783,46.3701671,0 7.5708306,46.3701076,0 7.5710723,46.3701124,0 7.5711163,46.370016,0 7.571372,46.3699618,0 7.5719076,46.3701201,0 7.5721641,46.3701943,0 7.5722033,46.3702231,0 + + + + Geissweg + Geissweg, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6222616,46.3768109,0 7.6221674,46.3766908,0 7.6219495,46.3765308,0 7.6217027,46.3762199,0 7.6214667,46.3759238,0 7.6214023,46.3757166,0 7.6213272,46.3755685,0 7.6213057,46.3754279,0 7.621295,46.3752429,0 7.6212839,46.3751056,0 7.6212735,46.3748801,0 7.6212735,46.3747543,0 7.6212092,46.3745767,0 7.6211233,46.3744064,0 7.6211126,46.374251,0 7.6211155,46.3740319,0 7.6210626,46.373873,0 7.6209285,46.3736805,0 7.6208534,46.3735175,0 7.6206785,46.3733627,0 7.6205037,46.3732489,0 7.6203591,46.3730989,0 7.6200909,46.372825,0 7.6198387,46.3725622,0 7.6195705,46.3725807,0 7.6194257,46.3724548,0 7.6194096,46.3723919,0 7.6192379,46.3722365,0 7.6191682,46.3719663,0 7.618857,46.3719589,0 7.6187337,46.3718848,0 7.6185405,46.371622,0 7.6183474,46.3714777,0 7.6181597,46.3712889,0 7.6179612,46.3712408,0 7.6177681,46.3711816,0 7.6176018,46.3711779,0 7.6175052,46.3711927,0 7.6171994,46.3710594,0 7.616781,46.3707966,0 7.6166523,46.3707707,0 7.6165986,46.3705709,0 7.6164377,46.3703266,0 7.6164216,46.3702599,0 7.6163143,46.3702266,0 7.6162338,46.3702562,0 7.6162553,46.3704006,0 7.6161373,46.3702562,0 7.6160944,46.3703118,0 7.615853,46.3702969,0 7.6158476,46.3705153,0 7.6156974,46.370445,0 7.6155794,46.3706449,0 7.6154882,46.3706671,0 7.6154828,46.3707448,0 7.615338,46.3706227,0 7.6153058,46.370693,0 7.6152575,46.3706819,0 7.6151878,46.370693,0 7.6152361,46.3708188,0 7.6152146,46.3709447,0 7.6152361,46.3710927,0 7.6153434,46.3711964,0 7.6154721,46.3712778,0 7.6154828,46.3714333,0 7.6153863,46.3716998,0 7.6154077,46.3718034,0 7.6152897,46.3719367,0 7.6151395,46.3720921,0 7.6152253,46.3723068,0 7.6151502,46.3724326,0 7.615,46.3725659,0 7.6149035,46.3727139,0 7.6150644,46.3727879,0 7.6152897,46.3727657,0 7.6154721,46.3728472,0 7.6155579,46.3729582,0 7.6155579,46.3730544,0 7.6153434,46.3731433,0 7.6151717,46.3732913,0 7.6150429,46.373432,0 7.6150751,46.3734986,0 7.6154292,46.3735948,0 7.6157832,46.3738835,0 7.6161266,46.3740982,0 7.6162875,46.3744165,0 7.6162017,46.3745127,0 7.6160836,46.3746607,0 7.6162231,46.3748902,0 7.6163626,46.3751123,0 7.6163733,46.3752529,0 7.6162768,46.3752455,0 7.6162124,46.3755194,0 7.6162875,46.3757489,0 7.6164913,46.3759117,0 7.6166845,46.3761264,0 7.6169527,46.3762004,0 7.6169419,46.3763928,0 7.6168025,46.3765335,0 7.6168561,46.3766297,0 7.6166094,46.3770294,0 7.6167596,46.3773107,0 7.6167059,46.3774291,0 7.6167596,46.377555,0 7.6167596,46.3776586,0 7.6165772,46.3776882,0 7.6164591,46.377703,0 7.6163626,46.3778806,0 7.6163733,46.3780435,0 7.6164377,46.3782285,0 7.6163411,46.3782803,0 7.6165128,46.378384,0 7.6167274,46.3788059,0 7.6165986,46.3790057,0 7.6166201,46.3792722,0 7.6163948,46.3794054,0 7.6163304,46.3795164,0 7.6165879,46.3795904,0 7.6163197,46.3797385,0 7.6160085,46.3798569,0 7.6159442,46.3799605,0 7.6159549,46.3801233,0 7.6162124,46.3802862,0 7.6161802,46.3803602,0 7.6163089,46.380523,0 7.6161802,46.3806636,0 7.6163152,46.3807166,0 7.6163197,46.3807155,0 7.6163152,46.3807166,0 7.616545,46.3806562,0 7.6168883,46.3808265,0 7.6172102,46.3809005,0 7.6174891,46.3814926,0 7.6175428,46.3816406,0 7.6173926,46.3817442,0 7.6174247,46.3820551,0 7.6173282,46.3824474,0 7.6175535,46.38244,0 7.6176608,46.3827952,0 7.6175857,46.3829728,0 7.6175857,46.3830765,0 7.6174569,46.3833355,0 7.6175428,46.3836389,0 7.6173604,46.3840608,0 7.6173496,46.3848305,0 7.6175213,46.3850007,0 7.6175535,46.3852079,0 7.6176608,46.3852227,0 7.6177788,46.3851487,0 7.6188946,46.3855558,0 7.6192594,46.3857556,0 7.6197422,46.3858962,0 7.6201737,46.3860141,0 7.6204151,46.3860289,0 7.6206176,46.3859502,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5284879,46.4891875,0 7.5286313,46.4893803,0 7.5287117,46.4900478,0 7.5284951,46.4908182,0 7.5289364,46.4906938,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4345295,46.4574371,0 7.4347762,46.4573336,0 7.4350874,46.4572893,0 7.4353341,46.4572301,0 7.4354414,46.4570823,0 7.4356774,46.4567867,0 7.4357204,46.4564319,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4357204,46.4564319,0 7.4363534,46.4565058,0 7.4372546,46.4566093,0 7.4375872,46.4566536,0 7.4377803,46.4567202,0 7.4379949,46.456698,0 7.4382202,46.4566389,0 7.4384777,46.4566019,0 7.4387566,46.4566536,0 7.4390892,46.4567793,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4319089,46.4675275,0 7.4326197,46.4677909,0 7.4330703,46.46802,0 7.4340467,46.4683451,0 7.4347869,46.4685668,0 7.4351195,46.4686629,0 7.4354092,46.4689289,0 7.4357955,46.4693649,0 7.4360816,46.4694487,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4389752,46.4648103,0 7.4388936,46.4647475,0 7.4374799,46.4641657,0 7.4368575,46.4640778,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4391324,46.4649312,0 7.4389752,46.4648103,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4291628,46.5638818,0 7.4290955,46.5638078,0 7.4290258,46.5636455,0 7.4289346,46.5634796,0 7.4288327,46.5633357,0 7.4286825,46.5631919,0 7.4284893,46.5630997,0 7.428264,46.5630443,0 7.4280441,46.5630812,0 7.4278563,46.5631624,0 7.4276686,46.5632103,0 7.4275774,46.5631439,0 7.4275345,46.5630443,0 7.4274755,46.5629005,0 7.427336,46.5627677,0 7.4273413,46.5626239,0 7.4272716,46.562528,0 7.4272126,46.5623583,0 7.4271482,46.5621923,0 7.42688,46.5619415,0 7.4265689,46.5618346,0 7.4262899,46.5616354,0 7.4258769,46.561285,0 7.4255443,46.5609973,0 7.4252385,46.5606579,0 7.4249756,46.5603887,0 7.4247021,46.5602153,0 7.4244016,46.559994,0 7.4240261,46.5598133,0 7.4237311,46.5597542,0 7.4235039,46.559884,0 7.4232751,46.5600198,0 7.4232161,46.5599608,0 7.4231464,46.5598797,0 7.4230605,46.559651,0 7.422964,46.559496,0 7.4227119,46.5593891,0 7.4224436,46.5593411,0 7.4223363,46.5593411,0 7.4221754,46.559319,0 7.4221057,46.5592083,0 7.4219769,46.5590903,0 7.4218911,46.5590424,0 7.4217731,46.5591087,0 7.4214727,46.5591899,0 7.4213439,46.5592157,0 7.4212313,46.5591641,0 7.4210864,46.5591604,0 7.420888,46.5592415,0 7.4203944,46.5593264,0 7.4196273,46.5593338,0 7.4191231,46.5593522,0 7.4186188,46.5594592,0 7.4183184,46.5595219,0 7.417798,46.5595256,0 7.4172401,46.5595219,0 7.4168915,46.559496,0 7.4167895,46.5595071,0 7.4166286,46.5594887,0 7.4162853,46.5594592,0 7.4160546,46.559426,0 7.4158615,46.5594997,0 7.4158293,46.5594481,0 7.4158293,46.5593891,0 7.4158669,46.5593448,0 7.4157864,46.559319,0 7.4156308,46.5592342,0 7.4155074,46.5590903,0 7.4152339,46.5589686,0 7.4148208,46.5588063,0 7.4146813,46.5586403,0 7.4144507,46.5585038,0 7.4143273,46.5584632,0 7.4141985,46.5584817,0 7.4139893,46.5584743,0 7.4137801,46.5583858,0 7.4134636,46.5583858,0 7.4129701,46.5583673,0 7.4126643,46.5583304,0 7.4123317,46.5582714,0 7.4122512,46.558205,0 7.4122834,46.5581128,0 7.4122995,46.5580501,0 7.4122995,46.5578915,0 7.412144,46.5577624,0 7.4119937,46.5575706,0 7.411468,46.5573861,0 7.411055,46.5573087,0 7.4106795,46.5572644,0 7.4104917,46.557246,0 7.4103469,46.5573087,0 7.4103254,46.5574415,0 7.4102986,46.5574968,0 7.4100626,46.557482,0 7.409671,46.5574083,0 7.4090487,46.5572644,0 7.4087161,46.5570615,0 7.4086088,46.5569988,0 7.4079382,46.556855,0 7.4077559,46.5566927,0 7.4077237,46.5564603,0 7.4077183,46.5562057,0 7.4076593,46.5560914,0 7.4075252,46.5559586,0 7.4075198,46.5558147,0 7.4075037,46.5557004,0 7.4073321,46.5555749,0 7.4071926,46.5554717,0 7.4069727,46.5553425,0 7.4066132,46.555195,0 7.4061734,46.5550954,0 7.4059105,46.55497,0 7.4057496,46.5549073,0 7.4056047,46.5545457,0 7.4054921,46.5543834,0 7.4053419,46.5543318,0 7.4052292,46.5542506,0 7.4051917,46.5541473,0 7.4052185,46.5539481,0 7.4050683,46.5538043,0 7.404961,46.5537194,0 7.4048591,46.5536124,0 7.4048591,46.5535239,0 7.4049556,46.5533874,0 7.4049771,46.5533026,0 7.4048698,46.5532251,0 7.4047035,46.5531439,0 7.4044031,46.5529779,0 7.4042207,46.5528599,0 7.4039793,46.5526312,0 7.4035609,46.5523213,0 7.4033678,46.5522364,0 7.4032605,46.5521737,0 7.4031586,46.5521295,0 7.4030513,46.5520667,0 7.4028474,46.5520151,0 7.4026811,46.5519044,0 7.4026918,46.5518196,0 7.4027079,46.5516609,0 7.4024504,46.5514986,0 7.4022037,46.5513437,0 7.4018604,46.551174,0 7.4016351,46.551126,0 7.4013186,46.5510854,0 7.4008733,46.5509821,0 7.40053,46.5509526,0 7.3999882,46.5510153,0 7.3997414,46.5513179,0 7.39972,46.5515835,0 7.3998326,46.5516831,0 7.3998916,46.5517126,0 7.4000418,46.55172,0 7.4001384,46.551779,0 7.4001545,46.551838,0 7.400074,46.5518343,0 7.399956,46.5518417,0 7.3999131,46.5519081,0 7.3998863,46.5519671,0 7.3999453,46.5520225,0 7.3998702,46.5520631,0 7.3999399,46.552111,0 7.3998594,46.5521073,0 7.4000204,46.5523028,0 7.4002189,46.5525574,0 7.4003208,46.5527529,0 7.400412,46.5528894,0 7.4005568,46.5530148,0 7.4006963,46.5531513,0 7.400707,46.5532288,0 7.4006265,46.5532435,0 7.4005514,46.5532067,0 7.4004549,46.5531882,0 7.4004173,46.5532509,0 7.4004173,46.5533063,0 7.4003476,46.5533616,0 7.4001813,46.5533505,0 7.3999506,46.5533579,0 7.3998916,46.5534132,0 7.3997146,46.5536235,0 7.3995268,46.5539186,0 7.3994088,46.5541473,0 7.3991138,46.5545605,0 7.3989475,46.5547855,0 7.3990923,46.5552946,0 7.3991728,46.5554864,0 7.3991835,46.5555639,0 7.3991782,46.5556155,0 7.399087,46.5555971,0 7.3989207,46.555479,0 7.3987275,46.5554089,0 7.3984593,46.5553057,0 7.3982501,46.5551581,0 7.3980945,46.5550917,0 7.3979122,46.5550991,0 7.3978585,46.5551839,0 7.3978639,46.5552725,0 7.3978049,46.5552725,0 7.3974776,46.5552429,0 7.397188,46.5550843,0 7.3967695,46.5550069,0 7.3966676,46.5550622,0 7.3966622,46.5551507,0 7.3966944,46.5552466,0 7.3965818,46.5553462,0 7.3963994,46.5554385,0 7.3963457,46.5555417,0 7.396276,46.5556081,0 7.3960614,46.5556192,0 7.3958683,46.5555122,0 7.3958415,46.5553167,0 7.3956698,46.5551692,0 7.3954874,46.5550106,0 7.395305,46.5549146,0 7.395305,46.5550069,0 7.3953211,46.5551028,0 7.3954177,46.5552393,0 7.3954606,46.5553241,0 7.3953855,46.555468,0 7.3952943,46.5556303,0 7.3952514,46.5558,0 7.3952568,46.555977,0 7.3952621,46.5561615,0 7.3952621,46.5563459,0 7.3951602,46.5564603,0 7.3950261,46.5565562,0 7.3948813,46.5566189,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5658624,46.5011096,0 7.5659292,46.5011241,0 7.5660166,46.5011678,0 7.5662026,46.5012103,0 7.5666147,46.5013842,0 7.5667588,46.5014242,0 7.5669066,46.5014373,0 7.5670507,46.5015243,0 7.5671619,46.5016086,0 7.5673501,46.5017095,0 7.5675991,46.5017956,0 7.5677317,46.5018426,0 7.5678619,46.5020131,0 7.5678935,46.5020157,0 7.5679011,46.5019704,0 7.56788,46.50188,0 7.567992,46.5019974,0 7.5681955,46.5021296,0 7.5685303,46.5022514,0 7.5686352,46.5023384,0 7.5686706,46.5024219,0 7.56873,46.5027741,0 7.5687868,46.5028576,0 7.5688462,46.5028419,0 7.5689132,46.5026845,0 7.5688905,46.5024593,0 7.568898,46.5023853,0 7.5689612,46.5023949,0 7.5690244,46.502501,0 7.5692304,46.5026471,0 7.5693011,46.5026828,0 7.5693555,46.5026523,0 7.5693529,46.502541,0 7.5693529,46.5024984,0 7.5694047,46.5024845,0 7.5696158,46.5027419,0 7.5696714,46.5027524,0 7.569713,46.5026723,0 7.5697067,46.5025419,0 7.5696416,46.5023484,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5678619,46.5020131,0 7.5679328,46.5022479,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5686907,46.5028223,0 7.568699,46.5027941,0 7.56873,46.5027741,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5613391,46.4939717,0 7.5611723,46.4943217,0 7.5611146,46.4943645,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4099747,46.4812081,0 7.4100874,46.4812561,0 7.4102644,46.4813559,0 7.4104897,46.48133,0 7.4106882,46.4812598,0 7.4109618,46.4812266,0 7.4111978,46.4811564,0 7.4113319,46.4810382,0 7.4114124,46.4808756,0 7.4114982,46.4807759,0 7.4116806,46.4807759,0 7.4118791,46.4809089,0 7.4120293,46.4809532,0 7.4122624,46.480898,0 7.4124263,46.4807981,0 7.4125819,46.4807242,0 7.4128125,46.4807611,0 7.4130003,46.4807205,0 7.4131827,46.4806282,0 7.413349,46.4805727,0 7.4136172,46.4805395,0 7.4140088,46.4805469,0 7.4141,46.4804878,0 7.414159,46.4803991,0 7.4143146,46.4803954,0 7.4144111,46.4804361,0 7.4143628,46.4805395,0 7.4143682,46.4806355,0 7.4147705,46.4806429,0 7.4148027,46.4805617,0 7.4150441,46.4805063,0 7.4154089,46.4805063,0 7.4157147,46.4805173,0 7.4158702,46.4805026,0 7.4160634,46.4803917,0 7.4163477,46.4803696,0 7.4166213,46.4804102,0 7.4167554,46.4805432,0 7.4167071,46.4807501,0 7.416868,46.4809421,0 7.4169324,46.4812746,0 7.4170075,46.481511,0 7.4172006,46.4816107,0 7.4174849,46.4816107,0 7.4178014,46.4815886,0 7.4179087,46.4816957,0 7.4179516,46.481825,0 7.4180857,46.4820946,0 7.4181877,46.4822941,0 7.4182574,46.4822756,0 7.4184505,46.48215,0 7.4187402,46.4819838,0 7.4189709,46.481825,0 7.4192844,46.4816599,0 7.4194698,46.4816033,0 7.4198882,46.4815073,0 7.4202798,46.4814076,0 7.4206982,46.4813152,0 7.4210737,46.4811675,0 7.4215136,46.4809865,0 7.4218462,46.4807611,0 7.422152,46.4805358,0 7.4224148,46.4803954,0 7.4227152,46.4802588,0 7.4228976,46.4801147,0 7.4232302,46.4799669,0 7.4236647,46.4797712,0 7.4239383,46.479531,0 7.4243085,46.4793759,0 7.4244694,46.4791432,0 7.4246411,46.4789289,0 7.4249039,46.4787184,0 7.4251239,46.4784819,0 7.4253492,46.4783305,0 7.4255691,46.4781605,0 7.4257247,46.4779167,0 7.4258481,46.4775806,0 7.4260144,46.4773035,0 7.4261592,46.477056,0 7.42629,46.4769389,0 7.4263738,46.4768639,0 7.4265723,46.4767309,0 7.42676,46.4765794,0 7.4269585,46.4764612,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4317516,46.4728703,0 7.4318669,46.4725932,0 7.4320708,46.4722681,0 7.4322907,46.47198,0 7.4326233,46.4716548,0 7.4330793,46.4713851,0 7.4334119,46.4711893,0 7.4336855,46.4709972,0 7.4340985,46.4707201,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6164187,46.5309288,0 7.6170658,46.5311194,0 7.6182054,46.5313292,0 7.6193915,46.5318375,0 7.6194839,46.5322688,0 7.6204851,46.5333009,0 7.6213939,46.5338554,0 7.6221795,46.5344869,0 7.6231345,46.5348566,0 7.6244438,46.5351031,0 7.6247981,46.5355343,0 7.6250907,46.5362891,0 7.6253526,46.5364431,0 7.6258455,46.5370439,0 7.6256606,46.5375368,0 7.625445,46.5377524,0 7.6255066,46.5380297,0 7.6262306,46.5384302,0 7.6269853,46.5383069,0 7.6273704,46.5384764,0 7.6280328,46.5390925,0 7.6286181,46.5392927,0 7.6284332,46.5401091,0 7.6285565,46.5408331,0 7.628957,46.5414184,0 7.6298349,46.5422964,0 7.6298811,46.5428663,0 7.6310353,46.5445644,0 7.6319403,46.5448838,0 7.632792,46.5459218,0 7.6333243,46.5463211,0 7.6338034,46.5470664,0 7.6350278,46.547998,0 7.6350012,46.5489296,0 7.635294,46.5494087,0 7.6347084,46.5505,0 7.6342027,46.5509791,0 7.6342293,46.551538,0 7.6355868,46.5524164,0 7.6357731,46.5529221,0 7.6366515,46.5538537,0 7.6373435,46.5548119,0 7.6383816,46.5557169,0 7.6389139,46.5569945,0 7.6396858,46.5579527,0 7.6397656,46.5586713,0 7.6403512,46.5592569,0 7.6412562,46.5595497,0 7.642241,46.5606144,0 7.642478,46.5605806,0 7.6425216,46.5611584,0 7.6429032,46.560984,0 7.6436118,46.5608096,0 7.644037,46.5608096,0 7.644822,46.5612784,0 7.6449855,46.5615073,0 7.6445712,46.5615182,0 7.6442769,46.5616817,0 7.6440043,46.5625866,0 7.6435791,46.5629464,0 7.6435682,46.5633825,0 7.6431209,46.5636803,0 7.6432613,46.5638823,0 7.6430399,46.5644631,0 7.6434328,46.5645423,0 7.6431219,46.5647846,0 7.6428512,46.5649312,0 7.6431547,46.5649537,0 7.6435178,46.564926,0 7.6432531,46.5651398,0 7.6428116,46.5653032,0 7.6419408,46.565309,0 7.6411101,46.5652106,0 7.64133,46.5653611,0 7.6419408,46.5655515,0 7.6426597,46.5656959,0 7.6429907,46.5657714,0 7.6435639,46.5660093,0 7.6440848,46.5657547,0 7.6449761,46.5657894,0 7.6465965,46.5652454,0 7.6475457,46.5652454,0 7.6476846,46.5653958,0 7.6472447,46.5654769,0 7.6466197,46.5656852,0 7.6460409,46.5660324,0 7.6457516,46.5660324,0 7.6456937,46.5661482,0 7.6458673,46.5661945,0 7.6466742,46.5659811,0 7.6471656,46.5658899,0 7.6475915,46.5659523,0 7.6480022,46.5661775,0 7.6485642,46.5662755,0 7.6480434,46.5663565,0 7.6470364,46.5664028,0 7.6464576,46.5668195,0 7.6468628,46.5676992,0 7.6460583,46.5680271,0 7.6456236,46.5682188,0 7.6453857,46.5682752,0 7.6452455,46.5684742,0 7.6453161,46.5686246,0 7.6447213,46.5689462,0 7.6442816,46.569285,0 7.6432514,46.569366,0 7.6427884,46.5695165,0 7.6419435,46.5695049,0 7.6410406,46.5698637,0 7.6401725,46.5698405,0 7.6399295,46.5701183,0 7.6401378,46.5703151,0 7.6400452,46.5705813,0 7.639322,46.5710956,0 7.6388716,46.5713042,0 7.6387679,46.5715394,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.490681,46.4144632,0 7.4904801,46.4146018,0 7.4903907,46.4147865,0 7.4903163,46.4150995,0 7.4902866,46.4155664,0 7.4902493,46.4159204,0 7.4902493,46.4162641,0 7.4902047,46.4164591,0 7.4899517,46.4165925,0 7.4896093,46.4167823,0 7.489267,46.4169927,0 7.4890958,46.4170543,0 7.4889395,46.4170594,0 7.4886865,46.416967,0 7.4884707,46.4168593,0 7.4882102,46.4166284,0 7.4878679,46.4164488,0 7.4874883,46.4164027,0 7.4871386,46.4164796,0 7.4869302,46.4165925,0 7.4866251,46.4166848,0 7.4862306,46.4166541,0 7.4858809,46.4165822,0 7.4854492,46.4164694,0 7.4849208,46.4164488,0 7.4842734,46.4164437,0 7.4838641,46.416454,0 7.4834101,46.4165258,0 7.4830454,46.4165053,0 7.4822268,46.4164129,0 7.4818026,46.4163052,0 7.4815719,46.4161461,0 7.4811254,46.4160076,0 7.4806119,46.4158742,0 7.4802175,46.4156844,0 7.4797709,46.4153355,0 7.4793319,46.4150276,0 7.4786174,46.4147301,0 7.4782453,46.4145813,0 7.4780444,46.4144786,0 7.4777467,46.4144838,0 7.4773672,46.4145556,0 7.4770769,46.414571,0 7.4766676,46.4145813,0 7.4764518,46.4145813,0 7.4763327,46.4146787,0 7.4763104,46.4148224,0 7.4759309,46.4149148,0 7.4756927,46.4149507,0 7.4753727,46.414925,0 7.4750973,46.4148994,0 7.4746955,46.4147814,0 7.4745728,46.4147323,0 7.4743746,46.4147097,0 7.4742482,46.4146698,0 7.4741233,46.4146451,0 7.4740734,46.4146451,0 7.4740078,46.4146978,0 7.4734741,46.4147753,0 7.4733523,46.4147753,0 7.4732743,46.4146967,0 7.4731838,46.4145558,0 7.4731243,46.4144834,0 7.4730237,46.4143847,0 7.4729444,46.4144309,0 7.472917,46.4143426,0 7.4728865,46.4143973,0 7.4728286,46.4143321,0 7.4727219,46.4144246,0 7.4726975,46.4143973,0 7.4724902,46.4146411,0 7.4723348,46.4147987,0 7.4722464,46.4148638,0 7.4721945,46.4149689,0 7.4720939,46.4149626,0 7.4720817,46.4150193,0 7.4719842,46.4150299,0 7.4719781,46.4148954,0 7.471847,46.4149668,0 7.4718531,46.4147419,0 7.4718196,46.4146453,0 7.4717099,46.4145864,0 7.471594,46.414557,0 7.4714904,46.4145654,0 7.4714416,46.4146516,0 7.4713837,46.4147587,0 7.4713502,46.4148197,0 7.4713288,46.4148869,0 7.4712679,46.4148975,0 7.4712099,46.4148806,0 7.4711398,46.4148722,0 7.4710362,46.4149689,0 7.4708685,46.4151118,0 7.4706734,46.4152274,0 7.4704448,46.415261,0 7.4702497,46.4152904,0 7.4699998,46.4152316,0 7.4697132,46.4150677,0 7.4695029,46.4148911,0 7.4694023,46.4147566,0 7.4693383,46.4145339,0 7.4693261,46.4142943,0 7.4693657,46.4140463,0 7.4693993,46.4138656,0 7.4694511,46.4137122,0 7.469506,46.413565,0 7.4695304,46.4133864,0 7.4694816,46.4133381,0 7.4692621,46.4133171,0 7.4690762,46.4133759,0 7.4688262,46.4133948,0 7.4686799,46.413481,0 7.4685214,46.4135167,0 7.4684299,46.4135251,0 7.4682166,46.4135377,0 7.4680519,46.4135692,0 7.4680093,46.4137185,0 7.4677532,46.4137353,0 7.4673356,46.4138929,0 7.4670216,46.4139391,0 7.466921,46.4139139,0 7.4668022,46.4138298,0 7.466726,46.4136953,0 7.4664973,46.4136176,0 7.4662382,46.4135356,0 7.4658877,46.4132981,0 7.4657048,46.4132519,0 7.4655615,46.4134284,0 7.4651256,46.4138593,0 7.4649732,46.4139538,0 7.4647171,46.4139728,0 7.4641807,46.4139496,0 7.4637996,46.4139791,0 7.4636167,46.4139959,0 7.4632205,46.4139496,0 7.4626199,46.4137857,0 7.4621718,46.4136155,0 7.461928,46.4135692,0 7.4614189,46.4136281,0 7.460791,46.4136743,0 7.4600139,46.4138459,0 7.4597162,46.4138705,0 7.4593709,46.4138254,0 7.4589184,46.4137105,0 7.4587696,46.4136243,0 7.458198,46.4133451,0 7.4579063,46.4129716,0 7.4576741,46.4125242,0 7.4575431,46.4122656,0 7.4573883,46.4119495,0 7.4571919,46.4116991,0 7.4567572,46.4114077,0 7.4563405,46.4111408,0 7.4561083,46.4110013,0 7.4559178,46.4107262,0 7.4557273,46.4104061,0 7.4555129,46.41009,0 7.4553939,46.4099832,0 7.454995,46.4098888,0 7.4548104,46.4099463,0 7.4544056,46.4101064,0 7.4538757,46.4102419,0 7.4537864,46.4104676,0 7.4534232,46.4106154,0 7.453453,46.4107016,0 7.4538459,46.4106893,0 7.4540841,46.410796,0 7.4541615,46.4109808,0 7.4541376,46.4112927,0 7.4541138,46.4114364,0 7.4540305,46.4116704,0 7.4539293,46.4118715,0 7.4539114,46.4120234,0 7.4539531,46.4121589,0 7.4538578,46.4121794,0 7.4536971,46.412048,0 7.4536137,46.4119741,0 7.4534827,46.4120521,0 7.4534292,46.4122409,0 7.4534292,46.4124421,0 7.4534173,46.4126104,0 7.4533458,46.412869,0 7.4532922,46.4130496,0 7.4530243,46.4132877,0 7.452685,46.4135709,0 7.4524944,46.4138131,0 7.4521789,46.4141702,0 7.4520658,46.4142687,0 7.4520003,46.4142564,0 7.451911,46.4141209,0 7.4516431,46.4138705,0 7.451399,46.4136407,0 7.4511608,46.4134683,0 7.4510953,46.4133657,0 7.4510259,46.4133771,0 7.4508918,46.4134506,0 7.4508309,46.4134065,0 7.4506541,46.4131816,0 7.4505413,46.413003,0 7.4503736,46.4128307,0 7.450209,46.412568,0 7.4500566,46.4124334,0 7.4499834,46.4124145,0 7.4499438,46.412444,0 7.4499255,46.4125028,0 7.4499499,46.4127319,0 7.4498981,46.4129168,0 7.4499042,46.4129946,0 7.4498707,46.4130282,0 7.4498188,46.413024,0 7.4497836,46.4129741,0 7.449693,46.4128052,0 7.4496072,46.4126728,0 7.4494308,46.4124942,0 7.4493434,46.4123597,0 7.4492748,46.4122575,0 7.4492217,46.4121994,0 7.4491843,46.412208,0 7.4491655,46.4122855,0 7.4491983,46.412406,0 7.4491796,46.4124802,0 7.4491296,46.4125125,0 7.4490017,46.4124964,0 7.4489189,46.4124383,0 7.4488877,46.4123522,0 7.4488612,46.4121563,0 7.4488393,46.4120229,0 7.4487941,46.4118948,0 7.448688,46.4117485,0 7.4485553,46.4115462,0 7.4484585,46.4113568,0 7.4483992,46.4112363,0 7.4483618,46.4110899,0 7.4482213,46.4108758,0 7.4481183,46.4107015,0 7.4480699,46.4105659,0 7.4480012,46.4103238,0 7.4479279,46.4100666,0 7.4479263,46.4098385,0 7.4479263,46.4096394,0 7.4479294,46.4095479,0 7.4478935,46.4094048,0 7.4478561,46.4093069,0 7.4478514,46.40921,0 7.4478467,46.4091099,0 7.4478249,46.4090271,0 7.447789,46.4089873,0 7.4477437,46.4089862,0 7.4477016,46.4090432,0 7.4476033,46.4092423,0 7.4475049,46.4093617,0 7.4472693,46.4096361,0 7.4471335,46.4098008,0 7.447032,46.4100128,0 7.4469837,46.4102323,0 7.4469212,46.410426,0 7.4468775,46.4104572,0 7.4466871,46.4104637,0 7.4464717,46.4104734,0 7.4463079,46.4105099,0 7.4461674,46.4105078,0 7.4458443,46.4104873,0 7.4456352,46.410497,0 7.445373,46.4105239,0 7.4452466,46.4105293,0 7.445128,46.4104798,0 7.4450858,46.4104034,0 7.4450484,46.410355,0 7.4449266,46.4103119,0 7.4449051,46.4103026,0 7.4448583,46.4102856,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4884845,46.4446966,0 7.4884442,46.4451792,0 7.4886803,46.4457411,0 7.4893562,46.4462955,0 7.4899463,46.4468869,0 7.4900643,46.4470791,0 7.490311,46.4472344,0 7.4906651,46.4473083,0 7.4910513,46.4473083,0 7.4916307,46.4472935,0 7.49221,46.4474118,0 7.4926499,46.4474414,0 7.4929074,46.447397,0 7.4932186,46.4472639,0 7.4937872,46.4471457,0 7.4945382,46.4471678,0 7.4951283,46.4473083,0 7.4956969,46.4477223,0 7.495933,46.4479588,0 7.4961904,46.4480771,0 7.4965552,46.4481732,0 7.4967698,46.4482249,0 7.496802,46.4483654,0 7.4966089,46.4487424,0 7.4964158,46.4490603,0 7.4963621,46.4495186,0 7.4962334,46.449829,0 7.496051,46.4501469,0 7.4960295,46.4504278,0 7.496169,46.4506052,0 7.4961046,46.4507752,0 7.4959759,46.4513,0 7.4959222,46.4515883,0 7.4959222,46.4517583,0 7.4960295,46.4518544,0 7.4962977,46.4520023,0 7.496523,46.4521723,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4909655,46.4491638,0 7.4912123,46.4492377,0 7.4914912,46.4491933,0 7.491738,46.4490677,0 7.4919204,46.4490233,0 7.4921779,46.4489716,0 7.4924568,46.448905,0 7.4929933,46.4487868,0 7.4932293,46.4487424,0 7.493358,46.4486759,0 7.4935404,46.4486241,0 7.4937014,46.4485946,0 7.4938623,46.4485206,0 7.4939374,46.4484245,0 7.4940661,46.4483358,0 7.4941949,46.4482915,0 7.4943236,46.4482915,0 7.4944309,46.448321,0 7.4944846,46.4483802,0 7.4945918,46.4484393,0 7.4947099,46.4484541,0 7.4946562,46.4486611,0 7.4946133,46.4488089,0 7.4946884,46.4489568,0 7.4948279,46.4491194,0 7.4950961,46.4493855,0 7.4951605,46.4495851,0 7.4952249,46.4497256,0 7.4952249,46.4500212,0 7.4952892,46.4502578,0 7.4952356,46.4504426,0 7.4950961,46.4506422,0 7.4950639,46.4507235,0 7.4951176,46.4508935,0 7.495257,46.4510635,0 7.495418,46.4512705,0 7.495654,46.4515957,0 7.4959222,46.4517583,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4988512,46.4461551,0 7.4989692,46.4461403,0 7.4991301,46.4460516,0 7.4992696,46.4460959,0 7.4993233,46.4462142,0 7.499452,46.4463399,0 7.4995915,46.4464064,0 7.4997524,46.4464803,0 7.4999563,46.4465395,0 7.500085,46.4465469,0 7.5000314,46.4463842,0 7.499967,46.4462955,0 7.499967,46.4462068,0 7.5000314,46.4461551,0 7.5001708,46.4462142,0 7.5002674,46.446266,0 7.500321,46.4462364,0 7.5002245,46.4461255,0 7.5002352,46.446022,0 7.5002459,46.4459481,0 7.500203,46.4458668,0 7.5001601,46.4457928,0 7.5002889,46.4457707,0 7.5003961,46.4457337,0 7.5004713,46.4456967,0 7.5005571,46.4457411,0 7.5006536,46.4458076,0 7.5008146,46.4458815,0 7.5009111,46.4459481,0 7.500997,46.4460146,0 7.5010828,46.4461403,0 7.5011472,46.446192,0 7.5012437,46.4462512,0 7.5013403,46.4462881,0 7.501469,46.4463251,0 7.5015656,46.4462807,0 7.5016729,46.4461699,0 7.5017909,46.4461551,0 7.501866,46.4462068,0 7.501984,46.4461994,0 7.5020377,46.4461699,0 7.5022201,46.4461255,0 7.5023917,46.4461625,0 7.5028852,46.446266,0 7.5030784,46.4462216,0 7.5031856,46.4462216,0 7.5030891,46.4462955,0 7.5031427,46.4463842,0 7.5032286,46.446399,0 7.5033573,46.4464582,0 7.5034968,46.4465247,0 7.503647,46.4465469,0 7.5037757,46.4465543,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5010721,46.4422369,0 7.5011686,46.4424217,0 7.5013188,46.4426139,0 7.5015549,46.4427322,0 7.5017694,46.4428135,0 7.5019733,46.4428875,0 7.5021771,46.4429466,0 7.502381,46.4430797,0 7.5026063,46.4431536,0 7.5027887,46.4432275,0 7.5030033,46.4433015,0 7.5031749,46.4433976,0 7.503368,46.4434641,0 7.5036577,46.4434789,0 7.5040654,46.4434789,0 7.5044624,46.4433828,0 7.5046555,46.4433384,0 7.505031,46.4432497,0 7.5052563,46.443161,0 7.5054494,46.4430131,0 7.5057177,46.4429244,0 7.505943,46.4428209,0 7.5061683,46.4427248,0 7.5062863,46.4426361,0 7.5066511,46.442577,0 7.5066511,46.4424882,0 7.5067476,46.4423847,0 7.5069086,46.4422664,0 7.5070051,46.4421925,0 7.507166,46.4421038,0 7.5074665,46.4420668,0 7.5078098,46.4420594,0 7.5079493,46.4420373,0 7.5082497,46.4421777,0 7.5085501,46.4422221,0 7.5092367,46.442296,0 7.5094298,46.4423626,0 7.5095157,46.4423626,0 7.5097946,46.4422073,0 7.5100736,46.4420964,0 7.5102345,46.4420373,0 7.5105885,46.4419485,0 7.5107387,46.4418894,0 7.5111464,46.4418155,0 7.5112752,46.4418007,0 7.5115863,46.4418229,0 7.5119296,46.4418229,0 7.5121335,46.4418376,0 7.5122558,46.4418969,0 7.5123846,46.441956,0 7.5126314,46.441956,0 7.5127708,46.4419191,0 7.5127065,46.441823,0 7.5126206,46.441749,0 7.5125992,46.4415494,0 7.5125777,46.4413794,0 7.5125563,46.4412389,0 7.512685,46.4412241,0 7.5129318,46.4412019,0 7.5130712,46.4411576,0 7.5131356,46.4410615,0 7.5131142,46.4408618,0 7.5131249,46.4407509,0 7.5132965,46.4407509,0 7.5134467,46.4407953,0 7.5136399,46.4408766,0 7.5139725,46.4409062,0 7.5141227,46.4408914,0 7.5142514,46.4410171,0 7.5144445,46.4410171,0 7.5145304,46.4409284,0 7.5143909,46.4408397,0 7.5142836,46.4407953,0 7.5143158,46.4407362,0 7.5144231,46.4407214,0 7.5145196,46.44064,0 7.5144982,46.4405587,0 7.5145733,46.4404626,0 7.5146591,46.4404035,0 7.5147878,46.4403739,0 7.5150453,46.4404404,0 7.5154423,46.4404774,0 7.5164401,46.4404996,0 7.5171911,46.44064,0 7.5178778,46.4407953,0 7.5183606,46.4408101,0 7.5187575,46.4408692,0 7.5189292,46.4410615,0 7.5189936,46.4412389,0 7.5191545,46.4414015,0 7.5193369,46.4414607,0 7.5194871,46.4415051,0 7.5194978,46.4416603,0 7.5195836,46.4425105,0 7.5197017,46.4426732,0 7.5197553,46.4427915,0 7.5197124,46.4428876,0 7.5196587,46.4429911,0 7.5196802,46.4430798,0 7.519766,46.4431611,0 7.5198626,46.4432129,0 7.520045,46.4432202,0 7.5200772,46.4431685,0 7.5200772,46.443065,0 7.5201308,46.4429837,0 7.5202059,46.4429615,0 7.520281,46.443028,0 7.5203454,46.4431389,0 7.5204419,46.4432055,0 7.5206673,46.4432572,0 7.5207531,46.4432868,0 7.5210106,46.4436712,0 7.5212895,46.4438265,0 7.5215899,46.4439817,0 7.522062,46.4441665,0 7.5224375,46.4443735,0 7.5228774,46.4447875,0 7.5237679,46.4458003,0 7.52424,46.4464509,0 7.5244653,46.4468353,0 7.5245833,46.447094,0 7.5246775,46.4471938,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6100216,46.4187252,0 7.6103389,46.4186035,0 7.6105213,46.4185296,0 7.6110684,46.4183669,0 7.6114761,46.4183669,0 7.6117336,46.4184704,0 7.6120769,46.4184926,0 7.6127421,46.4184482,0 7.6133,46.4182855,0 7.6139974,46.4180266,0 7.6144587,46.4178121,0 7.6147591,46.4174201,0 7.6151239,46.4171465,0 7.6154672,46.4168728,0 7.6156711,46.4165769,0 7.6159179,46.4162663,0 7.6159822,46.4164512,0 7.61595,46.4166213,0 7.6161937,46.4166891,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5100736,46.4420964,0 7.5100993,46.4420041,0 7.5101369,46.4419339,0 7.5102764,46.4418525,0 7.5104158,46.4417195,0 7.5105124,46.4415457,0 7.510609,46.4413054,0 7.5107484,46.4410836,0 7.5108396,46.4409321,0 7.5108504,46.4408027,0 7.5108396,46.4406437,0 7.5109362,46.4405624,0 7.5110381,46.4404293,0 7.511081,46.4403406,0 7.511081,46.4402223,0 7.5110435,46.4400375,0 7.5111132,46.4398157,0 7.5112098,46.4396456,0 7.5112849,46.439483,0 7.5112795,46.4392907,0 7.5113332,46.4391281,0 7.5113654,46.4389802,0 7.5114136,46.4388952,0 7.5115102,46.4387695,0 7.5116175,46.4386438,0 7.5116765,46.4385477,0 7.5116938,46.4384565,0 7.5116952,46.4384008,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4169002,46.3606281,0 7.4166642,46.3605984,0 7.4164925,46.360554,0 7.4164604,46.3606577,0 7.4166857,46.3606503,0 7.4167822,46.3607836,0 7.4165784,46.3607539,0 7.4163316,46.3607317,0 7.4161063,46.3607391,0 7.4159132,46.3608206,0 7.4157093,46.3608798,0 7.4156879,46.3609687,0 7.4153875,46.3611167,0 7.4151622,46.361213,0 7.4150012,46.361213,0 7.4147867,46.36125,0 7.4149047,46.3613537,0 7.4150763,46.3613907,0 7.4152587,46.3614499,0 7.4150978,46.3614869,0 7.4149369,46.361524,0 7.4147974,46.3614795,0 7.414733,46.3615314,0 7.4148403,46.3615906,0 7.4149691,46.3616794,0 7.4150871,46.3616868,0 7.4153446,46.3615462,0 7.4155377,46.3614573,0 7.4157093,46.3613759,0 7.4159239,46.3613315,0 7.4161385,46.3613018,0 7.4161707,46.3613463,0 7.4160527,46.3614055,0 7.4161278,46.3614425,0 7.4163209,46.3614351,0 7.4164818,46.3613685,0 7.4166213,46.3613463,0 7.4165998,46.3614351,0 7.4164818,46.3615536,0 7.4163423,46.361672,0 7.4162458,46.3617535,0 7.4164282,46.3618942,0 7.416632,46.3621459,0 7.4167393,46.3623014,0 7.417029,46.3625901,0 7.4171255,46.3627012,0 7.4172221,46.3628197,0 7.4173401,46.3628863,0 7.4172865,46.3629825,0 7.4172221,46.3629603,0 7.4171363,46.3628863,0 7.4170183,46.3627974,0 7.416911,46.3627752,0 7.4168573,46.3628271,0 7.4169324,46.3629011,0 7.4170183,46.3629825,0 7.4171363,46.3631232,0 7.4172972,46.3632417,0 7.4173616,46.3634638,0 7.4175762,46.3635674,0 7.4176298,46.3636563,0 7.4178444,46.3639598,0 7.4180268,46.3641449,0 7.4182306,46.3643522,0 7.4183164,46.3644707,0 7.4183272,46.3645447,0 7.4182306,46.3645669,0 7.4181126,46.3645077,0 7.4181448,46.3645595,0 7.4181448,46.3646188,0 7.4181233,46.3646928,0 7.4182199,46.3647964,0 7.4183594,46.3649223,0 7.418531,46.3650186,0 7.418531,46.3651148,0 7.4184559,46.3652629,0 7.418413,46.3653295,0 7.4184237,46.3653739,0 7.4185096,46.3653369,0 7.418531,46.3652777,0 7.418649,46.3652184,0 7.4187885,46.3652333,0 7.4189709,46.3651962,0 7.4191426,46.3650926,0 7.4192284,46.3649815,0 7.4193142,46.3648705,0 7.4194752,46.3648853,0 7.4196468,46.3649741,0 7.4197327,46.3650778,0 7.4198829,46.365063,0 7.4199043,46.3650111,0 7.4201618,46.3650334,0 7.4202906,46.3651296,0 7.4204193,46.3652407,0 7.4204729,46.3653739,0 7.42043,46.3654776,0 7.4204837,46.3655294,0 7.4204944,46.3657145,0 7.4204837,46.3659366,0 7.4203657,46.3660772,0 7.4202369,46.3662179,0 7.4202047,46.3664326,0 7.4202798,46.3665585,0 7.4203657,46.3667436,0 7.420548,46.3668916,0 7.4206231,46.3670619,0 7.4206768,46.367284,0 7.4207304,46.3673802,0 7.4210845,46.3674617,0 7.4212883,46.3675801,0 7.4213313,46.3676542,0 7.4215244,46.3676393,0 7.4217711,46.3676023,0 7.4220715,46.3675431,0 7.4225222,46.3676023,0 7.4228977,46.3677652,0 7.4231552,46.3678837,0 7.4233391,46.3679547,0 7.4234234,46.3679873,0 7.4236701,46.3680095,0 7.4238203,46.3680317,0 7.4239276,46.3681206,0 7.4240564,46.3683204,0 7.4241744,46.3684759,0 7.4241637,46.3685721,0 7.4240778,46.3686832,0 7.4240993,46.368809,0 7.4239598,46.3689275,0 7.4237882,46.3690681,0 7.4236701,46.3692014,0 7.4236701,46.3693347,0 7.4238203,46.3695271,0 7.4239169,46.3695567,0 7.4241851,46.3695864,0 7.4244212,46.3695715,0 7.4245499,46.3696308,0 7.4245714,46.3697566,0 7.4245606,46.3698381,0 7.4246357,46.3699639,0 7.4247645,46.3700379,0 7.4248289,46.3700749,0 7.4249342,46.3700574,0 7.4250399,46.37001,0 7.4251498,46.3700325,0 7.4253692,46.3700204,0 7.4254505,46.3701257,0 7.4255205,46.3701847,0 7.4254798,46.3702635,0 7.4255506,46.3704363,0 7.4256657,46.3705709,0 7.4258266,46.3705561,0 7.4259017,46.3705783,0 7.4259125,46.370682,0 7.4259339,46.3707634,0 7.4260734,46.3707856,0 7.4262451,46.370793,0 7.4263845,46.3708448,0 7.426376,46.3709474,0 + + + + Lämmernweg süd + Lämmernweg süd, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.611382,46.3964875,0 7.6114292,46.3962389,0 7.6108557,46.3963143,0 7.6102376,46.3963577,0 7.6097209,46.3964049,0 7.6097625,46.3965224,0 7.6089079,46.3964609,0 7.607996,46.3964387,0 7.6073737,46.3964387,0 7.6069124,46.3964239,0 7.6068694,46.3963499,0 7.6065261,46.3963277,0 7.6062794,46.3964387,0 7.606054,46.3964387,0 7.6053889,46.3962907,0 7.6048417,46.3963721,0 7.6044233,46.3964979,0 7.6042623,46.3965866,0 7.603919,46.3966754,0 7.6035435,46.3966236,0 7.6030929,46.3966902,0 7.6027496,46.3967938,0 7.602299,46.396927,0 7.6021058,46.396964,0 7.6015479,46.3968752,0 7.6010115,46.3967198,0 7.6008398,46.3966162,0 7.6006789,46.396631,0 7.6003678,46.3965053,0 7.6000566,46.3964017,0 7.5991554,46.3964313,0 7.5987155,46.3963499,0 7.5981791,46.3964017,0 7.5978327,46.3964729,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5890918,46.3955507,0 7.5891478,46.3953803,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5890918,46.3955507,0 7.5889469,46.3955137,0 7.5887431,46.3955433,0 7.5885929,46.3955359,0 7.5882281,46.3956617,0 7.5881798,46.3956099,0 7.5879277,46.3957505,0 7.5879009,46.3958134,0 7.5877989,46.3958171,0 7.5878043,46.3958615,0 7.5876916,46.3958282,0 7.5877077,46.3959318,0 7.587925,46.3962126,0 + + + + Bunkertunnel + Bunkertunnel, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6097625,46.3965224,0 7.6108557,46.3963143,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.618857,46.3719589,0 7.6188592,46.3720632,0 7.6189053,46.3722772,0 7.6187819,46.3724918,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4673625,46.4564555,0 7.467345,46.456468,0 7.467191,46.456466,0 7.467011,46.456589,0 7.4668276,46.4566405,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6086644,46.4388706,0 7.6059896,46.4390346,0 7.6040186,46.4382136,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6188287,46.4183578,0 7.619399,46.41861,0 7.6196936,46.4187362,0 7.6200723,46.418852,0 7.6203984,46.4190413,0 7.6208718,46.4191045,0 7.6213242,46.4191045,0 7.6217029,46.4191045,0 7.6223026,46.4190203,0 7.6225795,46.4190323,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.545644,46.4989186,0 7.5453618,46.4983976,0 7.5448129,46.497796,0 7.5442378,46.4967916,0 7.5442063,46.4956444,0 + + + + Gemmiweg + Gemmiweg, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6165875,46.3938373,0 7.6168364,46.3943921,0 7.6173565,46.3951755,0 7.6172441,46.395445,0 7.6169051,46.3958102,0 7.616989,46.3961054,0 7.6171827,46.3958529,0 7.6174721,46.3954421,0 7.617529,46.3951648,0 7.6173761,46.3949876,0 7.6176494,46.3952003,0 7.6175373,46.3949445,0 7.6173232,46.3945064,0 7.6170816,46.3940832,0 7.6167553,46.3939985,0 7.6167307,46.3937498,0 + + + + Gemmiweg + Gemmiweg, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6167307,46.3937498,0 7.6172078,46.3936647,0 7.6176542,46.3933273,0 7.6179288,46.3933273,0 7.6176112,46.3937595,0 7.6179288,46.3941146,0 7.6181262,46.3942746,0 7.6181691,46.3937713,0 7.6181863,46.3935464,0 7.6189588,46.3927649,0 7.6184722,46.3925455,0 7.6182284,46.3927317,0 7.6178116,46.3929224,0 7.6166641,46.3926529,0 7.6163907,46.3927661,0 7.6159441,46.3927095,0 7.6158621,46.3925335,0 7.6153802,46.3923545,0 7.6151785,46.3920809,0 7.6151421,46.3918357,0 7.6153882,46.3920432,0 7.615616,46.3920683,0 7.6157618,46.3915529,0 7.6158803,46.3917729,0 7.6161628,46.3920935,0 7.6172656,46.3919866,0 7.6174935,46.3918483,0 7.6174265,46.391526,0 7.6177881,46.3912895,0 7.617637,46.3909179,0 7.6176299,46.3902353,0 7.6181192,46.3896255,0 7.6185741,46.3889151,0 7.618617,46.3885954,0 7.6186038,46.3882094,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4785053,46.4263539,0 7.4783109,46.4266478,0 + + + + Bonderlenbach Walking Path + Bonderlenbach Walking Path, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5792169,46.4925621,0 7.5791509,46.4925641,0 + + + + Bonderlenbach Walking Path + Bonderlenbach Walking Path, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5792169,46.4925621,0 7.5793125,46.4925286,0 7.5793674,46.4922433,0 7.579896,46.491972,0 7.580289,46.491577,0 7.580358,46.4913398,0 7.580717,46.4910715,0 7.5810337,46.4907202,0 7.5813065,46.4905421,0 7.5813831,46.4904028,0 7.5817008,46.4902111,0 7.582209,46.489783,0 7.582811,46.489678,0 7.583084,46.489476,0 7.583642,46.489351,0 7.584382,46.488724,0 7.584451,46.488496,0 7.584687,46.488298,0 7.584991,46.4884,0 7.585394,46.488367,0 7.586046,46.488033,0 7.586489,46.487635,0 7.586402,46.486841,0 7.586652,46.486558,0 7.587146,46.486256,0 7.5871827,46.4860238,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5835968,46.5163224,0 7.5835278,46.516243,0 7.5831875,46.5160665,0 7.582901,46.515494,0 7.5829329,46.5151783,0 7.583018,46.515011,0 7.582857,46.515017,0 7.582842,46.514962,0 7.582983,46.514806,0 7.583006,46.514618,0 7.5826838,46.5145655,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.583998,46.516732,0 7.5836354,46.5165224,0 7.583146,46.51642,0 7.583074,46.516172,0 7.582901,46.516045,0 7.5828838,46.5161271,0 7.582968,46.516266,0 7.58253,46.516101,0 7.582413,46.516123,0 7.582236,46.516301,0 7.581972,46.516325,0 7.5813369,46.5161948,0 7.5811935,46.5160699,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5758881,46.4885517,0 7.57579,46.488698,0 7.575762,46.488936,0 7.575673,46.48907,0 7.5754732,46.4891609,0 7.5754081,46.4892532,0 7.5751268,46.4894422,0 7.574963,46.489548,0 7.574921,46.489618,0 7.574974,46.489689,0 7.575061,46.489711,0 7.575154,46.489709,0 7.575232,46.489819,0 7.57509,46.489989,0 7.575101,46.490052,0 7.5751655,46.4901109,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.583616,46.5164476,0 7.5835968,46.5163224,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5836354,46.5165224,0 7.583616,46.5164476,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.577443,46.4885782,0 7.577979,46.488368,0 7.578077,46.488296,0 7.578219,46.488228,0 7.578307,46.48821,0 7.578387,46.488215,0 7.578434,46.488189,0 7.578734,46.488188,0 7.578873,46.488171,0 7.578928,46.488196,0 7.579113,46.488162,0 7.579226,46.488174,0 7.579338,46.488153,0 7.579673,46.488129,0 7.579867,46.488075,0 7.580044,46.488002,0 7.580178,46.487914,0 7.580318,46.487883,0 7.580371,46.487925,0 7.5806,46.488021,0 7.5807961,46.4880853,0 7.5815952,46.4884243,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5900055,46.5210825,0 7.590046,46.521112,0 7.590122,46.521211,0 7.590218,46.521275,0 7.590325,46.521253,0 7.590386,46.521219,0 7.590563,46.521275,0 7.590713,46.521298,0 7.590841,46.521428,0 7.590872,46.521404,0 7.590961,46.521528,0 7.590941,46.521642,0 7.590964,46.521732,0 7.591091,46.521789,0 7.591134,46.521776,0 7.5912266,46.5218003,0 7.591198,46.521758,0 7.591338,46.521783,0 7.591454,46.521725,0 7.591541,46.5217,0 7.591606,46.521663,0 7.5914358,46.5216049,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5788446,46.5204993,0 7.5787501,46.5204233,0 7.5786342,46.5202629,0 7.5782994,46.5200566,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5797057,46.509266,0 7.579856,46.508887,0 7.579984,46.509007,0 7.580344,46.509065,0 7.580417,46.509061,0 7.5806678,46.5089152,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5751655,46.4901109,0 7.575234,46.490227,0 7.575412,46.490443,0 7.575564,46.490731,0 7.575587,46.491121,0 7.575613,46.491252,0 7.5756106,46.4917412,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5718566,46.492604,0 7.5719484,46.4925554,0 7.5720948,46.4923908,0 7.5721505,46.4922987,0 7.5722725,46.4920071,0 7.5723428,46.4917874,0 7.5724562,46.4915977,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5299338,46.4850755,0 7.5298545,46.4853025,0 7.5296791,46.4856935,0 7.5292968,46.4861218,0 7.528969,46.4863518,0 7.5287592,46.4867026,0 7.5286528,46.4871826,0 7.5284947,46.4876225,0 7.5283193,46.4879071,0 7.5284171,46.4881687,0 7.5285206,46.4886632,0 7.5285629,46.4889495,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5611621,46.4717378,0 7.5611814,46.4715986,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5611814,46.4715986,0 7.5612549,46.47139,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5886158,46.521106,0 7.5882453,46.5211526,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5284782,46.4890732,0 7.5280137,46.4891138,0 7.527826,46.4891156,0 7.5277837,46.4891524,0 7.5275537,46.4892205,0 7.5273587,46.4891892,0 7.5272741,46.4893364,0 7.5271434,46.4897762,0 7.5270835,46.4902156,0 7.5269728,46.4906006,0 7.5266136,46.4908715,0 7.5262039,46.4908149,0 7.5263157,46.4908679,0 7.5264182,46.4909433,0 7.5267561,46.4910387,0 7.5270399,46.4912235,0 7.5267326,46.4911435,0 7.5260461,46.4911093,0 7.5256069,46.4911246,0 7.5252571,46.491094,0 7.5251971,46.4911317,0 7.525568,46.4912801,0 7.5258895,46.4914583,0 7.5259861,46.4915802,0 7.5258021,46.4915365,0 7.5253812,46.4915848,0 7.52505,46.4916009,0 7.5247787,46.4916952,0 7.5245414,46.4917116,0 7.524222,46.4917881,0 7.5237731,46.4918337,0 7.5236274,46.491791,0 7.5233992,46.491741,0 7.5236818,46.4918764,0 7.5238452,46.4919647,0 7.5240836,46.4920324,0 7.524353,46.4921531,0 7.5246857,46.4922017,0 7.5248211,46.4922959,0 7.5250536,46.4923989,0 7.5248755,46.4924784,0 7.5244443,46.4924814,0 7.524403,46.4925123,0 7.5242691,46.492577,0 7.5237893,46.4925329,0 7.5235891,46.4925049,0 7.5238614,46.4927345,0 7.5240395,46.4927875,0 7.5243118,46.4928302,0 7.5246018,46.4928626,0 7.5247121,46.492945,0 7.5246121,46.4931776,0 7.5243265,46.4931246,0 7.5238172,46.4931422,0 7.5234772,46.4932129,0 7.5231328,46.4933763,0 7.5232402,46.4933851,0 7.5236221,46.4934281,0 7.5239302,46.4936089,0 7.5240479,46.4936231,0 7.5240696,46.4936758,0 7.5238868,46.4936918,0 7.5236372,46.4936994,0 7.5236023,46.493836,0 7.5236598,46.4939707,0 7.5235581,46.4940658,0 7.523445,46.4942024,0 7.5233395,46.4941902,0 7.5232161,46.4941911,0 7.5231822,46.4942589,0 7.5232651,46.4943202,0 7.5232142,46.4943842,0 7.5230324,46.4944304,0 7.5229234,46.4944286,0 7.5227633,46.4945022,0 7.5226253,46.4946585,0 7.5224616,46.4946052,0 7.5223549,46.49455,0 7.5219556,46.4946733,0 7.5218802,46.4946641,0 7.5215729,46.4948205,0 7.5213668,46.4948996,0 7.5210725,46.4949952,0 7.5210246,46.4950946,0 7.5208793,46.4951572,0 7.5207707,46.495297,0 7.5205665,46.4954147,0 7.5203144,46.4955049,0 7.5201084,46.4955674,0 7.5197592,46.4957073,0 7.5195457,46.4957735,0 7.5193485,46.495959,0 7.5191233,46.4960591,0 7.5189143,46.4961753,0 7.5186096,46.4961488,0 7.5183255,46.4961327,0 7.5182475,46.4963063,0 7.5181504,46.4963063,0 7.5177485,46.4962975,0 7.517647,46.496402,0 7.5174233,46.4964462,0 7.5172996,46.4963299,0 7.517151,46.4963947,0 7.5170465,46.4963431,0 7.5167477,46.4963564,0 7.516443,46.496405,0 7.5161869,46.4963446,0 7.5158395,46.4965286,0 7.5156643,46.4966449,0 7.5156084,46.4966199,0 7.5156791,46.4965227,0 7.5154671,46.4964005,0 7.5152232,46.4962689,0 7.5150141,46.4961521,0 7.5148907,46.4961351,0 7.5147042,46.4961643,0 7.5146712,46.4961898,0 7.5145073,46.4963085,0 7.5143764,46.4964545,0 7.5141371,46.4964385,0 7.5139025,46.4963649,0 7.5138335,46.496289,0 7.5136509,46.4960829,0 7.5135387,46.4958989,0 7.5132461,46.4956174,0 7.5126905,46.4953966,0 7.5124256,46.495507,0 7.5121735,46.4952881,0 7.5119969,46.4951593,0 7.5116933,46.4950654,0 7.5115645,46.4947784,0 7.5112363,46.4945931,0 7.5108051,46.4944099,0 7.5108554,46.4945788,0 7.510841,46.4947764,0 7.510956,46.4949956,0 7.5109704,46.4950711,0 7.5110997,46.4952723,0 7.5109883,46.4954376,0 7.511053,46.4958078,0 7.5109272,46.4961563,0 7.5107547,46.4965696,0 7.5107691,46.4969756,0 7.5109488,46.4972955,0 7.5109074,46.4975939,0 7.5110763,46.4978024,0 7.511335,46.4978778,0 7.5117806,46.4980863,0 7.5121004,46.4982048,0 7.5128551,46.4984564,0 7.5132216,46.4986756,0 7.5136348,46.4988301,0 7.5138576,46.4990457,0 7.5140409,46.4990134,0 7.51435,46.4988589,0 7.5148602,46.498805,0 7.5153813,46.4989631,0 7.5159167,46.4989128,0 7.5160101,46.4990709,0 7.5162761,46.4990924,0 7.5165851,46.4990206,0 7.5168331,46.4990996,0 7.5168834,46.4992721,0 7.5167971,46.4995776,0 7.5168546,46.4998758,0 7.5168906,46.5000052,0 7.5167828,46.5001849,0 7.5167756,46.5003574,0 7.5168474,46.5005442,0 7.5171313,46.500882,0 7.5173218,46.5013815,0 7.5174044,46.5013959,0 7.5175446,46.5015612,0 7.5174763,46.501863,0 7.5175554,46.5020643,0 7.5176703,46.5023625,0 7.5179291,46.5025638,0 7.518177,46.5025242,0 7.5182489,46.5026213,0 7.5183819,46.5027219,0 7.5187161,46.5030812,0 7.5189101,46.5031818,0 7.5191617,46.5032896,0 7.5191329,46.5035232,0 7.5191509,46.5037173,0 7.5192156,46.5039437,0 7.5195857,46.5041341,0 7.5199414,46.5042383,0 7.520272,46.5041521,0 7.5204841,46.504224,0 7.5205775,46.504551,0 7.521095,46.5044432,0 7.521731,46.5046731,0 7.5218819,46.5047342,0 7.5222377,46.5048349,0 7.5229205,46.5051367,0 7.5223563,46.5051475,0 7.5217454,46.5051259,0 7.5216268,46.5053739,0 7.5219969,46.5054673,0 7.5225683,46.5055859,0 7.5230606,46.5055787,0 7.5233716,46.5055941,0 7.5236641,46.5057762,0 7.5238187,46.5057486,0 7.5240744,46.505561,0 7.5243154,46.5055941,0 7.5244645,46.505561,0 7.524794,46.505601,0 7.5248928,46.5054393,0 7.5251264,46.5055381,0 7.5252477,46.5053495,0 7.5253644,46.505345,0 7.5256025,46.5051384,0 7.5257732,46.505062,0 7.5259619,46.5051923,0 7.5262943,46.5051923,0 7.5263976,46.505071,0 7.5265009,46.5048464,0 7.526739,46.5049272,0 7.5269905,46.5048913,0 7.526986,46.5047745,0 7.5270219,46.5046577,0 7.5272555,46.5044601,0 7.5275116,46.5043253,0 7.5277047,46.5041142,0 7.5281359,46.5039884,0 7.5287378,46.5040693,0 7.5289535,46.5041412,0 7.5295239,46.5039345,0 7.5299327,46.5037818,0 7.5304987,46.5034225,0 7.5309434,46.5031035,0 7.5316388,46.5026561,0 7.5320087,46.5024271,0 7.532634,46.502154,0 7.5331537,46.501837,0 7.5337702,46.5015199,0 7.5343955,46.5011059,0 7.5349328,46.5007713,0 7.5353291,46.500463,0 7.535699,46.4998289,0 7.5358135,46.4996263,0 7.5366414,46.4992212,0 7.5413582,46.4976497,0 7.542458,46.4973265,0 7.5428044,46.497004,0 7.5429425,46.4974133,0 7.5430314,46.4972745,0 7.5432425,46.4975431,0 7.5432637,46.4974015,0 7.543431,46.4975358,0 7.5435531,46.4973951,0 7.5442586,46.4980313,0 7.5453618,46.4983976,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5284723,46.4889619,0 7.5284782,46.4890732,0 7.5284879,46.4891875,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.589224,46.5211243,0 7.5887088,46.5208145,0 7.5886158,46.521106,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5882453,46.5211526,0 7.587849,46.5206548,0 7.5876898,46.5205699,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5811876,46.5165553,0 7.581105,46.516431,0 7.581328,46.516318,0 7.5813369,46.5161948,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5572902,46.4904128,0 7.5569738,46.4903625,0 7.5567747,46.4902998,0 7.5565619,46.4901569,0 7.5564031,46.4900393,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5442063,46.4956444,0 7.5441027,46.4955627,0 7.543313,46.4953914,0 7.5417852,46.4952141,0 7.5384722,46.4958877,0 7.5378027,46.4959527,0 7.5386696,46.4954209,0 7.5404806,46.493666,0 7.5404463,46.4936187,0 7.5395536,46.4938492,0 7.539073,46.4940796,0 7.5377598,46.4944932,0 7.5374851,46.4946528,0 7.5371332,46.4947178,0 7.5368843,46.4946941,0 7.5364552,46.4944578,0 7.5350304,46.4942333,0 7.5356312,46.4942155,0 7.5346699,46.4938078,0 7.5345669,46.4938137,0 7.5337944,46.4945405,0 7.5335026,46.4946173,0 7.5330992,46.494895,0 7.5331593,46.4944755,0 7.5328331,46.4943219,0 7.5328674,46.4940678,0 7.532258,46.4942569,0 7.5322065,46.4943692,0 7.5320606,46.4942096,0 7.5315456,46.4943987,0 7.5310993,46.4946941,0 7.5309277,46.4945701,0 7.5308332,46.4942392,0 7.5310907,46.4939733,0 7.5310049,46.4938196,0 7.531065,46.4936187,0 7.5308332,46.4932701,0 7.5307217,46.4932228,0 7.53055,46.4932642,0 7.5301724,46.4934533,0 7.5301552,46.4931578,0 7.5298548,46.4931697,0 7.5296059,46.4933469,0 7.52952,46.4935656,0 7.5293484,46.4932997,0 7.5293655,46.4931342,0 7.5288248,46.4932347,0 7.528739,46.4930987,0 7.528945,46.492951,0 7.5286531,46.4929747,0 7.5289192,46.4927147,0 7.528945,46.4924074,0 7.5291853,46.4921119,0 7.5283613,46.4921651,0 7.528327,46.4920529,0 7.528945,46.4914915,0 7.5293655,46.4912729,0 7.5293055,46.4911842,0 7.5288506,46.491261,0 7.5283957,46.4911842,0 7.5286875,46.4910306,0 7.5289364,46.4906938,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5797311,46.5157548,0 7.5795577,46.5157983,0 7.5794887,46.5156381,0 7.5798922,46.5156733,0 7.5802352,46.5155193,0 7.5807117,46.5159997,0 7.5811935,46.5160699,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6240644,46.4319535,0 7.6229314,46.4322197,0 7.6225538,46.4321901,0 7.6223005,46.4319807,0 7.6220817,46.4317997,0 7.6217384,46.4311371,0 7.6211719,46.4303385,0 7.6206312,46.429321,0 7.6206397,46.428824,0 7.6206655,46.4282561,0 7.6202878,46.4277355,0 7.6201591,46.427138,0 7.6203136,46.4265109,0 7.6203994,46.4260021,0 7.6208887,46.4251619,0 7.621129,46.4249194,0 7.6213779,46.4249312,0 7.6214637,46.4246768,0 7.6217555,46.4245171,0 7.622056,46.424523,0 7.6221847,46.4243218,0 7.6222705,46.4235054,0 7.6223564,46.4232628,0 7.6228848,46.4228375,0 7.623146,46.4219611,0 7.6233162,46.4217127,0 7.6231975,46.4203281,0 7.6232747,46.4200559,0 7.6235705,46.4197968,0 7.6237812,46.4196122,0 7.6234722,46.4190027,0 7.6241075,46.4180133,0 7.6237558,46.4135276,0 7.622349,46.411426,0 7.622269,46.4103269,0 7.6222984,46.4100075,0 7.6223212,46.4098275,0 7.6221581,46.4095408,0 7.6220343,46.4092423,0 7.6220442,46.4087396,0 7.6219789,46.408495,0 7.622036,46.408225,0 7.6220138,46.4081401,0 7.6220272,46.4080307,0 7.6219912,46.4078595,0 7.6218334,46.4076621,0 7.621853,46.4075699,0 7.6218432,46.4075069,0 7.6218171,46.4073382,0 7.6216637,46.407201,0 7.6216116,46.4067555,0 7.6214745,46.4064181,0 7.6213817,46.4061354,0 7.6211026,46.4059412,0 7.6208351,46.4056105,0 7.6204991,46.4050999,0 7.6203001,46.4049064,0 7.6200956,46.4045367,0 7.6191214,46.4039463,0 7.6187152,46.4035454,0 7.6185974,46.4029784,0 7.6183611,46.4027152,0 7.618025,46.4024362,0 7.6177216,46.4020088,0 7.6173518,46.4015782,0 7.6171968,46.401491,0 7.6171248,46.4012666,0 7.6169562,46.4010242,0 7.616789,46.4008723,0 7.6166055,46.4005798,0 7.6163119,46.4004477,0 7.6162257,46.4002455,0 7.6159082,46.4001664,0 7.6158021,46.400068,0 7.615741,46.3999246,0 7.6155345,46.3998258,0 7.6155034,46.3995861,0 7.6153372,46.3993537,0 7.6151007,46.3993059,0 7.6147908,46.3988956,0 7.614583,46.39872,0 7.6144629,46.3985904,0 7.6144107,46.398504,0 7.6144451,46.3984215,0 7.6149668,46.3984892,0 7.6159224,46.3981975,0 7.6160369,46.3979777,0 7.6162827,46.3980041,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5939523,46.4441727,0 7.5941669,46.4450295,0 7.5934587,46.4457548,0 7.5933515,46.4466271,0 7.5945316,46.4482231,0 7.5945316,46.4490074,0 7.594943,46.450099,0 7.5953899,46.4508259,0 7.5959049,46.4512694,0 7.5969564,46.4515798,0 7.5982438,46.4518016,0 7.5986526,46.4521268,0 7.5989734,46.4519199,0 7.5995956,46.4519199,0 7.6003692,46.4512982,0 7.6023637,46.4513285,0 7.6027285,46.4516685,0 7.6031576,46.451639,0 7.6036941,46.4516537,0 7.6038443,46.4518311,0 7.6055823,46.4522155,0 7.606784,46.4522296,0 7.6084362,46.451313,0 7.6090166,46.4513573,0 7.609831,46.452407,0 7.6112472,46.4526147,0 7.6135442,46.4523486,0 7.6140581,46.4528652,0 7.6154314,46.4531321,0 7.6163122,46.4537966,0 7.6164828,46.4533383,0 7.6173626,46.4528956,0 7.6181136,46.4534869,0 7.6183078,46.4541078,0 7.6189075,46.4544034,0 7.6193582,46.4541373,0 7.6189075,46.4536938,0 7.6189505,46.4526295,0 7.6184999,46.451639,0 7.6174935,46.4511659,0 7.6163766,46.4503372,0 7.6160537,46.4500571,0 7.6155398,46.4499085,0 7.6158266,46.4496374,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.565617,46.454428,0 7.5666152,46.4552017,0 7.5666581,46.4555121,0 7.5668942,46.4560583,0 7.5663148,46.4560591,0 7.5659082,46.4558226,0 7.5657784,46.4563547,0 7.5656925,46.4567539,0 7.5652732,46.457071,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5631545,46.4467541,0 7.5632249,46.4472628,0 7.5633107,46.4479429,0 7.5632249,46.4485269,0 7.5631498,46.449,0 7.5635575,46.4492214,0 7.5643198,46.4494214,0 7.5645982,46.4497762,0 7.5646202,46.4501898,0 7.5648128,46.4507002,0 7.5644372,46.4508776,0 7.5647162,46.4511359,0 7.5650917,46.4512546,0 7.5650702,46.4513876,0 7.5658749,46.4517424,0 7.5653385,46.4518016,0 7.5646947,46.4515503,0 7.5639115,46.4515724,0 7.5640939,46.4518459,0 7.5642225,46.4520855,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5145904,46.4695704,0 7.5139015,46.469419,0 7.5126127,46.4689973,0 7.510378,46.4680514,0 7.5095656,46.4678181,0 7.5084436,46.4667202,0 7.5071567,46.4661894,0 7.505739,46.4654072,0 7.5052464,46.4648341,0 7.5041354,46.4642962,0 7.5039997,46.4641152,0 7.5025871,46.4638186,0 7.5017828,46.463507,0 7.5013203,46.4635723,0 7.5007337,46.4632858,0 7.5001289,46.4627517,0 7.5002388,46.4623825,0 7.5000975,46.462029,0 7.4998932,46.4618562,0 7.4996275,46.4618288,0 7.4998608,46.461322,0 7.4996878,46.4611049,0 7.4994787,46.4610968,0 7.4982335,46.4604124,0 7.4974418,46.4602679,0 7.4968574,46.4600731,0 7.4967003,46.4600542,0 7.4962353,46.4601925,0 7.4959148,46.4601799,0 7.4958959,46.4600102,0 7.4954686,46.4593819,0 7.4951482,46.4591054,0 7.4939668,46.4584896,0 7.4938194,46.4583292,0 7.4938408,46.4580558,0 7.4937617,46.457859,0 7.4935726,46.4576419,0 7.4935034,46.4572164,0 7.4935082,46.4569102,0 7.4938086,46.4566589,0 7.4937872,46.4564667,0 7.4935726,46.4563115,0 7.4935941,46.4561267,0 7.4937121,46.4559789,0 7.4936799,46.4558606,0 7.4935726,46.4557424,0 7.4935835,46.4556522,0 7.4936799,46.4554763,0 7.4939267,46.4554098,0 7.4940447,46.4552915,0 7.4940447,46.455055,0 7.494128,46.454872,0 7.4943129,46.4547002,0 7.4943987,46.4543306,0 7.4945216,46.4540381,0 7.4947635,46.4537097,0 7.49497,46.4533356,0 7.4952249,46.4530888,0 7.4955682,46.4528375,0 7.4957291,46.4526601,0 7.4961583,46.4523645,0 7.496523,46.4521723,0 7.4967269,46.4519653,0 7.4968664,46.4516844,0 7.4972955,46.4512261,0 7.497553,46.4510192,0 7.4976818,46.4508417,0 7.4979607,46.4505017,0 7.4983148,46.450036,0 7.498465,46.4495925,0 7.4987868,46.448979,0 7.4989048,46.4483802,0 7.4990336,46.4480401,0 7.4989048,46.4477666,0 7.4986366,46.4475153,0 7.4985508,46.4471974,0 7.4986581,46.44702,0 7.4987976,46.4468426,0 7.4988619,46.4466504,0 7.4989048,46.4463768,0 7.4988512,46.4461551,0 7.4986795,46.4456598,0 7.4985937,46.4454823,0 7.4984542,46.4452975,0 7.4983684,46.4451645,0 7.4984328,46.4450684,0 7.4986259,46.4449427,0 7.4988512,46.4447579,0 7.4990443,46.4444621,0 7.4992267,46.4443069,0 7.4994091,46.4442625,0 7.4995486,46.4441517,0 7.4995271,46.4439447,0 7.4995164,46.4437524,0 7.4996344,46.4434937,0 7.4999563,46.4431314,0 7.5002459,46.4427987,0 7.5003854,46.4426731,0 7.5006429,46.4424217,0 7.5009111,46.442296,0 7.5010721,46.4422369,0 7.5010506,46.442126,0 7.5009004,46.4420225,0 7.5007502,46.4419929,0 7.5006536,46.4419559,0 7.5006107,46.4419042,0 7.5006,46.4417711,0 7.5005678,46.441638,0 7.5004605,46.4415863,0 7.5004498,46.4415419,0 7.5004905,46.4414532,0 7.5005142,46.4414015,0 7.5005142,46.4412906,0 7.5004283,46.4413349,0 7.5002352,46.4413941,0 7.5001601,46.4413867,0 7.5000636,46.4412906,0 7.4999455,46.4411944,0 7.4997631,46.4411057,0 7.4996344,46.4411427,0 7.4993662,46.4411427,0 7.4991194,46.4410761,0 7.4987868,46.4409948,0 7.4984864,46.4408396,0 7.4982933,46.4406326,0 7.4977676,46.4403886,0 7.497435,46.4402481,0 7.4972097,46.4401963,0 7.4971668,46.4402851,0 7.4972526,46.4404255,0 7.4973492,46.4405438,0 7.4973062,46.4407139,0 7.4972848,46.4409209,0 7.4974135,46.4410909,0 7.4974886,46.441224,0 7.4975637,46.4414606,0 7.4976067,46.441638,0 7.4976603,46.4418303,0 7.4976603,46.4419485,0 7.4976388,46.4423404,0 7.4974564,46.4426879,0 7.4969522,46.442991,0 7.496566,46.4432497,0 7.4962226,46.443575,0 7.4961046,46.4437377,0 7.4959437,46.4437894,0 7.4956969,46.4437894,0 7.4954823,46.4438042,0 7.4951283,46.4438707,0 7.4948406,46.4440224,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4392764,46.5663903,0 7.4384143,46.5654398,0 7.4383285,46.5644956,0 7.4369552,46.5639645,0 7.4358394,46.5630793,0 7.4334362,46.5624892,0 7.4318054,46.561545,0 7.4313762,46.5601286,0 7.4301746,46.5598335,0 7.4283721,46.5600106,0 7.4268272,46.5598925,0 7.4253681,46.5597745,0 7.4243488,46.5597302,0 7.4237311,46.5597542,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6025506,46.5498156,0 7.6028653,46.5497501,0 7.6028389,46.54964,0 7.6031894,46.5495721,0 7.6035778,46.5494457,0 7.6037914,46.5494037,0 7.6040446,46.549479,0 7.6042355,46.5496465,0 7.6045554,46.5500853,0 7.604603,46.550328,0 7.6047518,46.55048,0 7.604832,46.550562,0 7.6048525,46.5506675,0 7.604877,46.550899,0 7.60495,46.550924,0 7.6051,46.551122,0 7.605191,46.551234,0 7.605464,46.551456,0 7.605639,46.551512,0 7.605784,46.551733,0 7.605943,46.551818,0 7.606095,46.552009,0 7.606435,46.552209,0 7.60649,46.552187,0 7.606543,46.552362,0 7.606685,46.552431,0 7.606803,46.552701,0 7.606729,46.552879,0 7.606867,46.553505,0 7.607232,46.553864,0 7.607482,46.553954,0 7.6077446,46.5542054,0 7.6081817,46.5543071,0 7.6082734,46.5543499,0 7.6085418,46.5544171,0 7.6087851,46.5544514,0 7.6090718,46.5545225,0 7.6093117,46.5546698,0 7.60936,46.5548103,0 7.6093995,46.5548684,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5849029,46.5115884,0 7.58481,46.5116222,0 7.5846421,46.5115122,0 7.5846131,46.5115867,0 7.5845005,46.5115558,0 7.5843126,46.5114523,0 7.584142,46.5112744,0 7.5839847,46.5111716,0 7.5834605,46.5109729,0 7.5833227,46.5109291,0 7.5831168,46.5109274,0 7.5827628,46.5107142,0 7.5825833,46.5106646,0 7.5823735,46.5106181,0 7.5820585,46.510608,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5620328,46.4912044,0 7.5624485,46.4911228,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5870469,46.5174702,0 7.5869142,46.5174469,0 7.5867683,46.5173533,0 7.5866814,46.5173433,0 7.5865673,46.5172963,0 7.5864711,46.5172304,0 7.5864401,46.5171526,0 7.5864303,46.5170445,0 7.5861962,46.5172065,0 7.5861315,46.5173462,0 7.5861156,46.5174414,0 7.5860537,46.5175235,0 7.5860095,46.5175323,0 7.5859337,46.5175202,0 7.5858968,46.5174461,0 7.5858323,46.5174205,0 7.5857805,46.5174263,0 7.5855589,46.517562,0 7.5853542,46.517598,0 7.5850387,46.5177229,0 7.5848903,46.5179375,0 7.5847829,46.5179983,0 7.5843919,46.5179006,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.6168363,46.5609385,0 7.6169212,46.5608065,0 7.6169276,46.5608025,0 7.61705,46.560728,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.580134,46.5028204,0 7.5796817,46.5029734,0 7.5793242,46.5029233,0 7.579196,46.503146,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.580325,46.5027273,0 7.5804032,46.5026495,0 7.5801302,46.5020994,0 7.58,46.501965,0 7.5796142,46.5018839,0 7.578915,46.5018479,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.489344,46.4970621,0 7.4894459,46.4970965,0 7.4895445,46.4970424,0 7.4896947,46.4970225,0 7.4897056,46.4969934,0 7.4898076,46.4969784,0 7.4899233,46.4970458,0 7.4901552,46.4970463,0 7.4902717,46.4970463,0 7.4903687,46.4970477,0 7.4904743,46.4971045,0 7.4906798,46.4971168,0 7.4907075,46.497224,0 7.4909032,46.4972302,0 7.4910534,46.4972581,0 7.4912316,46.4972956,0 7.4913717,46.4972872,0 7.4914988,46.4973022,0 7.4915715,46.4972667,0 7.4916332,46.4972247,0 7.4918452,46.4972365,0 7.4919829,46.4973915,0 7.4921941,46.4973733,0 7.4923721,46.4972622,0 7.4924976,46.4972333,0 7.492589,46.4971636,0 7.4927543,46.4971714,0 7.4929234,46.4971128,0 7.4930718,46.4971128,0 7.493159,46.4970928,0 7.4933313,46.4971206,0 7.4935232,46.4972342,0 7.4936332,46.4972942,0 7.4937682,46.4973207,0 7.4938968,46.497335,0 7.4940006,46.497385,0 7.4940255,46.497415,0 7.4942216,46.4974164,0 7.4942725,46.4973392,0 7.4944624,46.49736,0 7.4946274,46.4974493,0 7.4946928,46.4975107,0 7.4947986,46.4974885,0 7.4950799,46.4975193,0 7.495331,46.4974493,0 7.4954389,46.4975107,0 7.4958032,46.4975586,0 7.4961539,46.4975907,0 7.4963303,46.4975907,0 7.4966717,46.4976114,0 7.497279,46.4976768,0 7.4973942,46.4977876,0 7.4978249,46.497889,0 7.498132,46.4979726,0 7.4985585,46.4980312,0 7.4988159,46.4980747,0 7.4994832,46.4980947,0 7.5000228,46.4982469,0 7.5002407,46.4983733,0 7.5005136,46.4985698,0 7.5008405,46.4987991,0 7.5011591,46.4989948,0 7.5012587,46.499107,0 7.5016936,46.4992741,0 7.5021211,46.4993741,0 7.5019653,46.4996232,0 7.5019439,46.49983,0 7.5017293,46.4999925,0 7.5016005,46.5001254,0 7.5016864,46.5006276,0 7.5020297,46.5008491,0 7.5019009,46.5010855,0 7.5018795,46.5012627,0 7.5023086,46.50144,0 7.5024588,46.5017797,0 7.5025447,46.5019569,0 7.5025876,46.5021785,0 7.5025661,46.5024886,0 7.5030167,46.502592,0 7.503639,46.5028136,0 7.5043257,46.5030351,0 7.5048621,46.5028874,0 7.5052698,46.502784,0 7.5056775,46.5027692,0 7.5062354,46.5029908,0 7.5066646,46.5033453,0 7.5069864,46.5035963,0 7.5073512,46.5038179,0 7.5076731,46.5040247,0 7.5076516,46.5041871,0 7.5073297,46.5042314,0 7.5067718,46.5043496,0 7.5064714,46.5043939,0 7.5064929,46.504512,0 7.5067075,46.5046007,0 7.5070508,46.5047779,0 7.5070293,46.5050142,0 7.5067504,46.5051471,0 7.5064714,46.5053391,0 7.5061281,46.5055016,0 7.5052698,46.5057379,0 7.5047763,46.5060776,0 7.5041325,46.5065649,0 7.5035103,46.5070228,0 7.5029309,46.507392,0 7.5026091,46.5076578,0 7.5020726,46.5079089,0 7.5017507,46.5081156,0 7.5014933,46.5083076,0 7.5010641,46.5087211,0 7.5009783,46.5090903,0 7.5009139,46.5095777,0 7.500871,46.5099764,0 7.5004204,46.5104047,0 7.50012,46.5108477,0 7.4996479,46.5110987,0 7.4990042,46.5111578,0 7.4984248,46.511335,0 7.4983604,46.5116451,0 7.4982317,46.5120438,0 7.4977811,46.5122063,0 7.4976952,46.5123244,0 7.4978025,46.512413,0 7.4976952,46.5125607,0 7.4972876,46.5127674,0 7.4966224,46.5129889,0 7.4961288,46.5132843,0 7.4958284,46.5133286,0 7.4954422,46.5134467,0 7.4951847,46.5136239,0 7.4946268,46.5138011,0 7.4940904,46.513875,0 7.4938758,46.513934,0 7.4935539,46.5140965,0 7.4933608,46.5141408,0 7.492996,46.5139488,0 7.4925883,46.5139931,0 7.492245,46.5140965,0 7.491966,46.5142589,0 7.4917944,46.5144213,0 7.4914511,46.5144804,0 7.4911077,46.5143475,0 7.490743,46.5142294,0 7.4903996,46.5143179,0 7.4901636,46.5145247,0 7.4897774,46.5147314,0 7.4892838,46.5148643,0 7.4884255,46.5152482,0 7.487696,46.5154845,0 7.4874599,46.5156174,0 7.486945,46.515957,0 7.4861725,46.5160456,0 7.485636,46.5160751,0 7.4854834,46.5161258,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5810925,46.497901,0 7.580999,46.498044,0 7.580567,46.497948,0 7.5805282,46.4980101,0 7.580489,46.498073,0 7.5806637,46.4981927,0 7.580764,46.498291,0 7.580732,46.498332,0 7.5806387,46.4983733,0 7.5803456,46.4986969,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5868088,46.5114574,0 7.5867929,46.5114531,0 7.5867416,46.5114409,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5875342,46.512005,0 7.5873571,46.5120171,0 7.5869236,46.5118061,0 7.5868421,46.5116025,0 7.5868468,46.5114841,0 7.5868088,46.5114574,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5633366,46.4810949,0 7.563085,46.4812124,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5461028,46.4845429,0 7.5460141,46.4844262,0 7.5458652,46.4843459,0 7.5456547,46.4842848,0 7.5455029,46.4842106,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.4579366,46.4368633,0 7.4561507,46.438472,0 7.4554266,46.4407469,0 7.4562657,46.4407434,0 7.4565824,46.4408413,0 + + + + Margeliweg + Margeliweg, Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5702308,46.4974098,0 7.5701367,46.4975929,0 7.570127,46.497612,0 7.569897,46.497685,0 7.5695,46.497694,0 7.569391,46.497615,0 7.569158,46.49761,0 7.569122,46.497717,0 7.569308,46.49812,0 7.570074,46.498377,0 7.57033,46.498687,0 7.5705898,46.498823,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5685948,46.4864379,0 7.5688213,46.4863868,0 7.5691195,46.4862141,0 7.569185,46.4860615,0 7.5693007,46.4859109,0 7.5694777,46.4858092,0 7.5698205,46.4856595,0 7.5701528,46.485471,0 7.5704268,46.485429,0 7.5706475,46.4853774,0 7.5710397,46.4852471,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5677844,46.4896259,0 7.567876,46.4895408,0 7.567961,46.489547,0 7.5679627,46.4894969,0 7.5680063,46.4894105,0 7.5680732,46.4893894,0 7.5681704,46.489411,0 7.5682202,46.4893757,0 7.5682202,46.489292,0 7.5682275,46.4892296,0 7.5682582,46.4891723,0 7.5683261,46.4891145,0 7.5683411,46.4890816,0 7.5683272,46.4889471,0 7.5684098,46.4889418,0 7.5685373,46.4889605,0 7.5687317,46.4889811,0 7.5688378,46.4889221,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.571083,46.4852752,0 7.5712609,46.4852006,0 7.5714092,46.4851008,0 7.5715368,46.4849655,0 7.571555,46.4849207,0 7.5718393,46.4846598,0 7.5719243,46.4846003,0 7.5721098,46.484547,0 7.5721753,46.4845139,0 7.5722317,46.4845225,0 7.572362,46.4844702,0 7.5724345,46.4844726,0 7.5724951,46.4845446,0 7.5725829,46.484605,0 7.5727,46.484345,0 7.5728469,46.4841998,0 7.5728858,46.4841269,0 7.5730058,46.4840919,0 7.5730633,46.4841159,0 7.573079,46.4840679,0 7.5731306,46.484102,0 7.5731696,46.4840926,0 7.5732194,46.4840055,0 7.5732887,46.4839626,0 7.5732988,46.4839684,0 7.5733114,46.4840442,0 7.5733703,46.484136,0 7.5734232,46.4842003,0 7.5734601,46.484221,0 7.5735123,46.4842222,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5684612,46.487926,0 7.5684632,46.487807,0 7.5684908,46.4874257,0 7.5683489,46.4873599,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5756624,46.4951092,0 7.5750979,46.4947883,0 7.5743523,46.4946252,0 7.5737649,46.4942215,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.5728372,46.4890235,0 7.5727436,46.4888729,0 7.5722582,46.4884277,0 7.5718875,46.4882051,0 7.5717091,46.4881898,0 7.5714861,46.4882473,0 + + + + , Summer Walking Path + #style-Summer_Hiking + + relativeToGround + 7.563239,46.4912821,0 7.5633949,46.4913423,0 7.5634393,46.4913395,0 7.5642021,46.4916877,0 7.564343,46.4917357,0 7.5645316,46.4919494,0 + + + + + + Waterways + + Waterway_River + + + Rotten + #style-Waterway_River + + relativeToGround + 8.3809611,46.5793095,0 8.3810126,46.578759,0 8.3804404,46.5779554,0 8.3798931,46.577374,0 8.3796941,46.57669,0 8.3797688,46.5757666,0 8.3793707,46.5750997,0 8.3802912,46.574313,0 8.3811619,46.5730647,0 8.3808633,46.5722438,0 8.3797328,46.5712548,0 8.3789478,46.5704823,0 8.3785,46.5695246,0 8.3773308,46.56908,0 8.375067,46.567746,0 8.3744202,46.5672671,0 8.3728778,46.5667711,0 8.3720818,46.5664119,0 8.3707135,46.5663948,0 8.3695194,46.5661554,0 8.3686985,46.5654712,0 8.3682507,46.5648555,0 8.3669571,46.5647016,0 8.3665591,46.564445,0 8.3660615,46.5645305,0 8.3656712,46.5644753,0 8.365166,46.5642227,0 8.3640982,46.5636204,0 8.3627363,46.5625072,0 8.3622116,46.5620904,0 8.3619162,46.5618251,0 8.3606878,46.5611105,0 8.3597744,46.5608453,0 8.3579486,46.5604548,0 8.3561402,46.5595722,0 8.3557931,46.5593294,0 8.3554263,46.5590004,0 8.3552344,46.5583665,0 8.3556378,46.5571362,0 8.3570111,46.5547753,0 8.3588994,46.5528866,0 8.3602827,46.5506929,0 8.3616855,46.5491811,0 8.3616995,46.5475524,0 8.3620441,46.5469392,0 8.3620639,46.546586,0 8.362161,46.5448586,0 8.3623602,46.5438652,0 8.3624521,46.5433528,0 8.3625424,46.5424862,0 8.3606462,46.5408034,0 8.3602507,46.5403122,0 8.3602754,46.5392381,0 8.3593975,46.538297,0 8.3585929,46.5374926,0 8.3579406,46.5372691,0 8.3569815,46.5372579,0 8.3551793,46.5374009,0 8.3529555,46.5368053,0 8.3509396,46.5364303,0 8.3503448,46.5353437,0 8.3494472,46.5345604,0 8.3482431,46.533861,0 8.3473434,46.5334395,0 8.3468182,46.533018,0 8.3460346,46.532176,0 8.3451745,46.5312024,0 8.3442859,46.5302302,0 8.341962,46.5278764,0 8.3412361,46.52715,0 8.3410492,46.5268648,0 8.3408741,46.5264552,0 8.3406487,46.5261124,0 8.3378035,46.5236785,0 8.3365463,46.5225635,0 8.3358665,46.5218821,0 8.3354103,46.5214204,0 8.335185,46.5211382,0 8.3344354,46.5198694,0 8.3338271,46.5187553,0 8.3335681,46.5184011,0 8.3333216,46.5180749,0 8.3329861,46.517854,0 8.3326138,46.517648,0 8.331599,46.5171055,0 8.3313651,46.5169186,0 8.3311949,46.5166985,0 8.330977,46.5162522,0 8.3306718,46.5157189,0 8.3303871,46.5154024,0 8.3301024,46.515126,0 8.3292847,46.5145684,0 8.3284889,46.5140258,0 8.3281602,46.5137946,0 8.3279672,46.5136939,0 8.3277519,46.5135948,0 8.327292,46.5134114,0 8.3267698,46.5132161,0 8.3259503,46.5129785,0 8.3255706,46.5128494,0 8.3252801,46.512685,0 8.3249628,46.5124709,0 8.3240832,46.5118632,0 8.3235147,46.5113328,0 8.3226547,46.5104817,0 8.3223496,46.5100019,0 8.32186,46.5095222,0 8.3216898,46.5094171,0 8.3214928,46.509322,0 8.3212136,46.5091708,0 8.3209988,46.5090744,0 8.3207783,46.5090015,0 8.3196984,46.5086575,0 8.3193492,46.5085431,0 8.3189509,46.5084362,0 8.3187236,46.5083803,0 8.3184974,46.5083419,0 8.3182567,46.5083375,0 8.3180263,46.5083508,0 8.3174734,46.5084226,0 8.3167471,46.5083953,0 8.3160315,46.5083187,0 8.3151054,46.5082564,0 8.3142082,46.5081715,0 8.313588,46.5081275,0 8.3129989,46.5080681,0 8.3125857,46.5079476,0 8.3121468,46.5077548,0 8.312012,46.5076174,0 8.311863,46.5073672,0 8.3116228,46.5069618,0 8.3114915,46.5067409,0 8.3113505,46.506547,0 8.3111267,46.5063412,0 8.3108778,46.5061337,0 8.3105821,46.5059194,0 8.3100814,46.5054643,0 8.3092124,46.5044489,0 8.3079707,46.5038562,0 8.3065427,46.5031652,0 8.2992117,46.4999818,0 8.2974913,46.4992347,0 8.2888207,46.4950271,0 8.2821475,46.4911101,0 8.2816738,46.4907287,0 8.2810227,46.4902096,0 8.2799624,46.4894364,0 8.2791991,46.4889918,0 8.2784596,46.4887505,0 8.2783195,46.4885775,0 8.2775333,46.4876068,0 8.2768434,46.486656,0 8.2762437,46.4856638,0 8.2761271,46.4852222,0 8.2758522,46.4847634,0 8.2754024,46.4844021,0 8.2750442,46.4842223,0 8.2746478,46.484089,0 8.2739879,46.4839606,0 8.2732285,46.4837942,0 8.2716792,46.4835591,0 8.270788,46.483387,0 8.2700457,46.4831351,0 8.2696145,46.4827465,0 8.2691198,46.4819259,0 8.268956,46.4817412,0 8.267543,46.4809836,0 8.265199,46.4785089,0 8.2613049,46.477341,0 8.258764,46.4769837,0 8.2557309,46.476287,0 8.2537907,46.4748393,0 8.2530884,46.4737978,0 8.2517779,46.4731821,0 8.2505962,46.4713575,0 8.2481102,46.4712526,0 8.2469721,46.4709783,0 8.2455664,46.4702859,0 8.2448658,46.4695507,0 8.2446235,46.4688246,0 8.2441669,46.4677964,0 8.2439909,46.4672901,0 8.2435946,46.4660171,0 8.2434751,46.4638729,0 8.2429109,46.4634003,0 8.2421367,46.4631794,0 8.2413471,46.4629851,0 8.2399768,46.4624948,0 8.2378375,46.4619808,0 8.2348559,46.4604787,0 8.2336767,46.4595306,0 8.2327392,46.4591274,0 8.2316244,46.4587223,0 8.230689,46.4582662,0 8.2292937,46.4567381,0 8.2271256,46.4551003,0 8.2264984,46.4548479,0 8.2259419,46.4548318,0 8.225287,46.4549385,0 8.2239994,46.4551344,0 8.2224883,46.4551344,0 8.2210779,46.4548211,0 8.2203727,46.4543684,0 8.219938,46.4540652,0 8.2194884,46.4536547,0 8.2192128,46.4535068,0 8.2189054,46.4533624,0 8.2186017,46.4531836,0 8.2183672,46.452995,0 8.2182045,46.4527239,0 8.2179551,46.4523145,0 8.217401,46.4518968,0 8.2170484,46.4514442,0 8.2168973,46.4509916,0 8.2162425,46.4503998,0 8.2156884,46.4500168,0 8.2150997,46.4498423,0 8.2144511,46.4497048,0 8.2134722,46.4495038,0 8.2127661,46.4491725,0 8.2124011,46.4488254,0 8.2123137,46.4484501,0 8.2120618,46.447719,0 8.2114071,46.4472664,0 8.2103493,46.4471968,0 8.2096442,46.4469183,0 8.2092915,46.4462567,0 8.2087879,46.4456996,0 8.2086662,46.4452839,0 8.2086368,46.444864,0 8.2084997,46.444571,0 8.2082775,46.4443192,0 8.2078873,46.4441367,0 8.2073272,46.4440632,0 8.2067585,46.4441111,0 8.2061841,46.444211,0 8.2056855,46.4442129,0 8.2050092,46.4441668,0 8.2045474,46.4438673,0 8.2042113,46.4435089,0 8.2041606,46.4431742,0 8.2043508,46.4426956,0 8.2044744,46.4421839,0 8.2044079,46.4418335,0 8.2042177,46.4415221,0 8.2037372,46.441096,0 8.2031997,46.4406043,0 8.2027641,46.4402438,0 8.2021294,46.4399356,0 8.2015235,46.4396386,0 8.2012417,46.4394368,0 8.2009982,46.4392035,0 8.2009129,46.4389971,0 8.2008667,46.4387763,0 8.2008223,46.4379607,0 8.2007907,46.4375375,0 8.200318,46.4368117,0 8.1993607,46.4365031,0 8.1982153,46.4363582,0 8.1958192,46.4366253,0 8.19479,46.4362763,0 8.1937483,46.43594,0 8.1933564,46.4354758,0 8.1932964,46.4351213,0 8.1930565,46.4342674,0 8.1922574,46.4338651,0 8.1891176,46.4321459,0 8.1870285,46.4325305,0 8.185658,46.4320112,0 8.1828991,46.4302863,0 8.1811784,46.4296467,0 8.1796629,46.4281609,0 8.1798238,46.4272433,0 8.1800746,46.4265742,0 8.1795634,46.4262843,0 8.1781283,46.4262043,0 8.1769875,46.4258846,0 8.1759086,46.4250951,0 8.1750912,46.424305,0 8.1707123,46.4202363,0 8.1702435,46.4198007,0 8.1585706,46.4131733,0 8.1506741,46.408439,0 8.1496459,46.4076273,0 8.1427777,46.4020471,0 8.1389729,46.4009274,0 8.1377901,46.3991976,0 8.1365368,46.398807,0 8.1345567,46.3965826,0 8.1318753,46.3954356,0 8.1275903,46.3932613,0 8.1248034,46.391294,0 8.1242142,46.3901885,0 8.1225604,46.3877846,0 8.1195583,46.3845555,0 8.117387,46.3840506,0 8.1151622,46.3827137,0 8.1120501,46.3820872,0 8.111043,46.3814855,0 8.1104735,46.380476,0 8.1080893,46.3795991,0 8.10604,46.3781469,0 8.1047198,46.377719,0 8.1037526,46.3774629,0 8.1007618,46.3753388,0 8.0965176,46.3755291,0 8.095282,46.3772748,0 8.0940139,46.3781826,0 8.0918295,46.3781278,0 8.0902618,46.3764919,0 8.0874549,46.3743397,0 8.0857466,46.3734776,0 8.0831482,46.3733223,0 8.081071,46.3719922,0 8.0792466,46.3716062,0 8.0779375,46.3719812,0 8.0763592,46.372377,0 8.0750815,46.3715033,0 8.072929,46.3696281,0 8.0717659,46.3690859,0 8.0704667,46.369113,0 8.0693186,46.3692328,0 8.0686961,46.3687732,0 8.068403,46.3677228,0 8.0676044,46.3671998,0 8.0658763,46.3668823,0 8.0633385,46.3656446,0 8.0606123,46.364566,0 8.0591321,46.3636382,0 8.0549773,46.3620484,0 8.0540035,46.3613046,0 8.0539798,46.3607469,0 8.0539543,46.3601453,0 8.0534732,46.3596983,0 8.0520047,46.3595265,0 8.0510579,46.3591344,0 8.0501139,46.3572737,0 8.0464833,46.3546331,0 8.0454189,46.3536618,0 8.0445865,46.3533216,0 8.0420523,46.3531278,0 8.0408092,46.3522215,0 8.0398632,46.350791,0 8.0388604,46.3505724,0 8.0373407,46.3494294,0 8.0356058,46.3480367,0 8.0343953,46.3472799,0 8.0333291,46.346744,0 8.0317421,46.3458979,0 8.0302326,46.3456978,0 8.0292399,46.3455515,0 8.0261735,46.3432866,0 8.0259836,46.3420655,0 8.0264551,46.3407013,0 8.0259262,46.3396684,0 8.0234949,46.3386346,0 8.020266,46.3377702,0 8.0160216,46.3346158,0 8.0141883,46.3326938,0 8.0135499,46.3301236,0 8.0124921,46.3283112,0 8.0115358,46.3273088,0 8.0108655,46.3266859,0 8.0102607,46.3262723,0 8.0095941,46.3259423,0 8.0087365,46.3256467,0 8.0080757,46.3255279,0 8.0073478,46.3254215,0 8.0055289,46.325252,0 8.0039364,46.3250342,0 8.0015581,46.324548,0 7.9993741,46.32384,0 7.9970168,46.3230628,0 7.9925065,46.3215534,0 7.9914432,46.3212472,0 7.991121,46.3211723,0 7.9903034,46.3209823,0 7.9886569,46.3207586,0 7.9869448,46.3206321,0 7.9836789,46.3201161,0 7.9788194,46.3181719,0 7.9758813,46.3174055,0 7.9600679,46.3117323,0 7.9565029,46.3106402,0 7.955247,46.310234,0 7.9542164,46.3097427,0 7.9527726,46.3088982,0 7.9519207,46.3084392,0 7.9504972,46.3077111,0 7.9489508,46.3071536,0 7.9473017,46.3066644,0 7.9425696,46.3053036,0 7.9413469,46.304854,0 7.9398251,46.3040189,0 7.9379488,46.3028253,0 7.9364718,46.3019089,0 7.9345709,46.3007621,0 7.933172,46.3000077,0 7.9318451,46.2994313,0 7.928514,46.2984772,0 7.9229629,46.2979464,0 7.9127991,46.2970075,0 7.900068,46.2959571,0 7.8969337,46.2962684,0 7.8883662,46.2998642,0 7.8831882,46.3016904,0 7.879355,46.3023285,0 7.870157,46.3024357,0 7.8594632,46.3028369,0 7.8473388,46.3065427,0 7.837881,46.3074945,0 7.8282882,46.3085712,0 7.8254374,46.3083172,0 7.8119843,46.3070984,0 7.79907,46.3068076,0 7.7961276,46.3060891,0 7.7825327,46.3059889,0 7.7791226,46.3062115,0 7.7759134,46.3067902,0 7.7584525,46.3091078,0 7.7557324,46.3089797,0 7.7502818,46.3078243,0 7.7421452,46.3062882,0 7.734567,46.3067893,0 7.7211303,46.3088396,0 7.7149656,46.3096625,0 7.7102771,46.3102013,0 7.7074025,46.3103195,0 7.7044396,46.3102865,0 7.6996507,46.3100588,0 7.6974949,46.3101029,0 7.6966104,46.3100717,0 7.6957296,46.3099474,0 7.694161,46.3094777,0 7.6927706,46.3088802,0 7.691423,46.3085228,0 7.6899252,46.308143,0 7.6817564,46.3065984,0 7.6791486,46.3062246,0 7.676791,46.3060118,0 7.6743843,46.3058588,0 7.6709507,46.3060023,0 7.6685512,46.3061912,0 7.667216,46.3063457,0 7.6661641,46.3065173,0 7.6609949,46.3077651,0 7.6568983,46.3086912,0 7.6499748,46.3103429,0 7.6470405,46.3121565,0 7.6456254,46.3125409,0 7.6411929,46.3128287,0 7.6364073,46.3118884,0 7.6334386,46.3118577,0 7.6328038,46.3119827,0 7.6321042,46.3121204,0 7.6275072,46.3135204,0 7.6208014,46.3155027,0 7.6179549,46.315624,0 7.6148903,46.3151243,0 7.6081835,46.3136662,0 7.6010581,46.3127966,0 7.5993032,46.3121006,0 7.5967373,46.3098956,0 7.5961853,46.3096521,0 + + + + Engstlige + #style-Waterway_River + + relativeToGround + 7.6022785,46.5401947,0 7.6025091,46.540512,0 7.6031368,46.5413754,0 7.6026218,46.5429104,0 7.6027935,46.5440911,0 7.6017635,46.5453898,0 7.602103,46.5468677,0 7.6022785,46.5471607,0 7.6033085,46.5479872,0 7.6043384,46.5489316,0 7.6057117,46.54964,0 7.6057117,46.5507025,0 7.6077717,46.5521191,0 7.6090281,46.5540874,0 7.6097828,46.554791,0 7.6104014,46.5553546,0 7.6122349,46.5567229,0 7.6142948,46.556959,0 7.6150274,46.5575363,0 7.6158784,46.5582068,0 7.6165495,46.5597606,0 7.6176459,46.5602837,0 7.6196163,46.5615623,0 7.6206463,46.5632147,0 7.6208892,46.5635148,0 7.6216696,46.564479,0 7.6231862,46.5660439,0 7.6242334,46.5683426,0 7.6251095,46.5691157,0 7.6269613,46.569587,0 7.627585,46.5698201,0 7.6290577,46.5697058,0 7.6307743,46.5707679,0 7.6319759,46.5715939,0 7.6335209,46.573482,0 7.6348942,46.5744261,0 7.6358843,46.5774784,0 + + + + #style-Waterway_River + + relativeToGround + 7.4148104,46.4967759,0 7.4160013,46.4959967,0 7.4175624,46.4951252,0 7.4178913,46.4949773,0 7.4184173,46.4947409,0 7.4193487,46.4946931,0 7.4201105,46.4947596,0 7.4212638,46.4950993,0 7.4229066,46.4958041,0 7.4239943,46.496366,0 7.4253086,46.4972116,0 7.4259845,46.4977434,0 7.4264298,46.4983564,0 7.4267034,46.4990432,0 7.427154,46.4997744,0 7.4279211,46.5003061,0 7.4291656,46.5007825,0 7.4300186,46.5014102,0 + + + + Simme + #style-Waterway_River + + relativeToGround + 7.4148104,46.4967759,0 7.4140004,46.4972966,0 7.4128648,46.4984032,0 7.4120378,46.4988758,0 7.4116834,46.4993483,0 7.4114471,46.5002048,0 7.4109746,46.5010613,0 7.4102738,46.5016021,0 7.4094683,46.5017406,0 7.4089071,46.5017111,0 7.4082574,46.5019769,0 7.4079333,46.5023075,0 7.4067806,46.5030402,0 7.4056266,46.5035924,0 7.4046502,46.5039764,0 7.4037385,46.504192,0 7.4032394,46.5044749,0 7.402762,46.5046706,0 7.4023435,46.5047998,0 7.4018339,46.5048885,0 7.4011395,46.5049009,0 7.4002605,46.5049802,0 7.3995446,46.5052257,0 7.3988062,46.5054175,0 7.3977637,46.5056704,0 7.3967979,46.5057762,0 7.3956424,46.5059331,0 7.3945836,46.5062568,0 7.3941289,46.5065149,0 7.3937853,46.5067911,0 7.3931798,46.5074121,0 7.3928697,46.5082678,0 7.3927221,46.5088881,0 7.3928224,46.5093561,0 7.3926507,46.5097814,0 7.3921786,46.5102658,0 7.3915778,46.5107148,0 7.3910628,46.5110219,0 7.3904363,46.5111755,0 7.3892604,46.5112759,0 7.3888055,46.5114827,0 7.3888484,46.5121029,0 7.3889514,46.5125459,0 7.3891746,46.5130893,0 7.389679,46.5139383,0 7.3895618,46.5144406,0 7.3891188,46.5151494,0 7.388379,46.5162216,0 7.3879079,46.5172759,0 7.3877307,46.5179075,0 7.3877307,46.5188117,0 7.387583,46.5198455,0 7.387583,46.5213813,0 7.3877011,46.5231534,0 7.3879079,46.5251027,0 7.38841,46.5268157,0 7.3892074,46.5289422,0 7.3898764,46.5304745,0 7.3904774,46.5319547,0 7.3905365,46.5326931,0 7.3902707,46.533461,0 7.3898867,46.5341108,0 7.3891188,46.5346719,0 7.3882918,46.5349673,0 7.3872877,46.5350263,0 7.3863721,46.5353512,0 7.3858224,46.5362191,0 7.3856622,46.5375599,0 7.3854562,46.5381739,0 7.3851142,46.5385692,0 7.3840142,46.5395673,0 7.3835164,46.5400219,0 7.3830872,46.5405709,0 7.3826409,46.5408897,0 7.3817339,46.5417885,0 7.3808969,46.5424967,0 7.3809935,46.543044,0 7.3813476,46.5434625,0 7.3816696,46.5441064,0 7.3815086,46.5445893,0 7.3812189,46.5454263,0 7.3810901,46.5463599,0 7.3812832,46.5471969,0 7.3817017,46.5481305,0 7.3822168,46.5489031,0 7.382571,46.5494504,0 7.3826353,46.5499977,0 7.3822812,46.5506093,0 7.3817983,46.5515107,0 7.3817983,46.5521868,0 7.3821846,46.5528629,0 7.3823134,46.5532492,0 7.3819915,46.5538286,0 7.3816374,46.5546013,0 7.3812307,46.5561465,0 7.3812501,46.5566592,0 7.3812932,46.5571399,0 7.3812976,46.5574732,0 7.3812628,46.5576802,0 7.3812452,46.5577312,0 7.3811767,46.5578887,0 7.3810499,46.5581318,0 7.3808341,46.5585264,0 7.3803462,46.5593713,0 7.3798668,46.560396,0 7.3793147,46.5617983,0 7.3788502,46.5629464,0 7.3784991,46.563768,0 7.3774509,46.5660112,0 7.3772782,46.5665588,0 7.3772214,46.5669788,0 7.3772391,46.5675024,0 7.3774145,46.5680778,0 7.3776827,46.56869,0 7.3783264,46.5700693,0 7.378901,46.571245,0 7.379453,46.5718689,0 7.3800967,46.5723188,0 7.3807038,46.5727259,0 7.3817661,46.5733376,0 7.383086,46.5744643,0 7.3834248,46.5749918,0 7.3836909,46.5753722,0 7.3841028,46.575865,0 7.3844461,46.5762662,0 7.3846436,46.576573,0 7.3846779,46.5769447,0 7.3844204,46.5775346,0 7.3840518,46.5788425,0 7.3832792,46.5814502,0 7.3831651,46.5819281,0 7.3831866,46.5822231,0 7.3834226,46.5825623,0 7.3833583,46.5827835,0 7.3827789,46.5836905,0 7.382571,46.5845085,0 7.3826353,46.5855065,0 7.3826353,46.586404,0 7.3825429,46.5867432,0 7.3823475,46.5869475,0 7.3819313,46.5871488,0 7.3817704,46.5873257,0 7.381706,46.5877165,0 7.3810579,46.5885648,0 7.3810301,46.5887635,0 7.3811696,46.5893091,0 7.3810408,46.5894787,0 7.3807726,46.5895008,0 7.3803542,46.5895303,0 7.3799787,46.5896557,0 7.3793285,46.5898139,0 7.3785468,46.5897475,0 7.3778502,46.5896055,0 7.3772428,46.5896925,0 7.3770068,46.5898179,0 7.3768995,46.5900317,0 7.3769424,46.5904593,0 7.3767064,46.5907837,0 7.3759876,46.5914547,0 7.3754404,46.5922583,0 7.3753507,46.5926344,0 7.3754025,46.5932383,0 7.3754241,46.5934903,0 7.3756173,46.5940054,0 7.3758104,46.594778,0 7.3758506,46.5952003,0 7.3757515,46.595598,0 7.375655,46.5960772,0 7.3755906,46.5966375,0 7.3756764,46.5973821,0 7.3758373,46.5978907,0 7.3761163,46.5983552,0 7.3766098,46.5990923,0 7.3767171,46.5996305,0 7.3765991,46.6001023,0 7.3763255,46.600605,0 7.3758426,46.6010879,0 7.375231,46.6018605,0 7.3748768,46.6032448,0 7.3747644,46.6040594,0 7.374861,46.6045177,0 7.3750863,46.6048641,0 7.3759446,46.6058224,0 7.3766206,46.606729,0 7.3773179,46.6078198,0 7.3779724,46.609316,0 7.378579,46.6101663,0 7.378901,46.611132,0 7.378938,46.6123378,0 7.3790345,46.6126326,0 7.3792813,46.6131559,0 7.3794804,46.6138041,0 7.3795066,46.6141066,0 7.3793517,46.6146411,0 7.379174,46.6154331,0 7.3792229,46.6158,0 7.3793826,46.6161099,0 7.3796032,46.6163838,0 7.3802531,46.6170877,0 7.3813154,46.6182789,0 7.3825321,46.6192651,0 7.3836479,46.6203042,0 7.3841415,46.620621,0 7.3854504,46.6211663,0 7.3863409,46.6217116,0 7.3871955,46.622324,0 7.3884623,46.6235263,0 7.3891411,46.6241137,0 7.3909543,46.6254695,0 7.3924349,46.626221,0 7.3932288,46.6265821,0 7.3937867,46.626921,0 7.3943231,46.6273336,0 7.3949367,46.6279379,0 7.3955024,46.6286537,0 7.3958809,46.6289915,0 7.3968035,46.6296546,0 7.3984138,46.6307647,0 7.3990974,46.6311606,0 7.4000866,46.6314965,0 7.4013548,46.6318266,0 7.4028203,46.6322506,0 7.4036485,46.6326016,0 7.4044747,46.6331541,0 7.4053416,46.6338759,0 7.4065218,46.6346347,0 7.407584,46.6353641,0 7.4083585,46.6358357,0 7.4091954,46.6369775,0 7.4098176,46.6373827,0 7.4105901,46.6377584,0 7.4115879,46.6381562,0 7.4126608,46.6385318,0 7.4137337,46.6388044,0 7.4149031,46.6390622,0 7.4156401,46.6391335,0 7.4159545,46.6392243,0 7.4160189,46.6395852,0 7.4155585,46.6402065,0 7.4154717,46.6403955,0 7.4157075,46.6410153,0 7.4159223,46.6414931,0 7.4164159,46.6419645,0 7.4169931,46.6423048,0 7.417594,46.6426584,0 7.4178321,46.6429294,0 7.4177248,46.6435629,0 7.4177677,46.6437396,0 7.4180681,46.644211,0 7.4182612,46.6449402,0 7.4184865,46.6458167,0 7.4184543,46.6464281,0 7.4186163,46.6469861,0 7.4190122,46.6477833,0 7.4197203,46.6485345,0 7.4200422,46.6486671,0 7.4206645,46.648726,0 7.4216193,46.6487334,0 7.4220056,46.648807,0 7.4222845,46.6489175,0 7.4225528,46.6493005,0 7.4230731,46.6495547,0 7.4237007,46.6498602,0 7.4246771,46.6498896,0 7.4251484,46.6499459,0 7.4253315,46.6500443,0 7.4255354,46.6502947,0 7.4257357,46.6503853,0 7.4260182,46.6505967,0 7.4266793,46.6509836,0 7.4273938,46.6512898,0 7.4281961,46.6515467,0 7.4288057,46.6518341,0 7.4292046,46.651996,0 7.4295587,46.6520328,0 7.4304063,46.651996,0 7.4311573,46.6518634,0 7.4315614,46.6518511,0 7.4318761,46.6519076,0 7.43208,46.6520033,0 7.4321658,46.6522758,0 7.432075,46.6526151,0 7.4320207,46.6529228,0 7.4321229,46.653108,0 7.4324126,46.6532111,0 7.4327452,46.6532111,0 7.4334962,46.6530712,0 7.4344022,46.6528547,0 7.4347764,46.6526846,0 7.4352772,46.6526588,0 7.4357278,46.6528502,0 7.4359161,46.6531269,0 7.4360862,46.6535522,0 7.4362964,46.65422,0 7.4366183,46.6546692,0 7.4370898,46.65493,0 7.4379916,46.6552289,0 7.4383241,46.6552363,0 7.4390537,46.6550374,0 7.439912,46.6545956,0 7.4405665,46.6544483,0 7.4411887,46.6544925,0 7.4415144,46.6545737,0 7.4421865,46.6550301,0 7.4427015,46.6552142,0 7.443779,46.6555006,0 7.4441821,46.6557591,0 7.4444725,46.6561208,0 7.4447106,46.6568522,0 7.4448687,46.6572687,0 7.4451477,46.6575412,0 7.4455768,46.6576664,0 7.4461133,46.6577253,0 7.446639,46.6576885,0 7.4471003,46.6576148,0 7.4475617,46.6574455,0 7.4481947,46.6570846,0 7.4487204,46.6568269,0 7.4491174,46.6567754,0 7.4497182,46.6569153,0 7.450201,46.657092,0 7.4509535,46.6572605,0 7.451703,46.6574086,0 7.4520463,46.6575191,0 7.4523145,46.6577916,0 7.4524567,46.6580332,0 7.4525613,46.658712,0 7.4527222,46.6589035,0 7.4529583,46.6590066,0 7.4533016,46.6589698,0 7.4541814,46.6585353,0 7.4552232,46.6582471,0 7.4563289,46.658111,0 7.4575707,46.6578729,0 7.4586593,46.6577708,0 7.4589557,46.6578284,0 7.4594418,46.658094,0 7.4602924,46.6585193,0 7.460962,46.6587783,0 7.4616915,46.6588519,0 7.4625928,46.6588519,0 7.462979,46.6587415,0 7.4636435,46.6582471,0 7.4643409,46.658128,0 7.4651574,46.658128,0 7.466093,46.6581451,0 7.4670238,46.6580051,0 7.4677748,46.6578284,0 7.4683649,46.6574676,0 7.4688048,46.6571215,0 7.4691481,46.6570257,0 7.4698025,46.6570331,0 7.4706518,46.6573285,0 7.4711451,46.6577028,0 7.4717575,46.6579069,0 7.4720985,46.657902,0 7.472574,46.6577708,0 7.4738668,46.6574476,0 7.4742861,46.6574162,0 7.4747593,46.6574823,0 7.4753172,46.6577106,0 7.4755454,46.6578863,0 7.475755,46.6581621,0 7.4760038,46.6582187,0 7.4771518,46.6581671,0 7.4781603,46.6580419,0 7.4793298,46.658064,0 7.4802954,46.6583365,0 7.481379,46.6585574,0 7.4835247,46.6587709,0 7.4838788,46.6587488,0 7.4841577,46.6586163,0 7.4846935,46.6573897,0 7.4854345,46.6569374,0 7.4864537,46.6567754,0 7.4871403,46.6569815,0 7.4882347,46.6582187,0 7.4884493,46.6583733,0 7.4887926,46.6584248,0 7.4896509,46.6584101,0 7.4910671,46.6580861,0 7.4921614,46.6579609,0 7.4926013,46.6577474,0 7.4929333,46.6572719,0 7.4935179,46.6566448,0 7.494275,46.6558328,0 7.4947793,46.6555456,0 7.4952084,46.6556708,0 7.4961311,46.6568122,0 7.496292,46.6570625,0 7.496571,46.657092,0 7.4968815,46.6569184,0 7.4990861,46.6560537,0 7.4994249,46.656039,0 7.4998862,46.6561273,0 7.5016135,46.6567238,0 7.5019995,46.6567547,0 7.5024182,46.6566649,0 7.5027079,46.6565103,0 7.5034053,46.6551553,0 7.5038666,46.6549196,0 7.5043387,46.654927,0 7.5045854,46.6550522,0 7.5054759,46.6560463,0 7.5063557,46.656849,0 7.5068814,46.6570036,0 7.5079865,46.6569668,0 7.5084264,46.6567312,0 7.508877,46.655656,0 7.5091559,46.6554719,0 7.5100142,46.6554793,0 7.5118274,46.6558475,0 7.512396,46.655818,0 7.5129647,46.6555824,0 7.5148315,46.6543231,0 7.5151748,46.6541906,0 7.5160546,46.6543894,0 7.5170416,46.6549491,0 7.5182111,46.6553615,0 7.5187153,46.6553836,0 7.5191969,46.655285,0 7.5219876,46.6555677,0 7.5224275,46.6558622,0 7.5226313,46.6560242,0 7.5232,46.6566944,0 7.5233824,46.6567901,0 7.5238759,46.6568269,0 7.5243265,46.656768,0 7.5251412,46.656318,0 7.5255603,46.6561494,0 7.5259036,46.6561347,0 7.5261075,46.6562451,0 7.5263328,46.6565471,0 7.5264079,46.6568122,0 7.5264401,46.6573866,0 7.5265903,46.6577768,0 7.526998,46.6583144,0 7.5273306,46.6586237,0 7.5278563,46.658874,0 7.5285902,46.6589904,0 7.5291652,46.6590139,0 7.5300879,46.6589771,0 7.5313002,46.6588593,0 7.5321371,46.6586605,0 7.5332529,46.6583365,0 7.5339932,46.6582997,0 7.5349802,46.6583807,0 7.535675,46.6585294,0 7.5362033,46.6586016,0 7.5375236,46.6589473,0 7.5382789,46.6590238,0 7.5387461,46.6589845,0 7.5394863,46.6587341,0 7.5400127,46.6586291,0 7.5411714,46.6584995,0 7.5417379,46.6583405,0 7.5438579,46.6580047,0 7.5445396,46.6578873,0 7.545214,46.657716,0 7.5457977,46.6574274,0 7.5475283,46.6565588,0 7.5477583,46.6564513,0 7.547906,46.6564174,0 7.5481338,46.6564587,0 7.5483695,46.6565293,0 7.5486166,46.6567091,0 7.5495822,46.6572908,0 7.5505667,46.6577488,0 7.5511847,46.6579019,0 7.5522833,46.6581022,0 7.5537081,46.6582024,0 7.5552874,46.6582377,0 7.5565062,46.6583732,0 7.5580426,46.6587502,0 7.5598632,46.6591842,0 7.5612284,46.6593698,0 7.5628834,46.6595278,0 7.5646859,46.659734,0 7.565733,46.6600875,0 7.5669776,46.6607885,0 7.5672692,46.6609686,0 7.567561,46.6610981,0 7.5682734,46.6611099,0 7.5690632,46.6610594,0 7.570179,46.6608297,0 7.571621,46.6606471,0 7.573226,46.6605469,0 7.5741959,46.6603525,0 7.5747505,46.6602497,0 7.575552,46.6602524,0 7.5765393,46.6604319,0 7.5770308,46.6605957,0 7.5774575,46.6608356,0 7.5780154,46.6612951,0 7.579011,46.6621669,0 7.5799981,46.6625439,0 7.5809336,46.6626263,0 7.5824872,46.6625203,0 7.5834571,46.6623023,0 7.5850793,46.6618723,0 7.5859376,46.6618075,0 7.5869761,46.66189,0 7.5897999,46.6624202,0 7.5909189,46.6625818,0 7.5919832,46.6628881,0 7.5932191,46.6633947,0 7.595013,46.6643254,0 7.5968498,46.6652443,0 7.5988239,46.6661926,0 7.600283,46.6666284,0 7.6029438,46.6673411,0 7.6053384,46.6679242,0 7.6076301,46.6685309,0 7.6095527,46.6688784,0 7.6126083,46.6694556,0 7.6163934,46.6699916,0 7.6183847,46.6703273,0 7.6192687,46.6702802,0 7.6199627,46.6704663,0 7.6212429,46.6709928,0 7.6221355,46.6715464,0 7.6262226,46.6743988,0 7.6287174,46.6751778,0 7.6318073,46.6763556,0 7.6331806,46.6781223,0 7.6336956,46.6807133,0 7.6333277,46.6828388,0 7.6332934,46.6838751,0 7.6332076,46.6847583,0 7.6333792,46.6854944,0 7.6335595,46.6860596,0 7.6334222,46.6866484,0 7.6331818,46.6870075,0 7.6330359,46.6873549,0 7.6330874,46.6876846,0 7.6333449,46.6879202,0 7.6336196,46.6881027,0 7.6339972,46.6883735,0 7.634126,46.6885855,0 7.6341088,46.6888622,0 7.6339371,46.6890683,0 7.6334822,46.6894509,0 7.6331132,46.6898101,0 7.632993,46.6899867,0 7.6330188,46.6901869,0 7.6333277,46.6903694,0 7.633508,46.6905637,0 + + + + Simme + #style-Waterway_River + + relativeToGround + 7.4429173,46.4572666,0 7.4429683,46.4571225,0 + + + + Simme + #style-Waterway_River + + relativeToGround + 7.44395,46.4543877,0 7.443789,46.4545688,0 7.4436469,46.4548072,0 7.4435745,46.4550326,0 7.443494,46.4555186,0 7.443441,46.455818,0 7.443435,46.4561136,0 7.4433377,46.4564021,0 7.4429683,46.4571225,0 + + + + Simme + #style-Waterway_River + + relativeToGround + 7.4612723,46.4333085,0 7.45888,46.4355827,0 7.4579349,46.4367641,0 7.4560742,46.4384476,0 7.4554244,46.4400129,0 7.455212,46.4413715,0 7.4552472,46.4423757,0 7.4547003,46.4438428,0 7.4532036,46.4478792,0 7.4527959,46.449025,0 7.4522863,46.4494907,0 7.4515084,46.4499268,0 7.4496061,46.4508817,0 7.4446738,46.4539829,0 7.4442665,46.4542916,0 + + + + Simme + #style-Waterway_River + + relativeToGround + 7.4442665,46.4542916,0 7.4441377,46.4543619,0 7.44395,46.4543877,0 + + + + #style-Waterway_River + + relativeToGround + 7.5823262,46.3982278,0 7.5836565,46.3984054,0 7.5848002,46.398503,0 7.5847788,46.3978223,0 7.5848431,46.3973118,0 7.5854654,46.3969048,0 7.5862915,46.3966828,0 7.5870533,46.3968456,0 7.5876434,46.3967346,0 7.5876648,46.3963795,0 7.5874717,46.3958763,0 7.5879121,46.395537,0 7.5886701,46.3953454,0 7.5898039,46.395609,0 7.5912654,46.3960014,0 7.5926709,46.3963765,0 7.5938339,46.3967716,0 7.596617,46.3973843,0 7.5990921,46.3975722,0 7.6018644,46.3974561,0 7.6032688,46.3970143,0 7.6046692,46.3966843,0 7.604964,46.3966148,0 7.6054361,46.3970143,0 7.6058438,46.3969107,0 7.6060424,46.3968161,0 7.6062248,46.3969197,0 7.6063213,46.3968383,0 7.6065359,46.3968087,0 7.6066217,46.3971787,0 7.6065896,46.3975856,0 7.6067934,46.3979778,0 7.6070187,46.398111,0 7.6072118,46.3982368,0 7.6074801,46.3985697,0 7.6071796,46.3988657,0 7.6065896,46.3991838,0 7.6071475,46.3995834,0 7.607126,46.3998793,0 7.6074371,46.4002345,0 7.6079843,46.400634,0 7.6076624,46.4008856,0 7.6079628,46.4014997,0 7.6084349,46.4018252,0 7.6089177,46.4021877,0 7.6094542,46.4026908,0 7.6095722,46.4028758,0 7.6098404,46.4028166,0 7.6102588,46.4025872,0 7.6104841,46.4023653,0 7.6107416,46.4024763,0 7.6114228,46.4030059,0 7.6134008,46.4052111,0 + + + + Simme + #style-Waterway_River + + relativeToGround + 7.4145422,46.4951732,0 7.4142955,46.4947005,0 7.4144778,46.4943903,0 7.4168811,46.4925068,0 7.4176214,46.4915687,0 7.4179647,46.4914284,0 7.4194131,46.4914801,0 7.4201304,46.4912558,0 7.4213014,46.490638,0 7.4221978,46.4901039,0 7.4230395,46.4899437,0 7.4239108,46.4895723,0 7.4250036,46.4889521,0 7.4259192,46.4881251,0 7.4262736,46.4870323,0 7.4262441,46.4857623,0 7.4258601,46.4834291,0 7.4260078,46.4823658,0 7.4290744,46.4758704,0 7.4296701,46.4748344,0 7.4302313,46.4735644,0 7.4309696,46.4723831,0 7.4330075,46.4704042,0 7.4391299,46.4648035,0 7.4396745,46.4641251,0 7.4399642,46.4635893,0 7.4401198,46.4633971,0 7.4406526,46.4630362,0 7.4408064,46.4628318,0 7.4408874,46.4624093,0 7.4411605,46.4619376,0 7.4415682,46.4616087,0 7.4417291,46.461435,0 7.4419008,46.4611135,0 7.4420697,46.4603689,0 7.4420939,46.4601343,0 7.4419759,46.4596613,0 7.4420295,46.4592917,0 7.4422333,46.4591143,0 7.4428556,46.4588372,0 7.4429763,46.4587282,0 7.44303,46.4585914,0 7.4428717,46.4576509,0 7.4429173,46.4572666,0 + + + + #style-Waterway_River + + relativeToGround + 7.5848002,46.398503,0 7.5848152,46.3989973,0 7.5849719,46.3993465,0 7.5851104,46.3997361,0 + + + + #style-Waterway_River + + relativeToGround + 7.5926709,46.3963765,0 7.5940689,46.396307,0 7.5958359,46.3966059,0 7.5970139,46.3966103,0 7.5990503,46.3969699,0 7.6011746,46.3970535,0 7.6032688,46.3970143,0 + + + + #style-Waterway_River + + relativeToGround + 7.617414,46.3854152,0 7.6178217,46.3849933,0 + + + + #style-Waterway_River + + relativeToGround + 7.6190072,46.3886233,0 7.6193077,46.3883828,0 + + + + #style-Waterway_River + + relativeToGround + 7.6198816,46.3890377,0 7.620123,46.3887972,0 7.6201366,46.3881642,0 7.6199113,46.3874908,0 7.6200401,46.3867211,0 7.6205486,46.38637,0 + + + + #style-Waterway_River + + relativeToGround + 7.6181114,46.3727879,0 7.6185084,46.3726473,0 7.6190448,46.3726399,0 + + + + Engstlige + #style-Waterway_River + + relativeToGround + 7.5679163,46.4904384,0 7.5682865,46.490783,0 7.56887,46.4909814,0 7.5690784,46.4912436,0 7.5690856,46.4915223,0 7.569252,46.4918013,0 7.5692638,46.4922844,0 7.569386,46.4926358,0 7.5694157,46.4934985,0 7.5699636,46.4939489,0 7.5700405,46.4942176,0 7.5699498,46.4946884,0 7.5705973,46.4953414,0 7.5713722,46.4959515,0 7.5716743,46.4961181,0 7.5720713,46.4967711,0 7.5722066,46.4968701,0 7.5723745,46.4969336,0 7.572558,46.4968807,0 7.5730315,46.4969189,0 7.5734753,46.4969547,0 7.5740499,46.4971762,0 7.575296,46.4973752,0 7.5758975,46.4976559,0 7.5763149,46.4979143,0 7.5764972,46.4981977,0 7.5766154,46.4986548,0 7.5766651,46.4991564,0 7.5767911,46.4994885,0 7.5767477,46.499635,0 7.5768027,46.4998829,0 7.577038,46.5002692,0 7.5771766,46.5006686,0 7.5773397,46.5008466,0 7.5775215,46.500978,0 7.5784139,46.501225,0 7.5791897,46.5017317,0 7.580061,46.5017524,0 7.5802143,46.50181,0 7.5804344,46.5018927,0 7.58069,46.5022649,0 7.5808113,46.5028054,0 7.5807013,46.5029565,0 7.580053,46.5034856,0 7.5801763,46.5037025,0 7.5808618,46.504245,0 7.5813645,46.5047991,0 7.5821249,46.505979,0 7.5824844,46.5066477,0 7.582539,46.5071021,0 7.5824704,46.5074207,0 7.5824319,46.5083621,0 7.5825869,46.5090491,0 7.5825806,46.5095171,0 7.5820257,46.5098178,0 7.5819193,46.5106443,0 7.5818162,46.5109854,0 7.5821224,46.5116504,0 7.5829228,46.5126941,0 7.583598,46.5135612,0 7.5842966,46.5165233,0 7.5844909,46.5173472,0 7.5846293,46.517583,0 7.5848776,46.5177875,0 7.5856085,46.5179936,0 7.5860292,46.518225,0 7.5864387,46.5183726,0 7.5865335,46.5185698,0 7.5872008,46.5186978,0 7.5875705,46.5195246,0 7.5882623,46.5204856,0 7.5886196,46.5208262,0 7.5889364,46.5211571,0 7.5890967,46.5217219,0 7.5888244,46.5220523,0 7.5891101,46.5228483,0 7.5911672,46.5254435,0 7.593835,46.5287145,0 7.5952076,46.5310701,0 7.5969656,46.5334405,0 7.5980018,46.5343057,0 7.5984988,46.5361517,0 7.598946,46.5370064,0 7.5995921,46.5370064,0 7.6006357,46.5372799,0 7.6007848,46.5385447,0 7.6022785,46.5401947,0 + + + + + Waterway_Stream + + + #style-Waterway_Stream + + relativeToGround + 7.4482603,46.4605075,0 7.4479974,46.4601472,0 7.4477238,46.4599273,0 7.4475369,46.4598635,0 7.4465542,46.459732,0 7.4454239,46.4596948,0 7.4441592,46.4598904,0 7.4427902,46.4601787,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.4427902,46.4601787,0 7.4422655,46.4603116,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.4422655,46.4603116,0 7.4420697,46.4603689,0 + + + + Tschentbach + #style-Waterway_Stream + + relativeToGround + 7.5498993,46.5131535,0 7.5516111,46.512984,0 7.5534331,46.5128769,0 7.5551428,46.5130268,0 7.556419,46.5133488,0 7.5568307,46.5137849,0 7.5571667,46.5138959,0 7.5583266,46.514089,0 7.5589673,46.5141025,0 7.5609632,46.5138736,0 7.5615361,46.5137486,0 7.5622618,46.5133878,0 7.5633041,46.5130869,0 7.5638865,46.5131159,0 7.5649706,46.5131294,0 7.565441,46.5131179,0 7.5657838,46.5130325,0 7.5664322,46.5130568,0 7.5671807,46.5131231,0 7.5683759,46.5133121,0 7.569028,46.5133944,0 7.5696122,46.5135692,0 7.5704753,46.5137527,0 7.5714119,46.5135382,0 7.5726887,46.5133277,0 7.573583,46.513235,0 7.574029,46.513337,0 7.574712,46.51333,0 7.574925,46.513248,0 7.577474,46.513801,0 7.577839,46.514218,0 7.578268,46.514264,0 7.57838,46.514375,0 7.578653,46.514452,0 7.578728,46.51488,0 7.5793375,46.5154736,0 7.5796094,46.5155709,0 + + + + Tschentbach + #style-Waterway_Stream + + relativeToGround + 7.5796094,46.5155709,0 7.5798811,46.5155784,0 7.5804693,46.5157084,0 7.5808291,46.5159788,0 7.581439,46.5159571,0 7.5819875,46.5161131,0 7.5828673,46.5159575,0 7.5835048,46.5163951,0 7.5840989,46.5164935,0 7.5842966,46.5165233,0 + + + + Bonderlenbach + #style-Waterway_Stream + + relativeToGround + 7.5950493,46.4758228,0 7.5907678,46.4813085,0 7.5897696,46.4824297,0 7.5889451,46.4849235,0 7.588016,46.4856619,0 7.5871102,46.4859308,0 7.5866819,46.4864895,0 7.5847333,46.4880633,0 7.5834673,46.4887214,0 7.5817525,46.4898969,0 7.5814474,46.4901303,0 7.5810387,46.490633,0 7.5801554,46.4913069,0 7.5799536,46.4916604,0 7.5792927,46.4922356,0 7.5790885,46.4927514,0 7.5784129,46.4935776,0 7.5784782,46.494305,0 7.578291,46.4948469,0 7.5783849,46.4950906,0 7.5778436,46.4955583,0 7.5771013,46.4959518,0 7.576988,46.4961764,0 7.5767947,46.496307,0 7.5767531,46.496691,0 7.5765765,46.4969136,0 7.5759942,46.4969659,0 7.5759141,46.4970779,0 7.576244,46.4975421,0 7.5763149,46.4979143,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5864107,46.5038145,0 7.5849124,46.5043821,0 7.5842642,46.5051023,0 7.5834123,46.505664,0 7.582847,46.5058125,0 7.5826781,46.5057472,0 7.5823863,46.5057664,0 7.5821249,46.505979,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5901733,46.4963584,0 7.5878156,46.4992787,0 7.5872543,46.4997632,0 7.5868956,46.5001347,0 7.5862173,46.5005062,0 7.5854443,46.5007068,0 7.5845889,46.5007134,0 7.5841943,46.5006119,0 7.5836448,46.5004516,0 7.5831399,46.5005241,0 7.5821281,46.5010073,0 7.5802143,46.50181,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.6031924,46.5097266,0 7.5935129,46.513263,0 7.5907758,46.5139709,0 7.5894533,46.5145143,0 7.5885612,46.5149031,0 7.5883184,46.5153558,0 7.5880954,46.5157955,0 7.586282,46.5170016,0 7.5857963,46.5175161,0 7.5856085,46.5179936,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.627585,46.5698201,0 7.6274104,46.5701313,0 7.6247923,46.57119,0 7.6243015,46.5713244,0 7.6229993,46.5714951,0 7.6219771,46.5717669,0 7.6195533,46.5723564,0 7.618023,46.5727097,0 7.6164988,46.5733015,0 7.6160679,46.5736132,0 7.615965,46.573772,0 7.6158862,46.574073,0 7.6158473,46.5742219,0 7.6155516,46.5747077,0 7.6118253,46.5770347,0 7.6101343,46.5797527,0 7.6049675,46.5845394,0 7.6009691,46.5902559,0 + + + + Krummenbach + #style-Waterway_Stream + + relativeToGround + 7.4345353,46.4542156,0 7.4375443,46.4530688,0 7.4379198,46.4525218,0 7.4388861,46.4520338,0 + + + + Krummenbach + #style-Waterway_Stream + + relativeToGround + 7.4388861,46.4520338,0 7.4394596,46.4521561,0 + + + + Krummenbach + #style-Waterway_Stream + + relativeToGround + 7.4394596,46.4521561,0 7.440223,46.4521175,0 7.4411836,46.4522683,0 7.4419013,46.4524977,0 7.442767,46.4530941,0 7.4435144,46.4537976,0 7.4438251,46.4541901,0 7.44395,46.4543877,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.6043384,46.5489316,0 7.6036134,46.5492848,0 7.6020999,46.5497933,0 7.6016803,46.5498747,0 7.6010186,46.5501518,0 7.5938758,46.5534441,0 7.5928254,46.5539036,0 7.5921917,46.5543492,0 7.5913683,46.5548097,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.6097828,46.554791,0 7.6092077,46.5550334,0 7.6083698,46.555712,0 7.6069001,46.556455,0 7.6046978,46.5571409,0 7.6034027,46.5574888,0 7.6029575,46.5586298,0 7.6021076,46.559089,0 7.6011565,46.5596316,0 7.5990811,46.560389,0 7.5971888,46.5607735,0 7.5962684,46.5607439,0 7.5949954,46.5611342,0 7.5936106,46.5614773,0 7.592888,46.5622047,0 + + + + Engstlige + #style-Waterway_Stream + + relativeToGround + 7.5694288,46.4386699,0 7.5689025,46.4392606,0 7.568774,46.43946,0 7.568331,46.439699,0 7.567927,46.44015,0 7.567747,46.440192,0 7.567521,46.44046,0 7.5667949,46.4408454,0 7.5660904,46.4414907,0 7.565442,46.441646,0 7.5644443,46.4421245,0 7.5642466,46.4424135,0 7.56422,46.442644,0 7.5632839,46.443386,0 7.5615746,46.4449583,0 7.5621347,46.4456216,0 7.5626654,46.4466302,0 7.5627503,46.4485911,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5684827,46.4381903,0 7.568705,46.4386855,0 7.5687017,46.4389496,0 7.5689025,46.4392606,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5646506,46.4447386,0 7.5645313,46.4447993,0 7.5644484,46.4450193,0 7.5640955,46.4450566,0 7.5638276,46.4451873,0 + + + + Engstligfall + #style-Waterway_Stream + + relativeToGround + 7.5627503,46.4485911,0 7.5629257,46.4519973,0 7.5622285,46.4525302,0 7.5607905,46.4537849,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5620068,46.5282186,0 7.5616241,46.5285431,0 7.5612987,46.5290602,0 7.5610529,46.5299302,0 7.5611554,46.5308279,0 7.5614905,46.5326035,0 + + + + Otterbach + #style-Waterway_Stream + + relativeToGround + 7.5888244,46.5220523,0 7.5871462,46.521574,0 7.5861579,46.5215056,0 7.5848115,46.5211241,0 7.5830923,46.5211693,0 7.580815,46.522144,0 7.5765962,46.5222701,0 7.5744876,46.5222718,0 7.5650623,46.5253673,0 7.5641575,46.5257686,0 7.5630746,46.526248,0 7.562304,46.5273981,0 7.5621005,46.5277942,0 7.5620068,46.5282186,0 7.5620048,46.5291866,0 7.5623207,46.5299472,0 7.5624241,46.5306152,0 7.5627651,46.5313534,0 7.5628991,46.531972,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.6030484,46.5615227,0 7.6049878,46.5605166,0 7.6063117,46.5602212,0 7.6087389,46.5599177,0 7.6107247,46.5592709,0 7.6120968,46.5587128,0 7.6127925,46.5583692,0 7.6139269,46.5579905,0 7.6150274,46.5575363,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5897984,46.5505716,0 7.590784,46.549945,0 7.5924214,46.5492396,0 7.5962237,46.5481799,0 7.5984549,46.547619,0 7.5998111,46.5476291,0 7.602103,46.5468677,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.6025091,46.540512,0 7.6004436,46.5410848,0 7.5997811,46.5413145,0 7.5993888,46.5415236,0 7.5987378,46.5417055,0 7.5981278,46.5415615,0 7.5960941,46.5413591,0 7.5895257,46.5433921,0 7.5862162,46.545057,0 7.5845458,46.5461244,0 7.5839739,46.5467957,0 + + + + Bettbach + #style-Waterway_Stream + + relativeToGround + 7.5952076,46.5310701,0 7.5933564,46.5308251,0 7.5920313,46.5309442,0 7.5907951,46.5309688,0 7.5893698,46.5311437,0 7.5871115,46.5320641,0 7.5840636,46.5327994,0 7.5808357,46.5338491,0 7.5792828,46.5348533,0 7.5769635,46.5361725,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5632368,46.463919,0 7.5643968,46.463232,0 7.5657493,46.4626938,0 7.5683745,46.4623092,0 7.5707137,46.4620696,0 7.5751947,46.4618406,0 7.5771588,46.4618878,0 7.5796521,46.4627464,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.563575,46.4676896,0 7.564838,46.4677747,0 7.5668754,46.4675639,0 7.5702666,46.4666669,0 7.572771,46.4663288,0 7.5792436,46.4665687,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.563948,46.4668286,0 7.5654428,46.4666022,0 7.5697357,46.466088,0 7.5727472,46.4655845,0 7.5754053,46.4654321,0 + + + + Waleggbach + #style-Waterway_Stream + + relativeToGround + 7.4408874,46.4624093,0 7.4405704,46.4620447,0 7.4382377,46.4605186,0 7.4374644,46.459883,0 7.4365609,46.459575,0 7.4343172,46.4589405,0 7.4305385,46.4591194,0 7.4286491,46.4587615,0 7.4281059,46.4584361,0 7.4259568,46.4575088,0 7.4244689,46.4571508,0 7.4239493,46.457281,0 7.423477,46.4564838,0 7.4226976,46.4560282,0 7.4220836,46.4550682,0 7.4213514,46.4545313,0 7.420265,46.4548567,0 7.4199816,46.4538642,0 7.419155,46.4534249,0 7.4176945,46.4527747,0 7.4167971,46.4523029,0 7.4148841,46.4518961,0 7.4140103,46.4511639,0 7.413042,46.4502852,0 7.4125224,46.4500086,0 7.4107747,46.4495204,0 7.4101843,46.4483651,0 7.4091451,46.4472911,0 7.4072085,46.4462659,0 7.406193,46.4454523,0 7.4056498,46.4437435,0 7.4055789,46.4422301,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.455212,46.4413715,0 7.4541445,46.440869,0 7.4523968,46.4403156,0 7.4508381,46.4397623,0 7.4500823,46.4393554,0 7.4491849,46.4388834,0 7.4487125,46.4384277,0 7.4484055,46.4379557,0 7.4480512,46.4371582,0 7.4469176,46.436377,0 7.4457368,46.4358887,0 7.4445087,46.4352702,0 7.4440363,46.4346517,0 7.4439891,46.4340983,0 7.443871,46.4334961,0 7.4439419,46.433138,0 7.4434931,46.4326659,0 7.4430916,46.4320474,0 7.4427846,46.4316567,0 7.441651,46.4311359,0 7.4410369,46.4310056,0 7.4406354,46.4303057,0 7.4403284,46.4296709,0 7.4401867,46.4286616,0 7.4390295,46.4272779,0 7.4383682,46.4258942,0 7.4383446,46.4252919,0 7.4383588,46.4234132,0 7.4379809,46.4229704,0 7.4379809,46.4224234,0 7.4383965,46.4222671,0 7.4385477,46.4220197,0 7.4394546,46.4209517,0 7.439572,46.4205138,0 7.439024,46.419662,0 + + + + Gilsbach + #style-Waterway_Stream + + relativeToGround + 7.5444891,46.4838255,0 7.5441715,46.4835228,0 7.543632,46.4826983,0 7.5431692,46.482315,0 7.5427131,46.4818558,0 7.5424228,46.4811668,0 7.5418523,46.4805595,0 7.5414058,46.4804053,0 7.5410234,46.4801636,0 7.5404661,46.4792391,0 7.5401919,46.478841,0 7.5391844,46.4774431,0 7.5389666,46.4766853,0 7.5386024,46.4761968,0 7.5383865,46.4757296,0 7.5376236,46.4739031,0 7.537638,46.4735448,0 7.5382409,46.4729685,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5579549,46.4702079,0 7.5585842,46.4702669,0 7.5596437,46.4708957,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5610883,46.4713922,0 7.5596437,46.4708957,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.6113718,46.5266965,0 7.610492,46.5267482,0 7.6098322,46.5271948,0 7.6091348,46.5277705,0 7.6084374,46.5283758,0 7.6074933,46.5287818,0 7.6072465,46.5290438,0 7.606989,46.5291951,0 7.6063078,46.5294461,0 7.6059752,46.5295568,0 7.6051061,46.5297709,0 7.6038991,46.5300772,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.6011565,46.5596316,0 7.600767,46.5601643,0 7.6003628,46.5608149,0 7.6000703,46.5616961,0 7.5995972,46.5624472,0 7.5990811,46.5628907,0 7.5982726,46.5633757,0 7.5976963,46.5635176,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5622868,46.4987922,0 7.563293,46.498268,0 7.5640554,46.4980879,0 7.5649734,46.4979027,0 7.5661467,46.4975824,0 7.5672189,46.4974246,0 7.5679539,46.4973689,0 7.5684799,46.4974478,0 7.5689384,46.4976242,0 7.5694981,46.4977727,0 7.570604,46.4978563,0 7.5716963,46.4978702,0 7.5722763,46.4977959,0 7.5730315,46.4969189,0 + + + + Allebach + #style-Waterway_Stream + + relativeToGround + 7.5396772,46.4842367,0 7.5411265,46.4838022,0 7.5436247,46.4837589,0 7.5442613,46.4839194,0 7.5444006,46.4838783,0 7.5444891,46.4838255,0 7.5460021,46.483802,0 7.5486107,46.4844951,0 7.5496668,46.4846853,0 7.5502713,46.4849285,0 7.550623,46.485323,0 7.5523906,46.4863698,0 7.5529233,46.4865507,0 7.5537024,46.4865959,0 7.5547532,46.4867557,0 7.5592633,46.4879144,0 7.5604607,46.4882109,0 7.562318,46.4882312,0 7.5628498,46.4883362,0 7.5651569,46.489581,0 7.5658291,46.4897725,0 7.5665939,46.4899418,0 7.5669049,46.4901147,0 7.5679163,46.4904384,0 + + + + Engstlige + #style-Waterway_Stream + + relativeToGround + 7.5607905,46.4537849,0 7.5604924,46.4541209,0 7.560399,46.454507,0 7.5606654,46.4568691,0 7.5619095,46.4595042,0 7.5625295,46.4614662,0 7.5626063,46.4627988,0 7.5632368,46.463919,0 7.5637327,46.4648,0 7.5640365,46.4664917,0 7.563948,46.4668286,0 7.5639095,46.4669753,0 7.563575,46.4676896,0 7.5632036,46.4684826,0 7.562787,46.4697544,0 7.5623296,46.4703181,0 7.5619262,46.4705013,0 7.5613885,46.4709202,0 7.56112,46.4712946,0 7.5610883,46.4713922,0 7.5611153,46.4716139,0 7.5613631,46.4719076,0 7.5611917,46.4726986,0 7.5615884,46.4733249,0 7.5611864,46.473944,0 7.5617112,46.4743256,0 7.5618499,46.4745876,0 7.5617554,46.4755833,0 7.56195,46.4759029,0 7.5620659,46.4763197,0 7.5621603,46.4764219,0 7.5627234,46.4765325,0 7.5628681,46.4766962,0 7.5627775,46.4768782,0 7.5625288,46.4770123,0 7.5622246,46.4773669,0 7.5622322,46.4775806,0 7.5623728,46.4776887,0 7.5625066,46.4781258,0 7.5619567,46.4786796,0 7.5618736,46.4788606,0 7.5619391,46.4792018,0 7.5622445,46.4793954,0 7.5628111,46.4795891,0 7.5629037,46.4797214,0 7.563056,46.4804239,0 7.5635031,46.4807911,0 7.5635066,46.4809088,0 7.563095,46.4814951,0 7.563097,46.4816769,0 7.5636883,46.4820501,0 7.5639504,46.4823962,0 7.5638459,46.4826554,0 7.563501,46.4830543,0 7.5635042,46.4831882,0 7.5639195,46.4834569,0 7.5640923,46.4836871,0 7.5642456,46.4841074,0 7.5642177,46.4843665,0 7.5634591,46.4851604,0 7.5636818,46.4857398,0 7.5649601,46.4874304,0 7.5661911,46.4879853,0 7.5665395,46.4886838,0 7.5676235,46.489324,0 7.5679163,46.4904384,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5962122,46.5089224,0 7.5886622,46.5110814,0 7.5869149,46.5114364,0 7.5829228,46.5126941,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.5641575,46.5257686,0 7.5613671,46.5258087,0 7.5604396,46.5259298,0 7.5596879,46.5260952,0 7.5590727,46.5263174,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.4458894,46.38078,0 7.445546,46.3804839,0 7.4447092,46.3800546,0 7.4438509,46.379951,0 7.4439796,46.3802767,0 7.4442371,46.3809132,0 7.4443659,46.3813425,0 + + + + #style-Waterway_Stream + + relativeToGround + 7.4452456,46.3812536,0 7.4444517,46.3803803,0 7.4438509,46.379951,0 7.4431428,46.3797808,0 7.4419411,46.3796031,0 7.4409755,46.3796993,0 7.4399348,46.3796919,0 7.4392482,46.3795143,0 7.4387225,46.3794773,0 7.4384221,46.3795365,0 7.4379286,46.379766,0 7.4372848,46.3803581,0 7.4369522,46.3810612,0 + + + + Schmittenbach + #style-Waterway_Stream + + relativeToGround + 7.561025,46.4950847,0 7.5620763,46.4944701,0 7.562971,46.4940767,0 7.5634598,46.4938949,0 7.564526,46.4932355,0 7.5657085,46.4926575,0 7.5662682,46.492473,0 7.5667333,46.4923318,0 7.5674467,46.4921962,0 7.5692638,46.4922844,0 + + + + + Waterway_Canal + + + + Waterway_Drain + + + + + Railways + + Railway_Rail_Casing + + + + Railway_Rail_Core + + + + Railway_Lightrail + + + + Railway_Tram + + + + + Natural_Features + + Cliff + + + + + Roads + + Core + + Motorway + + + + Motorway_Link + + + + Trunk + + + + Trunk_Link + + + + Primary + + + + Primary_Link + + + + Secondary + + + Lenkstrasse + #style-Secondary + + relativeToGround + 7.4421289,46.4613278,1 7.4424372,46.4608567,1 7.4425659,46.4606405,1 7.4426223,46.4604964,1 7.4426893,46.4602414,1 + + + + Lenkstrasse + #style-Secondary + + relativeToGround + 7.4323137,46.4764918,1 7.4336701,46.4747049,1 7.4348985,46.4732419,1 7.4359588,46.472141,1 7.4370811,46.4707552,1 7.4377578,46.4699427,1 7.4380689,46.469466,1 7.4384373,46.46873,1 7.4387197,46.4681415,1 7.4387985,46.4679364,1 7.4388238,46.4677498,1 7.4388285,46.4674118,1 7.4388628,46.4671901,1 7.4389654,46.4669807,1 7.4390935,46.4668317,1 7.4398408,46.466209,1 7.4400461,46.4659856,1 7.4402163,46.4657472,1 7.4403488,46.4655089,1 7.4404453,46.465217,1 7.4406961,46.4643705,1 7.4409781,46.4635043,1 7.441073,46.463266,1 7.4411695,46.4631071,1 7.441316,46.4629389,1 7.4414914,46.4626895,1 7.4416374,46.4622146,1 7.4419152,46.461629,1 7.4421289,46.4613278,1 + + + + Lenkstrasse + #style-Secondary + + relativeToGround + 7.4245844,46.4920082,1 7.4262126,46.4909139,1 7.4265951,46.4906478,1 7.4269109,46.4904109,1 7.4271226,46.4901976,1 7.4272528,46.4900189,1 7.4272987,46.4897359,1 7.4273256,46.4892013,1 7.4274383,46.4887803,1 7.427669,46.4881746,1 7.427858,46.4877541,1 7.4279747,46.4875615,1 7.4281029,46.4874142,1 7.4283818,46.4871409,1 7.4290041,46.4866386,1 7.4293903,46.4862988,1 7.4296806,46.4859289,1 7.4299413,46.4854299,1 7.430212,46.4846591,1 7.4303388,46.4844164,1 7.4305926,46.4840341,1 7.4306993,46.4837871,1 7.4307522,46.4836178,1 7.4307733,46.4833785,1 7.4307207,46.4828415,1 7.4307529,46.4824647,1 7.4309246,46.4821397,1 7.4312142,46.4817777,1 7.4313475,46.481483,1 7.4313859,46.4806991,1 7.431493,46.4804403,1 7.431579,46.4802927,1 7.4316738,46.4801621,1 7.4318371,46.4798194,1 7.4318258,46.4795687,1 7.4317788,46.479296,1 7.4315224,46.4785956,1 7.4314932,46.4783644,1 7.4315213,46.4780594,1 7.4315726,46.477845,1 7.431653,46.4776233,1 7.4318747,46.4771523,1 7.4323137,46.4764918,1 + + + + Lenkstrasse + #style-Secondary + + relativeToGround + 7.4191059,46.4991161,1 7.4194662,46.4987815,1 7.4197451,46.4984344,1 7.4198288,46.4982833,1 7.4198964,46.4981614,1 7.4200241,46.4977476,1 7.4201298,46.4970122,1 7.4203128,46.4962737,1 7.4204663,46.4959279,1 7.4206823,46.4955804,1 7.4210493,46.4951362,1 + + + + Lenkstrasse + #style-Secondary + + relativeToGround + 7.421178,46.4949811,1 7.42196,46.4940534,1 7.4224211,46.4935642,1 7.4227418,46.4933061,1 7.4230877,46.4930497,1 7.4245844,46.4920082,1 + + + + Lenkstrasse + #style-Secondary + + relativeToGround + 7.4210493,46.4951362,1 7.421178,46.4949811,1 + + + + Lenkstrasse + #style-Secondary + + relativeToGround + 7.442705,46.4601691,1 7.4427198,46.4601214,1 7.4427644,46.4599513,1 7.4428057,46.4598036,1 7.442913,46.4596483,1 7.4430721,46.4594012,1 7.4431497,46.4591692,1 7.443156,46.4590737,1 7.4431495,46.4589587,1 7.442987,46.4576685,1 7.4429961,46.4574482,1 7.4430461,46.4572518,1 7.4430622,46.4571982,1 + + + + Lenkstrasse + #style-Secondary + + relativeToGround + 7.4426893,46.4602414,1 7.442705,46.4601691,1 + + + + Landstrasse (223.1) + #style-Secondary + + relativeToGround + 7.5690779,46.4942399,1 7.5692844,46.4945619,1 7.5698423,46.4953005,1 7.5709768,46.4961208,1 7.5713873,46.4963345,1 7.5716754,46.4967489,1 7.5721169,46.4972208,1 7.5741339,46.4978412,1 7.5749927,46.4993482,1 7.5753145,46.5003082,1 7.5763776,46.5014193,1 7.5765386,46.5015899,1 7.5769888,46.501843,1 7.5784191,46.501918,1 7.5789112,46.5019253,1 7.5796023,46.5019527,1 7.5798635,46.5020363,1 7.5800494,46.5021673,1 7.580325,46.5027273,1 7.5803532,46.5027703,1 + + + + Adelbodenstrasse (223.1) + #style-Secondary + + relativeToGround + 7.6122594,46.5585364,1 7.6122192,46.5585079,1 7.610827,46.5573928,1 7.6094322,46.5564928,1 7.6086383,46.5555632,1 7.6077585,46.5551205,1 7.6058702,46.5535859,1 7.6048832,46.5526563,1 7.6046901,46.5520365,1 7.6040249,46.5516086,1 7.6028571,46.5505041,1 7.6026829,46.5500915,1 7.6025506,46.5498156,1 7.6025022,46.5497569,1 + + + + Adelbodenstrasse + #style-Secondary + + relativeToGround + 7.6025022,46.5497569,1 7.6023929,46.5496256,1 + + + + Adelbodenstrasse + #style-Secondary + + relativeToGround + 7.612416,46.5586345,1 7.6122594,46.5585364,1 + + + + Adelbodenstrasse + #style-Secondary + + relativeToGround + 7.6001154,46.5474612,1 7.6002652,46.547606,1 + + + + Adelbodenstrasse (223.1) + #style-Secondary + + relativeToGround + 7.6246335,46.5705545,1 7.6246247,46.5705495,1 7.6242166,46.5702873,1 7.6233582,46.5694317,1 7.6227574,46.5683549,1 7.6224141,46.5680303,1 7.6221411,46.5675483,1 7.6218995,46.5671196,1 7.6216416,46.5666731,1 7.6211267,46.5661273,1 7.6204829,46.5648438,1 7.6191955,46.5639734,1 7.6182728,46.5626161,1 7.6179588,46.5615664,1 7.6178013,46.5612694,1 7.6174972,46.56112,1 7.6168363,46.5609385,1 7.6157193,46.560403,1 7.6145821,46.5600341,1 7.6137452,46.5592522,1 7.612416,46.5586345,1 + + + + Adelbodenstrasse (223.1) + #style-Secondary + + relativeToGround + 7.6023929,46.5496256,1 7.6020079,46.5491442,1 7.6007848,46.5481112,1 7.6002652,46.547606,1 + + + + Adelbodenstrasse (223.1) + #style-Secondary + + relativeToGround + 7.6001154,46.5474612,1 7.5998406,46.5471962,1 7.599669,46.5467387,1 7.5997977,46.5460599,1 7.6002483,46.5451891,1 + + + + Adelbodenstrasse + #style-Secondary + + relativeToGround + 7.5917717,46.5267057,1 7.5923442,46.5260517,1 + + + + Adelbodenstrasse + #style-Secondary + + relativeToGround + 7.592227,46.5309052,1 7.5922718,46.5309677,1 + + + + Adelbodenstrasse (223.1) + #style-Secondary + + relativeToGround + 7.5987934,46.5407011,1 7.5987112,46.5396482,1 7.5984459,46.5390659,1 7.5987605,46.5380854,1 7.5981669,46.5376949,1 7.5979738,46.5372669,1 7.5975232,46.5369126,1 7.5972013,46.5362041,1 7.5967401,46.5358949,1 7.5963645,46.5355251,1 7.596107,46.5352151,1 7.5959139,46.5346099,1 7.5954367,46.534118,1 7.5951966,46.5330623,1 7.5942831,46.5321152,1 7.5939398,46.5315985,1 7.5936058,46.5312116,1 7.5932888,46.5311187,1 7.5926021,46.5311329,1 7.5924089,46.5310813,1 7.5923789,46.5310671,1 7.5922718,46.5309677,1 + + + + Adelbodenstrasse + #style-Secondary + + relativeToGround + 7.5923442,46.5260517,1 7.5925689,46.5257627,1 7.5928454,46.5253974,1 7.5927869,46.5248461,1 + + + + Adelbodenstrasse (223.1) + #style-Secondary + + relativeToGround + 7.5987934,46.5407011,1 7.5990252,46.5417356,1 7.5997548,46.5427687,1 7.600656,46.5435067,1 7.6005487,46.5442594,1 7.6002483,46.5451891,1 + + + + Adelbodenstrasse (223.1) + #style-Secondary + + relativeToGround + 7.592227,46.5309052,1 7.5922401,46.5306523,1 7.5928025,46.5295318,1 7.5927596,46.5290299,1 7.5926159,46.5287063,1 7.5920786,46.5277859,1 7.5917134,46.5271711,1 7.5916653,46.5270074,1 7.5917717,46.5267057,1 + + + + Landstrasse (223.1) + #style-Secondary + + relativeToGround + 7.5597987,46.4888045,1 7.5599098,46.488794,1 7.5600095,46.4888091,1 7.5600873,46.4888392,1 7.5604036,46.4890905,1 7.5605568,46.4891692,1 7.5607125,46.4892161,1 7.5615168,46.4893029,1 7.5626755,46.4897461,1 7.5641775,46.4897756,1 7.5658886,46.4903417,1 7.5659944,46.4903674,1 7.5670612,46.490656,1 7.5674115,46.490768,1 7.5677132,46.4909027,1 7.5688982,46.4924052,1 7.568897,46.4933261,1 7.5688982,46.4937051,1 7.5690779,46.4942399,1 + + + + Landstrasse + #style-Secondary + + relativeToGround + 7.5807143,46.5031184,1 7.5803532,46.5027703,1 + + + + Landstrasse (223.1) + #style-Secondary + + relativeToGround + 7.5597987,46.4888045,1 7.5597424,46.4888794,1 7.5597289,46.4889654,1 7.5598431,46.4891256,1 7.5604219,46.4895759,1 7.5610442,46.4898123,1 7.5618596,46.4904771,1 7.5619481,46.4908394,1 7.5619716,46.4909369,1 7.5620328,46.4912044,1 7.5620419,46.4912371,1 7.5621386,46.4916589,1 7.5623751,46.4918667,1 7.5633831,46.4927964,1 7.5633791,46.492965,1 7.5633139,46.4930204,1 7.5632271,46.4930606,1 7.5631435,46.493056,1 7.5625349,46.4929938,1 7.5615826,46.4930937,1 7.5609767,46.4931868,1 7.5597217,46.4932641,1 + + + + Landstrasse (223.1) + #style-Secondary + + relativeToGround + 7.5927869,46.5248461,1 7.5922439,46.524217,1 7.5915151,46.5232566,1 7.5901418,46.5224298,1 7.5896053,46.5219869,1 7.589224,46.5211243,1 7.5890023,46.5205153,1 7.5882535,46.5188272,1 7.5879102,46.5182808,1 7.5872235,46.5177345,1 7.5870469,46.5174702,1 7.587009,46.517011,1 7.5876833,46.5164516,1 7.5880389,46.5161546,1 7.5880818,46.5159478,1 7.5878243,46.5158445,1 7.5868373,46.5160955,1 7.5864725,46.5160512,1 7.5863867,46.5158592,1 7.5868373,46.5151357,1 7.5868587,46.5144269,1 7.5861506,46.5135852,1 7.5858073,46.5129798,1 7.5856571,46.5122562,1 7.5853231,46.5118698,1 7.5849493,46.5116193,1 7.5849029,46.5115884,1 7.5845033,46.511303,1 7.5837259,46.5103807,1 7.5835972,46.5099525,1 7.5837819,46.5092432,1 7.5837688,46.5089696,1 7.5834684,46.5083132,1 7.5833721,46.5079092,1 7.5833611,46.5074862,1 7.5835114,46.5066296,1 7.5834554,46.5063745,1 7.5833344,46.5060923,1 7.5823956,46.5048989,1 7.5819422,46.5041172,1 7.5814943,46.503661,1 7.5808419,46.5032417,1 7.5807143,46.5031184,1 + + + + + Unclassified + + + Schlegelistrasse + #style-Unclassified + + relativeToGround + 7.5650662,46.4957333,1 7.5647157,46.4954991,1 7.5643603,46.4953787,1 7.5628576,46.4946658,1 7.5626535,46.4945986,1 7.5617886,46.4948002,1 7.561591,46.494845,1 7.5614673,46.4947425,1 7.5615188,46.494565,1 7.5617978,46.4943139,1 7.5617449,46.4941344,1 7.5613391,46.4939717,1 7.5598323,46.4933677,1 7.5597217,46.4932641,1 + + + + Ruheweg + #style-Unclassified + + relativeToGround + 7.5628576,46.4946658,1 7.5631584,46.4945553,1 7.5636005,46.4947211,1 + + + + Dorfstrasse + #style-Unclassified + + relativeToGround + 7.5597217,46.4932641,1 7.5595144,46.4930964,1 + + + + Sunneweg + #style-Unclassified + + relativeToGround + 7.5589173,46.4942818,1 7.5592854,46.4947564,1 + + + + Haltenstrasse + #style-Unclassified + + relativeToGround + 7.5580946,46.4928578,1 7.5580394,46.4929428,1 7.5580016,46.493001,1 7.5584826,46.4935359,1 7.5589806,46.4941802,1 7.5589173,46.4942818,1 7.5580289,46.4940058,1 7.557863,46.4940514,1 7.5585141,46.4945781,1 7.5584892,46.4949762,1 + + + + Bellevuegaessli + #style-Unclassified + + relativeToGround + 7.5581971,46.4920378,1 7.5579392,46.492211,1 7.5576315,46.4922586,1 7.5573333,46.4922537,1 7.5568548,46.4922385,1 + + + + Bellevuestrasse + #style-Unclassified + + relativeToGround + 7.5568451,46.4909915,1 7.5562427,46.4910686,1 7.5560919,46.4912908,1 7.5563797,46.4920739,1 + + + + Senggistrasse + #style-Unclassified + + relativeToGround + 7.556064,46.4904831,1 7.5558567,46.490661,1 7.555653,46.4908226,1 7.5555547,46.4908982,1 + + + + Untere Kurhausstrasse + #style-Unclassified + + relativeToGround + 7.5594245,46.493615,1 7.5603132,46.4940893,1 7.5611146,46.4943645,1 7.5612008,46.4943941,1 + + + + Obere Dorfstrasse + #style-Unclassified + + relativeToGround + 7.5576315,46.4922586,1 7.5580946,46.4928578,1 7.5584537,46.4927197,1 7.5588805,46.4931539,1 7.5590802,46.4933577,1 7.5594245,46.493615,1 + + + + #style-Unclassified + + relativeToGround + 7.5559303,46.4904006,1 7.5560779,46.4899713,1 7.5561408,46.4893354,1 + + + + #style-Unclassified + + relativeToGround + 7.599669,46.5467387,1 7.5994759,46.5465921,1 7.5994329,46.5460756,1 7.5998836,46.5456919,1 7.5998192,46.5452196,1 7.6005487,46.5449983,1 7.6007848,46.5444965,1 7.6010637,46.5442308,1 7.6011066,46.5438176,1 7.60145,46.5432715,1 7.6011281,46.5426074,1 7.6011066,46.5421794,1 7.6007068,46.54153,1 7.6001666,46.5412566,1 + + + + Alte Adelbodenstrasse + #style-Unclassified + + relativeToGround + 7.5982021,46.522924,1 7.5984662,46.5231705,1 7.5989692,46.523522,1 7.5991969,46.5235962,1 7.5997134,46.5240328,1 7.5999724,46.5242085,1 7.6002352,46.5243045,1 7.6008843,46.5244115,1 7.6011526,46.5245222,1 7.6012759,46.5246809,1 7.6017856,46.5255889,1 7.6019197,46.525803,1 7.6021074,46.5259285,1 7.6024799,46.5260617,1 7.6030516,46.5262828,1 7.6033037,46.5263123,1 7.6034753,46.5262754,1 7.6038103,46.5260773,1 7.604218,46.5260773,1 7.6046472,46.5258854,1 7.6049047,46.525974,1 7.6049261,46.5262841,1 7.6048111,46.5267257,1 7.6048403,46.5269189,1 7.6049935,46.5271612,1 7.6054441,46.5276262,1 7.6058059,46.5280704,1 7.6059609,46.5289507,1 7.6061361,46.5293018,1 7.6062112,46.5294716,1 7.6061897,46.5295602,1 7.6060932,46.5296155,1 7.6059035,46.5296615,1 7.6056342,46.5297829,1 7.6054173,46.5299514,1 7.60509,46.5303462,1 7.6049665,46.5305456,1 7.6049613,46.5306895,1 7.6050847,46.530922,1 7.6052788,46.5311467,1 7.6054977,46.5313944,1 7.6058679,46.5317228,1 7.6059001,46.5317745,1 7.6059376,46.5318926,1 7.6059913,46.5320586,1 7.6061305,46.5322292,1 7.6063638,46.5324253,1 7.6064526,46.5325901,1 7.6064848,46.5327635,1 7.6066135,46.5329037,1 7.6070674,46.5331968,1 7.6075738,46.5335237,1 7.6078014,46.5337372,1 7.6080673,46.5340035,1 7.6084911,46.5345533,1 7.6088129,46.5349371,1 7.6091724,46.5354021,1 7.6094674,46.5357084,1 7.6099073,46.5360479,1 7.6105403,46.5366752,1 7.6109557,46.5370289,1 7.6117258,46.5375645,1 7.6119684,46.5378839,1 7.6121573,46.5382392,1 7.6123535,46.5384464,1 7.6124421,46.5386678,1 7.61245,46.5388523,1 7.612367,46.5392618,1 7.6123505,46.5394348,1 7.6123964,46.5396051,1 7.6123763,46.5398221,1 7.6122861,46.5400548,1 7.6121496,46.5402582,1 7.6120152,46.5403909,1 7.6117741,46.5406899,1 7.6114898,46.5410958,1 7.6112776,46.5414422,1 7.6111894,46.5417378,1 7.6111376,46.5422652,1 7.6111518,46.5425828,1 7.6112269,46.5427045,1 7.611361,46.5428226,1 7.6116239,46.5430292,1 7.6122193,46.5434203,1 7.6129865,46.5439111,1 7.6135926,46.5443612,1 7.6146119,46.5451434,1 7.614784,46.5453074,1 7.6148962,46.5454644,1 7.6149659,46.5456968,1 7.6150679,46.5458444,1 7.6157974,46.546693,1 7.6160263,46.546901,1 7.6166128,46.5473312,1 7.6167278,46.5474471,1 7.6170688,46.5479732,1 7.6173072,46.548244,1 7.6177393,46.5486742,1 7.6180505,46.5488845,1 7.6184582,46.5491206,1 7.6196544,46.5497404,1 7.6199768,46.5500353,1 7.6204185,46.5506204,1 7.6207273,46.550873,1 7.6210438,46.5510574,1 7.6220678,46.5515417,1 + + + + Hörnliweg + #style-Unclassified + + relativeToGround + 7.5617886,46.4948002,1 7.5618606,46.4948615,1 7.5623632,46.494749,1 7.5625028,46.4947991,1 7.5625853,46.4950604,1 7.5626507,46.4952674,1 7.5627191,46.4953707,1 7.5631362,46.496001,1 7.5633343,46.4964952,1 7.5633664,46.4966989,1 7.5633291,46.4970595,1 7.5632368,46.4976696,1 7.563267,46.49787,1 7.5633854,46.4980113,1 7.563427,46.498168,1 + + + + #style-Unclassified + + relativeToGround + 7.559232,46.4796016,1 7.5585617,46.4808415,1 7.5583492,46.4819039,1 + + + + #style-Unclassified + + relativeToGround + 7.5609767,46.4931868,1 7.561166,46.4933554,1 7.5615163,46.4934914,1 + + + + #style-Unclassified + + relativeToGround + 7.5793256,46.4906279,1 7.580064,46.4905866,1 7.5805941,46.4903711,1 7.581293,46.4898469,1 7.5815091,46.4898495,1 + + + + #style-Unclassified + + relativeToGround + 7.5594245,46.493615,1 7.5598323,46.4933677,1 + + + + #style-Unclassified + + relativeToGround + 7.5587375,46.4925106,1 7.5584537,46.4927197,1 + + + + #style-Unclassified + + relativeToGround + 7.5535228,46.4865284,1 7.5535075,46.4866379,1 + + + + #style-Unclassified + + relativeToGround + 7.4450513,46.4614534,1 7.4452221,46.4614886,1 7.4456382,46.4613184,1 7.4461757,46.4609278,1 7.4463157,46.4610248,1 7.4464015,46.4610858,1 7.4466914,46.4607591,1 7.4468012,46.4607348,1 + + + + Bühlbergstrasse + #style-Unclassified + + relativeToGround + 7.4430622,46.4571982,1 7.4431212,46.4572001,1 7.4432434,46.4572082,1 7.4442759,46.457382,1 7.4444794,46.4574163,1 7.4448677,46.4575035,1 7.4464578,46.4579817,1 7.4465356,46.4580981,1 7.4476729,46.4597444,1 7.4477077,46.4598442,1 + + + + Gutenbrunnenstrasse + #style-Unclassified + + relativeToGround + 7.4448677,46.4575035,1 7.4448112,46.457744,1 7.4446903,46.4584104,1 7.4446715,46.4588889,1 7.4446685,46.4592476,1 7.4447089,46.4594931,1 7.4447493,46.4595984,1 7.444827,46.4597038,1 + + + + Wallenbachstrasse + #style-Unclassified + + relativeToGround + 7.4421289,46.4613278,1 7.4420439,46.4613149,1 7.4419537,46.4612981,1 7.4418739,46.4612798,1 + + + + Ägertenstrasse + #style-Unclassified + + relativeToGround + 7.441257,46.4569858,1 7.4409713,46.4574792,1 7.4407225,46.4578869,1 7.4398636,46.4589239,1 7.4396997,46.4590756,1 7.4393993,46.4592865,1 7.4389969,46.4594599,1 7.4386873,46.4595765,1 7.4384892,46.4596916,1 7.438253,46.4598534,1 7.438103,46.459935,1 7.4378459,46.4600208,1 7.4377581,46.4600511,1 + + + + Rütistrasse + #style-Unclassified + + relativeToGround + 7.4378459,46.4600208,1 7.4371477,46.4594844,1 7.4369002,46.4593711,1 7.4351732,46.4588118,1 7.4346689,46.4587157,1 7.4343168,46.4586884,1 7.433596,46.4585605,1 7.4332261,46.4585191,1 7.4327699,46.458627,1 7.432094,46.4586566,1 7.4318151,46.4585975,1 7.4316005,46.4585827,1 7.4312142,46.4585309,1 7.430828,46.4585679,1 7.4304096,46.4586862,1 + + + + #style-Unclassified + + relativeToGround + 7.4427198,46.4601214,1 7.4441314,46.4598231,1 7.444827,46.4597038,1 + + + + #style-Unclassified + + relativeToGround + 7.4403161,46.4578243,1 7.4407225,46.4578869,1 + + + + #style-Unclassified + + relativeToGround + 7.4407225,46.4578869,1 7.4409101,46.4579181,1 + + + + #style-Unclassified + + relativeToGround + 7.4404453,46.465217,1 7.4393848,46.4651486,1 + + + + Fuhrenstrasse + #style-Unclassified + + relativeToGround + 7.4296586,46.4726679,1 7.4298576,46.4724974,1 7.4299482,46.4723427,1 7.4302165,46.4718551,1 7.4304096,46.4715226,1 7.4309246,46.4709019,1 7.4314181,46.4703033,1 7.4340467,46.4683451,1 7.4344114,46.4681161,1 7.4347333,46.4678353,1 7.4351088,46.4673623,1 7.4359993,46.4657735,1 7.4367235,46.464426,1 7.4368575,46.4640778,1 7.4368843,46.4636223,1 7.4366858,46.462123,1 + + + + Schadaulistrasse + #style-Unclassified + + relativeToGround + 7.4318747,46.4771523,1 7.4308709,46.4767833,1 7.4304263,46.4765871,1 7.4295513,46.4761553,1 7.4293897,46.4761015,1 7.4292187,46.4760445,1 + + + + #style-Unclassified + + relativeToGround + 7.4523989,46.4496459,1 7.452694,46.4494094,1 7.4529944,46.4490804,1 7.4538849,46.446604,1 7.454593,46.4446597,1 7.4548183,46.4438761,1 + + + + Oberriedstrasse + #style-Unclassified + + relativeToGround + 7.4430622,46.4571982,1 7.4430863,46.457126,1 7.4433572,46.4566273,1 7.443502,46.4562947,1 7.4435554,46.4560527,1 7.4435718,46.4557441,1 7.4436426,46.455437,1 7.4437272,46.454981,1 7.4437756,46.4548719,1 7.4440412,46.4544542,1 7.444062,46.4544122,1 + + + + #style-Unclassified + + relativeToGround + 7.4490998,46.4394476,1 7.4493703,46.4398371,1 7.4496041,46.4400538,1 7.4498937,46.4404937,1 7.4501101,46.4406845,1 + + + + #style-Unclassified + + relativeToGround + 7.4501101,46.4406845,1 7.4518839,46.4414253,1 7.4527026,46.4418144,1 7.4535265,46.4432753,1 7.4540243,46.4437721,1 7.4545085,46.4440271,1 + + + + #style-Unclassified + + relativeToGround + 7.4518839,46.4414253,1 7.4463319,46.4499791,1 7.4459512,46.4506147,1 7.4453521,46.4516335,1 7.4453308,46.4518244,1 + + + + Pöschenriedstrasse + #style-Unclassified + + relativeToGround + 7.439194,46.451784,1 7.4391746,46.4521405,1 + + + + Wallenbachstrasse + #style-Unclassified + + relativeToGround + 7.441721,46.461265,1 7.4416647,46.4612502,1 7.4414716,46.4614165,1 7.4413107,46.4614646,1 7.4411444,46.461472,1 7.4407767,46.4613635,1 7.4398247,46.4608733,1 7.439138,46.4604323,1 7.4390154,46.4603058,1 7.438972,46.4601436,1 7.4389969,46.4594599,1 + + + + Pöschenriedstrasse + #style-Unclassified + + relativeToGround + 7.439194,46.451784,1 7.4393621,46.4512978,1 7.4397084,46.4508377,1 7.4397951,46.4507502,1 7.4408595,46.449676,1 7.441074,46.4493211,1 7.4412135,46.4489959,1 7.4412457,46.4486706,1 7.4412457,46.4482641,1 7.4413208,46.4480793,1 7.441589,46.4477022,1 7.4417178,46.4472513,1 7.4424473,46.4464677,1 7.442676,46.4460304,1 7.4430129,46.4450125,1 7.4431554,46.4447748,1 7.4432091,46.4444791,1 7.4432735,46.4442573,1 7.4433807,46.444176,1 7.4435095,46.4441242,1 7.4436275,46.4440133,1 7.443649,46.443762,1 7.4436919,46.4430449,1 7.4437348,46.4427639,1 7.4436919,46.4423351,1 7.4437348,46.4421207,1 7.4438839,46.4418249,1 7.4442712,46.4403685,1 7.4444429,46.4399619,1 7.4444751,46.4397401,1 7.4444429,46.4394961,1 7.4444107,46.4389564,1 7.4444536,46.4387272,1 7.4445287,46.4385128,1 7.444518,46.4381653,1 7.4444291,46.4378855,1 7.4443034,46.4374185,1 7.4440861,46.4371049,1 7.4436812,46.4366126,1 7.4434558,46.4364056,1 7.4431783,46.4362938,1 7.4428842,46.4360814,1 7.4424312,46.4355924,1 7.4421117,46.4349575,1 7.4418358,46.4339655,1 7.4412534,46.4325618,1 7.4411599,46.4323018,1 7.4409084,46.4319278,1 7.4400947,46.4304322,1 7.4399153,46.4300391,1 7.4398617,46.4296989,1 7.439851,46.4295214,1 7.4400012,46.4291665,1 7.4400211,46.4289007,1 7.4398188,46.4285453,1 7.4396378,46.4283387,1 7.4388103,46.4276505,1 7.4386922,46.4275026,1 7.4384669,46.4269258,1 7.4383275,46.4266152,1 7.4380485,46.4261049,1 7.4378983,46.4254615,1 7.4379305,46.4249956,1 7.4381451,46.4242413,1 7.4382309,46.4238049,1 7.4381635,46.4236286,1 7.4376515,46.4230654,1 7.4375228,46.4227696,1 7.4374799,46.4225699,1 7.4376086,46.4223924,1 7.437791,46.4222962,1 7.4380378,46.4222223,1 7.4381987,46.4221409,1 7.438424,46.4218007,1 7.4386171,46.4214975,1 7.4393222,46.4207591,1 7.4394433,46.4206174,1 7.4394111,46.4204694,1 7.4393252,46.4203659,1 7.4391107,46.4202697,1 7.438939,46.4200996,1 7.4387352,46.4197816,1 7.4383704,46.4195301,1 7.4381635,46.4193094,1 7.4381236,46.4191085,1 7.4381558,46.4187165,1 7.438167,46.4183333,1 7.4382845,46.417866,1 7.4385206,46.4174814,1 7.4387566,46.4170154,1 7.4387723,46.4169033,1 7.4387888,46.4167861,1 7.4386272,46.4164164,1 7.4384991,46.4161204,1 + + + + #style-Unclassified + + relativeToGround + 7.4384991,46.4161204,1 7.4388581,46.415908,1 7.4389068,46.4156322,1 7.4388317,46.4152994,1 7.4389927,46.4149221,1 7.4394325,46.4147224,1 7.4399797,46.4143378,1 7.4403767,46.4141307,1 7.4406985,46.413857,1 7.4409959,46.4135401,1 7.4413392,46.4130075,1 7.4419793,46.4126531,1 7.4419305,46.4125999,1 7.4415906,46.4124847,1 7.441101,46.4124355,1 7.4404666,46.4125933,1 7.4404194,46.4125372,1 7.4405193,46.4124716,1 7.4412531,46.4122448,1 7.4423692,46.4122678,1 7.4424048,46.4122319,1 7.4423429,46.412186,1 7.441468,46.4118535,1 7.4403289,46.4116246,1 7.4396951,46.4114482,1 7.4396417,46.4113803,1 7.4397084,46.4112026,1 7.4392793,46.4109067,1 7.438893,46.4108771,1 7.4396655,46.4107587,1 7.4407813,46.4110251,1 7.4421975,46.4110546,1 7.4425409,46.4113801,1 7.4430558,46.4113407,1 7.4434284,46.4111913,1 7.4436951,46.4108827,1 7.4441145,46.4106569,1 7.4448583,46.4102856,1 7.4461028,46.4086579,1 7.4461457,46.4082436,1 7.4459741,46.4078589,1 7.4456308,46.4079477,1 7.4454162,46.4082436,1 7.4452874,46.4079477,1 7.445502,46.4075926,1 7.4458453,46.4073263,1 7.4463174,46.4064089,1 7.4472186,46.4059651,1 + + + + Gutenbrunnenstrasse + #style-Unclassified + + relativeToGround + 7.4449449,46.4598479,1 7.4450899,46.4600345,1 7.4451328,46.4601213,1 7.4451487,46.4602746,1 7.4450926,46.4604484,1 7.4448382,46.4608729,1 7.4447171,46.4611856,1 7.4446607,46.4613556,1 7.444642,46.4615773,1 7.4446527,46.4617085,1 7.4446688,46.4618747,1 7.4447493,46.4621371,1 7.4450569,46.4629393,1 7.4451223,46.4632094,1 7.445055,46.4636188,1 7.4449424,46.4639884,1 7.4445079,46.4650156,1 7.4444084,46.4652649,1 7.4442226,46.465441,1 7.4440304,46.4655661,1 7.4435166,46.4657543,1 7.4432198,46.46584,1 7.4430595,46.4659171,1 7.4429683,46.4660723,1 7.4428743,46.4668792,1 7.4428824,46.4673286,1 7.4429361,46.4676205,1 7.4431238,46.468001,1 7.4433223,46.4681045,1 7.4434994,46.4680971,1 7.4436635,46.4680594,1 7.4438105,46.4679789,1 7.4440358,46.4679124,1 7.4442075,46.467905,1 7.4443308,46.4679567,1 7.4443149,46.4680648,1 7.4439285,46.4684851,1 7.4438212,46.4686883,1 7.4437958,46.4688583,1 7.4437622,46.4690319,1 7.4436496,46.4691908,1 7.4437193,46.4693016,1 7.4438761,46.4692998,1 7.4439929,46.4692129,1 7.4440902,46.4690344,1 7.4441645,46.46874,1 7.4442289,46.4686735,1 7.4444113,46.4685885,1 7.4448194,46.4685572,1 7.4464444,46.4684814,1 7.4468575,46.4684296,1 7.4472223,46.4683225,1 7.4479143,46.4683484,1 7.4481074,46.4683114,1 7.4482853,46.4680752,1 7.4484024,46.46782,1 7.4487458,46.4674912,1 7.4490163,46.4674327,1 7.4496041,46.4670958,1 7.4497596,46.4670589,1 7.4498401,46.4671106,1 7.4498508,46.4671882,1 7.4497566,46.4672727,1 7.4495987,46.4674284,1 7.4493307,46.4679198,1 7.4492876,46.4681784,1 7.4496416,46.4692868,1 7.4496563,46.4697213,1 7.4494699,46.470107,1 7.4492607,46.4702844,1 7.4489711,46.4704322,1 7.4478714,46.470713,1 7.4475441,46.4708275,1 7.4473456,46.4709642,1 7.447056,46.4711489,1 7.4463582,46.4714157,1 7.4459884,46.471607,1 7.4456988,46.4718509,1 7.4452286,46.4724169,1 7.445114,46.4726674,1 7.4450765,46.4731809,1 7.4449746,46.4733841,1 7.4447178,46.4736469,1 7.4446098,46.4738533,1 7.4445584,46.4740966,1 7.4449598,46.4755818,1 7.4449197,46.4763244,1 7.4445384,46.4777695,1 7.4449211,46.4786051,1 7.4448411,46.4792847,1 7.4442814,46.4802442,1 7.4437217,46.4809239,1 7.4432419,46.4819633,1 7.4429621,46.4833226,1 7.443082,46.4843221,1 7.4434418,46.4851617,1 7.4433219,46.4860013,1 7.4416827,46.4874405,1 7.4412829,46.4883201,1 7.441083,46.4898393,1 7.441163,46.4919582,1 7.4409631,46.4925579,1 7.4410031,46.4940371,1 7.4414828,46.4941171,1 7.443162,46.4933975,1 7.4438816,46.4935174,1 7.4453209,46.4933175,1 7.4477318,46.4928481,1 7.4476808,46.4927546,1 7.4472302,46.4928149,1 7.4455921,46.4926496,1 7.4451878,46.4926864,1 7.4452666,46.4925236,1 7.4456341,46.4924028,1 7.4470149,46.4921981,1 7.447288,46.4921193,1 7.4472985,46.4920563,1 7.4467734,46.4919776,1 7.4455659,46.4916048,1 7.4455134,46.4915365,1 7.4457444,46.4910168,1 7.4454188,46.490728,1 7.4453663,46.4905652,1 + + + + Gutenbrunnenstrasse + #style-Unclassified + + relativeToGround + 7.444827,46.4597038,1 7.4448524,46.4597347,1 + + + + Wallenbachstrasse + #style-Unclassified + + relativeToGround + 7.4418739,46.4612798,1 7.441721,46.461265,1 + + + + Schanzenstrasse + #style-Unclassified + + relativeToGround + 7.4448677,46.4575035,1 7.4448703,46.4570212,1 7.4451135,46.4568262,1 7.4455274,46.4564945,1 7.4460994,46.4560016,1 + + + + #style-Unclassified + + relativeToGround + 7.4432434,46.4572082,1 7.4433858,46.4575296,1 7.4438332,46.4578509,1 + + + + Oertlistrasse + #style-Unclassified + + relativeToGround + 7.4446688,46.4618747,1 7.4449263,46.4618784,1 7.4450513,46.4614534,1 7.4455535,46.4605947,1 + + + + #style-Unclassified + + relativeToGround + 7.4464015,46.4610858,1 7.4459878,46.4615401,1 + + + + #style-Unclassified + + relativeToGround + 7.4477077,46.4598442,1 7.4465974,46.459692,1 7.445441,46.4596274,1 7.444827,46.4597038,1 + + + + Untere Haltenstrasse + #style-Unclassified + + relativeToGround + 7.4464578,46.4579817,1 7.4474714,46.4583086,1 7.4475806,46.4582904,1 7.4478352,46.4579994,1 7.4480413,46.457563,1 7.4481747,46.4576539,1 7.448593,46.4576963,1 7.4486688,46.4577077,1 + + + + Untere Haltenstrasse + #style-Unclassified + + relativeToGround + 7.4478352,46.4579994,1 7.4483384,46.4580722,1 7.4486688,46.4577077,1 7.4487506,46.4576175,1 + + + + Oeystrasse + #style-Unclassified + + relativeToGround + 7.5535075,46.4866379,1 7.5541077,46.486711,1 + + + + #style-Unclassified + + relativeToGround + 7.5705898,46.498823,1 7.5706468,46.4988918,1 7.571328,46.499657,1 7.5715737,46.4997902,1 7.571972,46.499918,1 7.5724383,46.5003898,1 7.57264,46.500482,1 7.572698,46.50071,1 7.573314,46.500878,1 7.573326,46.500982,1 7.5736,46.501081,1 7.573867,46.501362,1 7.574116,46.501755,1 7.574486,46.502791,1 7.575551,46.504242,1 7.575842,46.505145,1 7.575844,46.5053877,1 7.5758952,46.5056591,1 7.5759918,46.5060425,1 7.57603,46.506199,1 7.57625,46.506853,1 7.5763751,46.5070038,1 7.5765527,46.5070657,1 + + + + #style-Unclassified + + relativeToGround + 7.570559,46.498933,1 7.5706468,46.4988918,1 + + + + #style-Unclassified + + relativeToGround + 7.580669,46.513662,1 7.5807275,46.5139652,1 7.5807645,46.5144849,1 7.5810451,46.5147994,1 7.5814548,46.5149276,1 7.5815259,46.5149997,1 7.5814644,46.5151169,1 7.581154,46.515336,1 7.5808687,46.5154174,1 7.5804932,46.5153665,1 7.5796209,46.5152968,1 7.5795576,46.5153762,1 + + + + #style-Unclassified + + relativeToGround + 7.5796209,46.5152968,1 7.5791481,46.514688,1 7.57917,46.514448,1 7.578968,46.514106,1 7.578725,46.513934,1 7.577749,46.513746,1 7.57743,46.513533,1 + + + + Mattenweg + #style-Unclassified + + relativeToGround + 7.5617403,46.4958305,1 7.5617231,46.4956946,1 7.561869,46.4956828,1 7.5631362,46.496001,1 + + + + Fichtenweg + #style-Unclassified + + relativeToGround + 7.5642551,46.4979457,1 7.5637573,46.4971953,1 7.5633291,46.4970595,1 + + + + Hörnliweg + #style-Unclassified + + relativeToGround + 7.563427,46.498168,1 7.5634771,46.498246,1 + + + + Obere Kurhausstrasse + #style-Unclassified + + relativeToGround + 7.5594245,46.493615,1 7.5594073,46.4937805,1 7.559845,46.4940345,1 7.5599738,46.4943241,1 7.5608149,46.494649,1 + + + + #style-Unclassified + + relativeToGround + 7.556064,46.4904831,1 7.5562058,46.4901582,1 7.5560779,46.4899713,1 + + + + Aebiweg + #style-Unclassified + + relativeToGround + 7.525197,46.4841121,1 7.5254535,46.4838699,1 7.5283631,46.4827706,1 7.5290927,46.4828534,1 7.5296334,46.4826879,1 7.5306977,46.4826465,1 7.5316762,46.4823628,1 7.5330409,46.4820851,1 7.5332297,46.4820851,1 7.5339335,46.482351,1 7.5343284,46.4823096,1 7.5346202,46.4821914,1 7.5349549,46.4818014,1 7.5351352,46.4817541,1 7.5352897,46.4818014,1 7.5355986,46.4821501,1 7.5359591,46.4821973,1 7.5371522,46.4817482,1 7.5372294,46.4812576,1 7.537032,46.4807671,1 7.5371007,46.4804361,1 7.5378217,46.4802115,1 7.5390599,46.4794675,1 + + + + #style-Unclassified + + relativeToGround + 7.5568548,46.4922385,1 7.5564947,46.4921923,1 7.5563797,46.4920739,1 + + + + Schwendliweg + #style-Unclassified + + relativeToGround + 7.5563573,46.493575,1 7.5559968,46.4931141,1 7.5558595,46.4922159,1 7.555705,46.4920327,1 7.5556793,46.492015,1 + + + + #style-Unclassified + + relativeToGround + 7.5426865,46.4886019,1 7.5426779,46.4886728,1 7.5428925,46.4887023,1 7.5430813,46.4884246,1 7.5433731,46.4882059,1 7.5439138,46.4880345,1 + + + + #style-Unclassified + + relativeToGround + 7.5621068,46.4705513,1 7.5621068,46.4703326,1 + + + + #style-Unclassified + + relativeToGround + 7.563823,46.4661917,1 7.5640376,46.4659612,1 + + + + #style-Unclassified + + relativeToGround + 7.5649892,46.4595141,1 7.5667928,46.4591384,1 + + + + #style-Unclassified + + relativeToGround + 7.5649892,46.4595141,1 7.5639522,46.4598625,1 7.5627558,46.4606653,1 7.5624583,46.460924,1 + + + + #style-Unclassified + + relativeToGround + 7.5573333,46.4922537,1 7.5572692,46.4923768,1 7.5575911,46.4927979,1 7.5576125,46.4928259,1 + + + + Holzachseggenweg + #style-Unclassified + + relativeToGround + 7.574161,46.5050942,1 7.5745177,46.5050132,1 7.5746686,46.5050133,1 7.5748119,46.5051096,1 7.5749181,46.5052865,1 7.5749613,46.5054369,1 7.5749935,46.5057891,1 7.5751992,46.5059527,1 7.5762188,46.5070028,1 7.5765527,46.5070657,1 7.5768093,46.5071724,1 7.5769754,46.5073393,1 7.5770131,46.5075288,1 7.5769805,46.5077763,1 7.5771975,46.508068,1 7.5774508,46.5082856,1 7.5776375,46.5085748,1 + + + + Holzachseggenweg + #style-Unclassified + + relativeToGround + 7.580641,46.513675,1 7.580404,46.513551,1 7.5802043,46.5134503,1 7.5797717,46.5127021,1 7.579667,46.512463,1 7.5796377,46.5123126,1 7.5796306,46.5118712,1 7.5795023,46.511653,1 7.579245,46.511192,1 7.578725,46.510501,1 7.57876,46.510111,1 7.5785213,46.5099119,1 7.5783897,46.5097234,1 7.5784323,46.509327,1 7.5782946,46.5090724,1 7.5779976,46.5089351,1 7.5777993,46.5087052,1 7.5776375,46.5085748,1 + + + + #style-Unclassified + + relativeToGround + 7.6170304,46.559005,1 7.617521,46.559201,1 7.61769,46.559157,1 7.618127,46.558916,1 7.618334,46.558972,1 7.618372,46.559119,1 7.6185053,46.5592427,1 + + + + Badstrasse + #style-Unclassified + + relativeToGround + 7.4360929,46.4545316,1 7.4354269,46.4543073,1 7.4353973,46.4541646,1 7.4355302,46.454095,1 7.4358702,46.4539509,1 7.4367144,46.4534407,1 7.4375083,46.4531784,1 7.4376245,46.45314,1 7.4379057,46.4527118,1 7.4380056,46.4525884,1 7.4382313,46.4524161,1 7.4385957,46.4522631,1 7.4391746,46.4521405,1 + + + + Oberriedstrasse + #style-Unclassified + + relativeToGround + 7.4677582,46.4299748,1 7.4681778,46.429499,1 7.4698944,46.4283987,1 7.4703192,46.4282113,1 7.4717398,46.4279136,1 7.4726925,46.4278012,1 7.4760571,46.4270912,1 + + + + #style-Unclassified + + relativeToGround + 7.4391746,46.4521405,1 7.4395197,46.4518404,1 7.4397686,46.4510539,1 7.4414767,46.4497766,1 7.4416701,46.4495646,1 7.4418257,46.4493133,1 7.4418875,46.4490852,1 7.4419222,46.4486812,1 7.4419812,46.448478,1 7.4421475,46.448271,1 7.442228,46.4480196,1 7.4422977,46.4478348,1 7.4425445,46.4476463,1 7.4426679,46.447273,1 7.4428288,46.4470808,1 7.4431238,46.4469588,1 7.4434028,46.4469071,1 7.4436335,46.4469108,1 7.4442576,46.447074,1 7.4454113,46.4464497,1 7.4456129,46.4462972,1 7.4457363,46.4460976,1 7.4463318,46.444693,1 7.4470935,46.4432588,1 7.4476943,46.4419132,1 7.4477681,46.4417216,1 7.4477912,46.4411924,1 7.4478338,46.4409595,1 7.4479572,46.440808,1 7.4493703,46.4398371,1 + + + + Schulstrasse + #style-Unclassified + + relativeToGround + 7.4451624,46.4562853,1 7.445156,46.4561345,1 7.4435718,46.4557441,1 + + + + Schanzenstrasse + #style-Unclassified + + relativeToGround + 7.4442759,46.457382,1 7.4444358,46.4572544,1 7.4448703,46.4570212,1 + + + + Rawilstrasse + #style-Unclassified + + relativeToGround + 7.4391746,46.4521405,1 7.4392237,46.4523389,1 7.4393814,46.4528307,1 7.4394509,46.45341,1 7.4394643,46.4538143,1 7.439476,46.4543009,1 7.4395189,46.4545023,1 7.4396638,46.4549532,1 7.4397362,46.4551084,1 7.4398844,46.4554098,1 7.4401167,46.4559428,1 7.4402861,46.4562004,1 7.4405596,46.4564869,1 7.4409145,46.4567899,1 + + + + Lischmattenstrasse + #style-Unclassified + + relativeToGround + 7.4441109,46.4543138,1 7.4439634,46.4542879,1 + + + + Schulstrasse + #style-Unclassified + + relativeToGround + 7.4435718,46.4557441,1 7.4435047,46.4557418,1 + + + + Schulstrasse + #style-Unclassified + + relativeToGround + 7.4434082,46.4557385,1 7.4433518,46.4557718,1 7.4433217,46.4560368,1 7.4432619,46.4563432,1 + + + + Rawilstrasse + #style-Unclassified + + relativeToGround + 7.4428556,46.4571631,1 7.4430005,46.457189,1 + + + + Hohliebestrasse + #style-Unclassified + + relativeToGround + 7.4409145,46.4567899,1 7.4403726,46.4567837,1 7.4398295,46.4567497,1 7.4395506,46.4568162,1 7.4390892,46.4567793,1 + + + + Badgässli + #style-Unclassified + + relativeToGround + 7.4396638,46.4549532,1 7.4383275,46.4545323,1 7.4381129,46.4544954,1 + + + + #style-Unclassified + + relativeToGround + 7.5815091,46.4898495,1 7.5817066,46.490105,1 + + + + Lischenstrasse + #style-Unclassified + + relativeToGround + 7.579127,46.5015699,1 7.5795483,46.5015782,1 7.579604,46.501575,1 7.5796209,46.5015556,1 7.5796354,46.5015389,1 7.5796387,46.5014767,1 7.579516,46.5011987,1 7.579582,46.5009187,1 7.579558,46.5007779,1 7.5793455,46.5005247,1 7.5789309,46.500105,1 7.5789603,46.4999343,1 7.5792023,46.4997735,1 7.5792682,46.499649,1 7.5793383,46.4996065,1 7.579615,46.499543,1 7.5798441,46.4995124,1 7.5798959,46.4994904,1 7.5800692,46.4992295,1 7.5802311,46.4989017,1 + + + + Lischenstrasse + #style-Unclassified + + relativeToGround + 7.5789513,46.5016989,1 7.579127,46.5015699,1 + + + + #style-Unclassified + + relativeToGround + 7.6045066,46.4846583,1 7.6045315,46.4850165,1 7.6044123,46.4855701,1 7.6042768,46.486003,1 7.6045886,46.4873469,1 7.6048256,46.487741,1 7.6047148,46.4879113,1 7.6045687,46.4880471,1 + + + + #style-Unclassified + + relativeToGround + 7.5966573,46.4922393,1 7.5971767,46.4928758,1 7.5974568,46.4931936,1 7.598244,46.493757,1 7.598438,46.494168,1 7.598278,46.494257,1 7.596752,46.494475,1 7.5956114,46.49432,1 7.595106,46.494366,1 7.594802,46.494659,1 7.593749,46.496477,1 7.593536,46.497015,1 7.593565,46.497162,1 7.593723,46.497259,1 7.594193,46.497251,1 7.594485,46.497334,1 7.595287,46.497681,1 7.595584,46.497731,1 7.596066,46.497622,1 7.596171,46.49767,1 7.5961782,46.4978242,1 7.596517,46.49794,1 7.597417,46.497891,1 7.597849,46.498019,1 7.59888,46.498738,1 7.600041,46.499325,1 7.600693,46.500122,1 7.600832,46.500508,1 7.601464,46.501098,1 7.601946,46.50242,1 7.602582,46.503422,1 7.6027655,46.503524,1 7.60291,46.503966,1 7.603441,46.504399,1 7.603526,46.504844,1 7.603912,46.505249,1 7.603992,46.50585,1 7.604118,46.506031,1 7.605462,46.506316,1 7.606866,46.506045,1 7.608604,46.50587,1 7.60891,46.506088,1 7.609026,46.506509,1 7.609263,46.506585,1 + + + + #style-Unclassified + + relativeToGround + 7.6027655,46.503524,1 7.6032706,46.5032719,1 7.6039262,46.5029587,1 7.6040764,46.5028406,1 7.6040979,46.5026559,1 7.6040979,46.5025304,1 7.6041623,46.5023901,1 7.6043768,46.5022645,1 7.6048275,46.5020873,1 7.6050098,46.5020873,1 7.6051601,46.502139,1 7.6053317,46.5021242,1 7.6058252,46.5019839,1 7.6061686,46.5018214,1 7.606351,46.5016442,1 7.6065548,46.501371,1 7.6067372,46.5012454,1 7.6071234,46.5011199,1 7.6080139,46.5007949,1 7.6083572,46.5007285,1 7.6087864,46.5006915,1 7.6091083,46.5006989,1 7.6092799,46.5006694,1 7.6093014,46.5006029,1 7.609237,46.5005217,1 + + + + #style-Unclassified + + relativeToGround + 7.609263,46.506585,1 7.609625,46.506622,1 7.609763,46.506742,1 7.608437,46.508551,1 7.608362,46.509014,1 7.608517,46.509398,1 7.608975,46.509513,1 7.609143,46.509667,1 7.608922,46.509968,1 7.608936,46.510136,1 7.6096937,46.5108052,1 + + + + #style-Unclassified + + relativeToGround + 7.6132752,46.5086326,1 7.6130864,46.508084,1 7.6134655,46.5075013,1 7.6137376,46.5073456,1 7.6137642,46.5068918,1 7.6136461,46.5067741,1 7.6132371,46.5067476,1 7.6123986,46.5065152,1 7.6121506,46.5065575,1 7.6117664,46.5069924,1 7.6118209,46.5074455,1 7.6111969,46.5077415,1 7.610704,46.508093,1 7.609919,46.508256,1 7.609829,46.508341,1 7.609937,46.509377,1 7.609669,46.509781,1 7.6097521,46.5101913,1 7.6096937,46.5108052,1 7.609751,46.511164,1 7.610325,46.511757,1 7.611032,46.512156,1 7.611504,46.512256,1 7.61164,46.512395,1 7.611676,46.512859,1 7.6110638,46.5135387,1 7.610088,46.513843,1 7.609616,46.514223,1 7.609231,46.514344,1 7.608915,46.51455,1 7.608729,46.51482,1 7.608422,46.515019,1 7.607633,46.515308,1 7.6073503,46.5155013,1 7.607241,46.515576,1 7.606768,46.51574,1 7.606403,46.515938,1 7.60625,46.516128,1 7.606479,46.51664,1 7.606585,46.517717,1 7.606807,46.518003,1 7.607364,46.518265,1 7.60721,46.51834,1 7.606852,46.51835,1 7.605442,46.51814,1 7.604229,46.517357,1 7.6033694,46.5171449,1 + + + + #style-Unclassified + + relativeToGround + 7.6109659,46.5266158,1 7.6107,46.526694,1 7.61007,46.527171,1 7.609988,46.527489,1 7.609498,46.527984,1 7.608709,46.529361,1 7.608698,46.530009,1 7.608567,46.530339,1 7.608337,46.530401,1 7.608207,46.530327,1 7.607761,46.529968,1 7.607315,46.529449,1 7.606862,46.52918,1 7.6065623,46.5291566,1 7.6061361,46.5293018,1 + + + + Rinderwaldstrasse + #style-Unclassified + + relativeToGround + 7.5881401,46.5275704,1 7.5879485,46.527459,1 7.587679,46.527221,1 7.587317,46.526255,1 7.587425,46.5259306,1 7.5872959,46.5256373,1 7.586076,46.524567,1 + + + + #style-Unclassified + + relativeToGround + 7.5826066,46.5259242,1 7.5829568,46.5262864,1 7.5833805,46.5268825,1 7.5836909,46.5270954,1 7.5838082,46.5273334,1 7.5840578,46.5276561,1 7.584423,46.5281035,1 7.584751,46.528836,1 7.5847782,46.5294052,1 7.5847345,46.5296666,1 7.5845956,46.5298968,1 7.5842076,46.5301916,1 + + + + Rinderwaldstrasse + #style-Unclassified + + relativeToGround + 7.5774574,46.5275452,1 7.5772166,46.5274306,1 7.5766573,46.5267791,1 7.576019,46.525654,1 7.575555,46.524558,1 7.5753315,46.5243657,1 7.5749549,46.5242103,1 7.57448,46.5241341,1 + + + + #style-Unclassified + + relativeToGround + 7.5745874,46.5254626,1 7.5721265,46.5258724,1 7.5710266,46.5262635,1 7.5703591,46.5265893,1 7.5704551,46.5266365,1 7.5708354,46.5265253,1 7.5721092,46.5264585,1 7.5735188,46.5265577,1 7.573599,46.526742,1 7.573578,46.527052,1 7.573646,46.5272475,1 7.5744837,46.5279216,1 + + + + #style-Unclassified + + relativeToGround + 7.5703591,46.5265893,1 7.568595,46.5263443,1 7.5673853,46.5264725,1 7.5663447,46.5266784,1 7.5654095,46.5267497,1 7.564572,46.5270254,1 7.5632688,46.5279901,1 7.562625,46.528737,1 + + + + #style-Unclassified + + relativeToGround + 7.5632688,46.5279901,1 7.563293,46.528047,1 7.5639,46.527924,1 7.565404,46.52747,1 7.565998,46.527405,1 7.5672493,46.5275054,1 7.568548,46.527754,1 7.5689,46.527947,1 + + + + #style-Unclassified + + relativeToGround + 7.4348713,46.4607347,1 7.433706,46.46137,1 7.4332548,46.4615372,1 7.432767,46.461688,1 7.4322834,46.461897,1 7.430689,46.462586,1 7.430159,46.462852,1 7.429281,46.463456,1 7.427987,46.464066,1 7.427716,46.464332,1 7.427499,46.464333,1 7.427753,46.463371,1 7.427638,46.462469,1 7.427267,46.461642,1 7.426829,46.461129,1 7.426752,46.460286,1 7.426453,46.460009,1 7.426347,46.45962,1 7.4262468,46.4595065,1 7.425969,46.459287,1 7.42578,46.459278,1 7.42571,46.459377,1 7.425777,46.459664,1 7.425669,46.459887,1 7.425157,46.460384,1 7.425126,46.460757,1 7.424398,46.461387,1 7.424154,46.461895,1 7.423971,46.461934,1 7.423801,46.461447,1 7.423465,46.460931,1 7.423449,46.460419,1 7.423278,46.460279,1 7.422565,46.460132,1 7.422303,46.459911,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.5426103,46.4830368,1 7.5424403,46.4825688,1 7.5421893,46.4825118,1 7.5419623,46.4825828,1 7.5416513,46.4828808,1 7.5415101,46.4829137,1 7.5411413,46.4827908,1 7.5402763,46.4830068,1 7.5400713,46.4829268,1 7.5403793,46.4826278,1 7.5407663,46.4824648,1 7.5407743,46.4822388,1 7.5405388,46.4820442,1 7.5403653,46.4819008,1 7.5396433,46.4815648,1 7.5392734,46.4802349,1 7.5390599,46.4794675,1 7.5381653,46.4784568,1 7.5376503,46.4775028,1 7.5369473,46.4771058,1 7.5367163,46.4767798,1 7.5365533,46.4764458,1 7.5365043,46.4756498,1 7.5361633,46.4746408,1 7.5353448,46.4737451,1 7.5352429,46.4735013,1 7.5351743,46.4725458,1 7.5350093,46.4718738,1 7.5351203,46.4712998,1 7.5350193,46.4709858,1 7.5346923,46.4703668,1 7.5339183,46.4698158,1 7.5332503,46.4690168,1 7.5332913,46.4687698,1 7.5345263,46.4679968,1 7.5346883,46.4676188,1 7.5346943,46.4673158,1 7.5334473,46.4653948,1 7.5333563,46.4649828,1 7.5340553,46.4636388,1 7.5345393,46.4632248,1 7.5344513,46.4619618,1 7.5347283,46.4613518,1 7.5346943,46.4610708,1 7.5348653,46.4608468,1 7.5348533,46.4606638,1 7.5345733,46.4604178,1 7.5338453,46.4601288,1 7.5336253,46.4601698,1 7.5335303,46.4606138,1 7.5330443,46.4611158,1 7.5328583,46.4620328,1 7.5324423,46.4625308,1 7.5322843,46.4630188,1 7.5318629,46.4633692,1 7.5310273,46.4640638,1 7.5303233,46.4642378,1 7.5296383,46.4642278,1 7.5291173,46.4643608,1 7.5287983,46.4643358,1 7.5274243,46.4636628,1 7.5262593,46.4635928,1 7.5256373,46.4634048,1 7.5241943,46.4624008,1 7.5232133,46.4614168,1 7.5214053,46.4606918,1 7.5210933,46.4601898,1 7.5200473,46.4595938,1 7.5191943,46.4593388,1 7.5174423,46.4592718,1 7.5170503,46.4591218,1 7.5160353,46.4580808,1 7.5156573,46.4578858,1 7.5148593,46.4576658,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.469627,46.453826,1 7.4703038,46.4532183,1 + + + + Alpenweg + #style-Unclassified + + relativeToGround + 7.55887,46.49044,1 7.55864,46.490402,1 7.55846,46.49025,1 7.5579974,46.4904534,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.543024,46.4839871,1 7.5426103,46.4830368,1 + + + + Dorfstrasse + #style-Unclassified + + relativeToGround + 7.5595144,46.4930964,1 7.5592176,46.4928554,1 7.5587375,46.4925106,1 7.5581971,46.4920378,1 7.5571221,46.4911702,1 7.5568451,46.4909915,1 7.556403,46.4906599,1 + + + + Dorfstrasse + #style-Unclassified + + relativeToGround + 7.556403,46.4906599,1 7.556064,46.4904831,1 7.5559303,46.4904006,1 7.5549954,46.4898085,1 + + + + Risetensträssli + #style-Unclassified + + relativeToGround + 7.5561408,46.4893354,1 7.5561531,46.4890823,1 7.5561565,46.4890135,1 7.556089,46.4888482,1 7.5559288,46.4884562,1 7.5555284,46.4878909,1 7.5553086,46.487412,1 7.5549867,46.4871765,1 7.5545078,46.4871844,1 7.5535075,46.4866379,1 + + + + #style-Unclassified + + relativeToGround + 7.5981221,46.5280116,1 7.598181,46.528212,1 7.598159,46.528341,1 7.598092,46.528455,1 7.59791,46.528842,1 7.597834,46.52896,1 7.597782,46.529368,1 7.597859,46.5296,1 7.598016,46.529719,1 7.59821,46.529793,1 7.598476,46.529826,1 7.59895,46.529716,1 7.599487,46.529729,1 7.5996702,46.5297785,1 7.599726,46.529845,1 7.599787,46.529949,1 7.599809,46.530111,1 7.599803,46.530257,1 7.599647,46.530568,1 7.599725,46.53097,1 7.599832,46.531108,1 7.599978,46.531232,1 7.599953,46.531488,1 7.600036,46.531632,1 7.60003,46.53168,1 7.599971,46.531811,1 7.600043,46.531956,1 7.600178,46.532082,1 7.600263,46.532197,1 7.600269,46.532322,1 7.600217,46.532436,1 7.600152,46.532503,1 7.600094,46.532638,1 7.600076,46.532737,1 7.600014,46.532905,1 7.59999,46.533077,1 7.59989,46.533416,1 7.599934,46.533522,1 7.6001086,46.5335279,1 7.600186,46.5335,1 7.60064,46.533445,1 7.600763,46.53347,1 7.600892,46.53355,1 7.600963,46.533707,1 7.600955,46.533781,1 7.600893,46.533879,1 7.600796,46.53395,1 7.600721,46.53409,1 7.600808,46.534403,1 7.600856,46.534454,1 7.60095,46.534503,1 7.601187,46.534596,1 7.60136,46.534735,1 7.601596,46.535069,1 7.601825,46.535338,1 7.601902,46.535416,1 7.602041,46.535499,1 7.602206,46.535578,1 7.602625,46.5357,1 7.60283,46.535772,1 7.603179,46.535845,1 7.603494,46.535859,1 7.60365,46.535898,1 7.603681,46.535918,1 7.603769,46.536014,1 7.603788,46.536143,1 7.603764,46.536199,1 7.603762,46.5362107,1 7.603755,46.536253,1 7.603784,46.536359,1 7.60391,46.536497,1 7.6040614,46.536598,1 7.604125,46.536642,1 7.604243,46.53682,1 7.604291,46.536947,1 7.604399,46.537031,1 7.604713,46.537069,1 7.604998,46.537061,1 7.605114,46.537042,1 7.605361,46.53706,1 7.605801,46.537134,1 7.606041,46.537151,1 7.606205,46.537248,1 7.606276,46.537331,1 7.6062753,46.5374013,1 7.606258,46.537464,1 7.606091,46.537705,1 7.605981,46.538053,1 7.606033,46.538161,1 7.60606,46.538286,1 7.606016,46.538455,1 7.605935,46.538601,1 7.605874,46.538805,1 7.605819,46.539136,1 7.605733,46.539318,1 7.605705,46.539412,1 7.6058389,46.539552,1 7.6058722,46.5395795,1 + + + + #style-Unclassified + + relativeToGround + 7.5744837,46.5279216,1 7.5746977,46.5280938,1 7.5771625,46.5297081,1 7.5773,46.529821,1 7.577183,46.530712,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.4568436,46.4593926,1 7.4568637,46.4594526,1 7.4569135,46.4595047,1 7.4570376,46.4595784,1 7.4576408,46.459836,1 7.4576957,46.4598904,1 7.4576821,46.4599445,1 7.4576328,46.4599825,1 7.4575461,46.4599848,1 7.4572033,46.4598226,1 7.4568717,46.459731,1 7.4564869,46.4597211,1 7.4563512,46.4596817,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.4563512,46.4596817,1 7.4562979,46.4595824,1 7.4562834,46.4593869,1 7.4562147,46.4592473,1 7.4559877,46.4590046,1 7.4559252,46.4587348,1 7.4558864,46.4581792,1 7.456013,46.4574831,1 7.4561972,46.456936,1 7.4560344,46.4563522,1 7.4560192,46.4561245,1 7.4563026,46.4555022,1 7.456367,46.4551475,1 7.4564528,46.4549996,1 7.4565816,46.4549331,1 7.4565816,46.454837,1 7.4565616,46.4547349,1 7.4564528,46.4547261,1 7.4563455,46.4548222,1 7.4562919,46.4549257,1 7.4562003,46.4550467,1 7.4560237,46.4551992,1 7.4556696,46.4553175,1 7.4554658,46.455384,1 7.45152,46.46002,1 7.4516199,46.4601237,1 7.45256,46.4611,1 7.4512878,46.4622786,1 + + + + Rawilstrasse + #style-Unclassified + + relativeToGround + 7.4409145,46.4567899,1 7.4410666,46.4568934,1 7.441257,46.4569858,1 7.4424533,46.457099,1 7.4428556,46.4571631,1 + + + + Egernschwandweg + #style-Unclassified + + relativeToGround + 7.5786446,46.518287,1 7.578694,46.518135,1 7.578724,46.517978,1 7.578695,46.517886,1 7.578512,46.517455,1 7.578309,46.5171813,1 7.577878,46.516652,1 7.577605,46.516534,1 7.577438,46.51649,1 7.577041,46.516159,1 7.576838,46.516078,1 7.576264,46.515795,1 7.575735,46.515618,1 7.575121,46.515397,1 7.574844,46.515369,1 7.574591,46.515424,1 7.574228,46.515451,1 7.573965,46.515492,1 7.57367,46.515483,1 7.57341,46.515411,1 7.573285,46.51521,1 7.573152,46.515082,1 7.572439,46.515021,1 7.572135,46.514946,1 7.57191,46.514848,1 7.571398,46.514879,1 7.571265,46.51496,1 7.57104,46.514972,1 7.570159,46.514819,1 7.569955,46.514753,1 7.569293,46.514586,1 7.568896,46.514458,1 7.568662,46.514359,1 7.5681,46.514075,1 7.567915,46.513952,1 7.567848,46.513922,1 7.5671835,46.5137512,1 7.566948,46.513674,1 7.566778,46.513566,1 7.566565,46.513493,1 7.566333,46.513447,1 7.566124,46.51337,1 7.565802,46.513217,1 7.565665,46.51313,1 + + + + #style-Unclassified + + relativeToGround + 7.5669006,46.5111824,1 7.566536,46.5113136,1 7.566172,46.511362,1 7.565683,46.511382,1 7.565051,46.511454,1 7.564704,46.511647,1 7.564224,46.51188,1 7.564123,46.512021,1 7.563941,46.51213,1 7.563809,46.512144,1 7.563635,46.512083,1 7.563415,46.512069,1 7.563285,46.512081,1 7.563183,46.512048,1 7.562725,46.511852,1 7.562645,46.511873,1 7.562606,46.511942,1 7.562637,46.512081,1 7.5625296,46.5121876,1 7.562224,46.512308,1 7.562061,46.512386,1 7.561732,46.512565,1 7.561621,46.51265,1 7.561383,46.512768,1 7.561246,46.512881,1 7.560984,46.513026,1 7.560705,46.513132,1 7.56041,46.513256,1 7.560199,46.513334,1 7.559963,46.513393,1 7.55977,46.513485,1 7.5596756,46.5135221,1 7.55961,46.513548,1 7.558865,46.513684,1 7.5581263,46.5137586,1 7.557572,46.513713,1 7.556972,46.513559,1 7.556817,46.5135283,1 + + + + #style-Unclassified + + relativeToGround + 7.556817,46.5135283,1 7.5564776,46.5135931,1 + + + + #style-Unclassified + + relativeToGround + 7.5564776,46.5135931,1 7.555653,46.5136131,1 + + + + Egerlenstrasse + #style-Unclassified + + relativeToGround + 7.555653,46.5136131,1 7.5547124,46.5135725,1 7.554273,46.513568,1 7.553829,46.513568,1 7.553433,46.513609,1 7.5530228,46.5136488,1 7.552596,46.513654,1 7.552093,46.513613,1 7.551338,46.513505,1 7.5509052,46.5134765,1 7.5505971,46.5134655,1 7.5499677,46.5136782,1 7.5495893,46.5137309,1 7.549533,46.513828,1 7.5496296,46.5138873,1 7.54985,46.513882,1 7.55001,46.513903,1 7.550029,46.51409,1 7.550048,46.514291,1 7.5501728,46.5144035,1 7.550758,46.514543,1 7.5511026,46.5145888,1 7.5516662,46.5146211,1 7.5520151,46.5146864,1 7.552829,46.51488,1 7.5532371,46.514966,1 7.5535135,46.5150716,1 7.553654,46.515094,1 7.5538209,46.5150318,1 7.5540833,46.5149891,1 7.5548384,46.5150455,1 7.5551189,46.5150839,1 7.5553614,46.5152012,1 7.555649,46.5153894,1 7.5558741,46.515512,1 7.5561416,46.5156,1 7.5566571,46.5157065,1 7.556798,46.515774,1 7.5568977,46.5159041,1 7.556998,46.516064,1 7.5571154,46.5161086,1 7.557837,46.516132,1 7.558461,46.516234,1 7.5586448,46.5162468,1 7.559683,46.516477,1 7.560001,46.516488,1 7.5602308,46.5165359,1 7.5607407,46.5165139,1 7.5612266,46.5166202,1 7.5616355,46.5167467,1 7.5620778,46.5167717,1 7.5627706,46.5169076,1 7.5627921,46.5169559,1 7.5626331,46.5169857,1 7.562377,46.5169559,1 7.5620266,46.5169932,1 7.5614422,46.5171315,1 7.561326,46.517138,1 7.561267,46.517166,1 7.561159,46.517176,1 7.5610746,46.5171656,1 7.560836,46.51723,1 7.5603559,46.5172698,1 7.5585206,46.517503,1 7.5572554,46.5177377,1 7.5568904,46.5178344,1 7.5564558,46.5178795,1 7.5558549,46.5178842,1 7.5554229,46.5178329,1 7.5548414,46.5178271,1 7.5543567,46.5178481,1 7.553933,46.5178613,1 7.5538109,46.5179008,1 7.553859,46.517973,1 7.5540552,46.5179693,1 7.554263,46.51801,1 7.5552842,46.5184778,1 + + + + Egernschwandweg + #style-Unclassified + + relativeToGround + 7.565665,46.51313,1 7.5655319,46.5130257,1 + + + + Egernschwandweg + #style-Unclassified + + relativeToGround + 7.5655319,46.5130257,1 7.5654903,46.5129931,1 7.56538,46.512798,1 7.565474,46.512629,1 7.565684,46.512455,1 7.565875,46.512336,1 7.566545,46.512105,1 7.566632,46.512061,1 7.566984,46.512021,1 7.567198,46.511978,1 7.567389,46.511901,1 7.567571,46.511851,1 7.568036,46.511904,1 7.568265,46.511945,1 7.568517,46.512006,1 7.568808,46.512056,1 7.569195,46.512073,1 7.569429,46.512012,1 7.569807,46.511803,1 7.570015,46.511579,1 7.570141,46.511395,1 7.570386,46.511321,1 7.570945,46.511298,1 7.571259,46.511326,1 7.571494,46.511316,1 7.5717288,46.5112797,1 + + + + #style-Unclassified + + relativeToGround + 7.4472186,46.4059651,1 7.4473377,46.4046987,1 7.447185,46.4043595,1 7.4464891,46.403864,1 7.4461202,46.4034297,1 + + + + Iffigenstrasse + #style-Unclassified + + relativeToGround + 7.4461202,46.4034297,1 7.44569,46.4028394,1 7.4452036,46.402289,1 7.4440926,46.4015624,1 7.4434951,46.4012667,1 7.4427384,46.4009962,1 7.4411642,46.3998745,1 + + + + Labrunnenstrasse + #style-Unclassified + + relativeToGround + 7.5848963,46.5385742,1 7.584971,46.538598,1 7.5850687,46.5385678,1 7.585274,46.538445,1 7.585513,46.538362,1 7.585815,46.538336,1 7.5861975,46.5384377,1 7.586687,46.538565,1 7.586868,46.53855,1 7.586922,46.5385852,1 7.586858,46.538634,1 7.5865846,46.5387579,1 7.5864754,46.5388895,1 7.5863858,46.5390299,1 7.5863538,46.53914,1 7.586145,46.539473,1 7.585906,46.539748,1 7.5859743,46.5397566,1 7.5862337,46.5397277,1 7.5864971,46.5397002,1 7.5866758,46.539656,1 7.5869357,46.5396259,1 7.5872481,46.5395086,1 7.5874748,46.5393658,1 7.587549,46.5393914,1 7.5875686,46.5394438,1 7.587519,46.539663,1 7.5874201,46.539882,1 7.5870777,46.5403479,1 7.586974,46.540457,1 7.5870076,46.5404872,1 7.5870655,46.5404979,1 7.588135,46.540364,1 7.5885285,46.5402242,1 7.5886063,46.5402073,1 7.5886288,46.5402472,1 7.588604,46.5402947,1 7.5885094,46.540414,1 7.5883955,46.5406535,1 7.5883744,46.5407232,1 7.5883676,46.5408147,1 7.588401,46.540845,1 7.5885722,46.5409102,1 7.588615,46.5409026,1 7.5888202,46.5408269,1 7.589194,46.540661,1 7.589281,46.540632,1 7.58999,46.540264,1 7.590328,46.540011,1 7.590683,46.539741,1 7.590905,46.539618,1 7.591382,46.539386,1 7.591737,46.539145,1 7.5920484,46.538841,1 + + + + #style-Unclassified + + relativeToGround + 7.6000148,46.5411065,1 7.5998328,46.5411104,1 7.599728,46.540985,1 7.599815,46.540729,1 7.599744,46.54068,1 7.599461,46.541161,1 7.5990539,46.5414724,1 7.5989053,46.5416069,1 + + + + Linterstrasse + #style-Unclassified + + relativeToGround + 7.5925397,46.5451903,1 7.592485,46.545252,1 7.592525,46.54534,1 7.592614,46.545474,1 7.592697,46.545941,1 7.592776,46.546324,1 7.592795,46.546568,1 7.592784,46.547071,1 7.592699,46.547674,1 7.592756,46.547908,1 7.592822,46.548097,1 7.592806,46.5481874,1 + + + + Linterstrasse + #style-Unclassified + + relativeToGround + 7.592806,46.5481874,1 7.592761,46.548238,1 7.592644,46.548376,1 7.592455,46.548557,1 7.592255,46.548698,1 7.592146,46.548812,1 7.591958,46.548924,1 7.591674,46.548987,1 7.591507,46.549084,1 7.591392,46.549196,1 7.591209,46.549305,1 7.591037,46.549435,1 7.590866,46.549519,1 7.590794,46.549642,1 7.590617,46.549749,1 7.590437,46.549933,1 7.5904257,46.5500262,1 + + + + Linterstrasse + #style-Unclassified + + relativeToGround + 7.5904257,46.5500262,1 7.5905254,46.5500717,1 + + + + Kratzernweg + #style-Unclassified + + relativeToGround + 7.5905254,46.5500717,1 7.590707,46.549997,1 7.59085,46.549908,1 7.591069,46.549881,1 7.591421,46.549938,1 7.591668,46.550065,1 7.592004,46.550226,1 7.592637,46.550442,1 7.593226,46.55058,1 7.593383,46.550702,1 7.593531,46.550877,1 7.593684,46.55115,1 7.593958,46.551669,1 7.594276,46.55222,1 7.594324,46.552364,1 7.5943061,46.5527315,1 7.594134,46.552894,1 7.594091,46.55297,1 7.59395,46.553062,1 7.593757,46.553112,1 7.593606,46.553197,1 7.59307,46.5535336,1 7.5929968,46.5537118,1 7.5925956,46.5539528,1 7.5923612,46.5541928,1 + + + + Kratzernweg + #style-Unclassified + + relativeToGround + 7.592429,46.554253,1 7.592863,46.5539574,1 7.593574,46.55385,1 7.59392,46.553942,1 7.594217,46.553964,1 7.594676,46.553977,1 7.594954,46.553786,1 7.595205,46.553817,1 7.595561,46.55408,1 7.595675,46.554108,1 7.59587,46.554013,1 7.596056,46.553807,1 7.596398,46.553526,1 7.59646,46.553509,1 7.5967647,46.5536546,1 7.596819,46.553667,1 7.5969261,46.5536743,1 7.5970949,46.5537103,1 7.5971441,46.5537263,1 7.5971816,46.5538848,1 + + + + Kratzernweg + #style-Unclassified + + relativeToGround + 7.5923612,46.5541928,1 7.592429,46.554253,1 + + + + #style-Unclassified + + relativeToGround + 7.598828,46.5418043,1 7.5986652,46.5418556,1 7.5984839,46.5418271,1 7.5981032,46.541696,1 7.5978471,46.5416201,1 7.5977275,46.5416254,1 7.5978138,46.5416964,1 7.5979877,46.5417862,1 7.5981191,46.5418557,1 7.5980869,46.5419247,1 7.597906,46.5419125,1 7.5977139,46.5418563,1 7.5974461,46.5417375,1 7.5971628,46.5416562,1 7.596846,46.5416131,1 7.5964607,46.5415809,1 7.5962965,46.5415976,1 7.5963199,46.5416784,1 7.5964588,46.541693,1 7.596682,46.5416906,1 7.597639,46.542105,1 7.5979774,46.542212,1 7.5983329,46.5423104,1 7.5987195,46.5423762,1 7.598925,46.5423612,1 7.5991482,46.5423019,1 7.5994659,46.5421858,1 7.5996704,46.5420792,1 7.5998137,46.5420664,1 7.5998714,46.542131,1 7.5998295,46.5422306,1 7.5994128,46.5425684,1 7.599269,46.542718,1 7.5992063,46.5428643,1 7.5992312,46.5430102,1 7.5993576,46.5432551,1 7.5993203,46.543322,1 7.5991709,46.543321,1 7.598775,46.5432615,1 7.5985495,46.5431872,1 7.598132,46.5430061,1 7.5978407,46.542964,1 7.597512,46.542934,1 7.597277,46.542875,1 7.5969961,46.542788,1 7.5968514,46.5427994,1 7.5965859,46.5429628,1 7.5963745,46.5430484,1 7.5961846,46.5430552,1 7.5959447,46.542993,1 7.595764,46.542913,1 7.5955707,46.5427996,1 7.595428,46.5427595,1 7.5953594,46.5428276,1 7.595518,46.542962,1 7.5957387,46.5432782,1 7.595972,46.543449,1 7.5959446,46.5435388,1 7.5957942,46.5435186,1 7.5956638,46.5434226,1 7.5952803,46.5432314,1 7.5950789,46.5431496,1 7.5947568,46.5431029,1 7.5942665,46.5430803,1 7.593782,46.543173,1 7.593057,46.543361,1 7.5926799,46.5434775,1 7.592416,46.54366,1 7.5922365,46.5437425,1 7.592001,46.5437709,1 7.591858,46.543718,1 7.591699,46.543739,1 7.5916485,46.5437996,1 7.5917,46.5438532,1 7.5919348,46.5438772,1 7.5923353,46.5438815,1 7.5925324,46.5438545,1 7.592877,46.543856,1 7.5930756,46.5438769,1 7.5935319,46.5440157,1 7.593698,46.544084,1 7.593821,46.544181,1 7.5939285,46.544299,1 7.594035,46.544772,1 7.594137,46.5451511,1 7.593934,46.545935,1 7.5937548,46.5466349,1 7.5937849,46.5467479,1 7.593708,46.546875,1 7.5936038,46.546858,1 7.5935586,46.5467893,1 7.593523,46.546572,1 7.5933226,46.546083,1 7.5931368,46.5457079,1 7.5929462,46.5455571,1 7.592638,46.545243,1 7.5925397,46.5451903,1 7.592354,46.545117,1 7.5922372,46.5451099,1 7.5920883,46.5451263,1 7.5916217,46.545168,1 + + + + #style-Unclassified + + relativeToGround + 7.5989053,46.5416069,1 7.598828,46.5418043,1 + + + + #style-Unclassified + + relativeToGround + 7.6001666,46.5412566,1 7.6000721,46.5411632,1 + + + + Fehrmelthal + #style-Unclassified + + relativeToGround + 7.4233856,46.4967518,1 7.4241495,46.4971123,1 7.4248619,46.4973545,1 7.4252291,46.4974725,1 7.4255929,46.4976732,1 7.4258661,46.4978981,1 7.426026,46.4981971,1 7.4261976,46.498398,1 7.4261976,46.4985752,1 7.4261376,46.498652,1 7.4256827,46.4984452,1 7.425305,46.4982798,1 7.4250743,46.4980211,1 7.4247643,46.4980198,1 7.4245669,46.4981203,1 7.4236742,46.4992133,1 7.4231077,46.4998042,1 7.4224039,46.5003654,1 7.4216744,46.5005013,1 7.4215885,46.5006195,1 7.4218718,46.5006904,1 7.4223009,46.500584,1 7.4228331,46.5004659,1 7.4235197,46.5004245,1 7.4238802,46.5002473,1 7.424481,46.5001468,1 7.4254509,46.5001468,1 7.4261603,46.5002229,1 7.4282833,46.5011512,1 7.4290987,46.5016239,1 7.4291416,46.502061,1 7.429442,46.5022974,1 7.4296137,46.5026105,1 7.429485,46.5028882,1 7.4299399,46.5036798,1 7.4301973,46.5044124,1 7.4305407,46.5051685,1 7.4310127,46.5059838,1 7.4316565,46.5063796,1 7.4327723,46.5072834,1 7.4335619,46.5078742,1 7.4340769,46.5087248,1 7.4358793,46.5105442,1 7.4364201,46.5108514,1 7.437081,46.5115957,1 7.437656,46.5123636,1 7.4381968,46.5130133,1 7.4389092,46.5135863,1 7.4395701,46.5139407,1 7.440128,46.5147263,1 7.4407288,46.5151811,1 7.4410721,46.515435,1 7.4415012,46.515565,1 7.4420162,46.5157304,1 7.4425312,46.516067,1 7.4427458,46.5165691,1 7.4430462,46.517266,1 7.4434754,46.5180338,1 7.4439045,46.5187544,1 7.4443508,46.5192387,1 7.4448057,46.5195517,1 7.4466793,46.5199766,1 7.4473145,46.5201656,1 7.4480526,46.5203724,1 7.4485333,46.5206204,1 7.4486363,46.5206972,1 7.4499581,46.5209039,1 7.451709,46.5212878,1 7.4525931,46.5215063,1 7.4536316,46.5215949,1 7.4544213,46.5217366,1 7.4552538,46.5219079,1 7.4557087,46.521961,1 7.456361,46.5219669,1 7.457082,46.5219374,1 7.458318,46.5218193,1 7.4592707,46.5217071,1 7.4599917,46.521648,1 7.4611504,46.5215831,1 7.4620774,46.521524,1 7.4627039,46.5213882,1 7.4638884,46.520898,1 7.4646523,46.5206145,1 7.4650814,46.5204373,1 7.4655106,46.5203783,1 7.4659998,46.5204491,1 7.4665406,46.5204964,1 7.4671414,46.5205259,1 7.4681713,46.5204668,1 7.4689009,46.5204373,1 7.4695875,46.5203664,1 7.4704888,46.5202011,1 7.4723341,46.5198349,1 7.4743769,46.5193034,1 7.4745657,46.5192856,1 7.474952,46.5192679,1 7.4759819,46.5190671,1 7.4768402,46.5188545,1 7.4780419,46.5183407,1 7.4798872,46.5176142,1 7.4822047,46.5170708,1 7.4829342,46.5167637,1 7.4837925,46.5161376,1 7.4845221,46.51586,1 7.4854834,46.5161258,1 + + + + #style-Unclassified + + relativeToGround + 7.4198288,46.4982833,1 7.4199867,46.4982171,1 7.4204588,46.4980104,1 7.4212742,46.4977031,1 7.4221153,46.4973486,1 7.4228878,46.497,1 7.4233856,46.4967518,1 7.4239729,46.4964435,1 + + + + #style-Unclassified + + relativeToGround + 7.4206823,46.4955804,1 7.4200296,46.495446,1 7.4196538,46.4953841,1 7.4194202,46.4953456,1 7.4187164,46.4951801,1 7.4180555,46.4951506,1 7.4177448,46.4951104,1 + + + + #style-Unclassified + + relativeToGround + 7.6045687,46.4880471,1 7.604255,46.4883112,1 7.6039469,46.4884404,1 7.6036512,46.4886227,1 7.603341,46.4887189,1 7.6032878,46.4889924,1 7.6021413,46.489726,1 7.6017531,46.4900467,1 7.6011402,46.490361,1 + + + + #style-Unclassified + + relativeToGround + 7.5922214,46.488268,1 7.5922897,46.4884803,1 7.592399,46.488507,1 + + + + #style-Unclassified + + relativeToGround + 7.596404,46.4883944,1 7.5967553,46.4880553,1 7.5966803,46.4878323,1 7.5963163,46.4876073,1 7.5963243,46.4872963,1 7.5964903,46.4875193,1 7.5966533,46.4875613,1 7.5969273,46.4874763,1 7.5971273,46.4876053,1 7.5975163,46.4876923,1 7.5975213,46.4878273,1 7.5977823,46.4880603,1 7.5979919,46.4884754,1 7.5979589,46.4885316,1 7.5978879,46.4887234,1 7.5972663,46.4893073,1 7.5965123,46.4896783,1 7.5951997,46.4905833,1 7.5944647,46.4907653,1 7.5942015,46.4909197,1 7.5938325,46.4911889,1 7.5935377,46.4913093,1 7.5929597,46.4912713,1 7.5924147,46.4913903,1 7.5922067,46.4915203,1 7.5921687,46.4916743,1 7.5922017,46.4919647,1 7.5922817,46.4920763,1 7.5923972,46.492067,1 7.5928397,46.4918383,1 7.5931657,46.4917383,1 7.5940527,46.4917123,1 7.5947097,46.4919123,1 7.5966573,46.4922393,1 + + + + #style-Unclassified + + relativeToGround + 7.6011402,46.490361,1 7.6010393,46.4904099,1 7.6003528,46.4908825,1 7.5998973,46.4910808,1 7.599409,46.491188,1 7.5966772,46.4913521,1 7.5964583,46.4914338,1 7.5961988,46.4916268,1 7.5961708,46.4917495,1 7.596319,46.491996,1 7.5966573,46.4922393,1 + + + + #style-Unclassified + + relativeToGround + 7.419988,46.5053819,1 7.4200223,46.5055355,1 7.4199966,46.5057068,1 7.4199193,46.5058604,1 7.4197734,46.5060258,1 7.4195073,46.5061144,1 7.4191898,46.5062503,1 7.4189323,46.5064157,1 7.4188121,46.5066638,1 7.4188722,46.5068706,1 7.4189666,46.5070951,1 7.4189923,46.5073491,1 7.4190782,46.5075618,1 7.4191297,46.5077803,1 7.4191039,46.5079989,1 7.4190267,46.5082057,1 7.4189494,46.508377,1 7.4189139,46.5084718,1 + + + + #style-Unclassified + + relativeToGround + 7.4230607,46.5136342,1 7.4228547,46.5134865,1 7.4226401,46.5132798,1 7.4222882,46.5131026,1 7.4218248,46.5129963,1 7.4211982,46.51289,1 7.4205545,46.5128014,1 7.4202283,46.5126596,1 7.4199365,46.5124765,1 7.4197476,46.5123761,1 7.4193185,46.5123465,1 7.4191211,46.512317,1 7.4190009,46.5121811,1 7.419061,46.5119862,1 7.4192327,46.5118444,1 7.4195932,46.5117086,1 7.4199966,46.5115314,1 7.4204085,46.5113483,1 7.4207175,46.511236,1 7.4210179,46.5111356,1 7.421387,46.5109879,1 7.4218162,46.5108107,1 7.4221595,46.5106512,1 7.4224599,46.5105331,1 7.4226058,46.5104445,1 7.4226144,46.5103795,1 7.4225286,46.5103145,1 7.4223998,46.5102791,1 7.4221423,46.5103086,1 7.4216788,46.510409,1 7.4212239,46.5104386,1 7.4208549,46.5104386,1 7.4205974,46.5105744,1 7.4202197,46.5107694,1 7.4198249,46.5109111,1 7.4193872,46.5109702,1 7.4189408,46.5109407,1 7.4185289,46.510917,1 7.4180997,46.5109407,1 7.4177478,46.5109466,1 7.4175418,46.5109879,1 7.4172929,46.5111238,1 7.4170869,46.511236,1 7.4167779,46.5113187,1 7.4164861,46.5114014,1 7.4162715,46.5114841,1 7.4162114,46.5115196,1 7.4161084,46.5115196,1 7.4161256,46.5114605,1 7.41622,46.5113896,1 7.4164775,46.5113187,1 7.4167436,46.5112301,1 7.4169496,46.5111179,1 7.417044,46.5109584,1 7.4170869,46.5107989,1 7.4171813,46.5106571,1 7.4175075,46.510474,1 7.4178079,46.5102791,1 7.4181855,46.5100133,1 7.4184859,46.5097829,1 7.4187778,46.5096411,1 7.4190438,46.509523,1 7.4193786,46.509393,1 7.4195331,46.5092985,1 7.4196017,46.5091567,1 7.4195588,46.5090268,1 7.4194472,46.5088791,1 7.4192584,46.5087078,1 7.4191125,46.5085542,1 7.4189139,46.5084718,1 + + + + #style-Unclassified + + relativeToGround + 7.4259103,46.506333,1 7.4256528,46.5063212,1 7.4254125,46.506268,1 7.4251121,46.5061794,1 7.4249576,46.5060613,1 7.4248288,46.5059254,1 7.4247859,46.5057541,1 7.4246915,46.5056359,1 7.4243224,46.5055296,1 7.4236358,46.5053819,1 7.4232152,46.5052224,1 7.422829,46.5050452,1 7.4223827,46.5049211,1 7.4220737,46.5048798,1 7.4218248,46.5049034,1 7.421593,46.5049034,1 7.4213527,46.5049211,1 7.4210952,46.5050452,1 7.4208892,46.5051397,1 7.4206317,46.5052224,1 7.4203742,46.5052578,1 7.4202026,46.5052992,1 7.420091,46.5053583,1 7.4200137,46.505376,1 7.419988,46.5053819,1 + + + + #style-Unclassified + + relativeToGround + 7.4305407,46.5051685,1 7.4303563,46.5050038,1 7.4298928,46.5045253,1 7.4297126,46.5043185,1 7.4294637,46.5041177,1 7.4290517,46.5038695,1 7.4288371,46.5036923,1 7.428468,46.5034324,1 7.4282106,46.5031192,1 7.4279016,46.5029479,1 7.4276012,46.5027766,1 7.4274982,46.5027411,1 7.4273866,46.5027589,1 7.4273351,46.5028179,1 7.4275153,46.5029302,1 7.427687,46.5030424,1 7.4278157,46.5031783,1 7.4279187,46.5032965,1 7.4279445,46.5033851,1 7.4279016,46.5034383,1 7.4277042,46.5034028,1 7.4274982,46.5032551,1 7.4272836,46.503137,1 7.4270433,46.5030424,1 7.4267085,46.5029834,1 7.4262193,46.5029538,1 7.4255841,46.5029774,1 7.4252494,46.5029834,1 7.4248117,46.5029006,1 7.4245113,46.5028947,1 7.4241336,46.5030306,1 7.4238933,46.503137,1 7.4237474,46.503196,1 7.4234212,46.5032256,1 7.4232925,46.5032551,1 7.4232324,46.5032906,1 7.4232238,46.5033378,1 7.423301,46.5033674,1 7.423404,46.5033851,1 7.4235757,46.5033733,1 7.4240649,46.503456,1 7.4244683,46.5035269,1 7.4247773,46.5036037,1 7.4250434,46.5037632,1 7.4254554,46.50397,1 7.4259103,46.5041354,1 7.4263223,46.5043126,1 7.4265369,46.5044485,1 7.4266828,46.5045253,1 7.4267858,46.504608,1 7.4269403,46.504673,1 7.4269832,46.5047084,1 7.426966,46.504738,1 7.4269231,46.5047439,1 7.4268544,46.5047202,1 7.42676,46.5046553,1 7.4266399,46.5045726,1 7.4264424,46.5044898,1 7.4261592,46.504413,1 7.4258502,46.5043422,1 7.4255326,46.5043008,1 7.4251207,46.5042949,1 7.4246228,46.5042949,1 7.4240649,46.5042949,1 7.4236014,46.5042831,1 7.4231551,46.5043008,1 7.4227775,46.5043126,1 7.4221166,46.5043599,1 7.4215243,46.504413,1 7.4211896,46.5045017,1 7.4209364,46.5046133,1 7.4207519,46.5048266,1 7.4206231,46.5049979,1 7.420357,46.5051338,1 7.4200738,46.5052401,1 7.419988,46.5053819,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.4668276,46.4566405,1 7.466626,46.456393,1 7.46638,46.456395,1 7.465978,46.457075,1 7.46552,46.45722,1 7.464934,46.457247,1 7.464328,46.457064,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.464328,46.457064,1 7.46402,46.45673,1 7.46447,46.45557,1 7.4642956,46.4543861,1 7.464124,46.45378,1 7.4641132,46.4532257,1 7.4642966,46.4529589,1 7.4642849,46.4527822,1 7.46408,46.45269,1 7.4638128,46.4527083,1 7.4636626,46.4529744,1 7.4634575,46.4537658,1 7.4603495,46.4557922,1 7.4588078,46.4570244,1 7.4581153,46.4575795,1 7.4574404,46.4583035,1 7.4570682,46.4587555,1 7.4569587,46.4589788,1 7.4568436,46.4593926,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.4703038,46.4532183,1 7.4710333,46.4527157,1 7.4713445,46.452553,1 7.4714196,46.4524422,1 7.4712908,46.4523978,1 7.4711192,46.4524274,1 7.4708774,46.4525547,1 7.4706364,46.4526048,1 7.4701321,46.4525826,1 7.4698401,46.452539,1 7.46948,46.4526,1 7.4683618,46.4533587,1 7.4678361,46.4538687,1 7.4676216,46.4543418,1 7.4674922,46.4547505,1 7.4675572,46.4549109,1 7.4675679,46.4551105,1 7.4675467,46.4553607,1 7.4675786,46.4555096,1 7.4676859,46.4556722,1 7.4676573,46.4558604,1 + + + + #style-Unclassified + + relativeToGround + 7.4418257,46.4493133,1 7.4429563,46.4496699,1 7.4449209,46.4532605,1 + + + + Eselmoosgassa + #style-Unclassified + + relativeToGround + 7.5352429,46.4735013,1 7.5361986,46.4737653,1 7.5368105,46.4739849,1 7.5370959,46.4740236,1 7.5375596,46.4740753,1 + + + + Eselmoosgassa + #style-Unclassified + + relativeToGround + 7.5375596,46.4740753,1 7.5377988,46.4741219,1 + + + + #style-Unclassified + + relativeToGround + 7.54748,46.480984,1 7.5484605,46.4809685,1 7.5488016,46.4810009,1 7.5501316,46.4812134,1 7.5504155,46.4813022,1 7.5507216,46.4814522,1 7.5509021,46.4815181,1 + + + + Kuonisbergliweg + #style-Unclassified + + relativeToGround + 7.5518939,46.4844236,1 7.5519996,46.4841301,1 7.5523714,46.4835666,1 7.5525084,46.4833243,1 7.5528638,46.4823913,1 7.5529761,46.4821915,1 7.553538,46.481365,1 7.553631,46.481207,1 7.553657,46.480986,1 7.553549,46.480827,1 7.553375,46.480816,1 + + + + #style-Unclassified + + relativeToGround + 7.4243085,46.4962111,1 7.4246201,46.4963695,1 7.4248078,46.4963991,1 7.4249741,46.4962993,1 7.4251565,46.4960408,1 7.4254194,46.4957565,1 7.4257949,46.4953466,1 7.4266078,46.4947785,1 7.4271663,46.49439,1 7.4277734,46.4936979,1 7.4282348,46.4930423,1 7.4286597,46.4925445,1 7.4289438,46.4921742,1 7.4290296,46.4920487,1 7.4291818,46.4920224,1 7.4292764,46.492141,1 7.4290968,46.4923259,1 7.4288097,46.4927134,1 7.4286112,46.4933701,1 7.4285262,46.4938679,1 7.4280041,46.4948028,1 7.4276399,46.4955677,1 7.4277006,46.495762,1 7.4281134,46.4963083,1 7.4286476,46.496709,1 7.4288783,46.4970125,1 7.4293882,46.4980203,1 7.4293761,46.4985181,1 7.4294611,46.4987609,1 7.4296918,46.4989795,1 7.4304297,46.4992462,1 7.4305531,46.4993902,1 7.4305052,46.4995865,1 7.4306388,46.4997079,1 7.4308643,46.4998038,1 7.4310681,46.4999256,1 7.4316421,46.5003946,1 7.431744,46.5004204,1 7.4318772,46.5004,1 7.4318942,46.5002986,1 7.4317977,46.5001841,1 7.4314523,46.4998658,1 7.4313417,46.4996339,1 7.4313794,46.4994165,1 7.431508,46.4991502,1 7.4317801,46.498943,1 7.4317073,46.4988095,1 7.4312944,46.4986395,1 7.4311609,46.4982752,1 7.4310896,46.4978651,1 7.4311808,46.4975955,1 7.4313256,46.4972706,1 + + + + #style-Unclassified + + relativeToGround + 7.603904,46.5152803,1 7.6038399,46.515509,1 7.6038519,46.5158038,1 7.6039341,46.5160746,1 7.6039201,46.5163173,1 7.6038358,46.5164998,1 7.6036794,46.5167405,1 7.6033694,46.5171449,1 + + + + #style-Unclassified + + relativeToGround + 7.4398617,46.4296989,1 7.4397759,46.4296619,1 7.4397115,46.4295362,1 7.4396686,46.4293809,1 7.4395291,46.429233,1 7.4391643,46.4289742,1 7.4389927,46.4289077,1 7.4388961,46.4289594,1 7.4388317,46.4293292,1 7.4387459,46.4294623,1 7.4386064,46.4294845,1 7.4384562,46.4293957,1 7.4383489,46.4292404,1 7.4382094,46.4290334,1 7.4381343,46.4289151,1 7.4374584,46.4288263,1 7.436922,46.4288337,1 7.4367181,46.4288263,1 7.4361388,46.428708,1 + + + + Glauistrasse + #style-Unclassified + + relativeToGround + 7.4444107,46.4389564,1 7.4442498,46.4390377,1 7.444121,46.43923,1 7.4434022,46.4402429,1 7.4433056,46.4402724,1 7.4432413,46.4402724,1 7.4431769,46.4401911,1 7.4431876,46.4401172,1 7.4432305,46.4398806,1 7.4432305,46.4396218,1 7.4432091,46.43923,1 7.4432091,46.4388751,1 7.4432413,46.4386237,1 7.4432413,46.4383945,1 7.4431769,46.4382096,1 7.4424903,46.4373076,1 7.44234,46.4372115,1 7.4415676,46.4367531,1 7.4414388,46.4366348,1 7.4413852,46.4364795,1 + + + + Glauistrasse + #style-Unclassified + + relativeToGround + 7.4424903,46.4373076,1 7.4423615,46.4369601,1 + + + + Glauistrasse + #style-Unclassified + + relativeToGround + 7.4433056,46.4402724,1 7.4431233,46.4408047,1 + + + + Seefluhstrasse + #style-Unclassified + + relativeToGround + 7.4434129,46.4428009,1 7.4433056,46.443311,1 + + + + Seefluhstrasse + #style-Unclassified + + relativeToGround + 7.4437348,46.4427639,1 7.4434129,46.4428009,1 + + + + #style-Unclassified + + relativeToGround + 7.4380056,46.4525884,1 7.4378983,46.4525958,1 + + + + #style-Unclassified + + relativeToGround + 7.4378983,46.4525958,1 7.4377374,46.4526105,1 + + + + #style-Unclassified + + relativeToGround + 7.4377374,46.4526105,1 7.4376301,46.452714,1 7.437437,46.453054,1 7.437319,46.4530762,1 7.4372117,46.4529875,1 7.4371366,46.4528249,1 7.4371151,46.4527066,1 7.4369756,46.4526253,1 + + + + Untere Bühlstrasse + #style-Unclassified + + relativeToGround + 7.433596,46.4585605,1 7.433639,46.4585162,1 7.4338965,46.4585383,1 7.4342612,46.4585088,1 7.4344544,46.4584496,1 7.4346367,46.4583166,1 7.4346904,46.4581244,1 7.4346689,46.4579249,1 7.4344865,46.4577032,1 7.4344651,46.4575406,1 7.4345295,46.4574371,1 + + + + Rütistrasse + #style-Unclassified + + relativeToGround + 7.4304096,46.4586862,1 7.4302379,46.4586344,1 7.4301962,46.4583535,1 7.4301362,46.4577031,1 7.430222,46.4569817,1 7.4301104,46.456284,1 7.4302821,46.4559884,1 7.4308571,46.4556691,1 7.4291826,46.4541298,1 7.427084,46.4535514,1 7.4274775,46.4522141,1 + + + + #style-Unclassified + + relativeToGround + 7.4353588,46.4606376,1 7.4352054,46.4610438,1 7.4349693,46.4614355,1 + + + + #style-Unclassified + + relativeToGround + 7.430159,46.462852,1 7.4301306,46.4627805,1 7.4301306,46.4625736,1 7.430195,46.4620637,1 7.4302272,46.4618346,1 7.4301521,46.4614724,1 7.4300233,46.4613172,1 7.4297015,46.4611029,1 + + + + Flöschstrasse + #style-Unclassified + + relativeToGround + 7.430159,46.462852,1 7.4302272,46.4629801,1 7.4302808,46.4631574,1 7.4303452,46.4642216,1 7.430313,46.4646429,1 7.4302379,46.4654336,1 7.4301199,46.4663278,1 7.4299697,46.4668007,1 7.4296908,46.4675249,1 7.4294547,46.4679831,1 7.4292187,46.468589,1 7.4291066,46.4688619,1 7.4290537,46.4691138,1 + + + + #style-Unclassified + + relativeToGround + 7.4290537,46.4691138,1 7.4286822,46.4691654,1 7.4284659,46.4692383,1 7.4281887,46.4695127,1 7.4278132,46.4699265,1 7.4276201,46.4700817,1 7.4271158,46.4705176,1 7.4268262,46.4707615,1 7.4268047,46.4708649,1 7.4269334,46.4710275,1 + + + + Obere Ägertenstrasse + #style-Unclassified + + relativeToGround + 7.4302379,46.4654336,1 7.430592,46.4651602,1 7.4308602,46.4648646,1 7.4309997,46.4646133,1 7.4313859,46.4639999,1 7.4317721,46.4632313,1 7.4320082,46.4627436,1 7.4321155,46.4624849,1 7.4322834,46.461897,1 7.4323193,46.461199,1 + + + + Sagistrasse + #style-Unclassified + + relativeToGround + 7.4351088,46.4673623,1 7.4358872,46.4676242,1 + + + + Oberriedstrasse + #style-Unclassified + + relativeToGround + 7.4545769,46.4439833,1 7.4547271,46.4439241,1 + + + + Oberriedstrasse + #style-Unclassified + + relativeToGround + 7.4547271,46.4439241,1 7.4548183,46.4438761,1 7.454876,46.443826,1 7.4550079,46.4436536,1 7.4551627,46.4430606,1 7.4553113,46.4426596,1 7.4554721,46.4423588,1 7.4560542,46.4417253,1 7.4562979,46.441431,1 7.45647,46.441134,1 7.4564938,46.441,1 7.4565824,46.4408413,1 7.4566176,46.4407782,1 7.4572602,46.4399218,1 7.4576464,46.4396497,1 7.4579549,46.4395665,1 7.4587721,46.4394172,1 7.4590882,46.439328,1 7.4594231,46.4391233,1 7.4597503,46.438854,1 7.4600197,46.4385501,1 7.4606355,46.4376757,1 7.4607449,46.4375203,1 7.4612856,46.4369761,1 7.4623242,46.4356452,1 7.463195,46.434967,1 7.4633488,46.4348497,1 7.4636343,46.4345773,1 7.4640337,46.4340246,1 7.4642365,46.4337625,1 7.4644614,46.4335157,1 7.4653563,46.432764,1 7.4661983,46.4321939,1 7.4667084,46.4318423,1 7.4669016,46.4316887,1 7.4670482,46.4314854,1 7.467344,46.4306214,1 7.4675058,46.4302754,1 7.4677582,46.4299748,1 + + + + Oberriedstrasse + #style-Unclassified + + relativeToGround + 7.4440966,46.4543426,1 7.4441109,46.4543138,1 7.4442933,46.4540773,1 7.444583,46.4537447,1 7.4447935,46.4534764,1 7.4449209,46.4532605,1 7.4449978,46.4530345,1 7.4450658,46.4527542,1 7.4451127,46.4523018,1 7.4451741,46.4520707,1 7.4453308,46.4518244,1 7.4460796,46.4511056,1 7.4469774,46.4504619,1 7.4478827,46.4500392,1 7.448556,46.4497567,1 7.4490141,46.4495254,1 7.4498329,46.4490688,1 7.4503311,46.4488049,1 7.450763,46.448663,1 7.451105,46.4485549,1 7.4513722,46.4483848,1 7.451504,46.4482133,1 7.4520636,46.4473548,1 7.4524759,46.4465754,1 7.4528298,46.4461337,1 7.4531239,46.4458511,1 7.4534257,46.4454192,1 7.4538049,46.4449126,1 7.4542979,46.4443603,1 7.4545085,46.4440271,1 7.4545769,46.4439833,1 + + + + Oberriedstrasse + #style-Unclassified + + relativeToGround + 7.444062,46.4544122,1 7.4440966,46.4543426,1 + + + + Lischmattenstrasse + #style-Unclassified + + relativeToGround + 7.4439634,46.4542879,1 7.4438105,46.4542602,1 + + + + Lischmattenstrasse + #style-Unclassified + + relativeToGround + 7.4438105,46.4542602,1 7.4433035,46.4541697,1 7.4407581,46.4538384,1 7.4394643,46.4538143,1 + + + + Rawilstrasse + #style-Unclassified + + relativeToGround + 7.4430005,46.457189,1 7.4430622,46.4571982,1 + + + + Schulstrasse + #style-Unclassified + + relativeToGround + 7.4435047,46.4557418,1 7.4434082,46.4557385,1 + + + + Gutenbrunnenstrasse + #style-Unclassified + + relativeToGround + 7.4448524,46.4597347,1 7.4449449,46.4598479,1 + + + + Bühlbergstrasse + #style-Unclassified + + relativeToGround + 7.4476773,46.4598777,1 7.4476229,46.4599377,1 + + + + Bühlbergstrasse + #style-Unclassified + + relativeToGround + 7.4476229,46.4599377,1 7.4475736,46.459992,1 7.4472866,46.4601065,1 7.4471632,46.4601564,1 7.4470908,46.4602063,1 7.4469806,46.460365,1 7.4468012,46.4607348,1 7.4466644,46.4609528,1 7.4465596,46.4612913,1 7.446482,46.4616641,1 7.4465494,46.4620495,1 7.4467601,46.4623722,1 7.4469595,46.462428,1 7.4470958,46.4624741,1 7.4471548,46.4625571,1 7.4471354,46.4626788,1 7.4470643,46.4628183,1 7.4470759,46.4629039,1 7.447149,46.4629496,1 7.4472496,46.4629448,1 7.4473107,46.4629016,1 7.4474659,46.4626716,1 7.4474787,46.462537,1 7.44739,46.4622619,1 7.44739,46.4621592,1 7.447435,46.4620685,1 7.4475389,46.4619867,1 7.4476454,46.4619468,1 7.4477672,46.4619562,1 7.4478306,46.4620086,1 7.4478473,46.4620985,1 7.4478115,46.4623099,1 7.447841,46.4624429,1 7.4481888,46.4626571,1 7.4488776,46.4629016,1 7.4494952,46.4630339,1 7.4499363,46.4629898,1 7.4504521,46.4631043,1 7.4507207,46.4630546,1 7.4509197,46.4629352,1 7.4508202,46.4626367,1 7.4509495,46.4623582,1 7.4512878,46.4622786,1 7.4516857,46.4623283,1 7.4536257,46.4631043,1 7.4547299,46.4630645,1 7.4552771,46.463363,1 + + + + Ägertenstrasse + #style-Unclassified + + relativeToGround + 7.4376101,46.4601022,1 7.4375109,46.4601364,1 7.4365881,46.4604558,1 7.4361085,46.4605709,1 7.4353588,46.4606376,1 7.4350766,46.4606669,1 7.4348713,46.4607347,1 + + + + Ägertenstrasse + #style-Unclassified + + relativeToGround + 7.4377581,46.4600511,1 7.4376101,46.4601022,1 + + + + Sagistrasse + #style-Unclassified + + relativeToGround + 7.4361018,46.4677055,1 7.4363271,46.4677904,1 7.4370442,46.4681471,1 7.4371615,46.468206,1 7.4384373,46.46873,1 + + + + Sagistrasse + #style-Unclassified + + relativeToGround + 7.4358872,46.4676242,1 7.4361018,46.4677055,1 + + + + Mittlere Ägertenstrasse + #style-Unclassified + + relativeToGround + 7.4290537,46.4691138,1 7.4305276,46.4683451,1 7.4316423,46.467711,1 7.4319089,46.4675275,1 7.4327807,46.4664017,1 7.4335209,46.4654705,1 7.435674,46.4631469,1 7.4366858,46.462123,1 7.4374483,46.4612465,1 7.4377862,46.4608179,1 7.4378453,46.4606479,1 7.4378131,46.4605149,1 7.4377148,46.4603861,1 7.4375109,46.4601364,1 + + + + Flöschstrasse + #style-Unclassified + + relativeToGround + 7.4296586,46.4726679,1 7.4295084,46.4724019,1 7.429171,46.4719433,1 7.4290276,46.4717095,1 7.4289541,46.4714632,1 7.4289403,46.4708977,1 7.4290537,46.4691138,1 + + + + Schadaulistrasse + #style-Unclassified + + relativeToGround + 7.4288706,46.4759627,1 7.4284414,46.475863,1 7.4282269,46.4757891,1 7.4280485,46.4756506,1 7.4279098,46.4754978,1 7.4278668,46.4752687,1 7.427899,46.4750249,1 7.4280814,46.4747663,1 7.4289342,46.4740116,1 7.4295727,46.4730964,1 7.4296586,46.4728821,1 7.4296586,46.4726679,1 + + + + Schadaulistrasse + #style-Unclassified + + relativeToGround + 7.4292187,46.4760445,1 7.4288706,46.4759627,1 + + + + #style-Unclassified + + relativeToGround + 7.4239729,46.4964435,1 7.4241194,46.4963413,1 + + + + #style-Unclassified + + relativeToGround + 7.4241194,46.4963413,1 7.4243085,46.4962111,1 7.4245872,46.4960192,1 7.4248311,46.4957794,1 7.4250679,46.4955465,1 7.425394,46.4950502,1 7.425394,46.494607,1 7.4253855,46.4943529,1 7.4252825,46.4941166,1 7.4252996,46.4939629,1 7.4255571,46.493443,1 7.4257889,46.4929289,1 7.4260378,46.4923971,1 7.4263553,46.4919657,1 7.4267244,46.4915698,1 7.427042,46.4912389,1 7.4274368,46.4908607,1 7.4277973,46.4903348,1 7.4277544,46.4901043,1 7.4276085,46.489927,1 7.4273767,46.4897616,1 7.4272987,46.4897359,1 + + + + #style-Unclassified + + relativeToGround + 7.4451135,46.4568262,1 7.4457293,46.4570504,1 7.4457346,46.4571022,1 7.4455791,46.4573572,1 + + + + #style-Unclassified + + relativeToGround + 7.4310896,46.4978651,1 7.4312559,46.4980313,1 7.4313202,46.4981679,1 7.4314812,46.4983193,1 7.4317494,46.4984966,1 7.43246,46.4986638,1 7.43263,46.4987973,1 7.4326179,46.498943,1 7.4327757,46.4992223,1 7.4332371,46.4995258,1 7.4335304,46.4996856,1 7.4339273,46.4998112,1 7.4342385,46.4998038,1 7.4345241,46.4997444,1 7.4352577,46.4996228,1 7.4360463,46.4995231,1 7.4366203,46.4994493,1 7.437087,46.4993717,1 7.4374357,46.4992757,1 7.4382029,46.4989309,1 7.4388787,46.4984079,1 7.439281,46.4981605,1 7.4399999,46.4976842,1 7.4411371,46.4971856,1 7.4421611,46.4969154,1 7.4432902,46.4966361,1 7.4441358,46.4965578,1 7.4445489,46.4965357,1 7.4447957,46.4966686,1 7.44486,46.4968385,1 7.4447259,46.4969936,1 7.4440503,46.4973064,1 7.4432926,46.4976366,1 7.4426516,46.4981223,1 7.4415831,46.4989576,1 7.4414107,46.4992129,1 7.4411693,46.4999145,1 7.4410996,46.5000438,1 7.4410272,46.5001361,1 7.4410459,46.5001952,1 7.4411103,46.5002007,1 7.4411774,46.5001767,1 7.4412176,46.5000863,1 7.4413919,46.4998112,1 7.4420705,46.4994308,1 7.4424139,46.4991428,1 7.4427464,46.4989434,1 7.4429503,46.4988843,1 7.4433902,46.498936,1 7.4439213,46.4988566,1 7.4442726,46.4988215,1 7.4446347,46.4987292,1 7.4450317,46.4984338,1 7.4455681,46.4981974,1 7.446244,46.4979943,1 7.4467966,46.4977876,1 7.4471775,46.4977137,1 7.4473438,46.4976251,1 7.4475047,46.4976066,1 7.4475905,46.4976472,1 7.4475852,46.4977174,1 7.4474403,46.4977949,1 7.447274,46.4978873,1 7.4471131,46.4979537,1 7.4467912,46.4982048,1 7.4464372,46.4985372,1 7.4460724,46.4990542,1 7.4455896,46.4994973,1 7.4449888,46.4998665,1 7.4444631,46.5002949,1 7.4442592,46.500738,1 7.4439052,46.5014617,1 7.4434867,46.5020008,1 7.4434224,46.5025916,1 7.4432078,46.5032267,1 7.4428215,46.5038618,1 7.4426928,46.504268,1 7.4424246,46.5045708,1 7.4419525,46.5049474,1 7.441577,46.5052686,1 7.4414268,46.5053978,1 7.4413785,46.5054643,1 7.4414322,46.5055455,1 7.4415502,46.5055566,1 7.4416467,46.5054938,1 7.441754,46.5053831,1 7.4418238,46.5053018,1 7.4423602,46.5049621,1 7.4430576,46.5046298,1 7.4436799,46.5041498,1 7.4444631,46.5038618,1 7.4456647,46.5034483,1 7.4466839,46.5029387,1 7.4477461,46.5024366,1 7.4483898,46.5019344,1 7.4490014,46.5017276,1 7.4500421,46.5016168,1 7.4508387,46.5015134,1 7.4512035,46.50153,1 7.4520323,46.5016076,1 7.4526867,46.5016759,1 7.453191,46.5016574,1 7.4535665,46.5016316,1 7.4538723,46.5015467,1 7.4540976,46.5013953,1 7.4543336,46.5013436,1 7.4544892,46.5013436,1 7.4546286,46.5013934,1 7.4548137,46.5014728,1 7.4549773,46.5014839,1 7.4551919,46.5014765,1 7.4554279,46.5015245,1 7.4557122,46.501639,1 7.4559831,46.5017073,1 7.4562701,46.5017756,1 7.4565491,46.5017959,1 7.4568227,46.5018845,1 7.4571794,46.5020212,1 7.4576032,46.5021172,1 7.4580458,46.502215,1 7.4582952,46.502311,1 7.458322,46.5023535,1 7.4583113,46.5023996,1 7.4582174,46.502407,1 7.4580833,46.5023922,1 7.4579278,46.5024144,1 7.4577132,46.5025326,1 7.4570051,46.5028427,1 7.4564043,46.5030643,1 7.4557391,46.5032563,1 7.4549451,46.5035074,1 7.4543443,46.5036698,1 7.4538723,46.5038471,1 7.4533787,46.5040391,1 7.4530354,46.5042458,1 7.4527565,46.5044083,1 + + + + #style-Unclassified + + relativeToGround + 7.592399,46.488507,1 7.59321,46.488437,1 7.59392,46.488552,1 7.594131,46.488536,1 7.5943718,46.4884212,1 7.5948158,46.4885033,1 7.5952399,46.4885619,1 7.5955708,46.4884936,1 7.5960104,46.4885348,1 + + + + #style-Unclassified + + relativeToGround + 7.5960104,46.4885348,1 7.5962371,46.488494,1 7.596404,46.4883944,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.5148593,46.4576658,1 7.5139753,46.4570098,1 7.5137473,46.4566738,1 7.5134953,46.4566158,1 7.5132313,46.4567988,1 7.5131163,46.4569628,1 7.5132733,46.4572948,1 + + + + Diemtigtalstrasse + #style-Unclassified + + relativeToGround + 7.5600746,46.6314618,1 7.5598156,46.6312398,1 7.559655,46.6309751,1 7.5593873,46.6307986,1 7.5590242,46.6307277,1 7.5582769,46.6304248,1 7.5576765,46.6305044,1 7.5572299,46.6304384,1 7.5555999,46.6298843,1 7.5555016,46.629737,1 7.5554714,46.6294791,1 7.5553783,46.6293059,1 7.5551891,46.629144,1 7.5549186,46.6289567,1 7.5544468,46.6288002,1 7.5541557,46.6287772,1 7.5537162,46.6287061,1 7.553227,46.6285376,1 7.5526808,46.6281825,1 7.5524817,46.6280484,1 7.5518999,46.6277116,1 7.5514352,46.6270945,1 7.5510642,46.6263117,1 7.5508466,46.626119,1 7.5508232,46.6259826,1 7.5506946,46.6258393,1 7.5504849,46.625715,1 7.5503553,46.6254358,1 7.550316,46.6251753,1 7.550244,46.6250835,1 7.5500438,46.6248793,1 7.5488614,46.6241043,1 7.5485721,46.6238921,1 7.548328,46.6237442,1 7.5480229,46.6235274,1 7.54797,46.6233309,1 7.5477086,46.6229447,1 7.547457,46.6226864,1 7.5470609,46.6224583,1 7.5457883,46.6215605,1 7.5455609,46.6214509,1 7.5453464,46.621419,1 7.5446782,46.6212488,1 7.5433859,46.62073,1 7.5429287,46.6205111,1 7.5421192,46.6198929,1 7.5418311,46.619571,1 7.5417298,46.6192503,1 7.5415818,46.6188457,1 7.541494,46.6184536,1 7.5414137,46.6182422,1 7.5413211,46.6181037,1 7.5411663,46.6178794,1 7.5410485,46.6177926,1 7.5406361,46.6174361,1 7.5401975,46.6169536,1 7.5396964,46.6164697,1 7.5391172,46.616091,1 7.5386223,46.615864,1 7.5380109,46.6151669,1 7.5378718,46.6149389,1 7.5376117,46.6147741,1 7.537236,46.6147098,1 7.5370075,46.6146143,1 7.5367774,46.6144043,1 7.5355882,46.6137959,1 7.5352713,46.6136639,1 7.5350754,46.6135533,1 7.5337253,46.6127512,1 7.5333154,46.6125519,1 7.5329988,46.6124922,1 7.5323089,46.612488,1 7.5318122,46.6125197,1 7.5315634,46.6124686,1 7.5314699,46.6123848,1 7.5314302,46.6121513,1 7.5313915,46.6119232,1 7.5312951,46.6117809,1 7.5309538,46.6115558,1 7.5305549,46.6113981,1 7.5300789,46.6112805,1 7.5296412,46.611198,1 7.5292201,46.6111837,1 7.5283316,46.611403,1 7.5276551,46.6115571,1 7.5272051,46.6115766,1 7.5261496,46.6114159,1 7.52564,46.6113005,1 7.5253453,46.6111977,1 7.5248067,46.6109049,1 7.5245846,46.6108356,1 7.5236745,46.6108032,1 7.5233471,46.6107245,1 7.5230431,46.6105063,1 7.5228115,46.6101505,1 7.5225994,46.609902,1 7.522408,46.6097115,1 7.5221107,46.6095417,1 7.5215979,46.6093977,1 7.5212467,46.6093381,1 7.5210101,46.6092757,1 7.5207618,46.6091481,1 7.5202006,46.6082884,1 7.519828,46.6078676,1 7.5194859,46.6075841,1 7.5190794,46.6074094,1 7.5184389,46.6073161,1 7.5169906,46.6071004,1 7.5157977,46.6070594,1 7.5153595,46.6069773,1 7.515053,46.6067635,1 7.5140954,46.6063115,1 7.513268,46.6063192,1 7.5117359,46.6057293,1 7.5105255,46.6048942,1 7.5097041,46.6044949,1 7.5096904,46.6044882,1 7.5089857,46.604289,1 7.5084647,46.6038754,1 7.5070322,46.6034157,1 7.506404,46.6027646,1 7.5055996,46.6024505,1 7.5043126,46.6011558,1 7.5026183,46.5984083,1 7.502045,46.5974786,1 7.5000149,46.5965747,1 7.499065,46.5959771,1 7.4991109,46.595709,1 7.4998387,46.5957243,1 7.5004286,46.5958162,1 7.5005435,46.5957779,1 7.50026,46.5955022,1 7.4972494,46.5926064,1 7.4965446,46.5914113,1 7.4957172,46.5887913,1 7.495564,46.5859032,1 7.4954261,46.5842868,1 7.4941238,46.5812531,1 7.4929747,46.5807399,1 7.4924614,46.5802955,1 7.4917949,46.5801576,1 7.4911437,46.579744,1 7.4901019,46.5793379,1 7.4888838,46.5783574,1 7.487773,46.5775147,1 7.4871372,46.5767026,1 7.4871895,46.5761873,1 7.4873108,46.5760875,1 7.4861474,46.5754004,1 7.4858975,46.5750647,1 7.485351,46.5746508,1 7.4846404,46.573667,1 7.4837035,46.5731439,1 7.4837425,46.5728862,1 7.4843437,46.5723709,1 7.4846795,46.5722147,1 7.4849293,46.5717619,1 7.4853822,46.5713403,1 7.4866393,46.5706453,1 7.4866159,46.5701456,1 7.4856945,46.5700051,1 7.4837269,46.5688339,1 7.483438,46.5685138,1 7.4831257,46.5683576,1 7.4819015,46.5676487,1 7.481459,46.567211,1 7.4803362,46.5667495,1 7.4800756,46.5665507,1 7.4797748,46.5663213,1 7.4794227,46.5658312,1 + + + + #style-Unclassified + + relativeToGround + 7.6072841,46.5284422,1 7.6065438,46.5287744,1 7.6059609,46.5289507,1 + + + + Rainweg + #style-Unclassified + + relativeToGround + 7.5725176,46.503522,1 7.571786,46.5036569,1 7.5716948,46.503694,1 7.5715584,46.5037674,1 7.5714301,46.5038062,1 7.5713036,46.5036465,1 7.5711946,46.5034698,1 + + + + Rainweg + #style-Unclassified + + relativeToGround + 7.5716948,46.503694,1 7.5714793,46.5034154,1 + + + + Trogweg + #style-Unclassified + + relativeToGround + 7.5717115,46.5024556,1 7.5720126,46.5023572,1 7.572155,46.5022396,1 7.5722022,46.5021698,1 7.5721933,46.5021194,1 7.572159,46.502032,1 7.5721677,46.5020008,1 7.572181,46.50198,1 7.572291,46.5019165,1 + + + + Laserweg + #style-Unclassified + + relativeToGround + 7.5717043,46.5024447,1 7.570935,46.502664,1 7.5706686,46.5027262,1 7.5703643,46.5027686,1 7.5702629,46.5027661,1 7.5701922,46.5027436,1 7.57008,46.502591,1 7.5699495,46.5024145,1 7.569842,46.502313,1 7.569743,46.5022761,1 7.5696887,46.5022836,1 7.5696452,46.5023073,1 7.5696416,46.5023484,1 + + + + Tannenweg + #style-Unclassified + + relativeToGround + 7.5625853,46.4950604,1 7.5629277,46.4952317,1 7.5632285,46.4954048,1 7.56365,46.495627,1 + + + + #style-Unclassified + + relativeToGround + 7.5627191,46.4953707,1 7.5625165,46.4953073,1 7.5621808,46.4951509,1 + + + + Aebiweg + #style-Unclassified + + relativeToGround + 7.5371522,46.4817482,1 7.5372839,46.4820083,1 7.537241,46.4823334,1 7.5370908,46.4827175,1 7.5371766,46.4828653,1 7.5376916,46.4829392,1 7.5382709,46.4830869,1 7.5387215,46.4830721,1 7.5390649,46.483013,1 7.5393653,46.482821,1 7.5395369,46.4827471,1 7.5397515,46.482688,1 7.5400614,46.4825351,1 7.5405388,46.4820442,1 + + + + Senggistrasse + #style-Unclassified + + relativeToGround + 7.5524133,46.4901418,1 7.552748,46.4907505,1 7.5531342,46.4908864,1 7.5536321,46.4912646,1 7.5545504,46.491625,1 7.5550053,46.4920091,1 7.5554688,46.4922455,1 7.5555976,46.4922278,1 7.5556793,46.492015,1 7.5554173,46.49169,1 7.5550311,46.4914773,1 7.5549109,46.4913118,1 7.5549882,46.4910991,1 7.5555547,46.4908982,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.4673625,46.4564555,1 7.4673641,46.4565592,1 7.4673418,46.45667,1 7.4673426,46.4568327,1 7.467407,46.4569435,1 7.4675943,46.457032,1 7.4676,46.45709,1 7.4675143,46.4571431,1 7.4673962,46.4571579,1 7.4672782,46.4571061,1 7.4671066,46.4569879,1 7.4669969,46.4568804,1 7.4668383,46.4568253,1 7.4668276,46.4566405,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.4676573,46.4558604,1 7.4673625,46.4564555,1 + + + + #style-Unclassified + + relativeToGround + 7.5555691,46.489152,1 7.5555719,46.4891333,1 7.5555852,46.489115,1 7.5555979,46.4891035,1 7.5556169,46.4890931,1 7.5556628,46.4890846,1 7.5557363,46.4890835,1 7.5559446,46.4890818,1 7.5561531,46.4890823,1 + + + + Gruebiweg + #style-Unclassified + + relativeToGround + 7.5552097,46.4887457,1 7.5553556,46.4888139,1 7.5555678,46.4888499,1 7.5558846,46.4888569,1 7.556089,46.4888482,1 + + + + Alte Strasse + #style-Unclassified + + relativeToGround + 7.5850973,46.5007372,1 7.5850387,46.5007685,1 7.5846542,46.5009922,1 7.5846239,46.5011334,1 7.5847252,46.501739,1 7.5847275,46.5020678,1 7.5849919,46.5028044,1 7.5855069,46.5035872,1 7.5855713,46.5038678,1 7.5857301,46.5039004,1 7.5859361,46.5039121,1 7.5860004,46.5040303,1 7.5858717,46.5045176,1 7.5860434,46.5048573,1 7.5863867,46.5051675,1 7.5868778,46.506548,1 7.5869798,46.5067495,1 7.587087,46.5069209,1 7.58715,46.5070534,1 7.5872426,46.5074858,1 7.587245,46.5076043,1 7.58713,46.5078698,1 7.5871139,46.5079584,1 7.5871729,46.5080876,1 7.587307,46.5081578,1 7.5875108,46.5082168,1 7.5876199,46.5082948,1 7.5876557,46.5084384,1 7.5875806,46.5087337,1 7.5876556,46.5089368,1 7.5878863,46.5094832,1 7.5880044,46.5096567,1 7.5882243,46.5098561,1 7.5884442,46.5100702,1 7.5886588,46.5103323,1 7.5888412,46.5105723,1 7.5889177,46.5107599,1 7.5889616,46.5109714,1 7.5888627,46.5113365,1 7.5887152,46.5114922,1 7.5886612,46.5116064,1 7.5886588,46.5118054,1 7.5887308,46.5121362,1 7.5887696,46.5124147,1 7.5888949,46.5126656,1 7.5893693,46.5131274,1 7.5896405,46.5132526,1 7.5902491,46.5134523,1 7.5909226,46.5134852,1 7.5913249,46.5134999,1 7.5915127,46.5134888,1 7.5918024,46.5134076,1 7.5924407,46.5133559,1 7.5926392,46.5133707,1 7.5927197,46.5134261,1 7.5927143,46.5135258,1 7.5925989,46.5135841,1 7.5923227,46.5136993,1 7.5921118,46.5138459,1 7.5919258,46.5139835,1 7.5916629,46.5142346,1 7.5916009,46.5143235,1 7.5915288,46.5144782,1 7.5914,46.5145816,1 7.5912498,46.5146813,1 7.5911503,46.5147665,1 7.5911372,46.5148289,1 7.5911936,46.5149035,1 7.5912767,46.5149618,1 7.5914698,46.5150504,1 7.5919204,46.5151575,1 7.5922017,46.5152686,1 7.5922526,46.5153912,1 7.5922798,46.5155377,1 7.5922583,46.5156337,1 7.5921779,46.5157961,1 7.5921457,46.5158884,1 7.5921588,46.5159774,1 7.5923174,46.5162059,1 7.5923388,46.5163203,1 7.5923948,46.5163908,1 7.5934463,46.5170848,1 7.5941445,46.5176762,1 7.5943827,46.5179335,1 7.5946831,46.5185647,1 7.594785,46.5188416,1 7.5949566,46.519063,1 7.5951605,46.5192513,1 7.5955789,46.5194949,1 7.5959139,46.5196688,1 7.5962656,46.5197533,1 7.5964503,46.5198164,1 7.5965552,46.519901,1 7.5966035,46.5200117,1 7.5966947,46.5201815,1 7.5968557,46.5203624,1 7.5973599,46.5207942,1 7.5975454,46.5208933,1 7.5977461,46.5209603,1 7.5978856,46.5210748,1 7.5979715,46.5212519,1 7.5979983,46.521455,1 7.5979661,46.5216912,1 7.5979607,46.5218167,1 7.5980412,46.5219939,1 7.5980948,46.5221415,1 7.5980753,46.5223333,1 7.59811,46.5226362,1 7.5982021,46.522924,1 + + + + Alte Strasse + #style-Unclassified + + relativeToGround + 7.5851089,46.5006757,1 7.5850973,46.5007372,1 + + + + Alte Strasse + #style-Unclassified + + relativeToGround + 7.5851089,46.5006757,1 7.5850643,46.5006438,1 7.5845945,46.5005489,1 7.5842102,46.5002567,1 7.5838483,46.4999466,1 7.5830537,46.4991232,1 7.5826523,46.4989336,1 7.582594,46.4989054,1 7.5810925,46.497901,1 7.5804891,46.4976849,1 7.5801849,46.4975458,1 7.5795841,46.4969549,1 7.5791121,46.4966595,1 7.5788121,46.4963841,1 7.5784683,46.4960686,1 7.5779508,46.4959746,1 7.5778518,46.4959324,1 7.577856,46.4958566,1 7.5780392,46.495596,1 7.5779939,46.49555,1 + + + + Bütscheggenweg + #style-Unclassified + + relativeToGround + 7.5753139,46.5088011,1 7.5752226,46.5089091,1 7.5750338,46.5093631,1 7.5749573,46.5094711,1 7.574882,46.5094983,1 7.5747902,46.5094904,1 7.5746294,46.5094263,1 7.5745088,46.5093055,1 7.574491,46.5092875,1 7.57442,46.509189,1 7.574359,46.509088,1 7.574338,46.508939,1 7.574222,46.508688,1 7.574139,46.508567,1 7.574031,46.508442,1 7.573789,46.508273,1 7.573645,46.508149,1 7.573516,46.507976,1 7.57336,46.507811,1 7.573107,46.50769,1 7.572656,46.507421,1 7.572422,46.507265,1 7.572219,46.507108,1 7.57199,46.50692,1 7.571725,46.506695,1 7.571557,46.506537,1 7.571456,46.506313,1 7.571314,46.506114,1 7.570996,46.505779,1 7.570623,46.505583,1 7.5704442,46.5055077,1 7.570293,46.505449,1 7.570076,46.505348,1 7.569794,46.505203,1 7.569594,46.505027,1 7.5695203,46.50499,1 7.5694718,46.5049861,1 7.5694441,46.5050305,1 7.5694427,46.505069,1 7.569616,46.505224,1 7.569758,46.50538,1 7.569953,46.505639,1 7.570025,46.505838,1 7.570039,46.506066,1 7.569997,46.506254,1 7.569945,46.506424,1 7.569946,46.506613,1 7.5698959,46.5066559,1 7.5697967,46.5066484,1 7.569597,46.506478,1 7.569278,46.5061,1 7.5691127,46.5059387,1 7.568755,46.505672,1 7.5684874,46.5053996,1 7.568432,46.50536,1 7.568207,46.505142,1 7.567728,46.504666,1 7.56754,46.504485,1 7.567329,46.504179,1 7.5672453,46.5041525,1 7.5670457,46.5040965,1 7.566915,46.504026,1 7.5668264,46.5039619,1 7.5667654,46.5039084,1 7.566586,46.503722,1 7.5665589,46.5036645,1 7.5662748,46.5034588,1 7.566168,46.503343,1 7.5660937,46.5031901,1 7.5660213,46.5030833,1 7.565959,46.5030093,1 7.5658571,46.5029369,1 + + + + Hohliebeweg + #style-Unclassified + + relativeToGround + 7.5748122,46.4926149,1 7.5748165,46.4925846,1 7.5748422,46.4925475,1 7.5752285,46.4925784,1 7.5753308,46.4925713,1 7.5753936,46.4925327,1 7.5753914,46.4924534,1 7.5752299,46.4923705,1 7.5750836,46.4923319,1 7.5747518,46.4923365,1 7.574514,46.4923496,1 7.5744161,46.4923149,1 7.5742703,46.4921827,1 7.5741195,46.4920273,1 7.5739786,46.4915334,1 7.5738497,46.4911149,1 7.5737082,46.4907245,1 7.5736295,46.490499,1 7.573569,46.490309,1 7.5735774,46.490168,1 7.5737097,46.4899012,1 7.573877,46.4897669,1 7.5740024,46.4896153,1 7.5739773,46.4894445,1 7.5739991,46.4894219,1 7.5740293,46.4894136,1 7.5740927,46.4894215,1 7.5741494,46.4894612,1 7.5742011,46.4895481,1 7.574245,46.4896146,1 7.5742987,46.4897163,1 7.5743469,46.4898096,1 7.5744159,46.4898903,1 7.57463,46.4900137,1 7.5750015,46.4901671,1 7.5751139,46.4901494,1 7.5751655,46.4901109,1 7.5752686,46.4900151,1 7.5753957,46.4898584,1 7.5756006,46.4897247,1 7.5760912,46.4895722,1 7.5766751,46.489079,1 7.5768604,46.4888862,1 7.5770611,46.4887403,1 7.5772841,46.4886847,1 7.5774307,46.4886108,1 7.577443,46.4885782,1 7.5774172,46.488546,1 7.5773527,46.4885144,1 7.5770322,46.488577,1 7.576403,46.4886185,1 7.5760685,46.4885897,1 7.5758881,46.4885517,1 7.5757861,46.4885253,1 7.5756417,46.488455,1 7.5754445,46.4882827,1 7.5752077,46.4878809,1 7.5749909,46.4874603,1 7.5747366,46.48733,1 7.5744824,46.4872079,1 7.5742341,46.4869365,1 7.5740212,46.4866488,1 7.5737818,46.4862913,1 7.573563,46.4859489,1 7.573498,46.4857182,1 7.5735256,46.4853043,1 7.5736283,46.4850564,1 7.5739892,46.4846275,1 7.5740561,46.4844231,1 7.5741244,46.4842225,1 7.5741746,46.4841227,1 7.5743418,46.4839567,1 7.5743683,46.483903,1 7.5743906,46.4837706,1 7.5742118,46.4830843,1 7.5741888,46.4829278,1 7.5739849,46.482695,1 7.5737651,46.482332,1 7.5736551,46.4820242,1 7.5735632,46.481887,1 7.5735731,46.4818453,1 7.5736473,46.4818219,1 7.5737583,46.4818693,1 7.573887,46.4820133,1 7.5744837,46.4821543,1 7.5746673,46.482228,1 7.5751903,46.4824967,1 7.5754308,46.4826309,1 7.5757703,46.4827575,1 7.5760306,46.4829216,1 7.5763564,46.4831348,1 7.5763735,46.4831899,1 7.5763394,46.4832512,1 7.5761156,46.4834307,1 7.5760319,46.4835878,1 7.5760578,46.4837445,1 7.5761335,46.4838993,1 7.5763194,46.484058,1 7.5765279,46.4841883,1 7.576996,46.4847005,1 7.5771557,46.484847,1 7.5774165,46.4849629,1 7.577649,46.485013,1 7.5778689,46.4850323,1 7.578133,46.48503,1 7.578373,46.4849835,1 7.5784787,46.4849298,1 7.5784966,46.4848874,1 7.5784279,46.4848328,1 7.5782986,46.4847952,1 7.5782212,46.4847547,1 7.5781483,46.4845932,1 7.578149,46.484371,1 7.5781647,46.4840848,1 7.5781932,46.4839283,1 7.5782963,46.4837267,1 7.5785167,46.4834123,1 7.5785346,46.4833762,1 7.5784025,46.4830335,1 7.5782586,46.4828248,1 7.5780223,46.4826498,1 7.5777744,46.482495,1 7.57752,46.4822396,1 7.5772621,46.4819819,1 7.5770082,46.4818722,1 7.5768561,46.4817701,1 7.5766102,46.4814291,1 7.5765466,46.4812489,1 7.5763526,46.4811718,1 7.576209,46.4811,1 7.5761374,46.4809328,1 7.575831,46.480722,1 7.575571,46.480581,1 7.5752753,46.480404,1 7.5751232,46.4803012,1 7.575108,46.480291,1 7.574856,46.480078,1 7.5746784,46.4799297,1 7.57458,46.479817,1 7.574411,46.4796044,1 7.5743116,46.4792862,1 7.5742532,46.4790813,1 7.574265,46.478525,1 7.574191,46.478269,1 7.5740445,46.4779657,1 7.573681,46.477433,1 7.573501,46.477152,1 7.5733697,46.4768436,1 + + + + #style-Unclassified + + relativeToGround + 7.5855548,46.5376895,1 7.5856085,46.5377307,1 7.585568,46.5378347,1 7.5853884,46.5379208,1 7.5851067,46.5380153,1 7.584983,46.538079,1 7.5849247,46.5381363,1 7.5848752,46.5382295,1 7.5848662,46.5384329,1 7.5848963,46.5385742,1 + + + + #style-Unclassified + + relativeToGround + 7.5817066,46.490105,1 7.5817008,46.4902111,1 7.5816733,46.4907526,1 7.5812232,46.4913729,1 7.5812639,46.4917049,1 7.5811183,46.492002,1 7.5811882,46.4921709,1 7.5809319,46.4930271,1 7.5812974,46.4941264,1 7.581237,46.494378,1 7.5814383,46.4945894,1 7.5819709,46.4947404,1 + + + + #style-Unclassified + + relativeToGround + 7.5776565,46.5036379,1 7.5777661,46.503767,1 7.5789243,46.5048037,1 7.580017,46.5059799,1 7.5800649,46.5062539,1 7.5801586,46.5064359,1 7.5804202,46.5068391,1 7.580475,46.506968,1 7.5806871,46.5075547,1 7.580774,46.507992,1 7.5807475,46.5081673,1 7.5806755,46.5083959,1 7.5806824,46.5085984,1 7.5806998,46.5088309,1 7.5806678,46.5089152,1 + + + + #style-Unclassified + + relativeToGround + 7.561354,46.5249937,1 7.5611075,46.5254464,1 7.5603269,46.5258299,1 7.5602224,46.5259294,1 7.5602179,46.5259521,1 7.5602395,46.5259798,1 7.5603954,46.5260321,1 7.5606287,46.5260943,1 7.5612083,46.5262005,1 7.5612555,46.5262337,1 7.5613375,46.5263696,1 7.561382,46.526515,1 7.5613927,46.5267583,1 7.5615433,46.5277193,1 7.5616651,46.5279657,1 7.5617554,46.5283091,1 7.561906,46.5284,1 7.5620182,46.5284211,1 7.5621819,46.5281266,1 7.562649,46.527644,1 7.564524,46.5268768,1 7.5650682,46.5267509,1 7.5654095,46.5267497,1 + + + + #style-Unclassified + + relativeToGround + 7.5914358,46.5216049,1 7.591663,46.52154,1 7.591774,46.521568,1 7.59211,46.521848,1 7.592208,46.521883,1 7.592531,46.521957,1 7.592895,46.522174,1 7.592974,46.522297,1 7.593075,46.522407,1 7.593585,46.522719,1 7.593747,46.52275,1 7.593935,46.522758,1 7.5944256,46.5230091,1 7.594503,46.523136,1 7.594599,46.52325,1 7.594762,46.523392,1 7.595077,46.523553,1 7.595237,46.523611,1 7.59534,46.523697,1 7.595377,46.523739,1 7.595485,46.524006,1 7.595641,46.524151,1 7.595763,46.524244,1 7.596368,46.524518,1 7.59669,46.524629,1 7.597151,46.524844,1 7.597305,46.524946,1 7.597364,46.52505,1 7.597337,46.5252,1 7.597339,46.525263,1 7.5974171,46.5254953,1 + + + + #style-Unclassified + + relativeToGround + 7.5656379,46.4915646,1 7.5660518,46.4919536,1 7.5663034,46.4920439,1 7.5662885,46.4923288,1 + + + + #style-Unclassified + + relativeToGround + 7.5855548,46.5376895,1 7.5855334,46.5376761,1 7.5854732,46.5376661,1 7.585217,46.537669,1 7.5845096,46.5376307,1 + + + + Bühlbergstrasse + #style-Unclassified + + relativeToGround + 7.4477077,46.4598442,1 7.4476773,46.4598777,1 + + + + Rütistrasse + #style-Unclassified + + relativeToGround + 7.4274775,46.4522141,1 7.4261397,46.4530454,1 7.4264807,46.4545093,1 7.4246182,46.4549791,1 + + + + Ausserschwandstrasse + #style-Unclassified + + relativeToGround + 7.5739397,46.5051162,1 7.5733159,46.5041805,1 7.5725176,46.503522,1 7.5722936,46.5033372,1 7.5717115,46.5024556,1 7.5717043,46.5024447,1 7.5714965,46.50213,1 7.5709593,46.5015986,1 7.5696299,46.5006507,1 7.566752,46.4977228,1 7.5665412,46.4976961,1 7.5663817,46.4976202,1 7.5663132,46.4975194,1 7.5663009,46.4973709,1 7.566314,46.4972084,1 7.5662826,46.497065,1 7.5662005,46.4969304,1 7.5656932,46.4963425,1 7.5650662,46.4957333,1 + + + + Birkenweg + #style-Unclassified + + relativeToGround + 7.5597583,46.4842011,1 7.560472,46.4841615,1 7.5610374,46.4841326,1 7.561747,46.4840627,1 + + + + Bütscheggenweg + #style-Unclassified + + relativeToGround + 7.5739397,46.5051162,1 7.5742401,46.5059307,1 7.5740276,46.5063991,1 7.5741474,46.5067344,1 7.5748979,46.5074196,1 7.5754552,46.508546,1 7.5753139,46.5088011,1 7.5752707,46.5092956,1 7.5756239,46.5103671,1 7.5758202,46.5105712,1 7.5757377,46.5108812,1 7.5750941,46.5111403,1 7.5726804,46.5114307,1 7.5719504,46.5112933,1 7.5717288,46.5112797,1 7.5712568,46.5112509,1 7.5709967,46.5111631,1 7.5695622,46.5107082,1 7.5693037,46.510755,1 7.5685318,46.5110658,1 7.5675927,46.5110709,1 7.5669006,46.5111824,1 7.5665772,46.5111305,1 + + + + Dählenweg + #style-Unclassified + + relativeToGround + 7.5619024,46.484733,1 7.5605313,46.4847046,1 + + + + Fliederweg + #style-Unclassified + + relativeToGround + 7.5573139,46.4905062,1 7.5575742,46.4906144,1 7.5580001,46.49089,1 + + + + Obere Bodenstrasse + #style-Unclassified + + relativeToGround + 7.5621068,46.4703326,1 7.5618747,46.4704067,1 7.5615007,46.4706892,1 7.5612123,46.4709431,1 7.5609132,46.4715494,1 7.5596006,46.476687,1 7.5595328,46.4773032,1 7.5598308,46.4782305,1 7.559232,46.4796016,1 + + + + #style-Unclassified + + relativeToGround + 7.5167801,46.4849324,1 7.5181617,46.4850001,1 7.5189956,46.4843231,1 7.5198652,46.4843966,1 7.5207213,46.4847725,1 7.5217773,46.484755,1 7.5222435,46.4846581,1 7.5224367,46.4843815,1 7.524081,46.4841142,1 7.5247031,46.4843208,1 7.525197,46.4841121,1 + + + + #style-Unclassified + + relativeToGround + 7.5622864,46.461042,1 7.5622266,46.4611132,1 7.5622539,46.462548,1 7.5636079,46.4648625,1 7.563823,46.4661917,1 7.5638651,46.4664717,1 7.5630107,46.4683629,1 7.5628846,46.468745,1 7.5628282,46.4694412,1 7.562485,46.4699422,1 7.5621068,46.4703326,1 + + + + #style-Unclassified + + relativeToGround + 7.5622314,46.476374,1 7.5622314,46.4762793,1 7.561865,46.4755649,1 7.5619871,46.4745086,1 7.5617307,46.4740812,1 7.5617185,46.4732508,1 7.5613338,46.472689,1 7.5614864,46.4719136,1 7.5612588,46.4715361,1 7.5612549,46.47139,1 7.5612834,46.4712484,1 7.5615722,46.4708814,1 7.5621068,46.4705513,1 + + + + #style-Unclassified + + relativeToGround + 7.5624583,46.460924,1 7.5622864,46.461042,1 + + + + #style-Unclassified + + relativeToGround + 7.5622313,46.4764657,1 7.5622314,46.476374,1 + + + + #style-Unclassified + + relativeToGround + 7.5796758,46.5157114,1 7.5797311,46.5157548,1 7.5799023,46.5158239,1 7.5801322,46.5158917,1 7.5802236,46.5159468,1 7.5802588,46.5160395,1 7.5802508,46.5162606,1 7.5803341,46.5164925,1 7.580727,46.516711,1 7.581195,46.5171189,1 7.581244,46.51722,1 7.5812692,46.5174308,1 7.5813528,46.517721,1 7.5813228,46.5178771,1 7.5814321,46.518047,1 7.5817535,46.5185832,1 7.5820489,46.5190792,1 7.5821911,46.5191199,1 7.5823268,46.5191792,1 7.582469,46.5193924,1 7.5826412,46.519449,1 7.583197,46.519706,1 7.5836784,46.5197251,1 7.5840532,46.5197587,1 7.584179,46.51977,1 7.5844902,46.5200212,1 7.5847859,46.5202177,1 + + + + #style-Unclassified + + relativeToGround + 7.5796758,46.5157114,1 7.579568,46.5155332,1 7.5795576,46.5153762,1 + + + + #style-Unclassified + + relativeToGround + 7.5167801,46.4849324,1 7.5166386,46.4850139,1 7.5163346,46.4854944,1 + + + + #style-Unclassified + + relativeToGround + 7.5496477,46.485998,1 7.5490011,46.4856419,1 7.5478033,46.4852982,1 7.5471908,46.4852248,1 7.5459925,46.4848673,1 7.5448208,46.4848031,1 7.5437823,46.4847023,1 7.5435293,46.4846839,1 7.5433828,46.4847756,1 7.5432896,46.4849131,1 7.5430633,46.4850506,1 7.5429168,46.4850231,1 7.542757,46.4849039,1 7.5424774,46.4848764,1 7.5421313,46.4849681,1 7.5410395,46.4851881,1 7.5404803,46.4853807,1 7.5390955,46.4861049,1 7.537125,46.487095,1 7.5352743,46.4871775,1 7.5339162,46.4874433,1 7.5334102,46.4877459,1 7.533104,46.4882409,1 7.5325048,46.4887359,1 7.5320655,46.4888551,1 7.5307606,46.4887817,1 7.5290263,46.488887,1 7.5285629,46.4889495,1 7.5284723,46.4889619,1 7.5273381,46.4891146,1 7.5267159,46.4892819,1 7.525773,46.4897013,1 7.5254036,46.4897035,1 7.5237372,46.4889167,1 7.5230777,46.4888539,1 7.522833,46.4886169,1 7.5223705,46.4886012,1 7.521205,46.4883099,1 7.51934,46.4872071,1 7.5165633,46.4857592,1 7.5163346,46.4854944,1 + + + + #style-Unclassified + + relativeToGround + 7.556403,46.4906599,1 7.5564895,46.4903578,1 7.5564031,46.4900393,1 7.5564249,46.4897068,1 7.5563499,46.4894643,1 7.5561408,46.4893354,1 + + + + Zelgstrasse + #style-Unclassified + + relativeToGround + 7.5571221,46.4911702,1 7.557339,46.490971,1 7.5573284,46.4908942,1 7.5572427,46.4907622,1 7.5573095,46.4906602,1 7.5573139,46.4905062,1 7.5572902,46.4904128,1 7.557545,46.490364,1 7.5577631,46.4903969,1 7.5579974,46.4904534,1 7.5592506,46.4915649,1 7.5598352,46.4920944,1 7.5599801,46.492216,1 7.5605367,46.492528,1 7.5615826,46.4930937,1 + + + + #style-Unclassified + + relativeToGround + 7.6221411,46.5675483,1 7.6217555,46.5670542,1 7.6214032,46.5667511,1 7.6212605,46.5665937,1 7.6211744,46.5664214,1 7.6211495,46.5663947,1 7.6211127,46.5663881,1 7.6210786,46.5663881,1 7.6210545,46.5663925,1 7.6210286,46.5664097,1 7.6210092,46.5666306,1 7.6210364,46.5667281,1 7.621389,46.567218,1 7.621477,46.567386,1 7.621554,46.567623,1 7.621569,46.567826,1 7.621649,46.568184,1 7.6217257,46.5683166,1 7.6218557,46.5683782,1 7.6219111,46.5684444,1 7.6219239,46.568476,1 7.6219211,46.5684997,1 7.6219016,46.5685194,1 7.6218707,46.5685301,1 7.6218457,46.5685301,1 7.6217421,46.5684822,1 7.621518,46.568279,1 7.621345,46.568087,1 7.621152,46.567792,1 7.620757,46.567417,1 7.6206225,46.5671884,1 7.6205955,46.5671633,1 7.6205627,46.5671482,1 7.6205261,46.5671487,1 7.6204933,46.567158,1 7.6204734,46.5671814,1 7.6204702,46.5672176,1 7.6205499,46.5673038,1 7.620818,46.567734,1 7.620884,46.567894,1 7.62097,46.568114,1 7.621003,46.568253,1 7.620997,46.568398,1 7.621007,46.568515,1 7.6210788,46.5686958,1 7.6211778,46.5687891,1 7.6213252,46.5688698,1 7.6213764,46.5689228,1 7.6213615,46.5689658,1 7.6212994,46.5689787,1 7.621143,46.568912,1 7.6209424,46.5688012,1 7.620798,46.56864,1 7.620768,46.568413,1 7.620644,46.568196,1 7.6205393,46.568144,1 7.6204996,46.5682166,1 7.620621,46.568325,1 7.620622,46.568522,1 7.6205702,46.5688341,1 7.6205875,46.5689279,1 7.6206182,46.5690024,1 7.6207232,46.5690962,1 7.6208673,46.5691844,1 7.6211219,46.569248,1 7.6212305,46.5693311,1 7.6213808,46.5694812,1 7.6214434,46.5696385,1 7.6214758,46.5699093,1 7.6215649,46.5701971,1 7.6215258,46.5702147,1 7.6214789,46.5701959,1 7.62133,46.570035,1 7.620979,46.569821,1 7.620628,46.569579,1 7.6203038,46.5692579,1 7.6201751,46.5691972,1 7.6189412,46.5688229,1 7.6186735,46.5687168,1 7.618385,46.568508,1 7.617659,46.567929,1 7.617399,46.567728,1 7.617231,46.567583,1 7.617111,46.567413,1 7.616913,46.567047,1 7.61675,46.566845,1 7.616575,46.566731,1 7.616185,46.566364,1 7.6154775,46.5657796,1 7.614885,46.565334,1 7.6146833,46.5651263,1 7.614526,46.564915,1 7.613981,46.564401,1 7.613375,46.563863,1 7.613015,46.563613,1 7.612686,46.563419,1 7.6124398,46.5632504,1 7.6121,46.562995,1 7.611927,46.562877,1 7.611741,46.562768,1 7.611586,46.562717,1 7.6108173,46.5625652,1 7.610664,46.562435,1 7.610636,46.562142,1 7.610607,46.562116,1 7.610379,46.562031,1 7.610198,46.561993,1 7.609934,46.561961,1 7.609264,46.561757,1 7.6086516,46.5616698,1 7.608165,46.561607,1 7.607721,46.561471,1 7.607153,46.561323,1 7.6067556,46.5612362,1 7.606619,46.561159,1 7.60639,46.56107,1 7.605845,46.56095,1 7.60538,46.56095,1 7.605156,46.560926,1 7.6046366,46.5609521,1 7.6043472,46.5608585,1 7.604221,46.56071,1 7.6044,46.560493,1 7.604458,46.560313,1 7.604451,46.56029,1 7.604328,46.560168,1 7.604223,46.560128,1 7.603285,46.559916,1 7.603037,46.559907,1 7.602788,46.55993,1 7.602538,46.559967,1 7.602492,46.55998,1 7.602347,46.560076,1 7.602262,46.560101,1 7.602154,46.560074,1 7.601967,46.559894,1 7.601779,46.559881,1 7.601623,46.559915,1 7.60157,46.559933,1 7.601479,46.560022,1 7.600828,46.560398,1 7.6007,46.560418,1 7.600504,46.560329,1 7.6004294,46.5600943,1 7.600394,46.560076,1 7.600191,46.560136,1 7.600046,46.560166,1 7.599891,46.560195,1 7.599868,46.560182,1 7.599826,46.56007,1 7.600174,46.559822,1 7.600349,46.55977,1 7.600482,46.559689,1 7.600531,46.559525,1 7.600488,46.559365,1 7.600479,46.559289,1 7.600507,46.559148,1 7.600627,46.559022,1 7.600735,46.558966,1 7.600695,46.55883,1 7.600642,46.558768,1 7.600627,46.558706,1 7.600642,46.558575,1 7.600765,46.558387,1 7.600618,46.557904,1 7.60047,46.557573,1 7.600087,46.557016,1 7.599944,46.556679,1 7.599778,46.556393,1 7.599694,46.556124,1 7.599694,46.556038,1 7.599393,46.555577,1 7.599123,46.555283,1 7.598703,46.554963,1 7.598536,46.554827,1 7.598348,46.554712,1 7.597928,46.554526,1 7.597716,46.554373,1 7.597273,46.554,1 7.5971816,46.5538848,1 + + + + Alte Strasse + #style-Unclassified + + relativeToGround + 7.5716754,46.4967489,1 7.5718925,46.4966978,1 + + + + Alte Strasse + #style-Unclassified + + relativeToGround + 7.5718925,46.4966978,1 7.5721073,46.4966416,1 + + + + Alte Strasse + #style-Unclassified + + relativeToGround + 7.5721073,46.4966416,1 7.572546,46.4965413,1 7.5738335,46.4964527,1 7.5761938,46.4961277,1 7.5775242,46.4954778,1 7.5778322,46.4954612,1 7.5778754,46.4954761,1 + + + + Hubelstrasse + #style-Unclassified + + relativeToGround + 7.5619481,46.4908394,1 7.5618004,46.4908374,1 7.5611634,46.4903397,1 7.5610885,46.4903465,1 7.5601168,46.4909892,1 7.5592506,46.4915649,1 + + + + Ladholzstrasse + #style-Unclassified + + relativeToGround + 7.5924089,46.5310813,1 7.5922889,46.5311342,1 7.5917636,46.5312026,1 7.5913287,46.5311455,1 7.590988,46.531039,1 7.590563,46.531075,1 7.590277,46.531153,1 7.589796,46.531169,1 7.589642,46.531198,1 7.5895858,46.5312368,1 7.5896155,46.5312723,1 7.589692,46.531289,1 7.589899,46.531281,1 7.59009,46.531248,1 7.590295,46.531242,1 7.590523,46.53127,1 7.59101,46.531411,1 7.591227,46.531491,1 7.591367,46.531568,1 7.591589,46.531763,1 7.591977,46.531849,1 7.592203,46.531863,1 7.592401,46.531958,1 7.592571,46.532083,1 7.592649,46.53219,1 7.592619,46.532245,1 7.592464,46.532225,1 7.5922679,46.5321729,1 7.592029,46.532173,1 7.591679,46.532128,1 7.591436,46.532064,1 7.59126,46.531985,1 7.591029,46.531952,1 7.590802,46.531942,1 7.590574,46.531889,1 7.59041,46.531811,1 7.590343,46.531799,1 7.590284,46.531807,1 7.590247,46.5318378,1 7.590272,46.531878,1 7.590439,46.531925,1 7.590867,46.532109,1 7.591051,46.532212,1 7.591078,46.532362,1 7.591136,46.532536,1 7.591266,46.532633,1 7.591414,46.532676,1 7.591683,46.532649,1 7.591889,46.532648,1 7.591964,46.532749,1 7.591866,46.532878,1 7.5918006,46.5330041,1 7.591615,46.533166,1 7.591448,46.533263,1 7.591294,46.533385,1 7.5913,46.533524,1 7.591405,46.533697,1 7.591559,46.533871,1 7.591716,46.53403,1 7.591931,46.534138,1 7.59214,46.534193,1 7.592314,46.534298,1 7.592383,46.534445,1 7.592398,46.534745,1 7.592615,46.535027,1 7.592633,46.535216,1 7.592563,46.535792,1 7.592536,46.536167,1 7.592524,46.536254,1 7.592457,46.536343,1 7.592252,46.536439,1 7.592169,46.536464,1 7.591936,46.536594,1 7.591871,46.536668,1 7.591796,46.53691,1 7.591882,46.537032,1 7.59199,46.537252,1 7.592385,46.53746,1 7.592711,46.537952,1 7.592876,46.538212,1 7.593007,46.53888,1 7.59305,46.539226,1 7.592988,46.539398,1 7.592884,46.539444,1 7.592731,46.539389,1 7.5924,46.539142,1 7.5920484,46.538841,1 7.591704,46.53838,1 7.591495,46.538035,1 7.590946,46.537616,1 7.590806,46.53741,1 7.590666,46.537254,1 7.590498,46.536913,1 7.590428,46.536669,1 7.590426,46.536518,1 7.590467,46.536344,1 7.5906402,46.5360987,1 7.590345,46.535752,1 7.589582,46.535183,1 7.589065,46.534861,1 7.588579,46.534642,1 7.588298,46.534535,1 7.587194,46.534279,1 7.587059,46.5342825,1 7.586884,46.534294,1 7.5867784,46.5343331,1 7.5866893,46.5343725,1 + + + + Lischenstrasse + #style-Unclassified + + relativeToGround + 7.5789112,46.5019253,1 7.578915,46.5018479,1 7.5789126,46.5017241,1 7.5789513,46.5016989,1 + + + + Neuweg + #style-Unclassified + + relativeToGround + 7.5763776,46.5014193,1 7.576294,46.5014686,1 7.5765898,46.5017882,1 7.5770648,46.5028188,1 7.5776565,46.5036379,1 7.5775725,46.5038386,1 7.577659,46.504053,1 7.577975,46.504743,1 7.578067,46.505214,1 7.5785206,46.505896,1 7.57858,46.506791,1 7.578819,46.507217,1 7.579365,46.507691,1 7.579607,46.508434,1 7.579732,46.508536,1 7.5797057,46.509266,1 7.579671,46.510226,1 7.5797453,46.5109917,1 7.580007,46.511906,1 7.5802506,46.512384,1 7.5805152,46.5129738,1 7.5806365,46.5135164,1 7.580669,46.513662,1 7.580641,46.513675,1 + + + + Oeystrasse + #style-Unclassified + + relativeToGround + 7.5597987,46.4888045,1 7.5596114,46.4887086,1 7.5590977,46.4887413,1 7.55826,46.4885102,1 7.557679,46.4883499,1 7.5562602,46.4872899,1 7.555135,46.486923,1 7.5541077,46.486711,1 + + + + Rinderwaldstrasse + #style-Unclassified + + relativeToGround + 7.5920786,46.5277859,1 7.592013,46.5278814,1 7.5921113,46.5283229,1 7.5922599,46.5285511,1 7.5922599,46.5286679,1 7.592178,46.5287971,1 7.5920264,46.5289161,1 7.5918009,46.5290055,1 7.5914879,46.5290493,1 7.5913605,46.5289891,1 7.5913074,46.5288595,1 7.5915011,46.528447,1 7.5913605,46.528071,1 7.5910448,46.5275052,1 7.5906628,46.5273391,1 7.5905726,46.5270945,1 7.5902867,46.5267791,1 7.5898693,46.5266264,1 7.589723,46.5261891,1 7.5898509,46.5259126,1 7.5892239,46.525386,1 7.5887596,46.525155,1 7.58866,46.52505,1 7.5886593,46.5249033,1 7.588554,46.524815,1 7.5884977,46.5249146,1 7.5885064,46.5251373,1 7.5886429,46.5253687,1 7.5888901,46.5255442,1 7.5889148,46.5258339,1 7.5886581,46.5260421,1 7.5885021,46.5262391,1 7.5884711,46.5270452,1 7.5888648,46.527704,1 7.5888321,46.5278146,1 7.5886168,46.5279372,1 7.5884353,46.5278681,1 7.5881401,46.5275704,1 7.5876889,46.5275737,1 7.587346,46.527544,1 7.5863738,46.5272679,1 7.585991,46.5271518,1 7.5856872,46.5270452,1 7.5854035,46.5268207,1 7.5850142,46.5265989,1 7.5832724,46.5254439,1 7.5825523,46.5243282,1 7.582418,46.5243637,1 7.5824194,46.5250364,1 7.5824344,46.5254608,1 7.5826066,46.5259242,1 7.5824417,46.5258955,1 7.5812345,46.5251598,1 7.5807647,46.5249892,1 7.580322,46.5249821,1 7.5795587,46.5251441,1 7.5793111,46.5251274,1 7.5789818,46.524955,1 7.578854,46.5249327,1 7.5788147,46.5249916,1 7.578865,46.525061,1 7.5790663,46.5253114,1 7.5793669,46.5255973,1 7.5805877,46.5262635,1 7.581576,46.526976,1 7.5822447,46.5277997,1 7.5825672,46.5283477,1 7.5825694,46.5284335,1 7.582459,46.5284262,1 7.5823034,46.528276,1 7.581222,46.5276355,1 7.580843,46.52746,1 7.5805204,46.5273828,1 7.5785565,46.5276402,1 7.5774574,46.5275452,1 7.5763023,46.5271631,1 7.5755453,46.5267797,1 7.574859,46.526213,1 7.5747776,46.5259892,1 7.5748202,46.5255898,1 7.5745874,46.5254626,1 + + + + Schmittengraben + #style-Unclassified + + relativeToGround + 7.5632271,46.4930606,1 7.5633842,46.4930788,1 7.5635249,46.4931345,1 7.5635872,46.49323,1 7.5633938,46.4935302,1 7.5633565,46.4937197,1 7.5633739,46.4938029,1 7.5633923,46.4938168,1 7.5634261,46.4938155,1 7.5635035,46.4937563,1 7.5636349,46.4936571,1 7.5641212,46.4931646,1 7.5643068,46.4930036,1 7.5644847,46.4928738,1 7.5648105,46.4927291,1 7.5649245,46.4926975,1 7.565606,46.4923128,1 7.5660014,46.4922682,1 7.5662885,46.4923288,1 7.5663814,46.4923822,1 + + + + Schmittengraben + #style-Unclassified + + relativeToGround + 7.568897,46.4933261,1 7.5687413,46.4932105,1 7.5686769,46.4927008,1 7.5684103,46.4924955,1 7.5675587,46.4923767,1 7.5671661,46.4924553,1 7.5665136,46.4924594,1 7.5664566,46.49243,1 + + + + Schulgässli + #style-Unclassified + + relativeToGround + 7.5658886,46.4903417,1 7.5656473,46.4907108,1 7.5661236,46.4911985,1 7.5660442,46.491516,1 7.5656379,46.4915646,1 7.5653456,46.4914022,1 7.5648195,46.4911815,1 7.5641047,46.49108,1 7.5635494,46.4910794,1 7.563239,46.4912821,1 7.5627963,46.4915881,1 7.5623751,46.4918667,1 7.5620712,46.4920622,1 7.5613774,46.4922729,1 7.5610408,46.4922866,1 7.5605367,46.492528,1 + + + + #style-Unclassified + + relativeToGround + 7.5876833,46.5164516,1 7.5875192,46.5167316,1 7.5874183,46.5169215,1 7.587425,46.5170785,1 7.5875775,46.5172966,1 7.5876717,46.5173423,1 7.5877738,46.517356,1 7.587872,46.517324,1 7.5879397,46.5171981,1 7.5879633,46.5171897,1 7.5879931,46.5171784,1 + + + + #style-Unclassified + + relativeToGround + 7.5658886,46.4903417,1 7.565932,46.4902542,1 7.5659587,46.4900282,1 7.5658668,46.4898255,1 + + + + #style-Unclassified + + relativeToGround + 7.5987112,46.5396482,1 7.5993066,46.5400455,1 7.5999067,46.5402763,1 7.6000501,46.5404757,1 7.6000148,46.5411065,1 7.6000721,46.5411632,1 + + + + #style-Unclassified + + relativeToGround + 7.5922439,46.524217,1 7.5926503,46.5241251,1 7.5930389,46.524197,1 7.592967,46.5247871,1 7.5930735,46.5248648,1 7.593788,46.5252748,1 7.5941389,46.5256564,1 7.5940752,46.5260536,1 7.594492,46.52675,1 7.5951405,46.526862,1 7.5954175,46.5271921,1 7.5955472,46.5272157,1 7.5958773,46.5270624,1 7.5961485,46.5270919,1 7.5966466,46.5275795,1 7.5966706,46.527934,1 7.5973676,46.5279039,1 7.5980285,46.5279941,1 7.5981221,46.5280116,1 7.5983157,46.5281985,1 7.5984235,46.5283926,1 7.5984019,46.5286838,1 7.59865,46.5289211,1 7.5992216,46.5289427,1 7.5992108,46.5288456,1 7.5990167,46.5288133,1 7.5988226,46.528673,1 7.5988226,46.5282524,1 7.5990383,46.5276485,1 7.598499,46.5274112,1 7.5984235,46.5269798,1 7.5980892,46.5266562,1 7.5978843,46.5258797,1 7.5977987,46.5257423,1 7.5975919,46.5256673,1 7.5973988,46.525623,1 7.5973501,46.5255351,1 7.5974171,46.5254953,1 7.5978141,46.5255821,1 7.5987892,46.5260127,1 7.5999416,46.5266965,1 7.6009293,46.5271017,1 7.6013472,46.5274056,1 7.6016059,46.5274883,1 7.6019608,46.5274238,1 7.6029933,46.5275421,1 7.6031654,46.5274883,1 7.6032407,46.5272254,1 7.6036473,46.5268482,1 7.6042256,46.5264533,1 7.6045099,46.5265219,1 7.6043789,46.5268992,1 7.6046504,46.5272335,1 7.6051322,46.5276465,1 7.6054138,46.5281732,1 7.6052241,46.5286118,1 7.604846,46.5290789,1 7.6048905,46.5294792,1 7.6053798,46.5295682,1 7.6061361,46.5293018,1 + + + + #style-Unclassified + + relativeToGround + 7.5784191,46.501918,1 7.5784483,46.5020248,1 7.5785677,46.5021453,1 7.5789152,46.5022869,1 7.579346,46.50235,1 7.57937,46.5023535,1 7.5795731,46.5024713,1 + + + + Bonderlenstrasse + #style-Unclassified + + relativeToGround + 7.5871283,46.4860133,1 7.5870001,46.4859898,1 + + + + Bonderlenstrasse + #style-Unclassified + + relativeToGround + 7.5870001,46.4859898,1 7.5865419,46.4861414,1 7.5861778,46.4863286,1 7.5851904,46.4864815,1 7.5844927,46.4870776,1 7.5840558,46.4872544,1 7.5834347,46.4869748,1 7.5831949,46.4870435,1 7.5833797,46.487296,1 7.5831716,46.4875457,1 7.5827035,46.4876497,1 7.5815952,46.4884243,1 7.5809932,46.489163,1 7.5795925,46.490413,1 7.5793256,46.4906279,1 7.5782826,46.4914569,1 7.5773048,46.4918834,1 7.5769663,46.4921038,1 7.5767396,46.4922837,1 7.5764568,46.4926086,1 7.5762001,46.4927026,1 7.5751353,46.4926314,1 7.5748122,46.4926149,1 7.5745794,46.4926012,1 7.5737472,46.49283,1 7.5733207,46.4921331,1 7.5729843,46.4919146,1 7.5724562,46.4915977,1 7.5716564,46.4911345,1 7.5705649,46.4909123,1 7.5696679,46.4904828,1 7.5678063,46.4896289,1 7.5677844,46.4896259,1 7.5676637,46.4896332,1 7.5675205,46.4896429,1 7.5670889,46.489664,1 7.5655667,46.489498,1 + + + + Bonderlenstrasse + #style-Unclassified + + relativeToGround + 7.5871283,46.4860133,1 7.5871827,46.4860238,1 7.5880126,46.4861803,1 7.588105,46.4862347,1 + + + + Hirzbodenportstrasse + #style-Unclassified + + relativeToGround + 7.587042,46.4886078,1 7.5865782,46.4891164,1 7.5860911,46.4895304,1 7.5853664,46.4900213,1 7.5849608,46.4901754,1 7.5842203,46.490802,1 7.5836122,46.4911889,1 7.5834458,46.4913556,1 7.5830459,46.4921806,1 7.5824807,46.4927062,1 7.5818375,46.4934555,1 7.5817816,46.4938726,1 7.5819709,46.4947404,1 7.5821341,46.4953662,1 7.5823615,46.4964461,1 7.5827043,46.4971018,1 7.5829548,46.4981568,1 7.5832431,46.4984279,1 7.5840128,46.4988362,1 7.5842205,46.4990653,1 7.583876,46.4996144,1 7.5838483,46.4999466,1 + + + + #style-Unclassified + + relativeToGround + 7.5821341,46.4953662,1 7.5837231,46.4970956,1 7.5857965,46.4987966,1 7.5860984,46.499632,1 7.586803,46.4998836,1 7.5870948,46.4997729,1 7.5872156,46.499632,1 7.5874027,46.4997231,1 7.5871018,46.5006672,1 7.5871059,46.5011125,1 7.5874893,46.5015618,1 7.5883262,46.5019288,1 7.5886041,46.5022256,1 7.5892868,46.5025669,1 7.5894274,46.5030495,1 + + + + #style-Unclassified + + relativeToGround + 7.587042,46.4886078,1 7.587899,46.48825,1 7.5882043,46.4882427,1 7.5886503,46.488306,1 7.588931,46.488327,1 7.589214,46.488259,1 7.589931,46.487709,1 7.590149,46.487378,1 7.5904105,46.4872809,1 7.590543,46.487167,1 7.590873,46.487027,1 7.5911572,46.4869727,1 7.5912821,46.4869728,1 7.591414,46.486973,1 7.5915741,46.4868982,1 7.591735,46.486781,1 7.5919641,46.4868266,1 7.5918939,46.4869026,1 7.591729,46.487148,1 7.591454,46.488028,1 7.5911193,46.4884027,1 7.591501,46.48837,1 7.592061,46.487936,1 7.592171,46.488034,1 7.5922214,46.488268,1 + + + + #style-Unclassified + + relativeToGround + 7.5850387,46.5007685,1 7.5850317,46.501067,1 7.5855276,46.5016065,1 7.5865636,46.5024871,1 7.5868966,46.5026795,1 7.5872814,46.5030569,1 7.5874664,46.5030643,1 7.5877032,46.5027091,1 7.5876292,46.5023613,1 7.587681,46.5021467,1 7.5879622,46.5022947,1 7.5889464,46.5026203,1 7.5894274,46.5030495,1 7.5895162,46.5032567,1 7.5898342,46.5032999,1 7.5898564,46.5037902,1 7.589797,46.5040501,1 7.5899159,46.5043324,1 7.5898936,46.5047335,1 7.5904433,46.5055655,1 7.5911267,46.5060261,1 7.5920352,46.5070536,1 7.5932521,46.5082243,1 7.5931905,46.5089944,1 7.5935293,46.5092409,1 7.5942071,46.5092563,1 7.5947924,46.5091177,1 7.5952083,46.5091793,1 7.5953623,46.5096568,1 7.5965638,46.5102575,1 7.5971029,46.5102575,1 7.597719,46.510427,1 7.5982736,46.5103807,1 7.5993672,46.5107966,1 7.6006765,46.5105656,1 7.6007535,46.5107196,1 7.6005378,46.5111201,1 7.6005378,46.5113357,1 7.6009075,46.5113049,1 7.6012926,46.5114436,1 7.6015391,46.5118441,1 7.6017547,46.5118903,1 7.60234,46.5124756,1 7.6035107,46.5129069,1 7.6037571,46.5130917,1 7.6032796,46.5132304,1 7.6031102,46.5134922,1 7.6032334,46.514247,1 7.6018317,46.5150942,1 7.601955,46.515433,1 7.6026943,46.5160184,1 7.6027251,46.516388,1 7.6033694,46.5171449,1 7.6040652,46.5178513,1 7.6041268,46.5186061,1 7.6044657,46.5195919,1 7.6045581,46.5203929,1 7.6050202,46.5205931,1 7.6061909,46.5203775,1 7.6073923,46.5208704,1 7.6077774,46.5208242,1 7.6081625,46.5215635,1 7.607916,46.5221951,1 7.6081009,46.522688,1 7.6085014,46.5229036,1 7.6085168,46.5234273,1 7.6089327,46.5240127,1 7.608717,46.5251679,1 7.6085168,46.5255376,1 7.6085014,46.5259227,1 7.6077774,46.5264156,1 7.6077004,46.5267391,1 7.6079776,46.5270471,1 7.6093331,46.526585,1 7.610704,46.5264464,1 7.6109659,46.5266158,1 + + + + #style-Unclassified + + relativeToGround + 7.587042,46.4886078,1 7.5874305,46.4882863,1 7.587553,46.4879879,1 7.5876084,46.4877632,1 7.588218,46.4872813,1 7.5886301,46.4867943,1 7.5885713,46.4864604,1 7.5883219,46.4862734,1 7.588105,46.4862347,1 + + + + Bodenstrasse + #style-Unclassified + + relativeToGround + 7.5655667,46.489498,1 7.5651387,46.4893362,1 7.564879,46.4889907,1 7.5647194,46.4885724,1 7.5641218,46.4881265,1 7.5639912,46.4878728,1 7.5639752,46.4876249,1 7.5637244,46.487204,1 7.5634686,46.4869531,1 7.5632835,46.4867532,1 7.5630315,46.4863658,1 7.5626687,46.4859012,1 7.5625647,46.4856405,1 7.5623769,46.4854461,1 7.5621275,46.4851632,1 7.5619548,46.4849002,1 7.5619024,46.484733,1 7.5618104,46.4844506,1 7.561747,46.4840627,1 7.5614957,46.4825944,1 7.5614079,46.4812731,1 7.561295,46.4811046,1 + + + + Eselmoosgassa + #style-Unclassified + + relativeToGround + 7.5561553,46.4856415,1 7.5557635,46.4856558,1 7.5549529,46.485598,1 7.5547141,46.4854509,1 7.5544736,46.4853845,1 7.5543692,46.4854041,1 7.5542189,46.4854749,1 7.5541303,46.4854825,1 7.5540353,46.4855054,1 7.553853,46.485527,1 7.553726,46.485561,1 7.553685,46.485587,1 7.553433,46.485684,1 7.5532166,46.4856797,1 7.553134,46.485678,1 7.5529402,46.4854934,1 7.5526494,46.4852944,1 7.552326,46.484918,1 7.552172,46.4848,1 7.5520961,46.4847183,1 7.552012,46.484569,1 7.5518939,46.4844236,1 7.5517747,46.4842799,1 7.55168,46.48411,1 7.5513096,46.4837762,1 7.55115,46.483671,1 7.55098,46.483665,1 7.550794,46.483474,1 7.550622,46.483174,1 7.550476,46.483083,1 7.550345,46.483044,1 7.5502534,46.4830306,1 7.549997,46.483104,1 7.549532,46.483097,1 7.549363,46.483085,1 7.549299,46.48311,1 7.5491923,46.4831022,1 7.5491528,46.4830816,1 7.549018,46.482956,1 7.54888,46.482834,1 7.548732,46.482717,1 7.54851,46.482471,1 7.548538,46.48237,1 7.548732,46.48222,1 7.548814,46.482059,1 7.548795,46.481923,1 7.548658,46.481681,1 7.548255,46.481181,1 7.547886,46.481067,1 7.547641,46.481037,1 7.54748,46.480984,1 7.547357,46.480933,1 7.5457456,46.4805227,1 7.545419,46.480471,1 7.5450014,46.4805367,1 7.544647,46.48049,1 7.544299,46.4804,1 7.543866,46.48021,1 7.543796,46.48016,1 7.5434426,46.4799043,1 7.5434381,46.4799008,1 7.542671,46.479313,1 7.542223,46.478988,1 7.541957,46.478758,1 7.54153,46.478338,1 7.54131,46.477934,1 7.541097,46.477749,1 7.540842,46.477564,1 7.54067,46.477405,1 7.54044,46.477109,1 7.540176,46.476572,1 7.5399152,46.4762596,1 7.5393273,46.4757074,1 7.539045,46.475276,1 7.538843,46.475093,1 7.5387556,46.4750208,1 7.5384505,46.4747687,1 7.5382302,46.4743164,1 7.5381288,46.4742361,1 7.5377988,46.4741219,1 + + + + Flecklistrasse + #style-Unclassified + + relativeToGround + 7.561295,46.4811046,1 7.5614161,46.48107,1 7.5619614,46.4809337,1 7.56233,46.4809424,1 7.563085,46.4812124,1 7.5638695,46.48163,1 7.5642386,46.4822449,1 7.5651023,46.4831244,1 7.5654245,46.4839163,1 7.5657444,46.4842614,1 7.5661292,46.484468,1 7.5666203,46.4846783,1 7.5668295,46.4847669,1 7.5671931,46.484926,1 7.5674652,46.4851221,1 + + + + Fuhrenstrasse + #style-Unclassified + + relativeToGround + 7.5561553,46.4856415,1 7.5568207,46.4854527,1 7.5575266,46.4853598,1 7.5577332,46.4852617,1 7.5579355,46.484896,1 7.5580374,46.4845238,1 7.5577925,46.4836498,1 7.557817,46.4830379,1 7.5583492,46.4819039,1 + + + + Gspennweg + #style-Unclassified + + relativeToGround + 7.5638695,46.48163,1 7.564176,46.4816392,1 7.5645116,46.4816762,1 7.5650441,46.4817209,1 7.5652433,46.4817563,1 7.5655296,46.4818457,1 7.5658943,46.4819458,1 7.5661964,46.4820121,1 7.5663732,46.4820583,1 7.5665937,46.4821825,1 7.5668676,46.4822782,1 7.5670657,46.4823033,1 7.5673032,46.4822205,1 7.5673958,46.4820244,1 7.567317,46.4817693,1 7.5673377,46.4816797,1 7.5674461,46.4816661,1 7.5675411,46.481702,1 7.5676495,46.4818092,1 7.5677125,46.481968,1 7.5680791,46.4824497,1 7.5684379,46.4828004,1 7.5684393,46.4829933,1 7.5685006,46.4830787,1 7.5686817,46.4831555,1 7.569189,46.4833128,1 7.5693702,46.4834807,1 7.5695485,46.4837657,1 7.5696154,46.4840795,1 7.5697506,46.4843808,1 + + + + Hahnenmoosstrasse + #style-Unclassified + + relativeToGround + 7.5549954,46.4898085,1 7.553959,46.4889851,1 7.553271,46.4880191,1 7.552624,46.4874431,1 7.551504,46.4870491,1 7.550608,46.4864261,1 7.5496477,46.485998,1 7.549065,46.4855751,1 7.5461028,46.4845429,1 7.545601,46.4843911,1 7.5450642,46.484286,1 7.544646,46.4842091,1 7.544096,46.4842611,1 7.54335,46.4841501,1 7.543024,46.4839871,1 + + + + Kreuzgasse + #style-Unclassified + + relativeToGround + 7.5583492,46.4819039,1 7.558488,46.4819183,1 7.5589982,46.4817042,1 7.5599043,46.4812412,1 7.560118,46.4811965,1 7.561295,46.4811046,1 + + + + Lismiweg + #style-Unclassified + + relativeToGround + 7.5671931,46.484926,1 7.5670729,46.4855393,1 7.5667849,46.4857561,1 7.566834,46.4858727,1 7.5671599,46.4862692,1 + + + + #style-Unclassified + + relativeToGround + 7.5658155,46.489718,1 7.5655667,46.489498,1 + + + + #style-Unclassified + + relativeToGround + 7.5658668,46.4898255,1 7.5658155,46.489718,1 + + + + #style-Unclassified + + relativeToGround + 7.566834,46.4858727,1 7.5665666,46.4859805,1 7.566584,46.4861788,1 7.5667501,46.4863846,1 + + + + #style-Unclassified + + relativeToGround + 7.561295,46.4811046,1 7.560827,46.4806023,1 7.5607781,46.4791491,1 7.5609247,46.4781599,1 7.5622314,46.476548,1 7.5622314,46.476513,1 7.5622313,46.4764657,1 + + + + Walezubestrasse + #style-Unclassified + + relativeToGround + 7.5674652,46.4851221,1 7.5677176,46.4855439,1 7.5679169,46.4859883,1 7.5686415,46.4865509,1 7.568748,46.486657,1 7.5688367,46.4867031,1 7.5696467,46.487175,1 7.570372,46.4879376,1 7.5704705,46.4881439,1 7.5707587,46.4883279,1 7.5708117,46.4883663,1 7.5709129,46.488434,1 7.5714324,46.4889418,1 7.5718473,46.4897383,1 7.5721035,46.4900381,1 7.5722968,46.4907052,1 7.5725212,46.4911091,1 7.5728347,46.4914564,1 7.5729843,46.4919146,1 + + + + Kuonisbergliweg + #style-Unclassified + + relativeToGround + 7.5508319,46.4815667,1 7.550886,46.481604,1 7.551017,46.481662,1 7.5517182,46.4815741,1 7.551993,46.481463,1 7.552258,46.481249,1 7.552478,46.481152,1 7.5528719,46.4810715,1 7.552972,46.481051,1 7.553187,46.480938,1 7.553375,46.480816,1 + + + + Kuonisbergliweg + #style-Unclassified + + relativeToGround + 7.5508319,46.4815667,1 7.5509021,46.4815181,1 7.551101,46.481458,1 7.551329,46.481362,1 7.5514522,46.4812387,1 7.551571,46.48097,1 7.551688,46.480578,1 7.551781,46.480405,1 7.551891,46.480258,1 7.5520744,46.4800436,1 7.5524006,46.4797169,1 7.5526215,46.4795293,1 7.5529788,46.4789449,1 7.553007,46.47881,1 7.552982,46.478716,1 7.5529262,46.4786992,1 7.5527854,46.4787285,1 7.5524896,46.4790539,1 7.5523318,46.4792022,1 7.5521392,46.479332,1 7.5518842,46.4794254,1 7.551653,46.479461,1 7.551379,46.479444,1 7.551097,46.479381,1 7.550863,46.479293,1 7.550652,46.479183,1 7.5503496,46.4791053,1 7.550073,46.479072,1 7.549843,46.479024,1 7.549589,46.478927,1 7.549422,46.478836,1 7.549175,46.478782,1 7.549041,46.478774,1 7.548782,46.478793,1 7.548526,46.478898,1 7.548479,46.478902,1 7.548408,46.478825,1 7.548488,46.478774,1 7.548709,46.478677,1 7.548824,46.478546,1 7.549044,46.478409,1 7.549316,46.478319,1 7.5496528,46.4782388,1 7.550112,46.478244,1 7.550378,46.478205,1 7.55059,46.47814,1 7.550712,46.478013,1 7.550768,46.477844,1 7.5507845,46.4777077,1 7.550831,46.477322,1 7.550837,46.476938,1 7.550793,46.476547,1 7.550741,46.47618,1 7.550773,46.4757458,1 7.550804,46.475324,1 7.550842,46.47512,1 7.550847,46.474665,1 7.550828,46.474547,1 7.550455,46.473916,1 7.550251,46.473663,1 7.550181,46.473515,1 7.550134,46.473398,1 7.550109,46.473304,1 7.550087,46.473272,1 7.550023,46.47325,1 7.549945,46.473281,1 7.549934,46.473323,1 7.5499512,46.4734529,1 7.549878,46.473637,1 7.549834,46.473902,1 7.549831,46.473957,1 7.549814,46.474073,1 7.549783,46.474197,1 7.5497672,46.4743214,1 7.549727,46.474393,1 7.549487,46.474707,1 7.5493338,46.4748532,1 7.5493182,46.4748681,1 7.549299,46.4748896,1 7.5492628,46.4749301,1 7.5491141,46.4751996,1 7.548961,46.47533,1 7.548566,46.475574,1 7.548254,46.475715,1 7.548062,46.475728,1 7.547878,46.475707,1 7.547709,46.475654,1 7.547616,46.475589,1 7.547543,46.475472,1 7.547525,46.475404,1 7.547521,46.475189,1 7.547554,46.475035,1 7.547616,46.474977,1 7.547708,46.474933,1 7.547938,46.474861,1 7.548019,46.474747,1 7.5480239,46.4745659,1 7.5479003,46.4743716,1 7.5477933,46.4743096,1 + + + + Köpflisbergstrasse + #style-Unclassified + + relativeToGround + 7.457797,46.4368213,1 7.4575621,46.4367506,1 + + + + Köpflisbergstrasse + #style-Unclassified + + relativeToGround + 7.4579366,46.4368633,1 7.457797,46.4368213,1 + + + + Köpflisbergstrasse + #style-Unclassified + + relativeToGround + 7.4606355,46.4376757,1 7.4579366,46.4368633,1 + + + + Alte Strasse + #style-Unclassified + + relativeToGround + 7.5778754,46.4954761,1 7.5779939,46.49555,1 + + + + Lischenstrasse + #style-Unclassified + + relativeToGround + 7.5778518,46.4959324,1 7.5777961,46.4960149,1 7.5778017,46.4962336,1 7.5779563,46.4963871,1 7.5783668,46.4966863,1 7.5788599,46.4970856,1 7.5788853,46.4971104,1 + + + + Margeliweg + #style-Unclassified + + relativeToGround + 7.5665136,46.4924594,1 7.5665266,46.4925761,1 7.5667785,46.4927724,1 7.5669022,46.4932502,1 7.566879,46.4935537,1 7.5670434,46.4938744,1 7.5672909,46.4940688,1 7.5678329,46.4948354,1 7.5681231,46.4949172,1 7.5682468,46.4954237,1 7.5687843,46.4960333,1 7.569229,46.4964059,1 7.5693856,46.4964512,1 7.5696317,46.496726,1 7.5697815,46.4969634,1 7.5699588,46.4971615,1 7.5702091,46.4972483,1 7.5702308,46.4974098,1 + + + + Schmittengraben + #style-Unclassified + + relativeToGround + 7.5663814,46.4923822,1 7.5664566,46.49243,1 + + + + #style-Unclassified + + relativeToGround + 7.5648105,46.4927291,1 7.5650265,46.4920778,1 7.5647011,46.4919159,1 7.5645316,46.4919494,1 7.5646492,46.4920872,1 + + + + #style-Unclassified + + relativeToGround + 7.5724996,46.4938582,1 7.5721087,46.4928193,1 7.5718566,46.492604,1 7.5717708,46.4916012,1 7.5715854,46.4913815,1 7.5705649,46.4909123,1 + + + + + Pedestrian + + + Schulgässli + #style-Pedestrian + + relativeToGround + 7.5605367,46.492528,1 7.5595144,46.4930964,1 + + + + Kronenplatz + #style-Pedestrian + + relativeToGround + 7.4425957,46.4564794,1 7.4425442,46.4567004,1 7.4424533,46.457099,1 + + + + #style-Pedestrian + + relativeToGround + 7.5598352,46.4920944,1 7.5587375,46.4925106,1 + + + + + Service + + + Gartenweg + #style-Service + + relativeToGround + 7.5643603,46.4953787,1 7.5650953,46.4963004,1 + + + + Fitzerweg + #style-Service + + relativeToGround + 7.5575266,46.4853598,1 7.5577103,46.485572,1 7.5583125,46.4854727,1 7.5585068,46.4854474,1 7.5590842,46.4856691,1 7.5593687,46.4856356,1 7.5591302,46.4852633,1 + + + + Walehältiweg + #style-Service + + relativeToGround + 7.559232,46.4796016,1 7.5586532,46.4793161,1 7.5582045,46.4789538,1 7.557758,46.4790122,1 7.5577696,46.4790842,1 + + + + #style-Service + + relativeToGround + 7.566314,46.4972084,1 7.5666254,46.4971783,1 + + + + #style-Service + + relativeToGround + 7.5676532,46.4982767,1 7.5669653,46.497796,1 7.566752,46.4977228,1 + + + + #style-Service + + relativeToGround + 7.5555284,46.4878909,1 7.5553714,46.4877889,1 + + + + #style-Service + + relativeToGround + 7.5609767,46.4931868,1 7.5609149,46.493261,1 + + + + #style-Service + + relativeToGround + 7.4794227,46.5658312,1 7.4790691,46.5656171,1 7.4789409,46.56562,1 + + + + #style-Service + + relativeToGround + 7.4562979,46.441431,1 7.456496,46.4414858,1 7.456975,46.44131,1 + + + + #style-Service + + relativeToGround + 7.5028378,46.5395826,1 7.503522,46.5419711,1 + + + + #style-Service + + relativeToGround + 7.574028,46.5050557,1 7.574161,46.5050942,1 7.5740709,46.5051857,1 7.5739397,46.5051162,1 7.574028,46.5050557,1 + + + + #style-Service + + relativeToGround + 7.4438332,46.4578509,1 7.4443253,46.4578916,1 7.444375,46.45771,1 7.4444111,46.4575848,1 7.4444794,46.4574163,1 + + + + #style-Service + + relativeToGround + 7.5798959,46.4994904,1 7.580177,46.499669,1 7.580039,46.499962,1 7.580111,46.50019,1 7.5802269,46.5002556,1 + + + + #style-Service + + relativeToGround + 7.5796209,46.5015556,1 7.5800453,46.5016055,1 + + + + #style-Service + + relativeToGround + 7.577957,46.493648,1 7.578012,46.493478,1 7.578502,46.492951,1 7.5788628,46.4927947,1 7.5789815,46.4928026,1 + + + + #style-Service + + relativeToGround + 7.5823413,46.514709,1 7.5826838,46.5145655,1 7.582687,46.5143769,1 7.582609,46.514204,1 7.581843,46.513665,1 7.5816472,46.5136336,1 7.5810861,46.5130171,1 7.5802506,46.512384,1 + + + + #style-Service + + relativeToGround + 7.581843,46.513665,1 7.5821177,46.5135156,1 7.582334,46.513319,1 7.582116,46.512569,1 7.581709,46.511981,1 7.5811311,46.5115993,1 7.5809768,46.5114974,1 + + + + #style-Service + + relativeToGround + 7.5840532,46.5197587,1 7.5841373,46.5198684,1 + + + + #style-Service + + relativeToGround + 7.4760571,46.4270912,1 7.4761172,46.426896,1 7.4759369,46.4265765,1 7.476203,46.426446,1 + + + + Krummenbach + #style-Service + + relativeToGround + 7.4391746,46.4521405,1 7.4397148,46.4520287,1 7.440477,46.4520745,1 7.4409061,46.4521561,1 + + + + Krummenbach + #style-Service + + relativeToGround + 7.440477,46.4520745,1 7.440551,46.4518706,1 + + + + Krummenbach + #style-Service + + relativeToGround + 7.4409061,46.4521561,1 7.4416534,46.4523294,1 + + + + #style-Service + + relativeToGround + 7.4355302,46.454095,1 7.436013,46.4543413,1 + + + + #style-Service + + relativeToGround + 7.4461285,46.4588623,1 7.4465356,46.4580981,1 + + + + #style-Service + + relativeToGround + 7.4358702,46.4539509,1 7.4359997,46.4540404,1 + + + + #style-Service + + relativeToGround + 7.5789815,46.4928026,1 7.5790734,46.4928471,1 + + + + #style-Service + + relativeToGround + 7.5919641,46.4868266,1 7.592117,46.4869065,1 + + + + #style-Service + + relativeToGround + 7.6059609,46.5289507,1 7.6056635,46.5289968,1 + + + + #style-Service + + relativeToGround + 7.592703,46.526096,1 7.593466,46.525483,1 7.5930735,46.5248648,1 + + + + #style-Service + + relativeToGround + 7.592178,46.5287971,1 7.5922406,46.5288691,1 7.5923247,46.529017,1 7.5923721,46.5291939,1 7.5923976,46.5293461,1 + + + + #style-Service + + relativeToGround + 7.578854,46.5249327,1 7.5785473,46.524736,1 + + + + #style-Service + + relativeToGround + 7.5615433,46.5277193,1 7.561374,46.5277584,1 + + + + #style-Service + + relativeToGround + 7.5771625,46.5297081,1 7.5757467,46.5295395,1 + + + + Hahnenmoosstrasse + #style-Service + + relativeToGround + 7.5132733,46.4572948,1 7.5133883,46.4573978,1 7.5132933,46.4574818,1 7.5130673,46.4573498,1 7.5126303,46.4572888,1 7.5118483,46.4574828,1 7.5101523,46.4576848,1 7.5095283,46.4576228,1 7.5085313,46.4572698,1 7.5080333,46.4572118,1 7.5069933,46.4572868,1 7.5061813,46.4572468,1 7.5057723,46.4574628,1 7.5058393,46.4578288,1 7.5087808,46.4574575,1 7.5031103,46.4577448,1 7.5030413,46.4578388,1 7.5034833,46.4581518,1 7.5034483,46.4582518,1 7.5024893,46.4581448,1 7.5003853,46.4569498,1 7.5003883,46.4567438,1 7.5005073,46.4565828,1 7.5007043,46.4565128,1 7.5007173,46.4564108,1 7.4998403,46.4561428,1 7.4992083,46.4558578,1 7.4989973,46.4558668,1 7.4982906,46.4562011,1 7.4978551,46.455962,1 7.4974551,46.455427,1 7.4968953,46.4543278,1 7.4966573,46.4542338,1 7.4961843,46.4543818,1 7.4960133,46.4543198,1 7.4959533,46.4541388,1 7.4965103,46.4536988,1 7.4964933,46.4536218,1 7.4953603,46.4533988,1 7.494721,46.453113,1 7.494109,46.453374,1 7.493658,46.453437,1 7.492815,46.453277,1 7.4922764,46.4533365,1 7.49174,46.4534252,1 7.4912679,46.453477,1 7.4910962,46.4533809,1 7.4906778,46.453307,1 7.489497,46.453256,1 7.488978,46.45327,1 7.487949,46.453519,1 7.486012,46.453411,1 7.483716,46.45287,1 7.482943,46.452812,1 7.482147,46.452909,1 7.4814,46.453269,1 7.481139,46.453269,1 7.480528,46.453029,1 7.479955,46.452984,1 7.4796057,46.4531296,1 7.479434,46.4531739,1 7.4792896,46.45308,1 7.4792194,46.4529744,1 7.4790478,46.4528931,1 7.478841,46.453033,1 7.47874,46.453293,1 7.477474,46.453309,1 7.476344,46.453107,1 7.475372,46.453488,1 7.474272,46.453536,1 7.473791,46.453454,1 7.472928,46.452962,1 7.472723,46.452998,1 7.472366,46.453213,1 7.4716234,46.4532996,1 7.4712372,46.453307,1 7.4709689,46.4532922,1 7.4707544,46.4533439,1 7.4705183,46.4533144,1 7.4703038,46.4532183,1 + + + + #style-Service + + relativeToGround + 7.5751846,46.4916084,1 7.5749365,46.491503,1 7.5747446,46.4914272,1 + + + + #style-Service + + relativeToGround + 7.5769663,46.4921038,1 7.576441,46.491776,1 7.576364,46.491621,1 7.576362,46.491427,1 7.5763871,46.4912304,1 7.5763182,46.4911237,1 + + + + #style-Service + + relativeToGround + 7.5795925,46.490413,1 7.5794074,46.4902555,1 + + + + #style-Service + + relativeToGround + 7.5734897,46.4935177,1 7.573538,46.4934839,1 7.5735483,46.493418,1 7.573556,46.4933099,1 7.5735755,46.4932551,1 7.573676,46.4931932,1 7.5738286,46.4931243,1 7.5739371,46.4931082,1 7.574012,46.493094,1 7.5741504,46.4930548,1 7.5742015,46.4930235,1 7.5742826,46.4928928,1 7.574376,46.492803,1 7.574421,46.492763,1 7.574598,46.492717,1 7.574774,46.492685,1 7.5749459,46.492669,1 7.5751353,46.4926314,1 + + + + #style-Service + + relativeToGround + 7.574376,46.492803,1 7.5746354,46.4929073,1 7.5748091,46.4930498,1 7.5749942,46.4932398,1 7.5752138,46.4933824,1 7.5754645,46.4934693,1 7.5757087,46.4935283,1 7.5761725,46.4935343,1 7.5763535,46.4935589,1 7.5764212,46.4936211,1 7.576495,46.493829,1 7.576602,46.494096,1 7.576795,46.494181,1 7.5770454,46.4942655,1 + + + + #style-Service + + relativeToGround + 7.5849078,46.5347552,1 7.5849885,46.5347378,1 7.585183,46.534753,1 7.5855229,46.5347513,1 7.5856717,46.5347707,1 7.585943,46.5348464,1 7.586016,46.5348314,1 7.58602,46.5347903,1 7.5858345,46.5346537,1 7.5856432,46.5344437,1 7.5856581,46.5344076,1 7.5857148,46.5344078,1 7.5859478,46.5345439,1 7.5861633,46.5345952,1 7.586366,46.5346123,1 7.586484,46.534542,1 7.5866893,46.5343725,1 + + + + #style-Service + + relativeToGround + 7.587059,46.5342825,1 7.587135,46.534398,1 7.5871929,46.5344569,1 7.5873657,46.5345937,1 7.587636,46.534746,1 7.5878421,46.5348345,1 + + + + Falkiweg + #style-Service + + relativeToGround + 7.561747,46.4840627,1 7.5623648,46.4840221,1 7.5624662,46.4841424,1 7.562591,46.4842295,1 7.5630513,46.4842235,1 7.5633106,46.4842166,1 7.5634827,46.4841367,1 + + + + #style-Service + + relativeToGround + 7.5623769,46.4854461,1 7.5622912,46.4855938,1 7.5622704,46.4860729,1 7.5621787,46.4861073,1 7.5619413,46.4860499,1 7.5615122,46.4859008,1 7.5611623,46.4859065,1 7.5609581,46.485938,1 7.5608373,46.4860184,1 + + + + #style-Service + + relativeToGround + 7.5622704,46.4860729,1 7.5623863,46.4862233,1 7.5624681,46.4863847,1 + + + + #style-Service + + relativeToGround + 7.5556026,46.4788917,1 7.5555477,46.479214,1 7.5556151,46.4795353,1 7.5556149,46.4801761,1 7.5556517,46.4804555,1 7.5557955,46.4808898,1 7.5558411,46.4812561,1 7.5558839,46.4816013,1 + + + + #style-Service + + relativeToGround + 7.5548512,46.4833925,1 7.5550889,46.4838028,1 7.5552822,46.4840196,1 7.5554987,46.4843666,1 7.5556369,46.4845961,1 + + + + #style-Service + + relativeToGround + 7.5601552,46.4830974,1 7.560116,46.4826468,1 7.5614957,46.4825944,1 + + + + Falkiweg + #style-Service + + relativeToGround + 7.5630513,46.4842235,1 7.5630409,46.4844811,1 7.5628733,46.4846662,1 + + + + Birkenweg + #style-Service + + relativeToGround + 7.560472,46.4841615,1 7.5604406,46.4845196,1 7.5602381,46.4846229,1 7.5596029,46.4846037,1 + + + + Birkenweg + #style-Service + + relativeToGround + 7.5610374,46.4841326,1 7.5611142,46.4843658,1 + + + + Brunniweg + #style-Service + + relativeToGround + 7.5567689,46.4813658,1 7.5568027,46.4816531,1 7.5569895,46.4818235,1 + + + + #style-Service + + relativeToGround + 7.5566823,46.4811255,1 7.5567689,46.4813658,1 + + + + Egghausweg + #style-Service + + relativeToGround + 7.562353,46.4820061,1 7.5622413,46.4825617,1 7.5614957,46.4825944,1 + + + + #style-Service + + relativeToGround + 7.5783668,46.4966863,1 7.5779866,46.4968608,1 + + + + #style-Service + + relativeToGround + 7.5788599,46.4970856,1 7.578559,46.497615,1 7.5784905,46.4976816,1 + + + + #style-Service + + relativeToGround + 7.5804891,46.4976849,1 7.5804732,46.4976377,1 7.580323,46.4974715,1 7.580186,46.4973576,1 7.580208,46.4972438,1 7.5802253,46.4971513,1 7.5802103,46.4970622,1 7.5801714,46.4970016,1 + + + + #style-Service + + relativeToGround + 7.580573,46.518538,1 7.580476,46.5182,1 7.580281,46.517923,1 7.580272,46.517884,1 7.5803133,46.5178587,1 7.580384,46.517862,1 7.580533,46.518081,1 7.580644,46.518193,1 7.580787,46.518268,1 7.580881,46.518395,1 7.581021,46.518517,1 7.581108,46.518651,1 7.581235,46.518762,1 7.581369,46.519014,1 7.5815,46.519189,1 7.581947,46.519404,1 7.582104,46.519512,1 7.582187,46.519603,1 7.582507,46.519782,1 7.58259,46.519851,1 7.582661,46.5198661,1 7.5827033,46.5198324,1 7.582691,46.5197745,1 7.582629,46.519707,1 7.582365,46.519429,1 7.5823268,46.5191792,1 + + + + #style-Service + + relativeToGround + 7.5532166,46.4856797,1 7.553475,46.485585,1 7.553817,46.485256,1 7.553812,46.485215,1 7.5536868,46.4849435,1 + + + + #style-Service + + relativeToGround + 7.5615007,46.4706892,1 7.5613997,46.470631,1 7.5607353,46.4711441,1 7.560183,46.471455,1 7.5601093,46.4714637,1 7.560081,46.4714134,1 7.5602488,46.4711103,1 7.5603802,46.4708687,1 7.5608448,46.4705818,1 7.5616215,46.4698555,1 7.5617283,46.4695452,1 7.5616912,46.4694069,1 7.5616128,46.4693072,1 7.5614945,46.469236,1 7.5613456,46.469107,1 7.5613033,46.4689269,1 7.5615058,46.4686482,1 7.5616043,46.468364,1 7.5615151,46.4679643,1 7.5616194,46.4674144,1 7.5614199,46.4671432,1 7.5613818,46.4669685,1 7.5615864,46.4665648,1 7.5615864,46.4661599,1 7.5616687,46.4659865,1 7.5616526,46.4658976,1 7.5615269,46.4658976,1 7.5615024,46.4659185,1 7.5614258,46.4660844,1 7.560844,46.466777,1 7.5606614,46.4668815,1 7.5604401,46.4670332,1 7.56013,46.4673879,1 7.559733,46.467773,1 7.55952,46.4679289,1 7.5594277,46.467948,1 7.5593446,46.4678938,1 7.559371,46.467807,1 7.5596978,46.4670772,1 7.5597256,46.4668715,1 7.559637,46.466644,1 7.5596008,46.4663719,1 7.5595604,46.4659766,1 7.5594765,46.4656802,1 7.5595737,46.465423,1 7.559713,46.465291,1 7.5598281,46.4651508,1 7.559757,46.464943,1 7.559711,46.464879,1 7.5595499,46.4645658,1 7.5594913,46.4644275,1 7.559382,46.464309,1 7.559302,46.4642619,1 7.559013,46.464152,1 7.5589202,46.4640915,1 7.5588007,46.4639848,1 7.558761,46.463881,1 7.5586757,46.4636012,1 7.558588,46.4634941,1 7.55817,46.463211,1 7.5578807,46.4630595,1 7.5575283,46.4628252,1 7.5573015,46.4626567,1 7.5571541,46.4625209,1 7.5570332,46.4624804,1 7.5569236,46.4625235,1 7.5568688,46.4626006,1 7.5569142,46.4628709,1 7.5567834,46.4630751,1 7.5567486,46.463256,1 7.5567563,46.4635207,1 7.5567409,46.4637356,1 7.556819,46.464071,1 7.556927,46.46428,1 7.5569515,46.464646,1 7.5569489,46.4648344,1 7.5570969,46.4651071,1 7.557132,46.465248,1 7.5571481,46.4654357,1 7.5571032,46.4656238,1 7.556845,46.4661,1 7.556808,46.466241,1 7.556705,46.466662,1 7.5566013,46.4668594,1 7.556422,46.4670092,1 7.556133,46.4671663,1 7.555967,46.467302,1 7.555582,46.46755,1 7.5553411,46.4676536,1 7.555261,46.4676825,1 7.555232,46.467693,1 7.55507,46.467698,1 7.555064,46.467579,1 7.555189,46.467454,1 7.555266,46.467329,1 7.555253,46.467204,1 7.555198,46.46708,1 7.555171,46.46692,1 7.5551885,46.4667743,1 7.555143,46.466618,1 7.555043,46.466467,1 7.554902,46.46618,1 7.5547665,46.4659837,1 7.5546718,46.4658163,1 7.554613,46.465756,1 7.554335,46.465537,1 7.553879,46.46527,1 7.55364,46.465173,1 7.553503,46.465092,1 7.553265,46.464872,1 7.553112,46.464693,1 7.553025,46.464559,1 7.552984,46.464428,1 7.552966,46.464301,1 7.553023,46.464129,1 7.553046,46.463964,1 7.55301,46.463811,1 7.552957,46.463687,1 7.552835,46.46356,1 7.552786,46.463439,1 7.552644,46.462916,1 7.552526,46.462782,1 7.552398,46.462681,1 7.552202,46.462578,1 7.552022,46.462506,1 7.551384,46.462183,1 7.551265,46.46208,1 7.550822,46.461898,1 7.550655,46.461816,1 7.5505555,46.461797,1 7.550536,46.461845,1 7.5506,46.461947,1 7.550775,46.462053,1 7.550877,46.462166,1 7.550961,46.462315,1 7.551074,46.462481,1 7.551251,46.462677,1 7.551333,46.462809,1 7.551424,46.463083,1 7.55148,46.463166,1 7.5514055,46.4633987,1 7.5513305,46.4635485,1 7.551122,46.463773,1 + + + + #style-Service + + relativeToGround + 7.5601093,46.4714637,1 7.5595884,46.4717158,1 7.559275,46.47182,1 7.5589672,46.4720202,1 7.5584806,46.4723453,1 7.5581622,46.4724206,1 7.55787,46.472668,1 7.5575608,46.4728455,1 7.55748,46.472929,1 7.557326,46.473397,1 7.557232,46.473534,1 7.557135,46.473651,1 7.556988,46.473764,1 7.5568899,46.4738759,1 7.556803,46.4740459,1 7.556738,46.474206,1 7.5567085,46.4744798,1 7.5567473,46.4745861,1 7.556734,46.474669,1 7.5566457,46.4748183,1 + + + + #style-Service + + relativeToGround + 7.552982,46.478716,1 7.553269,46.477763,1 7.5534638,46.4774581,1 7.5535454,46.4773304,1 + + + + #style-Service + + relativeToGround + 7.4714196,46.4524422,1 7.4714839,46.4523756,1 7.4714947,46.4522943,1 7.4714517,46.4522278,1 7.471441,46.4519617,1 7.4716556,46.4516365,1 7.4717951,46.4512964,1 7.4718916,46.4508529,1 7.472471,46.4500102,1 7.472825,46.449308,1 7.473222,46.4487684,1 7.4733722,46.4486501,1 7.4739087,46.4484061,1 7.4745953,46.4483027,1 7.4755072,46.4481696,1 7.4758828,46.4480291,1 7.4760008,46.447933,1 7.4758077,46.4478222,1 7.4754751,46.4477556,1 7.4751532,46.4476817,1 7.4750459,46.447593,1 7.4750996,46.4475412,1 7.4751425,46.4474895,1 7.4754429,46.4474969,1 7.4758291,46.4475486,1 7.4762046,46.4475043,1 7.4766016,46.4474082,1 7.4769986,46.4473638,1 7.477299,46.4472751,1 7.477535,46.4471864,1 7.4776208,46.4469942,1 7.4776208,46.4468611,1 7.4776745,46.4466763,1 7.4779105,46.4465507,1 7.4781358,46.4465285,1 7.4782967,46.4465359,1 7.4785113,46.4464989,1 7.4786079,46.4463954,1 7.4785972,46.446255,1 7.4785113,46.446011,1 7.4784791,46.4457966,1 7.4783718,46.4455748,1 7.4783397,46.4452274,1 7.4785972,46.4445473,1 7.4788546,46.444015,1 7.4792409,46.4433053,1 7.4794233,46.443187,1 7.4797773,46.4429578,1 7.4803352,46.4426547,1 7.4806893,46.4423663,1 7.4811077,46.4422259,1 7.481569,46.4420337,1 7.4818587,46.4419893,1 7.4825346,46.4418858,1 7.4835753,46.4416936,1 7.4840367,46.441627,1 7.4842401,46.44165,1 7.4841654,46.4418562,1 7.4838543,46.4422554,1 7.4837899,46.4425512,1 7.483629,46.4430021,1 7.4835861,46.44332,1 7.4836826,46.4435566,1 7.4838436,46.4436158,1 7.4840152,46.4435418,1 7.4840796,46.4434679,1 7.4843264,46.4433718,1 7.4845302,46.4433718,1 7.4863434,46.4436084,1 7.4868691,46.4436823,1 7.4872124,46.4436971,1 7.487427,46.4436453,1 7.4875128,46.4435566,1 7.487545,46.4434975,1 7.4877703,46.4432757,1 7.4879634,46.4432535,1 7.48806,46.4432831,1 7.488178,46.4437045,1 7.4881029,46.4441333,1 7.4880493,46.4444216,1 7.4881887,46.4446286,1 7.4883282,46.4447173,1 7.4884845,46.4446966,1 7.4886072,46.4446803,1 7.4886823,46.4446064,1 7.4891972,46.4443329,1 7.4898732,46.444148,1 7.4904954,46.4440593,1 7.4909568,46.4440889,1 7.4914288,46.4441111,1 7.4917722,46.4440741,1 7.4921048,46.4440889,1 7.4923622,46.4441702,1 7.4928021,46.4442072,1 7.4933922,46.444222,1 7.4938009,46.4443235,1 7.4940467,46.4443846,1 7.4945187,46.4444733,1 7.494787,46.4444585,1 + + + + #style-Service + + relativeToGround + 7.4938009,46.4443235,1 7.4948406,46.4440224,1 + + + + #style-Service + + relativeToGround + 7.5134953,46.4566158,1 7.5133908,46.4565887,1 7.513144,46.4564409,1 7.5130367,46.4562857,1 7.5130474,46.4560714,1 7.5129509,46.4559753,1 7.5124574,46.4556575,1 7.5121891,46.4554875,1 7.5120282,46.4554431,1 7.5115025,46.4553766,1 7.5107515,46.4552509,1 7.5101292,46.4549109,1 7.5096357,46.4545192,1 7.5092709,46.4540831,1 7.5091743,46.4537948,1 7.5093889,46.4534992,1 7.5097215,46.4531665,1 7.5098181,46.4527452,1 7.5101936,46.4521243,1 7.5107622,46.4518434,1 7.5111484,46.4515995,1 7.5112879,46.4512447,1 7.5114596,46.4508234,1 7.5114167,46.4506312,1 7.5113201,46.450439,1 7.5110626,46.4502394,1 7.5107837,46.4502837,1 7.5105369,46.4504981,1 7.510215,46.4506903,1 7.5098824,46.4507273,1 7.5095928,46.4506016,1 7.5090349,46.4503503,1 7.5086057,46.4502098,1 7.5082195,46.4501803,1 7.507962,46.450269,1 7.5075757,46.4503429,1 7.5073182,46.4503207,1 7.5068247,46.4503503,1 7.5066638,46.4502985,1 7.5064472,46.4502726,1 7.5063185,46.4501986,1 7.5061253,46.4500952,1 7.5059751,46.4499621,1 7.5058571,46.4498438,1 7.5055674,46.4495408,1 7.5053529,46.4493633,1 7.5051168,46.4493338,1 7.5049023,46.4492672,1 7.5047091,46.4492081,1 7.504398,46.4491785,1 7.5041727,46.4492155,1 7.5037543,46.4492599,1 7.5035075,46.4491416,1 7.5034002,46.4490233,1 7.5033466,46.448905,1 7.5032929,46.4487794,1 7.5032071,46.448395,1 7.50325,46.4480771,1 7.5034324,46.4477001,1 7.5035612,46.4474931,1 7.5036041,46.4473896,1 7.5035826,46.4472787,1 7.5035182,46.4472639,1 7.5034002,46.4472492,1 7.5033359,46.4471752,1 7.5033359,46.4470865,1 7.5033788,46.4470126,1 7.5034217,46.4469461,1 7.5035397,46.4469609,1 7.5037006,46.4470126,1 7.5037757,46.4469756,1 7.5038508,46.4468278,1 7.5038723,46.4466873,1 7.5037757,46.4465543,1 7.5037757,46.4464582,1 7.5037543,46.4463621,1 7.5037972,46.4462586,1 7.504001,46.4461994,1 7.5043122,46.4461477,1 7.5045804,46.4462068,1 7.5048915,46.4462881,1 7.5050847,46.4463177,1 7.50531,46.4462807,1 7.5054602,46.446229,1 7.5055996,46.4462881,1 7.5057069,46.4464434,1 7.5057713,46.4466504,1 7.5057713,46.4468869,1 7.5055996,46.4470717,1 + + + + #style-Service + + relativeToGround + 7.5346943,46.4673158,1 7.5349879,46.4672014,1 7.5352239,46.4672753,1 7.5352454,46.4675413,1 7.5350737,46.4678812,1 7.5349665,46.4680881,1 7.5350523,46.4683246,1 7.5352454,46.4685759,1 7.5356746,46.4688862,1 7.5363827,46.4692409,1 7.5369191,46.4694921,1 7.5374341,46.4696252,1 7.5378632,46.4696547,1 7.5380993,46.4696252,1 7.5383353,46.469433,1 7.5383782,46.4692261,1 7.5380564,46.468295,1 7.5380993,46.4679847,1 7.5384211,46.4675856,1 7.5388718,46.4671718,1 7.5389039,46.4670462,1 7.5388503,46.466928,1 7.5386786,46.4667506,1 7.5384641,46.4663146,1 7.5384426,46.4659156,1 7.5382066,46.4653983,1 7.5380134,46.465014,1 7.5379491,46.4646741,1 7.5378847,46.4643637,1 7.5380564,46.4639794,1 7.538228,46.4636099,1 7.5383782,46.4634769,1 7.5384962,46.4634695,1 7.5385713,46.4635064,1 7.5385713,46.4636986,1 7.5383568,46.4640089,1 7.5384211,46.4642306,1 7.5385606,46.4644154,1 7.5385713,46.4647627,1 7.5386357,46.4649697,1 7.5392365,46.4656052,1 7.54076,46.467157,1 7.540878,46.4673122,1 7.5409531,46.4675856,1 7.5410819,46.4682433,1 7.5411999,46.4683837,1 7.5414038,46.4685906,1 7.5417256,46.4687236,1 7.5422406,46.4689749,1 7.5425625,46.4693591,1 7.542777,46.4697729,1 7.5427341,46.4699355,1 7.54282,46.4700981,1 7.5428843,46.4701941,1 7.5430345,46.4702311,1 7.5431204,46.4701498,1 7.5431311,46.4700463,1 7.5430775,46.4699207,1 7.5430775,46.4697729,1 7.5430775,46.4695586,1 7.5430238,46.4692409,1 7.5428951,46.4688419,1 7.542541,46.4683394,1 7.5424337,46.4679551,1 7.5423694,46.4674083,1 7.5423694,46.4669354,1 7.5421548,46.4666102,1 7.5417685,46.4663442,1 7.5415325,46.4660042,1 7.5414467,46.4657382,1 7.5415754,46.4652948,1 7.5417471,46.4648958,1 7.5421762,46.4642306,1 7.5424123,46.4639942,1 7.5425625,46.4636986,1 7.5425196,46.4634473,1 7.5424981,46.463196,1 7.5426698,46.46293,1 7.5429702,46.4626787,1 + + + + #style-Service + + relativeToGround + 7.5090349,46.4503503,1 7.5091616,46.4501765,1 7.5092153,46.4499695,1 7.5092904,46.4498586,1 7.5095586,46.4497551,1 7.5096873,46.449659,1 7.5098268,46.4495186,1 7.5099234,46.4493855,1 7.5100414,46.4492746,1 7.5102881,46.4492599,1 7.510374,46.4491933,1 7.5104705,46.4490677,1 7.5107495,46.4489124,1 7.5110177,46.4488976,1 7.5112752,46.4488829,1 7.5115112,46.4488755,1 7.5117258,46.4488976,1 7.5119618,46.4489716,1 7.512273,46.448979,1 7.5126163,46.4491046,1 7.5127772,46.4492672,1 7.5129274,46.4493929,1 7.5131098,46.4494964,1 7.5130991,46.4496295,1 7.5130669,46.4497699,1 7.5131527,46.4499325,1 7.5134424,46.450036,1 7.5136033,46.4501543,1 7.5137321,46.4503243,1 7.5138608,46.4505091,1 + + + + #style-Service + + relativeToGround + 7.5675205,46.4896429,1 7.5675839,46.4901911,1 + + + + #style-Service + + relativeToGround + 7.5613927,46.5267583,1 7.5616121,46.5269084,1 + + + + #style-Service + + relativeToGround + 7.5789126,46.5017241,1 7.5785017,46.5014825,1 + + + + #style-Service + + relativeToGround + 7.5789309,46.500105,1 7.5788346,46.4997917,1 + + + + #style-Service + + relativeToGround + 7.5791699,46.4928879,1 7.5790734,46.4928471,1 + + + + #style-Service + + relativeToGround + 7.5789309,46.500105,1 7.5786124,46.5000666,1 + + + + #style-Service + + relativeToGround + 7.5844175,46.5180817,1 7.5843919,46.5179006,1 7.5842967,46.5176599,1 7.584072,46.5172756,1 7.583998,46.516732,1 + + + + #style-Service + + relativeToGround + 7.5747518,46.4923365,1 7.5747561,46.4922525,1 7.5748319,46.4921223,1 7.5748181,46.4918,1 7.574828,46.4916949,1 7.574893,46.4916664,1 7.5750862,46.4916562,1 7.5751846,46.4916084,1 7.5752826,46.491563,1 + + + + #style-Service + + relativeToGround + 7.5856684,46.5185937,1 7.585732,46.518904,1 7.585997,46.519247,1 7.5863,46.519441,1 7.5866689,46.5195382,1 7.586981,46.519691,1 7.587645,46.520291,1 7.587742,46.520478,1 7.5876898,46.5205699,1 7.58757,46.5206516,1 7.587464,46.5207519,1 7.587397,46.520905,1 + + + + #style-Service + + relativeToGround + 7.5871749,46.5189125,1 7.5864254,46.5189694,1 7.5859396,46.5188548,1 7.5856684,46.5185937,1 7.5852648,46.5183663,1 7.5851079,46.5182339,1 7.5848608,46.5181009,1 7.5844175,46.5180817,1 7.5841229,46.5179971,1 7.5839457,46.5179174,1 7.5837708,46.5177703,1 7.5837251,46.5176286,1 7.5836592,46.5174623,1 + + + + #style-Service + + relativeToGround + 7.5802588,46.5160395,1 7.5805381,46.5164442,1 7.5811876,46.5165553,1 7.5812782,46.5165868,1 7.5820222,46.5167732,1 7.5823119,46.5170409,1 7.5823387,46.5174783,1 7.5824085,46.5176703,1 7.5828028,46.5180929,1 7.5833177,46.5182535,1 7.5835431,46.5183753,1 7.5837979,46.5183661,1 7.5840124,46.5183144,1 7.5834867,46.5181206,1 7.5833553,46.5179767,1 7.583358,46.517626,1 7.5834867,46.5174323,1 7.5836592,46.5174623,1 + + + + #style-Service + + relativeToGround + 7.6025022,46.5497569,1 7.6020138,46.5498841,1 + + + + #style-Service + + relativeToGround + 7.6122192,46.5585079,1 7.6125202,46.5582846,1 7.6125382,46.5581503,1 7.6124765,46.5580017,1 7.61231,46.557889,1 + + + + #style-Service + + relativeToGround + 7.5875485,46.5190239,1 7.5871749,46.5189125,1 + + + + #style-Service + + relativeToGround + 7.5620419,46.4912371,1 7.5627963,46.4915881,1 + + + + #style-Service + + relativeToGround + 7.5853231,46.5118698,1 7.5867416,46.5114409,1 + + + + #style-Service + + relativeToGround + 7.5808419,46.5032417,1 7.5806755,46.503651,1 7.5807632,46.5038849,1 + + + + #style-Service + + relativeToGround + 7.5833344,46.5060923,1 7.5829935,46.505959,1 7.582733,46.50693,1 + + + + #style-Service + + relativeToGround + 7.5619716,46.4909369,1 7.562116,46.4908836,1 7.5624485,46.4911228,1 + + + + #style-Service + + relativeToGround + 7.5845033,46.511303,1 7.5847716,46.5113253,1 7.5849493,46.5116193,1 + + + + #style-Service + + relativeToGround + 7.5925689,46.5257627,1 7.592703,46.526096,1 7.5926549,46.5263226,1 + + + + #style-Service + + relativeToGround + 7.5823956,46.5048989,1 7.5822898,46.5036369,1 7.5815068,46.5029364,1 + + + + #style-Service + + relativeToGround + 7.5890023,46.5205153,1 7.5884929,46.5201995,1 7.5883311,46.5199786,1 7.5882242,46.5196358,1 7.5875485,46.5190239,1 + + + + #style-Service + + relativeToGround + 7.5709768,46.4961208,1 7.5710612,46.4963304,1 7.5713268,46.4965265,1 7.5716017,46.497285,1 7.5720307,46.4977428,1 + + + + #style-Service + + relativeToGround + 7.588105,46.4862347,1 7.5882589,46.4861244,1 + + + + Brunniweg + #style-Service + + relativeToGround + 7.5583492,46.4819039,1 7.55795,46.481785,1 7.5573748,46.4816562,1 7.5568027,46.4816531,1 + + + + Fuhrenstrasse + #style-Service + + relativeToGround + 7.5535228,46.4865284,1 7.5540973,46.4860504,1 7.5553724,46.4858594,1 7.5555516,46.4857964,1 7.555751,46.4857822,1 7.5561161,46.4856628,1 7.5561553,46.4856415,1 + + + + Rörliweg + #style-Service + + relativeToGround + 7.5666203,46.4846783,1 7.5665448,46.4847291,1 7.5656341,46.4848814,1 7.5658042,46.4853983,1 + + + + #style-Service + + relativeToGround + 7.5589982,46.4817042,1 7.5590716,46.4818306,1 + + + + #style-Service + + relativeToGround + 7.566311,46.4842938,1 7.5661292,46.484468,1 + + + + #style-Service + + relativeToGround + 7.5668295,46.4847669,1 7.5669459,46.4845543,1 7.566928,46.4842878,1 7.566311,46.4842938,1 7.5661779,46.4842949,1 + + + + #style-Service + + relativeToGround + 7.5616769,46.4873407,1 7.5618759,46.4873603,1 7.562336,46.4875068,1 7.5629211,46.4878619,1 7.5633173,46.488305,1 7.5638849,46.4885749,1 7.5651387,46.4893362,1 + + + + Strubelweg + #style-Service + + relativeToGround + 7.5561553,46.4856415,1 7.5560704,46.4854118,1 7.5559655,46.4852385,1 7.5558801,46.4850392,1 7.5558516,46.4849379,1 7.5556369,46.4845961,1 7.5557556,46.4835758,1 7.5556465,46.4832228,1 7.5556302,46.482438,1 7.5556902,46.4823253,1 7.5559629,46.481946,1 7.5559405,46.4817142,1 7.5558839,46.4816013,1 + + + + Lärcheweg + #style-Service + + relativeToGround + 7.5611634,46.4903397,1 7.5610451,46.4902373,1 + + + + #style-Service + + relativeToGround + 7.5737082,46.4907245,1 7.5735328,46.490616,1 7.5733673,46.4903853,1 7.5733062,46.4902442,1 7.5732825,46.4900712,1 7.5733348,46.4898921,1 7.5733339,46.4894668,1 7.5732422,46.4892976,1 7.5730973,46.4891714,1 7.5728372,46.4890235,1 7.5726529,46.489033,1 + + + + #style-Service + + relativeToGround + 7.5696679,46.4904828,1 7.5696337,46.4903928,1 7.5694953,46.4902536,1 7.5693484,46.4900982,1 7.5692716,46.489935,1 7.5692449,46.4897418,1 7.569231,46.4895346,1 7.5691648,46.4893786,1 7.5689467,46.4891493,1 7.5688378,46.4889221,1 7.5689846,46.4887416,1 7.5687855,46.4885286,1 7.5687156,46.4884763,1 7.5686163,46.4882459,1 7.5685316,46.4880573,1 7.5684612,46.487926,1 7.5683453,46.4878612,1 + + + + #style-Service + + relativeToGround + 7.5739091,46.4841923,1 7.5735123,46.4842222,1 + + + + #style-Service + + relativeToGround + 7.5707587,46.4883279,1 7.5714861,46.4882473,1 + + + + #style-Service + + relativeToGround + 7.5737649,46.4942215,1 7.5729909,46.4941247,1 7.5724996,46.4938582,1 + + + + #style-Service + + relativeToGround + 7.5686415,46.4865509,1 7.5685948,46.4864379,1 7.5685481,46.4863398,1 + + + + #style-Service + + relativeToGround + 7.5687156,46.4884763,1 7.5686259,46.4885828,1 7.5686407,46.4886975,1 7.5688378,46.4889221,1 + + + + #style-Service + + relativeToGround + 7.5601168,46.4909892,1 7.5595847,46.4906371,1 7.5594989,46.4906215,1 7.5593649,46.490633,1 + + + + #style-Service + + relativeToGround + 7.5708117,46.4883663,1 7.5710165,46.488705,1 7.5710179,46.4888509,1 7.5708758,46.4889223,1 7.5708124,46.4889286,1 7.5707761,46.4888902,1 + + + + #style-Service + + relativeToGround + 7.5740561,46.4844231,1 7.5739091,46.4841923,1 7.5738582,46.4838387,1 7.5738109,46.4836506,1 7.5736241,46.4835863,1 7.5733468,46.4835758,1 7.5730751,46.4834722,1 + + + + #style-Service + + relativeToGround + 7.5778322,46.4954612,1 7.5774594,46.4953694,1 7.57696,46.4953792,1 7.5765186,46.4953534,1 7.5761855,46.4952056,1 7.5756624,46.4951092,1 7.5748615,46.4951854,1 + + + + #style-Service + + relativeToGround + 7.568748,46.486657,1 7.5687618,46.4868008,1 7.5686633,46.4868728,1 7.5683637,46.4869243,1 7.5682553,46.4869895,1 7.5682593,46.4871482,1 7.5683489,46.4873599,1 7.5683539,46.4874461,1 + + + + + + Casings + + Motorway_Casing + + + + Motorway_Link_Casing + + + + Trunk_Casing + + + + Trunk_Link_Casing + + + + + + diff --git a/float-no-zero/examples/data/kml/2012_Earthquakes_Mag5.kml b/float-no-zero/examples/data/kml/2012_Earthquakes_Mag5.kml new file mode 100644 index 0000000000..7a8466f5cb --- /dev/null +++ b/float-no-zero/examples/data/kml/2012_Earthquakes_Mag5.kml @@ -0,0 +1,10758 @@ + + + + 2012 Earthquakes, Magnitude 5 + + U.S. Geological Survey + + + + Magnitude 5 + + M 5.9 - 2012 Jan 15, SOUTH SHETLAND ISLANDS + 5.9 + + -56.072,-60.975,0 + + + + M 5.9 - 2012 Jan 19, OFF W. COAST OF S. ISLAND, N.Z. + 5.9 + + 165.778,-46.686,0 + + + + M 5.9 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND + 5.9 + + -177.386,-29.43,0 + + + + M 5.9 - 2012 Feb 9, MACQUARIE ISLAND REGION + 5.9 + + 157.837,-58.312,0 + + + + M 5.9 - 2012 Feb 10, FIJI REGION + 5.9 + + -178.549,-17.968,0 + + + + M 5.9 - 2012 Feb 13, COSTA RICA + 5.9 + + -84.121,9.183,0 + + + + M 5.9 - 2012 Feb 26, TAIWAN + 5.9 + + 120.891,22.661,0 + + + + M 5.9 - 2012 Mar 8, SOUTHERN XINJIANG, CHINA + 5.9 + + 81.307,39.383,0 + + + + M 5.9 - 2012 Mar 19, SAMOA ISLANDS REGION + 5.9 + + -175.702,-14.621,0 + + + + M 5.9 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.9 + + 89.441,2.199,0 + + + + M 5.9 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA + 5.9 + + 93.821,3.269,0 + + + + M 5.9 - 2012 May 10, EASTER ISLAND REGION + 5.9 + + -112.587,-28.73,0 + + + + M 5.9 - 2012 May 19, OFF EAST COAST OF HONSHU, JAPAN + 5.9 + + 143.311,39.665,0 + + + + M 5.9 - 2012 May 23, HOKKAIDO, JAPAN REGION + 5.9 + + 142.082,41.335,0 + + + + M 5.9 - 2012 May 23, WESTERN INDIAN-ANTARCTIC RIDGE + 5.9 + + 139.536,-50.352,0 + + + + M 5.9 - 2012 May 28, TONGA + 5.9 + + -175.976,-19.962,0 + + + + M 5.9 - 2012 Jun 2, SALTA, ARGENTINA + 5.9 + + -63.555,-22.059,0 + + + + M 5.9 - 2012 Jun 4, JAVA, INDONESIA + 5.9 + + 106.371,-7.692,0 + + + + M 5.9 - 2012 Jun 9, TAIWAN REGION + 5.9 + + 122.248,24.572,0 + + + + M 5.9 - 2012 Jun 16, LUZON, PHILIPPINES + 5.9 + + 119.563,15.593,0 + + + + M 5.9 - 2012 Jul 18, PACIFIC-ANTARCTIC RIDGE + 5.9 + + -128.893,-55.661,0 + + + + M 5.9 - 2012 Jul 18, FIJI REGION + 5.9 + + -178.508,-20.872,0 + + + + M 5.9 - 2012 Jul 21, VANUATU REGION + 5.9 + + 173.789,-19.19,0 + + + + M 5.9 - 2012 Jul 29, OFFSHORE GUATEMALA + 5.9 + + -92.294,14.191,0 + + + + M 5.9 - 2012 Aug 8, FIJI + 5.9 + + 178.062,-16.02,0 + + + + M 5.9 - 2012 Aug 25, HOKKAIDO, JAPAN REGION + 5.9 + + 142.913,42.419,0 + + + + M 5.9 - 2012 Sep 9, KURIL ISLANDS + 5.9 + + 155.75,49.247,0 + + + + M 5.9 - 2012 Sep 11, SOUTH OF MARIANA ISLANDS + 5.9 + + 143.218,11.838,0 + + + + M 5.9 - 2012 Oct 8, GULF OF CALIFORNIA + 5.9 + + -109.574,25.127,0 + + + + M 5.9 - 2012 Oct 18, WEST OF MACQUARIE ISLAND + 5.9 + + 144.006,-54.217,0 + + + + M 5.9 - 2012 Oct 23, IZU ISLANDS, JAPAN REGION + 5.9 + + 139.251,29.057,0 + + + + M 5.9 - 2012 Nov 15, BISMARCK SEA + 5.9 + + 148.27,-3.109,0 + + + + M 5.9 - 2012 Nov 17, TONGA REGION + 5.9 + + -172.32,-18.381,0 + + + + M 5.9 - 2012 Nov 21, LIBERTADOR O'HIGGINS, CHILE + 5.9 + + -71.868,-33.939,0 + + + + M 5.9 - 2012 Nov 22, SALTA, ARGENTINA + 5.9 + + -63.571,-22.742,0 + + + + M 5.9 - 2012 Nov 29, NEAR N COAST OF NEW GUINEA, PNG. + 5.9 + + 145.562,-3.423,0 + + + + M 5.9 - 2012 Dec 17, CENTRAL EAST PACIFIC RISE + 5.9 + + -104.495,-4.178,0 + + + + M 5.9 - 2012 Dec 27, OFFSHORE MAULE, CHILE + 5.9 + + -73.255,-35.783,0 + + + + M 5.8 - 2012 Jan 14, BABUYAN ISL REGION, PHILIPPINES + 5.8 + + 121.156,19.202,0 + + + + M 5.8 - 2012 Jan 18, MOLUCCA SEA + 5.8 + + 126.829,-0.877,0 + + + + M 5.8 - 2012 Feb 4, TONGA + 5.8 + + -174.035,-20.536,0 + + + + M 5.8 - 2012 Feb 6, NEGROS- CEBU REG, PHILIPPINES + 5.8 + + 123.08,9.821,0 + + + + M 5.8 - 2012 Feb 14, NEAR EAST COAST OF HONSHU, JAPAN + 5.8 + + 141.386,36.214,0 + + + + M 5.8 - 2012 Feb 15, OFF COAST OF OREGON + 5.8 + + -127.518,43.625,0 + + + + M 5.8 - 2012 Feb 16, MAURITIUS - REUNION REGION + 5.8 + + 65.405,-17.839,0 + + + + M 5.8 - 2012 Mar 16, LEYTE, PHILIPPINES + 5.8 + + 125.633,10.037,0 + + + + M 5.8 - 2012 Mar 17, SOUTHERN EAST PACIFIC RISE + 5.8 + + -107.644,-34.905,0 + + + + M 5.8 - 2012 Apr 10, NORTH OF ASCENSION ISLAND + 5.8 + + -13.972,-1.261,0 + + + + M 5.8 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.8 + + 91.748,1.271,0 + + + + M 5.8 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.8 + + 89.685,1.841,0 + + + + M 5.8 - 2012 Apr 14, SUNDA STRAIT, INDONESIA + 5.8 + + 105.457,-6.81,0 + + + + M 5.8 - 2012 Apr 16, SULAWESI, INDONESIA + 5.8 + + 121.855,-2.64,0 + + + + M 5.8 - 2012 Apr 16, SOUTHERN GREECE + 5.8 + + 21.475,36.632,0 + + + + M 5.8 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA + 5.8 + + 93.36,2.158,0 + + + + M 5.8 - 2012 Apr 29, NEAR EAST COAST OF HONSHU, JAPAN + 5.8 + + 140.349,35.596,0 + + + + M 5.8 - 2012 May 2, WEST OF MACQUARIE ISLAND + 5.8 + + 143.836,-54.565,0 + + + + M 5.8 - 2012 May 19, ANTOFAGASTA, CHILE + 5.8 + + -70.562,-25.729,0 + + + + M 5.8 - 2012 May 29, SOUTH OF FIJI ISLANDS + 5.8 + + -179.61,-22.13,0 + + + + M 5.8 - 2012 May 29, NORTHERN ITALY + 5.8 + + 11.086,44.851,0 + + + + M 5.8 - 2012 Jun 1, NEAR N COAST OF PAPUA, INDONESIA + 5.8 + + 133.269,-0.72,0 + + + + M 5.8 - 2012 Jun 7, FIJI REGION + 5.8 + + -176.34,-20.192,0 + + + + M 5.8 - 2012 Jun 29, SOUTH ATLANTIC OCEAN + 5.8 + + -9.663,-24.747,0 + + + + M 5.8 - 2012 Jul 12, KURIL ISLANDS + 5.8 + + 151.665,45.452,0 + + + + M 5.8 - 2012 Jul 20, KURIL ISLANDS + 5.8 + + 156.132,49.354,0 + + + + M 5.8 - 2012 Aug 5, FIJI REGION + 5.8 + + -178.358,-21.15,0 + + + + M 5.8 - 2012 Aug 16, SOUTHEAST OF EASTER ISLAND + 5.8 + + -98.905,-36.429,0 + + + + M 5.8 - 2012 Aug 18, HALMAHERA, INDONESIA + 5.8 + + 128.697,2.645,0 + + + + M 5.8 - 2012 Sep 3, MORO GULF, MINDANAO, PHILIPPINES + 5.8 + + 123.875,6.61,0 + + + + M 5.8 - 2012 Sep 27, SOLOMON ISLANDS + 5.8 + + 157.456,-8.838,0 + + + + M 5.8 - 2012 Oct 14, SOLOMON ISLANDS + 5.8 + + 156.048,-7.145,0 + + + + M 5.8 - 2012 Oct 23, SOUTHEAST OF LOYALTY ISLANDS + 5.8 + + 171.691,-22.312,0 + + + + M 5.8 - 2012 Nov 11, MYANMAR + 5.8 + + 95.832,22.72,0 + + + + M 5.8 - 2012 Dec 4, SOUTHERN ALASKA + 5.8 + + -150.76,61.237,0 + + + + M 5.8 - 2012 Dec 5, EASTERN IRAN + 5.8 + + 59.571,33.506,0 + + + + M 5.8 - 2012 Dec 14, FIJI REGION + 5.8 + + -178.186,-15.307,0 + + + + M 5.7 - 2012 Jan 7, KERMADEC ISLANDS REGION + 5.7 + + -176.935,-28.613,0 + + + + M 5.7 - 2012 Jan 17, SAMAR, PHILIPPINES + 5.7 + + 125.837,11.177,0 + + + + M 5.7 - 2012 Jan 19, SANTA CRUZ ISLANDS + 5.7 + + 165.57,-10.966,0 + + + + M 5.7 - 2012 Jan 20, FLORES REGION, INDONESIA + 5.7 + + 119.701,-8.406,0 + + + + M 5.7 - 2012 Feb 3, VANUATU + 5.7 + + 167.187,-17.463,0 + + + + M 5.7 - 2012 Feb 10, NEAR N COAST OF PAPUA, INDONESIA + 5.7 + + 132.691,-0.324,0 + + + + M 5.7 - 2012 Mar 4, SOUTHEAST OF LOYALTY ISLANDS + 5.7 + + 169.769,-21.529,0 + + + + M 5.7 - 2012 Mar 25, PACIFIC-ANTARCTIC RIDGE + 5.7 + + -135.923,-54.576,0 + + + + M 5.7 - 2012 Apr 1, EASTERN HONSHU, JAPAN + 5.7 + + 140.957,37.116,0 + + + + M 5.7 - 2012 Apr 1, NEW IRELAND REGION, P.N.G. + 5.7 + + 153.427,-4.516,0 + + + + M 5.7 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.7 + + 89.544,2.913,0 + + + + M 5.7 - 2012 Apr 13, NEAR EAST COAST OF HONSHU, JAPAN + 5.7 + + 141.152,36.988,0 + + + + M 5.7 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA + 5.7 + + 93.853,3.256,0 + + + + M 5.7 - 2012 Apr 21, SOUTHERN MID-ATLANTIC RIDGE + 5.7 + + -16.181,-35.229,0 + + + + M 5.7 - 2012 Apr 23, MOLUCCA SEA + 5.7 + + 125.293,0.374,0 + + + + M 5.7 - 2012 Apr 25, NICOBAR ISLANDS, INDIA REGION + 5.7 + + 93.945,9.011,0 + + + + M 5.7 - 2012 Apr 29, OFF W COAST OF NORTHERN SUMATRA + 5.7 + + 94.509,2.704,0 + + + + M 5.7 - 2012 Apr 30, NORTH INDIAN OCEAN + 5.7 + + 89.598,1.757,0 + + + + M 5.7 - 2012 May 1, GUERRERO, MEXICO + 5.7 + + -101.085,18.251,0 + + + + M 5.7 - 2012 May 5, TONGA + 5.7 + + -174.227,-21.477,0 + + + + M 5.7 - 2012 May 12, TAJIKISTAN + 5.7 + + 70.354,38.612,0 + + + + M 5.7 - 2012 May 16, NEW BRITAIN REGION, P.N.G. + 5.7 + + 149.711,-5.504,0 + + + + M 5.7 - 2012 Jun 4, FIJI REGION + 5.7 + + -177.919,-15.279,0 + + + + M 5.7 - 2012 Jun 11, HINDU KUSH REGION, AFGHANISTAN + 5.7 + + 69.351,36.023,0 + + + + M 5.7 - 2012 Jun 15, MINDANAO, PHILIPPINES + 5.7 + + 126.354,5.719,0 + + + + M 5.7 - 2012 Jun 17, SOLOMON ISLANDS + 5.7 + + 160.356,-8.511,0 + + + + M 5.7 - 2012 Jun 22, MACQUARIE ISLAND REGION + 5.7 + + 158.79,-54.36,0 + + + + M 5.7 - 2012 Jun 27, EL SALVADOR + 5.7 + + -89.967,13.834,0 + + + + M 5.7 - 2012 Jul 2, NEAR COAST OF CENTRAL PERU + 5.7 + + -75.598,-14.423,0 + + + + M 5.7 - 2012 Jul 7, NEW IRELAND REGION, P.N.G. + 5.7 + + 153.296,-4.651,0 + + + + M 5.7 - 2012 Jul 11, KURIL ISLANDS + 5.7 + + 151.424,45.401,0 + + + + M 5.7 - 2012 Jul 11, SOUTH OF FIJI ISLANDS + 5.7 + + -177.362,-26.051,0 + + + + M 5.7 - 2012 Jul 12, HINDU KUSH REGION, AFGHANISTAN + 5.7 + + 70.906,36.527,0 + + + + M 5.7 - 2012 Jul 29, MYANMAR + 5.7 + + 94.299,22.935,0 + + + + M 5.7 - 2012 Aug 18, VANUATU REGION + 5.7 + + 172.379,-13.504,0 + + + + M 5.7 - 2012 Aug 18, TONGA + 5.7 + + -173.042,-15.598,0 + + + + M 5.7 - 2012 Aug 24, KERMADEC ISLANDS REGION + 5.7 + + -176.807,-27.311,0 + + + + M 5.7 - 2012 Sep 3, MINDANAO, PHILIPPINES + 5.7 + + 125.044,7.905,0 + + + + M 5.7 - 2012 Sep 6, CENTRAL EAST PACIFIC RISE + 5.7 + + -105.891,-4.6,0 + + + + M 5.7 - 2012 Sep 8, MARIANA ISLANDS REGION + 5.7 + + 145.923,21.527,0 + + + + M 5.7 - 2012 Sep 8, COSTA RICA + 5.7 + + -85.323,10.082,0 + + + + M 5.7 - 2012 Sep 15, SOUTH OF JAVA, INDONESIA + 5.7 + + 113.865,-10.732,0 + + + + M 5.7 - 2012 Sep 20, FIJI REGION + 5.7 + + -178.513,-20.757,0 + + + + M 5.7 - 2012 Oct 3, KEPULAUAN BATU, INDONESIA + 5.7 + + 97.672,-0.429,0 + + + + M 5.7 - 2012 Oct 5, NORTHERN MID-ATLANTIC RIDGE + 5.7 + + -46.457,17.479,0 + + + + M 5.7 - 2012 Oct 8, ANTOFAGASTA, CHILE + 5.7 + + -68.165,-21.725,0 + + + + M 5.7 - 2012 Oct 14, KURIL ISLANDS + 5.7 + + 154.428,48.308,0 + + + + M 5.7 - 2012 Oct 29, MOLUCCA SEA + 5.7 + + 125.185,-0.142,0 + + + + M 5.7 - 2012 Nov 1, JAVA, INDONESIA + 5.7 + + 107.529,-6.762,0 + + + + M 5.7 - 2012 Nov 6, MINAHASA, SULAWESI, INDONESIA + 5.7 + + 122.2,1.374,0 + + + + M 5.7 - 2012 Nov 7, OFFSHORE GUATEMALA + 5.7 + + -92.156,13.849,0 + + + + M 5.7 - 2012 Nov 14, NEGROS, PHILIPPINES + 5.7 + + 122.472,9.982,0 + + + + M 5.7 - 2012 Nov 27, SERAM, INDONESIA + 5.7 + + 129.219,-2.952,0 + + + + M 5.7 - 2012 Nov 30, TONGA + 5.7 + + -175.595,-18.824,0 + + + + M 5.7 - 2012 Dec 7, EASTERN NEW GUINEA REG., P.N.G. + 5.7 + + 146.954,-7.661,0 + + + + M 5.7 - 2012 Dec 17, CENTRAL EAST PACIFIC RISE + 5.7 + + -104.177,-4.028,0 + + + + M 5.7 - 2012 Dec 23, BLACK SEA, OFFSHORE GEORGIA + 5.7 + + 41.075,42.42,0 + + + + M 5.7 - 2012 Dec 29, BISMARCK SEA + 5.7 + + 148.899,-3.563,0 + + + + M 5.6 - 2012 Jan 5, TONGA + 5.6 + + -173.543,-17.691,0 + + + + M 5.6 - 2012 Jan 13, SOUTH SANDWICH ISLANDS REGION + 5.6 + + -27.073,-60.548,0 + + + + M 5.6 - 2012 Jan 16, SOUTH SHETLAND ISLANDS + 5.6 + + -56.095,-60.752,0 + + + + M 5.6 - 2012 Jan 17, COQUIMBO, CHILE + 5.6 + + -71.499,-31.655,0 + + + + M 5.6 - 2012 Jan 28, NEAR EAST COAST OF HONSHU, JAPAN + 5.6 + + 142.211,40.177,0 + + + + M 5.6 - 2012 Jan 28, SOUTHERN EAST PACIFIC RISE + 5.6 + + -110.517,-36.793,0 + + + + M 5.6 - 2012 Feb 2, NEW BRITAIN REGION, P.N.G. + 5.6 + + 149.774,-6.563,0 + + + + M 5.6 - 2012 Feb 2, NEW BRITAIN REGION, P.N.G. + 5.6 + + 149.718,-6.586,0 + + + + M 5.6 - 2012 Feb 4, SAMAR, PHILIPPINES + 5.6 + + 125.754,11.872,0 + + + + M 5.6 - 2012 Feb 4, VANCOUVER ISLAND, CANADA REGION + 5.6 + + -127.906,48.887,0 + + + + M 5.6 - 2012 Feb 6, NEGROS- CEBU REG, PHILIPPINES + 5.6 + + 123.227,10.092,0 + + + + M 5.6 - 2012 Feb 11, OFFSHORE BIO-BIO, CHILE + 5.6 + + -73.884,-37.456,0 + + + + M 5.6 - 2012 Feb 13, NORTHERN CALIFORNIA + 5.6 + + -123.79,41.143,0 + + + + M 5.6 - 2012 Feb 20, OFFSHORE CHIAPAS, MEXICO + 5.6 + + -92.779,14.276,0 + + + + M 5.6 - 2012 Feb 26, SOUTH OF KERMADEC ISLANDS + 5.6 + + -177.73,-32.495,0 + + + + M 5.6 - 2012 Feb 28, BONIN ISLANDS, JAPAN REGION + 5.6 + + 139.391,28.2,0 + + + + M 5.6 - 2012 Feb 29, NEAR EAST COAST OF HONSHU, JAPAN + 5.6 + + 141.001,35.2,0 + + + + M 5.6 - 2012 Mar 5, MASBATE REGION, PHILIPPINES + 5.6 + + 123.7,12.354,0 + + + + M 5.6 - 2012 Mar 7, PAPUA, INDONESIA + 5.6 + + 138.888,-2.814,0 + + + + M 5.6 - 2012 Mar 12, NORTHWESTERN KASHMIR + 5.6 + + 73.152,36.741,0 + + + + M 5.6 - 2012 Mar 14, OFF EAST COAST OF HONSHU, JAPAN + 5.6 + + 144.806,40.755,0 + + + + M 5.6 - 2012 Mar 26, SOUTHWEST INDIAN RIDGE + 5.6 + + 60.653,-30.04,0 + + + + M 5.6 - 2012 Apr 14, KURIL ISLANDS + 5.6 + + 155.651,49.38,0 + + + + M 5.6 - 2012 Apr 17, KERMADEC ISLANDS REGION + 5.6 + + -177.236,-31.894,0 + + + + M 5.6 - 2012 Apr 22, WEST OF MACQUARIE ISLAND + 5.6 + + 140.29,-52.867,0 + + + + M 5.6 - 2012 Apr 23, KURIL ISLANDS + 5.6 + + 154.739,48.397,0 + + + + M 5.6 - 2012 Apr 24, CARLSBERG RIDGE + 5.6 + + 61.511,5.649,0 + + + + M 5.6 - 2012 Apr 24, SOUTH OF TONGA + 5.6 + + -175.95,-24.228,0 + + + + M 5.6 - 2012 Apr 26, OFF W COAST OF NORTHERN SUMATRA + 5.6 + + 94.459,2.696,0 + + + + M 5.6 - 2012 Apr 28, NEW BRITAIN REGION, P.N.G. + 5.6 + + 152.11,-5.328,0 + + + + M 5.6 - 2012 Apr 29, NEAR EAST COAST OF HONSHU, JAPAN + 5.6 + + 142.037,39.745,0 + + + + M 5.6 - 2012 Apr 30, OFFSHORE COQUIMBO, CHILE + 5.6 + + -71.46,-29.868,0 + + + + M 5.6 - 2012 May 6, CENTRAL PERU + 5.6 + + -75.801,-13.82,0 + + + + M 5.6 - 2012 May 7, AZERBAIJAN + 5.6 + + 46.789,41.549,0 + + + + M 5.6 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN + 5.6 + + 143.248,39.548,0 + + + + M 5.6 - 2012 May 22, BULGARIA + 5.6 + + 22.968,42.645,0 + + + + M 5.6 - 2012 May 29, KOMANDORSKIYE OSTROVA REGION + 5.6 + + 168.925,54.368,0 + + + + M 5.6 - 2012 May 31, NEAR N COAST OF PAPUA, INDONESIA + 5.6 + + 133.181,-0.902,0 + + + + M 5.6 - 2012 Jun 19, NEAR ISLANDS, ALEUTIAN ISLANDS + 5.6 + + 171.701,53.351,0 + + + + M 5.6 - 2012 Jul 1, MYANMAR-INDIA BORDER REGION + 5.6 + + 94.696,25.592,0 + + + + M 5.6 - 2012 Jul 9, EASTERN MEDITERRANEAN SEA + 5.6 + + 28.919,35.604,0 + + + + M 5.6 - 2012 Jul 9, RYUKYU ISLANDS, JAPAN + 5.6 + + 130.099,29.381,0 + + + + M 5.6 - 2012 Jul 16, NEAR N COAST OF PAPUA, INDONESIA + 5.6 + + 137.053,-1.296,0 + + + + M 5.6 - 2012 Jul 19, HINDU KUSH REGION, AFGHANISTAN + 5.6 + + 71.375,37.248,0 + + + + M 5.6 - 2012 Jul 20, FIJI REGION + 5.6 + + -179.287,-21.222,0 + + + + M 5.6 - 2012 Jul 21, EAST OF NORTH ISLAND, N.Z. + 5.6 + + -179.968,-37.713,0 + + + + M 5.6 - 2012 Jul 22, BISMARCK SEA + 5.6 + + 149.532,-4.872,0 + + + + M 5.6 - 2012 Jul 26, SOUTHEAST OF LOYALTY ISLANDS + 5.6 + + 169.509,-21.103,0 + + + + M 5.6 - 2012 Jul 29, PRIMOR'YE, RUSSIA + 5.6 + + 139.073,47.379,0 + + + + M 5.6 - 2012 Aug 9, REVILLA GIGEDO ISLANDS REGION + 5.6 + + -109.332,19.946,0 + + + + M 5.6 - 2012 Aug 16, CENTRAL MID-ATLANTIC RIDGE + 5.6 + + -36.768,7.335,0 + + + + M 5.6 - 2012 Aug 19, OFF COAST OF WASHINGTON + 5.6 + + -128.619,47.789,0 + + + + M 5.6 - 2012 Aug 21, SOUTHWEST OF SUMATRA, INDONESIA + 5.6 + + 92.056,-0.172,0 + + + + M 5.6 - 2012 Aug 24, SOUTH OF KERMADEC ISLANDS + 5.6 + + -179.533,-33.435,0 + + + + M 5.6 - 2012 Aug 26, PACIFIC-ANTARCTIC RIDGE + 5.6 + + -179.778,-65.478,0 + + + + M 5.6 - 2012 Aug 30, WESTERN INDIAN-ANTARCTIC RIDGE + 5.6 + + 114.08,-50.143,0 + + + + M 5.6 - 2012 Aug 31, PHILIPPINE ISLANDS REGION + 5.6 + + 126.719,10.388,0 + + + + M 5.6 - 2012 Sep 6, PAPUA, INDONESIA + 5.6 + + 140.252,-3.661,0 + + + + M 5.6 - 2012 Sep 11, KURIL ISLANDS + 5.6 + + 151.111,45.335,0 + + + + M 5.6 - 2012 Sep 25, TONGA + 5.6 + + -173.901,-15.517,0 + + + + M 5.6 - 2012 Oct 7, LUZON, PHILIPPINES + 5.6 + + 120.939,18.543,0 + + + + M 5.6 - 2012 Oct 9, NEAR N COAST OF PAPUA, INDONESIA + 5.6 + + 139.224,-2.72,0 + + + + M 5.6 - 2012 Oct 15, OFF EAST COAST OF KAMCHATKA + 5.6 + + 159.379,51.9,0 + + + + M 5.6 - 2012 Oct 16, KURIL ISLANDS + 5.6 + + 156.438,49.618,0 + + + + M 5.6 - 2012 Oct 16, NORTH ISLAND OF NEW ZEALAND + 5.6 + + 176.167,-38.639,0 + + + + M 5.6 - 2012 Oct 19, MID-INDIAN RIDGE + 5.6 + + 67.057,-9.289,0 + + + + M 5.6 - 2012 Oct 23, WEST OF MACQUARIE ISLAND + 5.6 + + 148.206,-57.512,0 + + + + M 5.6 - 2012 Oct 25, NEAR EAST COAST OF HONSHU, JAPAN + 5.6 + + 141.699,38.306,0 + + + + M 5.6 - 2012 Nov 3, CENTRAL MID-ATLANTIC RIDGE + 5.6 + + -34.073,7.048,0 + + + + M 5.6 - 2012 Nov 5, OFF EAST COAST OF HONSHU, JAPAN + 5.6 + + 143.61,37.791,0 + + + + M 5.6 - 2012 Nov 6, MINAHASA, SULAWESI, INDONESIA + 5.6 + + 122.167,1.357,0 + + + + M 5.6 - 2012 Nov 6, CARLSBERG RIDGE + 5.6 + + 57.203,9.963,0 + + + + M 5.6 - 2012 Nov 7, EASTERN NEW GUINEA REG., P.N.G. + 5.6 + + 148.034,-8.652,0 + + + + M 5.6 - 2012 Nov 13, TONGA + 5.6 + + -175.934,-21.043,0 + + + + M 5.6 - 2012 Nov 14, NEW BRITAIN REGION, P.N.G. + 5.6 + + 151.341,-5.86,0 + + + + M 5.6 - 2012 Nov 16, PACIFIC-ANTARCTIC RIDGE + 5.6 + + -134.758,-53.955,0 + + + + M 5.6 - 2012 Nov 17, VANUATU + 5.6 + + 167.46,-14.99,0 + + + + M 5.6 - 2012 Nov 28, NORTHERN PERU + 5.6 + + -76.101,-4.522,0 + + + + M 5.6 - 2012 Nov 28, BANDA SEA + 5.6 + + 131.134,-5.398,0 + + + + M 5.6 - 2012 Dec 3, PACIFIC-ANTARCTIC RIDGE + 5.6 + + -136.244,-54.672,0 + + + + M 5.6 - 2012 Dec 8, NEAR S COAST OF NEW GUINEA, PNG. + 5.6 + + 143.973,-7.211,0 + + + + M 5.6 - 2012 Dec 9, MINDANAO, PHILIPPINES + 5.6 + + 126.166,6.703,0 + + + + M 5.6 - 2012 Dec 17, KURIL ISLANDS + 5.6 + + 155.837,49.785,0 + + + + M 5.5 - 2012 Jan 5, DOMINICAN REPUBLIC + 5.5 + + -70.361,18.325,0 + + + + M 5.5 - 2012 Jan 6, CENTRAL EAST PACIFIC RISE + 5.5 + + -107.312,-6.341,0 + + + + M 5.5 - 2012 Jan 12, NEAR EAST COAST OF HONSHU, JAPAN + 5.5 + + 141.071,36.994,0 + + + + M 5.5 - 2012 Jan 12, SOUTH OF AFRICA + 5.5 + + 28.152,-52.113,0 + + + + M 5.5 - 2012 Jan 22, SOUTH SANDWICH ISLANDS REGION + 5.5 + + -24.899,-56.655,0 + + + + M 5.5 - 2012 Jan 24, SOUTH SANDWICH ISLANDS REGION + 5.5 + + -27.723,-56.336,0 + + + + M 5.5 - 2012 Feb 2, VANUATU + 5.5 + + 167.179,-17.954,0 + + + + M 5.5 - 2012 Feb 4, OWEN FRACTURE ZONE REGION + 5.5 + + 57.561,13.046,0 + + + + M 5.5 - 2012 Feb 9, SOUTH SANDWICH ISLANDS REGION + 5.5 + + -25.816,-56.383,0 + + + + M 5.5 - 2012 Feb 11, MOLUCCA SEA + 5.5 + + 126.853,-0.978,0 + + + + M 5.5 - 2012 Feb 14, NEAR EAST COAST OF HONSHU, JAPAN + 5.5 + + 141.402,36.193,0 + + + + M 5.5 - 2012 Feb 23, SOUTHERN MID-ATLANTIC RIDGE + 5.5 + + -13.193,-17.699,0 + + + + M 5.5 - 2012 Feb 26, SOUTH OF FIJI ISLANDS + 5.5 + + -177.5,-24.477,0 + + + + M 5.5 - 2012 Mar 4, OFF COAST OF CENTRAL AMERICA + 5.5 + + -84.34,2.687,0 + + + + M 5.5 - 2012 Mar 10, ALASKA PENINSULA + 5.5 + + -157.567,55.146,0 + + + + M 5.5 - 2012 Mar 12, KURIL ISLANDS + 5.5 + + 147.609,45.239,0 + + + + M 5.5 - 2012 Mar 13, OFFSHORE CHIAPAS, MEXICO + 5.5 + + -93.026,14.959,0 + + + + M 5.5 - 2012 Mar 15, NEAR S. COAST OF HONSHU, JAPAN + 5.5 + + 139.279,35.802,0 + + + + M 5.5 - 2012 Mar 17, CARLSBERG RIDGE + 5.5 + + 63.404,3.823,0 + + + + M 5.5 - 2012 Mar 24, PACIFIC-ANTARCTIC RIDGE + 5.5 + + -136.157,-54.367,0 + + + + M 5.5 - 2012 Mar 26, NORTHERN EAST PACIFIC RISE + 5.5 + + -104.228,9.995,0 + + + + M 5.5 - 2012 Mar 28, PACIFIC-ANTARCTIC RIDGE + 5.5 + + -140.014,-57.331,0 + + + + M 5.5 - 2012 Apr 6, KEP. MENTAWAI REGION, INDONESIA + 5.5 + + 100.426,-3.345,0 + + + + M 5.5 - 2012 Apr 11, ANDREANOF ISLANDS, ALEUTIAN IS. + 5.5 + + -176.097,51.364,0 + + + + M 5.5 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.5 + + 90.854,1.495,0 + + + + M 5.5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.5 + + 92.092,1.19,0 + + + + M 5.5 - 2012 Apr 12, NEAR EAST COAST OF HONSHU, JAPAN + 5.5 + + 141.468,37.513,0 + + + + M 5.5 - 2012 Apr 18, BONIN ISLANDS, JAPAN REGION + 5.5 + + 138.772,28.689,0 + + + + M 5.5 - 2012 Apr 24, NICOBAR ISLANDS, INDIA REGION + 5.5 + + 93.949,8.868,0 + + + + M 5.5 - 2012 Apr 24, NEAR EAST COAST OF HONSHU, JAPAN + 5.5 + + 140.472,35.622,0 + + + + M 5.5 - 2012 Apr 30, BANDA SEA + 5.5 + + 128.511,-5.689,0 + + + + M 5.5 - 2012 May 1, OFF COAST OF BAJA CALIFORNIA SUR + 5.5 + + -108.44,21.951,0 + + + + M 5.5 - 2012 May 2, SOUTHEAST OF EASTER ISLAND + 5.5 + + -102.728,-35.883,0 + + + + M 5.5 - 2012 May 9, PHILIPPINE ISLANDS REGION + 5.5 + + 127.45,6.232,0 + + + + M 5.5 - 2012 May 9, NORTH OF ASCENSION ISLAND + 5.5 + + -13.6,-0.966,0 + + + + M 5.5 - 2012 May 29, NORTHERN ITALY + 5.5 + + 11.008,44.888,0 + + + + M 5.5 - 2012 Jun 1, ANTARCTICA + 5.5 + + -148.864,-77.08,0 + + + + M 5.5 - 2012 Jun 3, MID-INDIAN RIDGE + 5.5 + + 67.21,-16.235,0 + + + + M 5.5 - 2012 Jun 6, TAIWAN REGION + 5.5 + + 121.428,22.357,0 + + + + M 5.5 - 2012 Jun 12, SUNDA STRAIT, INDONESIA + 5.5 + + 105.494,-5.677,0 + + + + M 5.5 - 2012 Jun 13, SOUTH SANDWICH ISLANDS REGION + 5.5 + + -28.394,-55.796,0 + + + + M 5.5 - 2012 Jun 14, MOLUCCA SEA + 5.5 + + 126.828,1.293,0 + + + + M 5.5 - 2012 Jun 21, FIJI REGION + 5.5 + + -178.186,-17.963,0 + + + + M 5.5 - 2012 Jun 22, SOUTH OF KERMADEC ISLANDS + 5.5 + + -178.65,-32.935,0 + + + + M 5.5 - 2012 Jun 23, OFF W COAST OF NORTHERN SUMATRA + 5.5 + + 90.509,2.628,0 + + + + M 5.5 - 2012 Jun 24, SICHUAN-YUNNAN BORDER REG, CHINA + 5.5 + + 100.781,27.767,0 + + + + M 5.5 - 2012 Jun 27, TONGA + 5.5 + + -173.268,-15.222,0 + + + + M 5.5 - 2012 Jun 30, SOUTHEAST OF LOYALTY ISLANDS + 5.5 + + 170.992,-22.088,0 + + + + M 5.5 - 2012 Jul 3, SOLOMON ISLANDS + 5.5 + + 163.331,-10.82,0 + + + + M 5.5 - 2012 Jul 12, SERAM, INDONESIA + 5.5 + + 129.321,-2.885,0 + + + + M 5.5 - 2012 Jul 16, NEAR EAST COAST OF KAMCHATKA + 5.5 + + 161.234,55.777,0 + + + + M 5.5 - 2012 Jul 26, TONGA + 5.5 + + -174.491,-21.015,0 + + + + M 5.5 - 2012 Aug 2, KEP. TANIMBAR REGION, INDONESIA + 5.5 + + 131.121,-6.944,0 + + + + M 5.5 - 2012 Aug 3, FIJI REGION + 5.5 + + -176.916,-16.919,0 + + + + M 5.5 - 2012 Aug 12, PACIFIC-ANTARCTIC RIDGE + 5.5 + + -157.718,-63.004,0 + + + + M 5.5 - 2012 Aug 15, OFFSHORE EL SALVADOR + 5.5 + + -89.215,13.148,0 + + + + M 5.5 - 2012 Aug 17, NORTHERN EAST PACIFIC RISE + 5.5 + + -103.003,8.348,0 + + + + M 5.5 - 2012 Aug 24, BALLENY ISLANDS REGION + 5.5 + + 171.324,-63.581,0 + + + + M 5.5 - 2012 Aug 26, SOUTHERN CALIFORNIA + 5.5 + + -115.549,33.024,0 + + + + M 5.5 - 2012 Aug 27, OFFSHORE EL SALVADOR + 5.5 + + -88.612,12.297,0 + + + + M 5.5 - 2012 Aug 28, OFFSHORE EL SALVADOR + 5.5 + + -88.654,12.458,0 + + + + M 5.5 - 2012 Aug 29, NEAR EAST COAST OF HONSHU, JAPAN + 5.5 + + 141.814,38.425,0 + + + + M 5.5 - 2012 Sep 1, CHIAPAS, MEXICO + 5.5 + + -92.773,16.229,0 + + + + M 5.5 - 2012 Sep 7, SICHUAN-YUNNAN-GUIZHOU RG, CHINA + 5.5 + + 103.983,27.575,0 + + + + M 5.5 - 2012 Sep 9, RAT ISLANDS, ALEUTIAN ISLANDS + 5.5 + + 175.01,52.78,0 + + + + M 5.5 - 2012 Sep 12, CRETE, GREECE + 5.5 + + 24.11,34.783,0 + + + + M 5.5 - 2012 Sep 13, FIJI REGION + 5.5 + + 175.845,-18.627,0 + + + + M 5.5 - 2012 Sep 14, SOUTHERN MID-ATLANTIC RIDGE + 5.5 + + -16.01,-39.676,0 + + + + M 5.5 - 2012 Sep 17, NEW BRITAIN REGION, P.N.G. + 5.5 + + 150.119,-5.687,0 + + + + M 5.5 - 2012 Sep 22, TONGA + 5.5 + + -174.194,-20.896,0 + + + + M 5.5 - 2012 Sep 24, TONGA + 5.5 + + -174.292,-21.212,0 + + + + M 5.5 - 2012 Sep 29, OAXACA, MEXICO + 5.5 + + -98.393,16.304,0 + + + + M 5.5 - 2012 Oct 2, BALLENY ISLANDS REGION + 5.5 + + 177.83,-64.969,0 + + + + M 5.5 - 2012 Oct 5, OFF THE COAST OF GUATEMALA + 5.5 + + -91.504,13.028,0 + + + + M 5.5 - 2012 Oct 5, GULF OF CALIFORNIA + 5.5 + + -108.512,23.582,0 + + + + M 5.5 - 2012 Oct 11, VALPARAISO, CHILE + 5.5 + + -70.31,-32.865,0 + + + + M 5.5 - 2012 Oct 14, AZERBAIJAN + 5.5 + + 46.405,41.825,0 + + + + M 5.5 - 2012 Oct 14, CHIAPAS, MEXICO + 5.5 + + -92.289,14.684,0 + + + + M 5.5 - 2012 Oct 15, GUATEMALA + 5.5 + + -91.01,14.062,0 + + + + M 5.5 - 2012 Oct 19, KERMADEC ISLANDS REGION + 5.5 + + -176.8,-30.809,0 + + + + M 5.5 - 2012 Oct 21, ICELAND REGION + 5.5 + + -18.666,66.309,0 + + + + M 5.5 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION + 5.5 + + -132.082,52.294,0 + + + + M 5.5 - 2012 Oct 29, FLORES REGION, INDONESIA + 5.5 + + 123.465,-8.185,0 + + + + M 5.5 - 2012 Nov 2, NEAR EAST COAST OF KAMCHATKA + 5.5 + + 162.799,55.887,0 + + + + M 5.5 - 2012 Nov 6, SOUTHEAST OF EASTER ISLAND + 5.5 + + -104.8,-35.465,0 + + + + M 5.5 - 2012 Nov 11, MYANMAR + 5.5 + + 95.866,23.132,0 + + + + M 5.5 - 2012 Nov 15, NEAR ISLANDS, ALEUTIAN ISLANDS + 5.5 + + 173.351,52.496,0 + + + + M 5.5 - 2012 Nov 29, NEAR COAST OF NORTHERN PERU + 5.5 + + -81.07,-6.588,0 + + + + M 5.5 - 2012 Nov 29, OFFSHORE GUATEMALA + 5.5 + + -92.113,13.757,0 + + + + M 5.5 - 2012 Dec 6, PHILIPPINE ISLANDS REGION + 5.5 + + 126.638,10.974,0 + + + + M 5.5 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN + 5.5 + + 143.607,37.828,0 + + + + M 5.5 - 2012 Dec 13, EAST OF SEVERNAYA ZEMLYA + 5.5 + + 121.383,80.804,0 + + + + M 5.5 - 2012 Dec 22, MYANMAR + 5.5 + + 94.782,22.443,0 + + + + M 5.5 - 2012 Dec 26, PACIFIC-ANTARCTIC RIDGE + 5.5 + + -144.483,-56.186,0 + + + + M 5.5 - 2012 Dec 28, SULAWESI, INDONESIA + 5.5 + + 122.918,-0.145,0 + + + + M 5.5 - 2012 Dec 29, HINDU KUSH REGION, AFGHANISTAN + 5.5 + + 70.599,35.711,0 + + + + M 5.4 - 2012 Jan 7, HALMAHERA, INDONESIA + 5.4 + + 127.475,1.705,0 + + + + M 5.4 - 2012 Jan 7, EASTERN NEW GUINEA REG., P.N.G. + 5.4 + + 145.214,-5.081,0 + + + + M 5.4 - 2012 Jan 17, CENTRAL EAST PACIFIC RISE + 5.4 + + -104.146,-4.045,0 + + + + M 5.4 - 2012 Jan 20, KEPULAUAN SANGIHE, INDONESIA + 5.4 + + 125.307,4.795,0 + + + + M 5.4 - 2012 Jan 26, SCOTIA SEA + 5.4 + + -51.411,-60.582,0 + + + + M 5.4 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND + 5.4 + + -177.172,-29.519,0 + + + + M 5.4 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND + 5.4 + + -177.259,-29.574,0 + + + + M 5.4 - 2012 Feb 1, SOUTHERN SUMATRA, INDONESIA + 5.4 + + 102.203,-3.676,0 + + + + M 5.4 - 2012 Feb 3, VANUATU + 5.4 + + 167.232,-17.386,0 + + + + M 5.4 - 2012 Feb 4, CENTRAL MONGOLIA + 5.4 + + 105.61,42.291,0 + + + + M 5.4 - 2012 Feb 4, SAMAR, PHILIPPINES + 5.4 + + 125.719,11.937,0 + + + + M 5.4 - 2012 Feb 8, NEAR WEST COAST OF HONSHU, JAPAN + 5.4 + + 137.999,37.858,0 + + + + M 5.4 - 2012 Feb 9, BOUGAINVILLE REGION, P.N.G. + 5.4 + + 155.72,-6.987,0 + + + + M 5.4 - 2012 Feb 18, TONGA + 5.4 + + -173.521,-20.957,0 + + + + M 5.4 - 2012 Feb 22, KEPULAUAN KAI, INDONESIA + 5.4 + + 133.565,-5.173,0 + + + + M 5.4 - 2012 Feb 26, TARAPACA, CHILE + 5.4 + + -69.29,-18.811,0 + + + + M 5.4 - 2012 Feb 27, KURIL ISLANDS + 5.4 + + 152.74,46.922,0 + + + + M 5.4 - 2012 Feb 27, RYUKYU ISLANDS, JAPAN + 5.4 + + 127.096,25.557,0 + + + + M 5.4 - 2012 Feb 28, OFF EAST COAST OF HONSHU, JAPAN + 5.4 + + 144.137,37.203,0 + + + + M 5.4 - 2012 Feb 29, VANUATU + 5.4 + + 168.038,-17.647,0 + + + + M 5.4 - 2012 Feb 29, NEAR EAST COAST OF HONSHU, JAPAN + 5.4 + + 140.448,36.427,0 + + + + M 5.4 - 2012 Mar 2, EASTERN NEW GUINEA REG., P.N.G. + 5.4 + + 146.265,-8.048,0 + + + + M 5.4 - 2012 Mar 5, HALMAHERA, INDONESIA + 5.4 + + 128.626,1.937,0 + + + + M 5.4 - 2012 Mar 6, NICOBAR ISLANDS, INDIA REGION + 5.4 + + 93.691,8.571,0 + + + + M 5.4 - 2012 Mar 7, SOUTH SANDWICH ISLANDS REGION + 5.4 + + -25.306,-57.941,0 + + + + M 5.4 - 2012 Mar 9, NEAR EAST COAST OF HONSHU, JAPAN + 5.4 + + 140.392,36.719,0 + + + + M 5.4 - 2012 Mar 14, OFF EAST COAST OF HONSHU, JAPAN + 5.4 + + 144.848,40.905,0 + + + + M 5.4 - 2012 Mar 19, MOLUCCA SEA + 5.4 + + 125.075,0.353,0 + + + + M 5.4 - 2012 Mar 30, OFFSHORE CHIAPAS, MEXICO + 5.4 + + -93.063,14.381,0 + + + + M 5.4 - 2012 Apr 1, TRISTAN DA CUNHA REGION + 5.4 + + -14.877,-35.191,0 + + + + M 5.4 - 2012 Apr 2, TONGA + 5.4 + + -173.514,-16.935,0 + + + + M 5.4 - 2012 Apr 3, NEAR COAST OF NORTHERN PERU + 5.4 + + -80.583,-5.18,0 + + + + M 5.4 - 2012 Apr 3, KEPULAUAN KAI, INDONESIA + 5.4 + + 133.876,-5.654,0 + + + + M 5.4 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.4 + + 91.87,1.167,0 + + + + M 5.4 - 2012 Apr 11, SOUTH SANDWICH ISLANDS REGION + 5.4 + + -27.979,-56.871,0 + + + + M 5.4 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.4 + + 92.855,0.734,0 + + + + M 5.4 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.4 + + 92.694,2.475,0 + + + + M 5.4 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.4 + + 89.556,2.865,0 + + + + M 5.4 - 2012 Apr 14, OFF W COAST OF NORTHERN SUMATRA + 5.4 + + 92.141,0.244,0 + + + + M 5.4 - 2012 Apr 21, CENTRAL PERU + 5.4 + + -71.481,-14.82,0 + + + + M 5.4 - 2012 Apr 22, WEST OF MACQUARIE ISLAND + 5.4 + + 140.329,-52.753,0 + + + + M 5.4 - 2012 May 1, VOLCANO ISLANDS, JAPAN REGION + 5.4 + + 141.207,25.404,0 + + + + M 5.4 - 2012 May 3, OFF COAST OF BAJA CALIFORNIA SUR + 5.4 + + -108.779,21.21,0 + + + + M 5.4 - 2012 May 11, ASSAM, INDIA + 5.4 + + 92.889,26.175,0 + + + + M 5.4 - 2012 May 11, CYPRUS REGION + 5.4 + + 34.142,34.304,0 + + + + M 5.4 - 2012 May 24, NEUQUEN, ARGENTINA + 5.4 + + -70.467,-36.912,0 + + + + M 5.4 - 2012 May 30, EASTERN KAZAKHSTAN + 5.4 + + 78.745,43.384,0 + + + + M 5.4 - 2012 Jun 9, KURIL ISLANDS + 5.4 + + 154.852,48.851,0 + + + + M 5.4 - 2012 Jun 11, HINDU KUSH REGION, AFGHANISTAN + 5.4 + + 69.401,36.039,0 + + + + M 5.4 - 2012 Jun 15, BISMARCK SEA + 5.4 + + 146.309,-3.381,0 + + + + M 5.4 - 2012 Jun 20, MINAHASA, SULAWESI, INDONESIA + 5.4 + + 123.426,0.102,0 + + + + M 5.4 - 2012 Jun 20, SOLOMON ISLANDS + 5.4 + + 156.998,-8.7,0 + + + + M 5.4 - 2012 Jun 24, JUJUY, ARGENTINA + 5.4 + + -66.702,-22.445,0 + + + + M 5.4 - 2012 Jun 26, GUATEMALA + 5.4 + + -92.049,15.378,0 + + + + M 5.4 - 2012 Jul 1, ATACAMA, CHILE + 5.4 + + -70.878,-28.561,0 + + + + M 5.4 - 2012 Jul 2, SOUTH OF KERMADEC ISLANDS + 5.4 + + -179.342,-33.385,0 + + + + M 5.4 - 2012 Jul 7, SOUTH SANDWICH ISLANDS REGION + 5.4 + + -27.414,-56.203,0 + + + + M 5.4 - 2012 Jul 11, TONGA + 5.4 + + -174.678,-16.103,0 + + + + M 5.4 - 2012 Jul 11, NEAR COAST OF CENTRAL PERU + 5.4 + + -75.288,-15.276,0 + + + + M 5.4 - 2012 Jul 14, KURIL ISLANDS + 5.4 + + 151.316,45.516,0 + + + + M 5.4 - 2012 Jul 14, WESTERN INDIAN-ANTARCTIC RIDGE + 5.4 + + 124.64,-49.044,0 + + + + M 5.4 - 2012 Jul 19, SOUTH SANDWICH ISLANDS REGION + 5.4 + + -27.809,-56.038,0 + + + + M 5.4 - 2012 Jul 20, FLORES REGION, INDONESIA + 5.4 + + 123.682,-8.006,0 + + + + M 5.4 - 2012 Jul 22, NEW IRELAND REGION, P.N.G. + 5.4 + + 153.375,-4.169,0 + + + + M 5.4 - 2012 Jul 27, MARIANA ISLANDS REGION + 5.4 + + 142.985,21.671,0 + + + + M 5.4 - 2012 Jul 28, CENTRAL MID-ATLANTIC RIDGE + 5.4 + + -32.667,4.548,0 + + + + M 5.4 - 2012 Aug 1, NEAR N COAST OF NEW GUINEA, PNG. + 5.4 + + 144.639,-4.39,0 + + + + M 5.4 - 2012 Aug 3, BOUGAINVILLE REGION, P.N.G. + 5.4 + + 155.718,-6.939,0 + + + + M 5.4 - 2012 Aug 3, SANTA CRUZ ISLANDS + 5.4 + + 165.038,-11.478,0 + + + + M 5.4 - 2012 Aug 6, HALMAHERA, INDONESIA + 5.4 + + 128.429,2.702,0 + + + + M 5.4 - 2012 Aug 8, NORTHEAST OF TAIWAN + 5.4 + + 124.921,25.873,0 + + + + M 5.4 - 2012 Aug 9, SOUTH SANDWICH ISLANDS REGION + 5.4 + + -27.988,-59.762,0 + + + + M 5.4 - 2012 Aug 13, PAKISTAN + 5.4 + + 73.663,34.849,0 + + + + M 5.4 - 2012 Aug 26, SOUTHERN CALIFORNIA + 5.4 + + -115.546,33.019,0 + + + + M 5.4 - 2012 Aug 30, WESTERN INDIAN-ANTARCTIC RIDGE + 5.4 + + 114.106,-50.211,0 + + + + M 5.4 - 2012 Aug 31, PHILIPPINE ISLANDS REGION + 5.4 + + 126.887,10.485,0 + + + + M 5.4 - 2012 Sep 1, PHILIPPINE ISLANDS REGION + 5.4 + + 126.683,10.449,0 + + + + M 5.4 - 2012 Sep 1, PHILIPPINE ISLANDS REGION + 5.4 + + 126.812,10.528,0 + + + + M 5.4 - 2012 Sep 2, PHILIPPINE ISLANDS REGION + 5.4 + + 126.652,11.308,0 + + + + M 5.4 - 2012 Sep 4, PHILIPPINE ISLANDS REGION + 5.4 + + 126.77,10.46,0 + + + + M 5.4 - 2012 Sep 7, SOUTH OF JAVA, INDONESIA + 5.4 + + 113.833,-10.73,0 + + + + M 5.4 - 2012 Sep 12, NEW BRITAIN REGION, P.N.G. + 5.4 + + 152.098,-5.022,0 + + + + M 5.4 - 2012 Sep 12, SOUTH INDIAN OCEAN + 5.4 + + 82.926,-23.996,0 + + + + M 5.4 - 2012 Sep 13, PHILIPPINE ISLANDS REGION + 5.4 + + 126.938,10.238,0 + + + + M 5.4 - 2012 Sep 13, SOUTH OF JAVA, INDONESIA + 5.4 + + 113.755,-10.768,0 + + + + M 5.4 - 2012 Sep 21, TARAPACA, CHILE + 5.4 + + -68.961,-19.569,0 + + + + M 5.4 - 2012 Sep 22, OAXACA, MEXICO + 5.4 + + -98.281,16.262,0 + + + + M 5.4 - 2012 Sep 25, TONGA + 5.4 + + -174.313,-21.192,0 + + + + M 5.4 - 2012 Sep 30, EAST OF THE VOLCANO ISLANDS + 5.4 + + 146.043,23,0 + + + + M 5.4 - 2012 Oct 3, MINDANAO, PHILIPPINES + 5.4 + + 126.95,5.858,0 + + + + M 5.4 - 2012 Oct 4, NORTHERN MID-ATLANTIC RIDGE + 5.4 + + -46.498,17.443,0 + + + + M 5.4 - 2012 Oct 5, NORTHERN MID-ATLANTIC RIDGE + 5.4 + + -46.453,17.501,0 + + + + M 5.4 - 2012 Oct 7, AZERBAIJAN + 5.4 + + 48.437,40.747,0 + + + + M 5.4 - 2012 Oct 10, SOUTH SANDWICH ISLANDS REGION + 5.4 + + -26.573,-60.326,0 + + + + M 5.4 - 2012 Oct 14, OFF EAST COAST OF HONSHU, JAPAN + 5.4 + + 144.333,38.215,0 + + + + M 5.4 - 2012 Oct 16, IZU ISLANDS, JAPAN REGION + 5.4 + + 140.222,31.277,0 + + + + M 5.4 - 2012 Oct 17, TONGA + 5.4 + + -174.187,-19.042,0 + + + + M 5.4 - 2012 Oct 21, CENTRAL CALIFORNIA + 5.4 + + -120.856,36.311,0 + + + + M 5.4 - 2012 Oct 21, OFFSHORE EL SALVADOR + 5.4 + + -88.337,12.562,0 + + + + M 5.4 - 2012 Oct 24, CAYMAN ISLANDS REGION + 5.4 + + -81.692,17.785,0 + + + + M 5.4 - 2012 Oct 25, NORTHERN PERU + 5.4 + + -76.074,-5.919,0 + + + + M 5.4 - 2012 Oct 27, NEW BRITAIN REGION, P.N.G. + 5.4 + + 151.532,-6.141,0 + + + + M 5.4 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION + 5.4 + + -132.667,52.834,0 + + + + M 5.4 - 2012 Oct 29, NIAS REGION, INDONESIA + 5.4 + + 98.381,0.88,0 + + + + M 5.4 - 2012 Nov 1, MINAHASA, SULAWESI, INDONESIA + 5.4 + + 122.105,1.229,0 + + + + M 5.4 - 2012 Nov 4, SOUTHERN PERU + 5.4 + + -71.878,-15.874,0 + + + + M 5.4 - 2012 Nov 7, NORTHWESTERN IRAN + 5.4 + + 46.62,38.418,0 + + + + M 5.4 - 2012 Nov 17, SOUTHEAST OF EASTER ISLAND + 5.4 + + -95.075,-37.209,0 + + + + M 5.4 - 2012 Nov 17, SOUTHEAST OF EASTER ISLAND + 5.4 + + -95.142,-37.182,0 + + + + M 5.4 - 2012 Nov 20, OFFSHORE O'HIGGINS, CHILE + 5.4 + + -72.254,-33.921,0 + + + + M 5.4 - 2012 Nov 21, SOUTH OF SUMBAWA, INDONESIA + 5.4 + + 117.931,-11.359,0 + + + + M 5.4 - 2012 Nov 26, CENTRAL EAST PACIFIC RISE + 5.4 + + -108.329,-9.098,0 + + + + M 5.4 - 2012 Nov 27, ALAMAGAN REG, N. MARIANA ISLANDS + 5.4 + + 145.763,17.684,0 + + + + M 5.4 - 2012 Dec 3, OFFSHORE GUATEMALA + 5.4 + + -92.372,14.16,0 + + + + M 5.4 - 2012 Dec 12, FIJI REGION + 5.4 + + -176.278,-19.556,0 + + + + M 5.4 - 2012 Dec 20, MOLUCCA SEA + 5.4 + + 126.217,0.562,0 + + + + M 5.4 - 2012 Dec 25, MOLUCCA SEA + 5.4 + + 125.464,1.109,0 + + + + M 5.4 - 2012 Dec 27, TONGA + 5.4 + + -173.562,-18.302,0 + + + + M 5.4 - 2012 Dec 29, NEAR EAST COAST OF HONSHU, JAPAN + 5.4 + + 142.024,38.738,0 + + + + M 5.3 - 2012 Jan 1, SANTA CRUZ ISLANDS + 5.3 + + 166.218,-11.366,0 + + + + M 5.3 - 2012 Jan 5, OFF COAST OF AISEN, CHILE + 5.3 + + -76.472,-45.992,0 + + + + M 5.3 - 2012 Jan 8, VANUATU + 5.3 + + 167.887,-17.425,0 + + + + M 5.3 - 2012 Jan 12, SOUTH OF AFRICA + 5.3 + + 28.196,-52.042,0 + + + + M 5.3 - 2012 Jan 12, TONGA + 5.3 + + -173.59,-16.753,0 + + + + M 5.3 - 2012 Jan 16, MOLUCCA SEA + 5.3 + + 125.475,-0.228,0 + + + + M 5.3 - 2012 Jan 17, OFFSHORE COQUIMBO, CHILE + 5.3 + + -71.615,-31.728,0 + + + + M 5.3 - 2012 Jan 18, SANTA CRUZ ISLANDS + 5.3 + + 165.536,-11.018,0 + + + + M 5.3 - 2012 Jan 18, SANTA CRUZ ISLANDS + 5.3 + + 165.464,-10.999,0 + + + + M 5.3 - 2012 Jan 26, MARIANA ISLANDS REGION + 5.3 + + 142.852,21.645,0 + + + + M 5.3 - 2012 Jan 27, DODECANESE ISLANDS, GREECE + 5.3 + + 25.064,36.044,0 + + + + M 5.3 - 2012 Jan 28, CATANDUANES, PHILIPPINES + 5.3 + + 124.586,13.386,0 + + + + M 5.3 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND + 5.3 + + -177.139,-29.59,0 + + + + M 5.3 - 2012 Jan 28, PAPUA, INDONESIA + 5.3 + + 140.788,-4.081,0 + + + + M 5.3 - 2012 Jan 29, NORTHERN MID-ATLANTIC RIDGE + 5.3 + + -46.529,16.488,0 + + + + M 5.3 - 2012 Feb 1, SANTA CRUZ ISLANDS + 5.3 + + 165.901,-10.802,0 + + + + M 5.3 - 2012 Feb 1, SAMAR, PHILIPPINES + 5.3 + + 125.557,11.6,0 + + + + M 5.3 - 2012 Feb 1, EASTER ISLAND REGION + 5.3 + + -111.525,-31.585,0 + + + + M 5.3 - 2012 Feb 2, VANUATU + 5.3 + + 167.176,-17.455,0 + + + + M 5.3 - 2012 Feb 6, NEGROS- CEBU REG, PHILIPPINES + 5.3 + + 123.108,9.85,0 + + + + M 5.3 - 2012 Feb 7, NEGROS- CEBU REG, PHILIPPINES + 5.3 + + 123.42,10.194,0 + + + + M 5.3 - 2012 Feb 8, NEGROS- CEBU REG, PHILIPPINES + 5.3 + + 123.43,10.249,0 + + + + M 5.3 - 2012 Feb 8, KERMADEC ISLANDS, NEW ZEALAND + 5.3 + + -177.409,-29.455,0 + + + + M 5.3 - 2012 Feb 14, CENTRAL MID-ATLANTIC RIDGE + 5.3 + + -29.228,0.859,0 + + + + M 5.3 - 2012 Feb 17, SOUTHEAST INDIAN RIDGE + 5.3 + + 84.932,-42.024,0 + + + + M 5.3 - 2012 Feb 21, BERING STRAIT + 5.3 + + -167.057,67.744,0 + + + + M 5.3 - 2012 Feb 22, OFF W COAST OF NORTHERN SUMATRA + 5.3 + + 94.4,4.99,0 + + + + M 5.3 - 2012 Feb 24, NORTHERN COLOMBIA + 5.3 + + -72.952,6.702,0 + + + + M 5.3 - 2012 Feb 24, MOLUCCA SEA + 5.3 + + 126.34,1.516,0 + + + + M 5.3 - 2012 Mar 2, NEAR EAST COAST OF HONSHU, JAPAN + 5.3 + + 141.043,35.16,0 + + + + M 5.3 - 2012 Mar 3, COQUIMBO, CHILE + 5.3 + + -71.129,-30.348,0 + + + + M 5.3 - 2012 Mar 6, STATE OF YAP, MICRONESIA + 5.3 + + 140.306,10.527,0 + + + + M 5.3 - 2012 Mar 8, MINDORO, PHILIPPINES + 5.3 + + 120.519,13.57,0 + + + + M 5.3 - 2012 Mar 10, TARAPACA, CHILE + 5.3 + + -69.25,-19.738,0 + + + + M 5.3 - 2012 Mar 11, CARLSBERG RIDGE + 5.3 + + 65.125,3.077,0 + + + + M 5.3 - 2012 Mar 11, SOUTHERN MID-ATLANTIC RIDGE + 5.3 + + -16.696,-41.153,0 + + + + M 5.3 - 2012 Mar 17, CARLSBERG RIDGE + 5.3 + + 63.465,3.758,0 + + + + M 5.3 - 2012 Mar 19, NEW GUINEA, PAPUA NEW GUINEA + 5.3 + + 143.888,-4.36,0 + + + + M 5.3 - 2012 Mar 20, OAXACA, MEXICO + 5.3 + + -98.172,16.289,0 + + + + M 5.3 - 2012 Mar 23, SOUTH AUSTRALIA + 5.3 + + 131.955,-26.163,0 + + + + M 5.3 - 2012 Mar 26, CHUKOTKA, RUSSIA + 5.3 + + -174.648,66.363,0 + + + + M 5.3 - 2012 Mar 26, EAST OF NORTH ISLAND, N.Z. + 5.3 + + -179.075,-35.689,0 + + + + M 5.3 - 2012 Mar 29, SOUTHWEST INDIAN RIDGE + 5.3 + + 44.605,-40.957,0 + + + + M 5.3 - 2012 Apr 1, GUERRERO, MEXICO + 5.3 + + -98.54,16.46,0 + + + + M 5.3 - 2012 Apr 3, NEW IRELAND REGION, P.N.G. + 5.3 + + 153.442,-4.397,0 + + + + M 5.3 - 2012 Apr 4, NEW IRELAND REGION, P.N.G. + 5.3 + + 152.173,-3.824,0 + + + + M 5.3 - 2012 Apr 7, NEW BRITAIN REGION, P.N.G. + 5.3 + + 149.555,-6.746,0 + + + + M 5.3 - 2012 Apr 8, TAIWAN REGION + 5.3 + + 122.35,24,0 + + + + M 5.3 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.3 + + 91.785,1.636,0 + + + + M 5.3 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.3 + + 90.299,2.521,0 + + + + M 5.3 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.3 + + 90.351,2.483,0 + + + + M 5.3 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.3 + + 92.482,2.822,0 + + + + M 5.3 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.3 + + 91.958,1.084,0 + + + + M 5.3 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.3 + + 93.584,2.164,0 + + + + M 5.3 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.3 + + 90.833,1.477,0 + + + + M 5.3 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.3 + + 91.9,1.276,0 + + + + M 5.3 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA + 5.3 + + 92.746,3.753,0 + + + + M 5.3 - 2012 Apr 14, SUNDA STRAIT, INDONESIA + 5.3 + + 105.444,-6.777,0 + + + + M 5.3 - 2012 Apr 14, SOUTH SANDWICH ISLANDS REGION + 5.3 + + -25.209,-56.845,0 + + + + M 5.3 - 2012 Apr 16, GULF OF CALIFORNIA + 5.3 + + -108.793,23.952,0 + + + + M 5.3 - 2012 Apr 16, OFF W COAST OF NORTHERN SUMATRA + 5.3 + + 92.417,0.798,0 + + + + M 5.3 - 2012 Apr 16, SULAWESI, INDONESIA + 5.3 + + 121.939,-2.58,0 + + + + M 5.3 - 2012 Apr 18, NEAR N COAST OF PAPUA, INDONESIA + 5.3 + + 131.909,-0.501,0 + + + + M 5.3 - 2012 Apr 19, MOLUCCA SEA + 5.3 + + 126.434,1.199,0 + + + + M 5.3 - 2012 Apr 25, NICOBAR ISLANDS, INDIA REGION + 5.3 + + 93.906,8.945,0 + + + + M 5.3 - 2012 Apr 28, KEP. MENTAWAI REGION, INDONESIA + 5.3 + + 100.439,-3.338,0 + + + + M 5.3 - 2012 May 3, NEW BRITAIN REGION, P.N.G. + 5.3 + + 152.085,-5.466,0 + + + + M 5.3 - 2012 May 7, AZERBAIJAN + 5.3 + + 46.719,41.553,0 + + + + M 5.3 - 2012 May 12, MOLUCCA SEA + 5.3 + + 126.108,2.241,0 + + + + M 5.3 - 2012 May 13, SOUTH INDIAN OCEAN + 5.3 + + 89.416,-3.347,0 + + + + M 5.3 - 2012 May 13, SULAWESI, INDONESIA + 5.3 + + 122.996,-0.115,0 + + + + M 5.3 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN + 5.3 + + 143.175,39.619,0 + + + + M 5.3 - 2012 May 23, KURIL ISLANDS + 5.3 + + 152.557,46.66,0 + + + + M 5.3 - 2012 Jun 1, SOUTHERN XINJIANG, CHINA + 5.3 + + 75.194,39.803,0 + + + + M 5.3 - 2012 Jun 3, SOUTH SANDWICH ISLANDS REGION + 5.3 + + -25.57,-60.562,0 + + + + M 5.3 - 2012 Jun 5, NORTHERN SUMATRA, INDONESIA + 5.3 + + 94.672,5.482,0 + + + + M 5.3 - 2012 Jun 14, TURKEY-SYRIA-IRAQ BORDER REGION + 5.3 + + 42.325,37.294,0 + + + + M 5.3 - 2012 Jun 17, TONGA + 5.3 + + -174.311,-20.588,0 + + + + M 5.3 - 2012 Jun 18, MENDOZA, ARGENTINA + 5.3 + + -68.496,-33.009,0 + + + + M 5.3 - 2012 Jun 20, NEAR N COAST OF PAPUA, INDONESIA + 5.3 + + 133.281,-0.727,0 + + + + M 5.3 - 2012 Jun 28, VANUATU + 5.3 + + 166.625,-13.504,0 + + + + M 5.3 - 2012 Jul 3, NEAR S. COAST OF HONSHU, JAPAN + 5.3 + + 139.744,34.934,0 + + + + M 5.3 - 2012 Jul 5, MINDANAO, PHILIPPINES + 5.3 + + 126.554,5.126,0 + + + + M 5.3 - 2012 Jul 7, NORTH ISLAND OF NEW ZEALAND + 5.3 + + 175.807,-39.068,0 + + + + M 5.3 - 2012 Jul 9, SULAWESI, INDONESIA + 5.3 + + 122.791,-0.171,0 + + + + M 5.3 - 2012 Jul 11, SOLOMON ISLANDS + 5.3 + + 156.275,-8.442,0 + + + + M 5.3 - 2012 Jul 18, SOUTHERN SUMATRA, INDONESIA + 5.3 + + 102.794,-4.381,0 + + + + M 5.3 - 2012 Jul 18, PHILIPPINE ISLANDS REGION + 5.3 + + 126.073,11.281,0 + + + + M 5.3 - 2012 Jul 20, KURIL ISLANDS + 5.3 + + 155.599,49.506,0 + + + + M 5.3 - 2012 Jul 21, BANDA SEA + 5.3 + + 129.266,-5.387,0 + + + + M 5.3 - 2012 Jul 22, TONGA + 5.3 + + -175.029,-21.804,0 + + + + M 5.3 - 2012 Jul 29, NEAR EAST COAST OF HONSHU, JAPAN + 5.3 + + 142.323,39.075,0 + + + + M 5.3 - 2012 Aug 4, NORTHERN SUMATRA, INDONESIA + 5.3 + + 96.296,4.857,0 + + + + M 5.3 - 2012 Aug 6, RYUKYU ISLANDS, JAPAN + 5.3 + + 130.603,29.487,0 + + + + M 5.3 - 2012 Aug 9, LOMBOK REGION, INDONESIA + 5.3 + + 116.363,-8.718,0 + + + + M 5.3 - 2012 Aug 14, BONIN ISLANDS, JAPAN REGION + 5.3 + + 142.53,28.718,0 + + + + M 5.3 - 2012 Aug 15, NORTHWESTERN IRAN + 5.3 + + 46.672,38.41,0 + + + + M 5.3 - 2012 Aug 22, EASTERN NEW GUINEA REG., P.N.G. + 5.3 + + 147.25,-6.047,0 + + + + M 5.3 - 2012 Aug 27, KEPULAUAN TALAUD, INDONESIA + 5.3 + + 126.698,3.622,0 + + + + M 5.3 - 2012 Aug 28, OFF COAST OF CENTRAL AMERICA + 5.3 + + -88.706,11.978,0 + + + + M 5.3 - 2012 Aug 28, OFF W COAST OF NORTHERN SUMATRA + 5.3 + + 92.986,4.409,0 + + + + M 5.3 - 2012 Aug 31, CENTRAL MID-ATLANTIC RIDGE + 5.3 + + -32.155,3.807,0 + + + + M 5.3 - 2012 Aug 31, PHILIPPINE ISLANDS REGION + 5.3 + + 126.926,10.562,0 + + + + M 5.3 - 2012 Aug 31, GULF OF ADEN + 5.3 + + 50.47,13.239,0 + + + + M 5.3 - 2012 Sep 1, PHILIPPINE ISLANDS REGION + 5.3 + + 126.45,10.229,0 + + + + M 5.3 - 2012 Sep 4, PHILIPPINE ISLANDS REGION + 5.3 + + 126.888,10.423,0 + + + + M 5.3 - 2012 Sep 4, PHILIPPINE ISLANDS REGION + 5.3 + + 126.778,10.666,0 + + + + M 5.3 - 2012 Sep 4, PHILIPPINE ISLANDS REGION + 5.3 + + 126.827,10.634,0 + + + + M 5.3 - 2012 Sep 4, PHILIPPINE ISLANDS REGION + 5.3 + + 126.896,10.501,0 + + + + M 5.3 - 2012 Sep 5, PHILIPPINE ISLANDS REGION + 5.3 + + 126.711,11.596,0 + + + + M 5.3 - 2012 Sep 6, KEPULAUAN TALAUD, INDONESIA + 5.3 + + 126.879,4.499,0 + + + + M 5.3 - 2012 Sep 7, SICHUAN-YUNNAN-GUIZHOU RG, CHINA + 5.3 + + 104.007,27.572,0 + + + + M 5.3 - 2012 Sep 7, HALMAHERA, INDONESIA + 5.3 + + 128.238,2.461,0 + + + + M 5.3 - 2012 Sep 11, SOUTH OF JAVA, INDONESIA + 5.3 + + 113.832,-10.705,0 + + + + M 5.3 - 2012 Sep 15, SAMAR, PHILIPPINES + 5.3 + + 125.468,12.556,0 + + + + M 5.3 - 2012 Sep 15, SOUTH OF JAVA, INDONESIA + 5.3 + + 113.883,-10.738,0 + + + + M 5.3 - 2012 Sep 16, PHILIPPINE ISLANDS REGION + 5.3 + + 126.723,10.624,0 + + + + M 5.3 - 2012 Sep 20, KEPULAUAN BATU, INDONESIA + 5.3 + + 98.817,-0.065,0 + + + + M 5.3 - 2012 Sep 20, MINDANAO, PHILIPPINES + 5.3 + + 126.381,5.998,0 + + + + M 5.3 - 2012 Sep 23, FIJI REGION + 5.3 + + 175.174,-16.93,0 + + + + M 5.3 - 2012 Sep 23, SOUTH OF MARIANA ISLANDS + 5.3 + + 143.25,11.705,0 + + + + M 5.3 - 2012 Sep 26, ANTOFAGASTA, CHILE + 5.3 + + -68.441,-22.262,0 + + + + M 5.3 - 2012 Sep 29, NICOBAR ISLANDS, INDIA REGION + 5.3 + + 92.78,6.107,0 + + + + M 5.3 - 2012 Oct 2, MINDANAO, PHILIPPINES + 5.3 + + 123.287,8.297,0 + + + + M 5.3 - 2012 Oct 2, SOUTHERN SUMATRA, INDONESIA + 5.3 + + 101.919,-2.917,0 + + + + M 5.3 - 2012 Oct 3, NEW BRITAIN REGION, P.N.G. + 5.3 + + 152.718,-6.299,0 + + + + M 5.3 - 2012 Oct 7, NEW BRITAIN REGION, P.N.G. + 5.3 + + 151.794,-5.53,0 + + + + M 5.3 - 2012 Oct 10, COSTA RICA + 5.3 + + -85.476,10.1,0 + + + + M 5.3 - 2012 Oct 11, OFF W COAST OF NORTHERN SUMATRA + 5.3 + + 92.585,1.471,0 + + + + M 5.3 - 2012 Oct 13, NEAR N COAST OF NEW GUINEA, PNG. + 5.3 + + 142.326,-2.538,0 + + + + M 5.3 - 2012 Oct 15, VANUATU + 5.3 + + 165.506,-13.114,0 + + + + M 5.3 - 2012 Oct 16, KYUSHU, JAPAN + 5.3 + + 130.199,31.216,0 + + + + M 5.3 - 2012 Oct 21, ICELAND REGION + 5.3 + + -18.569,66.37,0 + + + + M 5.3 - 2012 Oct 25, FIJI REGION + 5.3 + + -178.259,-19.857,0 + + + + M 5.3 - 2012 Oct 25, SOUTHERN ITALY + 5.3 + + 16.01,39.88,0 + + + + M 5.3 - 2012 Oct 28, PHILIPPINE ISLANDS REGION + 5.3 + + 126.635,10.431,0 + + + + M 5.3 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION + 5.3 + + -132.374,52.472,0 + + + + M 5.3 - 2012 Nov 2, FLORES SEA + 5.3 + + 121.64,-7.788,0 + + + + M 5.3 - 2012 Nov 3, PHILIPPINE ISLANDS REGION + 5.3 + + 126.93,10.515,0 + + + + M 5.3 - 2012 Nov 4, KEPULAUAN SANGIHE, INDONESIA + 5.3 + + 125.076,4.6,0 + + + + M 5.3 - 2012 Nov 6, BISMARCK SEA + 5.3 + + 148.846,-3.836,0 + + + + M 5.3 - 2012 Nov 9, SOUTH OF AUSTRALIA + 5.3 + + 124.723,-42.732,0 + + + + M 5.3 - 2012 Nov 9, BALI SEA + 5.3 + + 117.614,-7.947,0 + + + + M 5.3 - 2012 Nov 11, NEW BRITAIN REGION, P.N.G. + 5.3 + + 151.688,-5.45,0 + + + + M 5.3 - 2012 Nov 16, NEAR EAST COAST OF HONSHU, JAPAN + 5.3 + + 140.988,35.217,0 + + + + M 5.3 - 2012 Nov 19, NEW BRITAIN REGION, P.N.G. + 5.3 + + 151.655,-5.785,0 + + + + M 5.3 - 2012 Nov 19, PAKISTAN + 5.3 + + 67.584,30.538,0 + + + + M 5.3 - 2012 Nov 22, KOMANDORSKIYE OSTROVA REGION + 5.3 + + 168.316,54.099,0 + + + + M 5.3 - 2012 Nov 23, NEAR EAST COAST OF HONSHU, JAPAN + 5.3 + + 141.694,38.212,0 + + + + M 5.3 - 2012 Nov 29, FIJI REGION + 5.3 + + -177.157,-20.721,0 + + + + M 5.3 - 2012 Dec 1, ALASKA PENINSULA + 5.3 + + -154.121,58.422,0 + + + + M 5.3 - 2012 Dec 6, BOUVET ISLAND REGION + 5.3 + + -1.917,-54.179,0 + + + + M 5.3 - 2012 Dec 7, SOUTHERN XINJIANG, CHINA + 5.3 + + 88.098,38.745,0 + + + + M 5.3 - 2012 Dec 13, KERMADEC ISLANDS, NEW ZEALAND + 5.3 + + -178.39,-30.911,0 + + + + M 5.3 - 2012 Dec 13, OFFSHORE EL SALVADOR + 5.3 + + -89.967,13.071,0 + + + + M 5.3 - 2012 Dec 24, NEAR EAST COAST OF KAMCHATKA + 5.3 + + 162.034,54.907,0 + + + + M 5.3 - 2012 Dec 26, ASCENSION ISLAND REGION + 5.3 + + -13.132,-10.411,0 + + + + M 5.3 - 2012 Dec 27, BARBADOS REGION, WINDWARD ISL. + 5.3 + + -58.002,13.006,0 + + + + M 5.3 - 2012 Dec 30, OFFSHORE CHIAPAS, MEXICO + 5.3 + + -92.991,14.446,0 + + + + M 5.2 - 2012 Jan 1, SOUTH ISLAND OF NEW ZEALAND + 5.2 + + 172.881,-43.476,0 + + + + M 5.2 - 2012 Jan 1, NORTHERN SUMATRA, INDONESIA + 5.2 + + 96.419,4.547,0 + + + + M 5.2 - 2012 Jan 3, GUAM REGION + 5.2 + + 143.737,12.689,0 + + + + M 5.2 - 2012 Jan 4, KEPULAUAN BARAT DAYA, INDONESIA + 5.2 + + 128.737,-7.354,0 + + + + M 5.2 - 2012 Jan 4, SANTA CRUZ ISLANDS + 5.2 + + 166.375,-10.67,0 + + + + M 5.2 - 2012 Jan 5, PACIFIC-ANTARCTIC RIDGE + 5.2 + + -143.95,-56.146,0 + + + + M 5.2 - 2012 Jan 8, FIJI REGION + 5.2 + + -178.541,-17.897,0 + + + + M 5.2 - 2012 Jan 9, SOUTHERN IRAN + 5.2 + + 55.726,27.034,0 + + + + M 5.2 - 2012 Jan 9, OFFSHORE VALPARAISO, CHILE + 5.2 + + -71.594,-32.573,0 + + + + M 5.2 - 2012 Jan 10, VANUATU REGION + 5.2 + + 171.404,-16.993,0 + + + + M 5.2 - 2012 Jan 10, TONGA REGION + 5.2 + + -172.779,-17.414,0 + + + + M 5.2 - 2012 Jan 11, BANDA SEA + 5.2 + + 123.462,-6.885,0 + + + + M 5.2 - 2012 Jan 12, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 142.461,38.336,0 + + + + M 5.2 - 2012 Jan 13, QUEEN CHARLOTTE ISLANDS REGION + 5.2 + + -130.72,51.076,0 + + + + M 5.2 - 2012 Jan 15, OFF E. COAST OF N. ISLAND, N.Z. + 5.2 + + 177.217,-36.573,0 + + + + M 5.2 - 2012 Jan 16, MINAHASA, SULAWESI, INDONESIA + 5.2 + + 123.09,0.002,0 + + + + M 5.2 - 2012 Jan 18, MOLUCCA SEA + 5.2 + + 126.898,-0.951,0 + + + + M 5.2 - 2012 Jan 19, OFF W. COAST OF S. ISLAND, N.Z. + 5.2 + + 165.604,-46.763,0 + + + + M 5.2 - 2012 Jan 20, OFF EAST COAST OF HONSHU, JAPAN + 5.2 + + 143.311,37.75,0 + + + + M 5.2 - 2012 Jan 22, LAKE RUDOLF REGION, KENYA + 5.2 + + 36.091,3.678,0 + + + + M 5.2 - 2012 Jan 23, EASTERN HONSHU, JAPAN + 5.2 + + 140.965,37.108,0 + + + + M 5.2 - 2012 Jan 25, SOUTH PACIFIC OCEAN + 5.2 + + -122.202,-6.672,0 + + + + M 5.2 - 2012 Jan 25, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 141.573,38.19,0 + + + + M 5.2 - 2012 Jan 26, DODECANESE ISLANDS, GREECE + 5.2 + + 25.07,36.06,0 + + + + M 5.2 - 2012 Jan 26, ROTA REGION, N. MARIANA ISLANDS + 5.2 + + 145.189,14.338,0 + + + + M 5.2 - 2012 Jan 27, EASTERN HONSHU, JAPAN + 5.2 + + 138.888,35.474,0 + + + + M 5.2 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND + 5.2 + + -177.267,-29.452,0 + + + + M 5.2 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND + 5.2 + + -177.175,-29.69,0 + + + + M 5.2 - 2012 Jan 29, MINDANAO, PHILIPPINES + 5.2 + + 124.727,5.936,0 + + + + M 5.2 - 2012 Jan 30, SIMEULUE, INDONESIA + 5.2 + + 96.647,2.072,0 + + + + M 5.2 - 2012 Feb 2, VANUATU + 5.2 + + 167.304,-17.597,0 + + + + M 5.2 - 2012 Feb 4, VANUATU + 5.2 + + 167.81,-17.086,0 + + + + M 5.2 - 2012 Feb 5, KEPULAUAN KAI, INDONESIA + 5.2 + + 133.949,-5.489,0 + + + + M 5.2 - 2012 Feb 5, KYRGYZSTAN + 5.2 + + 74.784,41.437,0 + + + + M 5.2 - 2012 Feb 7, SVALBARD REGION + 5.2 + + 7.323,76.848,0 + + + + M 5.2 - 2012 Feb 8, NEAR COAST OF ECUADOR + 5.2 + + -79.258,0.658,0 + + + + M 5.2 - 2012 Feb 10, NEAR N COAST OF PAPUA, INDONESIA + 5.2 + + 132.794,-0.266,0 + + + + M 5.2 - 2012 Feb 12, OFF EAST COAST OF HONSHU, JAPAN + 5.2 + + 144.252,38.529,0 + + + + M 5.2 - 2012 Feb 13, TONGA REGION + 5.2 + + -172.415,-18.175,0 + + + + M 5.2 - 2012 Feb 14, AEGEAN SEA + 5.2 + + 24.09,40.13,0 + + + + M 5.2 - 2012 Feb 15, FIJI REGION + 5.2 + + -177.378,-19.321,0 + + + + M 5.2 - 2012 Feb 15, EASTERN NEW GUINEA REG., P.N.G. + 5.2 + + 146.958,-7.501,0 + + + + M 5.2 - 2012 Feb 17, WESTERN XIZANG + 5.2 + + 82.787,32.388,0 + + + + M 5.2 - 2012 Feb 19, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 140.313,36.761,0 + + + + M 5.2 - 2012 Feb 20, NORTHERN SUMATRA, INDONESIA + 5.2 + + 99.562,1.846,0 + + + + M 5.2 - 2012 Feb 25, KURIL ISLANDS + 5.2 + + 155.941,49.186,0 + + + + M 5.2 - 2012 Feb 25, KURIL ISLANDS + 5.2 + + 155.982,49.23,0 + + + + M 5.2 - 2012 Feb 26, SOUTHWESTERN SIBERIA, RUSSIA + 5.2 + + 95.981,51.687,0 + + + + M 5.2 - 2012 Feb 26, SOUTH OF FIJI ISLANDS + 5.2 + + -176.946,-25.159,0 + + + + M 5.2 - 2012 Feb 27, SOUTHWESTERN RYUKYU ISL., JAPAN + 5.2 + + 123.355,23.873,0 + + + + M 5.2 - 2012 Feb 27, CENTRAL IRAN + 5.2 + + 56.778,31.428,0 + + + + M 5.2 - 2012 Feb 29, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 141.513,37.305,0 + + + + M 5.2 - 2012 Mar 4, FIJI REGION + 5.2 + + -178.593,-17.835,0 + + + + M 5.2 - 2012 Mar 4, AEGEAN SEA + 5.2 + + 24.059,40.134,0 + + + + M 5.2 - 2012 Mar 6, SOUTHERN SUMATRA, INDONESIA + 5.2 + + 100.16,-0.836,0 + + + + M 5.2 - 2012 Mar 7, RYUKYU ISLANDS, JAPAN + 5.2 + + 127.13,25.609,0 + + + + M 5.2 - 2012 Mar 8, VANUATU + 5.2 + + 167.152,-17.895,0 + + + + M 5.2 - 2012 Mar 14, SOUTH OF FIJI ISLANDS + 5.2 + + -176.331,-24.412,0 + + + + M 5.2 - 2012 Mar 14, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 141.612,35.502,0 + + + + M 5.2 - 2012 Mar 16, KURIL ISLANDS + 5.2 + + 156.074,49.274,0 + + + + M 5.2 - 2012 Mar 17, CARLSBERG RIDGE + 5.2 + + 63.41,3.705,0 + + + + M 5.2 - 2012 Mar 20, OFFSHORE OAXACA, MEXICO + 5.2 + + -98.715,15.899,0 + + + + M 5.2 - 2012 Mar 25, SOUTH SANDWICH ISLANDS REGION + 5.2 + + -23.863,-60.835,0 + + + + M 5.2 - 2012 Mar 25, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 141.603,37.692,0 + + + + M 5.2 - 2012 Mar 26, NORTHERN EAST PACIFIC RISE + 5.2 + + -104.373,9.581,0 + + + + M 5.2 - 2012 Mar 28, SOUTHERN SUMATRA, INDONESIA + 5.2 + + 101.235,-4.403,0 + + + + M 5.2 - 2012 Mar 30, BOUGAINVILLE REGION, P.N.G. + 5.2 + + 154.659,-6.583,0 + + + + M 5.2 - 2012 Mar 30, NORTHERN SUMATRA, INDONESIA + 5.2 + + 95.115,4.616,0 + + + + M 5.2 - 2012 Mar 31, SOUTH OF FIJI ISLANDS + 5.2 + + 179.299,-23.63,0 + + + + M 5.2 - 2012 Apr 3, TARAPACA, CHILE + 5.2 + + -69.093,-19.638,0 + + + + M 5.2 - 2012 Apr 7, BANDA SEA + 5.2 + + 130.684,-6.057,0 + + + + M 5.2 - 2012 Apr 11, SOUTHERN MID-ATLANTIC RIDGE + 5.2 + + -14.397,-16.856,0 + + + + M 5.2 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.2 + + 91.802,1.252,0 + + + + M 5.2 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.2 + + 92.11,1.107,0 + + + + M 5.2 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.2 + + 92.2,2.945,0 + + + + M 5.2 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.2 + + 91.662,0.306,0 + + + + M 5.2 - 2012 Apr 12, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 141.032,36.865,0 + + + + M 5.2 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA + 5.2 + + 93.401,2.396,0 + + + + M 5.2 - 2012 Apr 13, OAXACA, MEXICO + 5.2 + + -98.138,16.236,0 + + + + M 5.2 - 2012 Apr 16, OFF W COAST OF NORTHERN SUMATRA + 5.2 + + 92.235,0.176,0 + + + + M 5.2 - 2012 Apr 19, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 141.181,36.976,0 + + + + M 5.2 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA + 5.2 + + 93.824,3.249,0 + + + + M 5.2 - 2012 Apr 21, OFF W COAST OF NORTHERN SUMATRA + 5.2 + + 93.723,3.268,0 + + + + M 5.2 - 2012 Apr 21, SOUTHEAST OF LOYALTY ISLANDS + 5.2 + + 170.183,-21.825,0 + + + + M 5.2 - 2012 Apr 22, SOLOMON ISLANDS + 5.2 + + 158.583,-9.192,0 + + + + M 5.2 - 2012 Apr 23, GUATEMALA + 5.2 + + -89.211,15.766,0 + + + + M 5.2 - 2012 Apr 23, KEPULAUAN BABAR, INDONESIA + 5.2 + + 129.226,-7.22,0 + + + + M 5.2 - 2012 Apr 25, SOUTHERN MID-ATLANTIC RIDGE + 5.2 + + -14.631,-12.771,0 + + + + M 5.2 - 2012 Apr 29, PAPUA, INDONESIA + 5.2 + + 136.109,-3.059,0 + + + + M 5.2 - 2012 Apr 30, ANDAMAN ISLANDS, INDIA REGION + 5.2 + + 93.327,14.405,0 + + + + M 5.2 - 2012 May 3, IRAN-IRAQ BORDER REGION + 5.2 + + 47.726,32.747,0 + + + + M 5.2 - 2012 May 3, GANSU-NEI MONGOL BDR REG, CHINA + 5.2 + + 98.525,40.513,0 + + + + M 5.2 - 2012 May 3, WESTERN TURKEY + 5.2 + + 29.092,39.175,0 + + + + M 5.2 - 2012 May 10, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 142.171,39.772,0 + + + + M 5.2 - 2012 May 10, MOLUCCA SEA + 5.2 + + 126.293,1.38,0 + + + + M 5.2 - 2012 May 15, SOUTH OF TONGA + 5.2 + + -175.967,-24.568,0 + + + + M 5.2 - 2012 May 16, SOUTH OF TONGA + 5.2 + + -175.965,-24.566,0 + + + + M 5.2 - 2012 May 21, RYUKYU ISLANDS, JAPAN + 5.2 + + 127.284,27.197,0 + + + + M 5.2 - 2012 May 21, OFF EAST COAST OF HONSHU, JAPAN + 5.2 + + 143.47,39.364,0 + + + + M 5.2 - 2012 May 23, CENTRAL MID-ATLANTIC RIDGE + 5.2 + + -27.607,0.849,0 + + + + M 5.2 - 2012 May 27, KEP. MENTAWAI REGION, INDONESIA + 5.2 + + 100.155,-2.82,0 + + + + M 5.2 - 2012 May 29, OFF EAST COAST OF HONSHU, JAPAN + 5.2 + + 144.645,39.099,0 + + + + M 5.2 - 2012 May 30, NEAR EAST COAST OF KAMCHATKA + 5.2 + + 161.392,54.739,0 + + + + M 5.2 - 2012 Jun 5, VANUATU + 5.2 + + 168.324,-18.114,0 + + + + M 5.2 - 2012 Jun 14, TAIWAN + 5.2 + + 121.584,23.699,0 + + + + M 5.2 - 2012 Jun 14, NORTHERN XINJIANG, CHINA + 5.2 + + 84.279,42.166,0 + + + + M 5.2 - 2012 Jun 19, NEAR S.E. COAST OF AUSTRALIA + 5.2 + + 146.2,-38.304,0 + + + + M 5.2 - 2012 Jun 19, OFF COAST OF OREGON + 5.2 + + -127.273,43.443,0 + + + + M 5.2 - 2012 Jun 20, SOUTHERN SUMATRA, INDONESIA + 5.2 + + 103.194,-4.928,0 + + + + M 5.2 - 2012 Jun 21, OFF EAST COAST OF HONSHU, JAPAN + 5.2 + + 143.364,39.38,0 + + + + M 5.2 - 2012 Jun 21, SOUTH OF KERMADEC ISLANDS + 5.2 + + -178.622,-32.829,0 + + + + M 5.2 - 2012 Jun 26, KAMCHATKA PENINSULA, RUSSIA + 5.2 + + 160.519,56.157,0 + + + + M 5.2 - 2012 Jun 27, FLORES REGION, INDONESIA + 5.2 + + 119.938,-8.304,0 + + + + M 5.2 - 2012 Jun 27, TONGA + 5.2 + + -173.341,-15.138,0 + + + + M 5.2 - 2012 Jun 28, EASTERN HONSHU, JAPAN + 5.2 + + 140.934,37.165,0 + + + + M 5.2 - 2012 Jun 29, OFFSHORE CHIAPAS, MEXICO + 5.2 + + -93.062,14.939,0 + + + + M 5.2 - 2012 Jun 30, BONIN ISLANDS, JAPAN REGION + 5.2 + + 143.386,28.134,0 + + + + M 5.2 - 2012 Jul 8, SOUTH SANDWICH ISLANDS REGION + 5.2 + + -24.188,-56.456,0 + + + + M 5.2 - 2012 Jul 10, NEAR N COAST OF PAPUA, INDONESIA + 5.2 + + 134.248,-1.692,0 + + + + M 5.2 - 2012 Jul 12, GUATEMALA + 5.2 + + -90.938,14.75,0 + + + + M 5.2 - 2012 Jul 12, SANTA CRUZ ISLANDS + 5.2 + + 165.977,-10.752,0 + + + + M 5.2 - 2012 Jul 14, KURIL ISLANDS + 5.2 + + 151.329,45.54,0 + + + + M 5.2 - 2012 Jul 14, MYANMAR-INDIA BORDER REGION + 5.2 + + 94.48,25.424,0 + + + + M 5.2 - 2012 Jul 14, TONGA + 5.2 + + -173.13,-17.787,0 + + + + M 5.2 - 2012 Jul 15, KURIL ISLANDS + 5.2 + + 146.41,43.244,0 + + + + M 5.2 - 2012 Jul 17, KERMADEC ISLANDS REGION + 5.2 + + -178.991,-31.431,0 + + + + M 5.2 - 2012 Jul 21, OFFSHORE NORTHERN CALIFORNIA + 5.2 + + -125.331,40.412,0 + + + + M 5.2 - 2012 Jul 23, NEAR N COAST OF PAPUA, INDONESIA + 5.2 + + 135.414,-2.537,0 + + + + M 5.2 - 2012 Jul 24, OAXACA, MEXICO + 5.2 + + -98.307,16.266,0 + + + + M 5.2 - 2012 Jul 24, WESTERN IRAN + 5.2 + + 50.961,31.705,0 + + + + M 5.2 - 2012 Jul 26, TAJIKISTAN + 5.2 + + 74.008,38.313,0 + + + + M 5.2 - 2012 Jul 26, SOUTH OF FIJI ISLANDS + 5.2 + + -178.61,-26.442,0 + + + + M 5.2 - 2012 Jul 29, SOUTHERN SUMATRA, INDONESIA + 5.2 + + 104.418,-5.997,0 + + + + M 5.2 - 2012 Jul 31, SOUTHERN SUMATRA, INDONESIA + 5.2 + + 103.086,-4.769,0 + + + + M 5.2 - 2012 Aug 2, BOUGAINVILLE REGION, P.N.G. + 5.2 + + 154.833,-6.319,0 + + + + M 5.2 - 2012 Aug 2, EAST OF NORTH ISLAND, N.Z. + 5.2 + + -179.786,-35.56,0 + + + + M 5.2 - 2012 Aug 7, ATACAMA, CHILE + 5.2 + + -70.803,-27.801,0 + + + + M 5.2 - 2012 Aug 8, ALASKA PENINSULA + 5.2 + + -161.214,54.881,0 + + + + M 5.2 - 2012 Aug 8, SOUTH SANDWICH ISLANDS REGION + 5.2 + + -26.056,-55.769,0 + + + + M 5.2 - 2012 Aug 9, SOUTHERN MID-ATLANTIC RIDGE + 5.2 + + -15.876,-33.145,0 + + + + M 5.2 - 2012 Aug 10, WEST CHILE RISE + 5.2 + + -83.235,-42.814,0 + + + + M 5.2 - 2012 Aug 11, NORTHERN MID-ATLANTIC RIDGE + 5.2 + + -31.541,52.149,0 + + + + M 5.2 - 2012 Aug 14, SOUTH SANDWICH ISLANDS REGION + 5.2 + + -26.108,-59.203,0 + + + + M 5.2 - 2012 Aug 15, REYKJANES RIDGE + 5.2 + + -32.646,57.886,0 + + + + M 5.2 - 2012 Aug 17, CENTRAL MID-ATLANTIC RIDGE + 5.2 + + -18.707,-0.353,0 + + + + M 5.2 - 2012 Aug 19, NORTHERN SUMATRA, INDONESIA + 5.2 + + 94.753,5.063,0 + + + + M 5.2 - 2012 Aug 21, SOUTHERN SUMATRA, INDONESIA + 5.2 + + 102.995,-4.749,0 + + + + M 5.2 - 2012 Aug 22, SOUTH OF FIJI ISLANDS + 5.2 + + 179.107,-24.085,0 + + + + M 5.2 - 2012 Aug 23, SOUTH SANDWICH ISLANDS REGION + 5.2 + + -25.452,-58.895,0 + + + + M 5.2 - 2012 Aug 25, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 140.969,36.962,0 + + + + M 5.2 - 2012 Aug 27, GULF OF CALIFORNIA + 5.2 + + -113.89,30.551,0 + + + + M 5.2 - 2012 Aug 27, NORTHERN SUMATRA, INDONESIA + 5.2 + + 99.031,2.376,0 + + + + M 5.2 - 2012 Aug 27, ANDAMAN ISLANDS, INDIA REGION + 5.2 + + 92.802,10.21,0 + + + + M 5.2 - 2012 Aug 27, GULF OF CALIFORNIA + 5.2 + + -113.909,30.545,0 + + + + M 5.2 - 2012 Aug 30, CERAM SEA, INDONESIA + 5.2 + + 131.002,-3.432,0 + + + + M 5.2 - 2012 Aug 30, JAN MAYEN ISLAND REGION + 5.2 + + -7.936,70.94,0 + + + + M 5.2 - 2012 Aug 31, PHILIPPINE ISLANDS REGION + 5.2 + + 126.777,10.372,0 + + + + M 5.2 - 2012 Aug 31, PHILIPPINE ISLANDS REGION + 5.2 + + 126.916,10.456,0 + + + + M 5.2 - 2012 Aug 31, NEW BRITAIN REGION, P.N.G. + 5.2 + + 151.891,-4.95,0 + + + + M 5.2 - 2012 Aug 31, PHILIPPINE ISLANDS REGION + 5.2 + + 126.73,10.727,0 + + + + M 5.2 - 2012 Sep 1, TONGA + 5.2 + + -174.552,-21.623,0 + + + + M 5.2 - 2012 Sep 2, SVALBARD REGION + 5.2 + + 6.764,78.43,0 + + + + M 5.2 - 2012 Sep 4, PHILIPPINE ISLANDS REGION + 5.2 + + 126.701,10.535,0 + + + + M 5.2 - 2012 Sep 4, SOUTH OF JAVA, INDONESIA + 5.2 + + 113.822,-10.771,0 + + + + M 5.2 - 2012 Sep 4, SOUTH OF JAVA, INDONESIA + 5.2 + + 113.911,-10.652,0 + + + + M 5.2 - 2012 Sep 4, PHILIPPINE ISLANDS REGION + 5.2 + + 126.712,10.611,0 + + + + M 5.2 - 2012 Sep 6, SOUTHERN IRAN + 5.2 + + 53.879,26.942,0 + + + + M 5.2 - 2012 Sep 7, CHAGOS ARCHIPELAGO REGION + 5.2 + + 72.179,-6.877,0 + + + + M 5.2 - 2012 Sep 8, SOLOMON ISLANDS + 5.2 + + 160.404,-9.849,0 + + + + M 5.2 - 2012 Sep 9, KURIL ISLANDS + 5.2 + + 155.517,49.427,0 + + + + M 5.2 - 2012 Sep 10, ANDAMAN ISLANDS, INDIA REGION + 5.2 + + 93.616,10.459,0 + + + + M 5.2 - 2012 Sep 11, PHILIPPINE ISLANDS REGION + 5.2 + + 126.758,10.709,0 + + + + M 5.2 - 2012 Sep 12, SOLOMON ISLANDS + 5.2 + + 161.016,-10.11,0 + + + + M 5.2 - 2012 Sep 13, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 140.388,35.752,0 + + + + M 5.2 - 2012 Sep 16, COSTA RICA + 5.2 + + -85.459,10.168,0 + + + + M 5.2 - 2012 Sep 18, MOLUCCA SEA + 5.2 + + 125.849,1.336,0 + + + + M 5.2 - 2012 Sep 18, SOUTHWEST OF SUMATRA, INDONESIA + 5.2 + + 103.739,-6.169,0 + + + + M 5.2 - 2012 Sep 25, SOUTH OF AFRICA + 5.2 + + 25.583,-53.21,0 + + + + M 5.2 - 2012 Sep 25, SOUTH OF FIJI ISLANDS + 5.2 + + 178.327,-25.555,0 + + + + M 5.2 - 2012 Sep 25, HINDU KUSH REGION, AFGHANISTAN + 5.2 + + 69.211,36.277,0 + + + + M 5.2 - 2012 Sep 25, SOLOMON ISLANDS + 5.2 + + 159.746,-9.748,0 + + + + M 5.2 - 2012 Sep 28, SOLOMON ISLANDS + 5.2 + + 157.425,-8.93,0 + + + + M 5.2 - 2012 Oct 1, OFF COAST OF JALISCO, MEXICO + 5.2 + + -107.164,18.607,0 + + + + M 5.2 - 2012 Oct 1, OFF EAST COAST OF HONSHU, JAPAN + 5.2 + + 143.189,39.74,0 + + + + M 5.2 - 2012 Oct 2, ASSAM, INDIA + 5.2 + + 92.818,26.879,0 + + + + M 5.2 - 2012 Oct 10, SOUTHERN IRAN + 5.2 + + 52.49,29.33,0 + + + + M 5.2 - 2012 Oct 12, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 140.346,35.764,0 + + + + M 5.2 - 2012 Oct 15, FIJI REGION + 5.2 + + -178.251,-20.446,0 + + + + M 5.2 - 2012 Oct 22, SOUTH SANDWICH ISLANDS REGION + 5.2 + + -25.59,-56.301,0 + + + + M 5.2 - 2012 Oct 27, CARLSBERG RIDGE + 5.2 + + 57.091,9.82,0 + + + + M 5.2 - 2012 Oct 27, PHILIPPINE ISLANDS REGION + 5.2 + + 126.812,10.415,0 + + + + M 5.2 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION + 5.2 + + -132.49,52.624,0 + + + + M 5.2 - 2012 Nov 1, KURIL ISLANDS + 5.2 + + 155.489,49.399,0 + + + + M 5.2 - 2012 Nov 5, SOUTHWEST INDIAN RIDGE + 5.2 + + 61.983,-28.775,0 + + + + M 5.2 - 2012 Nov 5, MOLUCCA SEA + 5.2 + + 125.236,-0.144,0 + + + + M 5.2 - 2012 Nov 8, WESTERN INDIAN-ANTARCTIC RIDGE + 5.2 + + 117.354,-49.699,0 + + + + M 5.2 - 2012 Nov 9, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 141.246,36.838,0 + + + + M 5.2 - 2012 Nov 9, SOUTH SANDWICH ISLANDS REGION + 5.2 + + -27.344,-56.391,0 + + + + M 5.2 - 2012 Nov 9, NIAS REGION, INDONESIA + 5.2 + + 97.464,0.886,0 + + + + M 5.2 - 2012 Nov 11, SANTA CRUZ ISLANDS REGION + 5.2 + + 164.828,-10.755,0 + + + + M 5.2 - 2012 Nov 12, SOUTH OF FIJI ISLANDS + 5.2 + + 178.919,-24.277,0 + + + + M 5.2 - 2012 Nov 14, TONGA + 5.2 + + -174.079,-20.739,0 + + + + M 5.2 - 2012 Nov 14, FIJI REGION + 5.2 + + 173.738,-14.484,0 + + + + M 5.2 - 2012 Nov 20, TAIWAN REGION + 5.2 + + 121.454,22.339,0 + + + + M 5.2 - 2012 Nov 21, OFFSHORE O'HIGGINS, CHILE + 5.2 + + -71.994,-33.916,0 + + + + M 5.2 - 2012 Nov 22, SOUTHERN SUMATRA, INDONESIA + 5.2 + + 102.826,-4.535,0 + + + + M 5.2 - 2012 Nov 27, PAPUA, INDONESIA + 5.2 + + 138.75,-2.712,0 + + + + M 5.2 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN + 5.2 + + 143.93,37.325,0 + + + + M 5.2 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN + 5.2 + + 143.762,37.739,0 + + + + M 5.2 - 2012 Dec 9, TONGA + 5.2 + + -174.22,-16.236,0 + + + + M 5.2 - 2012 Dec 10, BANDA SEA + 5.2 + + 129.904,-6.511,0 + + + + M 5.2 - 2012 Dec 11, VANUATU + 5.2 + + 167.669,-18.974,0 + + + + M 5.2 - 2012 Dec 14, OFFSHORE GUATEMALA + 5.2 + + -91.679,13.926,0 + + + + M 5.2 - 2012 Dec 15, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 141.205,37.311,0 + + + + M 5.2 - 2012 Dec 16, GUATEMALA + 5.2 + + -91.457,14.675,0 + + + + M 5.2 - 2012 Dec 16, ROTA REGION, N. MARIANA ISLANDS + 5.2 + + 146.733,14.185,0 + + + + M 5.2 - 2012 Dec 23, VANUATU + 5.2 + + 167.11,-13.086,0 + + + + M 5.2 - 2012 Dec 23, TURKEY-IRAN BORDER REGION + 5.2 + + 44.868,38.458,0 + + + + M 5.2 - 2012 Dec 23, KEPULAUAN TALAUD, INDONESIA + 5.2 + + 126.584,4.19,0 + + + + M 5.2 - 2012 Dec 25, BLACK SEA, OFFSHORE GEORGIA + 5.2 + + 40.974,42.436,0 + + + + M 5.2 - 2012 Dec 26, BIO-BIO, CHILE + 5.2 + + -73.267,-37.274,0 + + + + M 5.2 - 2012 Dec 27, SOUTHERN MID-ATLANTIC RIDGE + 5.2 + + -14.876,-12.396,0 + + + + M 5.2 - 2012 Dec 29, NEAR EAST COAST OF HONSHU, JAPAN + 5.2 + + 141.168,37.018,0 + + + + M 5.2 - 2012 Dec 30, SCOTIA SEA + 5.2 + + -36.887,-60.906,0 + + + + M 5.2 - 2012 Dec 30, MOLUCCA SEA + 5.2 + + 126.587,1.569,0 + + + + M 5.2 - 2012 Dec 30, CENTRAL PERU + 5.2 + + -70.938,-12.861,0 + + + + M 5.2 - 2012 Dec 31, BALLENY ISLANDS REGION + 5.2 + + 154.301,-61.623,0 + + + + M 5.1 - 2012 Jan 1, GUAM REGION + 5.1 + + 143.487,12.008,0 + + + + M 5.1 - 2012 Jan 1, SOUTH ISLAND OF NEW ZEALAND + 5.1 + + 172.852,-43.47,0 + + + + M 5.1 - 2012 Jan 1, GUAM REGION + 5.1 + + 143.607,12.018,0 + + + + M 5.1 - 2012 Jan 1, HALMAHERA, INDONESIA + 5.1 + + 128.368,2.205,0 + + + + M 5.1 - 2012 Jan 1, VANUATU + 5.1 + + 166.921,-14.381,0 + + + + M 5.1 - 2012 Jan 4, VANUATU + 5.1 + + 167.44,-14.748,0 + + + + M 5.1 - 2012 Jan 5, SOUTHERN SUMATRA, INDONESIA + 5.1 + + 99.069,-0.935,0 + + + + M 5.1 - 2012 Jan 6, SOUTHERN MID-ATLANTIC RIDGE + 5.1 + + -14.263,-14.092,0 + + + + M 5.1 - 2012 Jan 7, PACIFIC-ANTARCTIC RIDGE + 5.1 + + -166.854,-63.697,0 + + + + M 5.1 - 2012 Jan 7, TONGA + 5.1 + + -173.318,-17.549,0 + + + + M 5.1 - 2012 Jan 9, TONGA + 5.1 + + -174.142,-15.063,0 + + + + M 5.1 - 2012 Jan 10, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 92.937,2.386,0 + + + + M 5.1 - 2012 Jan 11, NORTHERN IRAN + 5.1 + + 52.775,36.328,0 + + + + M 5.1 - 2012 Jan 13, SOUTH OF KERMADEC ISLANDS + 5.1 + + -178.566,-32.809,0 + + + + M 5.1 - 2012 Jan 13, SIMEULUE, INDONESIA + 5.1 + + 96.273,2.405,0 + + + + M 5.1 - 2012 Jan 13, SOUTH OF KERMADEC ISLANDS + 5.1 + + -178.476,-32.882,0 + + + + M 5.1 - 2012 Jan 14, SOUTH ISLAND OF NEW ZEALAND + 5.1 + + 172.765,-43.538,0 + + + + M 5.1 - 2012 Jan 15, SOUTH SHETLAND ISLANDS + 5.1 + + -53.571,-61.33,0 + + + + M 5.1 - 2012 Jan 15, SOUTHERN MID-ATLANTIC RIDGE + 5.1 + + -12.912,-15.675,0 + + + + M 5.1 - 2012 Jan 16, SOUTH SANDWICH ISLANDS REGION + 5.1 + + -25.045,-56.718,0 + + + + M 5.1 - 2012 Jan 16, SOUTH OF KERMADEC ISLANDS + 5.1 + + -178.424,-33.33,0 + + + + M 5.1 - 2012 Jan 18, MOLUCCA SEA + 5.1 + + 126.806,-0.906,0 + + + + M 5.1 - 2012 Jan 18, SANTA CRUZ ISLANDS + 5.1 + + 165.478,-11.023,0 + + + + M 5.1 - 2012 Jan 19, SANTA CRUZ ISLANDS + 5.1 + + 165.477,-10.979,0 + + + + M 5.1 - 2012 Jan 19, NORTHEASTERN IRAN + 5.1 + + 58.835,36.288,0 + + + + M 5.1 - 2012 Jan 23, DOMINICAN REPUBLIC + 5.1 + + -70.077,19.542,0 + + + + M 5.1 - 2012 Jan 24, MINDANAO, PHILIPPINES + 5.1 + + 126.102,8.584,0 + + + + M 5.1 - 2012 Jan 25, FOX ISLANDS, ALEUTIAN ISLANDS + 5.1 + + -167.049,52.654,0 + + + + M 5.1 - 2012 Jan 25, OFF W. COAST OF S. ISLAND, N.Z. + 5.1 + + 165.714,-46.68,0 + + + + M 5.1 - 2012 Jan 25, NEW BRITAIN REGION, P.N.G. + 5.1 + + 152.136,-5.209,0 + + + + M 5.1 - 2012 Jan 27, NEAR N COAST OF PAPUA, INDONESIA + 5.1 + + 138.259,-1.452,0 + + + + M 5.1 - 2012 Jan 27, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 93.018,2.732,0 + + + + M 5.1 - 2012 Jan 27, SOUTH OF LOMBOK, INDONESIA + 5.1 + + 116.013,-10.369,0 + + + + M 5.1 - 2012 Jan 28, BABUYAN ISL REGION, PHILIPPINES + 5.1 + + 121.205,19.251,0 + + + + M 5.1 - 2012 Jan 28, POTOSI, BOLIVIA + 5.1 + + -66.436,-21.464,0 + + + + M 5.1 - 2012 Jan 28, SIMEULUE, INDONESIA + 5.1 + + 96.678,2.07,0 + + + + M 5.1 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND + 5.1 + + -177.166,-29.428,0 + + + + M 5.1 - 2012 Jan 29, KYUSHU, JAPAN + 5.1 + + 131.806,32.588,0 + + + + M 5.1 - 2012 Jan 31, VANUATU + 5.1 + + 167.18,-14.255,0 + + + + M 5.1 - 2012 Feb 2, WESTERN INDIAN-ANTARCTIC RIDGE + 5.1 + + 126.049,-49.649,0 + + + + M 5.1 - 2012 Feb 2, VANUATU + 5.1 + + 167.53,-17.754,0 + + + + M 5.1 - 2012 Feb 2, VANUATU + 5.1 + + 167.32,-17.686,0 + + + + M 5.1 - 2012 Feb 2, VANUATU + 5.1 + + 167.429,-17.717,0 + + + + M 5.1 - 2012 Feb 2, VANUATU + 5.1 + + 167.287,-17.395,0 + + + + M 5.1 - 2012 Feb 2, VANUATU + 5.1 + + 167.209,-17.43,0 + + + + M 5.1 - 2012 Feb 2, VANUATU + 5.1 + + 167.327,-17.534,0 + + + + M 5.1 - 2012 Feb 4, TAIWAN REGION + 5.1 + + 122.602,24.699,0 + + + + M 5.1 - 2012 Feb 4, CENTRAL MID-ATLANTIC RIDGE + 5.1 + + -26.746,0.922,0 + + + + M 5.1 - 2012 Feb 5, FIJI REGION + 5.1 + + -177.987,-20.423,0 + + + + M 5.1 - 2012 Feb 8, MINAHASA, SULAWESI, INDONESIA + 5.1 + + 119.951,-0.462,0 + + + + M 5.1 - 2012 Feb 8, OFF COAST OF CHIAPAS, MEXICO + 5.1 + + -94.427,14.682,0 + + + + M 5.1 - 2012 Feb 9, SERAM, INDONESIA + 5.1 + + 130.789,-3.252,0 + + + + M 5.1 - 2012 Feb 9, SERAM, INDONESIA + 5.1 + + 130.694,-3.339,0 + + + + M 5.1 - 2012 Feb 9, CROZET ISLANDS REGION + 5.1 + + 44.526,-41.065,0 + + + + M 5.1 - 2012 Feb 9, PAPUA REGION, INDONESIA + 5.1 + + 140.72,-1.755,0 + + + + M 5.1 - 2012 Feb 9, NORTHERN XINJIANG, CHINA + 5.1 + + 92.985,44.742,0 + + + + M 5.1 - 2012 Feb 9, UTTARANCHAL, INDIA + 5.1 + + 78.282,30.986,0 + + + + M 5.1 - 2012 Feb 9, MACQUARIE ISLAND REGION + 5.1 + + 158.057,-58.307,0 + + + + M 5.1 - 2012 Feb 11, FIJI REGION + 5.1 + + -176.113,-20.991,0 + + + + M 5.1 - 2012 Feb 11, SOLOMON ISLANDS + 5.1 + + 160.274,-9.954,0 + + + + M 5.1 - 2012 Feb 13, SOUTH OF KERMADEC ISLANDS + 5.1 + + -178.851,-32.554,0 + + + + M 5.1 - 2012 Feb 14, SOUTHERN EAST PACIFIC RISE + 5.1 + + -116.529,-49.723,0 + + + + M 5.1 - 2012 Feb 14, NEAR EAST COAST OF HONSHU, JAPAN + 5.1 + + 141.642,36.16,0 + + + + M 5.1 - 2012 Feb 15, ANDREANOF ISLANDS, ALEUTIAN IS. + 5.1 + + -177.97,51.763,0 + + + + M 5.1 - 2012 Feb 17, VANUATU + 5.1 + + 168.847,-19.367,0 + + + + M 5.1 - 2012 Feb 18, NEW BRITAIN REGION, P.N.G. + 5.1 + + 151.415,-5.285,0 + + + + M 5.1 - 2012 Feb 20, TONGA REGION + 5.1 + + -172.96,-17.678,0 + + + + M 5.1 - 2012 Feb 22, VANUATU + 5.1 + + 167.051,-17.868,0 + + + + M 5.1 - 2012 Feb 23, NEW BRITAIN REGION, P.N.G. + 5.1 + + 151.926,-5.197,0 + + + + M 5.1 - 2012 Feb 23, OFF COAST OF CHIAPAS, MEXICO + 5.1 + + -93.37,14.16,0 + + + + M 5.1 - 2012 Feb 23, KERMADEC ISLANDS REGION + 5.1 + + -176.185,-29.231,0 + + + + M 5.1 - 2012 Feb 25, MAUG ISLANDS REG, N. MARIANA IS. + 5.1 + + 145.747,19.122,0 + + + + M 5.1 - 2012 Feb 25, SOUTH OF FIJI ISLANDS + 5.1 + + 179.534,-25.686,0 + + + + M 5.1 - 2012 Feb 25, SAMAR, PHILIPPINES + 5.1 + + 125.782,11.774,0 + + + + M 5.1 - 2012 Feb 26, SOUTHWESTERN SIBERIA, RUSSIA + 5.1 + + 96.084,51.693,0 + + + + M 5.1 - 2012 Feb 26, SOUTH OF FIJI ISLANDS + 5.1 + + -177.222,-24.869,0 + + + + M 5.1 - 2012 Feb 26, SOUTH OF FIJI ISLANDS + 5.1 + + -177.205,-24.672,0 + + + + M 5.1 - 2012 Feb 26, SOUTH OF FIJI ISLANDS + 5.1 + + -177.305,-24.849,0 + + + + M 5.1 - 2012 Feb 27, SOUTH OF FIJI ISLANDS + 5.1 + + -177.123,-24.757,0 + + + + M 5.1 - 2012 Feb 27, SOUTH OF FIJI ISLANDS + 5.1 + + -177.229,-24.688,0 + + + + M 5.1 - 2012 Feb 28, KURIL ISLANDS + 5.1 + + 156.1,49.262,0 + + + + M 5.1 - 2012 Feb 29, SANTA CRUZ ISLANDS + 5.1 + + 166.487,-12.543,0 + + + + M 5.1 - 2012 Feb 29, KURIL ISLANDS + 5.1 + + 156.103,49.259,0 + + + + M 5.1 - 2012 Mar 1, VANUATU + 5.1 + + 167.45,-17.893,0 + + + + M 5.1 - 2012 Mar 2, RAT ISLANDS, ALEUTIAN ISLANDS + 5.1 + + 178.588,52.228,0 + + + + M 5.1 - 2012 Mar 3, SOUTHEAST OF LOYALTY ISLANDS + 5.1 + + 170.307,-21.994,0 + + + + M 5.1 - 2012 Mar 4, TONGA REGION + 5.1 + + -174.798,-22.309,0 + + + + M 5.1 - 2012 Mar 4, SOUTHERN SUMATRA, INDONESIA + 5.1 + + 102.706,-4.323,0 + + + + M 5.1 - 2012 Mar 5, SOUTHEAST OF LOYALTY ISLANDS + 5.1 + + 170.343,-21.591,0 + + + + M 5.1 - 2012 Mar 5, NORTHERN SUMATRA, INDONESIA + 5.1 + + 97.062,4.197,0 + + + + M 5.1 - 2012 Mar 5, HARYANA - DELHI REGION, INDIA + 5.1 + + 76.649,28.809,0 + + + + M 5.1 - 2012 Mar 5, KEPULAUAN BABAR, INDONESIA + 5.1 + + 129.212,-7.076,0 + + + + M 5.1 - 2012 Mar 7, VANUATU + 5.1 + + 168.194,-19.571,0 + + + + M 5.1 - 2012 Mar 8, MINDORO, PHILIPPINES + 5.1 + + 120.556,13.592,0 + + + + M 5.1 - 2012 Mar 8, IRAN-IRAQ BORDER REGION + 5.1 + + 46.957,32.874,0 + + + + M 5.1 - 2012 Mar 13, VANUATU + 5.1 + + 166.983,-17.599,0 + + + + M 5.1 - 2012 Mar 19, MINAHASA, SULAWESI, INDONESIA + 5.1 + + 119.927,-0.882,0 + + + + M 5.1 - 2012 Mar 19, KAMCHATKA PENINSULA, RUSSIA + 5.1 + + 164.724,58.864,0 + + + + M 5.1 - 2012 Mar 20, OAXACA, MEXICO + 5.1 + + -98.22,16.228,0 + + + + M 5.1 - 2012 Mar 20, OAXACA, MEXICO + 5.1 + + -97.987,16.478,0 + + + + M 5.1 - 2012 Mar 20, TONGA REGION + 5.1 + + -175.753,-23.882,0 + + + + M 5.1 - 2012 Mar 22, KEPULAUAN SANGIHE, INDONESIA + 5.1 + + 125.859,3.513,0 + + + + M 5.1 - 2012 Mar 22, OAXACA, MEXICO + 5.1 + + -98.343,16.334,0 + + + + M 5.1 - 2012 Mar 25, FIJI REGION + 5.1 + + -178.774,-18.638,0 + + + + M 5.1 - 2012 Mar 30, NEAR EAST COAST OF HONSHU, JAPAN + 5.1 + + 141.244,37.539,0 + + + + M 5.1 - 2012 Mar 30, OFF EAST COAST OF HONSHU, JAPAN + 5.1 + + 144.807,40.764,0 + + + + M 5.1 - 2012 Mar 31, TONGA + 5.1 + + -175.234,-20.326,0 + + + + M 5.1 - 2012 Apr 6, KEP. MENTAWAI REGION, INDONESIA + 5.1 + + 100.452,-3.346,0 + + + + M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 90.062,2.594,0 + + + + M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 92.482,0.604,0 + + + + M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 92.493,2.235,0 + + + + M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 92.631,1.347,0 + + + + M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 92.797,3.163,0 + + + + M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 92.626,2.583,0 + + + + M 5.1 - 2012 Apr 11, NORTH INDIAN OCEAN + 5.1 + + 89.933,2.833,0 + + + + M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 90.164,2.674,0 + + + + M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 92.863,3.368,0 + + + + M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 92.496,0.619,0 + + + + M 5.1 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 92.158,0.252,0 + + + + M 5.1 - 2012 Apr 13, NEAR EAST COAST OF HONSHU, JAPAN + 5.1 + + 141.151,37.022,0 + + + + M 5.1 - 2012 Apr 14, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 90.347,2.589,0 + + + + M 5.1 - 2012 Apr 17, NORTHERN SUMATRA, INDONESIA + 5.1 + + 94.621,5.373,0 + + + + M 5.1 - 2012 Apr 18, SOUTHEASTERN IRAN + 5.1 + + 58.063,27.941,0 + + + + M 5.1 - 2012 Apr 18, NEAR N COAST OF PAPUA, INDONESIA + 5.1 + + 131.893,-0.545,0 + + + + M 5.1 - 2012 Apr 18, IRAN-IRAQ BORDER REGION + 5.1 + + 47.004,32.506,0 + + + + M 5.1 - 2012 Apr 20, IRAN-IRAQ BORDER REGION + 5.1 + + 47.023,32.511,0 + + + + M 5.1 - 2012 Apr 22, NORTH INDIAN OCEAN + 5.1 + + 91.745,1.379,0 + + + + M 5.1 - 2012 Apr 23, SOUTH OF TONGA + 5.1 + + -175.993,-24.008,0 + + + + M 5.1 - 2012 Apr 24, NORTH INDIAN OCEAN + 5.1 + + 91.724,1.154,0 + + + + M 5.1 - 2012 Apr 25, NICOBAR ISLANDS, INDIA REGION + 5.1 + + 93.882,8.826,0 + + + + M 5.1 - 2012 Apr 26, HOKKAIDO, JAPAN REGION + 5.1 + + 141.818,41.485,0 + + + + M 5.1 - 2012 Apr 27, SULAWESI, INDONESIA + 5.1 + + 121.913,-2.662,0 + + + + M 5.1 - 2012 May 1, SULAWESI, INDONESIA + 5.1 + + 121.906,-2.613,0 + + + + M 5.1 - 2012 May 1, KERMADEC ISLANDS REGION + 5.1 + + -175.874,-30.267,0 + + + + M 5.1 - 2012 May 2, SOUTH OF FIJI ISLANDS + 5.1 + + -176.175,-24.331,0 + + + + M 5.1 - 2012 May 4, NORTH INDIAN OCEAN + 5.1 + + 89.719,2.001,0 + + + + M 5.1 - 2012 May 5, NEAR EAST COAST OF HONSHU, JAPAN + 5.1 + + 141.628,38.182,0 + + + + M 5.1 - 2012 May 11, IZU ISLANDS, JAPAN REGION + 5.1 + + 138.61,30.669,0 + + + + M 5.1 - 2012 May 14, SOUTHERN IRAN + 5.1 + + 57.722,27.955,0 + + + + M 5.1 - 2012 May 15, NORTH INDIAN OCEAN + 5.1 + + 89.561,2.71,0 + + + + M 5.1 - 2012 May 17, SOUTHERN IRAN + 5.1 + + 53.851,26.942,0 + + + + M 5.1 - 2012 May 18, AZERBAIJAN + 5.1 + + 46.789,41.439,0 + + + + M 5.1 - 2012 May 20, MARIANA ISLANDS REGION + 5.1 + + 147.257,17.017,0 + + + + M 5.1 - 2012 May 20, EAST OF KURIL ISLANDS + 5.1 + + 151.761,44.688,0 + + + + M 5.1 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN + 5.1 + + 143.197,39.577,0 + + + + M 5.1 - 2012 May 20, NEAR N COAST OF NEW GUINEA, PNG. + 5.1 + + 143.917,-3.188,0 + + + + M 5.1 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN + 5.1 + + 143.619,39.556,0 + + + + M 5.1 - 2012 May 22, MOLUCCA SEA + 5.1 + + 126.619,2.41,0 + + + + M 5.1 - 2012 May 23, ROTA REGION, N. MARIANA ISLANDS + 5.1 + + 145.413,14.065,0 + + + + M 5.1 - 2012 May 26, LOYALTY ISLANDS + 5.1 + + 168.626,-20.796,0 + + + + M 5.1 - 2012 May 26, NORTH OF SVALBARD + 5.1 + + 32.186,85.939,0 + + + + M 5.1 - 2012 May 28, NEAR S. COAST OF HONSHU, JAPAN + 5.1 + + 139.95,35.707,0 + + + + M 5.1 - 2012 May 29, NORTHERN ITALY + 5.1 + + 10.955,44.873,0 + + + + M 5.1 - 2012 Jun 1, NEAR S. COAST OF HONSHU, JAPAN + 5.1 + + 139.642,35.98,0 + + + + M 5.1 - 2012 Jun 3, NORTHERN ITALY + 5.1 + + 10.94,44.9,0 + + + + M 5.1 - 2012 Jun 5, NORTHERN MID-ATLANTIC RIDGE + 5.1 + + -44.854,13.501,0 + + + + M 5.1 - 2012 Jun 6, SOUTHWESTERN SIBERIA, RUSSIA + 5.1 + + 96.037,51.706,0 + + + + M 5.1 - 2012 Jun 7, MOLUCCA SEA + 5.1 + + 126.477,1.602,0 + + + + M 5.1 - 2012 Jun 9, CERAM SEA, INDONESIA + 5.1 + + 127.671,-2.987,0 + + + + M 5.1 - 2012 Jun 9, SOUTH SANDWICH ISLANDS REGION + 5.1 + + -26.424,-60.577,0 + + + + M 5.1 - 2012 Jun 10, SOUTH SANDWICH ISLANDS REGION + 5.1 + + -27.674,-55.981,0 + + + + M 5.1 - 2012 Jun 12, KERMADEC ISLANDS REGION + 5.1 + + -178.657,-31.696,0 + + + + M 5.1 - 2012 Jun 14, SOUTH OF FIJI ISLANDS + 5.1 + + 179.633,-22.25,0 + + + + M 5.1 - 2012 Jun 16, MAUG ISLANDS REG, N. MARIANA IS. + 5.1 + + 145.401,20.632,0 + + + + M 5.1 - 2012 Jun 17, SOUTH SANDWICH ISLANDS REGION + 5.1 + + -26.603,-57.124,0 + + + + M 5.1 - 2012 Jun 18, HALMAHERA, INDONESIA + 5.1 + + 129.203,2.035,0 + + + + M 5.1 - 2012 Jun 19, KEP. MENTAWAI REGION, INDONESIA + 5.1 + + 100.99,-2.921,0 + + + + M 5.1 - 2012 Jun 22, SOUTH OF KERMADEC ISLANDS + 5.1 + + -178.33,-32.979,0 + + + + M 5.1 - 2012 Jun 24, SOUTH SANDWICH ISLANDS REGION + 5.1 + + -27.611,-60.228,0 + + + + M 5.1 - 2012 Jun 25, SOUTH OF KERMADEC ISLANDS + 5.1 + + -178.051,-32.627,0 + + + + M 5.1 - 2012 Jun 27, VOLCANO ISLANDS, JAPAN REGION + 5.1 + + 143.482,23.126,0 + + + + M 5.1 - 2012 Jul 1, NORTHEASTERN IRAN + 5.1 + + 59.927,34.481,0 + + + + M 5.1 - 2012 Jul 3, NORTHERN PERU + 5.1 + + -76.15,-4.035,0 + + + + M 5.1 - 2012 Jul 4, KERMADEC ISLANDS, NEW ZEALAND + 5.1 + + -178.169,-30.749,0 + + + + M 5.1 - 2012 Jul 7, KURIL ISLANDS + 5.1 + + 151.232,45.465,0 + + + + M 5.1 - 2012 Jul 7, DOMINICAN REPUBLIC + 5.1 + + -71.136,18.243,0 + + + + M 5.1 - 2012 Jul 9, MYANMAR + 5.1 + + 96.529,25.347,0 + + + + M 5.1 - 2012 Jul 10, SOUTH OF FIJI ISLANDS + 5.1 + + -176.408,-25.142,0 + + + + M 5.1 - 2012 Jul 11, KURIL ISLANDS + 5.1 + + 151.435,45.377,0 + + + + M 5.1 - 2012 Jul 11, GALAPAGOS ISLANDS REGION + 5.1 + + -90.855,1.582,0 + + + + M 5.1 - 2012 Jul 13, FIJI REGION + 5.1 + + -178.551,-18.273,0 + + + + M 5.1 - 2012 Jul 13, SOUTHERN PERU + 5.1 + + -73.172,-15.232,0 + + + + M 5.1 - 2012 Jul 17, SOUTHERN EAST PACIFIC RISE + 5.1 + + -115.177,-23.496,0 + + + + M 5.1 - 2012 Jul 18, OFFSHORE TARAPACA, CHILE + 5.1 + + -70.365,-20.693,0 + + + + M 5.1 - 2012 Jul 20, KODIAK ISLAND REGION, ALASKA + 5.1 + + -153.542,56.595,0 + + + + M 5.1 - 2012 Jul 21, OFFSHORE NORTHERN CALIFORNIA + 5.1 + + -125.528,40.385,0 + + + + M 5.1 - 2012 Jul 22, MYANMAR + 5.1 + + 96.427,24.998,0 + + + + M 5.1 - 2012 Jul 22, HOKKAIDO, JAPAN REGION + 5.1 + + 142.848,42.552,0 + + + + M 5.1 - 2012 Jul 24, SANTA CRUZ ISLANDS + 5.1 + + 166.416,-12.042,0 + + + + M 5.1 - 2012 Aug 1, EAST OF NORTH ISLAND, N.Z. + 5.1 + + -179.679,-35.663,0 + + + + M 5.1 - 2012 Aug 2, EAST OF NORTH ISLAND, N.Z. + 5.1 + + -179.6,-37.584,0 + + + + M 5.1 - 2012 Aug 2, MYANMAR + 5.1 + + 96.324,26.103,0 + + + + M 5.1 - 2012 Aug 3, ROSS SEA + 5.1 + + 164.067,-76.313,0 + + + + M 5.1 - 2012 Aug 3, SOUTHERN MID-ATLANTIC RIDGE + 5.1 + + -13.831,-25.807,0 + + + + M 5.1 - 2012 Aug 4, SOUTHERN SUMATRA, INDONESIA + 5.1 + + 100.471,-1.758,0 + + + + M 5.1 - 2012 Aug 4, EAST OF NORTH ISLAND, N.Z. + 5.1 + + -179.752,-35.779,0 + + + + M 5.1 - 2012 Aug 6, SOUTHWEST OF AFRICA + 5.1 + + 13.771,-52.261,0 + + + + M 5.1 - 2012 Aug 10, NIAS REGION, INDONESIA + 5.1 + + 96.965,1.901,0 + + + + M 5.1 - 2012 Aug 11, SOUTHERN XINJIANG, CHINA + 5.1 + + 78.154,39.963,0 + + + + M 5.1 - 2012 Aug 11, NORTHWESTERN IRAN + 5.1 + + 46.759,38.482,0 + + + + M 5.1 - 2012 Aug 14, NORTHWESTERN IRAN + 5.1 + + 46.79,38.45,0 + + + + M 5.1 - 2012 Aug 16, CENTRAL MID-ATLANTIC RIDGE + 5.1 + + -18.759,-0.269,0 + + + + M 5.1 - 2012 Aug 20, NEAR EAST COAST OF HONSHU, JAPAN + 5.1 + + 141.323,36.927,0 + + + + M 5.1 - 2012 Aug 21, SOUTHWEST OF SUMATRA, INDONESIA + 5.1 + + 92.008,-0.177,0 + + + + M 5.1 - 2012 Aug 22, TONGA + 5.1 + + -173.661,-20.038,0 + + + + M 5.1 - 2012 Aug 27, OFFSHORE EL SALVADOR + 5.1 + + -88.399,12.76,0 + + + + M 5.1 - 2012 Aug 27, NEAR COAST OF NICARAGUA + 5.1 + + -88.282,12.172,0 + + + + M 5.1 - 2012 Aug 29, VANUATU + 5.1 + + 168.334,-17.61,0 + + + + M 5.1 - 2012 Aug 30, KEPULAUAN BARAT DAYA, INDONESIA + 5.1 + + 128.647,-7.806,0 + + + + M 5.1 - 2012 Aug 31, PHILIPPINE ISLANDS REGION + 5.1 + + 126.705,11.026,0 + + + + M 5.1 - 2012 Aug 31, SOUTH SANDWICH ISLANDS REGION + 5.1 + + -27.493,-55.804,0 + + + + M 5.1 - 2012 Aug 31, PHILIPPINE ISLANDS REGION + 5.1 + + 126.867,10.977,0 + + + + M 5.1 - 2012 Sep 1, NORTHERN COLOMBIA + 5.1 + + -72.919,6.719,0 + + + + M 5.1 - 2012 Sep 2, EASTERN IRAN + 5.1 + + 59.897,33.474,0 + + + + M 5.1 - 2012 Sep 3, PHILIPPINE ISLANDS REGION + 5.1 + + 126.393,10.338,0 + + + + M 5.1 - 2012 Sep 5, TAIWAN REGION + 5.1 + + 122.341,24.026,0 + + + + M 5.1 - 2012 Sep 5, GULF OF ADEN + 5.1 + + 46.238,12.084,0 + + + + M 5.1 - 2012 Sep 8, MOLUCCA SEA + 5.1 + + 126.691,2.387,0 + + + + M 5.1 - 2012 Sep 9, KURIL ISLANDS + 5.1 + + 151.322,45.291,0 + + + + M 5.1 - 2012 Sep 10, KEPULAUAN TALAUD, INDONESIA + 5.1 + + 126.132,3.999,0 + + + + M 5.1 - 2012 Sep 11, SAN JUAN, ARGENTINA + 5.1 + + -68.35,-31.875,0 + + + + M 5.1 - 2012 Sep 12, HINDU KUSH REGION, AFGHANISTAN + 5.1 + + 71.442,36.697,0 + + + + M 5.1 - 2012 Sep 13, SOUTH OF JAVA, INDONESIA + 5.1 + + 113.98,-10.901,0 + + + + M 5.1 - 2012 Sep 13, NORTH OF SEVERNAYA ZEMLYA + 5.1 + + 116.863,82.899,0 + + + + M 5.1 - 2012 Sep 14, SOUTHERN MID-ATLANTIC RIDGE + 5.1 + + -16.021,-39.644,0 + + + + M 5.1 - 2012 Sep 15, SAMAR, PHILIPPINES + 5.1 + + 125.524,12.532,0 + + + + M 5.1 - 2012 Sep 18, KODIAK ISLAND REGION, ALASKA + 5.1 + + -154.142,56.937,0 + + + + M 5.1 - 2012 Sep 20, NEW BRITAIN REGION, P.N.G. + 5.1 + + 149.845,-5.691,0 + + + + M 5.1 - 2012 Sep 20, OFF EAST COAST OF HONSHU, JAPAN + 5.1 + + 143.344,39.607,0 + + + + M 5.1 - 2012 Sep 22, SAKHALIN, RUSSIA + 5.1 + + 141.915,46.078,0 + + + + M 5.1 - 2012 Sep 24, MINDANAO, PHILIPPINES + 5.1 + + 126.54,5.629,0 + + + + M 5.1 - 2012 Sep 26, TONGA + 5.1 + + -174.328,-21.205,0 + + + + M 5.1 - 2012 Sep 29, LA PAZ, BOLIVIA + 5.1 + + -69.405,-17.182,0 + + + + M 5.1 - 2012 Oct 1, NEAR EAST COAST OF HONSHU, JAPAN + 5.1 + + 141.028,36.916,0 + + + + M 5.1 - 2012 Oct 2, TONGA + 5.1 + + -174.407,-21.155,0 + + + + M 5.1 - 2012 Oct 4, MINDORO, PHILIPPINES + 5.1 + + 120.664,13.249,0 + + + + M 5.1 - 2012 Oct 9, NEAR N COAST OF PAPUA, INDONESIA + 5.1 + + 139.107,-2.706,0 + + + + M 5.1 - 2012 Oct 11, SOUTH SANDWICH ISLANDS REGION + 5.1 + + -25.71,-56.316,0 + + + + M 5.1 - 2012 Oct 13, SOLOMON ISLANDS + 5.1 + + 162.831,-11.106,0 + + + + M 5.1 - 2012 Oct 13, TONGA + 5.1 + + -173.991,-19.963,0 + + + + M 5.1 - 2012 Oct 13, TONGA + 5.1 + + -174.479,-16.886,0 + + + + M 5.1 - 2012 Oct 14, KURIL ISLANDS + 5.1 + + 154.429,48.345,0 + + + + M 5.1 - 2012 Oct 14, HINDU KUSH REGION, AFGHANISTAN + 5.1 + + 69.216,36.167,0 + + + + M 5.1 - 2012 Oct 14, SOLOMON ISLANDS + 5.1 + + 161.415,-10.271,0 + + + + M 5.1 - 2012 Oct 15, OFF EAST COAST OF KAMCHATKA + 5.1 + + 159.519,51.81,0 + + + + M 5.1 - 2012 Oct 18, FLORES REGION, INDONESIA + 5.1 + + 123.671,-8.059,0 + + + + M 5.1 - 2012 Oct 19, EASTERN MEDITERRANEAN SEA + 5.1 + + 30.978,32.552,0 + + + + M 5.1 - 2012 Oct 19, SOUTH OF FIJI ISLANDS + 5.1 + + 176.649,-21.039,0 + + + + M 5.1 - 2012 Oct 21, OFFSHORE EL SALVADOR + 5.1 + + -88.332,12.59,0 + + + + M 5.1 - 2012 Oct 22, FED. STATES OF MICRONESIA REGION + 5.1 + + 147.678,2.893,0 + + + + M 5.1 - 2012 Oct 23, ANTOFAGASTA, CHILE + 5.1 + + -70.55,-25.767,0 + + + + M 5.1 - 2012 Oct 23, EASTERN NEW GUINEA REG., P.N.G. + 5.1 + + 147.873,-6.579,0 + + + + M 5.1 - 2012 Oct 26, SANTA CRUZ ISLANDS + 5.1 + + 165.484,-11.58,0 + + + + M 5.1 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION + 5.1 + + -132.395,52.735,0 + + + + M 5.1 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION + 5.1 + + -132.01,52.243,0 + + + + M 5.1 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION + 5.1 + + -132.478,52.647,0 + + + + M 5.1 - 2012 Oct 29, NEAR N COAST OF PAPUA, INDONESIA + 5.1 + + 132.789,-0.457,0 + + + + M 5.1 - 2012 Oct 30, NEW BRITAIN REGION, P.N.G. + 5.1 + + 151.873,-4.563,0 + + + + M 5.1 - 2012 Oct 30, TONGA + 5.1 + + -174.714,-18.275,0 + + + + M 5.1 - 2012 Nov 1, ANDREANOF ISLANDS, ALEUTIAN IS. + 5.1 + + -179.699,51.011,0 + + + + M 5.1 - 2012 Nov 3, TONGA + 5.1 + + -173.617,-16.662,0 + + + + M 5.1 - 2012 Nov 5, KEPULAUAN SANGIHE, INDONESIA + 5.1 + + 125.144,4.684,0 + + + + M 5.1 - 2012 Nov 7, CENTRAL EAST PACIFIC RISE + 5.1 + + -108.73,-8.962,0 + + + + M 5.1 - 2012 Nov 7, OFFSHORE GUATEMALA + 5.1 + + -92.193,13.967,0 + + + + M 5.1 - 2012 Nov 8, SOUTH INDIAN OCEAN + 5.1 + + 53.497,-36.132,0 + + + + M 5.1 - 2012 Nov 8, VANUATU + 5.1 + + 167.194,-14.663,0 + + + + M 5.1 - 2012 Nov 8, TONGA + 5.1 + + -173.33,-18.807,0 + + + + M 5.1 - 2012 Nov 10, JAVA, INDONESIA + 5.1 + + 106.666,-7.373,0 + + + + M 5.1 - 2012 Nov 10, OFFSHORE GUATEMALA + 5.1 + + -92.224,13.815,0 + + + + M 5.1 - 2012 Nov 11, KURIL ISLANDS + 5.1 + + 155.213,49.357,0 + + + + M 5.1 - 2012 Nov 12, TONGA + 5.1 + + -173.09,-17.631,0 + + + + M 5.1 - 2012 Nov 13, OFF COAST OF ECUADOR + 5.1 + + -81.577,-1.736,0 + + + + M 5.1 - 2012 Nov 13, QUEEN CHARLOTTE ISLANDS REGION + 5.1 + + -132.033,52.705,0 + + + + M 5.1 - 2012 Nov 17, SOUTHEAST OF LOYALTY ISLANDS + 5.1 + + 171.578,-22.278,0 + + + + M 5.1 - 2012 Nov 18, MINDANAO, PHILIPPINES + 5.1 + + 125.809,5.979,0 + + + + M 5.1 - 2012 Nov 19, EAST OF SOUTH SANDWICH ISLANDS + 5.1 + + -18.067,-59.391,0 + + + + M 5.1 - 2012 Nov 19, NEW BRITAIN REGION, P.N.G. + 5.1 + + 151.625,-5.793,0 + + + + M 5.1 - 2012 Nov 19, OFFSHORE O'HIGGINS, CHILE + 5.1 + + -72.17,-33.928,0 + + + + M 5.1 - 2012 Nov 21, OFFSHORE O'HIGGINS, CHILE + 5.1 + + -72.1,-33.931,0 + + + + M 5.1 - 2012 Nov 23, LUZON, PHILIPPINES + 5.1 + + 120.708,14.069,0 + + + + M 5.1 - 2012 Nov 24, NEAR EAST COAST OF HONSHU, JAPAN + 5.1 + + 141.702,38.23,0 + + + + M 5.1 - 2012 Nov 26, PHILIPPINE ISLANDS REGION + 5.1 + + 126.702,10.438,0 + + + + M 5.1 - 2012 Nov 26, ANDAMAN ISLANDS, INDIA REGION + 5.1 + + 93.637,13.85,0 + + + + M 5.1 - 2012 Nov 27, KURIL ISLANDS + 5.1 + + 154.943,48.17,0 + + + + M 5.1 - 2012 Nov 27, SOUTH SANDWICH ISLANDS REGION + 5.1 + + -27.281,-56.082,0 + + + + M 5.1 - 2012 Nov 28, BONIN ISLANDS, JAPAN REGION + 5.1 + + 143.194,27.243,0 + + + + M 5.1 - 2012 Nov 29, FIJI REGION + 5.1 + + -178.772,-21.106,0 + + + + M 5.1 - 2012 Dec 2, OFF COAST OF CENTRAL AMERICA + 5.1 + + -88.988,11.852,0 + + + + M 5.1 - 2012 Dec 2, TONGA + 5.1 + + -174.214,-20.69,0 + + + + M 5.1 - 2012 Dec 5, FIJI REGION + 5.1 + + -178.95,-20.781,0 + + + + M 5.1 - 2012 Dec 6, OFF W COAST OF NORTHERN SUMATRA + 5.1 + + 90.434,2.421,0 + + + + M 5.1 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN + 5.1 + + 143.633,37.813,0 + + + + M 5.1 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN + 5.1 + + 143.771,37.654,0 + + + + M 5.1 - 2012 Dec 8, NEAR S COAST OF NEW GUINEA, PNG. + 5.1 + + 144.006,-7.235,0 + + + + M 5.1 - 2012 Dec 8, TAIWAN REGION + 5.1 + + 122.35,25.748,0 + + + + M 5.1 - 2012 Dec 9, OFF EAST COAST OF HONSHU, JAPAN + 5.1 + + 143.617,37.744,0 + + + + M 5.1 - 2012 Dec 11, OFF EAST COAST OF HONSHU, JAPAN + 5.1 + + 143.833,37.633,0 + + + + M 5.1 - 2012 Dec 14, OFFSHORE GUATEMALA + 5.1 + + -91.725,13.824,0 + + + + M 5.1 - 2012 Dec 14, NEW IRELAND REGION, P.N.G. + 5.1 + + 153.404,-5.272,0 + + + + M 5.1 - 2012 Dec 15, NEW IRELAND REGION, P.N.G. + 5.1 + + 153.405,-4.893,0 + + + + M 5.1 - 2012 Dec 18, OFFSHORE EL SALVADOR + 5.1 + + -89.978,13.054,0 + + + + M 5.1 - 2012 Dec 18, NEAR EAST COAST OF HONSHU, JAPAN + 5.1 + + 141.917,36.664,0 + + + + M 5.1 - 2012 Dec 22, NORTHERN SUMATRA, INDONESIA + 5.1 + + 94.221,5.169,0 + + + + M 5.1 - 2012 Dec 22, KURIL ISLANDS + 5.1 + + 155.103,49.818,0 + + + + M 5.1 - 2012 Dec 22, BABUYAN ISL REGION, PHILIPPINES + 5.1 + + 121.194,19.061,0 + + + + M 5.1 - 2012 Dec 24, OFFSHORE ATACAMA, CHILE + 5.1 + + -71.494,-29.037,0 + + + + M 5.1 - 2012 Dec 24, KEPULAUAN TALAUD, INDONESIA + 5.1 + + 126.679,4.149,0 + + + + M 5.1 - 2012 Dec 25, SOUTHWEST OF SUMATRA, INDONESIA + 5.1 + + 101.25,-7.893,0 + + + + M 5.1 - 2012 Dec 26, EASTERN NEW GUINEA REG., P.N.G. + 5.1 + + 147.287,-5.914,0 + + + + M 5.1 - 2012 Dec 28, KERMADEC ISLANDS REGION + 5.1 + + -176.245,-29.596,0 + + + + M 5.1 - 2012 Dec 28, KOMANDORSKIYE OSTROVA REGION + 5.1 + + 164.724,55.707,0 + + + + M 5.1 - 2012 Dec 29, BISMARCK SEA + 5.1 + + 148.757,-3.315,0 + + + + M 5.1 - 2012 Dec 31, GUATEMALA + 5.1 + + -92.037,15.031,0 + + + + M 5 - 2012 Jan 1, PACIFIC-ANTARCTIC RIDGE + 5 + + -149.214,-58.259,0 + + + + M 5 - 2012 Jan 1, BOUGAINVILLE REGION, P.N.G. + 5 + + 154.209,-5.413,0 + + + + M 5 - 2012 Jan 4, RYUKYU ISLANDS, JAPAN + 5 + + 130.221,27.917,0 + + + + M 5 - 2012 Jan 4, TONGA + 5 + + -174.671,-15.552,0 + + + + M 5 - 2012 Jan 4, TONGA + 5 + + -174.663,-15.14,0 + + + + M 5 - 2012 Jan 5, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 142.197,38.714,0 + + + + M 5 - 2012 Jan 6, OFF COAST OF ARAUCANIA, CHILE + 5 + + -75.091,-38.024,0 + + + + M 5 - 2012 Jan 6, BONIN ISLANDS, JAPAN REGION + 5 + + 143.559,26.944,0 + + + + M 5 - 2012 Jan 6, SOUTHERN ALASKA + 5 + + -153.232,59.852,0 + + + + M 5 - 2012 Jan 7, PAPUA, INDONESIA + 5 + + 138.055,-3.752,0 + + + + M 5 - 2012 Jan 7, NEW BRITAIN REGION, P.N.G. + 5 + + 152.594,-4.329,0 + + + + M 5 - 2012 Jan 7, BABUYAN ISL REGION, PHILIPPINES + 5 + + 121.191,19.254,0 + + + + M 5 - 2012 Jan 7, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 142.073,36.063,0 + + + + M 5 - 2012 Jan 8, NORTHERN XINJIANG, CHINA + 5 + + 87.474,42.203,0 + + + + M 5 - 2012 Jan 8, SOUTH OF FIJI ISLANDS + 5 + + -179.895,-23.337,0 + + + + M 5 - 2012 Jan 9, KERMADEC ISLANDS REGION + 5 + + -176.09,-29.512,0 + + + + M 5 - 2012 Jan 9, SANTA CRUZ ISLANDS + 5 + + 165.105,-10.516,0 + + + + M 5 - 2012 Jan 9, NEAR N COAST OF PAPUA, INDONESIA + 5 + + 133.064,-0.814,0 + + + + M 5 - 2012 Jan 10, NEAR COAST OF ECUADOR + 5 + + -80.28,-0.74,0 + + + + M 5 - 2012 Jan 12, MINDANAO, PHILIPPINES + 5 + + 125.918,8.432,0 + + + + M 5 - 2012 Jan 12, SOUTH OF AFRICA + 5 + + 23.53,-53.252,0 + + + + M 5 - 2012 Jan 12, SOUTH OF AFRICA + 5 + + 23.746,-53.209,0 + + + + M 5 - 2012 Jan 12, TONGA REGION + 5 + + -172.393,-17.989,0 + + + + M 5 - 2012 Jan 12, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 141.895,36.672,0 + + + + M 5 - 2012 Jan 12, TONGA REGION + 5 + + -172.531,-17.822,0 + + + + M 5 - 2012 Jan 13, SANTA CRUZ ISLANDS + 5 + + 165.262,-10.52,0 + + + + M 5 - 2012 Jan 13, SOUTH SANDWICH ISLANDS REGION + 5 + + -27.208,-60.597,0 + + + + M 5 - 2012 Jan 13, HINDU KUSH REGION, AFGHANISTAN + 5 + + 70.512,36.009,0 + + + + M 5 - 2012 Jan 14, SOUTH SANDWICH ISLANDS REGION + 5 + + -26.086,-60.695,0 + + + + M 5 - 2012 Jan 16, SOUTH SANDWICH ISLANDS REGION + 5 + + -24.981,-56.754,0 + + + + M 5 - 2012 Jan 16, NORTH OF ASCENSION ISLAND + 5 + + -12.601,-2.114,0 + + + + M 5 - 2012 Jan 16, TONGA REGION + 5 + + -172.909,-19.289,0 + + + + M 5 - 2012 Jan 17, MINDANAO, PHILIPPINES + 5 + + 125.972,6.516,0 + + + + M 5 - 2012 Jan 18, SAN JUAN, ARGENTINA + 5 + + -68.084,-31.767,0 + + + + M 5 - 2012 Jan 19, DOMINICAN REPUBLIC REGION + 5 + + -68.755,18.058,0 + + + + M 5 - 2012 Jan 19, TONGA REGION + 5 + + -172.416,-17.898,0 + + + + M 5 - 2012 Jan 21, BALLENY ISLANDS REGION + 5 + + 177.584,-65.042,0 + + + + M 5 - 2012 Jan 21, MARIANA ISLANDS REGION + 5 + + 147.034,19.727,0 + + + + M 5 - 2012 Jan 22, ATACAMA, CHILE + 5 + + -71.03,-28.682,0 + + + + M 5 - 2012 Jan 23, OFFSHORE BIO-BIO, CHILE + 5 + + -73.486,-36.424,0 + + + + M 5 - 2012 Jan 23, OFFSHORE BIO-BIO, CHILE + 5 + + -73.031,-36.338,0 + + + + M 5 - 2012 Jan 25, NEAR WEST COAST OF COLOMBIA + 5 + + -77.505,5.519,0 + + + + M 5 - 2012 Jan 25, NEW BRITAIN REGION, P.N.G. + 5 + + 153.487,-6.802,0 + + + + M 5 - 2012 Jan 26, KEPULAUAN BABAR, INDONESIA + 5 + + 129.935,-7.1,0 + + + + M 5 - 2012 Jan 27, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 143.891,37.904,0 + + + + M 5 - 2012 Jan 27, NORTHERN ITALY + 5 + + 10.03,44.48,0 + + + + M 5 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND + 5 + + -177.077,-29.52,0 + + + + M 5 - 2012 Jan 28, KERMADEC ISLANDS REGION + 5 + + -176.893,-29.505,0 + + + + M 5 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND + 5 + + -177.036,-29.554,0 + + + + M 5 - 2012 Jan 29, NORTHERN MID-ATLANTIC RIDGE + 5 + + -46.467,16.624,0 + + + + M 5 - 2012 Jan 31, KERMADEC ISLANDS, NEW ZEALAND + 5 + + -177.843,-30.699,0 + + + + M 5 - 2012 Feb 1, SAMAR, PHILIPPINES + 5 + + 125.615,11.61,0 + + + + M 5 - 2012 Feb 2, WEST OF MACQUARIE ISLAND + 5 + + 153.349,-60.843,0 + + + + M 5 - 2012 Feb 2, NEW IRELAND REGION, P.N.G. + 5 + + 153.638,-5.341,0 + + + + M 5 - 2012 Feb 2, VANUATU + 5 + + 167.248,-17.783,0 + + + + M 5 - 2012 Feb 2, VANUATU + 5 + + 167.126,-17.933,0 + + + + M 5 - 2012 Feb 2, VANUATU + 5 + + 167.413,-17.858,0 + + + + M 5 - 2012 Feb 2, VANUATU + 5 + + 167.108,-17.433,0 + + + + M 5 - 2012 Feb 2, VANUATU + 5 + + 167.198,-17.899,0 + + + + M 5 - 2012 Feb 2, VANUATU + 5 + + 167.648,-18.2,0 + + + + M 5 - 2012 Feb 2, VANUATU + 5 + + 167.327,-17.529,0 + + + + M 5 - 2012 Feb 2, VANUATU + 5 + + 167.791,-18.011,0 + + + + M 5 - 2012 Feb 3, NEW BRITAIN REGION, P.N.G. + 5 + + 149.939,-6.644,0 + + + + M 5 - 2012 Feb 3, TONGA + 5 + + -174.83,-19.49,0 + + + + M 5 - 2012 Feb 4, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 141.869,37.343,0 + + + + M 5 - 2012 Feb 4, VANUATU + 5 + + 167.423,-18.026,0 + + + + M 5 - 2012 Feb 5, SOUTHERN IRAN + 5 + + 51.488,28.59,0 + + + + M 5 - 2012 Feb 6, NEGROS- CEBU REG, PHILIPPINES + 5 + + 123.356,10.019,0 + + + + M 5 - 2012 Feb 7, NEGROS- CEBU REG, PHILIPPINES + 5 + + 123.595,10.108,0 + + + + M 5 - 2012 Feb 7, HOKKAIDO, JAPAN REGION + 5 + + 142.219,45.559,0 + + + + M 5 - 2012 Feb 7, BABUYAN ISL REGION, PHILIPPINES + 5 + + 121.5,19.684,0 + + + + M 5 - 2012 Feb 8, NEGROS- CEBU REG, PHILIPPINES + 5 + + 123.183,9.839,0 + + + + M 5 - 2012 Feb 9, VANUATU + 5 + + 167.545,-15.325,0 + + + + M 5 - 2012 Feb 11, NEGROS- CEBU REG, PHILIPPINES + 5 + + 123.264,10.071,0 + + + + M 5 - 2012 Feb 12, NEAR COAST OF SOUTHERN PERU + 5 + + -74.157,-15.64,0 + + + + M 5 - 2012 Feb 12, ASCENSION ISLAND REGION + 5 + + -13.051,-7.074,0 + + + + M 5 - 2012 Feb 13, MOZAMBIQUE + 5 + + 40.891,-13.928,0 + + + + M 5 - 2012 Feb 13, VANUATU + 5 + + 167.233,-17.552,0 + + + + M 5 - 2012 Feb 13, SOUTH OF KERMADEC ISLANDS + 5 + + -178.703,-33.982,0 + + + + M 5 - 2012 Feb 14, CENTRAL MID-ATLANTIC RIDGE + 5 + + -25.357,0.599,0 + + + + M 5 - 2012 Feb 14, VANUATU + 5 + + 167.153,-18.038,0 + + + + M 5 - 2012 Feb 15, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 141.475,37.803,0 + + + + M 5 - 2012 Feb 15, NICOBAR ISLANDS, INDIA REGION + 5 + + 92.9,6.306,0 + + + + M 5 - 2012 Feb 16, NEW BRITAIN REGION, P.N.G. + 5 + + 152.193,-5.697,0 + + + + M 5 - 2012 Feb 17, VANUATU + 5 + + 166.829,-14.824,0 + + + + M 5 - 2012 Feb 18, OFFSHORE OAXACA, MEXICO + 5 + + -95.67,15.264,0 + + + + M 5 - 2012 Feb 18, MOLUCCA SEA + 5 + + 126.909,2.446,0 + + + + M 5 - 2012 Feb 19, NORTH ISLAND OF NEW ZEALAND + 5 + + 174.124,-39.382,0 + + + + M 5 - 2012 Feb 19, CROZET ISLANDS REGION + 5 + + 44.553,-41.015,0 + + + + M 5 - 2012 Feb 19, FIJI REGION + 5 + + -178.639,-17.861,0 + + + + M 5 - 2012 Feb 20, KASHMIR-XINJIANG BORDER REGION + 5 + + 79.717,35.723,0 + + + + M 5 - 2012 Feb 20, KASHMIR-XINJIANG BORDER REGION + 5 + + 79.835,35.84,0 + + + + M 5 - 2012 Feb 20, NEW BRITAIN REGION, P.N.G. + 5 + + 151.4,-4.792,0 + + + + M 5 - 2012 Feb 22, TONGA + 5 + + -173.294,-17.463,0 + + + + M 5 - 2012 Feb 23, FIJI REGION + 5 + + -178.761,-20.57,0 + + + + M 5 - 2012 Feb 24, TONGA + 5 + + -174.264,-15.206,0 + + + + M 5 - 2012 Feb 24, MINDANAO, PHILIPPINES + 5 + + 125.955,9.958,0 + + + + M 5 - 2012 Feb 24, SOUTHERN SUMATRA, INDONESIA + 5 + + 103.103,-4.695,0 + + + + M 5 - 2012 Feb 26, SOUTH OF FIJI ISLANDS + 5 + + -177.234,-24.739,0 + + + + M 5 - 2012 Feb 26, SOUTH OF FIJI ISLANDS + 5 + + -177.459,-24.796,0 + + + + M 5 - 2012 Feb 26, FIJI REGION + 5 + + -178.48,-18.036,0 + + + + M 5 - 2012 Feb 27, BOUGAINVILLE REGION, P.N.G. + 5 + + 154.871,-6.535,0 + + + + M 5 - 2012 Feb 27, SOUTH OF FIJI ISLANDS + 5 + + -177.122,-24.734,0 + + + + M 5 - 2012 Feb 27, KURIL ISLANDS + 5 + + 155.843,49.272,0 + + + + M 5 - 2012 Feb 27, RYUKYU ISLANDS, JAPAN + 5 + + 127.182,25.511,0 + + + + M 5 - 2012 Feb 28, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 141.023,36.373,0 + + + + M 5 - 2012 Feb 28, KURIL ISLANDS + 5 + + 156.127,49.115,0 + + + + M 5 - 2012 Feb 28, TONGA REGION + 5 + + -175.419,-22.084,0 + + + + M 5 - 2012 Feb 29, KURIL ISLANDS + 5 + + 156.2,49.282,0 + + + + M 5 - 2012 Feb 29, VANUATU + 5 + + 167.399,-17.794,0 + + + + M 5 - 2012 Mar 1, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 144.154,37.21,0 + + + + M 5 - 2012 Mar 2, EASTERN NEW GUINEA REG., P.N.G. + 5 + + 146.483,-7.956,0 + + + + M 5 - 2012 Mar 2, BALLENY ISLANDS REGION + 5 + + 176.623,-64.822,0 + + + + M 5 - 2012 Mar 2, SOUTHERN XINJIANG, CHINA + 5 + + 74.38,39.75,0 + + + + M 5 - 2012 Mar 2, HALMAHERA, INDONESIA + 5 + + 127.077,1.809,0 + + + + M 5 - 2012 Mar 3, SOUTHEAST OF LOYALTY ISLANDS + 5 + + 170.341,-22.089,0 + + + + M 5 - 2012 Mar 3, SOUTH OF FIJI ISLANDS + 5 + + -177.066,-23.934,0 + + + + M 5 - 2012 Mar 3, OFFSHORE MAULE, CHILE + 5 + + -72.8,-35.749,0 + + + + M 5 - 2012 Mar 4, ANTOFAGASTA, CHILE + 5 + + -69.848,-21.554,0 + + + + M 5 - 2012 Mar 5, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 142.389,40.167,0 + + + + M 5 - 2012 Mar 6, NICOBAR ISLANDS, INDIA REGION + 5 + + 93.873,8.559,0 + + + + M 5 - 2012 Mar 9, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 142.033,35.642,0 + + + + M 5 - 2012 Mar 11, SOUTH OF FIJI ISLANDS + 5 + + -176.949,-24.921,0 + + + + M 5 - 2012 Mar 11, VOLCANO ISLANDS, JAPAN REGION + 5 + + 143.579,23.718,0 + + + + M 5 - 2012 Mar 13, COMOROS REGION + 5 + + 43.286,-10.923,0 + + + + M 5 - 2012 Mar 13, SOUTH OF FIJI ISLANDS + 5 + + 179.981,-23.734,0 + + + + M 5 - 2012 Mar 14, ANDAMAN ISLANDS, INDIA REGION + 5 + + 93.854,10.535,0 + + + + M 5 - 2012 Mar 16, SOUTHEAST OF LOYALTY ISLANDS + 5 + + 171.119,-22.507,0 + + + + M 5 - 2012 Mar 19, NEW BRITAIN REGION, P.N.G. + 5 + + 152.963,-4.585,0 + + + + M 5 - 2012 Mar 20, VANUATU + 5 + + 169.33,-19.684,0 + + + + M 5 - 2012 Mar 20, OFFSHORE GUERRERO, MEXICO + 5 + + -98.694,16.273,0 + + + + M 5 - 2012 Mar 21, GUERRERO, MEXICO + 5 + + -98.504,16.511,0 + + + + M 5 - 2012 Mar 22, VANUATU + 5 + + 167.526,-15.188,0 + + + + M 5 - 2012 Mar 22, TONGA + 5 + + -174.449,-21.355,0 + + + + M 5 - 2012 Mar 23, TONGA + 5 + + -174.263,-16.261,0 + + + + M 5 - 2012 Mar 24, VALPARAISO, CHILE + 5 + + -71.063,-33.052,0 + + + + M 5 - 2012 Mar 25, VANUATU + 5 + + 168.75,-19.108,0 + + + + M 5 - 2012 Mar 26, EASTERN TURKEY + 5 + + 42.33,39.171,0 + + + + M 5 - 2012 Mar 26, NORTHERN EAST PACIFIC RISE + 5 + + -104.337,10.001,0 + + + + M 5 - 2012 Mar 27, NEPAL-INDIA BORDER REGION + 5 + + 87.777,26.087,0 + + + + M 5 - 2012 Mar 30, SOUTHEAST OF EASTER ISLAND + 5 + + -101.463,-35.843,0 + + + + M 5 - 2012 Mar 30, FIJI REGION + 5 + + -178.97,-21.177,0 + + + + M 5 - 2012 Apr 2, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 142.813,37.937,0 + + + + M 5 - 2012 Apr 2, OFFSHORE GUERRERO, MEXICO + 5 + + -98.572,16.281,0 + + + + M 5 - 2012 Apr 3, OFFSHORE O'HIGGINS, CHILE + 5 + + -72.757,-33.847,0 + + + + M 5 - 2012 Apr 3, KEPULAUAN BARAT DAYA, INDONESIA + 5 + + 125.367,-7.035,0 + + + + M 5 - 2012 Apr 6, TONGA + 5 + + -174.414,-21.281,0 + + + + M 5 - 2012 Apr 7, CENTRAL MID-ATLANTIC RIDGE + 5 + + -28.091,1.053,0 + + + + M 5 - 2012 Apr 11, BANDA SEA + 5 + + 130.261,-6.236,0 + + + + M 5 - 2012 Apr 11, NORTH INDIAN OCEAN + 5 + + 91.923,0.916,0 + + + + M 5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5 + + 92.726,2.668,0 + + + + M 5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5 + + 90.78,4.601,0 + + + + M 5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5 + + 92.287,2.539,0 + + + + M 5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA + 5 + + 92.311,1.269,0 + + + + M 5 - 2012 Apr 12, NORTH INDIAN OCEAN + 5 + + 91.754,1.301,0 + + + + M 5 - 2012 Apr 12, NORTH INDIAN OCEAN + 5 + + 91.717,1.172,0 + + + + M 5 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA + 5 + + 93.9,1.983,0 + + + + M 5 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA + 5 + + 93.746,3.279,0 + + + + M 5 - 2012 Apr 13, VANUATU + 5 + + 168.086,-18.25,0 + + + + M 5 - 2012 Apr 13, NORTH INDIAN OCEAN + 5 + + 89.705,2.653,0 + + + + M 5 - 2012 Apr 13, OFFSHORE OAXACA, MEXICO + 5 + + -98.145,16.207,0 + + + + M 5 - 2012 Apr 14, OFF W COAST OF NORTHERN SUMATRA + 5 + + 94.079,2.835,0 + + + + M 5 - 2012 Apr 14, WEST CHILE RISE + 5 + + -97.183,-36.3,0 + + + + M 5 - 2012 Apr 16, NORTH ISLAND OF NEW ZEALAND + 5 + + 175.805,-38.556,0 + + + + M 5 - 2012 Apr 16, MID-INDIAN RIDGE + 5 + + 78.876,-36.534,0 + + + + M 5 - 2012 Apr 17, OFF W COAST OF NORTHERN SUMATRA + 5 + + 92.61,2.584,0 + + + + M 5 - 2012 Apr 18, VANUATU + 5 + + 167.052,-13.288,0 + + + + M 5 - 2012 Apr 18, OFF W COAST OF NORTHERN SUMATRA + 5 + + 92.541,3.329,0 + + + + M 5 - 2012 Apr 18, OFF W COAST OF NORTHERN SUMATRA + 5 + + 92.766,3.586,0 + + + + M 5 - 2012 Apr 19, TAIWAN + 5 + + 121.67,24.13,0 + + + + M 5 - 2012 Apr 19, NEAR N COAST OF PAPUA, INDONESIA + 5 + + 134.492,-1.677,0 + + + + M 5 - 2012 Apr 20, IRAN-IRAQ BORDER REGION + 5 + + 46.99,32.453,0 + + + + M 5 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA + 5 + + 91.901,2.564,0 + + + + M 5 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA + 5 + + 92.334,2.025,0 + + + + M 5 - 2012 Apr 20, VOLCANO ISLANDS, JAPAN REGION + 5 + + 142.688,25.447,0 + + + + M 5 - 2012 Apr 20, TONGA + 5 + + -173.594,-17.617,0 + + + + M 5 - 2012 Apr 21, IRAN-IRAQ BORDER REGION + 5 + + 47.049,32.407,0 + + + + M 5 - 2012 Apr 23, SOUTH SANDWICH ISLANDS REGION + 5 + + -27.674,-55.517,0 + + + + M 5 - 2012 Apr 23, TONGA + 5 + + -175.17,-17.966,0 + + + + M 5 - 2012 Apr 23, SOUTH OF TONGA + 5 + + -175.934,-24.007,0 + + + + M 5 - 2012 Apr 24, TONGA REGION + 5 + + -175.999,-23.785,0 + + + + M 5 - 2012 Apr 25, NEW BRITAIN REGION, P.N.G. + 5 + + 151.694,-4.114,0 + + + + M 5 - 2012 Apr 26, FIJI REGION + 5 + + -177.879,-18.802,0 + + + + M 5 - 2012 Apr 28, SOUTHWEST INDIAN RIDGE + 5 + + 43.501,-40.999,0 + + + + M 5 - 2012 Apr 30, SOUTH OF JAVA, INDONESIA + 5 + + 105.422,-8.354,0 + + + + M 5 - 2012 Apr 30, KEPULAUAN TALAUD, INDONESIA + 5 + + 127.507,3.712,0 + + + + M 5 - 2012 Apr 30, KERMADEC ISLANDS REGION + 5 + + -176.231,-30.038,0 + + + + M 5 - 2012 Apr 30, OFF W COAST OF NORTHERN SUMATRA + 5 + + 92.962,3.314,0 + + + + M 5 - 2012 May 2, NORTHERN MID-ATLANTIC RIDGE + 5 + + -44.95,23.352,0 + + + + M 5 - 2012 May 2, TONGA REGION + 5 + + -175.668,-23.551,0 + + + + M 5 - 2012 May 3, KURIL ISLANDS + 5 + + 150.557,46.903,0 + + + + M 5 - 2012 May 4, VANCOUVER ISLAND, CANADA REGION + 5 + + -130.241,50.648,0 + + + + M 5 - 2012 May 7, TONGA + 5 + + -173.659,-15.169,0 + + + + M 5 - 2012 May 8, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 144.644,37.364,0 + + + + M 5 - 2012 May 11, GANSU-QINGHAI BORDER REG, CHINA + 5 + + 102.048,37.735,0 + + + + M 5 - 2012 May 14, ANDREANOF ISLANDS, ALEUTIAN IS. + 5 + + -174.832,51.445,0 + + + + M 5 - 2012 May 14, MOLUCCA SEA + 5 + + 126.338,1.29,0 + + + + M 5 - 2012 May 17, SANTA CRUZ ISLANDS + 5 + + 166.185,-12.596,0 + + + + M 5 - 2012 May 18, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 143.178,39.646,0 + + + + M 5 - 2012 May 19, NORTH OF HALMAHERA, INDONESIA + 5 + + 128.118,3.304,0 + + + + M 5 - 2012 May 19, FOX ISLANDS, ALEUTIAN ISLANDS + 5 + + -171.728,52.068,0 + + + + M 5 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 143.116,39.543,0 + + + + M 5 - 2012 May 20, NORTHERN ITALY + 5 + + 11.49,44.831,0 + + + + M 5 - 2012 May 24, EASTERN NEW GUINEA REG., P.N.G. + 5 + + 147.114,-7.33,0 + + + + M 5 - 2012 May 25, NORWEGIAN SEA + 5 + + 5.518,72.939,0 + + + + M 5 - 2012 May 25, SOUTH ISLAND OF NEW ZEALAND + 5 + + 172.81,-43.473,0 + + + + M 5 - 2012 May 25, SOUTH OF KERMADEC ISLANDS + 5 + + -178.46,-33.075,0 + + + + M 5 - 2012 May 25, TONGA + 5 + + -173.763,-19.184,0 + + + + M 5 - 2012 May 26, SOUTHERN SUMATRA, INDONESIA + 5 + + 103.03,-4.9,0 + + + + M 5 - 2012 May 26, KERMADEC ISLANDS, NEW ZEALAND + 5 + + -177.991,-30.825,0 + + + + M 5 - 2012 May 29, FIJI REGION + 5 + + 173.796,-15.524,0 + + + + M 5 - 2012 May 30, BANDA SEA + 5 + + 130.318,-6.199,0 + + + + M 5 - 2012 May 30, STATE OF YAP, MICRONESIA + 5 + + 139.559,11.271,0 + + + + M 5 - 2012 May 31, TONGA + 5 + + -174.314,-17.683,0 + + + + M 5 - 2012 Jun 3, POTOSI, BOLIVIA + 5 + + -68.026,-21.338,0 + + + + M 5 - 2012 Jun 4, SOUTHEAST OF LOYALTY ISLANDS + 5 + + 169.134,-21.941,0 + + + + M 5 - 2012 Jun 4, HALMAHERA, INDONESIA + 5 + + 127.699,-0.677,0 + + + + M 5 - 2012 Jun 6, MOLUCCA SEA + 5 + + 126.905,-0.953,0 + + + + M 5 - 2012 Jun 6, KERMADEC ISLANDS REGION + 5 + + -177.441,-27.034,0 + + + + M 5 - 2012 Jun 7, TONGA REGION + 5 + + -174.717,-22.91,0 + + + + M 5 - 2012 Jun 7, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 143.295,39.875,0 + + + + M 5 - 2012 Jun 7, MAULE, CHILE + 5 + + -71.075,-36.036,0 + + + + M 5 - 2012 Jun 8, SOUTHERN IRAN + 5 + + 50.705,29.784,0 + + + + M 5 - 2012 Jun 9, OFF EAST COAST OF KAMCHATKA + 5 + + 159.206,51.698,0 + + + + M 5 - 2012 Jun 9, SOUTH SANDWICH ISLANDS REGION + 5 + + -23.239,-60.883,0 + + + + M 5 - 2012 Jun 10, PAGAN REG., N. MARIANA ISLANDS + 5 + + 145.616,18.689,0 + + + + M 5 - 2012 Jun 14, TONGA + 5 + + -174.161,-17.111,0 + + + + M 5 - 2012 Jun 17, TAIWAN + 5 + + 121.574,23.647,0 + + + + M 5 - 2012 Jun 18, AZORES ISLANDS REGION + 5 + + -29.151,41.84,0 + + + + M 5 - 2012 Jun 18, NORTH OF FRANZ JOSEF LAND + 5 + + 41.025,86.386,0 + + + + M 5 - 2012 Jun 19, FIJI REGION + 5 + + -178.624,-20.552,0 + + + + M 5 - 2012 Jun 19, GUJARAT, INDIA + 5 + + 70.252,23.647,0 + + + + M 5 - 2012 Jun 21, HALMAHERA, INDONESIA + 5 + + 128.278,2.7,0 + + + + M 5 - 2012 Jun 22, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 143.492,39.369,0 + + + + M 5 - 2012 Jun 23, ANDREANOF ISLANDS, ALEUTIAN IS. + 5 + + -177.666,51.242,0 + + + + M 5 - 2012 Jun 25, KERMADEC ISLANDS REGION + 5 + + -177.878,-27.424,0 + + + + M 5 - 2012 Jun 25, DODECANESE ISLANDS, GREECE + 5 + + 28.941,36.439,0 + + + + M 5 - 2012 Jun 26, FIJI REGION + 5 + + -176.697,-21.926,0 + + + + M 5 - 2012 Jun 27, TONGA + 5 + + -173.408,-15.132,0 + + + + M 5 - 2012 Jun 29, NEW BRITAIN REGION, P.N.G. + 5 + + 152.342,-4.937,0 + + + + M 5 - 2012 Jul 1, CENTRAL IRAN + 5 + + 51.02,31.841,0 + + + + M 5 - 2012 Jul 4, ST. MARTIN REGION, LEEWARD ISL. + 5 + + -62.983,18.12,0 + + + + M 5 - 2012 Jul 5, IZU ISLANDS, JAPAN REGION + 5 + + 141.64,32.284,0 + + + + M 5 - 2012 Jul 6, ISLA CHILOE, LOS LAGOS, CHILE + 5 + + -74.015,-42.646,0 + + + + M 5 - 2012 Jul 7, KEP. MENTAWAI REGION, INDONESIA + 5 + + 100.591,-3.638,0 + + + + M 5 - 2012 Jul 7, PACIFIC-ANTARCTIC RIDGE + 5 + + -150.669,-59.52,0 + + + + M 5 - 2012 Jul 7, MAURITIUS - REUNION REGION + 5 + + 66.882,-17.083,0 + + + + M 5 - 2012 Jul 9, ALAMAGAN REG, N. MARIANA ISLANDS + 5 + + 146.017,17.141,0 + + + + M 5 - 2012 Jul 11, CERAM SEA, INDONESIA + 5 + + 127.378,-2.02,0 + + + + M 5 - 2012 Jul 13, KURIL ISLANDS + 5 + + 151.829,45.255,0 + + + + M 5 - 2012 Jul 14, KURIL ISLANDS + 5 + + 151.878,45.378,0 + + + + M 5 - 2012 Jul 15, CENTRAL PERU + 5 + + -73.796,-13.58,0 + + + + M 5 - 2012 Jul 17, KERMADEC ISLANDS REGION + 5 + + -179.093,-31.283,0 + + + + M 5 - 2012 Jul 20, KEPULAUAN SANGIHE, INDONESIA + 5 + + 125.808,3.395,0 + + + + M 5 - 2012 Jul 21, TONGA + 5 + + -173.39,-15.197,0 + + + + M 5 - 2012 Jul 22, CENTRAL TURKEY + 5 + + 36.384,37.546,0 + + + + M 5 - 2012 Jul 22, NEAR COAST OF NICARAGUA + 5 + + -87.028,11.639,0 + + + + M 5 - 2012 Jul 23, NEAR ISLANDS, ALEUTIAN ISLANDS + 5 + + 172.869,52.016,0 + + + + M 5 - 2012 Jul 23, KERMADEC ISLANDS, NEW ZEALAND + 5 + + -177.465,-30.83,0 + + + + M 5 - 2012 Jul 24, KURIL ISLANDS + 5 + + 151.631,45.464,0 + + + + M 5 - 2012 Jul 24, OFF E. COAST OF N. ISLAND, N.Z. + 5 + + 179.91,-37.776,0 + + + + M 5 - 2012 Jul 25, KYUSHU, JAPAN + 5 + + 130.348,30.981,0 + + + + M 5 - 2012 Jul 25, VANUATU REGION + 5 + + 167.728,-19.297,0 + + + + M 5 - 2012 Jul 25, SOLOMON ISLANDS + 5 + + 159.699,-9.725,0 + + + + M 5 - 2012 Jul 28, NORTH OF SVALBARD + 5 + + -3.97,81.294,0 + + + + M 5 - 2012 Aug 1, SOUTHERN XINJIANG, CHINA + 5 + + 75.556,39.774,0 + + + + M 5 - 2012 Aug 2, SOUTH SHETLAND ISLANDS + 5 + + -58.258,-61.401,0 + + + + M 5 - 2012 Aug 4, SAN JUAN, ARGENTINA + 5 + + -69.358,-31.928,0 + + + + M 5 - 2012 Aug 5, EASTERN XIZANG + 5 + + 94.849,30.352,0 + + + + M 5 - 2012 Aug 5, TURKEY-SYRIA-IRAQ BORDER REGION + 5 + + 42.965,37.421,0 + + + + M 5 - 2012 Aug 6, SOUTHEAST OF LOYALTY ISLANDS + 5 + + 170.39,-21.406,0 + + + + M 5 - 2012 Aug 6, RYUKYU ISLANDS, JAPAN + 5 + + 130.521,29.495,0 + + + + M 5 - 2012 Aug 6, SOUTHWEST OF AFRICA + 5 + + 13.628,-52.29,0 + + + + M 5 - 2012 Aug 10, NEAR COAST OF NICARAGUA + 5 + + -88.17,12.075,0 + + + + M 5 - 2012 Aug 11, NORTHWESTERN IRAN + 5 + + 46.78,38.44,0 + + + + M 5 - 2012 Aug 11, NORTHWESTERN IRAN + 5 + + 46.735,38.436,0 + + + + M 5 - 2012 Aug 16, FIJI REGION + 5 + + -177.856,-18.46,0 + + + + M 5 - 2012 Aug 17, BOUGAINVILLE REGION, P.N.G. + 5 + + 154.53,-6.747,0 + + + + M 5 - 2012 Aug 17, BOUGAINVILLE REGION, P.N.G. + 5 + + 154.525,-6.792,0 + + + + M 5 - 2012 Aug 20, OFF W COAST OF NORTHERN SUMATRA + 5 + + 92.889,3.318,0 + + + + M 5 - 2012 Aug 22, HOKKAIDO, JAPAN REGION + 5 + + 142.86,42.404,0 + + + + M 5 - 2012 Aug 23, NEPAL + 5 + + 82.69,28.47,0 + + + + M 5 - 2012 Aug 26, HALMAHERA, INDONESIA + 5 + + 128.801,2.626,0 + + + + M 5 - 2012 Aug 27, ANTOFAGASTA, CHILE + 5 + + -69.414,-23.739,0 + + + + M 5 - 2012 Aug 27, MOLUCCA SEA + 5 + + 126.835,2.154,0 + + + + M 5 - 2012 Aug 29, VIRGIN ISLANDS REGION + 5 + + -64.324,19.652,0 + + + + M 5 - 2012 Aug 30, OFFSHORE BIO-BIO, CHILE + 5 + + -73.397,-37.199,0 + + + + M 5 - 2012 Aug 31, SOUTH SANDWICH ISLANDS REGION + 5 + + -27.525,-55.789,0 + + + + M 5 - 2012 Aug 31, GALAPAGOS ISLANDS REGION + 5 + + -95.26,2.526,0 + + + + M 5 - 2012 Sep 1, PHILIPPINE ISLANDS REGION + 5 + + 126.845,10.351,0 + + + + M 5 - 2012 Sep 1, PHILIPPINE ISLANDS REGION + 5 + + 126.881,10.356,0 + + + + M 5 - 2012 Sep 1, OFFSHORE ATACAMA, CHILE + 5 + + -71.114,-27.24,0 + + + + M 5 - 2012 Sep 1, NEW GUINEA, PAPUA NEW GUINEA + 5 + + 143.643,-6.531,0 + + + + M 5 - 2012 Sep 3, MORO GULF, MINDANAO, PHILIPPINES + 5 + + 123.861,6.561,0 + + + + M 5 - 2012 Sep 3, ANDREANOF ISLANDS, ALEUTIAN IS. + 5 + + -177.052,51.224,0 + + + + M 5 - 2012 Sep 4, TONGA + 5 + + -175.067,-21.956,0 + + + + M 5 - 2012 Sep 4, SOUTH OF FIJI ISLANDS + 5 + + -179.958,-22.003,0 + + + + M 5 - 2012 Sep 4, SOUTH OF JAVA, INDONESIA + 5 + + 113.962,-10.839,0 + + + + M 5 - 2012 Sep 4, PHILIPPINE ISLANDS REGION + 5 + + 126.772,10.666,0 + + + + M 5 - 2012 Sep 4, TAIWAN REGION + 5 + + 121.135,22.174,0 + + + + M 5 - 2012 Sep 6, SOUTHERN IRAN + 5 + + 53.97,26.96,0 + + + + M 5 - 2012 Sep 6, PHILIPPINE ISLANDS REGION + 5 + + 126.613,10.946,0 + + + + M 5 - 2012 Sep 7, ANTOFAGASTA, CHILE + 5 + + -68.191,-22.351,0 + + + + M 5 - 2012 Sep 7, PHILIPPINE ISLANDS REGION + 5 + + 126.73,10.55,0 + + + + M 5 - 2012 Sep 7, MARIANA ISLANDS REGION + 5 + + 143.322,21.606,0 + + + + M 5 - 2012 Sep 8, SOUTH OF KERMADEC ISLANDS + 5 + + -178.875,-33.129,0 + + + + M 5 - 2012 Sep 9, KERMADEC ISLANDS REGION + 5 + + -176.539,-28.091,0 + + + + M 5 - 2012 Sep 9, KERMADEC ISLANDS, NEW ZEALAND + 5 + + -177.935,-30.404,0 + + + + M 5 - 2012 Sep 11, YUNNAN, CHINA + 5 + + 99.267,24.647,0 + + + + M 5 - 2012 Sep 11, SOUTH OF MARIANA ISLANDS + 5 + + 143.353,11.828,0 + + + + M 5 - 2012 Sep 12, SOUTHWEST INDIAN RIDGE + 5 + + 46.07,-39.962,0 + + + + M 5 - 2012 Sep 14, NORTHERN XINJIANG, CHINA + 5 + + 82.425,43.637,0 + + + + M 5 - 2012 Sep 16, TONGA + 5 + + -174.657,-18.447,0 + + + + M 5 - 2012 Sep 17, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 142.052,39.832,0 + + + + M 5 - 2012 Sep 17, VANUATU + 5 + + 167.397,-14.867,0 + + + + M 5 - 2012 Sep 18, KEPULAUAN TALAUD, INDONESIA + 5 + + 126.438,4.488,0 + + + + M 5 - 2012 Sep 20, LOYALTY ISLANDS + 5 + + 168.242,-20.296,0 + + + + M 5 - 2012 Sep 20, MOLUCCA SEA + 5 + + 126.872,2.185,0 + + + + M 5 - 2012 Sep 21, CENTRAL MEDITERRANEAN SEA + 5 + + 22.63,35.3,0 + + + + M 5 - 2012 Sep 21, SOLOMON ISLANDS + 5 + + 158.013,-9.069,0 + + + + M 5 - 2012 Sep 22, GREECE + 5 + + 22.77,38.1,0 + + + + M 5 - 2012 Sep 25, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 142.319,36.114,0 + + + + M 5 - 2012 Sep 26, TONGA + 5 + + -175.399,-18.853,0 + + + + M 5 - 2012 Sep 26, SOUTH OF FIJI ISLANDS + 5 + + -177.416,-26.04,0 + + + + M 5 - 2012 Sep 29, MINDORO, PHILIPPINES + 5 + + 120.723,13.847,0 + + + + M 5 - 2012 Oct 1, SOUTH OF FIJI ISLANDS + 5 + + -179.427,-24.745,0 + + + + M 5 - 2012 Oct 2, TONGA + 5 + + -174.903,-18.839,0 + + + + M 5 - 2012 Oct 2, TONGA + 5 + + -174.157,-20.728,0 + + + + M 5 - 2012 Oct 3, NEW BRITAIN REGION, P.N.G. + 5 + + 151.197,-5.727,0 + + + + M 5 - 2012 Oct 5, NORTHEAST OF TAIWAN + 5 + + 125.078,26.271,0 + + + + M 5 - 2012 Oct 5, BANDA SEA + 5 + + 129.547,-6.661,0 + + + + M 5 - 2012 Oct 8, BANDA SEA + 5 + + 129.191,-4.478,0 + + + + M 5 - 2012 Oct 8, BANDA SEA + 5 + + 129.292,-4.511,0 + + + + M 5 - 2012 Oct 12, COSTA RICA + 5 + + -84.268,9.598,0 + + + + M 5 - 2012 Oct 14, KURIL ISLANDS + 5 + + 154.453,48.38,0 + + + + M 5 - 2012 Oct 15, OFFSHORE COQUIMBO, CHILE + 5 + + -71.787,-31.814,0 + + + + M 5 - 2012 Oct 15, HINDU KUSH REGION, AFGHANISTAN + 5 + + 69.683,35.949,0 + + + + M 5 - 2012 Oct 17, TONGA + 5 + + -173.573,-15.036,0 + + + + M 5 - 2012 Oct 17, NIAS REGION, INDONESIA + 5 + + 97.229,1.265,0 + + + + M 5 - 2012 Oct 18, MADHYA PRADESH, INDIA + 5 + + 81.314,23.769,0 + + + + M 5 - 2012 Oct 25, MINAHASA, SULAWESI, INDONESIA + 5 + + 124.55,0.69,0 + + + + M 5 - 2012 Oct 25, TAIWAN + 5 + + 120.558,22.417,0 + + + + M 5 - 2012 Oct 25, PAPUA, INDONESIA + 5 + + 140.348,-3.907,0 + + + + M 5 - 2012 Oct 27, SOUTHEAST OF LOYALTY ISLANDS + 5 + + 169.829,-21.494,0 + + + + M 5 - 2012 Oct 28, ANDAMAN ISLANDS, INDIA REGION + 5 + + 92.575,10.345,0 + + + + M 5 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION + 5 + + -131.36,52.335,0 + + + + M 5 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION + 5 + + -131.561,52.319,0 + + + + M 5 - 2012 Oct 29, FLORES REGION, INDONESIA + 5 + + 123.571,-8.284,0 + + + + M 5 - 2012 Oct 29, FLORES REGION, INDONESIA + 5 + + 123.561,-8.041,0 + + + + M 5 - 2012 Oct 29, QUEEN CHARLOTTE ISLANDS REGION + 5 + + -131.182,51.952,0 + + + + M 5 - 2012 Oct 30, QUEEN CHARLOTTE ISLANDS REGION + 5 + + -132.117,52.222,0 + + + + M 5 - 2012 Nov 1, QUEEN CHARLOTTE ISLANDS REGION + 5 + + -132.024,52.55,0 + + + + M 5 - 2012 Nov 1, BANDA SEA + 5 + + 129.137,-5.612,0 + + + + M 5 - 2012 Nov 1, FIJI REGION + 5 + + -177.638,-20.284,0 + + + + M 5 - 2012 Nov 1, EASTERN NEW GUINEA REG., P.N.G. + 5 + + 145.559,-5.28,0 + + + + M 5 - 2012 Nov 4, SOUTHEAST OF LOYALTY ISLANDS + 5 + + 171.388,-22.265,0 + + + + M 5 - 2012 Nov 6, MINAHASA, SULAWESI, INDONESIA + 5 + + 122.088,1.281,0 + + + + M 5 - 2012 Nov 9, SOLOMON ISLANDS + 5 + + 161.13,-10.121,0 + + + + M 5 - 2012 Nov 10, FLORES REGION, INDONESIA + 5 + + 120.676,-8.887,0 + + + + M 5 - 2012 Nov 11, OFFSHORE GUATEMALA + 5 + + -92.299,13.897,0 + + + + M 5 - 2012 Nov 12, IZU ISLANDS, JAPAN REGION + 5 + + 137.994,29.691,0 + + + + M 5 - 2012 Nov 13, MYANMAR + 5 + + 95.943,22.895,0 + + + + M 5 - 2012 Nov 15, OFFSHORE CHIAPAS, MEXICO + 5 + + -92.727,13.843,0 + + + + M 5 - 2012 Nov 15, SOUTH OF MARIANA ISLANDS + 5 + + 142.554,11.668,0 + + + + M 5 - 2012 Nov 19, PACIFIC-ANTARCTIC RIDGE + 5 + + -147.523,-57.349,0 + + + + M 5 - 2012 Nov 21, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 141.648,38.479,0 + + + + M 5 - 2012 Nov 22, BALI REGION, INDONESIA + 5 + + 115.124,-8.918,0 + + + + M 5 - 2012 Nov 22, SOUTHEAST OF LOYALTY ISLANDS + 5 + + 173.923,-22.354,0 + + + + M 5 - 2012 Nov 23, MOLUCCA SEA + 5 + + 125.824,1.619,0 + + + + M 5 - 2012 Nov 23, SOLOMON ISLANDS + 5 + + 162.74,-10.789,0 + + + + M 5 - 2012 Nov 26, SOUTHERN XINJIANG, CHINA + 5 + + 90.355,40.411,0 + + + + M 5 - 2012 Nov 26, DODECANESE ISLANDS, GREECE + 5 + + 27.993,36.655,0 + + + + M 5 - 2012 Nov 28, NORTHERN ALGERIA + 5 + + 5.312,36.941,0 + + + + M 5 - 2012 Nov 29, MENDOZA, ARGENTINA + 5 + + -69.106,-32.91,0 + + + + M 5 - 2012 Nov 29, NORTHEAST OF TAIWAN + 5 + + 125.191,26.112,0 + + + + M 5 - 2012 Nov 29, NEAR ISLANDS, ALEUTIAN ISLANDS + 5 + + 172.416,52.635,0 + + + + M 5 - 2012 Dec 1, TONGA + 5 + + -174.38,-20.688,0 + + + + M 5 - 2012 Dec 2, TAIWAN + 5 + + 121.631,23.91,0 + + + + M 5 - 2012 Dec 2, KURIL ISLANDS + 5 + + 151.47,45.701,0 + + + + M 5 - 2012 Dec 5, SAMOA ISLANDS REGION + 5 + + -173.266,-14.936,0 + + + + M 5 - 2012 Dec 5, KERMADEC ISLANDS REGION + 5 + + -177.523,-31.103,0 + + + + M 5 - 2012 Dec 7, NEW BRITAIN REGION, P.N.G. + 5 + + 151.429,-5.293,0 + + + + M 5 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 143.627,37.835,0 + + + + M 5 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 143.781,37.869,0 + + + + M 5 - 2012 Dec 8, NEAR S COAST OF NEW GUINEA, PNG. + 5 + + 144.044,-7.167,0 + + + + M 5 - 2012 Dec 8, NEAR S COAST OF NEW GUINEA, PNG. + 5 + + 144.041,-7.258,0 + + + + M 5 - 2012 Dec 9, NEW GUINEA, PAPUA NEW GUINEA + 5 + + 141.117,-3.563,0 + + + + M 5 - 2012 Dec 9, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 143.811,37.519,0 + + + + M 5 - 2012 Dec 10, KEPULAUAN TALAUD, INDONESIA + 5 + + 126.869,3.655,0 + + + + M 5 - 2012 Dec 11, VANUATU + 5 + + 167.736,-18.987,0 + + + + M 5 - 2012 Dec 13, COSTA RICA + 5 + + -84.015,9.062,0 + + + + M 5 - 2012 Dec 14, NEW BRITAIN REGION, P.N.G. + 5 + + 152.959,-5.015,0 + + + + M 5 - 2012 Dec 15, OFF THE COAST OF EL SALVADOR + 5 + + -88.605,12.247,0 + + + + M 5 - 2012 Dec 17, OFF EAST COAST OF HONSHU, JAPAN + 5 + + 143.568,37.728,0 + + + + M 5 - 2012 Dec 19, TONGA + 5 + + -174.283,-20.508,0 + + + + M 5 - 2012 Dec 20, TONGA + 5 + + -174.074,-20.765,0 + + + + M 5 - 2012 Dec 21, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 141.71,38.633,0 + + + + M 5 - 2012 Dec 21, IZU ISLANDS, JAPAN REGION + 5 + + 142.212,29.779,0 + + + + M 5 - 2012 Dec 24, WEST OF MACQUARIE ISLAND + 5 + + 146.898,-55.683,0 + + + + M 5 - 2012 Dec 25, PAKISTAN + 5 + + 66.465,28.464,0 + + + + M 5 - 2012 Dec 26, TAIWAN REGION + 5 + + 122.55,24.043,0 + + + + M 5 - 2012 Dec 26, FIJI REGION + 5 + + -178.619,-20.69,0 + + + + M 5 - 2012 Dec 29, NEAR EAST COAST OF HONSHU, JAPAN + 5 + + 141.025,37.064,0 + + + + M 5 - 2012 Dec 29, BISMARCK SEA + 5 + + 148.752,-3.371,0 + + + + M 5 - 2012 Dec 30, SUNDA STRAIT, INDONESIA + 5 + + 105.283,-6.96,0 + + + + + \ No newline at end of file diff --git a/float-no-zero/examples/data/kml/timezones.kml b/float-no-zero/examples/data/kml/timezones.kml new file mode 100644 index 0000000000..d16f018bbd --- /dev/null +++ b/float-no-zero/examples/data/kml/timezones.kml @@ -0,0 +1,1608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + normal#nStylem1200highlight#hStylem1200 + normal#nStylem1100highlight#hStylem1100 + normal#nStylem1000highlight#hStylem1000 + normal#nStylem0950highlight#hStylem0950 + normal#nStylem0900highlight#hStylem0900 + normal#nStylem0850highlight#hStylem0850 + normal#nStylem0800highlight#hStylem0800 + normal#nStylem0700highlight#hStylem0700 + normal#nStylem0600highlight#hStylem0600 + normal#nStylem0500highlight#hStylem0500 + normal#nStylem0400highlight#hStylem0400 + normal#nStylem0350highlight#hStylem0350 + normal#nStylem0300highlight#hStylem0300 + normal#nStylem0200highlight#hStylem0200 + normal#nStylem0100highlight#hStylem0100 + normal#nStyle0000highlight#hStyle0000 + normal#nStyle0100highlight#hStyle0100 + normal#nStyle0200highlight#hStyle0200 + normal#nStyle0300highlight#hStyle0300 + normal#nStyle0350highlight#hStyle0350 + normal#nStyle0400highlight#hStyle0400 + normal#nStyle0450highlight#hStyle0450 + normal#nStyle0500highlight#hStyle0500 + normal#nStyle0550highlight#hStyle0550 + normal#nStyle0575highlight#hStyle0575 + normal#nStyle0600highlight#hStyle0600 + normal#nStyle0650highlight#hStyle0650 + normal#nStyle0700highlight#hStyle0700 + normal#nStyle0800highlight#hStyle0800 + normal#nStyle0900highlight#hStyle0900 + normal#nStyle0950highlight#hStyle0950 + normal#nStyle1000highlight#hStyle1000 + normal#nStyle1050highlight#hStyle1050 + normal#nStyle1100highlight#hStyle1100 + normal#nStyle1150highlight#hStyle1150 + normal#nStyle1200highlight#hStyle1200 + normal#nStyle1275highlight#hStyle1275 + normal#nStyle1300highlight#hStyle1300 + + #hidelist + + + GMT -12:00 +
+ +]]> + #khStylem1200 + + + + + +-179.0623,-89.90000000000001,0 -180,-89.90000000000001,0 -180,-86.5,0 -180,-81.49999,0 -180,-76.5,0 -180,-71.5,0 -180,-66.5,0 -180,-61.5,0 -180,-56.5,0 -180,-51.50000000000001,0 -176.2216,-48.22535,0 -172.5,-45,0 -172.4998,-50,0 -172.4996,-55.00000000000001,0 -172.4995,-60.00000000000001,0 -172.4993,-65,0 -172.4991,-70,0 -172.4989,-75,0 -172.4987,-80,0 -172.4986,-83.3,0 -172.4984,-88.3,0 -172.4984,-89.90000000000001,0 -173.4361,-89.90000000000001,0 -174.3738,-89.90000000000001,0 -175.3115,-89.90000000000001,0 -176.2492,-89.90000000000001,0 -177.1869,-89.90000000000001,0 -178.1246,-89.90000000000001,0 -179.0623,-89.90000000000001,0 + + + 1 + + + + + +-172.509,74.89999,0 -172.509,70.23302,0 -175.7817,72.31562,0 -180,75,0 -180,79.90000000000001,0 -180,84.90001,0 -180,89.90000000000001,0 -179.0636,89.90000000000001,0 -178.1273,89.90000000000001,0 -177.1909,89.90000000000001,0 -176.2545,89.90000000000001,0 -175.3181,89.90000000000001,0 -174.3818,89.90000000000001,0 -173.4454,89.90000000000001,0 -172.509,89.90000000000001,0 -172.509,84.90001,0 -172.509,79.90000000000001,0 -172.509,74.89999,0 + + + 1 + + + + + GMT -11:00 +
+ +]]> + #khStylem1100 + + + + + +180,49.99722,0 180,48,0 176.0055,49.99722,0 180,49.99722,0 + + + 1 + + + + + +-167.5405,-5.592744,0 -167.5405,-7.092370000000001,0 -172.5404,-7.073442000000002,0 -172.9307,-7.071967,0 -172.9307,-10.5021,0 -167.9308,-10.46422,0 -167.5405,-10.46127,0 -167.5405,-15.46126,0 -167.5405,-20.46127,0 -167.5405,-22.51781,0 -162.5405,-22.51781,0 -157.5405,-22.51781,0 -157.5063,-22.51781,0 -157.5063,-27.51781,0 -157.5063,-32.51781,0 -157.5063,-37.51781,0 -157.5063,-40.2,0 -157.5063,-45.2,0 -157.5063,-50.2,0 -157.5063,-50.7,0 -157.5063,-55.7,0 -157.5063,-60.7,0 -157.5063,-65.7,0 -157.5063,-70.7,0 -157.5063,-75.7,0 -157.5063,-80.7,0 -157.5063,-85.7,0 -157.5063,-89.90000000000001,0 -158.5058,-89.90000000000001,0 -159.5053,-89.90000000000001,0 -160.5048,-89.90000000000001,0 -161.5042,-89.90000000000001,0 -162.5037,-89.90000000000001,0 -163.5032,-89.90000000000001,0 -164.5026,-89.90000000000001,0 -165.5021,-89.90000000000001,0 -166.5016,-89.90000000000001,0 -167.501,-89.90000000000001,0 -168.5005,-89.90000000000001,0 -169.5,-89.90000000000001,0 -170.4995,-89.90000000000001,0 -171.4989,-89.90000000000001,0 -172.4984,-89.90000000000001,0 -172.4984,-88.3,0 -172.4986,-83.3,0 -172.4987,-80,0 -172.4989,-75,0 -172.4991,-70,0 -172.4993,-65,0 -172.4995,-60.00000000000001,0 -172.4996,-55.00000000000001,0 -172.4998,-50,0 -172.5,-45,0 -172.5,-43.5,0 -172.5,-38.5,0 -172.5,-33.5,0 -172.5,-28.5,0 -172.5,-23.5,0 -172.5,-20,0 -172.5,-15,0 -174,-13,0 -177,-9.000000999999999,0 -180,-4.999996,0 -180,-4.989699,0 -180,0.01029546,0 -180,5.0103,0 -180,10.0103,0 -180,15.0103,0 -180,20.0103,0 -180,25.0103,0 -180,30.0103,0 -180,35.0103,0 -180,40.0103,0 -180,45.01030000000001,0 -180,50.0103,0 -175,50.01045,0 -170,50.01062000000001,0 -169.3893,50.01063000000001,0 -164.3893,50.01743,0 -159.3893,50.02422,0 -157.5064,50.02679,0 -157.5064,45.02678,0 -157.5064,40.02678,0 -157.5064,35.02678,0 -157.5064,30.02678,0 -157.5064,26.53553,0 -162.5064,26.53553,0 -167.5064,26.53553,0 -172.4834,26.53553,0 -172.4834,22.5508,0 -174.6819,22.5508,0 -174.6819,17.5508,0 -174.6819,14.44395,0 -169.6819,14.41826,0 -167.5405,14.40725,0 -167.5405,9.407258000000001,0 -167.5405,4.407255,0 -167.5405,-0.5927495,0 -167.5405,-5.592744,0 + + + 1 + + + + + +-167.1914,68.69023,0 -169,68,0 -172.509,70.23302,0 -172.509,74.89999,0 -172.509,79.90000000000001,0 -172.509,84.90001,0 -172.509,89.90000000000001,0 -171.5101,89.90000000000001,0 -170.5112,89.90000000000001,0 -169.5124,89.90000000000001,0 -168.5135,89.90000000000001,0 -167.5146,89.90000000000001,0 -166.5157,89.90000000000001,0 -165.5168,89.90000000000001,0 -164.5179,89.90000000000001,0 -163.519,89.90000000000001,0 -162.5201,89.90000000000001,0 -161.5212,89.90000000000001,0 -160.5223,89.90000000000001,0 -159.5234,89.90000000000001,0 -158.5245,89.90000000000001,0 -157.5256,89.90000000000001,0 -157.5256,84.90001,0 -157.5256,79.90000000000001,0 -157.5256,74.89999,0 -157.5256,71.37826,0 -162.4455,70.48654999999999,0 -162.5201,70.47302999999999,0 -167.1914,68.69023,0 + + + 1 + + + + + GMT -10:00 + + +]]> + #khStylem1000 + + + + + +-142.5293,-4.65319,0 -142.5293,-9.653193,0 -142.5293,-13.48625,0 -137.5294,-13.45937,0 -134.3385,-13.44221,0 -134.3385,-18.44221,0 -134.3385,-21.37773,0 -136.8102,-23.676,0 -141.8102,-23.676,0 -142.5293,-23.676,0 -142.5293,-28.676,0 -142.5293,-33.676,0 -142.5293,-38.676,0 -142.5293,-43.676,0 -142.5293,-48.67599000000001,0 -142.5293,-53.676,0 -142.5293,-56.87600000000001,0 -142.5293,-61.876,0 -142.5293,-66.87600999999999,0 -142.5293,-71.87600000000001,0 -142.5293,-73.476,0 -142.5293,-78.476,0 -142.5293,-83.476,0 -142.5293,-88.476,0 -142.5293,-89.90000000000001,0 -143.5278,-89.90000000000001,0 -144.5262,-89.90000000000001,0 -145.5247,-89.90000000000001,0 -146.5232,-89.90000000000001,0 -147.5216,-89.90000000000001,0 -148.5201,-89.90000000000001,0 -149.5186,-89.90000000000001,0 -150.5171,-89.90000000000001,0 -151.5155,-89.90000000000001,0 -152.514,-89.90000000000001,0 -153.5125,-89.90000000000001,0 -154.5109,-89.90000000000001,0 -155.5094,-89.90000000000001,0 -156.5079,-89.90000000000001,0 -157.5063,-89.90000000000001,0 -157.5063,-85.7,0 -157.5063,-80.7,0 -157.5063,-75.7,0 -157.5063,-70.7,0 -157.5063,-65.7,0 -157.5063,-60.7,0 -157.5063,-55.7,0 -157.5063,-50.7,0 -157.5063,-50.2,0 -157.5063,-45.2,0 -157.5063,-40.2,0 -157.5063,-37.51781,0 -157.5063,-32.51781,0 -157.5063,-27.51781,0 -157.5063,-22.51781,0 -157.5405,-22.51781,0 -162.5405,-22.51781,0 -167.5405,-22.51781,0 -167.5405,-20.46127,0 -167.5405,-15.46126,0 -167.5405,-10.46127,0 -167.9308,-10.46422,0 -172.9307,-10.5021,0 -172.9307,-7.071967,0 -172.5404,-7.073442000000002,0 -167.5405,-7.092370000000001,0 -167.5405,-5.592744,0 -167.5405,-0.5927495,0 -167.5405,4.407255,0 -167.5405,9.407258000000001,0 -167.5405,14.40725,0 -169.6819,14.41826,0 -174.6819,14.44395,0 -174.6819,17.5508,0 -174.6819,22.5508,0 -172.4834,22.5508,0 -172.4834,26.53553,0 -167.5064,26.53553,0 -162.5064,26.53553,0 -157.5064,26.53553,0 -157.5064,30.02678,0 -157.5064,35.02678,0 -157.5064,40.02678,0 -157.5064,45.02678,0 -157.5064,50.02679,0 -152.5064,50.03357,0 -147.5064,50.04037,0 -142.5293,50.04713,0 -142.5293,45.04712000000001,0 -142.5293,40.04713,0 -142.5293,35.04712,0 -142.5293,30.04713,0 -142.5293,25.04712,0 -142.5293,20.04713,0 -142.5293,18.34681,0 -142.5293,13.34681,0 -142.5293,8.346807,0 -142.5293,3.346812,0 -142.5293,0.3468055,0 -142.5293,-4.65319,0 + + + 1 + + + + + +-175,50.01045,0 -180,50.0103,0 -180,50.02665,0 -180,55.02666,0 -175,55.02376000000001,0 -170,55.02087000000001,0 -169.3902,55.02052,0 -169.3893,50.02052000000001,0 -169.3893,50.01063000000001,0 -170,50.01062000000001,0 -175,50.01045,0 + + + 1 + + + + + +180,49.99722,0 176.0055,49.99722,0 171.5334,52.23330000000001,0 170,53,0 173.415,55.03272,0 178.415,55.03272,0 180,55.03272,0 180,54.99723,0 180,49.99722,0 + + + 1 + + + + + +-142.4651,74.90014000000001,0 -142.4453,70.32476,0 -147.4331,70.67321,0 -152.421,71.02166,0 -157.4088,71.37009999999999,0 -157.5256,71.37826,0 -157.5256,74.89999,0 -157.5256,79.90000000000001,0 -157.5256,84.90001,0 -157.5256,89.90000000000001,0 -156.5259,89.90000000000001,0 -155.5262,89.90000000000001,0 -154.5265,89.90000000000001,0 -153.5268,89.90000000000001,0 -152.5271,89.90000000000001,0 -151.5274,89.90000000000001,0 -150.5277,89.90000000000001,0 -149.528,89.90000000000001,0 -148.5283,89.90000000000001,0 -147.5285,89.90000000000001,0 -146.5288,89.90000000000001,0 -145.5291,89.90000000000001,0 -144.5294,89.90000000000001,0 -143.5297,89.90000000000001,0 -142.53,89.90000000000001,0 -142.5084,84.90004999999999,0 -142.4867,79.90009000000001,0 -142.4651,74.90014000000001,0 + + + 1 + + + + + GMT -09:30 + + +]]> + #khStylem0950 + + + + +-141.5368,-7.197858,0 -136.5368,-7.197858,0 -135.6827,-7.197858,0 -135.6827,-11.10058,0 -140.6827,-11.10058,0 -141.5368,-11.10058,0 -141.5368,-7.197858,0 + + + 1 + + + + GMT -09:00 + + +]]> + #khStylem0900 + + + + + +178.415,55.03272,0 173.415,55.03272,0 177.7114,57.59015000000001,0 180,58.95238000000001,0 180,55.03272,0 178.415,55.03272,0 + + + 1 + + + + + +-127.5151,74.89999,0 -127.5151,70.49976,0 -128.2554,70.67574000000001,0 -128.8733,70.34173000000001,0 -129.7417,70.30833,0 -129.9588,70.14133,0 -130.4598,70.22484,0 -133.5828,69.57352,0 -134.3343,69.85742999999999,0 -135.6703,69.64033000000001,0 -136.2715,69.22282,0 -136.4206,68.90156,0 -137.0624,68.95941999999999,0 -137.2391,69.01522,0 -137.4809,69.01522,0 -138.2296,69.18262,0 -138.3319,69.24308000000001,0 -138.383,69.31749000000001,0 -138.5411,69.26168,0 -138.6248,69.28493,0 -138.8806,69.61044,0 -139.1271,69.66159,0 -139.3828,69.55929,0 -139.9315,69.62904000000002,0 -140.378,69.60579,0 -141.0033,69.6567,0 -140.9997,65.30721,0 -140.9955,60.30721,0 -140.5214,60.22222,0 -140.4508,60.30972000000001,0 -139.9794,60.18776,0 -139.6767,60.34055,0 -139.0681,60.35222,0 -139.1889,60.08889,0 -139.0478,59.99749,0 -138.6903,59.90693,0 -138.6158,59.77417000000001,0 -137.9578,59.43166,0 -137.5908,59.23860000000001,0 -137.4797,58.99805,0 -137.5075,58.92556,0 -137.445,58.90749,0 -137.2961,58.98999,0 -136.8089,59.16526,0 -136.5839,59.16332,0 -136.4628,59.28944,0 -136.4636,59.46970000000001,0 -136.3716,59.45249,0 -136.2339,59.52583,0 -136.2392,59.56138000000001,0 -136.3439,59.60277,0 -135.9492,59.66916,0 -135.4736,59.80194,0 -135.235,59.70305,0 -135.1775,59.63693,0 -135.0145,59.5675,0 -135.0211,59.4711,0 -135.0917,59.42694,0 -134.9892,59.38999,0 -135.0161,59.34777,0 -134.9519,59.27999,0 -134.688,59.24333,0 -134.6717,59.20027000000001,0 -134.5664,59.13055000000001,0 -134.4614,59.12665,0 -134.3794,59.04916,0 -134.3953,58.98305,0 -134.3114,58.96444000000001,0 -134.3322,58.92972,0 -134.2455,58.85695000000001,0 -133.8269,58.7261,0 -133.6833,58.59554,0 -133.43,58.45917,0 -133.3879,58.41206,0 -133.4303,58.35999,0 -133.3611,58.28054,0 -133.137,58.13582,0 -133.0708,58.01222,0 -132.8817,57.86361000000001,0 -132.2267,57.20471,0 -132.3369,57.08832,0 -132.0275,57.03638,0 -132.1031,56.86666,0 -131.8614,56.79972,0 -131.8845,56.74471000000001,0 -131.8269,56.67916,0 -131.8242,56.59693,0 -131.5578,56.60221,0 -131.055,56.39804,0 -130.7744,56.3661,0 -130.6272,56.25861,0 -130.4619,56.23527,0 -130.4142,56.12887,0 -130.2292,56.09027,0 -130.0886,56.11804000000001,0 -130.0147,56.02583000000001,0 -130.0151,55.90919000000001,0 -130.1747,55.75443000000001,0 -130.1225,55.65499,0 -130.1439,55.54139000000001,0 -129.9905,55.28166000000001,0 -130.1014,55.22776,0 -130.2311,55.035,0 -130.3597,54.90805,0 -130.5897,54.79371,0 -130.6491,54.70139000000001,0 -133.0791,54.26532,0 -133.1971,53.93898,0 -132.9926,53.51827999999999,0 -132.5012,53.02680000000001,0 -132.1788,52.75157,0 -131.0228,51.91016000000001,0 -127.5078,49.81058,0 -127.5078,48.21058000000001,0 -127.5078,43.21058,0 -127.5078,38.21058,0 -127.5078,33.21058,0 -127.5078,28.21058,0 -127.5078,23.21058,0 -127.5079,18.21058,0 -127.5079,15.01059,0 -127.5079,10.01058,0 -127.5079,5.010579,0 -127.5079,0.01058346,0 -127.5079,-2.500003,0 -127.5079,-7.499998000000002,0 -127.5079,-12.5,0 -127.5079,-17.5,0 -127.508,-22.5,0 -131.5,-22.5,0 -131.5,-26,0 -127.5075,-26,0 -127.5075,-29.9,0 -127.5075,-34.9,0 -127.5074,-39.90000000000001,0 -127.5074,-44.9,0 -127.5074,-49.90001,0 -127.5074,-54.9,0 -127.5074,-59.90001,0 -127.5074,-60.8,0 -127.5073,-65.8,0 -127.5073,-70.8,0 -127.5073,-75.8,0 -127.5073,-79.90000000000001,0 -127.5073,-84.89999,0 -127.5073,-89.90000000000001,0 -128.4461,-89.90000000000001,0 -129.385,-89.90000000000001,0 -130.3239,-89.90000000000001,0 -131.2628,-89.90000000000001,0 -132.2016,-89.90000000000001,0 -133.1405,-89.90000000000001,0 -134.0794,-89.90000000000001,0 -135.0183,-89.90000000000001,0 -135.9571,-89.90000000000001,0 -136.896,-89.90000000000001,0 -137.8349,-89.90000000000001,0 -138.7738,-89.90000000000001,0 -139.7127,-89.90000000000001,0 -140.6515,-89.90000000000001,0 -141.5904,-89.90000000000001,0 -142.5293,-89.90000000000001,0 -142.5293,-88.476,0 -142.5293,-83.476,0 -142.5293,-78.476,0 -142.5293,-73.476,0 -142.5293,-71.87600000000001,0 -142.5293,-66.87600999999999,0 -142.5293,-61.876,0 -142.5293,-56.87600000000001,0 -142.5293,-53.676,0 -142.5293,-48.67599000000001,0 -142.5293,-43.676,0 -142.5293,-38.676,0 -142.5293,-33.676,0 -142.5293,-28.676,0 -142.5293,-23.676,0 -141.8102,-23.676,0 -136.8102,-23.676,0 -134.3385,-21.37773,0 -134.3385,-18.44221,0 -134.3385,-13.44221,0 -137.5294,-13.45937,0 -142.5293,-13.48625,0 -142.5293,-9.653193,0 -142.5293,-4.65319,0 -142.5293,0.3468055,0 -142.5293,3.346812,0 -142.5293,8.346807,0 -142.5293,13.34681,0 -142.5293,18.34681,0 -142.5293,20.04713,0 -142.5293,25.04712,0 -142.5293,30.04713,0 -142.5293,35.04712,0 -142.5293,40.04713,0 -142.5293,45.04712000000001,0 -142.5293,50.04713,0 -147.5064,50.04037,0 -152.5064,50.03357,0 -157.5064,50.02679,0 -159.3893,50.02422,0 -164.3893,50.01743,0 -169.3893,50.01063000000001,0 -169.3893,50.02052000000001,0 -169.3902,55.02052,0 -170,55.02087000000001,0 -175,55.02376000000001,0 -180,55.02666,0 -180,58.95238000000001,0 -177.5929,60.38517000000001,0 -173.2965,62.94258000000001,0 -169,65.5,0 -169,68,0 -167.1914,68.69023,0 -162.5201,70.47302999999999,0 -162.4455,70.48654999999999,0 -157.5256,71.37826,0 -157.4088,71.37009999999999,0 -152.421,71.02166,0 -147.4331,70.67321,0 -142.4453,70.32476,0 -142.4651,74.90014000000001,0 -142.4867,79.90009000000001,0 -142.5084,84.90004999999999,0 -142.53,89.90000000000001,0 -141.5916,89.90000000000001,0 -140.6532,89.90000000000001,0 -139.7147,89.90000000000001,0 -138.7763,89.90000000000001,0 -137.8378,89.90000000000001,0 -136.8994,89.90000000000001,0 -135.961,89.90000000000001,0 -135.0226,89.90000000000001,0 -134.0841,89.90000000000001,0 -133.1457,89.90000000000001,0 -132.2073,89.90000000000001,0 -131.2688,89.90000000000001,0 -130.3304,89.90000000000001,0 -129.392,89.90000000000001,0 -128.4535,89.90000000000001,0 -127.5151,89.90000000000001,0 -127.5151,84.90001,0 -127.5151,79.90000000000001,0 -127.5151,74.89999,0 + + + + + +-141.5368,-7.197858,0 -141.5368,-11.10058,0 -140.6827,-11.10058,0 -135.6827,-11.10058,0 -135.6827,-7.197858,0 -136.5368,-7.197858,0 -141.5368,-7.197858,0 + + + 1 + + + + + GMT -08:30 + + +]]> + #khStylem0850 + + + + +-127.5075,-26,0 -131.5,-26,0 -131.5,-22.5,0 -127.508,-22.5,0 -122.508,-22.5,0 -121,-22.5,0 -121,-26,0 -126,-26,0 -127.5075,-26,0 + + + 1 + + + + GMT -08:00 + + +]]> + #khStylem0800 + + + + + +-138.8806,69.61044,0 -138.6248,69.28493,0 -138.5411,69.26168,0 -138.383,69.31749000000001,0 -138.3319,69.24308000000001,0 -138.2296,69.18262,0 -137.4809,69.01522,0 -137.2391,69.01522,0 -137.0624,68.95941999999999,0 -136.4206,68.90156,0 -136.4461,68.87302,0 -136.4447,68.58778,0 -136.4442,68.43304000000001,0 -136.445,67.71554999999999,0 -136.4211,67.65526000000001,0 -136.2411,67.62053,0 -136.1578,67.50776999999999,0 -136.2053,67.40694000000001,0 -136.1164,67.38274,0 -136.1428,67.35942,0 -136.0914,67.30247,0 -136.1345,67.22638000000001,0 -136.2364,67.17386999999999,0 -136.1989,67.14333000000001,0 -136.2222,67.06415,0 -136.1645,67.00360000000001,0 -133.8311,67.00333000000001,0 -134.0461,66.98441,0 -134.0925,66.95527,0 -133.9081,66.90887000000001,0 -133.7639,66.80692999999999,0 -133.8403,66.72776,0 -133.7572,66.68526,0 -133.7719,66.64413999999999,0 -133.5867,66.5647,0 -133.6903,66.53193,0 -133.6294,66.44525,0 -133.7503,66.44775,0 -133.7681,66.37303,0 -133.8247,66.31666,0 -133.57,66.27831999999999,0 -133.5639,66.15583,0 -133.6731,66.11693,0 -133.7047,66.07193,0 -133.6033,66.05165,0 -133.6294,65.97443,0 -133.4075,65.94386,0 -133.1475,66.02469000000001,0 -132.9397,66.02887,0 -132.9084,65.99693000000001,0 -132.9939,65.92303,0 -132.9061,65.90833000000001,0 -132.817,65.91998,0 -132.7822,65.96720999999999,0 -132.5761,66.03055000000001,0 -132.5103,65.97887,0 -132.3536,65.99026000000001,0 -132.3267,65.95193,0 -132.54,65.88916,0 -132.5733,65.84859,0 -132.5294,65.82555000000001,0 -132.3239,65.73997,0 -132.1719,65.59804,0 -132.2736,65.54694000000001,0 -132.3278,65.43471,0 -132.5214,65.36304,0 -132.5553,65.28360000000001,0 -132.7836,65.22499000000001,0 -132.7169,65.20387,0 -132.7878,65.18777,0 -132.7147,65.15555000000001,0 -132.5764,65.19054,0 -132.5275,65.16277000000001,0 -132.5561,65.11803999999999,0 -132.54,65.09388,0 -132.3817,65.08499000000001,0 -132.3333,65.03471999999999,0 -132.5075,64.96442,0 -132.4825,64.87691,0 -132.6153,64.81219,0 -132.5706,64.77249999999999,0 -132.3689,64.77831999999999,0 -132.1636,64.70166,0 -132.0464,64.69553000000001,0 -131.9158,64.58249000000001,0 -131.6942,64.53498999999999,0 -131.6878,64.4986,0 -131.8039,64.43803,0 -131.8181,64.37831,0 -131.593,64.36859,0 -131.4275,64.41638,0 -131.3886,64.46720999999999,0 -131.1417,64.42443,0 -131.002,64.33028,0 -131.0605,64.27943000000001,0 -130.9797,64.26555000000001,0 -130.9372,64.20999999999999,0 -130.8672,64.18777,0 -130.9478,64.13721,0 -130.8536,64.07249,0 -130.8639,64.04304999999999,0 -130.7514,64.0461,0 -130.7786,64.00915999999999,0 -130.7556,63.98693,0 -130.5811,63.92416,0 -130.5222,63.93499,0 -130.3703,63.84388000000001,0 -130.1197,63.80805,0 -130.1039,63.76416,0 -130.2342,63.73915,0 -130.2825,63.73777,0 -130.3211,63.69582000000001,0 -130.252,63.66666000000001,0 -130.1097,63.70361,0 -130.0825,63.68833,0 -130.1108,63.66443,0 -130.093,63.63055,0 -129.9486,63.61361000000001,0 -129.958,63.58526,0 -129.8981,63.57222,0 -129.8195,63.48333000000001,0 -129.8972,63.45221,0 -129.9192,63.37276,0 -130.1319,63.31555,0 -130.1511,63.26582000000001,0 -130.0445,63.26999,0 -129.9786,63.20361,0 -129.9003,63.19721,0 -129.8353,63.11472000000001,0 -129.8472,63.08694,0 -129.6372,63.08027,0 -129.5989,63.05194000000001,0 -129.7058,62.95222,0 -129.7261,62.91416,0 -129.7025,62.89222000000002,0 -129.7739,62.87443,0 -129.6308,62.76083,0 -129.6253,62.70499,0 -129.517,62.67249000000001,0 -129.5239,62.64333,0 -129.4878,62.61889,0 -129.5678,62.57444000000001,0 -129.4178,62.58499,0 -129.1722,62.48166,0 -129.3083,62.42138000000001,0 -129.2158,62.37749000000001,0 -129.3105,62.32639,0 -129.2822,62.26721,0 -129.1992,62.21694,0 -129.2939,62.15611,0 -129.1228,62.11667,0 -128.9842,62.13611,0 -128.7653,62.05833,0 -128.6775,62.12526,0 -128.547,62.12222,0 -128.3753,62.02722000000001,0 -128.3881,61.99387999999999,0 -128.2686,61.94055,0 -128.2136,61.85055,0 -128.0806,61.84916,0 -127.9728,61.68860000000001,0 -127.5503,61.51138000000001,0 -127.3792,61.50721000000001,0 -127.2883,61.51916000000001,0 -127.1417,61.46666,0 -127.125,61.4011,0 -127.0644,61.37249,0 -127.0108,61.13416,0 -127.1019,61.07083,0 -127.0558,61.03999000000002,0 -126.9353,61.05916,0 -126.9394,61.00249,0 -126.8989,60.94165,0 -126.9253,60.86221,0 -126.8797,60.82999,0 -126.8869,60.78249000000001,0 -126.84,60.75722,0 -126.7764,60.78527,0 -126.6722,60.74347000000001,0 -126.5203,60.81442000000001,0 -126.3945,60.77668000000001,0 -126.2728,60.78532,0 -126.2228,60.80284,0 -126.2395,60.8567,0 -126.1709,60.86586000000001,0 -126.1075,60.85894,0 -126.1072,60.81701,0 -126.0092,60.80341,0 -125.957,60.87723,0 -125.8872,60.89694,0 -125.712,60.82726000000001,0 -125.3492,60.7834,0 -125.1747,60.85054,0 -124.8717,60.85804,0 -124.8778,60.91721,0 -124.813,60.97249000000002,0 -124.5919,60.96054000000001,0 -124.4769,60.79055000000001,0 -124.6192,60.70972,0 -124.6142,60.66859,0 -124.4594,60.56972,0 -124.4183,60.47915,0 -124.2064,60.45722,0 -124.1953,60.32888,0 -123.9743,60.09237000000001,0 -123.8157,60.00000000000001,0 -120,60.00000000000001,0 -120,57.26251,0 -120.2163,57.45917,0 -120.3444,57.478,0 -120.8415,57.23171000000001,0 -121.2803,57.24454,0 -121.7099,57.02437000000001,0 -121.8406,56.99683,0 -122.0286,57.01699,0 -122.1153,56.9519,0 -122.2026,56.93232,0 -123.4153,57.14465000000001,0 -123.4541,57.3213,0 -123.515,57.36665,0 -123.5888,57.33548,0 -123.7545,57.12799,0 -123.944,57.12243,0 -124.0969,57.03444,0 -124.1216,56.86174000000001,0 -123.5964,55.89894000000001,0 -122.8612,55.42631000000001,0 -121.6533,54.53355,0 -121.2157,54.48102000000001,0 -120.9006,54.20094000000001,0 -120.0003,53.83022,0 -119.9783,53.78889000000002,0 -119.9047,53.7786,0 -119.9211,53.71833000000002,0 -119.8103,53.70777,0 -119.7353,53.63499000000001,0 -119.7686,53.60332,0 -119.9322,53.60722,0 -119.8828,53.56027,0 -119.9025,53.52027,0 -119.8153,53.49972,0 -119.7381,53.395,0 -119.6369,53.35166,0 -119.5989,53.37887,0 -119.3858,53.36166,0 -119.3528,53.27916,0 -119.2655,53.19666,0 -119.0378,53.13583,0 -119.0136,53.14472000000001,0 -119.0122,53.22305,0 -118.9597,53.23333,0 -118.755,53.12083,0 -118.7811,53.05583,0 -118.7275,53.06138,0 -118.6633,53.01554000000002,0 -118.6797,52.97054,0 -118.625,52.88416,0 -118.4914,52.89777000000001,0 -118.4156,52.83638000000001,0 -118.4289,52.78611000000001,0 -118.3461,52.74333,0 -118.305,52.67471,0 -118.35,52.61805,0 -118.2817,52.56527,0 -118.2869,52.52777,0 -118.2083,52.48082,0 -118.2597,52.44221,0 -118.2276,52.37917000000001,0 -118.2918,52.33801,0 -118.3567,52.36639000000001,0 -118.4936,52.31367000000001,0 -118.5636,52.265,0 -118.5869,52.19099,0 -118.6751,52.15347,0 -118.7623,52.17984,0 -118.6163,52.06324,0 -118.1043,51.85538,0 -118.0445,51.7621,0 -118.0663,51.6597,0 -117.975,51.65362,0 -117.9355,51.61814,0 -117.8381,51.65870000000001,0 -117.8179,51.63131000000001,0 -117.8462,51.58163,0 -117.8006,51.56642,0 -117.8513,51.51675000000001,0 -117.7393,51.42244,0 -117.4224,51.40926000000001,0 -117.1684,51.02501,0 -117.137,51.01789000000001,0 -117.1659,50.97937000000001,0 -117.0382,50.95707,0 -117.0858,50.8648,0 -117.0432,50.85568000000001,0 -117.0392,50.81512,0 -116.9631,50.81107000000001,0 -116.915,50.77051,0 -116.8136,50.78572,0 -116.8288,50.75225,0 -116.7811,50.69954,0 -116.5839,50.64782,0 -116.6559,50.60120000000001,0 -116.6894,50.48155,0 -116.7228,50.46025,0 -116.6392,50.40956000000001,0 -116.6179,50.31628,0 -116.5408,50.31831,0 -116.5616,50.21387,0 -116.4521,50.15508000000001,0 -116.4993,50.06382000000001,0 -116.4435,49.98169000000002,0 -116.4709,49.89754,0 -116.7112,49.88435000000001,0 -116.6975,49.85698,0 -116.877,49.79817000000001,0 -116.8967,49.64001,0 -116.8359,49.59236,0 -116.7472,49.33989,0 -116.6671,49.28718,0 -116.5611,49.11279,0 -116.5332,49.00125000000001,0 -116.0483,48.99972000000001,0 -116.0492,47.99333,0 -115.7208,47.70805000000001,0 -115.6742,47.60999,0 -115.7375,47.55583,0 -115.6347,47.48444,0 -115.725,47.43721,0 -115.5803,47.38527000000001,0 -115.4958,47.3011,0 -115.3183,47.2561,0 -115.045,46.9886,0 -114.9156,46.92389000000001,0 -114.9064,46.84138000000001,0 -114.7655,46.77638,0 -114.765,46.71471,0 -114.6694,46.75111,0 -114.6178,46.71749000000001,0 -114.6367,46.67388,0 -114.5764,46.64444,0 -114.325,46.66916000000001,0 -114.3367,46.53582999999999,0 -114.4003,46.50555,0 -114.3708,46.45361,0 -114.4561,46.26999,0 -114.4319,46.19055000000001,0 -114.5045,46.15972,0 -114.45,46.10917,0 -114.4853,46.04971,0 -114.4742,46.00193,0 -114.4022,45.98804,0 -114.4164,45.92888000000001,0 -114.3819,45.89249,0 -114.4961,45.84470000000001,0 -114.5547,45.77943000000001,0 -114.4908,45.71027,0 -114.545,45.62778,0 -114.5395,45.56702000000001,0 -114.6612,45.46328000000001,0 -114.781,45.4964,0 -114.798,45.43404000000001,0 -114.7511,45.40534,0 -115.1775,45.58222000000001,0 -115.4781,45.3886,0 -115.7964,45.46944,0 -116.1983,45.40526000000001,0 -116.2811,45.42443000000001,0 -116.2992,45.4586,0 -116.2583,45.61999000000001,0 -116.2992,45.69137,0 -116.2728,45.86054000000002,0 -116.2922,45.89305,0 -116.6122,46.04194,0 -116.6217,46.00667000000001,0 -116.7175,45.97332000000001,0 -116.7283,45.89332,0 -116.7793,45.86157000000001,0 -116.5461,45.76222000000001,0 -116.4533,45.60694,0 -116.6503,45.35638,0 -116.7114,45.17027,0 -116.8372,45.02555000000001,0 -116.8378,44.92443,0 -116.8958,44.8311,0 -117.0278,44.74638000000001,0 -117.1336,44.54388,0 -117.2122,44.48249,0 -117.1985,44.30091,0 -117.482,44.29872,0 -117.4845,44.37986,0 -117.5899,44.44006,0 -117.9629,44.4388,0 -118.0106,44.42295,0 -118.1505,44.26134,0 -118.2288,44.24651,0 -118.2191,43.09735,0 -117.9707,43.09735,0 -117.9707,42.81335,0 -118.2076,42.81335,0 -118.2066,42.59258,0 -117.0169,42.58601000000001,0 -116.9849,42,0 -114.0426,41.99549,0 -114.0403,37.00311,0 -114.0419,36.19972,0 -114.1208,36.05833,0 -114.2372,36.02583,0 -114.3575,36.1461,0 -114.4514,36.12777,0 -114.5506,36.16194,0 -114.7264,36.08277,0 -114.7405,35.98611,0 -114.6603,35.88194,0 -114.6917,35.81499,0 -114.6903,35.72499,0 -114.6439,35.62665,0 -114.6683,35.51027000000001,0 -114.5839,35.3411,0 -114.5686,35.22332,0 -114.5795,35.14415,0 -114.6364,35.12526,0 -114.6075,35.08221,0 -114.6333,35.04749,0 -114.6219,34.99214,0 -114.6222,34.88499,0 -114.4561,34.6986,0 -114.3697,34.52917,0 -114.3733,34.47304,0 -114.1672,34.3575,0 -114.1147,34.28249,0 -114.3903,34.10972,0 -114.4228,34.02638,0 -114.5225,33.95027,0 -114.4886,33.89249,0 -114.5161,33.825,0 -114.4839,33.72193,0 -114.5225,33.68415,0 -114.5264,33.56166,0 -114.6367,33.41999,0 -114.7261,33.40804,0 -114.6992,33.36055,0 -114.7286,33.30749,0 -114.6678,33.21554,0 -114.6961,33.08693,0 -114.6608,33.04193,0 -114.5089,33.0225,0 -114.4644,32.97165,0 -114.4581,32.86027,0 -114.5269,32.80082,0 -114.5417,32.7272,0 -114.69,32.74276,0 -114.7191,32.71846,0 -114.7956,32.60999,0 -114.8098,32.50699,0 -114.9367,32.47305,0 -114.9642,32.36861,0 -115.0415,32.25468,0 -114.9989,32.13611,0 -115.0172,31.95443,0 -112.1676,28.00019,0 -112.7233,27.99974,0 -114.1616,28.00056,0 -114.2077,28.00027,0 -116.9047,28.00672,0 -116.9047,24.05259,0 -112.5009,24.04926,0 -112.501,19.04926,0 -112.5011,14.04925,0 -112.5012,9.049256,0 -112.5013,4.049253,0 -112.5014,-0.9507425000000002,0 -112.5015,-5.950747,0 -112.5016,-8.550748000000001,0 -112.5017,-13.55074,0 -112.5018,-18.55075,0 -112.5019,-23.55074,0 -112.502,-25.75075,0 -112.5021,-30.75074,0 -112.5022,-35.75074,0 -112.5023,-40.75074,0 -112.5024,-45.75074000000002,0 -112.5025,-50.75074000000001,0 -112.5026,-55.75074,0 -112.5027,-59.55075,0 -112.5028,-64.55074000000001,0 -112.5029,-69.55074000000001,0 -112.503,-74.55074000000001,0 -112.503,-75.55074999999999,0 -112.5031,-80.55074999999999,0 -112.5033,-85.55074999999999,0 -112.5033,-89.90000000000001,0 -113.4411,-89.90000000000001,0 -114.3788,-89.90000000000001,0 -115.3166,-89.90000000000001,0 -116.2543,-89.90000000000001,0 -117.1921,-89.90000000000001,0 -118.1298,-89.90000000000001,0 -119.0676,-89.90000000000001,0 -120.0053,-89.90000000000001,0 -120.943,-89.90000000000001,0 -121.8808,-89.90000000000001,0 -122.8185,-89.90000000000001,0 -123.7563,-89.90000000000001,0 -124.694,-89.90000000000001,0 -125.6318,-89.90000000000001,0 -126.5695,-89.90000000000001,0 -127.5073,-89.90000000000001,0 -127.5073,-84.89999,0 -127.5073,-79.90000000000001,0 -127.5073,-75.8,0 -127.5073,-70.8,0 -127.5073,-65.8,0 -127.5074,-60.8,0 -127.5074,-59.90001,0 -127.5074,-54.9,0 -127.5074,-49.90001,0 -127.5074,-44.9,0 -127.5074,-39.90000000000001,0 -127.5075,-34.9,0 -127.5075,-29.9,0 -127.5075,-26,0 -126,-26,0 -121,-26,0 -121,-22.5,0 -122.508,-22.5,0 -127.508,-22.5,0 -127.5079,-17.5,0 -127.5079,-12.5,0 -127.5079,-7.499998000000002,0 -127.5079,-2.500003,0 -127.5079,0.01058346,0 -127.5079,5.010579,0 -127.5079,10.01058,0 -127.5079,15.01058,0 -127.5079,18.21058,0 -127.5078,23.21058,0 -127.5078,28.21058,0 -127.5078,33.21058,0 -127.5078,38.21058,0 -127.5078,43.21058,0 -127.5078,48.21058000000001,0 -127.5078,49.81058,0 -131.0228,51.91016000000001,0 -132.1788,52.75157,0 -132.5012,53.02680000000001,0 -132.9926,53.51827999999999,0 -133.1971,53.93898,0 -133.0791,54.26532,0 -130.6491,54.70139000000001,0 -130.5897,54.79371,0 -130.3597,54.90805,0 -130.2311,55.035,0 -130.1014,55.22776,0 -129.9905,55.28166000000001,0 -130.1439,55.54139000000001,0 -130.1225,55.65499,0 -130.1747,55.75443000000001,0 -130.0151,55.90919000000001,0 -130.0147,56.02583000000001,0 -130.0886,56.11804000000001,0 -130.2292,56.09027,0 -130.4142,56.12887,0 -130.4619,56.23527,0 -130.6272,56.25861,0 -130.7744,56.3661,0 -131.055,56.39804,0 -131.5578,56.60221,0 -131.8242,56.59693,0 -131.8269,56.67916,0 -131.8845,56.74471000000001,0 -131.8614,56.79972,0 -132.1031,56.86666,0 -132.0275,57.03638,0 -132.3369,57.08832,0 -132.2267,57.20471,0 -132.8817,57.86361000000001,0 -133.0708,58.01222,0 -133.137,58.13582,0 -133.3611,58.28054,0 -133.4303,58.35999,0 -133.3879,58.41206,0 -133.43,58.45917,0 -133.6833,58.59554,0 -133.8269,58.7261,0 -134.2455,58.85695000000001,0 -134.3322,58.92972,0 -134.3114,58.96444000000001,0 -134.3953,58.98305,0 -134.3794,59.04916,0 -134.4614,59.12665,0 -134.5664,59.13055000000001,0 -134.6717,59.20027000000001,0 -134.688,59.24333,0 -134.9519,59.27999,0 -135.0161,59.34777,0 -134.9892,59.38999,0 -135.0917,59.42694,0 -135.0211,59.4711,0 -135.0145,59.5675,0 -135.1775,59.63693,0 -135.235,59.70305,0 -135.4736,59.80194,0 -135.9492,59.66916,0 -136.3439,59.60277,0 -136.2392,59.56138000000001,0 -136.2339,59.52583,0 -136.3716,59.45249,0 -136.4636,59.46970000000001,0 -136.4628,59.28944,0 -136.5839,59.16332,0 -136.8089,59.16526,0 -137.2961,58.98999,0 -137.445,58.90749,0 -137.5075,58.92556,0 -137.4797,58.99805,0 -137.5908,59.23860000000001,0 -137.9578,59.43166,0 -138.6158,59.77417000000001,0 -138.6903,59.90693,0 -139.0478,59.99749,0 -139.1889,60.08889,0 -139.0681,60.35222,0 -139.6767,60.34055,0 -139.9794,60.18776,0 -140.4508,60.30972000000001,0 -140.5214,60.22222,0 -140.9955,60.30721,0 -140.9997,65.30721,0 -141.0033,69.6567,0 -140.378,69.60579,0 -139.9315,69.62904000000002,0 -139.3828,69.55929,0 -139.1271,69.66159,0 -138.8806,69.61044,0 + + + 1 + + + + + +-126.1624,71.89608,0 -127.5151,70.49976,0 -127.5151,74.89999,0 -127.5151,79.90000000000001,0 -127.5151,84.90001,0 -127.5151,89.90000000000001,0 -126.5769,89.90000000000001,0 -125.6388,89.90000000000001,0 -124.7006,89.90000000000001,0 -123.7625,89.90000000000001,0 -122.8243,89.90000000000001,0 -121.8862,89.90000000000001,0 -120.948,89.90000000000001,0 -120.0099,89.90000000000001,0 -119.0717,89.90000000000001,0 -118.1335,89.90000000000001,0 -117.1954,89.90000000000001,0 -116.2572,89.90000000000001,0 -115.3191,89.90000000000001,0 -114.3809,89.90000000000001,0 -113.4428,89.90000000000001,0 -112.5046,89.90000000000001,0 -112.5046,84.90001,0 -112.5046,79.90000000000001,0 -112.5046,78.6159,0 -114.0755,78.39772000000001,0 -116.999,77.65592,0 -118.9626,77.43774000000001,0 -120.5771,76.91412,0 -121.9734,76.60868000000002,0 -123.1516,76.30323,0 -123.1952,75.95415,0 -124.8534,74.47057,0 -125.0715,74.16511,0 -124.8097,73.59784999999999,0 -126.1624,71.89608,0 + + + 1 + + + + + GMT -07:00 + + +]]> + #khStylem0700 + + + + +-97.51546,89.90000000000001,0 -97.51546,84.90001,0 -97.51546,80.63566,0 -102.0002,80.63531,0 -102.0004,75.63531,0 -102.0005,73.3723,0 -101.191,73.22286,0 -100.9536,73.20439,0 -100.5149,73.23768,0 -98.38002,72.95116,0 -98.29798,72.94485,0 -97.00784,72.74532000000001,0 -96.89134,72.69624,0 -96.71005,72.71178000000001,0 -96.41336,72.64267,0 -95.11967,72.46542,0 -93.87927000000001,72.25537,0 -93.74417000000003,72.01089,0 -93.19248000000002,71.65391,0 -92.93285,71.44838,0 -92.78141000000001,71.28612,0 -92.71651,71.11304,0 -92.57588,70.92914,0 -92.41362,70.81014,0 -92.1648,70.74524,0 -91.90519000000001,70.62624,0 -90.85590000000001,69.76086000000001,0 -90.1852,69.51204,0 -89.60105,69.45796,0 -89.08181999999999,69.33895,0 -89.01796000000002,69.28883,0 -89.01671000000002,69.25249000000001,0 -88.98090000000001,66.89502000000002,0 -93.98089000000002,66.90748000000001,0 -96.05273000000001,66.91264,0 -96.2137,66.9131,0 -101.2137,66.91991,0 -102.0007,66.92099,0 -102.0008,61.92099,0 -102.0009,59.99936,0 -106.0682,59.99960999999999,0 -110.0009,59.99528,0 -110.0003,54.99528000000001,0 -109.9998,49.99528000000001,0 -109.9997,49.0006,0 -104.9997,49.00018,0 -104.0625,49.0001,0 -104.0479,48.00007000000001,0 -103.9318,47.96657,0 -103.915,47.91,0 -103.9551,47.82047,0 -103.817,47.81991000000001,0 -103.8168,47.71054,0 -103.6829,47.71054,0 -103.6829,47.58421,0 -103.5878,47.58411,0 -103.5878,47.52712,0 -103.4097,47.53999,0 -103.3961,47.605,0 -103.3642,47.61639000000002,0 -103.0439,47.59749,0 -103,47.67471,0 -102.8392,47.60444,0 -102.6803,47.58082000000001,0 -102.6592,47.53583,0 -102.4334,47.53006,0 -102.3872,47.59027,0 -102.1996,47.57961,0 -102.0614,47.57729,0 -102.0163,47.53939,0 -101.8144,47.5023,0 -101.4348,47.56065000000001,0 -101.3807,47.52191000000001,0 -101.4371,47.46869000000001,0 -101.3423,47.2963,0 -101.1977,47.25529000000001,0 -101.1344,47.29811999999999,0 -100.9885,47.25916,0 -100.9889,47.19390000000001,0 -100.8747,47.04248,0 -100.93,46.98355000000001,0 -100.9013,46.90117,0 -100.8188,46.8093,0 -100.8355,46.75002,0 -100.7838,46.73688,0 -100.7804,46.68494,0 -100.6479,46.6602,0 -100.6235,46.60821,0 -100.5627,46.58238,0 -100.5988,46.47136,0 -100.5543,46.36341000000001,0 -100.5843,46.27890000000001,0 -100.5613,46.24074000000001,0 -100.628,46.11914,0 -100.5153,45.92761,0 -100.3773,45.86584,0 -100.3715,45.79243000000001,0 -100.3069,45.72111,0 -100.3307,45.66776000000001,0 -100.422,45.6551,0 -100.4905,45.55487,0 -100.4568,45.51511000000001,0 -100.3704,45.50183000000001,0 -100.2794,45.38273,0 -100.3219,45.31851,0 -100.2706,45.25081,0 -100.3317,45.10395000000001,0 -100.2805,45.03674,0 -100.4246,45.01186,0 -100.4071,44.85565,0 -100.5412,44.76557,0 -100.5997,44.76569,0 -100.7014,44.83079,0 -100.7303,44.80638,0 -100.7185,44.77095000000001,0 -100.6327,44.73686,0 -100.6343,44.57531,0 -100.5215,44.54869,0 -100.5922,44.4953,0 -100.5861,44.4632,0 -100.3989,44.45416,0 -100.3857,44.40596,0 -100.7452,43.9761,0 -100.7452,43.72055,0 -100.5873,43.76701,0 -100.4769,43.72082,0 -100.232,43.71497,0 -100.1977,42.99109,0 -100.9094,42.98817,0 -100.9094,42.85428,0 -100.8633,42.85428,0 -100.8633,42.80814,0 -100.8056,42.80621,0 -100.8056,42.74853,0 -100.8979,42.74853,0 -100.8979,42.66779,0 -100.8267,42.66779,0 -100.8267,42.48515,0 -100.8729,42.48515,0 -100.8729,42.29674,0 -100.6806,42.29481,0 -100.6806,42.08107,0 -100.8447,42.082,0 -100.8393,41.73868,0 -101.4083,41.73717,0 -101.4027,41.39172,0 -101.2625,41.39017,0 -101.2429,41.04119,0 -101.243,40.69778,0 -101.3406,40.69749,0 -101.3217,40.00183,0 -102.0511,39.99892,0 -102.049,39.5687,0 -101.4063,39.56715,0 -101.3867,39.12926,0 -101.4727,39.12796,0 -101.4782,38.69465,0 -101.5631,38.69329,0 -101.5204,37.73152,0 -102.0435,37.73439,0 -102.0368,36.98897,0 -102.9972,36.99850000000001,0 -102.9969,36.5,0 -103.0656,32,0 -104.9226,31.99982,0 -104.9016,30.81495,0 -104.9149,30.68164000000001,0 -104.9921,30.63846,0 -105.0022,30.68027,0 -105.2075,30.80166,0 -105.2614,30.79722,0 -105.3897,30.86222,0 -105.5672,31.00945,0 -105.5978,31.08,0 -105.7703,31.17611,0 -105.9489,31.36195,0 -106.2144,31.47528000000001,0 -106.3908,31.74472,0 -106.5229,31.78075000000001,0 -108.2086,31.78334,0 -108.2083,31.33305,0 -108.8319,31.33264,0 -108.8914,31.19222,0 -108.8361,31.15695,0 -108.7981,31.205,0 -108.735,30.6325,0 -108.6778,30.57583,0 -108.5581,29.99277,0 -108.6136,29.40111,0 -108.7078,29.40084,0 -108.6239,28.77111,0 -108.6895,28.69639000000001,0 -108.5656,28.28916,0 -108.6525,28.21222,0 -108.8808,28.29834,0 -108.977,28.30556,0 -109.022,28.27584,0 -109.0558,28.29917,0 -109.1464,28.17583,0 -108.9139,27.785,0 -108.8097,27.71167,0 -108.775,27.59945,0 -108.6553,27.52,0 -108.6675,27.40416,0 -108.6364,27.31917,0 -108.6653,27.15195,0 -108.6042,27.03805,0 -108.4713,26.96133,0 -108.405,27.03082,0 -108.3053,27.06138,0 -108.2489,27.04083,0 -108.2206,26.97277,0 -108.0356,26.94750000000001,0 -108.0039,26.81972,0 -107.8467,26.64,0 -107.7844,26.20028,0 -107.3664,26.11527,0 -107.2997,25.94334,0 -107.1517,25.77556,0 -107.0841,25.60609,0 -107.1194,25.20945,0 -107.0422,24.99416,0 -106.9489,24.84194,0 -106.885,24.77028,0 -106.8,24.75277,0 -106.7828,24.7025,0 -106.6508,24.58861,0 -106.5192,24.30194,0 -106.3961,24.28472,0 -106.2492,24.39027,0 -106.0022,24.21194,0 -105.9597,24.09889,0 -105.9081,24.05527,0 -105.8964,23.78945,0 -105.7181,23.47472,0 -105.6842,23.28722,0 -105.5289,23.14444,0 -105.4167,23.14722,0 -105.4021,23.06746,0 -105.3125,23.03472,0 -105.172,23.03972,0 -104.9147,22.92472,0 -104.88,22.78306,0 -104.9981,22.67889,0 -104.9981,22.54834,0 -104.7575,22.67666,0 -104.6606,22.62444,0 -104.6125,22.4725,0 -104.4914,22.41027,0 -104.345,22.45138,0 -104.3114,22.31921,0 -104.3296,22.26453,0 -104.4028,22.07638,0 -104.0936,21.78583,0 -104.1528,21.59805,0 -104.2072,21.54721,0 -103.9449,21.37497,0 -103.9614,21.28777,0 -104.0425,21.21139,0 -104.2277,21.17774,0 -104.21,20.97805,0 -104.275,20.86084,0 -104.2847,20.70916,0 -104.4672,20.82972,0 -104.535,20.91611,0 -104.625,20.9236,0 -104.7219,21.01278,0 -104.77,21.02055,0 -104.9489,20.92556,0 -105.0833,20.92528,0 -105.2669,20.69905,0 -105.2336,20.62889,0 -105.2503,20.56556,0 -105.352,20.51305,0 -105.5903,20.47805,0 -105.677,20.42417,0 -105.68,20.38639,0 -105.562,20.21917,0 -105.5422,20.07695,0 -105.4569,19.92222,0 -105.2144,19.6225,0 -105.1025,19.565,0 -105.0225,19.37195,0 -104.8967,19.28389,0 -104.797,19.28861,0 -104.8097,19.22084,0 -104.735,19.23,0 -104.6628,19.16805,0 -104.4483,19.09083,0 -104.3278,19.09527,0 -104.315,19.00805,0 -103.972,18.87722,0 -103.7147,18.6625,0 -103.6839,18.61138,0 -103.7047,18.58528,0 -103.5792,18.50083,0 -103.45,18.31361,0 -103.0294,18.19,0 -102.745,18.06582,0 -102.4875,18.02333,0 -102.181,17.92083,0 -102.0292,17.99195,0 -101.9214,17.96194,0 -101.7878,17.87611,0 -101.6331,17.66695,0 -101.5561,17.61777,0 -101.4978,17.62195,0 -101.4178,17.51861,0 -101.1044,17.35889,0 -101.0486,17.26694,0 -100.1864,16.95556,0 -100.0783,16.94166,0 -99.9389,16.88222,0 -99.90001,16.82555,0 -99.87807000000002,16.87028,0 -99.83778000000001,16.81445,0 -99.84972000000002,16.7875,0 -99.69222000000001,16.70834,0 -99.03695999999999,16.59694,0 -98.86473000000001,16.52444,0 -98.78223,16.55305,0 -98.53667,16.30695,0 -98.09807000000001,16.21416,0 -98.06444999999999,16.18389,0 -98.16724000000002,16.19695,0 -97.87000999999999,16.06195,0 -97.87112000000001,16.02139,0 -97.785,15.96861,0 -97.51684,15.94563,0 -97.51781,10.94564,0 -97.51877000000002,5.945633,0 -97.51974,0.9456385000000001,0 -97.52070999999999,-4.054366,0 -97.52168,-9.054360000000001,0 -97.52263000000001,-14.05436,0 -97.52332,-17.55437,0 -97.52416,-21.93729,0 -102.5242,-21.93729,0 -107.5242,-21.93729,0 -111.1275,-21.93729,0 -111.1033,-26.93723,0 -111.079,-31.93718000000001,0 -111.071,-33.59291,0 -106.0709,-33.59291,0 -101.071,-33.59291,0 -97.52641,-33.59291,0 -97.52773000000001,-38.59291,0 -97.52906000000002,-43.59291000000001,0 -97.53039000000003,-48.59291,0 -97.53172000000002,-53.59291,0 -97.53304,-58.59291000000001,0 -97.53437,-63.59291,0 -97.53570000000001,-68.5929,0 -97.53608,-70.01852,0 -97.53912000000001,-75.01852,0 -97.54217,-80.01852000000001,0 -97.54416999999999,-83.31852000000001,0 -97.54723000000001,-88.31852000000001,0 -97.54818000000002,-89.90000000000001,0 -98.54521,-89.90000000000001,0 -99.54222,-89.90000000000001,0 -100.5392,-89.90000000000001,0 -101.5362,-89.90000000000001,0 -102.5332,-89.90000000000001,0 -103.5303,-89.90000000000001,0 -104.5273,-89.90000000000001,0 -105.5243,-89.90000000000001,0 -106.5213,-89.90000000000001,0 -107.5183,-89.90000000000001,0 -108.5153,-89.90000000000001,0 -109.5123,-89.90000000000001,0 -110.5093,-89.90000000000001,0 -111.5063,-89.90000000000001,0 -112.5033,-89.90000000000001,0 -112.5033,-85.55074999999999,0 -112.5031,-80.55074999999999,0 -112.503,-75.55074999999999,0 -112.503,-74.55074000000001,0 -112.5029,-69.55074000000001,0 -112.5028,-64.55074000000001,0 -112.5027,-59.55075,0 -112.5026,-55.75074,0 -112.5025,-50.75074000000001,0 -112.5024,-45.75074000000002,0 -112.5023,-40.75074,0 -112.5022,-35.75074,0 -112.5021,-30.75074,0 -112.502,-25.75075,0 -112.5019,-23.55074,0 -112.5018,-18.55075,0 -112.5017,-13.55074,0 -112.5016,-8.550748000000001,0 -112.5015,-5.950747,0 -112.5014,-0.9507425000000002,0 -112.5013,4.049253,0 -112.5012,9.049256,0 -112.5011,14.04925,0 -112.501,19.04926,0 -112.5009,24.04926,0 -116.9047,24.05259,0 -116.9047,28.00672,0 -114.2077,28.00027,0 -114.1616,28.00056,0 -112.7233,27.99974,0 -112.1676,28.00019,0 -115.0172,31.95443,0 -114.9989,32.13611,0 -115.0415,32.25468,0 -114.9642,32.36861,0 -114.9367,32.47305,0 -114.8098,32.50699,0 -114.7956,32.60999,0 -114.7191,32.71846,0 -114.69,32.74276,0 -114.5417,32.7272,0 -114.5269,32.80082,0 -114.4581,32.86027,0 -114.4644,32.97165,0 -114.5089,33.0225,0 -114.6608,33.04193,0 -114.6961,33.08693,0 -114.6678,33.21554,0 -114.7286,33.30749,0 -114.6992,33.36055,0 -114.7261,33.40804,0 -114.6367,33.41999,0 -114.5264,33.56166,0 -114.5225,33.68415,0 -114.4839,33.72193,0 -114.5161,33.825,0 -114.4886,33.89249,0 -114.5225,33.95027,0 -114.4228,34.02638,0 -114.3903,34.10972,0 -114.1147,34.28249,0 -114.1672,34.3575,0 -114.3733,34.47304,0 -114.3697,34.52917,0 -114.4561,34.6986,0 -114.6222,34.88499,0 -114.6219,34.99214,0 -114.6333,35.04749,0 -114.6075,35.08221,0 -114.6364,35.12526,0 -114.5795,35.14415,0 -114.5686,35.22332,0 -114.5839,35.3411,0 -114.6683,35.51027000000001,0 -114.6439,35.62665,0 -114.6903,35.72499,0 -114.6917,35.81499,0 -114.6603,35.88194,0 -114.7405,35.98611,0 -114.7264,36.08277,0 -114.5506,36.16194,0 -114.4514,36.12777,0 -114.3575,36.1461,0 -114.2372,36.02583,0 -114.1208,36.05833,0 -114.0419,36.19972,0 -114.0403,37.00311,0 -114.0426,41.99549,0 -116.9849,42,0 -117.0169,42.58601000000001,0 -118.2066,42.59258,0 -118.2076,42.81335,0 -117.9707,42.81335,0 -117.9707,43.09735,0 -118.2191,43.09735,0 -118.2288,44.24651,0 -118.1505,44.26134,0 -118.0106,44.42295,0 -117.9629,44.4388,0 -117.5899,44.44006,0 -117.4845,44.37986,0 -117.482,44.29872,0 -117.1985,44.30091,0 -117.2122,44.48249,0 -117.1336,44.54388,0 -117.0278,44.74638000000001,0 -116.8958,44.8311,0 -116.8378,44.92443,0 -116.8372,45.02555000000001,0 -116.7114,45.17027,0 -116.6503,45.35638,0 -116.4533,45.60694,0 -116.5461,45.76222000000001,0 -116.7793,45.86157000000001,0 -116.7283,45.89332,0 -116.7175,45.97332000000001,0 -116.6217,46.00667000000001,0 -116.6122,46.04194,0 -116.2922,45.89305,0 -116.2728,45.86054000000002,0 -116.2992,45.69137,0 -116.2583,45.61999000000001,0 -116.2992,45.4586,0 -116.2811,45.42443000000001,0 -116.1983,45.40526000000001,0 -115.7964,45.46944,0 -115.4781,45.3886,0 -115.1775,45.58222000000001,0 -114.7511,45.40534,0 -114.798,45.43404000000001,0 -114.781,45.4964,0 -114.6612,45.46328000000001,0 -114.5395,45.56702000000001,0 -114.545,45.62778,0 -114.4908,45.71027,0 -114.5547,45.77943000000001,0 -114.4961,45.84470000000001,0 -114.3819,45.89249,0 -114.4164,45.92888000000001,0 -114.4022,45.98804,0 -114.4742,46.00193,0 -114.4853,46.04971,0 -114.45,46.10917,0 -114.5045,46.15972,0 -114.4319,46.19055000000001,0 -114.4561,46.26999,0 -114.3708,46.45361,0 -114.4003,46.50555,0 -114.3367,46.53582999999999,0 -114.325,46.66916000000001,0 -114.5764,46.64444,0 -114.6367,46.67388,0 -114.6178,46.71749000000001,0 -114.6694,46.75111,0 -114.765,46.71471,0 -114.7655,46.77638,0 -114.9064,46.84138000000001,0 -114.9156,46.92389000000001,0 -115.045,46.9886,0 -115.3183,47.2561,0 -115.4958,47.3011,0 -115.5803,47.38527000000001,0 -115.725,47.43721,0 -115.6347,47.48444,0 -115.7375,47.55583,0 -115.6742,47.60999,0 -115.7208,47.70805000000001,0 -116.0492,47.99333,0 -116.0483,48.99972000000001,0 -116.5332,49.00125000000001,0 -116.5611,49.11279,0 -116.6671,49.28718,0 -116.7472,49.33989,0 -116.8359,49.59236,0 -116.8967,49.64001,0 -116.877,49.79817000000001,0 -116.6975,49.85698,0 -116.7112,49.88435000000001,0 -116.4709,49.89754,0 -116.4435,49.98169000000002,0 -116.4993,50.06382000000001,0 -116.4521,50.15508000000001,0 -116.5616,50.21387,0 -116.5408,50.31831,0 -116.6179,50.31628,0 -116.6392,50.40956000000001,0 -116.7228,50.46025,0 -116.6894,50.48155,0 -116.6559,50.60120000000001,0 -116.5839,50.64782,0 -116.7811,50.69954,0 -116.8288,50.75225,0 -116.8136,50.78572,0 -116.915,50.77051,0 -116.9631,50.81107000000001,0 -117.0392,50.81512,0 -117.0432,50.85568000000001,0 -117.0858,50.8648,0 -117.0382,50.95707,0 -117.1659,50.97937000000001,0 -117.137,51.01789000000001,0 -117.1684,51.02501,0 -117.4224,51.40926000000001,0 -117.7393,51.42244,0 -117.8513,51.51675000000001,0 -117.8006,51.56642,0 -117.8462,51.58163,0 -117.8179,51.63131000000001,0 -117.8381,51.65870000000001,0 -117.9355,51.61814,0 -117.975,51.65362,0 -118.0663,51.6597,0 -118.0445,51.7621,0 -118.1043,51.85538,0 -118.6163,52.06324,0 -118.7623,52.17984,0 -118.6751,52.15347,0 -118.5869,52.19099,0 -118.5636,52.265,0 -118.4936,52.31367000000001,0 -118.3567,52.36639000000001,0 -118.2918,52.33801,0 -118.2276,52.37917000000001,0 -118.2597,52.44221,0 -118.2083,52.48082,0 -118.2869,52.52777,0 -118.2817,52.56527,0 -118.35,52.61805,0 -118.305,52.67471,0 -118.3461,52.74333,0 -118.4289,52.78611000000001,0 -118.4156,52.83638000000001,0 -118.4914,52.89777000000001,0 -118.625,52.88416,0 -118.6797,52.97054,0 -118.6633,53.01554000000002,0 -118.7275,53.06138,0 -118.7811,53.05583,0 -118.755,53.12083,0 -118.9597,53.23333,0 -119.0122,53.22305,0 -119.0136,53.14472000000001,0 -119.0378,53.13583,0 -119.2655,53.19666,0 -119.3528,53.27916,0 -119.3858,53.36166,0 -119.5989,53.37887,0 -119.6369,53.35166,0 -119.7381,53.395,0 -119.8153,53.49972,0 -119.9025,53.52027,0 -119.8828,53.56027,0 -119.9322,53.60722,0 -119.7686,53.60332,0 -119.7353,53.63499000000001,0 -119.8103,53.70777,0 -119.9211,53.71833000000002,0 -119.9047,53.7786,0 -119.9783,53.78889000000002,0 -120.0003,53.83022,0 -120.9006,54.20094000000001,0 -121.2157,54.48102000000001,0 -121.6533,54.53355,0 -122.8612,55.42631000000001,0 -123.5964,55.89894000000001,0 -124.1216,56.86174000000001,0 -124.0969,57.03444,0 -123.944,57.12243,0 -123.7545,57.12799,0 -123.5888,57.33548,0 -123.515,57.36665,0 -123.4541,57.3213,0 -123.4153,57.14465000000001,0 -122.2026,56.93232,0 -122.1153,56.9519,0 -122.0286,57.01699,0 -121.8406,56.99683,0 -121.7099,57.02437000000001,0 -121.2803,57.24454,0 -120.8415,57.23171000000001,0 -120.3444,57.478,0 -120.2163,57.45917,0 -120,57.26251,0 -120,60.00000000000001,0 -123.8157,60.00000000000001,0 -123.9743,60.09237000000001,0 -124.1953,60.32888,0 -124.2064,60.45722,0 -124.4183,60.47915,0 -124.4594,60.56972,0 -124.6142,60.66859,0 -124.6192,60.70972,0 -124.4769,60.79055000000001,0 -124.5919,60.96054000000001,0 -124.813,60.97249000000002,0 -124.8778,60.91721,0 -124.8717,60.85804,0 -125.1747,60.85054,0 -125.3492,60.7834,0 -125.712,60.82726000000001,0 -125.8872,60.89694,0 -125.957,60.87723,0 -126.0092,60.80341,0 -126.1072,60.81701,0 -126.1075,60.85894,0 -126.1709,60.86586000000001,0 -126.2395,60.8567,0 -126.2228,60.80284,0 -126.2728,60.78532,0 -126.3945,60.77668000000001,0 -126.5203,60.81442000000001,0 -126.6722,60.74347000000001,0 -126.7764,60.78527,0 -126.84,60.75722,0 -126.8869,60.78249000000001,0 -126.8797,60.82999,0 -126.9253,60.86221,0 -126.8989,60.94165,0 -126.9394,61.00249,0 -126.9353,61.05916,0 -127.0558,61.03999000000002,0 -127.1019,61.07083,0 -127.0108,61.13416,0 -127.0644,61.37249,0 -127.125,61.4011,0 -127.1417,61.46666,0 -127.2883,61.51916000000001,0 -127.3792,61.50721000000001,0 -127.5503,61.51138000000001,0 -127.9728,61.68860000000001,0 -128.0806,61.84916,0 -128.2136,61.85055,0 -128.2686,61.94055,0 -128.3881,61.99387999999999,0 -128.3753,62.02722000000001,0 -128.547,62.12222,0 -128.6775,62.12526,0 -128.7653,62.05833,0 -128.9842,62.13611,0 -129.1228,62.11667,0 -129.2939,62.15611,0 -129.1992,62.21694,0 -129.2822,62.26721,0 -129.3105,62.32639,0 -129.2158,62.37749000000001,0 -129.3083,62.42138000000001,0 -129.1722,62.48166,0 -129.4178,62.58499,0 -129.5678,62.57444000000001,0 -129.4878,62.61889,0 -129.5239,62.64333,0 -129.517,62.67249000000001,0 -129.6253,62.70499,0 -129.6308,62.76083,0 -129.7739,62.87443,0 -129.7025,62.89222000000002,0 -129.7261,62.91416,0 -129.7058,62.95222,0 -129.5989,63.05194000000001,0 -129.6372,63.08027,0 -129.8472,63.08694,0 -129.8353,63.11472000000001,0 -129.9003,63.19721,0 -129.9786,63.20361,0 -130.0445,63.26999,0 -130.1511,63.26582000000001,0 -130.1319,63.31555,0 -129.9192,63.37276,0 -129.8972,63.45221,0 -129.8195,63.48333000000001,0 -129.8981,63.57222,0 -129.958,63.58526,0 -129.9486,63.61361000000001,0 -130.093,63.63055,0 -130.1108,63.66443,0 -130.0825,63.68833,0 -130.1097,63.70361,0 -130.252,63.66666000000001,0 -130.3211,63.69582000000001,0 -130.2825,63.73777,0 -130.2342,63.73915,0 -130.1039,63.76416,0 -130.1197,63.80805,0 -130.3703,63.84388000000001,0 -130.5222,63.93499,0 -130.5811,63.92416,0 -130.7556,63.98693,0 -130.7786,64.00915999999999,0 -130.7514,64.0461,0 -130.8639,64.04304999999999,0 -130.8536,64.07249,0 -130.9478,64.13721,0 -130.8672,64.18777,0 -130.9372,64.20999999999999,0 -130.9797,64.26555000000001,0 -131.0605,64.27943000000001,0 -131.002,64.33028,0 -131.1417,64.42443,0 -131.3886,64.46720999999999,0 -131.4275,64.41638,0 -131.593,64.36859,0 -131.8181,64.37831,0 -131.8039,64.43803,0 -131.6878,64.4986,0 -131.6942,64.53498999999999,0 -131.9158,64.58249000000001,0 -132.0464,64.69553000000001,0 -132.1636,64.70166,0 -132.3689,64.77831999999999,0 -132.5706,64.77249999999999,0 -132.6153,64.81219,0 -132.4825,64.87691,0 -132.5075,64.96442,0 -132.3333,65.03471999999999,0 -132.3817,65.08499000000001,0 -132.54,65.09388,0 -132.5561,65.11803999999999,0 -132.5275,65.16277000000001,0 -132.5764,65.19054,0 -132.7147,65.15555000000001,0 -132.7878,65.18777,0 -132.7169,65.20387,0 -132.7836,65.22499000000001,0 -132.5553,65.28360000000001,0 -132.5214,65.36304,0 -132.3278,65.43471,0 -132.2736,65.54694000000001,0 -132.1719,65.59804,0 -132.3239,65.73997,0 -132.5294,65.82555000000001,0 -132.5733,65.84859,0 -132.54,65.88916,0 -132.3267,65.95193,0 -132.3536,65.99026000000001,0 -132.5103,65.97887,0 -132.5761,66.03055000000001,0 -132.7822,65.96720999999999,0 -132.817,65.91998,0 -132.9061,65.90833000000001,0 -132.9939,65.92303,0 -132.9084,65.99693000000001,0 -132.9397,66.02887,0 -133.1475,66.02469000000001,0 -133.4075,65.94386,0 -133.6294,65.97443,0 -133.6033,66.05165,0 -133.7047,66.07193,0 -133.6731,66.11693,0 -133.5639,66.15583,0 -133.57,66.27831999999999,0 -133.8247,66.31666,0 -133.7681,66.37303,0 -133.7503,66.44775,0 -133.6294,66.44525,0 -133.6903,66.53193,0 -133.5867,66.5647,0 -133.7719,66.64413999999999,0 -133.7572,66.68526,0 -133.8403,66.72776,0 -133.7639,66.80692999999999,0 -133.9081,66.90887000000001,0 -134.0925,66.95527,0 -134.0461,66.98441,0 -133.8311,67.00333000000001,0 -136.1645,67.00360000000001,0 -136.2222,67.06415,0 -136.1989,67.14333000000001,0 -136.2364,67.17386999999999,0 -136.1345,67.22638000000001,0 -136.0914,67.30247,0 -136.1428,67.35942,0 -136.1164,67.38274,0 -136.2053,67.40694000000001,0 -136.1578,67.50776999999999,0 -136.2411,67.62053,0 -136.4211,67.65526000000001,0 -136.445,67.71554999999999,0 -136.4442,68.43304000000001,0 -136.4447,68.58778,0 -136.4461,68.87302,0 -136.4206,68.90156,0 -136.2715,69.22282,0 -135.6703,69.64033000000001,0 -134.3343,69.85742999999999,0 -133.5828,69.57352,0 -130.4598,70.22484,0 -129.9588,70.14133,0 -129.7417,70.30833,0 -128.8733,70.34173000000001,0 -128.2554,70.67574000000001,0 -127.5151,70.49976,0 -126.1624,71.89608,0 -124.8097,73.59784999999999,0 -125.0715,74.16511,0 -124.8534,74.47057,0 -123.1952,75.95415,0 -123.1516,76.30323,0 -121.9734,76.60868000000002,0 -120.5771,76.91412,0 -118.9626,77.43774000000001,0 -116.999,77.65592,0 -114.0755,78.39772000000001,0 -112.5046,78.6159,0 -112.5046,79.90000000000001,0 -112.5046,84.90001,0 -112.5046,89.90000000000001,0 -111.5053,89.90000000000001,0 -110.5061,89.90000000000001,0 -109.5068,89.90000000000001,0 -108.5075,89.90000000000001,0 -107.5082,89.90000000000001,0 -106.509,89.90000000000001,0 -105.5097,89.90000000000001,0 -104.5104,89.90000000000001,0 -103.5111,89.90000000000001,0 -102.5119,89.90000000000001,0 -101.5126,89.90000000000001,0 -100.5133,89.90000000000001,0 -99.51402000000002,89.90000000000001,0 -98.51475000000001,89.90000000000001,0 -97.51546,89.90000000000001,0 + + + 1 + + + + GMT -06:00 + + +]]> + #khStylem0600 + + + + +-82.51007,89.90000000000001,0 -82.5051,84.90001,0 -82.50320000000001,82.97593999999999,0 -84.99902,82.98072000000001,0 -84.99903999999999,77.98072999999999,0 -84.99907,72.98072000000001,0 -84.9991,67.98071,0 -84.9991,66.25666,0 -85.64087000000001,66.05121,0 -86.11559,65.84233,0 -86.74223000000002,64.72197,0 -87.25494000000001,64.20925,0 -87.6917,63.6016,0 -87.52079000000001,63.03194,0 -86.66628,62.44327,0 -85.00069000000001,61.95694000000001,0 -85.00126,56.95695000000001,0 -85.00144,55.29702000000001,0 -85.39335,55.40889,0 -85.49944000000002,55.47222000000001,0 -85.56947,55.5586,0 -85.94445,55.69778,0 -86.27722000000001,55.72887,0 -86.47778,55.80888,0 -86.95889,55.90582,0 -86.97945,55.93166,0 -87.3625,55.94666,0 -87.35195,55.99276,0 -87.54861,56.04999,0 -87.61583,56.00277000000001,0 -87.58362,56.0761,0 -87.70805,56.1561,0 -87.72389,56.20388,0 -87.94305,56.37749000000001,0 -87.98277000000002,56.44165000000002,0 -88.3536,56.55332000000001,0 -88.48999000000001,56.64222000000001,0 -88.65472000000001,56.69638,0 -88.87944,56.85804000000001,0 -89.03778000000001,56.83611,0 -89.13284,56.86485,0 -89.30607999999999,56.62564,0 -89.62405000000001,56.43136,0 -89.60860000000001,51.43138,0 -89.59805,48.00918,0 -89.49317000000001,48.00332000000001,0 -90.41302,46.5882,0 -90.39612,46.54695,0 -90.33277,46.55915,0 -90.22278,46.50722,0 -90.12388,46.33972,0 -89.11749,46.14805,0 -88.83806,46.035,0 -88.64194999999999,46.00111,0 -88.52029000000002,46.02499,0 -88.11583000000002,45.93221,0 -88.08139,45.87777,0 -88.11834,45.80527000000001,0 -87.90083,45.75944,0 -87.80029,45.68415,0 -87.82556,45.65526000000001,0 -87.78751,45.59664999999999,0 -87.83,45.57166000000001,0 -87.8036,45.50139,0 -87.87027000000002,45.44221000000001,0 -87.88084000000001,45.36639,0 -87.67610000000002,45.38666000000001,0 -87.65055,45.35194,0 -87.71666999999999,45.26721,0 -87.735,45.18721000000001,0 -87.64861999999999,45.11694,0 -87.43716000000001,45.07106,0 -87.40428,45.19296000000001,0 -87.27666000000001,45.25579,0 -87.08848999999999,45.44498,0 -86.7586,45.44141000000001,0 -86.24245000000001,45.23384000000001,0 -86.57338000000001,44.99793,0 -86.71111000000001,44.83602,0 -86.83409,44.59161,0 -87.06783,43.96139,0 -87.15730000000001,43.41102,0 -87.02119000000002,42.48526,0 -87.21111000000002,41.76225,0 -86.52540999999999,41.75969,0 -86.52528000000001,41.66103,0 -86.48599,41.65967,0 -86.48571,41.58063,0 -86.5304,41.52581,0 -86.52912000000001,41.43995,0 -86.64751,41.43719,0 -86.76918000000001,41.30227,0 -86.88367,41.26608,0 -86.93285,41.17447,0 -86.93117,40.91845,0 -86.98653,40.9182,0 -86.98604,40.84695,0 -87.10338,40.84467,0 -87.10191,40.74436,0 -87.52641,40.74535,0 -87.53278,39.35695000000001,0 -87.62639,39.30471,0 -87.58945,39.20638,0 -87.65916,39.15582,0 -87.66861,39.10999,0 -87.59389,39.0561,0 -87.58611999999999,38.99554,0 -87.53416,38.95333,0 -87.55777000000001,38.86805,0 -87.51195,38.74527,0 -87.66583,38.55999,0 -87.64584000000001,38.49499,0 -87.75584000000001,38.45804,0 -87.75163000000001,38.41816,0 -87.61599,38.45092000000001,0 -87.54741,38.51014,0 -87.50431,38.49449,0 -87.47975,38.53218,0 -87.47684,38.46685,0 -87.41956,38.43461,0 -87.4182,38.37928,0 -87.319,38.37801,0 -87.30332,38.23492000000001,0 -86.79993,38.20176,0 -86.81465,38.13544,0 -86.78015000000001,38.10248,0 -86.77476,38.01123,0 -86.82632,37.99151,0 -86.75384,37.8983,0 -86.66867000000001,37.91314000000001,0 -86.64558,37.84594,0 -86.59833,37.92101,0 -86.52275,37.92781000000001,0 -86.50314,38.05159,0 -86.16003000000001,37.80325,0 -86.28140999999999,37.59924,0 -86.12286,37.5709,0 -86.05628,37.44679,0 -85.66943000000001,37.41729,0 -85.64707,37.4683,0 -85.59048,37.46286,0 -85.58540000000001,37.42731,0 -85.47422,37.34881,0 -85.39812000000002,37.2369,0 -85.41483,37.21706,0 -85.36129,37.19164,0 -85.32208,37.24111,0 -85.20011,37.26906,0 -85.17966,37.31235,0 -85.07001,37.25666,0 -85.0663,37.20251,0 -84.97011999999999,37.11,0 -84.91865,37.12032000000001,0 -84.92086000000001,37.05594,0 -84.84885000000001,36.99782,0 -84.77699,36.95735,0 -84.68555000000001,36.98052,0 -84.58721,36.87076,0 -84.59557000000001,36.80482,0 -84.67641,36.7645,0 -84.79111,36.60536,0 -84.65366,36.39601,0 -84.77486,36.3341,0 -84.78586,36.29548,0 -84.866,36.28408,0 -84.9053,36.15482,0 -84.79865,36.09025,0 -84.67876,35.91422,0 -84.76385999999999,35.82634,0 -84.89986,35.77536,0 -84.97051999999999,35.6754,0 -85.10691000000001,35.58106,0 -85.13974,35.50185,0 -85.11647000000001,35.48328,0 -85.14761,35.45309,0 -85.17104000000001,35.46849,0 -85.38441,35.15899,0 -85.36797,35.06706,0 -85.46741,34.99005,0 -85.62070000000001,34.9901,0 -85.3925,33.99749,0 -85.17416,32.82417000000001,0 -85.13276999999999,32.7786,0 -85.10445,32.64415,0 -84.99306,32.51193,0 -84.96278,32.42333,0 -84.99695,32.33583,0 -84.89417000000002,32.26944,0 -85.05083000000001,32.13832,0 -85.06027,32.00388,0 -85.14111,31.82611,0 -85.03751,31.54083,0 -85.10889,31.27111,0 -85.09972000000001,31.17888,0 -85.00557000000001,31.06222,0 -85.00448,31.00173,0 -84.93167,30.88832,0 -84.91332,30.75332,0 -84.86639000000001,30.71832,0 -84.98378,30.54212,0 -84.98756,30.44610000000001,0 -85.029,30.42799,0 -85.01819999999999,30.37397,0 -85.14525999999999,30.13059,0 -85.11667,30.03346,0 -85.02682,29.97955,0 -85.02878,29.81974,0 -85.04214,29.7827,0 -85.11682,29.77658,0 -85.21616,29.69783,0 -85.05280000000001,29.59025,0 -84.98586,29.60068,0 -84.76974,29.69064,0 -84.67976,29.76196,0 -84.34405,29.89086,0 -84.32649000000001,29.96329,0 -84.18716000000001,30.06915,0 -84.00285,30.07809,0 -83.73586,29.94671,0 -83.60023000000001,29.82804,0 -83.58752,29.756,0 -83.42648,29.65429,0 -83.40105,29.5102,0 -83.13406000000001,29.26864,0 -83.04929,29.13302,0 -82.97725000000001,29.1754,0 -82.81621,29.14997,0 -82.65092,28.70922,0 -82.66786999999999,28.52699,0 -82.81197,28.15403,0 -82.86282,27.87009,0 -82.65622999999999,27.34336,0 -82.67905,24.16667,0 -86.05847,24.16667,0 -86.05847,19.16667,0 -86.05847,18.18773,0 -82.60478999999999,18.18773,0 -82.60478999999999,13.18773,0 -82.60478999999999,9.495170999999999,0 -82.66473000000001,9.495278000000001,0 -82.74890000000001,9.584163,0 -82.83307000000001,9.612215000000001,0 -82.87575,9.558963,0 -82.83338999999999,9.498041000000001,0 -82.93473,9.471663,0 -82.93047,9.063126000000001,0 -82.88890000000001,9.074448,0 -82.71084999999999,8.931113,0 -82.87779000000001,8.827496999999999,0 -82.85778999999999,8.809163,0 -82.91446999999999,8.762786999999999,0 -82.83196,8.626661,0 -82.82993,8.474651,0 -83.04834000000001,8.326105999999999,0 -82.93085000000001,8.254719,0 -82.88612000000001,8.103338000000003,0 -82.89883,8.025668,0 -82.86584000000001,8.020835999999999,0 -82.85028,8.060003,0 -82.8753,8.190837,0 -82.84778,8.270838,0 -82.72168000000002,8.317214,0 -82.60478999999999,8.304010999999999,0 -82.60348999999999,3.304008,0 -82.60218,-1.695988,0 -82.60088,-6.695992,0 -82.59957,-11.69599,0 -82.59827000000001,-16.69599,0 -82.59696,-21.69599,0 -82.59626,-24.39248,0 -82.59408000000001,-29.39247,0 -82.59188,-34.39248,0 -82.58971,-39.39247,0 -82.58879000000002,-41.49248,0 -82.5866,-46.49247,0 -82.58441999999999,-51.49246999999999,0 -82.58223,-56.49247,0 -82.58005,-61.49247,0 -82.57787,-66.49247,0 -82.57568000000001,-71.49247,0 -82.57349000000001,-76.49247000000001,0 -82.57227,-79.29246999999999,0 -82.57008,-84.29246999999999,0 -82.56790000000001,-89.29246999999999,0 -82.56762999999999,-89.90000000000001,0 -83.56634,-89.90000000000001,0 -84.56502999999999,-89.90000000000001,0 -85.56374,-89.90000000000001,0 -86.56245,-89.90000000000001,0 -87.56115,-89.90000000000001,0 -88.55985,-89.90000000000001,0 -89.55856,-89.90000000000001,0 -90.55726,-89.90000000000001,0 -91.55596000000001,-89.90000000000001,0 -92.55466,-89.90000000000001,0 -93.55338,-89.90000000000001,0 -94.55207,-89.90000000000001,0 -95.55079000000001,-89.90000000000001,0 -96.54949000000003,-89.90000000000001,0 -97.54818000000002,-89.90000000000001,0 -97.54723000000001,-88.31852000000001,0 -97.54416999999999,-83.31852000000001,0 -97.54217,-80.01852000000001,0 -97.53912000000001,-75.01852,0 -97.53608,-70.01852,0 -97.53570000000001,-68.5929,0 -97.53437,-63.59291,0 -97.53304,-58.59291000000001,0 -97.53172000000002,-53.59291,0 -97.53039000000003,-48.59291,0 -97.52906000000002,-43.59291000000001,0 -97.52773000000001,-38.59291,0 -97.52641,-33.59291,0 -101.071,-33.59291,0 -106.0709,-33.59291,0 -111.071,-33.59291,0 -111.079,-31.93718000000001,0 -111.1033,-26.93723,0 -111.1275,-21.93729,0 -107.5242,-21.93729,0 -102.5242,-21.93729,0 -97.52416,-21.93729,0 -97.52332,-17.55437,0 -97.52263000000001,-14.05436,0 -97.52168,-9.054360000000001,0 -97.52070999999999,-4.054366,0 -97.51974,0.9456385000000001,0 -97.51877000000002,5.945633,0 -97.51781,10.94564,0 -97.51684,15.94563,0 -97.785,15.96861,0 -97.87112000000001,16.02139,0 -97.87000999999999,16.06195,0 -98.16724000000002,16.19695,0 -98.06444999999999,16.18389,0 -98.09807000000001,16.21416,0 -98.53667,16.30695,0 -98.78223,16.55305,0 -98.86473000000001,16.52444,0 -99.03695999999999,16.59694,0 -99.69222000000001,16.70834,0 -99.84972000000002,16.7875,0 -99.83778000000001,16.81445,0 -99.87807000000002,16.87028,0 -99.90001,16.82555,0 -99.9389,16.88222,0 -100.0783,16.94166,0 -100.1864,16.95556,0 -101.0486,17.26694,0 -101.1044,17.35889,0 -101.4178,17.51861,0 -101.4978,17.62195,0 -101.5561,17.61777,0 -101.6331,17.66695,0 -101.7878,17.87611,0 -101.9214,17.96194,0 -102.0292,17.99195,0 -102.181,17.92083,0 -102.4875,18.02333,0 -102.745,18.06582,0 -103.0294,18.19,0 -103.45,18.31361,0 -103.5792,18.50083,0 -103.7047,18.58528,0 -103.6839,18.61138,0 -103.7147,18.6625,0 -103.972,18.87722,0 -104.315,19.00805,0 -104.3278,19.09527,0 -104.4483,19.09083,0 -104.6628,19.16805,0 -104.735,19.23,0 -104.8097,19.22084,0 -104.797,19.28861,0 -104.8967,19.28389,0 -105.0225,19.37195,0 -105.1025,19.565,0 -105.2144,19.6225,0 -105.4569,19.92222,0 -105.5422,20.07695,0 -105.562,20.21917,0 -105.68,20.38639,0 -105.677,20.42417,0 -105.5903,20.47805,0 -105.352,20.51305,0 -105.2503,20.56556,0 -105.2336,20.62889,0 -105.2669,20.69905,0 -105.0833,20.92528,0 -104.9489,20.92556,0 -104.77,21.02055,0 -104.7219,21.01278,0 -104.625,20.9236,0 -104.535,20.91611,0 -104.4672,20.82972,0 -104.2847,20.70916,0 -104.275,20.86084,0 -104.21,20.97805,0 -104.2277,21.17774,0 -104.0425,21.21139,0 -103.9614,21.28777,0 -103.9449,21.37497,0 -104.2072,21.54721,0 -104.1528,21.59805,0 -104.0936,21.78583,0 -104.4028,22.07638,0 -104.3296,22.26453,0 -104.3114,22.31921,0 -104.345,22.45138,0 -104.4914,22.41027,0 -104.6125,22.4725,0 -104.6606,22.62444,0 -104.7575,22.67666,0 -104.9981,22.54834,0 -104.9981,22.67889,0 -104.88,22.78306,0 -104.9147,22.92472,0 -105.172,23.03972,0 -105.3125,23.03472,0 -105.4021,23.06746,0 -105.4167,23.14722,0 -105.5289,23.14444,0 -105.6842,23.28722,0 -105.7181,23.47472,0 -105.8964,23.78945,0 -105.9081,24.05527,0 -105.9597,24.09889,0 -106.0022,24.21194,0 -106.2492,24.39027,0 -106.3961,24.28472,0 -106.5192,24.30194,0 -106.6508,24.58861,0 -106.7828,24.7025,0 -106.8,24.75277,0 -106.885,24.77028,0 -106.9489,24.84194,0 -107.0422,24.99416,0 -107.1194,25.20945,0 -107.0841,25.60609,0 -107.1517,25.77556,0 -107.2997,25.94334,0 -107.3664,26.11527,0 -107.7844,26.20028,0 -107.8467,26.64,0 -108.0039,26.81972,0 -108.0356,26.94750000000001,0 -108.2206,26.97277,0 -108.2489,27.04083,0 -108.3053,27.06138,0 -108.405,27.03082,0 -108.4713,26.96133,0 -108.6042,27.03805,0 -108.6653,27.15195,0 -108.6364,27.31917,0 -108.6675,27.40416,0 -108.6553,27.52,0 -108.775,27.59945,0 -108.8097,27.71167,0 -108.9139,27.785,0 -109.1464,28.17583,0 -109.0558,28.29917,0 -109.022,28.27584,0 -108.977,28.30556,0 -108.8808,28.29834,0 -108.6525,28.21222,0 -108.5656,28.28916,0 -108.6895,28.69639000000001,0 -108.6239,28.77111,0 -108.7078,29.40084,0 -108.6136,29.40111,0 -108.5581,29.99277,0 -108.6778,30.57583,0 -108.735,30.6325,0 -108.7981,31.205,0 -108.8361,31.15695,0 -108.8914,31.19222,0 -108.8319,31.33264,0 -108.2083,31.33305,0 -108.2086,31.78334,0 -106.5229,31.78075000000001,0 -106.3908,31.74472,0 -106.2144,31.47528000000001,0 -105.9489,31.36195,0 -105.7703,31.17611,0 -105.5978,31.08,0 -105.5672,31.00945,0 -105.3897,30.86222,0 -105.2614,30.79722,0 -105.2075,30.80166,0 -105.0022,30.68027,0 -104.9921,30.63846,0 -104.9149,30.68164000000001,0 -104.9016,30.81495,0 -104.9226,31.99982,0 -103.0656,32,0 -102.9969,36.5,0 -102.9972,36.99850000000001,0 -102.0368,36.98897,0 -102.0435,37.73439,0 -101.5204,37.73152,0 -101.5631,38.69329,0 -101.4782,38.69465,0 -101.4727,39.12796,0 -101.3867,39.12926,0 -101.4063,39.56715,0 -102.049,39.5687,0 -102.0511,39.99892,0 -101.3217,40.00183,0 -101.3406,40.69749,0 -101.243,40.69778,0 -101.2429,41.04119,0 -101.2625,41.39017,0 -101.4027,41.39172,0 -101.4083,41.73717,0 -100.8393,41.73868,0 -100.8447,42.082,0 -100.6806,42.08107,0 -100.6806,42.29481,0 -100.8729,42.29674,0 -100.8729,42.48515,0 -100.8267,42.48515,0 -100.8267,42.66779,0 -100.8979,42.66779,0 -100.8979,42.74853,0 -100.8056,42.74853,0 -100.8056,42.80621,0 -100.8633,42.80814,0 -100.8633,42.85428,0 -100.9094,42.85428,0 -100.9094,42.98817,0 -100.1977,42.99109,0 -100.232,43.71497,0 -100.4769,43.72082,0 -100.5873,43.76701,0 -100.7452,43.72055,0 -100.7452,43.9761,0 -100.3857,44.40596,0 -100.3989,44.45416,0 -100.5861,44.4632,0 -100.5922,44.4953,0 -100.5215,44.54869,0 -100.6343,44.57531,0 -100.6327,44.73686,0 -100.7185,44.77095000000001,0 -100.7303,44.80638,0 -100.7014,44.83079,0 -100.5997,44.76569,0 -100.5412,44.76557,0 -100.4071,44.85565,0 -100.4246,45.01186,0 -100.2805,45.03674,0 -100.3317,45.10395000000001,0 -100.2706,45.25081,0 -100.3219,45.31851,0 -100.2794,45.38273,0 -100.3704,45.50183000000001,0 -100.4568,45.51511000000001,0 -100.4905,45.55487,0 -100.422,45.6551,0 -100.3307,45.66776000000001,0 -100.3069,45.72111,0 -100.3715,45.79243000000001,0 -100.3773,45.86584,0 -100.5153,45.92761,0 -100.628,46.11914,0 -100.5613,46.24074000000001,0 -100.5843,46.27890000000001,0 -100.5543,46.36341000000001,0 -100.5988,46.47136,0 -100.5627,46.58238,0 -100.6235,46.60821,0 -100.6479,46.6602,0 -100.7804,46.68494,0 -100.7838,46.73688,0 -100.8355,46.75002,0 -100.8188,46.8093,0 -100.9013,46.90117,0 -100.93,46.98355000000001,0 -100.8747,47.04248,0 -100.9889,47.19390000000001,0 -100.9885,47.25916,0 -101.1344,47.29811999999999,0 -101.1977,47.25529000000001,0 -101.3423,47.2963,0 -101.4371,47.46869000000001,0 -101.3807,47.52191000000001,0 -101.4348,47.56065000000001,0 -101.8144,47.5023,0 -102.0163,47.53939,0 -102.0614,47.57729,0 -102.1996,47.57961,0 -102.3872,47.59027,0 -102.4334,47.53006,0 -102.6592,47.53583,0 -102.6803,47.58082000000001,0 -102.8392,47.60444,0 -103,47.67471,0 -103.0439,47.59749,0 -103.3642,47.61639000000002,0 -103.3961,47.605,0 -103.4097,47.53999,0 -103.5878,47.52712,0 -103.5878,47.58411,0 -103.6829,47.58421,0 -103.6829,47.71054,0 -103.8168,47.71054,0 -103.817,47.81991000000001,0 -103.9551,47.82047,0 -103.915,47.91,0 -103.9318,47.96657,0 -104.0479,48.00007000000001,0 -104.0625,49.0001,0 -104.9997,49.00018,0 -109.9997,49.0006,0 -109.9998,49.99528000000001,0 -110.0003,54.99528000000001,0 -110.0009,59.99528,0 -106.0682,59.99960999999999,0 -102.0009,59.99936,0 -102.0008,61.92099,0 -102.0007,66.92099,0 -101.2137,66.91991,0 -96.2137,66.9131,0 -96.05273000000001,66.91264,0 -93.98089000000002,66.90748000000001,0 -88.98090000000001,66.89502000000002,0 -89.01671000000002,69.25249000000001,0 -89.01796000000002,69.28883,0 -89.08181999999999,69.33895,0 -89.60105,69.45796,0 -90.1852,69.51204,0 -90.85590000000001,69.76086000000001,0 -91.90519000000001,70.62624,0 -92.1648,70.74524,0 -92.41362,70.81014,0 -92.57588,70.92914,0 -92.71651,71.11304,0 -92.78141000000001,71.28612,0 -92.93285,71.44838,0 -93.19248000000002,71.65391,0 -93.74417000000003,72.01089,0 -93.87927000000001,72.25537,0 -95.11967,72.46542,0 -96.41336,72.64267,0 -96.71005,72.71178000000001,0 -96.89134,72.69624,0 -97.00784,72.74532000000001,0 -98.29798,72.94485,0 -98.38002,72.95116,0 -100.5149,73.23768,0 -100.9536,73.20439,0 -101.191,73.22286,0 -102.0005,73.3723,0 -102.0004,75.63531,0 -102.0002,80.63531,0 -97.51546,80.63566,0 -97.51546,84.90001,0 -97.51546,89.90000000000001,0 -96.57764,89.90000000000001,0 -95.63981000000001,89.90000000000001,0 -94.70197,89.90000000000001,0 -93.76412000000002,89.90000000000001,0 -92.82628,89.90000000000001,0 -91.88844000000002,89.90000000000001,0 -90.95061,89.90000000000001,0 -90.01277,89.90000000000001,0 -89.07494,89.90000000000001,0 -88.1371,89.90000000000001,0 -87.19926,89.90000000000001,0 -86.26142,89.90000000000001,0 -85.32359,89.90000000000001,0 -84.38574,89.90000000000001,0 -83.44790999999999,89.90000000000001,0 -82.51007,89.90000000000001,0 + + + 1 + + + + GMT -05:00 + + +]]> + #khStylem0500 + + + + +-67.50302000000001,89.90000000000001,0 -67.50302000000001,84.90001,0 -67.50302000000001,82.99629,0 -64.77722,82.92871,0 -63.38053000000001,82.86113,0 -62.89619,82.57953999999999,0 -61.43191,82.50069000000002,0 -59.49456,82.01636000000002,0 -60.51955,81.93752000000001,0 -61.47697000000001,81.79107999999999,0 -61.49949,81.73477000000001,0 -61.02642,81.47570000000002,0 -61.31927,81.39686,0 -61.35306000000001,81.34054,0 -61.30801,81.16032,0 -61.55581000000002,81.11526000000001,0 -62.23162000000001,81.21664,0 -62.97503,81.25042999999999,0 -63.81981,81.14906000000001,0 -63.96624000000001,81.07021000000002,0 -64.79975,81.00261999999999,0 -64.91238,80.92377000000001,0 -66.44423999999999,80.6084,0 -66.78216000000001,80.72104,0 -66.92856999999999,80.65346,0 -66.92856999999999,80.47324,0 -67.49175,80.34933,0 -67.54808,80.29301,0 -67.52555,80.18038,0 -67.10879,80.04520000000001,0 -66.66951,80.05649,0 -66.0838,80.00015999999999,0 -65.64452,80.00015999999999,0 -65.29535,80.06775,0 -65.14892000000002,79.84247000000001,0 -64.97996999999999,79.47077,0 -65.98242999999999,79.14412,0 -67.31153999999999,79.16665000000002,0 -67.76724,79.10155,0 -72.55276000000001,78.52284,0 -72.5564,77.34211000000001,0 -68.07777,75.93836,0 -68.07777,75.31999999999999,0 -68.07777,70.31999999999999,0 -67.77307,70.28399,0 -67.50825,70.17017,0 -67.20399999999999,69.97538,0 -66.70717000000001,69.43039,0 -66.59773,69.21590000000001,0 -66.53207,68.44109,0 -66.06807000000001,68.37982,0 -64.37838000000001,68.03400000000001,0 -63.71739,67.86327,0 -61.94015000000002,67.30296000000001,0 -61.12597,66.90025,0 -60.93336000000002,66.62885,0 -61.43238,66.19110000000001,0 -61.97518,65.88468,0 -62.08899,65.51698,0 -62.6493,65.48196,0 -63.50727,64.82534,0 -63.97128,63.76601000000001,0 -63.98004,63.25823000000001,0 -64.29521,62.44402000000001,0 -64.6279,61.34092,0 -64.39993,60.38216,0 -64.48108000000001,60.36652000000001,0 -64.53325,60.3025,0 -64.56751,60.30471,0 -64.8586,60.25583000000001,0 -64.76723,60.175,0 -64.63721,60.17833,0 -64.59778,60.11749,0 -64.73416,60.10333,0 -64.7025,60.06499,0 -64.79695,60.03972,0 -64.90639,60.04805,0 -64.84778,59.96416,0 -64.6536,59.92999,0 -64.66191000000001,59.88361,0 -64.76778,59.87999,0 -64.74445,59.84499,0 -64.81416000000002,59.81889,0 -64.77306,59.69887,0 -64.83307000000001,59.53971,0 -64.70084,59.44583000000001,0 -64.43249,59.52944,0 -64.34334,59.50111,0 -64.50696000000001,59.42832000000001,0 -64.485,59.39638,0 -64.53806,59.37360000000001,0 -64.49916,59.33972000000001,0 -64.53834000000001,59.29055,0 -64.50751,59.25,0 -64.53471999999999,59.19749000000001,0 -64.49306,59.15888,0 -64.48917,59.09943,0 -64.34972000000001,59.06666000000001,0 -64.29138,59.00527,0 -64.46084000000001,58.98443,0 -64.72,59.07,0 -64.82946,59.03249,0 -64.86472000000001,58.99054,0 -64.83890000000001,58.9586,0 -64.88332,58.93194,0 -64.80943000000002,58.9111,0 -64.71888,58.94527000000001,0 -64.56807000000001,58.88721000000001,0 -64.30029,58.88249,0 -64.25861999999999,58.85000000000001,0 -64.25751,58.77944000000001,0 -64.15611,58.74528,0 -63.97472000000001,58.8261,0 -63.83333,58.8325,0 -63.77083,58.87554000000001,0 -63.58834,58.84638000000002,0 -63.4825,58.77055000000001,0 -63.50611,58.73194,0 -64.02916999999999,58.68694,0 -64.08611999999999,58.63777,0 -64.10056,58.57916,0 -64.04277,58.52388000000001,0 -63.89806,58.56499,0 -63.84584,58.50805,0 -63.81555,58.47805000000001,0 -63.85918,58.43776,0 -64.0025,58.42527,0 -64.03667,58.37499,0 -64.16306,58.34389,0 -64.21861,58.23082,0 -64.38721,58.19137000000001,0 -64.43195,58.08611,0 -64.20862,58.03334,0 -64.21445,57.97748,0 -64.05749,57.76943000000001,0 -64.02251,57.77138,0 -64.00666,57.81276,0 -63.92666,57.79722,0 -63.89194,57.73027,0 -63.82556000000002,57.69027,0 -63.76528,57.73277000000001,0 -63.70055,57.66277000000001,0 -63.65333,57.7311,0 -63.58944,57.72526,0 -63.60723,57.66361,0 -63.76501,57.57388,0 -63.75723000000001,57.43444000000001,0 -63.7075,57.3786,0 -63.83694000000001,57.32583000000002,0 -63.87583,57.23193000000001,0 -63.86584000000001,57.19583000000001,0 -63.83944,57.20054,0 -63.80500000000001,57.28027,0 -63.7411,57.23277,0 -63.79249999999999,57.16526000000001,0 -63.78751,57.11193999999999,0 -63.87361,57.06638000000002,0 -63.86333,56.99276,0 -63.91779,56.93027000000001,0 -63.87138,56.87805000000001,0 -64.00528,56.85054000000001,0 -63.99222000000002,56.78582,0 -64.08362,56.76554,0 -64.12888,56.69943,0 -63.945,56.54972,0 -63.94611,56.48388,0 -63.87138,56.43942,0 -63.97472000000001,56.41277,0 -64.16972,56.42778,0 -64.11417,56.39027000000001,0 -64.10584,56.33139000000001,0 -64.13667,56.3036,0 -64.08667,56.25916000000001,0 -63.97472000000001,56.25916000000001,0 -63.87694,56.21721,0 -64.01083,56.15999,0 -64.02028,56.07638000000001,0 -63.84778,56.12027,0 -63.88,56.07695,0 -63.81333,56.0425,0 -63.445,56.02276,0 -63.69416,55.94222,0 -63.71528,55.85917000000001,0 -63.48833000000001,55.69665000000001,0 -63.44806,55.59943,0 -63.29833000000001,55.52333,0 -63.14416,55.52638000000001,0 -63.17445,55.40971,0 -63.09333,55.34583000000001,0 -63.11423,55.31608,0 -63.51944,55.1836,0 -63.56611000000002,55.06027,0 -63.43528000000001,54.97360000000001,0 -63.54194,54.84055,0 -63.62361,54.66610000000001,0 -63.72084,54.59665,0 -63.97619000000001,54.62645000000001,0 -64.34723,54.75527,0 -64.55222000000001,54.72055,0 -64.81166,54.74917000000001,0 -65.09445,54.69555,0 -65.44387999999999,54.74583000000001,0 -65.68998000000001,54.71332,0 -65.83528,54.83138,0 -65.85834,54.90778,0 -65.95778,54.92944000000001,0 -66.035,54.90972,0 -66.23999000000001,54.99194000000001,0 -66.57640000000001,55.25055,0 -66.68195,55.25333,0 -66.68804,55.3011,0 -66.80029,55.33999000000001,0 -66.83389,55.31332,0 -66.6889,55.20416,0 -66.74083,55.17749,0 -66.76585,55.10556,0 -66.65944000000002,54.97942,0 -66.73166999999999,54.94332,0 -66.605,54.79084,0 -66.71222,54.78194,0 -66.71806000000001,54.73193,0 -66.94694,54.80165,0 -67.02806000000001,54.89778,0 -67.30943000000001,55.01554000000001,0 -67.27388999999999,55.06666,0 -67.42833,55.07111,0 -67.45305999999999,55.01888,0 -67.36221000000001,54.87582,0 -67.26334,54.82527,0 -67.30777000000001,54.78388,0 -67.185,54.71943000000001,0 -67.2139,54.66888000000001,0 -67.03639,54.62166,0 -67.21945,54.6075,0 -67.30556,54.50416,0 -67.49249,54.58194,0 -67.60139,54.56639000000001,0 -67.63306,54.47999000000001,0 -67.58611999999999,54.4175,0 -67.59583000000001,54.36527000000001,0 -67.49472,54.31444000000001,0 -67.53167000000001,54.24889,0 -67.485,54.23416,0 -67.69611,54.1386,0 -67.71556,54.12944000000001,0 -67.78195,54.06388,0 -67.76055,54.01583000000001,0 -67.60916,53.92804000000001,0 -67.58804000000001,53.85722,0 -67.43195,53.78305,0 -67.49194,53.60388,0 -67.14194999999999,53.54221,0 -67.12888,53.46416,0 -67.06862,53.4286,0 -67.06779,53.38417,0 -66.9875,53.40359,0 -66.9025,53.3261,0 -66.99027,53.20082000000001,0 -66.94861,53.10972000000002,0 -66.97945000000001,53.02777,0 -67.07805999999999,52.94804000000001,0 -67.05833,52.80499,0 -67.08945,52.7197,0 -66.89138,52.67333000000001,0 -66.87470999999999,52.74778,0 -66.80556,52.66554,0 -66.75501,52.71027000000001,0 -66.66806,52.72581,0 -66.64806,52.94583,0 -66.52528,52.94332000000001,0 -66.47694,53.03416,0 -66.35472,52.98166,0 -66.26973,52.87749,0 -66.37888,52.83611,0 -66.32834,52.73693,0 -66.43388,52.70638,0 -66.43222,52.61138,0 -66.37361,52.54249999999999,0 -66.44665999999999,52.53082,0 -66.35805000000002,52.40666,0 -66.45862,52.3661,0 -66.48556000000001,52.30721,0 -66.43889,52.20083,0 -66.33556,52.13639,0 -66.30388000000001,52.22276,0 -66.31973000000001,52.28916000000001,0 -66.26667000000001,52.31138,0 -66.17389000000001,52.22055,0 -66.06807000000001,52.21638000000001,0 -66.06751000000001,52.12276,0 -65.91695,52.05082,0 -65.80167,52.04278,0 -65.79944,52.09555,0 -65.75861,52.11139,0 -65.58056999999999,52.04278,0 -65.4614,52.20665000000001,0 -65.10861,52.17082,0 -64.85334,52.02193000000001,0 -64.84584,51.93083000000001,0 -64.58778,51.82888,0 -64.59389,51.79610000000001,0 -64.71805999999999,51.74778000000001,0 -64.70305999999999,51.69277000000002,0 -64.60417,51.64277,0 -64.58112,51.55778,0 -64.44249000000001,51.66776999999999,0 -64.26418,51.73972000000001,0 -64.35722,51.85055000000001,0 -64.31751,51.90359999999999,0 -64.33085,51.96527,0 -64.27444,52.00332,0 -64.29333,52.04639,0 -64.25779,52.12804,0 -64.11861,52.14472,0 -64.13137999999999,52.28139,0 -64.08308,52.37638,0 -64.20889000000001,52.54889000000001,0 -64.17529,52.60944000000001,0 -64.20223,52.67222000000001,0 -64.15666,52.73833,0 -64.20140000000001,52.79084,0 -64.1725,52.85083000000001,0 -64.08085,52.88138,0 -63.95417,52.87165,0 -63.98277,52.9336,0 -63.91945000000001,52.97693,0 -63.92805,53.07166,0 -63.86639000000001,53.10527,0 -63.655,53.105,0 -63.62611,53.04222000000002,0 -63.54805000000001,52.98499,0 -63.54084,52.91666,0 -63.59584,52.77077000000001,0 -63.42305000000001,52.70722,0 -63.37777,52.65083,0 -63.86305999999999,52.61277,0 -64.00194999999999,52.55471,0 -64.08085,52.47610000000001,0 -64.03749999999999,52.43444,0 -63.96222,52.45193,0 -63.91889000000001,52.38942999999999,0 -64.01306,52.38722,0 -63.9875,52.3625,0 -64.02528000000001,52.35444,0 -63.91805999999999,52.33611,0 -63.82917,52.25999,0 -63.84641000000001,52.00000000000001,0 -63.05001,52.00000000000001,0 -63.04419000000001,48.50467,0 -63.84024000000001,48.40712000000001,0 -64.52839,48.32669000000001,0 -64.76967999999999,48.17476000000001,0 -65.32375999999999,47.96921,0 -66.3727,48.08661000000001,0 -66.8437,47.99666,0 -66.9436,47.96305000000001,0 -66.94694,47.89916000000001,0 -67.04723,47.93083,0 -67.18859999999999,47.88388000000001,0 -67.32278000000001,47.89638,0 -67.35665,47.84166,0 -67.60417,47.9361,0 -67.61221000000001,47.99749000000001,0 -68.1161,48.00194000000001,0 -68.12027000000001,47.92665000000001,0 -68.37277,47.92471000000001,0 -68.38028,47.5586,0 -68.57611,47.42471,0 -69.05359,47.29379,0 -69.03612,47.25722,0 -68.88779,47.18804,0 -68.49805000000002,47.30555,0 -68.39751,47.29527,0 -68.37305000000001,47.34722000000001,0 -68.30665000000001,47.36444,0 -68.18582000000001,47.33277,0 -67.79333,47.07028,0 -67.77251,45.95750000000001,0 -67.74695,45.92917,0 -67.79028,45.88194000000001,0 -67.75723000000001,45.83333,0 -67.80638,45.78472,0 -67.79916,45.7011,0 -67.71751,45.69137,0 -67.65666,45.63055000000001,0 -67.41249999999999,45.58693,0 -67.41083,45.52999,0 -67.48528,45.49444,0 -67.4164,45.39888,0 -67.46278,45.2761,0 -67.34193999999999,45.14999,0 -67.27501,45.19887,0 -67.20654,45.18303,0 -67.15837999999999,45.17419,0 -67.09289,45.09019000000001,0 -66.97331,44.91223,0 -66.95337000000001,44.82681,0 -67.11709999999999,44.69726,0 -67.50364999999999,44.47953,0 -67.50364999999999,40.24134,0 -67.50364999999999,35.24134,0 -67.50364999999999,30.24134,0 -67.50364999999999,25.24134,0 -67.50364999999999,20.24133,0 -71.75587,20.2411,0 -71.75418000000001,19.70582,0 -71.69168000000001,19.48584,0 -71.69862000000001,19.40027,0 -71.76669,19.33195,0 -71.69611999999999,19.24167,0 -71.62918000000001,19.21972,0 -71.63502,19.15806,0 -71.75,19.01972,0 -71.85605,18.94783,0 -71.78889,18.96277,0 -71.71945,18.88389,0 -71.71584,18.74972,0 -71.83168000000001,18.6225,0 -72.00306999999999,18.60083,0 -71.88500999999999,18.47721,0 -71.9075,18.43777,0 -71.69473000000001,18.32222,0 -71.76918000000001,18.20222,0 -71.74473999999999,18.13389,0 -71.76786,18.0385,0 -71.76823,17.5584,0 -71.77196000000001,12.5584,0 -71.25400999999999,12.4433,0 -71.06217,12.23228,0 -71.08137000000001,12.00208,0 -71.32471,11.85305,0 -71.38473999999999,11.82889,0 -71.52943999999999,11.78005,0 -71.97723000000001,11.665,0 -72.26000999999999,11.15445,0 -72.34113000000001,11.165,0 -72.49306,11.12111,0 -72.55862000000001,10.97389,0 -72.66528,10.87277,0 -72.76028,10.65139,0 -72.90501999999999,10.4425,0 -72.98723,9.914165000000001,0 -72.96223000000001,9.836945999999999,0 -73.09279000000001,9.585557,0 -73.16833,9.536111999999999,0 -73.29834,9.284715,0 -73.38361999999999,9.189719,0 -73.37195,9.166949000000001,0 -73.21890000000001,9.171386999999999,0 -73.00639,9.304442,0 -72.94223,9.104165,0 -72.81696,9.145277,0 -72.76819,9.111428,0 -72.7903,9.083042000000001,0 -72.66446999999999,8.641107000000002,0 -72.38417,8.363051000000001,0 -72.38557,8.25389,0 -72.32529,8.095553000000001,0 -72.33362,8.049446,0 -72.40252,8.041949000000001,0 -72.42307,7.985835000000001,0 -72.48139999999999,7.947783,0 -72.44334000000001,7.828055000000001,0 -72.47168000000001,7.491941000000001,0 -72.39917,7.406108,0 -72.18333,7.382781000000001,0 -72.15085000000002,7.339715000000001,0 -72.14528,7.198614,0 -72.06611,7.062417000000001,0 -71.9268,7.009748000000001,0 -71.83278,6.987221,0 -71.76557,7.005555,0 -71.76418,7.032221,0 -71.60695,7.059716,0 -71.45778,7.015832,0 -71.29556,7.033338000000001,0 -71.26555999999999,6.98778,0 -71.18668,6.962769000000001,0 -71.12806999999999,6.998895,0 -71.02501,6.984449000000001,0 -70.89001,7.074998,0 -70.70251,7.108056,0 -70.61279,7.072496,0 -70.56362,7.089444000000001,0 -70.51279,7.015553000000001,0 -70.30083999999999,6.939161,0 -70.11917,6.975836,0 -69.42944,6.118605000000001,0 -69.32501000000002,6.153605,0 -69.24529,6.081389000000001,0 -69.0564,6.21611,0 -68.63721,6.133895,0 -68.4539,6.190550000000002,0 -68.31362,6.166944,0 -68.15224000000001,6.223338000000001,0 -67.99500999999999,6.207777,0 -67.82278,6.30945,0 -67.56834000000001,6.264719000000001,0 -67.45445000000001,6.193052,0 -67.49199,6.118659000000001,0 -67.41280999999999,5.992460000000001,0 -67.62223,5.787503,0 -67.65195,5.676390000000001,0 -67.61306,5.539166,0 -67.64944,5.478335,0 -67.80279,5.385563,0 -67.85062000000001,5.301639,0 -67.81168,5.217497,0 -67.82861,5.112216,0 -67.79056,5.054697,0 -67.87612,4.530833,0 -67.79194,4.427495000000001,0 -67.80556,4.227498,0 -67.70851,4.046957,0 -67.61333999999999,3.754719,0 -67.49195,3.726395000000001,0 -67.38779,3.493052,0 -67.30723999999999,3.455559,0 -67.29056,3.3975,0 -67.38417,3.259161000000001,0 -67.43556,3.253896,0 -67.84305999999999,2.868335000000001,0 -67.85506,2.789783,0 -67.75167999999999,2.840003,0 -67.60695,2.795552,0 -67.56778,2.683341,0 -67.50333999999999,2.67722,0 -67.32056,2.468339,0 -67.19251,2.392496,0 -67.17307,2.341665,0 -67.21084999999999,2.240558,0 -67.16446999999999,2.135556,0 -67.10945,2.094444,0 -67.13361999999999,1.987785,0 -66.99168,1.695833,0 -66.87045000000001,1.22094,0 -67.07668,1.173338,0 -67.07250999999999,1.625282,0 -67.33501,2.111111,0 -67.42417,2.143889,0 -67.64418000000001,1.999997,0 -67.80556,1.788335,0 -67.91474,1.745279,0 -68.00502,1.763054,0 -68.08945,1.933613,0 -68.17083,1.973889,0 -68.18668,2.020005,0 -68.27724000000001,1.837781,0 -68.22917,1.823336,0 -68.23278999999999,1.775555,0 -68.17583999999999,1.763054,0 -68.15306,1.724165,0 -69.37793000000001,1.726146,0 -69.55584000000002,1.784159,0 -69.63139,1.737782,0 -69.71693999999999,1.748051,0 -69.78695999999999,1.706111,0 -69.84610000000001,1.710459,0 -69.84222,1.062215,0 -69.76501,1.09584,0 -69.70473,1.059443,0 -69.60196999999999,1.080836,0 -69.4464,1.062215,0 -69.42084000000001,1.026107,0 -69.34361000000001,1.074716,0 -69.22417,0.9952825,0 -69.20278999999999,0.9066595,0 -69.14001,0.8669425,0 -69.18250999999999,0.7244455,0 -69.13863000000001,0.6866634,0 -69.13721,0.6299995000000001,0 -69.28695999999999,0.6208375,0 -69.29389999999999,0.6677815,0 -69.35001,0.6369475,0 -69.46417,0.7402855,0 -69.56723,0.7011085,0 -69.60779000000001,0.6463885,0 -69.67834000000001,0.6788875,0 -69.79779000000001,0.6002815000000001,0 -70.04416999999999,0.5908405,0 -70.05807000000002,-0.1575005,0 -69.92834000000002,-0.3094475,0 -69.85167,-0.3352775,0 -69.74612000000001,-0.4522145000000001,0 -69.60751000000001,-0.5175005,0 -69.57278,-0.6366605,0 -69.61472999999999,-0.7511135000000001,0 -69.5625,-0.8080565,0 -69.52916999999999,-0.9244446000000001,0 -69.43473,-0.9941676,0 -69.44198,-1.017811,0 -69.4389,-1.083889,0 -69.38084000000002,-1.174447,0 -69.37946,-1.35028,0 -69.46056,-1.496107,0 -69.95692,-4.236876,0 -69.96417,-4.290004,0 -70.01862,-4.339161000000001,0 -70.0741,-4.313079,0 -70.10695,-4.253058,0 -70.19410000000001,-4.333177,0 -70.30667,-4.244716,0 -70.32389000000001,-4.136662,0 -70.35973,-4.16584,0 -70.43333,-4.131667,0 -70.51195,-4.180285,0 -70.54528999999999,-4.138606,0 -70.58414999999999,-4.195558,0 -70.6289,-4.15666,0 -70.62000999999999,-4.114998,0 -70.68391,-4.173337,0 -70.76584,-4.146390000000001,0 -70.83474,-4.187781,0 -70.83056999999999,-4.234447000000001,0 -70.95029,-4.38139,0 -70.98862,-4.340557,0 -71.01140000000001,-4.382226,0 -71.08334000000001,-4.363605,0 -71.12918000000001,-4.398894,0 -71.16946,-4.357782,0 -71.20029000000001,-4.410559,0 -71.23296000000002,-4.374621000000001,0 -71.29056,-4.383055,0 -71.29528999999999,-4.433608,0 -71.3539,-4.457223,0 -71.38223000000001,-4.430836,0 -71.47083000000001,-4.438333,0 -71.51055,-4.481389,0 -71.60722,-4.498056,0 -71.62306,-4.475835,0 -71.64474,-4.509162,0 -71.69057000000001,-4.473892,0 -71.90249,-4.518189,0 -72.02806,-4.612501,0 -72.06657,-4.606092,0 -72.12917,-4.693609,0 -72.235,-4.753333,0 -72.37529000000001,-4.784446,0 -72.40611,-4.878891,0 -72.60916,-5.000833,0 -72.62529000000001,-5.054166,0 -72.74139,-5.050837,0 -72.89028999999999,-5.123610000000001,0 -72.91750999999999,-5.151105,0 -72.88417,-5.258052,0 -72.96278,-5.458051000000001,0 -72.94251,-5.543334,0 -72.96335000000001,-5.65416,0 -73.12612,-5.867496,0 -73.22974000000001,-6.093613,0 -73.16307000000001,-6.207229,0 -73.12390000000001,-6.447223,0 -73.19168000000001,-6.552783000000001,0 -73.35306,-6.576949,0 -73.67639,-6.804441000000002,0 -73.75446,-6.894163,0 -73.79513000000002,-7.122628,0 -72.63779,-7.603335,0 -70.35722,-8.160553,0 -68.65723,-9.066394000000001,0 -66.83056000000001,-9.838054,0 -66.64025,-9.91827,0 -66.88806,-10.08639,0 -67.08085,-10.27194,0 -67.17444999999999,-10.325,0 -67.32417,-10.32084,0 -67.33334000000001,-10.37,0 -67.41833,-10.38306,0 -67.46363,-10.45555,0 -67.61168000000001,-10.53222,0 -67.70334,-10.69573,0 -67.74557,-10.7125,0 -67.84557,-10.6575,0 -68.06111000000001,-10.67639,0 -68.28055999999999,-10.98,0 -68.3914,-11.00805,0 -68.41750999999999,-11.04444,0 -68.51694999999999,-11.05445,0 -68.58346,-11.10614,0 -68.77473000000001,-11.13639,0 -68.78084,-11.065,0 -68.74760000000001,-11.01038,0 -68.78583999999999,-10.99223,0 -68.90028,-11.01528,0 -69.39529,-10.92695,0 -69.56751,-10.95055,0 -68.925,-11.99667,0 -68.6739,-12.50115,0 -68.78084,-12.61778,0 -68.73139999999999,-12.66972,0 -68.75666,-12.71472,0 -68.84668000000002,-12.73278,0 -68.97362,-12.86334,0 -68.96335000000001,-13.02667,0 -68.96194,-13.51305,0 -69.01472,-13.63834,0 -69.08778,-13.66333,0 -69.00306000000001,-13.75445,0 -68.97751,-13.96166,0 -68.89558,-14.03389,0 -68.85306,-14.19917,0 -68.99918,-14.24334,0 -68.98139999999999,-14.37917,0 -69.15779000000001,-14.50528,0 -69.1575,-14.57555,0 -69.2289,-14.57639,0 -69.24195,-14.73028,0 -69.36639,-14.8025,0 -69.34945999999999,-14.895,0 -69.38139,-14.97,0 -69.13695,-15.24584,0 -69.26835,-15.32695,0 -69.27584,-15.40417,0 -69.32696,-15.43055,0 -69.42195,-15.61805,0 -69.21194,-16.16055,0 -69.13418,-16.22362,0 -68.96501000000001,-16.20944,0 -68.84084,-16.29555,0 -68.82252,-16.33973,0 -68.99084000000001,-16.41973,0 -69.04167000000001,-16.54112,0 -69.01112000000001,-16.65695,0 -69.17001000000001,-16.72389,0 -69.34334,-16.9825,0 -69.41112,-17.02056,0 -69.38834,-17.055,0 -69.61806,-17.18667,0 -69.6562,-17.28724,0 -69.59084,-17.29528,0 -69.50112,-17.37889,0 -69.49973,-17.50528,0 -69.68389000000001,-17.66361,0 -69.81473,-17.65223,0 -69.83223,-17.67694,0 -69.84972000000001,-17.75418,0 -69.77000000000001,-17.96889,0 -69.84141,-18.12861,0 -69.95113000000001,-18.24278,0 -70.14111,-18.32333,0 -70.35583,-18.31973,0 -70.40549,-18.34854,0 -70.31001000000001,-18.43445,0 -70.35778999999999,-18.78417,0 -70.27166,-19.14139,0 -70.28862,-19.29444,0 -70.19695,-19.50278,0 -70.19862000000001,-19.57694,0 -70.23002,-19.58667,0 -70.15167,-19.71445,0 -70.1664,-19.80695,0 -70.13612000000001,-19.86389,0 -70.12612,-20.07361,0 -70.16528,-20.20389,0 -70.13306,-20.27334000000001,0 -70.19056999999999,-20.36778,0 -70.16724000000001,-20.45166,0 -70.20473,-20.52916,0 -70.21223000000001,-20.79973,0 -70.13918,-20.87556,0 -70.17001000000001,-21.01083,0 -70.12306,-21.08139,0 -70.06473,-21.29639,0 -70.09529000000001,-21.33667,0 -70.05334000000002,-21.42565,0 -70.08446000000001,-21.48473,0 -70.06585,-21.52361,0 -70.15416999999999,-21.66694,0 -70.14805,-21.85556,0 -70.19334000000001,-21.88805,0 -70.16833,-21.94195,0 -70.30750999999999,-22.75806,0 -70.28917,-22.90139,0 -70.38862,-23.06083,0 -70.48112000000002,-23.0825,0 -70.50917,-23.01055,0 -70.57584,-23.07166,0 -70.5514,-23.16250000000001,0 -70.59361,-23.22222,0 -70.58474,-23.42389,0 -70.62306,-23.49973,0 -70.54667000000001,-23.52112,0 -70.48390000000001,-23.45028,0 -70.4164,-23.49305,0 -70.38943999999999,-23.59723,0 -70.51862,-23.86084,0 -70.50306999999999,-24.16556,0 -70.5825,-24.52667,0 -70.55695,-24.60889,0 -70.58064000000002,-24.70552,0 -72.11279999999999,-24.70552,0 -77.11279,-24.70552,0 -82.11279,-24.70552,0 -82.11279,-27.41935000000001,0 -82.11279,-32.41934,0 -82.11279,-37.41935,0 -78.60896,-37.41935,0 -73.60896,-37.41935,0 -73.60196999999999,-37.51333,0 -73.68722,-37.60111,0 -73.66945,-37.72611000000001,0 -73.53807000000001,-37.87333,0 -73.4539,-38.05556,0 -73.54224000000001,-38.41833,0 -73.44196,-38.76750000000001,0 -73.43307,-38.69168,0 -73.24779,-39.22223,0 -73.22501,-39.21945,0 -73.2353,-39.18584,0 -73.2075,-39.21556,0 -73.24597,-39.38584,0 -73.2225,-39.41473,0 -73.25751,-39.4539,0 -73.2439,-39.49139,0 -73.34557000000001,-39.66417,0 -73.40443999999999,-39.69167,0 -73.37973,-39.73639,0 -73.38251,-39.91445,0 -73.45168,-39.8325,0 -73.71445,-39.97862,0 -73.65807,-40.11028,0 -73.73112,-40.18,0 -73.71709,-40.20832,0 -73.75029000000001,-40.25723,0 -73.78445000000001,-40.42362,0 -73.74751000000001,-40.52472,0 -73.85778999999999,-40.6264,0 -73.84278999999999,-40.68696,0 -73.94778,-40.86389,0 -73.89806,-40.90639,0 -73.99500999999999,-40.97000000000001,0 -73.97806,-41.1189,0 -73.85890000000001,-41.33973,0 -73.87445000000001,-41.47333,0 -73.82390000000001,-41.51723,0 -73.82167,-41.56556,0 -73.59166999999999,-41.6025,0 -73.49195,-41.52084,0 -73.56417999999999,-41.61362,0 -73.68279,-41.62473,0 -73.75281000000001,-41.75128,0 -73.8556,-41.76842,0 -74.0545,-41.73290000000001,0 -74.18946,-42.17331,0 -74.43097,-43.22105,0 -74.87848,-43.52649,0 -75.18392,-44.80154,0 -75.32599,-46.32876,0 -75.71666999999999,-46.56318,0 -75.75219,-46.80824,0 -75.65273000000001,-46.92189000000001,0 -75.60303000000002,-48.05132,0 -75.68826,-48.46332,0 -75.73088,-49.03514,0 -75.36150000000001,-51.61010000000001,0 -74.76482000000001,-52.7786,0 -73.13816,-54.55088000000001,0 -71.60384000000001,-54.89185,0 -70.14055000000001,-55.36066000000002,0 -69.11057,-55.64479,0 -67.49276999999999,-55.95932,0 -67.49276999999999,-59.90001,0 -67.49276999999999,-64.90000000000001,0 -67.49276999999999,-69.90000000000001,0 -67.49276999999999,-74.90000000000001,0 -67.49276999999999,-79.90000000000001,0 -67.49276999999999,-84.89999,0 -67.49276999999999,-89.90000000000001,0 -68.43494,-89.90000000000001,0 -69.37713000000001,-89.90000000000001,0 -70.3193,-89.90000000000001,0 -71.26147,-89.90000000000001,0 -72.20367,-89.90000000000001,0 -73.14584000000001,-89.90000000000001,0 -74.08802,-89.90000000000001,0 -75.03020000000001,-89.90000000000001,0 -75.97238,-89.90000000000001,0 -76.91455000000001,-89.90000000000001,0 -77.85674,-89.90000000000001,0 -78.79893,-89.90000000000001,0 -79.74109,-89.90000000000001,0 -80.68326999999999,-89.90000000000001,0 -81.62546,-89.90000000000001,0 -82.56762999999999,-89.90000000000001,0 -82.56790000000001,-89.29246999999999,0 -82.57008,-84.29246999999999,0 -82.57227,-79.29246999999999,0 -82.57349000000001,-76.49247000000001,0 -82.57568000000001,-71.49247,0 -82.57787,-66.49247,0 -82.58005,-61.49247,0 -82.58223,-56.49247,0 -82.58441999999999,-51.49246999999999,0 -82.5866,-46.49247,0 -82.58879000000002,-41.49248,0 -82.58971,-39.39247,0 -82.59188,-34.39248,0 -82.59408000000001,-29.39247,0 -82.59626,-24.39248,0 -82.59696,-21.69599,0 -82.59827000000001,-16.69599,0 -82.59957,-11.69599,0 -82.60088,-6.695992,0 -82.60218,-1.695988,0 -82.60348999999999,3.304008,0 -82.60478999999999,8.304010999999999,0 -82.72168000000002,8.317214,0 -82.84778,8.270838,0 -82.8753,8.190837,0 -82.85028,8.060003,0 -82.86584000000001,8.020835999999999,0 -82.89883,8.025668,0 -82.88612000000001,8.103338000000003,0 -82.93085000000001,8.254719,0 -83.04834000000001,8.326105999999999,0 -82.82993,8.474651,0 -82.83196,8.626661,0 -82.91446999999999,8.762786999999999,0 -82.85778999999999,8.809163,0 -82.87779000000001,8.827496999999999,0 -82.71084999999999,8.931113,0 -82.88890000000001,9.074448,0 -82.93047,9.063126000000001,0 -82.93473,9.471663,0 -82.83338999999999,9.498041000000001,0 -82.87575,9.558963,0 -82.83307000000001,9.612215000000001,0 -82.74890000000001,9.584163,0 -82.66473000000001,9.495278000000001,0 -82.60478999999999,9.495170999999999,0 -82.60478999999999,13.18773,0 -82.60478999999999,18.18773,0 -86.05847,18.18773,0 -86.05847,19.16667,0 -86.05847,24.16667,0 -82.67905,24.16667,0 -82.65622999999999,27.34336,0 -82.86282,27.87009,0 -82.81197,28.15403,0 -82.66786999999999,28.52699,0 -82.65092,28.70922,0 -82.81621,29.14997,0 -82.97725000000001,29.1754,0 -83.04929,29.13302,0 -83.13406000000001,29.26864,0 -83.40105,29.5102,0 -83.42648,29.65429,0 -83.58752,29.756,0 -83.60023000000001,29.82804,0 -83.73586,29.94671,0 -84.00285,30.07809,0 -84.18716000000001,30.06915,0 -84.32649000000001,29.96329,0 -84.34405,29.89086,0 -84.67976,29.76196,0 -84.76974,29.69064,0 -84.98586,29.60068,0 -85.05280000000001,29.59025,0 -85.21616,29.69783,0 -85.11682,29.77658,0 -85.04214,29.7827,0 -85.02878,29.81974,0 -85.02682,29.97955,0 -85.11667,30.03346,0 -85.14525999999999,30.13059,0 -85.01819999999999,30.37397,0 -85.029,30.42799,0 -84.98756,30.44610000000001,0 -84.98378,30.54212,0 -84.86639000000001,30.71832,0 -84.91332,30.75332,0 -84.93167,30.88832,0 -85.00448,31.00173,0 -85.00557000000001,31.06222,0 -85.09972000000001,31.17888,0 -85.10889,31.27111,0 -85.03751,31.54083,0 -85.14111,31.82611,0 -85.06027,32.00388,0 -85.05083000000001,32.13832,0 -84.89417000000002,32.26944,0 -84.99695,32.33583,0 -84.96278,32.42333,0 -84.99306,32.51193,0 -85.10445,32.64415,0 -85.13276999999999,32.7786,0 -85.17416,32.82417000000001,0 -85.3925,33.99749,0 -85.62070000000001,34.9901,0 -85.46741,34.99005,0 -85.36797,35.06706,0 -85.38441,35.15899,0 -85.17104000000001,35.46849,0 -85.14761,35.45309,0 -85.11647000000001,35.48328,0 -85.13974,35.50185,0 -85.10691000000001,35.58106,0 -84.97051999999999,35.6754,0 -84.89986,35.77536,0 -84.76385999999999,35.82634,0 -84.67876,35.91422,0 -84.79865,36.09025,0 -84.9053,36.15482,0 -84.866,36.28408,0 -84.78586,36.29548,0 -84.77486,36.3341,0 -84.65366,36.39601,0 -84.79111,36.60536,0 -84.67641,36.7645,0 -84.59557000000001,36.80482,0 -84.58721,36.87076,0 -84.68555000000001,36.98052,0 -84.77699,36.95735,0 -84.84885000000001,36.99782,0 -84.92086000000001,37.05594,0 -84.91865,37.12032000000001,0 -84.97011999999999,37.11,0 -85.0663,37.20251,0 -85.07001,37.25666,0 -85.17966,37.31235,0 -85.20011,37.26906,0 -85.32208,37.24111,0 -85.36129,37.19164,0 -85.41483,37.21706,0 -85.39812000000002,37.2369,0 -85.47422,37.34881,0 -85.58540000000001,37.42731,0 -85.59048,37.46286,0 -85.64707,37.4683,0 -85.66943000000001,37.41729,0 -86.05628,37.44679,0 -86.12286,37.5709,0 -86.28140999999999,37.59924,0 -86.16003000000001,37.80325,0 -86.50314,38.05159,0 -86.52275,37.92781000000001,0 -86.59833,37.92101,0 -86.64558,37.84594,0 -86.66867000000001,37.91314000000001,0 -86.75384,37.8983,0 -86.82632,37.99151,0 -86.77476,38.01123,0 -86.78015000000001,38.10248,0 -86.81465,38.13544,0 -86.79993,38.20176,0 -87.30332,38.23492000000001,0 -87.319,38.37801,0 -87.4182,38.37928,0 -87.41956,38.43461,0 -87.47684,38.46685,0 -87.47975,38.53218,0 -87.50431,38.49449,0 -87.54741,38.51014,0 -87.61599,38.45092000000001,0 -87.75163000000001,38.41816,0 -87.75584000000001,38.45804,0 -87.64584000000001,38.49499,0 -87.66583,38.55999,0 -87.51195,38.74527,0 -87.55777000000001,38.86805,0 -87.53416,38.95333,0 -87.58611999999999,38.99554,0 -87.59389,39.0561,0 -87.66861,39.10999,0 -87.65916,39.15582,0 -87.58945,39.20638,0 -87.62639,39.30471,0 -87.53278,39.35695000000001,0 -87.52641,40.74535,0 -87.10191,40.74436,0 -87.10338,40.84467,0 -86.98604,40.84695,0 -86.98653,40.9182,0 -86.93117,40.91845,0 -86.93285,41.17447,0 -86.88367,41.26608,0 -86.76918000000001,41.30227,0 -86.64751,41.43719,0 -86.52912000000001,41.43995,0 -86.5304,41.52581,0 -86.48571,41.58063,0 -86.48599,41.65967,0 -86.52528000000001,41.66103,0 -86.52540999999999,41.75969,0 -87.21111000000002,41.76225,0 -87.02119000000002,42.48526,0 -87.15730000000001,43.41102,0 -87.06783,43.96139,0 -86.83409,44.59161,0 -86.71111000000001,44.83602,0 -86.57338000000001,44.99793,0 -86.24245000000001,45.23384000000001,0 -86.7586,45.44141000000001,0 -87.08848999999999,45.44498,0 -87.27666000000001,45.25579,0 -87.40428,45.19296000000001,0 -87.43716000000001,45.07106,0 -87.64861999999999,45.11694,0 -87.735,45.18721000000001,0 -87.71666999999999,45.26721,0 -87.65055,45.35194,0 -87.67610000000002,45.38666000000001,0 -87.88084000000001,45.36639,0 -87.87027000000002,45.44221000000001,0 -87.8036,45.50139,0 -87.83,45.57166000000001,0 -87.78751,45.59664999999999,0 -87.82556,45.65526000000001,0 -87.80029,45.68415,0 -87.90083,45.75944,0 -88.11834,45.80527000000001,0 -88.08139,45.87777,0 -88.11583000000002,45.93221,0 -88.52029000000002,46.02499,0 -88.64194999999999,46.00111,0 -88.83806,46.035,0 -89.11749,46.14805,0 -90.12388,46.33972,0 -90.22278,46.50722,0 -90.33277,46.55915,0 -90.39612,46.54695,0 -90.41302,46.5882,0 -89.49317000000001,48.00332000000001,0 -89.59805,48.00918,0 -89.60860000000001,51.43138,0 -89.62405000000001,56.43136,0 -89.30607999999999,56.62564,0 -89.13284,56.86485,0 -89.03778000000001,56.83611,0 -88.87944,56.85804000000001,0 -88.65472000000001,56.69638,0 -88.48999000000001,56.64222000000001,0 -88.3536,56.55332000000001,0 -87.98277000000002,56.44165000000002,0 -87.94305,56.37749000000001,0 -87.72389,56.20388,0 -87.70805,56.1561,0 -87.58362,56.0761,0 -87.61583,56.00277000000001,0 -87.54861,56.04999,0 -87.35195,55.99276,0 -87.3625,55.94666,0 -86.97945,55.93166,0 -86.95889,55.90582,0 -86.47778,55.80888,0 -86.27722000000001,55.72887,0 -85.94445,55.69778,0 -85.56947,55.5586,0 -85.49944000000002,55.47222000000001,0 -85.39335,55.40889,0 -85.00144,55.29702000000001,0 -85.00126,56.95695000000001,0 -85.00069000000001,61.95694000000001,0 -86.66628,62.44327,0 -87.52079000000001,63.03194,0 -87.6917,63.6016,0 -87.25494000000001,64.20925,0 -86.74223000000002,64.72197,0 -86.11559,65.84233,0 -85.64087000000001,66.05121,0 -84.9991,66.25666,0 -84.9991,67.98071,0 -84.99907,72.98072000000001,0 -84.99903999999999,77.98072999999999,0 -84.99902,82.98072000000001,0 -82.50320000000001,82.97593999999999,0 -82.5051,84.90001,0 -82.51007,89.90000000000001,0 -81.57213,89.90000000000001,0 -80.63419,89.90000000000001,0 -79.69624,89.90000000000001,0 -78.75831000000001,89.90000000000001,0 -77.82037,89.90000000000001,0 -76.88243,89.90000000000001,0 -75.94450000000001,89.90000000000001,0 -75.00655,89.90000000000001,0 -74.06861000000001,89.90000000000001,0 -73.13066000000001,89.90000000000001,0 -72.19273,89.90000000000001,0 -71.25478,89.90000000000001,0 -70.31685,89.90000000000001,0 -69.37891000000001,89.90000000000001,0 -68.44096999999999,89.90000000000001,0 -67.50302000000001,89.90000000000001,0 + + + 1 + + + + GMT -04:00 + + +]]> + #khStylem0400 + + + + + +-52.50595000000001,64.94479,0 -52.50631,59.94478000000001,0 -52.50666,54.94477,0 -52.50703,49.94478,0 -52.50738,44.94477,0 -52.50773000000001,39.94478,0 -52.50809000000001,34.94477,0 -52.50845000000001,29.94478,0 -52.50846,29.83971,0 -52.50841,24.83971,0 -52.50838,19.83971,0 -52.50835,15.23971,0 -52.5083,10.2397,0 -52.50826000000001,5.239709,0 -52.50826000000001,5.098526,0 -52.91902,5.485283,0 -54.47205,5.976981000000002,0 -55.15563000000001,6.048935,0 -56.97724,6.000021,0 -57.06833000000001,5.942223,0 -57.13139,5.773337,0 -57.16833,5.537222,0 -57.24850000000001,5.486112,0 -57.27223000000001,5.38028,0 -57.33555,5.313338,0 -57.28723000000002,5.310557,0 -57.27916,5.223339,0 -57.25639000000001,5.22278,0 -57.26307,5.26778,0 -57.23521000000001,5.259942,0 -57.18862,5.16861,0 -57.22889,5.140835,0 -57.25471,5.175279,0 -57.29695,5.160285000000001,0 -57.32305,5.069717,0 -57.28889,5.016663,0 -57.42028,4.989168,0 -57.68806000000001,5.010282,0 -57.77140000000001,4.922774,0 -57.84112,4.927778,0 -57.92333000000001,4.821948,0 -57.83862,4.654718,0 -57.95889,4.403339,0 -57.9539,4.28777,0 -58.0714,4.159161,0 -58.04723,4.008338,0 -57.87668,3.80916,0 -57.83583,3.664998000000001,0 -57.73473,3.610277,0 -57.65445,3.518612,0 -57.63721,3.455,0 -57.66693999999999,3.395555,0 -57.64223000000001,3.356387,0 -57.50334,3.351393,0 -57.48083000000001,3.323888999999999,0 -57.41057000000001,3.382496,0 -57.35028,3.355001,0 -57.30139,3.377501000000001,0 -57.28528,3.143888000000001,0 -57.24111000000001,3.138057,0 -57.21111,2.928051,0 -57.17917,2.914443,0 -57.21333,2.878892000000001,0 -57.20139000000001,2.821391000000001,0 -57.09806,2.749166,0 -56.91778,2.428056,0 -56.92806,2.391948,0 -56.87112,2.348891,0 -56.87833000000001,2.297781,0 -56.8064,2.250836,0 -56.81057,2.193336,0 -56.69187,2.028734,0 -56.56279,2.023892,0 -56.47063,1.944503,0 -56.03723,1.836944,0 -55.94667,1.853333,0 -55.90417,1.89305,0 -55.90139000000001,2.045285,0 -56.03639,2.177505,0 -56.0425,2.232782,0 -56.13807,2.266947,0 -56.08917,2.355281,0 -56.04528000000001,2.344445,0 -55.99195000000001,2.4075,0 -55.96584,2.53277,0 -55.71028,2.399165,0 -55.58473,2.438334,0 -55.38,2.428056,0 -55.32249,2.516948,0 -55.24139000000001,2.499164,0 -55.13807000000001,2.573891000000001,0 -55.11195,2.527217,0 -54.94834000000001,2.617496,0 -54.97223,2.554721,0 -54.86750000000001,2.440278,0 -54.77539,2.456846,0 -54.73722000000001,2.425833,0 -54.71111,2.274723,0 -54.78945,2.163609,0 -54.75029,2.076659,0 -54.80084,2.017781,0 -54.76307,1.986947,0 -54.735,1.768607,0 -54.36111,1.763054,0 -54.10139,1.613051,0 -54.08278000000001,1.505556,0 -53.98807000000001,1.520558,0 -53.85778,1.383605,0 -53.82723,1.384163,0 -53.82167,1.419722,0 -53.75307000000002,1.392497,0 -53.73695,1.437786,0 -53.69694000000001,1.410281,0 -53.66417,1.429442,0 -53.65639000000001,1.363058,0 -53.55306,1.367783,0 -53.54889,1.243889,0 -53.4325,1.25666,0 -53.40584000000001,1.187504,0 -53.46723,1.142496,0 -53.41861999999999,0.9422185000000001,0 -53.28250000000001,0.7902805000000003,0 -53.11723000000001,0.7422205,0 -53.12889,0.3866664,0 -53.04139000000001,0.2474995,0 -53.0061,0.1311115,0 -53.01583,0.03500046,0 -52.97112,-0.01638954,0 -52.92334,-0.1863905,0 -52.87194,-0.2033375,0 -52.81223000000001,-0.1780565,0 -52.63278,-0.3822215000000001,0 -52.62723,-0.5727785,0 -52.60056,-0.6144485,0 -52.53807,-0.6247175,0 -52.5066,-0.7438775,0 -52.50666,-0.7508345000000001,0 -52.51918000000001,-0.8797145,0 -52.38528000000002,-0.8791655,0 -52.37028000000001,-1.061388,0 -52.27112000000001,-1.133893,0 -52.11389000000001,-1.155286,0 -52.06945,-1.220284,0 -52.0475,-1.170838,0 -51.9775,-1.135279,0 -51.90139,-1.150552,0 -51.93501,-1.192501,0 -51.92334,-1.328608,0 -52.00557,-1.404163,0 -52.10778,-1.415835,0 -52.22139,-1.342504,0 -52.43805,-1.441108,0 -52.47639,-1.490553,0 -52.70722,-1.561105,0 -52.71278,-1.603333,0 -52.54084,-1.571949,0 -52.44971,-1.586944,0 -52.28528,-1.53361,0 -52.2275,-1.616392,0 -52.26806,-1.682218,0 -52.31139000000001,-1.627498,0 -52.34612,-1.674721,0 -52.26917,-1.813051,0 -52.31806000000001,-1.935559,0 -52.27139,-2.01916,0 -52.36806000000001,-2.098612,0 -52.26723,-2.061666,0 -52.25917,-2.161108,0 -52.15028,-2.358055,0 -52.20028,-2.407501,0 -52.12361000000001,-2.389717000000001,0 -52.03139,-2.59722,0 -52.06667000000001,-2.714715,0 -52.04999999999999,-2.809999,0 -51.94334000000001,-2.898334000000001,0 -51.82334,-3.100285,0 -51.61153,-3.147264,0 -51.63556000000001,-3.291661,0 -51.74472000000001,-3.35611,0 -51.66917,-3.471661,0 -51.74917,-3.562498000000001,0 -51.83223000000001,-3.609163,0 -51.92667,-3.553605999999999,0 -51.94445,-3.409444,0 -52.04611000000001,-3.294441,0 -52.15028,-3.235554,0 -52.15778,-3.34305,0 -52.23778,-3.510559,0 -52.35639000000001,-3.665836,0 -52.60722000000001,-3.860839,0 -52.63945,-4.193614000000001,0 -52.73806,-4.331107,0 -52.73,-4.376107,0 -52.66278000000001,-4.433338,0 -52.66223,-4.493052,0 -52.83056,-4.882780000000001,0 -52.92639,-5.008608,0 -52.86972,-5.210001,0 -52.86778000000001,-5.365558,0 -52.84084,-5.406949,0 -52.70612,-5.469165,0 -52.645,-5.688891,0 -52.53889,-5.840838000000001,0 -52.53807,-6.036390000000001,0 -52.43056000000001,-6.210279,0 -52.43055,-6.338053000000001,0 -52.36139000000001,-6.381109,0 -52.22473,-6.573888,0 -52.08528,-6.548607000000001,0 -52.01314,-6.657526,0 -51.9575,-6.613336,0 -51.78751,-6.690835,0 -51.71278000000002,-6.860278,0 -51.72723,-6.893613,0 -51.69805,-6.901659,0 -51.74084,-6.956110000000001,0 -51.65556000000002,-7.06222,0 -51.64500000000001,-7.158888000000001,0 -51.48695,-7.19416,0 -51.38807,-7.269723000000002,0 -51.27251,-7.274448000000001,0 -51.20167000000001,-7.342497,0 -51.21639,-7.419159,0 -51.18334,-7.543612,0 -51.23056,-7.623612,0 -51.10196000000001,-7.803054,0 -51.16889,-7.914447,0 -51.26918,-7.983613,0 -51.41695,-8.028333999999999,0 -51.43333000000001,-8.088058,0 -51.40862000000001,-8.134731,0 -51.44501,-8.193051000000001,0 -51.42722,-8.269164,0 -51.51973,-8.418888000000001,0 -51.52667000000001,-8.544447999999999,0 -51.44778000000001,-8.691948999999999,0 -51.33805,-8.772786,0 -51.1725,-8.998056,0 -51.12167,-9.258607,0 -51.07751,-9.31194,0 -51.1372,-9.797392,0 -50.23251000000001,-9.844165,0 -50.30944,-10.02889,0 -50.38167,-10.11029,0 -50.40862,-10.3075,0 -50.48278,-10.39361,0 -50.52278,-10.56334,0 -50.60667000000001,-10.65584,0 -50.5825,-10.73945,0 -50.62944,-10.82611,0 -50.61167,-10.88139,0 -50.63778,-10.9325,0 -50.60946,-11.06528,0 -50.66473000000001,-11.1425,0 -50.65917000000001,-11.24305,0 -50.74139,-11.46444,0 -50.73667,-11.52445,0 -50.64834,-11.60334,0 -50.71448,-11.74943,0 -50.67973000000001,-11.87,0 -50.64251,-11.88555,0 -50.68389,-12.04861,0 -50.67334000000001,-12.20223,0 -50.61972,-12.28444,0 -50.61361,-12.38416,0 -50.67362000000001,-12.62805,0 -50.62555,-12.65639,0 -50.59806,-12.81056,0 -50.4841,-12.84488,0 -50.48167000000001,-12.8475,0 -50.49806,-12.96056,0 -50.59028000000001,-13.07723,0 -50.56834,-13.22861,0 -50.59166,-13.29694,0 -50.75834,-13.53778,0 -50.78973000000001,-13.66806,0 -50.87056,-13.71861,0 -50.84555,-14.08639,0 -50.92694,-14.11972,0 -50.99918000000001,-14.40555,0 -50.96778000000001,-14.53083,0 -51.03833,-14.65973,0 -51.0975,-14.89111,0 -51.16028,-14.975,0 -51.25723,-15.02139,0 -51.29611,-15.01473,0 -51.31833000000001,-14.9625,0 -51.41251000000001,-14.99723,0 -51.63667000000001,-15.17556,0 -51.70361,-15.48194,0 -51.74973,-15.54084,0 -51.78861,-15.53417,0 -51.77973000000001,-15.63084,0 -51.87695,-15.80055,0 -51.90389,-15.8225,0 -51.96584,-15.80111,0 -52.03751,-15.87555,0 -52.24306000000001,-15.88028,0 -52.33055,-16.0425,0 -52.44056000000001,-16.09694,0 -52.43473,-16.27139,0 -52.57751,-16.34166,0 -52.63779000000001,-16.53889,0 -52.69139,-16.57639,0 -52.72084,-16.66471,0 -52.83222,-16.76417,0 -52.97334,-16.82111,0 -53.0275,-16.93778,0 -53.03973,-17.0525,0 -53.20166,-17.28473,0 -53.19084,-17.36723,0 -53.22778000000001,-17.49805,0 -53.12612000000001,-17.67167,0 -53.1139,-17.8889,0 -53.05389000000001,-18.01667,0 -53.05806,-18.28305,0 -53.02973,-18.37194,0 -52.98834000000001,-18.38889,0 -52.895,-18.34694,0 -52.75805,-18.4125,0 -52.8675,-18.57695,0 -52.89001,-18.67805,0 -52.63667,-18.72305,0 -52.47278,-18.70834,0 -52.34917,-18.81667,0 -52.18861,-18.83695,0 -52.06557,-18.94416,0 -51.89694,-18.995,0 -51.84166,-19.05361,0 -51.63223,-19.13334,0 -51.42306,-19.15806,0 -51.3064,-19.25889,0 -51.11418000000001,-19.29083,0 -50.92340000000001,-19.45669,0 -50.96278000000001,-19.475,0 -50.9325,-19.55667,0 -50.98112,-19.57166,0 -51.02361000000001,-19.7225,0 -50.98584000000001,-19.9075,0 -51.00643,-20.07929,0 -51.04611,-20.25028,0 -51.26055000000001,-20.31528,0 -51.46612,-20.53917,0 -51.58084000000001,-20.60028,0 -51.63001,-20.88028,0 -51.79223,-21.09139,0 -51.87111000000001,-21.14917,0 -51.84973,-21.26973,0 -51.87056000000001,-21.35029,0 -51.9625,-21.49778,0 -52.04973,-21.50278000000001,0 -52.09195,-21.55584,0 -52.03723,-21.64639,0 -52.05334,-21.71889,0 -52.15028,-21.78334,0 -52.17445,-21.85778,0 -52.29028,-21.96084,0 -52.36556,-22.10028000000001,0 -52.49723,-22.21611,0 -52.97528000000001,-22.48223,0 -53.15685,-22.70582,0 -53.57218000000002,-22.88526,0 -53.72139000000001,-23.30028,0 -53.96889000000001,-23.44695000000002,0 -54.08028000000001,-23.94806,0 -54.2439,-24.05361,0 -54.33778000000001,-24.14389,0 -54.24889,-24.35362,0 -54.33139000000001,-24.49278,0 -54.33055,-24.67945,0 -54.45250999999999,-25.01111,0 -54.45639,-25.08723,0 -54.42305,-25.14306,0 -54.61696,-25.43806,0 -54.59892,-25.57323,0 -54.58501,-25.64139000000001,0 -54.64556000000001,-25.66250000000001,0 -54.58584000000001,-25.81944,0 -54.61723,-25.89556,0 -54.60139,-25.95278,0 -54.665,-25.9825,0 -54.64083,-26.07139,0 -54.66166000000001,-26.15834,0 -54.63333999999999,-26.20028,0 -54.6675,-26.23888,0 -54.69278000000001,-26.42834,0 -54.79362,-26.52305,0 -54.77862,-26.61083,0 -54.80612,-26.66418,0 -54.92389,-26.68056,0 -54.95722,-26.77834,0 -55.05112,-26.80028,0 -55.12889,-26.86805,0 -55.12889,-26.94917,0 -55.27111,-26.9375,0 -55.41389,-26.98278000000001,0 -55.455,-27.09528,0 -55.53973,-27.105,0 -55.55667,-27.16166,0 -55.60196,-27.16834,0 -55.56751000000001,-27.24944,0 -55.59639000000001,-27.33806,0 -55.67557,-27.36862,0 -55.73612000000001,-27.43944,0 -55.84251,-27.40778,0 -55.89833000000001,-27.32918,0 -56.13778,-27.30889,0 -56.26805000000001,-27.3875,0 -56.27084,-27.46140000000001,0 -56.37806,-27.58834,0 -56.55,-27.4525,0 -56.67305,-27.46140000000001,0 -56.73695,-27.50694,0 -56.90862000000001,-27.41778,0 -57.07167000000001,-27.49195,0 -57.12944000000001,-27.48973000000001,0 -57.6264,-27.36916,0 -57.79139,-27.29223,0 -58.22,-27.26555,0 -58.60461000000001,-27.31692,0 -58.59888999999999,-27.245,0 -58.65573,-27.19161,0 -58.65278,-27.15834,0 -58.56417,-27.1175,0 -58.54639000000001,-27.04611,0 -58.51028,-27.05861,0 -58.47834,-26.93916000000001,0 -58.32167,-26.88223,0 -58.34584,-26.81722,0 -58.28389,-26.81139,0 -58.28584,-26.77195,0 -58.24639,-26.765,0 -58.23973,-26.64973,0 -58.18167,-26.65611,0 -58.16889000000001,-26.60279,0 -58.21917,-26.535,0 -58.18306000000001,-26.4614,0 -58.21139,-26.42640000000001,0 -58.16251,-26.31973,0 -58.17250000000001,-26.27305,0 -58.10389000000001,-26.23555,0 -58.1525,-26.18861,0 -58.11000000000001,-26.19806000000001,0 -58.07805,-26.12472,0 -57.85583000000001,-26.00195,0 -57.90361,-25.95833,0 -57.84973,-25.91833,0 -57.87445,-25.87861,0 -57.80361000000001,-25.83473,0 -57.81098,-25.77314,0 -57.74196,-25.72806,0 -57.77167,-25.7075,0 -57.75167,-25.67056,0 -57.57750999999999,-25.57889000000001,0 -57.55333000000001,-25.44834,0 -57.64029000000001,-25.37917,0 -57.7561,-25.17694,0 -57.87112000000001,-25.08778,0 -57.98083000000001,-25.07805000000001,0 -58.22139,-24.93916,0 -58.33833000000001,-24.99778,0 -58.45056,-24.85695000000001,0 -58.80334000000001,-24.78417,0 -59.06778,-24.60695000000001,0 -59.33889000000001,-24.48889,0 -59.47278000000001,-24.35306,0 -60.03806,-24.00972000000001,0 -60.28639,-24.0375,0 -60.57334000000001,-23.95111,0 -60.61389000000001,-23.89444,0 -60.85499999999999,-23.8725,0 -61.02473,-23.78612,0 -61.11639000000001,-23.66666,0 -61.11556000000001,-23.60362,0 -61.29472,-23.48917,0 -61.49694,-23.41361,0 -61.51722,-23.345,0 -61.73973000000001,-23.24362,0 -61.78167000000001,-23.1475,0 -61.98639,-23.01028000000001,0 -62.02944999999999,-22.89194,0 -62.18861,-22.71029,0 -62.19,-22.63,0 -62.25917000000001,-22.60445,0 -62.24694,-22.52889,0 -62.29056,-22.48055,0 -62.39918,-22.45278,0 -62.46028,-22.37971,0 -62.62417,-22.30694,0 -62.64377,-22.2389,0 -62.78946000000001,-22.12278,0 -62.81195,-21.99695,0 -63.68584000000001,-22.00306,0 -63.70057000000001,-22.03861,0 -63.73306,-22.00278,0 -63.94111,-22.00083,0 -64.12667,-22.41028,0 -64.25333999999999,-22.56778,0 -64.32472,-22.87361,0 -64.36,-22.74084,0 -64.45252000000001,-22.64834,0 -64.4314,-22.54778,0 -64.56612,-22.36139,0 -64.53889,-22.27639,0 -64.59473000000001,-22.21167,0 -64.98833999999999,-22.09083,0 -65.57861,-22.08472,0 -65.74806,-22.11166,0 -65.92612,-21.93333,0 -66.0414,-21.91667,0 -66.07751,-21.83195,0 -66.22301,-21.78051,0 -66.29333,-22.0825,0 -66.62806999999999,-22.21305,0 -66.6889,-22.19611,0 -66.73669,-22.2275,0 -66.77473000000001,-22.42695000000001,0 -66.92639,-22.47805,0 -66.96335000000001,-22.5225,0 -67.02251,-22.5239,0 -67.01221,-22.64279,0 -67.12306,-22.71805000000001,0 -67.18362000000001,-22.82166,0 -67.00084,-23.00278,0 -67.15085000000001,-23.39194000000001,0 -67.33584999999999,-24.02167,0 -68.25223,-24.39639,0 -68.30779,-24.4925,0 -68.38918,-24.50166,0 -68.44363,-24.62639,0 -68.48779,-24.6025,0 -68.56916,-24.78612,0 -68.54528999999999,-24.87361,0 -68.455,-24.90500000000001,0 -68.42419,-25.03361,0 -68.35197000000001,-25.11723,0 -68.42028999999999,-25.15279,0 -68.46502000000001,-25.14056,0 -68.50223,-25.17723,0 -68.5975,-25.44333,0 -68.39776999999999,-26.15611000000001,0 -68.56362,-26.30056,0 -68.58362,-26.50528,0 -68.29584,-26.89168,0 -68.31556999999999,-27.04194,0 -68.50306999999999,-27.07472,0 -68.58195000000002,-27.16973,0 -68.69667,-27.10750000000001,0 -68.81084000000001,-27.12056,0 -68.87723,-27.23083,0 -68.86585,-27.28806,0 -68.90472,-27.36667,0 -69.00696000000001,-27.45889,0 -69.01251000000001,-27.53168000000001,0 -69.08416000000001,-27.64583,0 -69.06556999999999,-27.69889,0 -69.10806,-27.72194,0 -69.18584,-27.96584,0 -69.30029999999999,-27.99944,0 -69.40640999999999,-28.20889,0 -69.47612,-28.19139,0 -69.53001999999999,-28.31223,0 -69.65537999999999,-28.40094,0 -69.6664,-28.57279,0 -69.74500999999999,-28.66055,0 -69.72307000000001,-28.80334,0 -69.79528999999999,-28.95112,0 -69.79389999999999,-29.09862,0 -69.90807,-29.14139,0 -70.03140000000001,-29.30639,0 -69.96056,-29.55029,0 -69.96834,-29.66112,0 -69.91501,-29.71778,0 -69.90555999999999,-29.79112,0 -69.91880000000001,-29.97406,0 -69.97083000000002,-30.08444,0 -69.85861,-30.10695000000001,0 -69.83168000000001,-30.19055,0 -69.87000000000001,-30.21084,0 -69.89751,-30.3225,0 -69.94416,-30.37639,0 -70.02972,-30.39778,0 -70.16334999999999,-30.36472,0 -70.1339,-30.43973,0 -70.20695000000001,-30.505,0 -70.32668,-30.88805,0 -70.32778999999999,-30.95834,0 -70.25502000000002,-31.03416,0 -70.32778999999999,-31.03972,0 -70.41335000000001,-31.15389,0 -70.44556,-31.09306,0 -70.47139,-31.09805,0 -70.52943999999999,-31.17444,0 -70.5611,-31.31416,0 -70.54224000000001,-31.37333,0 -70.58805,-31.56167,0 -70.47667,-31.72639,0 -70.45889,-31.8325,0 -70.41,-31.88084,0 -70.29056,-31.88668,0 -70.23445,-31.9425,0 -70.26251000000001,-32.04362,0 -70.36389,-32.02916,0 -70.38001,-32.05167,0 -70.32529,-32.13751,0 -70.31668999999999,-32.28333,0 -70.24432000000002,-32.30984,0 -70.23889,-32.4175,0 -70.16251,-32.46305,0 -70.12946,-32.56528,0 -70.17111,-32.60778,0 -70.14862000000001,-32.75249,0 -69.9875,-32.87889,0 -70.03528,-32.99834,0 -70.10139,-33.03001,0 -70.09889,-33.1725,0 -69.99583,-33.30194,0 -69.91916999999999,-33.23806,0 -69.80779,-33.27389,0 -69.77444,-33.38111,0 -69.82919,-33.53167,0 -69.8689,-33.55194,0 -69.88528,-33.66278,0 -69.84668000000001,-33.71751,0 -69.90611,-33.78778000000001,0 -69.88306,-33.87972,0 -69.90443999999999,-33.95166,0 -69.84889,-33.97195,0 -69.8689,-34.13361,0 -69.81249,-34.23555,0 -69.88918,-34.25945,0 -69.89335,-34.28612,0 -70.04944999999999,-34.28751,0 -70.0475,-34.40917,0 -70.22139,-34.59,0 -70.25306999999999,-34.71806000000001,0 -70.31362,-34.74889,0 -70.26363000000002,-34.79778,0 -70.36194999999999,-35.00445,0 -70.36806,-35.15889,0 -70.53639,-35.20639,0 -70.56751,-35.24778,0 -70.55029000000002,-35.29667,0 -70.42001000000001,-35.34723,0 -70.46223000000001,-35.38305,0 -70.39667000000002,-35.50362,0 -70.42028000000001,-35.64362,0 -70.33778,-35.80834,0 -70.41058,-35.88694,0 -70.37361,-35.91389,0 -70.40945000000001,-35.96362,0 -70.36917,-36.04667,0 -70.42431999999999,-36.13604,0 -70.47387999999999,-36.16529,0 -70.57999,-36.14861,0 -70.58974000000001,-36.19194,0 -70.70473,-36.27057,0 -70.70808,-36.41778,0 -70.80167,-36.43473,0 -70.88751000000001,-36.40055,0 -70.93611000000001,-36.48194,0 -71.02918,-36.47917,0 -71.06056000000001,-36.59306,0 -71.04584,-36.68584,0 -71.13834,-36.69084,0 -71.18696,-36.84889,0 -71.14028999999999,-36.8825,0 -71.15833000000001,-36.925,0 -71.12223,-36.94695,0 -71.20113000000001,-36.97055,0 -71.14612,-36.99667,0 -71.125,-37.07557,0 -71.07919,-37.10418,0 -71.13528,-37.14417,0 -71.13918,-37.22416,0 -71.19667,-37.29668,0 -71.10806,-37.45862,0 -71.11557000000001,-37.57944,0 -71.17167000000001,-37.61806000000001,0 -71.18028000000001,-37.69806,0 -70.99751999999999,-38.07112,0 -71.01306,-38.23056,0 -70.97083000000001,-38.41807,0 -70.82418,-38.56806,0 -70.87667,-38.63889,0 -70.86,-38.68806,0 -70.92583999999999,-38.7425,0 -71.22612,-38.80306,0 -71.4014,-38.92028,0 -71.42279000000001,-39.03694,0 -71.38751000000001,-39.23446,0 -71.40195,-39.32723,0 -71.47057,-39.38807,0 -71.44889000000001,-39.4325,0 -71.47335,-39.47862,0 -71.54085000000002,-39.53139,0 -71.48584,-39.5575,0 -71.48806,-39.59305,0 -71.50945,-39.61945,0 -71.61528000000001,-39.61973,0 -71.68223999999999,-39.56722,0 -71.70444999999999,-39.73278,0 -71.66945,-39.85723,0 -71.60639999999999,-39.91251,0 -71.67307,-40.01611000000001,0 -71.66166,-40.09389,0 -71.78889,-40.07861,0 -71.81863,-40.20196,0 -71.72861,-40.30112,0 -71.70251,-40.27639,0 -71.66972,-40.29473,0 -71.66389000000001,-40.33611,0 -71.71973,-40.42778,0 -71.7914,-40.41528,0 -71.85583,-40.555,0 -71.84390000000001,-40.61639,0 -71.95056,-40.73278,0 -71.83694,-40.95944,0 -71.89944,-41.35861,0 -71.86472999999999,-41.44083,0 -71.87779000000001,-41.52251,0 -71.84002,-41.57528,0 -71.91833,-41.64473,0 -71.78528,-41.86611,0 -71.75977,-41.99973,0 -71.72889000000001,-42.10139,0 -71.91389,-42.17806000000001,0 -71.9639,-42.12750000000001,0 -72.01221,-42.13111000000001,0 -72.13139,-42.28196,0 -72.04779000000001,-42.35667000000001,0 -72.07167,-42.42973,0 -72.02585000000001,-42.4775,0 -72.10945,-42.525,0 -72.13918,-42.58751000000001,0 -72.10196999999999,-42.85472,0 -72.13946,-42.99139,0 -72.05277,-43.10472,0 -71.83638999999999,-43.13195000000001,0 -71.73584,-43.17694,0 -71.74335000000001,-43.30223,0 -71.89418000000001,-43.32306,0 -71.94668,-43.44723,0 -71.85834,-43.46222,0 -71.86973999999999,-43.54028,0 -71.78001999999999,-43.54834,0 -71.70278999999999,-43.59584,0 -71.69862000000001,-43.68723,0 -71.81140000000001,-43.74917,0 -71.7914,-43.78223,0 -71.7375,-43.77194,0 -71.75557000000001,-43.82557,0 -71.69834,-43.86668,0 -71.64724,-43.91861,0 -71.65224000000001,-43.95166,0 -71.75806,-44.07168,0 -71.85474000000001,-44.11084000000001,0 -71.79389999999999,-44.21556,0 -71.82250999999999,-44.26529,0 -71.79389999999999,-44.32557,0 -71.85139,-44.36,0 -71.83835000000001,-44.39334,0 -71.20361,-44.42694,0 -71.10806,-44.53972,0 -71.13473000000001,-44.58389,0 -71.19723999999999,-44.59694,0 -71.23334,-44.66278,0 -71.22362,-44.745,0 -71.28223,-44.80028000000001,0 -71.50084,-44.74305,0 -71.65363000000001,-44.78279,0 -71.77,-44.75389,0 -71.84945999999999,-44.79306,0 -72.0425,-44.75417,0 -72.08085,-44.77473000000001,0 -72.06279000000001,-44.90556,0 -71.8839,-44.94862,0 -71.75335,-44.93194,0 -71.67473,-44.98028,0 -71.57362000000001,-44.97945,0 -71.45361,-45.15918,0 -71.33835000000001,-45.22055,0 -71.29779000000001,-45.29334000000001,0 -71.37334,-45.36944,0 -71.50639,-45.41139,0 -71.46751999999999,-45.4775,0 -71.50249,-45.51556,0 -71.75666,-45.56278,0 -71.73278999999999,-45.59890000000001,0 -71.78055999999999,-45.64889000000001,0 -71.79250999999999,-45.73251,0 -71.73833999999999,-45.79028,0 -71.75501,-45.84833,0 -71.63001000000001,-45.90084000000001,0 -71.60167,-45.97473000000002,0 -71.645,-45.99945,0 -71.76028,-46.11417,0 -71.90611,-46.14834000000001,0 -71.74751000000001,-46.24278,0 -71.74890000000001,-46.38612000000001,0 -71.66916999999999,-46.54750000000001,0 -71.68195,-46.69889,0 -71.80891,-46.78417,0 -71.94029000000001,-46.81556000000001,0 -71.92471999999999,-46.85056,0 -71.96056,-46.95,0 -71.90472,-47.00084,0 -71.99667,-47.06111,0 -71.86057,-47.14194,0 -71.86528,-47.21694000000001,0 -71.91752,-47.23446,0 -72.03195,-47.20333,0 -72.01501,-47.27444000000001,0 -72.08362,-47.35472000000001,0 -72.18056,-47.42028000000001,0 -72.25639,-47.41112,0 -72.34723,-47.445,0 -72.35945,-47.48111999999999,0 -72.30556,-47.50723,0 -72.33168000000001,-47.60168,0 -72.53528000000001,-47.90917000000001,0 -72.51501,-47.96111000000001,0 -72.32278,-48.07556,0 -72.28973000000001,-48.3475,0 -72.36668,-48.34612000000001,0 -72.4075,-48.39694,0 -72.58974000000001,-48.4664,0 -72.56417,-48.80445,0 -72.75528,-48.92806,0 -72.98805,-48.98167,0 -73.1664,-49.20001000000001,0 -73.16768999999999,-49.25264000000001,0 -73.08278000000001,-49.26917000000001,0 -73.13528,-49.30556,0 -73.46474000000001,-49.31139000000001,0 -73.45252000000001,-49.38528000000001,0 -73.53111,-49.43111,0 -73.52972,-49.49639000000001,0 -73.58168000000001,-49.53196,0 -73.51000999999999,-49.61334,0 -73.53333000000001,-49.68973,0 -73.44446000000001,-49.7825,0 -73.56445000000001,-49.92472999999999,0 -73.46722,-50.00666,0 -73.53223,-50.14056,0 -73.34639,-50.23806,0 -73.28001999999999,-50.32278,0 -73.24918,-50.57639,0 -73.17834000000001,-50.64777999999999,0 -73.18085000000001,-50.72918,0 -73.14445000000001,-50.76750000000001,0 -73.01806000000001,-50.74945,0 -72.90611,-50.6675,0 -72.75834999999999,-50.6189,0 -72.62973,-50.67305,0 -72.50112,-50.60334,0 -72.29416999999999,-50.64972000000001,0 -72.34166999999999,-50.7439,0 -72.24223000000001,-50.85111,0 -72.26694999999999,-51.01723,0 -72.34113000000001,-51.03666,0 -72.39778,-51.11418000000001,0 -72.37167,-51.16473000000001,0 -72.24529000000001,-51.24443999999999,0 -72.30917,-51.30222,0 -72.33945,-51.47583,0 -72.43944999999999,-51.55972000000001,0 -72.33085,-51.58723000000001,0 -72.28558,-51.69917000000001,0 -72.13555,-51.74001,0 -71.96639999999999,-51.84861,0 -71.93946,-51.89889,0 -71.96251,-51.96029000000001,0 -71.9314,-51.98889000000001,0 -69.99834,-51.9964,0 -69.46139000000001,-52.14362000000001,0 -69.23362,-52.14334000000001,0 -68.82861,-52.27973,0 -68.4375,-52.32833,0 -68.44176,-52.37778000000001,0 -68.61758000000002,-52.64151,0 -68.63583,-54.78834,0 -68.63612000000001,-54.80477,0 -68.6431,-54.88861,0 -68.55723999999999,-54.88001,0 -68.32334,-54.84361,0 -68.28834999999999,-54.79362,0 -67.84778,-54.87611,0 -67.01134,-54.90862,0 -66.79639,-54.94555,0 -66.64944,-55.02584,0 -66.45808000000001,-55.05168,0 -66.37195,-54.98500000000001,0 -66.01334,-54.95612000000001,0 -65.95529000000001,-54.89612000000001,0 -65.73779,-54.90222,0 -65.70585,-54.96611,0 -65.6575,-54.97223,0 -65.59889,-54.93056,0 -65.49001,-54.93472000000001,0 -65.47139,-54.88361,0 -65.37667999999999,-54.93056,0 -64.67834000000001,-54.90723,0 -64.60972,-54.9,0 -64.49612000000001,-54.82696,0 -64.41862,-54.83862000000001,0 -64.30945,-54.77778,0 -64.25306999999999,-54.77972,0 -64.25389,-54.84223,0 -63.97278,-54.75973000000001,0 -63.96861000000001,-54.81807,0 -63.81362000000001,-54.7314,0 -63.92001,-54.71417000000002,0 -64.06417999999999,-54.75000000000001,0 -64.16833,-54.71417000000002,0 -64.17834000000001,-54.75083999999999,0 -64.35806,-54.70639,0 -64.38112,-54.78861,0 -64.41278,-54.73667,0 -64.4539,-54.75833,0 -64.55267000000001,-54.715,0 -65.22362,-54.63361,0 -65.67361,-54.67306,0 -65.82751,-54.65584,0 -66.27166000000001,-54.52806000000001,0 -66.54667000000001,-54.41389,0 -66.70361,-54.28917,0 -66.92418000000001,-54.21918,0 -67.49554000000002,-53.95288,0 -67.50834999999999,-48.98417,0 -67.39917,-48.89056000000001,0 -67.23972999999999,-48.82278000000001,0 -67.08278,-48.63889000000001,0 -66.82668,-48.57111,0 -66.66750999999999,-48.44167,0 -66.46805999999999,-48.39917000000001,0 -66.44362,-48.34723000000001,0 -66.32751,-48.34555,0 -66.33556,-48.28362000000001,0 -66.1414,-48.18472,0 -66.07944999999999,-48.10444,0 -65.89778,-48.09973000000001,0 -65.97139,-47.96111000000001,0 -65.79584,-47.97028000000001,0 -65.78722999999999,-47.93557000000001,0 -65.87000999999999,-47.90222000000001,0 -65.91195999999999,-47.80418,0 -65.97333999999999,-47.78389000000001,0 -66.32418,-47.88278,0 -66.38863000000001,-47.8625,0 -66.32168,-47.87306,0 -66.12083,-47.81973,0 -66.02251,-47.76084,0 -65.87584,-47.76222,0 -65.75696000000001,-47.54194,0 -65.73222,-47.34418,0 -65.77224,-47.19834,0 -65.90001,-47.09862,0 -65.99335000000001,-47.06667000000001,0 -66.20916,-47.09361000000001,0 -66.71666999999999,-47.04000000000001,0 -67.05473000000001,-46.81001,0 -67.12445,-46.72639,0 -67.33805,-46.62528,0 -67.53667,-46.4175,0 -67.62029,-46.17139,0 -67.58667,-46.00389000000001,0 -67.58436000000002,-46.00031,0 -67.42222,-45.82195,0 -67.34166999999999,-45.77890000000001,0 -67.31611000000001,-45.61501,0 -67.18362000000001,-45.52861,0 -66.94946,-45.25557,0 -66.84668000000001,-45.21029,0 -66.53528,-45.20444000000001,0 -66.51918000000001,-45.17889,0 -66.58863,-45.13862,0 -66.45975,-45.14362,0 -66.53473,-45.11584,0 -66.52196000000001,-45.08667000000001,0 -66.28500000000001,-45.03167000000001,0 -66.19473000000001,-44.95917,0 -66.01528999999999,-44.97389,0 -65.94917,-45.02223,0 -65.87529000000001,-45.01944000000001,0 -65.85139,-44.98584,0 -65.68556,-45.04306,0 -65.60474000000001,-45.0164,0 -65.58474,-44.92445,0 -65.53055999999999,-44.895,0 -65.71084999999999,-44.83362,0 -65.71917999999999,-44.77612,0 -65.59945999999999,-44.61805,0 -65.44056999999999,-44.53807,0 -65.3614,-44.54418,0 -65.38751000000001,-44.52166,0 -65.35945,-44.48306,0 -65.27667,-44.48028,0 -65.34222,-44.43862,0 -65.22806,-44.33667000000001,0 -65.31249,-44.18696,0 -65.29695,-44.13223,0 -65.22445999999999,-44.10751000000001,0 -65.21028,-43.95528,0 -65.25834999999999,-43.96973,0 -65.32001,-43.81945,0 -65.33029000000001,-43.66779,0 -65.03722000000001,-43.39418,0 -65.02806,-43.30445,0 -64.80029999999999,-43.16112,0 -64.49168,-43.08445,0 -64.29501000000001,-42.99195,0 -64.31556999999999,-42.94944,0 -64.41028,-42.97805,0 -64.50389,-42.93806000000001,0 -64.59390000000001,-42.94112000000001,0 -64.80862000000001,-42.84028000000001,0 -64.99278,-42.79361,0 -65.01806999999999,-42.73944000000001,0 -64.96056000000002,-42.66639,0 -64.82084999999999,-42.62862,0 -64.62194,-42.52,0 -64.39806,-42.51584,0 -64.19611999999999,-42.63889,0 -64.24918,-42.77612,0 -64.08694,-42.89028,0 -63.69306000000001,-42.82168,0 -63.62583,-42.76194,0 -63.63334,-42.71278,0 -63.57805,-42.60612,0 -63.59083,-42.31695,0 -63.74694,-42.09056000000001,0 -63.87195000000001,-42.10250000000001,0 -64.19917,-42.22417,0 -64.33446000000001,-42.23667,0 -64.06305999999999,-42.27862,0 -64.04528999999999,-42.37251,0 -64.1189,-42.43444000000001,0 -64.30417,-42.41528,0 -64.45193999999999,-42.44584,0 -64.60695,-42.41889,0 -64.46251,-42.26362,0 -64.87139999999999,-42.19195,0 -64.99418,-42.11222,0 -65.06223,-42.01,0 -65.07445,-41.93167,0 -64.99084000000001,-41.77862,0 -65.02916999999999,-41.67556,0 -64.99111000000001,-41.51083000000001,0 -65.07111999999999,-41.43334,0 -65.17973000000001,-40.99667,0 -65.12584,-40.84056,0 -65.0125,-40.77195,0 -64.90611,-40.76862,0 -64.93807,-40.75639,0 -64.9264,-40.72862,0 -64.98139000000001,-40.72195,0 -64.77528,-40.73278,0 -64.7975,-40.77223,0 -64.75194999999999,-40.77695,0 -64.74918,-40.80278,0 -64.89612,-40.79862,0 -64.91166,-40.82028,0 -64.88528,-40.83806,0 -64.69112,-40.83889,0 -64.41251,-40.90945,0 -64.14223,-41.02195,0 -64.05334000000001,-40.99918,0 -64.05833,-41.04501,0 -63.96001,-41.06445,0 -63.8075,-41.15917,0 -63.14195000000001,-41.16056,0 -63.03334000000002,-41.14834,0 -62.80139,-41.04333,0 -62.72333,-41.04611,0 -62.32110999999999,-40.86723,0 -62.22972,-40.66361,0 -62.18389,-40.62972000000001,0 -62.32666,-40.67834000000001,0 -62.34807,-40.60723,0 -62.26139000000001,-40.63334,0 -62.26000000000001,-40.56001,0 -62.29111,-40.56583,0 -62.33139000000001,-40.49834,0 -62.42084,-40.45945,0 -62.48945,-40.29945,0 -62.35278000000002,-40.18167,0 -62.36418000000001,-40.05528,0 -62.32000000000001,-39.86834,0 -62.28612,-39.85473,0 -62.3075,-39.81861,0 -62.18917,-39.86,0 -62.11639,-39.83945,0 -62.05002,-39.48876,0 -61.85882,-39.24178,0 -61.56255,-39.01225,0 -61.38361,-38.97973000000001,0 -61.16223,-38.99889,0 -60.86000000000001,-38.97639,0 -59.78973,-38.83694,0 -59.61,-38.77973,0 -59.03807,-38.69251,0 -58.72279,-38.58055000000001,0 -58.31223000000001,-38.48972,0 -57.84584,-38.29917,0 -57.63473000000001,-38.18,0 -57.53306,-38.08611,0 -57.54112,-37.98195000000001,0 -57.48056,-37.82584,0 -57.09973000000002,-37.47445,0 -56.66306000000001,-36.90056,0 -56.67168000000001,-36.57584,0 -56.74167,-36.31834,0 -56.77361,-36.30445,0 -56.76778000000001,-36.3475,0 -56.84778,-36.34222,0 -56.94195,-36.38334,0 -56.93389,-36.34723,0 -57.05334,-36.31417,0 -57.23667,-36.18418,0 -57.37666999999999,-35.96278,0 -57.37612,-35.78139,0 -57.12972000000001,-35.47029,0 -57.12473,-35.41695,0 -57.18833000000001,-35.32055,0 -57.33555,-35.15556,0 -57.49889,-35.04556,0 -57.81361,-34.86584,0 -58.19723,-34.73861,0 -58.34472,-34.63612,0 -58.34633000000001,-34.63362,0 -58.36945000000001,-34.58389,0 -58.46972000000001,-34.53972,0 -58.52528,-34.43972,0 -58.48417000000001,-34.34166,0 -58.56667,-34.29056,0 -58.47195,-34.28111,0 -58.40885999999999,-34.22926,0 -58.18541,-34.16549,0 -58.08334,-34.18695,0 -57.90722,-34.37,0 -57.84028,-34.49473,0 -57.58195000000001,-34.43917,0 -57.51945000000001,-34.46445,0 -57.45778,-34.44222,0 -57.11778,-34.46222,0 -56.88779,-34.66612,0 -56.5639,-34.77251,0 -56.36723,-34.79444,0 -56.42556,-34.84306,0 -56.32028,-34.91057,0 -56.22084,-34.88945,0 -56.16861,-34.93194,0 -55.68557000000001,-34.77444,0 -55.36501,-34.81056,0 -55.25666,-34.90723,0 -55.05556000000001,-34.8914,0 -54.95612000000001,-34.94028,0 -54.95129000000001,-34.9778,0 -54.53111,-34.80609000000001,0 -54.27916,-34.69389,0 -54.30083000000001,-34.65,0 -54.34583,-34.64362,0 -54.28167,-34.59306,0 -54.32557,-34.56278,0 -54.2425,-34.58139,0 -54.25695,-34.68945000000001,0 -54.14500000000001,-34.67139,0 -54.13,-34.62389000000001,0 -53.98890000000001,-34.50389,0 -53.77139,-34.39083,0 -53.75029,-34.25751,0 -53.53723000000001,-34.06612,0 -53.48251000000001,-33.85445,0 -53.3743,-33.74068,0 -52.74139000000001,-33.25695,0 -52.50465000000001,-32.88476,0 -52.50452,-37.88475,0 -52.50438,-42.88476,0 -52.50425,-47.88475,0 -52.50412000000001,-52.88476000000001,0 -52.50398000000001,-57.88475,0 -52.50385,-62.88475,0 -52.50372,-67.88475,0 -52.50368,-69.03889,0 -52.50352,-74.03888000000001,0 -52.50335,-79.03888000000001,0 -52.50323000000001,-82.53889,0 -52.50305,-87.53888000000001,0 -52.50298000000001,-89.90000000000001,0 -53.50229000000001,-89.90000000000001,0 -54.50161000000001,-89.90000000000001,0 -55.50094,-89.90000000000001,0 -56.50026,-89.90000000000001,0 -57.49957,-89.90000000000001,0 -58.49889000000002,-89.90000000000001,0 -59.49821000000001,-89.90000000000001,0 -60.49753000000001,-89.90000000000001,0 -61.49686,-89.90000000000001,0 -62.49617,-89.90000000000001,0 -63.49549,-89.90000000000001,0 -64.49481,-89.90000000000001,0 -65.49413,-89.90000000000001,0 -66.49345,-89.90000000000001,0 -67.49276999999999,-89.90000000000001,0 -67.49276999999999,-84.89999,0 -67.49276999999999,-79.90000000000001,0 -67.49276999999999,-74.90000000000001,0 -67.49276999999999,-69.90000000000001,0 -67.49276999999999,-64.90000000000001,0 -67.49276999999999,-59.90001,0 -67.49276999999999,-55.95932,0 -69.11057,-55.64479,0 -70.14055000000001,-55.36066000000002,0 -71.60384000000001,-54.89185,0 -73.13816,-54.55088000000001,0 -74.76482000000001,-52.7786,0 -75.36150000000001,-51.61010000000001,0 -75.73088,-49.03514,0 -75.68826,-48.46332,0 -75.60303000000002,-48.05132,0 -75.65273000000001,-46.92189000000001,0 -75.75219,-46.80824,0 -75.71666999999999,-46.56318,0 -75.32599,-46.32876,0 -75.18392,-44.80154,0 -74.87848,-43.52649,0 -74.43097,-43.22105,0 -74.18946,-42.17331,0 -74.0545,-41.73290000000001,0 -73.8556,-41.76842,0 -73.75281000000001,-41.75128,0 -73.68279,-41.62473,0 -73.56417999999999,-41.61362,0 -73.49195,-41.52084,0 -73.59166999999999,-41.6025,0 -73.82167,-41.56556,0 -73.82390000000001,-41.51723,0 -73.87445000000001,-41.47333,0 -73.85890000000001,-41.33973,0 -73.97806,-41.1189,0 -73.99500999999999,-40.97000000000001,0 -73.89806,-40.90639,0 -73.94778,-40.86389,0 -73.84278999999999,-40.68696,0 -73.85778999999999,-40.6264,0 -73.74751000000001,-40.52472,0 -73.78445000000001,-40.42362,0 -73.75029000000001,-40.25723,0 -73.71709,-40.20832,0 -73.73112,-40.18,0 -73.65807,-40.11028,0 -73.71445,-39.97862,0 -73.45168,-39.8325,0 -73.38251,-39.91445,0 -73.37973,-39.73639,0 -73.40443999999999,-39.69167,0 -73.34557000000001,-39.66417,0 -73.2439,-39.49139,0 -73.25751,-39.4539,0 -73.2225,-39.41473,0 -73.24597,-39.38584,0 -73.2075,-39.21556,0 -73.2353,-39.18584,0 -73.22501,-39.21945,0 -73.24779,-39.22223,0 -73.43307,-38.69168,0 -73.44196,-38.76750000000001,0 -73.54224000000001,-38.41833,0 -73.4539,-38.05556,0 -73.53807000000001,-37.87333,0 -73.66945,-37.72611000000001,0 -73.68722,-37.60111,0 -73.60196999999999,-37.51333,0 -73.60896,-37.41935,0 -78.60896,-37.41935,0 -82.11279,-37.41935,0 -82.11279,-32.41934,0 -82.11279,-27.41935000000001,0 -82.11279,-24.70552,0 -77.11279,-24.70552,0 -72.11279999999999,-24.70552,0 -70.58064000000002,-24.70552,0 -70.55695,-24.60889,0 -70.5825,-24.52667,0 -70.50306999999999,-24.16556,0 -70.51862,-23.86084,0 -70.38943999999999,-23.59723,0 -70.4164,-23.49305,0 -70.48390000000001,-23.45028,0 -70.54667000000001,-23.52112,0 -70.62306,-23.49973,0 -70.58474,-23.42389,0 -70.59361,-23.22222,0 -70.5514,-23.16250000000001,0 -70.57584,-23.07166,0 -70.50917,-23.01055,0 -70.48112000000002,-23.0825,0 -70.38862,-23.06083,0 -70.28917,-22.90139,0 -70.30750999999999,-22.75806,0 -70.16833,-21.94195,0 -70.19334000000001,-21.88805,0 -70.14805,-21.85556,0 -70.15416999999999,-21.66694,0 -70.06585,-21.52361,0 -70.08446000000001,-21.48473,0 -70.05334000000002,-21.42565,0 -70.09529000000001,-21.33667,0 -70.06473,-21.29639,0 -70.12306,-21.08139,0 -70.17001000000001,-21.01083,0 -70.13918,-20.87556,0 -70.21223000000001,-20.79973,0 -70.20473,-20.52916,0 -70.16724000000001,-20.45166,0 -70.19056999999999,-20.36778,0 -70.13306,-20.27334000000001,0 -70.16528,-20.20389,0 -70.12612,-20.07361,0 -70.13612000000001,-19.86389,0 -70.1664,-19.80695,0 -70.15167,-19.71445,0 -70.23002,-19.58667,0 -70.19862000000001,-19.57694,0 -70.19695,-19.50278,0 -70.28862,-19.29444,0 -70.27166,-19.14139,0 -70.35778999999999,-18.78417,0 -70.31001000000001,-18.43445,0 -70.40549,-18.34854,0 -70.35583,-18.31973,0 -70.14111,-18.32333,0 -69.95113000000001,-18.24278,0 -69.84141,-18.12861,0 -69.77000000000001,-17.96889,0 -69.84972000000001,-17.75418,0 -69.83223,-17.67694,0 -69.81473,-17.65223,0 -69.68389000000001,-17.66361,0 -69.49973,-17.50528,0 -69.50112,-17.37889,0 -69.59084,-17.29528,0 -69.6562,-17.28724,0 -69.61806,-17.18667,0 -69.38834,-17.055,0 -69.41112,-17.02056,0 -69.34334,-16.9825,0 -69.17001000000001,-16.72389,0 -69.01112000000001,-16.65695,0 -69.04167000000001,-16.54112,0 -68.99084000000001,-16.41973,0 -68.82252,-16.33973,0 -68.84084,-16.29555,0 -68.96501000000001,-16.20944,0 -69.13415999999999,-16.22362,0 -69.21194,-16.16055,0 -69.42195,-15.61805,0 -69.32696,-15.43055,0 -69.27584,-15.40417,0 -69.26835,-15.32695,0 -69.13695,-15.24584,0 -69.38139,-14.97,0 -69.34945999999999,-14.895,0 -69.36639,-14.8025,0 -69.24195,-14.73028,0 -69.2289,-14.57639,0 -69.1575,-14.57555,0 -69.15779000000001,-14.50528,0 -68.98139999999999,-14.37917,0 -68.99918,-14.24334,0 -68.85306,-14.19917,0 -68.89558,-14.03389,0 -68.97751,-13.96166,0 -69.00306000000001,-13.75445,0 -69.08778,-13.66333,0 -69.01472,-13.63834,0 -68.96194,-13.51305,0 -68.96335000000001,-13.02667,0 -68.97362,-12.86334,0 -68.84668000000002,-12.73278,0 -68.75666,-12.71472,0 -68.73139999999999,-12.66972,0 -68.78084,-12.61778,0 -68.6739,-12.50115,0 -68.925,-11.99667,0 -69.56751,-10.95055,0 -69.39529,-10.92695,0 -68.90028,-11.01528,0 -68.78583999999999,-10.99223,0 -68.74760000000001,-11.01038,0 -68.78084,-11.065,0 -68.77473000000001,-11.13639,0 -68.58346,-11.10614,0 -68.51694999999999,-11.05445,0 -68.41750999999999,-11.04445,0 -68.3914,-11.00805,0 -68.28055999999999,-10.98,0 -68.06111000000001,-10.67639,0 -67.84557,-10.6575,0 -67.74557,-10.7125,0 -67.70334,-10.69573,0 -67.61168000000001,-10.53222,0 -67.46363,-10.45555,0 -67.41833,-10.38306,0 -67.33334000000001,-10.37,0 -67.32417,-10.32084,0 -67.17444999999999,-10.325,0 -67.08085,-10.27194,0 -66.88806,-10.08639,0 -66.64025,-9.91827,0 -66.83056000000001,-9.838054,0 -68.65723,-9.066394000000001,0 -70.35722,-8.160553,0 -72.63779,-7.603335,0 -73.79514,-7.122628,0 -73.75446,-6.894163,0 -73.67639,-6.804441000000002,0 -73.35306,-6.576949,0 -73.19168000000001,-6.552783000000001,0 -73.12390000000001,-6.447223,0 -73.16307000000001,-6.207229,0 -73.22974000000001,-6.093613,0 -73.12612,-5.867496,0 -72.96335000000001,-5.65416,0 -72.94251,-5.543334,0 -72.96278,-5.458051000000001,0 -72.88417,-5.258052,0 -72.91750999999999,-5.151105,0 -72.89028999999999,-5.123610000000001,0 -72.74139,-5.050837,0 -72.62529000000001,-5.054166,0 -72.60916,-5.000833,0 -72.40611,-4.878891,0 -72.37529000000001,-4.784446,0 -72.235,-4.753333,0 -72.12917,-4.693609,0 -72.06657,-4.606092,0 -72.02806,-4.612501,0 -71.90249,-4.518189,0 -71.69057000000001,-4.473892,0 -71.64474,-4.509162,0 -71.62306,-4.475835,0 -71.60722,-4.498056,0 -71.51055,-4.481389,0 -71.47083000000001,-4.438333,0 -71.38223000000001,-4.430836,0 -71.3539,-4.457223,0 -71.29528999999999,-4.433608,0 -71.29056,-4.383055,0 -71.23296000000002,-4.374621000000001,0 -71.20029000000001,-4.410559,0 -71.16946,-4.357782,0 -71.12918000000001,-4.398894,0 -71.08334000000001,-4.363605,0 -71.01140000000001,-4.382226,0 -70.98862,-4.340557,0 -70.95029,-4.38139,0 -70.83056999999999,-4.234447000000001,0 -70.83474,-4.187781,0 -70.76584,-4.146390000000001,0 -70.68391,-4.173337,0 -70.62000999999999,-4.114998,0 -70.6289,-4.15666,0 -70.58414999999999,-4.195558,0 -70.54528999999999,-4.138606,0 -70.51195,-4.180285,0 -70.43333,-4.131667,0 -70.35973,-4.16584,0 -70.32389000000001,-4.136662,0 -70.30667,-4.244716,0 -70.19410000000001,-4.333177,0 -70.10695,-4.253058,0 -70.0741,-4.313079,0 -70.01862,-4.339161000000001,0 -69.96417,-4.290004,0 -69.95692,-4.236876,0 -69.46056,-1.496107,0 -69.37946,-1.35028,0 -69.38084000000002,-1.174447,0 -69.4389,-1.083889,0 -69.44198,-1.017811,0 -69.43473,-0.9941676,0 -69.52916999999999,-0.9244446000000001,0 -69.5625,-0.8080565,0 -69.61472999999999,-0.7511045,0 -69.57278,-0.6366605,0 -69.60751000000001,-0.5175005,0 -69.74612000000001,-0.4522145000000001,0 -69.85167,-0.3352775,0 -69.92834000000002,-0.3094475,0 -70.05807000000002,-0.1575005,0 -70.04416999999999,0.5908405,0 -69.79779000000001,0.6002815000000001,0 -69.67834000000001,0.6788875,0 -69.60779000000001,0.6463885,0 -69.56723,0.7011085,0 -69.46417,0.7402855,0 -69.35001,0.6369475,0 -69.29389999999999,0.6677815,0 -69.28695999999999,0.6208375,0 -69.13721,0.6299995000000001,0 -69.13863000000001,0.6866634,0 -69.18250999999999,0.7244455,0 -69.14001,0.8669425,0 -69.20278999999999,0.9066595,0 -69.22417,0.9952825,0 -69.34361000000001,1.074716,0 -69.42084000000001,1.026107,0 -69.4464,1.062215,0 -69.60196999999999,1.080836,0 -69.70473,1.059443,0 -69.76501,1.09584,0 -69.84222,1.062215,0 -69.84610000000001,1.710459,0 -69.78695999999999,1.706111,0 -69.71693999999999,1.748051,0 -69.63139,1.737782,0 -69.55584000000002,1.784159,0 -69.37793000000001,1.726146,0 -68.15306,1.724165,0 -68.17583999999999,1.763054,0 -68.23278999999999,1.775555,0 -68.22917,1.823336,0 -68.27724000000001,1.837781,0 -68.18668,2.020005,0 -68.17083,1.973889,0 -68.08945,1.933613,0 -68.00502,1.763054,0 -67.91474,1.745279,0 -67.80556,1.788335,0 -67.64418000000001,1.999997,0 -67.42417,2.143889,0 -67.33501,2.111111,0 -67.07250999999999,1.625282,0 -67.07668,1.173338,0 -66.87045000000001,1.22094,0 -66.99168,1.695833,0 -67.13361999999999,1.987785,0 -67.10945,2.094444,0 -67.16446999999999,2.135556,0 -67.21084999999999,2.240558,0 -67.17307,2.341665,0 -67.19251,2.392496,0 -67.32056,2.468339,0 -67.50333999999999,2.67722,0 -67.56778,2.683341,0 -67.60695,2.795552,0 -67.75167999999999,2.840003,0 -67.85506,2.789783,0 -67.84305999999999,2.868335000000001,0 -67.43556,3.253896,0 -67.38417,3.259161000000001,0 -67.29056,3.3975,0 -67.30723999999999,3.455559,0 -67.38779,3.493052,0 -67.49195,3.726395000000001,0 -67.61333999999999,3.754719,0 -67.70851,4.046957,0 -67.80556,4.227498,0 -67.79194,4.427495000000001,0 -67.87612,4.530833,0 -67.79056,5.054697,0 -67.82861,5.112216,0 -67.81168,5.217497,0 -67.85062000000001,5.301639,0 -67.80279,5.385563,0 -67.64944,5.478335,0 -67.61306,5.539166,0 -67.65195,5.676390000000001,0 -67.62223,5.787503,0 -67.41280999999999,5.992460000000001,0 -67.49199,6.118659000000001,0 -67.45445000000001,6.193052,0 -67.56834000000001,6.264719000000001,0 -67.82278,6.30945,0 -67.99500999999999,6.207777,0 -68.15224000000001,6.223338000000001,0 -68.31362,6.166944,0 -68.4539,6.190550000000002,0 -68.63721,6.133895,0 -69.0564,6.21611,0 -69.24529,6.081389000000001,0 -69.32501000000002,6.153605,0 -69.42944,6.118605000000001,0 -70.11917,6.975836,0 -70.30083999999999,6.939161,0 -70.51279,7.015553000000001,0 -70.56362,7.089444000000001,0 -70.61279,7.072496,0 -70.70251,7.108056,0 -70.89001,7.074998,0 -71.02501,6.984449000000001,0 -71.12806999999999,6.998895,0 -71.18668,6.962769000000001,0 -71.26555999999999,6.98778,0 -71.29556,7.033338000000001,0 -71.45778,7.015832,0 -71.60695,7.059716,0 -71.76418,7.032221,0 -71.76557,7.005555,0 -71.83278,6.987221,0 -71.9268,7.009748000000001,0 -72.06611,7.062417000000001,0 -72.14528,7.198614,0 -72.15085000000002,7.339715000000001,0 -72.18333,7.382781000000001,0 -72.39917,7.406108,0 -72.47168000000001,7.491941000000001,0 -72.44334000000001,7.828055000000001,0 -72.48139999999999,7.947783,0 -72.42307,7.985835000000001,0 -72.40252,8.041949000000001,0 -72.33362,8.049446,0 -72.32529,8.095553000000001,0 -72.38557,8.25389,0 -72.38417,8.363051000000001,0 -72.66446999999999,8.641107000000002,0 -72.7903,9.083042000000001,0 -72.76819,9.111428,0 -72.81696,9.145277,0 -72.94223,9.104165,0 -73.00639,9.304442,0 -73.21890000000001,9.171386999999999,0 -73.37195,9.166949000000001,0 -73.38361999999999,9.189719,0 -73.29834,9.284715,0 -73.16833,9.536111999999999,0 -73.09279000000001,9.585557,0 -72.96223000000001,9.836945999999999,0 -72.98723,9.914165000000001,0 -72.90501999999999,10.4425,0 -72.76028,10.65139,0 -72.66528,10.87277,0 -72.55862000000001,10.97389,0 -72.49306,11.12111,0 -72.34113000000001,11.165,0 -72.26000999999999,11.15445,0 -71.97723000000001,11.665,0 -71.52943999999999,11.78005,0 -71.38473999999999,11.82889,0 -71.32471,11.85305,0 -71.08137000000001,12.00208,0 -71.06217,12.23228,0 -71.25400999999999,12.4433,0 -71.77196000000001,12.5584,0 -71.76823,17.5584,0 -71.76786,18.0385,0 -71.74473999999999,18.13389,0 -71.76918000000001,18.20222,0 -71.69473000000001,18.32222,0 -71.9075,18.43777,0 -71.88500999999999,18.47721,0 -72.00306999999999,18.60083,0 -71.83168000000001,18.6225,0 -71.71584,18.74972,0 -71.71945,18.88389,0 -71.78889,18.96277,0 -71.85605,18.94783,0 -71.75,19.01972,0 -71.63502,19.15806,0 -71.62918000000001,19.21972,0 -71.69611999999999,19.24167,0 -71.76669,19.33195,0 -71.69862000000001,19.40027,0 -71.69168000000001,19.48584,0 -71.75418000000001,19.70582,0 -71.75587,20.2411,0 -67.50364999999999,20.24133,0 -67.50364999999999,25.24134,0 -67.50364999999999,30.24134,0 -67.50364999999999,35.24134,0 -67.50364999999999,40.24134,0 -67.50364999999999,44.47953,0 -67.11709999999999,44.69726,0 -66.95337000000001,44.82681,0 -66.97331,44.91223,0 -67.09289,45.09019000000001,0 -67.15837999999999,45.17419,0 -67.20654,45.18303,0 -67.27501,45.19887,0 -67.34193999999999,45.14999,0 -67.46278,45.2761,0 -67.4164,45.39888,0 -67.48528,45.49444,0 -67.41083,45.52999,0 -67.41249999999999,45.58693,0 -67.65666,45.63055000000001,0 -67.71751,45.69137,0 -67.79916,45.7011,0 -67.80638,45.78472,0 -67.75723000000001,45.83333,0 -67.79028,45.88194000000001,0 -67.74695,45.92917,0 -67.77251,45.95750000000001,0 -67.79333,47.07028,0 -68.18582000000001,47.33277,0 -68.30665000000001,47.36444,0 -68.37305000000001,47.34722000000001,0 -68.39751,47.29527,0 -68.49805000000002,47.30555,0 -68.88779,47.18804,0 -69.03612,47.25722,0 -69.05359,47.29379,0 -68.57611,47.42471,0 -68.38028,47.5586,0 -68.37277,47.92471000000001,0 -68.12027000000001,47.92665000000001,0 -68.1161,48.00194000000001,0 -67.61221000000001,47.99749000000001,0 -67.60417,47.9361,0 -67.35665,47.84166,0 -67.32278000000001,47.89638,0 -67.18859999999999,47.88388000000001,0 -67.04723,47.93083,0 -66.94694,47.89916000000001,0 -66.9436,47.96305000000001,0 -66.8437,47.99666,0 -66.3727,48.08661000000001,0 -65.32375999999999,47.96921,0 -64.76967999999999,48.17476000000001,0 -64.52839,48.32669000000001,0 -63.84024000000001,48.40712000000001,0 -63.04419000000001,48.50467,0 -63.05001,52.00000000000001,0 -63.84641000000001,52.00000000000001,0 -63.82917,52.25999,0 -63.91805999999999,52.33611,0 -64.02528000000001,52.35443,0 -63.9875,52.3625,0 -64.01306,52.38722,0 -63.91889000000001,52.38942999999999,0 -63.96222,52.45193,0 -64.03749999999999,52.43444,0 -64.08085,52.47610000000001,0 -64.00194999999999,52.55471,0 -63.86305999999999,52.61277,0 -63.37777,52.65083,0 -63.42305000000001,52.70722,0 -63.59584,52.77077000000001,0 -63.54084,52.91666,0 -63.54805000000001,52.98499,0 -63.62611,53.04222000000002,0 -63.655,53.105,0 -63.86639000000001,53.10527,0 -63.92805,53.07166,0 -63.91945000000001,52.97693,0 -63.98277,52.9336,0 -63.95417,52.87165,0 -64.08085,52.88138,0 -64.1725,52.85083000000001,0 -64.20140000000001,52.79084,0 -64.15666,52.73833,0 -64.20223,52.67222000000001,0 -64.17529,52.60944000000001,0 -64.20889000000001,52.54889000000001,0 -64.08308,52.37638,0 -64.13137999999999,52.28139,0 -64.11861,52.14472,0 -64.25779,52.12804,0 -64.29333,52.04639,0 -64.27444,52.00332,0 -64.33085,51.96527,0 -64.31751,51.90359999999999,0 -64.35722,51.85055000000001,0 -64.26418,51.73972000000001,0 -64.44249000000001,51.66776999999999,0 -64.58112,51.55778,0 -64.60417,51.64277,0 -64.70305999999999,51.69277000000002,0 -64.71805999999999,51.74778000000001,0 -64.59389,51.79610000000001,0 -64.58778,51.82888,0 -64.84584,51.93083000000001,0 -64.85334,52.02193000000001,0 -65.10861,52.17083000000001,0 -65.4614,52.20665000000001,0 -65.58056999999999,52.04278,0 -65.75861,52.11139,0 -65.79944,52.09555,0 -65.80167,52.04278,0 -65.91695,52.05082,0 -66.06751000000001,52.12276,0 -66.06807000000001,52.21638000000001,0 -66.17389000000001,52.22055,0 -66.26667000000001,52.31138,0 -66.31973000000001,52.28916000000001,0 -66.30388000000001,52.22276,0 -66.33556,52.13639,0 -66.43889,52.20083,0 -66.48556000000001,52.30721,0 -66.45862,52.3661,0 -66.35805000000002,52.40666,0 -66.44665999999999,52.53082,0 -66.37361,52.54249999999999,0 -66.43222,52.61138,0 -66.43388,52.70638,0 -66.32834,52.73693,0 -66.37888,52.83611,0 -66.26973,52.87749,0 -66.35472,52.98166,0 -66.47694,53.03416,0 -66.52528,52.94332000000001,0 -66.64806,52.94583,0 -66.66806,52.72581,0 -66.75501,52.71027000000001,0 -66.80556,52.66554,0 -66.87470999999999,52.74778,0 -66.89138,52.67333000000001,0 -67.08945,52.7197,0 -67.05833,52.80499,0 -67.07805999999999,52.94804000000001,0 -66.97945000000001,53.02777,0 -66.94861,53.10972000000002,0 -66.99027,53.20082000000001,0 -66.9025,53.3261,0 -66.9875,53.40359,0 -67.06779,53.38417,0 -67.06862,53.4286,0 -67.12888,53.46416,0 -67.14194999999999,53.54221,0 -67.49194,53.60388,0 -67.43195,53.78305,0 -67.58804000000001,53.85722,0 -67.60916,53.92804000000001,0 -67.76055,54.01583000000001,0 -67.78195,54.06388,0 -67.71556,54.12944000000001,0 -67.69611,54.1386,0 -67.485,54.23416,0 -67.53167000000001,54.24889,0 -67.49472,54.31444000000001,0 -67.59583000000001,54.36527000000001,0 -67.58611999999999,54.4175,0 -67.63306,54.47999000000001,0 -67.60139,54.56639000000001,0 -67.49249,54.58194,0 -67.30556,54.50416,0 -67.21945,54.6075,0 -67.03639,54.62166,0 -67.2139,54.66888000000001,0 -67.185,54.71943000000001,0 -67.30777000000001,54.78388,0 -67.26334,54.82527,0 -67.36221000000001,54.87582,0 -67.45305999999999,55.01888,0 -67.42833,55.07111,0 -67.27388999999999,55.06666,0 -67.30943000000001,55.01554000000001,0 -67.02806000000001,54.89778,0 -66.94694,54.80165,0 -66.71806000000001,54.73193,0 -66.71222,54.78194,0 -66.605,54.79084,0 -66.73166999999999,54.94332,0 -66.65944000000002,54.97942,0 -66.76585,55.10556,0 -66.74083,55.17749,0 -66.6889,55.20416,0 -66.83389,55.31332,0 -66.80029,55.33999000000001,0 -66.68804,55.3011,0 -66.68195,55.25333,0 -66.57640000000001,55.25055,0 -66.23999000000001,54.99194000000001,0 -66.035,54.90972,0 -65.95778,54.92944000000001,0 -65.85834,54.90778,0 -65.83528,54.83138,0 -65.68998000000001,54.71332,0 -65.44387999999999,54.74583000000001,0 -65.09445,54.69555,0 -64.81166,54.74917000000001,0 -64.55222000000001,54.72055,0 -64.34723,54.75527,0 -63.97619000000001,54.62645000000001,0 -63.72084,54.59665,0 -63.62361,54.66610000000001,0 -63.54194,54.84055,0 -63.43528000000001,54.97360000000001,0 -63.56611000000002,55.06027,0 -63.51944,55.1836,0 -63.11423,55.31608,0 -63.09333,55.34583000000001,0 -63.17445,55.40971,0 -63.14416,55.52638000000001,0 -63.29833000000001,55.52333,0 -63.44806,55.59943,0 -63.48833000000001,55.69665000000001,0 -63.71528,55.85917000000001,0 -63.69416,55.94222,0 -63.445,56.02276,0 -63.81333,56.0425,0 -63.88,56.07695,0 -63.84778,56.12027,0 -64.02028,56.07638000000001,0 -64.01083,56.15999,0 -63.87694,56.21721,0 -63.97472000000001,56.25916000000001,0 -64.08667,56.25916000000001,0 -64.13667,56.3036,0 -64.10584,56.33139000000001,0 -64.11417,56.39027000000001,0 -64.16972,56.42778,0 -63.97472000000001,56.41277,0 -63.87138,56.43942,0 -63.94611,56.48388,0 -63.945,56.54972,0 -64.12888,56.69943,0 -64.08362,56.76554,0 -63.99222000000002,56.78582,0 -64.00528,56.85054000000001,0 -63.87138,56.87805000000001,0 -63.91779,56.93027000000001,0 -63.86333,56.99276,0 -63.87361,57.06638000000002,0 -63.78751,57.11193999999999,0 -63.79249999999999,57.16526000000001,0 -63.7411,57.23277,0 -63.80500000000001,57.28027,0 -63.83944,57.20054,0 -63.86584000000001,57.19583000000001,0 -63.87583,57.23193000000001,0 -63.83694000000001,57.32583000000002,0 -63.7075,57.3786,0 -63.75723000000001,57.43444000000001,0 -63.76501,57.57388,0 -63.60723,57.66361,0 -63.58944,57.72526,0 -63.65333,57.7311,0 -63.70055,57.66277000000001,0 -63.76528,57.73277000000001,0 -63.82556000000002,57.69027,0 -63.89194,57.73027,0 -63.92666,57.79722,0 -64.00666,57.81276,0 -64.02251,57.77138,0 -64.05749,57.76943000000001,0 -64.21445,57.97748,0 -64.20862,58.03334,0 -64.43195,58.08611,0 -64.38721,58.19137000000001,0 -64.21861,58.23082,0 -64.16306,58.34389,0 -64.03667,58.37499,0 -64.0025,58.42527,0 -63.85918,58.43776,0 -63.81555,58.47805000000001,0 -63.84584,58.50805,0 -63.89806,58.56499,0 -64.04277,58.52388000000001,0 -64.10056,58.57916,0 -64.08611999999999,58.63777,0 -64.02916999999999,58.68694,0 -63.50611,58.73194,0 -63.4825,58.77055000000001,0 -63.58834,58.84638000000002,0 -63.77083,58.87554000000001,0 -63.83333,58.8325,0 -63.97472000000001,58.8261,0 -64.15611,58.74528,0 -64.25751,58.77944000000001,0 -64.25861999999999,58.85000000000001,0 -64.30029,58.88249,0 -64.56807000000001,58.88721000000001,0 -64.71888,58.94527000000001,0 -64.80943000000002,58.9111,0 -64.88332,58.93194,0 -64.83890000000001,58.9586,0 -64.86472000000001,58.99054,0 -64.82944000000002,59.03249,0 -64.72,59.07,0 -64.46084000000001,58.98443,0 -64.29138,59.00527,0 -64.34972000000001,59.06666000000001,0 -64.48917,59.09943,0 -64.49306,59.15888,0 -64.53471999999999,59.19749000000001,0 -64.50751,59.25,0 -64.53834000000001,59.29055,0 -64.49916,59.33972000000001,0 -64.53806,59.37360000000001,0 -64.485,59.39638,0 -64.50696000000001,59.42832000000001,0 -64.34334,59.50111,0 -64.43249,59.52944,0 -64.70084,59.44583000000001,0 -64.83307000000001,59.53971,0 -64.77306,59.69887,0 -64.81416000000002,59.81889,0 -64.74445,59.84499,0 -64.76778,59.87999,0 -64.66191000000001,59.88361,0 -64.6536,59.92999,0 -64.84778,59.96416,0 -64.90639,60.04805,0 -64.79695,60.03972,0 -64.7025,60.06499,0 -64.73416,60.10333,0 -64.59778,60.11749,0 -64.63721,60.17833,0 -64.76723,60.175,0 -64.8586,60.25583000000001,0 -64.56751,60.30471,0 -64.53325,60.3025,0 -64.48108000000001,60.36652000000001,0 -64.39993,60.38216,0 -64.6279,61.34092,0 -64.29521,62.44402000000001,0 -63.98004,63.25823000000001,0 -63.97128,63.76601000000001,0 -63.50727,64.82534,0 -62.6493,65.48196,0 -62.08899,65.51698,0 -61.97518,65.88468,0 -61.43238,66.19110000000001,0 -60.93336000000002,66.62885,0 -61.12597,66.90025,0 -61.94015000000002,67.30296000000001,0 -63.71739,67.86327,0 -64.37838000000001,68.03400000000001,0 -66.06807000000001,68.37982,0 -66.53207,68.44109,0 -66.59773,69.21590000000001,0 -66.70717000000001,69.43039,0 -67.20399999999999,69.97538,0 -67.50825,70.17017,0 -67.77307,70.28399,0 -68.07777,70.31999999999999,0 -68.07777,75.31999999999999,0 -68.07777,75.93836,0 -72.5564,77.34211000000001,0 -72.55276000000001,78.52284,0 -67.76724,79.10155,0 -63.60658000000001,76.32865,0 -63.58193000000001,76.31222,0 -62.34444,76.01053,0 -59.57289,75.70371,0 -57.85474000000001,74.69123,0 -56.16726000000001,72.58955,0 -55.98318,71.67934000000001,0 -55.18546,71.07594,0 -55.07296,70.48277,0 -55.02182000000001,69.63903000000001,0 -53.82526,67.68565,0 -54.00934,67.10271,0 -53.71276,66.05441999999999,0 -53.01731,65.35898,0 -52.50595000000001,64.94479,0 + + + + + +-56.12872,46.48062,0 -56.12872,47.16830000000001,0 -56.74985000000001,47.16830000000001,0 -56.74985000000001,46.48062,0 -56.12872,46.48062,0 + + + +-57.07413,53.19926000000002,0 -57.10572,51.03270000000001,0 -57.32588,50.86326,0 -57.94108,49.80638,0 -58.39064,49.19907,0 -58.77711000000001,48.81260000000002,0 -59.22667000000001,48.58387000000001,0 -59.28977,48.48923,0 -59.43964,47.90558999999999,0 -59.3292,47.5901,0 -59.2109,47.527,0 -58.29600000000001,47.62165000000001,0 -57.71236,47.58221000000001,0 -56.97096000000001,47.3456,0 -56.81322,47.47968,0 -56.30055,47.5901,0 -56.01662,47.24306000000001,0 -55.88254000000001,47.25095000000001,0 -55.7169,47.14054000000001,0 -55.89832,47.07743000000001,0 -56.10338,46.90392,0 -56.10338,46.84081,0 -55.3541,46.82505,0 -55.14116,46.9749,0 -54.99129,47.17208000000001,0 -54.36033000000001,47.37714,0 -54.03695,47.25095000000001,0 -54.21047,46.91969000000001,0 -54.21047,46.78561,0 -54.06062,46.77773,0 -53.91864,46.84081,0 -53.80033,46.94335,0 -53.6426,46.91969000000001,0 -53.68204000000001,46.69886,0 -53.61893000000001,46.61998,0 -53.53217000000001,46.59632000000001,0 -53.42175000000002,46.66731,0 -53.32711000000001,46.66731,0 -53.12204000000001,46.59632000000001,0 -52.90121,46.76984000000002,0 -52.80656000000001,47.16419000000001,0 -52.59361000000001,47.51122,0 -52.68037,47.76362,0 -52.81445000000001,47.83459,0 -52.88544,47.69263,0 -53.09838,47.69263,0 -53.01952000000001,47.90558999999999,0 -52.77501,48.08699,0 -52.72769000000001,48.16587000000001,0 -52.93275,48.20530000000001,0 -53.18515000000001,48.10277,0 -53.36654000000001,48.25262,0 -53.05107,48.41823999999999,0 -52.94065000000001,48.59177,0 -53.08260000000001,48.72585,0 -53.26402000000001,48.59966,0 -53.41388,48.63908000000001,0 -53.50852,48.59177,0 -53.57161,48.71006000000001,0 -53.56372,48.82837,0 -53.59527,48.93091,0 -53.43753,49.27005,0 -53.91076,49.6092,0 -54.09216,49.77482000000001,0 -54.81778000000001,49.70385,0 -55.07016,49.58554000000001,0 -55.33043000000001,49.53822,0 -55.72480000000001,49.68018,0 -55.78001,49.76695,0 -55.43297,49.94835000000001,0 -55.50396,50.03511,0 -55.44086,50.79227,0 -55.53551,50.93423,0 -55.39375,51.64408,0 -55.61563,52.12514000000001,0 -55.60509,52.46212,0 -55.76833000000001,52.86228000000001,0 -55.742,53.19926000000002,0 -57.07413,53.19926000000002,0 + + + 1 + + + + + +-52.52415,84.90001,0 -52.52951,82.29564000000001,0 -52.95565,82.35877000000001,0 -53.42914,82.29564000000001,0 -54.21828,82.37454,0 -56.03332,82.31142000000001,0 -58.87425,82.10625,0 -59.49456,82.01636000000002,0 -61.43191,82.50069000000002,0 -62.89619,82.57953999999999,0 -63.38053000000001,82.86113,0 -64.77722,82.92871,0 -67.50302000000001,82.99629,0 -67.50302000000001,84.90001,0 -67.50302000000001,89.90000000000001,0 -66.50375,89.90000000000001,0 -65.50446,89.90000000000001,0 -64.50519,89.90000000000001,0 -63.50591,89.90000000000001,0 -62.50663999999999,89.90000000000001,0 -61.50736,89.90000000000001,0 -60.50808,89.90000000000001,0 -59.50880000000001,89.90000000000001,0 -58.50953,89.90000000000001,0 -57.51024,89.90000000000001,0 -56.51097000000001,89.90000000000001,0 -55.5117,89.90000000000001,0 -54.51242000000001,89.90000000000001,0 -53.51314,89.90000000000001,0 -52.51387,89.90000000000001,0 -52.52415,84.90001,0 + + + 1 + + + + + GMT -03.30 + + +]]> + #khStylem0350 + + + + +-55.39375,51.64408,0 -55.53551,50.93423,0 -55.44086,50.79227,0 -55.50396,50.03511,0 -55.43297,49.94835000000001,0 -55.78001,49.76695,0 -55.72480000000001,49.68018,0 -55.33043000000001,49.53822,0 -55.07016,49.58554000000001,0 -54.81778000000001,49.70385,0 -54.09216,49.77482000000001,0 -53.91076,49.6092,0 -53.43753,49.27005,0 -53.59527,48.93091,0 -53.56372,48.82837,0 -53.57161,48.71006000000001,0 -53.50852,48.59177,0 -53.41388,48.63908000000001,0 -53.26402000000001,48.59966,0 -53.08260000000001,48.72585,0 -52.94065000000001,48.59177,0 -53.05107,48.41823999999999,0 -53.36654000000001,48.25262,0 -53.18515000000001,48.10277,0 -52.93275,48.20530000000001,0 -52.72769000000001,48.16587000000001,0 -52.77501,48.08699,0 -53.01952000000001,47.90558999999999,0 -53.09838,47.69263,0 -52.88544,47.69263,0 -52.81445000000001,47.83459,0 -52.68037,47.76362,0 -52.59361000000001,47.51122,0 -52.80656000000001,47.16419000000001,0 -52.90121,46.76984000000002,0 -53.12204000000001,46.59632000000001,0 -53.32711000000001,46.66731,0 -53.42175000000002,46.66731,0 -53.53217000000001,46.59632000000001,0 -53.61893000000001,46.61998,0 -53.68204000000001,46.69886,0 -53.6426,46.91969000000001,0 -53.80033,46.94335,0 -53.91864,46.84081,0 -54.06062,46.77773,0 -54.21047,46.78561,0 -54.21047,46.91969000000001,0 -54.03695,47.25095000000001,0 -54.36033000000001,47.37714,0 -54.99129,47.17208000000001,0 -55.14116,46.9749,0 -55.3541,46.82505,0 -56.10338,46.84081,0 -56.10338,46.90392,0 -55.89832,47.07743000000001,0 -55.71691000000001,47.14054000000001,0 -55.88254000000001,47.25095000000001,0 -56.01662,47.24306000000001,0 -56.30055,47.5901,0 -56.81322,47.47968,0 -56.97096000000001,47.3456,0 -57.71236,47.58221000000001,0 -58.29600000000001,47.62165000000001,0 -59.2109,47.527,0 -59.3292,47.5901,0 -59.43964,47.90558999999999,0 -59.28977,48.48923,0 -59.22667000000001,48.58387000000001,0 -58.77711000000001,48.81260000000002,0 -58.39064,49.19907,0 -57.94108,49.80638,0 -57.32588,50.86326,0 -57.10572,51.03270000000001,0 -57.07413,53.19926000000002,0 -55.742,53.19926000000002,0 -55.76833000000001,52.86228000000001,0 -55.60509,52.46212,0 -55.61563,52.12514000000001,0 -55.39375,51.64408,0 + + + 1 + + + + GMT -03:00 + + +]]> + #khStylem0300 + + + + + +-56.12872,46.48062,0 -56.74985000000001,46.48062,0 -56.74985000000001,47.16830000000001,0 -56.12872,47.16830000000001,0 -56.12872,46.48062,0 + + + 1 + + + + + +-37.51992,84.90001,0 -37.51992,83.74590000000001,0 -34.51386,83.78599,0 -29.51426,83.7223,0 -28.22116000000001,83.70583000000001,0 -23.25304,83.14206,0 -22.56975,83.06453000000002,0 -21.33607,82.72414000000001,0 -19.25519,82.23316,0 -18.10955,81.78892999999999,0 -17.59517,81.92921,0 -16.16897,82.02274,0 -13.71401,81.90584,0 -12.03061,81.69541,0 -12.03061,81.55513000000001,0 -14.53233,80.80695,0 -15.51431,80.61991,0 -17.31461,79.94186999999999,0 -17.47827,79.26384,0 -17.52503,77.76749,0 -18.06279,76.85564000000001,0 -18.50702,75.85029,0 -17.24447,75.26577,0 -17.26786,74.98521,0 -18.13293,74.58775,0 -19.34872,74.17858,0 -20.28394,73.40702,0 -21.42958000000001,72.84589,0 -21.78029,72.14449000000001,0 -21.17239,70.78841,0 -21.35944,70.48445,0 -22.03747,69.97009,0 -22.51389,69.82120999999999,0 -23.90792,69.38557000000002,0 -25.89525,68.70753000000001,0 -27.43837,68.38021000000001,0 -29.7998,67.98274000000001,0 -31.90405,67.86584000000001,0 -33.65758,66.67344,0 -35.45789,65.8785,0 -37.51991,65.16843,0 -37.51991,64.96842,0 -37.51991,59.96843000000001,0 -37.51991,54.96843,0 -37.51991,49.96843,0 -37.51991,44.96843000000001,0 -37.51991,39.96843,0 -37.51991,34.96843,0 -37.51991,29.96842,0 -37.51991,25.36843,0 -37.51991,20.36843,0 -37.51991,15.36843,0 -37.51991,15.36609,0 -37.51991,10.36609,0 -37.51991,5.366087,0 -37.51991,0.3660925,0 -37.51991,-4.633912,0 -37.28973,-4.726108,0 -37.17445,-4.918609,0 -36.88278,-4.949163,0 -36.79723,-5.046391,0 -36.68722,-5.098339,0 -36.54417,-5.134447,0 -36.52583,-5.108608,0 -36.58167,-5.088051,0 -36.28028,-5.11111,0 -36.25472,-5.10166,0 -36.28751,-5.091660000000001,0 -36.12889,-5.097502,0 -35.93472,-5.052223,0 -35.60445000000001,-5.110839,0 -35.4175,-5.214717000000001,0 -35.26195,-5.484726,0 -35.14557,-5.938893000000001,0 -35.105,-5.981112000000001,0 -35.09278,-6.178887000000001,0 -35.11528,-6.165838,0 -35.15501,-6.208894,0 -35.13584,-6.228612,0 -35.08778,-6.199164,0 -35.04139,-6.233887000000001,0 -35.01501,-6.374998000000001,0 -34.98028,-6.40639,0 -34.94334,-6.779997000000001,0 -34.91195,-6.879997000000001,0 -34.85834,-6.919444,0 -34.915,-7.127497,0 -34.85695,-7.075837,0 -34.82556,-6.987502,0 -34.83084,-7.108605,0 -34.7925,-7.178607,0 -34.8075,-7.515000000000001,0 -34.81779,-7.546942,0 -34.8932,-7.543089,0 -34.92334,-7.563889000000001,0 -34.84056,-7.554448,0 -34.80083,-7.63111,0 -34.83084,-7.683337,0 -34.87555,-7.622227000000001,0 -34.85167,-7.695559000000002,0 -34.90696,-7.735834,0 -34.85834,-7.73028,0 -34.89333,-7.804998000000001,0 -34.84472,-7.835554000000001,0 -34.81528,-7.935283000000001,0 -34.85612,-8.073612000000001,0 -34.92668,-8.038333,0 -34.88001,-8.113049999999999,0 -34.94,-8.270550999999999,0 -34.93584,-8.350552,0 -35.02194,-8.423056000000001,0 -34.98694,-8.418888000000001,0 -34.99195,-8.448895,0 -34.97001,-8.430552000000001,0 -35.16612,-8.960283,0 -35.32751,-9.228889000000001,0 -35.45667,-9.346393000000001,0 -35.5825,-9.535833,0 -35.65751,-9.586387,0 -35.69028,-9.668889999999999,0 -35.77306,-9.695277000000001,0 -35.73695,-9.651394000000002,0 -35.79362,-9.589725,0 -35.79222,-9.683056000000001,0 -35.86,-9.739160999999999,0 -35.90528,-9.621667,0 -35.95196,-9.602784,0 -35.86917,-9.764163999999999,0 -35.79557,-9.728334,0 -36.04444000000001,-10.07583,0 -36.28139,-10.28695,0 -36.28445,-10.3525,0 -36.40483,-10.49879,0 -36.56751,-10.54445,0 -36.85861,-10.73916,0 -37.02166,-10.93584,0 -37.00862,-10.81056,0 -37.06889000000001,-10.79445,0 -37.07779,-10.73389,0 -37.15333,-10.74861,0 -37.09417000000001,-10.80111,0 -37.14168,-10.82528,0 -37.04028000000001,-10.8375,0 -37.05333,-10.94917,0 -37.15667,-11.10444,0 -37.20723,-11.03723,0 -37.27916,-11.02528,0 -37.26028,-11.07222,0 -37.20195,-11.0925,0 -37.22112,-11.10778,0 -37.16446,-11.11389,0 -37.15112,-11.19194,0 -37.26501,-11.28667,0 -37.33000000000001,-11.42723,0 -37.39834,-11.40223,0 -37.36362,-11.31556,0 -37.27584,-11.25973,0 -37.29862,-11.20195,0 -37.30555,-11.245,0 -37.34779,-11.18778,0 -37.31362,-11.26305,0 -37.34861,-11.25028,0 -37.33139,-11.28667,0 -37.39528,-11.33389,0 -37.41223,-11.40278,0 -37.46917,-11.36667,0 -37.39305,-11.45,0 -37.48791,-11.52023,0 -37.39806,-11.49972,0 -37.36223,-11.45472,0 -37.51972,-11.77389,0 -37.51972,-12.17389,0 -37.51974,-17.17389,0 -37.51975,-22.17389,0 -37.51977,-27.17389,0 -37.51978,-32.17389,0 -37.51979,-37.17389,0 -37.51979,-42.17389,0 -37.5198,-47.08813000000001,0 -37.51982,-52.08813,0 -40.01502,-52.08813,0 -45.01502000000001,-52.08813,0 -45.01502000000001,-54.93388,0 -42.51982,-54.93388,0 -37.51983,-54.93388,0 -37.51984,-59.90001,0 -37.51985000000001,-64.90000000000001,0 -37.51987,-69.90000000000001,0 -37.51987,-74.90000000000001,0 -37.51988,-79.90000000000001,0 -37.51989,-84.89999,0 -37.51991,-89.90000000000001,0 -38.51878,-89.90000000000001,0 -39.51765,-89.90000000000001,0 -40.51651,-89.90000000000001,0 -41.51539,-89.90000000000001,0 -42.51426,-89.90000000000001,0 -43.51314000000001,-89.90000000000001,0 -44.51201,-89.90000000000001,0 -45.51088,-89.90000000000001,0 -46.50975,-89.90000000000001,0 -47.50861,-89.90000000000001,0 -48.50749,-89.90000000000001,0 -49.50636,-89.90000000000001,0 -50.50524000000001,-89.90000000000001,0 -51.5041,-89.90000000000001,0 -52.50298000000001,-89.90000000000001,0 -52.50305,-87.53888000000001,0 -52.50323000000001,-82.53889,0 -52.50335,-79.03888000000001,0 -52.50352,-74.03888000000001,0 -52.50368,-69.03889,0 -52.50372,-67.88475,0 -52.50385,-62.88475,0 -52.50398000000001,-57.88475,0 -52.50412000000001,-52.88476000000001,0 -52.50425,-47.88475,0 -52.50438,-42.88476,0 -52.50452,-37.88475,0 -52.50465000000001,-32.88476,0 -52.74139000000001,-33.25695,0 -53.3743,-33.74068,0 -53.48251000000001,-33.85445,0 -53.53723000000001,-34.06612,0 -53.75029,-34.25751,0 -53.77139,-34.39083,0 -53.98890000000001,-34.50389,0 -54.13,-34.62389000000001,0 -54.14500000000001,-34.67139,0 -54.25695,-34.68945000000001,0 -54.2425,-34.58139,0 -54.32557,-34.56278,0 -54.28167,-34.59306,0 -54.34583,-34.64362,0 -54.30083000000001,-34.65,0 -54.27916,-34.69389,0 -54.53111,-34.80609000000001,0 -54.95129000000001,-34.9778,0 -54.95612000000001,-34.94028,0 -55.05556000000001,-34.8914,0 -55.25666,-34.90723,0 -55.36501,-34.81056,0 -55.68557000000001,-34.77444,0 -56.16861,-34.93194,0 -56.22084,-34.88945,0 -56.32028,-34.91057,0 -56.42556,-34.84306,0 -56.36723,-34.79444,0 -56.5639,-34.77251,0 -56.88779,-34.66612,0 -57.11778,-34.46222,0 -57.45778,-34.44222,0 -57.51945000000001,-34.46445,0 -57.58195000000001,-34.43917,0 -57.84028,-34.49473,0 -57.90722,-34.37,0 -58.08334,-34.18695,0 -58.18541,-34.16549,0 -58.40885999999999,-34.22926,0 -58.47195,-34.28111,0 -58.56667,-34.29056,0 -58.48417000000001,-34.34166,0 -58.52528,-34.43972,0 -58.46972000000001,-34.53972,0 -58.36945000000001,-34.58389,0 -58.34633000000001,-34.63362,0 -58.34472,-34.63612,0 -58.19723,-34.73861,0 -57.81361,-34.86584,0 -57.49889,-35.04556,0 -57.33555,-35.15556,0 -57.18833000000001,-35.32055,0 -57.12473,-35.41695,0 -57.12972000000001,-35.47029,0 -57.37612,-35.78139,0 -57.37666999999999,-35.96278,0 -57.23667,-36.18418,0 -57.05334,-36.31417,0 -56.93389,-36.34723,0 -56.94195,-36.38334,0 -56.84778,-36.34222,0 -56.76778000000001,-36.3475,0 -56.77361,-36.30445,0 -56.74167,-36.31834,0 -56.67168000000001,-36.57584,0 -56.66306000000001,-36.90056,0 -57.09973000000002,-37.47445,0 -57.48056,-37.82584,0 -57.54112,-37.98195000000001,0 -57.53306,-38.08611,0 -57.63473000000001,-38.18,0 -57.84584,-38.29917,0 -58.31223000000001,-38.48972,0 -58.72279,-38.58055000000001,0 -59.03807,-38.69251,0 -59.61,-38.77973,0 -59.78973,-38.83694,0 -60.86000000000001,-38.97639,0 -61.16223,-38.99889,0 -61.38361,-38.97973000000001,0 -61.56255,-39.01225,0 -61.85882,-39.24178,0 -62.05002,-39.48876,0 -62.11639,-39.83945,0 -62.18917,-39.86,0 -62.3075,-39.81861,0 -62.28612,-39.85473,0 -62.32000000000001,-39.86834,0 -62.36418000000001,-40.05528,0 -62.35278000000002,-40.18167,0 -62.48945,-40.29945,0 -62.42084,-40.45945,0 -62.33139000000001,-40.49834,0 -62.29111,-40.56583,0 -62.26000000000001,-40.56001,0 -62.26139000000001,-40.63334,0 -62.34807,-40.60723,0 -62.32666,-40.67834000000001,0 -62.18389,-40.62972000000001,0 -62.22972,-40.66361,0 -62.32110999999999,-40.86723,0 -62.72333,-41.04611,0 -62.80139,-41.04333,0 -63.03334000000002,-41.14834,0 -63.14195000000001,-41.16056,0 -63.8075,-41.15917,0 -63.96001,-41.06445,0 -64.05833,-41.04501,0 -64.05334000000001,-40.99918,0 -64.14223,-41.02195,0 -64.41251,-40.90945,0 -64.69112,-40.83889,0 -64.88528,-40.83806,0 -64.91166,-40.82028,0 -64.89612,-40.79862,0 -64.74918,-40.80278,0 -64.75194999999999,-40.77695,0 -64.7975,-40.77223,0 -64.77528,-40.73278,0 -64.98141,-40.72195,0 -64.9264,-40.72862,0 -64.93807,-40.75639,0 -64.90611,-40.76862,0 -65.0125,-40.77195,0 -65.12584,-40.84056,0 -65.17973000000001,-40.99667,0 -65.07111999999999,-41.43334,0 -64.99111000000001,-41.51083000000001,0 -65.02916999999999,-41.67556,0 -64.99084000000001,-41.77862,0 -65.07445,-41.93167,0 -65.06223,-42.01,0 -64.99418,-42.11222,0 -64.87139999999999,-42.19195,0 -64.46251,-42.26362,0 -64.60695,-42.41889,0 -64.45193999999999,-42.44584,0 -64.30417,-42.41528,0 -64.1189,-42.43444000000001,0 -64.04528999999999,-42.37251,0 -64.06305999999999,-42.27862,0 -64.33446000000001,-42.23667,0 -64.19917,-42.22417,0 -63.87195000000001,-42.10250000000001,0 -63.74694,-42.09056000000001,0 -63.59083,-42.31695,0 -63.57805,-42.60612,0 -63.63334,-42.71278,0 -63.62583,-42.76194,0 -63.69306000000001,-42.82168,0 -64.08694,-42.89028,0 -64.24918,-42.77612,0 -64.19611999999999,-42.63889,0 -64.39806,-42.51584,0 -64.62194,-42.52,0 -64.82084999999999,-42.62862,0 -64.96056000000002,-42.66639,0 -65.01806999999999,-42.73944000000001,0 -64.99278,-42.79361,0 -64.80862000000001,-42.84028000000001,0 -64.59390000000001,-42.94112000000001,0 -64.50389,-42.93806000000001,0 -64.41028,-42.97805,0 -64.31556999999999,-42.94944,0 -64.29501000000001,-42.99195,0 -64.49168,-43.08445,0 -64.80029999999999,-43.16112,0 -65.02806,-43.30445,0 -65.03722000000001,-43.39418,0 -65.33029000000001,-43.66779,0 -65.32001,-43.81945,0 -65.25834999999999,-43.96973,0 -65.21028,-43.95528,0 -65.22445999999999,-44.10751000000001,0 -65.29695,-44.13223,0 -65.31249,-44.18696,0 -65.22806,-44.33667000000001,0 -65.34222,-44.43862,0 -65.27667,-44.48028,0 -65.35945,-44.48306,0 -65.38751000000001,-44.52166,0 -65.3614,-44.54418,0 -65.44056999999999,-44.53807,0 -65.59945999999999,-44.61805,0 -65.71917999999999,-44.77612,0 -65.71084999999999,-44.83362,0 -65.53055999999999,-44.895,0 -65.58474,-44.92445,0 -65.60474000000001,-45.0164,0 -65.68556,-45.04306,0 -65.85139,-44.98584,0 -65.87529000000001,-45.01944000000001,0 -65.94917,-45.02223,0 -66.01528999999999,-44.97389,0 -66.19473000000001,-44.95917,0 -66.28500000000001,-45.03167000000001,0 -66.52196000000001,-45.08667000000001,0 -66.53473,-45.11584,0 -66.45975,-45.14362,0 -66.58863,-45.13862,0 -66.51918000000001,-45.17889,0 -66.53528,-45.20444000000001,0 -66.84668000000001,-45.21029,0 -66.94946,-45.25557,0 -67.18362000000001,-45.52861,0 -67.31611000000001,-45.61501,0 -67.34166999999999,-45.77890000000001,0 -67.42222,-45.82195,0 -67.58436000000002,-46.00031,0 -67.58667,-46.00389000000001,0 -67.62029,-46.17139,0 -67.53667,-46.4175,0 -67.33805,-46.62528,0 -67.12445,-46.72639,0 -67.05473000000001,-46.81001,0 -66.71666999999999,-47.04000000000001,0 -66.20916,-47.09361000000001,0 -65.99335000000001,-47.06667000000001,0 -65.90001,-47.09862,0 -65.77224,-47.19834,0 -65.73222,-47.34418,0 -65.75696000000001,-47.54194,0 -65.87584,-47.76222,0 -66.02251,-47.76084,0 -66.12083,-47.81973,0 -66.32168,-47.87306,0 -66.38863000000001,-47.8625,0 -66.32418,-47.88278,0 -65.97333999999999,-47.78389000000001,0 -65.91195999999999,-47.80418,0 -65.87000999999999,-47.90222000000001,0 -65.78722999999999,-47.93557000000001,0 -65.79584,-47.97028000000001,0 -65.97139,-47.96111000000001,0 -65.89778,-48.09973000000001,0 -66.07944999999999,-48.10444,0 -66.1414,-48.18472,0 -66.33556,-48.28362000000001,0 -66.32751,-48.34555,0 -66.44362,-48.34723000000001,0 -66.46805999999999,-48.39917000000001,0 -66.66750999999999,-48.44167,0 -66.82668,-48.57111,0 -67.08278,-48.63889000000001,0 -67.23972999999999,-48.82278000000001,0 -67.39917,-48.89056000000001,0 -67.50834999999999,-48.98417,0 -67.49554000000002,-53.95288,0 -66.92418000000001,-54.21918,0 -66.70361,-54.28917,0 -66.54667000000001,-54.41389,0 -66.27166000000001,-54.52806000000001,0 -65.82751,-54.65584,0 -65.67361,-54.67306,0 -65.22362,-54.63361,0 -64.55267000000001,-54.715,0 -64.4539,-54.75833,0 -64.41278,-54.73667,0 -64.38112,-54.78861,0 -64.35806,-54.70639,0 -64.17834000000001,-54.75083999999999,0 -64.16833,-54.71417000000002,0 -64.06417999999999,-54.75000000000001,0 -63.92001,-54.71417000000002,0 -63.81362000000001,-54.7314,0 -63.96861000000001,-54.81807,0 -63.97278,-54.75973000000001,0 -64.25389,-54.84223,0 -64.25306999999999,-54.77972,0 -64.30945,-54.77778,0 -64.41862,-54.83862000000001,0 -64.49612000000001,-54.82696,0 -64.60972,-54.9,0 -64.67834000000001,-54.90723,0 -65.37667999999999,-54.93056,0 -65.47139,-54.88361,0 -65.49001,-54.93472000000001,0 -65.59889,-54.93056,0 -65.6575,-54.97223,0 -65.70585,-54.96611,0 -65.73779,-54.90222,0 -65.95529000000001,-54.89612000000001,0 -66.01334,-54.95612000000001,0 -66.37195,-54.98500000000001,0 -66.45808000000001,-55.05168,0 -66.64944,-55.02584,0 -66.79639,-54.94555,0 -67.01134,-54.90862,0 -67.84778,-54.87611,0 -68.28834999999999,-54.79362,0 -68.32334,-54.84361,0 -68.55723999999999,-54.88001,0 -68.6431,-54.88861,0 -68.63612000000001,-54.80477,0 -68.63583,-54.78834,0 -68.61758000000002,-52.64151,0 -68.44176,-52.37778000000001,0 -68.4375,-52.32833,0 -68.82861,-52.27973,0 -69.23362,-52.14334000000001,0 -69.46139000000001,-52.14362000000001,0 -69.99834,-51.9964,0 -71.9314,-51.98889000000001,0 -71.96251,-51.96029000000001,0 -71.93946,-51.89889,0 -71.96639999999999,-51.84861,0 -72.13555,-51.74001,0 -72.28558,-51.69917000000001,0 -72.33085,-51.58723000000001,0 -72.43944999999999,-51.55972000000001,0 -72.33945,-51.47583,0 -72.30917,-51.30222,0 -72.24529000000001,-51.24443999999999,0 -72.37167,-51.16473000000001,0 -72.39778,-51.11418000000001,0 -72.34113000000001,-51.03666,0 -72.26694999999999,-51.01723,0 -72.24223000000001,-50.85111,0 -72.34166999999999,-50.7439,0 -72.29416999999999,-50.64972000000001,0 -72.50112,-50.60334,0 -72.62973,-50.67305,0 -72.75834999999999,-50.6189,0 -72.90611,-50.6675,0 -73.01806000000001,-50.74945,0 -73.14445000000001,-50.76750000000001,0 -73.18085000000001,-50.72918,0 -73.17834000000001,-50.64777999999999,0 -73.24918,-50.57639,0 -73.28001999999999,-50.32278,0 -73.34639,-50.23806,0 -73.53223,-50.14056,0 -73.46722,-50.00666,0 -73.56445000000001,-49.92472999999999,0 -73.44446000000001,-49.7825,0 -73.53333000000001,-49.68973,0 -73.51000999999999,-49.61334,0 -73.58168000000001,-49.53196,0 -73.52972,-49.49639000000001,0 -73.53111,-49.43111,0 -73.45252000000001,-49.38528000000001,0 -73.46474000000001,-49.31139000000001,0 -73.13528,-49.30556,0 -73.08278000000001,-49.26917000000001,0 -73.16768999999999,-49.25264000000001,0 -73.1664,-49.20001000000001,0 -72.98805,-48.98167,0 -72.75528,-48.92806,0 -72.56419,-48.80445,0 -72.58974000000001,-48.4664,0 -72.4075,-48.39694,0 -72.36668,-48.34612000000001,0 -72.28973000000001,-48.3475,0 -72.32278,-48.07556,0 -72.51501,-47.96111000000001,0 -72.53528000000001,-47.90917000000001,0 -72.33168000000001,-47.60168,0 -72.30556,-47.50723,0 -72.35945,-47.48111999999999,0 -72.34723,-47.445,0 -72.25639,-47.41112,0 -72.18056,-47.42028000000001,0 -72.08362,-47.35472000000001,0 -72.01501,-47.27444000000001,0 -72.03195,-47.20333,0 -71.91752,-47.23446,0 -71.86528,-47.21694000000001,0 -71.86057,-47.14194,0 -71.99667,-47.06111,0 -71.90472,-47.00084,0 -71.96056,-46.95,0 -71.92471999999999,-46.85056,0 -71.94029000000001,-46.81556000000001,0 -71.80891,-46.78417,0 -71.68195,-46.69889,0 -71.66916999999999,-46.54750000000001,0 -71.74890000000001,-46.38612000000001,0 -71.74751000000001,-46.24278,0 -71.90611,-46.14834000000001,0 -71.76028,-46.11417,0 -71.645,-45.99945,0 -71.60167,-45.97473000000002,0 -71.63001000000001,-45.90084000000001,0 -71.75501,-45.84833,0 -71.73833999999999,-45.79028,0 -71.79250999999999,-45.73251,0 -71.78055999999999,-45.64889000000001,0 -71.73278999999999,-45.59890000000001,0 -71.75666,-45.56278,0 -71.50249,-45.51556,0 -71.46751999999999,-45.4775,0 -71.50639,-45.41139,0 -71.37334,-45.36944,0 -71.29779000000001,-45.29334000000001,0 -71.33835000000001,-45.22055,0 -71.45361,-45.15918,0 -71.57362000000001,-44.97945,0 -71.67473,-44.98028,0 -71.75335,-44.93194,0 -71.8839,-44.94862,0 -72.06279000000001,-44.90556,0 -72.08085,-44.77473000000001,0 -72.0425,-44.75417,0 -71.84945999999999,-44.79306,0 -71.77,-44.75389,0 -71.65363000000001,-44.78279,0 -71.50084,-44.74305,0 -71.28223,-44.80028000000001,0 -71.22362,-44.745,0 -71.23334,-44.66278,0 -71.19723999999999,-44.59694,0 -71.13473000000001,-44.58389,0 -71.10806,-44.53972,0 -71.20361,-44.42694,0 -71.83835000000001,-44.39334,0 -71.85139,-44.36,0 -71.79389999999999,-44.32557,0 -71.82250999999999,-44.26529,0 -71.79389999999999,-44.21556,0 -71.85474000000001,-44.11084000000001,0 -71.75806,-44.07168,0 -71.65224000000001,-43.95166,0 -71.64724,-43.91861,0 -71.69834,-43.86668,0 -71.75557000000001,-43.82557,0 -71.7375,-43.77194,0 -71.7914,-43.78223,0 -71.81140000000001,-43.74917,0 -71.69862000000001,-43.68723,0 -71.70278999999999,-43.59584,0 -71.78001999999999,-43.54834,0 -71.86973999999999,-43.54028,0 -71.85834,-43.46222,0 -71.94665999999999,-43.44723,0 -71.89418000000001,-43.32306,0 -71.74335000000001,-43.30223,0 -71.73584,-43.17694,0 -71.83638999999999,-43.13195000000001,0 -72.05277,-43.10472,0 -72.13946,-42.99139,0 -72.10196999999999,-42.85472,0 -72.13918,-42.58751000000001,0 -72.10945,-42.525,0 -72.02585000000001,-42.4775,0 -72.07167,-42.42973,0 -72.04779000000001,-42.35667000000001,0 -72.13139,-42.28196,0 -72.01221,-42.13111000000001,0 -71.9639,-42.12750000000001,0 -71.91389,-42.17806000000001,0 -71.72889000000001,-42.10139,0 -71.75977,-41.99973,0 -71.78528,-41.86611,0 -71.91833,-41.64473,0 -71.84002,-41.57528,0 -71.87779000000001,-41.52251,0 -71.86472999999999,-41.44083,0 -71.89944,-41.35861,0 -71.83694,-40.95944,0 -71.95056,-40.73278,0 -71.84390000000001,-40.61639,0 -71.85583,-40.555,0 -71.7914,-40.41528,0 -71.71973,-40.42778,0 -71.66389000000001,-40.33611,0 -71.66972,-40.29473,0 -71.70251,-40.27639,0 -71.72861,-40.30112,0 -71.81863,-40.20196,0 -71.78889,-40.07861,0 -71.66166,-40.09389,0 -71.67307,-40.01611000000001,0 -71.60639999999999,-39.91251,0 -71.66945,-39.85723,0 -71.70444999999999,-39.73278,0 -71.68223999999999,-39.56722,0 -71.61528000000001,-39.61973,0 -71.50945,-39.61945,0 -71.48806,-39.59305,0 -71.48584,-39.5575,0 -71.54085000000002,-39.53139,0 -71.47335,-39.47862,0 -71.44889000000001,-39.4325,0 -71.47057,-39.38807,0 -71.40195,-39.32723,0 -71.38751000000001,-39.23446,0 -71.42279000000001,-39.03694,0 -71.4014,-38.92028,0 -71.22612,-38.80306,0 -70.92583999999999,-38.7425,0 -70.86,-38.68806,0 -70.87667,-38.63889,0 -70.82418,-38.56806,0 -70.97083000000001,-38.41807,0 -71.01306,-38.23056,0 -70.99751999999999,-38.07112,0 -71.18028000000001,-37.69806,0 -71.17167000000001,-37.61806000000001,0 -71.11557000000001,-37.57944,0 -71.10806,-37.45862,0 -71.19667,-37.29668,0 -71.13918,-37.22416,0 -71.13528,-37.14417,0 -71.07919,-37.10418,0 -71.125,-37.07557,0 -71.14612,-36.99667,0 -71.20113000000001,-36.97055,0 -71.12223,-36.94695,0 -71.15833000000001,-36.925,0 -71.14028999999999,-36.8825,0 -71.18696,-36.84889,0 -71.13834,-36.69084,0 -71.04584,-36.68584,0 -71.06056000000001,-36.59306,0 -71.02918,-36.47917,0 -70.93611000000001,-36.48194,0 -70.88751000000001,-36.40055,0 -70.80168999999999,-36.43473,0 -70.70808,-36.41778,0 -70.70473,-36.27057,0 -70.58974000000001,-36.19194,0 -70.57999,-36.14861,0 -70.47387999999999,-36.16529,0 -70.42431999999999,-36.13604,0 -70.36917,-36.04667,0 -70.40945000000001,-35.96362,0 -70.37361,-35.91389,0 -70.41058,-35.88694,0 -70.33778,-35.80834,0 -70.42028000000001,-35.64362,0 -70.39667000000002,-35.50362,0 -70.46223000000001,-35.38305,0 -70.42001000000001,-35.34723,0 -70.55029000000002,-35.29667,0 -70.56751,-35.24778,0 -70.53639,-35.20639,0 -70.36806,-35.15889,0 -70.36194999999999,-35.00445,0 -70.26363000000002,-34.79778,0 -70.31362,-34.74889,0 -70.25306999999999,-34.71806000000001,0 -70.22139,-34.59,0 -70.0475,-34.40917,0 -70.04944999999999,-34.28751,0 -69.89335,-34.28612,0 -69.88918,-34.25945,0 -69.81249,-34.23555,0 -69.8689,-34.13361,0 -69.84889,-33.97195,0 -69.90443999999999,-33.95166,0 -69.88306,-33.87972,0 -69.90611,-33.78778000000001,0 -69.84668000000001,-33.71751,0 -69.88528,-33.66278,0 -69.8689,-33.55194,0 -69.82919,-33.53167,0 -69.77444,-33.38111,0 -69.80779,-33.27389,0 -69.91916999999999,-33.23806,0 -69.99583,-33.30194,0 -70.09889,-33.1725,0 -70.10139,-33.03001,0 -70.03528,-32.99834,0 -69.9875,-32.87889,0 -70.14862000000001,-32.75249,0 -70.17111,-32.60778,0 -70.12946,-32.56528,0 -70.16251,-32.46305,0 -70.23889,-32.4175,0 -70.24432000000002,-32.30984,0 -70.31668999999999,-32.28333,0 -70.32529,-32.13751,0 -70.38001,-32.05167,0 -70.36389,-32.02916,0 -70.26251000000001,-32.04362,0 -70.23445,-31.9425,0 -70.29056,-31.88668,0 -70.41,-31.88084,0 -70.45889,-31.8325,0 -70.47667,-31.72639,0 -70.58805,-31.56167,0 -70.54224000000001,-31.37333,0 -70.5611,-31.31416,0 -70.52943999999999,-31.17444,0 -70.47139,-31.09805,0 -70.44556,-31.09306,0 -70.41335000000001,-31.15389,0 -70.32778999999999,-31.03972,0 -70.25502000000002,-31.03416,0 -70.32778999999999,-30.95834,0 -70.32668,-30.88805,0 -70.20695000000001,-30.505,0 -70.1339,-30.43973,0 -70.16334999999999,-30.36472,0 -70.02972,-30.39778,0 -69.94416,-30.37639,0 -69.89751,-30.3225,0 -69.87000000000001,-30.21084,0 -69.83168000000001,-30.19055,0 -69.85861,-30.10695000000001,0 -69.97083000000002,-30.08444,0 -69.91880000000001,-29.97406,0 -69.90555999999999,-29.79112,0 -69.91501,-29.71778,0 -69.96834,-29.66112,0 -69.96056,-29.55029,0 -70.03140000000001,-29.30639,0 -69.90807,-29.14139,0 -69.79389999999999,-29.09862,0 -69.79528999999999,-28.95112,0 -69.72307000000001,-28.80334,0 -69.74500999999999,-28.66055,0 -69.6664,-28.57279,0 -69.65537999999999,-28.40094,0 -69.53001999999999,-28.31223,0 -69.47612,-28.19139,0 -69.40640999999999,-28.20889,0 -69.30029999999999,-27.99944,0 -69.18584,-27.96584,0 -69.10806,-27.72194,0 -69.06556999999999,-27.69889,0 -69.08416000000001,-27.64583,0 -69.01251000000001,-27.53168000000001,0 -69.00696000000001,-27.45889,0 -68.90472,-27.36667,0 -68.86585,-27.28806,0 -68.87723,-27.23083,0 -68.81084000000001,-27.12056,0 -68.69667,-27.10750000000001,0 -68.58195000000002,-27.16973,0 -68.50306999999999,-27.07472,0 -68.31556999999999,-27.04194,0 -68.29584,-26.89168,0 -68.58362,-26.50528,0 -68.56362,-26.30056,0 -68.39776999999999,-26.15611000000001,0 -68.5975,-25.44333,0 -68.50223,-25.17723,0 -68.46502000000001,-25.14056,0 -68.42028999999999,-25.15279,0 -68.35197000000001,-25.11723,0 -68.42419,-25.03361,0 -68.455,-24.90500000000001,0 -68.54528999999999,-24.87361,0 -68.56916,-24.78612,0 -68.48779,-24.6025,0 -68.44363,-24.62639,0 -68.38918,-24.50166,0 -68.30779,-24.4925,0 -68.25223,-24.39639,0 -67.33584999999999,-24.02167,0 -67.15085000000001,-23.39194000000001,0 -67.00084,-23.00278,0 -67.18362000000001,-22.82166,0 -67.12306,-22.71805000000001,0 -67.01221,-22.64279,0 -67.02251,-22.5239,0 -66.96335000000001,-22.5225,0 -66.92639,-22.47805,0 -66.77473000000001,-22.42695000000001,0 -66.73669,-22.2275,0 -66.6889,-22.19611,0 -66.62806999999999,-22.21305,0 -66.29333,-22.0825,0 -66.22301,-21.78051,0 -66.07751,-21.83195,0 -66.0414,-21.91667,0 -65.92612,-21.93333,0 -65.74806,-22.11166,0 -65.57861,-22.08472,0 -64.98833999999999,-22.09083,0 -64.59473000000001,-22.21167,0 -64.53889,-22.27639,0 -64.56612,-22.36139,0 -64.4314,-22.54778,0 -64.45252000000001,-22.64834,0 -64.36,-22.74084,0 -64.32472,-22.87361,0 -64.25333999999999,-22.56778,0 -64.12667,-22.41028,0 -63.94111,-22.00083,0 -63.73306,-22.00278,0 -63.70057000000001,-22.03861,0 -63.68584000000001,-22.00306,0 -62.81195,-21.99695,0 -62.78946000000001,-22.12278,0 -62.64377,-22.2389,0 -62.62417,-22.30694,0 -62.46028,-22.37971,0 -62.39918,-22.45278,0 -62.29056,-22.48055,0 -62.24694,-22.52889,0 -62.25917000000001,-22.60445,0 -62.19,-22.63,0 -62.18861,-22.71029,0 -62.02944999999999,-22.89194,0 -61.98639,-23.01028000000001,0 -61.78167000000001,-23.1475,0 -61.73973000000001,-23.24362,0 -61.51722,-23.345,0 -61.49694,-23.41361,0 -61.29472,-23.48917,0 -61.11556000000001,-23.60362,0 -61.11639000000001,-23.66666,0 -61.02473,-23.78612,0 -60.85499999999999,-23.8725,0 -60.61389000000001,-23.89444,0 -60.57334000000001,-23.95111,0 -60.28639,-24.0375,0 -60.03806,-24.00972000000001,0 -59.47278000000001,-24.35306,0 -59.33889000000001,-24.48889,0 -59.06778,-24.60695000000001,0 -58.80334000000001,-24.78417,0 -58.45056,-24.85695000000001,0 -58.33833000000001,-24.99778,0 -58.22139,-24.93916,0 -57.98083000000001,-25.07805000000001,0 -57.87112000000001,-25.08778,0 -57.7561,-25.17694,0 -57.64029000000001,-25.37917,0 -57.55333000000001,-25.44834,0 -57.57750999999999,-25.57889000000001,0 -57.75167,-25.67056,0 -57.77167,-25.7075,0 -57.74196,-25.72806,0 -57.81098,-25.77314,0 -57.80361000000001,-25.83473,0 -57.87445,-25.87861,0 -57.84973,-25.91833,0 -57.90361,-25.95833,0 -57.85583000000001,-26.00195,0 -58.07805,-26.12472,0 -58.11000000000001,-26.19806000000001,0 -58.1525,-26.18861,0 -58.10389000000001,-26.23555,0 -58.17250000000001,-26.27305,0 -58.16251,-26.31973,0 -58.21139,-26.42640000000001,0 -58.18306000000001,-26.4614,0 -58.21917,-26.535,0 -58.16889000000001,-26.60279,0 -58.18167,-26.65611,0 -58.23973,-26.64973,0 -58.24639,-26.765,0 -58.28584,-26.77195,0 -58.28389,-26.81139,0 -58.34584,-26.81722,0 -58.32167,-26.88223,0 -58.47834,-26.93916000000001,0 -58.51028,-27.05861,0 -58.54639000000001,-27.04611,0 -58.56417,-27.1175,0 -58.65278,-27.15834,0 -58.65573,-27.19161,0 -58.59888999999999,-27.245,0 -58.60461000000001,-27.31692,0 -58.22,-27.26555,0 -57.79139,-27.29223,0 -57.6264,-27.36916,0 -57.12944000000001,-27.48973000000001,0 -57.07167000000001,-27.49195,0 -56.90862000000001,-27.41778,0 -56.73695,-27.50694,0 -56.67305,-27.46140000000001,0 -56.55,-27.4525,0 -56.37806,-27.58834,0 -56.27084,-27.46140000000001,0 -56.26805000000001,-27.3875,0 -56.13778,-27.30889,0 -55.89833000000001,-27.32918,0 -55.84251,-27.40778,0 -55.73612000000001,-27.43944,0 -55.67557,-27.36862,0 -55.59639000000001,-27.33806,0 -55.56751000000001,-27.24944,0 -55.60196,-27.16834,0 -55.55667,-27.16166,0 -55.53973,-27.105,0 -55.455,-27.09528,0 -55.41389,-26.98278000000001,0 -55.27111,-26.9375,0 -55.12889,-26.94917,0 -55.12889,-26.86805,0 -55.05112,-26.80028,0 -54.95722,-26.77834,0 -54.92389,-26.68056,0 -54.80612,-26.66418,0 -54.77862,-26.61083,0 -54.79362,-26.52305,0 -54.69278000000001,-26.42834,0 -54.6675,-26.23888,0 -54.63333999999999,-26.20028,0 -54.66166000000001,-26.15834,0 -54.64083,-26.07139,0 -54.665,-25.9825,0 -54.60139,-25.95278,0 -54.61723,-25.89556,0 -54.58584000000001,-25.81944,0 -54.64556000000001,-25.66250000000001,0 -54.58501,-25.64139000000001,0 -54.59892,-25.57323,0 -54.61696,-25.43806,0 -54.42305,-25.14306,0 -54.45639,-25.08723,0 -54.45250999999999,-25.01111,0 -54.33055,-24.67945,0 -54.33139000000001,-24.49278,0 -54.24889,-24.35362,0 -54.33778000000001,-24.14389,0 -54.2439,-24.05361,0 -54.08028000000001,-23.94806,0 -53.96889000000001,-23.44695000000002,0 -53.72139000000001,-23.30028,0 -53.57218000000002,-22.88526,0 -53.15685,-22.70582,0 -52.97528000000001,-22.48223,0 -52.49723,-22.21611,0 -52.36556,-22.10028000000001,0 -52.29028,-21.96084,0 -52.17445,-21.85778,0 -52.15028,-21.78334,0 -52.05334,-21.71889,0 -52.03723,-21.64639,0 -52.09195,-21.55584,0 -52.04973,-21.50278000000001,0 -51.9625,-21.49778,0 -51.87056000000001,-21.35029,0 -51.84973,-21.26973,0 -51.87111000000001,-21.14917,0 -51.79223,-21.09139,0 -51.63001,-20.88028,0 -51.58084000000001,-20.60028,0 -51.46612,-20.53917,0 -51.26055000000001,-20.31528,0 -51.04611,-20.25028,0 -51.00643,-20.07929,0 -50.98584000000001,-19.9075,0 -51.02361000000001,-19.7225,0 -50.98112,-19.57166,0 -50.9325,-19.55667,0 -50.96278000000001,-19.475,0 -50.92341,-19.45669,0 -51.11418000000001,-19.29083,0 -51.3064,-19.25889,0 -51.42306,-19.15806,0 -51.63223,-19.13334,0 -51.84166,-19.05361,0 -51.89694,-18.995,0 -52.06557,-18.94416,0 -52.18861,-18.83695,0 -52.34917,-18.81667,0 -52.47278,-18.70834,0 -52.63667,-18.72305,0 -52.89001,-18.67805,0 -52.8675,-18.57695,0 -52.75805,-18.4125,0 -52.895,-18.34694,0 -52.98834000000001,-18.38889,0 -53.02973,-18.37194,0 -53.05806,-18.28305,0 -53.05389000000001,-18.01667,0 -53.1139,-17.8889,0 -53.12612000000001,-17.67167,0 -53.22778000000001,-17.49805,0 -53.19084,-17.36723,0 -53.20166,-17.28473,0 -53.03973,-17.0525,0 -53.0275,-16.93778,0 -52.97334,-16.82111,0 -52.83222,-16.76417,0 -52.72084,-16.66471,0 -52.69139,-16.57639,0 -52.63779000000001,-16.53889,0 -52.57751,-16.34166,0 -52.43473,-16.27139,0 -52.44056000000001,-16.09694,0 -52.33055,-16.0425,0 -52.24306000000001,-15.88028,0 -52.03751,-15.87555,0 -51.96584,-15.80111,0 -51.90389,-15.8225,0 -51.87695,-15.80055,0 -51.77973000000001,-15.63084,0 -51.78861,-15.53417,0 -51.74973,-15.54084,0 -51.70361,-15.48194,0 -51.63667000000001,-15.17556,0 -51.41251000000001,-14.99723,0 -51.31833000000001,-14.9625,0 -51.29611,-15.01473,0 -51.25723,-15.02139,0 -51.16028,-14.975,0 -51.0975,-14.89111,0 -51.03833,-14.65973,0 -50.96778000000001,-14.53083,0 -50.99918000000001,-14.40555,0 -50.92694,-14.11972,0 -50.84555,-14.08639,0 -50.87056,-13.71861,0 -50.78973000000001,-13.66806,0 -50.75834,-13.53778,0 -50.59166,-13.29694,0 -50.56834,-13.22861,0 -50.59028000000001,-13.07723,0 -50.49806,-12.96056,0 -50.48167000000001,-12.8475,0 -50.4841,-12.84488,0 -50.59806,-12.81056,0 -50.62555,-12.65639,0 -50.67362000000001,-12.62805,0 -50.61361,-12.38416,0 -50.61972,-12.28444,0 -50.67334000000001,-12.20223,0 -50.68389,-12.04861,0 -50.64251,-11.88555,0 -50.67973000000001,-11.87,0 -50.71448,-11.74943,0 -50.64834,-11.60334,0 -50.73667,-11.52445,0 -50.74139,-11.46444,0 -50.65917000000001,-11.24305,0 -50.66473000000001,-11.1425,0 -50.60946,-11.06528,0 -50.63778,-10.9325,0 -50.61167,-10.88139,0 -50.62944,-10.82611,0 -50.5825,-10.73945,0 -50.60667000000001,-10.65584,0 -50.52278,-10.56334,0 -50.48278,-10.39361,0 -50.40862,-10.3075,0 -50.38167,-10.11029,0 -50.30944,-10.02889,0 -50.23251000000001,-9.844165,0 -51.1372,-9.797392,0 -51.07751,-9.31194,0 -51.12167,-9.258607,0 -51.1725,-8.998056,0 -51.33805,-8.772786,0 -51.44778000000001,-8.691948999999999,0 -51.52667000000001,-8.544447999999999,0 -51.51973,-8.418888000000001,0 -51.42722,-8.269164,0 -51.44501,-8.193051000000001,0 -51.40862000000001,-8.134731,0 -51.43333000000001,-8.088058,0 -51.41695,-8.028333999999999,0 -51.26918,-7.983613,0 -51.16889,-7.914447,0 -51.10196000000001,-7.803054,0 -51.23056,-7.623612,0 -51.18334,-7.543612,0 -51.21639,-7.419159,0 -51.20167000000001,-7.342497,0 -51.27251,-7.274448000000001,0 -51.38807,-7.269723000000002,0 -51.48695,-7.19416,0 -51.64500000000001,-7.158888000000001,0 -51.65556000000002,-7.06222,0 -51.74084,-6.956110000000001,0 -51.69805,-6.901659,0 -51.72723,-6.893613,0 -51.71278000000002,-6.860278,0 -51.78751,-6.690835,0 -51.9575,-6.613336,0 -52.01314,-6.657526,0 -52.08528,-6.548607000000001,0 -52.22473,-6.573888,0 -52.36139000000001,-6.381109,0 -52.43055,-6.338053000000001,0 -52.43056000000001,-6.210279,0 -52.53807,-6.036390000000001,0 -52.53889,-5.840838000000001,0 -52.645,-5.688891,0 -52.70612,-5.469165,0 -52.84084,-5.406949,0 -52.86778000000001,-5.365558,0 -52.86972,-5.210001,0 -52.92639,-5.008608,0 -52.83056,-4.882780000000001,0 -52.66223,-4.493052,0 -52.66278000000001,-4.433338,0 -52.73,-4.376107,0 -52.73806,-4.331107,0 -52.63945,-4.193614000000001,0 -52.60722000000001,-3.860839,0 -52.35639000000001,-3.665836,0 -52.23778,-3.510559,0 -52.15778,-3.34305,0 -52.15028,-3.235554,0 -52.04611000000001,-3.294441,0 -51.94445,-3.409444,0 -51.92667,-3.553605999999999,0 -51.83223000000001,-3.609163,0 -51.74917,-3.562498000000001,0 -51.66917,-3.471661,0 -51.74472000000001,-3.35611,0 -51.63556000000001,-3.291661,0 -51.61153,-3.147264,0 -51.82334,-3.100285,0 -51.94334000000001,-2.898334000000001,0 -52.04999999999999,-2.809999,0 -52.06667000000001,-2.714715,0 -52.03139,-2.59722,0 -52.12361000000001,-2.389717000000001,0 -52.20028,-2.407501,0 -52.15028,-2.358055,0 -52.25917,-2.161108,0 -52.26723,-2.061666,0 -52.36806000000001,-2.098612,0 -52.27139,-2.01916,0 -52.31806000000001,-1.935559,0 -52.26917,-1.813051,0 -52.34612,-1.674721,0 -52.31139000000001,-1.627498,0 -52.26806,-1.682218,0 -52.2275,-1.616392,0 -52.28528,-1.53361,0 -52.44972,-1.586944,0 -52.54084,-1.571949,0 -52.71278,-1.603333,0 -52.70722,-1.561105,0 -52.47639,-1.490553,0 -52.43805,-1.441108,0 -52.22139,-1.342504,0 -52.10778,-1.415835,0 -52.00557,-1.404163,0 -51.92334,-1.328608,0 -51.93501,-1.192501,0 -51.90139,-1.150552,0 -51.9775,-1.135279,0 -52.0475,-1.170838,0 -52.06945,-1.220284,0 -52.11389000000001,-1.155286,0 -52.27112000000001,-1.133893,0 -52.37028000000001,-1.061388,0 -52.38528000000002,-0.8791655,0 -52.51918000000001,-0.8797145,0 -52.50666,-0.7508345000000001,0 -52.5066,-0.7438775,0 -52.53807,-0.6247175,0 -52.60056,-0.6144485,0 -52.62723,-0.5727785,0 -52.63278,-0.3822215000000001,0 -52.81223000000001,-0.1780565,0 -52.87194,-0.2033375,0 -52.92334,-0.1863905,0 -52.97112,-0.01638954,0 -53.01583,0.03500046,0 -53.0061,0.1311115,0 -53.04139000000001,0.2474995,0 -53.12889,0.3866664,0 -53.11723000000001,0.7422205,0 -53.28250000000001,0.7902805000000003,0 -53.41861999999999,0.9422185000000001,0 -53.46723,1.142496,0 -53.40584000000001,1.187504,0 -53.4325,1.25666,0 -53.54889,1.243889,0 -53.55306,1.367783,0 -53.65639000000001,1.363058,0 -53.66417,1.429442,0 -53.69694000000001,1.410281,0 -53.73695,1.437786,0 -53.75307000000002,1.392497,0 -53.82167,1.419722,0 -53.82723,1.384163,0 -53.85778,1.383605,0 -53.98807000000001,1.520558,0 -54.08278000000001,1.505556,0 -54.10139,1.613051,0 -54.36111,1.763054,0 -54.735,1.768607,0 -54.76307,1.986947,0 -54.80084,2.017781,0 -54.75029,2.076659,0 -54.78945,2.163609,0 -54.71111,2.274723,0 -54.73722000000001,2.425833,0 -54.77539,2.456846,0 -54.86750000000001,2.440278,0 -54.97223,2.554721,0 -54.94834000000001,2.617496,0 -55.11195,2.527217,0 -55.13807000000001,2.573891000000001,0 -55.24139000000001,2.499164,0 -55.32249,2.516948,0 -55.38,2.428056,0 -55.58473,2.438334,0 -55.71028,2.399165,0 -55.96584,2.53277,0 -55.99195000000001,2.4075,0 -56.04528000000001,2.344445,0 -56.08917,2.355281,0 -56.13807,2.266947,0 -56.0425,2.232782,0 -56.03639,2.177505,0 -55.90139000000001,2.045285,0 -55.90417,1.89305,0 -55.94667,1.853333,0 -56.03723,1.836944,0 -56.47063,1.944503,0 -56.56279,2.023892,0 -56.69187,2.028734,0 -56.81057,2.193336,0 -56.8064,2.250836,0 -56.87833000000001,2.297781,0 -56.87112,2.348891,0 -56.92806,2.391948,0 -56.91778,2.428056,0 -57.09806,2.749166,0 -57.20139000000001,2.821391000000001,0 -57.21333,2.878892000000001,0 -57.17917,2.914443,0 -57.21111,2.928051,0 -57.24111000000001,3.138057,0 -57.28528,3.143888000000001,0 -57.30139,3.377501000000001,0 -57.35028,3.355001,0 -57.41057000000001,3.382496,0 -57.48083000000001,3.323888999999999,0 -57.50334,3.351393,0 -57.64223000000001,3.356387,0 -57.66693999999999,3.395555,0 -57.63721,3.455,0 -57.65445,3.518612,0 -57.73473,3.610277,0 -57.83583,3.664998000000001,0 -57.87668,3.80916,0 -58.04723,4.008338,0 -58.0714,4.159161,0 -57.9539,4.28777,0 -57.95889,4.403339,0 -57.83862,4.654718,0 -57.92333000000001,4.821948,0 -57.84112,4.927778,0 -57.77140000000001,4.922774,0 -57.68806000000001,5.010282,0 -57.42028,4.989168,0 -57.28889,5.016663,0 -57.32305,5.069717,0 -57.29695,5.160285000000001,0 -57.25471,5.175279,0 -57.22889,5.140835,0 -57.18862,5.16861,0 -57.23521000000001,5.259942,0 -57.26307,5.26778,0 -57.25639000000001,5.22278,0 -57.27916,5.223339,0 -57.28723000000002,5.310557,0 -57.33555,5.313338,0 -57.27223000000001,5.38028,0 -57.24850000000001,5.486112,0 -57.16833,5.537222,0 -57.13139,5.773337,0 -57.06833000000001,5.942223,0 -56.97724,6.000021,0 -55.15563000000001,6.048935,0 -54.47205,5.976981000000002,0 -52.91902,5.485283,0 -52.50826000000001,5.098526,0 -52.50826000000001,5.239709,0 -52.5083,10.2397,0 -52.50835,15.23971,0 -52.50838,19.83971,0 -52.50841,24.83971,0 -52.50846,29.83971,0 -52.50845000000001,29.94478,0 -52.50809000000001,34.94477,0 -52.50773000000001,39.94478,0 -52.50738,44.94477,0 -52.50703,49.94478,0 -52.50666,54.94477,0 -52.50631,59.94478000000001,0 -52.50595000000001,64.94479,0 -53.01731,65.35898,0 -53.71276,66.05441999999999,0 -54.00934,67.10271,0 -53.82526,67.68565,0 -55.02182000000001,69.63903000000001,0 -55.07296,70.48277,0 -55.18546,71.07594,0 -55.98318,71.67934000000001,0 -56.16726000000001,72.58955,0 -57.85474000000001,74.69123,0 -59.57289,75.70371,0 -62.34444,76.01053,0 -63.58193000000001,76.31222,0 -63.60658000000001,76.32865,0 -67.76724,79.10155,0 -67.31153999999999,79.16665000000002,0 -65.98242999999999,79.14412,0 -64.97996999999999,79.47077,0 -65.14892000000002,79.84247000000001,0 -65.29535,80.06775,0 -65.64452,80.00015999999999,0 -66.0838,80.00015999999999,0 -66.66951,80.05649,0 -67.10879,80.04520000000001,0 -67.52555,80.18038,0 -67.54808,80.29301,0 -67.49175,80.34933,0 -66.92856999999999,80.47324,0 -66.92856999999999,80.65346,0 -66.78216000000001,80.72104,0 -66.44423999999999,80.6084,0 -64.91238,80.92377000000001,0 -64.79975,81.00261999999999,0 -63.96624000000001,81.07021000000002,0 -63.81981,81.14906000000001,0 -62.97503,81.25042999999999,0 -62.23162000000001,81.21664,0 -61.55581000000002,81.11526000000001,0 -61.30801,81.16032,0 -61.35306000000001,81.34054,0 -61.31927,81.39686,0 -61.02642,81.47570000000002,0 -61.49949,81.73477000000001,0 -61.47697000000001,81.79107999999999,0 -60.51955,81.93752000000001,0 -59.49456,82.01636000000002,0 -58.87425,82.10625,0 -56.03332,82.31142000000001,0 -54.21828,82.37454,0 -53.42914,82.29564000000001,0 -52.95565,82.35877000000001,0 -52.52951,82.29564000000001,0 -52.52415,84.90001,0 -52.51387,89.90000000000001,0 -51.51426,89.90000000000001,0 -50.51467,89.90000000000001,0 -49.51508,89.90000000000001,0 -48.51547000000001,89.90000000000001,0 -47.51588000000001,89.90000000000001,0 -46.51628000000002,89.90000000000001,0 -45.51669,89.90000000000001,0 -44.51709,89.90000000000001,0 -43.51749,89.90000000000001,0 -42.5179,89.90000000000001,0 -41.51830000000001,89.90000000000001,0 -40.51871,89.90000000000001,0 -39.51911,89.90000000000001,0 -38.5195,89.90000000000001,0 -37.51992,89.90000000000001,0 -37.51992,84.90001,0 + + + + + +-19.77925,75.15038,0 -19.60578,75.14566000000001,0 -19.46688,75.2666,0 -19.43014,75.36224,0 -19.4368,75.46748000000001,0 -19.48732,75.56003,0 -19.57222,75.62255,0 -19.67559,75.64335,0 -19.77806,75.6185,0 -19.86044,75.55269,0 -19.90594,75.4571,0 -19.90611,75.27975000000001,0 -19.77925,75.15038,0 + + + +-22.03397,75.85133,0 -21.86051,75.84662,0 -21.72161,75.96755,0 -21.68487,76.06319000000001,0 -21.69154,76.16843000000002,0 -21.74206,76.26098,0 -21.82695,76.32351,0 -21.93032,76.3443,0 -22.03279,76.31946000000001,0 -22.11516,76.25364,0 -22.16067,76.15807000000001,0 -22.16084,75.98069,0 -22.03397,75.85133,0 + + + 1 + + + + + GMT -02:00 + + +]]> + #khStylem0200 + + + + + +-25.28129,67.4954,0 -25.28129,62.86423,0 -22.54213,62.86423,0 -22.5419,60.19076,0 -22.54149,55.19075000000002,0 -22.54108,50.19075,0 -22.54066,45.19075,0 -22.54025,40.19075,0 -26.74697,40.19075,0 -31.74697000000001,40.19075,0 -31.74697000000001,36.49937,0 -27.5395,36.49937,0 -22.5395,36.49937,0 -22.53887,33.39533,0 -22.53785,28.39532,0 -22.53685,23.39533000000001,0 -22.53583,18.39532,0 -27.51274,18.39532,0 -27.51274,13.4011,0 -22.53482,13.4011,0 -22.53417,10.20111,0 -22.53316,5.201108,0 -22.53215,0.2011045,0 -22.53113000000001,-4.798891,0 -22.53011,-9.798895,0 -22.52911,-14.79889,0 -22.52809,-19.79889,0 -22.52777,-21.39890000000001,0 -22.52676,-26.39889000000001,0 -22.52574,-31.3989,0 -22.52472,-36.39889,0 -22.52435,-38.2989,0 -22.52333,-43.29889000000001,0 -22.52232,-48.29890000000001,0 -22.5213,-53.2989,0 -22.52029,-58.2989,0 -22.51928,-63.2989,0 -22.51827,-68.2989,0 -22.51725,-73.2989,0 -22.51667,-76.19889000000001,0 -22.51565,-81.19889000000001,0 -22.51464,-86.19888,0 -22.51389,-89.90000000000001,0 -23.45178,-89.90000000000001,0 -24.38965,-89.90000000000001,0 -25.32752,-89.90000000000001,0 -26.2654,-89.90000000000001,0 -27.20327,-89.90000000000001,0 -28.14115,-89.90000000000001,0 -29.07903,-89.90000000000001,0 -30.0169,-89.90000000000001,0 -30.95478,-89.90000000000001,0 -31.89265,-89.90000000000001,0 -32.83052,-89.90000000000001,0 -33.76841,-89.90000000000001,0 -34.70629,-89.90000000000001,0 -35.64416,-89.90000000000001,0 -36.58204,-89.90000000000001,0 -37.51991,-89.90000000000001,0 -37.51989,-84.89999,0 -37.51988,-79.90000000000001,0 -37.51987,-74.90000000000001,0 -37.51987,-69.90000000000001,0 -37.51985000000001,-64.90000000000001,0 -37.51984,-59.90001,0 -37.51983,-54.93388,0 -42.51982,-54.93388,0 -45.01502000000001,-54.93388,0 -45.01502000000001,-52.08813,0 -40.01502,-52.08813,0 -37.51982,-52.08813,0 -37.5198,-47.08813000000001,0 -37.51979,-42.17389,0 -37.51979,-37.17389,0 -37.51978,-32.17389,0 -37.51977,-27.17389,0 -37.51975,-22.17389,0 -37.51974,-17.17389,0 -37.51972,-12.17389,0 -37.51972,-11.77389,0 -37.36223,-11.45472,0 -37.39806,-11.49972,0 -37.48791,-11.52023,0 -37.39305,-11.45,0 -37.46917,-11.36667,0 -37.41223,-11.40278,0 -37.39528,-11.33389,0 -37.33139,-11.28667,0 -37.34861,-11.25028,0 -37.31362,-11.26305,0 -37.34779,-11.18778,0 -37.30555,-11.245,0 -37.29862,-11.20195,0 -37.27584,-11.25973,0 -37.36362,-11.31556,0 -37.39834,-11.40223,0 -37.33000000000001,-11.42723,0 -37.26501,-11.28667,0 -37.15112,-11.19194,0 -37.16446,-11.11389,0 -37.22112,-11.10778,0 -37.20195,-11.0925,0 -37.26028,-11.07222,0 -37.27916,-11.02528,0 -37.20723,-11.03723,0 -37.15667,-11.10444,0 -37.05333,-10.94917,0 -37.04028000000001,-10.8375,0 -37.14168,-10.82528,0 -37.09417000000001,-10.80111,0 -37.15333,-10.74861,0 -37.07779,-10.73389,0 -37.06889000000001,-10.79445,0 -37.00862,-10.81056,0 -37.02166,-10.93584,0 -36.85861,-10.73916,0 -36.56751,-10.54445,0 -36.40483,-10.49879,0 -36.28445,-10.3525,0 -36.28139,-10.28695,0 -36.04444000000001,-10.07583,0 -35.79557,-9.728334,0 -35.86917,-9.764163999999999,0 -35.95196,-9.602784,0 -35.90528,-9.621667,0 -35.86,-9.739160999999999,0 -35.79222,-9.683056000000001,0 -35.79362,-9.589725,0 -35.73695,-9.651394000000002,0 -35.77306,-9.695277000000001,0 -35.69028,-9.668889999999999,0 -35.65751,-9.586387,0 -35.5825,-9.535833,0 -35.45667,-9.346393000000001,0 -35.32751,-9.228889000000001,0 -35.16612,-8.960283,0 -34.97001,-8.430552000000001,0 -34.99195,-8.448895,0 -34.98694,-8.418888000000001,0 -35.02194,-8.423056000000001,0 -34.93584,-8.350552,0 -34.94,-8.270550999999999,0 -34.88001,-8.113049999999999,0 -34.92668,-8.038333,0 -34.85612,-8.073612000000001,0 -34.81528,-7.935283000000001,0 -34.84472,-7.835554000000001,0 -34.89333,-7.804998000000001,0 -34.85834,-7.73028,0 -34.90696,-7.735834,0 -34.85167,-7.695559000000002,0 -34.87555,-7.622227000000001,0 -34.83084,-7.683337,0 -34.80083,-7.63111,0 -34.84056,-7.554448,0 -34.92334,-7.563889000000001,0 -34.8932,-7.543089,0 -34.81779,-7.546942,0 -34.8075,-7.515000000000001,0 -34.7925,-7.178607,0 -34.83084,-7.108605,0 -34.82556,-6.987502,0 -34.85695,-7.075837,0 -34.915,-7.127497,0 -34.85834,-6.919444,0 -34.91195,-6.879997000000001,0 -34.94334,-6.779997000000001,0 -34.98028,-6.40639,0 -35.01501,-6.374998000000001,0 -35.04139,-6.233887000000001,0 -35.08778,-6.199164,0 -35.13584,-6.228612,0 -35.15501,-6.208894,0 -35.11528,-6.165838,0 -35.09278,-6.178887000000001,0 -35.105,-5.981112000000001,0 -35.14557,-5.938893000000001,0 -35.26195,-5.484726,0 -35.4175,-5.214717000000001,0 -35.60445000000001,-5.110839,0 -35.93472,-5.052223,0 -36.12889,-5.097502,0 -36.28751,-5.091660000000001,0 -36.25472,-5.10166,0 -36.28028,-5.11111,0 -36.58167,-5.088051,0 -36.52583,-5.108608,0 -36.54417,-5.134447,0 -36.68722,-5.098339,0 -36.79723,-5.046391,0 -36.88278,-4.949163,0 -37.17445,-4.918609,0 -37.28973,-4.726108,0 -37.51991,-4.633912,0 -37.51991,0.3660925,0 -37.51991,5.366087,0 -37.51991,10.36609,0 -37.51991,15.36609,0 -37.51991,15.36843,0 -37.51991,20.36843,0 -37.51991,25.36843,0 -37.51991,29.96842,0 -37.51991,34.96843,0 -37.51991,39.96843,0 -37.51991,44.96843000000001,0 -37.51991,49.96843,0 -37.51991,54.96843,0 -37.51991,59.96843000000001,0 -37.51991,64.96842,0 -37.51991,65.16843,0 -35.45789,65.8785,0 -33.65758,66.67344,0 -31.90405,67.86584000000001,0 -29.7998,67.98274000000001,0 -27.43837,68.38021000000001,0 -25.89525,68.70753000000001,0 -23.90792,69.38557000000002,0 -22.51389,69.82120999999999,0 -22.51389,67.4954,0 -25.28129,67.4954,0 + + + 1 + + + + + +-22.55908,84.90009000000001,0 -22.56975,83.06453000000002,0 -23.25304,83.14206,0 -28.22116000000001,83.70583000000001,0 -29.51426,83.7223,0 -34.51386,83.78599,0 -37.51992,83.74590000000001,0 -37.51992,84.90001,0 -37.51992,89.90000000000001,0 -36.5206,89.90000000000001,0 -35.52126,89.90000000000001,0 -34.52194,89.90000000000001,0 -33.52261,89.90000000000001,0 -32.52328,89.90000000000001,0 -31.52396,89.90000000000001,0 -30.52463,89.90000000000001,0 -29.5253,89.90000000000001,0 -28.52597,89.90000000000001,0 -27.52664,89.90000000000001,0 -26.52732,89.90000000000001,0 -25.52799,89.90000000000001,0 -24.52866,89.90000000000001,0 -23.52934,89.90000000000001,0 -22.53001,89.90000000000001,0 -22.55908,84.90009000000001,0 + + + 1 + + + + + GMT -01:00 + + +]]> + #khStylem0100 + + + + + +-8.807823000000001,54.70094,0 -9.054081,54.29253,0 -9.834866999999999,54.36460000000001,0 -10.12917,54.26851,0 -10.25529,54.12435000000001,0 -10.29734,53.98021000000001,0 -10.32736,53.58982,0 -10.18322,53.39763,0 -9.8649,53.12735000000001,0 -9.498528000000002,52.94116,0 -9.68472,52.71294,0 -9.948978,52.56879000000001,0 -10.65169,52.04025,0 -10.42346,51.86608,0 -10.24928,51.55978,0 -9.828864000000001,51.43965,0 -9.50454,51.40962,0 -8.525547,51.58981000000001,0 -7.812513,51.89045000000001,0 -7.812513,46.89045,0 -7.812513,43.71458,0 -7.894449000000001,43.66638,0 -7.850556,43.71472,0 -7.856109000000001,43.765,0 -7.898058000000001,43.76416,0 -7.991946000000001,43.70555,0 -8.060841,43.70361,0 -8.049447000000001,43.63666,0 -8.089173000000001,43.66194,0 -8.253333,43.55806,0 -8.319447,43.56221,0 -8.295282,43.52639,0 -8.331660000000001,43.50889,0 -8.339724,43.45693,0 -8.166942000000001,43.50777,0 -8.194445999999999,43.46611,0 -8.317214999999999,43.44305,0 -8.13195,43.42334,0 -8.213058,43.4025,0 -8.215551,43.33055,0 -8.329725,43.40388,0 -8.360001000000001,43.34027,0 -8.38611,43.33944,0 -8.398611000000001,43.38582,0 -8.539443000000002,43.30972,0 -8.701389000000001,43.28722,0 -8.782785000000001,43.30306,0 -8.843994,43.36485,0 -8.848053,43.32222,0 -8.980281,43.28139,0 -8.91639,43.23222,0 -9.010557,43.23195,0 -9.056664,43.18332,0 -9.169731000000001,43.18583,0 -9.209448,43.15277,0 -9.203894999999999,43.12554,0 -9.164448,43.13777,0 -9.165555,43.10722,0 -9.218889000000001,43.10806,0 -9.25389,43.05029,0 -9.2925,43.04804000000001,0 -9.252504000000002,43.0061,0 -9.293336999999999,42.92249,0 -9.273339,42.88694,0 -9.226944,42.93805,0 -9.181107000000001,42.91555,0 -9.185003999999999,42.9525,0 -9.123606000000002,42.90555,0 -9.14139,42.85695,0 -9.101394000000001,42.82332,0 -9.140283,42.795,0 -9.086112,42.73528,0 -9.058887,42.78472,0 -8.960283,42.77333,0 -8.903610000000001,42.82833,0 -8.85834,42.82444,0 -9.020286000000001,42.70472,0 -9.086112,42.58138000000001,0 -9.027782999999999,42.57972,0 -9.041391000000001,42.52888,0 -8.967249000000001,42.46196,0 -8.898606000000001,42.10806,0 -8.882225999999999,41.89004,0 -10.07815,41.89004,0 -15.07814,41.89004,0 -16.53966,38.78279,0 -18.66778,34.25829,0 -20.79591,29.7338,0 -20.79591,25.84186,0 -19.57629,25.84186,0 -14.57629,25.84186,0 -14.82666,25.30916,0 -14.83473,24.91528,0 -14.90111,24.68805,0 -14.98694,24.63639,0 -15.03139,24.54167,0 -15.18028,24.48805000000001,0 -15.29639,24.3336,0 -15.61417,24.02778,0 -15.7625,23.95694,0 -15.91167,23.82195,0 -16.00167,23.64389,0 -15.94334,23.68222,0 -15.86972,23.82861000000001,0 -15.79028,23.85806,0 -15.78167,23.91,0 -15.76278,23.79138,0 -15.92583,23.57722,0 -16.13584,23.17917,0 -16.21612,23.08388,0 -16.15167,23.06888,0 -16.15416,23.01639,0 -16.18973,22.94221,0 -16.30361,22.87555,0 -16.35917,22.56806,0 -16.42889,22.51611000000001,0 -16.50028,22.32221,0 -16.62806,22.27361,0 -16.66889,22.29639,0 -16.71944,22.26082,0 -16.85334,22.07139,0 -16.95945,21.82222,0 -16.94416,21.73972,0 -17.10528,20.84806,0 -17.05233,20.76409,0 -16.53566,19.38283,0 -16.46306,19.2554,0 -16.35111,19.20556,0 -16.28139,19.12777000000001,0 -16.18806,18.93945,0 -16.13805,18.65389,0 -16.05778,18.43472,0 -16.02862,18.08056,0 -16.06945,17.58972,0 -16.17556,17.25416,0 -16.46583,16.61971,0 -16.47278,16.48222,0 -16.53723,16.30166,0 -16.52768,16.06025,0 -16.53723,15.77584,0 -16.87834,15.225,0 -17.16694,14.90305,0 -17.53723,14.75611,0 -17.45626,14.64857,0 -17.2475,14.67323,0 -16.82851,13.87214,0 -16.83957,12.41371,0 -16.36448,11.88337,0 -16.5081,11.28123,0 -16.17665,11.01605,0 -15.12702,10.87243,0 -13.84538,9.425052000000001,0 -13.34819,8.972054,0 -13.27084,8.088164000000001,0 -13.02778,7.524683000000001,0 -12.39801,7.325810000000001,0 -11.38153,6.684983,0 -9.348579000000001,5.116076,0 -8.442594,4.596795,0 -7.506171,4.24899,0 -7.506171,4.17239,0 -7.506171,-0.8276135000000001,0 -7.506171,-5.827609,0 -11.18769,-5.827609,0 -16.18769,-5.827609,0 -16.1435,-9.363187,0 -12.50618,-9.363187,0 -7.506171,-9.363187,0 -7.506612000000001,-10.65897,0 -7.508295000000001,-15.65897,0 -7.509978000000001,-20.65897,0 -7.51167,-25.65897,0 -7.513353,-30.65898,0 -7.515036,-35.65897,0 -9.640872,-35.65897,0 -14.64088,-35.65897,0 -14.64088,-36.71363,0 -14.64088,-41.71362,0 -12.51732,-41.71362,0 -7.517322,-41.71362,0 -7.518411000000001,-44.61363,0 -7.520301000000001,-49.61362,0 -7.522191000000001,-54.61362,0 -7.524081000000001,-59.61362,0 -7.525971,-64.61363,0 -7.527861000000001,-69.61362,0 -7.529751,-74.61362,0 -7.531632,-79.61362,0 -7.531740000000001,-79.90000000000001,0 -7.533630000000001,-84.89999,0 -7.53552,-89.90000000000001,0 -8.53407,-89.90000000000001,0 -9.532638,-89.90000000000001,0 -10.53119,-89.90000000000001,0 -11.52976,-89.90000000000001,0 -12.52831,-89.90000000000001,0 -13.52687,-89.90000000000001,0 -14.52542,-89.90000000000001,0 -15.52398,-89.90000000000001,0 -16.52254,-89.90000000000001,0 -17.5211,-89.90000000000001,0 -18.51966,-89.90000000000001,0 -19.51822,-89.90000000000001,0 -20.51678,-89.90000000000001,0 -21.51534,-89.90000000000001,0 -22.51389,-89.90000000000001,0 -22.51464,-86.19888,0 -22.51565,-81.19889000000001,0 -22.51667,-76.19889000000001,0 -22.51725,-73.2989,0 -22.51827,-68.2989,0 -22.51928,-63.2989,0 -22.52029,-58.2989,0 -22.5213,-53.2989,0 -22.52232,-48.29890000000001,0 -22.52333,-43.29889000000001,0 -22.52435,-38.2989,0 -22.52472,-36.39889,0 -22.52574,-31.3989,0 -22.52676,-26.39889000000001,0 -22.52777,-21.39890000000001,0 -22.52809,-19.79889,0 -22.52911,-14.79889,0 -22.53011,-9.798895,0 -22.53113000000001,-4.798891,0 -22.53215,0.2011045,0 -22.53316,5.201108,0 -22.53417,10.20111,0 -22.53482,13.4011,0 -27.51274,13.4011,0 -27.51274,18.39532,0 -22.53583,18.39532,0 -22.53685,23.39533000000001,0 -22.53785,28.39532,0 -22.53887,33.39533,0 -22.5395,36.49937,0 -27.5395,36.49937,0 -31.74697000000001,36.49937,0 -31.74697000000001,40.19075,0 -26.74697,40.19075,0 -22.54025,40.19075,0 -22.54066,45.19075,0 -22.54108,50.19075,0 -22.54149,55.19075000000002,0 -22.5419,60.19076,0 -22.54213,62.86423,0 -17.54214,62.85332,0 -12.54215,62.84239,0 -7.806969000000001,62.83205,0 -7.806969000000001,57.83205,0 -7.806969000000001,55.35279,0 -8.261279999999999,55.27752,0 -8.567595000000001,55.00724,0 -8.807823000000001,54.70094,0 + + + 1 + + + + + +-19.46688,75.2666,0 -19.60578,75.14566000000001,0 -19.77925,75.15038,0 -19.90611,75.27975000000001,0 -19.90594,75.4571,0 -19.86044,75.55269,0 -19.77806,75.6185,0 -19.67559,75.64335,0 -19.57222,75.62255,0 -19.48732,75.56003,0 -19.4368,75.46748000000001,0 -19.43014,75.36224,0 -19.46688,75.2666,0 + + + 1 + + + + + +-7.511742000000002,84.90001,0 -7.511742000000002,79.90000000000001,0 -7.511742000000002,74.89999,0 -7.511742000000002,69.90000000000001,0 -7.511742000000002,67.45737,0 -12.51173,67.47004,0 -17.51171,67.48272,0 -22.5117,67.49539,0 -22.51389,67.4954,0 -22.51389,69.82120999999999,0 -22.03747,69.97009,0 -21.35944,70.48445,0 -21.17239,70.78841,0 -21.78029,72.14449000000001,0 -21.42958000000001,72.84589,0 -20.28394,73.40702,0 -19.34872,74.17858,0 -18.13293,74.58775,0 -17.26786,74.98521,0 -17.24447,75.26577,0 -18.50702,75.85029,0 -18.06279,76.85564000000001,0 -17.52503,77.76749,0 -17.47827,79.26384,0 -17.31461,79.94186999999999,0 -15.51431,80.61991,0 -14.53233,80.80695,0 -12.03061,81.55513000000001,0 -12.03061,81.69541,0 -13.71401,81.90584,0 -16.16897,82.02274,0 -17.59517,81.92921,0 -18.10955,81.78892999999999,0 -19.25519,82.23316,0 -21.33607,82.72414000000001,0 -22.56975,83.06453000000002,0 -22.55908,84.90009000000001,0 -22.53001,89.90000000000001,0 -21.59137,89.90000000000001,0 -20.65272,89.90000000000001,0 -19.71409,89.90000000000001,0 -18.77545,89.90000000000001,0 -17.8368,89.90000000000001,0 -16.89817,89.90000000000001,0 -15.95952,89.90000000000001,0 -15.02087,89.90000000000001,0 -14.08224,89.90000000000001,0 -13.14359,89.90000000000001,0 -12.20495,89.90000000000001,0 -11.26631,89.90000000000001,0 -10.32766,89.90000000000001,0 -9.389025000000002,89.90000000000001,0 -8.450379,89.90000000000001,0 -7.511742000000002,89.90000000000001,0 -7.511742000000002,84.90001,0 + + + 1 + + + + + GMT +00:00 + + +]]> + #khStyle0000 + + + + + +-8.201223000000002,42.15273,0 -8.185554,42.06471,0 -8.121942000000001,42.07944,0 -8.079723,42.05416,0 -8.084997000000001,42.02027,0 -8.218610999999999,41.91361000000001,0 -8.140554,41.80917000000001,0 -8.014725,41.83388,0 -7.892217,41.92666,0 -7.880004,41.85277,0 -7.692498,41.905,0 -7.591662,41.87972,0 -7.607781,41.83111000000001,0 -7.493058,41.87306000000001,0 -7.420284,41.81332,0 -7.37028,41.85139,0 -7.200558,41.88361,0 -7.182783,41.97944,0 -7.133607,41.99499,0 -7.056108,41.95111,0 -6.982848,41.97386,0 -6.837498,41.94722,0 -6.788052000000001,41.99167,0 -6.716943,41.93666,0 -6.581664,41.96749,0 -6.544719,41.93722,0 -6.568335,41.88721,0 -6.508341,41.87389,0 -6.562503,41.74529,0 -6.551388,41.6911,0 -6.497496000000001,41.65749,0 -6.442218000000002,41.68582,0 -6.303609,41.66333,0 -6.187221,41.57972,0 -6.32916,41.41527,0 -6.318333000000001,41.38722,0 -6.388056,41.38167,0 -6.381945,41.355,0 -6.496947,41.26445,0 -6.64389,41.24471000000001,0 -6.764445,41.13083,0 -6.754446000000002,41.10249,0 -6.808338,41.04056000000001,0 -6.931665000000001,41.01806,0 -6.803892,40.87416000000001,0 -6.829164,40.75528,0 -6.797781,40.65777,0 -6.838893000000001,40.575,0 -6.790833,40.51805,0 -6.848334000000001,40.44333,0 -6.778611,40.36279,0 -6.873894,40.26332,0 -7.005834,40.23083,0 -7.027218,40.18777,0 -7.004718,40.12611,0 -6.934725000000001,40.1075,0 -6.863895,40.01555,0 -6.913611,39.86472,0 -6.98319,39.81694,0 -7.017219,39.675,0 -7.266942,39.67194,0 -7.337502,39.64388000000001,0 -7.515000000000001,39.66611,0 -7.532505000000001,39.66942000000001,0 -7.505838000000001,39.60583,0 -7.390836000000001,39.53277,0 -7.38,39.49611,0 -7.293609,39.46777,0 -7.322778,39.38833,0 -7.235037000000001,39.27697,0 -7.242786000000002,39.21305,0 -7.139997000000001,39.17334,0 -7.142499,39.11111,0 -7.004997,39.10722,0 -6.954795,39.02639,0 -7.050285000000001,38.91082,0 -7.041663,38.86861,0 -7.257231,38.72834,0 -7.248051,38.6236,0 -7.329717,38.44722,0 -7.143894,38.27027,0 -7.087779,38.17443,0 -6.947784,38.21833000000001,0 -6.939162,38.17805,0 -7.006662000000001,38.02805,0 -7.103889000000001,38.04694,0 -7.126947,38.00333,0 -7.254450000000001,37.98749000000001,0 -7.284996,37.86027,0 -7.422498000000001,37.75472000000001,0 -7.447779,37.65777,0 -7.524441000000002,37.55250000000001,0 -7.467498,37.49082,0 -7.431858,37.25319,0 -7.384167000000002,37.16972,0 -7.333605,37.21222000000001,0 -7.080282000000001,37.2175,0 -6.725835000000001,37.09194,0 -6.515838,36.97194,0 -6.364449000000001,36.79528,0 -6.347214000000002,36.89638,0 -6.246387,36.89581,0 -6.339717000000001,36.88944,0 -6.337224000000001,36.79610000000001,0 -6.443613,36.71889,0 -6.392502,36.62639,0 -6.230835,36.575,0 -6.240834,36.50111,0 -6.172785000000001,36.51221,0 -6.239718,36.46193,0 -6.291666000000001,36.5375,0 -6.318891000000001,36.53249,0 -6.037497,36.18027,0 -5.911389,36.17916,0 -5.797224,36.07388,0 -5.693895,36.06167,0 -5.611662,36.00027,0 -5.425281000000001,36.07083,0 -5.432778,36.17417,0 -5.350833,36.16,0 -5.34528,36.11278,0 -5.395554,35.91634,0 -5.345838,35.84166,0 -5.318892,35.695,0 -5.274999,35.68111,0 -5.253057,35.57695,0 -5.171391,35.5375,0 -5.063337,35.40972,0 -4.695840000000001,35.20888,0 -4.353894,35.14611,0 -3.925278,35.25999,0 -3.892779,35.21583,0 -3.813894,35.20027,0 -3.682503,35.28778,0 -3.577221,35.22667,0 -3.332502,35.19139,0 -3.06639,35.28944,0 -2.973888,35.44027,0 -2.946942,35.32917,0 -2.962782,35.27499,0 -2.914722,35.27361,0 -2.909448,35.17638,0 -2.841660000000001,35.12694,0 -2.747214,35.11555,0 -2.885553,35.24277,0 -2.754999,35.13499,0 -2.635002,35.09972,0 -2.516949,35.09832,0 -2.419164,35.15332,0 -2.209446,35.08582,0 -2.180286,35.01222,0 -2.065833,34.93695,0 -1.99305,34.92945,0 -1.961388,34.87029,0 -1.747215,34.74722,0 -1.857501,34.61028,0 -1.686708,34.48551,0 -1.79334,34.37833,0 -1.750554,34.34945,0 -1.653336,34.085,0 -1.710279,33.8825,0 -1.680552,33.76972,0 -1.730556,33.70499,0 -1.65222,33.66277,0 -1.606662,33.59527,0 -1.600551,33.50972,0 -1.666665,33.38333,0 -1.668051,33.26111,0 -1.480284,33.06305,0 -1.487214,32.97917000000001,0 -1.542501,32.93944,0 -1.382778,32.72445,0 -1.300284,32.70055,0 -1.010286,32.50832,0 -1.119996,32.41555,0 -1.196109,32.40472,0 -1.249722,32.32695,0 -1.25361,32.21472,0 -1.295838,32.16306,0 -1.200834,32.17027,0 -1.175553,32.12083,0 -1.213056,32.08971,0 -2.331108,32.15749,0 -2.853891,32.08834,0 -2.938059,32.02888000000001,0 -2.980557,31.84416,0 -3.386115,31.72611,0 -3.511665,31.67334,0 -3.714714,31.71639,0 -3.830832,31.6775,0 -3.84084,31.47583,0 -3.724722,31.39472,0 -3.803895,31.33916,0 -3.79611,31.22167,0 -3.826107,31.16389,0 -3.788892000000001,31.14861,0 -3.724164,31.18861,0 -3.602214,31.09556,0 -3.617784,30.97667,0 -3.718890000000001,30.93806,0 -4.016943,30.91111,0 -4.16916,30.76916,0 -4.396941,30.64833,0 -4.591944,30.62639,0 -4.920552,30.50805,0 -5.133609,30.19806000000001,0 -5.351949,29.99722,0 -5.560002,29.895,0 -5.89833,29.85667000000001,0 -6.002784000000001,29.82945,0 -6.145839000000001,29.8475,0 -6.217227000000001,29.79888,0 -6.474168000000001,29.83306,0 -6.508611,29.63888,0 -6.58584,29.56722,0 -7.123887,29.63695,0 -7.298334,29.53833,0 -7.433892,29.39722,0 -7.644726000000001,29.385,0 -7.995555,29.11639,0 -8.17695,29.04084,0 -8.495559,28.79056,0 -8.667225,28.70944,0 -8.666667,27.66667,0 -8.666793,27.29046,0 -6.662781,26.12916,0 -4.806108,25.00027,0 -2.448333,23.48722,0 -0.008055,21.83055,0 1.169667,21.10254,0 1.197144,21.00248,0 1.167498,20.74111,0 1.317222,20.73833,0 1.375002,20.6575,0 1.627497,20.57111,0 1.663056,20.53611,0 1.668051,20.40861,0 1.795833,20.30833,0 1.881108,20.30139,0 1.908891,20.23139000000001,0 1.983339,20.26027,0 2.097504,20.21889,0 2.213055,20.28139,0 2.344167,20.17777,0 2.411667,20.0575,0 2.587779,20.00166,0 2.967219,19.95,0 3.233052,19.82028,0 3.210003,19.56527,0 3.277215,19.38972,0 3.206664,19.32611,0 3.196107000000001,19.25861,0 3.114162,19.15639,0 3.331944,18.97639,0 4.245282,19.14666,0 4.2525,16.99445,0 4.21416,16.99361,0 4.198887,16.82083,0 4.200840000000001,16.39389,0 4.069719,16.29389,0 3.981942,16.07638,0 4.000833,15.98971,0 3.924440999999999,15.90416,0 3.885003,15.70917,0 3.823893,15.66527,0 3.726666,15.65277,0 3.539997,15.49722,0 3.523986,15.35816,0 3.032496,15.43306,0 3.020832,15.34195,0 2.628054,15.35055,0 1.312497,15.28666,0 0.974718,14.97861,0 0.694998,14.94221,0 0.512217,15.00083,0 0.3966660000000001,14.96056,0 0.229995,15.00251,0 0.235044,14.91506,0 0.193338,14.83583,0 0.241389,14.75221,0 0.166662,14.52306,0 0.18945,14.46472,0 0.321111,14.36278,0 0.410832,14.24584,0 0.352503,14.1214,0 0.424161,13.98361,0 0.4711050000000001,13.95555,0 0.465003,13.91361,0 0.616662,13.77805,0 0.602217,13.70389,0 0.7727850000000001,13.68832,0 0.77445,13.64416,0 0.902214,13.62278,0 0.9952830000000001,13.56806,0 1.031661,13.4625,0 1.244448,13.39305,0 1.285308,13.34995,0 1.204164,13.36805,0 1.182222,13.31277,0 0.991665,13.37167,0 0.9891630000000002,13.04722,0 1.117215,13.01111,0 1.578339,12.63,0 1.871667,12.60889,0 1.928052,12.70056,0 1.988892,12.73111,0 2.142504,12.69445,0 2.22084,12.59361,0 2.264166,12.4186,0 2.161665,12.41555,0 2.058336,12.35722,0 2.397924,11.89615,0 2.366946,11.79,0 2.308608,11.72555,0 2.310552,11.67055,0 2.193894,11.60361,0 2.014722,11.4225,0 1.868607,11.44584,0 1.609164,11.38834,0 1.56861,11.4525,0 1.439721,11.46834,0 1.328337,11.35139,0 1.351107,11.3025,0 1.303605,11.28945,0 1.274715,11.315,0 1.264716,11.24611,0 1.138059,11.26527,0 1.156392,11.16277,0 1.125279,11.17528,0 1.058058,11.13139,0 1.117782,11.0275,0 0.978894,11.08027,0 0.948609,11.02389,0 0.9677789999999999,10.99584,0 0.917973,10.9964,0 0.879444,10.79972,0 0.8021880000000001,10.71245,0 0.7766640000000001,10.37667,0 1.355004,9.995282,0 1.373895,9.646667000000003,0 1.337499,9.542501,0 1.364256,9.481346,0 1.38861,9.492217999999999,0 1.416663,9.321111,0 1.567215,9.17,0 1.617786,9.049715000000001,0 1.624716,8.548056000000003,0 1.660833,8.496943999999999,0 1.613052,8.374715999999999,0 1.634715,8.357768,0 1.655838,7.532495,0 1.6425,6.995555000000001,0 1.548531,6.995177,0 1.606113,6.895268,0 1.594719,6.80445,0 1.623051,6.757775,0 1.575279,6.679718,0 1.749168,6.456663000000001,0 1.799325,6.281054,0 1.652499,6.250283,0 1.635399,6.21872,0 1.868607,6.273612,0 2.719611,6.36551,0 3.370833000000001,6.385832000000001,0 3.795282,6.432786000000001,0 4.379445,6.368057,0 4.525839,6.305004000000001,0 4.713606,6.164721,0 5.000004,5.857496,0 5.194161,5.502222,0 5.345271,5.329998,0 5.383890000000001,5.111946,0 5.497497,4.805838,0 5.578056,4.718609,0 5.554719,4.71528,0 5.579442,4.659722,0 5.777784,4.454999,0 5.843340000000001,4.410557000000001,0 5.862780000000001,4.434722,0 5.862222000000001,4.388607,0 5.931108000000001,4.340556,0 6.111108,4.272498,0 6.410556,4.313339,0 6.431112,4.345002,0 6.460839000000001,4.322502,0 6.794163000000001,4.336668,0 6.962769000000001,4.389164,0 7.018200000000002,4.374809,0 7.195104000000001,4.365161,0 7.538670000000001,4.437656,0 7.538670000000001,-0.5623475,0 7.538670000000001,-0.6855035,0 2.656305,-0.6707075,0 2.656305,-3.94561,0 7.538670000000001,-3.94561,0 7.538670000000001,-8.945614000000001,0 7.538679000000002,-13.94561,0 7.538679000000002,-18.94561,0 7.538679000000002,-23.94561,0 7.538679000000002,-28.94561,0 7.538679000000002,-33.94561,0 7.538679000000002,-34.50439,0 7.538679000000002,-39.50439,0 7.538679000000002,-44.50439,0 7.538679000000002,-49.50439000000002,0 7.538679000000002,-53.7044,0 7.538679000000002,-58.70439,0 7.538679000000002,-63.70440000000001,0 7.538679000000002,-68.70439,0 7.538679000000002,-73.70439000000002,0 7.538679000000002,-78.70439,0 7.538679000000002,-83.70439,0 7.538679000000002,-88.70438,0 7.538679000000002,-89.90000000000001,0 6.59655,-89.90000000000001,0 5.654412,-89.90000000000001,0 4.712274,-89.90000000000001,0 3.770127,-89.90000000000001,0 2.827989,-89.90000000000001,0 1.885851,-89.90000000000001,0 0.943722,-89.90000000000001,0 0.001584,-89.90000000000001,0 -0.9405540000000001,-89.90000000000001,0 -1.882692,-89.90000000000001,0 -2.82483,-89.90000000000001,0 -3.766967999999999,-89.90000000000001,0 -4.709106,-89.90000000000001,0 -5.651244,-89.90000000000001,0 -6.593382,-89.90000000000001,0 -7.53552,-89.90000000000001,0 -7.533630000000001,-84.89999,0 -7.531740000000001,-79.90000000000001,0 -7.531632,-79.61362,0 -7.529751,-74.61362,0 -7.527861000000001,-69.61362,0 -7.525971,-64.61363,0 -7.524081000000001,-59.61362,0 -7.522191000000001,-54.61362,0 -7.520301000000001,-49.61362,0 -7.518411000000001,-44.61363,0 -7.517322,-41.71362,0 -12.51732,-41.71362,0 -14.64088,-41.71362,0 -14.64088,-36.71363,0 -14.64088,-35.65897,0 -9.640872,-35.65897,0 -7.515036,-35.65897,0 -7.513353,-30.65898,0 -7.51167,-25.65897,0 -7.509978000000001,-20.65897,0 -7.508295000000001,-15.65897,0 -7.506612000000001,-10.65897,0 -7.506171,-9.363187,0 -12.50618,-9.363187,0 -16.1435,-9.363187,0 -16.18769,-5.827609,0 -11.18769,-5.827609,0 -7.506171,-5.827609,0 -7.506171,-0.8276135000000001,0 -7.506171,4.17239,0 -7.506171,4.24899,0 -8.442594,4.596795,0 -9.348579000000001,5.116076,0 -11.38153,6.684983,0 -12.39801,7.325810000000001,0 -13.02778,7.524683000000001,0 -13.27084,8.088164000000001,0 -13.34819,8.972054,0 -13.84538,9.425052000000001,0 -15.12702,10.87243,0 -16.17665,11.01605,0 -16.5081,11.28123,0 -16.36448,11.88337,0 -16.83957,12.41371,0 -16.82851,13.87214,0 -17.2475,14.67323,0 -17.45626,14.64857,0 -17.53723,14.75611,0 -17.16694,14.90305,0 -16.87834,15.225,0 -16.53723,15.77584,0 -16.52768,16.06025,0 -16.53723,16.30166,0 -16.47278,16.48222,0 -16.46583,16.61971,0 -16.17556,17.25416,0 -16.06945,17.58972,0 -16.02862,18.08056,0 -16.05778,18.43472,0 -16.13805,18.65389,0 -16.18806,18.93945,0 -16.28139,19.12777000000001,0 -16.35111,19.20556,0 -16.46306,19.2554,0 -16.53566,19.38283,0 -17.05233,20.76409,0 -17.10528,20.84806,0 -16.94416,21.73972,0 -16.95945,21.82222,0 -16.85334,22.07139,0 -16.71944,22.26082,0 -16.66889,22.29639,0 -16.62806,22.27361,0 -16.50028,22.32221,0 -16.42889,22.51611000000001,0 -16.35917,22.56806,0 -16.30361,22.87555,0 -16.18973,22.94221,0 -16.15416,23.01639,0 -16.15167,23.06888,0 -16.21612,23.08388,0 -16.13584,23.17917,0 -15.92583,23.57722,0 -15.76278,23.79138,0 -15.78167,23.91,0 -15.79028,23.85806,0 -15.86972,23.82861000000001,0 -15.94334,23.68222,0 -16.00167,23.64389,0 -15.91167,23.82195,0 -15.7625,23.95694,0 -15.61417,24.02778,0 -15.29639,24.3336,0 -15.18028,24.48805000000001,0 -15.03139,24.54167,0 -14.98694,24.63639,0 -14.90111,24.68805,0 -14.83473,24.91528,0 -14.82666,25.30916,0 -14.57629,25.84186,0 -19.57629,25.84186,0 -20.79591,25.84186,0 -20.79591,29.7338,0 -18.66778,34.25829,0 -16.53966,38.78279,0 -15.07814,41.89004,0 -10.07815,41.89004,0 -8.882225999999999,41.89004,0 -8.865278999999999,41.87554,0 -8.745011999999999,41.95250000000001,0 -8.606942999999999,42.05916,0 -8.327232,42.08528,0 -8.201223000000002,42.15273,0 + + + 1 + + + + + +-21.72161,75.96755,0 -21.86051,75.84662,0 -22.03397,75.85133,0 -22.16084,75.98069,0 -22.16067,76.15807000000001,0 -22.11516,76.25364,0 -22.03279,76.31946000000001,0 -21.93032,76.3443,0 -21.82695,76.32351,0 -21.74206,76.26098,0 -21.69154,76.16843000000002,0 -21.68487,76.06319000000001,0 -21.72161,75.96755,0 + + + 1 + + + + + +7.516629,69.90000000000001,0 7.516629,64.90000000000001,0 7.516629,63.25726,0 5.039118,62.19351,0 4.799088000000001,61.86831,0 4.590036,61.01659999999999,0 4.651983,60.7456,0 4.930722,60.25007,0 5.108805,59.16606000000001,0 5.45724,58.68601000000001,0 5.681772000000001,58.48469,0 6.595425,58.0511,0 7.013538000000001,57.97367,0 7.499043000000001,57.95962999999999,0 7.499043000000001,53.79065000000001,0 6.866424,53.69189,0 6.262488000000001,53.52154,0 5.495949,53.46734,0 5.023638,53.33572000000001,0 4.698432000000001,53.07247,0 4.551318,52.49174,0 4.319037,52.18204,0 3.978351,51.97298,0 3.428613,51.53938,0 3.072447,51.32258000000001,0 2.437524,51.08255,0 1.77939,50.97416,0 1.547109,50.88124000000001,0 1.52001,50.25794,0 1.396116,50.10309,0 1.016721,49.94823000000001,0 0.575379,49.8708,0 0.149526,49.71595,0 0.017901,49.46043000000001,0 -0.013077,49.33654000000001,0 -0.1989,49.29783000000001,0 -0.44667,49.35977,0 -1.18224,49.43721,0 -1.251927,49.72369000000001,0 -1.975878,49.74305,0 -1.882962,49.44108,0 -1.720368,49.23201,0 -1.604223,48.66679000000001,0 -1.828764,48.71325,0 -2.308815,48.71325,0 -2.479167,48.67454000000002,0 -2.66499,48.58163,0 -2.804364,48.67454000000002,0 -2.966967,48.88359000000001,0 -3.137301,48.91456,0 -4.058703,48.77519,0 -5.173668000000001,48.4887,0 -5.142699,48.41902,0 -4.732326000000001,48.0164,0 -4.337442,47.77636,0 -3.865130999999999,47.76862,0 -3.493476,47.61377,0 -3.253446,47.27309,0 -2.529495,47.25373,0 -2.297205,46.97499,0 -2.428839,46.72721,0 -1.778436,46.44073,0 -1.522926,46.18522000000001,0 -1.267407,45.71291,0 -1.204236,45.52971,0 -1.234737,45.14534,0 -1.338453,44.26832,0 -1.480338,43.68816000000001,0 -1.530639,43.54382,0 -1.619874,43.43629,0 -1.780839,43.38888,0 -2.130552,43.28916,0 -2.19834,43.31305,0 -2.295558,43.2961,0 -2.638053,43.4125,0 -2.687778,43.38139,0 -2.752497,43.45499,0 -2.941389,43.43556,0 -3.034998,43.37472,0 -3.020832,43.32861,0 -3.325284,43.41833,0 -3.422502,43.40972,0 -3.450834,43.43527,0 -3.462498000000001,43.39389,0 -3.482784000000001,43.42999,0 -3.430557,43.46444,0 -3.585555,43.51027,0 -3.719718,43.47166,0 -3.813057,43.40361,0 -3.83166,43.43943,0 -3.766392000000001,43.46999,0 -3.810285,43.49249,0 -3.944718,43.46778,0 -3.989448,43.43027000000001,0 -4.016943,43.44777,0 -4.025286,43.40554,0 -4.051395,43.4425,0 -4.21695,43.39389,0 -4.351941,43.40388,0 -4.383891000000001,43.39083,0 -4.371111,43.37028,0 -4.410279,43.40193,0 -4.514553,43.39634,0 -5.121108,43.48916000000001,0 -5.207499,43.47778,0 -5.288607000000001,43.53388,0 -5.365278,43.53917,0 -5.372667,43.51369,0 -5.418612,43.49694,0 -5.381109,43.5261,0 -5.398056,43.5525,0 -5.677785,43.54388,0 -5.844717000000001,43.65527,0 -5.954715,43.58055,0 -6.094998000000001,43.56194000000001,0 -6.235839,43.59499,0 -6.476949,43.55111,0 -6.943338,43.57777,0 -7.019442,43.56417,0 -7.002225000000001,43.53027,0 -7.044822000000001,43.4904,0 -7.045281,43.55943,0 -7.231113000000001,43.57028,0 -7.264998,43.54222,0 -7.248888000000001,43.57916,0 -7.365834,43.67611,0 -7.473609000000001,43.70555,0 -7.46361,43.72639,0 -7.551945,43.72861000000001,0 -7.595838,43.66611000000001,0 -7.629714000000001,43.74778,0 -7.693767,43.73127,0 -7.658892,43.76972,0 -7.683606,43.79277,0 -7.812513,43.71458,0 -7.812513,46.89045,0 -7.812513,51.89045000000001,0 -8.525547,51.58981000000001,0 -9.50454,51.40962,0 -9.828864000000001,51.43965,0 -10.24928,51.55978,0 -10.42346,51.86608,0 -10.65169,52.04025,0 -9.948978,52.56879000000001,0 -9.68472,52.71294,0 -9.498528000000002,52.94116,0 -9.8649,53.12735000000001,0 -10.18322,53.39763,0 -10.32736,53.58982,0 -10.29734,53.98021000000001,0 -10.25529,54.12435000000001,0 -10.12917,54.26851,0 -9.834866999999999,54.36460000000001,0 -9.054081,54.29253,0 -8.807823000000001,54.70094,0 -8.567595000000001,55.00724,0 -8.261279999999999,55.27752,0 -7.806969000000001,55.35279,0 -7.806969000000001,57.83205,0 -7.806969000000001,62.83205,0 -12.54215,62.84239,0 -17.54214,62.85332,0 -22.54213,62.86423,0 -25.28129,62.86423,0 -25.28129,67.4954,0 -22.51389,67.4954,0 -22.5117,67.49539,0 -17.51171,67.48272,0 -12.51173,67.47004,0 -7.511742000000002,67.45737,0 -7.511742000000002,69.90000000000001,0 -7.511742000000002,74.89999,0 -7.511742000000002,79.90000000000001,0 -7.511742000000002,84.90001,0 -7.511742000000002,89.90000000000001,0 -6.572475,89.90000000000001,0 -5.633190000000001,89.90000000000001,0 -4.693914000000001,89.90000000000001,0 -3.754647,89.90000000000001,0 -2.815371,89.90000000000001,0 -1.876104,89.90000000000001,0 -0.936828,89.90000000000001,0 0.002448,89.90000000000001,0 0.9417150000000001,89.90000000000001,0 1.880991,89.90000000000001,0 2.820267,89.90000000000001,0 3.759534,89.90000000000001,0 4.69881,89.90000000000001,0 5.638086,89.90000000000001,0 6.577353,89.90000000000001,0 7.516629,89.90000000000001,0 7.516629,84.90001,0 7.516629,79.90000000000001,0 7.516629,74.89999,0 7.516629,69.90000000000001,0 + + + 1 + + + + + GMT +01:00 + + +]]> + #khStyle0100 + + + + +22.54661000000001,89.90000000000001,0 22.54661000000001,84.90001,0 22.54661000000001,81.51716999999999,0 27.54661,81.51716999999999,0 32.54661,81.51716999999999,0 33.89268,81.51716999999999,0 33.89268,76.51716999999999,0 33.89268,75.84414,0 28.89267,75.84414,0 23.89267,75.84414,0 22.54661000000001,75.84414,0 22.54661000000001,70.84514,0 23.95011,71.17124,0 24.72286,71.15327000000001,0 25.9988,71.18922000000001,0 28.20923,71.09936999999999,0 28.92806,70.93761000000001,0 30.18603,70.73994,0 31.17443,70.36256,0 30.85484,69.7923,0 30.89805,69.70555,0 30.95472,69.68138,0 30.94583,69.58222000000001,0 30.91,69.54886999999999,0 30.52916,69.5461,0 30.20361,69.66388000000001,0 30.10333,69.66306,0 30.07277,69.6311,0 30.14277,69.62833000000001,0 30.185,69.58275999999999,0 30.09777,69.50333000000001,0 29.945,69.43053999999999,0 29.31,69.31527,0 29.32167,69.24554000000001,0 29.23916,69.1075,0 29.06333,69.02916999999999,0 28.95734,69.05162,0 28.78694,69.11915999999999,0 28.81916,69.23193000000001,0 29.29972,69.48027,0 29.1275,69.68582000000001,0 28.37972,69.8275,0 28.32332,69.88749,0 28.09417,69.93859000000001,0 27.97916,70.00664999999999,0 27.94416,70.08027,0 27.87305,70.08804000000001,0 27.57333,70.06887999999999,0 27.53833,70.03525999999999,0 27.3,69.99055,0 27.29194,69.95,0 27.06889,69.90860000000001,0 26.80658,69.95206,0 26.47056,69.93527,0 26.37806000000001,69.85444,0 26.15583,69.74249,0 25.97834,69.70193,0 25.94194,69.66722,0 25.97416,69.63527000000001,0 25.9575,69.59027,0 25.85277,69.54666,0 25.87416,69.48636999999999,0 25.82666,69.43638,0 25.83361,69.38416000000001,0 25.755,69.34220999999999,0 25.71333,69.25526000000001,0 25.73222,69.10916,0 25.81277,69.0175,0 25.65277,68.90639,0 25.58555,68.87887000000001,0 25.40695,68.88638,0 25.21445,68.81749000000001,0 25.15472,68.76778,0 25.10334,68.63472,0 24.95523,68.60391,0 24.89566,68.5582,0 24.75445,68.66025999999999,0 24.35139,68.71053000000001,0 23.97639,68.83249000000001,0 23.83,68.82999,0 23.69277,68.71222,0 23.22500000000001,68.62971,0 23.06389,68.69555,0 22.80277,68.69138,0 22.55,68.73779,0 22.39833,68.71111000000001,0 22.34667,68.8447,0 21.68195,69.28471,0 21.32083,69.32611,0 21.055,69.22861,0 21.02806,69.20805,0 21.04222,69.16082,0 21.11305,69.10805000000002,0 21.05944,69.03444,0 20.73833,69.09636999999999,0 20.58093,69.0603,0 20.60417,69.05305,0 20.86666,69.00499000000001,0 20.93889,68.95834000000001,0 20.88888,68.92583000000002,0 20.89527,68.89361,0 21.08139,68.86665000000001,0 21.30195,68.75555,0 21.40666,68.74361,0 21.46556,68.67805,0 21.62306,68.64942000000001,0 21.7575,68.57693,0 21.89722,68.56999,0 22.05056,68.47915999999999,0 22.33471,68.47275999999999,0 22.8236,68.38805000000001,0 23.14222,68.23000999999999,0 23.15138,68.12277,0 23.30722,68.13916,0 23.39445,68.0425,0 23.65695,67.95081999999999,0 23.64472,67.91306,0 23.48333,67.86305,0 23.48083,67.72665000000001,0 23.55361,67.58749,0 23.47195,67.55638,0 23.42889,67.47584000000001,0 23.48695,67.43804,0 23.54917,67.45332999999999,0 23.76778,67.41611,0 23.74472,67.36834,0 23.77333,67.31444000000001,0 23.60555,67.25943,0 23.58445,67.22387000000001,0 23.61028,67.20166,0 23.57167,67.15666,0 24.00777,66.80055,0 23.89,66.74303999999999,0 23.87861,66.55722,0 23.72527,66.50082999999999,0 23.63917,66.43053999999999,0 23.72222,66.20027,0 23.9125,66.14833,0 23.9486,66.10138000000001,0 24.16601,65.8115,0 20.69736,63.31795000000001,0 19.33158,60.19100000000001,0 19.36751,59.65187,0 21.30838,59.61593000000001,0 20.94284,55.2872,0 20.98481,55.27655,0 21.26394,55.24899,0 21.38128,55.28709,0 21.50389,55.19332,0 21.64027,55.18472,0 21.86305,55.09194,0 22.00972,55.08778,0 22.06194,55.02749000000001,0 22.19722000000001,55.06166,0 22.5992,55.07113,0 22.64082000000001,54.96638,0 22.73222000000001,54.96249,0 22.77056,54.93888,0 22.75555,54.92055000000001,0 22.83499000000001,54.90166,0 22.86916,54.82333,0 22.84249,54.77749,0 22.74055,54.72777000000001,0 22.69832,54.58943000000001,0 22.69444,54.47332000000001,0 22.78588,54.36384,0 22.85611,54.4086,0 22.98749000000001,54.38917000000001,0 23.06166,54.35167,0 23.06611,54.30804,0 23.14249,54.31054,0 23.35028000000001,54.23888000000001,0 23.48444,54.13833000000001,0 23.51777,54.03028,0 23.47528000000001,53.99110000000001,0 23.50404,53.94704,0 23.67472,53.4911,0 23.81472,53.25444,0 23.91055,53.16721,0 23.87805000000001,53.07555,0 23.93305,53.01417,0 23.91527,52.91888,0 23.94083,52.73220000000001,0 23.75389,52.61583000000001,0 23.59722,52.59639,0 23.39722,52.51445,0 23.1654,52.28227,0 23.20638,52.22526,0 23.49304,52.17416000000001,0 23.51472,52.1236,0 23.63861,52.07944,0 23.67277,51.99138,0 23.61173,51.91397,0 23.59472,51.8336,0 23.62944,51.80471,0 23.55556,51.74943,0 23.53499,51.65359000000001,0 23.56138,51.5425,0 23.60463,51.52769,0 23.69306,51.40471,0 23.63611,51.30110000000001,0 23.86694,51.14861,0 23.86277,51.09833,0 23.96638,50.94887,0 24.14471,50.85804,0 24.11472,50.83138000000001,0 23.97277,50.82805000000001,0 23.9525,50.79472,0 24.07972,50.70499000000001,0 24.13277,50.54445000000001,0 24.02611,50.49388,0 23.99166,50.40721,0 23.70388,50.37833,0 23.67694,50.32444,0 23.14611,49.98305,0 22.68607,49.5771,0 22.65611,49.51972,0 22.69222,49.42333000000001,0 22.73833,49.39027,0 22.76027,49.29528,0 22.70028,49.16555,0 22.73472,49.17722000000001,0 22.87611,49.09,0 22.88607,49.00292,0 22.76916,49.05332,0 22.67417,49.04416000000001,0 22.59805,49.09109999999999,0 22.55805,49.07944,0 22.53721,48.99554,0 22.46749,48.97860000000001,0 22.37694,48.85194,0 22.38917,48.79722,0 22.34805,48.76417000000001,0 22.32888,48.68694000000001,0 22.15888,48.58027,0 22.15145,48.41192000000001,0 22.26889,48.40721,0 22.26028,48.36082,0 22.31944,48.36166,0 22.31888,48.31416000000001,0 22.37861,48.24554,0 22.50445,48.24749000000001,0 22.57528,48.19443,0 22.62116,48.10163,0 22.7975,48.11472,0 22.8825,48.04694,0 22.85056,47.98083,0 22.8948,47.95454,0 22.77084,47.87943,0 22.77444,47.8364,0 22.65361,47.77638000000001,0 22.45444,47.79639000000001,0 22.42139,47.74389,0 22.27694,47.72861000000001,0 22.18639,47.59861000000001,0 22.01527000000001,47.51445,0 22.00972,47.38083,0 21.9225,47.35443,0 21.79084,47.12028000000001,0 21.65111,47.02972000000001,0 21.69582,47.00082,0 21.67167,46.95138,0 21.59972000000001,46.91805000000001,0 21.60527,46.85722000000001,0 21.51972,46.81527,0 21.48806,46.75278000000001,0 21.52194,46.71277000000001,0 21.44194,46.68194,0 21.40500000000001,46.62111000000001,0 21.32666,46.61999,0 21.26056,46.49528000000001,0 21.29222,46.42027000000001,0 21.19721,46.39139,0 21.17667,46.29556,0 21.05944,46.23917,0 20.82028,46.27472,0 20.75332,46.23888000000001,0 20.76305,46.19917000000001,0 20.72056,46.19166,0 20.72056,46.16555,0 20.62472,46.13027000000002,0 20.48694,46.18110999999999,0 20.47805,46.14972,0 20.34027,46.15944,0 20.26102,46.11486,0 20.37805,45.97806,0 20.59167,45.89417000000001,0 20.71334,45.74389,0 20.80139,45.76416,0 20.79888,45.65667,0 20.76666,45.60999,0 20.82361,45.53249,0 20.78305,45.48472,0 21.04889,45.31639,0 21.16306,45.30972,0 21.2675,45.23278,0 21.41666,45.21472000000001,0 21.51361,45.15111000000001,0 21.51277,45.12333,0 21.46028,45.10277,0 21.44722000000001,45.035,0 21.36695,45.00832,0 21.54083,44.93861,0 21.55861,44.89611,0 21.36611,44.86444,0 21.40040000000001,44.78082,0 21.58834,44.76332000000001,0 21.64944,44.65778,0 21.99389,44.63556,0 22.08444,44.50306,0 22.14638,44.47916,0 22.17694,44.48194000000001,0 22.31361,44.66417,0 22.47916,44.71027,0 22.76489000000001,44.55901,0 22.69958,44.52252,0 22.59027,44.54916,0 22.54611,44.4875,0 22.45734,44.47435,0 22.54972,44.32306,0 22.6875,44.27777,0 22.68144,44.2247,0 22.61667,44.17278,0 22.6225,44.07083,0 22.41695,44.00695,0 22.35945,43.81694,0 22.4275,43.68861,0 22.49555000000001,43.64555,0 22.49555000000001,43.57028,0 22.54333000000001,43.4725,0 22.76666,43.38582,0 22.90444000000002,43.23082,0 23.00721,43.19611,0 22.96639,43.10167,0 22.79083,42.98527,0 22.74556000000001,42.89361,0 22.525,42.87861,0 22.44222,42.82167,0 22.50139,42.73916,0 22.46111,42.6925,0 22.43861,42.57471000000001,0 22.55805,42.47916,0 22.45639,42.34027,0 22.36527,42.32389,0 22.5211,42.14861,0 22.67528,42.0675,0 22.86444,42.02722,0 22.89584,41.88527,0 22.96193,41.77861,0 23.03277,41.72834000000001,0 22.9525,41.63444,0 22.96083,41.3586,0 22.77222,41.32444,0 22.72917,41.14471,0 22.6725,41.18777,0 22.58555,41.11944,0 22.33417,41.12722,0 22.25667,41.17139,0 22.13111,41.12500000000001,0 22.06667,41.15834,0 21.91611,41.09527,0 21.91195,41.04943,0 21.80416,40.97777,0 21.79222,40.93278,0 21.69445,40.93805,0 21.6,40.87277,0 21.41972,40.91917,0 21.34305,40.87193,0 20.98349,40.8559,0 20.96194,40.77166,0 21.05194,40.67666000000001,0 21.04138,40.56195,0 20.94556,40.46694,0 20.84889,40.47916,0 20.78889,40.42832,0 20.78972,40.36083,0 20.71306,40.27833,0 20.72111,40.22305,0 20.67861,40.18527,0 20.67195,40.09805,0 20.45,40.07249,0 20.39416,39.99917000000001,0 20.3161,39.99334,0 20.41445,39.82443,0 20.38138,39.78722,0 20.29138,39.80667,0 20.32083,39.7336,0 20.26444,39.66916000000001,0 20.19916,39.64472,0 20.01002,39.6912,0 19.98255,39.68724,0 19.95083,39.78693,0 19.57928,39.90293,0 19.37265,39.8712,0 19.36993,39.84311,0 19.80221,39.58348,0 19.87652,39.44391,0 20.07227,39.36417,0 20.13298,39.19515,0 20.2381,39.1222,0 20.49728,39.20377,0 20.73834,38.90834,0 20.72928,38.86393,0 20.63178,38.84898,0 20.54984,38.68631000000001,0 20.51631,38.3501,0 20.48369,38.32835,0 20.44472,38.36641,0 20.39216,38.36551000000001,0 20.31669,38.18789,0 20.37856,38.13986,0 20.45741,38.14892,0 20.51087,38.09272000000001,0 20.61781,37.81678,0 20.68738,37.72452,0 20.80903,37.64777,0 20.99752,37.69217,0 21.30836,37.62784,0 21.36454,37.6464,0 21.54217,37.54129,0 21.67267,37.33829,0 21.57297,37.21142,0 21.53381,37.02636,0 21.70063,36.72363,0 21.79948,36.68655,0 21.98484,36.77306,0 21.94816,36.8444,0 21.95903,36.9749,0 22.04059,37.01296,0 22.13302,37.00752,0 22.12033,36.90784,0 22.23996,36.84983,0 22.32878,36.7139,0 22.35234,36.64503,0 22.33602000000001,36.51816,0 22.3926,36.43942,0 22.50257,36.37666,0 22.50257,32.79314,0 23.12222,32.62666,0 23.09833,32.52166,0 23.14555,32.46694000000001,0 23.13333,32.39666,0 23.09306,32.42667,0 23.08139,32.33277,0 23.20889,32.27555,0 23.30916,32.15861,0 23.30778,32.21861,0 23.50166,32.17139,0 23.72639,32.17472,0 23.98639,32.09833,0 23.96778,32.0675,0 24.09472,32.00111,0 24.54305,31.98527,0 24.7275,32.02693,0 24.97389,31.97,0 25.03611,31.92445,0 25.02555,31.84139,0 25.15166,31.64694,0 25.06972,31.58167,0 25.04222,31.49972,0 24.86833,31.375,0 24.86945,31.15639,0 25.01916,30.7875,0 24.92611000000001,30.50611,0 24.78082,30.33388,0 24.70667,30.16861,0 24.83472,29.87666,0 24.8125,29.78445,0 24.88694,29.66389,0 24.8775,29.50638,0 24.99777,29.24888,0 24.9989,26.99969000000002,0 25.00142,21.99969,0 25.00083,19.99916,0 24.00275,19.49907,0 23.99981,18.7543,0 23.9996,15.69871,0 23.60889,15.75833,0 23.35694,15.68166,0 23.11816,15.71029,0 22.93722,15.56194,0 22.92305,15.48722,0 22.99834,15.35639,0 22.93583,15.11611,0 22.84916,15.07834,0 22.75332,14.97694,0 22.7389,14.90278,0 22.67056,14.85945,0 22.7025,14.69139,0 22.47,14.62945,0 22.38416,14.55416,0 22.38138,14.52306,0 22.44556,14.47972,0 22.46972,14.34472,0 22.43444,14.30972,0 22.44389,14.27222,0 22.55527,14.23194,0 22.555,14.12555,0 22.23833,13.96833,0 22.19833,13.9225,0 22.08444,13.77916,0 22.13861,13.72806,0 22.15361,13.63444,0 22.22472,13.57195,0 22.23056,13.47889,0 22.29416000000001,13.35861,0 22.15972,13.19027,0 22.02055,13.13779,0 21.94333,13.05361,0 21.82777,12.7975,0 21.95277,12.64389,0 22.14056,12.65527,0 22.22333,12.74722,0 22.46694,12.62166,0 22.38389,12.46527,0 22.43278,12.40333,0 22.50139,12.17695,0 22.47666,12.03416,0 22.56361,12.07471,0 22.64082000000001,12.07111,0 22.56167,11.62166,0 22.64195,11.51611,0 22.77555,11.46222,0 22.79111,11.40167,0 22.93084,11.41583,0 22.97083,11.28306,0 22.9425,11.0925,0 22.86651,10.92244,0 23.00945,10.69861,0 23.30389,10.45916,0 23.66916000000001,9.866942,0 23.69471,9.671659999999999,0 23.62333,9.535275,0 23.63138,9.449442,0 23.66445,9.440837999999999,0 23.65222,9.279999,0 23.55639,9.181664,0 23.49277,9.174168,0 23.44861,9.025002000000001,0 23.50361,8.959716000000002,0 23.56528000000001,9.005281999999999,0 23.58305,8.988605,0 23.58167,8.906112,0 23.49833,8.77833,0 23.51777,8.714159,0 23.63305,8.736947000000001,0 23.73916,8.705276,0 23.82389,8.727785000000001,0 24.25333,8.691110999999999,0 24.23027,8.624995999999999,0 24.26917,8.583055999999999,0 24.16584,8.477783000000001,0 24.14027,8.375832000000001,0 24.17721,8.316108,0 24.36111,8.247221,0 24.46,8.271386,0 24.54583,8.204715,0 24.66,8.218610999999999,0 24.86555,8.165285000000001,0 24.94277,8.083888999999999,0 24.97333,7.992774,0 25.08027,7.897500000000001,0 25.18611,7.901946,0 25.25833,7.840836,0 25.29611,7.65,0 25.18389000000001,7.583336000000002,0 25.20695,7.497503,0 25.33111,7.425279,0 25.36555,7.348338,0 25.465,7.280001000000001,0 25.53139,7.277786,0 25.59389,7.216388,0 25.81389,7.147214000000001,0 25.81971,7.108335000000001,0 26.04834,6.998336,0 26.10083,6.841106,0 26.40628,6.63525,0 26.28916,6.468894,0 26.31361,6.457769000000001,0 26.30778000000002,6.383051,0 26.39527,6.307785,0 26.45944,6.294446000000001,0 26.47611,6.224714,0 26.52361000000001,6.221106,0 26.52361000000001,6.173613,0 26.4375,6.077772,0 26.51416,6.109722,0 26.55445,6.033608,0 26.80861,5.980004,0 26.83945,5.898338,0 26.91027,5.899446000000001,0 26.94972,5.846949000000001,0 27.00111,5.862501,0 27.04917,5.789997,0 27.14278,5.771943,0 27.24084,5.647779000000001,0 27.23389,5.588334,0 27.28166,5.578613,0 27.23584,5.428610000000001,0 27.25472,5.331392,0 27.3,5.22611,0 27.45806,5.083613,0 27.45527,5.016392,0 27.39361,5.089167,0 27.08417,5.204159,0 26.93777,5.141106,0 26.86777,5.029163,0 26.73166,5.092784,0 26.48889,5.04639,0 26.38639,5.145552,0 26.29222,5.141394,0 26.13277,5.257215,0 26.05694,5.192504,0 25.97333,5.231663000000001,0 25.9,5.166945,0 25.87583,5.217497,0 25.82583,5.195556,0 25.79083,5.263893,0 25.74916,5.241941,0 25.54222,5.381387,0 25.53833,5.350554,0 25.36195,5.314715000000001,0 25.37555,5.294717,0 25.31056,5.19111,0 25.34945,5.144714,0 25.30832,5.032503,0 25.17583,4.995278,0 25.13361,5.017778000000001,0 25.07027,4.945832,0 24.95888,4.987215000000001,0 24.73445,4.910841,0 24.65056,4.92111,0 24.66111,4.964445,0 24.52556,5.077214000000001,0 24.44750000000001,5.105834,0 24.42555,5.065838,0 24.39417,5.115554,0 24.355,5.054715,0 24.40056,5.030001,0 24.28611,4.994999,0 24.25611,4.929443,0 24.2275,4.960278000000001,0 24.15194,4.900004,0 24.10555,4.920002,0 23.98195,4.855275,0 23.95417,4.873337,0 23.94222,4.809996,0 23.83027,4.82084,0 23.58445,4.734449,0 23.44166,4.653612,0 23.42639,4.591943,0 23.38556000000001,4.587777,0 23.26833,4.627214,0 23.1825,4.727222,0 23.10000000000001,4.70528,0 23.0225,4.743053,0 22.97500000000001,4.831388,0 22.89584,4.821110000000001,0 22.85582000000001,4.706945,0 22.77584,4.706666,0 22.69027000000001,4.483611,0 22.59445,4.470551,0 22.60972,4.358889,0 22.54111,4.28111,0 22.53861,4.218894,0 22.4536,4.144580000000001,0 22.45972,4.137497,0 22.56111,4.101389,0 22.68722,3.998050999999999,0 22.75861,3.991391000000001,0 22.76555,3.905,0 22.85806,3.858604999999999,0 22.99083,3.883337,0 23.03555,3.860559,0 23.14722,3.896108,0 23.35889,3.809448,0 23.39943,3.835278000000001,0 23.515,3.825836,0 23.48695,3.738338,0 23.36971,3.615839,0 23.17111,3.678056000000001,0 23.03750000000001,3.547503,0 22.92861,3.548051000000001,0 22.67834,3.453893,0 22.62361,3.388896,0 22.64333,3.325284,0 22.79639,3.259449,0 22.77972,3.063887,0 22.81472000000001,2.996109,0 22.86417000000001,3.011947999999999,0 23.00111,3.161664000000001,0 23.08195,3.147218,0 22.98472,2.857779,0 23.00389,2.757221,0 22.96,2.672216,0 23.03806,2.558051,0 23.12666,2.502503,0 23.35945,2.523887,0 23.4225,2.451941,0 23.6275,2.330837,0 23.65138,2.192498,0 23.34389,2.251395000000001,0 23.09027,2.093894,0 22.97583,2.184165,0 22.86084,2.045835,0 22.75722,2.010284,0 22.69972,2.034162,0 22.6475,2.109447,0 22.57222000000001,2.110283,0 22.58861,2.048606,0 22.51667,1.916387,0 22.47277,1.693889,0 22.31111,1.557503,0 22.28639,1.503332,0 22.4339,1.489715,0 22.62416,1.361663,0 22.81472000000001,0.9963894000000001,0 22.86139,0.6711115,0 22.93528,0.5708334000000001,0 22.9936,0.3750025000000001,0 23.41361,-0.2336045,0 23.29389,-0.3172145,0 23.13,-0.2808366,0 22.97027,-0.4063866,0 23.21778,-0.4249986,0 23.26917,-0.4952795999999999,0 23.46778000000001,-0.4386065,0 23.62945,-0.6358325,0 23.48555,-0.6988865,0 23.35611,-0.8072196,0 23.52667,-0.9758345000000001,0 23.72972,-1.08334,0 23.77278,-1.179163,0 23.94889,-1.306666,0 24.10583,-1.384723,0 24.30388,-1.393057,0 24.37583,-1.538893,0 24.4214,-1.786798,0 24.03527,-1.73278,0 23.98527,-1.769167,0 23.83777,-1.765,0 23.78306,-1.806661,0 23.77472,-1.917495,0 23.69805,-1.931392,0 23.69389,-2.018889,0 23.5,-2.009998,0 23.22111,-2.085552,0 23.10944,-1.945837,0 23.03277,-1.928053,0 22.93666,-1.962216,0 22.87028,-1.88416,0 22.67972,-1.806661,0 22.62556,-1.801108,0 22.50972000000001,-1.958887,0 22.185,-1.903339,0 22.16638,-1.942219,0 22.28722000000001,-2.445553,0 22.25139,-2.466946,0 22.19861,-2.447784,0 22.19055000000001,-2.313334,0 22.13972,-2.276389,0 22.0486,-2.370835,0 21.95194,-2.415555,0 21.89883,-2.490597,0 21.82688,-2.529217,0 21.46972,-2.335284,0 21.44083,-2.480554,0 21.24555,-2.512783000000001,0 21.00686,-2.48896,0 20.95916,-2.588608,0 20.95417,-2.692783,0 20.82945,-2.848887,0 20.65611000000001,-3.307221999999999,0 20.66917,-4.151665,0 20.50944,-4.254166000000001,0 20.37444,-4.295278,0 20.3375,-4.397779,0 20.26277,-4.395555,0 20.22445,-4.335003,0 20.17777,-4.33278,0 20.12861,-4.278889,0 20.03889,-4.278051,0 20.03333,-4.300551,0 20.11889,-4.500837,0 20.06222,-4.595832,0 20.05445,-4.769164,0 20.19166,-5.159161,0 20.19639,-5.273613,0 20.14305,-5.40361,0 20.18,-5.684445000000001,0 20.11222,-5.834448,0 20.05305,-5.865004,0 20.01974,-5.942214,0 19.84027,-6.031107000000001,0 19.68847,-6.187500000000002,0 19.73667,-6.575553000000002,0 19.9325,-6.842503,0 19.96277,-6.995556000000001,0 20.31138,-6.99472,0 20.3325,-6.914449,0 20.62975,-6.913881,0 20.54306,-7.124445,0 20.53861,-7.284483,0 21.78295,-7.280848,0 21.81555,-7.316110000000001,0 21.85388,-7.425559000000001,0 21.85111,-7.591662,0 21.77305,-7.776109,0 21.75416,-7.999444000000001,0 21.85861,-8.157781,0 21.87666,-8.279163000000001,0 21.91611,-8.308612,0 21.94,-8.496109000000001,0 21.84777,-8.949718000000001,0 21.85472,-9.229445999999999,0 21.79056,-9.405559,0 21.87472,-9.665001999999999,0 21.95639,-9.763335,0 21.985,-9.755838000000001,0 22.02138,-9.848053,0 22.1625,-9.930555,0 22.20722,-10.15416,0 22.31361,-10.37,0 22.26416,-10.50055,0 22.30334,-10.53779,0 22.30806,-10.61278,0 22.31944,-10.75973,0 22.16361,-10.86139,0 22.19361,-10.99417,0 22.24611,-11.07305,0 22.25111,-11.2525,0 22.48,-11.13333,0 22.52972,-11.03778,0 22.71667,-11.09334,0 22.86361,-11.04917,0 22.94277,-11.095,0 23.085,-11.09668,0 23.21861000000001,-11.07639,0 23.36806,-10.98278,0 23.47639,-10.95834,0 23.8639,-11.02722,0 23.98621,-10.87046,0 24.0225,-10.96889,0 24.02527,-11.28056,0 24.08445,-11.40278,0 24.03083,-11.45306,0 24.03028,-11.52639,0 23.96583,-11.655,0 24.01555,-11.81417,0 23.98416,-11.88222,0 23.975,-12.19917,0 24.035,-12.26417,0 24.05222,-12.38528,0 23.9475,-12.53723,0 23.88611,-12.77111,0 23.89389,-12.83223,0 23.99777,-12.93723,0 24.02055,-13.00639,0 21.99834,-13.00416,0 22.00015,-16.17166,0 22.12111,-16.34112,0 22.13888,-16.4925,0 22.48778,-16.77417,0 23.20167,-17.47973,0 23.47611,-17.62584,0 21.37936,-18.01489,0 21.24194,-17.93889,0 21.16389,-17.93139,0 20.95417,-17.9675,0 20.82,-18.03861,0 20.75195,-17.99611000000001,0 20.5475,-17.98168,0 20.33806,-17.85805,0 20.03583,-17.90028,0 19.92056,-17.85723,0 19.81194,-17.85833,0 19.76195,-17.8989,0 19.66166,-17.83778,0 19.55916,-17.8675,0 19.34333,-17.8475,0 19.24222,-17.80583,0 18.91584,-17.81555,0 18.75638,-17.74778,0 18.63722,-17.64473,0 18.45154,-17.38984,0 18.00055,-17.38617,0 14.20417,-17.3831,0 14.17694,-17.42028,0 13.98556,-17.42584,0 13.52471,-17.12695,0 13.52611,-17.07778,0 13.47445,-17.01194,0 13.37333,-16.96945,0 13.25166,-16.98528,0 13.16056,-16.95278,0 12.88666,-17.03361,0 12.81611,-17.10889,0 12.55722,-17.24333,0 12.45083,-17.25417,0 12.4214,-17.20361,0 12.24611,-17.22721,0 12.16778,-17.14389,0 12.13139,-17.16112,0 12.08471,-17.13528,0 11.92861,-17.18278,0 11.82584,-17.26639000000001,0 11.75278,-17.25484,0 11.7211,-17.655,0 11.80472,-18.08195,0 11.9489,-18.25639,0 12.02083,-18.47111,0 12.29611,-18.7061,0 12.46083,-18.92805,0 12.46416,-19.00418,0 12.54222,-19.06778,0 12.67,-19.295,0 12.70722,-19.41778,0 12.93167,-19.79583,0 13.05111,-20.06778,0 13.175,-20.18084,0 13.25083,-20.46584,0 13.35277,-20.64667,0 13.4,-20.85583,0 13.85361,-21.49139,0 13.87972,-21.59944,0 13.97028,-21.73167,0 13.94916,-21.78194,0 14.27777,-22.11028,0 14.39167,-22.29,0 14.51139,-22.55279,0 14.52485,-22.69206,0 14.52584,-22.91112,0 14.46278,-23.00055,0 14.43833,-22.87778,0 14.41056,-22.96723,0 14.45388,-23.1464,0 14.49833,-23.33056,0 14.49194,-23.37584,0 14.47,-23.34668,0 14.43444,-23.41778,0 14.49611,-23.58834,0 14.48445,-23.75639,0 14.51471,-23.83583,0 14.50945,-23.90473,0 14.45611,-23.9675,0 14.46333,-24.10917,0 14.61278,-24.45639,0 14.59916,-24.56555,0 14.77695,-24.79945,0 14.79277,-24.94361,0 14.83207,-24.99944,0 14.85778,-25.08723,0 14.80083,-25.285,0 14.88222,-25.5675,0 14.83777,-25.76194,0 14.91361,-25.84472,0 14.90333,-25.91055,0 14.98,-26.0575,0 14.97805,-26.12667,0 14.93861,-26.13945,0 14.96833,-26.33972,0 15.08792,-26.40098,0 15.17111,-26.5964,0 15.14194,-26.67778,0 15.13472,-26.62889,0 15.07972,-26.65,0 15.08389,-26.69861,0 15.15777,-26.90278,0 15.23471,-26.96667,0 15.29417,-27.32250000000001,0 15.46666,-27.54445000000001,0 15.53333,-27.66139,0 15.52861,-27.7275,0 15.67,-27.87139000000001,0 15.67639,-27.9339,0 15.75277,-28.03055,0 16.02778,-28.24473,0 16.35445,-28.56278,0 16.44195,-28.61834,0 16.48959,-28.57819,0 16.46972,-28.63028,0 16.56833,-28.72389,0 16.60611,-28.87195,0 16.67083,-28.90584,0 16.73277,-29.01889,0 16.81528,-29.085,0 16.84444,-29.22139,0 17.00332,-29.52445,0 17.08445,-29.83584000000002,0 17.27889,-30.34667,0 17.53944,-30.7575,0 17.61195,-30.92972,0 17.90944,-31.35973,0 18.18139,-31.67473,0 18.2786,-31.89278,0 18.35027,-32.28807,0 18.31611,-32.33501,0 18.335,-32.47834,0 18.29222,-32.62445,0 18.13175,-32.77878000000001,0 18.05361,-32.77612,0 17.96694,-32.69862,0 17.9025,-32.73333,0 17.87666,-32.80612,0 17.8675,-32.81196000000001,0 17.84527,-32.82584,0 17.87694,-32.86084,0 17.85714,-32.91527000000001,0 17.89305,-33.03111,0 17.91389,-33.04805,0 17.98333,-33.00028,0 18.03444,-33.0325,0 18.03721,-33.10196,0 18.12306,-33.20001,0 18.00167,-33.09333,0 17.95556,-33.10305,0 17.96722,-33.13472,0 18.09,-33.22501,0 18.14805,-33.35612,0 18.29471,-33.46611,0 18.31527,-33.56834,0 18.44111,-33.70667,0 18.4825,-33.89473,0 18.38,-33.91195,0 18.31027,-34.0325,0 18.35555,-34.05834,0 18.30972,-34.14918,0 18.36305,-34.18723,0 18.42027,-34.32306,0 18.4901,-34.34823,0 18.46666,-34.3289,0 18.47888,-34.23445000000001,0 18.43583,-34.16889,0 18.48805,-34.09778,0 18.60195,-34.07362,0 18.79332,-34.08667,0 18.85527,-34.15611,0 18.81417,-34.19028,0 18.84527,-34.245,0 18.80833,-34.29723,0 18.81778,-34.37778000000001,0 19.08334,-34.34639,0 19.13722,-34.29834,0 19.08334,-34.36084000000001,0 19.11222,-34.40334,0 19.21082,-34.42861,0 19.28194,-34.40973,0 19.3575,-34.50029,0 19.36333,-34.53778,0 19.29611,-34.61972,0 19.38945,-34.60196,0 19.51416,-34.67084,0 19.51639,-34.67556,0 19.65166,-34.77584,0 19.85777,-34.7525,0 19.99861,-34.82195,0 20.05722,-34.805,0 20.055,-34.7525,0 20.08972,-34.72639,0 20.21972,-34.67973,0 20.46029,-34.48223,0 20.53444,-34.45583,0 20.85222,-34.46305,0 20.85666000000001,-34.42083,0 20.80861000000001,-34.39723,0 20.9425,-34.36028,0 21.06277,-34.36389,0 21.29472000000001,-34.43389,0 21.52832,-34.3525,0 21.65556,-34.39056,0 21.8025,-34.38305,0 21.90166,-34.33611,0 21.94972,-34.22501,0 22.13416,-34.19112,0 22.11167,-34.14861000000001,0 22.15389,-34.09251,0 22.50382,-34.04004,0 22.50382,-35.54002000000001,0 22.50382,-40.54002,0 22.50382,-45.54003,0 22.50382,-50.54002,0 22.50382,-55.54003,0 22.50382,-60.54002000000001,0 22.50382,-65.54002,0 22.50382,-70.54002,0 22.50382,-73.84003,0 22.50382,-78.84003,0 22.50382,-83.84003000000001,0 22.50382,-84.89999,0 22.50382,-89.90000000000001,0 21.50615,-89.90000000000001,0 20.50847,-89.90000000000001,0 19.51079,-89.90000000000001,0 18.51312,-89.90000000000001,0 17.51545,-89.90000000000001,0 16.51776,-89.90000000000001,0 15.52009,-89.90000000000001,0 14.52242,-89.90000000000001,0 13.52473,-89.90000000000001,0 12.52706,-89.90000000000001,0 11.52938,-89.90000000000001,0 10.53171,-89.90000000000001,0 9.534033000000001,-89.90000000000001,0 8.536356,-89.90000000000001,0 7.538679000000002,-89.90000000000001,0 7.538679000000002,-88.70438,0 7.538679000000002,-83.70439,0 7.538679000000002,-78.70439,0 7.538679000000002,-73.70439000000002,0 7.538679000000002,-68.70439,0 7.538679000000002,-63.70440000000001,0 7.538679000000002,-58.70439,0 7.538679000000002,-53.7044,0 7.538679000000002,-49.50439000000002,0 7.538679000000002,-44.50439,0 7.538679000000002,-39.50439,0 7.538679000000002,-34.50439,0 7.538679000000002,-33.94561,0 7.538679000000002,-28.94561,0 7.538679000000002,-23.94561,0 7.538679000000002,-18.94561,0 7.538679000000002,-13.94561,0 7.538670000000001,-8.945614000000001,0 7.538670000000001,-3.94561,0 2.656305,-3.94561,0 2.656305,-0.6707075,0 7.538670000000001,-0.6855035,0 7.538670000000001,-0.5623475,0 7.538670000000001,4.437656,0 7.195104000000001,4.365161,0 7.018200000000002,4.374809,0 6.962769000000001,4.389164,0 6.794163000000001,4.336668,0 6.460839000000001,4.322502,0 6.431112,4.345002,0 6.410556,4.313339,0 6.111108,4.272498,0 5.931108000000001,4.340556,0 5.862222000000001,4.388607,0 5.862780000000001,4.434722,0 5.843340000000001,4.410557000000001,0 5.777784,4.454999,0 5.579442,4.659722,0 5.554719,4.71528,0 5.578056,4.718609,0 5.497497,4.805838,0 5.383890000000001,5.111946,0 5.345271,5.329998,0 5.194161,5.502222,0 5.000004,5.857496,0 4.713606,6.164721,0 4.525839,6.305004000000001,0 4.379445,6.368057,0 3.795282,6.432786000000001,0 3.370833000000001,6.385832000000001,0 2.719611,6.36551,0 1.868607,6.273612,0 1.635399,6.21872,0 1.652499,6.250283,0 1.799325,6.281054,0 1.749168,6.456663000000001,0 1.575279,6.679718,0 1.623051,6.757775,0 1.594719,6.80445,0 1.606113,6.895268,0 1.548531,6.995177,0 1.6425,6.995555000000001,0 1.655838,7.532495,0 1.634715,8.357768,0 1.613052,8.374715999999999,0 1.660833,8.496943999999999,0 1.624716,8.548056000000003,0 1.617786,9.049715000000001,0 1.567215,9.17,0 1.416663,9.321111,0 1.38861,9.492217999999999,0 1.364256,9.481346,0 1.337499,9.542501,0 1.373895,9.646667000000003,0 1.355004,9.995282,0 0.7766640000000001,10.37667,0 0.8021880000000001,10.71245,0 0.879444,10.79972,0 0.917973,10.9964,0 0.9677789999999999,10.99584,0 0.948609,11.02389,0 0.978894,11.08027,0 1.117782,11.0275,0 1.058058,11.13139,0 1.125279,11.17528,0 1.156392,11.16277,0 1.13805,11.26527,0 1.264716,11.24611,0 1.274715,11.315,0 1.303605,11.28945,0 1.351107,11.3025,0 1.328337,11.35139,0 1.439721,11.46834,0 1.56861,11.4525,0 1.609164,11.38834,0 1.868607,11.44584,0 2.014722,11.4225,0 2.193894,11.60361,0 2.310552,11.67055,0 2.308608,11.72555,0 2.366946,11.79,0 2.397924,11.89615,0 2.058336,12.35722,0 2.161665,12.41555,0 2.264166,12.4186,0 2.22084,12.59361,0 2.142504,12.69445,0 1.988892,12.73111,0 1.928052,12.70056,0 1.871667,12.60889,0 1.578339,12.63,0 1.117215,13.01111,0 0.9891630000000002,13.04722,0 0.991665,13.37167,0 1.182222,13.31277,0 1.204164,13.36805,0 1.285308,13.34995,0 1.244448,13.39305,0 1.031661,13.4625,0 0.9952830000000001,13.56806,0 0.902214,13.62278,0 0.7744410000000001,13.64416,0 0.7727850000000001,13.68832,0 0.602217,13.70389,0 0.616662,13.77805,0 0.465003,13.91361,0 0.4711050000000001,13.95555,0 0.424161,13.98361,0 0.352503,14.1214,0 0.410832,14.24584,0 0.321111,14.36278,0 0.189441,14.46472,0 0.166662,14.52306,0 0.241389,14.75221,0 0.193338,14.83583,0 0.235044,14.91506,0 0.229995,15.00251,0 0.3966660000000001,14.96056,0 0.512217,15.00083,0 0.694998,14.94221,0 0.974718,14.97861,0 1.312497,15.28666,0 2.628054,15.35055,0 3.020832,15.34195,0 3.032496,15.43306,0 3.523986,15.35816,0 3.539997,15.49722,0 3.726666,15.65277,0 3.823893,15.66527,0 3.885003,15.70917,0 3.924440999999999,15.90416,0 4.000833,15.98971,0 3.981942,16.07638,0 4.069719,16.29389,0 4.200840000000001,16.39389,0 4.198887,16.82083,0 4.21416,16.99361,0 4.2525,16.99445,0 4.245282,19.14666,0 3.331944,18.97639,0 3.114162,19.15639,0 3.196107000000001,19.25861,0 3.206664,19.32611,0 3.277215,19.38972,0 3.210003,19.56527,0 3.233052,19.82028,0 2.967219,19.95,0 2.587779,20.00166,0 2.411667,20.0575,0 2.344167,20.17777,0 2.213055,20.28139,0 2.097504,20.21889,0 1.983339,20.26028,0 1.908891,20.23139000000001,0 1.881108,20.30139,0 1.795833,20.30833,0 1.668051,20.40861,0 1.663056,20.53611,0 1.627497,20.57111,0 1.375002,20.6575,0 1.317222,20.73833,0 1.167498,20.74111,0 1.197144,21.00248,0 1.169667,21.10254,0 -0.008055,21.83055,0 -2.448333,23.48722,0 -4.806108,25.00027,0 -6.662781,26.12916,0 -8.666793,27.29046,0 -8.666667,27.66667,0 -8.667225,28.70944,0 -8.495559,28.79056,0 -8.17695,29.04084,0 -7.995555,29.11639,0 -7.644726000000001,29.385,0 -7.433892,29.39722,0 -7.298334,29.53833,0 -7.123887,29.63695,0 -6.58584,29.56722,0 -6.508611,29.63888,0 -6.474168000000001,29.83306,0 -6.217227000000001,29.79888,0 -6.145839000000001,29.8475,0 -6.002784000000001,29.82945,0 -5.89833,29.85667000000001,0 -5.560002,29.895,0 -5.351949,29.99722,0 -5.133609,30.19806000000001,0 -4.920552,30.50805,0 -4.591944,30.62639,0 -4.396941,30.64833,0 -4.16916,30.76916,0 -4.016943,30.91111,0 -3.718890000000001,30.93806,0 -3.617784,30.97667,0 -3.602214,31.09556,0 -3.724164,31.18861,0 -3.788892000000001,31.14861,0 -3.826107,31.16389,0 -3.79611,31.22167,0 -3.803895,31.33916,0 -3.724722,31.39472,0 -3.84084,31.47583,0 -3.830832,31.6775,0 -3.714714,31.71639,0 -3.511665,31.67334,0 -3.386115,31.72611,0 -2.980557,31.84416,0 -2.938059,32.02888000000001,0 -2.853891,32.08834,0 -2.331108,32.15749,0 -1.213056,32.08971,0 -1.175553,32.12083,0 -1.200834,32.17027,0 -1.295838,32.16306,0 -1.25361,32.21472,0 -1.249722,32.32695,0 -1.196109,32.40472,0 -1.119996,32.41555,0 -1.010286,32.50832,0 -1.300284,32.70055,0 -1.382778,32.72445,0 -1.542501,32.93944,0 -1.487214,32.97917000000001,0 -1.480284,33.06305,0 -1.668051,33.26111,0 -1.666665,33.38333,0 -1.600551,33.50972,0 -1.606662,33.59527,0 -1.65222,33.66277,0 -1.730556,33.70499,0 -1.680552,33.76972,0 -1.710279,33.8825,0 -1.653336,34.085,0 -1.750554,34.34945,0 -1.79334,34.37833,0 -1.686708,34.48551,0 -1.857501,34.61028,0 -1.747215,34.74722,0 -1.961388,34.87029,0 -1.993059,34.92945,0 -2.065833,34.93695,0 -2.180286,35.01222,0 -2.209446,35.08582,0 -2.419164,35.15332,0 -2.516949,35.09832,0 -2.635002,35.09972,0 -2.754999,35.13499,0 -2.885553,35.24277,0 -2.747214,35.11555,0 -2.841660000000001,35.12694,0 -2.909448,35.17638,0 -2.914722,35.27361,0 -2.962782,35.27499,0 -2.946942,35.32917,0 -2.973888,35.44027,0 -3.06639,35.28944,0 -3.332502,35.19139,0 -3.577221,35.22667,0 -3.682503,35.28778,0 -3.813894,35.20027,0 -3.892779,35.21583,0 -3.925278,35.25999,0 -4.353894,35.14611,0 -4.695840000000001,35.20888,0 -5.063337,35.40972,0 -5.171391,35.5375,0 -5.253057,35.57695,0 -5.274999,35.68111,0 -5.318892,35.695,0 -5.345838,35.84166,0 -5.395554,35.91634,0 -5.34528,36.11278,0 -5.350833,36.16,0 -5.432778,36.17417,0 -5.425281000000001,36.07083,0 -5.611662,36.00027,0 -5.693895,36.06167,0 -5.797224,36.07388,0 -5.911389,36.17916,0 -6.037497,36.18027,0 -6.318891000000001,36.53249,0 -6.291666000000001,36.5375,0 -6.239718,36.46193,0 -6.172785000000001,36.51221,0 -6.240834,36.50111,0 -6.230835,36.575,0 -6.392502,36.62639,0 -6.443613,36.71889,0 -6.337224000000001,36.79610000000001,0 -6.339717000000001,36.88944,0 -6.246387,36.89581,0 -6.347214000000002,36.89638,0 -6.364449000000001,36.79528,0 -6.515838,36.97194,0 -6.725835000000001,37.09194,0 -7.080282000000001,37.2175,0 -7.333605,37.21222000000001,0 -7.384167000000002,37.16972,0 -7.431858,37.25319,0 -7.467498,37.49082,0 -7.52445,37.55250000000001,0 -7.447779,37.65777,0 -7.422498000000001,37.75472000000001,0 -7.284996,37.86027,0 -7.254450000000001,37.98749000000001,0 -7.126947,38.00333,0 -7.103889000000001,38.04694,0 -7.006662000000001,38.02805,0 -6.939162,38.17805,0 -6.947784,38.21833000000001,0 -7.087779,38.17443,0 -7.143894,38.27027,0 -7.329717,38.44722,0 -7.248051,38.6236,0 -7.257231,38.72834,0 -7.041663,38.86861,0 -7.050285000000001,38.91082,0 -6.954795,39.02639,0 -7.004997,39.10722,0 -7.142499,39.11111,0 -7.139997000000001,39.17334,0 -7.242786000000002,39.21305,0 -7.235037000000001,39.27697,0 -7.322778,39.38833,0 -7.293609,39.46777,0 -7.38,39.49611,0 -7.390836000000001,39.53277,0 -7.505838000000001,39.60583,0 -7.532505000000001,39.66942000000001,0 -7.515000000000001,39.66611,0 -7.337502,39.64388000000001,0 -7.266942,39.67194,0 -7.017219,39.675,0 -6.98319,39.81694,0 -6.913611,39.86472,0 -6.863895,40.01555,0 -6.934725000000001,40.1075,0 -7.004718,40.12611,0 -7.027218,40.18777,0 -7.005834,40.23083,0 -6.873894,40.26332,0 -6.778611,40.36279,0 -6.848334000000001,40.44333,0 -6.790833,40.51805,0 -6.838893000000001,40.575,0 -6.797781,40.65777,0 -6.829164,40.75528,0 -6.803892,40.87416000000001,0 -6.931665000000001,41.01806,0 -6.808338,41.04056000000001,0 -6.754446000000002,41.10249,0 -6.764445,41.13083,0 -6.64389,41.24471000000001,0 -6.496947,41.26445,0 -6.381945,41.355,0 -6.388056,41.38167,0 -6.318333000000001,41.38722,0 -6.32916,41.41527,0 -6.187221,41.57972,0 -6.303609,41.66333,0 -6.442218000000002,41.68582,0 -6.497496000000001,41.65749,0 -6.551388,41.6911,0 -6.562503,41.74529,0 -6.508341,41.87389,0 -6.568335,41.88721,0 -6.544719,41.93722,0 -6.581664,41.96749,0 -6.716943,41.93666,0 -6.788052000000001,41.99167,0 -6.837498,41.94722,0 -6.982848,41.97386,0 -7.056108,41.95111,0 -7.133607,41.99499,0 -7.182783,41.97944,0 -7.200558,41.88361,0 -7.37028,41.85139,0 -7.420284,41.81332,0 -7.493058,41.87306000000001,0 -7.607781,41.83111000000001,0 -7.591662,41.87972,0 -7.692498,41.905,0 -7.880004,41.85277,0 -7.892217,41.92666,0 -8.014725,41.83388,0 -8.140554,41.80917000000001,0 -8.218610999999999,41.91361000000001,0 -8.084997000000001,42.02027,0 -8.079723,42.05416,0 -8.121942000000001,42.07944,0 -8.185554,42.06471,0 -8.201223000000002,42.15273,0 -8.327232,42.08528,0 -8.606942999999999,42.05916,0 -8.745011999999999,41.95250000000001,0 -8.865278999999999,41.87554,0 -8.882225999999999,41.89004,0 -8.898606000000001,42.10806,0 -8.967249000000001,42.46196,0 -9.041391000000001,42.52888,0 -9.027782999999999,42.57972,0 -9.086112,42.58138000000001,0 -9.020286000000001,42.70472,0 -8.85834,42.82444,0 -8.903610000000001,42.82833,0 -8.960283,42.77333,0 -9.058887,42.78472,0 -9.086112,42.73528,0 -9.140283,42.795,0 -9.101394000000001,42.82332,0 -9.14139,42.85695,0 -9.123606000000002,42.90555,0 -9.185003999999999,42.9525,0 -9.181107000000001,42.91555,0 -9.226944,42.93805,0 -9.273339,42.88694,0 -9.293336999999999,42.92249,0 -9.252504000000002,43.0061,0 -9.2925,43.04804000000001,0 -9.25389,43.05029,0 -9.218889000000001,43.10806,0 -9.165555,43.10722,0 -9.164448,43.13777,0 -9.203894999999999,43.12554,0 -9.209448,43.15277,0 -9.169731000000001,43.18583,0 -9.056664,43.18332,0 -9.010557,43.23195,0 -8.91639,43.23222,0 -8.980281,43.28139,0 -8.848053,43.32222,0 -8.843994,43.36485,0 -8.782785000000001,43.30306,0 -8.701389000000001,43.28722,0 -8.539443000000002,43.30972,0 -8.398611000000001,43.38582,0 -8.38611,43.33944,0 -8.360001000000001,43.34027,0 -8.329725,43.40388,0 -8.215551,43.33055,0 -8.213058,43.4025,0 -8.13195,43.42334,0 -8.317214999999999,43.44305,0 -8.194445999999999,43.46611,0 -8.166942000000001,43.50777,0 -8.339724,43.45693,0 -8.331660000000001,43.50889,0 -8.295282,43.52639,0 -8.319447,43.56221,0 -8.253333,43.55806,0 -8.089173000000001,43.66194,0 -8.049447000000001,43.63666,0 -8.060841,43.70361,0 -7.991946000000001,43.70555,0 -7.898058000000001,43.76416,0 -7.856109000000001,43.765,0 -7.850556,43.71472,0 -7.894449000000001,43.66638,0 -7.812513,43.71458,0 -7.683606,43.79277,0 -7.658892,43.76972,0 -7.693767,43.73127,0 -7.629714000000001,43.74778,0 -7.595838,43.66611000000001,0 -7.551945,43.72861000000001,0 -7.46361,43.72639,0 -7.473609000000001,43.70555,0 -7.365834,43.67611,0 -7.248888000000001,43.57916,0 -7.264998,43.54222,0 -7.231113000000001,43.57028,0 -7.045281,43.55943,0 -7.044822000000001,43.4904,0 -7.002225000000001,43.53027,0 -7.019442,43.56417,0 -6.943338,43.57777,0 -6.476949,43.55111,0 -6.235839,43.59499,0 -6.094998000000001,43.56194000000001,0 -5.954715,43.58055,0 -5.844717000000001,43.65527,0 -5.677785,43.54388,0 -5.398056,43.5525,0 -5.381109,43.5261,0 -5.418612,43.49694,0 -5.372667,43.51369,0 -5.365278,43.53917,0 -5.288607000000001,43.53388,0 -5.207499,43.47778,0 -5.121108,43.48916000000001,0 -4.514553,43.39634,0 -4.410279,43.40193,0 -4.371111,43.37028,0 -4.383891000000001,43.39083,0 -4.351941,43.40388,0 -4.21695,43.39389,0 -4.051395,43.4425,0 -4.025286,43.40554,0 -4.016943,43.44777,0 -3.989448,43.43027000000001,0 -3.944718,43.46778,0 -3.810285,43.49249,0 -3.766392000000001,43.46999,0 -3.83166,43.43943,0 -3.813057,43.40361,0 -3.719718,43.47166,0 -3.585555,43.51027,0 -3.430557,43.46444,0 -3.482784000000001,43.42999,0 -3.462498000000001,43.39389,0 -3.450834,43.43527,0 -3.422502,43.40972,0 -3.325284,43.41833,0 -3.020832,43.32861,0 -3.034998,43.37472,0 -2.941389,43.43556,0 -2.752497,43.45499,0 -2.687778,43.38139,0 -2.638053,43.4125,0 -2.295558,43.2961,0 -2.19834,43.31305,0 -2.130552,43.28916,0 -1.780839,43.38888,0 -1.619874,43.43629,0 -1.530639,43.54382,0 -1.480338,43.68816000000001,0 -1.338453,44.26832,0 -1.234737,45.14534,0 -1.204236,45.52971,0 -1.267407,45.71291,0 -1.522926,46.18522000000001,0 -1.778436,46.44073,0 -2.428839,46.72721,0 -2.297205,46.97499,0 -2.529495,47.25373,0 -3.253446,47.27309,0 -3.493476,47.61377,0 -3.865130999999999,47.76862,0 -4.337442,47.77636,0 -4.732326000000001,48.0164,0 -5.142699,48.41902,0 -5.173668000000001,48.4887,0 -4.058703,48.77519,0 -3.137301,48.91456,0 -2.966967,48.88359000000001,0 -2.804364,48.67454000000002,0 -2.66499,48.58163,0 -2.479167,48.67454000000002,0 -2.308815,48.71325,0 -1.828764,48.71325,0 -1.604223,48.66679000000001,0 -1.720368,49.23201,0 -1.882962,49.44108,0 -1.975878,49.74305,0 -1.251927,49.72369000000001,0 -1.18224,49.43721,0 -0.44667,49.35977,0 -0.1989,49.29783000000001,0 -0.013077,49.33654000000001,0 0.017901,49.46043000000001,0 0.149526,49.71595,0 0.575379,49.8708,0 1.016721,49.94823000000001,0 1.396116,50.10309,0 1.52001,50.25794,0 1.547109,50.88124000000001,0 1.77939,50.97416,0 2.437524,51.08255,0 3.072447,51.32258000000001,0 3.428613,51.53938,0 3.978351,51.97298,0 4.319037,52.18204,0 4.551318,52.49174,0 4.698432000000001,53.07247,0 5.023638,53.33572000000001,0 5.495949,53.46734,0 6.262488000000001,53.52154,0 6.866424,53.69189,0 7.499043000000001,53.79065000000001,0 7.499043000000001,57.95962999999999,0 7.013538000000001,57.97367,0 6.595425,58.0511,0 5.681772000000001,58.48469,0 5.45724,58.68601000000001,0 5.108805,59.16606000000001,0 4.930722,60.25007,0 4.651983,60.7456,0 4.590036,61.01659999999999,0 4.799088000000001,61.86831,0 5.039118,62.19351,0 7.516629,63.25726,0 7.516629,64.90000000000001,0 7.516629,69.90000000000001,0 7.516629,74.89999,0 7.516629,79.90000000000001,0 7.516629,84.90001,0 7.516629,89.90000000000001,0 8.456004,89.90000000000001,0 9.395379,89.90000000000001,0 10.33475,89.90000000000001,0 11.27413,89.90000000000001,0 12.2135,89.90000000000001,0 13.15287,89.90000000000001,0 14.09225,89.90000000000001,0 15.03162,89.90000000000001,0 15.97099,89.90000000000001,0 16.91036,89.90000000000001,0 17.84974,89.90000000000001,0 18.78911,89.90000000000001,0 19.72849,89.90000000000001,0 20.66786,89.90000000000001,0 21.60724,89.90000000000001,0 22.54661000000001,89.90000000000001,0 + + + 1 + + + + GMT +02:00 + + +]]> + #khStyle0200 + + + + + +28.09417,69.93859000000001,0 28.32332,69.88749,0 28.37972,69.8275,0 29.1275,69.68582000000001,0 29.29972,69.48027,0 28.81916,69.23193000000001,0 28.78694,69.11915999999999,0 28.95734,69.05162,0 28.43195,68.89694,0 28.47917,68.8736,0 28.73778,68.87582,0 28.82056,68.84444000000001,0 28.73861,68.73416,0 28.4575,68.53194000000001,0 28.69334,68.19749,0 29.35695,68.08249000000001,0 29.69167,67.81527,0 30.02861,67.69472,0 29.98972,67.67194000000001,0 29.97778,67.57249,0 29.93279,67.51389,0 29.54611,67.31055000000001,0 29.08305,66.9586,0 29.09333,66.85138000000001,0 29.35027,66.68249,0 29.42056,66.58498,0 29.54833,66.49554000000001,0 29.56792,66.42856999999999,0 29.63861,66.32249,0 29.91028,66.12694000000001,0 29.97695,65.9811,0 30.09667,65.83333,0 30.13528000000001,65.70359999999999,0 30.12388,65.66499,0 30.02444,65.69110000000001,0 29.72194,65.63805000000001,0 29.85971,65.56610000000001,0 29.74611,65.51443,0 29.7475,65.34193000000001,0 29.59638,65.24887,0 29.85361,65.21612,0 29.87028,65.18747999999999,0 29.82333,65.14888999999999,0 29.87388,65.12082,0 29.62889,65.06305,0 29.60666,65.00166,0 29.63667,64.92805,0 29.80471,64.79389000000001,0 30.14083,64.77415000000001,0 30.12055000000001,64.73054999999999,0 30.19713000000001,64.68622000000001,0 30.19917,64.65028,0 29.97500000000001,64.58110000000001,0 30.00967,64.51286,0 30.08722,64.48305000000001,0 30.05222,64.40470999999999,0 30.15611000000001,64.35415999999999,0 30.38972,64.30943000000001,0 30.45416000000001,64.25694,0 30.56084,64.24442999999999,0 30.57722,64.21581999999999,0 30.54805,64.17471000000001,0 30.61444,64.08665000000001,0 30.59528,64.04694000000001,0 30.345,63.90972000000001,0 30.25584,63.81778,0 29.99671,63.74802,0 30.48166000000001,63.47861,0 30.79639,63.40194,0 30.9625,63.30972000000001,0 31.21972,63.22306,0 31.28222,63.10917,0 31.515,62.98693,0 31.58893,62.91440999999999,0 31.4675,62.80639,0 31.25972000000001,62.50777000000002,0 30.94777,62.31138000000001,0 30.64972,62.195,0 29.99138,61.72943,0 29.83222,61.65305000000002,0 29.80916,61.60833,0 29.52555,61.48277,0 29.48639,61.42611000000002,0 29.21361,61.25332,0 28.81277,61.10334,0 28.63888,60.96611,0 28.52916000000001,60.95499,0 28.38888,60.88667000000002,0 27.80783,60.5464,0 28.01583000000001,59.4786,0 28.19389,59.37582,0 28.17035,59.30978,0 27.91254,59.27182,0 27.72499,58.98777,0 27.4936,58.88193,0 27.42611,58.81361,0 27.5425,58.41389,0 27.53916,58.36166,0 27.46471,58.29777,0 27.47416,58.21388000000001,0 27.55417,58.13276000000001,0 27.67721,58.07417000000002,0 27.64222,58.02083,0 27.69722,58.00082,0 27.68388,57.92638,0 27.82306,57.87388,0 27.75306000000001,57.83916,0 27.54583,57.81777,0 27.57277,57.80277000000002,0 27.51639,57.77333,0 27.52666,57.72276,0 27.41306,57.69055,0 27.40583000000001,57.61361000000001,0 27.34806,57.59554000000001,0 27.37205,57.53564,0 27.54722,57.53638000000001,0 27.52722,57.4386,0 27.86111,57.30222000000001,0 27.84082,57.16361,0 27.70138,57.11916000000001,0 27.7775,57.06582,0 27.64,56.84805,0 27.81555,56.87833000000001,0 27.93527,56.82721,0 27.8861,56.74722,0 28.005,56.69137,0 28.03639,56.59054,0 28.1525,56.55443000000001,0 28.11306,56.50555000000001,0 28.18972,56.44055,0 28.18444,56.37471000000001,0 28.23777,56.2711,0 28.16801,56.15015,0 28.3125,56.04999,0 28.3875,56.0961,0 28.64611,56.09361000000001,0 28.75416,55.95388000000001,0 28.84694,55.94249000000001,0 28.86944,55.98055,0 29.05943,56.03278,0 29.41222,55.95777,0 29.46443,55.91109,0 29.40693,55.89582999999999,0 29.35916,55.78943,0 29.49388,55.68888,0 29.71916,55.78249000000002,0 29.82306,55.77528,0 29.92833,55.85167000000001,0 30.14055,55.82804000000002,0 30.22611,55.8661,0 30.48971,55.79999,0 30.49416,55.76388000000001,0 30.61249,55.72027,0 30.60889,55.68138,0 30.72694,55.65639,0 30.75666,55.59665,0 30.91888,55.60833000000001,0 30.93999,55.49583,0 30.90055,55.45915999999999,0 30.93943,55.39944000000001,0 30.81361,55.29333000000001,0 31.00472,55.14332,0 30.98722,55.11166000000002,0 31.02971,55.04332,0 30.92499,55.03333,0 30.94749,54.96915,0 30.83388,54.94415,0 30.845,54.8811,0 30.78,54.79694000000001,0 31.005,54.71167,0 31.02472,54.65222,0 31.18527,54.64222,0 31.18443,54.60609,0 31.0825,54.50556,0 31.1986,54.46093000000001,0 31.23194,54.45665,0 31.31167,54.35083,0 31.33166,54.2375,0 31.54416,54.14333,0 31.76167,54.10333,0 31.79333,54.05305000000001,0 31.84416,54.06444000000001,0 31.86083,53.96333,0 31.76423000000001,53.80262,0 31.90222,53.77777,0 32.11971,53.81999,0 32.32944,53.76222000000001,0 32.37694,53.71888,0 32.45166,53.72638,0 32.51056,53.68361,0 32.41471,53.64638,0 32.44389,53.57194000000001,0 32.5975,53.4911,0 32.67054,53.49722,0 32.66082,53.46666,0 32.7411,53.46305000000001,0 32.73693,53.34249,0 32.46249,53.30832,0 32.49833,53.27832,0 32.43999,53.20888000000001,0 32.29889,53.13193,0 32.22554,53.13333,0 32.22332,53.10555,0 31.93054,53.09554,0 31.80111,53.12583,0 31.77555,53.19415000000002,0 31.61611,53.21832,0 31.4225,53.20888000000001,0 31.37483,53.12193000000001,0 31.38638,53.09916,0 31.2664,53.02193,0 31.35638,52.97805000000001,0 31.41527,52.89305,0 31.53695,52.8561,0 31.58083,52.80304,0 31.595,52.73804,0 31.5,52.68999,0 31.65332,52.55305,0 31.58167,52.55083,0 31.59527,52.53221,0 31.56472000000001,52.51583,0 31.60889,52.49138,0 31.60166,52.40610000000001,0 31.62972,52.37054,0 31.58666,52.31888,0 31.71694,52.26167000000001,0 31.70389,52.1986,0 31.7825,52.16582,0 31.78388,52.10805000000001,0 31.89777,52.09610000000001,0 31.92638,52.03667,0 32.12444,52.04388000000001,0 32.22499,52.07944,0 32.33554,52.1572,0 32.34055000000001,52.22137,0 32.38638,52.25472,0 32.35833,52.30999,0 32.39415,52.33526,0 32.92361,52.24722,0 33.20471,52.37972,0 33.44887,52.34361,0 33.49778,52.36666000000002,0 33.53528,52.29333000000001,0 33.69638,52.36166999999999,0 33.83056,52.36472000000001,0 34.09778,52.15194,0 34.07306,52.06028000000001,0 34.12804,51.98972000000001,0 34.10943,51.95972,0 34.16945,51.95999,0 34.25777,51.87944000000001,0 34.38082,51.84499,0 34.44054,51.76721,0 34.40554,51.7186,0 34.10277,51.67443,0 34.10111,51.64749,0 34.15972,51.6286,0 34.23417,51.54666,0 34.23916,51.42777000000001,0 34.20361,51.40666,0 34.31499,51.35111,0 34.27388,51.28555,0 34.20892,51.25919,0 34.30526,51.23082000000001,0 34.38221,51.26361000000001,0 34.63361,51.24222,0 34.66999,51.17944,0 34.73499,51.17249,0 35.07381,51.22149,0 35.11852,51.20481,0 35.17075,51.0548,0 35.37189,51.04144,0 35.35855,51.01088000000001,0 35.29716000000001,50.99979,0 35.30577000000001,50.96033,0 35.36133,50.92614,0 35.3605,50.87226,0 35.39773,50.80308,0 35.45663,50.77279,0 35.45829,50.69417,0 35.48857,50.67585,0 35.39355,50.63808,0 35.44106,50.51198,0 35.5672,50.45306,0 35.58305,50.38305,0 35.64471,50.35416,0 35.72887,50.35332,0 35.73915,50.38333,0 35.85028,50.4286,0 36.13917,50.42527,0 36.29749,50.28444,0 36.41276,50.32166,0 36.56333000000001,50.27639,0 36.56249,50.22249,0 36.64028,50.21249000000001,0 36.7011,50.26693000000001,0 36.88444,50.33583000000001,0 37.13054,50.34833,0 37.31583,50.42804,0 37.4586,50.43971000000001,0 37.49444,50.35139000000001,0 37.62360000000001,50.30527,0 37.60527,50.21666,0 37.73304,50.08777000000001,0 37.92527,50.02471,0 38.01306,49.90138000000001,0 38.18526,49.9511,0 38.18415,50.06554000000001,0 38.30777,50.07388,0 38.3761,49.98749,0 38.49889,49.95193,0 38.68665,49.97887,0 38.69609,49.92749,0 38.88916,49.86805,0 38.94526,49.8075,0 39.06916,49.81777,0 39.18373,49.88041,0 39.27361,49.75194,0 39.58083,49.73082,0 39.63972,49.61555,0 39.79695000000001,49.55305,0 39.92167,49.56555,0 40.005,49.61444000000001,0 40.13977,49.60105000000001,0 40.14111,49.55916,0 40.07444,49.52694,0 40.05305,49.47833000000001,0 40.17972000000001,49.32695,0 40.16694,49.2486,0 39.96638,49.12388,0 39.93888,49.05499,0 39.69915,49.02277,0 39.69444,48.97305,0 39.76721,48.90388,0 39.97055,48.85999000000001,0 40.03027,48.8961,0 40.07667,48.87500000000001,0 39.98526,48.79139,0 39.80389,48.81777000000001,0 39.72721,48.76221,0 39.65693,48.61667,0 39.66966,48.58764000000002,0 39.85333,48.55471000000001,0 39.86694,48.50027000000001,0 39.83833,48.48388000000001,0 39.92152,48.36839,0 39.83805,48.3125,0 39.91277,48.27777,0 40.0125,48.28472,0 40.00249,48.24304000000001,0 39.93277,48.21332,0 39.84832,48.11306,0 39.86859,48.04084000000001,0 39.77609,48.02639000000001,0 39.81998,47.9697,0 39.79639,47.85722,0 39.72388,47.81833,0 39.34526,47.85304,0 39.13638,47.83388999999999,0 39.03817,47.8658,0 38.83833,47.85278000000001,0 38.75055,47.68387000000001,0 38.69137,47.69415000000002,0 38.60582,47.63803,0 38.33942,47.60139000000001,0 38.28083,47.5061,0 38.28555,47.3961,0 38.20804,47.31916,0 38.31916,47.27833,0 38.2161,47.19471,0 38.23582,47.10943,0 37.64138,46.73358000000001,0 36.67405,45.41802,0 36.54507,45.17941,0 36.53862,44.90856,0 36.5541,41.28566,0 36.61834,41.37498,0 36.85693,41.34721,0 37.02333,41.26749,0 37.04332,41.17555000000001,0 37.15228,41.14491,0 37.29499,41.14389,0 37.53721,41.02805,0 37.60777,41.04777,0 37.68748,41.13722,0 37.70638,41.11222,0 37.78944,41.11555,0 37.79361000000001,41.04554,0 37.89249,40.98277,0 38.2775,40.95056,0 38.36139,40.90943000000001,0 38.5236,40.92083,0 38.62554,40.97305,0 38.70999,40.95,0 38.81611,41.00999,0 39.16304,41.0825,0 39.2786,41.04972,0 39.4211,41.10944,0 39.64611,41.00166,0 39.73333,41.01388000000001,0 39.87721,40.95389,0 39.99776,40.97582,0 40.12859,40.91639,0 40.45804,41.0425,0 40.54332,41.02916,0 40.83305,41.19498,0 40.93111,41.18748,0 41.3875,41.37304000000001,0 41.53155,41.52388,0 41.65167,41.48277,0 41.72277,41.49554,0 41.72306,41.47055,0 41.83331,41.42832,0 41.96804,41.51915,0 42.05028,41.49056,0 42.18249,41.5075,0 42.47221,41.43333,0 42.51081,41.44333,0 42.59777,41.58305,0 42.82749,41.58500000000001,0 42.78832,41.50861,0 42.84722,41.47305,0 42.89278,41.50695,0 43.03972,41.37416,0 43.20777,41.30693,0 43.1236,41.25527,0 43.19943000000001,41.25527,0 43.23693,41.17638,0 43.3497,41.20193,0 43.42582,41.18527,0 43.47471,41.13999,0 43.46077,41.11296,0 43.47915,41.02528,0 43.59944,40.99249,0 43.67165,40.92806,0 43.6861,40.84195,0 43.75193,40.74,0 43.75361,40.67582,0 43.65304,40.53138,0 43.55415,40.4711,0 43.62027,40.41944,0 43.59417,40.33749,0 43.68,40.26443,0 43.67221,40.21972,0 43.72165,40.16332,0 43.65778,40.13971,0 43.65749,40.1086,0 43.93389000000001,40.01361,0 44.28,40.0461,0 44.34722,40.02389,0 44.48778,39.96277,0 44.59082,39.83305,0 44.69555,39.78998,0 44.77886,39.70638000000001,0 44.81304,39.63081,0 44.60582,39.78054000000001,0 44.47108,39.69886,0 44.4161,39.42527,0 44.31554,39.3875,0 44.20054,39.41694,0 44.03416,39.38499,0 44.09581,39.29138,0 44.09833,39.20638,0 44.21583,39.14083,0 44.18833,39.08306,0 44.20499,39.04165,0 44.15943,39.00221,0 44.20805,38.89581,0 44.30332000000001,38.83444,0 44.26082,38.72165,0 44.28276,38.69777,0 44.26333,38.66639,0 44.31388,38.63777,0 44.30693000000001,38.38833,0 44.38081,38.36971,0 44.43471000000001,38.39555,0 44.48416,38.34554,0 44.40471000000001,38.27166,0 44.38778,38.16583,0 44.26416,38.01416,0 44.22398000000001,37.89915,0 44.39333,37.86304,0 44.41916,37.81778,0 44.45193,37.81778,0 44.45609,37.77471,0 44.52693,37.78555,0 44.61805,37.72776,0 44.55804,37.64803,0 44.6136,37.60277,0 44.58859,37.44026,0 44.72499,37.38361,0 44.81527,37.30526,0 44.82193,37.2711,0 44.77332,37.22748,0 44.78733,37.1497,0 44.63806,37.18748,0 44.43638000000001,37.06304,0 44.35111,37.04833,0 44.31721,36.97055,0 44.25527,36.98666,0 44.19333,37.10027,0 44.26777,37.1675,0 44.26166,37.24194,0 44.11638,37.31638,0 44.01416,37.32054,0 43.91138,37.22415,0 43.83444,37.20499,0 43.79110000000001,37.23194,0 43.49471,37.24972,0 43.35666,37.33083,0 43.27916,37.3161,0 43.14971,37.37777,0 42.95554,37.32222,0 42.79083,37.38472,0 42.72666,37.35555000000001,0 42.58165,37.15277,0 42.35562,37.10693,0 42.37723,37.06467000000001,0 41.83528,36.59888,0 41.40304,36.52555,0 41.29027000000001,36.35555,0 41.25499000000001,36.05499,0 41.37806,35.83861,0 41.38388,35.62527,0 41.27777,35.49554,0 41.21527,35.22471,0 41.22915,34.78832,0 41.00388,34.41944,0 38.7947,33.37759,0 39.08601,32.50151,0 38.98602,32.47767,0 39.04366,32.30405,0 39.26,32.35555,0 39.30111,32.23638,0 39.19675,32.15495,0 39.005,32.00556,0 37.00527,31.50555,0 38.00139,30.50417,0 37.6675,30.33639,0 37.50277,30.00222000000001,0 36.74361,29.86472,0 36.50055,29.50277000000001,0 36.07,29.18889,0 34.96139,29.36083,0 34.85527,29.03861,0 34.84254,28.88452,0 34.78054,28.67083,0 34.80778,28.53639,0 34.64528,28.19361,0 34.65972,28.16445,0 34.62749000000001,28.17388,0 34.5714,28.09056,0 34.48494,27.99542,0 34.49483,27.93732,0 34.6346,27.87186,0 34.88189,27.89598,0 35.26789,27.63060000000001,0 35.71421,27.09985,0 36.49828,26.06245,0 36.47416,25.62217,0 36.54049,25.54376,0 36.83,25.51963,0 36.96872,25.39901,0 37.01093,24.97079,0 37.51406,24.19318,0 37.51406,19.32831,0 38.23912000000001,19.32831,0 38.24853,18.39601,0 38.51692,18.23592,0 38.64405,18.06641,0 38.60069,17.99488,0 38.45861,17.87111,0 38.37029,17.66611,0 38.27667,17.60694000000001,0 38.25777,17.5325,0 38.18583,17.56222,0 38.13361,17.5486,0 38.11138,17.48111,0 38.09555,17.54389,0 38.05584,17.55194,0 37.91722,17.4475,0 37.81888,17.48139,0 37.73584,17.37666,0 37.5125,17.32333,0 37.52058,17.1958,0 37.42329,17.03422,0 37.30693000000001,17.06111,0 37.15194,17.01555,0 36.99582,17.07389,0 37.01805,17.00361,0 36.98693,16.94306,0 37.02278,16.85056,0 36.98055,16.70611,0 36.91222,16.64111,0 36.89638,16.51777,0 36.95694,16.42528,0 36.97305,16.26944,0 36.91584,16.215,0 36.76361,15.80806,0 36.69777,15.75305,0 36.62611,15.48945,0 36.64777000000001,15.44971,0 36.61054,15.43721,0 36.54277,15.23472,0 36.44329,15.14995,0 36.54282,14.26206,0 36.44639,13.95695,0 36.48693,13.83944,0 36.3975,13.56778,0 36.24860000000001,13.36805,0 36.15944,13.04167,0 36.16972,12.98416,0 36.13278,12.92333,0 36.16528,12.87527,0 36.1427,12.70692,0 36.00638,12.72416,0 35.69944,12.66583,0 35.69528,12.61222,0 35.64916,12.59417,0 35.43249,12.20055,0 35.3811,12.16111,0 35.34555,12.03277,0 35.27111,11.97555,0 35.23555,11.90083,0 35.09693,11.82694,0 35.05806,11.72056,0 35.09361,11.55778,0 34.96388,11.25695,0 35.0075,11.19833,0 34.93333,10.95666,0 34.97861,10.91527,0 34.97527,10.86445,0 34.86861,10.78582,0 34.86443,10.735,0 34.80861,10.72945,0 34.77333,10.68694,0 34.77333,10.74584,0 34.59444,10.88779,0 34.43972,10.78445,0 34.28611,10.55416,0 34.34777,10.23195,0 34.32306,10.11721,0 34.23138000000001,10.03027,0 34.08583,9.553058999999999,0 34.13499,8.955270000000001,0 34.1228,8.584649000000001,0 33.97888,8.441387000000002,0 33.85249,8.425836,0 33.77599,8.364941999999999,0 33.69333,8.386389000000001,0 33.62555,8.470556,0 33.57804,8.449443000000001,0 33.50777,8.480834,0 33.38777,8.43777,0 33.2625,8.462502000000001,0 33.20444,8.433890000000002,0 33.16082,8.360001000000001,0 33.15834,8.291392999999999,0 33.20861,8.238049999999999,0 33.16527,8.204715,0 33.18643,8.136979999999999,0 33.03028,7.995248000000001,0 32.99683,7.887221000000001,0 33.05389,7.788888,0 33.16806,7.796393000000001,0 33.33944,7.713612000000001,0 33.47027,7.743339000000001,0 33.55138,7.686387,0 33.71139,7.660277,0 33.78889,7.56639,0 33.89278,7.518888,0 34.03083000000001,7.375004,0 34.03,7.240832,0 34.13361,7.158887,0 34.1825,7.163054000000001,0 34.2025,7.052219000000001,0 34.2947,6.966432000000001,0 34.46999,6.916112,0 34.53,6.743888,0 34.6375,6.727221,0 34.76277,6.605837000000002,0 34.79777,6.444719,0 34.85722,6.349445000000001,0 34.86055,6.26166,0 34.98782,6.013944,0 34.98639,5.878052000000001,0 35.10582,5.692779000000001,0 35.10388,5.632496000000001,0 35.28999,5.507774,0 35.26972,5.441112,0 35.31138,5.366942,0 35.35638,5.350275,0 35.44749,5.429448,0 35.50472,5.431391,0 35.605,5.373054,0 35.68443,5.391387,0 35.83583,5.318613,0 35.79556,5.251391,0 35.83083,5.153894000000001,0 35.77389,5.075279,0 35.77443,4.798611,0 35.94056,4.622499,0 35.50888,4.616738,0 34.38819,4.609683,0 33.99666,4.222782,0 33.51694,3.752217,0 33.18388,3.766113,0 33.01666,3.888612,0 32.89804,3.811949,0 32.71944,3.755834,0 32.40445,3.743613,0 32.19443,3.611042,0 32.19333,3.511394999999999,0 32.09361,3.532500000000001,0 32.0639,3.59028,0 31.95111,3.593889,0 31.93332,3.687785,0 31.79945,3.825557,0 31.70194,3.713058000000001,0 31.57389,3.691664,0 31.54083,3.653611999999999,0 31.28806,3.794714,0 31.17667000000001,3.795281,0 30.97471,3.691943,0 30.85882000000001,3.493394,0 30.91721,3.521942,0 30.935,3.411665,0 30.83,3.275558,0 30.7625,3.055004,0 30.85555,2.957499,0 30.87806000000001,2.843612,0 30.81667,2.769165,0 30.72972,2.448053,0 30.82667,2.442221,0 30.82527,2.399165,0 30.88027,2.337497,0 30.91416,2.339442,0 30.97084,2.411945,0 31.07027,2.335005,0 31.04972,2.303891,0 31.12528,2.278053,0 31.19694,2.305835,0 31.2025,2.229164,0 31.2992,2.162853,0 31.30277,2.121389,0 31.03666000000001,1.765556,0 30.68806,1.493891,0 30.45611,1.212785,0 30.34861,1.196108,0 30.33221,1.151387,0 30.27805,1.168893,0 30.23611,1.134161,0 30.21861000000001,0.9963894000000001,0 30.14583,0.8983344000000001,0 29.96055000000001,0.8255515,0 29.93833,0.6344455,0 29.9625,0.4872144,0 29.85833,0.3666595,0 29.81389,0.1586065,0 29.77332,0.1722145,0 29.71666000000002,0.07221546,0 29.735,-0.00083754,0 29.64861,-0.4397225,0 29.67195,-0.5722206,0 29.63805,-0.5933346000000001,0 29.61833,-0.7333385,0 29.62832,-0.8888946000000001,0 29.57833,-0.9000005,0 29.56639,-1.005841,0 29.59694,-1.385839,0 29.68332,-1.380556,0 29.73416,-1.341946,0 29.80306,-1.365553,0 29.84139,-1.320283,0 29.9075,-1.464166,0 29.97500000000001,-1.464445,0 30.17056,-1.339723,0 30.18472,-1.275004,0 30.22916,-1.266661,0 30.34566,-1.129168,0 30.36,-1.060003,0 30.48222,-1.063333,0 30.45333000000001,-1.095553,0 30.46945,-1.158337,0 30.51221,-1.164448,0 30.56166,-1.326943,0 30.73917,-1.436949,0 30.74888,-1.52055,0 30.84027,-1.670554,0 30.81111,-1.700551,0 30.835,-1.800559,0 30.80832,-1.929448,0 30.89417,-2.076112,0 30.82917,-2.357785,0 30.78222,-2.380554,0 30.69972,-2.347497,0 30.6525,-2.396665000000001,0 30.57332,-2.399167,0 30.43305,-2.647783,0 30.45721,-2.685835,0 30.52222,-2.657215,0 30.44028000000001,-2.747215,0 30.4175,-2.861946999999999,0 30.485,-2.947222,0 30.56333,-2.89305,0 30.66611,-2.976391,0 30.84477,-2.976012,0 30.79555,-3.048607,0 30.85222,-3.145285,0 30.835,-3.256948,0 30.65166,-3.332503,0 30.6222,-3.370122,0 30.66361,-3.386665,0 30.66222,-3.418893999999999,0 30.44916,-3.547215000000001,0 30.39139,-3.711106000000001,0 30.40084,-3.786112,0 30.32111,-3.78666,0 30.22806,-3.928051,0 30.17222,-4.086667,0 30.07277,-4.166667,0 30.02611,-4.269447,0 29.85777,-4.371111,0 29.81277,-4.360284,0 29.75222000000001,-4.461112,0 29.42334,-4.447504,0 29.42834,-4.552218,0 29.34139,-4.797783,0 29.34916000000001,-4.939732,0 29.63166,-5.721949,0 29.49777,-5.979726000000001,0 29.55029,-6.295285,0 29.66111,-6.455556,0 29.73250000000001,-6.627501,0 30.08611,-6.863607,0 30.31138,-7.136947000000001,0 30.40695,-7.356393,0 30.45583,-7.580277000000001,0 30.65445,-7.886943,0 30.77123,-8.192242,0 30.90138,-8.460001,0 31.04111,-8.590284000000001,0 31.13277,-8.615557000000001,0 31.22055,-8.576668,0 31.28527,-8.623333000000001,0 31.37556,-8.582229999999999,0 31.39806,-8.629443,0 31.45945,-8.629443,0 31.56332,-8.698608,0 31.57305,-8.818605,0 31.68361000000001,-8.908894,0 31.73861,-8.918056,0 31.78553000000001,-8.885061,0 31.95611,-8.930835999999999,0 31.93416,-9.018891,0 31.97972,-9.071109999999999,0 32.05611,-9.040832999999999,0 32.16,-9.063333999999999,0 32.24945000000001,-9.131949000000001,0 32.42556,-9.129718000000002,0 32.54527,-9.26667,0 32.74195,-9.281665,0 32.77166,-9.335557,0 32.9404,-9.405072000000001,0 32.99777,-9.373339,0 33.12583,-9.490285,0 33.1925,-9.509167,0 33.31444000000001,-9.485550999999999,0 33.39388,-9.538055999999999,0 33.43777,-9.615834,0 33.50889,-9.621945,0 33.585,-9.584164,0 33.68361,-9.610552,0 33.75583,-9.582777999999999,0 33.91961,-9.707652,0 33.95305000000001,-9.673335000000002,0 33.95721,-9.526671,0 34.03944,-9.482779000000001,0 34.32527,-9.73278,0 34.33805,-9.7875,0 34.5225,-10.01084,0 34.52389,-10.1075,0 34.58277,-10.27,0 34.57583,-10.51667,0 34.67611000000001,-10.74306,0 34.64305,-10.92194,0 34.59305,-11.01668,0 34.615,-11.10945,0 34.71027,-11.20111,0 34.76361000000001,-11.345,0 34.80555,-11.33222,0 34.89054,-11.38306,0 34.95972,-11.48666,0 34.96673,-11.57211,0 35.49416,-11.57918,0 35.51611,-11.61084,0 35.57638,-11.60667,0 35.6525,-11.58473,0 35.70389,-11.48778,0 35.7725,-11.47528,0 35.83833,-11.41472,0 35.94306,-11.43473,0 35.96556,-11.50084,0 36.16305,-11.57778,0 36.18972,-11.70666,0 36.49001,-11.68111,0 36.56195,-11.74028,0 36.67777,-11.71472,0 36.82972,-11.56861,0 36.90445,-11.59473,0 37.02584,-11.56721,0 37.12583,-11.67333,0 37.28611,-11.70418,0 37.34722,-11.68667,0 37.46204,-11.72732,0 37.52666,-11.6625,0 37.66306,-11.63833,0 37.81582,-11.53833,0 37.80972,-11.48,0 37.86861,-11.32666,0 38.09669,-11.25633,0 38.27972,-11.28834,0 38.37777,-11.37722,0 38.49171,-11.41531,0 38.65527,-11.2811,0 38.77389,-11.26166,0 38.89777,-11.17222,0 39.13444,-11.14195,0 39.26805,-11.16806,0 39.50833,-10.99528,0 39.76694000000001,-10.92056,0 39.89832000000001,-10.83166,0 40.00666,-10.80555,0 40.23611,-10.60278,0 40.3425,-10.56722,0 40.43681,-10.47817,0 40.47834,-10.4825,0 40.47277,-10.50778,0 40.52111,-10.48416,0 40.50388,-10.56444,0 40.55972,-10.58666,0 40.57332,-10.65,0 40.63945,-10.67166,0 40.64145,-10.69888,0 40.70627,-10.84757,0 40.71345000000001,-11.17438,0 40.47889,-11.40556,0 40.42471,-11.55416,0 40.45805,-11.60583,0 40.42417,-11.64973,0 40.47556,-11.82029,0 40.51611,-11.84333,0 40.49342,-11.91995,0 40.60549,-11.96501,0 40.63672,-12.37548,0 40.61845,-12.65416,0 40.57444,-12.64306,0 40.57139,-12.69806,0 40.61639,-12.71334,0 40.64194,-12.7814,0 40.55889,-12.785,0 40.56638,-12.81889,0 40.52361,-12.81778,0 40.55639,-12.85445,0 40.53416,-12.90416,0 40.47666,-12.88417,0 40.41,-12.96194,0 40.48972,-13.0275,0 40.50166000000001,-12.94445,0 40.59722,-12.97334,0 40.56,-13.07861,0 40.56806,-13.26222,0 40.52833,-13.3025,0 40.56638,-13.285,0 40.56528,-13.3664,0 40.59111,-13.37473,0 40.52584,-13.51528,0 40.60056,-13.57084,0 40.53749,-13.64528,0 40.64999000000001,-14.01694,0 40.63833000000001,-14.07918,0 40.59666,-14.08722,0 40.62277,-14.12555,0 40.53054,-14.17166,0 40.55584,-14.23,0 40.59389,-14.21084,0 40.59,-14.26834,0 40.64917,-14.1975,0 40.70361,-14.18222,0 40.74472,-14.27473,0 40.72861,-14.34306,0 40.66916,-14.36723,0 40.6375,-14.33973,0 40.65472000000001,-14.44195,0 40.6264,-14.445,0 40.62777,-14.56944,0 40.6661,-14.5375,0 40.68999,-14.43584,0 40.81166000000001,-14.40779,0 40.82804,-14.49944,0 40.76083,-14.53805,0 40.82999,-14.53028,0 40.8064,-14.61417,0 40.84472,-14.68611,0 40.84195,-14.795,0 40.72278,-14.89279,0 40.66888,-14.9075,0 40.64527,-14.85806,0 40.66305,-14.92111,0 40.74722,-14.92834,0 40.78027,-14.98667,0 40.66,-14.98721,0 40.70888000000001,-15.07834,0 40.64527,-15.08279,0 40.60167,-15.13389,0 40.52888,-15.13278,0 40.51445,-15.18723,0 40.57805,-15.20278,0 40.62722,-15.155,0 40.68472,-15.24973,0 40.57167,-15.45111,0 40.58777,-15.47973,0 40.54333,-15.53417,0 40.49666000000001,-15.52917,0 40.36028,-15.72333,0 40.17528,-15.92,0 40.06472,-15.99361,0 40.08749,-16.00944,0 40.13027,-15.9675,0 40.13582,-15.9925,0 39.98191,-16.23304,0 39.90667000000001,-16.4168,0 39.85722,-16.43055,0 39.7965,-16.46608,0 39.71716,-16.50974,0 39.28388,-16.76834,0 39.15639,-16.88083,0 39.12749,-16.87042,0 39.12917,-16.90084,0 39.08361,-16.91612,0 39.12749,-16.93305,0 39.08583,-16.99168,0 39.00154,-16.99003,0 38.81833,-17.05778,0 38.70972,-17.06361,0 38.66444,-17.02916,0 38.67889,-17.0775,0 38.60472,-17.09916,0 38.58806,-17.07723,0 38.54056,-17.12584,0 38.50638000000001,-17.10973,0 38.4975,-17.14417,0 38.15666,-17.2914,0 38.12889,-17.17834,0 38.11694,-17.20889,0 38.07889,-17.19278,0 38.13083,-17.25361,0 38.11138,-17.31139,0 37.87222,-17.37639,0 37.52949,-17.56545,0 37.52949,-19.06546,0 37.52949,-24.06546,0 37.52949,-29.06546000000001,0 37.52949,-34.06546,0 37.52949,-39.06546,0 37.52949,-44.06546000000001,0 37.52949,-49.06545000000001,0 37.52949,-52.36546,0 37.52949,-57.36545,0 37.52949,-62.36546000000001,0 37.52949,-67.36546000000001,0 37.52949,-69.90000000000001,0 37.52949,-74.90000000000001,0 37.52949,-79.90000000000001,0 37.52949,-84.89999,0 37.52949,-89.90000000000001,0 36.59039,-89.90000000000001,0 35.65129,-89.90000000000001,0 34.71218,-89.90000000000001,0 33.77307,-89.90000000000001,0 32.83397,-89.90000000000001,0 31.89487,-89.90000000000001,0 30.95576,-89.90000000000001,0 30.01666,-89.90000000000001,0 29.07755,-89.90000000000001,0 28.13845,-89.90000000000001,0 27.19934,-89.90000000000001,0 26.26024,-89.90000000000001,0 25.32114,-89.90000000000001,0 24.38203,-89.90000000000001,0 23.44293,-89.90000000000001,0 22.50382,-89.90000000000001,0 22.50382,-84.89999,0 22.50382,-83.84003000000001,0 22.50382,-78.84003,0 22.50382,-73.84003,0 22.50382,-70.54002,0 22.50382,-65.54002,0 22.50382,-60.54002000000001,0 22.50382,-55.54003,0 22.50382,-50.54002,0 22.50382,-45.54003,0 22.50382,-40.54002,0 22.50382,-35.54002000000001,0 22.50382,-34.04004,0 22.15389,-34.09251,0 22.11167,-34.14861000000001,0 22.13416,-34.19112,0 21.94972,-34.22501,0 21.90166,-34.33611,0 21.8025,-34.38305,0 21.65556,-34.39056,0 21.52832,-34.3525,0 21.29472000000001,-34.43389,0 21.06277,-34.36389,0 20.9425,-34.36028,0 20.80861000000001,-34.39723,0 20.85666000000001,-34.42083,0 20.85222,-34.46305,0 20.53444,-34.45583,0 20.46029,-34.48223,0 20.21972,-34.67973,0 20.08972,-34.72639,0 20.055,-34.7525,0 20.05722,-34.805,0 19.99861,-34.82195,0 19.85777,-34.7525,0 19.65166,-34.77584,0 19.51639,-34.67556,0 19.51416,-34.67084,0 19.38945,-34.60196,0 19.29611,-34.61972,0 19.36333,-34.53778,0 19.3575,-34.50029,0 19.28194,-34.40973,0 19.21082,-34.42861,0 19.11222,-34.40334,0 19.08334,-34.36084000000001,0 19.13722,-34.29834,0 19.08334,-34.34639,0 18.81778,-34.37778000000001,0 18.80833,-34.29723,0 18.84527,-34.245,0 18.81417,-34.19028,0 18.85527,-34.15611,0 18.79332,-34.08667,0 18.60195,-34.07362,0 18.48805,-34.09778,0 18.43583,-34.16889,0 18.47888,-34.23445000000001,0 18.46666,-34.3289,0 18.49011,-34.34823,0 18.42027,-34.32306,0 18.36305,-34.18723,0 18.30972,-34.14918,0 18.35555,-34.05834,0 18.31027,-34.0325,0 18.38,-33.91195,0 18.4825,-33.89473,0 18.44111,-33.70667,0 18.31527,-33.56834,0 18.29471,-33.46611,0 18.14805,-33.35612,0 18.09,-33.22501,0 17.96722,-33.13472,0 17.95556,-33.10305,0 18.00167,-33.09334,0 18.12306,-33.20001,0 18.03721,-33.10196,0 18.03444,-33.0325,0 17.98333,-33.00028,0 17.91389,-33.04805,0 17.89305,-33.03111,0 17.85714,-32.91527000000001,0 17.87694,-32.86084,0 17.84527,-32.82584,0 17.8675,-32.81196000000001,0 17.87666,-32.80612,0 17.9025,-32.73333,0 17.96694,-32.69862,0 18.05361,-32.77612,0 18.13175,-32.77878000000001,0 18.29222,-32.62445,0 18.335,-32.47834,0 18.31611,-32.33501,0 18.35027,-32.28806,0 18.2786,-31.89278,0 18.18139,-31.67473,0 17.90944,-31.35973,0 17.61195,-30.92972,0 17.53944,-30.7575,0 17.27889,-30.34667,0 17.08445,-29.83584000000002,0 17.00332,-29.52445,0 16.84444,-29.22139,0 16.81528,-29.085,0 16.73277,-29.01889,0 16.67083,-28.90584,0 16.60611,-28.87195,0 16.56833,-28.72389,0 16.46972,-28.63028,0 16.48959,-28.57819,0 16.44195,-28.61834,0 16.35445,-28.56278,0 16.02778,-28.24473,0 15.75277,-28.03055,0 15.67639,-27.9339,0 15.67,-27.87139000000001,0 15.52861,-27.7275,0 15.53333,-27.66139,0 15.46666,-27.54445000000001,0 15.29417,-27.32250000000001,0 15.23471,-26.96667,0 15.15777,-26.90278,0 15.08389,-26.69861,0 15.07972,-26.65,0 15.13472,-26.62889,0 15.14194,-26.67778,0 15.17111,-26.5964,0 15.08792,-26.40098,0 14.96833,-26.33972,0 14.93861,-26.13945,0 14.97805,-26.12667,0 14.98,-26.0575,0 14.90333,-25.91055,0 14.91361,-25.84472,0 14.83777,-25.76194,0 14.88222,-25.5675,0 14.80083,-25.285,0 14.85778,-25.08723,0 14.83207,-24.99944,0 14.79277,-24.94361,0 14.77695,-24.79945,0 14.59916,-24.56555,0 14.61278,-24.45639,0 14.46333,-24.10917,0 14.45611,-23.9675,0 14.50945,-23.90473,0 14.51471,-23.83583,0 14.48445,-23.75639,0 14.49611,-23.58834,0 14.43444,-23.41778,0 14.47,-23.34668,0 14.49194,-23.37584,0 14.49833,-23.33056,0 14.45388,-23.1464,0 14.41056,-22.96723,0 14.43833,-22.87778,0 14.46278,-23.00055,0 14.52584,-22.91112,0 14.52485,-22.69206,0 14.51139,-22.55279,0 14.39167,-22.29,0 14.27777,-22.11028,0 13.94916,-21.78194,0 13.97028,-21.73167,0 13.87972,-21.59944,0 13.85361,-21.49139,0 13.4,-20.85583,0 13.35277,-20.64667,0 13.25083,-20.46584,0 13.175,-20.18084,0 13.05111,-20.06778,0 12.93167,-19.79583,0 12.70722,-19.41778,0 12.67,-19.295,0 12.54222,-19.06778,0 12.46416,-19.00418,0 12.46083,-18.92805,0 12.29611,-18.7061,0 12.02083,-18.47111,0 11.9489,-18.25639,0 11.80472,-18.08195,0 11.7211,-17.655,0 11.75278,-17.25484,0 11.82584,-17.26639000000001,0 11.92861,-17.18278,0 12.08471,-17.13528,0 12.13139,-17.16112,0 12.16778,-17.14389,0 12.24611,-17.22721,0 12.42139,-17.20361,0 12.45083,-17.25417,0 12.55722,-17.24333,0 12.81611,-17.10889,0 12.88666,-17.03361,0 13.16056,-16.95278,0 13.25166,-16.98528,0 13.37333,-16.96945,0 13.47445,-17.01194,0 13.52611,-17.07778,0 13.52471,-17.12695,0 13.98556,-17.42584,0 14.17694,-17.42028,0 14.20417,-17.3831,0 18.00055,-17.38617,0 18.45154,-17.38984,0 18.63722,-17.64473,0 18.75638,-17.74778,0 18.91584,-17.81555,0 19.24222,-17.80583,0 19.34333,-17.8475,0 19.55916,-17.8675,0 19.66166,-17.83778,0 19.76195,-17.8989,0 19.81194,-17.85833,0 19.92056,-17.85723,0 20.03583,-17.90028,0 20.33806,-17.85805,0 20.5475,-17.98168,0 20.75195,-17.99611000000001,0 20.82,-18.03861,0 20.95417,-17.9675,0 21.16389,-17.93139,0 21.24194,-17.93889,0 21.37936,-18.01489,0 23.47611,-17.62584,0 23.20167,-17.47973,0 22.48778,-16.77417,0 22.13888,-16.4925,0 22.12111,-16.34112,0 22.00015,-16.17166,0 21.99834,-13.00416,0 24.02055,-13.00639,0 23.99777,-12.93723,0 23.89389,-12.83223,0 23.88611,-12.77111,0 23.9475,-12.53723,0 24.05222,-12.38528,0 24.035,-12.26417,0 23.975,-12.19917,0 23.98416,-11.88222,0 24.01555,-11.81417,0 23.96583,-11.655,0 24.03028,-11.52639,0 24.03083,-11.45306,0 24.08445,-11.40278,0 24.02527,-11.28056,0 24.0225,-10.96889,0 23.98621,-10.87046,0 23.8639,-11.02722,0 23.47639,-10.95834,0 23.36806,-10.98278,0 23.21861000000001,-11.07639,0 23.085,-11.09668,0 22.94277,-11.095,0 22.86361,-11.04917,0 22.71667,-11.09334,0 22.52972,-11.03778,0 22.48,-11.13333,0 22.25111,-11.2525,0 22.24611,-11.07305,0 22.19361,-10.99417,0 22.16361,-10.86139,0 22.31944,-10.75973,0 22.30806,-10.61278,0 22.30334,-10.53779,0 22.26416,-10.50055,0 22.31361,-10.37,0 22.20722,-10.15416,0 22.1625,-9.930555,0 22.02138,-9.848053,0 21.985,-9.755838000000001,0 21.95639,-9.763335,0 21.87472,-9.665001999999999,0 21.79056,-9.405559,0 21.85472,-9.229445999999999,0 21.84777,-8.949718000000001,0 21.94,-8.496109000000001,0 21.91611,-8.308612,0 21.87666,-8.279163000000001,0 21.85861,-8.157781,0 21.75416,-7.999444000000001,0 21.77305,-7.776109,0 21.85111,-7.591662,0 21.85388,-7.425559000000001,0 21.81555,-7.316110000000001,0 21.78295,-7.280848,0 20.53861,-7.284483,0 20.54306,-7.124445,0 20.62975,-6.913881,0 20.3325,-6.914449,0 20.31138,-6.99472,0 19.96277,-6.995556000000001,0 19.9325,-6.842503,0 19.73667,-6.575553000000002,0 19.68847,-6.187500000000002,0 19.84027,-6.031107000000001,0 20.01974,-5.942214,0 20.05305,-5.865004,0 20.11222,-5.834448,0 20.18,-5.684445000000001,0 20.14305,-5.40361,0 20.19639,-5.273613,0 20.19166,-5.159161,0 20.05445,-4.769164,0 20.06222,-4.595832,0 20.11889,-4.500837,0 20.03333,-4.300551,0 20.03889,-4.278051,0 20.12861,-4.278889,0 20.17777,-4.33278,0 20.22445,-4.335003,0 20.26277,-4.395555,0 20.3375,-4.397779,0 20.37444,-4.295278,0 20.50944,-4.254166000000001,0 20.66917,-4.151665,0 20.65611000000001,-3.307221999999999,0 20.82945,-2.848887,0 20.95417,-2.692783,0 20.95916,-2.588608,0 21.00686,-2.48896,0 21.24555,-2.512783000000001,0 21.44083,-2.480554,0 21.46972,-2.335284,0 21.82688,-2.529217,0 21.89883,-2.490597,0 21.95194,-2.415555,0 22.0486,-2.370835,0 22.13972,-2.276389,0 22.19055000000001,-2.313334,0 22.19861,-2.447784,0 22.25139,-2.466946,0 22.28722000000001,-2.445553,0 22.16638,-1.942219,0 22.185,-1.903339,0 22.50972000000001,-1.958887,0 22.62556,-1.801108,0 22.67972,-1.806661,0 22.87028,-1.88416,0 22.93666,-1.962216,0 23.03277,-1.928053,0 23.10944,-1.945837,0 23.22111,-2.085552,0 23.5,-2.009998,0 23.69389,-2.018889,0 23.69805,-1.931392,0 23.77472,-1.917505,0 23.78306,-1.806661,0 23.83777,-1.765,0 23.98527,-1.769167,0 24.03527,-1.73278,0 24.4214,-1.786798,0 24.37583,-1.538893,0 24.30388,-1.393057,0 24.10583,-1.384723,0 23.94889,-1.306666,0 23.77278,-1.179163,0 23.72972,-1.08334,0 23.52667,-0.9758345000000001,0 23.35611,-0.8072196,0 23.48555,-0.6988865,0 23.62945,-0.6358325,0 23.46778000000001,-0.4386065,0 23.26917,-0.4952795999999999,0 23.21778,-0.4249986,0 22.97027,-0.4063866,0 23.13,-0.2808366,0 23.29389,-0.3172145,0 23.41361,-0.2336045,0 22.9936,0.3750025000000001,0 22.93528,0.5708334000000001,0 22.86139,0.6711115,0 22.81472000000001,0.9963894000000001,0 22.62416,1.361663,0 22.4339,1.489715,0 22.28639,1.503332,0 22.31111,1.557503,0 22.47277,1.693889,0 22.51667,1.916387,0 22.58861,2.048606,0 22.57222000000001,2.110283,0 22.6475,2.109447,0 22.69972,2.034162,0 22.75722,2.010284,0 22.86084,2.045835,0 22.97583,2.184165,0 23.09027,2.093894,0 23.34389,2.251395000000001,0 23.65138,2.192498,0 23.6275,2.330837,0 23.4225,2.451941,0 23.35945,2.523887,0 23.12666,2.502503,0 23.03806,2.558051,0 22.96,2.672216,0 23.00389,2.757221,0 22.98472,2.857779,0 23.08195,3.147218,0 23.00111,3.161664000000001,0 22.86417000000001,3.011947999999999,0 22.81472000000001,2.996109,0 22.77972,3.063887,0 22.79639,3.259449,0 22.64333,3.325284,0 22.62361,3.388886,0 22.67834,3.453893,0 22.92861,3.548051000000001,0 23.03750000000001,3.547503,0 23.17111,3.678056000000001,0 23.36971,3.615839,0 23.48695,3.738338,0 23.515,3.825836,0 23.39943,3.835278000000001,0 23.35889,3.809448,0 23.14722,3.896108,0 23.03555,3.860559,0 22.99083,3.883337,0 22.85806,3.858604999999999,0 22.76555,3.905,0 22.75861,3.991391000000001,0 22.68722,3.998050999999999,0 22.56111,4.101389,0 22.45972,4.137497,0 22.4536,4.144580000000001,0 22.53861,4.218894,0 22.54111,4.28111,0 22.60972,4.358889,0 22.59445,4.470551,0 22.69027000000001,4.483611,0 22.77584,4.706666,0 22.85582000000001,4.706945,0 22.89584,4.821110000000001,0 22.97500000000001,4.831388,0 23.0225,4.743053,0 23.10000000000001,4.70528,0 23.1825,4.727222,0 23.26833,4.627214,0 23.38556000000001,4.587777,0 23.42639,4.591943,0 23.44166,4.653612,0 23.58445,4.734449,0 23.83027,4.82084,0 23.94222,4.810004,0 23.95417,4.873337,0 23.98195,4.855275,0 24.10555,4.920002,0 24.15194,4.900004,0 24.2275,4.960278000000001,0 24.25611,4.929443,0 24.28611,4.994999,0 24.40056,5.030001,0 24.355,5.054715,0 24.39417,5.115554,0 24.42555,5.065838,0 24.44750000000001,5.105834,0 24.52556,5.077214000000001,0 24.66111,4.964445,0 24.65056,4.92111,0 24.73445,4.910841,0 24.95888,4.987215000000001,0 25.07027,4.945832,0 25.13361,5.017778000000001,0 25.17583,4.995278,0 25.30832,5.032503,0 25.34945,5.144714,0 25.31056,5.19111,0 25.37555,5.294717,0 25.36195,5.314715000000001,0 25.53833,5.350554,0 25.54222,5.381387,0 25.74916,5.241941,0 25.79083,5.263893,0 25.82583,5.195556,0 25.87583,5.217497,0 25.9,5.166945,0 25.97333,5.231663000000001,0 26.05694,5.192504,0 26.13277,5.257215,0 26.29222,5.141394,0 26.38639,5.145552,0 26.48889,5.04639,0 26.73166,5.092784,0 26.86777,5.029163,0 26.93777,5.141106,0 27.08417,5.204159,0 27.39361,5.089167,0 27.45527,5.016392,0 27.45806,5.083613,0 27.3,5.22611,0 27.25472,5.331392,0 27.23584,5.428610000000001,0 27.28166,5.578613,0 27.23389,5.588334,0 27.24084,5.647779000000001,0 27.14278,5.771943,0 27.04917,5.789997,0 27.00111,5.862501,0 26.94972,5.846949000000001,0 26.91027,5.899446000000001,0 26.83945,5.898338,0 26.80861,5.980004,0 26.55445,6.033608,0 26.51416,6.109722,0 26.4375,6.077772,0 26.52361000000001,6.173613,0 26.52361000000001,6.221106,0 26.47611,6.224714,0 26.45944,6.294446000000001,0 26.39527,6.307785,0 26.30778000000002,6.383051,0 26.31361,6.457769000000001,0 26.28916,6.468894,0 26.40628,6.63525,0 26.10083,6.841106,0 26.04834,6.998336,0 25.81971,7.108335000000001,0 25.81389,7.147214000000001,0 25.59389,7.216388,0 25.53139,7.277786,0 25.465,7.280001000000001,0 25.36555,7.348338,0 25.33111,7.425279,0 25.20695,7.497503,0 25.18389000000001,7.583336000000002,0 25.29611,7.65,0 25.25833,7.840836,0 25.18611,7.901946,0 25.08027,7.897500000000001,0 24.97333,7.992774,0 24.94277,8.083888999999999,0 24.86555,8.165285000000001,0 24.66,8.218610999999999,0 24.54583,8.204715,0 24.46,8.271386,0 24.36111,8.247221,0 24.17722,8.316108,0 24.14027,8.375832000000001,0 24.16584,8.477783000000001,0 24.26917,8.583055999999999,0 24.23027,8.624995999999999,0 24.25333,8.691110999999999,0 23.82389,8.727785000000001,0 23.73916,8.705276,0 23.63305,8.736947000000001,0 23.51777,8.714159,0 23.49833,8.77833,0 23.58167,8.906112,0 23.58306,8.988605,0 23.56528000000001,9.005281999999999,0 23.50361,8.959716000000002,0 23.44861,9.025002000000001,0 23.49277,9.174168,0 23.55639,9.181664,0 23.65222,9.279999,0 23.66445,9.440837999999999,0 23.63138,9.449442,0 23.62333,9.535275,0 23.69471,9.671659999999999,0 23.66916000000001,9.866942,0 23.30389,10.45916,0 23.00945,10.69861,0 22.86651,10.92244,0 22.9425,11.0925,0 22.97083,11.28306,0 22.93084,11.41583,0 22.79111,11.40167,0 22.77555,11.46222,0 22.64195,11.51611,0 22.56167,11.62166,0 22.64082000000001,12.07111,0 22.56361,12.07471,0 22.47666,12.03416,0 22.50139,12.17695,0 22.43278,12.40333,0 22.38389,12.46527,0 22.46694,12.62166,0 22.22333,12.74722,0 22.14056,12.65527,0 21.95277,12.64389,0 21.82777,12.7975,0 21.94334,13.05361,0 22.02055,13.13779,0 22.15972,13.19027,0 22.29416000000001,13.35861,0 22.23056,13.47889,0 22.22472,13.57195,0 22.15361,13.63444,0 22.13861,13.72806,0 22.08444,13.77916,0 22.19833,13.9225,0 22.23833,13.96833,0 22.555,14.12555,0 22.55527,14.23194,0 22.44389,14.27222,0 22.43444,14.30972,0 22.46972,14.34472,0 22.44556,14.47972,0 22.38138,14.52306,0 22.38416,14.55416,0 22.47,14.62945,0 22.7025,14.69139,0 22.67056,14.85945,0 22.7389,14.90278,0 22.75332,14.97694,0 22.84916,15.07834,0 22.93583,15.11611,0 22.99834,15.35639,0 22.92305,15.48722,0 22.93722,15.56194,0 23.11816,15.71029,0 23.35694,15.68166,0 23.60889,15.75833,0 23.9996,15.69871,0 23.99981,18.7543,0 24.00275,19.49907,0 25.00083,19.99916,0 25.00142,21.99969,0 24.9989,26.99969000000002,0 24.99777,29.24888,0 24.8775,29.50638,0 24.88694,29.66389,0 24.8125,29.78445,0 24.83472,29.87666,0 24.70667,30.16861,0 24.78082,30.33388,0 24.92611000000001,30.50611,0 25.01916,30.7875,0 24.86945,31.15639,0 24.86833,31.375,0 25.04222,31.49972,0 25.06972,31.58167,0 25.15166,31.64694,0 25.02555,31.84139,0 25.03611,31.92445,0 24.97389,31.97,0 24.7275,32.02693,0 24.54305,31.98527,0 24.09472,32.00111,0 23.96778,32.0675,0 23.98639,32.09833,0 23.72639,32.17472,0 23.50166,32.17139,0 23.30778,32.21861,0 23.30916,32.15861,0 23.20889,32.27555,0 23.08139,32.33277,0 23.09306,32.42667,0 23.13333,32.39666,0 23.14555,32.46694000000001,0 23.09833,32.52166,0 23.12222,32.62666,0 22.50257,32.79314,0 22.50257,36.37666,0 22.3926,36.43942,0 22.33602000000001,36.51816,0 22.35234,36.64503,0 22.32878,36.7139,0 22.23996,36.84983,0 22.12033,36.90784,0 22.13302,37.00752,0 22.04059,37.01296,0 21.95903,36.9749,0 21.94816,36.8444,0 21.98484,36.77306,0 21.79948,36.68655,0 21.70063,36.72363,0 21.53381,37.02636,0 21.57297,37.21142,0 21.67267,37.33829,0 21.54217,37.54129,0 21.36454,37.6464,0 21.30836,37.62784,0 20.99752,37.69217,0 20.80903,37.64777,0 20.68738,37.72452,0 20.61781,37.81678,0 20.51087,38.09272000000001,0 20.45741,38.14892,0 20.37856,38.13986,0 20.31669,38.18789,0 20.39216,38.36551000000001,0 20.44472,38.36641,0 20.48369,38.32835,0 20.51631,38.3501,0 20.54984,38.68631000000001,0 20.63178,38.84898,0 20.72928,38.86393,0 20.73834,38.90834,0 20.49728,39.20377,0 20.2381,39.1222,0 20.13298,39.19515,0 20.07227,39.36417,0 19.87652,39.44391,0 19.80221,39.58348,0 19.36993,39.84311,0 19.37265,39.8712,0 19.57928,39.90293,0 19.95083,39.78693,0 19.98255,39.68724,0 20.01002,39.6912,0 20.19916,39.64472,0 20.26444,39.66916000000001,0 20.32083,39.7336,0 20.29138,39.80667,0 20.38138,39.78722,0 20.41445,39.82443,0 20.3161,39.99334,0 20.39416,39.99917000000001,0 20.45,40.07249,0 20.67195,40.09805,0 20.67861,40.18527,0 20.72111,40.22305,0 20.71306,40.27833,0 20.78972,40.36083,0 20.78889,40.42832,0 20.84889,40.47916,0 20.94556,40.46694,0 21.04138,40.56195,0 21.05194,40.67666000000001,0 20.96194,40.77166,0 20.98349,40.8559,0 21.34305,40.87193,0 21.41972,40.91917,0 21.6,40.87277,0 21.69445,40.93805,0 21.79222,40.93278,0 21.80416,40.97777,0 21.91195,41.04943,0 21.91611,41.09527,0 22.06667,41.15834,0 22.13111,41.12500000000001,0 22.25667,41.17139,0 22.33417,41.12722,0 22.58555,41.11944,0 22.6725,41.18777,0 22.72917,41.14471,0 22.77222,41.32444,0 22.96083,41.3586,0 22.9525,41.63444,0 23.03277,41.72834000000001,0 22.96193,41.77861,0 22.89584,41.88527,0 22.86444,42.02722,0 22.67528,42.0675,0 22.5211,42.14861,0 22.36527,42.32389,0 22.45639,42.34027,0 22.55805,42.47916,0 22.43861,42.57471000000001,0 22.46111,42.6925,0 22.50139,42.73916,0 22.44222,42.82167,0 22.525,42.87861,0 22.74556000000001,42.89361,0 22.79083,42.98527,0 22.96639,43.10167,0 23.00721,43.19611,0 22.90444000000002,43.23082,0 22.76666,43.38582,0 22.54333000000001,43.4725,0 22.49555000000001,43.57028,0 22.49555000000001,43.64555,0 22.4275,43.68861,0 22.35945,43.81694,0 22.41695,44.00695,0 22.6225,44.07083,0 22.61667,44.17278,0 22.68144,44.2247,0 22.6875,44.27777,0 22.54972,44.32306,0 22.45734,44.47435,0 22.54611,44.4875,0 22.59027,44.54916,0 22.69958,44.52252,0 22.76489000000001,44.55901,0 22.47916,44.71027,0 22.31361,44.66417,0 22.17694,44.48194000000001,0 22.14638,44.47916,0 22.08444,44.50306,0 21.99389,44.63556,0 21.64944,44.65778,0 21.58834,44.76332000000001,0 21.40040000000001,44.78082,0 21.36611,44.86444,0 21.55861,44.89611,0 21.54083,44.93861,0 21.36695,45.00832,0 21.44722000000001,45.035,0 21.46028,45.10277,0 21.51277,45.12333,0 21.51361,45.15111000000001,0 21.41666,45.21472000000001,0 21.2675,45.23278,0 21.16306,45.30972,0 21.04889,45.31639,0 20.78305,45.48472,0 20.82361,45.53249,0 20.76666,45.60999,0 20.79888,45.65667,0 20.80139,45.76416,0 20.71334,45.74389,0 20.59167,45.89417000000001,0 20.37805,45.97806,0 20.26102,46.11486,0 20.34027,46.15944,0 20.47805,46.14972,0 20.48694,46.18110999999999,0 20.62472,46.13027000000002,0 20.72056,46.16555,0 20.72056,46.19166,0 20.76305,46.19917000000001,0 20.75332,46.23888000000001,0 20.82028,46.27472,0 21.05944,46.23917,0 21.17667,46.29556,0 21.19721,46.39139,0 21.29222,46.42027000000001,0 21.26056,46.49528000000001,0 21.32666,46.61999,0 21.40500000000001,46.62111000000001,0 21.44194,46.68194,0 21.52194,46.71277000000001,0 21.48806,46.75278000000001,0 21.51972,46.81527,0 21.60527,46.85722000000001,0 21.59972000000001,46.91805000000001,0 21.67167,46.95138,0 21.69583,47.00082,0 21.65111,47.02972000000001,0 21.79084,47.12028000000001,0 21.9225,47.35443,0 22.00972,47.38083,0 22.01527000000001,47.51445,0 22.18639,47.59861000000001,0 22.27694,47.72861000000001,0 22.42139,47.74389,0 22.45444,47.79639000000001,0 22.65361,47.77638000000001,0 22.77444,47.8364,0 22.77084,47.87943,0 22.8948,47.95454,0 22.85056,47.98083,0 22.8825,48.04694,0 22.7975,48.11472,0 22.62116,48.10163,0 22.57528,48.19443,0 22.50445,48.24749000000001,0 22.37861,48.24554,0 22.31888,48.31416000000001,0 22.31944,48.36166,0 22.26028,48.36082,0 22.26889,48.40721,0 22.15145,48.41192000000001,0 22.15888,48.58027,0 22.32888,48.68694000000001,0 22.34805,48.76416,0 22.38917,48.79722,0 22.37694,48.85194,0 22.46749,48.97860000000001,0 22.53721,48.99554,0 22.55805,49.07944,0 22.59805,49.09109999999999,0 22.67417,49.04416000000001,0 22.76916,49.05332,0 22.88607,49.00292,0 22.87611,49.09,0 22.73472,49.17722000000001,0 22.70028,49.16555,0 22.76027,49.29528,0 22.73833,49.39027,0 22.69222,49.42333000000001,0 22.65611,49.51972,0 22.68607,49.5771,0 23.14611,49.98305,0 23.67694,50.32444,0 23.70388,50.37833,0 23.99166,50.40721,0 24.02611,50.49388,0 24.13277,50.54445000000001,0 24.07972,50.70499000000001,0 23.9525,50.79472,0 23.97277,50.82805000000001,0 24.11472,50.83138000000001,0 24.14471,50.85804,0 23.96638,50.94887,0 23.86277,51.09833,0 23.86694,51.14861,0 23.63611,51.30110000000001,0 23.69306,51.40471,0 23.60463,51.52769,0 23.56138,51.5425,0 23.53499,51.65359000000001,0 23.55556,51.74943,0 23.62944,51.80471,0 23.59472,51.8336,0 23.61173,51.91397,0 23.67277,51.99138,0 23.63861,52.07944,0 23.51472,52.1236,0 23.49304,52.17416000000001,0 23.20638,52.22526,0 23.1654,52.28227,0 23.39722,52.51445,0 23.59722,52.59639,0 23.75389,52.61583000000001,0 23.94083,52.73220000000001,0 23.91527,52.91888,0 23.93305,53.01417,0 23.87805000000001,53.07555,0 23.91055,53.16721,0 23.81472,53.25444,0 23.67472,53.4911,0 23.50404,53.94704,0 23.47528000000001,53.99110000000001,0 23.51777,54.03028,0 23.48444,54.13833000000001,0 23.35028000000001,54.23888000000001,0 23.14249,54.31054,0 23.06611,54.30804,0 23.06166,54.35167,0 22.98749000000001,54.38917000000001,0 22.85611,54.4086,0 22.78588,54.36384,0 22.69444,54.47332000000001,0 22.69832,54.58943000000001,0 22.74055,54.72777000000001,0 22.84249,54.77749,0 22.86916,54.82333,0 22.83499000000001,54.90166,0 22.75555,54.92055000000001,0 22.77056,54.93888,0 22.73222000000001,54.96249,0 22.64082000000001,54.96638,0 22.5992,55.07113,0 22.19722000000001,55.06166,0 22.06194,55.02749000000001,0 22.00972,55.08778,0 21.86305,55.09194,0 21.64027,55.18472,0 21.50389,55.19332,0 21.38128,55.28709,0 21.26394,55.24899,0 20.98481,55.27655,0 20.94284,55.2872,0 21.30838,59.61593000000001,0 19.36751,59.65187,0 19.33158,60.19100000000001,0 20.69736,63.31795000000001,0 24.16601,65.8115,0 23.9486,66.10138000000001,0 23.9125,66.14833,0 23.72222,66.20027,0 23.63917,66.43053999999999,0 23.72527,66.50082999999999,0 23.87861,66.55722,0 23.89,66.74303999999999,0 24.00777,66.80055,0 23.57167,67.15666,0 23.61028,67.20166,0 23.58445,67.22387000000001,0 23.60555,67.25943,0 23.77333,67.31444000000001,0 23.74472,67.36834,0 23.76778,67.41611,0 23.54917,67.45332999999999,0 23.48695,67.43804,0 23.42889,67.47584000000001,0 23.47195,67.55638,0 23.55361,67.58749,0 23.48083,67.72665000000001,0 23.48333,67.86305,0 23.64472,67.91306,0 23.65695,67.95081999999999,0 23.39445,68.0425,0 23.30722,68.13916,0 23.15138,68.12277,0 23.14222,68.23000999999999,0 22.8236,68.38805000000001,0 22.33471,68.47275999999999,0 22.05056,68.47915999999999,0 21.89722,68.56999,0 21.7575,68.57693,0 21.62306,68.64942000000001,0 21.46556,68.67805,0 21.40666,68.74361,0 21.30195,68.75555,0 21.08139,68.86665000000001,0 20.89527,68.89361,0 20.88888,68.92583000000002,0 20.93889,68.95834000000001,0 20.86666,69.00499000000001,0 20.60417,69.05305,0 20.58093,69.0603,0 20.73833,69.09636999999999,0 21.05944,69.03444,0 21.11305,69.10805000000002,0 21.04222,69.16082,0 21.02806,69.20805,0 21.055,69.22861,0 21.32083,69.32611,0 21.68195,69.28471,0 22.34667,68.8447,0 22.39833,68.71111000000001,0 22.55,68.73779,0 22.80277,68.69138,0 23.06389,68.69555,0 23.22500000000001,68.62971,0 23.69277,68.71222,0 23.83,68.82999,0 23.97639,68.83249000000001,0 24.35139,68.71053000000001,0 24.75445,68.66025999999999,0 24.89566,68.5582,0 24.95523,68.60391,0 25.10334,68.63472,0 25.15472,68.76778,0 25.21445,68.81749000000001,0 25.40695,68.88638,0 25.58555,68.87887000000001,0 25.65277,68.90639,0 25.81277,69.0175,0 25.73222,69.10916,0 25.71333,69.25526000000001,0 25.755,69.34220999999999,0 25.83361,69.38416000000001,0 25.82666,69.43638,0 25.87416,69.48636999999999,0 25.85277,69.54666,0 25.9575,69.59027,0 25.97416,69.63527000000001,0 25.94194,69.66722,0 25.97834,69.70193,0 26.15583,69.74249,0 26.37806000000001,69.85444,0 26.47056,69.93527,0 26.80658,69.95206,0 27.06889,69.90860000000001,0 27.29194,69.95,0 27.3,69.99055,0 27.53833,70.03525999999999,0 27.57333,70.06887999999999,0 27.87305,70.08804000000001,0 27.94416,70.08027,0 27.97916,70.00664999999999,0 28.09417,69.93859000000001,0 + + + 1 + + + + + +37.5369,84.90001,0 37.5369,81.47494,0 35.86762,81.47494,0 35.86762,78.71200000000002,0 37.59446,78.71200000000002,0 37.56522,73.71208,0 37.5369,68.86902000000001,0 37.16386,68.89137,0 36.23384,69.15934,0 35.31956,69.30909,0 33.48315,69.49036,0 33.13635,69.77410999999999,0 32.28514,69.92385,0 31.92259,70.01843,0 31.17443,70.36256,0 30.18603,70.73994,0 28.92806,70.93761000000001,0 28.20923,71.09936999999999,0 25.9988,71.18922000000001,0 24.72286,71.15327000000001,0 23.95011,71.17124,0 22.54661000000001,70.84514,0 22.54661000000001,75.84414,0 23.89267,75.84414,0 28.89267,75.84414,0 33.89268,75.84414,0 33.89268,76.51716999999999,0 33.89268,81.51716999999999,0 32.54661,81.51716999999999,0 27.54661,81.51716999999999,0 22.54661000000001,81.51716999999999,0 22.54661000000001,84.90001,0 22.54661000000001,89.90000000000001,0 23.54596,89.90000000000001,0 24.54531,89.90000000000001,0 25.54466,89.90000000000001,0 26.54402,89.90000000000001,0 27.54338,89.90000000000001,0 28.54273,89.90000000000001,0 29.54207,89.90000000000001,0 30.54143,89.90000000000001,0 31.54078000000001,89.90000000000001,0 32.54013,89.90000000000001,0 33.53948,89.90000000000001,0 34.53884000000001,89.90000000000001,0 35.53819,89.90000000000001,0 36.53754,89.90000000000001,0 37.5369,89.90000000000001,0 37.5369,84.90001,0 + + + 1 + + + + + GMT +03:00 + + +]]> + #khStyle0300 + + + + + +42.79083,37.38472,0 42.95554,37.32222,0 43.14971,37.37777,0 43.27916,37.3161,0 43.35666,37.33083,0 43.49471,37.24972,0 43.79110000000001,37.23194,0 43.83444,37.20499,0 43.91138,37.22415,0 44.01416,37.32054,0 44.11638,37.31638,0 44.26166,37.24194,0 44.26777,37.1675,0 44.19333,37.10027,0 44.25527,36.98666,0 44.31721,36.97055,0 44.35111,37.04833,0 44.43638000000001,37.06304,0 44.63806,37.18748,0 44.78733,37.1497,0 44.76554,37.11694,0 44.78499,37.08472,0 44.90972000000001,37.02388,0 44.88416,36.96166,0 44.90664,36.88832,0 44.84915,36.79832,0 45.01277000000001,36.7536,0 45.06666000000001,36.68054,0 45.01471000000002,36.53527,0 45.09415,36.42443,0 45.23916,36.43137,0 45.27916,36.3811,0 45.27303000000001,36.30859,0 45.30332000000001,36.28083,0 45.27582,36.25776,0 45.31971,36.23832,0 45.32027000000001,36.15609,0 45.36832,36.08637,0 45.33165,36.01416,0 45.34916,35.99055,0 45.50555000000001,36.02055,0 45.55777000000001,36.0022,0 45.66332000000001,35.94054,0 45.76583000000001,35.81194,0 46.08749,35.86639,0 46.18166000000001,35.80417,0 46.34444,35.82193,0 46.2686,35.72805,0 46.02944,35.68776,0 46.02388,35.57999,0 45.97999000000001,35.58471,0 46.0061,35.53778,0 45.99221,35.48109,0 46.14805,35.29746,0 46.11916000000001,35.24444,0 46.19305,35.21111,0 46.15331,35.1611,0 46.16638,35.10722,0 46.03944,35.05833,0 45.93378,35.09876,0 45.92193000000001,35.05443,0 45.8786,35.03527,0 45.89555,34.9636,0 45.86776,34.9036,0 45.77249,34.91444,0 45.76611,34.84583,0 45.68860000000002,34.81528,0 45.6511,34.72694,0 45.70833,34.65915,0 45.72220999999999,34.55665,0 45.61472,34.55999,0 45.52473000000001,34.6032,0 45.52555,34.50249,0 45.43555000000001,34.45528,0 45.48777000000001,34.33583,0 45.53555,34.35111,0 45.58472,34.30249,0 45.54695000000002,34.18833,0 45.56276,34.14054,0 45.46888,34.07917,0 45.40582,33.9711,0 45.50804,33.94249,0 45.68888,33.67499,0 45.75527000000001,33.63361,0 45.74694,33.59166,0 45.90659000000001,33.63655,0 45.89666,33.60139,0 45.9486,33.55665,0 45.87471,33.49166,0 46.00647000000001,33.48579,0 46.05027000000001,33.37778,0 46.17555000000001,33.2686,0 46.19944,33.19582,0 46.11138,33.11277,0 46.05138000000001,33.11832,0 46.05416000000001,33.08805,0 46.14972,33.06527,0 46.0975,33.00555,0 46.10722,32.96749,0 46.42388,32.93749,0 46.73944000000001,32.75999,0 47.1375,32.46305,0 47.27499000000001,32.49194,0 47.3561,32.47638,0 47.43416,32.39778,0 47.41332,32.34109,0 47.52887,32.22887,0 47.5075,32.15416,0 47.68971000000001,32.02388,0 47.79056000000001,31.86,0 47.86445,31.79861,0 47.69721000000001,31.40778,0 47.69388000000001,31.00111,0 48.03638,30.99749,0 48.03249,30.49138,0 48.16043,30.42708,0 48.1992,30.32573,0 48.27964000000001,30.33528,0 48.40781,30.21121,0 48.38777000000001,30.13694,0 48.45333000000001,29.99805,0 48.54556,29.96302,0 48.59428,29.94093000000001,0 49.22824000000001,30.14287,0 49.3535,30.13924,0 49.55681000000001,29.98495000000001,0 50.0717,29.82476,0 50.27212,29.1344,0 51.29651,27.95413,0 51.54147,27.7537,0 52.52133,27.48647,0 52.52133,24.12054,0 52.33083,23.99971,0 52.08055,23.95555,0 51.94305,23.99277,0 51.92555000000001,23.95471,0 51.79873,24.01633,0 51.77584000000001,24.27528,0 51.74389,24.28639,0 51.70888,24.21472,0 51.67222,24.2725,0 51.63556000000001,24.20972,0 51.62222000000001,24.34472,0 51.59138,24.37833,0 51.58423000000001,24.26046,0 51.58333,24.11666,0 52.58333,22.93889,0 55.14166,22.63333,0 55.19917000000002,22.69972,0 55.66611000000001,21.99972,0 55.00000000000001,20,0 51.99929,18.99934,0 53.11444,16.64278,0 52.94389,16.60806,0 52.52133,16.43764,0 52.52133,13.61265,0 55.86174,13.61265,0 55.86174,10.62857,0 52.52067,10.62583,0 52.52069,7.825823000000002,0 52.52073,2.825829000000001,0 52.52075,-2.174176,0 52.52079000000001,-7.17417,0 52.52081,-12.17417,0 52.52085,-17.17417,0 52.52089,-22.17417,0 52.52089,-24.17416,0 52.52093000000001,-29.17417,0 52.52097,-34.17416,0 52.521,-39.17416,0 52.52101,-41.47417,0 52.52105,-46.47416000000001,0 52.52108,-51.47417,0 52.52111,-56.47416,0 52.52115,-61.47417000000001,0 52.52118000000001,-66.47416,0 52.52121000000001,-71.47417,0 52.52125,-76.47417,0 52.52126,-78.97417,0 52.52129000000001,-83.97417000000002,0 52.52133,-88.97416,0 52.52133,-89.90000000000001,0 51.52188,-89.90000000000001,0 50.52242,-89.90000000000001,0 49.52297,-89.90000000000001,0 48.52351,-89.90000000000001,0 47.52406,-89.90000000000001,0 46.52459000000001,-89.90000000000001,0 45.52513,-89.90000000000001,0 44.52568,-89.90000000000001,0 43.52622,-89.90000000000001,0 42.52677,-89.90000000000001,0 41.52731,-89.90000000000001,0 40.52786,-89.90000000000001,0 39.5284,-89.90000000000001,0 38.52895,-89.90000000000001,0 37.52949,-89.90000000000001,0 37.52949,-84.89999,0 37.52949,-79.90000000000001,0 37.52949,-74.90000000000001,0 37.52949,-69.90000000000001,0 37.52949,-67.36546000000001,0 37.52949,-62.36546000000001,0 37.52949,-57.36545,0 37.52949,-52.36546,0 37.52949,-49.06545000000001,0 37.52949,-44.06546000000001,0 37.52949,-39.06546,0 37.52949,-34.06546,0 37.52949,-29.06546000000001,0 37.52949,-24.06546,0 37.52949,-19.06546,0 37.52949,-17.56545,0 37.87222,-17.37639,0 38.11138,-17.31139,0 38.13083,-17.25361,0 38.07889,-17.19278,0 38.11694,-17.20889,0 38.12889,-17.17834,0 38.15666,-17.2914,0 38.4975,-17.14417,0 38.50638000000001,-17.10973,0 38.54056,-17.12584,0 38.58806,-17.07723,0 38.60472,-17.09916,0 38.67889,-17.0775,0 38.66444,-17.02916,0 38.70972,-17.06361,0 38.81833,-17.05778,0 39.00154,-16.99003,0 39.08583,-16.99168,0 39.12749,-16.93305,0 39.08361,-16.91612,0 39.12917,-16.90084,0 39.12749,-16.87042,0 39.15639,-16.88083,0 39.28388,-16.76834,0 39.71716,-16.50974,0 39.7965,-16.46608,0 39.85722,-16.43055,0 39.90667000000001,-16.4168,0 39.98191,-16.23304,0 40.13582,-15.9925,0 40.13027,-15.9675,0 40.08749,-16.00944,0 40.06472,-15.99361,0 40.17528,-15.92,0 40.36028,-15.72333,0 40.49666000000001,-15.52917,0 40.54333,-15.53417,0 40.58777,-15.47973,0 40.57167,-15.45111,0 40.68472,-15.24973,0 40.62722,-15.155,0 40.57805,-15.20278,0 40.51445,-15.18723,0 40.52888,-15.13278,0 40.60167,-15.13389,0 40.64527,-15.08279,0 40.70888000000001,-15.07834,0 40.66,-14.98721,0 40.78027,-14.98667,0 40.74722,-14.92834,0 40.66305,-14.92111,0 40.64527,-14.85806,0 40.66888,-14.9075,0 40.72278,-14.89279,0 40.84195,-14.795,0 40.84472,-14.68611,0 40.8064,-14.61417,0 40.82999,-14.53028,0 40.76083,-14.53805,0 40.82804,-14.49944,0 40.81166000000001,-14.40779,0 40.68999,-14.43584,0 40.6661,-14.5375,0 40.62777,-14.56944,0 40.6264,-14.445,0 40.65472000000001,-14.44195,0 40.6375,-14.33973,0 40.66916,-14.36723,0 40.72861,-14.34306,0 40.74472,-14.27473,0 40.70361,-14.18222,0 40.64917,-14.1975,0 40.59,-14.26834,0 40.59389,-14.21084,0 40.55584,-14.23,0 40.53054,-14.17166,0 40.62277,-14.12555,0 40.59666,-14.08722,0 40.63833000000001,-14.07918,0 40.64999000000001,-14.01694,0 40.53749,-13.64528,0 40.60056,-13.57084,0 40.52584,-13.51528,0 40.59111,-13.37473,0 40.56528,-13.3664,0 40.56638,-13.285,0 40.52833,-13.3025,0 40.56806,-13.26222,0 40.56,-13.07861,0 40.59722,-12.97334,0 40.50166000000001,-12.94445,0 40.48972,-13.0275,0 40.41,-12.96194,0 40.47666,-12.88417,0 40.53416,-12.90416,0 40.55639,-12.85445,0 40.52361,-12.81778,0 40.56638,-12.81889,0 40.55889,-12.785,0 40.64194,-12.7814,0 40.61639,-12.71334,0 40.57139,-12.69806,0 40.57444,-12.64306,0 40.61845,-12.65416,0 40.63672,-12.37548,0 40.60549,-11.96501,0 40.49342,-11.91995,0 40.51611,-11.84333,0 40.47556,-11.82029,0 40.42417,-11.64973,0 40.45805,-11.60583,0 40.42471,-11.55416,0 40.47889,-11.40556,0 40.71345000000001,-11.17438,0 40.70627,-10.84757,0 40.64145,-10.69888,0 40.63945,-10.67166,0 40.57332,-10.65,0 40.55972,-10.58666,0 40.50388,-10.56444,0 40.52111,-10.48416,0 40.47277,-10.50778,0 40.47834,-10.4825,0 40.43681,-10.47817,0 40.3425,-10.56722,0 40.23611,-10.60278,0 40.00666,-10.80555,0 39.89832000000001,-10.83166,0 39.76694000000001,-10.92056,0 39.50833,-10.99528,0 39.26805,-11.16806,0 39.13444,-11.14195,0 38.89777,-11.17222,0 38.77389,-11.26166,0 38.65527,-11.2811,0 38.49171,-11.41531,0 38.37777,-11.37722,0 38.27972,-11.28834,0 38.09669,-11.25633,0 37.86861,-11.32666,0 37.80972,-11.48,0 37.81582,-11.53833,0 37.66306,-11.63833,0 37.52666,-11.6625,0 37.46204,-11.72732,0 37.34722,-11.68667,0 37.28611,-11.70418,0 37.12583,-11.67333,0 37.02584,-11.56721,0 36.90445,-11.59473,0 36.82972,-11.56861,0 36.67777,-11.71472,0 36.56195,-11.74028,0 36.49001,-11.68111,0 36.18972,-11.70666,0 36.16305,-11.57778,0 35.96556,-11.50084,0 35.94306,-11.43473,0 35.83833,-11.41472,0 35.7725,-11.47528,0 35.70389,-11.48778,0 35.6525,-11.58473,0 35.57638,-11.60667,0 35.51611,-11.61084,0 35.49416,-11.57918,0 34.96673,-11.57211,0 34.95972,-11.48666,0 34.89054,-11.38306,0 34.80555,-11.33222,0 34.76361000000001,-11.345,0 34.71027,-11.20111,0 34.615,-11.10945,0 34.59305,-11.01668,0 34.64305,-10.92194,0 34.67611000000001,-10.74306,0 34.57583,-10.51667,0 34.58277,-10.27,0 34.52389,-10.1075,0 34.5225,-10.01084,0 34.33805,-9.7875,0 34.32527,-9.73278,0 34.03944,-9.482779000000001,0 33.95721,-9.526671,0 33.95305000000001,-9.673335000000002,0 33.91961,-9.707652,0 33.75583,-9.582777999999999,0 33.68361,-9.610552,0 33.585,-9.584164,0 33.50889,-9.621945,0 33.43777,-9.615834,0 33.39388,-9.538055999999999,0 33.31444000000001,-9.485550999999999,0 33.1925,-9.509167,0 33.12583,-9.490285,0 32.99777,-9.373339,0 32.9404,-9.405072000000001,0 32.77166,-9.335557,0 32.74195,-9.281665,0 32.54527,-9.26667,0 32.42556,-9.129718000000002,0 32.24945000000001,-9.131949000000001,0 32.16,-9.063333999999999,0 32.05611,-9.040832999999999,0 31.97972,-9.071109999999999,0 31.93416,-9.018891,0 31.95611,-8.930835999999999,0 31.78553000000001,-8.885061,0 31.73861,-8.918056,0 31.68361000000001,-8.908894,0 31.57305,-8.818605,0 31.56332,-8.698608,0 31.45945,-8.629443,0 31.39806,-8.629443,0 31.37556,-8.582229999999999,0 31.28527,-8.623333000000001,0 31.22055,-8.576668,0 31.13277,-8.615557000000001,0 31.04111,-8.590284000000001,0 30.90138,-8.460001,0 30.77123,-8.192242,0 30.65445,-7.886943,0 30.45583,-7.580277000000001,0 30.40695,-7.356393,0 30.31138,-7.136947000000001,0 30.08611,-6.863607,0 29.73250000000001,-6.627501,0 29.66111,-6.455556,0 29.55029,-6.295285,0 29.49777,-5.979726000000001,0 29.63166,-5.721949,0 29.34916000000001,-4.939732,0 29.34139,-4.797783,0 29.42834,-4.552218,0 29.42334,-4.447504,0 29.75222000000001,-4.461112,0 29.81277,-4.360284,0 29.85777,-4.371111,0 30.02611,-4.269447,0 30.07277,-4.166667,0 30.17222,-4.086667,0 30.22806,-3.928051,0 30.32111,-3.78666,0 30.40084,-3.786112,0 30.39139,-3.711106000000001,0 30.44916,-3.547215000000001,0 30.66222,-3.418893999999999,0 30.66361,-3.386665,0 30.6222,-3.370122,0 30.65166,-3.332503,0 30.835,-3.256948,0 30.85222,-3.145285,0 30.79555,-3.048607,0 30.84477,-2.976012,0 30.66611,-2.976391,0 30.56333,-2.89305,0 30.485,-2.947222,0 30.4175,-2.861946999999999,0 30.44028000000001,-2.747215,0 30.52222,-2.657215,0 30.45721,-2.685835,0 30.43305,-2.647783,0 30.57332,-2.399167,0 30.6525,-2.396665000000001,0 30.69972,-2.347497,0 30.78222,-2.380554,0 30.82917,-2.357785,0 30.89417,-2.076112,0 30.80832,-1.929448,0 30.835,-1.800559,0 30.81111,-1.700551,0 30.84027,-1.670554,0 30.74888,-1.52055,0 30.73917,-1.436949,0 30.56166,-1.326943,0 30.51222,-1.164448,0 30.46945,-1.158337,0 30.45333000000001,-1.095553,0 30.48222,-1.063333,0 30.36,-1.060003,0 30.34566,-1.129168,0 30.22916,-1.266661,0 30.18472,-1.275004,0 30.17056,-1.339723,0 29.97500000000001,-1.464445,0 29.9075,-1.464166,0 29.84139,-1.320283,0 29.80306,-1.365553,0 29.73416,-1.341946,0 29.68332,-1.380556,0 29.59694,-1.385839,0 29.56639,-1.005841,0 29.57833,-0.9000005,0 29.62832,-0.8888946000000001,0 29.61833,-0.7333385,0 29.63805,-0.5933346000000001,0 29.67195,-0.5722206,0 29.64861,-0.4397225,0 29.735,-0.00083754,0 29.71666000000002,0.07221546,0 29.77332,0.1722145,0 29.81389,0.1586065,0 29.85833,0.3666595,0 29.9625,0.4872144,0 29.93833,0.6344455,0 29.96055000000001,0.8255515,0 30.14583,0.8983344000000001,0 30.21861000000001,0.9963894000000001,0 30.23611,1.134161,0 30.27805,1.168893,0 30.33221,1.151387,0 30.34861,1.196108,0 30.45611,1.212785,0 30.68806,1.493891,0 31.03666000000001,1.765556,0 31.30277,2.121389,0 31.2992,2.162853,0 31.2025,2.229164,0 31.19694,2.305835,0 31.12528,2.278053,0 31.04972,2.303891,0 31.07027,2.335005,0 30.97084,2.411945,0 30.91416,2.339442,0 30.88027,2.337497,0 30.82527,2.399165,0 30.82667,2.442221,0 30.72972,2.448053,0 30.81667,2.769165,0 30.87806000000001,2.843612,0 30.85555,2.957499,0 30.7625,3.055004,0 30.83,3.275558,0 30.935,3.411665,0 30.91721,3.521942,0 30.85882000000001,3.493394,0 30.97471,3.691943,0 31.17667000000001,3.795281,0 31.28806,3.794714,0 31.54083,3.653611999999999,0 31.57389,3.691664,0 31.70194,3.713058000000001,0 31.79945,3.825557,0 31.93332,3.687785,0 31.95111,3.593889,0 32.0639,3.59028,0 32.09361,3.532500000000001,0 32.19333,3.511394999999999,0 32.19443,3.611042,0 32.40445,3.743613,0 32.71944,3.755834,0 32.89804,3.811949,0 33.01666,3.888612,0 33.18388,3.766113,0 33.51694,3.752217,0 33.99666,4.222782,0 34.38819,4.609683,0 35.50888,4.616738,0 35.94056,4.622499,0 35.77443,4.798611,0 35.77389,5.075279,0 35.83083,5.153894000000001,0 35.79556,5.251391,0 35.83583,5.318613,0 35.68443,5.391387,0 35.605,5.373054,0 35.50472,5.431391,0 35.44749,5.429448,0 35.35638,5.350275,0 35.31138,5.366942,0 35.26972,5.441112,0 35.28999,5.507774,0 35.10388,5.632496000000001,0 35.10582,5.692779000000001,0 34.98639,5.878052000000001,0 34.98782,6.013944,0 34.86055,6.26166,0 34.85722,6.349445000000001,0 34.79777,6.444719,0 34.76277,6.605837000000002,0 34.6375,6.727221,0 34.53,6.743888,0 34.46999,6.916112,0 34.2947,6.966432000000001,0 34.2025,7.052219000000001,0 34.1825,7.163054000000001,0 34.13361,7.158887,0 34.03,7.240832,0 34.03083000000001,7.375004,0 33.89278,7.518888,0 33.78889,7.56639,0 33.71139,7.660277,0 33.55138,7.686387,0 33.47027,7.743339000000001,0 33.33944,7.713612000000001,0 33.16806,7.796393000000001,0 33.05389,7.788888,0 32.99683,7.887221000000001,0 33.03028,7.995248000000001,0 33.18643,8.136979999999999,0 33.16527,8.204715,0 33.20861,8.238049999999999,0 33.15834,8.291392999999999,0 33.16082,8.360001000000001,0 33.20444,8.433890000000002,0 33.2625,8.462502000000001,0 33.38777,8.43777,0 33.50777,8.480834,0 33.57804,8.449443000000001,0 33.62555,8.470556,0 33.69333,8.386389000000001,0 33.77599,8.364941999999999,0 33.85249,8.425836,0 33.97888,8.441387000000002,0 34.1228,8.584649000000001,0 34.13499,8.955270000000001,0 34.08583,9.553058999999999,0 34.23138000000001,10.03027,0 34.32306,10.11721,0 34.34777,10.23195,0 34.28611,10.55416,0 34.43972,10.78445,0 34.59444,10.88779,0 34.77333,10.74584,0 34.77333,10.68694,0 34.80861,10.72945,0 34.86443,10.735,0 34.86861,10.78582,0 34.97527,10.86445,0 34.97861,10.91527,0 34.93333,10.95666,0 35.0075,11.19833,0 34.96388,11.25695,0 35.09361,11.55778,0 35.05806,11.72056,0 35.09693,11.82694,0 35.23555,11.90083,0 35.27111,11.97555,0 35.34555,12.03277,0 35.3811,12.16111,0 35.43249,12.20055,0 35.64916,12.59417,0 35.69528,12.61222,0 35.69944,12.66583,0 36.00638,12.72416,0 36.1427,12.70692,0 36.16528,12.87527,0 36.13278,12.92333,0 36.16972,12.98416,0 36.15944,13.04167,0 36.24860000000001,13.36805,0 36.3975,13.56778,0 36.48693,13.83944,0 36.44639,13.95695,0 36.54282,14.26206,0 36.44329,15.14995,0 36.54277,15.23472,0 36.61054,15.43721,0 36.64777000000001,15.44971,0 36.62611,15.48945,0 36.69777,15.75305,0 36.76361,15.80806,0 36.91584,16.215,0 36.97305,16.26944,0 36.95694,16.42528,0 36.89638,16.51777,0 36.91222,16.64111,0 36.98055,16.70611,0 37.02278,16.85056,0 36.98693,16.94306,0 37.01805,17.00361,0 36.99582,17.07389,0 37.15194,17.01555,0 37.30693000000001,17.06111,0 37.42329,17.03422,0 37.52058,17.1958,0 37.5125,17.32333,0 37.73584,17.37666,0 37.81888,17.48139,0 37.91722,17.4475,0 38.05584,17.55194,0 38.09555,17.54389,0 38.11138,17.48111,0 38.13361,17.5486,0 38.18583,17.56222,0 38.25777,17.5325,0 38.27667,17.60694000000001,0 38.37029,17.66611,0 38.45861,17.87111,0 38.60069,17.99488,0 38.64405,18.06641,0 38.51692,18.23592,0 38.24853,18.39601,0 38.23912000000001,19.32831,0 37.51406,19.32831,0 37.51406,24.19318,0 37.01093,24.97079,0 36.96872,25.39901,0 36.83,25.51963,0 36.54049,25.54376,0 36.47416,25.62217,0 36.49828,26.06245,0 35.71421,27.09985,0 35.26789,27.63060000000001,0 34.88189,27.89598,0 34.6346,27.87186,0 34.49483,27.93732,0 34.48494,27.99542,0 34.5714,28.09056,0 34.62749000000001,28.17388,0 34.65972,28.16445,0 34.64528,28.19361,0 34.80778,28.53639,0 34.78054,28.67083,0 34.84254,28.88452,0 34.85527,29.03861,0 34.96139,29.36083,0 36.07,29.18889,0 36.50055,29.50277000000001,0 36.74361,29.86472,0 37.50277,30.00222000000001,0 37.6675,30.33639,0 38.00139,30.50417,0 37.00527,31.50555,0 39.005,32.00556,0 39.19675,32.15495,0 39.30111,32.23638,0 39.26,32.35555,0 39.04366,32.30405,0 38.98602,32.47767,0 39.08601,32.50151,0 38.7947,33.37759,0 41.00388,34.41944,0 41.22915,34.78832,0 41.21527,35.22471,0 41.27777,35.49554,0 41.38388,35.62527,0 41.37806,35.83861,0 41.25499000000001,36.05499,0 41.29027000000001,36.35555,0 41.40304,36.52555,0 41.83528,36.59888,0 42.37723,37.06467000000001,0 42.35562,37.10693,0 42.58165,37.15277,0 42.72666,37.35555000000001,0 42.79083,37.38472,0 + + + 1 + + + + + +52.49656000000001,84.90001,0 52.49656000000001,82.81507000000001,0 57.49650000000001,82.84008,0 62.49644000000001,82.86508000000001,0 67.49638,82.89008,0 67.53675,82.89028,0 67.53675,81.66452,0 67.53675,77.00954,0 68.50082,76.95638,0 68.47275999999999,76.92554,0 68.80942,76.86638000000002,0 68.75443,76.82222,0 68.93137,76.78276,0 68.89361,76.75749,0 68.90054000000001,76.72776,0 69.03027000000002,76.70802999999999,0 68.85637,76.65665,0 68.78471999999999,76.58778,0 68.92554,76.55888,0 68.57971000000001,76.43304999999999,0 68.40109,76.40609000000001,0 68.43941,76.38972,0 68.33333,76.33582,0 68.16943999999999,76.31805,0 68.31331,76.28333000000001,0 67.53675,76.19176,0 67.53675,73.95477,0 67.53675,71.40988,0 67.08581000000001,71.30387,0 66.91553999999999,71.29276,0 66.83665000000001,71.20972,0 66.78388,71.14221000000001,0 66.62154,71.04885,0 66.54228000000001,70.92879000000001,0 66.61275999999999,70.86773,0 66.68886999999999,70.76054000000001,0 67.10720000000001,70.83526999999999,0 67.22887,70.82555000000001,0 67.33249000000001,70.76888,0 67.33971,70.72499000000001,0 67.20889,70.52666000000001,0 67.29221,70.46998000000001,0 67.25194999999999,70.44832,0 67.26666,70.41110000000001,0 67.19971,70.39027,0 67.08862000000001,70.21623,0 67.07941,70.12733,0 66.99387,70.04886999999999,0 66.87331,70.00109999999999,0 66.76721000000001,69.75722,0 66.79192999999999,69.58028,0 66.93801000000001,69.52226,0 66.95407,69.40528000000001,0 67.16154,69.35935000000001,0 67.25494999999999,69.40298,0 67.37054999999999,69.52164999999999,0 67.38528000000001,69.61859,0 67.61304,69.59166999999999,0 67.78610000000001,69.51666,0 67.96748,69.48415,0 68.03804,69.48888,0 68.00721,69.51860000000001,0 68.10165000000001,69.54665,0 68.10942,69.38889,0 68.02139,69.3436,0 68.04749,69.28137,0 68.47331,68.97248999999999,0 68.78498,68.91081,0 69.02164000000001,68.96416000000001,0 69.03248000000001,68.94193,0 69.22026,68.95722000000001,0 68.94386,68.89803000000001,0 69.10831,68.87248,0 69.09526,68.83333,0 69.00888000000001,68.79998999999999,0 68.89776999999999,68.60748,0 68.56303,68.36942000000001,0 68.57165999999999,68.33778,0 68.64999,68.31219,0 68.56415,68.31052,0 68.43637,68.22499000000001,0 68.28333000000001,68.18498,0 68.27025999999999,68.23915,0 68.18526,68.23609999999999,0 68.20081999999999,68.29471,0 68.26054000000001,68.33472,0 68.15942,68.41137000000001,0 67.78306000000001,68.47749,0 67.70610000000001,68.51054000000001,0 67.80582,68.50082,0 67.77222,68.51776,0 67.32337,68.69279,0 67.27820000000001,68.74968,0 67.38152,68.76640999999999,0 67.39063,68.80437000000001,0 67.12005000000001,68.84113000000001,0 66.55627,68.91167,0 66.52336,68.9671,0 66.2572,69.07253,0 65.79581,69.13697000000001,0 65.38193,69.18471,0 65.04832,69.27332,0 64.91499,69.25471,0 64.94275,69.2047,0 64.83257,69.15213,0 64.51999000000001,69.01776,0 64.51749,68.98248,0 64.58389,68.96082,0 64.52139,68.90776,0 64.54998999999999,68.87053000000002,0 64.74582,68.85526,0 64.75499000000001,68.88527000000001,0 64.80415000000001,68.89194000000001,0 65.08055,68.80888,0 65.20220999999999,68.82331000000001,0 65.34860000000001,68.79192000000001,0 65.32639000000002,68.72499000000001,0 65.40498,68.73276,0 65.42941999999999,68.7,0 65.37831,68.68053999999999,0 65.52361000000001,68.58414999999999,0 65.66165,68.54694000000001,0 65.61443,68.52554000000001,0 65.60609,68.48499,0 65.48054999999999,68.43053999999999,0 65.26775000000001,68.21998000000001,0 65.33333,68.08638000000001,0 65.28498999999999,68.01194,0 65.43471,67.91804999999999,0 65.78055000000001,67.9233,0 65.91081,67.96332,0 66.08611000000001,67.93442,0 66.09248,67.89027,0 66.05443,67.88083,0 66.01805,67.79305000000001,0 66.18388,67.74832000000002,0 66.21053000000001,67.69609,0 66.10526,67.64554,0 65.99275,67.67915000000002,0 65.84054999999999,67.65192999999999,0 65.81805,67.62608,0 65.86832,67.60664,0 65.79165999999999,67.56971,0 66.0397,67.57693,0 66.10664,67.47859,0 65.96138000000001,67.39525999999999,0 65.69054,67.38665,0 65.67249,67.36609,0 65.71887,67.34054999999999,0 65.65886999999999,67.30609,0 65.18248,67.15082,0 65.22136999999999,67.07693,0 65.07055,67.03942000000001,0 65.10554000000001,67.00805000000001,0 65.10138000000001,66.89055000000001,0 64.5761,66.79915,0 64.53999,66.7272,0 64.41277,66.72387000000001,0 64.31247999999999,66.66443,0 63.98277,66.65358999999999,0 63.81554000000001,66.54721000000001,0 63.65888000000001,66.52582,0 63.53722000000001,66.46026999999999,0 63.40915,66.48109,0 63.40860000000001,66.45277,0 63.22332000000001,66.32638,0 63.30416000000001,66.2747,0 63.29056,66.23276,0 63.15388,66.26749,0 63.04694000000001,66.2247,0 62.95917000000002,66.1097,0 62.86166000000001,66.07720999999999,0 62.81750000000001,66.01194,0 62.88833000000002,65.97998,0 62.79777000000001,65.93109,0 62.86111,65.87804,0 62.73193000000001,65.85776,0 62.69388,65.86331,0 62.68193999999999,65.86304,0 62.11306,65.72083000000001,0 61.87027000000001,65.70222,0 61.68694,65.57388,0 61.58222000000001,65.55165,0 61.41555000000002,65.39639,0 61.24917,65.31887999999999,0 61.3336,65.28888000000001,0 61.23944,65.18552,0 61.11166,65.17221000000001,0 60.96277000000001,65.04165999999999,0 60.81194,65.04859999999999,0 60.63138,64.88361,0 60.59638,64.94193,0 60.42972000000001,65.00082,0 60.42749,65.05193,0 60.15804000000001,65.06721,0 59.65416,64.78333000000001,0 59.63805000000001,64.72387000000001,0 59.70249,64.65166000000001,0 59.61361,64.62276,0 59.47970999999999,64.48193000000001,0 59.60470999999999,64.46026999999999,0 59.6361,64.33749,0 59.57943,64.27943000000001,0 59.58805,64.23248,0 59.73388000000001,64.15331999999999,0 59.85972,64.1375,0 59.77055,63.99942999999999,0 59.56583000000001,63.91915,0 59.57249000000002,63.83666,0 59.51389,63.77999000000001,0 59.47776000000001,63.56805,0 59.31722000000001,63.39888000000001,0 59.35222,63.36306,0 59.28249,63.33278,0 59.3386,63.28999000000001,0 59.25889,63.2011,0 59.30277,63.12638,0 59.22221,63.07388,0 59.27665,62.96666,0 59.42471000000001,62.94415,0 59.48721000000001,62.89778,0 59.46083000000002,62.77917000000002,0 59.39138,62.72971,0 59.50972000000001,62.54722,0 59.65055,62.51721,0 59.60889,62.45333000000001,0 59.58472,62.41499,0 59.60028,62.36694,0 59.51527,62.31721000000002,0 59.40444,62.14222000000001,0 59.48555,61.98805,0 59.34137000000001,61.85695000000001,0 59.33915,61.80222,0 59.39694999999999,61.76110000000001,0 59.34887000000001,61.68221000000001,0 59.14333000000001,61.63305,0 59.01082000000001,61.54472,0 58.94054000000001,61.55972,0 58.80972,61.50556,0 57.18,61.51194,0 57.09666,61.48525999999999,0 56.67556,61.52777,0 56.60083,61.50249,0 56.54527,61.42888,0 56.3886,61.43943000000001,0 56.31638000000001,61.32527,0 56.34805,61.29388,0 56.29028000000001,61.20304000000001,0 55.82858,61.25057,0 55.72323,61.08145,0 55.27921000000001,61.12959000000002,0 55.19747,61.0041,0 55.06107,61.01941,0 54.97971,60.86388,0 53.86555,60.98749,0 53.80915000000001,60.84777,0 53.57389,60.86500000000001,0 53.33944000000001,60.89388,0 53.38499000000001,61.03389,0 52.87666,61.09388000000001,0 52.79499,60.94433,0 52.42917000000001,60.98137,0 52.34333,60.835,0 51.88777,60.87666,0 51.77333,60.59693999999999,0 52.15471000000001,60.54555000000001,0 52.12499,60.47027000000001,0 52.34304000000001,60.44638,0 52.34777,60.37330999999999,0 52.29815,60.24171,0 52.08278,60.31694000000002,0 52.0089,60.30360000000002,0 51.89999,60.24444,0 51.8,60.11083,0 51.53221000000001,59.94721,0 51.41332000000001,59.94165,0 51.34388,60.01833,0 51.07110999999999,60.06166000000001,0 50.82861000000001,59.86277000000001,0 50.40331000000001,59.84444,0 50.27887,59.80693000000002,0 50.2375,59.75277,0 49.99665,59.77887000000001,0 49.95193,59.74722000000001,0 50.05638,59.6875,0 49.85361,59.66361,0 49.83278,59.63693,0 49.78722000000001,59.50054999999999,0 49.82888000000001,59.48110000000001,0 49.79554,59.38388,0 49.82416,59.37054,0 49.79554,59.22221,0 49.59333,59.21776,0 49.50861,59.24610000000001,0 49.545,59.39305000000001,0 49.34194,59.41915000000001,0 49.3086,59.46694,0 49.14778,59.50889,0 49.03416,59.48444,0 49.08554,59.65554,0 48.50999,59.70388,0 48.45917000000001,60.19415,0 48.70499,60.30471,0 48.76305,60.365,0 48.67582000000001,60.40638000000001,0 48.54137999999999,60.41109,0 48.61777000000001,60.43333000000001,0 48.50416000000001,60.48276,0 48.51111000000001,60.51194,0 48.48110000000001,60.52499,0 48.53999,60.55915,0 48.53917,60.59999000000001,0 48.41924,60.85386000000001,0 47.9875,60.88665000000001,0 47.95999,61.00972,0 47.88139,60.99833,0 47.59415,61.05888,0 47.22833000000001,61.06444,0 47.19720000000002,61.05999,0 47.19138,60.99611000000002,0 47.10749,60.96194000000001,0 47.08027000000001,60.86221,0 47.04314000000001,60.85386000000001,0 47.08721000000001,60.82027,0 46.95277,60.65527,0 47.02388000000001,60.64695,0 47.01749,60.60249000000001,0 47.06166,60.57667000000001,0 46.85666,60.51527,0 46.87805,60.48166000000001,0 46.80444,60.38750000000001,0 46.83193000000001,60.37972,0 46.81305,60.32277,0 46.74499,60.25639000000001,0 46.43083000000001,60.27388,0 46.295,60.24249,0 46.35305,60.20972,0 46.36416000000001,60.1211,0 46.60609,60.06527,0 46.83138,60.07306000000001,0 46.89638,60.12583000000001,0 47.03694000000001,60.11832,0 46.92083000000001,59.84665,0 46.92305000000001,59.78444,0 47.12305,59.76139000000001,0 47.14305,59.71333,0 47.11351,59.61137999999999,0 47.05638,59.37860000000001,0 47.25249,59.35555,0 47.22332,59.2261,0 47.39443,59.14722,0 47.445,59.1675,0 47.45139,59.12694000000001,0 47.57639,59.06028,0 47.55082,58.9886,0 47.61166,58.91499,0 47.46777000000001,58.88416,0 47.45305000000001,58.92249,0 47.30721,58.91666,0 47.28111000000001,58.90222000000001,0 47.30388,58.85722,0 47.28028,58.81945,0 47.325,58.80082,0 47.265,58.75416,0 47.11333,58.77249,0 47.00417000000001,58.69583,0 47.0061,58.62249,0 46.58416,58.55804000000001,0 46.59026999999999,58.51832000000001,0 46.54972000000001,58.47665,0 46.59166000000001,58.43194,0 46.41137,58.36388,0 46.48109,58.33222,0 46.41026999999999,58.30805,0 46.41499000000001,58.21054000000001,0 46.35527,58.18721,0 46.30972000000001,58.11054,0 46.34132,58.07474,0 46.44972,58.01749,0 46.52304000000001,58.03889,0 47.38666,58.02332000000001,0 47.45610000000001,57.98555000000001,0 47.70083,57.96361,0 47.77027,57.90028,0 47.5611,57.80249,0 47.55082,57.765,0 47.58027000000001,57.74638,0 47.52859,57.70304,0 47.54888,57.66361,0 47.52638000000001,57.58416,0 47.48666,57.58472,0 47.4711,57.52859999999999,0 47.25027,57.57083,0 47.03082,57.49304,0 46.74443,57.52333,0 46.79722000000001,57.45666,0 46.70471000000001,57.42555000000001,0 46.68970000000001,57.39083,0 46.75388,57.37999,0 46.67611000000001,57.35,0 46.72055,57.29445,0 46.78972,57.28944,0 46.80888,57.23583,0 46.85194000000001,57.23444000000001,0 46.83443000000001,57.19971,0 46.72638000000001,57.20000000000001,0 46.76528,57.14388,0 46.76806,57.02971,0 46.70805,57.0164,0 46.75388,56.97417,0 46.71510000000001,56.96634000000001,0 46.74471,56.95471,0 46.71583,56.93721,0 46.94471,56.94833000000001,0 47.13277,56.91693000000001,0 47.18194,56.84805,0 47.12277,56.83749,0 47.17083000000001,56.80860000000001,0 47.42444,56.88082,0 47.50249,56.85139,0 47.51139,56.90666,0 47.61721,56.9761,0 47.68916,57.01250000000001,0 47.76971000000001,57.00972000000001,0 47.7336,57.05527000000001,0 47.785,57.05721,0 47.83083000000001,57.00416000000001,0 47.91666,56.97665000000001,0 47.93111,57.00944,0 47.97193,56.97387000000001,0 47.98694,57.01444999999999,0 48.13916,56.99833,0 48.2086,57.02722,0 48.16304,57.07972000000002,0 48.24888000000001,57.10666000000001,0 48.19222000000001,57.12471,0 48.30777000000001,57.16860000000001,0 48.4511,57.12054,0 48.56945,57.17249000000001,0 48.83555,57.16444,0 48.86639,57.12249,0 48.84583,57.0886,0 48.95471,57.08554,0 48.99804,57.11888,0 49.01194,57.19332,0 49.04610000000001,57.2011,0 49.00639000000001,57.23332000000001,0 49.01611,57.28305,0 49.18333000000001,57.33139,0 49.22805,57.28889,0 49.14361,57.15972,0 49.23138000000001,57.1311,0 49.26832,57.04361,0 49.41915,57.02194,0 49.41249000000001,57.05305000000001,0 49.71194,57.07361000000001,0 49.72499,56.99110000000001,0 49.76194,56.96500000000001,0 49.71582999999999,56.93361,0 49.75722,56.91415000000001,0 49.73443,56.89667000000001,0 50.01445,56.86721000000001,0 50.07082000000001,56.83082,0 50.0611,56.79361,0 50.10167000000001,56.79416,0 50.07221000000001,56.62266,0 50.16194000000001,56.615,0 50.22138000000001,56.66082,0 50.29834,56.63999,0 50.32306,56.65444,0 50.30304,56.67638,0 50.34777,56.67361,0 50.41361000000001,56.62804,0 50.42333,56.58526,0 50.49333,56.61639,0 50.45,56.54472,0 50.56971000000001,56.40250000000001,0 50.63110000000001,56.40526,0 50.58638,56.35443,0 50.73304,56.32999000000002,0 50.78527,56.35638,0 50.7625,56.39944,0 50.785,56.41555,0 50.85139000000001,56.39027000000001,0 50.87389,56.32666,0 50.90693,56.31583,0 50.90165,56.27944000000002,0 50.86111,56.27804,0 50.83942,56.2411,0 51.07639,56.12498999999999,0 51.1075,56.15139000000001,0 51.20499,56.13943,0 51.22304000000001,56.09916,0 51.3147,56.06972,0 51.36194,56.13054000000001,0 51.43667,56.14444000000001,0 51.6536,56.13444000000001,0 51.48999000000001,56.07888000000001,0 51.39721,55.9922,0 51.43027000000001,55.92722,0 51.64277,55.96054,0 51.68943,55.93278,0 51.72971,55.95971,0 51.78889,55.88388000000001,0 51.96083,55.97915,0 52.03749000000001,55.95916,0 52.05638,55.895,0 52.16916000000001,55.89306,0 52.25166,55.95805000000001,0 52.20417,56.00443000000001,0 52.2461,56.06694,0 52.18693,56.05527,0 52.20471000000001,56.08416,0 52.43665,56.02833,0 52.48471,56.03694000000002,0 52.44666,56.06361,0 52.46776,56.07749,0 52.66221,56.01554,0 52.72887,56.06471000000001,0 52.70054,56.14138000000001,0 52.83694000000001,56.09222000000001,0 52.85443,56.12666,0 52.81055,56.13388000000001,0 52.84554,56.15721,0 52.80582,56.18194,0 52.81694,56.20249,0 52.57583,56.22748000000001,0 52.55833,56.2625,0 52.63638,56.28638,0 52.74055,56.37471000000001,0 52.72277,56.39138,0 52.82665999999999,56.38888000000002,0 52.95278,56.44165000000002,0 52.95165999999999,56.46916,0 52.82555,56.52193,0 52.91778000000001,56.50111,0 52.94444,56.54472,0 53.09528,56.52694000000001,0 52.9386,56.36694,0 52.98054,56.3475,0 52.94138,56.30639,0 52.98221,56.28082,0 52.95610000000001,56.25166,0 53.00305,56.22165,0 52.99416,56.18833,0 53.04193,56.20805000000001,0 53.06888,56.18249,0 53.04749,56.13528,0 53.14666,56.16220000000001,0 53.26111,56.08554,0 53.34499,56.08471,0 53.34249,56.14749,0 53.2589,56.25471000000001,0 53.41666,56.27833,0 53.55610000000001,56.24388,0 53.54499,56.14083000000001,0 53.47470000000001,56.12110000000001,0 53.37888,55.98972,0 53.28694999999999,55.93555,0 53.1825,55.92389000000001,0 53.29725,55.85252,0 53.63842,55.91552,0 53.99722,55.85082,0 53.97027,55.78249000000002,0 54.03820000000001,55.80095000000001,0 54.0261,55.75666,0 54.09528000000001,55.77592,0 54.24194000000001,55.69137000000001,0 54.17833,55.62276000000001,0 53.99638000000001,55.54972000000002,0 53.99694,55.50027,0 53.93333000000001,55.4586,0 53.89833000000002,55.38166,0 53.70916,55.3336,0 53.59999,55.26027,0 53.58611000000001,55.20776999999999,0 53.39944000000001,55.22110000000001,0 53.33805000000001,55.19499,0 53.33443,55.16249000000001,0 53.13888000000001,55.14388,0 53.14138000000001,55.09389,0 53.26834,55.05331,0 53.26694000000001,55.01028000000001,0 53.40639000000001,54.99722,0 53.51412,54.88120000000001,0 53.64249000000002,54.90139,0 53.57695,54.81499,0 53.60777,54.81249,0 53.57888,54.74888,0 53.6086,54.71138,0 53.41055,54.55750000000001,0 53.42194,54.48666000000001,0 53.34444,54.38694000000001,0 53.36138,54.32888,0 53.43444,54.26915,0 53.41305,54.22222,0 53.47020000000001,54.0452,0 53.41082,54.02694,0 53.37194,53.96749,0 53.285,54.02750000000001,0 53.27221999999999,54.06999,0 53.19444,54.09832,0 53.06054,54.06999,0 53.09137,54.12054,0 53.03361000000001,54.12749000000001,0 52.93694,54.2136,0 53.11582,54.24944000000001,0 53.04749,54.34167000000002,0 53.0014,54.31249,0 53.02944000000001,54.28944,0 53.01361,54.26805,0 52.92916,54.26805,0 52.88166,54.27777,0 52.93249,54.28804000000001,0 52.92304,54.31388,0 52.68775999999999,54.36111,0 52.62194,54.3411,0 52.53745,54.37707,0 52.49416,54.39999,0 52.50306000000001,54.45193,0 52.43943,54.47887,0 52.37915,54.41444,0 52.35054,54.42333,0 52.36388,54.45916,0 52.20972,54.44304,0 52.2,54.40639,0 52.105,54.40054000000001,0 52.12028000000001,54.35111,0 52.08526000000001,54.33942,0 52.01999,54.43665,0 51.93277,54.43638,0 51.92722000000001,54.53611,0 51.67972,54.56166000000001,0 51.52333,54.64638,0 51.49388,54.59527,0 51.39388,54.59304000000001,0 51.39554,54.67722000000001,0 51.28139000000002,54.63694,0 51.18111,54.64638,0 51.09361,54.54861,0 51.00972000000001,54.55165,0 50.99277,54.49916000000001,0 51.01721,54.47916,0 50.93610000000001,54.33999,0 50.70305000000001,54.42833,0 50.5186,54.32639000000001,0 50.47165,54.42333,0 50.42944,54.42749000000001,0 50.38889,54.48888000000001,0 50.27665,54.44054,0 50.22527,54.50361000000001,0 50.07688,54.51667000000001,0 50.12555,54.48194,0 50.11721,54.43027000000001,0 50.21111000000001,54.42167,0 50.19944,54.38416,0 50.26222,54.28944,0 50.20304000000002,54.14027,0 50.22554,54.07916,0 50.19749,54.03722,0 49.97443,53.96138,0 49.95361,53.90527,0 50.05305,53.86860000000001,0 50.03778000000001,53.82527000000001,0 49.85722000000001,53.8336,0 49.83805,53.89083000000001,0 49.61805,53.81139,0 49.60916000000001,53.855,0 49.42249000000001,53.87082000000001,0 49.34304000000001,53.87,0 49.31694,53.83333,0 49.03694,53.85944,0 48.86333000000001,53.71277,0 48.47222,53.77083,0 48.51305,53.69638000000001,0 48.60333,53.66945,0 48.4461,53.6661,0 48.42695,53.62915000000002,0 48.35638,53.6711,0 48.31416000000001,53.65583000000002,0 48.355,53.60167000000001,0 48.44083000000001,53.58138000000001,0 48.37666000000001,53.54277,0 48.37833000000001,53.47137,0 48.23611,53.45888999999999,0 48.2225,53.42443,0 48.16638,53.48249,0 48.04853,53.47771,0 48.00360000000001,53.40666,0 47.94194,53.37583,0 48.09332,53.26194,0 48.13138000000001,53.16888,0 48.21221,53.14582999999999,0 48.14472000000001,53.05916,0 48.2236,52.99722,0 48.26944000000001,53.05777,0 48.36888,53.06638,0 48.31833,52.98555,0 48.51057,52.97799,0 48.57805,52.93554,0 48.58694,52.8686,0 48.43007000000001,52.78054,0 48.28889,52.81082,0 48.10944,52.80138,0 47.98499,52.74722,0 48.08749,52.73193,0 48.07861000000001,52.70555,0 47.92527,52.6661,0 47.90027,52.72221,0 47.85971,52.73166,0 47.77304,52.67972000000001,0 47.78111000000001,52.62915,0 47.72470000000001,52.57916,0 47.55638,52.61833,0 47.43831999999999,52.56722,0 47.20610000000001,52.56666,0 47.1536,52.60999,0 47.0686,52.56638,0 46.9461,52.63832000000001,0 46.83077,52.6164,0 46.61694000000001,52.66109,0 46.61388000000002,52.72748,0 46.58027,52.73249,0 46.39999,52.67249,0 46.29834,52.68055,0 46.2761,52.61805,0 46.15331,52.60194000000001,0 46.14582,52.54972000000001,0 46.08749,52.56388,0 46.06444,52.52693000000001,0 45.97137000000001,52.49583,0 46.01639000000001,52.45776999999999,0 45.97526000000001,52.4361,0 45.98082000000001,52.40721000000001,0 45.71805,52.45889,0 45.73554000000001,52.52583,0 45.64111000000001,52.52028,0 45.52693,52.48166,0 45.51639000000001,52.43444,0 45.44194,52.40055,0 45.11139,52.41109,0 45.06916,52.37778000000001,0 45.10139000000001,52.33332000000001,0 45.05054000000001,52.31721,0 44.97332,52.37332,0 44.90554,52.37665000000001,0 44.86749,52.44666,0 44.66489,52.47935,0 44.54805,52.55249,0 44.49361,52.52665,0 44.53943,52.48638,0 44.51445,52.45916,0 44.54361,52.42944,0 44.41082,52.41305000000001,0 44.38916,52.36833000000001,0 44.33332,52.34805000000001,0 44.34638,52.3161,0 44.05526,52.34610000000001,0 43.77749,52.43472,0 43.34055,52.39111,0 43.3086,52.44555,0 43.19027,52.46666000000001,0 43.12276,52.40192,0 43.0798,52.40288,0 43.00916000000001,52.36388,0 42.92527,52.37500000000001,0 42.92221,52.30526,0 42.75333,52.18581,0 42.74749,52.08027,0 42.8111,52.01027,0 42.70305,51.98194,0 42.67638,51.83972,0 42.48666000000001,51.69305,0 42.51471,51.62388,0 42.48951,51.60789,0 42.86166,51.38166,0 42.83942,51.31666000000001,0 42.91221,51.24083,0 42.87309,51.23142,0 42.68444,51.23693000000001,0 42.56722,51.16526000000001,0 42.41888,51.17222,0 42.2672,51.13166,0 42.09888,51.14750000000001,0 41.96333,51.2086,0 41.8686,51.19388000000001,0 41.7286,51.01721,0 41.41193,50.90359,0 41.37777000000001,50.87666000000001,0 41.38277,50.83027,0 41.15639,50.77638,0 41.32777,50.71916,0 41.40749,50.61944,0 41.52833,50.60166,0 41.52416,50.56860000000001,0 41.45471,50.55138,0 41.4175,50.50527,0 41.5125,50.3811,0 41.36221,50.22629,0 41.4822,50.09027,0 41.5911,50.05525999999999,0 41.58277,50.005,0 41.61361000000001,49.96361,0 41.8661,49.90777000000001,0 42.17749,49.69083,0 42.11277,49.52583,0 42.0736,49.51056,0 42.04972,49.40499000000001,0 42.09693,49.29222,0 42.03194,49.26639999999999,0 42.07694,49.19971,0 42.06443,49.15388,0 42.34443,49.15249,0 42.39277,49.04972,0 42.48388,49.04472,0 42.66361,48.96777,0 42.66249,48.8886,0 42.74610000000001,48.80638,0 42.65027,48.70527,0 42.70166,48.61805,0 42.63054,48.54694,0 42.27665,48.49860000000001,0 42.07249,48.40889,0 42.15193,48.28221,0 42.04499,48.25916000000001,0 42.10278,48.16389000000002,0 42.05111,48.12972,0 42.02193,48.03027,0 42.27555,48.01305000000001,0 42.32638,48.04777,0 42.4986,48.01056,0 42.7286,47.85556,0 42.93971,47.51361,0 42.98776,47.51388000000001,0 43.05915,47.57639,0 43.13554000000001,47.57556,0 43.15998,47.48249,0 43.22499,47.44972,0 43.55833000000001,47.48972,0 43.65331,47.44222,0 43.73177,47.47655000000001,0 43.62944,47.55916,0 43.70583,47.68444,0 43.84138,47.7575,0 43.97499,47.76639,0 44.04443,47.82415,0 44.01582,47.86388,0 44.06582000000001,47.9108,0 44.38915,47.86832,0 44.3861,47.91415,0 44.46776,47.9786,0 44.46637,48.04084000000001,0 44.32305,48.05999000000001,0 44.30944,48.25999000000001,0 44.53582,48.20638000000002,0 44.54971,48.05833,0 44.61221,48.05665,0 44.64415000000001,48.09166,0 44.80053,48.05249000000001,0 44.94221,48.14388000000002,0 44.92471,48.19916000000001,0 44.95666,48.21194,0 45.12749000000001,48.11306,0 45.30082000000001,48.09768,0 45.39499,48.09833,0 45.55193000000001,47.99193,0 45.7136,48.03750000000002,0 45.74166,48.00222,0 45.70664000000001,47.93193000000001,0 45.71970000000001,47.86528,0 45.78556,47.81305,0 45.82916,47.72304,0 45.90720000000001,47.7122,0 45.93804,47.62887,0 46.08887000000001,47.51692,0 46.29666000000001,47.43664,0 46.3886,47.44443,0 46.68081,47.63248,0 46.83055,47.5761,0 46.52387000000001,47.43499,0 46.51554,47.39193000000001,0 46.79639,46.99638,0 46.92777,46.97832,0 46.99082,46.85082,0 47.12721,46.85833000000001,0 47.22776,46.74081,0 47.14026,46.69638,0 47.1497,46.66832,0 46.99805,46.63361,0 46.91332,46.55526,0 46.94916,46.53943000000001,0 46.96194,46.4286,0 46.66027,46.42804,0 46.47833,46.27555,0 46.86665,46.24805000000001,0 46.8336,46.07277,0 47.09082000000002,46.1186,0 47.175,46.10556,0 47.10915,46.00777,0 47.0411,45.96970000000001,0 46.89304000000001,45.57472000000001,0 47.29361000000001,45.6436,0 47.35971,45.68942,0 47.46748,45.63943,0 47.48619,45.57145,0 47.54332,45.50527000000001,0 47.50166,45.47998,0 47.48611,45.41860000000001,0 47.37803,45.41137000000001,0 47.46277000000001,45.38081,0 47.38554000000001,45.29527,0 47.3761,45.18193000000001,0 47.29193,45.18082,0 47.19915000000001,44.96859,0 47.14861,44.92694,0 47.09722000000001,44.94971,0 47.11666,44.86221,0 47.07555,44.78277,0 46.99165,44.92192000000001,0 47.00944,44.82111,0 46.95943,44.76389,0 46.71249,44.64777,0 46.72444,44.54472,0 46.67971,44.52304,0 46.7,44.44276,0 46.76027,44.39192,0 47.01222,44.36083,0 47.09248,44.24027,0 47.1586,44.20054,0 47.20554,44.21859,0 47.47952,44.4864,0 47.5322,44.50008,0 47.80731,43.98692,0 47.69832000000001,43.86887000000001,0 47.58498,43.72221,0 47.48721,43.45638,0 47.48832,43.29361000000001,0 47.57249000000001,43.33054,0 47.58833000000001,43.29695,0 47.48333000000002,43.20777,0 47.46221,43.01915,0 47.69694000000001,42.86638,0 47.73832,42.63388,0 47.85942,42.59389,0 47.94498,42.46249,0 48.11776,42.32638,0 48.3036,42.09748,0 48.38665,41.92638,0 48.54472,41.88028,0 48.58395000000001,41.83577,0 48.47137000000001,41.72359000000001,0 48.3997,41.58914,0 48.23137000000001,41.50249,0 48.07444000000001,41.46776,0 48.02276,41.36193,0 47.96249,41.35943,0 47.90831000000001,41.29084,0 47.91999,41.22637,0 47.76693,41.19609000000001,0 47.65972000000001,41.23554,0 47.57166,41.2111,0 47.52193,41.25416,0 47.28555000000001,41.31219,0 47.25888000000001,41.42471,0 47.16054,41.5611,0 47.04305000000001,41.55833,0 46.92554,41.71776,0 46.77081,41.79666,0 46.76081,41.86388,0 46.59166000000001,41.79221,0 46.56667000000001,41.80777,0 46.56833,41.88248,0 46.45176000000001,41.89705,0 46.39415,41.94054,0 46.31998,41.93888,0 46.23998,42.00139,0 46.10389,41.99415,0 46.07805,42.03416,0 46.01082,42.04305,0 45.96053,42.02387,0 45.91028,42.105,0 45.64748,42.20471,0 45.76028,42.47791,0 45.55277,42.55026,0 45.35167,42.52943,0 45.17137000000001,42.70083,0 45.05304,42.69415,0 44.92749,42.76193,0 44.855,42.74331,0 44.80388000000001,42.6172,0 44.68443,42.73943000000001,0 44.54972,42.75944000000001,0 44.28665,42.71278,0 44.22082000000001,42.63693,0 44.0536,42.61804,0 43.9611,42.55778,0 43.73555,42.63916,0 43.8361,42.72776,0 43.82721,42.7514,0 43.67083,42.7911,0 43.56055,42.86082,0 43.20083,42.93637,0 43.01082,43.05666,0 43.0211,43.10444,0 42.85722000000001,43.17748,0 42.7011,43.1825,0 42.62583,43.14305,0 42.41526,43.23916,0 42.18111,43.23555,0 42.05777,43.18610000000001,0 41.93971,43.21749,0 41.58971,43.22275,0 41.39332,43.3461,0 41.29554,43.33610000000001,0 41.16805,43.38722,0 41.04416000000001,43.37498000000001,0 40.68471,43.54583,0 40.54306,43.50861,0 40.25339,43.58252,0 40.12665,43.57222,0 40.0775,43.54694,0 40.00297,43.37926,0 40.22471,43.31443,0 40.32638,43.14192,0 40.38472,43.16555,0 40.58665,43.0825,0 40.8436,43.06777,0 40.93277,42.97222,0 41.03276000000001,42.97304,0 41.15583,42.78917,0 41.22082,42.79861,0 41.46137,42.70804,0 41.55331,42.38581000000001,0 41.63277,42.27194,0 41.66166,42.12109,0 41.7625,41.99221,0 41.77472,41.88563,0 41.73026000000001,41.72555,0 41.53155,41.52388,0 41.3875,41.37304000000001,0 40.93111,41.18748,0 40.83305,41.19498,0 40.54332,41.02916,0 40.45804,41.0425,0 40.12859,40.91639,0 39.99776,40.97582,0 39.87721,40.95389,0 39.73333,41.01388000000001,0 39.64611,41.00166,0 39.4211,41.10944,0 39.2786,41.04972,0 39.16304,41.0825,0 38.81611,41.00999,0 38.70999,40.95,0 38.62554,40.97305,0 38.5236,40.92083,0 38.36139,40.90943000000001,0 38.2775,40.95056,0 37.89249,40.98277,0 37.79361000000001,41.04554,0 37.78944,41.11555,0 37.70638,41.11222,0 37.68748,41.13722,0 37.60777,41.04777,0 37.53721,41.02805,0 37.29499,41.14389,0 37.15228,41.14491,0 37.04332,41.17555000000001,0 37.02333,41.26749,0 36.85693,41.34721,0 36.61834,41.37498,0 36.5541,41.28566,0 36.53862,44.90856,0 36.54507,45.17941,0 36.67405,45.41802,0 37.64138,46.73358000000001,0 38.23582,47.10943,0 38.2161,47.19471,0 38.31916,47.27833,0 38.20804,47.31916,0 38.28555,47.3961,0 38.28083,47.5061,0 38.33942,47.60139000000001,0 38.60582,47.63803,0 38.69137,47.69415000000002,0 38.75055,47.68387000000001,0 38.83832,47.85278000000001,0 39.03817,47.8658,0 39.13638,47.83388999999999,0 39.34526,47.85304,0 39.72388,47.81833,0 39.79639,47.85722,0 39.81998,47.9697,0 39.77609,48.02639000000001,0 39.86859,48.04084000000001,0 39.84832,48.11306,0 39.93277,48.21332,0 40.00249,48.24304000000001,0 40.0125,48.28472,0 39.91277,48.27777,0 39.83805,48.3125,0 39.92152,48.36839,0 39.83833,48.48388000000001,0 39.86694,48.50027000000001,0 39.85333,48.55471000000001,0 39.66966,48.58764000000002,0 39.65693,48.61667,0 39.72721,48.76221,0 39.80389,48.81777000000001,0 39.98526,48.79139,0 40.07667,48.87500000000001,0 40.03027,48.8961,0 39.97055,48.85999000000001,0 39.76721,48.90388,0 39.69444,48.97305,0 39.69915,49.02277,0 39.93888,49.05499,0 39.96638,49.12388,0 40.16694,49.2486,0 40.17972000000001,49.32695,0 40.05305,49.47833000000001,0 40.07444,49.52694,0 40.14111,49.55916,0 40.13977,49.60105000000001,0 40.005,49.61444000000001,0 39.92167,49.56555,0 39.79695000000001,49.55305,0 39.63972,49.61555,0 39.58083,49.73082,0 39.27361,49.75194,0 39.18373,49.88041,0 39.06916,49.81777,0 38.94526,49.8075,0 38.88916,49.86805,0 38.69609,49.92749,0 38.68665,49.97887,0 38.49889,49.95193,0 38.3761,49.98749,0 38.30777,50.07388,0 38.18415,50.06554000000001,0 38.18526,49.9511,0 38.01306,49.90138000000001,0 37.92527,50.02471,0 37.73304,50.08777000000001,0 37.60527,50.21666,0 37.62360000000001,50.30527,0 37.49444,50.35139000000001,0 37.4586,50.43971000000001,0 37.31583,50.42804,0 37.13054,50.34833,0 36.88444,50.33583000000001,0 36.7011,50.26693000000001,0 36.64028,50.21249000000001,0 36.56249,50.22249,0 36.56333000000001,50.27639,0 36.41276,50.32166,0 36.29749,50.28444,0 36.13917,50.42527,0 35.85028,50.4286,0 35.73915,50.38333,0 35.72887,50.35332,0 35.64471,50.35416,0 35.58305,50.38305,0 35.5672,50.45306,0 35.44106,50.51198,0 35.39355,50.63808,0 35.48857,50.67585,0 35.45829,50.69417,0 35.45663,50.77279,0 35.39773,50.80308,0 35.3605,50.87226,0 35.36133,50.92614,0 35.30577000000001,50.96033,0 35.29716000000001,50.99979,0 35.35855,51.01088000000001,0 35.37189,51.04144,0 35.17076,51.0548,0 35.11852,51.20481,0 35.07381,51.22149,0 34.73499,51.17249,0 34.66999,51.17944,0 34.63361,51.24222,0 34.38221,51.26361000000001,0 34.30526,51.23082000000001,0 34.20892,51.25919,0 34.27388,51.28555,0 34.31499,51.35111,0 34.20361,51.40666,0 34.23916,51.42777000000001,0 34.23417,51.54666,0 34.15972,51.6286,0 34.10111,51.64749,0 34.10277,51.67443,0 34.40554,51.7186,0 34.44054,51.76721,0 34.38082,51.84499,0 34.25777,51.87944000000001,0 34.16945,51.95999,0 34.10943,51.95972,0 34.12804,51.98972000000001,0 34.07306,52.06028000000001,0 34.09778,52.15194,0 33.83056,52.36472000000001,0 33.69638,52.36166999999999,0 33.53528,52.29333000000001,0 33.49778,52.36666000000002,0 33.44887,52.34361,0 33.20471,52.37972,0 32.92361,52.24722,0 32.39415,52.33526,0 32.35833,52.30999,0 32.38638,52.25472,0 32.34055000000001,52.22137,0 32.33554,52.1572,0 32.22499,52.07944,0 32.12444,52.04388000000001,0 31.92638,52.03667,0 31.89777,52.09610000000001,0 31.78388,52.10805000000001,0 31.7825,52.16582,0 31.70389,52.1986,0 31.71694,52.26167000000001,0 31.58666,52.31888,0 31.62972,52.37054,0 31.60166,52.40610000000001,0 31.60889,52.49138,0 31.56472000000001,52.51583,0 31.59527,52.53221,0 31.58167,52.55083,0 31.65332,52.55305,0 31.5,52.68999,0 31.595,52.73804,0 31.58083,52.80304,0 31.53695,52.8561,0 31.41527,52.89305,0 31.35638,52.97805000000001,0 31.2664,53.02193,0 31.38638,53.09916,0 31.37483,53.12193000000001,0 31.4225,53.20888000000001,0 31.61611,53.21832,0 31.77555,53.19415000000002,0 31.80111,53.12583,0 31.93054,53.09554,0 32.22332,53.10555,0 32.22554,53.13333,0 32.29889,53.13193,0 32.43999,53.20888000000001,0 32.49833,53.27832,0 32.46249,53.30832,0 32.73693,53.34249,0 32.7411,53.46305000000001,0 32.66082,53.46666,0 32.67054,53.49722,0 32.5975,53.4911,0 32.44389,53.57194000000001,0 32.41471,53.64638,0 32.51056,53.68361,0 32.45166,53.72638,0 32.37694,53.71888,0 32.32944,53.76222000000001,0 32.11971,53.81999,0 31.90222,53.77777,0 31.76423000000001,53.80262,0 31.86083,53.96333,0 31.84416,54.06444000000001,0 31.79333,54.05305000000001,0 31.76167,54.10333,0 31.54416,54.14333,0 31.33166,54.2375,0 31.31167,54.35083,0 31.23194,54.45665,0 31.1986,54.46093000000001,0 31.0825,54.50556,0 31.18443,54.60609,0 31.18527,54.64222,0 31.02472,54.65222,0 31.005,54.71167,0 30.78,54.79694000000001,0 30.845,54.8811,0 30.83388,54.94415,0 30.94749,54.96915,0 30.92499,55.03333,0 31.02971,55.04332,0 30.98722,55.11166000000002,0 31.00472,55.14332,0 30.81361,55.29333000000001,0 30.93943,55.39944000000001,0 30.90055,55.45915999999999,0 30.93999,55.49583,0 30.91888,55.60833000000001,0 30.75666,55.59665,0 30.72694,55.65639,0 30.60889,55.68138,0 30.61249,55.72027,0 30.49416,55.76388000000001,0 30.48971,55.79999,0 30.22611,55.8661,0 30.14055,55.82804000000002,0 29.92833,55.85167000000001,0 29.82306,55.77528,0 29.71916,55.78249000000002,0 29.49388,55.68888,0 29.35916,55.78943,0 29.40693,55.89582999999999,0 29.46443,55.91109,0 29.41222,55.95777,0 29.05943,56.03278,0 28.86944,55.98055,0 28.84694,55.94249000000001,0 28.75416,55.95388000000001,0 28.64611,56.09361000000001,0 28.3875,56.0961,0 28.3125,56.04999,0 28.16801,56.15015,0 28.23777,56.2711,0 28.18444,56.37471000000001,0 28.18972,56.44055,0 28.11306,56.50555000000001,0 28.1525,56.55443000000001,0 28.03639,56.59054,0 28.005,56.69137,0 27.8861,56.74722,0 27.93527,56.82721,0 27.81555,56.87833000000001,0 27.64,56.84805,0 27.7775,57.06582,0 27.70138,57.11916000000001,0 27.84082,57.16361,0 27.86111,57.30222000000001,0 27.52722,57.4386,0 27.54722,57.53638000000001,0 27.37205,57.53564,0 27.34806,57.59554000000001,0 27.40583000000001,57.61361000000001,0 27.41306,57.69055,0 27.52666,57.72276,0 27.51639,57.77333,0 27.57277,57.80277000000002,0 27.54583,57.81777,0 27.75306000000001,57.83916,0 27.82306,57.87388,0 27.68388,57.92638,0 27.69722,58.00082,0 27.64222,58.02083,0 27.67721,58.07417000000002,0 27.55417,58.13276000000001,0 27.47416,58.21388000000001,0 27.46471,58.29777,0 27.53916,58.36166,0 27.5425,58.41389,0 27.42611,58.81361,0 27.4936,58.88193,0 27.72499,58.98777,0 27.91254,59.27182,0 28.17035,59.30978,0 28.19389,59.37582,0 28.01583000000001,59.4786,0 27.80783,60.5464,0 28.38888,60.88667000000002,0 28.52916000000001,60.95499,0 28.63888,60.96611,0 28.81277,61.10334,0 29.21361,61.25332,0 29.48639,61.42611000000002,0 29.52555,61.48277,0 29.80916,61.60833,0 29.83222,61.65305000000002,0 29.99138,61.72943,0 30.64972,62.195,0 30.94777,62.31138000000001,0 31.25972000000001,62.50777000000002,0 31.4675,62.80639,0 31.58893,62.91440999999999,0 31.515,62.98693,0 31.28222,63.10917,0 31.21972,63.22306,0 30.9625,63.30972000000001,0 30.79639,63.40194,0 30.48166000000001,63.47861,0 29.99671,63.74802,0 30.25584,63.81778,0 30.345,63.90972000000001,0 30.59528,64.04694000000001,0 30.61444,64.08665000000001,0 30.54805,64.17471000000001,0 30.57722,64.21581999999999,0 30.56084,64.24442999999999,0 30.45416000000001,64.25694,0 30.38972,64.30943000000001,0 30.15611000000001,64.35415999999999,0 30.05222,64.40470999999999,0 30.08722,64.48305000000001,0 30.00967,64.51286,0 29.97500000000001,64.58110000000001,0 30.19917,64.65028,0 30.19713000000001,64.68622000000001,0 30.12055000000001,64.73054999999999,0 30.14083,64.77415000000001,0 29.80471,64.79389000000001,0 29.63667,64.92805,0 29.60666,65.00166,0 29.62889,65.06305,0 29.87388,65.12082,0 29.82333,65.14888999999999,0 29.87028,65.18747999999999,0 29.85361,65.21612,0 29.59638,65.24887,0 29.7475,65.34193000000001,0 29.74611,65.51443,0 29.85971,65.56610000000001,0 29.72194,65.63805000000001,0 30.02444,65.69110000000001,0 30.12388,65.66499,0 30.13528000000001,65.70359999999999,0 30.09667,65.83333,0 29.97695,65.9811,0 29.91028,66.12694000000001,0 29.63861,66.32249,0 29.56792,66.42856999999999,0 29.54833,66.49554000000001,0 29.42056,66.58498,0 29.35027,66.68249,0 29.09333,66.85138000000001,0 29.08305,66.9586,0 29.54611,67.31055000000001,0 29.93279,67.51389,0 29.97778,67.57249,0 29.98972,67.67194000000001,0 30.02861,67.69472,0 29.69167,67.81527,0 29.35695,68.08249000000001,0 28.69334,68.19749,0 28.4575,68.53194000000001,0 28.73861,68.73416,0 28.82056,68.84444000000001,0 28.73778,68.87582,0 28.47917,68.8736,0 28.43195,68.89694,0 28.95734,69.05162,0 29.06333,69.02916999999999,0 29.23916,69.1075,0 29.32167,69.24554000000001,0 29.31,69.31527,0 29.945,69.43053999999999,0 30.09777,69.50333000000001,0 30.185,69.58275999999999,0 30.14277,69.62833000000001,0 30.07277,69.6311,0 30.10333,69.66306,0 30.20361,69.66388000000001,0 30.52916,69.5461,0 30.91,69.54886999999999,0 30.94583,69.58222000000001,0 30.95472,69.68138,0 30.89805,69.70555,0 30.85484,69.7923,0 31.17443,70.36256,0 31.92259,70.01843,0 32.28514,69.92385,0 33.13635,69.77410999999999,0 33.48315,69.49036,0 35.31956,69.30909,0 36.23384,69.15934,0 37.16386,68.89137,0 37.5369,68.86902000000001,0 37.56522,73.71208,0 37.59446,78.71200000000002,0 35.86762,78.71200000000002,0 35.86762,81.47494,0 37.5369,81.47494,0 37.5369,84.90001,0 37.5369,89.90000000000001,0 38.53421000000001,89.90000000000001,0 39.53152,89.90000000000001,0 40.52883,89.90000000000001,0 41.52613,89.90000000000001,0 42.52345,89.90000000000001,0 43.52076,89.90000000000001,0 44.51808,89.90000000000001,0 45.51538,89.90000000000001,0 46.51269,89.90000000000001,0 47.51001000000002,89.90000000000001,0 48.50732,89.90000000000001,0 49.50463,89.90000000000001,0 50.50193000000001,89.90000000000001,0 51.49924,89.90000000000001,0 52.49656000000001,89.90000000000001,0 52.49656000000001,84.90001,0 + + + 1 + + + + + GMT +03:30 + + +]]> + #khStyle0350 + + + + +44.81304,39.63081,0 44.8886,39.60582,0 44.95028000000001,39.43582,0 45.06304999999999,39.37305,0 45.13055000000001,39.28556,0 45.14193,39.21748,0 45.30999000000001,39.19832,0 45.43499000000001,39.0511,0 45.43941000000001,38.99804,0 45.87194000000001,38.87999,0 46.05637,38.87831,0 46.17825000000001,38.84114000000001,0 46.35471,38.91054,0 46.54037,38.87559,0 46.83832000000001,39.15527000000001,0 46.94886,39.15443,0 47.02556,39.18942,0 47.09971,39.30444,0 47.29221,39.37693,0 47.39166,39.47054000000001,0 47.53334,39.50888000000001,0 47.80666,39.67722,0 47.93055,39.68359,0 47.97667000000001,39.71922,0 48.35979,39.38522,0 48.18916000000001,39.33332,0 48.11998,39.26361,0 48.13499000000001,39.20888,0 48.29387000000001,39.11249,0 48.32776,39.05165,0 48.31248,39.00776,0 48.07138000000001,38.95138,0 48.01415,38.90583,0 48.02081,38.83554,0 48.24387,38.72776,0 48.24361,38.66721,0 48.32776,38.60333,0 48.44193,38.62165,0 48.45416,38.56471,0 48.62305000000001,38.39526,0 48.78943000000001,38.44777,0 48.88828000000001,38.44241,0 48.86942,38.30054,0 48.94166,37.90749,0 48.99776,37.76361,0 49.10248,37.64304,0 49.41999,37.49332,0 49.83443,37.4511,0 49.92499,37.47971,0 49.96888,37.45387,0 49.94166,37.44471,0 50.19137000000001,37.38917,0 50.35166,37.1211,0 51.10111,36.72887,0 51.97276000000002,36.57999,0 53.22305,36.84833,0 53.92276,36.90972,0 54.00860999999999,36.94833,0 53.98499,36.89861000000001,0 53.6075,36.86833000000001,0 53.66137000000001,36.85777,0 53.63388000000001,36.84804,0 53.68194,36.81722,0 53.94332,36.8,0 54.0286,36.82471,0 54.03166,36.94833,0 53.98833,36.9822,0 54.01583000000001,37.02193000000001,0 53.90564,37.35085,0 54.23165000000001,37.32722,0 54.55165,37.4461,0 54.68111,37.4436,0 54.78694,37.51915000000001,0 54.80972000000001,37.57944,0 54.78221000000001,37.64804,0 54.83306000000001,37.74639,0 54.95471000000001,37.80499,0 55.14083,37.9561,0 55.21027,37.96221,0 55.44276000000001,38.08611,0 55.7561,38.12526,0 55.98276000000001,38.07249,0 56.16444,38.09499,0 56.22305,38.07028,0 56.33305000000001,38.08554,0 56.35277,38.13889,0 56.32249000000001,38.18526,0 56.44276,38.25999,0 56.61388,38.24055,0 56.75574000000001,38.28626,0 56.84583,38.23166000000001,0 57.05861,38.1936,0 57.14979,38.26009,0 57.18888,38.28334,0 57.20471,38.28334,0 57.24388,38.27082,0 57.28833,38.17055,0 57.3711,38.09305,0 57.35306,37.98944,0 57.45028000000001,37.93916,0 57.70805,37.92665,0 58.04694000000001,37.80944,0 58.17443,37.79639,0 58.20304000000001,37.78334000000001,0 58.22748,37.68111,0 58.38915999999999,37.63611,0 58.49805,37.64777,0 58.5625,37.7086,0 58.71277000000001,37.64861,0 58.80444,37.66693,0 58.82278,37.70361,0 59.06027,37.62999,0 59.25,37.51333,0 59.33888,37.53916000000001,0 59.38082,37.48555,0 59.39305000000001,37.32306,0 59.49139,37.24833,0 59.47693,37.21889000000001,0 59.56693,37.20888,0 59.62027000000001,37.13194,0 59.67054000000001,37.15611,0 59.81305,37.12471000000001,0 59.91471000000001,37.0586,0 60.02944,37.03695,0 60.27840000000001,36.76272,0 60.33306000000001,36.6561,0 61.1572,36.64999,0 61.18999,36.56777,0 61.15028,36.31499,0 61.18444,36.28667,0 61.22916,36.12666,0 61.16471,36.03527,0 61.16999,35.99527,0 61.12428,35.97565,0 61.22582,35.90388,0 61.26222,35.81972,0 61.22887,35.67805,0 61.27655000000001,35.60725,0 61.28778000000001,35.54999,0 61.19444,35.40222,0 61.19276000000001,35.30583,0 61.10444,35.27916,0 61.09471,35.18416,0 61.14249000000001,35.09832,0 61.06972,34.92888000000001,0 61.06305,34.80888,0 60.98333000000001,34.73388,0 60.97137,34.64444,0 60.72165,34.52222,0 60.91527000000001,34.32,0 60.66554,34.31249,0 60.67555000000001,34.28833,0 60.54610000000001,34.19638,0 60.50444,34.12222,0 60.55417000000001,33.81332,0 60.50527,33.73915,0 60.52776999999999,33.64415,0 60.66610000000001,33.5675,0 60.88639,33.55721,0 60.94305,33.51944,0 60.85443,33.48999,0 60.85167,33.41805,0 60.59109,33.16305,0 60.58056,33.0886,0 60.85778000000001,32.23471,0 60.83665,32.09027,0 60.79694000000001,32.0375,0 60.84389,31.49833,0 61.10417,31.46305,0 61.71361000000001,31.38332000000001,0 61.7711,31.31833,0 61.76466000000001,31.24477,0 61.8511,31.02111,0 61.80403,30.94514,0 61.78652,30.80953,0 60.86630000000002,29.86366,0 61.31443000000001,29.39583,0 61.3586,29.38444000000001,0 61.36027,29.26583000000001,0 61.42471,29.15528000000001,0 61.51111,29.08861,0 61.48804000000001,29.04361,0 61.5336,29.0125,0 61.58138000000001,28.88083,0 61.90554,28.555,0 62.40499,28.41722,0 62.59249,28.2336,0 62.78138,28.26695,0 62.75777,28.00027,0 62.82193,27.76027,0 62.83972,27.47443000000001,0 62.77833,27.35333,0 62.80694,27.32332,0 62.79583,27.28555,0 62.76471,27.27194,0 62.82305000000002,27.23027,0 62.93333000000001,27.21333,0 63.20583,27.2675,0 63.28832,27.21861,0 63.34194,27.1225,0 63.27859,27.12194,0 63.25305,27.08361,0 63.25916,26.93443,0 63.29056,26.89222,0 63.20638,26.84222,0 63.17638000000001,26.63111,0 62.77276000000001,26.64972,0 62.74305,26.61167,0 62.44609,26.56888,0 62.32027000000001,26.51527,0 62.27138,26.42472,0 62.27803000000001,26.35402,0 62.13583000000001,26.38083,0 62.12887,26.34444,0 62.10388,26.31444,0 61.87610000000001,26.24638,0 61.84416,26.21166,0 61.77583000000001,25.81861,0 61.68638,25.795,0 61.70361000000001,25.67667000000001,0 61.66859000000001,25.63277,0 61.64695,25.30611,0 61.61103000000001,25.19764,0 61.54971,25.25,0 61.55388,25.19749,0 61.48611,25.19722,0 61.51667,25.15472,0 61.49527,25.11527,0 61.42305,25.0975,0 61.4386,25.07528,0 61.22499,25.11861,0 61.17305000000002,25.17444,0 60.62222,25.26806,0 60.60277000000001,25.40028,0 60.54722,25.44167,0 60.45499,25.43166,0 60.39528,25.37555,0 60.46111,25.26361,0 60.30721,25.32945,0 60.29361,25.37832,0 60.19694,25.36528,0 60.18249000000002,25.32111,0 60.07111,25.37916,0 59.89388,25.345,0 59.83889,25.41082,0 59.59916,25.39554,0 59.47805,25.47722,0 59.247,25.42619,0 59.02583000000001,25.3975,0 58.9325,25.505,0 58.81833,25.56,0 58.40895,25.59111,0 58.32286,25.57843,0 58.13499,25.54138,0 58.04554,25.57695,0 57.95777,25.70027,0 57.77694,25.62806,0 57.78695,25.69833,0 57.74805,25.74554,0 57.6261,25.73027,0 57.31806,25.77083,0 57.27138,25.91944,0 57.16721,26.07222,0 57.21388,26.1725,0 57.12579,26.26425,0 57.09309,26.29857,0 57.0935,26.38464,0 57.08777,26.63972,0 57.02138,26.85222,0 56.92694,26.95166,0 56.9711,26.96388,0 56.96970000000001,27,0 56.92389,26.98249,0 56.84196,27.03251,0 55.89573,26.62316,0 55.33095,26.23366,0 54.55681,25.86849,0 54.48864,25.8831,0 54.47404000000001,26.26287,0 53.14484,26.8033,0 52.56544,27.35835000000001,0 52.52133,27.48647,0 51.54147,27.7537,0 51.29651,27.95413,0 50.27212,29.1344,0 50.0717,29.82476,0 49.55681000000001,29.98495000000001,0 49.3535,30.13924,0 49.22824000000001,30.14287,0 48.59428,29.94093000000001,0 48.54556,29.96302,0 48.45333000000001,29.99805,0 48.38777000000001,30.13694,0 48.40781,30.21121,0 48.27964000000001,30.33528,0 48.1992,30.32573,0 48.16043,30.42708,0 48.03249,30.49138,0 48.03638,30.99749,0 47.69388000000001,31.00111,0 47.69721000000001,31.40778,0 47.86445,31.79861,0 47.79056000000001,31.86,0 47.68971000000001,32.02388,0 47.5075,32.15416,0 47.52887,32.22887,0 47.41332,32.34109,0 47.43416,32.39778,0 47.3561,32.47638,0 47.27499000000001,32.49194,0 47.1375,32.46305,0 46.73944000000001,32.75999,0 46.42388,32.93749,0 46.10722,32.96749,0 46.0975,33.00555,0 46.14972,33.06527,0 46.05416000000001,33.08805,0 46.05138000000001,33.11832,0 46.11138,33.11277,0 46.19944,33.19582,0 46.17555000000001,33.2686,0 46.05027000000001,33.37778,0 46.00647000000001,33.48579,0 45.87471,33.49166,0 45.9486,33.55665,0 45.89666,33.60139,0 45.90659000000001,33.63655,0 45.74694,33.59166,0 45.75527000000001,33.63361,0 45.68888,33.67499,0 45.50804,33.94249,0 45.40582,33.9711,0 45.46888,34.07917,0 45.56276,34.14054,0 45.54695000000002,34.18833,0 45.58472,34.30249,0 45.53555,34.35111,0 45.48777000000001,34.33583,0 45.43555000000001,34.45528,0 45.52555,34.50249,0 45.52473000000001,34.6032,0 45.61472,34.55999,0 45.72220999999999,34.55665,0 45.70833,34.65915,0 45.6511,34.72694,0 45.68860000000002,34.81528,0 45.76611,34.84583,0 45.77249,34.91444,0 45.86776,34.9036,0 45.89555,34.9636,0 45.8786,35.03527,0 45.92193000000001,35.05443,0 45.93378,35.09876,0 46.03944,35.05833,0 46.16638,35.10722,0 46.15331,35.1611,0 46.19305,35.21111,0 46.11916000000001,35.24444,0 46.14805,35.29746,0 45.99221,35.48109,0 46.0061,35.53778,0 45.97999000000001,35.58471,0 46.02388,35.57999,0 46.02944,35.68776,0 46.2686,35.72805,0 46.34444,35.82193,0 46.18166000000001,35.80417,0 46.08749,35.86639,0 45.76583000000001,35.81194,0 45.66332000000001,35.94054,0 45.55777000000001,36.0022,0 45.50555000000001,36.02055,0 45.34916,35.99055,0 45.33165,36.01416,0 45.36832,36.08637,0 45.32027000000001,36.15609,0 45.31971,36.23832,0 45.27582,36.25776,0 45.30332000000001,36.28083,0 45.27303000000001,36.30859,0 45.27916,36.3811,0 45.23916,36.43137,0 45.09415,36.42443,0 45.01471000000002,36.53527,0 45.06666000000001,36.68054,0 45.01277000000001,36.7536,0 44.84915,36.79832,0 44.90664,36.88832,0 44.88416,36.96166,0 44.90972000000001,37.02388,0 44.78499,37.08472,0 44.76554,37.11694,0 44.78733,37.1497,0 44.77332,37.22748,0 44.82193,37.2711,0 44.81527,37.30526,0 44.72499,37.38361,0 44.58859,37.44026,0 44.6136,37.60277,0 44.55804,37.64803,0 44.61805,37.72776,0 44.52693,37.78555,0 44.45609,37.77471,0 44.45193,37.81778,0 44.41916,37.81778,0 44.39333,37.86304,0 44.22398000000001,37.89915,0 44.26416,38.01416,0 44.38778,38.16583,0 44.40471000000001,38.27166,0 44.48416,38.34554,0 44.43471000000001,38.39555,0 44.38081,38.36971,0 44.30693000000001,38.38833,0 44.31388,38.63777,0 44.26333,38.66639,0 44.28276,38.69777,0 44.26082,38.72165,0 44.30332000000001,38.83444,0 44.20805,38.89581,0 44.15943,39.00221,0 44.20499,39.04165,0 44.18833,39.08306,0 44.21583,39.14083,0 44.09833,39.20638,0 44.09581,39.29138,0 44.03416,39.38499,0 44.20054,39.41694,0 44.31553000000001,39.3875,0 44.4161,39.42527,0 44.47108,39.69886,0 44.60582,39.78054000000001,0 44.81304,39.63081,0 + + + 1 + + + + GMT +04:00 + + +]]> + #khStyle0400 + + + + + +54.48864,25.8831,0 54.55681,25.86849,0 55.33095,26.23366,0 55.89573,26.62316,0 56.84196,27.03251,0 56.92389,26.98249,0 56.96971,27,0 56.9711,26.96388,0 56.92694,26.95166,0 57.02138,26.85222,0 57.08777,26.63972,0 57.0935,26.38464,0 57.09309,26.29857,0 57.12579,26.26425,0 57.21388,26.1725,0 57.16721,26.07222,0 57.27138,25.91944,0 57.31806,25.77083,0 57.6261,25.73027,0 57.74805,25.74554,0 57.78695,25.69833,0 57.77694,25.62806,0 57.95777,25.70027,0 58.04554,25.57695,0 58.13499,25.54138,0 58.32286,25.57843,0 58.40895,25.59111,0 58.81833,25.56,0 58.9325,25.505,0 59.02583000000001,25.3975,0 59.247,25.42619,0 59.47805,25.47722,0 59.59916,25.39554,0 59.83889,25.41082,0 59.89388,25.345,0 60.07111,25.37916,0 60.18249000000002,25.32111,0 60.19694,25.36528,0 60.29361,25.37832,0 60.30721,25.32945,0 60.46111,25.26361,0 60.39528,25.37555,0 60.45499,25.43166,0 60.54722,25.44167,0 60.60277000000001,25.40028,0 60.62222,25.26806,0 61.17305000000002,25.17444,0 61.22499,25.11861,0 61.4386,25.07528,0 61.42305,25.0975,0 61.49527,25.11527,0 61.51667,25.15472,0 61.48611,25.19722,0 61.55388,25.19749,0 61.54971,25.25,0 61.61103000000001,25.19764,0 61.78221,25.19027000000001,0 61.72444,25.0525,0 61.83721,25.03444,0 61.86193000000001,25.09277,0 61.91137000000001,25.11277,0 62.10444,25.10167,0 62.07777000000002,25.18138,0 62.16777,25.21638,0 62.29527,25.19916,0 62.31917,25.14277,0 62.28167000000001,25.105,0 62.35305,25.09195,0 62.39111000000001,25.10221,0 62.33638,25.12778,0 62.36221000000001,25.17332,0 62.48554000000001,25.20944,0 62.46444,25.23638,0 62.52693,25.25556,0 62.74471,25.25945,0 63.00805,25.21471,0 63.15583,25.25638,0 63.50500000000002,25.18861,0 63.52361,25.21361,0 63.46998,25.28028,0 63.57249,25.36,0 63.7486,25.38527,0 63.92917000000001,25.33416,0 64.06299,25.33679,0 64.09166999999999,25.32861000000001,0 64.25555,25.31472,0 64.43497000000001,25.23111000000002,0 64.51666,25.26944,0 64.59276,25.25556,0 64.63109,25.22056,0 64.61998,25.16999,0 64.70999000000001,25.18027,0 64.66499,25.20944,0 64.66776000000002,25.25694,0 64.76888,25.32138,0 65.13970000000001,25.28778,0 65.25417,25.37749,0 65.38611,25.39056,0 65.38777,25.3625,0 65.46642,25.38267,0 65.66776,25.34278,0 65.84665,25.41667,0 66.26389,25.46778,0 66.49576999999999,25.39812,0 66.54637,25.3629,0 66.73276,25.19749,0 66.67415,24.93388,0 66.70499,24.89167,0 66.65028,24.82611,0 66.85943,24.85444,0 66.9511,24.80472,0 66.96082,24.83861,0 67.07283000000001,24.7676,0 67.14679,24.6441,0 67.15637000000001,24.6075,0 67.25166,24.58916,0 67.18165000000001,24.57972,0 67.22971,24.53305,0 67.21361000000002,24.50361,0 67.25722,24.41361,0 67.28554,24.43639,0 67.27887,24.35694,0 67.35942,24.34249,0 67.29803,24.33944,0 67.28166,24.28083000000001,0 67.3633,24.06714,0 67.45277,23.98666,0 67.50054,23.97499,0 67.50583,23.92138,0 67.53803000000002,23.93813000000001,0 67.48248,23.89583,0 67.51169000000002,23.87695,0 67.51169000000002,18.87694,0 67.51169000000002,13.87695,0 67.51169000000002,12.15223,0 67.51169000000002,7.824905,0 67.51169000000002,2.82491,0 67.51169000000002,-2.175094,0 67.51169000000002,-7.175088,0 67.51169000000002,-12.17509,0 67.51169000000002,-17.17509,0 67.51169000000002,-22.17509,0 67.51169000000002,-24.58749,0 67.51169000000002,-29.58749,0 67.51169000000002,-34.58749,0 67.51169000000002,-39.58749,0 67.51169000000002,-41.88749,0 67.51169000000002,-46.88749,0 67.51170000000001,-51.88749,0 67.51170000000001,-56.88749,0 67.51170000000001,-61.88749000000001,0 67.51170000000001,-66.88749,0 67.51170000000001,-71.88749,0 67.51170000000001,-76.88749,0 67.51170000000001,-79.64822,0 67.51170000000001,-84.64822,0 67.51170000000001,-89.64822,0 67.51170000000001,-89.90000000000001,0 66.51234,-89.90000000000001,0 65.51299,-89.90000000000001,0 64.51363000000001,-89.90000000000001,0 63.51426000000001,-89.90000000000001,0 62.51491,-89.90000000000001,0 61.51555000000001,-89.90000000000001,0 60.51619,-89.90000000000001,0 59.51684,-89.90000000000001,0 58.51747,-89.90000000000001,0 57.51812000000001,-89.90000000000001,0 56.51877000000001,-89.90000000000001,0 55.5194,-89.90000000000001,0 54.52005,-89.90000000000001,0 53.52069000000001,-89.90000000000001,0 52.52133,-89.90000000000001,0 52.52133,-88.97416,0 52.52129000000001,-83.97417000000002,0 52.52126,-78.97417,0 52.52125,-76.47417,0 52.52121000000001,-71.47417,0 52.52118000000001,-66.47416,0 52.52115,-61.47417000000001,0 52.52111,-56.47416,0 52.52108,-51.47417,0 52.52105,-46.47416000000001,0 52.52101,-41.47417,0 52.521,-39.17416,0 52.52097,-34.17416,0 52.52093000000001,-29.17417,0 52.52089,-24.17416,0 52.52089,-22.17417,0 52.52085,-17.17417,0 52.52081,-12.17417,0 52.52079000000001,-7.17417,0 52.52075,-2.174176,0 52.52073,2.825829000000001,0 52.52069,7.825823000000002,0 52.52067,10.62583,0 55.86174,10.62857,0 55.86174,13.61265,0 52.52133,13.61265,0 52.52133,16.43764,0 52.94389,16.60806,0 53.11444,16.64278,0 51.99929,18.99934,0 55.00000000000001,20,0 55.66611000000001,21.99972,0 55.19917000000002,22.69972,0 55.14166,22.63333,0 52.58333,22.93889,0 51.58333,24.11666,0 51.58423000000001,24.26046,0 51.59138,24.37833,0 51.62222000000001,24.34472,0 51.63556000000001,24.20972,0 51.67222,24.2725,0 51.70888,24.21472,0 51.74389,24.28639,0 51.77584000000001,24.27528,0 51.79873,24.01633,0 51.92555000000001,23.95471,0 51.94305,23.99277,0 52.08055,23.95555,0 52.33083,23.99971,0 52.52133,24.12054,0 52.52133,27.48647,0 52.56544,27.35835000000001,0 53.14484,26.8033,0 54.47404000000001,26.26287,0 54.48864,25.8831,0 + + + 1 + + + + + +40.25339,43.58252,0 40.54306,43.50861,0 40.68471,43.54583,0 41.04416000000001,43.37498000000001,0 41.16805,43.38722,0 41.29554,43.33610000000001,0 41.39332,43.3461,0 41.58971,43.22275,0 41.93971,43.21749,0 42.05777,43.18610000000001,0 42.18111,43.23555,0 42.41526,43.23916,0 42.62583,43.14305,0 42.7011,43.1825,0 42.85722000000001,43.17748,0 43.0211,43.10444,0 43.01082,43.05666,0 43.20083,42.93637,0 43.56055,42.86082,0 43.67083,42.7911,0 43.82721,42.7514,0 43.8361,42.72776,0 43.73555,42.63916,0 43.9611,42.55778,0 44.0536,42.61804,0 44.22082000000001,42.63693,0 44.28665,42.71278,0 44.54972,42.75944000000001,0 44.68443,42.73943000000001,0 44.80388000000001,42.6172,0 44.855,42.74331,0 44.92749,42.76193,0 45.05304,42.69415,0 45.17137000000001,42.70083,0 45.35167,42.52943,0 45.55277,42.55026,0 45.76028,42.47791,0 45.64748,42.20471,0 45.91028,42.105,0 45.96053,42.02387,0 46.01082,42.04305,0 46.07805,42.03416,0 46.10389,41.99415,0 46.23998,42.00139,0 46.31998,41.93888,0 46.39415,41.94054,0 46.45176000000001,41.89705,0 46.56833,41.88248,0 46.56667000000001,41.80777,0 46.59166000000001,41.79221,0 46.76082,41.86388,0 46.77081,41.79666,0 46.92554,41.71776,0 47.04305000000001,41.55833,0 47.16054,41.5611,0 47.25888000000001,41.42471,0 47.28555000000001,41.31219,0 47.52193,41.25416,0 47.57166,41.2111,0 47.65972000000001,41.23554,0 47.76693,41.19609000000001,0 47.91999,41.22637,0 47.90831000000001,41.29084,0 47.96249,41.35943,0 48.02276,41.36193,0 48.07444000000001,41.46776,0 48.23137000000001,41.50249,0 48.3997,41.58914,0 48.47137000000001,41.72359000000001,0 48.58395000000001,41.83577,0 48.67777000000001,41.78276,0 48.89944,41.52583,0 49.03998,41.41415,0 49.14055,41.26833000000001,0 49.15498000000001,41.15165,0 49.22221,41.01833,0 49.39804000000001,40.84971,0 49.53249000000001,40.78749,0 49.50805,40.69305,0 49.52805,40.66277,0 49.80499,40.56471,0 50.05525999999999,40.58444,0 50.125,40.51138,0 50.23536,40.4908,0 50.36295000000001,40.47673000000001,0 50.62228,40.32742,0 50.63309,40.29893,0 50.39325,40.22689,0 50.2625,40.32916,0 50.12417,40.35833000000001,0 49.98054,40.31998000000001,0 49.87804000000001,40.36276,0 49.82472,40.28499,0 49.57167,40.21277,0 49.48805000000001,40.15054,0 49.49582,40.09055,0 49.42499999999999,40.05388,0 49.48304,39.98943000000001,0 49.42110000000001,39.93081,0 49.44442000000001,39.8686,0 49.39332,39.77832,0 49.42416999999999,39.70638000000001,0 49.31889000000001,39.62498,0 49.28082000000001,39.50055,0 49.41361,39.38388,0 49.40331,39.31805,0 49.36388000000002,39.34499,0 49.40805,39.28776,0 49.31304,39.34138,0 49.25805,39.31944,0 49.20194,39.02471,0 49.12804,38.97331,0 49.06027000000001,38.96693,0 49.05165,39.00139,0 49.12694,39.02998,0 49.14471,39.09748,0 49.06722000000001,39.10777,0 49.03832000000001,39.18221,0 48.95554,39.16526,0 48.93304,38.95138,0 48.89083,38.88082,0 48.82999,38.85942,0 48.86665,38.74583,0 48.88828000000001,38.44241,0 48.78943000000001,38.44777,0 48.62305000000001,38.39526,0 48.45416,38.56471,0 48.44193,38.62165,0 48.32776,38.60333,0 48.24361,38.66721,0 48.24387,38.72776,0 48.02081,38.83554,0 48.01415,38.90583,0 48.07138000000001,38.95138,0 48.31248,39.00776,0 48.32776,39.05165,0 48.29387000000001,39.11249,0 48.13499000000001,39.20888,0 48.11998,39.26361,0 48.18916000000001,39.33332,0 48.35979,39.38522,0 47.97667000000001,39.71922,0 47.93055,39.68359,0 47.80666,39.67722,0 47.53334,39.50888000000001,0 47.39166,39.47054000000001,0 47.29221,39.37693,0 47.09971,39.30444,0 47.02556,39.18942,0 46.94886,39.15443,0 46.83832000000001,39.15527000000001,0 46.54037,38.87559,0 46.35471,38.91054,0 46.17825000000001,38.84114000000001,0 46.05637,38.87831,0 45.87194000000001,38.87999,0 45.43941000000001,38.99804,0 45.43499000000001,39.0511,0 45.30999000000001,39.19832,0 45.14193,39.21748,0 45.13055000000001,39.28556,0 45.06304999999999,39.37305,0 44.95028000000001,39.43582,0 44.8886,39.60582,0 44.81304,39.63081,0 44.77886,39.70638000000001,0 44.69555,39.78998,0 44.59082,39.83305,0 44.48778,39.96277,0 44.34722,40.02389,0 44.28,40.0461,0 43.93389000000001,40.01361,0 43.65749,40.1086,0 43.65778,40.13971,0 43.72165,40.16332,0 43.67221,40.21972,0 43.68,40.26443,0 43.59417,40.33749,0 43.62027,40.41944,0 43.55415,40.4711,0 43.65304,40.53138,0 43.75361,40.67582,0 43.75193,40.74,0 43.6861,40.84195,0 43.67165,40.92806,0 43.59944,40.99249,0 43.47915,41.02528,0 43.46077,41.11296,0 43.47471,41.13999,0 43.42582,41.18527,0 43.3497,41.20193,0 43.23693,41.17638,0 43.19943000000001,41.25527,0 43.1236,41.25527,0 43.20777,41.30693,0 43.03972,41.37416,0 42.89278,41.50695,0 42.84722,41.47305,0 42.78832,41.50861,0 42.82749,41.58500000000001,0 42.59777,41.58305,0 42.51081,41.44333,0 42.47221,41.43333,0 42.18249,41.5075,0 42.05029,41.49056,0 41.96804,41.51915,0 41.83331,41.42832,0 41.72306,41.47055,0 41.72277,41.49554,0 41.65167,41.48277,0 41.53155,41.52388,0 41.73026000000001,41.72555,0 41.77472,41.88563,0 41.7625,41.99221,0 41.66166,42.12109,0 41.63277,42.27194,0 41.55331,42.38581000000001,0 41.46137,42.70804,0 41.22082,42.79861,0 41.15583,42.78917,0 41.03276000000001,42.97304,0 40.93277,42.97222,0 40.8436,43.06777,0 40.58665,43.0825,0 40.38472,43.16555,0 40.32638,43.14192,0 40.22471,43.31443,0 40.00297,43.37926,0 40.0775,43.54694,0 40.12665,43.57222,0 40.25339,43.58252,0 + + + 1 + + + + + +51.39554,54.67722000000001,0 51.39388,54.59304000000001,0 51.49388,54.59527,0 51.52333,54.64638,0 51.67972,54.56166000000001,0 51.92722000000001,54.53611,0 51.93277,54.43638,0 52.01999,54.43665,0 52.08526000000001,54.33942,0 52.12028000000001,54.35111,0 52.105,54.40054000000001,0 52.2,54.40639,0 52.20972,54.44304,0 52.36388,54.45916,0 52.35054,54.42333,0 52.37915,54.41444,0 52.43943,54.47887,0 52.50306000000001,54.45193,0 52.49416,54.39999,0 52.53745,54.37707,0 52.51166,54.32194,0 52.27943,54.32833000000002,0 52.19444,54.29721000000001,0 52.34610000000001,54.22665000000001,0 52.34388000000001,54.17194,0 52.25833,54.14999,0 52.27194,54.11388000000001,0 52.39804000000001,54.1286,0 52.4875,54.05777000000001,0 52.37054,53.9761,0 52.41415,53.93027000000001,0 52.25804,53.65526,0 52.1836,53.55694,0 52.09167,53.55027,0 52.07527,53.50639,0 52.13499,53.44915,0 52.13803999999999,53.40305000000002,0 52.19665000000001,53.37944,0 52.13916,53.29166,0 52.16388000000001,53.26167,0 52.1236,53.22388,0 52.13417,53.17499,0 52.05471,53.14249000000001,0 52.15972,53.09665,0 52.06249,53.07833,0 52.05389,52.99055,0 51.86694000000001,52.92943,0 51.82417000000001,52.87388,0 51.72805,52.87194,0 51.71555,52.82277,0 51.77944,52.79583000000001,0 51.73360000000001,52.6675,0 51.53416,52.67416,0 51.50667000000001,52.63276000000001,0 51.55054,52.57417,0 51.47360000000001,52.57972,0 51.47083,52.52722,0 51.56361,52.43582,0 51.46388,52.41360000000001,0 51.47166,52.36583000000001,0 51.40694,52.34917,0 51.40805,52.25416,0 51.45750000000001,52.22776,0 51.41249000000001,52.08971,0 50.7733,51.76918,0 50.75861,51.71970000000001,0 50.81361,51.64805,0 50.81054000000001,51.59166,0 50.68277000000001,51.57306000000001,0 50.71749,51.62249,0 50.60277,51.63999,0 50.59471,51.58972,0 50.54361,51.56722000000001,0 50.54888,51.46861,0 50.38472,51.42527000000001,0 50.39721999999999,51.39972,0 50.35443,51.37805000000001,0 50.36332,51.31694000000001,0 49.96804,51.2261,0 49.80416,51.11027,0 49.46194,51.12416,0 49.36443,50.97971,0 49.44083,50.90583000000002,0 49.42583000000001,50.85139000000001,0 49.15833,50.79278000000002,0 49.03083,50.68804999999999,0 48.83027,50.59665,0 48.59361,50.64833000000001,0 48.59555,50.62249000000001,0 48.69749,50.59194000000001,0 48.72276000000001,50.35305000000002,0 48.81110000000001,50.19415000000001,0 48.79111,50.1236,0 48.87972000000001,50.10167000000001,0 48.91693000000001,50.03417,0 48.79695,49.94194,0 48.45082,49.81693000000001,0 48.33221,49.87887000000001,0 48.25166000000001,49.86971,0 48.24888000000001,49.90888000000001,0 48.16554000000001,49.9661,0 48.11054000000001,50.0986,0 47.76082000000001,50.37527,0 47.59972,50.46083000000001,0 47.4464,50.37695,0 47.4161,50.33193,0 47.31666,50.29445000000001,0 47.34276,50.24193,0 47.28054,50.18221,0 47.35666,50.09027,0 47.30249,50.03194000000001,0 47.18833,49.94415000000001,0 46.92944,49.86361000000001,0 46.79582,49.33972,0 47.02610000000001,49.23610999999999,0 47.06275999999999,49.14277,0 46.95444,49.01305,0 46.77888000000001,48.93665,0 46.49916000000002,48.4175,0 47.12277,48.27166,0 47.13332000000001,48.24249,0 47.09637,48.21000000000001,0 47.13832000000001,48.16999,0 47.12221,48.10222,0 47.21499000000001,48.07083,0 47.06248000000001,47.99609,0 47.18277,47.87417,0 47.13665000000001,47.82249000000001,0 47.38333,47.68888000000001,0 47.43581,47.84361000000001,0 47.69137,47.76583,0 48.06471000000001,47.77971,0 48.20442000000001,47.70499000000001,0 48.44388000000001,47.43693,0 48.54721000000001,47.41721,0 48.7211,47.09833,0 49.02720999999999,46.77610000000001,0 48.94137,46.70416,0 48.76527,46.69082,0 48.71054,46.75972,0 48.60333,46.77332000000001,0 48.52166,46.74305,0 48.4762,46.66768,0 48.55415,46.64389,0 48.58400000000001,46.59843000000002,0 48.56054,46.56499,0 48.74027000000001,46.55832,0 48.83388,46.48499000000001,0 48.91813000000001,46.48922,0 49.22253,46.34631,0 49.3143,46.2573,0 49.18897,46.05259,0 49.05737,45.98365,0 48.99471,46.00246,0 48.87982,45.94397000000001,0 48.79208,45.82907,0 48.72941,45.804,0 48.74612,45.69747000000001,0 48.36385000000001,45.64942000000001,0 48.20509,45.7121,0 48.0714,45.71836,0 48.015,45.69538,0 47.99829,45.51992000000001,0 47.81656,45.43218000000001,0 47.53247000000001,45.53033,0 47.48619,45.57145,0 47.46748,45.63943,0 47.35971,45.68942,0 47.29361000000001,45.6436,0 46.89304000000001,45.57472000000001,0 47.0411,45.96970000000001,0 47.10915,46.00777,0 47.175,46.10556,0 47.09082000000002,46.1186,0 46.8336,46.07277,0 46.86665,46.24805000000001,0 46.47833,46.27555,0 46.66027,46.42804,0 46.96194,46.4286,0 46.94916,46.53943000000001,0 46.91332,46.55526,0 46.99805,46.63361,0 47.1497,46.66832,0 47.14026,46.69638,0 47.22776,46.74081,0 47.12721,46.85833000000001,0 46.99082,46.85082,0 46.92777,46.97832,0 46.79639,46.99638,0 46.51554,47.39193000000001,0 46.52387000000001,47.43499,0 46.83055,47.5761,0 46.68081,47.63248,0 46.3886,47.44443,0 46.29666000000001,47.43664,0 46.08887000000001,47.51692,0 45.93804,47.62887,0 45.90720000000001,47.7122,0 45.82916,47.72304,0 45.78556,47.81305,0 45.71970000000001,47.86528,0 45.70664000000001,47.93193000000001,0 45.74166,48.00222,0 45.7136,48.03750000000002,0 45.55193000000001,47.99193,0 45.39499,48.09833,0 45.30082000000001,48.09768,0 45.12749000000001,48.11306,0 44.95666,48.21194,0 44.92471,48.19916000000001,0 44.94221,48.14388000000002,0 44.80053,48.05249000000001,0 44.64415000000001,48.09166,0 44.61221,48.05665,0 44.54971,48.05833,0 44.53582,48.20638000000002,0 44.30944,48.25999000000001,0 44.32305,48.05999000000001,0 44.46637,48.04084000000001,0 44.46776,47.9786,0 44.3861,47.91415,0 44.38915,47.86832,0 44.06582000000001,47.9108,0 44.01582,47.86388,0 44.04443,47.82415,0 43.97499,47.76639,0 43.84138,47.7575,0 43.70583,47.68444,0 43.62944,47.55916,0 43.73177,47.47655000000001,0 43.65331,47.44222,0 43.55833000000001,47.48972,0 43.22499,47.44972,0 43.15998,47.48249,0 43.13554000000001,47.57556,0 43.05915,47.57639,0 42.98776,47.51388000000001,0 42.93971,47.51361,0 42.7286,47.85556,0 42.4986,48.01056,0 42.32638,48.04777,0 42.27555,48.01305000000001,0 42.02193,48.03027,0 42.05111,48.12972,0 42.10278,48.16389000000002,0 42.04499,48.25916000000001,0 42.15193,48.28221,0 42.07249,48.40889,0 42.27665,48.49860000000001,0 42.63054,48.54694,0 42.70166,48.61805,0 42.65027,48.70527,0 42.74610000000001,48.80638,0 42.66249,48.8886,0 42.66361,48.96777,0 42.48388,49.04472,0 42.39277,49.04972,0 42.34443,49.15249,0 42.06443,49.15388,0 42.07694,49.19971,0 42.03194,49.26639999999999,0 42.09693,49.29222,0 42.04972,49.40499000000001,0 42.0736,49.51056,0 42.11277,49.52583,0 42.17749,49.69083,0 41.8661,49.90777000000001,0 41.61361000000001,49.96361,0 41.58277,50.005,0 41.5911,50.05525999999999,0 41.4822,50.09027,0 41.36221,50.22629,0 41.5125,50.3811,0 41.4175,50.50527,0 41.45471,50.55138,0 41.52416,50.56860000000001,0 41.52833,50.60166,0 41.40749,50.61944,0 41.32777,50.71916,0 41.15639,50.77638,0 41.38277,50.83027,0 41.37777000000001,50.87666000000001,0 41.41193,50.90359,0 41.7286,51.01721,0 41.8686,51.19388000000001,0 41.96333,51.2086,0 42.09888,51.14750000000001,0 42.2672,51.13166,0 42.41888,51.17222,0 42.56722,51.16526000000001,0 42.68444,51.23693000000001,0 42.87309,51.23142,0 42.91221,51.24083,0 42.83942,51.31666000000001,0 42.86166,51.38166,0 42.48951,51.60789,0 42.51471,51.62388,0 42.48666000000001,51.69305,0 42.67638,51.83972,0 42.70305,51.98194,0 42.8111,52.01027,0 42.74749,52.08027,0 42.75333,52.18581,0 42.92221,52.30526,0 42.92527,52.37500000000001,0 43.00916000000001,52.36388,0 43.0798,52.40288,0 43.12276,52.40192,0 43.19027,52.46666000000001,0 43.3086,52.44555,0 43.34055,52.39111,0 43.77749,52.43472,0 44.05526,52.34610000000001,0 44.34638,52.3161,0 44.33332,52.34805000000001,0 44.38916,52.36833000000001,0 44.41082,52.41305000000001,0 44.54361,52.42944,0 44.51445,52.45916,0 44.53943,52.48638,0 44.49361,52.52665,0 44.54805,52.55249,0 44.66489,52.47935,0 44.86749,52.44666,0 44.90554,52.37665000000001,0 44.97332,52.37332,0 45.05054000000001,52.31721,0 45.10139000000001,52.33332000000001,0 45.06916,52.37778000000001,0 45.11139,52.41109,0 45.44194,52.40055,0 45.51639000000001,52.43444,0 45.52693,52.48166,0 45.64111000000001,52.52028,0 45.73554000000001,52.52583,0 45.71805,52.45889,0 45.98082000000001,52.40721000000001,0 45.97526000000001,52.4361,0 46.01639000000001,52.45776999999999,0 45.97137000000001,52.49583,0 46.06444,52.52693000000001,0 46.08749,52.56388,0 46.14582,52.54972000000001,0 46.15331,52.60194000000001,0 46.2761,52.61805,0 46.29834,52.68055,0 46.39999,52.67249,0 46.58027,52.73249,0 46.61388000000002,52.72748,0 46.61694000000001,52.66109,0 46.83077,52.6164,0 46.9461,52.63832000000001,0 47.0686,52.56638,0 47.1536,52.60999,0 47.20610000000001,52.56666,0 47.43831999999999,52.56722,0 47.55638,52.61833,0 47.72470000000001,52.57916,0 47.78111000000001,52.62915,0 47.77304,52.67972000000001,0 47.85971,52.73166,0 47.90027,52.72221,0 47.92527,52.6661,0 48.07861000000001,52.70555,0 48.08749,52.73193,0 47.98499,52.74722,0 48.10944,52.80138,0 48.28889,52.81082,0 48.43007000000001,52.78054,0 48.58694,52.8686,0 48.57805,52.93554,0 48.51057,52.97799,0 48.31833,52.98555,0 48.36888,53.06638,0 48.26944000000001,53.05777,0 48.2236,52.99722,0 48.14472000000001,53.05916,0 48.21221,53.14582999999999,0 48.13138000000001,53.16888,0 48.09332,53.26194,0 47.94194,53.37583,0 48.00360000000001,53.40666,0 48.04853,53.47771,0 48.16638,53.48249,0 48.2225,53.42443,0 48.23611,53.45888999999999,0 48.37833000000001,53.47137,0 48.37666000000001,53.54277,0 48.44083000000001,53.58138000000001,0 48.355,53.60167000000001,0 48.31416000000001,53.65583000000002,0 48.35638,53.6711,0 48.42695,53.62915000000002,0 48.4461,53.6661,0 48.60333,53.66945,0 48.51305,53.69638000000001,0 48.47222,53.77083,0 48.86333000000001,53.71277,0 49.03694,53.85944,0 49.31694,53.83333,0 49.34304000000001,53.87,0 49.42249000000001,53.87082000000001,0 49.60916000000001,53.855,0 49.61805,53.81139,0 49.83805,53.89083000000001,0 49.85722000000001,53.8336,0 50.03778000000001,53.82527000000001,0 50.05305,53.86860000000001,0 49.95361,53.90527,0 49.97443,53.96138,0 50.19749,54.03722,0 50.22554,54.07916,0 50.20304000000002,54.14027,0 50.26222,54.28944,0 50.19944,54.38416,0 50.21111000000001,54.42167,0 50.11721,54.43027000000001,0 50.12555,54.48194,0 50.07688,54.51667000000001,0 50.22527,54.50361000000001,0 50.27665,54.44054,0 50.38889,54.48888000000001,0 50.42944,54.42749000000001,0 50.47165,54.42333,0 50.5186,54.32639000000001,0 50.70305000000001,54.42833,0 50.93610000000001,54.33999,0 51.01721,54.47916,0 50.99277,54.49916000000001,0 51.00972000000001,54.55165,0 51.09361,54.54861,0 51.18111,54.64638,0 51.28139000000002,54.63694,0 51.39554,54.67722000000001,0 + + + 1 + + + + + +47.59415,61.05888,0 47.88139,60.99833,0 47.95999,61.00972,0 47.9875,60.88665000000001,0 48.41924,60.85386000000001,0 48.53917,60.59999000000001,0 48.53999,60.55915,0 48.48110000000001,60.52499,0 48.51111000000001,60.51194,0 48.50416000000001,60.48276,0 48.61777000000001,60.43333000000001,0 48.54137999999999,60.41109,0 48.67582000000001,60.40638000000001,0 48.76305,60.365,0 48.70499,60.30471,0 48.45917000000001,60.19415,0 48.50999,59.70388,0 49.08554,59.65554,0 49.03416,59.48444,0 49.14778,59.50889,0 49.3086,59.46694,0 49.34194,59.41915000000001,0 49.545,59.39305000000001,0 49.50861,59.24610000000001,0 49.59333,59.21776,0 49.79554,59.22221,0 49.82416,59.37054,0 49.79554,59.38388,0 49.82888000000001,59.48110000000001,0 49.78722000000001,59.50054999999999,0 49.83278,59.63693,0 49.85361,59.66361,0 50.05638,59.6875,0 49.95193,59.74722000000001,0 49.99665,59.77887000000001,0 50.2375,59.75277,0 50.27887,59.80693000000002,0 50.40331000000001,59.84444,0 50.82861000000001,59.86277000000001,0 51.07110999999999,60.06166000000001,0 51.34388,60.01833,0 51.41332000000001,59.94165,0 51.53221000000001,59.94721,0 51.8,60.11083,0 51.89999,60.24444,0 52.0089,60.30360000000002,0 52.08278,60.31694000000002,0 52.29815,60.24171,0 52.42722000000001,60.20304,0 53.01083,60.15915,0 53.38611,60.16555,0 53.41137000000001,60.22443000000001,0 53.59887000000001,60.15666,0 53.71194,60.00332,0 53.60278000000001,59.70055000000001,0 53.42054,59.68971,0 53.3661,59.51832,0 53.2047,59.34944,0 53.24415000000001,59.27583,0 53.38555,59.15554,0 53.7236,59.09194000000002,0 53.68916000000001,59.12332000000001,0 53.75417,59.14111000000001,0 53.88416000000001,59.09054,0 53.83500000000001,59.05832000000001,0 53.84470000000001,59.03054,0 53.76500000000001,59.02277000000002,0 53.71915,58.93748999999999,0 53.80721000000001,58.82777000000001,0 53.92833,58.78166000000001,0 53.77055,58.71638000000002,0 53.74027,58.67972,0 53.75721999999999,58.6525,0 53.69610000000001,58.60333000000001,0 53.78463,58.43996000000001,0 53.79027,58.39249000000001,0 53.88916,58.32222,0 53.80972,58.22887,0 53.89415,58.18804,0 53.94276,58.09527000000001,0 54.10722,57.97276,0 54.08749,57.91331,0 54.13639000000001,57.83222,0 54.15665000000001,57.70249,0 54.06916,57.66666000000001,0 54.12111,57.61193,0 53.98749000000001,57.57111,0 54.10139,57.51805,0 54.11888,57.55944000000001,0 54.16999000000001,57.55972000000001,0 54.20361,57.53083,0 54.16582,57.51222,0 54.17860000000001,57.465,0 54.26472,57.46443000000001,0 54.27166,57.42222,0 54.14443,57.38693,0 54.11639,57.31027000000001,0 54.32000000000001,57.28666000000001,0 54.33472,57.15554000000001,0 54.27555,57.10082000000001,0 54.37444000000001,57.07389000000001,0 54.40269,57.03656000000002,0 54.09805,56.96249,0 54.09177,56.79174,0 54.01056,56.74916,0 53.88999,56.76445,0 53.88943,56.80444,0 53.82832,56.81193,0 53.80637999999999,56.77332,0 53.88081,56.67222,0 53.83554,56.63556,0 53.87,56.6075,0 53.96388,56.63110000000001,0 54.0286,56.69276,0 54.10083,56.66276000000001,0 54.02664999999999,56.58416,0 54.09083,56.58250000000001,0 54.12194,56.53361000000001,0 54.18472000000001,56.53722,0 54.23611,56.43581,0 54.32472000000001,56.46249,0 54.35241,56.35857,0 54.31527,56.34138,0 54.37526,56.30498999999999,0 54.35889,56.26222000000001,0 54.10722,56.14749,0 54.02443,56.02944000000001,0 53.83795000000001,56.04377,0 53.78472,55.96915,0 53.67193,55.95999,0 53.63842,55.91552,0 53.29725,55.85252,0 53.1825,55.92389000000001,0 53.28694999999999,55.93555,0 53.37888,55.98972,0 53.47470000000001,56.12110000000001,0 53.54499,56.14083000000001,0 53.55610000000001,56.24388,0 53.41666,56.27833,0 53.2589,56.25471000000001,0 53.34249,56.14749,0 53.34499,56.08471,0 53.26111,56.08554,0 53.14666,56.16220000000001,0 53.04749,56.13528,0 53.06888,56.18249,0 53.04193,56.20805000000001,0 52.99416,56.18833,0 53.00305,56.22165,0 52.95610000000001,56.25166,0 52.98221,56.28082,0 52.94138,56.30639,0 52.98054,56.3475,0 52.9386,56.36694,0 53.09528,56.52694000000001,0 52.94444,56.54472,0 52.91778000000001,56.50111,0 52.82555,56.52193,0 52.95165999999999,56.46916,0 52.95278,56.44165000000002,0 52.82665999999999,56.38888000000002,0 52.72277,56.39138,0 52.74055,56.37471000000001,0 52.63638,56.28638,0 52.55833,56.2625,0 52.57583,56.22748000000001,0 52.81694,56.20249,0 52.80582,56.18194,0 52.84554,56.15721,0 52.81055,56.13388000000001,0 52.85443,56.12666,0 52.83694000000001,56.09222000000001,0 52.70054,56.14138000000001,0 52.72887,56.06471000000001,0 52.66221,56.01554,0 52.46776,56.07749,0 52.44666,56.06361,0 52.48471,56.03694000000002,0 52.43665,56.02833,0 52.20471000000001,56.08416,0 52.18693,56.05527,0 52.2461,56.06694,0 52.20417,56.00443000000001,0 52.25166,55.95805000000001,0 52.16916000000001,55.89306,0 52.05638,55.895,0 52.03749000000001,55.95916,0 51.96083,55.97915,0 51.78889,55.88388000000001,0 51.72971,55.95971,0 51.68943,55.93278,0 51.64277,55.96054,0 51.43027000000001,55.92722,0 51.39721,55.9922,0 51.48999000000001,56.07888000000001,0 51.6536,56.13444000000001,0 51.43667,56.14444000000001,0 51.36194,56.13054000000001,0 51.3147,56.06972,0 51.22304000000001,56.09916,0 51.20499,56.13943,0 51.1075,56.15139000000001,0 51.07639,56.12498999999999,0 50.83942,56.2411,0 50.86111,56.27804,0 50.90165,56.27944000000002,0 50.90693,56.31583,0 50.87389,56.32666,0 50.85139000000001,56.39027000000001,0 50.785,56.41555,0 50.7625,56.39944,0 50.78527,56.35638,0 50.73304,56.32999000000002,0 50.58638,56.35443,0 50.63110000000001,56.40526,0 50.56971000000001,56.40250000000001,0 50.45,56.54472,0 50.49333,56.61639,0 50.42333,56.58526,0 50.41361000000001,56.62804,0 50.34777,56.67361,0 50.30304,56.67638,0 50.32306,56.65444,0 50.29834,56.63999,0 50.22138000000001,56.66082,0 50.16194000000001,56.615,0 50.07221000000001,56.62266,0 50.10167000000001,56.79416,0 50.0611,56.79361,0 50.07082000000001,56.83082,0 50.01445,56.86721000000001,0 49.73443,56.89667000000001,0 49.75722,56.91415000000001,0 49.71582999999999,56.93361,0 49.76194,56.96500000000001,0 49.72499,56.99110000000001,0 49.71194,57.07361000000001,0 49.41249000000001,57.05305000000001,0 49.41915,57.02194,0 49.26832,57.04361,0 49.23138000000001,57.1311,0 49.14361,57.15972,0 49.22805,57.28889,0 49.18333000000001,57.33139,0 49.01611,57.28305,0 49.00639000000001,57.23332000000001,0 49.04610000000001,57.2011,0 49.01194,57.19332,0 48.99804,57.11888,0 48.95471,57.08554,0 48.84583,57.0886,0 48.86639,57.12249,0 48.83555,57.16444,0 48.56945,57.17249000000001,0 48.4511,57.12054,0 48.30777000000001,57.16860000000001,0 48.19222000000001,57.12471,0 48.24888000000001,57.10666000000001,0 48.16304,57.07972000000002,0 48.2086,57.02722,0 48.13916,56.99833,0 47.98694,57.01444999999999,0 47.97193,56.97387000000001,0 47.93111,57.00944,0 47.91666,56.97665000000001,0 47.83083000000001,57.00416000000001,0 47.785,57.05721,0 47.7336,57.05527000000001,0 47.76971000000001,57.00972000000001,0 47.68916,57.01250000000001,0 47.61721,56.9761,0 47.51139,56.90666,0 47.50249,56.85139,0 47.42444,56.88082,0 47.17083000000001,56.80860000000001,0 47.12277,56.83749,0 47.18194,56.84805,0 47.13277,56.91693000000001,0 46.94471,56.94833000000001,0 46.71583,56.93721,0 46.74471,56.95471,0 46.71510000000001,56.96634000000001,0 46.75388,56.97417,0 46.70805,57.0164,0 46.76806,57.02971,0 46.76528,57.14388,0 46.72638000000001,57.20000000000001,0 46.83443000000001,57.19971,0 46.85194000000001,57.23444000000001,0 46.80888,57.23583,0 46.78972,57.28944,0 46.72055,57.29445,0 46.67611000000001,57.35,0 46.75388,57.37999,0 46.68970000000001,57.39083,0 46.70471000000001,57.42555000000001,0 46.79722000000001,57.45666,0 46.74443,57.52333,0 47.03082,57.49304,0 47.25027,57.57083,0 47.4711,57.52859999999999,0 47.48666,57.58472,0 47.52638000000001,57.58416,0 47.54888,57.66361,0 47.52859,57.70304,0 47.58027000000001,57.74638,0 47.55082,57.765,0 47.5611,57.80249,0 47.77027,57.90028,0 47.70083,57.96361,0 47.45610000000001,57.98555000000001,0 47.38666,58.02332000000001,0 46.52304000000001,58.03889,0 46.44972,58.01749,0 46.34132,58.07474,0 46.30972000000001,58.11054,0 46.35527,58.18721,0 46.41499000000001,58.21054000000001,0 46.41026999999999,58.30805,0 46.48109,58.33222,0 46.41137,58.36388,0 46.59166000000001,58.43194,0 46.54972000000001,58.47665,0 46.59026999999999,58.51832000000001,0 46.58416,58.55804000000001,0 47.0061,58.62249,0 47.00417000000001,58.69583,0 47.11333,58.77249,0 47.265,58.75416,0 47.325,58.80082,0 47.28028,58.81945,0 47.30388,58.85722,0 47.28111000000001,58.90222000000001,0 47.30721,58.91666,0 47.45305000000001,58.92249,0 47.46777000000001,58.88416,0 47.61166,58.91499,0 47.55082,58.9886,0 47.57639,59.06028,0 47.45139,59.12694000000001,0 47.445,59.1675,0 47.39443,59.14722,0 47.22332,59.2261,0 47.25249,59.35555,0 47.05638,59.37860000000001,0 47.11351,59.61137999999999,0 47.14305,59.71333,0 47.12305,59.76139000000001,0 46.92305000000001,59.78444,0 46.92083000000001,59.84665,0 47.03694000000001,60.11832,0 46.89638,60.12583000000001,0 46.83138,60.07306000000001,0 46.60609,60.06527,0 46.36416000000001,60.1211,0 46.35305,60.20972,0 46.295,60.24249,0 46.43083000000001,60.27388,0 46.74499,60.25639000000001,0 46.81304,60.32277,0 46.83193000000001,60.37972,0 46.80444,60.38750000000001,0 46.87805,60.48166000000001,0 46.85666,60.51527,0 47.06166,60.57667000000001,0 47.01749,60.60249000000001,0 47.02388000000001,60.64695,0 46.95277,60.65527,0 47.08721000000001,60.82027,0 47.04314000000001,60.85386000000001,0 47.08027000000001,60.86221,0 47.10749,60.96194000000001,0 47.19138,60.99611000000002,0 47.19720000000002,61.05999,0 47.22833000000001,61.06444,0 47.59415,61.05888,0 + + + 1 + + + + + +57.49650000000001,82.84008,0 52.49656000000001,82.81507000000001,0 52.49656000000001,84.90001,0 52.49656000000001,89.90000000000001,0 53.43657000000001,89.90000000000001,0 54.37659,89.90000000000001,0 55.31659000000001,89.90000000000001,0 56.25661,89.90000000000001,0 57.19662,89.90000000000001,0 58.13662000000001,89.90000000000001,0 59.07665,89.90000000000001,0 60.01665,89.90000000000001,0 60.95667,89.90000000000001,0 61.89668,89.90000000000001,0 62.83669,89.90000000000001,0 63.7767,89.90000000000001,0 64.71672,89.90000000000001,0 65.65673,89.90000000000001,0 66.59672999999999,89.90000000000001,0 67.53675,89.90000000000001,0 67.53675,84.90001,0 67.53675,82.89028,0 67.49638,82.89008,0 62.49644000000001,82.86508000000001,0 57.49650000000001,82.84008,0 + + + 1 + + + + + GMT +04:30 + + +]]> + #khStyle0450 + + + + +74.91575,37.23733,0 74.8111,37.22041,0 74.75110000000001,37.30375,0 74.65109,37.23457,0 74.52970999999999,37.24178,0 74.47942999999999,37.17925,0 74.39722,37.17841,0 74.40054000000001,37.13896,0 74.56543000000001,37.02782,0 74.55304,36.96173000000001,0 74.48888,37.01034000000001,0 74.41998,37.00144,0 74.25194000000001,36.89917,0 74.15166000000001,36.90387,0 74.12109000000001,36.83858000000001,0 74.03831,36.81468,0 73.8522,36.89273000000001,0 73.6683,36.90964,0 72.55663,36.82126,0 72.47416,36.7624,0 72.17554,36.7113,0 72.18163,36.64969,0 72.07916,36.63162,0 72.07471,36.58915,0 71.90443000000001,36.50722,0 71.79584,36.49164,0 71.80834,36.40364,0 71.63307,36.46555,0 71.56305999999999,36.37228,0 71.5789,36.33173,0 71.50725,36.31537,0 71.41252000000002,36.22043,0 71.3389,36.20492,0 71.18706,36.04219,0 71.38499,35.94194,0 71.38721,35.89695,0 71.43997,35.87082,0 71.49082,35.75667,0 71.54526,35.71111,0 71.50888000000001,35.62083,0 71.61665000000001,35.55526,0 71.60193,35.50055,0 71.64943,35.42499,0 71.54859999999999,35.30111,0 71.66388000000001,35.19555,0 71.53554,35.08665,0 71.53803000000001,35.01972,0 71.49890000000001,34.96635,0 71.30914000000001,34.88361,0 71.22553000000001,34.74444,0 71.09583000000001,34.67666,0 71.0886,34.55943,0 70.98748999999999,34.5511,0 71.00054,34.46305,0 71.15886999999999,34.34833,0 71.11832,34.26027,0 71.13554000000001,34.1661,0 71.07720999999999,34.11277,0 71.07720999999999,34.05222,0 70.98109,34.00889,0 70.90555000000001,34.01333,0 70.89109999999999,33.96638,0 70.49136,33.94305,0 70.00276,34.05277000000001,0 69.90637,34.03527,0 69.86913,33.92999,0 69.98554,33.75306,0 70.1375,33.73249000000001,0 70.15138,33.66554,0 70.19664,33.64083,0 70.16804000000001,33.52083,0 70.28610000000001,33.42276,0 70.32693,33.33193,0 70.14499000000001,33.20249,0 70.06776000000001,33.20499,0 70.02888,33.13583000000001,0 69.88109,33.08999,0 69.79137,33.12694,0 69.70081999999999,33.07777,0 69.58083000000001,33.08693,0 69.49081,33.00388,0 69.51277,32.86944,0 69.39499000000001,32.77388,0 69.45833,32.67054,0 69.37776,32.56833,0 69.28749000000001,32.52639,0 69.24802,32.44388,0 69.29137,32.3175,0 69.27193,32.14527,0 69.32825,31.94036,0 69.2244,31.87129,0 69.09972000000001,31.70667,0 69.01944,31.65055,0 68.83305,31.60388,0 68.72803999999999,31.70416000000001,0 68.70722000000001,31.78111000000001,0 68.51944,31.825,0 68.43719,31.78667,0 68.57165999999999,31.76527000000001,0 68.53137,31.72693,0 68.27222,31.77166,0 68.16609,31.83305,0 68.07165999999999,31.69527,0 67.98054999999999,31.63583,0 67.88193,31.63805,0 67.73193000000001,31.52916,0 67.57555000000001,31.53194,0 67.61526000000002,31.42777,0 67.66775,31.4,0 67.77303000000001,31.40861,0 67.79192000000001,31.3411,0 67.38472,31.21527,0 67.25648,31.22233,0 67.05582,31.24305,0 67.04276,31.31639,0 66.95694,31.31806,0 66.84166999999999,31.2725,0 66.79304000000001,31.21972,0 66.72304,31.21222,0 66.68414,31.08611,0 66.57277000000001,30.98138,0 66.39554,30.94083,0 66.28194000000001,30.57528,0 66.35165000000001,30.44527,0 66.32527,30.23778,0 66.23831000000001,30.07138,0 66.36221000000001,29.9561,0 66.25664999999999,29.85194,0 65.03416,29.54111,0 64.69553000000001,29.58638,0 64.47859,29.57306,0 64.21138000000001,29.4986,0 64.12221,29.38861,0 63.5872,29.50389,0 62.48444,29.40611,0 60.86630000000002,29.86366,0 61.78652,30.80953,0 61.80403,30.94514,0 61.8511,31.02111,0 61.76466000000001,31.24477,0 61.7711,31.31833,0 61.71361000000001,31.38332000000001,0 61.10417,31.46305,0 60.84389,31.49833,0 60.79694000000001,32.0375,0 60.83665,32.09027,0 60.85778000000001,32.23471,0 60.58056,33.0886,0 60.59109,33.16305,0 60.85167,33.41805,0 60.85443,33.48999,0 60.94305,33.51944,0 60.88639,33.55721,0 60.66610000000001,33.5675,0 60.52776999999999,33.64415,0 60.50527,33.73915,0 60.55417000000001,33.81332,0 60.50444,34.12222,0 60.54610000000001,34.19638,0 60.67555000000001,34.28833,0 60.66554,34.31249,0 60.91527000000001,34.32,0 60.72165,34.52222,0 60.97137,34.64444,0 60.98333000000001,34.73388,0 61.06305,34.80888,0 61.06972,34.92888000000001,0 61.14249000000001,35.09832,0 61.09471,35.18416,0 61.10444,35.27916,0 61.19276000000001,35.30583,0 61.19444,35.40222,0 61.28778000000001,35.54999,0 61.27655000000001,35.60725,0 61.37888,35.63527,0 61.40610000000002,35.56388,0 61.59583000000001,35.44415,0 61.80249,35.4111,0 61.99583,35.45832,0 62.13256,35.36806,0 62.26944000000001,35.28583,0 62.30915000000002,35.14166,0 62.46500000000001,35.28861,0 62.55444000000001,35.2336,0 62.72220999999999,35.25472,0 62.92249000000001,35.38417,0 63.10527,35.45083,0 63.12666,35.53361,0 63.09528,35.62609,0 63.24002000000002,35.69928,0 63.12972000000001,35.77527,0 63.11944,35.86193,0 63.34249000000001,35.85722000000001,0 63.52833,35.90499,0 63.60111000000001,35.96443,0 63.77832999999999,35.98054000000001,0 63.92055,36.0375,0 64.06386999999999,36.00027,0 64.05971,36.08805,0 64.09498000000001,36.12332,0 64.18137,36.17054,0 64.28248000000001,36.15193,0 64.33665000000001,36.22471,0 64.47387000000001,36.25555,0 64.61526000000001,36.42361,0 64.61693,36.63638,0 64.79526,36.92305,0 64.77916999999999,37.09583,0 64.82304000000001,37.1386,0 65.07277000000001,37.24444,0 65.55443,37.25638,0 65.65082,37.35555000000001,0 65.64444,37.44887,0 65.68109,37.51694,0 65.77193,37.53749,0 65.78167999999999,37.5715,0 65.84526,37.50444,0 66.09054999999999,37.43167,0 66.28999,37.32472,0 66.40833000000001,37.3461,0 66.44748,37.31860000000001,0 66.53773,37.36638,0 66.67221000000001,37.33833,0 67.00417,37.38221,0 67.09648,37.33997,0 67.11749,37.28028,0 67.18637,37.25805,0 67.23997,37.1861,0 67.39722,37.21749,0 67.49249,37.28083,0 67.55748,37.21555,0 67.64333000000001,37.24722,0 67.75526000000001,37.22054,0 67.77988000000001,37.18582,0 67.78221000000001,37.09610000000001,0 67.88554000000001,37.06138,0 68.02831999999999,36.92389,0 68.18719,37.02055,0 68.27499,37.01222,0 68.29471,37.10832,0 68.39749000000001,37.09916000000001,0 68.4122,37.14805,0 68.62388,37.20055000000001,0 68.66415000000001,37.27499,0 68.82165999999999,37.24499,0 68.80663,37.31806,0 68.83804000000001,37.32695,0 68.91943000000001,37.27555,0 68.88777,37.33860000000001,0 68.9997,37.30777,0 69.12527,37.16304,0 69.24664,37.09416,0 69.3886,37.1586,0 69.45055000000001,37.22527,0 69.41110000000001,37.24083000000001,0 69.38026000000001,37.4511,0 69.51582999999999,37.58082,0 69.80692999999999,37.58305,0 69.89915000000001,37.61501,0 69.9586,37.56499,0 70.06245,37.54134,0 70.16193,37.53956,0 70.21554999999999,37.61638,0 70.25360000000001,37.61574,0 70.28581,37.69707,0 70.24693000000001,37.81255,0 70.16553999999999,37.87172,0 70.16137000000001,37.93337,0 70.24745,37.93169,0 70.24721,37.96394,0 70.46416000000001,38.11119,0 70.58443,38.27816,0 70.59775999999999,38.34151,0 70.68552,38.37486,0 70.67221000000001,38.41403,0 70.87388,38.45295,0 70.92998,38.43045,0 70.96720000000002,38.47212,0 71.04971000000001,38.40294,0 71.14554,38.38574,0 71.36638000000002,38.23627,0 71.25277,37.92204,0 71.33472,37.88787,0 71.51537,37.94846,0 71.59193000000002,37.90262,0 71.58859,37.81565,0 71.52878,37.7639,0 71.49571,37.55815,0 71.5141,37.46773,0 71.47942000000001,37.41003,0 71.49026000000001,37.28362,0 71.44693000000001,37.20722000000001,0 71.42943,37.07583,0 71.45694,36.94474,0 71.55468999999999,36.76068,0 71.61006999999999,36.70038,0 71.69525,36.67184,0 71.84276,36.6921,0 72.30636,36.9781,0 72.65851000000001,37.0212,0 72.79359,37.22623,0 73.06914999999999,37.31407,0 73.15054000000001,37.40049,0 73.30721,37.46275,0 73.37248,37.44692,0 73.45637000000001,37.47611,0 73.77598,37.4343,0 73.76888,37.34113,0 73.64943,37.30415,0 73.61998,37.26248,0 73.73858,37.22164,0 74.19721,37.33897,0 74.23748999999999,37.36119,0 74.23997,37.40705,0 74.36388,37.42846,0 74.54221,37.38181,0 74.68427,37.39974,0 74.83277,37.32545,0 74.91575,37.23733,0 + + + 1 + + + + GMT +05:00 + + +]]> + #khStyle0500 + + + + + +74.69081,37.06259,0 74.73943,37.02037,0 74.81749000000001,37.02176000000001,0 74.90166000000001,36.91093,0 74.95972,36.98012,0 75.14444,36.99987,0 75.39722,36.91406000000001,0 75.45444000000001,36.73044,0 75.52303000000001,36.72906,0 75.54637,36.76963,0 75.63916,36.76355,0 75.85526000000002,36.66717,0 76.00499000000001,36.4586,0 75.99082,36.31444,0 76.04166000000001,36.23751,0 75.99359,36.20833,0 75.99387,36.15971,0 75.92303,36.1236,0 75.92609,36.07721,0 75.97275999999999,36.01165,0 76.12387,35.97776,0 76.17693,35.81444,0 76.42165,35.8336,0 76.56416,35.91276,0 76.58971000000001,35.75695,0 76.7122,35.715,0 76.77805000000001,35.65526,0 76.86415,35.64888,0 76.91443,35.59777,0 77.07555000000001,35.58777,0 77.18747999999999,35.52805,0 77.30803000000002,35.53472,0 77.43137,35.47165,0 77.7011,35.46111,0 77.82393,35.50133000000001,0 77.04248,35.09916,0 77.06081,35.01472,0 76.96416000000001,34.94055,0 76.91692999999999,34.68138,0 76.86998,34.65888,0 76.80138,34.67222,0 76.7272,34.74388,0 76.56303000000001,34.73166,0 76.47026,34.76999,0 76.29359,34.70027,0 76.22916000000001,34.60944,0 76.16748,34.58638,0 75.98804,34.62694,0 75.80553999999999,34.50721,0 75.66137000000001,34.50082,0 75.39249,34.55471,0 75.24303999999999,34.62609,0 74.69275,34.6936,0 74.38916,34.78194,0 73.94914,34.65444,0 73.94637,34.56554,0 73.88193,34.52194,0 73.87054000000001,34.45833,0 73.79637,34.38555,0 73.84805,34.3186,0 73.97331,34.30277,0 74.01776,34.21804000000001,0 74.01416999999999,34.17556,0 73.9122,34.11527,0 73.91332,34.0686,0 73.97887,34.01139,0 74.24442999999999,34.01915,0 74.29582000000001,33.97748,0 74.23581,33.88416,0 74.05025999999999,33.83167,0 73.99471,33.75555,0 74,33.65417,0 74.15443000000001,33.56139,0 74.18248,33.51056,0 74.12581,33.34333,0 74.02415000000001,33.27638,0 74.01331999999999,33.19888,0 74.17331,33.04749,0 74.33414999999999,33.00054,0 74.36388,32.86944,0 74.32966999999999,32.81542,0 74.37164,32.7711,0 74.45444000000001,32.79306,0 74.53166,32.75027,0 74.63248,32.77055,0 74.70165,32.84694,0 74.65358999999999,32.59332,0 74.70387,32.48555,0 74.74443000000001,32.465,0 74.86165,32.48472,0 74.93858,32.44887,0 75.04886999999999,32.47832,0 75.31931,32.34466,0 75.32859000000001,32.29276,0 75.39130000000002,32.24158,0 75.32883,32.20907,0 75.30686,32.13391,0 75.25653,32.09287,0 75.22417,32.11676,0 75.19403,32.07404,0 75.04075000000002,32.04146,0 74.90347000000001,32.05329,0 74.83311000000001,31.96271000000001,0 74.60532000000001,31.87712,0 74.54922000000001,31.74385,0 74.48872,31.72159,0 74.61033999999999,31.55431,0 74.59842,31.48941,0 74.65510999999999,31.42797,0 74.54837000000001,31.35443,0 74.53898,31.11872,0 74.55728000000001,31.07605,0 74.62375,31.12393,0 74.68432,31.11202,0 74.69459000000002,31.05396,0 74.56112,31.04559,0 74.55499,30.99505,0 74.43221,30.94277,0 74.40063000000001,30.88415000000001,0 74.31693,30.88944,0 74.16109,30.66167,0 74.04886999999999,30.59916000000001,0 74.05025999999999,30.515,0 73.99609,30.505,0 73.93380000000002,30.41625,0 73.8725,30.3901,0 73.8586,30.36028,0 73.93442,30.31416,0 73.96442,30.23472,0 73.93341,30.136,0 73.39749000000001,29.94277,0 73.26527,29.55306,0 73.08638000000001,29.24582,0 72.98888,29.14194000000001,0 72.94832,29.03583,0 72.38970999999999,28.785,0 72.29221,28.68,0 72.20663999999999,28.4025,0 71.91998,28.12082,0 71.89694,27.96194,0 71.62691,27.87611,0 71.22581,27.84583,0 70.86665000000001,27.70693,0 70.73775999999999,27.73138,0 70.6622,27.86333000000001,0 70.6636,27.92833,0 70.51443,28.03917,0 70.36832,28.02083,0 70.20354,27.88558,0 70.11971,27.81611,0 70.0311,27.59055,0 69.86749,27.40861,0 69.58333,27.17833,0 69.50972,26.99221,0 69.48609999999999,26.80638,0 69.51277,26.74667000000001,0 69.72276000000001,26.66527,0 69.80081,26.59416,0 70.07138000000001,26.59611,0 70.17192,26.55277,0 70.17386999999999,26.24444,0 70.09276,26.08,0 70.1172,25.91888000000001,0 70.29276000000002,25.70138,0 70.38611,25.67472,0 70.60637,25.71416,0 70.66638,25.69833,0 70.67747,25.40166,0 70.75333000000001,25.27389000000001,0 70.8797,25.15611,0 70.9422,24.93555,0 71.07743000000001,24.68047,0 70.99276,24.6361,0 70.97971,24.56056,0 71.00555,24.54084,0 71.0061,24.45805,0 71.08194,24.44861,0 71.10581999999999,24.41638,0 71.02916999999999,24.36361,0 70.92804,24.36167,0 70.86443,24.31694,0 70.88582,24.27444,0 70.79082,24.23944,0 70.65054000000001,24.24138,0 70.58443,24.27834,0 70.56776000000001,24.37138,0 70.60081,24.415,0 70.56749000000002,24.43639,0 70.12009000000001,24.30904,0 70.07071000000002,24.19792,0 70.01470999999999,24.16972000000001,0 69.72360000000001,24.17111,0 69.59860000000001,24.28139,0 69.31081,24.29666,0 69.18941,24.25805,0 69.08028,24.29722,0 68.98803,24.25694,0 68.92693,24.32555,0 68.85804,24.24166,0 68.82471000000001,24.33278,0 68.78306000000001,24.33278,0 68.74525,24.31639,0 68.74721,23.96999,0 68.39055000000001,23.96749000000001,0 68.37637000000001,23.94417,0 68.36193,23.97388,0 68.33054,23.91472,0 68.29053999999999,23.94444,0 68.28194000000001,23.89777,0 68.21442,23.86833,0 68.1978,23.76668,0 68.21388,23.68055,0 68.28027,23.66666,0 68.23054999999999,23.64361,0 68.2011,23.66417,0 68.14028,23.60471,0 68.32138999999999,23.58083,0 68.44747,23.72693,0 68.58804000000001,23.76695,0 68.62831,23.82611,0 68.81833,23.87638000000001,0 68.66887,23.80972,0 68.63638,23.75722,0 68.46693000000001,23.65304,0 68.48553,23.61,0 68.42331,23.62722,0 68.40292,23.51842,0 68.39158999999999,23.4551,0 68.43692,23.42638,0 68.46278,23.43944,0 68.47638000000001,23.40027,0 68.53804,23.41805,0 68.51105,23.36989,0 68.53916,23.27833,0 68.56887999999999,23.25,0 68.62053,23.26777,0 68.5936,23.22888,0 68.66665999999999,23.14222,0 69.14346999999999,22.8714,0 69.20937000000001,22.73017,0 69.13518999999999,22.5504,0 69.06914,22.48121,0 68.96388,22.38445,0 68.94274,22.32166,0 68.96278,22.24777,0 69.22942000000001,21.94722,0 69.36053,21.84722,0 69.38970999999999,21.87444,0 69.40331999999999,21.80306,0 69.59582,21.63333,0 69.80888,21.46361,0 70.01582999999999,21.18611,0 70.26028,20.97666,0 70.52777,20.81111,0 70.83138,20.69444,0 70.96608999999999,20.70277,0 71.01195000000001,20.74166,0 71.46693000000001,20.88194,0 71.56191,20.97861,0 71.56026,20.94611,0 72.04886999999999,21.16083,0 72.11053,21.20194,0 72.08611000000001,21.24471,0 72.10387,21.30972,0 72.24249,21.46527,0 72.30326,21.63418,0 72.52789,21.67045,0 72.61156,21.47095,0 72.59081999999999,21.41195,0 72.6947,21.46972,0 72.75499000000001,21.46472,0 72.56667,21.3825,0 72.64776999999999,21.35889,0 72.58249000000001,21.34138,0 72.60988999999999,21.25536,0 72.61248999999999,21.12068,0 72.62608,21.08472,0 72.66921000000001,21.093,0 72.70011,21.07702,0 72.70739,21.07498,0 72.73706,20.99305,0 72.78471999999999,21.00082,0 72.89109999999999,20.97888,0 72.83098,20.92505,0 72.79096,20.87397,0 72.83443,20.83416,0 72.89305,20.87305,0 72.88916999999999,20.79555,0 72.92110000000001,20.81583,0 72.94609,20.75833,0 72.90166000000001,20.73222,0 72.88527000000001,20.51305,0 72.75359,20.295,0 72.72745999999999,20.13218,0 72.64748,19.84666,0 72.67525999999999,19.74611,0 72.73220000000001,19.78277,0 72.73165,19.70555,0 72.68831,19.72111,0 72.71693000000001,19.5475,0 72.74249,19.51056,0 72.73305000000001,19.57805,0 72.79443000000001,19.52361,0 72.87916000000001,19.52778,0 72.74359,19.47611,0 72.75443,19.36972,0 72.79776,19.32611,0 72.96388,19.30917,0 73.04722,19.21726,0 73.01609999999999,19.20583,0 72.96971000000001,19.29166,0 72.77748,19.30861,0 72.77638,19.20388,0 72.82666,19.25056,0 72.77998,19.16027,0 72.82082,19.17277,0 72.82249,19.03777,0 72.76999000000002,18.94306,0 72.80247,18.95304,0 72.80582,18.895,0 72.85741,18.79465,0 72.85748,18.64805,0 72.91443000000001,18.55277,0 72.9611,18.55139000000001,0 73.01694000000001,18.46722,0 72.99387,18.4561,0 72.95139,18.52944,0 72.90916,18.52638,0 72.90694000000001,18.36249,0 72.98581,18.28389,0 73.06499,18.27389,0 73.07887,18.21472,0 73.05165,18.18305,0 73.05663000000001,18.22138,0 72.97165000000001,18.23944,0 72.93803,18.27945,0 72.92221000000001,18.22722,0 72.96915,18.18694,0 72.97971,18.06305,0 73.04443000000001,18.05167000000001,0 73.00054,18.01444,0 73.03498999999999,17.98472,0 73.01166000000001,17.94805,0 73.10914,17.76972,0 73.11443,17.63666,0 73.14166,17.59361,0 73.19914,17.58638,0 73.12776,17.56611,0 73.12776,17.53943,0 73.18581,17.44027,0 73.15998999999999,17.40055,0 73.24442999999999,17.28417,0 73.18359,17.29888,0 73.2747,17.08194,0 73.27139,17.03056,0 73.24832000000002,17.03555,0 73.28805,16.98166,0 73.26972000000001,16.85333,0 73.30971,16.80583,0 73.29109,16.7575,0 73.31693,16.62861,0 73.37276,16.62305,0 73.37276,16.59249,0 73.30859,16.60306,0 73.36774,16.55861,0 73.36054,16.51222,0 73.31581,16.55695,0 73.30165,16.5225,0 73.38194,16.39861,0 73.35581999999999,16.36889,0 73.40998999999999,16.21749,0 73.43804,16.21832,0 73.44776,16.10889,0 73.45499,16.16916,0 73.48859,16.18,0 73.44776,16.05584,0 73.51331999999999,16.01972,0 73.48553,15.99139,0 73.59387,15.89278,0 73.64943,15.78416,0 73.64193,15.74027,0 73.69721,15.72195,0 73.71638,15.61972,0 73.83526000000001,15.65944,0 73.73081999999999,15.59777,0 73.75832,15.49471,0 73.86388,15.53472,0 73.86499000000002,15.50667,0 73.78859,15.455,0 73.91692999999999,15.41916,0 73.96361,15.36361,0 73.91249000000001,15.40111,0 73.78610000000001,15.39805,0 73.88054,15.35971,0 73.96082000000001,15.15472,0 73.91553999999999,15.07805,0 74.01999000000001,15.00055,0 74.03361,14.91722,0 74.10136,14.86709,0 74.12303000000001,14.84417,0 74.20914999999999,14.89527,0 74.23499,14.87471,0 74.08971,14.79777,0 74.19414000000002,14.71444,0 74.22331,14.73777,0 74.25082999999999,14.71889,0 74.26470999999999,14.62222,0 74.33859,14.60611,0 74.28831,14.58417,0 74.30081,14.52166,0 74.3336,14.51555,0 74.35803,14.56833,0 74.42443,14.47611,0 74.39444,14.45332,0 74.35138000000001,14.51028,0 74.40942,14.29445,0 74.51186,14.24342,0 74.42525999999999,14.24861,0 74.49442999999999,14.01639,0 74.61913,13.8325,0 74.65721000000002,13.65972,0 74.68193000000001,13.70611,0 74.73443,13.65222,0 74.66388000000002,13.63194,0 74.67609,13.51028,0 74.71249000000002,13.46806,0 74.70139,13.41056,0 74.68248000000001,13.46278,0 74.68665,13.37833,0 74.77916999999999,13.08389,0 74.81026000000001,12.86472,0 74.84276,12.84556,0 74.93998000000001,12.87111,0 74.85999,12.82389,0 74.82332,12.83361,0 74.85526,12.755,0 75.10721,12.22,0 75.17613,12.06975,0 75.19582,12.00389,0 75.2186,12.01806,0 75.27831999999999,11.96194,0 75.25912,12.01889,0 75.29636000000002,12.03777,0 75.33167,12.01472,0 75.27442000000001,12.00777,0 75.30971,11.95222,0 75.39388,11.97222,0 75.39664999999999,11.91611,0 75.30775,11.93806,0 75.31219,11.90056,0 75.52858999999999,11.70027,0 75.61304,11.47166,0 75.67859,11.44583,0 75.7411,11.36306,0 75.72553000000001,11.32972,0 75.90748000000001,10.80333,0 75.93858,10.79277,0 75.92416,10.75556,0 76.05553999999999,10.505,0 76.15776,10.19527,0 76.20663999999999,10.20306,0 76.19497,10.26445,0 76.24109,10.22666,0 76.17747,10.17,0 76.19637,10.06528,0 76.23437,9.986049,0 76.23848,9.953955000000002,0 76.31582,9.463608000000001,0 76.44247,9.143325000000001,0 76.41914,9.249165,0 76.46138000000001,9.149445,0 76.48387,9.161667,0 76.47581,9.115550000000001,0 76.45471000000001,9.122499,0 76.52694,8.938890000000001,0 76.55692999999999,8.990829,0 76.55859,8.95166,0 76.57720999999999,8.994166999999999,0 76.66748,9.003609000000001,0 76.62943,8.981945,0 76.65860000000001,8.964998,0 76.60053000000001,8.971947,0 76.57082,8.939159,0 76.61414000000001,8.928890000000001,0 76.60415999999999,8.90972,0 76.54498,8.930277,0 76.54387,8.907496999999999,0 76.9986,8.365273999999999,0 77.30304,8.123327,0 77.54082,8.069715,0 77.5872,8.134722,0 77.77554000000001,8.181108,0 77.79275,8.225,0 77.99693000000001,8.338328000000001,0 78.06053,8.364167,0 78.13164999999999,8.486667000000001,0 78.13997999999999,8.617221000000001,0 78.11192,8.654715,0 78.21053000000001,8.75555,0 78.20804,8.781658999999999,0 78.16361000000002,8.754165,0 78.19247,8.904166999999999,0 78.39664999999999,9.089721000000001,0 78.65637,9.147779,0 78.66221,9.176660999999999,0 78.97110000000001,9.273607999999999,0 79.27222,9.252773,0 79.44081,9.148337,0 79.69427,9.086679,0 79.88623,8.969967000000001,0 79.91638000000002,8.931663,0 79.92596,8.795825000000001,0 79.77399000000001,8.533196,0 79.69804000000001,8.217504,0 79.70638,8.035830000000001,0 79.79694000000001,7.661394,0 79.82639,7.198893000000001,0 79.86248999999999,7.155837,0 79.8436,7.125272000000001,0 79.80748,7.192214,0 79.85831,7.024167000000001,0 79.85137,6.83639,0 79.98648,6.432363,0 80.02666000000001,6.268337000000001,0 80.12581,6.093891,0 80.20081999999999,6.026112000000001,0 80.44026,5.96555,0 80.46471,5.933340000000001,0 80.59193000000001,5.918336,0 80.71638,5.956946,0 80.8186,6.037776,0 81.11887,6.112503000000001,0 81.19609,6.181946,0 81.21138000000001,6.160284,0 81.32417,6.198327,0 81.66110000000001,6.440003000000001,0 81.78221000000001,6.624720000000001,0 81.89166,7.013609,0 81.87886,7.312221000000001,0 81.82656,7.473186000000001,0 81.80025999999999,7.610552,0 81.69465,7.757684,0 81.59305000000001,7.838892,0 81.56944000000001,7.983891000000001,0 81.51555000000002,8.003052,0 81.46361,8.112769999999999,0 81.43359,8.085824000000002,0 81.39027,8.140003999999999,0 81.39916,8.187497000000001,0 81.4397,8.101395,0 81.44331,8.173889000000001,0 81.39499000000001,8.340831,0 81.35498,8.366382,0 81.35442000000001,8.403893,0 81.39137,8.367217999999999,0 81.36136999999999,8.487215000000001,0 81.32026999999999,8.520002,0 81.26555000000001,8.453609,0 81.16775,8.514998,0 81.13054,8.500005,0 81.16137000000001,8.534447999999999,0 81.21388,8.508609,0 81.20833,8.570826,0 81.25221000000001,8.542214,0 81.20555000000002,8.608059000000001,0 81.23109,8.651106,0 80.97971,8.973611999999999,0 80.92081000000002,8.935551,0 80.93027000000001,8.979444000000001,0 80.87608,9.036395000000001,0 80.95750000000001,9.010556000000001,0 80.89249,9.111392,0 80.83222000000001,9.139715000000001,0 80.88388000000001,9.138609000000001,0 80.82444000000001,9.261945000000001,0 80.79665,9.266660999999999,0 80.80582000000001,9.240273,0 80.73499,9.302498999999999,0 80.80193,9.292769,0 80.36803000000002,9.653893999999999,0 80.24818999999999,9.827252,0 79.93916,10.12232,0 79.85971000000001,10.29538,0 79.84081999999999,10.81778,0 79.83110000000001,11.345,0 79.76389,11.36,0 79.67192,11.29556,0 79.76667000000001,11.38389,0 79.82249,11.37333,0 79.75139,11.54916,0 79.78386999999999,11.775,0 79.86720000000001,12.03277,0 80.0061,12.23027,0 79.94193,12.22305,0 80.03360000000001,12.27861,0 80.16025999999999,12.47305,0 80.25888000000001,12.78221,0 80.26277,12.94916,0 80.34972000000001,13.33417,0 80.22581,13.68,0 80.24748,13.80889,0 80.14915000000002,14.01111,0 80.12886,14.23667,0 80.03999,14.19528,0 80.07916,14.24472,0 80.13721000000001,14.25639,0 80.17415,14.34389,0 80.19859,14.57027,0 80.14413999999999,14.56555,0 80.18221,14.59638,0 80.15331000000001,14.67445,0 80.10578000000001,14.78102,0 80.04886999999999,15.04889,0 80.09081999999999,15.30916,0 80.20637000000002,15.48861,0 80.27943000000001,15.69917,0 80.55415000000001,15.87694,0 80.68552,15.88306,0 80.65776,15.88861,0 80.67137000000001,15.90583,0 80.80443000000001,15.84472,0 80.81507000000001,15.71571,0 81.01727,15.77555,0 81.00171,15.84445,0 81.15837000000001,15.97527,0 81.15782,16.05306,0 81.25944000000001,16.27662,0 81.41947999999999,16.33777,0 81.54474999999999,16.34416,0 81.54504000000001,16.37305,0 81.5856,16.33721,0 81.72726,16.31083,0 82.07449,16.44305,0 82.30199,16.575,0 82.28032,16.61944,0 82.31226,16.60444,0 82.34644,16.70472,0 82.37195,16.86854,0 82.36449,16.93222,0 82.35971000000002,16.82056,0 82.27222,16.86222,0 82.2486,16.92027,0 82.31331,17.04556,0 82.50555,17.22305,0 82.50565,13.81117,0 82.50581,8.811171,0 82.50595000000001,3.811175,0 82.5061,-1.188829,0 82.50624999999999,-6.188824,0 82.5064,-11.18883,0 82.50655,-16.18883,0 82.50658,-17.48883,0 82.50671,-22.48882,0 82.50684,-27.48883,0 82.50697,-32.48883,0 82.50700000000002,-33.68883,0 82.50713,-38.68883,0 82.50727999999999,-43.68883,0 82.5074,-48.68883000000001,0 82.50753000000002,-53.68882000000001,0 82.50766,-58.68883,0 82.5078,-63.68882,0 82.50792,-68.68883,0 82.50802,-72.28883000000002,0 82.50816,-77.28883,0 82.50829,-82.28883,0 82.50834999999999,-84.89999,0 82.50848000000001,-89.90000000000001,0 81.50870000000001,-89.90000000000001,0 80.50892,-89.90000000000001,0 79.50912000000001,-89.90000000000001,0 78.50934,-89.90000000000001,0 77.50954000000002,-89.90000000000001,0 76.50977,-89.90000000000001,0 75.50998,-89.90000000000001,0 74.5102,-89.90000000000001,0 73.51040999999999,-89.90000000000001,0 72.51063000000001,-89.90000000000001,0 71.51083,-89.90000000000001,0 70.51105,-89.90000000000001,0 69.51125,-89.90000000000001,0 68.51148000000001,-89.90000000000001,0 67.51170000000001,-89.90000000000001,0 67.51170000000001,-89.64822,0 67.51170000000001,-84.64822,0 67.51170000000001,-79.64822,0 67.51170000000001,-76.88749,0 67.51170000000001,-71.88749,0 67.51170000000001,-66.88749,0 67.51170000000001,-61.88749000000001,0 67.51170000000001,-56.88749,0 67.51170000000001,-51.88749,0 67.51169000000002,-46.88749,0 67.51169000000002,-41.88749,0 67.51169000000002,-39.58749,0 67.51169000000002,-34.58749,0 67.51169000000002,-29.58749,0 67.51169000000002,-24.58749,0 67.51169000000002,-22.17509,0 67.51169000000002,-17.17509,0 67.51169000000002,-12.17509,0 67.51169000000002,-7.175088,0 67.51169000000002,-2.175094,0 67.51169000000002,2.82491,0 67.51169000000002,7.824905,0 69.14654,7.824959000000001,0 74.14655000000001,7.825121,0 74.14655000000001,12.15223,0 72.51169,12.15223,0 67.51169000000002,12.15223,0 67.51169000000002,13.87695,0 67.51169000000002,18.87694,0 67.51169000000002,23.87695,0 67.48248,23.89583,0 67.53803000000002,23.93813000000001,0 67.50583,23.92138,0 67.50054,23.97499,0 67.45277,23.98666,0 67.3633,24.06714,0 67.28166,24.28083000000001,0 67.29803,24.33944,0 67.35942,24.34249,0 67.27887,24.35694,0 67.28554,24.43639,0 67.25722,24.41361,0 67.21361000000002,24.50361,0 67.22971,24.53305,0 67.18165000000001,24.57972,0 67.25166,24.58916,0 67.15637000000001,24.6075,0 67.14679,24.6441,0 67.07283000000001,24.7676,0 66.96082,24.83861,0 66.9511,24.80472,0 66.85943,24.85444,0 66.65028,24.82611,0 66.70499,24.89167,0 66.67415,24.93388,0 66.73276,25.19749,0 66.54637,25.3629,0 66.49576999999999,25.39812,0 66.26389,25.46778,0 65.84665,25.41667,0 65.66776,25.34278,0 65.46642,25.38267,0 65.38777,25.3625,0 65.38611,25.39056,0 65.25417,25.37749,0 65.13970000000001,25.28778,0 64.76888,25.32138,0 64.66776000000002,25.25694,0 64.66499,25.20944,0 64.70999000000001,25.18027,0 64.61998,25.16999,0 64.63109,25.22056,0 64.59276,25.25556,0 64.51666,25.26944,0 64.43497000000001,25.23111000000002,0 64.25555,25.31472,0 64.09166999999999,25.32861000000001,0 64.06299,25.33679,0 63.92917000000001,25.33416,0 63.7486,25.38527,0 63.57249,25.36,0 63.46998,25.28028,0 63.52361,25.21361,0 63.50500000000002,25.18861,0 63.15583,25.25638,0 63.00805,25.21471,0 62.74471,25.25945,0 62.52693,25.25556,0 62.46444,25.23638,0 62.48554000000001,25.20944,0 62.36221000000001,25.17332,0 62.33638,25.12778,0 62.39111000000001,25.10221,0 62.35305,25.09195,0 62.28167000000001,25.105,0 62.31917,25.14277,0 62.29527,25.19916,0 62.16777,25.21638,0 62.07777000000002,25.18138,0 62.10444,25.10167,0 61.91137000000001,25.11277,0 61.86193000000001,25.09277,0 61.83721,25.03444,0 61.72444,25.0525,0 61.78221,25.19027000000001,0 61.61103000000001,25.19764,0 61.64695,25.30611,0 61.66859000000001,25.63277,0 61.70361000000001,25.67667000000001,0 61.68638,25.795,0 61.77583000000001,25.81861,0 61.84416,26.21166,0 61.87610000000001,26.24638,0 62.10388,26.31444,0 62.12887,26.34444,0 62.13583000000001,26.38083,0 62.27803000000001,26.35402,0 62.27138,26.42472,0 62.32027000000001,26.51527,0 62.44609,26.56888,0 62.74305,26.61167,0 62.77276000000001,26.64972,0 63.17638000000001,26.63111,0 63.20638,26.84222,0 63.29056,26.89222,0 63.25916,26.93443,0 63.25305,27.08361,0 63.27859,27.12194,0 63.34194,27.1225,0 63.28832,27.21861,0 63.20583,27.2675,0 62.93333000000001,27.21333,0 62.82305000000002,27.23027,0 62.76471,27.27194,0 62.79583,27.28555,0 62.80694,27.32332,0 62.77833,27.35333,0 62.83972,27.47443000000001,0 62.82193,27.76027,0 62.75777,28.00027,0 62.78138,28.26695,0 62.59249,28.2336,0 62.40499,28.41722,0 61.90554,28.555,0 61.58138000000001,28.88083,0 61.53361000000001,29.0125,0 61.48804000000001,29.04361,0 61.51111,29.08861,0 61.42471,29.15528000000001,0 61.36027,29.26583000000001,0 61.3586,29.38444000000001,0 61.31443000000001,29.39583,0 60.86630000000002,29.86366,0 62.48444,29.40611,0 63.5872,29.50389,0 64.12221,29.38861,0 64.21138000000001,29.4986,0 64.47859,29.57306,0 64.69553000000001,29.58638,0 65.03416,29.54111,0 66.25664999999999,29.85194,0 66.36221000000001,29.9561,0 66.23831000000001,30.07138,0 66.32527,30.23778,0 66.35165000000001,30.44527,0 66.28194000000001,30.57528,0 66.39554,30.94083,0 66.57277000000001,30.98138,0 66.68414,31.08611,0 66.72304,31.21222,0 66.79304000000001,31.21972,0 66.84166999999999,31.2725,0 66.95694,31.31806,0 67.04276,31.31639,0 67.05582,31.24305,0 67.25648,31.22233,0 67.38472,31.21527,0 67.79192000000001,31.3411,0 67.77303000000001,31.40861,0 67.66775,31.4,0 67.61526000000002,31.42777,0 67.57555000000001,31.53194,0 67.73193000000001,31.52916,0 67.88193,31.63805,0 67.98054999999999,31.63583,0 68.07165999999999,31.69527,0 68.16609,31.83305,0 68.27222,31.77166,0 68.53137,31.72693,0 68.57165999999999,31.76527000000001,0 68.43719,31.78667,0 68.51944,31.825,0 68.70722000000001,31.78111000000001,0 68.72803999999999,31.70416000000001,0 68.83305,31.60388,0 69.01944,31.65055,0 69.09972000000001,31.70667,0 69.2244,31.87129,0 69.32825,31.94036,0 69.27193,32.14527,0 69.29137,32.3175,0 69.24802,32.44388,0 69.28749000000001,32.52639,0 69.37776,32.56833,0 69.45833,32.67054,0 69.39499000000001,32.77388,0 69.51277,32.86944,0 69.49081,33.00388,0 69.58083000000001,33.08693,0 69.70081999999999,33.07777,0 69.79137,33.12694,0 69.88109,33.08999,0 70.02888,33.13583000000001,0 70.06776000000001,33.20499,0 70.14499000000001,33.20249,0 70.32693,33.33193,0 70.28610000000001,33.42276,0 70.16804000000001,33.52083,0 70.19664,33.64083,0 70.15138,33.66554,0 70.1375,33.73249000000001,0 69.98554,33.75306,0 69.86913,33.92999,0 69.90637,34.03527,0 70.00276,34.05277000000001,0 70.49136,33.94305,0 70.89109999999999,33.96638,0 70.90555000000001,34.01333,0 70.98109,34.00889,0 71.07720999999999,34.05222,0 71.07720999999999,34.11277,0 71.13554000000001,34.1661,0 71.11832,34.26027,0 71.15886999999999,34.34833,0 71.00054,34.46305,0 70.98748999999999,34.5511,0 71.0886,34.55943,0 71.09583000000001,34.67666,0 71.22553000000001,34.74444,0 71.30914000000001,34.88361,0 71.49890000000001,34.96635,0 71.53803000000001,35.01972,0 71.53554,35.08665,0 71.66388000000001,35.19555,0 71.54859999999999,35.30111,0 71.64943,35.42499,0 71.60193,35.50055,0 71.61665000000001,35.55526,0 71.50888000000001,35.62083,0 71.54526,35.71111,0 71.49082,35.75667,0 71.43997,35.87082,0 71.38721,35.89695,0 71.38499,35.94194,0 71.18706,36.04219,0 71.3389,36.20492,0 71.41252000000002,36.22043,0 71.50725,36.31537,0 71.5789,36.33173,0 71.56305999999999,36.37228,0 71.63307,36.46555,0 71.80834,36.40364,0 71.79584,36.49164,0 71.90443000000001,36.50722,0 72.07471,36.58915,0 72.07916,36.63162,0 72.18163,36.64969,0 72.17554,36.7113,0 72.47416,36.7624,0 72.55663,36.82126,0 73.6683,36.90964,0 73.8522,36.89273000000001,0 74.03831,36.81468,0 74.12109000000001,36.83858000000001,0 74.15166000000001,36.90387,0 74.25194000000001,36.89917,0 74.41998,37.00144,0 74.48888,37.01034000000001,0 74.55304,36.96173000000001,0 74.56543000000001,37.02782,0 74.69081,37.06259,0 + + + + + +70.25215,-6.970275,0 70.25215,-9.433405000000001,0 73.35092,-9.431101,0 73.34769,-6.970275,0 70.25215,-6.970275,0 + + + 1 + + + + + +78.59721999999999,72.20972,0 78.67693,72.17944,0 78.80803,72.18332000000001,0 78.7711,72.17027,0 78.91165,72.14444,0 78.91081,72.11471,0 79.01859,72.11998,0 79.09193000000001,72.10165000000001,0 79.09444000000001,72.07055,0 79.38275000000002,72.06219,0 79.42276,72.03554,0 79.69692000000001,72.05915,0 79.86720000000001,72.02249000000001,0 79.91002,71.98448000000001,0 80.23093,71.94193,0 80.24838,71.91006,0 80.34878999999999,71.88601,0 80.2719,71.87848,0 80.27464000000001,71.85148,0 80.17328999999999,71.86931,0 80.03504,71.83147,0 80.12739999999999,71.7749,0 80.06631,71.76943,0 80.13540999999999,71.67453,0 79.86972,71.60027,0 79.38026000000001,71.61637,0 79.33138,71.59775999999999,0 79.39082000000001,71.54387,0 79.3586,71.49413,0 79.14027,71.42165,0 79.1747,71.34609,0 79.22915999999999,71.3175,0 79.50832,71.29331999999999,0 79.96638,71.13109,0 80.55004,71.05757,0 80.56647,70.85477,0 80.69016000000001,70.80186000000001,0 80.59229000000001,70.71675000000001,0 80.75629000000001,70.66586,0 80.72072,70.5945,0 80.6601,70.57407000000001,0 80.66569,70.51388,0 80.60648999999999,70.50095,0 80.67014000000002,70.44623,0 80.79858,70.44119000000001,0 80.79106,70.41504999999999,0 80.72770000000001,70.41077,0 80.76217,70.39443,0 80.70740000000001,70.39100999999999,0 80.69155000000001,70.42319999999999,0 80.62567,70.42167000000001,0 80.57176,70.46187999999999,0 80.17683,70.43655,0 80.18601000000001,70.39182,0 80.08208999999999,70.39373000000001,0 80.11404,70.36096000000001,0 79.85748,70.27222000000002,0 79.7247,70.28415000000001,0 79.70360000000001,70.26999000000001,0 79.73831,70.24887,0 79.70889,70.23859,0 79.62943,70.22109,0 79.49887,70.11053,0 79.32805000000001,70.14888000000001,0 79.34943,70.04498,0 79.19443,70.05165,0 79.17859,70.03498,0 79.21860000000001,70.01166000000001,0 79.11971,70.00664999999999,0 79.18747999999999,69.96416000000002,0 78.96582000000001,69.88026000000002,0 78.87527,69.88164999999999,0 79.01888,69.83499999999999,0 78.97582000000001,69.81165,0 79.06331,69.78664000000001,0 79.06638,69.74721,0 79.13970999999999,69.74303999999999,0 79.00417,69.69693,0 79.50583,69.65358999999999,0 79.49165000000001,69.63638,0 79.5372,69.63081,0 79.50082,69.60471,0 79.59583000000001,69.58832,0 79.63916999999999,69.48582,0 79.74082,69.44832,0 79.71388,69.43248,0 79.82805000000001,69.42249,0 79.82278,69.39444,0 79.8772,69.37276,0 79.85914000000001,69.34610000000001,0 80.14597999999999,69.36324999999999,0 80.76669000000001,69.30504000000001,0 80.79311,69.26394999999999,0 80.95596000000001,69.20667,0 81.33582,69.28803000000001,0 81.44414,69.25443000000001,0 81.58249000000001,69.27582,0 81.64028,69.31135999999999,0 81.61387000000002,69.32833000000001,0 81.62302,69.41526,0 81.67249,69.44832,0 81.7811,69.43137,0 81.93611,69.34665,0 81.75972000000002,69.25249000000001,0 81.81331,69.20055000000001,0 82.46388,69.16054,0 82.46138999999999,69.12442,0 82.50472000000002,69.10831,0 82.31638,69.05387,0 82.49721,68.98775999999999,0 82.5522,68.81833,0 82.78288000000001,68.79881,0 82.80164000000001,68.74082,0 83.04276,68.66776,0 82.9011,68.62527,0 82.69302999999999,68.63275,0 82.58999,68.60276,0 82.55859000000001,68.61111,0 82.54915,68.61443,0 82.45610000000001,68.57832999999999,0 82.68053999999999,68.49137,0 82.71249,68.40443000000001,0 82.68443000000001,68.34636999999999,0 82.70663999999999,68.29331999999999,0 82.57361,68.25583,0 82.52332000000001,68.20694,0 82.54359,68.17276,0 82.39276,68.17747,0 82.35693000000001,68.09583000000001,0 82.39610999999999,68.05914,0 82.37442,67.94914,0 81.98888,67.96332,0 81.8772,67.93165999999999,0 81.76194,67.95247999999999,0 81.72443000000001,67.92415,0 81.90304999999999,67.77778000000001,0 82.10554999999999,67.72887,0 82.08055,67.68858,0 82.11913,67.68747999999999,0 82.04109,67.65665,0 82.11416,67.59943,0 82.39664999999999,67.53498999999999,0 82.35138000000001,67.50109999999999,0 82.38054,67.47971,0 82.32971000000001,67.48109,0 82.2336,67.42081,0 82.33778,67.3608,0 82.2811,67.34887000000001,0 82.3647,67.33055,0 82.21833,67.31137,0 82.25915999999999,67.27998,0 82.18165999999999,67.28803000000001,0 82.19721,67.25943,0 82.11942999999999,67.23888000000001,0 83.04109,66.89221000000002,0 83.06192,66.88081,0 83.02748,66.85971000000001,0 83.17249,66.80914,0 83.1836,66.74748,0 83.30582,66.66165,0 83.08666,66.61053,0 83.08693,66.46972,0 83.12469,66.42165,0 83.34415,66.34193000000001,0 83.53970000000001,66.19525,0 83.37109,66.13666000000001,0 83.28943,66.06693,0 83.37276000000001,65.9836,0 83.52804999999999,65.90443000000001,0 83.50637,65.82944000000001,0 83.59108999999999,65.7736,0 84.01111,65.79832,0 84.17665,65.7,0 84.32249,65.67609,0 84.31914999999999,65.66943000000001,0 84.29276000000002,65.6122,0 84.19054,65.59444000000001,0 84.45028000000001,65.54554,0 84.55464000000001,65.43516,0 84.50194000000001,65.39664999999999,0 84.58832,65.31303,0 84.52443,65.21278,0 84.40999000000001,65.19082,0 84.3111,65.09860000000001,0 84.31386999999999,65.05721,0 84.38108,65.03276,0 84.39665000000001,64.99387,0 84.27804999999999,64.94054,0 84.29137,64.9011,0 84.90665,64.93026999999999,0 84.97748,64.88666000000001,0 84.93222,64.82639,0 85.09444000000001,64.81219,0 85.14694,64.75166,0 85.54694000000001,64.83028,0 85.86081,64.75526000000001,0 85.80859,64.64749000000001,0 85.91804000000001,64.5836,0 85.84526,64.50749,0 85.84081999999999,64.45889,0 85.92359999999999,64.41721,0 85.94970000000002,64.32832999999999,0 86.0311,64.27528,0 85.93248000000001,64.12776,0 85.96776,64.09775999999999,0 85.95804,64.05443,0 85.51639,63.93000000000001,0 85.36693,63.81333,0 85.33998,63.70693000000001,0 85.26721000000001,63.64638000000001,0 85.17693,63.59137,0 85.08998,63.60860000000002,0 85.03203000000001,63.58649000000001,0 85.08194,63.53638000000001,0 85.21193,63.50306000000001,0 85.2961,63.51583,0 85.37415,63.46220000000002,0 85.38970000000002,63.42333000000001,0 85.35276,63.40276999999999,0 85.40776,63.35,0 85.55942,63.37499,0 85.67387000000001,63.35443999999999,0 85.53665,63.26083,0 85.47832,63.17054,0 85.46638,63.13805,0 85.58716000000001,63.06996,0 85.49332,62.99027000000001,0 85.52083,62.93277,0 85.4511,62.88277,0 85.33249000000001,62.87331,0 85.2372,62.81444000000001,0 85.07777,62.67138000000001,0 85.09860000000001,62.6386,0 84.94803000000002,62.59137000000001,0 84.89055000000001,62.54220999999999,0 84.91387,62.49944000000001,0 84.85915,62.44778,0 84.72638000000001,62.40694,0 84.43692,62.18915,0 84.55441999999999,61.99694,0 84.51666,61.93915,0 84.55749,61.89472000000001,0 84.63388999999999,61.87971000000001,0 84.68749,61.8061,0 85.00805,61.78416,0 85.24832000000001,61.68526000000001,0 85.38582000000001,61.70167,0 85.46777,61.62860000000001,0 85.72275999999999,61.57361,0 85.85193,61.59777,0 85.96915,61.54305,0 85.96639,61.46915,0 85.75249,61.43999,0 85.64360000000001,61.38805,0 85.71054,61.29749,0 84.61415,61,0 84.25964000000001,60.85542,0 83.99387,60.82472,0 83.50944,61.04916,0 83.14499000000001,61.03277000000001,0 82.38247,60.71278,0 82.39027,60.61028,0 82.16665,60.51832,0 81.86165,60.65055,0 81.49776,60.61555,0 81.11116,60.6375,0 81.0555,60.68084,0 81.03823000000001,60.75419,0 80.69771000000002,60.80017,0 80.63061,60.76768000000001,0 80.42100000000001,60.76556999999999,0 80.18398999999999,60.66193,0 79.71581999999999,60.69555,0 79.50249,60.68694,0 79.38666000000001,60.64861,0 79.28360000000001,60.71999000000001,0 79.31833,60.79667000000001,0 79.18553,60.83860000000001,0 78.96915000000001,60.82805,0 78.91110000000001,60.78722000000001,0 78.80721,60.77887,0 78.68941,60.83083,0 78.47527,60.77694,0 78.12025,60.80222000000001,0 77.92137,60.74665,0 77.68941,60.82749,0 77.40804,60.81027,0 77.10498,60.85333000000001,0 77.07805000000001,60.72721,0 76.96776,60.71,0 76.96527,60.64111,0 77.03167000000001,60.63277,0 77.04721000000001,60.60361,0 77.03749000000001,60.535,0 76.77443,60.47665,0 76.74471,60.34249000000001,0 76.8186,60.33028000000002,0 76.85165000000001,60.26806000000001,0 76.68719,60.10777000000001,0 76.75888999999999,60.06081,0 76.74136,59.72943000000001,0 76.64554000000001,59.69332,0 76.64833,59.58027,0 76.45583000000001,59.54445,0 76.16304,59.54361,0 75.99082,59.41972,0 75.89749000000001,59.43721000000001,0 75.83138,59.29639,0 75.61526000000001,59.2411,0 75.69054,59.01194,0 75.38164999999999,58.78804,0 75.15028000000001,58.67805,0 75.17081,58.6186,0 75.10526,58.58111,0 74.89166,58.47776,0 74.87608,58.42722,0 74.79998999999999,58.42694,0 74.62665000000001,58.33915,0 74.62053,58.29361000000001,0 74.45499,58.25861,0 74.20638,58.13361,0 73.08443,58.14916,0 72.93858,58.08749000000001,0 72.96915,58.06055,0 72.87221,58.0061,0 72.12164,58.02304000000001,0 72.07055,58.09415,0 71.98888,58.12471,0 71.23859,58.07111,0 71.24887,58.12194,0 71.21915,58.14695,0 71.24721,58.3561,0 71.30387,58.39749000000001,0 71.11998,58.44887,0 71.07888,58.5286,0 70.87302,58.5425,0 70.43691,57.9336,0 70.37864999999999,57.91712,0 70.44171,57.83843000000001,0 70.42554,57.76639,0 70.48387,57.76777,0 70.49887,57.7075,0 70.57443000000001,57.70916,0 70.57720999999999,57.57861,0 70.66721,57.59276,0 70.69108,57.56666,0 70.68747999999999,57.51445,0 70.42498999999999,57.38916,0 70.51721000000001,57.28695,0 70.65609000000001,57.26416,0 70.60971000000001,57.19916,0 70.69443,57.19305,0 70.78194000000001,57.19916,0 70.75417,57.27749,0 70.81165,57.32804,0 71.10248,57.34083,0 71.09248,57.28999,0 71.14776999999999,57.25139000000001,0 71.09027,57.22055,0 71.23387,57.20027,0 71.37082,57.06360999999999,0 71.61304,56.95693,0 71.65860000000001,56.91470000000001,0 71.67554,56.82638,0 71.58553000000001,56.79445,0 71.54082,56.71915000000001,0 71.39695,56.73305,0 71.39388,56.68472,0 71.34887000000001,56.66916,0 71.16665999999999,56.67138,0 71.05582,56.71028,0 71.03306000000001,56.69221000000001,0 71.11913,56.64555,0 71.09081999999999,56.55555,0 70.95416,56.4911,0 70.85776,56.50305,0 70.75972,56.46111000000001,0 70.78471999999999,56.43665,0 70.86248999999999,56.46389000000001,0 70.94136,56.41167000000001,0 70.93359,56.34694,0 70.76277,56.28667000000001,0 70.77222,56.25471000000001,0 70.84027,56.25695,0 70.81749000000001,56.17333,0 70.91638,56.11055,0 70.80415000000001,55.92028000000001,0 70.47415,55.89166000000001,0 70.47527,55.85222000000001,0 70.59138,55.83611000000001,0 70.75915999999999,55.86332,0 70.78554,55.83306,0 70.58360999999999,55.7961,0 70.54693,55.67499,0 70.7636,55.59778,0 70.69664,55.50638,0 70.54915,55.49138,0 70.48775999999999,55.43859000000001,0 70.46608999999999,55.40499000000001,0 70.50666,55.33777000000001,0 70.46998000000001,55.29667000000001,0 70.39833,55.20917,0 70.28804,55.18721,0 70.23888,55.13888,0 70.05582,55.20776999999999,0 69.94914,55.20416,0 69.84610000000001,55.29500000000001,0 69.67276,55.35443,0 69.35138000000001,55.39443000000001,0 69.23276,55.3325,0 69.18552,55.34388000000001,0 69.16831999999999,55.40054,0 68.95247999999999,55.44471,0 68.9233,55.42416,0 68.93941,55.37028000000001,0 69.00109999999999,55.35361,0 69.00249,55.28749,0 68.93332,55.28611,0 68.87997,55.34276,0 68.73137,55.37055,0 68.70499000000001,55.28667,0 68.63889,55.25555,0 68.62581,55.20192999999999,0 68.30443,55.20527,0 68.19971,55.17833000000001,0 68.24444,55.10471,0 68.33083000000001,55.08056,0 68.25943,55.04888,0 68.20526,54.96609,0 68.03442,54.95027,0 67.9297,54.98332,0 67.83223,54.96332000000001,0 67.76639000000002,54.89194,0 67.58138,54.85443,0 67.32277000000001,54.86749,0 67.24552,54.80665,0 66.80887,54.76666,0 66.72275999999999,54.72694,0 66.49525,54.72304,0 66.10831,54.64500000000002,0 66.11304,54.5425,0 66.15192,54.48555,0 66.1236,54.44500000000001,0 66.16277,54.41945,0 66.15358999999999,54.38055,0 66.21944000000001,54.28055,0 66.11803999999999,54.2375,0 66.20610000000001,54.18333000000001,0 66.27858000000001,54.19028,0 66.35693000000001,54.08444,0 66.21442,54.07694999999999,0 66.00139,53.99471,0 66.03610000000002,53.91805,0 66.07581999999999,53.91526000000001,0 66.06581,53.79277,0 66.16499,53.78111,0 66.18304000000001,53.68249000000001,0 66.11775,53.63082,0 66.11165,53.49276,0 66.25526000000001,53.48555,0 66.26888,53.28277,0 66.26639,53.19388000000001,0 66.41443,53.1686,0 66.40526,53.09972000000001,0 66.20359999999999,53.10443,0 66.08194,53.06277,0 66.07777,52.96305000000001,0 66.41277,52.95222,0 66.40886999999999,52.90331,0 66.14360000000001,52.88610000000001,0 66.13443,52.81998999999999,0 66.05247,52.8186,0 66.02887,52.45304000000001,0 65.58414999999999,52.38972,0 65.58472,52.32777,0 65.46082,52.29639,0 65.04498,52.28027,0 65.05859,52.23165,0 64.75166,52.18166999999999,0 64.74887,52.12832,0 64.80138,52.12444,0 64.80609,52.02555,0 64.925,51.90889,0 65.00888000000001,51.89249,0 65.01666,51.82332,0 64.95775999999999,51.74943,0 65.01138,51.63777,0 64.94247,51.61306,0 64.95444000000001,51.52694,0 64.88415999999999,51.47027,0 65.13164999999999,51.28139000000002,0 65.21608999999999,51.24888000000001,0 65.30359,51.28221,0 65.40694000000001,51.23166,0 65.29498,51.16471,0 65.20583000000001,51.17332,0 64.97776,51.10333,0 64.91415000000001,51.13972,0 64.84972000000001,51.09664999999999,0 64.81944,51.07222000000001,0 64.91553999999999,51.00805,0 64.81386999999999,50.78638,0 64.73027,50.73805,0 64.69275,50.6711,0 64.60415999999999,50.65138000000002,0 64.56219,50.67888,0 64.47248999999999,50.63304999999999,0 64.47837,50.58194000000001,0 64.38943,50.55166,0 64.36461,50.51109,0 64.25,50.54055,0 64.22553000000001,50.51416,0 64.05998,50.57749,0 64.18747999999999,50.7336,0 64.25888000000001,50.75054999999999,0 64.34915000000001,50.87749000000001,0 64.09942,51.03916,0 63.81416,50.93859,0 63.265,50.82638000000002,0 63.20193,50.8772,0 63.13193,50.82222,0 62.93999,50.86555,0 62.86833000000001,50.82110999999999,0 62.78388,50.86056,0 62.42528,50.85695,0 62.19276,50.80443000000001,0 62.23583,50.74138,0 62.18916000000001,50.71000000000001,0 62.25444000000001,50.68249,0 62.38249,50.7225,0 62.50833000000001,50.46805,0 62.69833,50.28305000000001,0 62.71027,50.2122,0 62.86415,50.09777,0 62.94083000000001,49.99138,0 62.90444,49.89415000000001,0 62.73861,49.94778,0 62.57667000000001,49.85277,0 62.59694,49.77999000000001,0 62.45444,49.67888,0 62.48417,49.54805000000001,0 62.37360000000001,49.56833,0 62.30305,49.48638,0 62.35027,49.46944000000001,0 62.54499000000001,49.25111,0 62.35665000000001,49.25944,0 62.33611,49.19971,0 62.46249,49.17638000000001,0 62.56527,49.01082,0 62.84722,48.84332000000001,0 62.97610000000001,48.91194,0 63.10055000000001,48.86055,0 63.05693,48.72249,0 63.09416,48.67943000000001,0 63.41499000000001,48.59249,0 63.47083,48.53583,0 63.76111,48.45082,0 63.91554,48.23388,0 64.01220000000001,48.15694,0 64.13443,47.98499,0 64.28915000000001,47.88832,0 64.01609999999999,47.72165,0 63.19526000000001,47.34083,0 63.14249,47.285,0 62.85190999999999,47.13889,0 62.69305000000001,47.04257,0 63.08611,47.08972,0 63.41805000000001,46.92028000000001,0 64.38889,46.69665000000001,0 64.97026,46.47276,0 65.11913,46.48082000000002,0 65.27638,46.36306,0 65.62943,46.18166000000001,0 66.53555,46.14277,0 67.12168,46.16551,0 67.15776,46.12944000000001,0 67.16988000000001,45.99897000000001,0 67.18192999999999,45.9411,0 67.31441,45.84720999999999,0 67.35831,45.7711,0 67.25333000000001,45.58389,0 67.24942,45.45778000000001,0 67.17833,45.29341,0 67.36275999999999,45.17916,0 67.50499000000001,45.16194,0 67.50360000000001,44.40028,0 67.47887,44.36361,0 67.79832,44.26417,0 67.765,44.23277,0 67.82887000000001,44.15971,0 68.03525999999999,44.06888000000001,0 68.08277,44.00528,0 67.96387000000001,43.94972,0 67.94193,43.90527,0 67.99026000000001,43.80555,0 67.97387000000001,43.69555,0 67.84666,43.74749,0 67.84221000000001,43.58804,0 67.66199,43.37128,0 67.6797,43.30249000000001,0 67.72026,43.37276,0 67.75694,43.36055,0 67.72638000000001,43.35305000000001,0 67.74274,43.33693,0 67.7961,43.33749,0 67.8111,43.30249000000001,0 67.77831000000001,43.27805,0 67.82971000000001,43.24944,0 67.01609999999999,42.8661,0 66.21886000000001,42.42361,0 66.07079,42.42387,0 66.03665,42.42332,0 66.02916999999999,42.00305000000001,0 66.52638000000002,42.00305000000001,0 66.56247999999999,41.71693,0 66.71998000000001,41.17499,0 66.75949000000001,41.16484000000001,0 66.75305,41.11693,0 66.60804,41.11333000000001,0 66.63247,40.93888,0 66.7664,40.88750000000001,0 66.80525,40.76611,0 66.62003,40.49509,0 66.88831999999999,40.47833,0 66.90860000000001,40.24804,0 66.97998,40.17389,0 66.93471,40.125,0 66.9422,40.06333,0 67.03471999999999,40.06888,0 67.02361000000001,40.03277,0 67.10554999999999,39.98611,0 67.47971,39.93194,0 67.50444,39.81554,0 67.38136,39.78055,0 67.37109,39.68777,0 67.29248,39.66555,0 67.29803,39.58611,0 67.44196,39.48359,0 67.41054,39.29916,0 67.36609,39.29361,0 67.37636999999999,39.21249,0 67.69026,39.13805,0 67.70943,38.99666000000001,0 68.12387,38.98554,0 68.19637,38.85444,0 68.15498,38.8086,0 68.08305,38.79445,0 68.10081,38.73916,0 68.05775,38.69694,0 68.07193,38.54138,0 68.1272,38.42444,0 68.21554999999999,38.33221,0 68.33138,38.27333,0 68.38415000000001,38.19555,0 68.27748,37.95889,0 68.15054000000001,37.92805,0 68.07305,37.76528,0 67.83832,37.50583,0 67.81749000000002,37.4461,0 67.83804000000001,37.26194,0 67.77988000000001,37.18582,0 67.75526000000001,37.22054,0 67.64333000000001,37.24722,0 67.55748,37.21555,0 67.49249,37.28083,0 67.39722,37.21749,0 67.23997,37.1861,0 67.18637,37.25805,0 67.11749,37.28028,0 67.09648,37.33997,0 67.00417,37.38221,0 66.67221000000001,37.33833,0 66.53773,37.36638,0 66.44748,37.31860000000001,0 66.40833000000001,37.3461,0 66.28999,37.32472,0 66.09054999999999,37.43167,0 65.84526,37.50444,0 65.78167999999999,37.5715,0 65.77193,37.53749,0 65.68109,37.51694,0 65.64444,37.44887,0 65.65082,37.35555000000001,0 65.55443,37.25638,0 65.07277000000001,37.24444,0 64.82304000000001,37.1386,0 64.77916999999999,37.09583,0 64.79526,36.92305,0 64.61693,36.63638,0 64.61526000000001,36.42361,0 64.47387000000001,36.25555,0 64.33665000000001,36.22471,0 64.28248000000001,36.15193,0 64.18137,36.17054,0 64.09498000000001,36.12332,0 64.05971,36.08805,0 64.06386999999999,36.00027,0 63.92055,36.0375,0 63.77832999999999,35.98054000000001,0 63.60111000000001,35.96443,0 63.52833,35.90499,0 63.34249000000001,35.85722000000001,0 63.11944,35.86193,0 63.12972000000001,35.77527,0 63.24002000000002,35.69928,0 63.09528,35.62609,0 63.12666,35.53361,0 63.10527,35.45083,0 62.92249000000001,35.38417,0 62.72220999999999,35.25472,0 62.55444000000001,35.2336,0 62.46500000000001,35.28861,0 62.30915000000002,35.14166,0 62.26944000000001,35.28583,0 62.13256,35.36806,0 61.99583,35.45832,0 61.80249,35.4111,0 61.59583000000001,35.44415,0 61.40610000000002,35.56388,0 61.37888,35.63527,0 61.27655000000001,35.60725,0 61.22887,35.67805,0 61.26222,35.81972,0 61.22582,35.90388,0 61.12428,35.97565,0 61.16999,35.99527,0 61.16471,36.03527,0 61.22916,36.12666,0 61.18444,36.28667,0 61.15028,36.31499,0 61.18999,36.56777,0 61.1572,36.64999,0 60.33306000000001,36.6561,0 60.27840000000001,36.76272,0 60.02944,37.03695,0 59.91471000000001,37.0586,0 59.81305,37.12471000000001,0 59.67054000000001,37.15611,0 59.62027000000001,37.13194,0 59.56693,37.20888,0 59.47693,37.21889000000001,0 59.49139,37.24833,0 59.39305000000001,37.32306,0 59.38082,37.48555,0 59.33888,37.53916000000001,0 59.25,37.51333,0 59.06027,37.62999,0 58.82278,37.70361,0 58.80444,37.66693,0 58.71277000000001,37.64861,0 58.5625,37.7086,0 58.49805,37.64777,0 58.38915999999999,37.63611,0 58.22748,37.68111,0 58.20304000000001,37.78334000000001,0 58.17443,37.79639,0 58.04694000000001,37.80944,0 57.70805,37.92665,0 57.45028000000001,37.93916,0 57.35306,37.98944,0 57.3711,38.09305,0 57.28833,38.17055,0 57.24388,38.27082,0 57.20471,38.28334,0 57.18888,38.28334,0 57.14979,38.26009,0 57.05861,38.1936,0 56.84583,38.23166000000001,0 56.75574000000001,38.28626,0 56.61388,38.24055,0 56.44276,38.25999,0 56.32249000000001,38.18526,0 56.35277,38.13889,0 56.33305000000001,38.08554,0 56.22305,38.07028,0 56.16444,38.09499,0 55.98276000000001,38.07249,0 55.7561,38.12526,0 55.44276000000001,38.08611,0 55.21027,37.96221,0 55.14083,37.9561,0 54.95471000000001,37.80499,0 54.83306000000001,37.74639,0 54.78221000000001,37.64804,0 54.80972000000001,37.57944,0 54.78694,37.51915000000001,0 54.68111,37.4436,0 54.55165,37.4461,0 54.23165000000001,37.32722,0 53.90564,37.35085,0 54.01583000000001,37.02193000000001,0 53.98833,36.9822,0 54.03166,36.94833,0 54.0286,36.82471,0 53.94332,36.8,0 53.68194,36.81722,0 53.63388000000001,36.84804,0 53.66137000000001,36.85777,0 53.6075,36.86833000000001,0 53.98499,36.89861000000001,0 54.00860999999999,36.94833,0 53.92276,36.90972,0 53.22305,36.84833,0 51.97276000000002,36.57999,0 51.10111,36.72887,0 50.35167000000001,37.1211,0 50.19137000000001,37.38917,0 49.94166,37.44471,0 49.96888,37.45387,0 49.92499,37.47971,0 49.83443,37.4511,0 49.41999,37.49332,0 49.10248,37.64304,0 48.99776,37.76361,0 48.94166,37.90749,0 48.86942,38.30054,0 48.88828000000001,38.44241,0 48.86665,38.74583,0 48.82999,38.85942,0 48.89083,38.88082,0 48.93304,38.95138,0 48.95554,39.16526,0 49.03832000000001,39.18221,0 49.06722000000001,39.10777,0 49.14471,39.09748,0 49.12694,39.02998,0 49.05165,39.00139,0 49.06027000000001,38.96693,0 49.12804,38.97331,0 49.20194,39.02471,0 49.25805,39.31944,0 49.31304,39.34138,0 49.40805,39.28776,0 49.36388000000002,39.34499,0 49.40331,39.31805,0 49.41361,39.38388,0 49.28082000000001,39.50055,0 49.31889000000001,39.62498,0 49.42416999999999,39.70638000000001,0 49.39332,39.77832,0 49.44442000000001,39.8686,0 49.42110000000001,39.93081,0 49.48304,39.98943000000001,0 49.42499999999999,40.05388,0 49.49582,40.09055,0 49.48805000000001,40.15054,0 49.57167,40.21277,0 49.82472,40.28499,0 49.87804000000001,40.36276,0 49.98054,40.31998000000001,0 50.12417,40.35833000000001,0 50.2625,40.32916,0 50.39325,40.22689,0 50.63309,40.29893,0 50.62228,40.32742,0 50.36295000000001,40.47673000000001,0 50.23536,40.4908,0 50.125,40.51138,0 50.05525999999999,40.58444,0 49.80499,40.56471,0 49.52805,40.66277,0 49.50805,40.69305,0 49.53249000000001,40.78749,0 49.39804000000001,40.84971,0 49.22221,41.01833,0 49.15498000000001,41.15165,0 49.14055,41.26833000000001,0 49.03998,41.41415,0 48.89944,41.52583,0 48.67777000000001,41.78276,0 48.58395000000001,41.83577,0 48.54472,41.88028,0 48.38665,41.92638,0 48.3036,42.09748,0 48.11776,42.32638,0 47.94498,42.46249,0 47.85942,42.59389,0 47.73832,42.63388,0 47.69694000000001,42.86638,0 47.46221,43.01915,0 47.48333000000002,43.20777,0 47.58833000000001,43.29695,0 47.57249000000001,43.33054,0 47.48832,43.29361000000001,0 47.48721,43.45638,0 47.58498,43.72221,0 47.69832000000001,43.86887000000001,0 47.80731,43.98692,0 47.5322,44.50008,0 47.47952,44.4864,0 47.20554,44.21859,0 47.1586,44.20054,0 47.09248,44.24027,0 47.01222,44.36083,0 46.76027,44.39192,0 46.7,44.44276,0 46.67971,44.52304,0 46.72444,44.54472,0 46.71249,44.64777,0 46.95943,44.76389,0 47.00944,44.82111,0 46.99165,44.92192000000001,0 47.07555,44.78277,0 47.11666,44.86221,0 47.09722000000001,44.94971,0 47.14861,44.92694,0 47.19915000000001,44.96859,0 47.29193,45.18082,0 47.3761,45.18193000000001,0 47.38554000000001,45.29527,0 47.46277000000001,45.38081,0 47.37803,45.41137000000001,0 47.48611,45.41860000000001,0 47.50166,45.47998,0 47.54332,45.50527000000001,0 47.48619,45.57145,0 47.53247000000001,45.53033,0 47.81656,45.43218000000001,0 47.99829,45.51992000000001,0 48.015,45.69538,0 48.0714,45.71836,0 48.20509,45.7121,0 48.36385000000001,45.64942000000001,0 48.74612,45.69747000000001,0 48.72941,45.804,0 48.79208,45.82907,0 48.87982,45.94397000000001,0 48.99471,46.00246,0 49.05737,45.98365,0 49.18897,46.05259,0 49.3143,46.2573,0 49.22253,46.34631,0 48.91813000000001,46.48922,0 48.83388,46.48499000000001,0 48.74027000000001,46.55832,0 48.56054,46.56499,0 48.58400000000001,46.59843000000002,0 48.55415,46.64389,0 48.4762,46.66768,0 48.52166,46.74305,0 48.60333,46.77332000000001,0 48.71054,46.75972,0 48.76527,46.69082,0 48.94137,46.70416,0 49.02720999999999,46.77610000000001,0 48.7211,47.09833,0 48.54721000000001,47.41721,0 48.44388000000001,47.43693,0 48.20442000000001,47.70499000000001,0 48.06471000000001,47.77971,0 47.69137,47.76583,0 47.43581,47.84361000000001,0 47.38333,47.68888000000001,0 47.13665000000001,47.82249000000001,0 47.18277,47.87417,0 47.06248000000001,47.99609,0 47.21499000000001,48.07083,0 47.12221,48.10222,0 47.13832000000001,48.16999,0 47.09638000000001,48.21000000000001,0 47.13332000000001,48.24249,0 47.12277,48.27166,0 46.49916000000002,48.4175,0 46.77888000000001,48.93665,0 46.95444,49.01305,0 47.06275999999999,49.14277,0 47.02610000000001,49.23610999999999,0 46.79582,49.33972,0 46.92944,49.86361000000001,0 47.18833,49.94415000000001,0 47.30249,50.03194000000001,0 47.35666,50.09027,0 47.28054,50.18221,0 47.34276,50.24193,0 47.31666,50.29445000000001,0 47.4161,50.33193,0 47.4464,50.37695,0 47.59972,50.46083000000001,0 47.76082000000001,50.37527,0 48.11054000000001,50.0986,0 48.16554000000001,49.9661,0 48.24888000000001,49.90888000000001,0 48.25166000000001,49.86971,0 48.33221,49.87887000000001,0 48.45082,49.81693000000001,0 48.79695,49.94194,0 48.91693000000001,50.03417,0 48.87972000000001,50.10167000000001,0 48.79111,50.1236,0 48.81110000000001,50.19415000000001,0 48.72276000000001,50.35305000000002,0 48.69749,50.59194000000001,0 48.59555,50.62249000000001,0 48.59361,50.64833000000001,0 48.83027,50.59665,0 49.03083,50.68804999999999,0 49.15833,50.79278000000002,0 49.42583000000001,50.85139000000001,0 49.44083,50.90583000000002,0 49.36443,50.97971,0 49.46194,51.12416,0 49.80416,51.11027,0 49.96804,51.2261,0 50.36332,51.31694000000001,0 50.35443,51.37805000000001,0 50.39721999999999,51.39972,0 50.38472,51.42527000000001,0 50.54888,51.46861,0 50.54361,51.56722000000001,0 50.59471,51.58972,0 50.60277,51.63999,0 50.71749,51.62249,0 50.68277000000001,51.57306000000001,0 50.81054000000001,51.59166,0 50.81361,51.64805,0 50.75861,51.71970000000001,0 50.7733,51.76918,0 51.41249000000001,52.08971,0 51.45750000000001,52.22776,0 51.40805,52.25416,0 51.40694,52.34917,0 51.47166,52.36583000000001,0 51.46388,52.41360000000001,0 51.56361,52.43582,0 51.47083,52.52722,0 51.47360000000001,52.57972,0 51.55054,52.57417,0 51.50667000000001,52.63276000000001,0 51.53416,52.67416,0 51.73360000000001,52.6675,0 51.77944,52.79583000000001,0 51.71555,52.82277,0 51.72805,52.87194,0 51.82417000000001,52.87388,0 51.86694000000001,52.92943,0 52.05389,52.99055,0 52.06249,53.07833,0 52.15972,53.09665,0 52.05471,53.14249000000001,0 52.13417,53.17499,0 52.1236,53.22388,0 52.16388000000001,53.26167,0 52.13916,53.29166,0 52.19665000000001,53.37944,0 52.13803999999999,53.40305000000002,0 52.13499,53.44915,0 52.07527,53.50639,0 52.09167,53.55027,0 52.1836,53.55694,0 52.25804,53.65526,0 52.41415,53.93027000000001,0 52.37054,53.9761,0 52.4875,54.05777000000001,0 52.39804000000001,54.1286,0 52.27194,54.11388000000001,0 52.25833,54.14999,0 52.34388000000001,54.17194,0 52.34610000000001,54.22665000000001,0 52.19444,54.29721000000001,0 52.27943,54.32833000000002,0 52.51166,54.32194,0 52.53745,54.37707,0 52.62194,54.3411,0 52.68775999999999,54.36111,0 52.92304,54.31388,0 52.93249,54.28804000000001,0 52.88166,54.27777,0 52.92916,54.26805,0 53.01361,54.26805,0 53.02944000000001,54.28944,0 53.0014,54.31249,0 53.04749,54.34167000000002,0 53.11582,54.24944000000001,0 52.93694,54.2136,0 53.03361000000001,54.12749000000001,0 53.09137,54.12054,0 53.06054,54.06999,0 53.19444,54.09832,0 53.27221999999999,54.06999,0 53.285,54.02750000000001,0 53.37194,53.96749,0 53.41082,54.02694,0 53.47020000000001,54.0452,0 53.41305,54.22222,0 53.43444,54.26915,0 53.36138,54.32888,0 53.34444,54.38694000000001,0 53.42194,54.48666000000001,0 53.41055,54.55750000000001,0 53.6086,54.71138,0 53.57888,54.74888,0 53.60777,54.81249,0 53.57695,54.81499,0 53.64249000000002,54.90139,0 53.51412,54.88120000000001,0 53.40639000000001,54.99722,0 53.26694000000001,55.01028000000001,0 53.26834,55.05331,0 53.14138000000001,55.09389,0 53.13888000000001,55.14388,0 53.33443,55.16249000000001,0 53.33805000000001,55.19499,0 53.39944000000001,55.22110000000001,0 53.58611000000001,55.20776999999999,0 53.59999,55.26027,0 53.70916,55.3336,0 53.89833000000002,55.38166,0 53.93333000000001,55.4586,0 53.99694,55.50027,0 53.99638000000001,55.54972000000002,0 54.17833,55.62276000000001,0 54.24194000000001,55.69137000000001,0 54.09528000000001,55.77592,0 54.0261,55.75666,0 54.03820000000001,55.80095000000001,0 53.97027,55.78249000000002,0 53.99722,55.85082,0 53.63842,55.91552,0 53.67193,55.95999,0 53.78472,55.96915,0 53.83795000000001,56.04377,0 54.02443,56.02944000000001,0 54.10722,56.14749,0 54.35889,56.26222000000001,0 54.37526,56.30498999999999,0 54.31527,56.34138,0 54.35241,56.35857,0 54.32472000000001,56.46249,0 54.23611,56.43581,0 54.18472000000001,56.53722,0 54.12194,56.53361000000001,0 54.09083,56.58250000000001,0 54.02664999999999,56.58416,0 54.10083,56.66276000000001,0 54.0286,56.69276,0 53.96388,56.63110000000001,0 53.87,56.6075,0 53.83554,56.63556,0 53.88081,56.67222,0 53.80637999999999,56.77332,0 53.82832,56.81193,0 53.88943,56.80444,0 53.88999,56.76445,0 54.01056,56.74916,0 54.09177,56.79174,0 54.09805,56.96249,0 54.40269,57.03656000000002,0 54.37444000000001,57.07389000000001,0 54.27555,57.10082000000001,0 54.33472,57.15554000000001,0 54.32000000000001,57.28666000000001,0 54.11639,57.31027000000001,0 54.14443,57.38693,0 54.27166,57.42222,0 54.26472,57.46443000000001,0 54.17860000000001,57.465,0 54.16582,57.51222,0 54.20361,57.53083,0 54.16999000000001,57.55972000000001,0 54.11888,57.55944000000001,0 54.10139,57.51805,0 53.98749000000001,57.57111,0 54.12111,57.61193,0 54.06916,57.66666000000001,0 54.15665000000001,57.70249,0 54.13639000000001,57.83222,0 54.08749,57.91331,0 54.10722,57.97276,0 53.94276,58.09527000000001,0 53.89415,58.18804,0 53.80972,58.22887,0 53.88916,58.32222,0 53.79027,58.39249000000001,0 53.78463,58.43996000000001,0 53.69610000000001,58.60333000000001,0 53.75721999999999,58.6525,0 53.74027,58.67972,0 53.77055,58.71638000000002,0 53.92833,58.78166000000001,0 53.80721000000001,58.82777000000001,0 53.71915,58.93748999999999,0 53.76500000000001,59.02277000000002,0 53.84470000000001,59.03054,0 53.83500000000001,59.05832000000001,0 53.88416000000001,59.09054,0 53.75417,59.14111000000001,0 53.68916000000001,59.12332000000001,0 53.7236,59.09194000000002,0 53.38555,59.15554,0 53.24415000000001,59.27583,0 53.2047,59.34944,0 53.3661,59.51832,0 53.42054,59.68971,0 53.60278000000001,59.70055000000001,0 53.71194,60.00332,0 53.59887000000001,60.15666,0 53.41137000000001,60.22443000000001,0 53.38611,60.16555,0 53.01083,60.15915,0 52.42722000000001,60.20304,0 52.29815,60.24171,0 52.34777,60.37330999999999,0 52.34304000000001,60.44638,0 52.12499,60.47027000000001,0 52.15471000000001,60.54555000000001,0 51.77333,60.59693999999999,0 51.88777,60.87666,0 52.34333,60.835,0 52.42917000000001,60.98137,0 52.79499,60.94433,0 52.87666,61.09388000000001,0 53.38499000000001,61.03389,0 53.33944000000001,60.89388,0 53.57389,60.86500000000001,0 53.80915000000001,60.84777,0 53.86555,60.98749,0 54.97971,60.86388,0 55.06107,61.01941,0 55.19747,61.0041,0 55.27921000000001,61.12959000000002,0 55.72323,61.08145,0 55.82858,61.25057,0 56.29028000000001,61.20304000000001,0 56.34805,61.29388,0 56.31638000000001,61.32527,0 56.3886,61.43943000000001,0 56.54527,61.42888,0 56.60083,61.50249,0 56.67556,61.52777,0 57.09666,61.48525999999999,0 57.18,61.51194,0 58.80972,61.50556,0 58.94054000000001,61.55972,0 59.01082000000001,61.54472,0 59.14333000000001,61.63305,0 59.34887000000001,61.68221000000001,0 59.39694999999999,61.76110000000001,0 59.33915,61.80222,0 59.34137000000001,61.85695000000001,0 59.48555,61.98805,0 59.40444,62.14222000000001,0 59.51527,62.31721000000002,0 59.60028,62.36694,0 59.58472,62.41499,0 59.60889,62.45333000000001,0 59.65055,62.51721,0 59.50972000000001,62.54722,0 59.39138,62.72971,0 59.46083000000002,62.77917000000002,0 59.48721000000001,62.89778,0 59.42471000000001,62.94415,0 59.27665,62.96666,0 59.22221,63.07388,0 59.30277,63.12638,0 59.25889,63.2011,0 59.3386,63.28999000000001,0 59.28249,63.33278,0 59.35222,63.36306,0 59.31722000000001,63.39888000000001,0 59.47776000000001,63.56805,0 59.51389,63.77999000000001,0 59.57249000000002,63.83666,0 59.56583000000001,63.91915,0 59.77055,63.99942999999999,0 59.85972,64.1375,0 59.73388000000001,64.15331999999999,0 59.58805,64.23248,0 59.57943,64.27943000000001,0 59.6361,64.33749,0 59.60470999999999,64.46026999999999,0 59.47970999999999,64.48193000000001,0 59.61361,64.62276,0 59.70249,64.65166000000001,0 59.63805000000001,64.72387000000001,0 59.65416,64.78333000000001,0 60.15804000000001,65.06721,0 60.42749,65.05193,0 60.42972000000001,65.00082,0 60.59638,64.94193,0 60.63138,64.88361,0 60.81194,65.04859999999999,0 60.96277000000001,65.04165999999999,0 61.11166,65.17221000000001,0 61.23944,65.18552,0 61.3336,65.28888000000001,0 61.24917,65.31887999999999,0 61.41555000000002,65.39639,0 61.58222000000001,65.55165,0 61.68694,65.57388,0 61.87027000000001,65.70222,0 62.11306,65.72083000000001,0 62.68193999999999,65.86304,0 62.69388,65.86331,0 62.73193000000001,65.85776,0 62.86111,65.87804,0 62.79777000000001,65.93109,0 62.88833000000002,65.97998,0 62.81750000000001,66.01194,0 62.86166000000001,66.07720999999999,0 62.95917000000002,66.1097,0 63.04694000000001,66.2247,0 63.15388,66.26749,0 63.29056,66.23276,0 63.30416000000001,66.2747,0 63.22332000000001,66.32638,0 63.40860000000001,66.45277,0 63.40915,66.48109,0 63.53722000000001,66.46026999999999,0 63.65888000000001,66.52582,0 63.81554000000001,66.54721000000001,0 63.98277,66.65358999999999,0 64.31247999999999,66.66443,0 64.41277,66.72387000000001,0 64.53999,66.7272,0 64.5761,66.79915,0 65.10138000000001,66.89055000000001,0 65.10554000000001,67.00805000000001,0 65.07055,67.03942000000001,0 65.22136999999999,67.07693,0 65.18248,67.15082,0 65.65888,67.30609,0 65.71887,67.34054999999999,0 65.67249,67.36609,0 65.69053,67.38665,0 65.96138000000001,67.39525999999999,0 66.10664,67.47859,0 66.0397,67.57693,0 65.79165999999999,67.56971,0 65.86832,67.60664,0 65.81805,67.62608,0 65.84054999999999,67.65192999999999,0 65.99275,67.67915000000002,0 66.10526,67.64554,0 66.21053000000001,67.69609,0 66.18388,67.74832000000002,0 66.01805,67.79305000000001,0 66.05443,67.88083,0 66.09248,67.89027,0 66.08611000000001,67.93442,0 65.91081,67.96332,0 65.78055000000001,67.9233,0 65.43471,67.91804999999999,0 65.28498999999999,68.01194,0 65.33333,68.08638000000001,0 65.26775000000001,68.21998000000001,0 65.48054999999999,68.43053999999999,0 65.60609,68.48499,0 65.61443,68.52554000000001,0 65.66165,68.54694000000001,0 65.52361000000001,68.58414999999999,0 65.37831,68.68053999999999,0 65.42941999999999,68.7,0 65.40498,68.73276,0 65.32639000000002,68.72499000000001,0 65.34860000000001,68.79192000000001,0 65.20220999999999,68.82331000000001,0 65.08055,68.80888,0 64.80415000000001,68.89194000000001,0 64.75499000000001,68.88527000000001,0 64.74582,68.85526,0 64.54998999999999,68.87053000000002,0 64.52139,68.90776,0 64.58389,68.96082,0 64.51749,68.98248,0 64.51999000000001,69.01776,0 64.83257,69.15213,0 64.94275,69.2047,0 64.91499,69.25471,0 65.04832,69.27332,0 65.38193,69.18471,0 65.79581,69.13697000000001,0 66.2572,69.07253,0 66.52336,68.9671,0 66.55627,68.91167,0 67.12005000000001,68.84113000000001,0 67.39063,68.80437000000001,0 67.38152,68.76640999999999,0 67.27820000000001,68.74968,0 67.32339,68.69279,0 67.77222,68.51776,0 67.80582,68.50082,0 67.70610000000001,68.51054000000001,0 67.78306000000001,68.47749,0 68.15942,68.41137000000001,0 68.26054000000001,68.33472,0 68.20081999999999,68.29471,0 68.18526,68.23609999999999,0 68.27025999999999,68.23915,0 68.28333000000001,68.18498,0 68.43637,68.22499000000001,0 68.56415,68.31052,0 68.64999,68.31219,0 68.57165999999999,68.33778,0 68.56303,68.36942000000001,0 68.89776999999999,68.60748,0 69.00888000000001,68.79998999999999,0 69.09526,68.83333,0 69.10831,68.87248,0 68.94386,68.89803000000001,0 69.22026,68.95722000000001,0 69.03248000000001,68.94193,0 69.02164000000001,68.96416000000001,0 68.78498,68.91081,0 68.47331,68.97248999999999,0 68.04749,69.28137,0 68.02139,69.3436,0 68.10942,69.38889,0 68.10165000000001,69.54665,0 68.00721,69.51860000000001,0 68.03804,69.48888,0 67.96748,69.48415,0 67.78610000000001,69.51666,0 67.61304,69.59166999999999,0 67.38528000000001,69.61859,0 67.37054999999999,69.52164999999999,0 67.25494999999999,69.40298,0 67.16154,69.35935000000001,0 66.95407,69.40528000000001,0 66.93801000000001,69.52226,0 66.79192999999999,69.58028,0 66.76721000000001,69.75722,0 66.87331,70.00109999999999,0 66.99387,70.04886999999999,0 67.07941,70.12733,0 67.08862000000001,70.21623,0 67.19971,70.39027,0 67.26666,70.41110000000001,0 67.25194999999999,70.44832,0 67.29221,70.46998000000001,0 67.20889,70.52666000000001,0 67.33971,70.72499000000001,0 67.33249000000001,70.76888,0 67.22887,70.82555000000001,0 67.10720000000001,70.83526999999999,0 66.68886999999999,70.76054000000001,0 66.61275999999999,70.86773,0 66.54228000000001,70.92879000000001,0 66.62154,71.04885,0 66.78388,71.14221000000001,0 66.83665000000001,71.20972,0 66.91553999999999,71.29276,0 67.08581000000001,71.30387,0 67.53675,71.40988,0 67.53675,73.95477,0 72.53674,73.94411,0 77.53673000000001,73.93346,0 82.27669,73.92335,0 81.08696000000001,73.75897999999999,0 79.49023,73.66505000000001,0 78.53532,73.30501,0 78.20658,73.02322,0 78.17527,72.89798,0 78.4727,72.64751,0 78.50015000000001,72.37733,0 78.45471000000001,72.36443,0 78.44637,72.35971000000001,0 78.65913999999999,72.26111,0 78.67804,72.22165,0 78.59721999999999,72.20972,0 + + + 1 + + + + + +68.67328999999999,82.13631,0 67.53675,81.66452,0 67.53675,82.89028,0 67.53675,84.90001,0 67.53675,89.90000000000001,0 68.53611000000001,89.90000000000001,0 69.53547,89.90000000000001,0 70.53484,89.90000000000001,0 71.53419,89.90000000000001,0 72.53355000000001,89.90000000000001,0 73.53292999999999,89.90000000000001,0 74.53227,89.90000000000001,0 75.53164,89.90000000000001,0 76.53100000000001,89.90000000000001,0 77.53036,89.90000000000001,0 78.52972,89.90000000000001,0 79.52907999999999,89.90000000000001,0 80.52843,89.90000000000001,0 81.5278,89.90000000000001,0 82.52717,89.90000000000001,0 82.52717,87.88696,0 77.9092,85.97008,0 73.29124,84.05318,0 68.67328999999999,82.13631,0 + + + 1 + + + + + GMT +05:30 + + +]]> + #khStyle0550 + + + + + +69.14654,7.824959000000001,0 67.51169000000002,7.824905,0 67.51169000000002,12.15223,0 72.51169,12.15223,0 74.14655000000001,12.15223,0 74.14655000000001,7.825121,0 69.14654,7.824959000000001,0 + + + 1 + + + + + +94.5928,5.880672000000001,0 92.9025,5.880672000000001,0 90.34064000000001,5.884479,0 90.33504000000001,10.88448,0 90.33015,15.23029,0 94.58984000000001,15.23029,0 94.59142,10.23029,0 94.5928,5.880672000000001,0 + + + 1 + + + + + +79.43803000000001,35.96054000000001,0 79.46193,35.85804,0 79.58109000000002,35.86971,0 79.65886999999999,35.81916,0 79.63443000000001,35.75916,0 79.69359,35.65083,0 79.81303,35.62943,0 79.85887,35.5661,0 79.91914,35.61749,0 79.96416000000001,35.59583,0 80.05749,35.40777,0 80.14776999999999,35.45722,0 80.20663999999999,35.56193,0 80.2741,35.52753,0 80.29776,35.50333,0 80.38388000000001,35.51111,0 80.38666000000001,35.42528,0 80.28943,35.33999,0 80.29803,35.2075,0 80.19026,35.08764,0 80.20166999999999,34.89388,0 80.10248,34.7747,0 80.07138000000001,34.66945,0 79.8875,34.66276000000001,0 79.84387,34.57444,0 79.7247,34.52999,0 79.7636,34.45499,0 79.72275999999999,34.42054,0 79.53915000000002,34.42999,0 79.57805000000001,34.2086,0 79.51166000000001,34.19027,0 79.5247,34.11805,0 79.42915000000001,34.02166,0 78.97527,34.01721,0 78.90886999999999,33.97028,0 78.94941,33.83221,0 79.01944,33.75444000000001,0 79.04082,33.63943,0 78.91582,33.62944,0 78.93651,33.408,0 78.99638000000002,33.31499,0 79.09137,33.27499,0 79.10359,33.21971,0 79.18387,33.22582,0 79.40637,33.16166,0 79.35609,32.965,0 79.45027,32.88221,0 79.47083000000001,32.79388,0 79.53027,32.75416,0 79.51443,32.67222,0 79.45722000000001,32.60249,0 79.31386999999999,32.49665,0 79.25317000000001,32.516,0 79.13164999999999,32.47499,0 79.09915,32.37638,0 78.97110000000001,32.35082,0 78.78027,32.47887,0 78.76055,32.63556,0 78.70443,32.6311,0 78.6386,32.57778,0 78.42054,32.5661,0 78.39722,32.53111,0 78.4772,32.42471,0 78.44971,32.38694,0 78.47832,32.34999,0 78.47593999999999,32.24305,0 78.54471000000001,32.20943,0 78.68053000000001,32.03527,0 78.7711,31.98111,0 78.74507,31.91036,0 78.69247,31.77417,0 78.74249,31.68499,0 78.79053999999999,31.67472,0 78.84387,31.60417,0 78.71278,31.49833,0 78.79276000000002,31.44333,0 78.77054,31.305,0 78.87766000000001,31.29163,0 78.94193,31.36,0 79.00555,31.32555,0 79.01859,31.41138,0 79.09248,31.4375,0 79.21748,31.34083,0 79.24026000000001,31.24417,0 79.28665,31.22333,0 79.31499,31.13305,0 79.39324000000001,31.10106,0 79.42249,31.0275,0 79.49413,31.02416,0 79.59943,30.93556,0 79.74887,30.98972,0 79.87916,30.95916,0 79.94981,30.8849,0 80.04192000000001,30.84694,0 80.09415,30.78666000000001,0 80.17831,30.79945,0 80.25027,30.73999,0 80.18749,30.67583000000001,0 80.22776,30.62193,0 80.20699999999999,30.57552,0 80.32193,30.56472,0 80.53888000000001,30.46443,0 80.60693000000001,30.47472,0 80.75194999999999,30.395,0 80.80386,30.32666,0 80.99888,30.26194,0 81.02536000000001,30.20436,0 80.93637,30.18138,0 80.89333000000001,30.21111,0 80.8586,30.17472,0 80.87276,30.13888,0 80.74609,30.02138,0 80.59887000000001,29.95527,0 80.53970000000001,29.84611,0 80.37691,29.7486,0 80.40694000000001,29.59638,0 80.23637000000001,29.42527,0 80.27582,29.3225,0 80.30693000000001,29.31055,0 80.28777,29.20556,0 80.23997,29.21472,0 80.25694,29.14472,0 80.14664999999999,29.10833,0 80.1297,28.99305,0 80.05998,28.93166,0 80.05582,28.83611,0 80.24609,28.75082,0 80.35776,28.62944,0 80.44026,28.62888,0 80.50861,28.56693,0 80.50555,28.65833,0 80.57720999999999,28.68556,0 80.58499000000001,28.6536,0 80.66249000000001,28.63277,0 80.79832,28.52389,0 80.89249,28.50638,0 80.93858,28.44111,0 81.00694,28.44305,0 81.01888,28.40416000000001,0 81.19359,28.36667,0 81.31218,28.19333,0 81.31999000000002,28.13,0 81.42192,28.16638,0 81.48027,28.08,0 81.88026000000001,27.85721,0 81.97776000000002,27.91722,0 82.0664,27.91416,0 82.43471,27.67556,0 82.7011,27.71111000000001,0 82.76860000000001,27.50166,0 83.17638,27.44888,0 83.29137,27.33777,0 83.37665,27.37527,0 83.39610000000002,27.47861,0 83.60776,27.46916,0 83.85832000000001,27.35221,0 83.87553,27.38083,0 83.83526999999999,27.43805,0 84.04026,27.44472,0 84.09887000000001,27.51611,0 84.14333000000001,27.52417,0 84.29776,27.38832,0 84.60997999999999,27.33556,0 84.68414,27.21555,0 84.64749000000001,27.04527,0 84.75027,27.0075,0 84.84360000000001,27.01527,0 84.95277,26.95804,0 84.97331,26.90304,0 85.04109,26.88666,0 85.04082,26.84777,0 85.18388,26.86666,0 85.21165000000001,26.76694,0 85.33443,26.73582,0 85.41249000000001,26.79472000000001,0 85.45305000000001,26.78694000000001,0 85.63026000000001,26.8675,0 85.72609,26.80167000000001,0 85.73054999999999,26.66722,0 85.85027,26.57222,0 86.02943000000001,26.66306,0 86.18387,26.60806,0 86.20664000000001,26.58556,0 86.33167,26.61277,0 86.33249000000001,26.58499,0 86.53498999999999,26.52806,0 86.73165,26.41999,0 86.88598,26.46866,0 87.06137,26.58833,0 87.09415,26.45638,0 87.1375,26.40972,0 87.24525,26.41222,0 87.32805999999999,26.34777,0 87.37082,26.40333,0 87.44748,26.43250000000001,0 87.59999000000001,26.37972,0 87.69748,26.42944,0 87.76639,26.40861,0 87.78554,26.45638,0 87.84305000000001,26.43888000000002,0 87.89055999999999,26.47333,0 87.94941,26.40055,0 88.02638,26.36916,0 88.09583000000001,26.43888000000002,0 88.10193,26.53028000000001,0 88.19497,26.75416,0 88.11859,26.98444,0 87.99303999999999,27.11444,0 88.05971,27.32777000000002,0 88.03888000000001,27.37611,0 88.06667000000002,27.43693,0 88.05692999999999,27.53334,0 88.11913,27.60833,0 88.18887000000001,27.78777,0 88.19386,27.8475,0 88.14279999999999,27.86605,0 88.12053,27.90471000000001,0 88.14554,27.95527,0 88.53415,28.02917,0 88.62276,28.11805,0 88.83167,28.01334,0 88.88081,27.83667,0 88.83443,27.66111,0 88.76331999999999,27.54333,0 88.78333000000001,27.43805,0 88.91692000000001,27.32083,0 88.90138000000002,27.28222,0 88.79803,27.24638,0 88.75193,27.14861,0 88.86360999999999,27.09194000000002,0 88.87636999999999,26.95055,0 88.93332000000001,26.98499,0 88.95193000000002,26.92667000000001,0 89.03055000000001,26.92749,0 89.12608,26.82361,0 89.22083000000001,26.81472,0 89.36081,26.86,0 89.46833,26.79944,0 89.53360000000001,26.81221,0 89.63611,26.77111,0 89.61832,26.72694,0 89.64305000000002,26.71527,0 89.68552000000001,26.7336,0 89.84887000000001,26.70167,0 89.85942,26.73666,0 90.1236,26.74805,0 90.17747,26.77306000000002,0 90.21693000000001,26.85082,0 90.38527000000001,26.90333,0 90.55914,26.80722,0 90.6947,26.77222,0 91.03194000000002,26.78278,0 91.09109000000001,26.81639,0 91.31441000000001,26.77806,0 91.3797,26.8075,0 91.4247,26.87556,0 91.49721000000001,26.8725,0 91.54221,26.80445,0 91.71249,26.8,0 91.84360000000001,26.86416,0 91.90498,26.80556,0 91.91526,26.89389,0 91.99721,26.85194,0 92.08150999999999,26.86905,0 92.11193000000002,26.94416,0 92.00999000000002,27.10472,0 92.01776,27.1725,0 92.11443000000001,27.28583,0 92.08916000000001,27.34944,0 91.99887,27.47805,0 91.76833000000002,27.41611,0 91.76555000000002,27.45694,0 91.67359,27.48861,0 91.62082000000001,27.54861,0 91.59498000000001,27.64554,0 91.65277000000002,27.71167,0 91.65776,27.76472,0 92.01443,27.73471,0 92.11832000000003,27.8125,0 92.25388,27.81582,0 92.26804,27.87472,0 92.33110000000001,27.79472,0 92.35831000000003,27.84443,0 92.38666000000002,27.80472,0 92.4147,27.86028,0 92.45248000000001,27.82639,0 92.69942000000002,27.95555,0 92.72838000000002,28.03598,0 92.67525000000001,28.08071,0 92.75290000000001,28.16892,0 92.83004000000001,28.21276,0 92.84125,28.1888,0 92.88734000000001,28.19872000000001,0 92.99153,28.26286,0 93.01044000000003,28.24225,0 93.04571,28.31026,0 93.22205000000001,28.3193,0 93.23817000000001,28.38745,0 93.19270000000002,28.43213,0 93.28152000000002,28.49296,0 93.35194000000001,28.61877000000001,0 93.49408,28.65192,0 93.50206000000001,28.67916,0 93.64729,28.64746,0 93.85851000000001,28.69038,0 93.98059000000001,28.64518,0 93.96173,28.6692,0 94.01243,28.74736,0 94.0211,28.83603,0 94.15246000000002,28.9307,0 94.23455,29.07348,0 94.42776000000002,29.21551,0 94.5812,29.23153,0 94.64751,29.33347,0 94.69736,29.33652,0 94.79227,29.2608,0 94.83335,29.16837,0 95.00915999999999,29.12388,0 94.98471000000001,29.17361,0 95.38777,29.03527,0 95.46053000000001,29.05167,0 95.49609000000001,29.14083000000001,0 95.54665,29.13861,0 95.53442,29.21167,0 95.59108999999999,29.255,0 96.08389,29.46777000000001,0 96.23526000000001,29.25445,0 96.28943,29.24139,0 96.36249000000001,29.29055,0 96.39525999999999,29.25527,0 96.34860000000001,29.18,0 96.25665000000001,29.16444,0 96.11913,29.07916000000001,0 96.18222000000002,28.99527,0 96.14861000000001,28.94333,0 96.16914,28.90361,0 96.34387,29.0325,0 96.51194000000001,29.07,0 96.47581000000001,28.97472,0 96.51027000000001,28.96444,0 96.61582000000001,28.79027,0 96.60609000000001,28.73944,0 96.47083000000001,28.68833,0 96.47832,28.63861,0 96.34526,28.55695,0 96.36638000000001,28.48082000000001,0 96.26471000000001,28.41527,0 96.36165000000001,28.39278,0 96.39694000000002,28.35333,0 96.40192,28.35111,0 96.46053000000001,28.42194,0 96.65387,28.46749,0 96.78415,28.37306,0 96.88970999999999,28.37861,0 96.98471000000001,28.3325,0 97.13499000000002,28.38138,0 97.34887000000002,28.22278,0 97.31608000000001,28.08916,0 97.39413999999999,28.01861,0 97.36775,27.89666,0 97.31721,27.87833,0 97.29916,27.91667,0 97.24942,27.9075,0 97.08389,27.7486,0 97.04665,27.74972,0 96.88889,27.6175,0 96.91804999999999,27.50527,0 96.89999000000002,27.46861000000001,0 97.12636999999999,27.19083,0 97.15888,27.13861,0 97.14444000000002,27.09249,0 97.05974000000001,27.093,0 96.88831999999999,27.17805,0 96.86137000000001,27.21028,0 96.88416000000001,27.25472,0 96.72915999999999,27.36555,0 96.66025999999999,27.33916,0 96.60999,27.36694,0 96.52415000000002,27.29416,0 96.19414999999999,27.27084,0 96.03581,27.19249,0 95.93082,27.04611,0 95.80386,27.00111,0 95.71775000000001,26.89138,0 95.65804000000001,26.89528,0 95.61081,26.82139,0 95.51944,26.82306,0 95.44108,26.70916,0 95.2711,26.64472,0 95.24638,26.67972,0 95.15248000000001,26.62333,0 95.14777000000001,26.56583,0 95.06638,26.47972,0 95.09526,26.41,0 95.06526,26.32556,0 95.08389000000003,26.22277,0 95.12082,26.20166,0 95.11331,26.10916,0 95.17804,26.05889,0 95.08665000000001,25.95556,0 95.02222,25.92861,0 95.03387000000002,25.74222,0 94.99193,25.72916,0 94.88527000000001,25.57222000000001,0 94.66165000000001,25.42804,0 94.62553000000001,25.39777,0 94.57639000000002,25.21444,0 94.59943,25.17833,0 94.72859,25.13638,0 94.73442,25.02472,0 94.59777,24.72528000000001,0 94.53859000000001,24.70888,0 94.51470999999999,24.61945,0 94.38915,24.48,0 94.14444,23.84778,0 93.92666,23.95583,0 93.81914999999999,23.93527,0 93.75332,24.0075,0 93.62136,24.01611000000001,0 93.59636999999999,23.97222,0 93.49359,23.96277,0 93.38293,24.08935,0 93.34207000000001,24.0818,0 93.3279,24.03597,0 93.32805000000001,23.98166,0 93.38443,23.92138,0 93.40138,23.73582,0 93.43346,23.67889,0 93.40331999999999,23.37806,0 93.36609,23.34945,0 93.38666000000001,23.14027000000002,0 93.29359000000001,23.00889000000002,0 93.22915999999999,23.01333,0 93.20138000000002,23.05889,0 93.13805000000004,23.04805,0 93.16137000000001,22.91945,0 93.09822000000001,22.79037,0 93.09722000000001,22.66528,0 93.13638,22.59444,0 93.11859,22.53333,0 93.18055,22.44055,0 93.19664000000002,22.25638,0 93.14249,22.23694,0 93.15387,22.18666,0 93.04414000000001,22.20194,0 93.05276000000001,22.11889,0 93.00972000000003,22.1075,0 92.99638000000003,21.99278,0 92.94304000000001,22.02833,0 92.89639,21.95472,0 92.86554,22.04888,0 92.71192000000002,22.15972,0 92.67970000000001,22.02694,0 92.60081,21.98222000000001,0 92.56218,22.13333,0 92.60609,22.16277,0 92.51639000000002,22.71583,0 92.47054000000001,22.75638,0 92.44386000000002,22.88944,0 92.37469,22.94193,0 92.34860000000001,23.22361,0 92.38697999999999,23.27993,0 92.37358,23.35925,0 92.27831999999999,23.605,0 92.28888000000001,23.69611,0 92.25221000000002,23.7225,0 92.21165000000001,23.65222,0 92.17486000000001,23.73682,0 92.0372,23.64528,0 91.95,23.73222000000001,0 91.96609000000001,23.50166,0 91.93304000000001,23.44444,0 91.84498000000001,23.41027,0 91.78360000000001,23.3125,0 91.76805000000002,23.25,0 91.82055,23.09777,0 91.72499000000001,22.99472,0 91.64722000000002,22.98638,0 91.61360000000001,22.94305,0 91.56359999999999,22.9836,0 91.49332000000001,23.18666,0 91.41665999999999,23.26611,0 91.37746,23.20693,0 91.40221,23.06945,0 91.33554,23.11555,0 91.28859,23.32832,0 91.31469000000001,23.36416,0 91.28221000000002,23.37332,0 91.15942,23.64055000000001,0 91.20028000000004,23.67805,0 91.15915,23.70082,0 91.15860000000002,23.73666,0 91.21638,23.75611,0 91.25054000000002,23.83027,0 91.23776000000001,23.90777,0 91.29832,23.99388,0 91.36110000000001,23.99528,0 91.37329,24.10194,0 91.54633,24.08693,0 91.62746,24.10972,0 91.6572,24.22416,0 91.70385000000002,24.15166,0 91.75525,24.15833,0 91.75775,24.23917000000001,0 91.83192000000001,24.22611,0 91.89249,24.14972,0 91.93248,24.27555,0 91.91776,24.32667,0 91.94664000000002,24.34945,0 91.98943000000001,24.31944,0 91.97470000000001,24.37889,0 92.08638000000001,24.37472,0 92.13527000000002,24.41416,0 92.13247,24.51388,0 92.19108000000001,24.56528,0 92.25664999999999,24.77390000000001,0 92.25526000000004,24.90361,0 92.40173000000002,24.84041,0 92.49384000000001,24.87879,0 92.48305000000001,24.93,0 92.41665999999999,24.9725,0 92.40637,25.03056000000001,0 92.04080999999999,25.18777,0 91.75749000000002,25.17388,0 91.64888000000002,25.12667,0 91.59027,25.17278,0 91.48221000000001,25.13861,0 91.25777000000001,25.20778,0 90.84804,25.14861000000001,0 90.65305000000001,25.18111,0 90.43831,25.14721000000001,0 90.11053000000001,25.22472,0 89.91721000000001,25.31,0 89.84526000000001,25.2886,0 89.81554,25.36693,0 89.86443,25.64056,0 89.80721,25.82305,0 89.86545,25.93686,0 89.81671,25.95416000000001,0 89.85637,25.98111,0 89.77804999999999,26.04195,0 89.73915,26.15638,0 89.6493,26.18946,0 89.6386,26.2278,0 89.60173,26.22748,0 89.60896000000001,26.17790000000002,0 89.55986,26.16146000000001,0 89.60242,26.06897,0 89.52551,25.98821,0 89.39355000000001,26.0479,0 89.31990999999999,26.02483000000001,0 89.12967,26.15927,0 89.06721,26.3877,0 88.93877999999999,26.44582,0 88.90916,26.39271,0 88.98159000000001,26.29568,0 89.04134000000001,26.28179,0 89.02048000000001,26.23517,0 88.88330000000001,26.2852,0 88.82383,26.23343,0 88.76734,26.29859,0 88.66918,26.2609,0 88.67950999999999,26.30742,0 88.73037000000001,26.32068,0 88.69164000000001,26.34277,0 88.68082,26.42027,0 88.43304000000001,26.55139000000001,0 88.40109,26.62527,0 88.33777000000001,26.47389,0 88.35359,26.45167,0 88.37109,26.48917,0 88.48331,26.46111000000001,0 88.52554000000002,26.35972,0 88.45749000000001,26.36916,0 88.35609,26.28444,0 88.35526,26.22333,0 88.18442,26.1525,0 88.15636000000001,26.09249,0 88.18333,26.03389,0 88.09554,25.91527,0 88.11053,25.83555000000001,0 88.15194,25.77861,0 88.27998,25.80167,0 88.44693,25.66611,0 88.45054,25.59389,0 88.54693,25.50416,0 88.69414,25.46778,0 88.79971000000001,25.51055,0 88.83443,25.47916,0 88.82166000000001,25.40166,0 88.86998,25.33583,0 89.00888000000001,25.30083,0 88.93304000000001,25.16444,0 88.83778,25.20361000000001,0 88.80582,25.16556,0 88.70499,25.19527,0 88.62025,25.19806,0 88.58138,25.16945,0 88.45556000000001,25.19055,0 88.45999000000001,25.06944,0 88.34249,24.87028,0 88.26749000000001,24.88472,0 88.22135000000002,24.95433,0 88.13777,24.92138,0 88.1711,24.85166,0 88.04387,24.68972,0 88.12553,24.50861,0 88.32388,24.43443,0 88.49776,24.32083,0 88.70638,24.30277,0 88.75291,24.21413,0 88.70833,24.17138,0 88.70734,24.12171,0 88.70138,24.07917,0 88.75918000000002,24.03604,0 88.72272,23.99796,0 88.73665,23.9198,0 88.66949,23.86855,0 88.60284,23.8624,0 88.56386999999999,23.65222,0 88.74942,23.46693000000001,0 88.79331999999999,23.49417,0 88.71138000000001,23.30861000000001,0 88.72110000000002,23.25166,0 88.98609999999999,23.20833,0 88.87025,23.08777,0 88.86276000000001,22.96667,0 88.97110000000001,22.84694,0 88.93026999999999,22.74833,0 88.95860000000002,22.59138,0 88.92918,22.54767,0 88.99776000000001,22.46555,0 89.00722,22.27639,0 89.09637000000001,22.14861,0 89.063,22.11547,0 89.04387,22.13638,0 89.03665,22.09805,0 89.05749,21.92833,0 89.00861,21.93027,0 88.99970999999999,21.90277,0 88.94275,21.93666,0 88.93137,21.98638,0 88.90555000000001,21.95916,0 89.01639,21.86582,0 89.02110000000002,21.78222,0 89.08971,21.65027,0 89.07416000000001,21.61417,0 89.02748,21.62695,0 89.00027,21.60209,0 88.88085000000001,21.51552,0 88.78551,21.55832,0 88.70639,21.57051,0 88.53887,21.52715,0 88.49802,21.52056,0 88.48305000000001,21.55694,0 88.52554000000002,21.65583,0 88.50082,21.7525,0 88.53749000000002,21.81388000000001,0 88.49802,21.87027,0 88.49609,21.95027,0 88.45387,21.615,0 88.39082000000001,21.58833,0 88.38694,21.69695,0 88.34610000000001,21.68388,0 88.33333,21.71389,0 88.34415,21.62222,0 88.30859000000001,21.60305,0 88.29721000000001,21.77277,0 88.26194,21.8,0 88.30831000000001,21.57055,0 88.25225000000002,21.55052,0 88.20502000000001,21.51847,0 88.17249,21.53918,0 88.12221,21.61312,0 88.05122000000002,21.63086,0 87.94918,21.80093000000001,0 87.91101999999999,21.80093000000001,0 87.82944000000001,21.71916,0 87.68498,21.64777,0 87.48090000000002,21.61178,0 87.11693,21.51139,0 86.87553,21.27443,0 86.83443,21.18944,0 86.83526999999999,21.10611,0 86.96748,20.79527,0 86.87886,20.76777,0 86.98553,20.75278,0 86.99498,20.70666,0 86.93718,20.7,0 86.98888,20.67167,0 87.04165999999999,20.69333,0 86.75584000000001,20.49138,0 86.72083000000002,20.3725,0 86.78525999999999,20.38527,0 86.80441999999999,20.43611,0 86.80054,20.38166,0 86.69275,20.29416,0 86.74802000000001,20.3061,0 86.57444,20.21249,0 86.48888,20.10721,0 86.39360000000001,20.01388,0 86.42386999999999,19.98611,0 86.28027,19.91416,0 85.62385999999999,19.71361,0 85.23415,19.51195,0 84.86638000000001,19.22027,0 84.78610000000001,19.11443,0 84.74193,19.14889,0 84.72659,19.124,0 84.73526,19.07472,0 84.78083,19.09417,0 84.67638,18.94194,0 84.43552,18.64638,0 84.27554000000001,18.51833,0 84.24498,18.525,0 84.24165000000001,18.49611,0 84.27666000000001,18.49944,0 84.34942,18.54888,0 84.14166,18.37111,0 84.08028,18.26861,0 83.77582,18.14277,0 83.58275999999999,18.0175,0 83.47054,17.9,0 83.44332000000001,17.91582,0 83.45664000000001,17.88138,0 83.34220000000001,17.71444,0 83.29498000000001,17.68693,0 83.23693,17.71167,0 83.29694000000002,17.66555,0 83.21304000000001,17.63139,0 83.23859,17.60083,0 83.21638,17.58055,0 82.50555,17.22305,0 82.31331,17.04556,0 82.2486,16.92027,0 82.27222,16.86222,0 82.35971000000002,16.82056,0 82.36449,16.93222,0 82.37195,16.86854,0 82.34644,16.70472,0 82.31226,16.60444,0 82.28032,16.61944,0 82.30199,16.575,0 82.07449,16.44305,0 81.72726,16.31083,0 81.5856,16.33721,0 81.54504000000001,16.37305,0 81.54474999999999,16.34416,0 81.41947999999999,16.33777,0 81.25944000000001,16.27662,0 81.15782,16.05306,0 81.15837000000001,15.97527,0 81.00171,15.84445,0 81.01727,15.77555,0 80.81507000000001,15.71571,0 80.80443000000001,15.84472,0 80.67137000000001,15.90583,0 80.65776,15.88861,0 80.68552,15.88306,0 80.55415000000001,15.87694,0 80.27943000000001,15.69917,0 80.20637000000002,15.48861,0 80.09081999999999,15.30916,0 80.04886999999999,15.04889,0 80.10578000000001,14.78102,0 80.15331000000001,14.67445,0 80.18221,14.59638,0 80.14413999999999,14.56555,0 80.19859,14.57027,0 80.17415,14.34389,0 80.13721000000001,14.25639,0 80.07916,14.24472,0 80.03999,14.19528,0 80.12886,14.23667,0 80.14915000000002,14.01111,0 80.24748,13.80889,0 80.22581,13.68,0 80.34972000000001,13.33417,0 80.26277,12.94916,0 80.25888000000001,12.78222,0 80.16025999999999,12.47305,0 80.03360000000001,12.27861,0 79.94193,12.22305,0 80.0061,12.23027,0 79.86720000000001,12.03277,0 79.78386999999999,11.775,0 79.75139,11.54916,0 79.82249,11.37333,0 79.76667000000001,11.38389,0 79.67192,11.29556,0 79.76389,11.36,0 79.83110000000001,11.345,0 79.84081999999999,10.81778,0 79.85971000000001,10.29538,0 79.93916,10.12232,0 80.24818999999999,9.827252,0 80.36803000000002,9.653893999999999,0 80.80193,9.292769,0 80.73499,9.302498999999999,0 80.80582000000001,9.240273,0 80.79665,9.266660999999999,0 80.82444000000001,9.261945000000001,0 80.88388000000001,9.138609000000001,0 80.83222000000001,9.139715000000001,0 80.89249,9.111392,0 80.95750000000001,9.010556000000001,0 80.87608,9.036395000000001,0 80.93027000000001,8.979444000000001,0 80.92081000000002,8.935551,0 80.97971,8.973611999999999,0 81.23109,8.651106,0 81.20555000000002,8.608059000000001,0 81.25221000000001,8.542214,0 81.20833,8.570826,0 81.21388,8.508609,0 81.16137000000001,8.534447999999999,0 81.13054,8.500005,0 81.16775,8.514998,0 81.26555000000001,8.453609,0 81.32026999999999,8.520002,0 81.36136999999999,8.487215000000001,0 81.39137,8.367217999999999,0 81.35442000000001,8.403893,0 81.35498,8.366382,0 81.39499000000001,8.340831,0 81.44331,8.173889000000001,0 81.4397,8.101395,0 81.39916,8.187497000000001,0 81.39027,8.140003999999999,0 81.43359,8.085824000000002,0 81.46361,8.112769999999999,0 81.51555000000002,8.003052,0 81.56944000000001,7.983891000000001,0 81.59305000000001,7.838892,0 81.69465,7.757684,0 81.80025999999999,7.610552,0 81.82656,7.473186000000001,0 81.87886,7.312221000000001,0 81.89166,7.013609,0 81.78221000000001,6.624720000000001,0 81.66110000000001,6.440003000000001,0 81.32417,6.198327,0 81.21138000000001,6.160284,0 81.19609,6.181946,0 81.11887,6.112503000000001,0 80.8186,6.037776,0 80.71638,5.956946,0 80.59193000000001,5.918336,0 80.46471,5.933340000000001,0 80.44026,5.96555,0 80.20081999999999,6.026112000000001,0 80.12581,6.093891,0 80.02666000000001,6.268337000000001,0 79.98648,6.432363,0 79.85137,6.83639,0 79.85831,7.024167000000001,0 79.80748,7.192214,0 79.8436,7.125272000000001,0 79.86248999999999,7.155837,0 79.82639,7.198893000000001,0 79.79694000000001,7.661394,0 79.70638,8.035830000000001,0 79.69804000000001,8.217504,0 79.77399000000001,8.533196,0 79.92596,8.795825000000001,0 79.91638000000002,8.931663,0 79.88623,8.969967000000001,0 79.69427,9.086679,0 79.44081,9.148337,0 79.27222,9.252773,0 78.97110000000001,9.273607999999999,0 78.66221,9.176660999999999,0 78.65637,9.147779,0 78.39664999999999,9.089721000000001,0 78.19247,8.904166999999999,0 78.16361000000002,8.754165,0 78.20804,8.781658999999999,0 78.21053000000001,8.75555,0 78.11192,8.654715,0 78.13997999999999,8.617221000000001,0 78.13164999999999,8.486667000000001,0 78.06053,8.364167,0 77.99693000000001,8.338328000000001,0 77.79275,8.225,0 77.77554000000001,8.181108,0 77.5872,8.134722,0 77.54082,8.069715,0 77.30304,8.123327,0 76.9986,8.365273999999999,0 76.54387,8.907496999999999,0 76.54498,8.930277,0 76.60415999999999,8.90972,0 76.61414000000001,8.928890000000001,0 76.57082,8.939159,0 76.60053000000001,8.971947,0 76.65860000000001,8.964998,0 76.62943,8.981945,0 76.66748,9.003609000000001,0 76.57720999999999,8.994166999999999,0 76.55859,8.95166,0 76.55692999999999,8.990829,0 76.52694,8.938890000000001,0 76.45471000000001,9.122499,0 76.47581,9.115550000000001,0 76.48387,9.161667,0 76.46138000000001,9.149445,0 76.41914,9.249165,0 76.44247,9.143325000000001,0 76.31582,9.463608000000001,0 76.23848,9.953955000000002,0 76.23437,9.986049,0 76.19637,10.06528,0 76.17747,10.17,0 76.24109,10.22666,0 76.19497,10.26445,0 76.20663999999999,10.20306,0 76.15776,10.19527,0 76.05553999999999,10.505,0 75.92416,10.75556,0 75.93858,10.79277,0 75.90748000000001,10.80333,0 75.72553000000001,11.32972,0 75.7411,11.36306,0 75.67859,11.44583,0 75.61304,11.47166,0 75.52858999999999,11.70027,0 75.31219,11.90056,0 75.30775,11.93806,0 75.39664999999999,11.91611,0 75.39388,11.97222,0 75.30971,11.95222,0 75.27442000000001,12.00777,0 75.33167,12.01472,0 75.29636000000002,12.03777,0 75.25912,12.01889,0 75.27831999999999,11.96194,0 75.2186,12.01806,0 75.19582,12.00389,0 75.17613,12.06975,0 75.10721,12.22,0 74.85526,12.755,0 74.82332,12.83361,0 74.85999,12.82389,0 74.93998000000001,12.87111,0 74.84276,12.84556,0 74.81026000000001,12.86472,0 74.77916999999999,13.08389,0 74.68665,13.37833,0 74.68248000000001,13.46278,0 74.70139,13.41056,0 74.71249000000002,13.46806,0 74.67609,13.51028,0 74.66388000000002,13.63194,0 74.73443,13.65222,0 74.68193000000001,13.70611,0 74.65721000000002,13.65972,0 74.61913,13.8325,0 74.49442999999999,14.01639,0 74.42525999999999,14.24861,0 74.51186,14.24342,0 74.40942,14.29445,0 74.35138000000001,14.51028,0 74.39444,14.45332,0 74.42443,14.47611,0 74.35803,14.56833,0 74.3336,14.51555,0 74.30081,14.52166,0 74.28831,14.58417,0 74.33859,14.60611,0 74.26470999999999,14.62222,0 74.25082999999999,14.71889,0 74.22331,14.73777,0 74.19414000000002,14.71444,0 74.08971,14.79777,0 74.23499,14.87471,0 74.20914999999999,14.89527,0 74.12303000000001,14.84417,0 74.10136,14.86709,0 74.03361,14.91722,0 74.01999000000001,15.00055,0 73.91553999999999,15.07805,0 73.96082000000001,15.15472,0 73.88054,15.35971,0 73.78610000000001,15.39805,0 73.91249000000001,15.40111,0 73.96361,15.36361,0 73.91692999999999,15.41916,0 73.78859,15.455,0 73.86499000000002,15.50667,0 73.86388,15.53472,0 73.75832,15.49471,0 73.73081999999999,15.59777,0 73.83526000000001,15.65944,0 73.71638,15.61972,0 73.69721,15.72195,0 73.64193,15.74027,0 73.64943,15.78416,0 73.59387,15.89278,0 73.48553,15.99139,0 73.51331999999999,16.01972,0 73.44776,16.05584,0 73.48859,16.18,0 73.45499,16.16916,0 73.44776,16.10889,0 73.43804,16.21832,0 73.40998999999999,16.21749,0 73.35581999999999,16.36889,0 73.38191999999999,16.39861,0 73.30165,16.5225,0 73.31581,16.55695,0 73.36054,16.51222,0 73.36774,16.55861,0 73.30859,16.60306,0 73.37276,16.59249,0 73.37276,16.62305,0 73.31693,16.62861,0 73.29109,16.7575,0 73.30971,16.80583,0 73.26972000000001,16.85333,0 73.28805,16.98166,0 73.24832000000002,17.03555,0 73.27139,17.03056,0 73.2747,17.08194,0 73.18359,17.29888,0 73.24442999999999,17.28417,0 73.15998999999999,17.40055,0 73.18581,17.44027,0 73.12776,17.53943,0 73.12776,17.56611,0 73.19914,17.58638,0 73.14166,17.59361,0 73.11443,17.63666,0 73.10914,17.76972,0 73.01166000000001,17.94805,0 73.03498999999999,17.98472,0 73.00054,18.01444,0 73.04443000000001,18.05167000000001,0 72.97971,18.06305,0 72.96915,18.18694,0 72.92221000000001,18.22722,0 72.93803,18.27945,0 72.97165000000001,18.23944,0 73.05663000000001,18.22138,0 73.05165,18.18305,0 73.07887,18.21472,0 73.06499,18.27389,0 72.98581,18.28389,0 72.90694000000001,18.36249,0 72.90916,18.52638,0 72.95138,18.52944,0 72.99387,18.4561,0 73.01694000000001,18.46722,0 72.9611,18.55139000000001,0 72.91443000000001,18.55277,0 72.85748,18.64805,0 72.85741,18.79465,0 72.80582,18.895,0 72.80247,18.95304,0 72.76999000000002,18.94306,0 72.82249,19.03777,0 72.82082,19.17277,0 72.77998,19.16027,0 72.82666,19.25056,0 72.77638,19.20388,0 72.77748,19.30861,0 72.96971000000001,19.29166,0 73.01609999999999,19.20583,0 73.04722,19.21726,0 72.96388,19.30917,0 72.79776,19.32611,0 72.75443,19.36972,0 72.74359,19.47611,0 72.87916000000001,19.52778,0 72.79443000000001,19.52361,0 72.73305000000001,19.57805,0 72.74249,19.51056,0 72.71693000000001,19.5475,0 72.68831,19.72111,0 72.73165,19.70555,0 72.73220000000001,19.78277,0 72.67525999999999,19.74611,0 72.64748,19.84666,0 72.72745999999999,20.13218,0 72.75359,20.295,0 72.88527000000001,20.51305,0 72.90166000000001,20.73222,0 72.94609,20.75833,0 72.92110000000001,20.81583,0 72.88916999999999,20.79555,0 72.89305,20.87305,0 72.83443,20.83416,0 72.79096,20.87397,0 72.83098,20.92505,0 72.89109999999999,20.97888,0 72.78471999999999,21.00082,0 72.73706,20.99305,0 72.70739,21.07498,0 72.70011,21.07702,0 72.66921000000001,21.093,0 72.62608,21.08472,0 72.61248999999999,21.12068,0 72.60988999999999,21.25536,0 72.58249000000001,21.34138,0 72.64776999999999,21.35889,0 72.56667,21.3825,0 72.75499000000001,21.46472,0 72.6947,21.46972,0 72.59081999999999,21.41195,0 72.61156,21.47095,0 72.52789,21.67045,0 72.30326,21.63418,0 72.24249,21.46527,0 72.10387,21.30972,0 72.08611000000001,21.24471,0 72.11053,21.20194,0 72.04886999999999,21.16083,0 71.56026,20.94611,0 71.56191,20.97861,0 71.46693000000001,20.88194,0 71.01195000000001,20.74166,0 70.96608999999999,20.70277,0 70.83138,20.69444,0 70.52777,20.81111,0 70.26028,20.97666,0 70.01582999999999,21.18611,0 69.80888,21.46361,0 69.59582,21.63333,0 69.40331999999999,21.80306,0 69.38970999999999,21.87444,0 69.36053,21.84722,0 69.22942000000001,21.94722,0 68.96278,22.24777,0 68.94274,22.32166,0 68.96388,22.38445,0 69.06914,22.48121,0 69.13518999999999,22.5504,0 69.20937000000001,22.73017,0 69.14346999999999,22.8714,0 68.66665,23.14222,0 68.5936,23.22888,0 68.62053,23.26777,0 68.56887999999999,23.25,0 68.53916,23.27833,0 68.51105,23.36989,0 68.53804,23.41805,0 68.47638000000001,23.40027,0 68.46278,23.43944,0 68.43692,23.42638,0 68.39158999999999,23.4551,0 68.40292,23.51842,0 68.42331,23.62722,0 68.48553,23.61,0 68.46693000000001,23.65304,0 68.63638,23.75722,0 68.66887,23.80972,0 68.81833,23.87638000000001,0 68.62831,23.82611,0 68.58804000000001,23.76695,0 68.44747,23.72693,0 68.32138999999999,23.58083,0 68.14028,23.60471,0 68.2011,23.66417,0 68.23054999999999,23.64361,0 68.28027,23.66666,0 68.21388,23.68055,0 68.1978,23.76668,0 68.21442,23.86833,0 68.28194000000001,23.89777,0 68.29053999999999,23.94444,0 68.33054,23.91472,0 68.36193,23.97388,0 68.37637000000001,23.94417,0 68.39055000000001,23.96749000000001,0 68.74721,23.96999,0 68.74525,24.31639,0 68.78306000000001,24.33278,0 68.82471000000001,24.33278,0 68.85804,24.24166,0 68.92693,24.32555,0 68.98803,24.25694,0 69.08028,24.29722,0 69.18941,24.25805,0 69.31081,24.29666,0 69.59860000000001,24.28139,0 69.72360000000001,24.17111,0 70.01470999999999,24.16972000000001,0 70.07071000000002,24.19792,0 70.12009000000001,24.30904,0 70.56749000000002,24.43639,0 70.60081,24.415,0 70.56776000000001,24.37138,0 70.58443,24.27834,0 70.65054000000001,24.24138,0 70.79082,24.23944,0 70.88582,24.27444,0 70.86443,24.31694,0 70.92804,24.36167,0 71.02916999999999,24.36361,0 71.10581999999999,24.41638,0 71.08194,24.44861,0 71.0061,24.45805,0 71.00555,24.54084,0 70.97971,24.56056,0 70.99276,24.6361,0 71.07743000000001,24.68047,0 70.9422,24.93555,0 70.8797,25.15611,0 70.75333000000001,25.27389000000001,0 70.67747,25.40166,0 70.66638,25.69833,0 70.60637,25.71416,0 70.38611,25.67472,0 70.29276000000002,25.70138,0 70.1172,25.91888000000001,0 70.09276,26.08,0 70.17386999999999,26.24444,0 70.17192,26.55277,0 70.07138000000001,26.59611,0 69.80081,26.59416,0 69.72276000000001,26.66527,0 69.51277,26.74667000000001,0 69.48609999999999,26.80638,0 69.50972,26.99221,0 69.58333,27.17833,0 69.86749,27.40861,0 70.0311,27.59055,0 70.11971,27.81611,0 70.20354,27.88558,0 70.36832,28.02083,0 70.51443,28.03917,0 70.6636,27.92833,0 70.6622,27.86333000000001,0 70.73775999999999,27.73138,0 70.86665000000001,27.70693,0 71.22581,27.84583,0 71.62691,27.87611,0 71.89694,27.96194,0 71.91998,28.12082,0 72.20663999999999,28.4025,0 72.29221,28.68,0 72.38970999999999,28.785,0 72.94832,29.03583,0 72.98888,29.14194000000001,0 73.08638000000001,29.24582,0 73.26527,29.55306,0 73.39749000000001,29.94277,0 73.93341,30.136,0 73.96442,30.23472,0 73.93442,30.31416,0 73.8586,30.36028,0 73.8725,30.3901,0 73.93380000000002,30.41625,0 73.99609,30.505,0 74.05025999999999,30.515,0 74.04886999999999,30.59916000000001,0 74.16109,30.66167,0 74.31693,30.88944,0 74.40063000000001,30.88415000000001,0 74.43221,30.94277,0 74.55499,30.99505,0 74.56112,31.04559,0 74.69459000000002,31.05396,0 74.68432,31.11202,0 74.62375,31.12393,0 74.55728000000001,31.07605,0 74.53898,31.11872,0 74.54837000000001,31.35443,0 74.65510999999999,31.42797,0 74.59842,31.48941,0 74.61033999999999,31.55431,0 74.48872,31.72159,0 74.54922000000001,31.74385,0 74.60532000000001,31.87712,0 74.83311000000001,31.96271000000001,0 74.90347000000001,32.05329,0 75.04075000000002,32.04146,0 75.19403,32.07404,0 75.22417,32.11676,0 75.25653,32.09287,0 75.30686,32.13391,0 75.32883,32.20907,0 75.39130000000002,32.24158,0 75.32859000000001,32.29276,0 75.31931,32.34466,0 75.04886999999999,32.47832,0 74.93858,32.44887,0 74.86165,32.48472,0 74.74443000000001,32.465,0 74.70387,32.48555,0 74.65358999999999,32.59332,0 74.70165,32.84694,0 74.63248,32.77055,0 74.53166,32.75027,0 74.45444000000001,32.79306,0 74.37164,32.7711,0 74.32966999999999,32.81542,0 74.36388,32.86944,0 74.33414999999999,33.00054,0 74.17331,33.04749,0 74.01331999999999,33.19888,0 74.02415000000001,33.27638,0 74.12581,33.34333,0 74.18248,33.51056,0 74.15443000000001,33.56139,0 74,33.65417,0 73.99471,33.75555,0 74.05025999999999,33.83167,0 74.23581,33.88416,0 74.29582000000001,33.97748,0 74.24442999999999,34.01915,0 73.97887,34.01139,0 73.91332,34.0686,0 73.9122,34.11527,0 74.01416999999999,34.17556,0 74.01776,34.21804000000001,0 73.97331,34.30277,0 73.84805,34.3186,0 73.79637,34.38555,0 73.87054000000001,34.45833,0 73.88193,34.52194,0 73.94637,34.56554,0 73.94914,34.65444,0 74.38916,34.78194,0 74.69275,34.6936,0 75.24303999999999,34.62609,0 75.39249,34.55471,0 75.66137000000001,34.50082,0 75.80553999999999,34.50721,0 75.98804,34.62694,0 76.16748,34.58638,0 76.22916000000001,34.60944,0 76.29359,34.70027,0 76.47026,34.76999,0 76.56303000000001,34.73166,0 76.7272,34.74388,0 76.80138,34.67222,0 76.86998,34.65888,0 76.91692999999999,34.68138,0 76.96416000000001,34.94055,0 77.06081,35.01472,0 77.04248,35.09916,0 77.82393,35.50133000000001,0 77.92470000000002,35.48972,0 77.97248999999999,35.57417000000001,0 78.13694,35.54333,0 78.17221000000001,35.61943,0 78.29915,35.70194,0 78.62553,35.81666,0 78.74193,35.92027,0 78.93442,35.89249,0 79.32832999999999,35.98638,0 79.43803000000001,35.96054000000001,0 + + + 1 + + + + + GMT +05:45 + + +]]> + #khStyle0575 + + + + +82.0664,27.91416,0 81.97776000000002,27.91722,0 81.88026000000001,27.85721,0 81.48027,28.08,0 81.42192,28.16638,0 81.31999000000002,28.13,0 81.31218,28.19333,0 81.19359,28.36667,0 81.01888,28.40416000000001,0 81.00694,28.44305,0 80.93858,28.44111,0 80.89249,28.50638,0 80.79832,28.52389,0 80.66249000000001,28.63277,0 80.58499000000001,28.6536,0 80.57720999999999,28.68556,0 80.50555,28.65833,0 80.50861,28.56693,0 80.44026,28.62888,0 80.35776,28.62944,0 80.24609,28.75082,0 80.05582,28.83611,0 80.05998,28.93166,0 80.1297,28.99305,0 80.14664999999999,29.10833,0 80.25694,29.14472,0 80.23997,29.21472,0 80.28777,29.20556,0 80.30693000000001,29.31055,0 80.27582,29.3225,0 80.23637000000001,29.42527,0 80.40694000000001,29.59638,0 80.37691,29.7486,0 80.53970000000001,29.84611,0 80.59887000000001,29.95527,0 80.74609,30.02138,0 80.87276,30.13888,0 80.8586,30.17472,0 80.89333000000001,30.21111,0 80.93637,30.18138,0 81.02536000000001,30.20436,0 81.10971000000001,30.02472,0 81.22360000000001,30.01027,0 81.30193,30.08361,0 81.29082,30.13055,0 81.37777,30.16667,0 81.42110000000001,30.38528,0 81.54192000000001,30.33056,0 81.55775,30.38194,0 81.63721,30.42444,0 81.80304,30.36361,0 82.10054,30.34222000000001,0 82.10721,30.23083,0 82.17859,30.19055,0 82.15027000000001,30.12556,0 82.17776000000001,30.06361,0 82.23109,30.07527,0 82.55775,29.94277,0 82.65581,29.83527000000001,0 82.71554999999999,29.83194,0 82.71053000000001,29.78972,0 82.85525000000001,29.66889000000002,0 82.90860000000001,29.69444,0 82.9922,29.6725,0 83.09276,29.58305,0 83.11749,29.62056000000001,0 83.19525,29.63083,0 83.28306000000001,29.55111000000001,0 83.28442,29.47443,0 83.34610000000001,29.49666,0 83.37916,29.46611,0 83.38054,29.41638,0 83.52748,29.26916,0 83.55277,29.18583,0 83.67192,29.16027,0 83.72054,29.22889,0 83.91249000000001,29.28972,0 84.11388000000001,29.26194,0 84.13667,29.21443,0 84.18552,29.20556,0 84.15833000000001,29.13472,0 84.20249,29.05695,0 84.2561,29.04222,0 84.23693000000002,28.91888000000001,0 84.39554,28.85917,0 84.48109,28.73667,0 84.63639000000001,28.70277000000002,0 84.70663999999999,28.66055,0 84.70610000000001,28.60139,0 84.7747,28.59888,0 84.84663999999999,28.54445,0 84.95470000000002,28.54416,0 85.05998,28.64111,0 85.18996,28.60332,0 85.18192999999999,28.53,0 85.10193,28.44666,0 85.10332,28.31639,0 85.37665,28.26361,0 85.45889,28.30166,0 85.61998,28.25111,0 85.71832000000002,28.33943,0 85.74722,28.23693000000001,0 85.88611,28.15167,0 85.91887,28.03333,0 85.97803999999999,27.98972,0 85.97304,27.91583,0 86.01443,27.88277,0 86.08942999999999,27.89083000000001,0 86.13721,27.93194,0 86.0936,28.08611,0 86.18359,28.16388,0 86.22638000000001,28.00667,0 86.44498,27.90805,0 86.53498999999999,27.95499,0 86.57193,28.10583000000001,0 86.63666000000001,28.08555,0 86.68637,28.11222,0 86.75805,28.08027,0 86.76416,28.02666,0 86.87415,28.01777,0 86.93304000000002,27.95055,0 87.03943000000001,27.96083,0 87.19275,27.82306,0 87.30609,27.81639,0 87.40416999999999,27.86055,0 87.39360000000001,27.80916,0 87.5461,27.84583,0 87.59775999999999,27.81027,0 87.66054,27.82888,0 87.72054,27.805,0 87.79721000000001,27.83722,0 87.86887,27.91888,0 88.14279999999999,27.86605,0 88.19386,27.8475,0 88.18887000000001,27.78777,0 88.11913,27.60833,0 88.05692999999999,27.53334,0 88.06667000000002,27.43693,0 88.03888000000001,27.37611,0 88.05971,27.32777000000002,0 87.99303999999999,27.11444,0 88.11859,26.98444,0 88.19497,26.75416,0 88.10193,26.53028000000001,0 88.09583000000001,26.43888000000002,0 88.02638,26.36916,0 87.94941,26.40055,0 87.89055999999999,26.47333,0 87.84305000000001,26.43888000000002,0 87.78554,26.45638,0 87.76639,26.40861,0 87.69748,26.42944,0 87.59999000000001,26.37972,0 87.44748,26.43250000000001,0 87.37082,26.40333,0 87.32805999999999,26.34777,0 87.24525,26.41222,0 87.1375,26.40972,0 87.09415,26.45638,0 87.06137,26.58833,0 86.88598,26.46866,0 86.73165,26.41999,0 86.53498999999999,26.52806,0 86.33249000000001,26.58499,0 86.33167,26.61277,0 86.20664000000001,26.58556,0 86.18387,26.60806,0 86.02943000000001,26.66306,0 85.85027,26.57222,0 85.73054999999999,26.66722,0 85.72609,26.80167000000001,0 85.63026000000001,26.8675,0 85.45305000000001,26.78694000000001,0 85.41249000000001,26.79472000000001,0 85.33443,26.73582,0 85.21165000000001,26.76694,0 85.18388,26.86666,0 85.04082,26.84777,0 85.04109,26.88666,0 84.97331,26.90304,0 84.95277,26.95804,0 84.84360000000001,27.01527,0 84.75027,27.0075,0 84.64749000000001,27.04527,0 84.68414,27.21555,0 84.60997999999999,27.33556,0 84.29776,27.38832,0 84.14333000000001,27.52417,0 84.09887000000001,27.51611,0 84.04026,27.44472,0 83.83526999999999,27.43805,0 83.87553,27.38083,0 83.85832000000001,27.35221,0 83.60776,27.46916,0 83.39610000000002,27.47861,0 83.37665,27.37527,0 83.29137,27.33777,0 83.17638,27.44888,0 82.76860000000001,27.50166,0 82.7011,27.71111000000001,0 82.43471,27.67556,0 82.0664,27.91416,0 + + + 1 + + + + GMT +06:00 + + +]]> + #khStyle0600 + + + + + +73.35092,-9.431101,0 70.25215,-9.433405000000001,0 70.25215,-6.970275,0 73.34769,-6.970275,0 73.35092,-9.431101,0 + + + 1 + + + + + +88.43304000000001,26.55139000000001,0 88.68082,26.42027,0 88.69164000000001,26.34277,0 88.73037000000001,26.32068,0 88.67950999999999,26.30742,0 88.66918,26.2609,0 88.76734,26.29859,0 88.82383,26.23343,0 88.88330000000001,26.2852,0 89.02048000000001,26.23517,0 89.04134000000001,26.28179,0 88.98159000000001,26.29568,0 88.90916,26.39271,0 88.93877999999999,26.44582,0 89.06721,26.3877,0 89.12967,26.15927,0 89.31990999999999,26.02483000000001,0 89.39355000000001,26.0479,0 89.52551,25.98821,0 89.60242,26.06897,0 89.55986,26.16146000000001,0 89.60896000000001,26.17790000000002,0 89.60173,26.22748,0 89.6386,26.2278,0 89.6493,26.18946,0 89.73915,26.15638,0 89.77804999999999,26.04195,0 89.85637,25.98111,0 89.81671,25.95416000000001,0 89.86545,25.93686,0 89.80721,25.82305,0 89.86443,25.64056,0 89.81554,25.36693,0 89.84526000000001,25.2886,0 89.91721000000001,25.31,0 90.11053000000001,25.22472,0 90.43831,25.14721000000001,0 90.65305000000001,25.18111,0 90.84804,25.14861000000001,0 91.25777000000001,25.20778,0 91.48221000000001,25.13861,0 91.59027,25.17278,0 91.64888000000002,25.12667,0 91.75749000000002,25.17388,0 92.04080999999999,25.18777,0 92.40637,25.03056000000001,0 92.41665999999999,24.9725,0 92.48305000000001,24.93,0 92.49384000000001,24.87879,0 92.40173000000002,24.84041,0 92.25526000000004,24.90361,0 92.25664999999999,24.77390000000001,0 92.19108000000001,24.56528,0 92.13247,24.51388,0 92.13527000000002,24.41416,0 92.08638000000001,24.37472,0 91.97470000000001,24.37889,0 91.98943000000001,24.31944,0 91.94664000000002,24.34945,0 91.91776,24.32667,0 91.93248,24.27555,0 91.89249,24.14972,0 91.83192000000001,24.22611,0 91.75775,24.23917000000001,0 91.75525,24.15833,0 91.70385000000002,24.15166,0 91.6572,24.22416,0 91.62746,24.10972,0 91.54633,24.08693,0 91.37329,24.10194,0 91.36110000000001,23.99528,0 91.29832,23.99388,0 91.23776000000001,23.90777,0 91.25054000000002,23.83027,0 91.21638,23.75611,0 91.15860000000002,23.73666,0 91.15915,23.70082,0 91.20028000000004,23.67805,0 91.15942,23.64055000000001,0 91.28221000000002,23.37332,0 91.31469000000001,23.36416,0 91.28859,23.32832,0 91.33554,23.11555,0 91.40221,23.06945,0 91.37746,23.20693,0 91.41665999999999,23.26611,0 91.49332000000001,23.18666,0 91.56359999999999,22.9836,0 91.61360000000001,22.94305,0 91.64722000000002,22.98638,0 91.72499000000001,22.99472,0 91.82055,23.09777,0 91.76805000000002,23.25,0 91.78360000000001,23.3125,0 91.84498000000001,23.41027,0 91.93304000000001,23.44444,0 91.96609000000001,23.50166,0 91.95,23.73222000000001,0 92.0372,23.64528,0 92.17486000000001,23.73682,0 92.21165000000001,23.65222,0 92.25221000000002,23.7225,0 92.28888000000001,23.69611,0 92.27831999999999,23.605,0 92.37358,23.35925,0 92.38697999999999,23.27993,0 92.34860000000001,23.22361,0 92.37469,22.94193,0 92.44386000000002,22.88944,0 92.47054000000001,22.75638,0 92.51639000000002,22.71583,0 92.60609,22.16277,0 92.56218,22.13333,0 92.60081,21.98222000000001,0 92.62164,21.87583,0 92.60027000000001,21.63416,0 92.66935000000002,21.29698,0 92.59554000000001,21.25194,0 92.55359,21.37361,0 92.42747000000001,21.37472,0 92.37691,21.47416,0 92.31667,21.42138,0 92.26555000000002,21.42333,0 92.25305000000002,21.3725,0 92.19220000000001,21.32444,0 92.19859000000001,21.15417,0 92.26194,21.05431,0 92.26331999999999,20.91916000000001,0 92.33333,20.76416,0 92.31895,20.729,0 90.32641000000001,18.56566,0 90.33015,15.23029,0 90.33504000000001,10.88448,0 90.34064000000001,5.884479,0 92.9025,5.880672000000001,0 94.60397,3.503177,0 97.51384,-0.5628515,0 97.51384,-1.259497,0 97.51384,-6.259501,0 97.51384,-11.2595,0 93.69904000000001,-11.2595,0 93.69904000000001,-13.93192,0 97.51384,-13.93535,0 97.51384,-14.73534,0 97.51384,-19.73534,0 97.51384,-24.73534,0 97.51384,-29.73533,0 97.51384,-34.73534,0 97.51384,-39.73533000000001,0 97.51384,-44.73534,0 97.51384,-48.73533,0 97.51384,-53.73534000000002,0 97.51384,-58.73533,0 97.51384,-63.73534,0 97.51384,-64.90000000000001,0 97.51384,-69.90000000000001,0 97.51384,-74.90000000000001,0 97.51384,-79.90000000000001,0 97.51384,-84.89999,0 97.51384,-89.90000000000001,0 96.57599999999999,-89.90000000000001,0 95.63816,-89.90000000000001,0 94.70033000000002,-89.90000000000001,0 93.76249,-89.90000000000001,0 92.82466000000001,-89.90000000000001,0 91.88683000000002,-89.90000000000001,0 90.94899,-89.90000000000001,0 90.01115000000002,-89.90000000000001,0 89.07332,-89.90000000000001,0 88.13549,-89.90000000000001,0 87.19765,-89.90000000000001,0 86.25982000000001,-89.90000000000001,0 85.32198,-89.90000000000001,0 84.38415999999999,-89.90000000000001,0 83.44632000000001,-89.90000000000001,0 82.50848000000001,-89.90000000000001,0 82.50834999999999,-84.89999,0 82.50829,-82.28883,0 82.50816,-77.28883,0 82.50802,-72.28883000000002,0 82.50792,-68.68883,0 82.5078,-63.68882,0 82.50766,-58.68883,0 82.50753000000002,-53.68882000000001,0 82.5074,-48.68883000000001,0 82.50727999999999,-43.68883,0 82.50713,-38.68883,0 82.50700000000002,-33.68883,0 82.50697,-32.48883,0 82.50684,-27.48883,0 82.50671,-22.48882,0 82.50658,-17.48883,0 82.50655,-16.18883,0 82.5064,-11.18883,0 82.50624999999999,-6.188824,0 82.5061,-1.188829,0 82.50595000000001,3.811175,0 82.50581,8.811171,0 82.50565,13.81117,0 82.50555,17.22305,0 83.21638,17.58055,0 83.23859,17.60083,0 83.21304000000001,17.63138,0 83.29694000000002,17.66555,0 83.23693,17.71167,0 83.29498000000001,17.68693,0 83.34220000000001,17.71444,0 83.45664000000001,17.88138,0 83.44332000000001,17.91582,0 83.47054,17.9,0 83.58275999999999,18.0175,0 83.77582,18.14277,0 84.08028,18.26861,0 84.14166,18.37111,0 84.34942,18.54888,0 84.27666000000001,18.49944,0 84.24165000000001,18.49611,0 84.24498,18.525,0 84.27554000000001,18.51833,0 84.43552,18.64638,0 84.67638,18.94194,0 84.78083,19.09417,0 84.73526,19.07472,0 84.72659,19.124,0 84.74193,19.14889,0 84.78610000000001,19.11443,0 84.86638000000001,19.22027,0 85.23415,19.51195,0 85.62385999999999,19.71361,0 86.28027,19.91416,0 86.42386999999999,19.98611,0 86.39360000000001,20.01388,0 86.48888,20.10721,0 86.57444,20.21249,0 86.74802000000001,20.3061,0 86.69275,20.29416,0 86.80054,20.38166,0 86.80441999999999,20.43611,0 86.78525999999999,20.38527,0 86.72083000000002,20.3725,0 86.75584000000001,20.49138,0 87.04165999999999,20.69333,0 86.98888,20.67167,0 86.93718,20.7,0 86.99498,20.70666,0 86.98553,20.75278,0 86.87886,20.76777,0 86.96748,20.79527,0 86.83526999999999,21.10611,0 86.83443,21.18944,0 86.87553,21.27443,0 87.11693,21.51139,0 87.48090000000002,21.61178,0 87.68498,21.64777,0 87.82944000000001,21.71916,0 87.91101999999999,21.80093000000001,0 87.94918,21.80093000000001,0 88.05122000000002,21.63086,0 88.12221,21.61312,0 88.17249,21.53918,0 88.20502000000001,21.51847,0 88.25225000000002,21.55052,0 88.30831000000001,21.57055,0 88.26194,21.8,0 88.29721000000001,21.77277,0 88.30859000000001,21.60305,0 88.34415,21.62222,0 88.33333,21.71389,0 88.34610000000001,21.68388,0 88.38694,21.69695,0 88.39082000000001,21.58833,0 88.45387,21.615,0 88.49609,21.95027,0 88.49802,21.87027,0 88.53749000000002,21.81388000000001,0 88.50082,21.7525,0 88.52554000000002,21.65583,0 88.48305000000001,21.55694,0 88.49802,21.52056,0 88.53887,21.52715,0 88.70639,21.57051,0 88.78551,21.55832,0 88.88085000000001,21.51552,0 89.00027,21.60209,0 89.02748,21.62695,0 89.07416000000001,21.61417,0 89.08971,21.65027,0 89.02110000000002,21.78222,0 89.01639,21.86582,0 88.90555000000001,21.95916,0 88.93137,21.98638,0 88.94275,21.93666,0 88.99970999999999,21.90277,0 89.00861,21.93027,0 89.05749,21.92833,0 89.03665,22.09805,0 89.04387,22.13638,0 89.063,22.11547,0 89.09637000000001,22.14861,0 89.00722,22.27639,0 88.99776000000001,22.46555,0 88.92918,22.54767,0 88.95860000000002,22.59138,0 88.93026999999999,22.74833,0 88.97110000000001,22.84694,0 88.86276000000001,22.96667,0 88.87025,23.08777,0 88.98609999999999,23.20833,0 88.72110000000002,23.25166,0 88.71138000000001,23.30861000000001,0 88.79331999999999,23.49417,0 88.74942,23.46693000000001,0 88.56386999999999,23.65222,0 88.60284,23.8624,0 88.66949,23.86855,0 88.73665,23.9198,0 88.72272,23.99796,0 88.75918000000002,24.03604,0 88.70139,24.07917,0 88.70734,24.12171,0 88.70833,24.17138,0 88.75291,24.21413,0 88.70638,24.30277,0 88.49776,24.32083,0 88.32388,24.43443,0 88.12553,24.50861,0 88.04387,24.68972,0 88.1711,24.85166,0 88.13777,24.92138,0 88.22135000000002,24.95433,0 88.26749000000001,24.88472,0 88.34248,24.87028,0 88.45999000000001,25.06944,0 88.45556000000001,25.19055,0 88.58138,25.16945,0 88.62025,25.19806,0 88.70499,25.19527,0 88.80582,25.16556,0 88.83778,25.20361000000001,0 88.93304000000001,25.16444,0 89.00888000000001,25.30083,0 88.86998,25.33583,0 88.82166000000001,25.40166,0 88.83443,25.47916,0 88.79971000000001,25.51055,0 88.69414,25.46778,0 88.54693,25.50416,0 88.45054,25.59389,0 88.44693,25.66611,0 88.27998,25.80167,0 88.15194,25.77861,0 88.11053,25.83555000000001,0 88.09554,25.91527,0 88.18333,26.03389,0 88.15636000000001,26.09249,0 88.18442,26.1525,0 88.35526,26.22333,0 88.35609,26.28444,0 88.45749000000001,26.36916,0 88.52554000000002,26.35972,0 88.48331,26.46111000000001,0 88.37109,26.48917,0 88.35359,26.45167,0 88.33777000000001,26.47389,0 88.40109,26.62527,0 88.43304000000001,26.55139000000001,0 + + + 1 + + + + + +90.00002000000002,28.32405,0 90.38165000000001,28.25139,0 90.39554000000001,28.19888,0 90.35027,28.11222,0 90.37053000000002,28.08027,0 90.60804,28.06445,0 90.69942,28.09583,0 90.90998999999999,28.04944,0 91.01082000000001,27.98,0 91.08693,27.96999,0 91.21444,28.07305,0 91.31499,28.09667,0 91.41943000000001,28.01056,0 91.66721,27.94194,0 91.65776,27.76472,0 91.65277000000002,27.71167,0 91.59498000000001,27.64554,0 91.62082000000001,27.54861,0 91.67359,27.48861,0 91.76555000000002,27.45694,0 91.76833000000002,27.41611,0 91.99887,27.47805,0 92.08916000000001,27.34944,0 92.11443000000001,27.28583,0 92.01776,27.1725,0 92.00999000000002,27.10472,0 92.11193000000002,26.94416,0 92.08150999999999,26.86905,0 91.99721,26.85194,0 91.91526,26.89389,0 91.90498,26.80556,0 91.84360000000001,26.86416,0 91.71249,26.8,0 91.54221,26.80445,0 91.49721000000001,26.8725,0 91.4247,26.87556,0 91.3797,26.8075,0 91.31441000000001,26.77806,0 91.09109000000001,26.81639,0 91.03194000000002,26.78278,0 90.6947,26.77222,0 90.55914,26.80722,0 90.38527000000001,26.90333,0 90.21693000000001,26.85082,0 90.17747,26.77306000000002,0 90.1236,26.74805,0 89.85942,26.73666,0 89.84887000000001,26.70167,0 89.68552000000001,26.7336,0 89.64305000000002,26.71527,0 89.61832,26.72694,0 89.63611,26.77111,0 89.53360000000001,26.81221,0 89.46833,26.79944,0 89.36081,26.86,0 89.22083000000001,26.81472,0 89.12608,26.82361,0 89.03055000000001,26.92749,0 88.95193000000002,26.92667000000001,0 88.93332000000001,26.98499,0 88.87636999999999,26.95055,0 88.86360999999999,27.09194000000002,0 88.75193,27.14861,0 88.79803,27.24638,0 88.90138000000002,27.28222,0 88.91692000000001,27.32083,0 88.97110000000001,27.47361,0 89.12581,27.5675,0 89.12804,27.62333,0 89.22553000000001,27.795,0 89.35999,27.87167000000001,0 89.48749000000001,28.05777,0 89.6236,28.15833,0 89.79276000000002,28.19416,0 89.89388,28.30611,0 89.95027,28.29222,0 90.00002000000002,28.32405,0 + + + 1 + + + + + +75.2397,58.21998,0 75.06638000000001,58.11833,0 75.56441,57.93387,0 75.58275999999999,57.64639,0 75.71249,57.63917000000001,0 75.8586,57.39917,0 75.96638,57.41416,0 76.10887,57.25027999999999,0 76.19192,56.97276000000001,0 76.25194999999999,56.91833,0 76.28943,56.72694,0 76.14915000000001,56.63082,0 76.0461,56.62165000000002,0 76.01528,56.55165000000001,0 75.86526000000001,56.49971000000001,0 75.84415,56.45,0 75.895,56.44276,0 75.93581,56.47971,0 76.0061,56.45388,0 76.05748,56.48277,0 76.14194000000001,56.4511,0 76.07805999999999,56.41471,0 76.11665000000002,56.31415,0 76.29971000000001,56.23638,0 76.31887999999999,56.18555,0 76.16304,56.14943,0 76.15082,56.18055,0 75.99442999999999,56.17832000000001,0 75.95638,56.12749000000001,0 75.74887,56.14111000000001,0 75.70055000000001,56.0675,0 75.54304999999999,56.04722000000002,0 75.50584000000001,55.99610000000001,0 75.31219,55.89166000000001,0 75.29749,55.84471,0 75.37331,55.81333,0 75.37025,55.76666,0 75.08194,55.75027,0 75.13694000000001,55.72332,0 75.12886,55.69943000000001,0 75.23775999999999,55.65999999999999,0 75.13136,55.59888000000002,0 75.1972,55.55972,0 75.30582000000001,55.56917,0 75.32223000000001,55.54027,0 75.325,55.50722,0 75.17137,55.45277,0 75.16859,55.4211,0 75.09138,55.38221,0 75.26944,55.25416,0 75.24803,55.1375,0 75.40027000000002,55.02804,0 75.34027,54.91416,0 75.54082,54.90194,0 75.49165000000001,54.86138,0 75.51331999999999,54.82333,0 75.65721000000001,54.80999,0 75.70972,54.68639,0 75.80887,54.69304,0 75.7897,54.66945,0 75.83499000000001,54.60471,0 75.80609,54.56554,0 75.67777000000001,54.53417,0 75.69136,54.11027,0 76.20721,54.25916000000002,0 76.18552,54.29554000000001,0 76.23888,54.35889,0 76.48775999999999,54.32556,0 76.65694000000001,54.36777000000001,0 76.70663999999999,54.44721,0 76.92359999999999,54.47554000000001,0 76.92498999999999,54.43749,0 76.77888,54.39415,0 76.85583000000001,54.35889,0 76.86498,54.31805000000001,0 76.72136999999999,54.15331000000001,0 76.39333000000001,54.16361,0 76.52164999999999,53.99388,0 77.52387,53.50639,0 77.92137,53.2589,0 78.92303,52.17638000000002,0 79.53637000000001,51.45000000000001,0 79.99387,50.81304999999999,0 80.1096,50.75947,0 80.03516999999999,50.83338,0 80.06545,50.86060000000001,0 80.17211,50.82919,0 80.19905,50.88837,0 80.46236,50.96408000000001,0 80.48678,51.05877,0 80.43068000000001,51.11909,0 80.43872,51.19797000000001,0 80.63344000000001,51.21476000000001,0 80.68783999999999,51.31472000000001,0 80.87224999999999,51.25904,0 80.93223999999999,51.28399,0 80.94029000000002,51.22122,0 81.04084,51.18143,0 81.18359,51.19609,0 81.07639,50.94781,0 81.4247,50.96638,0 81.42192,50.92777,0 81.48997,50.8411,0 81.43747999999999,50.76445,0 81.59540000000001,50.73573,0 81.72581,50.74749000000001,0 81.78276,50.79333,0 81.82887000000001,50.76833000000001,0 82.01111,50.77138999999999,0 82.15027000000001,50.71054,0 82.35637,50.75972,0 82.44274,50.75804999999999,0 82.49887,50.7211,0 82.72026,50.81081,0 82.72748,50.89888,0 82.76111,50.91082,0 83.00999,50.88944000000001,0 83.0872,50.92361,0 83.1386,51.00194000000001,0 83.45638,51.00249000000001,0 83.51361,50.95555000000001,0 83.84333,50.87749000000001,0 83.90166000000002,50.81388000000001,0 83.97693,50.79749,0 83.96998000000001,50.71555,0 84.10621999999999,50.64296,0 84.22304,50.51471000000002,0 84.19692000000001,50.45304,0 84.26277,50.35443,0 84.26694000000001,50.27054,0 84.37302,50.20971000000002,0 84.47386,50.25666,0 84.55998,50.19555,0 84.67443,50.19694,0 84.73636999999999,50.1461,0 84.81053,50.14416000000001,0 84.85193,50.09166000000001,0 85.01443,50.07583,0 85.05832,50.01361,0 84.97915999999999,49.99777,0 84.97776,49.91276,0 85.0836,49.88138,0 85.09193000000001,49.81971,0 85.21053000000001,49.71555000000001,0 85.21111000000001,49.64721000000001,0 85.2586,49.59138000000001,0 85.40387,49.62332,0 85.52443,49.59055,0 85.63081,49.62749,0 85.69054,49.56444,0 85.77083,49.57999,0 85.8372,49.54388000000001,0 85.96915,49.56638,0 85.96944000000001,49.48861000000001,0 86.13275,49.53277000000001,0 86.19107,49.4725,0 86.24582000000001,49.50139999999999,0 86.28749000000001,49.58582000000001,0 86.50583,49.67638,0 86.49706999999999,49.7155,0 86.61109,49.76111,0 86.61638000000001,49.79721,0 86.77499,49.78889,0 86.76277000000002,49.73444000000001,0 86.80025999999999,49.70222,0 86.68221000000001,49.66999,0 86.61665000000001,49.58721000000001,0 86.84694,49.52166,0 86.83971,49.45222,0 86.96442,49.39194,0 86.92665,49.35306,0 87.05247,49.25417000000001,0 87.21887,49.2461,0 87.29971000000001,49.21054000000001,0 87.34821,49.09261,0 87.16748,49.13304,0 86.99887,49.09944,0 86.87469,49.11083000000001,0 86.73054999999999,48.97222,0 86.75277000000001,48.90028000000002,0 86.82138000000001,48.84665,0 86.75943,48.79361,0 86.78333000000002,48.72776000000001,0 86.64499000000002,48.61639,0 86.59610000000001,48.53611,0 86.46362000000001,48.49361,0 86.34415,48.49527000000001,0 86.23081999999999,48.42527000000001,0 85.86248999999999,48.42527000000001,0 85.75915999999999,48.38777000000001,0 85.61388,48.15833,0 85.53777,47.95999,0 85.62221,47.62111,0 85.60359,47.51943,0 85.70055000000001,47.38388000000001,0 85.70555,47.2836,0 85.68665,47.21194000000001,0 85.57331000000002,47.17694,0 85.52931,47.06016,0 85.25776999999999,47.0511,0 84.96361,46.86415,0 84.75942000000001,46.82638,0 84.73526,46.83694,0 84.77887,46.93166,0 84.67804,46.99361,0 84.53194000000001,46.97527000000001,0 84.29471,47.0075,0 84.11109999999999,46.97166000000001,0 83.90000000000001,46.97721,0 83.56499,47.0611,0 83.18571,47.21664,0 83.03276,47.20416,0 83.01470999999999,46.96027,0 82.87387000000001,46.76359999999999,0 82.70889,46.35415,0 82.57332000000001,46.17305,0 82.51082,45.90192,0 82.31493,45.5448,0 82.3622,45.49552000000001,0 82.64943,45.43026,0 82.63554000000001,45.24053,0 82.54943,45.12331,0 82.48165,45.12748,0 82.29694000000001,45.23775,0 81.94804000000001,45.15748,0 81.81581,45.20053,0 81.79776,45.30581,0 81.68831,45.35082,0 81.05444,45.16608,0 80.46915,45.1111,0 80.39166,45.04915,0 80.12138,45.03942000000001,0 79.87109000000001,44.90497,0 79.87581000000002,44.86554,0 80.00166,44.79776,0 80.26221,44.82443,0 80.52083,44.73248,0 80.51666,44.7072,0 80.37497999999999,44.65607,0 80.40721000000002,44.6022,0 80.34887000000001,44.45024,0 80.39999000000002,44.26414,0 80.36276000000001,44.12524000000001,0 80.43136,44.05303,0 80.43886999999999,43.99219000000001,0 80.55371,43.81323,0 80.73859000000002,43.4719,0 80.66054,43.32884,0 80.76914000000001,43.28886,0 80.8147,43.13997,0 80.74359,43.10775,0 80.64637999999999,43.14135,0 80.37665000000001,43.02524,0 80.44443,42.95468,0 80.56135999999999,42.92635,0 80.57861,42.89108,0 80.26066,42.81941,0 80.17192,42.6605,0 80.18221,42.56802,0 80.24249,42.49051,0 80.21720999999999,42.45051,0 80.23831000000001,42.3633,0 80.29387,42.25218,0 80.2811,42.21218,0 80.23403,42.19622,0 80.28332,42.07968000000001,0 80.25139,42.04245,0 79.87943,42.01635,0 79.77858000000001,41.88717,0 79.65498,41.88218000000001,0 79.43192999999999,41.78216,0 79.30943000000001,41.79134,0 79.20749000000001,41.72828,0 78.69553000000001,41.54301,0 78.63997999999999,41.483,0 78.53109000000001,41.46384,0 78.37553,41.37882,0 78.37997,41.28384,0 78.24623,41.16513,0 78.08083000000001,41.04079,0 77.85471,41.0694,0 77.68471,41.00189,0 77.54359000000001,40.98661,0 77.37747,41.028,0 77.13805000000001,41.01606,0 77.05831000000001,41.04911,0 76.87387,41.01411,0 76.78194000000001,40.94077,0 76.79359,40.86245,0 76.64971,40.74494,0 76.63943,40.60856,0 76.55304,40.54411,0 76.48693,40.43105,0 76.33859,40.34855,0 76.27748,40.45438,0 76.19414,40.37799,0 76.06805,40.39577,0 75.97803999999999,40.36327,0 75.92886,40.30550000000001,0 75.6972,40.29911,0 75.66137000000001,40.39827,0 75.69664,40.44494,0 75.64554,40.4866,0 75.62276,40.59799,0 75.57805000000001,40.64799,0 75.22554,40.44688,0 75.16137000000001,40.47022,0 75.05888,40.44772,0 74.86026,40.51939000000001,0 74.81026000000001,40.4198,0 74.88443,40.32771,0 74.73054999999999,40.33966,0 74.36219,40.09965,0 74.19803,40.11383,0 73.99442999999999,40.04605000000001,0 73.84498000000002,39.8055,0 73.84444000000001,39.75576,0 73.91080000000001,39.7252,0 73.95609000000002,39.59771000000001,0 73.90248,39.56966,0 73.84805,39.47493000000001,0 73.65569000000001,39.45483,0 73.66998,39.34409,0 73.6172,39.23215,0 73.72165,39.08244,0 73.85332,38.96909,0 73.70499,38.88076,0 73.7625,38.80076,0 73.75776999999999,38.73021,0 73.80219,38.64983,0 73.81776000000001,38.6077,0 73.93665,38.54105000000001,0 74.06887999999999,38.53659,0 74.06052,38.60465,0 74.11081,38.6216,0 74.13415999999999,38.67326,0 74.35471,38.67439,0 74.71833,38.5291,0 74.78859,38.52742,0 74.85664,38.47048,0 74.8647,38.38882,0 74.79443000000001,38.30603,0 74.8147,38.07883,0 74.91361000000001,38.01772,0 74.90833000000001,37.91049,0 74.93665000000001,37.88884,0 74.90277,37.84717,0 74.99109000000001,37.78382,0 74.90277,37.64715,0 74.94942,37.56298,0 75.18747999999999,37.40658,0 75.11109999999999,37.38353,0 75.09665,37.32186,0 74.95804,37.28183,0 74.91575,37.23733,0 74.83277,37.32545,0 74.68427,37.39974,0 74.54221,37.38181,0 74.36388,37.42846,0 74.23997,37.40705,0 74.23748999999999,37.36119,0 74.19721,37.33897,0 73.73858,37.22164,0 73.61998,37.26248,0 73.64943,37.30415,0 73.76888,37.34113,0 73.77598,37.4343,0 73.45637000000001,37.47611,0 73.37248,37.44692,0 73.30721,37.46275,0 73.15054000000001,37.40049,0 73.06914999999999,37.31407,0 72.79359,37.22623,0 72.65851000000001,37.0212,0 72.30636,36.9781,0 71.84276,36.6921,0 71.69525,36.67184,0 71.61006999999999,36.70038,0 71.55468999999999,36.76068,0 71.45694,36.94474,0 71.42943,37.07583,0 71.44693000000001,37.20722000000001,0 71.49026000000001,37.28362,0 71.47942000000001,37.41003,0 71.5141,37.46773,0 71.49571,37.55815,0 71.52878,37.7639,0 71.58859,37.81565,0 71.59193000000002,37.90262,0 71.51537,37.94846,0 71.33472,37.88787,0 71.25277,37.92204,0 71.36638000000002,38.23627,0 71.14554,38.38574,0 71.04971000000001,38.40294,0 70.96720000000002,38.47212,0 70.92998,38.43045,0 70.87388,38.45295,0 70.67221000000001,38.41403,0 70.68552,38.37486,0 70.59775999999999,38.34151,0 70.58443,38.27816,0 70.46416000000001,38.11119,0 70.24721,37.96394,0 70.24745,37.93169,0 70.16137000000001,37.93337,0 70.16553999999999,37.87172,0 70.24693000000001,37.81255,0 70.28581,37.69707,0 70.25360000000001,37.61574,0 70.21554999999999,37.61638,0 70.16193,37.53956,0 70.06245,37.54134,0 69.9586,37.56499,0 69.89915000000001,37.61501,0 69.80692999999999,37.58305,0 69.51582999999999,37.58082,0 69.38026000000001,37.4511,0 69.41110000000001,37.24083000000001,0 69.45055000000001,37.22527,0 69.3886,37.1586,0 69.24664,37.09416,0 69.12527,37.16304,0 68.9997,37.30777,0 68.88777,37.33860000000001,0 68.91943000000001,37.27555,0 68.83804000000001,37.32695,0 68.80663,37.31806,0 68.82165999999999,37.24499,0 68.66415000000001,37.27499,0 68.62388,37.20055000000001,0 68.4122,37.14805,0 68.39749000000001,37.09916000000001,0 68.29471,37.10832,0 68.27499,37.01222,0 68.18719,37.02055,0 68.02831999999999,36.92389,0 67.88554000000001,37.06138,0 67.78221000000001,37.09610000000001,0 67.77988000000001,37.18582,0 67.83804000000001,37.26194,0 67.81749000000002,37.4461,0 67.83832,37.50583,0 68.07305,37.76528,0 68.15054000000001,37.92805,0 68.27748,37.95889,0 68.38415000000001,38.19555,0 68.33138,38.27333,0 68.21554999999999,38.33221,0 68.1272,38.42444,0 68.07193,38.54138,0 68.05775,38.69694,0 68.10081,38.73916,0 68.08305,38.79445,0 68.15498,38.8086,0 68.19637,38.85444,0 68.12387,38.98554,0 67.70943,38.99666000000001,0 67.69026,39.13805,0 67.37636999999999,39.21249,0 67.36609,39.29361,0 67.41054,39.29916,0 67.44196,39.48359,0 67.29803,39.58611,0 67.29248,39.66555,0 67.37109,39.68777,0 67.38136,39.78055,0 67.50444,39.81554,0 67.47971,39.93194,0 67.10554999999999,39.98611,0 67.02361000000001,40.03277,0 67.03471999999999,40.06888,0 66.9422,40.06333,0 66.93471,40.125,0 66.97998,40.17389,0 66.90860000000001,40.24804,0 66.88831999999999,40.47833,0 66.62003,40.49509,0 66.80525,40.76611,0 66.7664,40.88750000000001,0 66.63247,40.93888,0 66.60804,41.11333000000001,0 66.75305,41.11693,0 66.75949000000001,41.16484000000001,0 66.71998000000001,41.17499,0 66.56247999999999,41.71693,0 66.52638000000002,42.00305000000001,0 66.02916999999999,42.00305000000001,0 66.03665,42.42332,0 66.07079,42.42387,0 66.21886000000001,42.42361,0 67.01609999999999,42.8661,0 67.82971000000001,43.24944,0 67.77831000000001,43.27805,0 67.8111,43.30249000000001,0 67.7961,43.33749,0 67.74274,43.33693,0 67.72638000000001,43.35305000000001,0 67.75694,43.36055,0 67.72026,43.37276,0 67.6797,43.30249000000001,0 67.66199,43.37128,0 67.84221000000001,43.58804,0 67.84666,43.74749,0 67.97387000000001,43.69555,0 67.99026000000001,43.80555,0 67.94193,43.90527,0 67.96387000000001,43.94972,0 68.08277,44.00528,0 68.03525999999999,44.06888000000001,0 67.82887000000001,44.15971,0 67.765,44.23277,0 67.79832,44.26417,0 67.47887,44.36361,0 67.50360000000001,44.40028,0 67.50499000000001,45.16194,0 67.36275999999999,45.17916,0 67.17833,45.29341,0 67.24942,45.45778000000001,0 67.25333000000001,45.58389,0 67.35831,45.7711,0 67.31441,45.84720999999999,0 67.18192999999999,45.9411,0 67.16988000000001,45.99897000000001,0 67.15776,46.12944000000001,0 67.12168,46.16551,0 66.53555,46.14277,0 65.62943,46.18166000000001,0 65.27638,46.36306,0 65.11913,46.48082000000002,0 64.97026,46.47276,0 64.38889,46.69665000000001,0 63.41805000000001,46.92028000000001,0 63.08611,47.08972,0 62.69305000000001,47.04257,0 62.85190999999999,47.13889,0 63.14249,47.285,0 63.19526000000001,47.34083,0 64.01609999999999,47.72165,0 64.28915000000001,47.88832,0 64.13443,47.98499,0 64.01220000000001,48.15694,0 63.91554,48.23388,0 63.76111,48.45082,0 63.47083,48.53583,0 63.41499000000001,48.59249,0 63.09416,48.67943000000001,0 63.05693,48.72249,0 63.10055000000001,48.86055,0 62.97610000000001,48.91194,0 62.84722,48.84332000000001,0 62.56527,49.01082,0 62.46249,49.17638000000001,0 62.33611,49.19971,0 62.35665000000001,49.25944,0 62.54499000000001,49.25111,0 62.35027,49.46944000000001,0 62.30305,49.48638,0 62.37360000000001,49.56833,0 62.48417,49.54805000000001,0 62.45444,49.67888,0 62.59694,49.77999000000001,0 62.57667000000001,49.85277,0 62.73861,49.94778,0 62.90444,49.89415000000001,0 62.94083000000001,49.99138,0 62.86415,50.09777,0 62.71027,50.2122,0 62.69833,50.28305000000001,0 62.50833000000001,50.46805,0 62.38249,50.7225,0 62.25444000000001,50.68249,0 62.18916000000001,50.71000000000001,0 62.23583,50.74138,0 62.19276,50.80443000000001,0 62.42528,50.85695,0 62.78388,50.86056,0 62.86833000000001,50.82110999999999,0 62.93999,50.86555,0 63.13193,50.82222,0 63.20193,50.8772,0 63.265,50.82638000000002,0 63.81416,50.93859,0 64.09942,51.03916,0 64.34915000000001,50.87749000000001,0 64.25888000000001,50.75054999999999,0 64.18747999999999,50.7336,0 64.05998,50.57749,0 64.22553000000001,50.51416,0 64.25,50.54055,0 64.36461,50.51109,0 64.38943,50.55166,0 64.47837,50.58194000000001,0 64.47248999999999,50.63304999999999,0 64.56219,50.67888,0 64.60415999999999,50.65138000000002,0 64.69275,50.6711,0 64.73027,50.73805,0 64.81386999999999,50.78638,0 64.91553999999999,51.00805,0 64.81944,51.07222000000001,0 64.84972000000001,51.09664999999999,0 64.91415000000001,51.13972,0 64.97776,51.10333,0 65.20583000000001,51.17332,0 65.29498,51.16471,0 65.40694000000001,51.23166,0 65.30359,51.28221,0 65.21608999999999,51.24888000000001,0 65.13164999999999,51.28139000000002,0 64.88415999999999,51.47027,0 64.95444000000001,51.52694,0 64.94247,51.61306,0 65.01138,51.63777,0 64.95775999999999,51.74943,0 65.01666,51.82332,0 65.00888000000001,51.89249,0 64.925,51.90889,0 64.80609,52.02555,0 64.80138,52.12444,0 64.74887,52.12832,0 64.75166,52.18166999999999,0 65.05859,52.23165,0 65.04498,52.28027,0 65.46082,52.29639,0 65.58472,52.32777,0 65.58414999999999,52.38972,0 66.02887,52.45304000000001,0 66.05247,52.8186,0 66.13443,52.81998999999999,0 66.14360000000001,52.88610000000001,0 66.40886999999999,52.90331,0 66.41277,52.95222,0 66.07777,52.96305000000001,0 66.08194,53.06277,0 66.20359999999999,53.10443,0 66.40526,53.09972000000001,0 66.41443,53.1686,0 66.26639,53.19388000000001,0 66.26888,53.28277,0 66.25526000000001,53.48555,0 66.11165,53.49276,0 66.11775,53.63082,0 66.18304000000001,53.68249000000001,0 66.16499,53.78111,0 66.06581,53.79277,0 66.07581999999999,53.91526000000001,0 66.03610000000002,53.91805,0 66.00139,53.99471,0 66.21442,54.07694999999999,0 66.35693000000001,54.08444,0 66.27858000000001,54.19028,0 66.20610000000001,54.18333000000001,0 66.11803999999999,54.2375,0 66.21944000000001,54.28055,0 66.15358999999999,54.38055,0 66.16277,54.41945,0 66.1236,54.44500000000001,0 66.15192,54.48555,0 66.11304,54.5425,0 66.10831,54.64500000000002,0 66.49525,54.72304,0 66.72275999999999,54.72694,0 66.80887,54.76666,0 67.24552,54.80665,0 67.32277000000001,54.86749,0 67.58138,54.85443,0 67.76639000000002,54.89194,0 67.83223,54.96332000000001,0 67.9297,54.98332,0 68.03442,54.95027,0 68.20526,54.96609,0 68.25943,55.04888,0 68.33083000000001,55.08056,0 68.24444,55.10471,0 68.19971,55.17833000000001,0 68.30443,55.20527,0 68.62581,55.20192999999999,0 68.63889,55.25555,0 68.70499000000001,55.28667,0 68.73137,55.37055,0 68.87997,55.34276,0 68.93332,55.28611,0 69.00249,55.28749,0 69.00109999999999,55.35361,0 68.93941,55.37028000000001,0 68.9233,55.42416,0 68.95247999999999,55.44471,0 69.16831999999999,55.40054,0 69.18552,55.34388000000001,0 69.23276,55.3325,0 69.35138000000001,55.39443000000001,0 69.67276,55.35443,0 69.84610000000001,55.29500000000001,0 69.94914,55.20416,0 70.05582,55.20776999999999,0 70.23888,55.13888,0 70.28804,55.18721,0 70.39833,55.20917,0 70.46998000000001,55.29667000000001,0 70.50666,55.33777000000001,0 70.46608999999999,55.40499000000001,0 70.48775999999999,55.43859000000001,0 70.54915,55.49138,0 70.69664,55.50638,0 70.7636,55.59778,0 70.54693,55.67499,0 70.58360999999999,55.7961,0 70.78554,55.83306,0 70.75915999999999,55.86332,0 70.59138,55.83611000000001,0 70.47527,55.85222000000001,0 70.47415,55.89166000000001,0 70.80415000000001,55.92028000000001,0 70.91638,56.11055,0 70.81749000000001,56.17333,0 70.84027,56.25695,0 70.77222,56.25471000000001,0 70.76277,56.28667000000001,0 70.93359,56.34694,0 70.94136,56.41167000000001,0 70.86248999999999,56.46389000000001,0 70.78471999999999,56.43665,0 70.75972,56.46111000000001,0 70.85776,56.50305,0 70.95416,56.4911,0 71.09081999999999,56.55555,0 71.11913,56.64555,0 71.03306000000001,56.69221000000001,0 71.05582,56.71028,0 71.16665999999999,56.67138,0 71.34887000000001,56.66916,0 71.39388,56.68472,0 71.39695,56.73305,0 71.54082,56.71915000000001,0 71.58553000000001,56.79445,0 71.67554,56.82638,0 71.65860000000001,56.91470000000001,0 71.61304,56.95693,0 71.37082,57.06360999999999,0 71.23387,57.20027,0 71.09027,57.22055,0 71.14776999999999,57.25139000000001,0 71.09248,57.28999,0 71.10248,57.34083,0 70.81165,57.32804,0 70.75417,57.27749,0 70.78194000000001,57.19916,0 70.69443,57.19305,0 70.60971000000001,57.19916,0 70.65609000000001,57.26416,0 70.51721000000001,57.28695,0 70.42498999999999,57.38916,0 70.68747999999999,57.51445,0 70.69108,57.56666,0 70.66721,57.59276,0 70.57720999999999,57.57861,0 70.57443000000001,57.70916,0 70.49887,57.7075,0 70.48387,57.76777,0 70.42554,57.76639,0 70.44171,57.83843000000001,0 70.37864999999999,57.91712,0 70.43691,57.9336,0 70.87302,58.5425,0 71.07888,58.5286,0 71.11998,58.44887,0 71.30387,58.39749000000001,0 71.24721,58.3561,0 71.21915,58.14695,0 71.24887,58.12194,0 71.23859,58.07111,0 71.98888,58.12471,0 72.07055,58.09415,0 72.12164,58.02304000000001,0 72.87221,58.0061,0 72.96915,58.06055,0 72.93858,58.08749000000001,0 73.08443,58.14916,0 74.20638,58.13361,0 74.45499,58.25861,0 74.62053,58.29361000000001,0 74.62665000000001,58.33915,0 74.79998999999999,58.42694,0 74.87608,58.42722,0 74.89166,58.47776,0 75.10526,58.58111,0 75.35554999999999,58.47277,0 75.05415000000001,58.3447,0 75.2397,58.21998,0 + + + 1 + + + + + +82.27669,74.95653,0 82.27669,73.92335,0 77.53673000000001,73.93346,0 72.53674,73.94411,0 67.53675,73.95477,0 67.53675,76.19176,0 68.31331,76.28333000000001,0 68.16943999999999,76.31805,0 68.33333,76.33582,0 68.43941,76.38972,0 68.40109,76.40609000000001,0 68.57971000000001,76.43304999999999,0 68.92554,76.55888,0 68.78471999999999,76.58778,0 68.85637,76.65665,0 69.03027000000002,76.70802999999999,0 68.90054000000001,76.72776,0 68.89361,76.75749,0 68.93137,76.78276,0 68.75443,76.82222,0 68.80942,76.86638000000002,0 68.47275999999999,76.92554,0 68.50082,76.95638,0 67.53675,77.00954,0 67.53675,81.66452,0 68.67328999999999,82.13631,0 73.29124,84.05318,0 77.9092,85.97008,0 82.52717,87.88696,0 82.52717,89.90000000000001,0 83.52695,89.90000000000001,0 84.52673000000002,89.90000000000001,0 85.52652000000001,89.90000000000001,0 86.52631000000001,89.90000000000001,0 87.52609,89.90000000000001,0 88.52588000000002,89.90000000000001,0 89.52567000000001,89.90000000000001,0 90.52546,89.90000000000001,0 91.52525,89.90000000000001,0 92.52502000000001,89.90000000000001,0 93.52481,89.90000000000001,0 94.52460000000001,89.90000000000001,0 95.52439,89.90000000000001,0 96.52417000000001,89.90000000000001,0 97.52396,89.90000000000001,0 97.52396,84.90001,0 97.52396,83.39419,0 92.52396,83.38905,0 87.52397000000001,83.3839,0 82.52397000000001,83.37876,0 82.30801,83.37854000000002,0 82.30801,78.37854,0 82.30801,76.45934,0 82.84025,76.36541,0 83.27856,76.17757,0 83.49773000000002,75.83316000000002,0 83.37249,75.30092999999999,0 82.90286,74.98784000000001,0 82.27669,74.95653,0 + + + 1 + + + + + GMT +06:30 + + +]]> + #khStyle0650 + + + + + +97.51384,-11.2595,0 97.51384,-13.93535,0 93.69904000000001,-13.93192,0 93.69904000000001,-11.2595,0 97.51384,-11.2595,0 + + + 1 + + + + + +97.56944,28.54888,0 97.63136,28.48416,0 97.71138000000001,28.51694,0 97.79694000000001,28.34916,0 97.90886999999999,28.37638,0 98.01888,28.27832,0 98.01304,28.21472,0 98.06944,28.21138,0 98.13621999999999,28.15632,0 98.15776,28.11333,0 98.13082,27.96916,0 98.20387000000001,27.91638,0 98.16692000000001,27.87055,0 98.23248,27.82471,0 98.22693000000002,27.73471,0 98.31638,27.54194,0 98.36887,27.52944,0 98.40860000000001,27.55750000000002,0 98.43248000000001,27.68944,0 98.52164999999999,27.64667,0 98.55110000000001,27.66693,0 98.59471000000002,27.59971000000001,0 98.66804999999999,27.61944,0 98.70471000000001,27.5825,0 98.68552,27.46611,0 98.73665,27.32917000000001,0 98.69166,27.20193,0 98.70694,27.09778,0 98.76221,27.06445,0 98.7397,26.86416,0 98.77777,26.79167,0 98.75555,26.72417,0 98.77554000000001,26.60583000000002,0 98.73748999999999,26.38694,0 98.66582,26.26056000000001,0 98.70110000000001,26.25195,0 98.73055000000002,26.17722,0 98.66443,26.09833,0 98.64888000000001,26.15166,0 98.56805,26.12306,0 98.60525,25.98861,0 98.64166,25.98444,0 98.71638000000002,25.87749,0 98.63193,25.80111,0 98.53083,25.84555,0 98.39166,25.65666,0 98.38305,25.59195,0 98.32665000000002,25.55167000000001,0 98.16526,25.62277,0 98.16804999999999,25.55027,0 98.12497999999999,25.50584,0 98.1386,25.38694,0 98.10746,25.38722,0 98.06944,25.31444,0 97.94108000000001,25.21416,0 97.83333,25.25916000000001,0 97.78943,25.1375,0 97.72331000000003,25.06944,0 97.72581,25.06472,0 97.73665000000003,24.91888,0 97.80025999999999,24.85139,0 97.68941000000001,24.83445,0 97.55247,24.74304,0 97.56248000000001,24.57111,0 97.53082000000001,24.44749,0 97.66526,24.44416,0 97.71776000000001,24.35833,0 97.66888,24.34166000000001,0 97.6647,24.3061,0 97.74165000000002,24.29027,0 97.75999000000002,24.2575,0 97.72749,24.22499,0 97.74970999999999,24.16999,0 97.72470000000001,24.11806,0 97.53637000000001,23.95056,0 97.64998,23.8517,0 97.78831,23.94888,0 97.85249000000002,23.95832,0 97.91249000000001,24.02666,0 98.06448,24.0891,0 98.22078000000001,24.12531,0 98.35732000000002,24.10319000000001,0 98.44659000000002,24.13496,0 98.54462,24.1257,0 98.59703,24.07648,0 98.89072,24.16008,0 98.89391000000001,24.09795,0 98.67720000000001,23.96805,0 98.70387000000002,23.95138,0 98.68858000000002,23.80139000000001,0 98.81554000000001,23.76722,0 98.81915000000001,23.70556,0 98.88582,23.61333000000001,0 98.80609000000001,23.54167,0 98.82471000000001,23.48083,0 98.87997,23.4836,0 98.91470000000001,23.41722,0 98.91859000000001,23.36472,0 98.87886,23.32972,0 98.94025000000002,23.31361,0 98.88136,23.18805,0 99.05888,23.1675,0 99.06137000000001,23.12361,0 99.11109999999999,23.10194,0 99.35638,23.13499,0 99.50388,23.08972,0 99.56638000000001,22.93805,0 99.51416,22.91222000000001,0 99.44553000000003,22.94972,0 99.44053,22.865,0 99.32805000000001,22.74472,0 99.38499,22.60333,0 99.38442000000001,22.50389,0 99.26082,22.39111,0 99.27054,22.34777,0 99.18221000000001,22.195,0 99.20055000000001,22.17333,0 99.16277,22.15916,0 99.23248,22.11444,0 99.35942,22.09306,0 99.46555000000002,22.13583,0 99.52164999999999,22.1,0 99.64444,22.09917,0 99.70914999999999,22.03972,0 99.74915,22.07527,0 99.84388,22.02332,0 99.88055,22.06145,0 99.96805000000002,22.05027,0 99.99054,21.95833,0 99.94193000000001,21.825,0 99.97360000000001,21.73388,0 100.0022,21.69611,0 100.125,21.69056000000001,0 100.1719,21.65388,0 100.1061,21.58333,0 100.1239,21.50472,0 100.2039,21.43535,0 100.3789,21.53889,0 100.43,21.52861,0 100.485,21.45833,0 100.6667,21.47943,0 100.8867,21.68333,0 101.1053,21.77138,0 101.1686,21.63028,0 101.1482,21.57264,0 101.1617,21.53056,0 100.9975,21.39583,0 100.8347,21.3025,0 100.7226,21.30771,0 100.6719,21.12806,0 100.6214,21.05167,0 100.5455,21.02527,0 100.52,20.94943,0 100.5255,20.87111,0 100.6336,20.89154,0 100.6472,20.87056,0 100.5319,20.80527,0 100.3689,20.82694,0 100.2539,20.74555,0 100.1753,20.63527,0 100.0914,20.34861,0 99.95914000000001,20.45527,0 99.86997000000001,20.42722,0 99.80914,20.33638,0 99.67360000000001,20.31083,0 99.45610000000002,20.38861,0 99.55525000000003,20.20667,0 99.53887,20.14943,0 99.32555000000001,20.06611,0 99.18388,20.12805,0 99.07639,20.0975,0 99.04082,20.03722,0 99.02970999999999,19.82888000000001,0 98.91388000000001,19.74638,0 98.83693000000002,19.81639,0 98.77554000000001,19.75889,0 98.64915000000001,19.74193,0 98.56165,19.67527,0 98.50971,19.71249,0 98.25360000000002,19.67305,0 98.23859,19.72222,0 98.04998999999999,19.8075,0 98.03498,19.64389,0 97.86908,19.57018,0 97.87665,19.49528,0 97.79248,19.40194,0 97.83720000000001,19.29888,0 97.78831,19.27695,0 97.84180000000002,19.2071,0 97.83638000000001,19.1011,0 97.6772,18.93416,0 97.74776,18.86556,0 97.7747,18.57,0 97.62415000000003,18.55445,0 97.52692,18.48917,0 97.44247000000001,18.49722,0 97.36229,18.57965,0 97.34749000000001,18.53889,0 97.49444000000001,18.2825,0 97.53580000000001,18.26861,0 97.56359999999999,18.32777,0 97.64305000000002,18.29027,0 97.61803999999999,18.23138,0 97.68665,18.14666,0 97.69136000000002,18.05806,0 97.75193000000003,17.97222,0 97.68665,17.86444,0 97.77442000000001,17.75083,0 97.77831999999999,17.70332,0 98.01470999999999,17.50639,0 98.05304,17.41583,0 98.11554,17.37611,0 98.11887,17.31388,0 98.24249000000002,17.21861,0 98.33582000000001,17.05556,0 98.42359,17.05333,0 98.48831,16.98194,0 98.54998999999999,16.85471,0 98.51972000000002,16.86777,0 98.54665,16.80777,0 98.47776000000002,16.73499,0 98.53360000000001,16.64167,0 98.58028,16.62027,0 98.58998,16.55333,0 98.66249000000001,16.46027,0 98.68970000000002,16.285,0 98.71581000000002,16.27638,0 98.81441,16.37582,0 98.86081,16.47527,0 98.86749000000003,16.43416,0 98.92638,16.39111,0 98.91859000000001,16.26861,0 98.86331,16.21471,0 98.85276000000003,16.13416000000001,0 98.80803000000002,16.10305,0 98.69275000000002,16.12832,0 98.63805000000002,16.04721,0 98.57249,16.05166,0 98.61749000000002,15.97,0 98.59055000000001,15.92389,0 98.60999,15.86695,0 98.56526000000001,15.72277,0 98.57557,15.66188,0 98.59636999999999,15.45834,0 98.56999,15.33667,0 98.49748,15.38778,0 98.42249,15.36,0 98.41361000000001,15.26,0 98.31026,15.30305,0 98.2664,15.23555,0 98.20139,15.22083,0 98.21721000000001,15.1775,0 98.18442,15.09916,0 98.23442,15.04695,0 98.21388,15.00333,0 98.25499000000002,14.92083,0 98.25999,14.81666,0 98.44775000000001,14.60583,0 98.4772,14.52805,0 98.50221000000003,14.53139,0 98.61691999999999,14.31916,0 98.73109,14.27777,0 98.75972000000003,14.2175,0 98.97165,14.08361,0 99.03276,13.93777,0 99.11942999999999,13.87861,0 99.12776,13.77361,0 99.18054000000001,13.7125,0 99.17054,13.57111,0 99.21720999999999,13.40583,0 99.21278000000001,13.21611,0 99.12082,13.17583,0 99.11219,13.05584,0 99.19166000000001,12.97444,0 99.17859000000001,12.9175,0 99.24526,12.72361,0 99.43623,12.57444,0 99.41249000000001,12.46639,0 99.49970999999999,12.18833,0 99.47331,12.13389,0 99.57332000000002,12.13666,0 99.54526000000001,12.04555,0 99.59444000000002,11.99695,0 99.58942999999999,11.8725,0 99.66165000000001,11.82694,0 99.63581000000001,11.73361,0 99.56193000000002,11.63056,0 99.46776,11.60972,0 99.46887,11.52,0 99.40470999999999,11.45166,0 99.40054000000001,11.38416,0 99.33028,11.32222,0 99.23750000000003,11.10945,0 99.10664,11.01,0 99.08167,10.95139,0 99.02027,10.96333,0 99.00694,10.83195,0 98.91304,10.80972,0 98.7872,10.68222,0 98.77388999999999,10.61695,0 98.82388,10.51666,0 98.74275,10.34861,0 98.55254000000001,9.983105999999999,0 98.53130000000002,9.91836,0 98.45473,9.958472,0 98.19220000000001,9.911070000000001,0 98.11197,9.688651999999999,0 97.9479,9.590201,0 97.9953,9.819918000000001,0 98.10104000000001,9.932957999999999,0 98.16302000000002,10.06057,0 98.14115,10.11526,0 98.07916,10.10797,0 97.97341,10.02046,0 97.93331000000001,10.07151,0 97.96977000000001,10.31945,0 97.87497000000001,10.3778,0 97.88226,10.50542,0 97.93696,10.57105,0 98.20678,10.69868,0 98.14843999999999,10.84087,0 98.09374,10.819,0 97.95882,10.85181,0 97.86767999999999,10.81534,0 97.87132,10.89922,0 97.89686,10.94297,0 98.29064000000001,11.04142,0 98.19584,11.3003,0 98.11562000000001,11.36958,0 97.95882,11.39511,0 97.95882,11.46803,0 98.04635000000002,11.61752,0 97.98801,11.6941,0 97.97707,11.83266,0 97.48117000000001,11.7488,0 97.42283000000001,11.81078,0 97.71453000000003,12.19182,0 97.75829,12.29392,0 97.80204999999999,12.458,0 97.82026999999999,12.82627,0 98.24323000000001,12.98124,0 98.06093,13.72507,0 97.89319999999999,13.76518,0 97.88955000000003,13.9475,0 97.76558,14.16262,0 97.79111,14.22826,0 97.75100000000001,14.40693,0 97.90778000000002,14.53273,0 97.78746000000001,14.84631,0 97.75100000000001,15.20729,0 97.70359999999999,15.28751,0 97.71453000000003,15.40054,0 97.63795,15.48805,0 97.63068,15.5938,0 97.69629999999999,15.69954,0 97.68902000000001,15.88368,0 97.56868,15.98212,0 97.56868,16.15714,0 97.45565000000001,16.31758,0 97.41919,16.4379,0 97.34990999999999,16.47072,0 97.31709000000001,16.60199,0 97.21863999999999,16.76607,0 97.16030000000001,16.80983,0 96.92329000000001,16.81347,0 96.83213000000002,16.76972,0 96.77744000000001,16.67857,0 96.60242000000001,16.52907,0 96.06641999999999,16.28112,0 95.97891000000001,16.19361,0 95.86951000000001,16.18266,0 95.7346,16.06963,0 95.70179000000002,15.95296,0 95.43562,15.71047,0 95.32623000000001,15.68495,0 94.71001000000001,15.79069,0 94.53134,15.94019,0 94.49487000000001,15.93654,0 94.41101000000001,15.80893,0 94.37090000000002,15.93654,0 94.33808000000001,15.95842,0 94.24328,15.92924,0 94.17400000000001,16.0277,0 94.23962000000002,16.54183,0 94.32715000000003,16.65121,0 94.35996000000002,16.89915,0 94.43653000000001,16.99761,0 94.43288000000001,17.19451,0 94.54227,17.3677,0 94.5204,17.71045,0 94.47664,17.7615,0 94.4183,17.9584,0 94.45112,18.07508,0 94.39643,18.20634,0 94.30162,18.22458,0 94.33079000000001,18.3595,0 94.15577,18.68948,0 94.08649,18.72959,0 93.99169000000001,18.7077,0 93.76926,18.59103,0 93.63070999999999,18.66396,0 93.46298000000003,18.87544,0 93.61612000000001,18.93379,0 93.65987,19.02129,0 93.46662000000001,19.33487,0 93.47028,19.42239,0 93.52132,19.47342,0 93.3937,19.72502,0 93.42287,19.80888,0 93.38276999999999,19.90186,0 93.33535999999999,19.93833,0 93.27337,19.93468,0 93.25879000000002,19.81435,0 93.16398000000001,19.78154,0 93.08742,19.81435,0 93.00718999999999,19.80706,0 92.85404,20.1097,0 92.76654000000001,20.17898,0 92.62797999999999,20.40141,0 92.37385999999999,20.70083,0 92.26194,21.05431,0 92.19859000000001,21.15417,0 92.19220000000001,21.32444,0 92.25305000000002,21.3725,0 92.26555000000002,21.42333,0 92.31667,21.42138,0 92.37691,21.47416,0 92.42747000000001,21.37472,0 92.55359,21.37361,0 92.59554000000001,21.25194,0 92.66935000000002,21.29698,0 92.60027000000001,21.63416,0 92.62164,21.87583,0 92.60081,21.98222000000001,0 92.67970000000001,22.02694,0 92.71192000000002,22.15972,0 92.86554,22.04888,0 92.89639,21.95472,0 92.94304000000001,22.02833,0 92.99638000000003,21.99278,0 93.00972000000003,22.1075,0 93.05276000000001,22.11889,0 93.04414000000001,22.20194,0 93.15387,22.18666,0 93.14249,22.23694,0 93.19664000000002,22.25638,0 93.18055,22.44055,0 93.11859,22.53333,0 93.13638,22.59444,0 93.09722000000001,22.66528,0 93.09822000000001,22.79037,0 93.16137000000001,22.91945,0 93.13805000000004,23.04805,0 93.20139,23.05889,0 93.22915999999999,23.01333,0 93.29359000000001,23.00889000000002,0 93.38666000000001,23.14027000000002,0 93.36609,23.34945,0 93.40331999999999,23.37806,0 93.43346,23.67889,0 93.40138,23.73582,0 93.38443,23.92138,0 93.32805000000001,23.98166,0 93.3279,24.03597,0 93.34207000000001,24.0818,0 93.38293,24.08935,0 93.49359,23.96277,0 93.59636999999999,23.97222,0 93.62136,24.01611000000001,0 93.75332,24.0075,0 93.81914999999999,23.93527,0 93.92666,23.95583,0 94.14444,23.84778,0 94.38915,24.48,0 94.51470999999999,24.61945,0 94.53859000000001,24.70888,0 94.59777,24.72528000000001,0 94.73442,25.02472,0 94.72859,25.13638,0 94.59943,25.17833,0 94.57639000000002,25.21444,0 94.62553000000001,25.39777,0 94.66165000000001,25.42804,0 94.88527000000001,25.57222000000001,0 94.99193,25.72916,0 95.03387000000002,25.74222,0 95.02222,25.92861,0 95.08665000000001,25.95556,0 95.17804,26.05889,0 95.11331,26.10916,0 95.12082,26.20166,0 95.08389000000003,26.22277,0 95.06526,26.32556,0 95.09526,26.41,0 95.06638,26.47972,0 95.14777000000001,26.56583,0 95.15248000000001,26.62333,0 95.24638,26.67972,0 95.2711,26.64472,0 95.44108,26.70916,0 95.51944,26.82306,0 95.61081,26.82139,0 95.65804000000001,26.89528,0 95.71775000000001,26.89138,0 95.80386,27.00111,0 95.93082,27.04611,0 96.03581,27.19249,0 96.19414999999999,27.27084,0 96.52415000000002,27.29416,0 96.60999,27.36694,0 96.66025999999999,27.33916,0 96.72915999999999,27.36555,0 96.88416000000001,27.25472,0 96.86137000000001,27.21028,0 96.88831999999999,27.17805,0 97.05974000000001,27.093,0 97.14444000000002,27.09249,0 97.15888,27.13861,0 97.12636999999999,27.19083,0 96.89999000000002,27.46861000000001,0 96.91804999999999,27.50527,0 96.88889,27.6175,0 97.04665,27.74972,0 97.08389,27.7486,0 97.24942,27.9075,0 97.29916,27.91667,0 97.31721,27.87833,0 97.36775,27.89666,0 97.39413999999999,28.01861,0 97.31608000000001,28.08916,0 97.34887000000002,28.22278,0 97.41054,28.2925,0 97.46887000000001,28.29611,0 97.47083000000001,28.39111,0 97.56944,28.54888,0 + + + 1 + + + + + GMT +07:00 + + +]]> + #khStyle0700 + + + + + +105.3275,23.37803,0 105.398,23.28167,0 105.4458,23.28445,0 105.5544,23.16028,0 105.5657,23.09678,0 105.5775,23.05916,0 105.7244,23.04805,0 105.8725,22.91027,0 105.9872,22.93583,0 106.0153,22.98472,0 106.1347,22.98861,0 106.2294,22.95083,0 106.25,22.87416,0 106.285,22.8586,0 106.4194,22.87056,0 106.5203,22.93528,0 106.6005,22.90917,0 106.648,22.85333,0 106.7072,22.865,0 106.7614,22.79471,0 106.8217,22.80028,0 106.7669,22.74249,0 106.7128,22.58666,0 106.6761,22.57277,0 106.6386,22.61416,0 106.6072,22.60695,0 106.5517,22.45682,0 106.5655,22.34583,0 106.6583,22.32444,0 106.6958,22.2225,0 106.6653,22.19944,0 106.7033,22.08972,0 106.6794,21.97389,0 106.7553,22.01527000000001,0 106.8086,21.97361,0 106.9017,21.97056,0 106.9327,21.92749,0 107.0292,21.93666,0 107.0491,21.90722,0 107.0203,21.8225,0 107.2208,21.70832,0 107.3014,21.73111,0 107.3627,21.60526,0 107.4578,21.65833,0 107.4858,21.59778,0 107.5361,21.58638,0 107.7831,21.66693,0 107.8586,21.65083,0 107.948,21.54195,0 107.99,21.54241,0 108.0824,21.49174,0 108.0038,21.44677,0 107.9893,21.3862,0 107.9865,18.50449,0 110.1489,14.71173,0 112.5137,14.71173,0 112.5076,9.711738,0 112.5034,6.222851,0 107.5034,6.229232,0 102.5034,6.235613,0 102.0952,6.236135,0 102.0916,6.110559,0 101.9483,5.969448,0 101.9438,5.861942,0 101.8339,5.743340000000001,0 101.7625,5.788889,0 101.6916,5.763608,0 101.6589,5.860557,0 101.57,5.916663,0 101.3516,5.808339,0 101.2897,5.810553,0 101.2561,5.705837,0 101.1458,5.631111,0 100.9902,5.788053,0 101.0358,5.896106,0 101.1014,5.92695,0 101.1194,5.984441,0 101.12,6.098337,0 101.0755,6.150555,0 101.1216,6.187221,0 101.1155,6.248888000000001,0 101.0333,6.243894,0 100.9897,6.277500000000001,0 100.9514,6.239717000000001,0 100.8575,6.234444,0 100.8336,6.419447,0 100.7655,6.451946,0 100.7542,6.501942,0 100.6611,6.4475,0 100.4989,6.523056000000001,0 100.3875,6.536106,0 100.3344,6.586946000000001,0 100.2939,6.703892,0 100.1958,6.702497,0 100.1714,6.476660000000001,0 100.1271,6.424946000000001,0 99.84238000000002,6.479837,0 99.63088000000001,6.427682,0 99.64923,6.352362,0 99.72359,6.164054,0 100.1668,5.375079,0 100.1688,5.261129,0 100.3311,5.074793,0 100.4195,4.901795,0 100.5095,4.824638,0 100.5673,4.663917,0 100.5031,3.976011000000001,0 100.9499,3.657770000000001,0 101.1781,3.345965,0 101.2874,3.114522,0 101.2167,3.040577,0 101.2038,2.93129,0 101.2906,2.815568,0 101.416,2.786633,0 101.5188,2.654846,0 101.7567,2.561625,0 101.8371,2.442689,0 101.8499,2.362329,0 101.9303,2.391254,0 102.1489,2.208024,0 102.3418,2.134089,0 102.5378,2.01195,0 102.6921,1.831931,0 102.8175,1.831931,0 102.9461,1.719422,0 103.2097,1.584413,0 103.2418,1.45583,0 103.4122,1.301534,0 103.5311,1.234025,0 103.7561,1.185812,0 103.9265,1.256534,0 104.3122,1.346534,0 105.132,2.002301,0 105.1191,4.869648,0 109.3237,4.869648,0 109.3237,1.966571,0 109.2409,1.725713,0 109.0775,1.576584,0 109.0278,1.491362,0 109.0278,1.363535,0 108.9071,1.1789,0 108.9071,1.086578,0 108.7438,0.8593374000000001,0 108.6657,0.8522364,0 108.6586,0.7457215000000002,0 108.829,0.4758655000000001,0 108.8929,0.2912305000000001,0 109.0775,0.2344225,0 109.113,0.02848446,0 109.0207,-0.2484725,0 109.106,-0.5467235,0 109.2622,-0.9018005000000001,0 109.4255,-1.022518,0 109.39,-1.285273,0 109.461,-1.349182,0 109.7664,-1.207152,0 110.0433,-1.363393,0 109.9865,-1.682947,0 109.8942,-1.746865,0 109.8729,-1.839177,0 109.9297,-1.917289,0 110.0504,-1.952803,0 110.093,-2.030923,0 110.0717,-2.258163,0 110.1143,-2.499607,0 110.0646,-2.925694000000001,0 110.1712,-3.032208,0 110.3061,-3.060612,0 110.5049,-2.996703999999999,0 110.6754,-3.138724,0 110.7819,-3.103219000000001,0 110.9097,-3.138724,0 111.0162,-3.124531,0 111.3358,-3.032208,0 111.7761,-3.074815,0 111.7903,-3.387277000000001,0 111.7335,-3.536407,0 111.7903,-3.600316,0 111.9465,-3.62872,0 112.2021,-3.4867,0 112.5075,-3.479589,0 112.5004,-5.205232,0 116.3209,-5.205232,0 116.3209,-7.548669,0 115.767,-7.548669,0 115.767,-9.636480000000001,0 112.5004,-9.636480000000001,0 112.5004,-14.63648,0 112.5004,-19.63648,0 112.5004,-24.63648,0 112.5004,-29.63648,0 112.5004,-34.63648,0 112.5004,-39.63649,0 112.5004,-39.73648000000001,0 112.5004,-44.73647,0 112.5004,-49.73648,0 112.5004,-54.73646999999999,0 112.5004,-59.43648,0 112.5004,-64.43649000000001,0 112.5004,-69.43648000000002,0 112.5004,-74.43648,0 112.5004,-79.43648,0 112.5004,-84.43648,0 112.5004,-89.43648,0 112.5004,-89.90000000000001,0 111.5013,-89.90000000000001,0 110.5022,-89.90000000000001,0 109.5031,-89.90000000000001,0 108.504,-89.90000000000001,0 107.5049,-89.90000000000001,0 106.5058,-89.90000000000001,0 105.5067,-89.90000000000001,0 104.5076,-89.90000000000001,0 103.5085,-89.90000000000001,0 102.5094,-89.90000000000001,0 101.5103,-89.90000000000001,0 100.5111,-89.90000000000001,0 99.51205,-89.90000000000001,0 98.51294,-89.90000000000001,0 97.51384,-89.90000000000001,0 97.51384,-84.89999,0 97.51384,-79.90000000000001,0 97.51384,-74.90000000000001,0 97.51384,-69.90000000000001,0 97.51384,-64.90000000000001,0 97.51384,-63.73534,0 97.51384,-58.73533,0 97.51384,-53.73534000000002,0 97.51384,-48.73533,0 97.51384,-44.73534,0 97.51384,-39.73533000000001,0 97.51384,-34.73534,0 97.51384,-29.73533,0 97.51384,-24.73534,0 97.51384,-19.73534,0 97.51384,-14.73534,0 97.51384,-13.93535,0 97.51384,-11.2595,0 97.51384,-6.259501,0 97.51384,-1.259497,0 97.51384,-0.5628515,0 94.60397,3.503177,0 92.9025,5.880672000000001,0 94.5928,5.880672000000001,0 94.59142,10.23029,0 94.58984000000001,15.23029,0 90.33015,15.23029,0 90.32641000000001,18.56566,0 92.31895,20.729,0 92.33333,20.76416,0 92.26331999999999,20.91916000000001,0 92.26194,21.05431,0 92.37385999999999,20.70083,0 92.62797999999999,20.40141,0 92.76654000000001,20.17898,0 92.85404,20.1097,0 93.00718999999999,19.80706,0 93.08742,19.81435,0 93.16398000000001,19.78154,0 93.25879000000002,19.81435,0 93.27337,19.93468,0 93.33535999999999,19.93833,0 93.38276999999999,19.90186,0 93.42287,19.80888,0 93.3937,19.72502,0 93.52132,19.47342,0 93.47028,19.42239,0 93.46662000000001,19.33487,0 93.65987,19.02129,0 93.61612000000001,18.93379,0 93.46298000000003,18.87544,0 93.63070999999999,18.66396,0 93.76926,18.59103,0 93.99169000000001,18.7077,0 94.08649,18.72959,0 94.15577,18.68948,0 94.33079000000001,18.3595,0 94.30162,18.22458,0 94.39643,18.20634,0 94.45112,18.07508,0 94.4183,17.9584,0 94.47664,17.7615,0 94.5204,17.71045,0 94.54227,17.3677,0 94.43288000000001,17.19451,0 94.43653000000001,16.99761,0 94.35996000000002,16.89915,0 94.32715000000003,16.65121,0 94.23962000000002,16.54183,0 94.17400000000001,16.0277,0 94.24328,15.92924,0 94.33808000000001,15.95842,0 94.37090000000002,15.93654,0 94.41101000000001,15.80893,0 94.49487000000001,15.93654,0 94.53134,15.94019,0 94.71001000000001,15.79069,0 95.32623000000001,15.68495,0 95.43562,15.71047,0 95.70179000000002,15.95296,0 95.7346,16.06963,0 95.86951000000001,16.18266,0 95.97891000000001,16.19361,0 96.06641999999999,16.28112,0 96.60242000000001,16.52907,0 96.77744000000001,16.67857,0 96.83213000000002,16.76972,0 96.92329000000001,16.81347,0 97.16030000000001,16.80983,0 97.21863999999999,16.76607,0 97.31709000000001,16.60199,0 97.34990999999999,16.47072,0 97.41919,16.4379,0 97.45565000000001,16.31758,0 97.56868,16.15714,0 97.56868,15.98212,0 97.68902000000001,15.88368,0 97.69629999999999,15.69954,0 97.63068,15.5938,0 97.63795,15.48805,0 97.71453000000003,15.40054,0 97.70359999999999,15.28751,0 97.75100000000001,15.20729,0 97.78746000000001,14.84631,0 97.90778000000002,14.53273,0 97.75100000000001,14.40693,0 97.79111,14.22826,0 97.76558,14.16262,0 97.88955000000003,13.9475,0 97.89319999999999,13.76518,0 98.06093,13.72507,0 98.24323000000001,12.98124,0 97.82026999999999,12.82628,0 97.80204999999999,12.458,0 97.75829,12.29392,0 97.71453000000003,12.19182,0 97.42283000000001,11.81078,0 97.48117000000001,11.7488,0 97.97707,11.83266,0 97.98801,11.6941,0 98.04635000000002,11.61752,0 97.95882,11.46803,0 97.95882,11.39511,0 98.11562000000001,11.36958,0 98.19584,11.3003,0 98.29064000000001,11.04142,0 97.89686,10.94297,0 97.87132,10.89922,0 97.86767999999999,10.81534,0 97.95882,10.85181,0 98.09374,10.819,0 98.14843999999999,10.84087,0 98.20678,10.69868,0 97.93696,10.57105,0 97.88226,10.50542,0 97.87497000000001,10.3778,0 97.96977000000001,10.31945,0 97.93331000000001,10.07151,0 97.97341,10.02046,0 98.07916,10.10797,0 98.14115,10.11526,0 98.16302000000002,10.06057,0 98.10104000000001,9.932957999999999,0 97.9953,9.819918000000001,0 97.9479,9.590201,0 98.11197,9.688651999999999,0 98.19220000000001,9.911070000000001,0 98.45473,9.958472,0 98.53130000000002,9.91836,0 98.55254000000001,9.983105999999999,0 98.74275,10.34861,0 98.82388,10.51666,0 98.77388999999999,10.61695,0 98.7872,10.68222,0 98.91304,10.80972,0 99.00694,10.83195,0 99.02027,10.96333,0 99.08167,10.95139,0 99.10664,11.01,0 99.23750000000003,11.10945,0 99.33028,11.32222,0 99.40054000000001,11.38416,0 99.40470999999999,11.45166,0 99.46887,11.52,0 99.46776,11.60972,0 99.56193000000002,11.63056,0 99.63581000000001,11.73361,0 99.66165000000001,11.82694,0 99.58942999999999,11.8725,0 99.59444000000002,11.99695,0 99.54526000000001,12.04555,0 99.57332000000002,12.13666,0 99.47331,12.13389,0 99.49970999999999,12.18833,0 99.41249000000001,12.46639,0 99.43623,12.57444,0 99.24526,12.72361,0 99.17859000000001,12.9175,0 99.19166000000001,12.97444,0 99.11219,13.05584,0 99.12082,13.17583,0 99.21278000000001,13.21611,0 99.21720999999999,13.40583,0 99.17054,13.57111,0 99.18054000000001,13.7125,0 99.12776,13.77361,0 99.11942999999999,13.87861,0 99.03276,13.93777,0 98.97165,14.08361,0 98.75972000000003,14.2175,0 98.73109,14.27777,0 98.61691999999999,14.31916,0 98.50221000000003,14.53139,0 98.4772,14.52805,0 98.44775000000001,14.60583,0 98.25999,14.81666,0 98.25499000000002,14.92083,0 98.21388,15.00333,0 98.23442,15.04695,0 98.18442,15.09916,0 98.21721000000001,15.1775,0 98.20139,15.22083,0 98.2664,15.23555,0 98.31026,15.30305,0 98.41361000000001,15.26,0 98.42249,15.36,0 98.49748,15.38778,0 98.56999,15.33667,0 98.59636999999999,15.45834,0 98.57557,15.66188,0 98.56526000000001,15.72277,0 98.60999,15.86695,0 98.59055000000001,15.92389,0 98.61749000000002,15.97,0 98.57249,16.05166,0 98.63805000000002,16.04721,0 98.69275000000002,16.12832,0 98.80803000000002,16.10305,0 98.85276000000003,16.13416000000001,0 98.86331,16.21471,0 98.91859000000001,16.26861,0 98.92638,16.39111,0 98.86749000000003,16.43416,0 98.86081,16.47527,0 98.81441,16.37582,0 98.71581000000002,16.27638,0 98.68970000000002,16.285,0 98.66249000000001,16.46027,0 98.58998,16.55333,0 98.58028,16.62027,0 98.53360000000001,16.64167,0 98.47776000000002,16.73499,0 98.54665,16.80777,0 98.51972000000002,16.86777,0 98.54998999999999,16.85471,0 98.48831,16.98194,0 98.42359,17.05333,0 98.33582000000001,17.05556,0 98.24249000000002,17.21861,0 98.11887,17.31388,0 98.11554,17.37611,0 98.05304,17.41583,0 98.01470999999999,17.50639,0 97.77831999999999,17.70332,0 97.77442000000001,17.75083,0 97.68665,17.86444,0 97.75193000000003,17.97222,0 97.69136000000002,18.05806,0 97.68665,18.14666,0 97.61803999999999,18.23138,0 97.64305000000002,18.29027,0 97.56359999999999,18.32777,0 97.53580000000001,18.26861,0 97.49444000000001,18.2825,0 97.34749000000001,18.53889,0 97.36229,18.57965,0 97.44247000000001,18.49722,0 97.52692,18.48917,0 97.62415000000003,18.55445,0 97.7747,18.57,0 97.74776,18.86556,0 97.6772,18.93416,0 97.83638000000001,19.1011,0 97.84180000000002,19.2071,0 97.78831,19.27695,0 97.83720000000001,19.29888,0 97.79248,19.40194,0 97.87665,19.49528,0 97.86908,19.57018,0 98.03498,19.64389,0 98.04998999999999,19.8075,0 98.23859,19.72222,0 98.25360000000002,19.67305,0 98.50971,19.71249,0 98.56165,19.67527,0 98.64915000000001,19.74193,0 98.77554000000001,19.75889,0 98.83693000000002,19.81639,0 98.91388000000001,19.74638,0 99.02970999999999,19.82888000000001,0 99.04082,20.03722,0 99.07639,20.0975,0 99.18388,20.12805,0 99.32555000000001,20.06611,0 99.53887,20.14943,0 99.55525000000003,20.20667,0 99.45610000000002,20.38861,0 99.67360000000001,20.31083,0 99.80914,20.33638,0 99.86997000000001,20.42722,0 99.95914000000001,20.45527,0 100.0914,20.34861,0 100.1753,20.63527,0 100.2539,20.74555,0 100.3689,20.82694,0 100.5319,20.80527,0 100.6472,20.87056,0 100.6336,20.89154,0 100.5255,20.87111,0 100.52,20.94943,0 100.5455,21.02527,0 100.6214,21.05167,0 100.6719,21.12806,0 100.7226,21.30771,0 100.8347,21.3025,0 100.9975,21.39583,0 101.1617,21.53056,0 101.1482,21.57264,0 101.2164,21.54556,0 101.1936,21.41277,0 101.2653,21.37611,0 101.2283,21.31222,0 101.2819,21.18027,0 101.5686,21.24749,0 101.6153,21.22833,0 101.6075,21.18027,0 101.67,21.19971,0 101.73,21.13972,0 101.7872,21.14417,0 101.7822,21.20693,0 101.838,21.21111,0 101.8514,21.24916,0 101.7392,21.31639,0 101.7489,21.48194,0 101.7775,21.515,0 101.763,21.57833,0 101.8331,21.62138,0 101.7831,21.65083,0 101.7525,21.72443,0 101.7847,21.825,0 101.7086,21.92889,0 101.6255,21.97193,0 101.5744,22.10917,0 101.5969,22.16166,0 101.5389,22.24417,0 101.57,22.27917,0 101.6269,22.28166,0 101.6805,22.37917,0 101.6719,22.44639000000001,0 101.738,22.49694,0 101.8,22.48943,0 101.8755,22.38305,0 101.92,22.43611,0 102.0308,22.45527,0 102.1147,22.43389000000001,0 102.1407,22.39628,0 102.1867,22.43,0 102.2533,22.41471,0 102.2697,22.49166,0 102.4164,22.63583,0 102.383,22.67749,0 102.4261,22.68832,0 102.4797,22.77389,0 102.5428,22.74889,0 102.5603,22.69749,0 102.6103,22.72278,0 102.8628,22.60139,0 102.9286,22.48194000000001,0 103.0305,22.43555,0 103.0725,22.44749,0 103.0761,22.49833,0 103.1708,22.54694,0 103.1556,22.58666,0 103.1839,22.62888,0 103.28,22.67304,0 103.3289,22.79500000000001,0 103.4305,22.74388,0 103.4569,22.64249,0 103.5224,22.58437,0 103.5842,22.64416,0 103.5636,22.70138,0 103.6178,22.78,0 103.6553,22.7825,0 103.9644,22.49911,0 104.0097,22.52424,0 104.0331,22.68527,0 104.1116,22.79972,0 104.2672,22.82919,0 104.2619,22.73777,0 104.37,22.68583,0 104.5836,22.84472,0 104.6044,22.80972,0 104.7314,22.81666,0 104.8611,22.93666,0 104.825,23.10611,0 104.8763,23.11084,0 104.9075,23.18027,0 104.9619,23.16556,0 105.0811,23.24222,0 105.2405,23.26055,0 105.2647,23.33416,0 105.3275,23.37803,0 + + + 1 + + + + + +111.0883,72.37220000000001,0 111.3592,72.31693,0 111.5806,72.31944,0 111.6686,72.26582999999999,0 111.6242,72.21361,0 111.7436,72.20721,0 111.775,72.14499000000001,0 112.0122,72.13332,0 112.0111,71.40694000000001,0 112.333,71.34333,0 112.5128,71.26582999999999,0 112.6428,71.2897,0 112.7258,71.24359,0 112.6869,71.20277,0 112.5219,71.16388000000001,0 112.5975,71.10471,0 112.385,71.0647,0 112.2561,71.00000000000001,0 112.0775,71.06164,0 111.9772,70.98276,0 111.4647,70.93864000000001,0 111.3625,70.85526,0 111.0057,70.84365,0 110.8808,70.79638000000001,0 110.7223,70.82165999999999,0 110.5383,70.79721000000001,0 110.5031,70.77083,0 110.5136,70.71693000000001,0 110.3236,70.70471000000001,0 110.1236,70.63612000000001,0 110.1625,70.56554,0 110.1594,70.55247,0 110.0989,70.55776,0 110.1461,70.52388000000001,0 110.1405,70.47859,0 110.3036,70.44942,0 110.2725,70.41721000000001,0 109.6417,70.38499,0 109.5817,70.35526000000002,0 109.633,70.31972,0 109.5695,70.265,0 109.3205,70.21887,0 109.3055,70.17776000000001,0 109.3828,70.11942999999999,0 109.3811,70.07944000000001,0 109.5439,70.03498,0 109.3836,69.92944,0 109.4211,69.89276,0 109.3644,69.83832,0 109.2261,69.77164999999999,0 108.9539,69.78526000000001,0 108.8725,69.84109000000001,0 108.2366,69.85444,0 108.0536,69.77970999999999,0 108.0181,69.70749000000001,0 107.9022,69.67498999999999,0 107.6053,69.6636,0 106.8147,69.51361,0 106.5911,69.51666,0 106.4547,69.57249,0 106.2853,69.45833,0 106.1367,69.41971,0 106.8908,68.86026,0 106.8766,67.84166999999999,0 106.7989,67.33832,0 106.6678,67.24387,0 106.5036,67.28637000000001,0 106.2325,67.18498,0 106.0539,67.16804999999999,0 105.9955,67.07887,0 105.9053,67.04553,0 105.5283,67.02222,0 105.6436,66.94664,0 105.8189,66.94859,0 105.8686,66.91804999999999,0 106.0683,66.89525999999999,0 106.075,66.86081,0 105.9889,66.79776000000001,0 106.1875,66.80247,0 106.1997,66.78333000000001,0 106.1361,66.7561,0 106.1461,66.72693,0 106.26,66.69942,0 106.2272,66.66052999999999,0 106.2417,66.58167,0 106.3058,66.55359000000001,0 106.2939,66.50221000000001,0 106.3269,66.47553000000001,0 106.1008,66.37803,0 106.1489,66.25776999999999,0 106.1158,66.19859,0 106.1833,66.15555999999999,0 106.353,66.15082,0 106.4889,66.00471,0 106.4667,65.93192999999999,0 106.4961,65.895,0 106.4483,65.82138000000001,0 106.4764,65.80443,0 106.448,65.77415000000001,0 106.4711,65.74108,0 106.4153,65.70139,0 106.4214,65.66692999999999,0 106.6439,65.6322,0 106.6219,65.61053,0 106.715,65.59305999999999,0 106.6989,65.55109,0 106.9647,65.50443,0 106.8761,65.44108,0 106.8414,65.37608,0 106.6116,65.39276,0 106.4422,65.30888,0 106.4269,65.26138,0 106.5117,65.20387,0 106.3736,65.20499,0 106.2911,65.13889,0 106.1925,65.12858,0 106.1658,65.09027,0 105.9986,65.03915000000001,0 105.9748,65.00305,0 106.2233,64.85722,0 106.1058,64.85915,0 106.0408,64.90470999999999,0 105.9491,64.89499000000001,0 106.0097,64.81805,0 105.898,64.82138000000001,0 105.8472,64.79165999999999,0 105.8289,64.74193,0 105.8772,64.65804,0 105.7039,64.65886999999999,0 105.7494,64.61443,0 105.7261,64.57222,0 105.8042,64.53055000000001,0 105.7925,64.47803999999999,0 106.0389,64.51609999999999,0 106.1475,64.48526,0 106.0661,64.42081,0 106.1867,64.39639,0 106.3944,64.44331,0 106.5858,64.44443,0 106.5655,64.49582,0 106.6042,64.51331999999999,0 106.6733,64.49802,0 106.7533,64.41193,0 106.8864,64.41609,0 107.1022,64.33693,0 107.2342,64.33138,0 107.2366,64.28693,0 107.3344,64.24442999999999,0 107.5947,64.29915,0 107.8508,64.18053999999999,0 107.9933,64.16971,0 108.0265,64.22346,0 108.1253,64.24054,0 108.15,64.24082,0 108.2211,64.20833,0 108.3222,64.03943,0 108.2619,63.99083000000002,0 107.6792,63.98999,0 107.6194,63.9575,0 107.6219,63.91361000000001,0 107.5628,63.85695000000001,0 107.3592,63.86775999999999,0 107.2911,63.95083,0 107.1819,63.95361,0 107.0714,63.88528,0 106.8603,63.97721,0 106.7028,63.98555000000002,0 106.6803,63.92499,0 106.7972,63.84415,0 106.6283,63.69833,0 106.685,63.61361000000001,0 106.5069,63.49166000000002,0 106.7364,63.3686,0 106.6741,63.29667,0 106.4441,63.33111,0 106.3619,63.27139,0 106.3583,63.21999,0 106.433,63.20055,0 106.3836,63.1461,0 106.4108,63.11527000000001,0 106.3033,63.07277,0 106.1216,63.05833000000001,0 106.1875,62.98611,0 106.1561,62.9586,0 106.2194,62.94194000000001,0 106.2161,62.8961,0 106.4447,62.84361,0 106.4678,62.77694,0 106.5258,62.74722000000001,0 106.4691,62.68166000000001,0 106.8144,62.59972,0 106.7072,62.58277,0 106.6533,62.53833,0 106.7144,62.47721000000001,0 106.5308,62.37249000000001,0 106.4275,62.38388,0 106.4792,62.31721000000002,0 106.3939,62.31777000000001,0 106.3192,62.26194000000001,0 106.4477,62.24167,0 106.4475,62.18581,0 106.373,62.10277,0 106.4097,62.08472,0 106.3789,62.06528,0 106.4133,62.02750000000001,0 106.2,61.99749000000001,0 106.0478,61.9086,0 106.0431,61.90277,0 105.8894,61.82305000000001,0 105.9491,61.68333,0 105.8647,61.67389,0 105.8028,61.61776,0 105.6947,61.64943,0 105.5925,61.61721,0 105.5575,61.56554000000001,0 105.3664,61.53278,0 105.2736,61.47805000000002,0 105.2758,61.41999,0 105,61.40661000000001,0 104.785,61.34943,0 104.9272,61.31944,0 104.9314,61.26944,0 104.9628,61.26498999999999,0 105.0119,61.17749,0 104.835,61.17776000000001,0 104.7103,61.08999000000001,0 104.6147,61.07444,0 104.6003,61.05416,0 104.6419,61.03804,0 104.6,61.00054,0 104.6144,60.97639,0 104.5597,60.94554000000001,0 104.6344,60.89388,0 104.4569,60.83972,0 104.6022,60.74333000000001,0 104.5167,60.63332,0 104.5577,60.61721,0 104.568,60.54084,0 104.6414,60.49416000000002,0 104.6764,60.42499999999999,0 104.6539,60.40249,0 104.7642,60.38221,0 104.8772,60.30388000000001,0 105.2219,60.27528,0 105.2967,60.29860999999999,0 105.3758,60.24917000000001,0 105.4772,60.25443,0 105.4786,60.19249,0 105.4208,60.10999000000001,0 105.4889,60.01194000000002,0 105.4305,59.89388,0 105.4952,59.84554000000001,0 105.3783,59.82083000000001,0 105.1853,59.86027000000001,0 105.0191,59.83721,0 105.0191,59.77083,0 104.8922,59.75027000000001,0 104.7944,59.69332,0 104.8005,59.6361,0 104.8769,59.58582,0 104.8561,59.55110000000001,0 104.8828,59.52527,0 104.9853,59.46028,0 105.183,59.47305,0 105.2308,59.42527000000001,0 105.2136,59.40777,0 105.2094,59.40192,0 105.2455,59.35082,0 105.1841,59.31055000000001,0 105.2961,59.26111,0 105.3319,59.1986,0 105.3019,59.14861000000001,0 105.3628,59.09499,0 105.1439,59.04582,0 105.085,58.99277,0 104.8386,58.89443,0 104.7558,58.81526000000001,0 104.8733,58.72164000000001,0 104.795,58.66859,0 104.6314,58.64804,0 104.5828,58.61415,0 104.5233,58.63832000000001,0 104.4583,58.60054,0 104.3936,58.64526,0 104.3991,58.69915000000001,0 104.2836,58.71305000000001,0 104.2364,58.75866000000001,0 104.0444,58.77304,0 103.9922,58.73555,0 103.8558,58.73498000000001,0 103.9458,58.76582,0 103.9542,58.84859,0 103.8933,58.90555,0 103.5928,58.91304,0 103.5919,58.95193,0 103.5383,58.98611,0 103.3892,59.02138000000002,0 103.2444,59.17944,0 103.2366,59.2286,0 103.338,59.22721,0 103.3264,59.26082000000002,0 103.2064,59.28972,0 103.1644,59.25999000000001,0 103.0822,59.26416,0 103.0155,59.32193,0 102.8717,59.26527999999999,0 102.8286,59.21194,0 102.5353,59.19166000000001,0 102.4433,59.14471,0 102.4044,59.07249000000001,0 102.4508,59.00111,0 102.4369,58.94304000000001,0 102.54,58.89777000000001,0 102.5669,58.79694,0 102.5114,58.71667,0 102.3105,58.64527,0 102.1944,58.52527000000001,0 101.685,58.41888,0 101.5347,58.22471,0 101.2764,58.21861000000001,0 101.2161,58.14444,0 101.1097,58.11528000000001,0 101.105,58.10528,0 101.1608,58.06055,0 101.1583,58.02471000000001,0 101.1394,57.98249,0 101.0281,57.92249000000002,0 101.0353,57.89804000000001,0 100.953,57.86694000000001,0 100.8077,57.88611,0 100.8505,57.84222,0 100.84,57.80083000000001,0 100.8911,57.77361,0 100.7969,57.66833000000001,0 100.8461,57.60999000000001,0 100.9536,57.5611,0 100.9391,57.51583,0 100.9628,57.50083000000001,0 100.9112,57.44835,0 100.855,57.465,0 100.7419,57.40193000000001,0 100.6505,57.47444,0 100.4036,57.54804,0 100.3958,57.59887,0 100.3461,57.63833,0 100.3664,57.67556,0 100.328,57.68250000000001,0 100.373,57.7311,0 100.2664,57.76139,0 100.2744,57.80915,0 100.123,57.86554,0 100.0767,57.96111,0 100.0775,58.0561,0 100.0441,58.07944,0 99.80138000000001,58.05721,0 99.68193000000001,58.08111,0 99.61582,58.04805000000001,0 99.61971,58.00166,0 99.49442999999999,57.93415,0 99.42165000000001,57.79333000000001,0 99.08414999999999,57.77416,0 98.97415,57.72165,0 98.85415999999999,57.72804,0 98.76944,57.79166000000001,0 97.91721,57.80694,0 97.34009000000002,57.04317,0 97.47693000000001,56.96444,0 97.62302,56.95528000000001,0 97.48055000000001,56.89111000000001,0 97.48581000000003,56.81028,0 97.77609,56.78054,0 97.75027000000002,56.70417000000001,0 97.78581,56.66415000000001,0 97.75193000000003,56.64054,0 97.77528000000002,56.6075,0 97.74498,56.55860000000001,0 97.87943,56.55944,0 97.88193,56.39249000000002,0 97.55663000000001,56.3875,0 97.58693000000001,56.18943000000001,0 97.42859,56.14666,0 97.43248,56.09583000000001,0 97.35220000000001,56.04861,0 97.12361,56.11639,0 97.0611,56.02556,0 96.98054999999999,56.02221999999999,0 96.96971000000001,55.85583,0 96.82111,55.79166,0 96.75526000000002,55.74722,0 96.82471,55.69749,0 96.74638,55.65138000000001,0 96.85582000000001,55.59444000000001,0 96.81721,55.55915,0 96.85526000000002,55.47776,0 96.84137000000001,55.43749,0 96.92027,55.32472,0 96.70055000000001,55.25528,0 96.69721,55.17276,0 96.65192,55.0986,0 96.68692,55.08083,0 96.57777,55.02028,0 96.71527,54.92138000000001,0 96.67359999999999,54.80222000000001,0 96.56192,54.69694,0 96.58888,54.65972,0 96.55053,54.58082,0 96.57083,54.51250000000001,0 96.31582,54.57139000000001,0 96.21720999999999,54.54084,0 96.05582,54.5761,0 95.97638000000001,54.47721000000001,0 95.98665,54.44833,0 95.91577000000002,54.3956,0 95.79082,54.42082000000001,0 95.70526,54.37999,0 95.66303000000004,54.33999,0 95.65860000000002,54.25943,0 95.91805000000002,54.15999,0 95.98803000000001,54.08721,0 96.05332,54.09389000000002,0 96.08167000000003,54.05749000000001,0 96.04943,53.99554,0 96.20721,53.92638,0 96.5,53.68499000000001,0 96.57165999999999,53.64554,0 96.60860000000001,53.67583,0 96.68415,53.6386,0 96.72776,53.70665,0 96.88666000000001,53.72887000000001,0 97.12275,53.60944,0 97.33221,53.59999,0 97.44107,53.46027000000002,0 97.58749,53.43888000000001,0 97.59972000000001,53.37138,0 97.96304000000001,53.35999,0 97.96998000000002,53.29639000000001,0 98.03027,53.25054000000001,0 98.28581,53.22721,0 98.29998999999999,53.10055,0 98.60249000000002,53.10139000000001,0 98.68637000000001,53.15611000000001,0 98.8772,53.11944,0 98.92360000000001,53.15388,0 99.06526000000001,53.10249,0 98.98553,53.03444,0 99.24997000000001,52.95378,0 99.20610000000002,52.8511,0 98.93107999999999,52.925,0 98.84444000000001,52.83194,0 98.86526000000001,52.79167,0 98.9408,52.79722000000001,0 98.93248000000001,52.65444000000001,0 98.80415000000001,52.61166,0 98.78276,52.57333,0 98.82721000000001,52.53999000000001,0 98.81527,52.52054,0 98.73522000000001,52.5118,0 98.72083000000001,52.46054000000001,0 98.62553,52.42416,0 98.67970000000001,52.36999,0 98.64444,52.26167000000001,0 98.72248999999999,52.29527000000001,0 98.80721,52.27444,0 98.81360000000001,52.18693,0 98.91304,52.2011,0 98.94189,52.14068,0 98.88109,52.11416,0 98.86942999999999,52.03861,0 98.70804000000001,51.82805,0 98.62442,51.77999000000001,0 98.33527000000001,51.71804000000001,0 98.24802,51.5811,0 98.25999,51.51583000000002,0 98.23235,51.45989000000001,0 98.06469000000001,51.46694,0 97.93777,51.31249,0 97.9586,51.22332,0 97.83195000000001,50.98999000000001,0 97.87747,50.92972,0 98.01304,50.85583,0 97.96388,50.77832,0 98.06331000000002,50.63054000000001,0 98.16748,50.56889,0 98.27443,50.56055,0 98.32555000000001,50.51083000000001,0 98.28554,50.41361000000001,0 98.29221,50.29861,0 98.10721000000002,50.04888,0 97.86388000000001,49.93277,0 97.78609,49.96915,0 97.59415000000001,49.92749,0 97.58638000000001,49.84361000000001,0 97.31303,49.7311,0 97.16943000000001,49.76167,0 96.99693000000002,49.89415000000001,0 96.72248999999999,49.9211,0 96.59248000000001,49.86500000000001,0 96.54749,49.92583,0 96.37916,49.89360000000001,0 96.29443999999999,49.94665000000001,0 96.07444,50.00694,0 95.96026999999999,49.94415000000001,0 95.90721000000002,50.01415999999999,0 95.83472,50.02499000000001,0 95.73526,49.95471000000001,0 95.59193000000001,49.94083,0 95.53859,49.89472,0 95.49157,49.9077,0 95.42249000000001,49.95610000000001,0 95.06608,49.96193000000001,0 94.97609,50.0561,0 94.62276,50.02999,0 94.51582999999999,50.16109,0 94.38998000000001,50.21444000000001,0 94.3522,50.41499,0 94.27499,50.56944,0 93.55832000000001,50.58972000000001,0 93.44886,50.62249000000001,0 93.03333000000001,50.6086,0 92.97102,50.66649,0 92.99915,50.7514,0 92.97500000000001,50.7911,0 92.80276000000001,50.79361,0 92.76028,50.71249,0 92.66081,50.68166,0 92.5736,50.75778,0 92.47275999999999,50.78527,0 92.38361000000002,50.87471000000001,0 92.32693,50.855,0 92.29498,50.75361,0 92.22137000000002,50.70556,0 91.90556000000002,50.71472000000001,0 91.77222000000002,50.68999000000001,0 91.65886999999999,50.63722000000001,0 91.60693000000001,50.57305,0 91.46776000000001,50.52694000000001,0 91.44748,50.4711,0 91.02970999999999,50.43306,0 90.87025,50.32638000000001,0 90.74860000000001,50.29749,0 90.69859,50.21943,0 90.50973000000001,50.22444000000001,0 90.37858,50.18582000000001,0 90.24443000000001,50.12027,0 90.05137000000003,50.0825,0 89.98526,49.97222000000001,0 89.64270000000001,49.90482999999999,0 89.6375,49.855,0 89.67137,49.82083,0 89.65107999999999,49.79527000000002,0 89.73609999999999,49.74889000000001,0 89.71138000000001,49.71472,0 89.45972,49.64999000000001,0 89.37221,49.57972,0 89.22665000000001,49.63833,0 89.19748,49.61111,0 89.23054999999999,49.53667,0 89.01331999999999,49.46360000000001,0 88.92886,49.54639,0 88.8875,49.54361000000001,0 88.89999000000002,49.44332,0 88.73081999999999,49.45083,0 88.65082,49.50055,0 88.22083000000001,49.46166,0 88.13193,49.36833000000001,0 88.1622,49.27222,0 87.98859,49.17722000000001,0 87.8407,49.17296000000001,0 87.52528,49.12915,0 87.46693000000001,49.07972,0 87.34821,49.09261,0 87.29971000000001,49.21054000000001,0 87.21887,49.2461,0 87.05247,49.25417000000001,0 86.92665,49.35306,0 86.96442,49.39194,0 86.83971,49.45222,0 86.84694,49.52166,0 86.61665000000001,49.58721000000001,0 86.68221000000001,49.66999,0 86.80025999999999,49.70222,0 86.76277000000002,49.73444000000001,0 86.77499,49.78889,0 86.61638000000001,49.79721,0 86.61109,49.76111,0 86.49706999999999,49.7155,0 86.50583,49.67638,0 86.28749000000001,49.58582000000001,0 86.24582000000001,49.50139999999999,0 86.19107,49.4725,0 86.13275,49.53277000000001,0 85.96944000000001,49.48861000000001,0 85.96915,49.56638,0 85.8372,49.54388000000001,0 85.77083,49.57999,0 85.69054,49.56444,0 85.63081,49.62749,0 85.52443,49.59055,0 85.40387,49.62332,0 85.2586,49.59138000000001,0 85.21111000000001,49.64721000000001,0 85.21053000000001,49.71555000000001,0 85.09193000000001,49.81971,0 85.0836,49.88138,0 84.97776,49.91276,0 84.97915,49.99777,0 85.05832,50.01361,0 85.01443,50.07583,0 84.85193,50.09166000000001,0 84.81053,50.14416000000001,0 84.73636999999999,50.1461,0 84.67443,50.19694,0 84.55998,50.19555,0 84.47386,50.25666,0 84.37302,50.20971000000002,0 84.26694000000001,50.27054,0 84.26277,50.35443,0 84.19692000000001,50.45304,0 84.22304,50.51471000000002,0 84.10621999999999,50.64296,0 83.96998000000001,50.71555,0 83.97693,50.79749,0 83.90166000000002,50.81388000000001,0 83.84333,50.87749000000001,0 83.51361,50.95555000000001,0 83.45638,51.00249000000001,0 83.1386,51.00194000000001,0 83.0872,50.92361,0 83.00999,50.88944000000001,0 82.76111,50.91082,0 82.72748,50.89888,0 82.72026,50.81081,0 82.49887,50.7211,0 82.44274,50.75804999999999,0 82.35637,50.75972,0 82.15027000000001,50.71054,0 82.01111,50.77138999999999,0 81.82887000000001,50.76833000000001,0 81.78276,50.79333,0 81.72581,50.74749000000001,0 81.59540000000001,50.73573,0 81.43747999999999,50.76445,0 81.48997,50.8411,0 81.42192,50.92777,0 81.4247,50.96638,0 81.07639,50.94781,0 81.18359,51.19609,0 81.04084,51.18143,0 80.94029000000002,51.22122,0 80.93223999999999,51.28399,0 80.87224999999999,51.25904,0 80.68783999999999,51.31472000000001,0 80.63344000000001,51.21476000000001,0 80.43872,51.19797000000001,0 80.43068000000001,51.11909,0 80.48678,51.05877,0 80.46236,50.96408000000001,0 80.19905,50.88837,0 80.17211,50.82919,0 80.06545,50.86060000000001,0 80.03516999999999,50.83338,0 80.1096,50.75947,0 79.99387,50.81304999999999,0 79.53637000000001,51.45000000000001,0 78.92303,52.17638000000002,0 77.92137,53.2589,0 77.52387,53.50639,0 76.52164999999999,53.99388,0 76.39333000000001,54.16361,0 76.72136999999999,54.15331000000001,0 76.86498,54.31805000000001,0 76.85583000000001,54.35889,0 76.77888,54.39415,0 76.92498999999999,54.43749,0 76.92359999999999,54.47554000000001,0 76.70663999999999,54.44721,0 76.65694000000001,54.36777000000001,0 76.48775999999999,54.32556,0 76.23888,54.35889,0 76.18552,54.29554000000001,0 76.20721,54.25916000000002,0 75.69136,54.11027,0 75.67777000000001,54.53417,0 75.80609,54.56554,0 75.83499000000001,54.60471,0 75.7897,54.66945,0 75.80887,54.69304,0 75.70972,54.68639,0 75.65721000000001,54.80999,0 75.51331999999999,54.82333,0 75.49165000000001,54.86138,0 75.54082,54.90194,0 75.34027,54.91416,0 75.40027000000002,55.02804,0 75.24803,55.1375,0 75.26944,55.25416,0 75.09138,55.38221,0 75.16859,55.4211,0 75.17137,55.45277,0 75.325,55.50722,0 75.32223000000001,55.54027,0 75.30582000000001,55.56917,0 75.1972,55.55972,0 75.13136,55.59888000000002,0 75.23775999999999,55.65999999999999,0 75.12886,55.69943000000001,0 75.13694000000001,55.72332,0 75.08194,55.75027,0 75.37025,55.76666,0 75.37331,55.81333,0 75.29749,55.84471,0 75.31219,55.89166000000001,0 75.50584000000001,55.99610000000001,0 75.54304999999999,56.04722000000002,0 75.70055000000001,56.0675,0 75.74887,56.14111000000001,0 75.95638,56.12749000000001,0 75.99442999999999,56.17832000000001,0 76.15082,56.18055,0 76.16304,56.14943,0 76.31887999999999,56.18555,0 76.29971000000001,56.23638,0 76.11665000000002,56.31415,0 76.07805999999999,56.41471,0 76.14194000000001,56.4511,0 76.05748,56.48277,0 76.0061,56.45388,0 75.93581,56.47971,0 75.895,56.44276,0 75.84415,56.45,0 75.86526000000001,56.49971000000001,0 76.01528,56.55165000000001,0 76.0461,56.62165000000002,0 76.14915000000001,56.63082,0 76.28943,56.72694,0 76.25194999999999,56.91833,0 76.19192,56.97276000000001,0 76.10887,57.25027999999999,0 75.96638,57.41416,0 75.8586,57.39917,0 75.71249,57.63917000000001,0 75.58275999999999,57.64639,0 75.56441,57.93387,0 75.06638000000001,58.11833,0 75.2397,58.21998,0 75.05415000000001,58.3447,0 75.35554999999999,58.47277,0 75.10526,58.58111,0 75.17081,58.6186,0 75.15028000000001,58.67805,0 75.38164999999999,58.78804,0 75.69054,59.01194,0 75.61526000000001,59.2411,0 75.83138,59.29639,0 75.89749000000001,59.43721000000001,0 75.99082,59.41972,0 76.16304,59.54361,0 76.45583000000001,59.54445,0 76.64833,59.58027,0 76.64554000000001,59.69332,0 76.74136,59.72943000000001,0 76.75888999999999,60.06081,0 76.68719,60.10777000000001,0 76.85165000000001,60.26806000000001,0 76.8186,60.33028000000002,0 76.74471,60.34249000000001,0 76.77443,60.47665,0 77.03749000000001,60.535,0 77.04721000000001,60.60361,0 77.03167000000001,60.63277,0 76.96527,60.64111,0 76.96776,60.71,0 77.07805000000001,60.72721,0 77.10498,60.85333000000001,0 77.40804,60.81027,0 77.68941,60.82749,0 77.92137,60.74665,0 78.12025,60.80222000000001,0 78.47527,60.77694,0 78.68941,60.83083,0 78.80721,60.77887,0 78.91110000000001,60.78722000000001,0 78.96915000000001,60.82805,0 79.18553,60.83860000000001,0 79.31833,60.79667000000001,0 79.28360000000001,60.71999000000001,0 79.38666000000001,60.64861,0 79.50249,60.68694,0 79.71581999999999,60.69555,0 80.18398999999999,60.66193,0 80.42100000000001,60.76556999999999,0 80.63061,60.76768000000001,0 80.69771000000002,60.80017,0 81.03823000000001,60.75419,0 81.0555,60.68084,0 81.11116,60.6375,0 81.49776,60.61555,0 81.86165,60.65055,0 82.16665,60.51832,0 82.39027,60.61028,0 82.38247,60.71278,0 83.14499000000001,61.03277000000001,0 83.50944,61.04916,0 83.99387,60.82472,0 84.25964000000001,60.85542,0 84.61415,61,0 85.71054,61.29749,0 85.64360000000001,61.38805,0 85.75249,61.43999,0 85.96639,61.46915,0 85.96915,61.54305,0 85.85193,61.59777,0 85.72275999999999,61.57361,0 85.46777,61.62860000000001,0 85.38582000000001,61.70167,0 85.24832000000001,61.68526000000001,0 85.00805,61.78416,0 84.68749,61.8061,0 84.63388999999999,61.87971000000001,0 84.55749,61.89472000000001,0 84.51666,61.93915,0 84.55441999999999,61.99694,0 84.43692,62.18915,0 84.72638000000001,62.40694,0 84.85915,62.44778,0 84.91387,62.49944000000001,0 84.89055000000001,62.54220999999999,0 84.94803000000002,62.59137000000001,0 85.09860000000001,62.6386,0 85.07777,62.67138000000001,0 85.2372,62.81444000000001,0 85.33249000000001,62.87331,0 85.4511,62.88277,0 85.52083,62.93277,0 85.49332,62.99027000000001,0 85.58716000000001,63.06996,0 85.46638,63.13805,0 85.47832,63.17054,0 85.53665,63.26083,0 85.67387000000001,63.35443999999999,0 85.55942,63.37499,0 85.40776,63.35,0 85.35276,63.40276999999999,0 85.38970000000002,63.42333000000001,0 85.37415,63.46220000000002,0 85.2961,63.51583,0 85.21193,63.50306000000001,0 85.08194,63.53638000000001,0 85.03203000000001,63.58649000000001,0 85.08998,63.60860000000002,0 85.17693,63.59137,0 85.26721000000001,63.64638000000001,0 85.33998,63.70693000000001,0 85.36693,63.81333,0 85.51639,63.93000000000001,0 85.95804,64.05443,0 85.96776,64.09775999999999,0 85.93248000000001,64.12776,0 86.0311,64.27528,0 85.94970000000002,64.32832999999999,0 85.92359999999999,64.41721,0 85.84081999999999,64.45889,0 85.84526,64.50749,0 85.91804000000001,64.5836,0 85.80859,64.64749000000001,0 85.86081,64.75526000000001,0 85.54694000000001,64.83028,0 85.14694,64.75166,0 85.09444000000001,64.81219,0 84.93222,64.82639,0 84.97748,64.88666000000001,0 84.90665,64.93026999999999,0 84.29137,64.9011,0 84.27804999999999,64.94054,0 84.39665000000001,64.99387,0 84.38108,65.03276,0 84.31386999999999,65.05721,0 84.3111,65.09860000000001,0 84.40999000000001,65.19082,0 84.52443,65.21278,0 84.58832,65.31303,0 84.50194000000001,65.39664999999999,0 84.55464000000001,65.43516,0 84.45028000000001,65.54554,0 84.19054,65.59444000000001,0 84.29276000000002,65.6122,0 84.31914999999999,65.66943000000001,0 84.32249,65.67609,0 84.17665,65.7,0 84.01111,65.79832,0 83.59108999999999,65.7736,0 83.50637,65.82944000000001,0 83.52804999999999,65.90443000000001,0 83.37276000000001,65.9836,0 83.28943,66.06693,0 83.37109,66.13666000000001,0 83.53970000000001,66.19525,0 83.34415,66.34193000000001,0 83.12469,66.42165,0 83.08693,66.46972,0 83.08666,66.61053,0 83.30582,66.66165,0 83.1836,66.74748,0 83.17249,66.80914,0 83.02748,66.85971000000001,0 83.06192,66.88081,0 83.04109,66.89221000000002,0 82.11942999999999,67.23888000000001,0 82.19721,67.25943,0 82.18165999999999,67.28803000000001,0 82.25915999999999,67.27998,0 82.21833,67.31137,0 82.3647,67.33055,0 82.2811,67.34887000000001,0 82.33778,67.3608,0 82.2336,67.42081,0 82.32971000000001,67.48109,0 82.38054,67.47971,0 82.35138000000001,67.50109999999999,0 82.39664999999999,67.53498999999999,0 82.11416,67.59943,0 82.04109,67.65665,0 82.11913,67.68747999999999,0 82.08055,67.68858,0 82.10554999999999,67.72887,0 81.90304999999999,67.77778000000001,0 81.72443000000001,67.92415,0 81.76194,67.95247999999999,0 81.8772,67.93165999999999,0 81.98888,67.96332,0 82.37442,67.94914,0 82.39610999999999,68.05914,0 82.35693000000001,68.09583000000001,0 82.39276,68.17747,0 82.54359,68.17276,0 82.52332000000001,68.20694,0 82.57361,68.25583,0 82.70663999999999,68.29331999999999,0 82.68443000000001,68.34636999999999,0 82.71249,68.40443000000001,0 82.68053999999999,68.49137,0 82.45610000000001,68.57832999999999,0 82.54915,68.61443,0 82.55859000000001,68.61111,0 82.58999,68.60276,0 82.69302999999999,68.63275,0 82.9011,68.62527,0 83.04276,68.66776,0 82.80164000000001,68.74082,0 82.78288000000001,68.79881,0 82.5522,68.81833,0 82.49721,68.98775999999999,0 82.31638,69.05387,0 82.50472000000002,69.10831,0 82.46138999999999,69.12442,0 82.46388,69.16054,0 81.81331,69.20055000000001,0 81.75972000000002,69.25249000000001,0 81.93611,69.34665,0 81.7811,69.43137,0 81.67249,69.44832,0 81.62302,69.41526,0 81.61387000000002,69.32833000000001,0 81.64028,69.31135999999999,0 81.58249000000001,69.27582,0 81.44414,69.25443000000001,0 81.33582,69.28803000000001,0 80.95596000000001,69.20667,0 80.79311,69.26394999999999,0 80.76669000000001,69.30504000000001,0 80.14597999999999,69.36324999999999,0 79.85914000000001,69.34610000000001,0 79.8772,69.37276,0 79.82278,69.39444,0 79.82805000000001,69.42249,0 79.71388,69.43248,0 79.74082,69.44832,0 79.63916999999999,69.48582,0 79.59583000000001,69.58832,0 79.50082,69.60471,0 79.5372,69.63081,0 79.49165000000001,69.63638,0 79.50583,69.65358999999999,0 79.00417,69.69693,0 79.13970999999999,69.74303999999999,0 79.06638,69.74721,0 79.06331,69.78664000000001,0 78.97582000000001,69.81165,0 79.01888,69.83499999999999,0 78.87527,69.88164999999999,0 78.96582000000001,69.88026000000002,0 79.18747999999999,69.96416000000002,0 79.11971,70.00664999999999,0 79.21860000000001,70.01166000000001,0 79.17859,70.03498,0 79.19443,70.05165,0 79.34943,70.04498,0 79.32805000000001,70.14888000000001,0 79.49887,70.11053,0 79.62943,70.22109,0 79.70889,70.23859,0 79.73831,70.24887,0 79.70360000000001,70.26999000000001,0 79.7247,70.28415000000001,0 79.85748,70.27222000000002,0 80.11404,70.36096000000001,0 80.08208999999999,70.39373000000001,0 80.18601000000001,70.39182,0 80.17683,70.43655,0 80.57176,70.46187999999999,0 80.62567,70.42167000000001,0 80.69155000000001,70.42319999999999,0 80.70740000000001,70.39100999999999,0 80.76217,70.39443,0 80.72770000000001,70.41077,0 80.79106,70.41504999999999,0 80.79858,70.44119000000001,0 80.67014000000002,70.44623,0 80.60648999999999,70.50095,0 80.66569,70.51388,0 80.6601,70.57407000000001,0 80.72072,70.5945,0 80.75629000000001,70.66586,0 80.59229000000001,70.71675000000001,0 80.69016000000001,70.80186000000001,0 80.56647,70.85477,0 80.55004,71.05757,0 79.96638,71.13109,0 79.50832,71.29331999999999,0 79.22915999999999,71.3175,0 79.1747,71.34609,0 79.14027,71.42165,0 79.3586,71.49413,0 79.39082000000001,71.54387,0 79.33138,71.59775999999999,0 79.38026000000001,71.61637,0 79.86972,71.60027,0 80.13540999999999,71.67453,0 80.06631,71.76943,0 80.12739999999999,71.7749,0 80.03504,71.83147,0 80.17328999999999,71.86931,0 80.27464000000001,71.85148,0 80.2719,71.87848,0 80.34878999999999,71.88601,0 80.24838,71.91006,0 80.23093,71.94193,0 79.91002,71.98448000000001,0 79.86720000000001,72.02249000000001,0 79.69692000000001,72.05915,0 79.42276,72.03554,0 79.38275000000002,72.06219,0 79.09444000000001,72.07055,0 79.09193000000001,72.10165000000001,0 79.01859,72.11998,0 78.91081,72.11471,0 78.91165,72.14444,0 78.7711,72.17027,0 78.80803,72.18332000000001,0 78.67693,72.17944,0 78.59721999999999,72.20972,0 78.67804,72.22165,0 78.65913999999999,72.26111,0 78.44637,72.35971000000001,0 78.45471000000001,72.36443,0 78.50015000000001,72.37733,0 78.4727,72.64751,0 78.17527,72.89798,0 78.20658,73.02322,0 78.53532,73.30501,0 79.49023,73.66505000000001,0 81.08696000000001,73.75897999999999,0 82.27669,73.92335,0 82.27669,74.95653,0 82.90286,74.98784000000001,0 83.37249,75.30092999999999,0 83.49773000000002,75.83316000000002,0 83.27856,76.17757,0 82.84025,76.36541,0 82.30801,76.45934,0 82.30801,78.37854,0 82.30801,83.37854000000002,0 82.52397000000001,83.37876,0 87.52397000000001,83.3839,0 92.52396,83.38905,0 97.52396,83.39419,0 97.52396,84.90001,0 97.52396,89.90000000000001,0 98.4623,89.90000000000001,0 99.40063000000002,89.90000000000001,0 100.339,89.90000000000001,0 101.2773,89.90000000000001,0 102.2156,89.90000000000001,0 103.154,89.90000000000001,0 104.0923,89.90000000000001,0 105.0307,89.90000000000001,0 105.969,89.90000000000001,0 106.9073,89.90000000000001,0 107.8457,89.90000000000001,0 108.784,89.90000000000001,0 109.7223,89.90000000000001,0 110.6607,89.90000000000001,0 111.599,89.90000000000001,0 112.5374,89.90000000000001,0 112.5259,84.90002,0 112.5144,79.90003,0 112.5097,77.85098000000001,0 112.5083,77.24612000000001,0 113.351,76.87012,0 113.9618,76.43810000000001,0 114.1406,75.88692,0 113.8128,75.26125999999999,0 112.6509,74.76967999999999,0 111.3847,74.42704000000001,0 111.34,74.27808,0 111.6826,74.06952,0 111.6379,73.93545,0 111.2942,73.85934,0 110.8934,73.76541,0 110.9169,73.76028,0 110.8775,73.72859,0 110.9143,73.69668,0 111.0803,73.65860000000001,0 111.1433,73.63777,0 111.1178,73.59359000000001,0 111.0547,73.57165999999999,0 110.8483,73.56554,0 110.8036,73.50832,0 110.5641,73.40637,0 110.1644,73.40248,0 110.5667,73.31944,0 110.6272,73.26888,0 110.423,73.18997,0 110.7978,73.17303,0 110.8583,73.07805000000002,0 110.9417,73.03888000000001,0 110.7778,73.00054,0 110.8155,72.95359999999999,0 110.8755,72.94859,0 110.6466,72.89554,0 110.6597,72.85305,0 110.7317,72.82999,0 110.6322,72.78665000000001,0 110.7303,72.64472000000001,0 110.925,72.63193,0 110.89,72.58110000000002,0 111.3155,72.51277,0 111.3036,72.47832,0 111.0758,72.4061,0 111.0883,72.37220000000001,0 + + + 1 + + + + + GMT +08:00 + + +]]> + #khStyle0800 + + + + + +108.4614,64.28581,0 108.5394,64.23248,0 108.4769,64.20081999999999,0 108.5441,64.1747,0 108.49,64.1147,0 108.7383,63.98082,0 108.6839,63.9086,0 108.7719,63.86472,0 108.6489,63.78582,0 108.6056,63.80749,0 108.4661,63.78944000000001,0 108.3716,63.82638,0 108.2886,63.80805,0 108.2703,63.67888,0 108.1164,63.62249,0 108.1314,63.56777,0 108.5586,63.59972000000001,0 108.8566,63.53582000000002,0 109.0433,63.55416000000002,0 109.2289,63.44027,0 109.2717,63.34722,0 109.363,63.36193,0 109.3917,63.32472,0 109.3753,63.25528000000001,0 109.4564,63.21860000000001,0 109.4061,63.18277,0 109.46,63.15055,0 109.4317,63.09361,0 109.4647,63.07749,0 109.4472,63.03611,0 109.4811,63.02777,0 109.4553,62.99972000000001,0 109.4811,62.9961,0 109.4683,62.93388000000002,0 109.6158,62.87609,0 109.6505,62.82444000000002,0 109.5039,62.77527,0 109.4561,62.66637999999999,0 109.375,62.64583,0 109.3869,62.58306000000001,0 109.2444,62.57277,0 109.2642,62.52332,0 109.3158,62.47554000000001,0 109.4205,62.45832,0 109.4711,62.40499,0 109.5442,62.4325,0 109.9036,62.41388,0 109.9247,62.39722,0 109.8911,62.35333,0 109.9628,62.32249000000002,0 109.96,62.31639,0 110,62.28220000000001,0 109.9333,62.23472,0 109.9997,62.16361,0 109.9036,62.11306,0 109.8183,62.00363000000001,0 109.6116,61.89277000000001,0 109.5864,61.82333000000001,0 109.5858,61.77443,0 109.6389,61.76083000000001,0 109.6126,61.71394000000001,0 109.7161,61.67666,0 109.7061,61.64804,0 109.8742,61.53333000000001,0 109.8653,61.49305,0 109.8247,61.47748,0 109.8492,61.43054000000001,0 109.7875,61.32721000000001,0 109.8553,61.29139000000001,0 110.0903,61.27027,0 110.1797,61.15639,0 110.3211,61.14638000000001,0 110.3972,61.18111,0 110.483,61.15971,0 110.5208,61.08138,0 110.4575,61.03667,0 110.448,60.97694000000001,0 110.23,60.81916,0 110.225,60.79610000000002,0 110.2947,60.76999000000001,0 110.2703,60.76222,0 110.2678,60.69194,0 110.04,60.66915,0 110.1222,60.62416,0 110.1178,60.57972,0 110.0389,60.55833,0 110.0219,60.51694,0 109.9164,60.45889,0 109.9519,60.40359999999999,0 109.8611,60.37417000000001,0 109.8789,60.33805,0 109.8055,60.31305,0 109.8069,60.25443,0 109.7264,60.22610000000001,0 109.6936,60.11193,0 109.7164,60.05222000000001,0 109.7694,60.02887000000001,0 109.62,59.90305,0 109.6514,59.86193000000001,0 109.4947,59.75027000000001,0 109.4842,59.68721000000002,0 109.5339,59.64555,0 109.2594,59.4511,0 109.3558,59.41667000000001,0 109.245,59.36306,0 109.2605,59.31694,0 109.5167,59.29193,0 109.5172,59.23082,0 109.5405,59.22083,0 109.5281,59.18027,0 109.6286,59.1511,0 109.6405,59.06166,0 109.7411,59.07194000000001,0 109.8203,58.97971,0 109.9355,59.00917,0 110.2783,58.98194,0 110.3522,59.03582,0 110.4819,59.03334,0 110.5386,59.06221000000001,0 110.5425,59.10556,0 110.5917,59.13110000000001,0 110.5789,59.19166000000001,0 110.6927,59.25777000000001,0 110.9969,59.20805000000001,0 111.0831,59.23944,0 111.1822,59.18332000000001,0 111.3042,59.25694000000001,0 111.4353,59.27388,0 111.6461,59.2061,0 111.7681,59.27805,0 111.9419,59.2711,0 111.9933,59.34470000000001,0 112.2214,59.50361,0 112.2739,59.50444000000001,0 112.2714,59.46638,0 112.3341,59.41694,0 112.2728,59.365,0 112.3075,59.33666000000002,0 112.2839,59.30305,0 112.438,59.33028,0 112.6322,59.31082000000001,0 112.6386,59.26944000000001,0 112.5378,59.23694,0 112.46,59.16166,0 112.4461,58.92805,0 112.5003,58.86999,0 112.6276,58.96118,0 112.5555,59.02665,0 112.5742,59.07168,0 112.6453,59.03249,0 112.7314,59.0872,0 112.8822,59.11833,0 112.9117,59.15499,0 112.9714,59.13444000000001,0 113.2817,59.16109000000001,0 113.4694,59.26500000000001,0 113.4558,59.29889,0 113.4869,59.33333,0 113.4211,59.37665,0 113.4728,59.43860000000001,0 113.6097,59.49527000000001,0 113.5864,59.55915000000002,0 113.6089,59.58111000000001,0 113.7836,59.60999,0 113.8492,59.68832,0 114.0419,59.68054999999999,0 114.0433,59.74110000000001,0 114.1655,59.74582000000002,0 114.3155,59.88361,0 114.5667,59.99777000000001,0 114.5211,60.04527,0 114.5461,60.11388000000001,0 114.6966,60.21998,0 114.8139,60.18054,0 115.013,60.27167,0 115.0906,60.38276000000001,0 115.1891,60.42972000000001,0 115.6755,60.52666,0 115.8428,60.465,0 116.0032,60.45931000000002,0 116.078,60.40417,0 116.6008,60.35722000000001,0 116.7322,60.25777,0 116.84,60.24222,0 116.9736,60.15777,0 117.0444,60.08250000000001,0 117.0486,60.03583,0 117.2975,60.01943,0 117.3089,59.99528,0 117.2333,59.95694,0 117.1139,59.96333,0 117.0572,59.90889,0 117.2275,59.82943,0 117.2008,59.65499,0 117.0844,59.58721,0 117.1966,59.56916,0 117.2361,59.52777,0 117.5989,59.47083,0 117.7583,59.54084000000001,0 117.8189,59.44944000000001,0 117.8836,59.44165,0 117.94,59.45471,0 117.9864,59.53638,0 118.0572,59.58333,0 118.2836,59.61055,0 118.3503,59.58888,0 118.3903,59.51777,0 118.7644,59.4011,0 118.7633,59.38722000000001,0 118.7553,59.33333,0 118.8514,59.28611,0 118.7014,59.21305000000001,0 118.7025,59.06554,0 118.7369,59.02361000000001,0 118.8478,59.01441000000001,0 118.8539,58.94360000000001,0 118.7922,58.9397,0 118.7867,58.8875,0 118.8969,58.81471000000001,0 118.8875,58.69554000000001,0 118.8269,58.61527,0 118.763,58.61249,0 119.1297,58.48249,0 119.1261,58.40833000000001,0 119.0655,58.36388,0 119.1317,58.29027,0 119.1084,58.22268,0 118.803,58.21666000000001,0 118.6475,58.17028000000001,0 118.5614,58.21444,0 118.4892,58.21111,0 118.3072,58.36028000000001,0 118.1354,58.38744,0 118.0639,58.33832000000001,0 118.013,58.39305,0 117.8308,58.4122,0 117.6722,58.40055,0 117.6644,58.3711,0 117.4792,58.31361,0 117.4714,58.28278,0 117.5906,58.18555,0 117.5739,58.13582,0 117.44,58.15721,0 117.4075,58.12721,0 117.4139,58.08749000000001,0 117.3725,58.0611,0 117.3958,58.02610000000001,0 117.3647,57.99554,0 117.3661,57.92749,0 117.4175,57.90666,0 117.31,57.84388000000001,0 117.123,57.84277,0 117.0844,57.80416000000001,0 117.1783,57.73888000000002,0 117.1378,57.63972,0 117.2878,57.61306,0 117.3105,57.56555,0 117.2522,57.51333000000002,0 117.2889,57.45833,0 117.3286,57.45443,0 117.365,57.32778,0 117.4444,57.32972,0 117.4264,57.25861,0 117.4742,57.23778,0 117.5464,57.25999,0 117.5964,57.32333,0 117.7758,57.30249000000001,0 117.7955,57.28722,0 117.7452,57.19583000000001,0 117.5969,57.15332,0 117.6783,57.06666,0 117.6889,57.01444999999999,0 117.6744,56.9747,0 117.57,56.93555000000001,0 117.5728,56.84722,0 117.498,56.87137,0 117.4605,56.81694000000001,0 117.4103,56.82583000000001,0 117.4153,56.85777,0 117.3447,56.86693000000001,0 117.3642,56.91610000000001,0 117.3311,56.9486,0 117.1933,56.87943,0 117.1355,56.80111,0 117.0222,56.81554,0 117.0017,56.79943000000001,0 117.0403,56.77638,0 116.9672,56.78111,0 116.8072,56.72388,0 116.7386,56.76083000000001,0 116.5594,56.7589,0 116.3639,56.84860000000001,0 116.1211,56.81221000000002,0 116.0417,56.86361,0 115.9628,56.86111,0 115.8617,56.93277000000001,0 115.7368,56.95655,0 115.5864,56.87249000000001,0 115.6136,56.78611,0 115.5903,56.71554,0 115.443,56.66388,0 115.4311,56.62823,0 115.4647,56.58971,0 115.6819,56.56527000000001,0 115.6755,56.49277,0 115.7988,56.42968000000001,0 115.7844,56.40193,0 115.6797,56.39721,0 115.6841,56.29694,0 115.7619,56.17416,0 115.8369,56.14943,0 115.7691,56.11694,0 115.7855,56.07193000000001,0 115.7586,56.04111000000001,0 115.898,55.91667000000001,0 115.8419,55.82638000000001,0 115.8683,55.74499,0 115.8411,55.67222000000001,0 115.913,55.6461,0 115.8894,55.49889000000001,0 115.9672,55.44526000000001,0 115.93,55.39694,0 115.9639,55.36555,0 116.0694,55.37944,0 116.1144,55.34749000000002,0 116.4022,55.36082,0 116.4616,55.30555,0 116.4694,55.22748,0 116.6991,55.11472000000001,0 116.7825,55.11028,0 116.8411,55.02138,0 116.8264,54.97860000000001,0 116.8892,54.94165,0 116.8778,54.90527,0 116.9239,54.79554,0 116.8694,54.7686,0 116.8739,54.70416,0 116.7697,54.66109,0 116.77,54.59222,0 116.7144,54.56333000000001,0 116.7119,54.52944,0 116.5372,54.50943,0 116.5228,54.46408,0 116.185,54.50722,0 115.6708,54.42388,0 115.5092,54.36472000000001,0 115.4993,54.30138000000001,0 115.1833,54.18444,0 115.1494,54.12027000000001,0 115.0241,54.07027000000002,0 115.0239,54.03082,0 114.9758,53.99249,0 114.5958,53.90277,0 114.5031,53.80915000000001,0 114.4453,53.80249000000001,0 114.3747,53.81249,0 114.2961,53.74666000000001,0 114.1431,53.75610000000001,0 113.9947,53.71694,0 113.9686,53.69944000000001,0 113.9744,53.64444000000001,0 113.8147,53.61644,0 113.8955,53.53472,0 113.8278,53.4575,0 113.8322,53.38971999999999,0 113.9433,53.35638,0 113.9639,53.31945,0 113.94,53.28444,0 113.9822,53.23305,0 114.048,53.25249,0 114.0464,53.22359,0 114.0925,53.2047,0 114.2017,53.19222,0 114.1269,53.07194,0 114.2314,53.10361000000001,0 114.3253,53.06777,0 114.2814,53.02139,0 114.3172,52.96721,0 114.2322,52.96527,0 114.2422,52.92749,0 114.2144,52.89054000000001,0 114.2422,52.82388,0 114.1236,52.71832,0 113.9542,52.62555,0 113.8978,52.63499,0 113.738,52.57722,0 113.5792,52.45027,0 113.5341,52.49416,0 113.2733,52.47805000000001,0 112.9303,52.33665000000001,0 112.5389,52.34972000000001,0 112.4925,52.25000000000001,0 112.4022,52.20694,0 112.2964,52.25278000000001,0 112.2089,52.24054,0 112.1683,52.30389000000001,0 112.0608,52.27833,0 111.6078,51.92778,0 111.198,51.82361000000001,0 111.1397,51.83527,0 111.015,51.78221000000001,0 111.0019,51.72222,0 110.8414,51.66915000000002,0 110.8639,51.59222,0 110.7817,51.57471,0 110.6961,51.50277,0 110.5447,51.49471,0 110.4205,51.52222,0 110.3947,51.57944,0 110.0491,51.62000000000001,0 109.6789,51.46305,0 109.4289,51.41610000000001,0 109.38,51.34666,0 109.3386,51.39138,0 109.2522,51.36221000000001,0 109.0636,51.50861,0 108.945,51.43999000000002,0 108.743,51.44583000000001,0 108.6208,51.51306,0 108.547,51.47527,0 108.4736,51.34499,0 108.3525,51.26528,0 108.4542,51.22776000000001,0 108.5747,51.11528,0 108.4997,51.05915000000002,0 108.3322,51.04887999999999,0 108.2515,50.83393,0 108.0655,50.75804999999999,0 108.1794,50.65915,0 108.4167,50.61361,0 108.5447,50.52777,0 108.6583,50.53777,0 108.6853,50.50417,0 108.6039,50.45221999999999,0 108.4369,50.46249000000002,0 108.3386,50.40444000000001,0 108.2042,50.41109,0 108.1325,50.31444,0 108.0761,50.35332,0 107.9855,50.33721,0 107.9375,50.22221,0 107.8936,50.19249000000001,0 107.8205,50.20665000000002,0 107.7736,50.15749000000002,0 107.7619,50.10471,0 107.8008,50.09166000000001,0 107.7989,50.02999,0 107.7536,49.97955000000001,0 107.8133,49.94860000000001,0 107.9806,49.94083,0 107.9553,49.85167,0 107.9892,49.74499,0 107.9475,49.68333,0 108.0319,49.67471,0 108.0419,49.61082,0 108.1375,49.55804,0 108.2719,49.53555000000001,0 108.3589,49.44526000000001,0 108.5275,49.34555,0 108.6511,49.33173000000001,0 109.2069,49.36028,0 109.3519,49.33694,0 109.5442,49.23249,0 109.7394,49.23499000000001,0 109.8503,49.18999,0 110.2369,49.16945,0 110.4011,49.25500000000001,0 110.6303,49.15249,0 110.7886,49.14944,0 110.9811,49.20083,0 111.3714,49.37416,0 111.498,49.34916000000001,0 111.6822,49.40665,0 111.9639,49.40694,0 112.4917,49.54138,0 112.7669,49.50083,0 113.0908,49.59859,0 113.1014,49.67888,0 113.2167,49.81917,0 113.5861,50.01639,0 113.7825,50.08693000000002,0 113.8747,50.08693000000002,0 114.1764,50.24833,0 114.313,50.28416,0 114.4439,50.24527,0 114.6758,50.26415999999999,0 114.8542,50.22832,0 115.0236,50.15193,0 115.2053,49.99833,0 115.3964,49.90110000000001,0 115.7547,49.88443000000001,0 116.0697,50.00278,0 116.2461,50.02749000000001,0 116.6155,49.93138,0 116.7114,49.83046000000001,0 117.17,49.6525,0 117.4944,49.62305,0 117.872,49.51022,0 117.8958,49.55,0 118.3658,49.77832000000002,0 118.3855,49.81667000000001,0 118.4647,49.82444,0 118.5833,49.92694,0 119.0996,49.99044,0 119.2141,50.01528,0 119.3222,50.09722000000001,0 119.3481,50.15948,0 119.3289,50.27388000000001,0 119.368,50.30999,0 119.348,50.34833,0 119.1983,50.34527,0 119.1353,50.38972,0 119.2422,50.44526,0 119.2869,50.59389000000001,0 119.5022,50.74221000000001,0 119.5225,50.90499,0 119.7467,51.0736,0 119.7805,51.1661,0 119.7553,51.20750000000001,0 119.818,51.21416,0 119.8097,51.26416,0 119.9208,51.33638,0 119.8914,51.37417,0 119.9566,51.38999,0 119.983,51.49305,0 120.0491,51.54777000000001,0 120.0969,51.66138,0 120.1972,51.68610000000002,0 120.4886,51.8772,0 120.6578,51.9175,0 120.7128,51.98249000000001,0 120.695,52.04860999999999,0 120.7531,52.07917,0 120.7828,52.15526,0 120.7592,52.23916,0 120.6228,52.34026999999999,0 120.6867,52.43361000000001,0 120.7136,52.54472000000001,0 120.4403,52.63722,0 120.1891,52.58028,0 120.073,52.59,0 120.0306,52.61721,0 120.0292,52.76805,0 120.2728,52.85777,0 120.8639,53.27972000000001,0 121.2083,53.27055000000001,0 121.325,53.31833,0 121.4738,53.32382,0 121.83,53.41305,0 122.0261,53.41397,0 122.3144,53.48777,0 122.41,53.43721000000001,0 122.8244,53.45,0 123.1533,53.50054999999999,0 123.2461,53.55305,0 123.4789,53.49917,0 123.4975,53.54694,0 123.5428,53.53388,0 123.5294,53.49944,0 123.6194,53.54277,0 123.6975,53.49583,0 123.9108,53.46471,0 124.1044,53.34083,0 124.2553,53.35665,0 124.4022,53.21221,0 124.6528,53.18581,0 124.7058,53.13443000000001,0 124.805,53.13305,0 124.8516,53.08915,0 124.89,53.09471,0 124.8755,53.14388000000001,0 124.9122,53.16972,0 125.1342,53.19749000000001,0 125.4661,53.08388000000001,0 125.5061,53.03832,0 125.623,53.05,0 125.7289,52.97943,0 125.7191,52.94222,0 125.6486,52.91276,0 125.6469,52.87887000000001,0 125.8447,52.89943000000002,0 125.8592,52.85166000000001,0 125.9705,52.76333,0 126.0508,52.78583,0 126.0955,52.76444,0 126.0355,52.7211,0 126.0642,52.67638,0 125.973,52.64167,0 125.9886,52.58222,0 126.0308,52.56333,0 126.0939,52.58804,0 126.2094,52.50139000000002,0 126.1977,52.46444,0 126.2675,52.4586,0 126.3403,52.38942999999999,0 126.3203,52.30832,0 126.4364,52.28082000000001,0 126.3064,52.20417,0 126.5572,52.13055,0 126.5122,52.03889,0 126.4616,52.02694,0 126.4422,51.98804,0 126.6414,51.74527,0 126.7214,51.7086,0 126.7292,51.63833000000001,0 126.6728,51.57471,0 126.8025,51.53694,0 126.8247,51.50139,0 126.7905,51.42443000000001,0 126.9153,51.37915,0 126.9019,51.33943,0 126.8214,51.33028000000001,0 126.8161,51.26639000000001,0 126.8933,51.23915000000001,0 126.8611,51.30693999999999,0 126.9755,51.31360999999999,0 126.8986,51.18665,0 126.9305,51.05999000000001,0 127.1272,50.91555,0 127.2175,50.78416,0 127.2972,50.73249,0 127.28,50.68083,0 127.3677,50.57083,0 127.2894,50.46027000000001,0 127.3542,50.41332,0 127.3366,50.31027,0 127.5861,50.20856,0 127.5697,50.12833,0 127.4883,50.04221,0 127.4878,49.98055000000002,0 127.5314,49.91972000000001,0 127.5083,49.82,0 127.5419,49.78249000000001,0 127.6717,49.74889000000001,0 127.6914,49.66721,0 127.8214,49.5911,0 127.9744,49.60249000000001,0 128.075,49.54222000000001,0 128.1911,49.53416000000001,0 128.5052,49.58694,0 128.6259,49.56967000000001,0 128.6689,49.61193,0 128.8025,49.55916,0 128.7525,49.46804000000001,0 128.8752,49.47776,0 128.9927,49.44165,0 129.0769,49.35279,0 129.1997,49.39059000000001,0 129.3535,49.3423,0 129.3691,49.41396000000001,0 129.4122,49.43176,0 129.5235,49.39124,0 129.545,49.29318,0 129.7219,49.26626,0 129.7327,49.19294,0 129.8474,49.15796000000001,0 129.833,49.11796,0 129.9127,49.08241,0 129.9164,49.02963,0 130.2289,48.86221,0 130.418,48.8961,0 130.5044,48.85194,0 130.6277,48.87465,0 130.675,48.84415000000001,0 130.523,48.60277,0 130.6175,48.56194000000001,0 130.6269,48.47720000000001,0 130.7578,48.48805,0 130.7375,48.41833,0 130.8322,48.29694,0 130.6594,48.0986,0 130.6814,48.04554,0 130.8897,47.90028,0 130.9461,47.80055,0 130.9464,47.71138,0 131.0405,47.67583,0 131.4167,47.7386,0 131.5372,47.71888,0 131.5755,47.6561,0 131.6783,47.69915000000002,0 131.9194,47.66999,0 132.3411,47.74248999999999,0 132.5425,47.71389000000001,0 132.6597,47.86583,0 132.6714,47.94972000000001,0 132.8089,47.94194,0 132.8844,48.00860999999999,0 133.018,48.03528000000001,0 133.0886,48.10167,0 133.3872,48.10528,0 133.5067,48.07138000000001,0 133.5936,48.17249,0 133.6964,48.18694,0 133.7514,48.24972,0 133.978,48.25972000000001,0 134.0458,48.32528000000001,0 134.4153,48.39112,0 134.4827,48.35028,0 134.5718,48.36446000000001,0 134.6105,48.30694,0 134.7408,48.26712,0 134.6814,48.22055,0 134.6678,48.10722,0 134.5839,48.06276,0 134.5572,47.99471000000001,0 134.5988,47.90471,0 134.6619,47.87417,0 134.6844,47.80090000000001,0 134.7703,47.73944,0 134.7672,47.7075,0 134.6836,47.62972,0 134.6741,47.57194,0 134.5521,47.46692,0 134.4791,47.42778,0 134.3147,47.4211,0 134.1825,47.32332000000001,0 134.1478,47.24942999999999,0 134.1947,47.20665000000001,0 134.2222,47.11083000000001,0 134.1312,47.07423,0 134.0627,46.97527000000001,0 134.0669,46.9161,0 134.0119,46.82389,0 134.0438,46.75289999999999,0 133.9977,46.64016,0 133.9016,46.57222,0 133.8458,46.47554000000001,0 133.85,46.43999,0 133.9286,46.39249,0 133.8619,46.33138,0 133.9102,46.31444,0 133.8839,46.29361,0 133.9002,46.25031000000001,0 133.6869,46.14332,0 133.7247,46.06528,0 133.6605,45.93458,0 133.6108,45.93194,0 133.583,45.87137,0 133.5222,45.88665,0 133.4747,45.82027999999999,0 133.508,45.77777,0 133.4419,45.69804,0 133.4886,45.68277000000001,0 133.4533,45.64722,0 133.4683,45.62222,0 133.4191,45.60722,0 133.4171,45.5691,0 133.1905,45.50416000000001,0 133.1491,45.45083000000001,0 133.0925,45.24415,0 133.1222,45.12860000000001,0 133.0333,45.06167,0 132.9233,45.02194000000001,0 131.9886,45.24194,0 131.8647,45.34555,0 131.7536,45.21305000000001,0 131.6464,45.19887,0 131.6444,45.10555,0 131.4666,44.96721,0 131.35,44.97471,0 131.2125,44.91055,0 131.118,44.92583,0 131.0425,44.86333,0 130.9539,44.8461,0 131.0955,44.69137,0 131.298,44.05194,0 131.2472,44.0275,0 131.2311,43.97387,0 131.2461,43.91806,0 131.1991,43.81889,0 131.2205,43.59527,0 131.1889,43.53666,0 131.1944,43.52777,0 131.223,43.51167,0 131.3044,43.45583,0 131.3114,43.39222,0 131.2741,43.36333,0 131.2611,43.26445,0 131.1911,43.19665,0 131.2144,43.13305,0 131.1047,43.03611,0 131.1322,42.91916,0 131.0458,42.90193,0 131.0153,42.855,0 130.8186,42.87610000000001,0 130.7705,42.83194,0 130.638,42.83167,0 130.4052,42.71804,0 130.4589,42.67999,0 130.5389,42.68194,0 130.6052,42.61971000000001,0 130.618,42.57944000000001,0 130.5591,42.50667000000001,0 130.6044,42.42186,0 130.5675,42.44305,0 130.5147,42.60222,0 130.4614,42.59389,0 130.4725,42.55694,0 130.4372,42.545,0 130.4255,42.60222,0 130.2433,42.71833,0 130.2522,42.89249,0 130.1008,42.91194,0 130.1358,42.96221,0 130.1075,42.97833,0 129.9996,42.96142,0 129.9075,43.00581,0 129.8756,42.9897,0 129.9056,42.96999,0 129.8512,42.95998,0 129.7578,42.72971,0 129.7533,42.69415,0 129.7875,42.675,0 129.7427,42.64083,0 129.7608,42.60332,0 129.725,42.56139,0 129.7119,42.44415,0 129.5908,42.44526,0 129.5397,42.36361,0 129.4422,42.43443000000001,0 129.3419,42.44583,0 129.3441,42.41471,0 129.24,42.37417,0 129.2377,42.32194,0 129.1905,42.31333,0 129.2244,42.29639,0 129.1758,42.23499,0 129.2102,42.21721,0 129.0141,42.0942,0 128.9577,42.08111,0 128.9122,42.0211,0 128.7291,42.04695,0 128.4894,41.99555,0 128.2825,42.03916,0 128.0589,42.00332,0 128.1019,41.7961,0 128.3019,41.57778,0 128.2044,41.41667000000001,0 128.1127,41.36971,0 128.1061,41.39415,0 128.0441,41.38943,0 128.0475,41.41888,0 128.0208,41.4086,0 128.0008,41.44555,0 127.9814,41.42276,0 127.8739,41.43943,0 127.8583,41.40444,0 127.6475,41.40277,0 127.5572,41.42972,0 127.5391,41.46361,0 127.2708,41.4725,0 127.2872,41.50111,0 127.1022,41.53528,0 127.1786,41.58749,0 127.057,41.64351,0 127.04,41.67194,0 127.078,41.68194,0 127.0453,41.72444,0 126.9364,41.76305,0 126.9361,41.79444,0 126.7975,41.7311,0 126.7869,41.69222,0 126.6947,41.74027,0 126.6789,41.72444,0 126.7222,41.69804000000001,0 126.6151,41.66418,0 126.5633,41.61092,0 126.5844,41.56860000000001,0 126.5008,41.43194,0 126.5272,41.3575,0 126.4561,41.35722,0 126.2792,41.15277,0 126.1239,41.08111,0 126.1322,41.04416000000001,0 126.0733,40.97305,0 125.9775,40.91331,0 126.0169,40.89999,0 125.8786,40.89472,0 125.8214,40.86139,0 125.7619,40.88361,0 125.6531,40.82166,0 125.6803,40.76554,0 125.5641,40.77832,0 125.5447,40.7186,0 125.4642,40.7136,0 125.4058,40.62082,0 125.2861,40.64749,0 125.248,40.60388,0 125.0178,40.53082,0 125.04,40.45722,0 124.8805,40.47054,0 124.8328,40.40915,0 124.7433,40.37,0 124.7084,40.30505,0 124.5547,40.24222000000001,0 124.3736,40.09361,0 124.3702,40.0028,0 124.1097,39.48034,0 124.1097,37.96414,0 124.1097,32.96414,0 127.5079,32.96414,0 127.5079,32.5252,0 127.5079,27.5252,0 122.8135,27.5252,0 122.8135,23.56643,0 127.5079,23.5489,0 127.5079,23.43974,0 127.5079,18.43974,0 127.5079,13.43974,0 127.5079,8.439740000000001,0 127.5079,3.439736,0 127.1436,2.912129,0 124.3024,-1.202193,0 124.3024,-3.067723,0 125.441,-3.067723,0 125.441,-7.306758,0 127.3328,-7.298002000000002,0 127.3328,-8.906616,0 127.3328,-13.90662,0 127.3967,-13.965,0 127.4278,-13.95666,0 127.4466,-14.05916,0 127.5044,-14.06334,0 127.6136,-14.13611,0 127.7605,-14.30055,0 127.8228,-14.38694,0 127.8247,-14.44444,0 127.865,-14.42056,0 127.8514,-14.48222,0 127.8855,-14.47277,0 127.9494,-14.52667,0 127.9453,-14.57639,0 128.0036,-14.56111,0 128.0697,-14.64584,0 128.2153,-14.69975,0 128.3259,-14.71017,0 128.3877,-14.79719,0 128.5417,-14.75778,0 129,-14.87108,0 129.0006,-16.0049,0 129.0032,-21.0049,0 129.0059,-26.0049,0 129.0052,-26.69261,0 129.0003,-31.69261,0 128.2483,-32.01084,0 128.0039,-32.09223,0 127.7539,-32.1286,0 127.508,-32.22667,0 127.508,-33.42665,0 127.508,-38.42665,0 127.508,-43.42665,0 127.508,-48.42665000000001,0 127.508,-53.42665000000001,0 127.508,-58.42665,0 127.508,-63.42665,0 127.508,-68.42665,0 127.508,-72.02666000000001,0 127.508,-77.02666000000001,0 127.508,-82.02666000000001,0 127.508,-84.89999,0 127.508,-89.90000000000001,0 126.57,-89.90000000000001,0 125.632,-89.90000000000001,0 124.694,-89.90000000000001,0 123.7561,-89.90000000000001,0 122.8181,-89.90000000000001,0 121.8801,-89.90000000000001,0 120.9422,-89.90000000000001,0 120.0042,-89.90000000000001,0 119.0662,-89.90000000000001,0 118.1282,-89.90000000000001,0 117.1903,-89.90000000000001,0 116.2523,-89.90000000000001,0 115.3143,-89.90000000000001,0 114.3764,-89.90000000000001,0 113.4384,-89.90000000000001,0 112.5004,-89.90000000000001,0 112.5004,-89.43648,0 112.5004,-84.43648,0 112.5004,-79.43648,0 112.5004,-74.43648,0 112.5004,-69.43648000000002,0 112.5004,-64.43649000000001,0 112.5004,-59.43648,0 112.5004,-54.73646999999999,0 112.5004,-49.73648,0 112.5004,-44.73647,0 112.5004,-39.73648000000001,0 112.5004,-39.63649,0 112.5004,-34.63648,0 112.5004,-29.63648,0 112.5004,-24.63648,0 112.5004,-19.63648,0 112.5004,-14.63648,0 112.5004,-9.636480000000001,0 115.767,-9.636480000000001,0 115.767,-7.548669,0 116.3209,-7.548669,0 116.3209,-5.205232,0 112.5004,-5.205232,0 112.5075,-3.479589,0 112.2021,-3.4867,0 111.9465,-3.62872,0 111.7903,-3.600316,0 111.7335,-3.536407,0 111.7903,-3.387277000000001,0 111.7761,-3.074815,0 111.3358,-3.032208,0 111.0162,-3.124531,0 110.9097,-3.138724,0 110.7819,-3.103219000000001,0 110.6754,-3.138724,0 110.5049,-2.996703999999999,0 110.3061,-3.060612,0 110.1712,-3.032208,0 110.0646,-2.925694000000001,0 110.1143,-2.499607,0 110.0717,-2.258163,0 110.093,-2.030923,0 110.0504,-1.952803,0 109.9297,-1.917289,0 109.8729,-1.839177,0 109.8942,-1.746865,0 109.9865,-1.682947,0 110.0433,-1.363393,0 109.7664,-1.207152,0 109.461,-1.349182,0 109.39,-1.285273,0 109.4255,-1.022518,0 109.2622,-0.9018005000000001,0 109.106,-0.5467235,0 109.0207,-0.2484725,0 109.113,0.02848446,0 109.0775,0.2344225,0 108.8929,0.2912305000000001,0 108.829,0.4758655000000001,0 108.6586,0.7457215000000002,0 108.6657,0.8522364,0 108.7438,0.8593374000000001,0 108.9071,1.086578,0 108.9071,1.1789,0 109.0278,1.363535,0 109.0278,1.491362,0 109.0775,1.576584,0 109.2409,1.725713,0 109.3237,1.966571,0 109.3237,4.869648,0 105.1191,4.869648,0 105.132,2.002301,0 104.3122,1.346534,0 103.9265,1.256534,0 103.7561,1.185812,0 103.5311,1.234025,0 103.4122,1.301534,0 103.2418,1.45583,0 103.2097,1.584413,0 102.9461,1.719422,0 102.8175,1.831931,0 102.6921,1.831931,0 102.5378,2.01195,0 102.3418,2.134089,0 102.1489,2.208024,0 101.9303,2.391254,0 101.8499,2.362329,0 101.8371,2.442689,0 101.7567,2.561625,0 101.5188,2.654846,0 101.416,2.786633,0 101.2906,2.815568,0 101.2038,2.93129,0 101.2167,3.040577,0 101.2874,3.114522,0 101.1781,3.345965,0 100.9499,3.657770000000001,0 100.5031,3.976011000000001,0 100.5673,4.663917,0 100.5095,4.824638,0 100.4195,4.901795,0 100.3311,5.074793,0 100.1688,5.261129,0 100.1668,5.375079,0 99.72359,6.164054,0 99.64923,6.352362,0 99.63088000000001,6.427682,0 99.84238000000002,6.479837,0 100.1271,6.424946000000001,0 100.1714,6.476660000000001,0 100.1958,6.702497,0 100.2939,6.703892,0 100.3344,6.586946000000001,0 100.3875,6.536106,0 100.4989,6.523056000000001,0 100.6611,6.4475,0 100.7542,6.501942,0 100.7655,6.451946,0 100.8336,6.419447,0 100.8575,6.234444,0 100.9514,6.239717000000001,0 100.9897,6.277500000000001,0 101.0333,6.243894,0 101.1155,6.248888000000001,0 101.1216,6.187221,0 101.0755,6.150555,0 101.12,6.098337,0 101.1194,5.984441,0 101.1014,5.92695,0 101.0358,5.896106,0 100.9902,5.788053,0 101.1458,5.631111,0 101.2561,5.705837,0 101.2897,5.810553,0 101.3516,5.808339,0 101.57,5.916663,0 101.6589,5.860557,0 101.6916,5.763608,0 101.7625,5.788889,0 101.8339,5.743340000000001,0 101.9438,5.861942,0 101.9483,5.969448,0 102.0916,6.110559,0 102.0952,6.236135,0 102.5034,6.235613,0 107.5034,6.229232,0 112.5034,6.222851,0 112.5076,9.711738,0 112.5137,14.71173,0 110.1489,14.71173,0 107.9865,18.50449,0 107.9893,21.3862,0 108.0038,21.44677,0 108.0824,21.49174,0 107.99,21.54241,0 107.948,21.54195,0 107.8586,21.65083,0 107.7831,21.66693,0 107.5361,21.58638,0 107.4858,21.59778,0 107.4578,21.65833,0 107.3627,21.60526,0 107.3014,21.73111,0 107.2208,21.70832,0 107.0203,21.8225,0 107.0491,21.90722,0 107.0292,21.93666,0 106.9327,21.92749,0 106.9017,21.97056,0 106.8086,21.97361,0 106.7553,22.01527000000001,0 106.6794,21.97389,0 106.7033,22.08972,0 106.6653,22.19944,0 106.6958,22.2225,0 106.6583,22.32444,0 106.5655,22.34583,0 106.5517,22.45682,0 106.6072,22.60695,0 106.6386,22.61416,0 106.6761,22.57277,0 106.7128,22.58666,0 106.7669,22.74249,0 106.8217,22.80028,0 106.7614,22.79471,0 106.7072,22.865,0 106.648,22.85333,0 106.6005,22.90917,0 106.5203,22.93528,0 106.4194,22.87056,0 106.285,22.8586,0 106.25,22.87416,0 106.2294,22.95083,0 106.1347,22.98861,0 106.0153,22.98472,0 105.9872,22.93583,0 105.8725,22.91027,0 105.7244,23.04805,0 105.5775,23.05916,0 105.5657,23.09678,0 105.5544,23.16028,0 105.4458,23.28445,0 105.398,23.28167,0 105.3275,23.37803,0 105.2647,23.33416,0 105.2405,23.26055,0 105.0811,23.24222,0 104.9619,23.16556,0 104.9075,23.18027,0 104.8763,23.11084,0 104.825,23.10611,0 104.8611,22.93666,0 104.7314,22.81666,0 104.6044,22.80972,0 104.5836,22.84472,0 104.37,22.68583,0 104.2619,22.73777,0 104.2672,22.82919,0 104.1116,22.79972,0 104.0331,22.68527,0 104.0097,22.52424,0 103.9644,22.49911,0 103.6553,22.7825,0 103.6178,22.78,0 103.5636,22.70138,0 103.5842,22.64416,0 103.5224,22.58437,0 103.4569,22.64249,0 103.4305,22.74388,0 103.3289,22.79500000000001,0 103.28,22.67304,0 103.1839,22.62888,0 103.1556,22.58666,0 103.1708,22.54694,0 103.0761,22.49833,0 103.0725,22.44749,0 103.0305,22.43555,0 102.9286,22.48194000000001,0 102.8628,22.60139,0 102.6103,22.72278,0 102.5603,22.69749,0 102.5428,22.74889,0 102.4797,22.77389,0 102.4261,22.68832,0 102.383,22.67749,0 102.4164,22.63583,0 102.2697,22.49166,0 102.2533,22.41471,0 102.1867,22.43,0 102.1407,22.39628,0 102.1147,22.43389000000001,0 102.0308,22.45527,0 101.92,22.43611,0 101.8755,22.38305,0 101.8,22.48943,0 101.738,22.49694,0 101.6719,22.44639000000001,0 101.6805,22.37917,0 101.6269,22.28166,0 101.57,22.27917,0 101.5389,22.24417,0 101.5969,22.16166,0 101.5744,22.10917,0 101.6255,21.97193,0 101.7086,21.92889,0 101.7847,21.825,0 101.7525,21.72443,0 101.7831,21.65083,0 101.8331,21.62138,0 101.763,21.57833,0 101.7775,21.515,0 101.7489,21.48194,0 101.7392,21.31639,0 101.8514,21.24916,0 101.838,21.21111,0 101.7822,21.20693,0 101.7872,21.14417,0 101.73,21.13972,0 101.67,21.19971,0 101.6075,21.18027,0 101.6153,21.22833,0 101.5686,21.24749,0 101.2819,21.18027,0 101.2283,21.31222,0 101.2653,21.37611,0 101.1936,21.41277,0 101.2164,21.54556,0 101.1482,21.57264,0 101.1686,21.63028,0 101.1053,21.77138,0 100.8867,21.68333,0 100.6667,21.47943,0 100.485,21.45833,0 100.43,21.52861,0 100.3789,21.53889,0 100.2039,21.43535,0 100.1239,21.50472,0 100.1061,21.58333,0 100.1719,21.65388,0 100.125,21.69056000000001,0 100.0022,21.69611,0 99.97360000000001,21.73388,0 99.94193000000001,21.825,0 99.99054,21.95833,0 99.96805000000002,22.05027,0 99.88055,22.06145,0 99.84388,22.02332,0 99.74915,22.07527,0 99.70914999999999,22.03972,0 99.64444,22.09917,0 99.52164999999999,22.1,0 99.46555000000002,22.13583,0 99.35942,22.09306,0 99.23248,22.11444,0 99.16277,22.15916,0 99.20055000000001,22.17333,0 99.18221000000001,22.195,0 99.27054,22.34777,0 99.26082,22.39111,0 99.38442000000001,22.50389,0 99.38499,22.60333,0 99.32805000000001,22.74472,0 99.44053,22.865,0 99.44553000000003,22.94972,0 99.51416,22.91222000000001,0 99.56638000000001,22.93805,0 99.50388,23.08972,0 99.35638,23.13499,0 99.11109999999999,23.10194,0 99.06137000000001,23.12361,0 99.05888,23.1675,0 98.88136,23.18805,0 98.94025000000002,23.31361,0 98.87886,23.32972,0 98.91859000000001,23.36472,0 98.91470000000001,23.41722,0 98.87997,23.4836,0 98.82471000000001,23.48083,0 98.80609000000001,23.54167,0 98.88582,23.61333000000001,0 98.81915000000001,23.70556,0 98.81554000000001,23.76722,0 98.68858000000002,23.80139000000001,0 98.70387000000002,23.95138,0 98.67720000000001,23.96805,0 98.89391000000001,24.09795,0 98.89072,24.16008,0 98.59703,24.07648,0 98.54462,24.1257,0 98.44659000000002,24.13496,0 98.35732000000002,24.10319000000001,0 98.22078000000001,24.12531,0 98.06448,24.0891,0 97.91249000000001,24.02666,0 97.85249000000002,23.95832,0 97.78831,23.94888,0 97.64998,23.8517,0 97.53637000000001,23.95056,0 97.72470000000001,24.11806,0 97.74970999999999,24.16999,0 97.72749,24.22499,0 97.75999000000002,24.2575,0 97.74165000000002,24.29027,0 97.6647,24.3061,0 97.66888,24.34166000000001,0 97.71776000000001,24.35833,0 97.66526,24.44416,0 97.53082000000001,24.44749,0 97.56248000000001,24.57111,0 97.55247,24.74304,0 97.68941000000001,24.83445,0 97.80025999999999,24.85139,0 97.73665000000003,24.91888,0 97.72581,25.06472,0 97.72331000000003,25.06944,0 97.78943,25.1375,0 97.83333,25.25916000000001,0 97.94108000000001,25.21416,0 98.06944,25.31444,0 98.10746,25.38722,0 98.1386,25.38694,0 98.12497999999999,25.50584,0 98.16804999999999,25.55027,0 98.16526,25.62277,0 98.32665000000002,25.55167000000001,0 98.38305,25.59195,0 98.39166,25.65666,0 98.53083,25.84555,0 98.63193,25.80111,0 98.71638000000002,25.87749,0 98.64166,25.98444,0 98.60525,25.98861,0 98.56805,26.12306,0 98.64888000000001,26.15166,0 98.66443,26.09833,0 98.73055000000002,26.17722,0 98.70110000000001,26.25195,0 98.66582,26.26056000000001,0 98.73748999999999,26.38694,0 98.77554000000001,26.60583000000002,0 98.75555,26.72417,0 98.77777,26.79167,0 98.7397,26.86416,0 98.76221,27.06445,0 98.70694,27.09778,0 98.69166,27.20193,0 98.73665,27.32917000000001,0 98.68552,27.46611,0 98.70471000000001,27.5825,0 98.66804999999999,27.61944,0 98.59471000000002,27.59971000000001,0 98.55110000000001,27.66693,0 98.52164999999999,27.64667,0 98.43248000000001,27.68944,0 98.40860000000001,27.55750000000002,0 98.36887,27.52944,0 98.31638,27.54194,0 98.22693000000002,27.73471,0 98.23248,27.82471,0 98.16692000000001,27.87055,0 98.20387000000001,27.91638,0 98.13082,27.96916,0 98.15776,28.11333,0 98.13621999999999,28.15632,0 98.06944,28.21138,0 98.01304,28.21472,0 98.01888,28.27832,0 97.90886999999999,28.37638,0 97.79694000000001,28.34916,0 97.71138000000001,28.51694,0 97.63136,28.48416,0 97.56944,28.54888,0 97.47083000000001,28.39111,0 97.46887000000001,28.29611,0 97.41054,28.2925,0 97.34887000000002,28.22278,0 97.13499000000002,28.38138,0 96.98471000000001,28.3325,0 96.88970999999999,28.37861,0 96.78415,28.37306,0 96.65387,28.46749,0 96.46053000000001,28.42194,0 96.40192,28.35111,0 96.39694000000002,28.35333,0 96.36165000000001,28.39278,0 96.26471000000001,28.41527,0 96.36638000000001,28.48082000000001,0 96.34526,28.55695,0 96.47832,28.63861,0 96.47083000000001,28.68833,0 96.60609000000001,28.73944,0 96.61582000000001,28.79027,0 96.51027000000001,28.96444,0 96.47581000000001,28.97472,0 96.51194000000001,29.07,0 96.34387,29.0325,0 96.16914,28.90361,0 96.14861000000001,28.94333,0 96.18222000000002,28.99527,0 96.11913,29.07916000000001,0 96.25665000000001,29.16444,0 96.34860000000001,29.18,0 96.39525999999999,29.25527,0 96.36249000000001,29.29055,0 96.28943,29.24139,0 96.23526000000001,29.25445,0 96.08389,29.46777000000001,0 95.59108999999999,29.255,0 95.53442,29.21167,0 95.54665,29.13861,0 95.49609000000001,29.14083000000001,0 95.46053000000001,29.05167,0 95.38777,29.03527,0 94.98471000000001,29.17361,0 95.00915999999999,29.12388,0 94.83335,29.16837,0 94.79227,29.2608,0 94.69736,29.33652,0 94.64751,29.33347,0 94.5812,29.23153,0 94.42776000000002,29.21551,0 94.23455,29.07348,0 94.15246000000002,28.9307,0 94.0211,28.83603,0 94.01243,28.74736,0 93.96173,28.6692,0 93.98059000000001,28.64518,0 93.85851000000001,28.69038,0 93.64729,28.64746,0 93.50206000000001,28.67916,0 93.49408,28.65192,0 93.35194000000001,28.61877000000001,0 93.28152000000002,28.49296,0 93.19270000000002,28.43213,0 93.23817000000001,28.38745,0 93.22205000000001,28.3193,0 93.04571,28.31026,0 93.01044000000003,28.24225,0 92.99153,28.26286,0 92.88734000000001,28.19872000000001,0 92.84125,28.1888,0 92.83004000000001,28.21276,0 92.75290000000001,28.16892,0 92.67525000000001,28.08071,0 92.72838000000002,28.03598,0 92.69942000000002,27.95555,0 92.45248000000001,27.82639,0 92.4147,27.86028,0 92.38666000000002,27.80472,0 92.35831000000003,27.84443,0 92.33110000000001,27.79472,0 92.26804,27.87472,0 92.25388,27.81582,0 92.11832000000003,27.8125,0 92.01443,27.73471,0 91.65776,27.76472,0 91.66721,27.94194,0 91.41943000000001,28.01056,0 91.31499,28.09667,0 91.21444,28.07305,0 91.08693,27.96999,0 91.01082000000001,27.98,0 90.90998999999999,28.04944,0 90.69942,28.09583,0 90.60804,28.06445,0 90.37053000000002,28.08027,0 90.35027,28.11222,0 90.39554000000001,28.19888,0 90.38165000000001,28.25139,0 90.00002000000002,28.32405,0 89.95027,28.29222,0 89.89388,28.30611,0 89.79276000000002,28.19416,0 89.6236,28.15833,0 89.48749000000001,28.05777,0 89.35999,27.87167000000001,0 89.22553000000001,27.795,0 89.12804,27.62333,0 89.12581,27.5675,0 88.97110000000001,27.47361,0 88.91692000000001,27.32083,0 88.78333000000001,27.43805,0 88.76331999999999,27.54333,0 88.83443,27.66111,0 88.88081,27.83667,0 88.83167,28.01334,0 88.62276,28.11805,0 88.53415,28.02917,0 88.14554,27.95527,0 88.12053,27.90471000000001,0 88.14279999999999,27.86605,0 87.86887,27.91888,0 87.79721000000001,27.83722,0 87.72054,27.805,0 87.66054,27.82888,0 87.59775999999999,27.81027,0 87.5461,27.84583,0 87.39360000000001,27.80916,0 87.40416999999999,27.86055,0 87.30609,27.81639,0 87.19275,27.82306,0 87.03943000000001,27.96083,0 86.93304000000002,27.95055,0 86.87415,28.01777,0 86.76416,28.02666,0 86.75805,28.08027,0 86.68637,28.11222,0 86.63666000000001,28.08555,0 86.57193,28.10583000000001,0 86.53498999999999,27.95499,0 86.44498,27.90805,0 86.22638000000001,28.00667,0 86.18359,28.16388,0 86.0936,28.08611,0 86.13721,27.93194,0 86.08942999999999,27.89083000000001,0 86.01443,27.88277,0 85.97304,27.91583,0 85.97803999999999,27.98972,0 85.91887,28.03333,0 85.88611,28.15167,0 85.74722,28.23693000000001,0 85.71832000000002,28.33943,0 85.61998,28.25111,0 85.45889,28.30166,0 85.37665,28.26361,0 85.10332,28.31639,0 85.10193,28.44666,0 85.18192999999999,28.53,0 85.18996,28.60332,0 85.05998,28.64111,0 84.95470000000002,28.54416,0 84.84663999999999,28.54445,0 84.7747,28.59888,0 84.70610000000001,28.60139,0 84.70663999999999,28.66055,0 84.63639000000001,28.70277000000002,0 84.48109,28.73667,0 84.39554,28.85917,0 84.23693000000002,28.91888000000001,0 84.2561,29.04222,0 84.20249,29.05695,0 84.15833000000001,29.13472,0 84.18552,29.20556,0 84.13667,29.21443,0 84.11388000000001,29.26194,0 83.91249000000001,29.28972,0 83.72054,29.22889,0 83.67192,29.16027,0 83.55277,29.18583,0 83.52748,29.26916,0 83.38054,29.41638,0 83.37916,29.46611,0 83.34610000000001,29.49666,0 83.28442,29.47443,0 83.28306000000001,29.55111000000001,0 83.19525,29.63083,0 83.11749,29.62056000000001,0 83.09276,29.58305,0 82.9922,29.6725,0 82.90860000000001,29.69444,0 82.85525000000001,29.66889000000002,0 82.71053000000001,29.78972,0 82.71554999999999,29.83194,0 82.65581,29.83527000000001,0 82.55775,29.94277,0 82.23109,30.07527,0 82.17776000000001,30.06361,0 82.15027000000001,30.12556,0 82.17859,30.19055,0 82.10721,30.23083,0 82.10054,30.34222000000001,0 81.80304,30.36361,0 81.63721,30.42444,0 81.55775,30.38194,0 81.54192000000001,30.33056,0 81.42110000000001,30.38528,0 81.37777,30.16667,0 81.29082,30.13055,0 81.30193,30.08361,0 81.22360000000001,30.01027,0 81.10971000000001,30.02472,0 81.02536000000001,30.20436,0 80.99888,30.26194,0 80.80386,30.32666,0 80.75194999999999,30.395,0 80.60693000000001,30.47472,0 80.53888000000001,30.46443,0 80.32193,30.56472,0 80.20699999999999,30.57552,0 80.22776,30.62193,0 80.18749,30.67583000000001,0 80.25027,30.73999,0 80.17831,30.79945,0 80.09415,30.78666000000001,0 80.04192000000001,30.84694,0 79.94981,30.8849,0 79.87916,30.95916,0 79.74887,30.98972,0 79.59943,30.93556,0 79.49413,31.02416,0 79.42249,31.0275,0 79.39324000000001,31.10106,0 79.31499,31.13305,0 79.28665,31.22333,0 79.24026000000001,31.24417,0 79.21748,31.34083,0 79.09248,31.4375,0 79.01859,31.41138,0 79.00555,31.32555,0 78.94193,31.36,0 78.87766000000001,31.29163,0 78.77054,31.305,0 78.79276000000002,31.44333,0 78.71278,31.49833,0 78.84387,31.60417,0 78.79053999999999,31.67472,0 78.74249,31.68499,0 78.69247,31.77417,0 78.74507,31.91036,0 78.7711,31.98111,0 78.68053000000001,32.03527,0 78.54471000000001,32.20943,0 78.47593999999999,32.24305,0 78.47832,32.34999,0 78.44971,32.38694,0 78.4772,32.42471,0 78.39722,32.53111,0 78.42054,32.5661,0 78.6386,32.57778,0 78.70443,32.6311,0 78.76055,32.63556,0 78.78027,32.47887,0 78.97110000000001,32.35082,0 79.09915,32.37638,0 79.13164999999999,32.47499,0 79.25317000000001,32.516,0 79.31386999999999,32.49665,0 79.45722000000001,32.60249,0 79.51443,32.67222,0 79.53027,32.75416,0 79.47083000000001,32.79388,0 79.45027,32.88221,0 79.35609,32.965,0 79.40637,33.16166,0 79.18387,33.22582,0 79.10359,33.21971,0 79.09137,33.27499,0 78.99638000000002,33.31499,0 78.93651,33.408,0 78.91582,33.62944,0 79.04082,33.63943,0 79.01944,33.75444000000001,0 78.94941,33.83221,0 78.90886999999999,33.97028,0 78.97527,34.01721,0 79.42915000000001,34.02166,0 79.5247,34.11805,0 79.51166000000001,34.19027,0 79.57805000000001,34.2086,0 79.53915000000002,34.42999,0 79.72275999999999,34.42054,0 79.7636,34.45499,0 79.7247,34.52999,0 79.84387,34.57444,0 79.8875,34.66276000000001,0 80.07138000000001,34.66945,0 80.10248,34.7747,0 80.20166999999999,34.89388,0 80.19026,35.08764,0 80.29803,35.2075,0 80.28943,35.33999,0 80.38666000000001,35.42528,0 80.38388000000001,35.51111,0 80.29776,35.50333,0 80.2741,35.52753,0 80.20663999999999,35.56193,0 80.14776999999999,35.45722,0 80.05749,35.40777,0 79.96416000000001,35.59583,0 79.91914,35.61749,0 79.85887,35.5661,0 79.81303,35.62943,0 79.69359,35.65083,0 79.63443000000001,35.75916,0 79.65886999999999,35.81916,0 79.58109000000002,35.86971,0 79.46193,35.85804,0 79.43803000000001,35.96054000000001,0 79.32832999999999,35.98638,0 78.93442,35.89249,0 78.74193,35.92027,0 78.62553,35.81666,0 78.29915,35.70194,0 78.17221000000001,35.61943,0 78.13694,35.54333,0 77.97248999999999,35.57417000000001,0 77.92470000000002,35.48972,0 77.82393,35.50133000000001,0 77.7011,35.46111,0 77.43137,35.47165,0 77.30803000000002,35.53472,0 77.18747999999999,35.52805,0 77.07555000000001,35.58777,0 76.91443,35.59777,0 76.86415,35.64888,0 76.77805000000001,35.65526,0 76.7122,35.715,0 76.58971000000001,35.75695,0 76.56416,35.91276,0 76.42165,35.8336,0 76.17693,35.81444,0 76.12387,35.97776,0 75.97275999999999,36.01165,0 75.92609,36.07721,0 75.92303,36.1236,0 75.99387,36.15971,0 75.99359,36.20833,0 76.04166000000001,36.23751,0 75.99082,36.31444,0 76.00499000000001,36.4586,0 75.85526000000002,36.66717,0 75.63916,36.76355,0 75.54637,36.76963,0 75.52303000000001,36.72906,0 75.45444000000001,36.73044,0 75.39722,36.91406000000001,0 75.14444,36.99987,0 74.95972,36.98012,0 74.90166000000001,36.91093,0 74.81749000000001,37.02176000000001,0 74.73943,37.02037,0 74.69081,37.06259,0 74.56543000000001,37.02782,0 74.40054000000001,37.13896,0 74.39722,37.17841,0 74.47942999999999,37.17925,0 74.52970999999999,37.24178,0 74.65109,37.23457,0 74.75110000000001,37.30375,0 74.8111,37.22041,0 74.91575,37.23733,0 74.95804,37.28183,0 75.09665,37.32186,0 75.11109999999999,37.38353,0 75.18747999999999,37.40658,0 74.94942,37.56298,0 74.90277,37.64715,0 74.99109000000001,37.78382,0 74.90277,37.84717,0 74.93665000000001,37.88884,0 74.90833000000001,37.91049,0 74.91361000000001,38.01772,0 74.8147,38.07883,0 74.79443000000001,38.30603,0 74.8647,38.38882,0 74.85664,38.47048,0 74.78859,38.52742,0 74.71833,38.5291,0 74.35471,38.67439,0 74.13415999999999,38.67326,0 74.11081,38.6216,0 74.06052,38.60465,0 74.06887999999999,38.53659,0 73.93665,38.54105000000001,0 73.81776000000001,38.6077,0 73.80219,38.64983,0 73.75776999999999,38.73021,0 73.7625,38.80076,0 73.70499,38.88076,0 73.85332,38.96909,0 73.72165,39.08244,0 73.6172,39.23215,0 73.66998,39.34409,0 73.65569000000001,39.45483,0 73.84805,39.47493000000001,0 73.90248,39.56966,0 73.95609000000002,39.59771000000001,0 73.91080000000001,39.7252,0 73.84444000000001,39.75576,0 73.84498000000002,39.8055,0 73.99442999999999,40.04605000000001,0 74.19803,40.11383,0 74.36219,40.09965,0 74.73054999999999,40.33966,0 74.88443,40.32771,0 74.81026000000001,40.4198,0 74.86026,40.51939000000001,0 75.05888,40.44772,0 75.16137000000001,40.47022,0 75.22554,40.44688,0 75.57805000000001,40.64799,0 75.62276,40.59799,0 75.64554,40.4866,0 75.69664,40.44494,0 75.66137000000001,40.39827,0 75.6972,40.29911,0 75.92886,40.30550000000001,0 75.97803999999999,40.36327,0 76.06805,40.39577,0 76.19414,40.37799,0 76.27748,40.45438,0 76.33859,40.34855,0 76.48693,40.43105,0 76.55304,40.54411,0 76.63943,40.60856,0 76.64971,40.74494,0 76.79359,40.86245,0 76.78194000000001,40.94077,0 76.87387,41.01411,0 77.05831000000001,41.04911,0 77.13805000000001,41.01606,0 77.37747,41.028,0 77.54359000000001,40.98661,0 77.68471,41.00189,0 77.85471,41.0694,0 78.08083000000001,41.04079,0 78.24623,41.16513,0 78.37997,41.28384,0 78.37553,41.37882,0 78.53109000000001,41.46384,0 78.63997999999999,41.483,0 78.69553000000001,41.54301,0 79.20749000000001,41.72828,0 79.30943000000001,41.79134,0 79.43192999999999,41.78216,0 79.65498,41.88218000000001,0 79.77858000000001,41.88717,0 79.87943,42.01635,0 80.25139,42.04245,0 80.28332,42.07968000000001,0 80.23403,42.19622,0 80.2811,42.21218,0 80.29387,42.25218,0 80.23831000000001,42.3633,0 80.21720999999999,42.45051,0 80.24249,42.49051,0 80.18221,42.56802,0 80.17192,42.6605,0 80.26066,42.81941,0 80.57861,42.89108,0 80.56135999999999,42.92635,0 80.44443,42.95468,0 80.37665000000001,43.02524,0 80.64637999999999,43.14135,0 80.74359,43.10775,0 80.8147,43.13997,0 80.76914000000001,43.28886,0 80.66054,43.32884,0 80.73859000000002,43.4719,0 80.55371,43.81323,0 80.43886999999999,43.99219000000001,0 80.43136,44.05303,0 80.36276000000001,44.12524000000001,0 80.39999000000002,44.26414,0 80.34887000000001,44.45024,0 80.40721000000002,44.6022,0 80.37497999999999,44.65607,0 80.51666,44.7072,0 80.52083,44.73248,0 80.26221,44.82443,0 80.00166,44.79776,0 79.87581000000002,44.86554,0 79.87109000000001,44.90497,0 80.12138,45.03942000000001,0 80.39166,45.04915,0 80.46915,45.1111,0 81.05444,45.16608,0 81.68831,45.35082,0 81.79776,45.30581,0 81.81581,45.20053,0 81.94804000000001,45.15748,0 82.29694000000001,45.23775,0 82.48165,45.12748,0 82.54943,45.12331,0 82.63554000000001,45.24053,0 82.64943,45.43026,0 82.3622,45.49552000000001,0 82.31493,45.5448,0 82.51082,45.90192,0 82.57332000000001,46.17305,0 82.70889,46.35415,0 82.87387000000001,46.76359999999999,0 83.01470999999999,46.96027,0 83.03276,47.20416,0 83.18571,47.21664,0 83.56499,47.0611,0 83.90000000000001,46.97721,0 84.11109999999999,46.97166000000001,0 84.29471,47.0075,0 84.53194000000001,46.97527000000001,0 84.67804,46.99361,0 84.77887,46.93166,0 84.73526,46.83694,0 84.75942000000001,46.82638,0 84.96361,46.86415,0 85.25776999999999,47.0511,0 85.52931,47.06016,0 85.57331000000002,47.17694,0 85.68665,47.21194000000001,0 85.70555,47.2836,0 85.70055000000001,47.38388000000001,0 85.60359,47.51943,0 85.62221,47.62111,0 85.53777,47.95999,0 85.61388,48.15833,0 85.75915999999999,48.38777000000001,0 85.86248999999999,48.42527000000001,0 86.23081999999999,48.42527000000001,0 86.34415,48.49527000000001,0 86.46362000000001,48.49361,0 86.59610000000001,48.53611,0 86.64499000000002,48.61639,0 86.78333000000002,48.72776000000001,0 86.75943,48.79361,0 86.82138000000001,48.84665,0 86.75277000000001,48.90028000000002,0 86.73054999999999,48.97222,0 86.87469,49.11083000000001,0 86.99887,49.09944,0 87.16748,49.13304,0 87.34821,49.09261,0 87.46693000000001,49.07972,0 87.52528,49.12915,0 87.8407,49.17296000000001,0 87.98859,49.17722000000001,0 88.1622,49.27222,0 88.13193,49.36833000000001,0 88.22083000000001,49.46166,0 88.65082,49.50055,0 88.73081999999999,49.45083,0 88.89999000000002,49.44332,0 88.8875,49.54361000000001,0 88.92886,49.54639,0 89.01331999999999,49.46360000000001,0 89.23054999999999,49.53667,0 89.19748,49.61111,0 89.22665000000001,49.63833,0 89.37221,49.57972,0 89.45972,49.64999000000001,0 89.71138000000001,49.71472,0 89.73609999999999,49.74889000000001,0 89.6511,49.79527000000002,0 89.67137,49.82083,0 89.6375,49.855,0 89.64270000000001,49.90482999999999,0 89.98526,49.97222000000001,0 90.05137000000003,50.0825,0 90.24443000000001,50.12027,0 90.37858,50.18582000000001,0 90.50973000000001,50.22444000000001,0 90.69859,50.21943,0 90.74860000000001,50.29749,0 90.87025,50.32638000000001,0 91.02970999999999,50.43306,0 91.44748,50.4711,0 91.46776000000001,50.52694000000001,0 91.60693000000001,50.57305,0 91.65886999999999,50.63722000000001,0 91.77222000000002,50.68999000000001,0 91.90556000000002,50.71472000000001,0 92.22137000000002,50.70556,0 92.29498,50.75361,0 92.32693,50.855,0 92.38361000000002,50.87471000000001,0 92.47275999999999,50.78527,0 92.5736,50.75778,0 92.66081,50.68166,0 92.76028,50.71249,0 92.80276000000001,50.79361,0 92.97500000000001,50.7911,0 92.99915,50.7514,0 92.97102,50.66649,0 93.03333000000001,50.6086,0 93.44886,50.62249000000001,0 93.55832000000001,50.58972000000001,0 94.27499,50.56944,0 94.3522,50.41499,0 94.38998000000001,50.21444000000001,0 94.51582999999999,50.16109,0 94.62276,50.02999,0 94.97609,50.0561,0 95.06608,49.96193000000001,0 95.42249000000001,49.95610000000001,0 95.49157,49.9077,0 95.53859,49.89472,0 95.59193000000001,49.94083,0 95.73526,49.95471000000001,0 95.83472,50.02499000000001,0 95.90721000000002,50.01415999999999,0 95.96026999999999,49.94415000000001,0 96.07444,50.00694,0 96.29443999999999,49.94665000000001,0 96.37916,49.89360000000001,0 96.54749,49.92583,0 96.59248000000001,49.86500000000001,0 96.72248999999999,49.9211,0 96.99693000000002,49.89415000000001,0 97.16943000000001,49.76167,0 97.31303,49.7311,0 97.58638000000001,49.84361000000001,0 97.59415000000001,49.92749,0 97.78609,49.96915,0 97.86388000000001,49.93277,0 98.10721000000002,50.04888,0 98.29221,50.29861,0 98.28554,50.41361000000001,0 98.32555000000001,50.51083000000001,0 98.27443,50.56055,0 98.16748,50.56889,0 98.06331000000002,50.63054000000001,0 97.96388,50.77832,0 98.01304,50.85583,0 97.87747,50.92972,0 97.83195000000001,50.98999000000001,0 97.9586,51.22332,0 97.93777,51.31249,0 98.06469000000001,51.46694,0 98.23235,51.45989000000001,0 98.25999,51.51583000000002,0 98.24802,51.5811,0 98.33527000000001,51.71804000000001,0 98.62442,51.77999000000001,0 98.70804000000001,51.82805,0 98.86942999999999,52.03861,0 98.88109,52.11416,0 98.94189,52.14068,0 98.91304,52.2011,0 98.81360000000001,52.18693,0 98.80721,52.27444,0 98.72248999999999,52.29527000000001,0 98.64444,52.26167000000001,0 98.67970000000001,52.36999,0 98.62553,52.42416,0 98.72083000000001,52.46054000000001,0 98.73522000000001,52.5118,0 98.81527,52.52054,0 98.82721000000001,52.53999000000001,0 98.78276,52.57333,0 98.80415000000001,52.61166,0 98.93248000000001,52.65444000000001,0 98.9408,52.79722000000001,0 98.86526000000001,52.79167,0 98.84444000000001,52.83194,0 98.93107999999999,52.925,0 99.20610000000002,52.8511,0 99.24997000000001,52.95378,0 98.98553,53.03444,0 99.06526000000001,53.10249,0 98.92360000000001,53.15388,0 98.8772,53.11944,0 98.68637000000001,53.15611000000001,0 98.60249000000002,53.10139000000001,0 98.29998999999999,53.10055,0 98.28581,53.22721,0 98.03027,53.25054000000001,0 97.96998000000002,53.29639000000001,0 97.96304000000001,53.35999,0 97.59972000000001,53.37138,0 97.58749,53.43888000000001,0 97.44107,53.46027000000002,0 97.33221,53.59999,0 97.12275,53.60944,0 96.88666000000001,53.72887000000001,0 96.72776,53.70665,0 96.68415,53.6386,0 96.60860000000001,53.67583,0 96.57165999999999,53.64554,0 96.5,53.68499000000001,0 96.20721,53.92638,0 96.04943,53.99554,0 96.08167000000003,54.05749000000001,0 96.05332,54.09389000000002,0 95.98803000000001,54.08721,0 95.91805000000002,54.15999,0 95.65860000000002,54.25943,0 95.66303000000004,54.33999,0 95.70526,54.37999,0 95.79082,54.42082000000001,0 95.91577000000002,54.3956,0 95.98665,54.44833,0 95.97638000000001,54.47721000000001,0 96.05582,54.5761,0 96.21720999999999,54.54084,0 96.31582,54.57139000000001,0 96.57083,54.51250000000001,0 96.55053,54.58082,0 96.58888,54.65972,0 96.56192,54.69694,0 96.67359999999999,54.80222000000001,0 96.71527,54.92138000000001,0 96.57777,55.02028,0 96.68692,55.08083,0 96.65192,55.0986,0 96.69721,55.17276,0 96.70055000000001,55.25528,0 96.92027,55.32472,0 96.84137000000001,55.43749,0 96.85526000000002,55.47776,0 96.81721,55.55915,0 96.85582000000001,55.59444000000001,0 96.74638,55.65138000000001,0 96.82471,55.69749,0 96.75526000000002,55.74722,0 96.82111,55.79166,0 96.96971000000001,55.85583,0 96.98054999999999,56.02221999999999,0 97.0611,56.02556,0 97.12361,56.11639,0 97.35220000000001,56.04861,0 97.43248,56.09583000000001,0 97.42859,56.14666,0 97.58693000000001,56.18943000000001,0 97.55663000000001,56.3875,0 97.88193,56.39249000000002,0 97.87943,56.55944,0 97.74498,56.55860000000001,0 97.77528000000002,56.6075,0 97.75193000000003,56.64054,0 97.78581,56.66415000000001,0 97.75027000000002,56.70417000000001,0 97.77609,56.78054,0 97.48581000000003,56.81028,0 97.48055000000001,56.89111000000001,0 97.62302,56.95528000000001,0 97.47693000000001,56.96444,0 97.34009000000002,57.04317,0 97.91721,57.80694,0 98.76944,57.79166000000001,0 98.85415999999999,57.72804,0 98.97415,57.72165,0 99.08414999999999,57.77416,0 99.42165000000001,57.79333000000001,0 99.49442999999999,57.93415,0 99.61971,58.00166,0 99.61582,58.04805000000001,0 99.68193000000001,58.08111,0 99.80138000000001,58.05721,0 100.0441,58.07944,0 100.0775,58.0561,0 100.0767,57.96111,0 100.123,57.86554,0 100.2744,57.80915,0 100.2664,57.76139,0 100.373,57.7311,0 100.328,57.68250000000001,0 100.3664,57.67556,0 100.3461,57.63833,0 100.3958,57.59887,0 100.4036,57.54804,0 100.6505,57.47444,0 100.7419,57.40193000000001,0 100.855,57.465,0 100.9112,57.44835,0 100.9628,57.50083000000001,0 100.9391,57.51583,0 100.9536,57.5611,0 100.8461,57.60999000000001,0 100.7969,57.66833000000001,0 100.8911,57.77361,0 100.84,57.80083000000001,0 100.8505,57.84222,0 100.8077,57.88611,0 100.953,57.86694000000001,0 101.0353,57.89804000000001,0 101.0281,57.92249000000002,0 101.1394,57.98249,0 101.1583,58.02471000000001,0 101.1608,58.06055,0 101.105,58.10528,0 101.1097,58.11528000000001,0 101.2161,58.14444,0 101.2764,58.21861000000001,0 101.5347,58.22471,0 101.685,58.41888,0 102.1944,58.52527000000001,0 102.3105,58.64527,0 102.5114,58.71667,0 102.5669,58.79694,0 102.54,58.89777000000001,0 102.4369,58.94304000000001,0 102.4508,59.00111,0 102.4044,59.07249000000001,0 102.4433,59.14471,0 102.5353,59.19166000000001,0 102.8286,59.21194,0 102.8717,59.26527999999999,0 103.0155,59.32193,0 103.0822,59.26416,0 103.1644,59.25999000000001,0 103.2064,59.28972,0 103.3264,59.26082000000002,0 103.338,59.22721,0 103.2366,59.2286,0 103.2444,59.17944,0 103.3892,59.02138000000002,0 103.5383,58.98611,0 103.5919,58.95193,0 103.5928,58.91304,0 103.8933,58.90555,0 103.9542,58.84859,0 103.9458,58.76582,0 103.8558,58.73498000000001,0 103.9922,58.73555,0 104.0444,58.77304,0 104.2364,58.75866000000001,0 104.2836,58.71305000000001,0 104.3991,58.69915000000001,0 104.3936,58.64526,0 104.4583,58.60054,0 104.5233,58.63832000000001,0 104.5828,58.61415,0 104.6314,58.64804,0 104.795,58.66859,0 104.8733,58.72164000000001,0 104.7558,58.81526000000001,0 104.8386,58.89443,0 105.085,58.99277,0 105.1439,59.04582,0 105.3628,59.09499,0 105.3019,59.14861000000001,0 105.3319,59.1986,0 105.2961,59.26111,0 105.1841,59.31055000000001,0 105.2455,59.35082,0 105.2094,59.40192,0 105.2136,59.40777,0 105.2308,59.42527000000001,0 105.183,59.47305,0 104.9853,59.46028,0 104.8828,59.52527,0 104.8561,59.55110000000001,0 104.8769,59.58582,0 104.8005,59.6361,0 104.7944,59.69332,0 104.8922,59.75027000000001,0 105.0191,59.77083,0 105.0191,59.83721,0 105.1853,59.86027000000001,0 105.3783,59.82083000000001,0 105.4952,59.84554000000001,0 105.4305,59.89388,0 105.4889,60.01194000000002,0 105.4208,60.10999000000001,0 105.4786,60.19249,0 105.4772,60.25443,0 105.3758,60.24917000000001,0 105.2967,60.29860999999999,0 105.2219,60.27528,0 104.8772,60.30388000000001,0 104.7642,60.38221,0 104.6539,60.40249,0 104.6764,60.42499999999999,0 104.6414,60.49416000000002,0 104.568,60.54084,0 104.5577,60.61721,0 104.5167,60.63332,0 104.6022,60.74333000000001,0 104.4569,60.83972,0 104.6344,60.89388,0 104.5597,60.94554000000001,0 104.6144,60.97639,0 104.6,61.00054,0 104.6419,61.03804,0 104.6003,61.05416,0 104.6147,61.07444,0 104.7103,61.08999000000001,0 104.835,61.17776000000001,0 105.0119,61.17749,0 104.9628,61.26498999999999,0 104.9314,61.26944,0 104.9272,61.31944,0 104.785,61.34943,0 105,61.40661000000001,0 105.2758,61.41999,0 105.2736,61.47805000000002,0 105.3664,61.53278,0 105.5575,61.56554000000001,0 105.5925,61.61721,0 105.6947,61.64943,0 105.8028,61.61776,0 105.8647,61.67389,0 105.9491,61.68333,0 105.8894,61.82305000000001,0 106.0431,61.90277,0 106.0478,61.9086,0 106.2,61.99749000000001,0 106.4133,62.02750000000001,0 106.3789,62.06528,0 106.4097,62.08472,0 106.373,62.10277,0 106.4475,62.18581,0 106.4477,62.24167,0 106.3192,62.26194000000001,0 106.3939,62.31777000000001,0 106.4792,62.31721000000002,0 106.4275,62.38388,0 106.5308,62.37249000000001,0 106.7144,62.47721000000001,0 106.6533,62.53833,0 106.7072,62.58277,0 106.8144,62.59972,0 106.4691,62.68166000000001,0 106.5258,62.74722000000001,0 106.4678,62.77694,0 106.4447,62.84361,0 106.2161,62.8961,0 106.2194,62.94194000000001,0 106.1561,62.9586,0 106.1875,62.98611,0 106.1216,63.05833000000001,0 106.3033,63.07277,0 106.4108,63.11527000000001,0 106.3836,63.1461,0 106.433,63.20055,0 106.3583,63.21999,0 106.3619,63.27139,0 106.4441,63.33111,0 106.6741,63.29667,0 106.7364,63.3686,0 106.5069,63.49166000000002,0 106.685,63.61361000000001,0 106.6283,63.69833,0 106.7972,63.84415,0 106.6803,63.92499,0 106.7028,63.98555000000002,0 106.8603,63.97721,0 107.0714,63.88528,0 107.1819,63.95361,0 107.2911,63.95083,0 107.3592,63.86775999999999,0 107.5628,63.85695000000001,0 107.6219,63.91361000000001,0 107.6194,63.9575,0 107.6792,63.98999,0 108.2619,63.99083000000002,0 108.3222,64.03943,0 108.2211,64.20833,0 108.15,64.24082,0 108.1253,64.24054,0 108.0265,64.22346,0 108.14,64.26221,0 108.3075,64.24915,0 108.3569,64.30081,0 108.4614,64.28581,0 + + + 1 + + + + + +112.8831,77.93326,0 112.5097,77.85098000000001,0 112.5144,79.90003,0 112.5259,84.90002,0 112.5374,89.90000000000001,0 113.5351,89.90000000000001,0 114.5329,89.90000000000001,0 115.5306,89.90000000000001,0 116.5284,89.90000000000001,0 117.5262,89.90000000000001,0 118.5239,89.90000000000001,0 119.5217,89.90000000000001,0 120.5195,89.90000000000001,0 121.5172,89.90000000000001,0 122.515,89.90000000000001,0 123.5128,89.90000000000001,0 124.5105,89.90000000000001,0 125.5083,89.90000000000001,0 126.5061,89.90000000000001,0 127.5038,89.90000000000001,0 127.5198,84.90002,0 127.5317,81.16092,0 122.6489,80.08503,0 117.766,79.00914,0 112.8831,77.93326,0 + + + 1 + + + + + GMT +09:00 + + +]]> + #khStyle0900 + + + + + +131.1522,-31.47416,0 131.7691,-31.72222,0 132.0908,-31.92111,0 132.2039,-32.03168,0 132.4142,-32.01167,0 132.4794,-32.03251,0 132.4508,-31.97277,0 132.5491,-31.93889,0 132.7644,-31.95084,0 132.8355,-31.97972,0 132.9774,-32.11306,0 133.0591,-32.11473,0 133.1447,-32.20583,0 133.1855,-32.18666,0 133.2672,-32.22084000000001,0 133.3041,-32.19694,0 133.4172,-32.21334,0 133.5382,-32.32338,0 133.7763,-32.43159,0 133.8505,-32.54055,0 133.9055,-32.54501,0 133.9314,-32.50084,0 133.9938,-32.50611,0 134.0355,-32.46389,0 134.143,-32.4575,0 134.2822,-32.60000000000001,0 134.2969,-32.68028,0 134.2241,-32.78389,0 134.2144,-32.81306,0 134.1941,-32.79029,0 134.2177,-32.72834,0 134.0683,-32.71667,0 134.1294,-32.84277,0 134.0611,-32.92139,0 134.1947,-32.95223,0 134.2039,-33.01112,0 134.1478,-33.0275,0 134.2355,-33.05140000000001,0 134.2691,-33.15972,0 134.3375,-33.20403,0 134.4536,-33.4363,0 134.4445,-33.78327,0 134.6956,-33.95219,0 135.0562,-34.44981,0 135.1056,-34.59302,0 135.2188,-34.56417,0 135.3219,-34.62166,0 135.3488,-34.65305,0 135.3225,-34.69111,0 135.4747,-34.75111,0 135.6061,-34.89305,0 135.6241,-34.95361,0 135.6778,-34.95555,0 135.7213,-34.86861,0 135.7867,-34.86029,0 135.928,-34.95945,0 135.9541,-35.01028,0 136.4239,-35.18024,0 136.4753,-35.25469,0 136.4895,-35.57197,0 136.5725,-35.77633,0 136.5344,-35.9125,0 136.6678,-35.98778,0 136.7164,-36.07168,0 136.8466,-36.03083,0 136.9061,-36.06028,0 137.0161,-36.02695,0 137.1566,-36.04361,0 137.2219,-35.98361000000001,0 137.3544,-36.00195,0 137.4577,-36.08666,0 137.6141,-36.01472,0 137.6055,-35.92945,0 137.7494,-35.86777,0 137.9289,-35.87666,0 138.038,-35.92418,0 138.1369,-35.855,0 138.2088,-35.71732000000001,0 138.3009,-35.65432,0 138.5355,-35.65445,0 138.6555,-35.56056,0 138.8005,-35.53694,0 139.2314,-35.76361,0 139.573,-36.0925,0 139.8269,-36.57778,0 139.8616,-36.66639,0 139.8547,-36.82611,0 139.8003,-36.89472,0 139.6697,-36.96362,0 139.7314,-37.00973000000001,0 139.7411,-37.08278,0 139.7803,-37.10778,0 139.7836,-37.15361,0 139.7375,-37.17805,0 139.8144,-37.29973,0 140.0022,-37.50501000000001,0 140.0408,-37.48721,0 140.1283,-37.53612,0 140.1141,-37.58055,0 140.228,-37.65944,0 140.405,-37.92805,0 140.675,-38.06861,0 140.968,-38.06421,0 141.2825,-38.22084,0 141.4022,-38.3289,0 141.3842,-38.39889,0 141.4694,-38.37527,0 141.5472,-38.44305,0 141.5908,-38.39917,0 141.6536,-38.40222,0 141.6213,-38.31751,0 141.7436,-38.26751,0 141.9619,-38.29083,0 142.163,-38.40111,0 142.3813,-38.36362,0 142.4572,-38.40722,0 142.5023,-38.37652,0 142.5023,-43.37653,0 142.5023,-48.37652000000001,0 142.5023,-53.37653,0 142.5023,-58.37653000000002,0 142.5023,-63.37653000000001,0 142.5023,-68.37653,0 142.5023,-73.37653,0 142.5023,-75.57653000000001,0 142.5023,-80.57653000000001,0 142.5023,-85.57653000000001,0 142.5023,-88.17653,0 142.5023,-89.90000000000001,0 141.5026,-89.90000000000001,0 140.503,-89.90000000000001,0 139.5034,-89.90000000000001,0 138.5038,-89.90000000000001,0 137.5042,-89.90000000000001,0 136.5045,-89.90000000000001,0 135.5049,-89.90000000000001,0 134.5053,-89.90000000000001,0 133.5057,-89.90000000000001,0 132.5061,-89.90000000000001,0 131.5064,-89.90000000000001,0 130.5068,-89.90000000000001,0 129.5072,-89.90000000000001,0 128.5076,-89.90000000000001,0 127.508,-89.90000000000001,0 127.508,-84.89999,0 127.508,-82.02666000000001,0 127.508,-77.02666000000001,0 127.508,-72.02666000000001,0 127.508,-68.42665,0 127.508,-63.42665,0 127.508,-58.42665,0 127.508,-53.42665000000001,0 127.508,-48.42665000000001,0 127.508,-43.42665,0 127.508,-38.42665,0 127.508,-33.42665,0 127.508,-32.22667,0 127.7539,-32.1286,0 128.0039,-32.09223,0 128.2483,-32.01084,0 129.0003,-31.69261,0 130.1489,-31.57916000000001,0 130.838,-31.60584,0 131.1522,-31.47416,0 + + + 1 + + + + + +140.948,46.03066,0 145.5292,44.44866,0 145.6765,43.53654,0 145.8775,43.38366,0 145.8579,43.31955,0 145.8469,43.2832,0 145.5455,43.11722,0 144.8695,42.9269,0 144.7778,42.92555,0 144.4636,42.93083,0 144.325,42.99805,0 144.0244,42.92139,0 143.8928,42.84916,0 143.5955,42.61971000000001,0 143.3738,42.36167,0 143.3297,42.28167,0 143.3169,42.04277,0 143.2463,41.92527,0 142.943,42.10665,0 142.501,42.25373,0 142.501,37.25373,0 142.501,32.25372,0 142.501,28.64826,0 137.5011,28.62327,0 135.5122,28.61333,0 135.5122,23.61333000000001,0 135.5122,19.23089,0 140.5122,19.23089,0 142.501,19.23089,0 142.501,14.23089,0 142.501,12,0 138.3636,12,0 137,11.16666,0 137,6.166665000000001,0 137,1.199996,0 141,-5.400000000000001e-007,0 141.0025,-2.607085,0 141.0035,-4.128462,0 141.007,-9.128467000000001,0 142.1419,-10.95666,0 142.1589,-11.14944,0 142.1241,-11.36722,0 141.9422,-11.95472,0 142.0289,-12.06221,0 141.9644,-12.04084,0 141.9175,-12.10528,0 141.8905,-11.98833,0 141.91,-11.95944,0 141.8524,-11.98445,0 141.7503,-12.205,0 141.8058,-12.2375,0 141.7161,-12.23305,0 141.6689,-12.38195,0 141.6658,-12.38666,0 141.593,-12.5575,0 141.6953,-12.54805,0 141.6544,-12.52833,0 141.6614,-12.44833,0 141.7444,-12.46111,0 141.6941,-12.50445,0 141.7589,-12.53222,0 141.7722,-12.57361,0 141.8191,-12.59695,0 141.9255,-12.56111,0 141.9753,-12.58944,0 141.8892,-12.60916,0 141.8297,-12.66278,0 141.9172,-12.71805,0 142.005,-12.72166,0 141.908,-12.75028,0 141.935,-12.91111,0 141.8905,-12.84639,0 141.8686,-12.70084,0 141.8158,-12.70361,0 141.8055,-12.67195,0 141.7597,-12.80805,0 141.6522,-12.9125,0 141.6299,-12.89528,0 141.5839,-12.98916,0 141.6883,-13.26083,0 141.6678,-13.34778,0 141.6297,-13.35416,0 141.5269,-13.57416,0 141.4661,-13.90667,0 141.6,-14.13445,0 141.5916,-14.26473,0 141.5203,-14.475,0 141.5677,-14.76889,0 141.6658,-15.03611,0 141.4605,-15.53611,0 141.3758,-15.92944,0 141.4269,-16.07917,0 141.3486,-16.21916,0 141.3269,-16.33195,0 141.2119,-16.6725,0 141.1299,-16.78083,0 141.0764,-16.80333,0 141.0511,-16.88389000000001,0 140.9491,-17.01362,0 140.8774,-17.37833,0 140.8352,-17.45027,0 140.758,-17.47778,0 140.7361,-17.52,0 140.3966,-17.67334,0 140.0514,-17.71806,0 139.9819,-17.70027,0 139.9308,-17.63139,0 139.8091,-17.57223,0 139.6219,-17.52556,0 139.4717,-17.40412,0 139.4543,-17.27115,0 139.4833,-17.18898,0 139.5816,-17.09876,0 139.5639,-17.02948,0 139.5075,-16.98919,0 139.4736,-16.83612,0 139.5574,-16.67661,0 139.7443,-16.50259,0 139.7379,-16.44136,0 139.5574,-16.3898,0 139.4543,-16.43814,0 139.3061,-16.45425,0 139.1562,-16.5896,0 139.1192,-16.78778,0 138.9894,-16.89061,0 138.8486,-16.87777,0 138.6466,-16.77973,0 138.4869,-16.78778,0 138.3039,-16.75112,0 138.1902,-16.705,0 138.0003,-16.55472,0 137.8605,-16.44,0 137.7355,-16.24916,0 137.4283,-16.15722,0 137.2488,-16.02194,0 137.0683,-15.93743,0 137.0997,-15.77525,0 137.0845,-15.66302,0 136.8828,-15.49533,0 136.7517,-15.55584,0 136.5764,-15.50668,0 136.4158,-15.62276,0 136.2791,-15.56722,0 136.2122,-15.39445,0 135.9369,-15.25361,0 135.7971,-15.14682,0 135.7612,-14.96609,0 135.7868,-14.90858,0 136.9212,-14.31743,0 136.9755,-14.26311,0 136.9308,-13.75824,0 136.7199,-13.64,0 136.6489,-13.01466,0 136.645,-12.9575,0 136.5392,-12.91639,0 136.5514,-12.88611,0 136.4843,-12.84594,0 136.4677,-12.78111,0 136.5397,-12.8175,0 136.5486,-12.74361,0 136.6186,-12.83584,0 136.6055,-12.72083,0 136.6808,-12.71029,0 136.6978,-12.62306,0 136.7683,-12.56972,0 136.7325,-12.48722,0 136.7986,-12.45667,0 136.7831,-12.545,0 136.9172,-12.3875,0 136.9794,-12.36139,0 136.9386,-12.35639,0 136.9336,-12.28694,0 136.8573,-12.21335,0 136.8317,-12.06468,0 136.6352,-11.74354,0 136.5952,-11.40484,0 136.7342,-11.20672,0 136.7838,-11.04376,0 136.7646,-11.00381,0 136.4738,-11.45757,0 136.2765,-11.5646,0 135.9633,-11.67485,0 135.0559,-11.9113,0 134.8282,-12.03977,0 134.8014,-12.04333,0 134.7661,-11.95055,0 134.6986,-11.9575,0 134.5941,-12.06611,0 134.415,-12.0575,0 134.2805,-11.97417,0 134.1855,-12.08277,0 134.1664,-11.97194,0 134.1997,-11.95861,0 134.1411,-11.88139,0 134.0841,-11.92805,0 134.045,-11.8425,0 133.9511,-11.91222,0 133.875,-11.89139,0 133.8352,-11.82695,0 133.9391,-11.75611,0 133.9136,-11.72722,0 133.8262,-11.72145,0 133.5198,-11.51235,0 133.479,-11.45118,0 132.5958,-10.95671,0 132.4684,-11.01023,0 132.346,-11.12238,0 131.9803,-11.11982,0 131.807,-11.1912,0 131.259,-11.1861,0 131.1188,-11.25238,0 130.8333,-11.31863,0 130.6982,-11.31863,0 130.5147,-11.27021,0 130.4051,-11.14532,0 130.3643,-11.16826,0 130.3516,-11.28041,0 130.2445,-11.33648,0 130.14,-11.47157,0 129.9998,-11.77998,0 130.0941,-11.84624,0 130.3133,-11.79272,0 130.4637,-11.85899,0 130.558,-12.07055,0 130.5766,-12.40278,0 130.6177,-12.43278,0 130.5875,-12.4575,0 130.6049,-12.49861,0 130.5733,-12.5825,0 130.6194,-12.60833,0 130.5536,-12.63029,0 130.598,-12.67666,0 130.6953,-12.7025,0 130.5855,-12.71472,0 130.505,-12.60221,0 130.5094,-12.65834,0 130.4433,-12.63083,0 130.3972,-12.68722,0 130.3558,-12.67,0 130.3408,-12.87611,0 130.235,-12.9475,0 130.1855,-12.9075,0 130.1408,-12.92416,0 130.1157,-13.14503,0 130.0907,-13.21581,0 130.2073,-13.22924,0 130.3264,-13.35389,0 130.2542,-13.32889,0 130.145,-13.45973,0 129.9861,-13.52778,0 129.9136,-13.51389,0 129.8861,-13.44528,0 129.8708,-13.50194,0 129.8275,-13.51945,0 129.7827,-13.69221,0 129.7844,-13.76305,0 129.8105,-13.75167,0 129.8152,-13.77779,0 129.7169,-13.86722,0 129.75,-13.93222,0 129.7327,-13.99472,0 129.6308,-14.04056,0 129.5977,-13.99945,0 129.6136,-14.05833,0 129.5889,-14.09722,0 129.4789,-14.04722,0 129.4925,-14.14223,0 129.4122,-14.23111,0 129.3632,-14.4277,0 129.4171,-14.63216,0 129.3895,-14.71341,0 129.0917,-14.90135,0 129,-14.87108,0 128.5417,-14.75778,0 128.3877,-14.79719,0 128.3259,-14.71017,0 128.2153,-14.69975,0 128.0697,-14.64584,0 128.0036,-14.56111,0 127.9453,-14.57639,0 127.9494,-14.52667,0 127.8855,-14.47277,0 127.8514,-14.48222,0 127.865,-14.42056,0 127.8247,-14.44444,0 127.8228,-14.38694,0 127.7605,-14.30055,0 127.6136,-14.13611,0 127.5044,-14.06334,0 127.4466,-14.05916,0 127.4278,-13.95666,0 127.3967,-13.965,0 127.3328,-13.90662,0 127.3328,-8.906616,0 127.3328,-7.298002000000002,0 125.441,-7.306758,0 125.441,-3.067723,0 124.3024,-3.067723,0 124.3024,-1.202193,0 127.1436,2.912129,0 127.5079,3.439736,0 127.5079,8.439740000000001,0 127.5079,13.43974,0 127.5079,18.43974,0 127.5079,23.43974,0 127.5079,23.5489,0 122.8135,23.56643,0 122.8135,27.5252,0 127.5079,27.5252,0 127.5079,32.5252,0 127.5079,32.96414,0 124.1097,32.96414,0 124.1097,37.96414,0 124.1097,39.48034,0 124.3702,40.0028,0 124.3736,40.09361,0 124.5547,40.24222000000001,0 124.7084,40.30505,0 124.7433,40.37,0 124.8328,40.40915,0 124.8805,40.47054,0 125.04,40.45722,0 125.0178,40.53082,0 125.248,40.60388,0 125.2861,40.64749,0 125.4058,40.62082,0 125.4642,40.7136,0 125.5447,40.7186,0 125.5641,40.77832,0 125.6803,40.76554,0 125.6531,40.82166,0 125.7619,40.88361,0 125.8214,40.86139,0 125.8786,40.89472,0 126.0169,40.89999,0 125.9775,40.91331,0 126.0733,40.97305,0 126.1322,41.04416000000001,0 126.1239,41.08111,0 126.2792,41.15277,0 126.4561,41.35722,0 126.5272,41.3575,0 126.5008,41.43194,0 126.5844,41.56860000000001,0 126.5633,41.61092,0 126.6151,41.66418,0 126.7222,41.69804000000001,0 126.6789,41.72444,0 126.6947,41.74027,0 126.7869,41.69222,0 126.7975,41.7311,0 126.9361,41.79444,0 126.9364,41.76305,0 127.0453,41.72444,0 127.078,41.68194,0 127.04,41.67194,0 127.057,41.64351,0 127.1786,41.58749,0 127.1022,41.53528,0 127.2872,41.50111,0 127.2708,41.4725,0 127.5391,41.46361,0 127.5572,41.42972,0 127.6475,41.40277,0 127.8583,41.40444,0 127.8739,41.43943,0 127.9814,41.42276,0 128.0008,41.44555,0 128.0208,41.4086,0 128.0475,41.41888,0 128.0441,41.38943,0 128.1061,41.39415,0 128.1127,41.36971,0 128.2044,41.41667000000001,0 128.3019,41.57778,0 128.1019,41.7961,0 128.0589,42.00332,0 128.2825,42.03916,0 128.4894,41.99555,0 128.7291,42.04695,0 128.9122,42.0211,0 128.9577,42.08111,0 129.0141,42.0942,0 129.2102,42.21721,0 129.1758,42.23499,0 129.2244,42.29639,0 129.1905,42.31333,0 129.2377,42.32194,0 129.24,42.37417,0 129.3441,42.41471,0 129.3419,42.44583,0 129.4422,42.43443000000001,0 129.5397,42.36361,0 129.5908,42.44526,0 129.7119,42.44415,0 129.725,42.56139,0 129.7608,42.60332,0 129.7427,42.64083,0 129.7875,42.675,0 129.7533,42.69415,0 129.7578,42.72971,0 129.8512,42.95998,0 129.9056,42.96999,0 129.8756,42.9897,0 129.9075,43.00581,0 129.9996,42.96142,0 130.1075,42.97833,0 130.1358,42.96221,0 130.1008,42.91194,0 130.2522,42.89249,0 130.2433,42.71833,0 130.4255,42.60222,0 130.4372,42.545,0 130.4725,42.55694,0 130.4614,42.59389,0 130.5147,42.60222,0 130.5675,42.44305,0 130.6044,42.42186,0 130.6591,42.37665,0 130.655,42.31388,0 130.6974,42.29221,0 130.7539,42.34749,0 130.7789,42.45194,0 130.8305,42.46388,0 130.8383,42.51832,0 130.8711,42.52333,0 130.7703,42.59638,0 130.7258,42.575,0 130.7366,42.61361,0 130.6733,42.64749,0 130.7108,42.68499,0 130.8411,42.6875,0 130.7861,42.64277,0 130.9528,42.645,0 130.93,42.61388,0 130.8191,42.62693,0 130.9253,42.59333,0 131.0228,42.645,0 131.1022,42.61804,0 131.1133,42.66444,0 131.1397,42.60917,0 131.1919,42.59527,0 131.1678,42.57138,0 131.2207,42.55566000000001,0 131.4794,42.62341,0 131.486,42.78592,0 131.8044,42.90532000000001,0 132.0598,43.06119,0 132.1858,43.00813,0 132.2953,42.74943,0 132.3549,42.70301000000001,0 132.4611,42.77265,0 132.6667,42.8224,0 132.853,42.73888,0 132.8878,42.80555,0 132.9905,42.82054,0 133.0775,42.7411,0 133.0008,42.72222,0 133.0236,42.68776,0 133.1583,42.68306,0 133.2269,42.74249,0 133.3747,42.7575,0 133.5944,42.84694,0 133.6602,42.85443,0 133.7105,42.81332,0 133.86,42.90387,0 133.9142,42.87555,0 134.115,42.99722,0 134.1883,43.07972000000001,0 134.4167,43.14833,0 134.6997,43.30111,0 134.7639,43.30694,0 134.9686,43.4586,0 135.1297,43.49888,0 135.2225,43.6386,0 135.2266,43.68749,0 135.1833,43.70943,0 135.2497,43.72915,0 135.273,43.68639,0 135.42,43.75417,0 135.5178,43.88499,0 135.4769,43.8761,0 135.4572,43.94332,0 135.5128,43.92139,0 135.5305,43.99166000000001,0 135.6319,44.04944,0 135.6483,44.15943,0 135.7216,44.23499,0 135.8005,44.26333,0 135.8847,44.39832,0 136.1844,44.51305,0 136.2491,44.67194,0 136.3336,44.70361,0 136.3075,44.73777000000001,0 136.3608,44.79027,0 136.4413,44.76832,0 136.4497,44.82695,0 136.5533,44.88889,0 136.5547,44.93833000000001,0 136.6522,45.02804,0 136.7622,45.08721,0 136.8167,45.19554,0 137.1414,45.37028,0 137.3383,45.57721,0 137.6569,45.78221,0 137.7037,45.85810000000001,0 140.948,46.03066,0 + + + 1 + + + + + +142.5194,79.90000000000001,0 142.5194,77.68817,0 138.667,77.71629,0 133.9557,76.04201000000001,0 131.8621,75.29801999999999,0 131.8621,71.38942,0 132.2701,66.40608,0 132.678,61.42275999999999,0 132.8709,59.06711,0 132.8588,59.02208000000001,0 132.9268,58.97153000000001,0 132.905,58.92134000000001,0 132.6281,58.88062,0 132.5582,58.80028999999999,0 132.5681,58.63096000000001,0 132.539,58.58086,0 132.404,58.50661,0 132.2431,58.51441000000001,0 132.1915,58.47281,0 132.2631,58.30735,0 132.0923,58.2122,0 132.1542,58.06819,0 131.732,58.18654,0 131.5646,58.1936,0 131.5448,58.17016000000001,0 131.5467,58.14072,0 131.6564,58.07726000000001,0 131.6874,58.0066,0 131.8208,57.9631,0 131.8702,57.83329000000001,0 132.1476,57.72349000000001,0 132.0838,57.63795,0 131.8647,57.60706,0 131.6878,57.45025,0 131.66,57.27824,0 131.5491,57.25599,0 131.2796,57.36280000000001,0 131.2694,57.28938,0 131.1433,57.21137000000001,0 131.1787,57.17673,0 131.3337,57.16616000000001,0 131.5165,57.0938,0 131.8783,56.76854,0 131.7752,56.62872,0 131.7346,56.49774000000001,0 131.5154,56.54887000000001,0 131.4501,56.48512000000001,0 131.3082,56.48672,0 131.182,56.41776000000001,0 131.1664,56.29863,0 130.974,55.9278,0 131.0924,55.7413,0 131.0922,55.68167,0 131.5875,55.7055,0 131.8277,55.67754,0 132.2958,55.75039,0 132.5187,55.73038,0 132.6783,55.64597,0 132.6778,55.5961,0 132.6198,55.5598,0 132.6032,55.50863,0 132.8499,55.45721000000001,0 132.9172,55.40487,0 132.7062,55.3788,0 132.5812,55.26958,0 132.4052,55.2324,0 132.3182,55.10742,0 132.102,55.05344000000001,0 131.8497,54.86316000000001,0 131.6391,54.78865,0 131.4381,54.76270000000001,0 131.2688,54.64863,0 131.2404,54.51491,0 131.1084,54.36098,0 131.0439,54.32481000000001,0 130.7881,54.30889,0 130.5956,54.16706,0 130.4401,53.95286000000001,0 130.4453,53.91442,0 130.5371,53.88297000000001,0 130.6684,53.88879,0 130.7704,53.82110999999999,0 130.8468,53.80831,0 131.0603,53.87516000000001,0 131.369,53.75986,0 131.4433,53.50145,0 131.4033,53.26408,0 131.4342,53.24406,0 131.7383,53.28881000000001,0 131.8331,53.2546,0 131.8363,53.20384,0 131.9606,53.16412,0 132.0767,53.2618,0 132.1492,53.28006000000001,0 132.7966,53.23391,0 132.9397,53.31208,0 133.1567,53.32175,0 133.2816,53.50229000000001,0 133.5405,53.55013,0 133.6865,53.48001000000001,0 133.7953,53.50423,0 134.045,53.46778000000001,0 134.4765,53.65137,0 134.8939,53.42523000000001,0 134.8608,53.39223,0 134.8063,53.39867,0 134.7772,53.35156000000001,0 134.8416,53.30129,0 134.8581,53.2211,0 134.6294,52.97923,0 134.572,52.87017000000001,0 134.5818,52.77556,0 134.7453,52.68349,0 134.605,52.58288,0 134.5947,52.53989,0 134.644,52.49686,0 134.5898,52.42293,0 134.1073,52.49435,0 133.9606,52.47187,0 133.4076,52.67120000000001,0 133.2485,52.66451,0 133.1741,52.56192000000001,0 133.2161,52.52879,0 133.1884,52.43139000000001,0 133.3646,52.27884,0 133.3551,52.22758,0 133.1079,52.16774000000001,0 132.7906,52.16892,0 132.5923,52.10018000000001,0 132.4668,51.94439000000001,0 132.3687,51.9752,0 132.2938,51.84838000000001,0 132.2201,51.81065,0 132.0319,51.81518,0 131.6162,51.66434000000002,0 131.3763,51.68487,0 131.4344,51.40771,0 131.4163,51.37443,0 131.1841,51.33065,0 131.1296,51.25358000000001,0 130.8823,51.1259,0 130.8353,51.0568,0 130.6651,50.99669,0 130.649,50.9649,0 130.7764,50.89289,0 130.5924,50.61773000000001,0 130.6539,50.59364000000001,0 130.7555,50.65919000000002,0 130.8691,50.65911,0 130.9657,50.59039000000001,0 130.9257,50.52943,0 130.84,50.48763,0 130.848,50.43361,0 131.0443,50.37701,0 131.2058,50.37281,0 131.4482,50.18406000000001,0 131.3611,50.08953,0 131.4545,49.94840000000001,0 131.4792,49.77464,0 131.4655,49.74212,0 131.3354,49.7038,0 131.3988,49.67189000000001,0 131.456,49.56964,0 131.4312,49.3426,0 131.3584,49.25607,0 131.0539,49.22533,0 130.9823,49.16279999999999,0 130.9003,48.97752000000001,0 130.5996,48.93345,0 130.5044,48.85194,0 130.418,48.8961,0 130.2289,48.86221,0 129.9164,49.02963,0 129.9127,49.08241,0 129.833,49.11796,0 129.8474,49.15796000000001,0 129.7327,49.19294,0 129.7219,49.26626,0 129.545,49.29318,0 129.5235,49.39124,0 129.4122,49.43176,0 129.3691,49.41396000000001,0 129.3535,49.3423,0 129.1997,49.39059000000001,0 129.0769,49.35279,0 128.9927,49.44165,0 128.8752,49.47776,0 128.7525,49.46804000000001,0 128.8025,49.55916,0 128.6689,49.61193,0 128.6259,49.56967000000001,0 128.5052,49.58694,0 128.1911,49.53416000000001,0 128.075,49.54222000000001,0 127.9744,49.60249000000001,0 127.8214,49.5911,0 127.6914,49.66721,0 127.6717,49.74889000000001,0 127.5419,49.78249000000001,0 127.5083,49.82,0 127.5314,49.91972000000001,0 127.4878,49.98055000000002,0 127.4883,50.04221,0 127.5697,50.12833,0 127.5861,50.20856,0 127.3366,50.31027,0 127.3542,50.41332,0 127.2894,50.46027000000001,0 127.3677,50.57083,0 127.28,50.68083,0 127.2972,50.73249,0 127.2175,50.78416,0 127.1272,50.91555,0 126.9305,51.05999000000001,0 126.8986,51.18665,0 126.9755,51.31360999999999,0 126.8611,51.30693999999999,0 126.8933,51.23915000000001,0 126.8161,51.26639000000001,0 126.8214,51.33028000000001,0 126.9019,51.33943,0 126.9153,51.37915,0 126.7905,51.42443000000001,0 126.8247,51.50139,0 126.8025,51.53694,0 126.6728,51.57471,0 126.7292,51.63833000000001,0 126.7214,51.7086,0 126.6414,51.74527,0 126.4422,51.98804,0 126.4616,52.02694,0 126.5122,52.03889,0 126.5572,52.13055,0 126.3064,52.20417,0 126.4364,52.28082000000001,0 126.3203,52.30832,0 126.3403,52.38942999999999,0 126.2675,52.4586,0 126.1977,52.46444,0 126.2094,52.50139000000002,0 126.0939,52.58804,0 126.0308,52.56333,0 125.9886,52.58222,0 125.973,52.64167,0 126.0642,52.67638,0 126.0355,52.7211,0 126.0955,52.76444,0 126.0508,52.78583,0 125.9705,52.76333,0 125.8592,52.85166000000001,0 125.8447,52.89943000000002,0 125.6469,52.87887000000001,0 125.6486,52.91276,0 125.7191,52.94222,0 125.7289,52.97943,0 125.623,53.05,0 125.5061,53.03832,0 125.4661,53.08388000000001,0 125.1342,53.19749000000001,0 124.9122,53.16972,0 124.8755,53.14388000000001,0 124.89,53.09471,0 124.8516,53.08915,0 124.805,53.13305,0 124.7058,53.13443000000001,0 124.6528,53.18581,0 124.4022,53.21221,0 124.2553,53.35665,0 124.1044,53.34083,0 123.9108,53.46471,0 123.6975,53.49583,0 123.6194,53.54277,0 123.5294,53.49944,0 123.5428,53.53388,0 123.4975,53.54694,0 123.4789,53.49917,0 123.2461,53.55305,0 123.1533,53.50054999999999,0 122.8244,53.45,0 122.41,53.43721000000001,0 122.3144,53.48777,0 122.0261,53.41397,0 121.83,53.41305,0 121.4738,53.32382,0 121.325,53.31833,0 121.2083,53.27055000000001,0 120.8639,53.27972000000001,0 120.2728,52.85777,0 120.0292,52.76805,0 120.0306,52.61721,0 120.073,52.59,0 120.1891,52.58028,0 120.4403,52.63722,0 120.7136,52.54472000000001,0 120.6867,52.43361000000001,0 120.6228,52.34026999999999,0 120.7592,52.23916,0 120.7828,52.15526,0 120.7531,52.07917,0 120.695,52.04860999999999,0 120.7128,51.98249000000001,0 120.6578,51.9175,0 120.4886,51.8772,0 120.1972,51.68610000000002,0 120.0969,51.66138,0 120.0491,51.54777000000001,0 119.983,51.49305,0 119.9566,51.38999,0 119.8914,51.37417,0 119.9208,51.33638,0 119.8097,51.26416,0 119.818,51.21416,0 119.7553,51.20750000000001,0 119.7805,51.1661,0 119.7467,51.0736,0 119.5225,50.90499,0 119.5022,50.74221000000001,0 119.2869,50.59389000000001,0 119.2422,50.44526,0 119.1353,50.38972,0 119.1983,50.34527,0 119.348,50.34833,0 119.368,50.30999,0 119.3289,50.27388000000001,0 119.3481,50.15948,0 119.3222,50.09722000000001,0 119.2141,50.01528,0 119.0996,49.99044,0 118.5833,49.92694,0 118.4647,49.82444,0 118.3855,49.81667000000001,0 118.3658,49.77832000000002,0 117.8958,49.55,0 117.872,49.51022,0 117.4944,49.62305,0 117.17,49.6525,0 116.7114,49.83046000000001,0 116.6155,49.93138,0 116.2461,50.02749000000001,0 116.0697,50.00278,0 115.7547,49.88443000000001,0 115.3964,49.90110000000001,0 115.2053,49.99833,0 115.0236,50.15193,0 114.8542,50.22832,0 114.6758,50.26415999999999,0 114.4439,50.24527,0 114.313,50.28416,0 114.1764,50.24833,0 113.8747,50.08693000000002,0 113.7825,50.08693000000002,0 113.5861,50.01639,0 113.2167,49.81917,0 113.1014,49.67888,0 113.0908,49.59859,0 112.7669,49.50083,0 112.4917,49.54138,0 111.9639,49.40694,0 111.6822,49.40665,0 111.498,49.34916000000001,0 111.3714,49.37416,0 110.9811,49.20083,0 110.7886,49.14944,0 110.6303,49.15249,0 110.4011,49.25500000000001,0 110.2369,49.16945,0 109.8503,49.18999,0 109.7394,49.23499000000001,0 109.5442,49.23249,0 109.3519,49.33694,0 109.2069,49.36028,0 108.6511,49.33173000000001,0 108.5275,49.34555,0 108.3589,49.44526000000001,0 108.2719,49.53555000000001,0 108.1375,49.55804,0 108.0419,49.61082,0 108.0319,49.67471,0 107.9475,49.68333,0 107.9892,49.74499,0 107.9553,49.85167,0 107.9806,49.94083,0 107.8133,49.94860000000001,0 107.7536,49.97955000000001,0 107.7989,50.02999,0 107.8008,50.09166000000001,0 107.7619,50.10471,0 107.7736,50.15749000000002,0 107.8205,50.20665000000002,0 107.8936,50.19249000000001,0 107.9375,50.22221,0 107.9855,50.33721,0 108.0761,50.35332,0 108.1325,50.31444,0 108.2042,50.41109,0 108.3386,50.40444000000001,0 108.4369,50.46249000000002,0 108.6039,50.45221999999999,0 108.6853,50.50417,0 108.6583,50.53777,0 108.5447,50.52777,0 108.4167,50.61361,0 108.1794,50.65915,0 108.0655,50.75804999999999,0 108.2515,50.83393,0 108.3322,51.04887999999999,0 108.4997,51.05915000000002,0 108.5747,51.11528,0 108.4542,51.22776000000001,0 108.3525,51.26528,0 108.4736,51.34499,0 108.547,51.47527,0 108.6208,51.51306,0 108.743,51.44583000000001,0 108.945,51.43999000000002,0 109.0636,51.50861,0 109.2522,51.36221000000001,0 109.3386,51.39138,0 109.38,51.34666,0 109.4289,51.41610000000001,0 109.6789,51.46305,0 110.0491,51.62000000000001,0 110.3947,51.57944,0 110.4205,51.52222,0 110.5447,51.49471,0 110.6961,51.50277,0 110.7817,51.57471,0 110.8639,51.59222,0 110.8414,51.66915000000002,0 111.0019,51.72222,0 111.015,51.78221000000001,0 111.1397,51.83527,0 111.198,51.82361000000001,0 111.6078,51.92778,0 112.0608,52.27833,0 112.1683,52.30389000000001,0 112.2089,52.24054,0 112.2964,52.25278000000001,0 112.4022,52.20694,0 112.4925,52.25000000000001,0 112.5389,52.34972000000001,0 112.9303,52.33665000000001,0 113.2733,52.47805000000001,0 113.5341,52.49416,0 113.5792,52.45027,0 113.738,52.57722,0 113.8978,52.63499,0 113.9542,52.62555,0 114.1236,52.71832,0 114.2422,52.82388,0 114.2144,52.89054000000001,0 114.2422,52.92749,0 114.2322,52.96527,0 114.3172,52.96721,0 114.2814,53.02139,0 114.3253,53.06777,0 114.2314,53.10361000000001,0 114.1269,53.07194,0 114.2017,53.19222,0 114.0925,53.2047,0 114.0464,53.22359,0 114.048,53.25249,0 113.9822,53.23305,0 113.94,53.28444,0 113.9639,53.31945,0 113.9433,53.35638,0 113.8322,53.38971999999999,0 113.8278,53.4575,0 113.8955,53.53472,0 113.8147,53.61644,0 113.9744,53.64444000000001,0 113.9686,53.69944000000001,0 113.9947,53.71694,0 114.1431,53.75610000000001,0 114.2961,53.74666000000001,0 114.3747,53.81249,0 114.4453,53.80249000000001,0 114.5031,53.80915000000001,0 114.5958,53.90277,0 114.9758,53.99249,0 115.0239,54.03082,0 115.0241,54.07027000000002,0 115.1494,54.12027000000001,0 115.1833,54.18444,0 115.4993,54.30138000000001,0 115.5092,54.36472000000001,0 115.6708,54.42388,0 116.185,54.50722,0 116.5228,54.46408,0 116.5372,54.50943,0 116.7119,54.52944,0 116.7144,54.56333000000001,0 116.77,54.59222,0 116.7697,54.66109,0 116.8739,54.70416,0 116.8694,54.7686,0 116.9239,54.79554,0 116.8778,54.90527,0 116.8892,54.94165,0 116.8264,54.97860000000001,0 116.8411,55.02138,0 116.7825,55.11028,0 116.6991,55.11472000000001,0 116.4694,55.22748,0 116.4616,55.30555,0 116.4022,55.36082,0 116.1144,55.34749000000002,0 116.0694,55.37944,0 115.9639,55.36555,0 115.93,55.39694,0 115.9672,55.44526000000001,0 115.8894,55.49889000000001,0 115.913,55.6461,0 115.8411,55.67222000000001,0 115.8683,55.74499,0 115.8419,55.82638000000001,0 115.898,55.91667000000001,0 115.7586,56.04111000000001,0 115.7855,56.07193000000001,0 115.7691,56.11694,0 115.8369,56.14943,0 115.7619,56.17416,0 115.6841,56.29694,0 115.6797,56.39721,0 115.7844,56.40193,0 115.7988,56.42968000000001,0 115.6755,56.49277,0 115.6819,56.56527000000001,0 115.4647,56.58971,0 115.4311,56.62823,0 115.443,56.66388,0 115.5903,56.71554,0 115.6136,56.78611,0 115.5864,56.87249000000001,0 115.7368,56.95655,0 115.8617,56.93277000000001,0 115.9628,56.86111,0 116.0417,56.86361,0 116.1211,56.81221000000002,0 116.3639,56.84860000000001,0 116.5594,56.7589,0 116.7386,56.76083000000001,0 116.8072,56.72388,0 116.9672,56.78111,0 117.0403,56.77638,0 117.0017,56.79943000000001,0 117.0222,56.81554,0 117.1355,56.80111,0 117.1933,56.87943,0 117.3311,56.9486,0 117.3642,56.91610000000001,0 117.3447,56.86693000000001,0 117.4153,56.85777,0 117.4103,56.82583000000001,0 117.4605,56.81694000000001,0 117.498,56.87137,0 117.5728,56.84722,0 117.57,56.93555000000001,0 117.6744,56.9747,0 117.6889,57.01444999999999,0 117.6783,57.06666,0 117.5969,57.15332,0 117.7452,57.19583000000001,0 117.7955,57.28722,0 117.7758,57.30249000000001,0 117.5964,57.32333,0 117.5464,57.25999,0 117.4742,57.23778,0 117.4264,57.25861,0 117.4444,57.32972,0 117.365,57.32778,0 117.3286,57.45443,0 117.2889,57.45833,0 117.2522,57.51333000000002,0 117.3105,57.56555,0 117.2878,57.61306,0 117.1378,57.63972,0 117.1783,57.73888000000002,0 117.0844,57.80416000000001,0 117.123,57.84277,0 117.31,57.84388000000001,0 117.4175,57.90666,0 117.3661,57.92749,0 117.3647,57.99554,0 117.3958,58.02610000000001,0 117.3725,58.0611,0 117.4139,58.08749000000001,0 117.4075,58.12721,0 117.44,58.15721,0 117.5739,58.13582,0 117.5906,58.18555,0 117.4714,58.28278,0 117.4792,58.31361,0 117.6644,58.3711,0 117.6722,58.40055,0 117.8308,58.4122,0 118.013,58.39305,0 118.0639,58.33832000000001,0 118.1354,58.38744,0 118.3072,58.36028000000001,0 118.4892,58.21111,0 118.5614,58.21444,0 118.6475,58.17028000000001,0 118.803,58.21666000000001,0 119.1084,58.22268,0 119.1317,58.29027,0 119.0655,58.36388,0 119.1261,58.40833000000001,0 119.1297,58.48249,0 118.763,58.61249,0 118.8269,58.61527,0 118.8875,58.69554000000001,0 118.8969,58.81471000000001,0 118.7867,58.8875,0 118.7922,58.9397,0 118.8539,58.94360000000001,0 118.8478,59.01441000000001,0 118.7369,59.02361000000001,0 118.7025,59.06554,0 118.7014,59.21305000000001,0 118.8514,59.28611,0 118.7553,59.33333,0 118.7633,59.38722000000001,0 118.7644,59.4011,0 118.3903,59.51777,0 118.3503,59.58888,0 118.2836,59.61055,0 118.0572,59.58333,0 117.9864,59.53638,0 117.94,59.45471,0 117.8836,59.44165,0 117.8189,59.44944000000001,0 117.7583,59.54084000000001,0 117.5989,59.47083,0 117.2361,59.52777,0 117.1966,59.56916,0 117.0844,59.58721,0 117.2008,59.65499,0 117.2275,59.82943,0 117.0572,59.90889,0 117.1139,59.96333,0 117.2333,59.95694,0 117.3089,59.99528,0 117.2975,60.01943,0 117.0486,60.03583,0 117.0444,60.08250000000001,0 116.9736,60.15777,0 116.84,60.24222,0 116.7322,60.25777,0 116.6008,60.35722000000001,0 116.078,60.40417,0 116.0032,60.45931000000002,0 115.8428,60.465,0 115.6755,60.52666,0 115.1891,60.42972000000001,0 115.0906,60.38276000000001,0 115.013,60.27167,0 114.8139,60.18054,0 114.6966,60.21998,0 114.5461,60.11388000000001,0 114.5211,60.04527,0 114.5667,59.99777000000001,0 114.3155,59.88361,0 114.1655,59.74582000000002,0 114.0433,59.74110000000001,0 114.0419,59.68054999999999,0 113.8492,59.68832,0 113.7836,59.60999,0 113.6089,59.58111000000001,0 113.5864,59.55915000000002,0 113.6097,59.49527000000001,0 113.4728,59.43860000000001,0 113.4211,59.37665,0 113.4869,59.33333,0 113.4558,59.29889,0 113.4694,59.26500000000001,0 113.2817,59.16109000000001,0 112.9714,59.13444000000001,0 112.9117,59.15499,0 112.8822,59.11833,0 112.7314,59.0872,0 112.6453,59.03249,0 112.5742,59.07168,0 112.5555,59.02665,0 112.6276,58.96118,0 112.5003,58.86999,0 112.4461,58.92805,0 112.46,59.16166,0 112.5378,59.23694,0 112.6386,59.26944000000001,0 112.6322,59.31082000000001,0 112.438,59.33028,0 112.2839,59.30305,0 112.3075,59.33666000000002,0 112.2728,59.365,0 112.3341,59.41694,0 112.2714,59.46638,0 112.2739,59.50444000000001,0 112.2214,59.50361,0 111.9933,59.34470000000001,0 111.9419,59.2711,0 111.7681,59.27805,0 111.6461,59.2061,0 111.4353,59.27388,0 111.3042,59.25694000000001,0 111.1822,59.18332000000001,0 111.0831,59.23944,0 110.9969,59.20805000000001,0 110.6927,59.25777000000001,0 110.5789,59.19166000000001,0 110.5917,59.13110000000001,0 110.5425,59.10556,0 110.5386,59.06221000000001,0 110.4819,59.03334,0 110.3522,59.03582,0 110.2783,58.98194,0 109.9355,59.00917,0 109.8203,58.97971,0 109.7411,59.07194000000001,0 109.6405,59.06166,0 109.6286,59.1511,0 109.5281,59.18027,0 109.5405,59.22083,0 109.5172,59.23082,0 109.5167,59.29193,0 109.2605,59.31694,0 109.245,59.36306,0 109.3558,59.41667000000001,0 109.2594,59.4511,0 109.5339,59.64555,0 109.4842,59.68721000000002,0 109.4947,59.75027000000001,0 109.6514,59.86193000000001,0 109.62,59.90305,0 109.7694,60.02887000000001,0 109.7164,60.05222000000001,0 109.6936,60.11193,0 109.7264,60.22610000000001,0 109.8069,60.25443,0 109.8055,60.31305,0 109.8789,60.33805,0 109.8611,60.37417000000001,0 109.9519,60.40359999999999,0 109.9164,60.45889,0 110.0219,60.51694,0 110.0389,60.55833,0 110.1178,60.57972,0 110.1222,60.62416,0 110.04,60.66915,0 110.2678,60.69194,0 110.2703,60.76222,0 110.2947,60.76999000000001,0 110.225,60.79610000000002,0 110.23,60.81916,0 110.448,60.97694000000001,0 110.4575,61.03667,0 110.5208,61.08138,0 110.483,61.15971,0 110.3972,61.18111,0 110.3211,61.14638000000001,0 110.1797,61.15639,0 110.0903,61.27027,0 109.8553,61.29139000000001,0 109.7875,61.32721000000001,0 109.8492,61.43054000000001,0 109.8247,61.47748,0 109.8653,61.49305,0 109.8742,61.53333000000001,0 109.7061,61.64804,0 109.7161,61.67666,0 109.6126,61.71394000000001,0 109.6389,61.76083000000001,0 109.5858,61.77443,0 109.5864,61.82333000000001,0 109.6116,61.89277000000001,0 109.8183,62.00363000000001,0 109.9036,62.11306,0 109.9997,62.16361,0 109.9333,62.23472,0 110,62.28220000000001,0 109.96,62.31639,0 109.9628,62.32249000000002,0 109.8911,62.35333,0 109.9247,62.39722,0 109.9036,62.41388,0 109.5442,62.4325,0 109.4711,62.40499,0 109.4205,62.45832,0 109.3158,62.47554000000001,0 109.2642,62.52332,0 109.2444,62.57277,0 109.3869,62.58306000000001,0 109.375,62.64583,0 109.4561,62.66637999999999,0 109.5039,62.77527,0 109.6505,62.82444000000002,0 109.6158,62.87609,0 109.4683,62.93388000000002,0 109.4811,62.9961,0 109.4553,62.99972000000001,0 109.4811,63.02777,0 109.4472,63.03611,0 109.4647,63.07749,0 109.4317,63.09361,0 109.46,63.15055,0 109.4061,63.18277,0 109.4564,63.21860000000001,0 109.3753,63.25528000000001,0 109.3917,63.32472,0 109.363,63.36193,0 109.2717,63.34722,0 109.2289,63.44027,0 109.0433,63.55416000000002,0 108.8566,63.53582000000002,0 108.5586,63.59972000000001,0 108.1314,63.56777,0 108.1164,63.62249,0 108.2703,63.67888,0 108.2886,63.80805,0 108.3716,63.82638,0 108.4661,63.78944000000001,0 108.6056,63.80749,0 108.6489,63.78582,0 108.7719,63.86472,0 108.6839,63.9086,0 108.7383,63.98082,0 108.49,64.1147,0 108.5441,64.1747,0 108.4769,64.20081999999999,0 108.5394,64.23248,0 108.4614,64.28581,0 108.3569,64.30081,0 108.3075,64.24915,0 108.14,64.26221,0 108.0265,64.22346,0 107.9933,64.16971,0 107.8508,64.18053999999999,0 107.5947,64.29915,0 107.3344,64.24442999999999,0 107.2366,64.28693,0 107.2342,64.33138,0 107.1022,64.33693,0 106.8864,64.41609,0 106.7533,64.41193,0 106.6733,64.49802,0 106.6042,64.51331999999999,0 106.5655,64.49582,0 106.5858,64.44443,0 106.3944,64.44331,0 106.1867,64.39639,0 106.0661,64.42081,0 106.1475,64.48526,0 106.0389,64.51609999999999,0 105.7925,64.47803999999999,0 105.8042,64.53055000000001,0 105.7261,64.57222,0 105.7494,64.61443,0 105.7039,64.65886999999999,0 105.8772,64.65804,0 105.8289,64.74193,0 105.8472,64.79165999999999,0 105.898,64.82138000000001,0 106.0097,64.81805,0 105.9491,64.89499000000001,0 106.0408,64.90470999999999,0 106.1058,64.85915,0 106.2233,64.85722,0 105.9748,65.00305,0 105.9986,65.03915000000001,0 106.1658,65.09027,0 106.1925,65.12858,0 106.2911,65.13889,0 106.3736,65.20499,0 106.5117,65.20387,0 106.4269,65.26138,0 106.4422,65.30888,0 106.6116,65.39276,0 106.8414,65.37608,0 106.8761,65.44108,0 106.9647,65.50443,0 106.6989,65.55109,0 106.715,65.59305999999999,0 106.6219,65.61053,0 106.6439,65.6322,0 106.4214,65.66692999999999,0 106.4153,65.70139,0 106.4711,65.74108,0 106.448,65.77415000000001,0 106.4764,65.80443,0 106.4483,65.82138000000001,0 106.4961,65.895,0 106.4667,65.93192999999999,0 106.4889,66.00471,0 106.353,66.15082,0 106.1833,66.15555999999999,0 106.1158,66.19859,0 106.1489,66.25776999999999,0 106.1008,66.37803,0 106.3269,66.47553000000001,0 106.2939,66.50221000000001,0 106.3058,66.55359000000001,0 106.2417,66.58167,0 106.2272,66.66052999999999,0 106.26,66.69942,0 106.1461,66.72693,0 106.1361,66.7561,0 106.1997,66.78333000000001,0 106.1875,66.80247,0 105.9889,66.79776000000001,0 106.075,66.86081,0 106.0683,66.89525999999999,0 105.8686,66.91804999999999,0 105.8189,66.94859,0 105.6436,66.94664,0 105.5283,67.02222,0 105.9053,67.04553,0 105.9955,67.07887,0 106.0539,67.16804999999999,0 106.2325,67.18498,0 106.5036,67.28637000000001,0 106.6678,67.24387,0 106.7989,67.33832,0 106.8766,67.84166999999999,0 106.8908,68.86026,0 106.1367,69.41971,0 106.2853,69.45833,0 106.4547,69.57249,0 106.5911,69.51666,0 106.8147,69.51361,0 107.6053,69.6636,0 107.9022,69.67498999999999,0 108.0181,69.70749000000001,0 108.0536,69.77970999999999,0 108.2366,69.85444,0 108.8725,69.84109000000001,0 108.9539,69.78526000000001,0 109.2261,69.77164999999999,0 109.3644,69.83832,0 109.4211,69.89276,0 109.3836,69.92944,0 109.5439,70.03498,0 109.3811,70.07944000000001,0 109.3828,70.11942999999999,0 109.3055,70.17776000000001,0 109.3205,70.21887,0 109.5695,70.265,0 109.633,70.31972,0 109.5817,70.35526000000002,0 109.6417,70.38499,0 110.2725,70.41721000000001,0 110.3036,70.44942,0 110.1405,70.47859,0 110.1461,70.52388000000001,0 110.0989,70.55776,0 110.1594,70.55247,0 110.1625,70.56554,0 110.1236,70.63612000000001,0 110.3236,70.70471000000001,0 110.5136,70.71693000000001,0 110.5031,70.77083,0 110.5383,70.79721000000001,0 110.7223,70.82165999999999,0 110.8808,70.79638000000001,0 111.0057,70.84365,0 111.3625,70.85526,0 111.4647,70.93864000000001,0 111.9772,70.98276,0 112.0775,71.06164,0 112.2561,71.00000000000001,0 112.385,71.0647,0 112.5975,71.10471,0 112.5219,71.16388000000001,0 112.6869,71.20277,0 112.7258,71.24359,0 112.6428,71.2897,0 112.5128,71.26582999999999,0 112.333,71.34333,0 112.0111,71.40694000000001,0 112.0122,72.13332,0 111.775,72.14499000000001,0 111.7436,72.20721,0 111.6242,72.21361,0 111.6686,72.26582999999999,0 111.5806,72.31944,0 111.3592,72.31693,0 111.0883,72.37220000000001,0 111.0758,72.4061,0 111.3036,72.47832,0 111.3155,72.51277,0 110.89,72.58110000000002,0 110.925,72.63193,0 110.7303,72.64472000000001,0 110.6322,72.78665000000001,0 110.7317,72.82999,0 110.6597,72.85305,0 110.6466,72.89554,0 110.8755,72.94859,0 110.8155,72.95359999999999,0 110.7778,73.00054,0 110.9417,73.03888000000001,0 110.8583,73.07805000000002,0 110.7978,73.17303,0 110.423,73.18997,0 110.6272,73.26888,0 110.5667,73.31944,0 110.1644,73.40248,0 110.5641,73.40637,0 110.8036,73.50832,0 110.8483,73.56554,0 111.0547,73.57165999999999,0 111.1178,73.59359000000001,0 111.1433,73.63777,0 111.0803,73.65860000000001,0 110.9143,73.69668,0 110.8775,73.72859,0 110.9169,73.76028,0 110.8934,73.76541,0 111.2942,73.85934,0 111.6379,73.93545,0 111.6826,74.06952,0 111.34,74.27808,0 111.3847,74.42704000000001,0 112.6509,74.76967999999999,0 113.8128,75.26125999999999,0 114.1406,75.88692,0 113.9618,76.43810000000001,0 113.351,76.87012,0 112.5083,77.24612000000001,0 112.5097,77.85098000000001,0 112.8831,77.93326,0 117.766,79.00914,0 122.6489,80.08503,0 127.5317,81.16092,0 127.5198,84.90002,0 127.5038,89.90000000000001,0 128.4423,89.90000000000001,0 129.3808,89.90000000000001,0 130.3193,89.90000000000001,0 131.2577,89.90000000000001,0 132.1962,89.90000000000001,0 133.1347,89.90000000000001,0 134.0732,89.90000000000001,0 135.0116,89.90000000000001,0 135.9501,89.90000000000001,0 136.8886,89.90000000000001,0 137.827,89.90000000000001,0 138.7655,89.90000000000001,0 139.704,89.90000000000001,0 140.6425,89.90000000000001,0 141.5809,89.90000000000001,0 142.5194,89.90000000000001,0 142.5194,84.90001,0 142.5194,79.90000000000001,0 + + + 1 + + + + + GMT +09:30 + + +]]> + #khStyle0950 + + + + +129,-14.87108,0 129.0917,-14.90135,0 129.3895,-14.71341,0 129.4171,-14.63216,0 129.3632,-14.4277,0 129.4122,-14.23111,0 129.4925,-14.14223,0 129.4789,-14.04722,0 129.5889,-14.09722,0 129.6136,-14.05833,0 129.5977,-13.99945,0 129.6308,-14.04056,0 129.7327,-13.99472,0 129.75,-13.93222,0 129.7169,-13.86722,0 129.8152,-13.77779,0 129.8105,-13.75167,0 129.7844,-13.76305,0 129.7827,-13.69221,0 129.8275,-13.51945,0 129.8708,-13.50194,0 129.8861,-13.44528,0 129.9136,-13.51389,0 129.9861,-13.52778,0 130.145,-13.45973,0 130.2542,-13.32889,0 130.3264,-13.35389,0 130.2073,-13.22924,0 130.0907,-13.21581,0 130.1157,-13.14503,0 130.1408,-12.92416,0 130.1855,-12.9075,0 130.235,-12.9475,0 130.3408,-12.87611,0 130.3558,-12.67,0 130.3972,-12.68722,0 130.4433,-12.63083,0 130.5094,-12.65834,0 130.505,-12.60221,0 130.5855,-12.71472,0 130.6953,-12.7025,0 130.598,-12.67666,0 130.5536,-12.63029,0 130.6194,-12.60833,0 130.5733,-12.5825,0 130.6049,-12.49861,0 130.5875,-12.4575,0 130.6177,-12.43278,0 130.5766,-12.40278,0 130.558,-12.07055,0 130.4637,-11.85899,0 130.3133,-11.79272,0 130.0941,-11.84624,0 129.9998,-11.77998,0 130.14,-11.47157,0 130.2445,-11.33648,0 130.3516,-11.28041,0 130.3643,-11.16826,0 130.4051,-11.14532,0 130.5147,-11.27021,0 130.6982,-11.31863,0 130.8333,-11.31863,0 131.1188,-11.25238,0 131.259,-11.1861,0 131.807,-11.1912,0 131.9803,-11.11982,0 132.346,-11.12238,0 132.4684,-11.01023,0 132.5958,-10.95671,0 133.479,-11.45118,0 133.5198,-11.51235,0 133.8262,-11.72145,0 133.9136,-11.72722,0 133.9391,-11.75611,0 133.8352,-11.82695,0 133.875,-11.89139,0 133.9511,-11.91222,0 134.045,-11.8425,0 134.0841,-11.92805,0 134.1411,-11.88139,0 134.1997,-11.95861,0 134.1664,-11.97194,0 134.1855,-12.08277,0 134.2805,-11.97417,0 134.415,-12.0575,0 134.5941,-12.06611,0 134.6986,-11.9575,0 134.7661,-11.95055,0 134.8014,-12.04333,0 134.8282,-12.03977,0 135.0559,-11.9113,0 135.9633,-11.67485,0 136.2765,-11.5646,0 136.4738,-11.45757,0 136.7646,-11.00381,0 136.7838,-11.04376,0 136.7342,-11.20672,0 136.5952,-11.40484,0 136.6352,-11.74354,0 136.8317,-12.06468,0 136.8573,-12.21335,0 136.9336,-12.28694,0 136.9386,-12.35639,0 136.9794,-12.36139,0 136.9172,-12.3875,0 136.7831,-12.545,0 136.7986,-12.45667,0 136.7325,-12.48722,0 136.7683,-12.56972,0 136.6978,-12.62306,0 136.6808,-12.71029,0 136.6055,-12.72083,0 136.6186,-12.83584,0 136.5486,-12.74361,0 136.5397,-12.8175,0 136.4677,-12.78111,0 136.4843,-12.84594,0 136.5514,-12.88611,0 136.5392,-12.91639,0 136.645,-12.9575,0 136.6489,-13.01466,0 136.7199,-13.64,0 136.9308,-13.75824,0 136.9755,-14.26311,0 136.9212,-14.31743,0 135.7868,-14.90858,0 135.7612,-14.96609,0 135.7971,-15.14682,0 135.9369,-15.25361,0 136.2122,-15.39445,0 136.2791,-15.56722,0 136.4158,-15.62276,0 136.5764,-15.50668,0 136.7517,-15.55584,0 136.8828,-15.49533,0 137.0845,-15.66302,0 137.0997,-15.77525,0 137.0683,-15.93743,0 137.2488,-16.02194,0 137.4283,-16.15722,0 137.7355,-16.24916,0 137.8605,-16.44,0 138.0003,-16.55472,0 138.0004,-21.55472,0 138.0005,-25.99945,0 141.0005,-25.99971,0 141.0027,-29.00021,0 140.9979,-34.00021,0 140.9979,-34.02403,0 140.968,-38.06421,0 140.675,-38.06861,0 140.405,-37.92805,0 140.228,-37.65944,0 140.1141,-37.58055,0 140.1283,-37.53612,0 140.0408,-37.48721,0 140.0022,-37.50501000000001,0 139.8144,-37.29973,0 139.7375,-37.17805,0 139.7836,-37.15361,0 139.7803,-37.10778,0 139.7411,-37.08278,0 139.7314,-37.00973000000001,0 139.6697,-36.96362,0 139.8003,-36.89472,0 139.8547,-36.82611,0 139.8616,-36.66639,0 139.8269,-36.57778,0 139.573,-36.0925,0 139.2314,-35.76361,0 138.8005,-35.53694,0 138.6555,-35.56056,0 138.5355,-35.65445,0 138.3009,-35.65432,0 138.2088,-35.71732000000001,0 138.1369,-35.855,0 138.038,-35.92418,0 137.9289,-35.87666,0 137.7494,-35.86777,0 137.6055,-35.92945,0 137.6141,-36.01472,0 137.4577,-36.08666,0 137.3544,-36.00195,0 137.2219,-35.98361000000001,0 137.1566,-36.04361,0 137.0161,-36.02695,0 136.9061,-36.06028,0 136.8466,-36.03083,0 136.7164,-36.07168,0 136.6678,-35.98778,0 136.5344,-35.9125,0 136.5725,-35.77633,0 136.4895,-35.57197,0 136.4753,-35.25469,0 136.4239,-35.18024,0 135.9541,-35.01028,0 135.928,-34.95945,0 135.7867,-34.86029,0 135.7213,-34.86861,0 135.6778,-34.95555,0 135.6241,-34.95361,0 135.6061,-34.89305,0 135.4747,-34.75111,0 135.3225,-34.69111,0 135.3488,-34.65305,0 135.3219,-34.62166,0 135.2188,-34.56417,0 135.1056,-34.59302,0 135.0562,-34.44981,0 134.6956,-33.95219,0 134.4445,-33.78327,0 134.4536,-33.4363,0 134.3375,-33.20403,0 134.2691,-33.15972,0 134.2355,-33.05140000000001,0 134.1478,-33.0275,0 134.2039,-33.01112,0 134.1947,-32.95223,0 134.0611,-32.92139,0 134.1294,-32.84277,0 134.0683,-32.71667,0 134.2177,-32.72834,0 134.1941,-32.79029,0 134.2144,-32.81306,0 134.2241,-32.78389,0 134.2969,-32.68028,0 134.2822,-32.60000000000001,0 134.143,-32.4575,0 134.0355,-32.46389,0 133.9938,-32.50611,0 133.9314,-32.50084,0 133.9055,-32.54501,0 133.8505,-32.54055,0 133.7763,-32.43159,0 133.5382,-32.32338,0 133.4172,-32.21334,0 133.3041,-32.19694,0 133.2672,-32.22084000000001,0 133.1855,-32.18666,0 133.1447,-32.20583,0 133.0591,-32.11473,0 132.9774,-32.11306,0 132.8355,-31.97972,0 132.7644,-31.95084,0 132.5491,-31.93889,0 132.4508,-31.97277,0 132.4794,-32.03251,0 132.4142,-32.01167,0 132.2039,-32.03168,0 132.0908,-31.92111,0 131.7691,-31.72222,0 131.1522,-31.47416,0 130.838,-31.60584,0 130.1489,-31.57916000000001,0 129.0003,-31.69261,0 129.0052,-26.69261,0 129.0059,-26.0049,0 129.0032,-21.0049,0 129.0006,-16.0049,0 129,-14.87108,0 + + + 1 + + + + GMT +10:00 + + +]]> + #khStyle1000 + + + + + +157.5176,-9.204364,0 157.5176,-14.20437,0 157.5176,-19.20436,0 157.5176,-24.20437,0 157.5176,-29.20436000000001,0 157.5176,-34.20436,0 157.5176,-39.20436,0 157.5176,-39.30436,0 157.5176,-44.30436,0 157.5176,-49.30437,0 157.5176,-54.30436,0 157.5176,-59.00436,0 157.5176,-64.00436000000001,0 157.5176,-69.00436000000001,0 157.5176,-74.00436000000001,0 157.5176,-79.00436000000001,0 157.5176,-84.00436000000001,0 157.5176,-89.00436000000001,0 157.5176,-89.90000000000001,0 156.5791,-89.90000000000001,0 155.6407,-89.90000000000001,0 154.7022,-89.90000000000001,0 153.7638,-89.90000000000001,0 152.8253,-89.90000000000001,0 151.8868,-89.90000000000001,0 150.9484,-89.90000000000001,0 150.0099,-89.90000000000001,0 149.0715,-89.90000000000001,0 148.133,-89.90000000000001,0 147.1945,-89.90000000000001,0 146.2561,-89.90000000000001,0 145.3176,-89.90000000000001,0 144.3792,-89.90000000000001,0 143.4407,-89.90000000000001,0 142.5023,-89.90000000000001,0 142.5023,-88.17653,0 142.5023,-85.57653000000001,0 142.5023,-80.57653000000001,0 142.5023,-75.57653000000001,0 142.5023,-73.37653,0 142.5023,-68.37653,0 142.5023,-63.37653000000001,0 142.5023,-58.37653000000002,0 142.5023,-53.37653,0 142.5023,-48.37652000000001,0 142.5023,-43.37653,0 142.5023,-38.37652,0 142.4572,-38.40722,0 142.3813,-38.36362,0 142.163,-38.40111,0 141.9619,-38.29083,0 141.7436,-38.26751,0 141.6213,-38.31751,0 141.6536,-38.40222,0 141.5908,-38.39917,0 141.5472,-38.44305,0 141.4694,-38.37527,0 141.3842,-38.39889,0 141.4022,-38.3289,0 141.2825,-38.22084,0 140.968,-38.06421,0 140.9979,-34.02403,0 140.9979,-34.00021,0 141.0027,-29.00021,0 141.0005,-25.99971,0 138.0005,-25.99945,0 138.0004,-21.55472,0 138.0003,-16.55472,0 138.1902,-16.705,0 138.3039,-16.75112,0 138.4869,-16.78778,0 138.6466,-16.77973,0 138.8486,-16.87777,0 138.9894,-16.89061,0 139.1192,-16.78778,0 139.1562,-16.5896,0 139.3061,-16.45425,0 139.4543,-16.43814,0 139.5574,-16.3898,0 139.7379,-16.44136,0 139.7443,-16.50259,0 139.5574,-16.67661,0 139.4736,-16.83612,0 139.5075,-16.98919,0 139.5639,-17.02948,0 139.5816,-17.09876,0 139.4833,-17.18898,0 139.4543,-17.27115,0 139.4717,-17.40412,0 139.6219,-17.52556,0 139.8091,-17.57223,0 139.9308,-17.63139,0 139.9819,-17.70027,0 140.0514,-17.71806,0 140.3966,-17.67334,0 140.7361,-17.52,0 140.758,-17.47778,0 140.8352,-17.45027,0 140.8774,-17.37833,0 140.9491,-17.01362,0 141.0511,-16.88389000000001,0 141.0764,-16.80333,0 141.1299,-16.78083,0 141.2119,-16.6725,0 141.3269,-16.33195,0 141.3486,-16.21916,0 141.4269,-16.07917,0 141.3758,-15.92944,0 141.4605,-15.53611,0 141.6658,-15.03611,0 141.5677,-14.76889,0 141.5203,-14.475,0 141.5916,-14.26473,0 141.6,-14.13445,0 141.4661,-13.90667,0 141.5269,-13.57416,0 141.6297,-13.35416,0 141.6678,-13.34778,0 141.6883,-13.26083,0 141.5839,-12.98916,0 141.6299,-12.89528,0 141.6522,-12.9125,0 141.7597,-12.80805,0 141.8055,-12.67195,0 141.8158,-12.70361,0 141.8686,-12.70084,0 141.8905,-12.84639,0 141.935,-12.91111,0 141.908,-12.75028,0 142.005,-12.72166,0 141.9172,-12.71805,0 141.8297,-12.66278,0 141.8892,-12.60916,0 141.9753,-12.58944,0 141.9255,-12.56111,0 141.8191,-12.59695,0 141.7722,-12.57361,0 141.7589,-12.53222,0 141.6941,-12.50445,0 141.7444,-12.46111,0 141.6614,-12.44833,0 141.6544,-12.52833,0 141.6953,-12.54805,0 141.593,-12.5575,0 141.6658,-12.38666,0 141.6689,-12.38195,0 141.7161,-12.23305,0 141.8058,-12.2375,0 141.7503,-12.205,0 141.8524,-11.98445,0 141.91,-11.95944,0 141.8905,-11.98833,0 141.9175,-12.10528,0 141.9644,-12.04084,0 142.0289,-12.06221,0 141.9422,-11.95472,0 142.1241,-11.36722,0 142.1589,-11.14944,0 142.1419,-10.95666,0 141.007,-9.128467000000001,0 141.0035,-4.128462,0 141.0025,-2.607085,0 141,-5.400000000000001e-007,0 146,-0.00688554,0 151,-0.01377954,0 156,-0.02066454,0 157.5176,-0.02275254,0 157.5176,-5.022757,0 157.5176,-5.728428,0 155,-7.3,0 157.5176,-9.204364,0 + + + 1 + + + + + +157.5082,43.79277,0 157.5082,38.79276,0 157.5082,33.79276,0 157.5082,28.79276,0 157.5082,23.79276000000001,0 157.5082,18.79276,0 157.5082,17,0 157.5082,12,0 157.501,12,0 152.501,12,0 147.501,12,0 142.501,12,0 142.501,14.23089,0 142.501,19.23089,0 140.5122,19.23089,0 135.5122,19.23089,0 135.5122,23.61333000000001,0 135.5122,28.61333,0 137.5011,28.62327,0 142.501,28.64826,0 142.501,32.25372,0 142.501,37.25373,0 142.501,42.25373,0 142.943,42.10665,0 143.2463,41.92527,0 143.3169,42.04277,0 143.3297,42.28167,0 143.3738,42.36167,0 143.5955,42.61971000000001,0 143.8928,42.84916,0 144.0244,42.92139,0 144.325,42.99805,0 144.4636,42.93083,0 144.7778,42.92555,0 144.8695,42.9269,0 145.5455,43.11722,0 145.8469,43.2832,0 145.8579,43.31955,0 146.017,43.30567,0 147.0505,43.68716,0 147.4426,44.61853,0 150.3838,45.74596,0 152.32,46.87341,0 153.7416,48.22143,0 154.6484,48.93221,0 155.1141,49.64299000000001,0 156.4621,50.57436,0 156.6092,50.81945,0 156.6455,50.88888000000002,0 156.693,50.89138,0 156.8188,50.97971,0 156.8247,51.01221000000002,0 156.9511,51.06028,0 157.1417,51.19221000000002,0 157.2567,51.22970999999999,0 157.3572,51.33471,0 157.5086,51.39201,0 157.5082,50.69276,0 157.5082,48.79276000000002,0 157.5082,43.79277,0 + + + 1 + + + + + +157.5071,79.90000000000001,0 157.5071,77.646,0 158.1819,76.97113,0 158.435,76.60558,0 158.5194,76.15566,0 158.4631,75.95882,0 158.1257,75.79011,0 157.0853,75.4808,0 152.1637,74.59863,0 151.1239,74.41226,0 149.3243,74.29978,0 145.7813,74.66534,0 144.2066,74.66534,0 142.2944,74.52473000000001,0 142.2944,74.13106999999999,0 143.5036,73.76551000000001,0 143.9254,73.48432,0 144.0097,73.25936,0 143.9816,72.92194000000001,0 143.8973,72.69698,0 142.6355,67.8588,0 141.3738,63.02061,0 141.2248,62.44925000000001,0 141.3777,62.25851,0 141.469,62.21404,0 141.6523,62.03364000000001,0 141.809,62.01836000000001,0 142.0864,62.06575,0 142.2051,61.94452,0 142.2928,61.90464000000001,0 142.5545,61.97489000000001,0 142.8312,61.9179,0 142.8849,61.9355,0 143.0034,62.08195,0 143.0821,62.13218,0 143.2357,62.03323,0 143.4179,62.06457000000001,0 143.5195,62.03001,0 143.533,61.92546,0 143.6266,61.89821,0 143.7727,61.98169,0 143.8912,61.96601,0 143.9069,61.93699000000001,0 143.8109,61.79792,0 144.1019,61.75510000000001,0 144.1931,61.77938000000002,0 144.3145,61.86486,0 144.4896,61.91393,0 144.5109,61.9786,0 144.672,62.10590000000001,0 144.8737,62.09342000000001,0 145.0974,61.9896,0 145.3697,62.02246,0 145.4535,61.96645,0 145.5982,62.08148,0 145.6794,62.08096,0 146.3024,61.84119,0 146.3988,61.79554,0 146.4794,61.71044000000001,0 146.6458,61.46524000000002,0 146.5954,61.35341,0 146.6452,61.12606000000001,0 146.597,61.07125,0 146.623,61.02689,0 146.6056,61.00037,0 146.3812,60.95324,0 146.4342,60.87623000000001,0 146.3924,60.75424,0 146.2405,60.70178,0 146.0911,60.76063,0 145.9837,60.76147,0 145.8941,60.69299,0 145.6304,60.62862000000001,0 145.4411,60.52949,0 145.403,60.4785,0 145.4866,60.43041000000001,0 145.4511,60.35231,0 145.6592,60.22936,0 146.2814,60.24876,0 146.4616,60.14434000000001,0 146.5698,60.12513,0 146.6143,60.07499,0 146.6149,59.98568000000001,0 146.6968,59.94598,0 146.9257,59.95415,0 147.1046,59.86969000000001,0 147.1353,59.79827,0 147.079,59.73552,0 147.0555,59.47459000000001,0 147.0332,59.43111,0 146.8809,59.39854,0 146.8662,59.35934000000001,0 142.1674,59.0727,0 141.702,54.09441,0 141.2365,49.11613,0 140.948,46.03066,0 137.7037,45.85810000000001,0 137.6569,45.78221,0 137.3383,45.57721,0 137.1414,45.37028,0 136.8167,45.19554,0 136.7622,45.08721,0 136.6522,45.02804,0 136.5547,44.93833000000001,0 136.5533,44.88889,0 136.4497,44.82695,0 136.4413,44.76832,0 136.3608,44.79027,0 136.3075,44.73777000000001,0 136.3336,44.70361,0 136.2491,44.67194,0 136.1844,44.51305,0 135.8847,44.39832,0 135.8005,44.26333,0 135.7216,44.23499,0 135.6483,44.15943,0 135.6319,44.04944,0 135.5305,43.99166000000001,0 135.5128,43.92139,0 135.4572,43.94332,0 135.4769,43.8761,0 135.5178,43.88499,0 135.42,43.75417,0 135.273,43.68639,0 135.2497,43.72915,0 135.1833,43.70943,0 135.2266,43.68749,0 135.2225,43.6386,0 135.1297,43.49888,0 134.9686,43.4586,0 134.7639,43.30694,0 134.6997,43.30111,0 134.4167,43.14833,0 134.1883,43.07972000000001,0 134.115,42.99722,0 133.9142,42.87555,0 133.86,42.90387,0 133.7105,42.81332,0 133.6602,42.85443,0 133.5944,42.84694,0 133.3747,42.7575,0 133.2269,42.74249,0 133.1583,42.68306,0 133.0236,42.68776,0 133.0008,42.72222,0 133.0775,42.7411,0 132.9905,42.82054,0 132.8878,42.80555,0 132.853,42.73888,0 132.6667,42.8224,0 132.4611,42.77265,0 132.3549,42.70301000000001,0 132.2953,42.74943,0 132.1858,43.00813,0 132.0598,43.06119,0 131.8044,42.90532000000001,0 131.486,42.78592,0 131.4794,42.62341,0 131.2207,42.55566000000001,0 131.1678,42.57138,0 131.1919,42.59527,0 131.1397,42.60917,0 131.1133,42.66444,0 131.1022,42.61804,0 131.0228,42.645,0 130.9253,42.59333,0 130.8191,42.62693,0 130.93,42.61388,0 130.9528,42.645,0 130.7861,42.64277,0 130.8411,42.6875,0 130.7108,42.68499,0 130.6733,42.64749,0 130.7366,42.61361,0 130.7258,42.575,0 130.7703,42.59638,0 130.8711,42.52333,0 130.8383,42.51832,0 130.8305,42.46388,0 130.7789,42.45194,0 130.7539,42.34749,0 130.6974,42.29221,0 130.655,42.31388,0 130.6591,42.37665,0 130.6044,42.42186,0 130.5591,42.50667000000001,0 130.618,42.57944000000001,0 130.6052,42.61971000000001,0 130.5389,42.68194,0 130.4589,42.67999,0 130.4052,42.71804,0 130.638,42.83167,0 130.7705,42.83194,0 130.8186,42.87610000000001,0 131.0153,42.855,0 131.0458,42.90193,0 131.1322,42.91916,0 131.1047,43.03611,0 131.2144,43.13305,0 131.1911,43.19665,0 131.2611,43.26445,0 131.2741,43.36333,0 131.3114,43.39222,0 131.3044,43.45583,0 131.223,43.51167,0 131.1944,43.52777,0 131.1889,43.53666,0 131.2205,43.59527,0 131.1991,43.81889,0 131.2461,43.91806,0 131.2311,43.97387,0 131.2472,44.0275,0 131.298,44.05194,0 131.0955,44.69137,0 130.9539,44.8461,0 131.0425,44.86333,0 131.118,44.92583,0 131.2125,44.91055,0 131.35,44.97471,0 131.4666,44.96721,0 131.6444,45.10555,0 131.6464,45.19887,0 131.7536,45.21305000000001,0 131.8647,45.34555,0 131.9886,45.24194,0 132.9233,45.02194000000001,0 133.0333,45.06167,0 133.1222,45.12860000000001,0 133.0925,45.24415,0 133.1491,45.45083000000001,0 133.1905,45.50416000000001,0 133.4171,45.5691,0 133.4191,45.60722,0 133.4683,45.62222,0 133.4533,45.64722,0 133.4886,45.68277000000001,0 133.4419,45.69804,0 133.508,45.77777,0 133.4747,45.82027999999999,0 133.5222,45.88665,0 133.583,45.87137,0 133.6108,45.93194,0 133.6605,45.93458,0 133.7247,46.06528,0 133.6869,46.14332,0 133.9002,46.25031000000001,0 133.8839,46.29361,0 133.9102,46.31444,0 133.8619,46.33138,0 133.9286,46.39249,0 133.85,46.43999,0 133.8458,46.47554000000001,0 133.9016,46.57222,0 133.9977,46.64016,0 134.0438,46.75289999999999,0 134.0119,46.82389,0 134.0669,46.9161,0 134.0627,46.97527000000001,0 134.1312,47.07423,0 134.2222,47.11083000000001,0 134.1947,47.20665000000001,0 134.1478,47.24942999999999,0 134.1825,47.32332000000001,0 134.3147,47.4211,0 134.4791,47.42778,0 134.5521,47.46692,0 134.6741,47.57194,0 134.6836,47.62972,0 134.7672,47.7075,0 134.7703,47.73944,0 134.6844,47.80090000000001,0 134.6619,47.87417,0 134.5988,47.90471,0 134.5572,47.99471000000001,0 134.5839,48.06276,0 134.6678,48.10722,0 134.6814,48.22055,0 134.7408,48.26712,0 134.6105,48.30694,0 134.5718,48.36446000000001,0 134.4827,48.35028,0 134.4153,48.39112,0 134.0458,48.32528000000001,0 133.978,48.25972000000001,0 133.7514,48.24972,0 133.6964,48.18694,0 133.5936,48.17249,0 133.5067,48.07138000000001,0 133.3872,48.10528,0 133.0886,48.10167,0 133.018,48.03528000000001,0 132.8844,48.00860999999999,0 132.8089,47.94194,0 132.6714,47.94972000000001,0 132.6597,47.86583,0 132.5425,47.71389000000001,0 132.3411,47.74248999999999,0 131.9194,47.66999,0 131.6783,47.69915000000002,0 131.5755,47.6561,0 131.5372,47.71888,0 131.4167,47.7386,0 131.0405,47.67583,0 130.9464,47.71138,0 130.9461,47.80055,0 130.8897,47.90028,0 130.6814,48.04554,0 130.6594,48.0986,0 130.8322,48.29694,0 130.7375,48.41833,0 130.7578,48.48805,0 130.6269,48.47720000000001,0 130.6175,48.56194000000001,0 130.523,48.60277,0 130.675,48.84415000000001,0 130.6277,48.87465,0 130.5044,48.85194,0 130.5996,48.93345,0 130.9003,48.97752000000001,0 130.9823,49.16279999999999,0 131.0539,49.22533,0 131.3584,49.25607,0 131.4312,49.3426,0 131.456,49.56964,0 131.3988,49.67189000000001,0 131.3354,49.7038,0 131.4655,49.74212,0 131.4792,49.77464,0 131.4545,49.94840000000001,0 131.3611,50.08953,0 131.4482,50.18406000000001,0 131.2058,50.37281,0 131.0443,50.37701,0 130.848,50.43361,0 130.84,50.48763,0 130.9257,50.52943,0 130.9657,50.59039000000001,0 130.8691,50.65911,0 130.7555,50.65919000000002,0 130.6539,50.59364000000001,0 130.5924,50.61773000000001,0 130.7764,50.89289,0 130.649,50.9649,0 130.6651,50.99669,0 130.8353,51.0568,0 130.8823,51.1259,0 131.1296,51.25358000000001,0 131.1841,51.33065,0 131.4163,51.37443,0 131.4344,51.40771,0 131.3763,51.68487,0 131.6162,51.66434000000002,0 132.0319,51.81518,0 132.2201,51.81065,0 132.2938,51.84838000000001,0 132.3687,51.9752,0 132.4668,51.94439000000001,0 132.5923,52.10018000000001,0 132.7906,52.16892,0 133.1079,52.16774000000001,0 133.3551,52.22758,0 133.3646,52.27884,0 133.1884,52.43139000000001,0 133.2161,52.52879,0 133.1741,52.56192000000001,0 133.2485,52.66451,0 133.4076,52.67120000000001,0 133.9606,52.47187,0 134.1073,52.49435,0 134.5898,52.42293,0 134.644,52.49686,0 134.5947,52.53989,0 134.605,52.58288,0 134.7453,52.68349,0 134.5818,52.77556,0 134.572,52.87017000000001,0 134.6294,52.97923,0 134.8581,53.2211,0 134.8416,53.30129,0 134.7772,53.35156000000001,0 134.8063,53.39867,0 134.8608,53.39223,0 134.8939,53.42523000000001,0 134.4765,53.65137,0 134.045,53.46778000000001,0 133.7953,53.50423,0 133.6865,53.48001000000001,0 133.5405,53.55013,0 133.2816,53.50229000000001,0 133.1567,53.32175,0 132.9397,53.31208,0 132.7966,53.23391,0 132.1492,53.28006000000001,0 132.0767,53.2618,0 131.9606,53.16412,0 131.8363,53.20384,0 131.8331,53.2546,0 131.7383,53.28881000000001,0 131.4342,53.24406,0 131.4033,53.26408,0 131.4433,53.50145,0 131.369,53.75986,0 131.0603,53.87516000000001,0 130.8468,53.80831,0 130.7704,53.82110999999999,0 130.6684,53.88879,0 130.5371,53.88297000000001,0 130.4453,53.91442,0 130.4401,53.95286000000001,0 130.5956,54.16706,0 130.7881,54.30889,0 131.0439,54.32481000000001,0 131.1084,54.36098,0 131.2404,54.51491,0 131.2688,54.64863,0 131.4381,54.76270000000001,0 131.6391,54.78865,0 131.8497,54.86316000000001,0 132.102,55.05344000000001,0 132.3182,55.10742,0 132.4052,55.2324,0 132.5812,55.26958,0 132.7062,55.3788,0 132.9172,55.40487,0 132.8499,55.45721000000001,0 132.6032,55.50863,0 132.6198,55.5598,0 132.6778,55.5961,0 132.6783,55.64597,0 132.5187,55.73038,0 132.2958,55.75039,0 131.8277,55.67754,0 131.5875,55.7055,0 131.0922,55.68167,0 131.0924,55.7413,0 130.974,55.9278,0 131.1664,56.29863,0 131.182,56.41776000000001,0 131.3082,56.48672,0 131.4501,56.48512000000001,0 131.5154,56.54887000000001,0 131.7346,56.49774000000001,0 131.7752,56.62872,0 131.8783,56.76854,0 131.5165,57.0938,0 131.3337,57.16616000000001,0 131.1787,57.17673,0 131.1433,57.21137000000001,0 131.2694,57.28938,0 131.2796,57.36280000000001,0 131.5491,57.25599,0 131.66,57.27824,0 131.6878,57.45025,0 131.8647,57.60706,0 132.0838,57.63795,0 132.1476,57.72349000000001,0 131.8702,57.83329000000001,0 131.8208,57.9631,0 131.6874,58.0066,0 131.6564,58.07726000000001,0 131.5467,58.14072,0 131.5448,58.17016000000001,0 131.5646,58.1936,0 131.732,58.18654,0 132.1542,58.06819,0 132.0923,58.2122,0 132.2631,58.30735,0 132.1915,58.47281,0 132.2431,58.51441000000001,0 132.404,58.50661,0 132.539,58.58086,0 132.5681,58.63096000000001,0 132.5582,58.80028999999999,0 132.6281,58.88062,0 132.905,58.92134000000001,0 132.9268,58.97153000000001,0 132.8588,59.02208000000001,0 132.8709,59.06711,0 132.678,61.42275999999999,0 132.2701,66.40608,0 131.8621,71.38942,0 131.8621,75.29801999999999,0 133.9557,76.04201000000001,0 138.667,77.71629,0 142.5194,77.68817,0 142.5194,79.90000000000001,0 142.5194,84.90001,0 142.5194,89.90000000000001,0 143.5186,89.90000000000001,0 144.5178,89.90000000000001,0 145.5169,89.90000000000001,0 146.5161,89.90000000000001,0 147.5153,89.90000000000001,0 148.5145,89.90000000000001,0 149.5136,89.90000000000001,0 150.5128,89.90000000000001,0 151.512,89.90000000000001,0 152.5112,89.90000000000001,0 153.5104,89.90000000000001,0 154.5095,89.90000000000001,0 155.5087,89.90000000000001,0 156.5079,89.90000000000001,0 157.5071,89.90000000000001,0 157.5071,84.90001,0 157.5071,79.90000000000001,0 + + + 1 + + + + + GMT +10:30 + + +]]> + #khStyle1050 + + + + +157.8347,-33.62319,0 157.833,-30.36589,0 162.833,-30.36515,0 164.8248,-30.36486,0 164.8248,-33.62319,0 159.8248,-33.62319,0 157.8347,-33.62319,0 + + + 1 + + + + GMT +11:00 + + +]]> + #khStyle1100 + + + + + +166.3565,-27.96984000000001,0 166.3565,-30.78259,0 167.5012,-30.78259,0 172.5012,-30.78259,0 172.5012,-32.24902,0 169.8135,-36.46523,0 167.1259,-40.68143,0 165.0656,-43.91332,0 165.0573,-48.91331,0 165.049,-53.9133,0 165.048,-54.52042000000001,0 170.048,-54.52042000000001,0 172.5188,-54.52042000000001,0 172.5163,-59.52043,0 172.5138,-64.52042,0 172.5113,-69.52042,0 172.5088,-74.52042,0 172.5063,-79.52042,0 172.5038,-84.52042000000002,0 172.5013,-89.52042,0 172.5011,-89.90000000000001,0 171.5022,-89.90000000000001,0 170.5033,-89.90000000000001,0 169.5044,-89.90000000000001,0 168.5055,-89.90000000000001,0 167.5066,-89.90000000000001,0 166.5077,-89.90000000000001,0 165.5088,-89.90000000000001,0 164.5099,-89.90000000000001,0 163.511,-89.90000000000001,0 162.5121,-89.90000000000001,0 161.5132,-89.90000000000001,0 160.5143,-89.90000000000001,0 159.5154,-89.90000000000001,0 158.5165,-89.90000000000001,0 157.5176,-89.90000000000001,0 157.5176,-89.00436000000001,0 157.5176,-84.00436000000001,0 157.5176,-79.00436000000001,0 157.5176,-74.00436000000001,0 157.5176,-69.00436000000001,0 157.5176,-64.00436000000001,0 157.5176,-59.00436,0 157.5176,-54.30436,0 157.5176,-49.30437,0 157.5176,-44.30436,0 157.5176,-39.30436,0 157.5176,-39.20436,0 157.5176,-34.20436,0 157.5176,-29.20436000000001,0 157.5176,-24.20437,0 157.5176,-19.20436,0 157.5176,-14.20437,0 157.5176,-9.204364,0 155,-7.3,0 157.5176,-5.728428,0 157.5176,-5.022757,0 157.5176,-0.02275254,0 156,-0.02066454,0 151,-0.01377954,0 146,-0.00688554,0 141,-5.400000000000001e-007,0 137,1.199996,0 137,6.166665000000001,0 137,11.16666,0 138.3636,12,0 142.501,12,0 147.501,12,0 152.501,12,0 157.501,12,0 157.5082,12,0 157.5082,17,0 157.5082,18.79276,0 157.5082,23.79276000000001,0 157.5082,28.79276,0 157.5082,33.79276,0 157.5082,38.79276,0 157.5082,43.79277,0 157.5082,48.79276000000002,0 157.5082,50.69276,0 162.5082,50.68582000000001,0 167.5082,50.67888,0 172.5082,50.67194,0 172.5127,50.67192,0 172.5106,45.67193000000001,0 172.5085,40.67192,0 172.5064,35.67193,0 172.5043,30.67193,0 172.5022,25.67193,0 172.5002,20.86006,0 167.5002,20.85992,0 162.5002,20.85979,0 160.5733,20.85973,0 160.5671,15.85973,0 160.5609,10.85973,0 160.5546,5.859737,0 160.5484,0.8597425000000001,0 160.5444,-2.353266,0 165.5444,-2.354284,0 170.5444,-2.355309,0 172.5015,-2.355705,0 172.5014,-7.35571,0 172.5014,-12.35571,0 172.5013,-17.35571,0 172.5013,-22.35571,0 172.5013,-27.35571,0 172.5013,-27.96984000000001,0 171.3565,-27.96984000000001,0 166.3565,-27.96984000000001,0 + + + + + +157.833,-30.36589,0 157.8347,-33.62319,0 159.8248,-33.62319,0 164.8248,-33.62319,0 164.8248,-30.36486,0 162.833,-30.36515,0 157.833,-30.36589,0 + + + 1 + + + + + +172.5346,74.89999,0 172.5346,71.32091,0 167.5346,71.32091,0 162.5346,71.32091,0 159.7593,71.32091,0 160.3981,70.18025,0 160.6752,70.07872999999999,0 160.9,70.04337,0 162.2945,69.98492,0 162.3981,69.86644,0 162.4037,69.67095000000001,0 162.271,69.58094000000001,0 162.2592,69.52155000000001,0 162.1759,69.45047,0 162.1934,69.42339,0 162.4407,69.38332,0 162.8192,69.22402,0 162.5843,69.15031000000001,0 162.5256,69.11716,0 162.4894,69.04481,0 162.4924,69.00284000000001,0 162.5952,68.95761,0 162.6687,68.86439000000001,0 162.5342,68.81356,0 162.4721,68.75452,0 162.6575,68.64811,0 162.5248,68.5097,0 162.516,68.39265,0 162.4043,68.32226,0 161.9774,68.33798,0 161.3543,68.46493,0 160.8015,68.27876000000001,0 160.4726,68.27036,0 160.0085,68.31707,0 159.7156,68.27837,0 159.6493,68.22415,0 159.4943,68.19717,0 159.219,68.22060000000001,0 158.8942,68.17033000000001,0 158.4859,68.15252,0 158.1873,68.05862000000001,0 157.957,67.91137000000001,0 157.9457,67.8794,0 158.1858,67.82414000000001,0 158.2565,67.76581,0 158.1298,67.73808,0 157.772,67.74168,0 157.6639,67.70263,0 157.6332,67.61433,0 157.822,67.39413999999999,0 157.8414,67.30539,0 158.5028,67.09791,0 158.7005,67.06403,0 158.7453,66.92084,0 158.8598,66.84213,0 158.8488,66.78941,0 158.6252,66.67805,0 158.4739,66.56100000000001,0 158.2896,66.48923000000001,0 158.2673,66.45123,0 158.4219,66.36732000000001,0 158.5064,66.35485,0 158.7805,66.2747,0 159.2178,66.20954999999999,0 159.1812,66.14093,0 158.9673,65.98079,0 158.9386,65.85458000000001,0 158.8529,65.72281,0 159.01,65.70184,0 159.2512,65.61183,0 160.0269,65.49356,0 160.2953,65.31647,0 160.4545,65.15871,0 161.2346,65.12815000000001,0 161.595,64.98701,0 161.8677,64.81350000000001,0 162.2872,64.74589,0 162.4811,64.75023,0 162.7342,64.67844,0 163.1004,64.66866,0 163.1754,64.69203,0 163.1694,64.79909000000001,0 163.2627,64.74456000000001,0 163.1777,64.67222,0 163.1747,64.62662,0 163.3588,64.38509000000001,0 163.2731,64.30114,0 163.2748,64.25255,0 163.2118,64.2088,0 163.0435,64.23567,0 162.7443,64.17494000000001,0 162.7434,64.14100000000001,0 162.8791,64.04618000000001,0 162.9514,63.91394,0 162.7401,63.85479,0 162.6724,63.80212,0 162.7899,63.71773,0 162.9543,63.65721000000001,0 162.9894,63.51587000000001,0 162.6794,63.42236000000001,0 162.7222,63.37083,0 162.8369,63.33097,0 162.835,63.26305,0 162.6071,63.20139000000001,0 162.5314,63.12977,0 162.2438,63.13342000000001,0 162.169,63.02766,0 162.1873,62.96365000000001,0 162.244,62.93481,0 162.5737,62.85993,0 162.633,62.83200000000002,0 162.6456,62.77090000000001,0 162.8105,62.71667000000002,0 162.72,62.65807,0 162.7746,62.47603,0 162.7042,62.35186,0 162.529,62.28267000000001,0 162.1591,62.23799,0 162.1606,62.20911000000001,0 162.5421,62.11821000000001,0 162.5609,62.07495,0 162.5376,62.0244,0 162.4909,61.99523,0 162.3335,61.98738,0 162.3959,61.93176,0 162.4478,61.67067000000001,0 162.2883,61.62471000000001,0 162.2875,61.58943,0 162.0422,61.45555,0 162.023,61.41777,0 161.9286,61.37778,0 161.883,61.42944,0 161.8658,61.35054,0 161.8005,61.38082000000001,0 161.7422,61.30804000000001,0 161.5633,61.26694000000001,0 161.6155,61.24305,0 161.5725,61.20193,0 161.473,61.20444000000001,0 161.4155,61.16693,0 161.43,61.13221000000001,0 161.2161,61.06555,0 161.1658,61.00054,0 160.9008,60.90942,0 160.7978,60.73527,0 160.6705,60.77638,0 160.6186,60.7311,0 160.5602,60.75861,0 160.443,60.71249,0 160.4003,60.73332,0 160.4228,60.75722,0 160.3777,60.75139999999999,0 160.3389,60.71776,0 160.3533,60.69332,0 160.2611,60.62555,0 160.1378,60.58359999999999,0 160.1244,60.6786,0 160.1852,60.68888,0 160.2247,60.73721,0 160.2247,60.78443999999999,0 160.1619,60.83778,0 160.3519,60.92221,0 160.3322,60.9547,0 160.4319,61.04721,0 160.1642,61.05082,0 159.8705,60.9286,0 159.7805,60.94083,0 159.7964,60.97776,0 159.9769,61.12111,0 159.94,61.14360000000001,0 159.9516,61.1825,0 159.9011,61.21083,0 159.918,61.24888,0 159.7455,61.25083,0 159.84,61.31192999999999,0 159.9325,61.28334,0 159.9922,61.30888,0 159.8905,61.32861,0 159.9708,61.39861000000001,0 160.0369,61.38694,0 160.0255,61.41526,0 160.0791,61.44833,0 160.0083,61.46194000000001,0 160.2297,61.56361,0 160.2311,61.63611,0 160.2839,61.66249,0 160.2372,61.70249,0 160.3738,61.77804,0 160.3461,61.81889,0 160.3736,61.84276,0 160.3452,61.87082000000001,0 160.3652,61.9086,0 160.3344,61.92333,0 160.3549,61.94749000000001,0 159.9602,61.82333000000001,0 159.8375,61.71221,0 159.6711,61.7236,0 159.5311,61.66276,0 159.485,61.7197,0 159.5378,61.82027000000001,0 159.4458,61.77443,0 159.3341,61.82666,0 159.3816,61.85917,0 159.3697,61.88777000000001,0 159.2475,61.92222,0 158.9055,61.89582,0 158.8386,61.85749,0 158.8472,61.81777,0 158.6333,61.83500000000001,0 158.5189,61.79167000000001,0 158.4377,61.82444,0 158.2978,61.82167,0 158.0283,61.72999,0 157.9,61.78556,0 157.5038,61.80479,0 157.5038,57.82619,0 157.4064,57.785,0 157.1744,57.77193000000001,0 157.0489,57.80028,0 156.985,57.85361,0 156.7869,57.76361,0 156.7488,57.72833000000001,0 156.8455,57.72554000000002,0 156.9355,57.64054,0 156.9805,57.52777,0 156.9778,57.41444,0 156.6953,57.10860000000001,0 156.7194,57.08416,0 156.6794,57.0425,0 156.5472,57.1075,0 156.4544,56.95722,0 156.1997,56.85666,0 156.1978,56.81694000000001,0 156.0633,56.71471,0 156.0747,56.75999000000002,0 156.1689,56.83526000000001,0 156.1044,56.81527000000001,0 155.9408,56.63360999999999,0 155.7361,56.13693,0 155.76,56.1061,0 155.6986,56.06554000000001,0 155.6461,55.91194000000002,0 155.6183,55.62138,0 155.5441,55.3036,0 155.6994,54.51250000000001,0 155.9408,53.84694,0 155.9194,53.83749,0 156.0858,53.09778000000001,0 156.1033,52.84916,0 156.2608,52.56722,0 156.365,52.51666,0 156.4411,52.52083,0 156.37,52.44249,0 156.3655,52.49527,0 156.2775,52.52361,0 156.4247,52.20916,0 156.4919,51.93166000000001,0 156.4727,51.51361000000001,0 156.5164,51.41667,0 156.518,51.32277,0 156.5514,51.27388,0 156.6736,51.22943000000001,0 156.708,51.18444,0 156.7016,51.09833,0 156.7461,51.07443,0 156.7455,50.98777000000001,0 156.6455,50.88888000000002,0 156.6092,50.81945,0 156.4621,50.57436,0 155.1141,49.64299000000001,0 154.6484,48.93221,0 153.7416,48.22143,0 152.32,46.87341,0 150.3838,45.74596,0 147.4426,44.61853,0 147.0505,43.68716,0 146.017,43.30567,0 145.8579,43.31955,0 145.8775,43.38366,0 145.6765,43.53654,0 145.5292,44.44866,0 140.948,46.03066,0 141.2365,49.11613,0 141.702,54.09441,0 142.1674,59.0727,0 146.8662,59.35934000000001,0 146.8809,59.39854,0 147.0332,59.43111,0 147.0555,59.47459000000001,0 147.079,59.73552,0 147.1353,59.79827,0 147.1046,59.86969000000001,0 146.9257,59.95415,0 146.6968,59.94598,0 146.6149,59.98568000000001,0 146.6143,60.07499,0 146.5698,60.12513,0 146.4616,60.14434000000001,0 146.2814,60.24876,0 145.6592,60.22936,0 145.4511,60.35231,0 145.4866,60.43041000000001,0 145.403,60.4785,0 145.4411,60.52949,0 145.6304,60.62862000000001,0 145.8941,60.69299,0 145.9837,60.76147,0 146.0911,60.76063,0 146.2405,60.70178,0 146.3924,60.75424,0 146.4342,60.87623000000001,0 146.3812,60.95324,0 146.6056,61.00037,0 146.623,61.02689,0 146.597,61.07125,0 146.6452,61.12606000000001,0 146.5954,61.35341,0 146.6458,61.46524000000002,0 146.4794,61.71044000000001,0 146.3988,61.79554,0 146.3024,61.84119,0 145.6794,62.08096,0 145.5982,62.08148,0 145.4535,61.96645,0 145.3697,62.02246,0 145.0974,61.9896,0 144.8737,62.09342000000001,0 144.672,62.10590000000001,0 144.5109,61.9786,0 144.4896,61.91393,0 144.3145,61.86486,0 144.1931,61.77938000000002,0 144.1019,61.75510000000001,0 143.8109,61.79792,0 143.9069,61.93699000000001,0 143.8912,61.96601,0 143.7727,61.98169,0 143.6266,61.89821,0 143.533,61.92546,0 143.5195,62.03001,0 143.4179,62.06457000000001,0 143.2357,62.03323,0 143.0821,62.13218,0 143.0034,62.08195,0 142.8849,61.9355,0 142.8312,61.9179,0 142.5545,61.97489000000001,0 142.2928,61.90464000000001,0 142.2051,61.94452,0 142.0864,62.06575,0 141.809,62.01836000000001,0 141.6523,62.03364000000001,0 141.469,62.21404,0 141.3777,62.25851,0 141.2248,62.44925000000001,0 141.3738,63.02061,0 142.6355,67.8588,0 143.8973,72.69698,0 143.9816,72.92194000000001,0 144.0097,73.25936,0 143.9254,73.48432,0 143.5036,73.76551000000001,0 142.2944,74.13106999999999,0 142.2944,74.52473000000001,0 144.2066,74.66534,0 145.7813,74.66534,0 149.3243,74.29978,0 151.1239,74.41226,0 152.1637,74.59863,0 157.0853,75.4808,0 158.1257,75.79011,0 158.4631,75.95882,0 158.5194,76.15566,0 158.435,76.60558,0 158.1819,76.97113,0 157.5071,77.646,0 157.5071,79.90000000000001,0 157.5071,84.90001,0 157.5071,89.90000000000001,0 158.4463,89.90000000000001,0 159.3855,89.90000000000001,0 160.3247,89.90000000000001,0 161.264,89.90000000000001,0 162.2032,89.90000000000001,0 163.1424,89.90000000000001,0 164.0816,89.90000000000001,0 165.0208,89.90000000000001,0 165.9601,89.90000000000001,0 166.8993,89.90000000000001,0 167.8385,89.90000000000001,0 168.7777,89.90000000000001,0 169.7169,89.90000000000001,0 170.6562,89.90000000000001,0 171.5954,89.90000000000001,0 172.5346,89.90000000000001,0 172.5346,84.90001,0 172.5346,79.90000000000001,0 172.5346,74.89999,0 + + + 1 + + + + + GMT +11:30 + + +]]> + #khStyle1150 + + + + +172.5013,-27.96984000000001,0 172.5012,-30.78259,0 167.5012,-30.78259,0 166.3565,-30.78259,0 166.3565,-27.96984000000001,0 171.3565,-27.96984000000001,0 172.5013,-27.96984000000001,0 + + + 1 + + + + GMT +12:00 + + +]]> + #khStyle1200 + + + + + +-172.5,-38.5,0 -172.5,-43.5,0 -172.5,-45,0 -176.2216,-48.22535,0 -180,-51.50000000000001,0 -180,-46.50682,0 -175.0824,-46.50682,0 -175.0824,-43.00079,0 -180,-43.00079,0 -180,-38.5,0 -180,-33.5,0 -180,-28.5,0 -180,-23.5,0 -175,-23.5,0 -172.5,-23.5,0 -172.5,-28.5,0 -172.5,-33.5,0 -172.5,-38.5,0 + + + 1 + + + + + +-177,-20.99139,0 -180,-21.87818,0 -180,-20,0 -180,-15,0 -180,-10,0 -180,-4.999996,0 -177,-9.000000999999999,0 -174,-13,0 -172.5,-15,0 -177,-15,0 -177,-15.99139,0 -177,-20.99139,0 + + + 1 + + + + + +-177.5929,60.38517000000001,0 -180,58.95238000000001,0 -180,60.00000000000001,0 -180,65,0 -180,70,0 -180,75,0 -175.7817,72.31562,0 -172.509,70.23302,0 -169,68,0 -169,65.5,0 -173.2965,62.94258000000001,0 -177.5929,60.38517000000001,0 + + + 1 + + + + + +180,68.95238000000001,0 180,63.95238000000001,0 180,58.95238000000001,0 177.7114,57.59015000000001,0 173.415,55.03272,0 170,53,0 171.5334,52.23330000000001,0 176.0055,49.99722,0 180,48,0 180,46.99903,0 180,41.99904,0 180,36.99903,0 180,31.99903000000001,0 180,26.99904,0 180,21.99903,0 180,16.99904,0 180,11.99903,0 180,6.999039000000001,0 180,1.999034,0 180,-3.000961,0 180,-8.000964,0 180,-13.00097,0 180,-18.00096,0 180,-23.00097,0 180,-28.00096,0 180,-33.00097,0 180,-38.00096,0 180,-43.00097,0 177.8549,-43.00097,0 176.0435,-45.19365,0 176.0435,-46.50451,0 180,-46.50451,0 180,-49.90001,0 180,-54.9,0 180,-59.90001,0 180,-64.90000000000001,0 180,-69.90000000000001,0 180,-74.90000000000001,0 180,-79.90000000000001,0 180,-84.89999,0 180,-89.90000000000001,0 179.0627,-89.90000000000001,0 178.1253,-89.90000000000001,0 177.1879,-89.90000000000001,0 176.2506,-89.90000000000001,0 175.3132,-89.90000000000001,0 174.3758,-89.90000000000001,0 173.4385,-89.90000000000001,0 172.5011,-89.90000000000001,0 172.5013,-89.52042,0 172.5038,-84.52042000000002,0 172.5063,-79.52042,0 172.5088,-74.52042,0 172.5113,-69.52042,0 172.5138,-64.52042,0 172.5163,-59.52043,0 172.5188,-54.52042000000001,0 170.048,-54.52042000000001,0 165.048,-54.52042000000001,0 165.049,-53.9133,0 165.0573,-48.91331,0 165.0656,-43.91332,0 167.1259,-40.68143,0 169.8135,-36.46523,0 172.5012,-32.24902,0 172.5012,-30.78259,0 172.5013,-27.96984000000001,0 172.5013,-27.35571,0 172.5013,-22.35571,0 172.5013,-17.35571,0 172.5014,-12.3557,0 172.5014,-7.35571,0 172.5015,-2.355705,0 170.5444,-2.355309,0 165.5444,-2.354284,0 160.5444,-2.353266,0 160.5484,0.8597425000000001,0 160.5546,5.859737,0 160.5609,10.85973,0 160.5671,15.85973,0 160.5733,20.85973,0 162.5002,20.85979,0 167.5002,20.85992,0 172.5002,20.86006,0 172.5022,25.67193,0 172.5043,30.67193,0 172.5064,35.67193,0 172.5085,40.67192,0 172.5106,45.67193000000001,0 172.5127,50.67192,0 172.5082,50.67194,0 167.5082,50.67888,0 162.5082,50.68582000000001,0 157.5082,50.69276,0 157.5086,51.39201,0 157.3572,51.33471,0 157.2567,51.22970999999999,0 157.1417,51.19221000000002,0 156.9511,51.06028,0 156.8247,51.01221000000002,0 156.8188,50.97971,0 156.693,50.89138,0 156.6455,50.88888000000002,0 156.7455,50.98777000000001,0 156.7461,51.07443,0 156.7016,51.09833,0 156.708,51.18444,0 156.6736,51.22943000000001,0 156.5514,51.27388,0 156.518,51.32277,0 156.5164,51.41667,0 156.4727,51.51361000000001,0 156.4919,51.93166000000001,0 156.4247,52.20916,0 156.2775,52.52361,0 156.3655,52.49527,0 156.37,52.44249,0 156.4411,52.52083,0 156.365,52.51666,0 156.2608,52.56722,0 156.1033,52.84916,0 156.0858,53.09778000000001,0 155.9194,53.83749,0 155.9408,53.84694,0 155.6994,54.51250000000001,0 155.5441,55.3036,0 155.6183,55.62138,0 155.6461,55.91194000000002,0 155.6986,56.06554000000001,0 155.76,56.1061,0 155.7361,56.13693,0 155.9408,56.63360999999999,0 156.1044,56.81527000000001,0 156.1689,56.83526000000001,0 156.0747,56.75999000000002,0 156.0633,56.71471,0 156.1978,56.81694000000001,0 156.1997,56.85666,0 156.4544,56.95722,0 156.5472,57.1075,0 156.6794,57.0425,0 156.7194,57.08416,0 156.6953,57.10860000000001,0 156.9778,57.41444,0 156.9805,57.52777,0 156.9355,57.64054,0 156.8455,57.72554000000002,0 156.7488,57.72833000000001,0 156.7869,57.76361,0 156.985,57.85361,0 157.0489,57.80028,0 157.1744,57.77193000000001,0 157.4064,57.785,0 157.5038,57.82619,0 157.5038,61.80479,0 157.9,61.78556,0 158.0283,61.72999,0 158.2978,61.82167,0 158.4377,61.82444,0 158.5189,61.79167000000001,0 158.6333,61.83500000000001,0 158.8472,61.81777,0 158.8386,61.85749,0 158.9055,61.89582,0 159.2475,61.92222,0 159.3697,61.88777000000001,0 159.3816,61.85917,0 159.3341,61.82666,0 159.4458,61.77443,0 159.5378,61.82027000000001,0 159.485,61.7197,0 159.5311,61.66276,0 159.6711,61.7236,0 159.8375,61.71221,0 159.9602,61.82333000000001,0 160.3549,61.94749000000001,0 160.3344,61.92333,0 160.3652,61.9086,0 160.3452,61.87082000000001,0 160.3736,61.84276,0 160.3461,61.81889,0 160.3738,61.77804,0 160.2372,61.70249,0 160.2839,61.66249,0 160.2311,61.63611,0 160.2297,61.56361,0 160.0083,61.46194000000001,0 160.0791,61.44833,0 160.0255,61.41526,0 160.0369,61.38694,0 159.9708,61.39861000000001,0 159.8905,61.32861,0 159.9922,61.30888,0 159.9325,61.28334,0 159.84,61.31192999999999,0 159.7455,61.25083,0 159.918,61.24888,0 159.9011,61.21083,0 159.9516,61.1825,0 159.94,61.14360000000001,0 159.9769,61.12111,0 159.7964,60.97776,0 159.7805,60.94083,0 159.8705,60.9286,0 160.1642,61.05082,0 160.4319,61.04721,0 160.3322,60.9547,0 160.3519,60.92221,0 160.1619,60.83778,0 160.2247,60.78443999999999,0 160.2247,60.73721,0 160.1852,60.68888,0 160.1244,60.6786,0 160.1378,60.58359999999999,0 160.2611,60.62555,0 160.3533,60.69332,0 160.3389,60.71776,0 160.3777,60.75139999999999,0 160.4228,60.75722,0 160.4003,60.73332,0 160.443,60.71249,0 160.5602,60.75861,0 160.6186,60.7311,0 160.6705,60.77638,0 160.7978,60.73527,0 160.9008,60.90942,0 161.1658,61.00054,0 161.2161,61.06555,0 161.43,61.13221000000001,0 161.4155,61.16693,0 161.473,61.20444000000001,0 161.5725,61.20193,0 161.6155,61.24305,0 161.5633,61.26694000000001,0 161.7422,61.30804000000001,0 161.8005,61.38082000000001,0 161.8658,61.35054,0 161.883,61.42944,0 161.9286,61.37778,0 162.023,61.41777,0 162.0422,61.45555,0 162.2875,61.58943,0 162.2883,61.62471000000001,0 162.4478,61.67067000000001,0 162.3959,61.93176,0 162.3335,61.98738,0 162.4909,61.99523,0 162.5376,62.0244,0 162.5609,62.07495,0 162.5421,62.11821000000001,0 162.1606,62.20911000000001,0 162.1591,62.23799,0 162.529,62.28267000000001,0 162.7042,62.35186,0 162.7746,62.47603,0 162.72,62.65807,0 162.8105,62.71667000000002,0 162.6456,62.77090000000001,0 162.633,62.83200000000002,0 162.5737,62.85993,0 162.244,62.93481,0 162.1873,62.96365000000001,0 162.169,63.02766,0 162.2438,63.13342000000001,0 162.5314,63.12977,0 162.6071,63.20139000000001,0 162.835,63.26305,0 162.8369,63.33097,0 162.7222,63.37083,0 162.6794,63.42236000000001,0 162.9894,63.51587000000001,0 162.9543,63.65721000000001,0 162.7899,63.71773,0 162.6724,63.80212,0 162.7401,63.85479,0 162.9514,63.91394,0 162.8791,64.04618000000001,0 162.7434,64.14100000000001,0 162.7443,64.17494000000001,0 163.0435,64.23567,0 163.2118,64.2088,0 163.2748,64.25255,0 163.2731,64.30114,0 163.3588,64.38509000000001,0 163.1747,64.62662,0 163.1777,64.67222,0 163.2627,64.74456000000001,0 163.1694,64.79909000000001,0 163.1754,64.69203,0 163.1004,64.66866,0 162.7342,64.67844,0 162.4811,64.75023,0 162.2872,64.74589,0 161.8677,64.81350000000001,0 161.595,64.98701,0 161.2346,65.12815000000001,0 160.4545,65.15871,0 160.2953,65.31647,0 160.0269,65.49356,0 159.2512,65.61183,0 159.01,65.70184,0 158.8529,65.72281,0 158.9386,65.85458000000001,0 158.9673,65.98079,0 159.1812,66.14093,0 159.2178,66.20954999999999,0 158.7805,66.2747,0 158.5064,66.35485,0 158.4219,66.36732000000001,0 158.2673,66.45123,0 158.2896,66.48923000000001,0 158.4739,66.56100000000001,0 158.6252,66.67805,0 158.8488,66.78941,0 158.8598,66.84213,0 158.7453,66.92084,0 158.7005,67.06403,0 158.5028,67.09791,0 157.8414,67.30539,0 157.822,67.39413999999999,0 157.6332,67.61433,0 157.6639,67.70263,0 157.772,67.74168,0 158.1298,67.73808,0 158.2565,67.76581,0 158.1858,67.82414000000001,0 157.9457,67.8794,0 157.957,67.91137000000001,0 158.1873,68.05862000000001,0 158.4859,68.15252,0 158.8942,68.17033000000001,0 159.219,68.22060000000001,0 159.4943,68.19717,0 159.6493,68.22415,0 159.7156,68.27837,0 160.0085,68.31707,0 160.4726,68.27036,0 160.8015,68.27876000000001,0 161.3543,68.46493,0 161.9774,68.33798,0 162.4043,68.32226,0 162.516,68.39265,0 162.5248,68.5097,0 162.6575,68.64811,0 162.4721,68.75452,0 162.5342,68.81356,0 162.6687,68.86439000000001,0 162.5952,68.95761,0 162.4924,69.00284000000001,0 162.4894,69.04481,0 162.5256,69.11716,0 162.5843,69.15031000000001,0 162.8192,69.22402,0 162.4407,69.38332,0 162.1934,69.42339,0 162.1759,69.45047,0 162.2592,69.52155000000001,0 162.271,69.58094000000001,0 162.4037,69.67095000000001,0 162.3981,69.86644,0 162.2945,69.98492,0 160.9,70.04337,0 160.6752,70.07872999999999,0 160.3981,70.18025,0 159.7593,71.32091,0 162.5346,71.32091,0 167.5346,71.32091,0 172.5346,71.32091,0 172.5346,74.89999,0 172.5346,79.90000000000001,0 172.5346,84.90001,0 172.5346,89.90000000000001,0 173.4678,89.90000000000001,0 174.401,89.90000000000001,0 175.3341,89.90000000000001,0 176.2673,89.90000000000001,0 177.2005,89.90000000000001,0 178.1337,89.90000000000001,0 179.0668,89.90000000000001,0 180,89.90000000000001,0 180,88.95238000000001,0 180,83.95238000000002,0 180,78.95237,0 180,73.95238000000001,0 180,68.95238000000001,0 + + + 1 + + + + + GMT +12:45 + + +]]> + #khStyle1275 + + + + + +180,-46.50451,0 176.0435,-46.50451,0 176.0435,-45.19365,0 177.8549,-43.00097,0 180,-43.00097,0 180,-46.50451,0 + + + 1 + + + + + +-175.0824,-46.50682,0 -180,-46.50682,0 -180,-43.00079,0 -175.0824,-43.00079,0 -175.0824,-46.50682,0 + + + 1 + + + + + GMT +13:00 + + +]]> + #khStyle1300 + + + + +-180,-21.87818,0 -177,-20.99139,0 -177,-15.99139,0 -177,-15,0 -172.5,-15,0 -172.5,-20,0 -172.5,-23.5,0 -175,-23.5,0 -180,-23.5,0 -180,-21.87818,0 + + + 1 + + + + diff --git a/float-no-zero/examples/data/ogcsample.xml b/float-no-zero/examples/data/ogcsample.xml new file mode 100644 index 0000000000..0d4c52da60 --- /dev/null +++ b/float-no-zero/examples/data/ogcsample.xml @@ -0,0 +1,284 @@ + + + + WMS + Acme Corp. Map Server + Map Server maintained by Acme Corporation. Contact: webmaster@wmt.acme.com. High-quality maps showing roadrunner nests and possible ambush locations. + + + bird + roadrunner + ambush + + + + + + + Jeff Smith + NASA + + Computer Scientist + + + postal +
NASA Goddard Space Flight Center
+ Greenbelt + MD + 20771 + + USA +
+ +1 301 555-1212 + user@host.com +
+ + none + + none + 16 + 2048 + 2048 +
+ + + + + text/xml + + + + + + + + + + + + + + image/gif + image/png + image/jpeg + + + + + + + + + + + + text/xml + text/plain + text/html + + + + + + + + + + + + XML + + INIMAGE + BLANK + + + Acme Corp. Map Server + CRS:84 + + + + + + + + ROADS_RIVERS + Roads and Rivers + + EPSG:26986 + + -71.63 + -70.78 + 41.75 + 42.90 + + + + + + State College University + + + + image/gif + + + + 123456 + + + XML + + + + 1000 + 250000 + + ROADS_1M + Roads at 1:1M scale + Roads at a scale of 1 to 1 million. + + + road + transportation + atlas + + 123456 + + + text/plain + + + + text/xml + + + + + + + RIVERS_1M + Rivers at 1:1M scale + Rivers at a scale of 1 to 1 million. + + + river + canal + waterway + + + + + + Weather Forecast Data + CRS:84 + + + -180 + 180 + + -90 + 90 + + 1999-01-01/2000-08-22/P1D + + + Clouds + Forecast cloud cover + + + Temperature + Forecast temperature + + + + Pressure + Forecast barometric pressure + + + 1999-01-01/2000-08-22/P1D + + 0,1000,3000,5000,10000 + + + + ozone_image + Global ozone distribution (1992) + + + -180 + 180 + -90 + 90 + + 1992 + + + + population + World population, annual + + -180 + + 180 + -90 + 90 + + 1990/2000/P1Y + + + + +
diff --git a/float-no-zero/examples/data/osm/map.osm b/float-no-zero/examples/data/osm/map.osm new file mode 100644 index 0000000000..135e798e1d --- /dev/null +++ b/float-no-zero/examples/data/osm/map.osm @@ -0,0 +1,2223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/float-no-zero/examples/data/sld/countries.sld b/float-no-zero/examples/data/sld/countries.sld new file mode 100644 index 0000000000..9ae5eebea3 --- /dev/null +++ b/float-no-zero/examples/data/sld/countries.sld @@ -0,0 +1,43 @@ + + + + countries + + countries + A sample style for countries + 1 + A sample style for countries + + name + + Sample + Sample + + + #ff0000 + 0.6 + + + #00FF00 + 0.5 + 4 + + + + + 20000000 + + + name + + + Arial + 10 + Normal + + + + + + + diff --git a/float-no-zero/examples/data/topojson/us.json b/float-no-zero/examples/data/topojson/us.json new file mode 100644 index 0000000000..721f640680 --- /dev/null +++ b/float-no-zero/examples/data/topojson/us.json @@ -0,0 +1 @@ +{"type":"Topology","objects":{"counties":{"type":"GeometryCollection","geometries":[{"type":"Polygon","id":53073,"arcs":[[0,1,2,3]]},{"type":"Polygon","id":30105,"arcs":[[4,5,6,7,8,9]]},{"type":"Polygon","id":30029,"arcs":[[10,11,12,13,14,15,16,17,18,19]]},{"type":"Polygon","id":16021,"arcs":[[20,21,22,23]]},{"type":"Polygon","id":30071,"arcs":[[-9,24,25,26,27,28,29]]},{"type":"Polygon","id":38079,"arcs":[[30,31,32,33]]},{"type":"Polygon","id":30053,"arcs":[[-19,34,35,-21,36]]},{"type":"Polygon","id":38009,"arcs":[[-32,37,38,39,40]]},{"type":"Polygon","id":30035,"arcs":[[41,42,-11,43]]},{"type":"Polygon","id":30041,"arcs":[[44,45,46,47]]},{"type":"Polygon","id":30005,"arcs":[[-29,-28,48,49,-48,50]]},{"type":"Polygon","id":30019,"arcs":[[51,52,-5,53]]},{"type":"Polygon","id":38067,"arcs":[[54,55,56,57]]},{"type":"Polygon","id":27069,"arcs":[[58,59,-55,60]]},{"type":"Polygon","id":38095,"arcs":[[61,62,63,-34,64,65]]},{"type":"Polygon","id":38019,"arcs":[[-57,66,67,-66,68]]},{"type":"Polygon","id":53047,"arcs":[[69,70,71,72,73,74,-1,75]]},{"type":"Polygon","id":53065,"arcs":[[76,77,78,79,80]]},{"type":"Polygon","id":53051,"arcs":[[-23,81,82,-77,83]]},{"type":"Polygon","id":53019,"arcs":[[-80,84,-70,85]]},{"type":"Polygon","id":30051,"arcs":[[86,87,88,-46,89]]},{"type":"Polygon","id":38023,"arcs":[[90,91,92,93]]},{"type":"Polygon","id":38013,"arcs":[[94,95,96,97,-91,98]]},{"type":"Polygon","id":30101,"arcs":[[99,-88,100,-42]]},{"type":"Polygon","id":38075,"arcs":[[101,102,-95,103,-40]]},{"type":"Polygon","id":27135,"arcs":[[104,105,-59,106,107]]},{"type":"Polygon","id":30091,"arcs":[[-93,108,109,-52,110]]},{"type":"Polygon","id":16017,"arcs":[[-36,111,112,113,114,-82,-22]]},{"type":"Polygon","id":38101,"arcs":[[-103,115,116,117,-96]]},{"type":"MultiPolygon","id":53055,"arcs":[[[118]],[[119]],[[120]]]},{"type":"Polygon","id":27071,"arcs":[[121,122,123,124,125]]},{"type":"Polygon","id":53057,"arcs":[[126,-2,-75,127,128,129]]},{"type":"Polygon","id":38105,"arcs":[[-98,130,131,132,-109,-92]]},{"type":"Polygon","id":38049,"arcs":[[133,134,135,-116,-102,-39]]},{"type":"Polygon","id":27137,"arcs":[[136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,-122,151]]},{"type":"Polygon","id":30085,"arcs":[[-110,-133,152,153,-6,-53]]},{"type":"Polygon","id":53007,"arcs":[[-74,154,155,156,157,-128]]},{"type":"Polygon","id":38061,"arcs":[[158,159,160,-131,-97,-118]]},{"type":"Polygon","id":27089,"arcs":[[161,162,163,164,165,-60,-106]]},{"type":"Polygon","id":38069,"arcs":[[-64,166,167,168,-134,-38,-31]]},{"type":"Polygon","id":38071,"arcs":[[169,170,171,-62,-68]]},{"type":"Polygon","id":38099,"arcs":[[-56,-166,172,173,-170,-67]]},{"type":"Polygon","id":27007,"arcs":[[-124,174,175,176,177,178,-162,-105,179]]},{"type":"Polygon","id":30073,"arcs":[[-101,-87,180,181,-12,-43]]},{"type":"MultiPolygon","id":53029,"arcs":[[[182,183]],[[184]]]},{"type":"Polygon","id":53009,"arcs":[[185,186,187]]},{"type":"Polygon","id":38005,"arcs":[[-63,-172,188,189,190,-167]]},{"type":"Polygon","id":30015,"arcs":[[-50,191,192,193,194,-181,-90,-45]]},{"type":"Polygon","id":53061,"arcs":[[-158,195,196,-183,197,-129]]},{"type":"Polygon","id":30089,"arcs":[[-18,198,199,200,201,-112,-35]]},{"type":"Polygon","id":27075,"arcs":[[202,203,-137,204]]},{"type":"Polygon","id":38063,"arcs":[[205,206,207,208,-189,-171,-174]]},{"type":"Polygon","id":38035,"arcs":[[-165,209,210,211,-206,-173]]},{"type":"Polygon","id":27119,"arcs":[[212,213,214,215,216,217,218,-210,-164]]},{"type":"Polygon","id":27113,"arcs":[[-179,219,-215,220,-213,-163]]},{"type":"Polygon","id":30083,"arcs":[[221,222,223,224,-153]]},{"type":"Polygon","id":53017,"arcs":[[225,226,-155,-73]]},{"type":"Polygon","id":38053,"arcs":[[-161,227,228,229,230,-222,-132]]},{"type":"Polygon","id":53031,"arcs":[[231,232,233,-186,234]]},{"type":"Polygon","id":30099,"arcs":[[-195,235,236,-13,-182]]},{"type":"Polygon","id":30055,"arcs":[[-225,237,238,239,-7,-154]]},{"type":"Polygon","id":16079,"arcs":[[-202,240,241,242,243,244,-113]]},{"type":"Polygon","id":30047,"arcs":[[245,-199,-17]]},{"type":"Polygon","id":53063,"arcs":[[-83,-115,246,247,248,249,-78]]},{"type":"Polygon","id":27029,"arcs":[[250,251,252,-216,-220,-178]]},{"type":"Polygon","id":16055,"arcs":[[-245,253,-247,-114]]},{"type":"Polygon","id":30033,"arcs":[[-240,254,255,256,257,-25,-8]]},{"type":"Polygon","id":27125,"arcs":[[-214,-221]]},{"type":"Polygon","id":53025,"arcs":[[-72,258,259,260,261,262,263,-226]]},{"type":"Polygon","id":53043,"arcs":[[-85,-79,-250,264,265,-259,-71]]},{"type":"Polygon","id":30049,"arcs":[[266,267,268,269,270,-14,-237]]},{"type":"MultiPolygon","id":53035,"arcs":[[[271]],[[272,273,274,275,276]]]},{"type":"Polygon","id":27061,"arcs":[[-151,277,278,-175,-123]]},{"type":"Polygon","id":38055,"arcs":[[279,280,281,282,283,-159,-117,-136]]},{"type":"Polygon","id":38027,"arcs":[[-209,284,285,286,-190]]},{"type":"Polygon","id":38103,"arcs":[[-191,-287,287,288,289,290,-168]]},{"type":"Polygon","id":38083,"arcs":[[-169,-291,291,292,-280,-135]]},{"type":"Polygon","id":38025,"arcs":[[-284,293,294,295,-228,-160]]},{"type":"Polygon","id":30027,"arcs":[[-27,296,297,298,299,300,-192,-49]]},{"type":"Polygon","id":30021,"arcs":[[-224,301,302,-238]]},{"type":"MultiPolygon","id":53033,"arcs":[[[303]],[[-157,304,305,306,307,-196]]]},{"type":"Polygon","id":30013,"arcs":[[308,309,-267,-236,-194]]},{"type":"Polygon","id":38091,"arcs":[[-212,310,311,312,313,-207]]},{"type":"Polygon","id":38039,"arcs":[[-314,314,315,316,-285,-208]]},{"type":"Polygon","id":38097,"arcs":[[317,318,-311,-211,-219]]},{"type":"MultiPolygon","id":53045,"arcs":[[[319,-276,320,321,322,323,-232]]]},{"type":"Polygon","id":30063,"arcs":[[-16,324,325,326,327,328,329,-200,-246]]},{"type":"Polygon","id":30077,"arcs":[[-271,330,331,332,-325,-15]]},{"type":"Polygon","id":30069,"arcs":[[-258,333,334,-297,-26]]},{"type":"Polygon","id":53037,"arcs":[[-227,-264,335,-305,-156]]},{"type":"Polygon","id":38031,"arcs":[[-317,336,-288,-286]]},{"type":"Polygon","id":38057,"arcs":[[337,338,339,-294,-283]]},{"type":"Polygon","id":53027,"arcs":[[-324,340,341,342,343,-233]]},{"type":"Polygon","id":27087,"arcs":[[344,345,-217,-253]]},{"type":"Polygon","id":27107,"arcs":[[-218,-346,346,347,348,-318]]},{"type":"Polygon","id":30061,"arcs":[[-330,349,-241,-201]]},{"type":"Polygon","id":27021,"arcs":[[350,351,352,353,354,355,-176,-279]]},{"type":"Polygon","id":23003,"arcs":[[356,357,358,359,360]]},{"type":"Polygon","id":30045,"arcs":[[-301,361,362,-309,-193]]},{"type":"Polygon","id":16009,"arcs":[[-244,363,364,-248,-254]]},{"type":"Polygon","id":27057,"arcs":[[-356,365,366,-251,-177]]},{"type":"MultiPolygon","id":53053,"arcs":[[[-307,-306,367,368,369,370]],[[-273,371]],[[-321,-275,372]]]},{"type":"Polygon","id":30109,"arcs":[[-231,373,374,375,-302,-223]]},{"type":"Polygon","id":38007,"arcs":[[-296,376,377,378,-229]]},{"type":"Polygon","id":38033,"arcs":[[-379,379,380,-374,-230]]},{"type":"Polygon","id":38043,"arcs":[[381,382,383,384,-292,-290]]},{"type":"Polygon","id":38093,"arcs":[[-316,385,386,387,-382,-289,-337]]},{"type":"Polygon","id":38015,"arcs":[[-385,388,389,390,-281,-293]]},{"type":"Polygon","id":38065,"arcs":[[-391,391,-338,-282]]},{"type":"Polygon","id":53001,"arcs":[[392,393,-260,-266]]},{"type":"Polygon","id":53075,"arcs":[[-249,-365,394,395,396,397,398,399,-393,-265]]},{"type":"Polygon","id":38003,"arcs":[[-313,400,401,402,-386,-315]]},{"type":"Polygon","id":38017,"arcs":[[-319,-349,403,404,405,-401,-312]]},{"type":"Polygon","id":53067,"arcs":[[-370,406,-341,-323,407]]},{"type":"Polygon","id":30079,"arcs":[[-376,408,409,-255,-239,-303]]},{"type":"Polygon","id":27005,"arcs":[[-367,410,411,412,-347,-345,-252]]},{"type":"Polygon","id":27027,"arcs":[[-413,413,414,415,-404,-348]]},{"type":"Polygon","id":16057,"arcs":[[-243,416,417,-395,-364]]},{"type":"Polygon","id":53077,"arcs":[[-263,418,419,420,421,-368,-336]]},{"type":"Polygon","id":30059,"arcs":[[-363,422,423,424,425,426,-268,-310]]},{"type":"Polygon","id":27001,"arcs":[[-150,427,428,429,430,431,-351,-278]]},{"type":"Polygon","id":26131,"arcs":[[432,433,434,435]]},{"type":"Polygon","id":38089,"arcs":[[-340,436,437,438,439,-377,-295]]},{"type":"Polygon","id":38059,"arcs":[[-390,440,441,442,-437,-339,-392]]},{"type":"Polygon","id":26013,"arcs":[[443,444,445,446]]},{"type":"Polygon","id":16035,"arcs":[[-350,-329,447,448,449,-417,-242]]},{"type":"Polygon","id":30017,"arcs":[[450,451,452,453,-256,-410]]},{"type":"Polygon","id":30087,"arcs":[[-454,454,455,456,457,458,-334,-257]]},{"type":"Polygon","id":30039,"arcs":[[459,460,-326,-333]]},{"type":"Polygon","id":27159,"arcs":[[-355,461,462,-411,-366]]},{"type":"Polygon","id":27035,"arcs":[[-432,463,464,-352]]},{"type":"Polygon","id":53049,"arcs":[[465,466,467,-343]]},{"type":"Polygon","id":53041,"arcs":[[-407,-369,-422,468,469,470,-466,-342]]},{"type":"Polygon","id":30007,"arcs":[[-427,471,472,-269]]},{"type":"Polygon","id":27017,"arcs":[[473,474,-428,-149]]},{"type":"Polygon","id":26053,"arcs":[[475,476,477,478,479,480,481,482,483,484,-434]]},{"type":"Polygon","id":30065,"arcs":[[-459,485,486,-298,-335]]},{"type":"Polygon","id":26095,"arcs":[[487,488,489,490,491]]},{"type":"Polygon","id":30037,"arcs":[[-487,492,493,494,495,-299]]},{"type":"Polygon","id":30107,"arcs":[[-300,-496,496,-423,-362]]},{"type":"Polygon","id":53021,"arcs":[[497,498,499,-261,-394,-400]]},{"type":"Polygon","id":53005,"arcs":[[500,501,502,503,-419,-262,-500]]},{"type":"Polygon","id":27111,"arcs":[[-463,504,505,506,507,-414,-412]]},{"type":"Polygon","id":38037,"arcs":[[508,509,510,-438,-443]]},{"type":"Polygon","id":53023,"arcs":[[511,512,513,-398]]},{"type":"Polygon","id":30025,"arcs":[[-381,514,515,516,517,-451,-409,-375]]},{"type":"Polygon","id":16049,"arcs":[[518,519,520,521,522,523,524,-448,-328]]},{"type":"Polygon","id":30081,"arcs":[[-461,525,526,527,-519,-327]]},{"type":"Polygon","id":38029,"arcs":[[-384,528,529,530,531,-441,-389]]},{"type":"Polygon","id":38047,"arcs":[[-388,532,533,-529,-383]]},{"type":"Polygon","id":16069,"arcs":[[-450,534,-524,535,536,-396,-418]]},{"type":"Polygon","id":38087,"arcs":[[537,538,539,-515,-380,-378,-440]]},{"type":"Polygon","id":38045,"arcs":[[540,541,542,-533,-387,-403]]},{"type":"Polygon","id":38041,"arcs":[[-511,543,-538,-439]]},{"type":"Polygon","id":27167,"arcs":[[-508,544,545,546,-415]]},{"type":"Polygon","id":38073,"arcs":[[-406,547,548,549,-541,-402]]},{"type":"Polygon","id":38077,"arcs":[[-547,550,551,552,-548,-405,-416]]},{"type":"Polygon","id":53013,"arcs":[[553,554,555,-498,-399,-514]]},{"type":"Polygon","id":53071,"arcs":[[-556,556,-501,-499]]},{"type":"Polygon","id":55051,"arcs":[[557,-484,-483,-482,-481,-480,-479,558,559,560,561]]},{"type":"Polygon","id":23025,"arcs":[[562,563,564,565,566,567,-360]]},{"type":"Polygon","id":23021,"arcs":[[568,-563,-359]]},{"type":"Polygon","id":30043,"arcs":[[-473,569,570,571,572,-331,-270]]},{"type":"Polygon","id":26153,"arcs":[[-490,573,574,575,576]]},{"type":"Polygon","id":30111,"arcs":[[577,578,579,580,-493,-486,-458]]},{"type":"Polygon","id":30103,"arcs":[[581,-578,-457]]},{"type":"Polygon","id":16061,"arcs":[[-449,-525,-535]]},{"type":"Polygon","id":53003,"arcs":[[-537,582,-512,-397]]},{"type":"Polygon","id":38085,"arcs":[[-532,583,584,-509,-442]]},{"type":"Polygon","id":26071,"arcs":[[-445,585,586,587,588,589,590,-476,-433,591]]},{"type":"Polygon","id":27115,"arcs":[[592,593,594,595,596,-429,-475]]},{"type":"Polygon","id":23019,"arcs":[[597,598,599,600,-564,-569,-358]]},{"type":"Polygon","id":53059,"arcs":[[-421,601,602,603,604,605,-469]]},{"type":"Polygon","id":53015,"arcs":[[-606,606,607,608,609,-470]]},{"type":"Polygon","id":53069,"arcs":[[-471,-610,610,-467]]},{"type":"Polygon","id":27153,"arcs":[[-354,611,612,613,-505,-462]]},{"type":"Polygon","id":27097,"arcs":[[-465,614,615,616,-612,-353]]},{"type":"Polygon","id":55125,"arcs":[[617,618,-559,-478,-477,-591,619]]},{"type":"Polygon","id":41007,"arcs":[[620,621,622]]},{"type":"Polygon","id":38001,"arcs":[[-510,-585,623,624,625,626,-539,-544]]},{"type":"Polygon","id":38081,"arcs":[[-553,627,628,629,-549]]},{"type":"Polygon","id":38051,"arcs":[[-543,630,631,632,-530,-534]]},{"type":"Polygon","id":38021,"arcs":[[-550,-630,633,634,-631,-542]]},{"type":"Polygon","id":38011,"arcs":[[-627,635,-516,-540]]},{"type":"Polygon","id":30023,"arcs":[[-573,636,637,-526,-460,-332]]},{"type":"Polygon","id":26043,"arcs":[[638,639,640,-587,641]]},{"type":"Polygon","id":27095,"arcs":[[642,643,644,645,-615,-464,-431]]},{"type":"Polygon","id":30097,"arcs":[[-495,646,647,-424,-497]]},{"type":"Polygon","id":30031,"arcs":[[-426,648,649,650,651,652,-570,-472]]},{"type":"Polygon","id":30067,"arcs":[[-648,653,654,655,-649,-425]]},{"type":"Polygon","id":30093,"arcs":[[656,657,-637,-572]]},{"type":"Polygon","id":41009,"arcs":[[658,659,660,-621,661,-608]]},{"type":"Polygon","id":27065,"arcs":[[-597,662,-643,-430]]},{"type":"Polygon","id":55013,"arcs":[[663,664,665,666,-595,-594,667]]},{"type":"Polygon","id":55113,"arcs":[[668,669,670,671,672]]},{"type":"Polygon","id":55129,"arcs":[[-672,673,-664,674]]},{"type":"Polygon","id":30011,"arcs":[[675,676,677,678,-452,-518]]},{"type":"Polygon","id":30095,"arcs":[[-581,679,-654,-647,-494]]},{"type":"Polygon","id":27051,"arcs":[[-507,680,681,682,-545]]},{"type":"Polygon","id":27041,"arcs":[[-614,683,684,-681,-506]]},{"type":"Polygon","id":55041,"arcs":[[685,686,687,688,689,-620,-590]]},{"type":"Polygon","id":53011,"arcs":[[-605,690,-659,-607]]},{"type":"Polygon","id":53039,"arcs":[[-504,691,692,693,694,695,-602,-420]]},{"type":"Polygon","id":30003,"arcs":[[-456,696,697,698,699,-579,-582]]},{"type":"Polygon","id":27155,"arcs":[[-683,700,701,702,-551,-546]]},{"type":"Polygon","id":55037,"arcs":[[-588,-641,703,-686,-589]]},{"type":"Polygon","id":41059,"arcs":[[-555,704,705,706,707,-502,-557]]},{"type":"Polygon","id":41063,"arcs":[[-513,-583,-536,-523,708,709,710,-705,-554]]},{"type":"Polygon","id":26109,"arcs":[[711,712,713,714,-639,715]]},{"type":"Polygon","id":55099,"arcs":[[-619,716,717,718,719,-670,720,-560]]},{"type":"Polygon","id":46105,"arcs":[[721,722,723,724,725,-625]]},{"type":"Polygon","id":46031,"arcs":[[726,727,728,729,-722,-624,-584]]},{"type":"Polygon","id":46063,"arcs":[[-626,-726,730,-676,-517,-636]]},{"type":"Polygon","id":46021,"arcs":[[-633,731,732,-727,-531]]},{"type":"Polygon","id":30001,"arcs":[[-658,733,734,735,736,-527,-638]]},{"type":"Polygon","id":46089,"arcs":[[-635,737,738,739,-732,-632]]},{"type":"Polygon","id":46013,"arcs":[[-629,740,741,742,743,744,-738,-634]]},{"type":"Polygon","id":46109,"arcs":[[-703,745,746,747,748,-552]]},{"type":"Polygon","id":46091,"arcs":[[-749,749,-741,-628]]},{"type":"Polygon","id":41049,"arcs":[[-708,750,751,752,-692,-503]]},{"type":"Polygon","id":55085,"arcs":[[-690,753,754,-717,-618]]},{"type":"Polygon","id":41061,"arcs":[[755,756,-706,-711]]},{"type":"Polygon","id":30057,"arcs":[[-653,757,-734,-657,-571]]},{"type":"Polygon","id":27009,"arcs":[[-646,758,759,-616]]},{"type":"Polygon","id":41021,"arcs":[[760,761,762,-693,-753]]},{"type":"Polygon","id":30075,"arcs":[[-679,763,764,765,-697,-455,-453]]},{"type":"Polygon","id":26031,"arcs":[[766,767,768,769,770,771]]},{"type":"Polygon","id":41057,"arcs":[[772,773,774,775,776,-622]]},{"type":"Polygon","id":41067,"arcs":[[777,778,779,-773,-661]]},{"type":"Polygon","id":27145,"arcs":[[-760,780,781,782,783,784,-684,-613,-617]]},{"type":"Polygon","id":27149,"arcs":[[785,786,787,-701,-682]]},{"type":"Polygon","id":27121,"arcs":[[-785,788,789,-786,-685]]},{"type":"Polygon","id":41055,"arcs":[[790,-694,-763]]},{"type":"Polygon","id":27059,"arcs":[[791,792,793,-644,-663]]},{"type":"Polygon","id":27025,"arcs":[[-667,794,795,796,-792,-596]]},{"type":"Polygon","id":55095,"arcs":[[797,798,799,-795,-666]]},{"type":"Polygon","id":41051,"arcs":[[-691,-604,800,801,-778,-660]]},{"type":"Polygon","id":41027,"arcs":[[802,803,-801,-603,-696]]},{"type":"Polygon","id":41065,"arcs":[[-791,-762,804,805,806,807,-803,-695]]},{"type":"Polygon","id":16059,"arcs":[[-737,808,809,810,811,-520,-528]]},{"type":"Polygon","id":23029,"arcs":[[812,-598,-357,813]]},{"type":"Polygon","id":23007,"arcs":[[814,815,816,817,-567]]},{"type":"Polygon","id":26141,"arcs":[[818,819,-767,820]]},{"type":"Polygon","id":55005,"arcs":[[-674,821,822,823,-798,-665]]},{"type":"Polygon","id":55107,"arcs":[[-720,824,825,-822,-671]]},{"type":"Polygon","id":30009,"arcs":[[-700,826,827,-655,-680,-580]]},{"type":"Polygon","id":46129,"arcs":[[-740,828,829,830,-728,-733]]},{"type":"Polygon","id":46045,"arcs":[[-745,831,832,-829,-739]]},{"type":"Polygon","id":46037,"arcs":[[-750,-748,833,834,835,836,-742]]},{"type":"Polygon","id":27011,"arcs":[[-702,-788,837,838,839,840,-746]]},{"type":"Polygon","id":27141,"arcs":[[-645,-794,841,842,843,-781,-759]]},{"type":"Polygon","id":55069,"arcs":[[844,845,846,-718,-755]]},{"type":"Polygon","id":46041,"arcs":[[-831,847,848,849,850,-729]]},{"type":"Polygon","id":46137,"arcs":[[-851,851,852,-723,-730]]},{"type":"Polygon","id":55067,"arcs":[[-689,853,854,855,856,-845,-754]]},{"type":"Polygon","id":41005,"arcs":[[-804,-808,857,858,-779,-802]]},{"type":"Polygon","id":41071,"arcs":[[-859,859,860,861,-774,-780]]},{"type":"Polygon","id":27171,"arcs":[[-844,862,863,864,865,-782]]},{"type":"Polygon","id":27003,"arcs":[[-797,866,867,868,-842,-793]]},{"type":"Polygon","id":27067,"arcs":[[869,870,871,872,-789,-784]]},{"type":"Polygon","id":27151,"arcs":[[-873,873,874,-838,-787,-790]]},{"type":"Polygon","id":55119,"arcs":[[-847,875,876,877,-825,-719]]},{"type":"Polygon","id":55083,"arcs":[[878,879,880,881,882,883,884,-854,-688]]},{"type":"Polygon","id":23017,"arcs":[[-817,885,886,887,888,-889,889,890,891]]},{"type":"Polygon","id":46051,"arcs":[[-841,892,893,894,-834,-747]]},{"type":"Polygon","id":27093,"arcs":[[-866,895,896,-870,-783]]},{"type":"Polygon","id":33007,"arcs":[[897,898,899,900,-891]]},{"type":"Polygon","id":27163,"arcs":[[-800,901,902,903,904,-867,-796]]},{"type":"Polygon","id":55017,"arcs":[[-878,905,906,907,-823,-826]]},{"type":"Polygon","id":41047,"arcs":[[-860,-858,-807,908,909,910,-861]]},{"type":"Polygon","id":16003,"arcs":[[911,912,913,914,-709,-522]]},{"type":"Polygon","id":27073,"arcs":[[-839,-875,915,916,917,-893,-840]]},{"type":"MultiPolygon","id":23009,"arcs":[[[918]],[[919]],[[920,-599,-813]]]},{"type":"Polygon","id":46107,"arcs":[[-833,921,922,923,-848,-830]]},{"type":"Polygon","id":46049,"arcs":[[-744,924,925,926,-922,-832]]},{"type":"Polygon","id":27053,"arcs":[[-843,-869,927,928,929,930,-863]]},{"type":"Polygon","id":46115,"arcs":[[-837,931,932,933,-925,-743]]},{"type":"Polygon","id":16085,"arcs":[[-812,934,935,936,-912,-521]]},{"type":"Polygon","id":46019,"arcs":[[-725,937,938,939,-677,-731]]},{"type":"Polygon","id":55109,"arcs":[[940,941,-902,-799]]},{"type":"Polygon","id":55033,"arcs":[[-908,942,943,944,-941,-824]]},{"type":"Polygon","id":26009,"arcs":[[945,946,947,948,949]]},{"type":"Polygon","id":26137,"arcs":[[950,951,-946,952,-769]]},{"type":"Polygon","id":26119,"arcs":[[953,954,-951,-768,-820]]},{"type":"Polygon","id":46025,"arcs":[[955,956,957,958,-932,-836]]},{"type":"Polygon","id":46029,"arcs":[[-895,959,960,-956,-835]]},{"type":"Polygon","id":27023,"arcs":[[-872,961,962,-916,-874]]},{"type":"Polygon","id":27123,"arcs":[[-905,963,-928,-868]]},{"type":"Polygon","id":55073,"arcs":[[-846,-857,964,965,966,967,-876]]},{"type":"Polygon","id":55078,"arcs":[[-885,968,-855]]},{"type":"Polygon","id":41001,"arcs":[[-915,969,970,971,-756,-710]]},{"type":"Polygon","id":41053,"arcs":[[-911,972,973,974,-775,-862]]},{"type":"Polygon","id":41069,"arcs":[[-752,975,976,977,-805,-761]]},{"type":"Polygon","id":41041,"arcs":[[-975,978,979,980,-776]]},{"type":"Polygon","id":46093,"arcs":[[-853,981,982,983,-938,-724]]},{"type":"Polygon","id":55019,"arcs":[[-968,984,985,986,-906,-877]]},{"type":"Polygon","id":55115,"arcs":[[-969,-884,987,988,989,-965,-856]]},{"type":"Polygon","id":50011,"arcs":[[990,991,992,993,994]]},{"type":"Polygon","id":50009,"arcs":[[995,996,997,998,-900]]},{"type":"Polygon","id":50013,"arcs":[[999,1000,1001,-994]]},{"type":"Polygon","id":36019,"arcs":[[1002,1003,1004,1005,-1001]]},{"type":"Polygon","id":50019,"arcs":[[-998,1006,1007,-991,1008]]},{"type":"Polygon","id":56029,"arcs":[[1009,1010,1011,1012,1013,-650,-656,-828]]},{"type":"Polygon","id":36089,"arcs":[[1014,1015,1016,1017,1018,1019]]},{"type":"Polygon","id":56003,"arcs":[[1020,1021,1022,-1010,-827,-699]]},{"type":"Polygon","id":56005,"arcs":[[1023,1024,1025,1026,1027,-765]]},{"type":"Polygon","id":56033,"arcs":[[-766,-1028,1028,-1021,-698]]},{"type":"Polygon","id":36033,"arcs":[[-1005,1029,1030,-1015,1031]]},{"type":"Polygon","id":56011,"arcs":[[-678,-940,1032,1033,-1024,-764]]},{"type":"Polygon","id":41023,"arcs":[[-757,-972,1034,1035,1036,-976,-751,-707]]},{"type":"Polygon","id":27085,"arcs":[[-865,1037,1038,1039,-896]]},{"type":"Polygon","id":27019,"arcs":[[-931,1040,1041,-1038,-864]]},{"type":"Polygon","id":46039,"arcs":[[-918,1042,1043,1044,1045,-960,-894]]},{"type":"Polygon","id":27173,"arcs":[[1046,1047,1048,1049,-1043,-917,-963]]},{"type":"Polygon","id":27037,"arcs":[[-904,1050,1051,1052,1053,-929,-964]]},{"type":"Polygon","id":46119,"arcs":[[1054,1055,1056,-849,-924]]},{"type":"Polygon","id":46069,"arcs":[[-927,1057,1058,1059,1060,-1055,-923]]},{"type":"Polygon","id":46059,"arcs":[[-934,1061,1062,1063,-1058,-926]]},{"type":"Polygon","id":27129,"arcs":[[-897,-1040,1064,1065,1066,1067,-1047,-962,-871]]},{"type":"Polygon","id":16037,"arcs":[[1068,1069,1070,1071,1072,-935,-811]]},{"type":"Polygon","id":55093,"arcs":[[-945,1073,1074,-1051,-903,-942]]},{"type":"Polygon","id":26001,"arcs":[[1075,1076,1077,1078]]},{"type":"Polygon","id":26079,"arcs":[[1079,1080,1081,-947]]},{"type":"Polygon","id":26039,"arcs":[[1082,1083,-1080,-952]]},{"type":"Polygon","id":55035,"arcs":[[-987,1084,1085,1086,1087,-943,-907]]},{"type":"Polygon","id":26135,"arcs":[[-1078,1088,-1083,-955]]},{"type":"Polygon","id":16087,"arcs":[[1089,1090,1091,-970,-914]]},{"type":"Polygon","id":41031,"arcs":[[-978,1092,1093,1094,-909,-806]]},{"type":"Polygon","id":27139,"arcs":[[-1054,1095,1096,1097,-1041,-930]]},{"type":"Polygon","id":46057,"arcs":[[-1046,1098,1099,-957,-961]]},{"type":"Polygon","id":50015,"arcs":[[1100,1101,1102,-992,-1008]]},{"type":"Polygon","id":41043,"arcs":[[-1095,1103,1104,1105,-973,-910]]},{"type":"Polygon","id":46117,"arcs":[[-1057,1106,1107,1108,1109,-850]]},{"type":"Polygon","id":26019,"arcs":[[1110,1111,1112,1113]]},{"type":"Polygon","id":50005,"arcs":[[1114,1115,1116,-1101,-1007,-997]]},{"type":"MultiPolygon","id":23027,"arcs":[[[-601,1117,1118,1119,1120,-565]]]},{"type":"Polygon","id":16043,"arcs":[[1121,1122,1123,1124,1125,-735,-758,-652]]},{"type":"Polygon","id":46055,"arcs":[[1126,1127,1128,-982,-852,-1110]]},{"type":"Polygon","id":50007,"arcs":[[-1103,1129,1130,1131,-1003,-1000,-993]]},{"type":"Polygon","id":41003,"arcs":[[-1106,1132,-979,-974]]},{"type":"Polygon","id":23011,"arcs":[[1133,1134,1135,1136,-815,-566,-1121]]},{"type":"Polygon","id":27143,"arcs":[[-1042,-1098,1137,1138,-1065,-1039]]},{"type":"Polygon","id":27049,"arcs":[[1139,1140,1141,1142,1143,-1052,-1075]]},{"type":"Polygon","id":27127,"arcs":[[1144,1145,1146,1147,-1048,-1068]]},{"type":"Polygon","id":55097,"arcs":[[1148,1149,1150,1151,-966]]},{"type":"Polygon","id":55141,"arcs":[[-1152,1152,1153,1154,-985,-967]]},{"type":"Polygon","id":55009,"arcs":[[-883,1155,1156,1157,1158,1159,-988]]},{"type":"Polygon","id":55091,"arcs":[[-1088,1160,1161,-1140,-1074,-944]]},{"type":"Polygon","id":55135,"arcs":[[1162,1163,1164,-1149,-990]]},{"type":"Polygon","id":55061,"arcs":[[1165,1166,-1157,1167,1168]]},{"type":"Polygon","id":56039,"arcs":[[1169,1170,1171,1172,1173,-1122,-651,-1014]]},{"type":"Polygon","id":46005,"arcs":[[-959,1174,1175,1176,-1062,-933]]},{"type":"Polygon","id":27081,"arcs":[[1177,1178,1179,-1044,-1050]]},{"type":"Polygon","id":27083,"arcs":[[-1148,1180,1181,-1178,-1049]]},{"type":"Polygon","id":46081,"arcs":[[-984,1182,1183,-1033,-939]]},{"type":"Polygon","id":55011,"arcs":[[-1087,1184,1185,1186,-1161]]},{"type":"Polygon","id":55121,"arcs":[[1187,1188,1189,1190,-1185,-1086]]},{"type":"Polygon","id":55053,"arcs":[[-986,-1155,1191,1192,1193,-1188,-1085]]},{"type":"Polygon","id":55087,"arcs":[[-989,-1160,1194,1195,-1163]]},{"type":"Polygon","id":16033,"arcs":[[-1126,1196,1197,-809,-736]]},{"type":"Polygon","id":56019,"arcs":[[-1027,1198,1199,1200,-1022,-1029]]},{"type":"Polygon","id":41013,"arcs":[[-977,-1037,1201,1202,-1093]]},{"type":"Polygon","id":46065,"arcs":[[-1061,1203,-1107,-1056]]},{"type":"Polygon","id":36031,"arcs":[[1204,1205,1206,1207,-1030,-1004,-1132]]},{"type":"Polygon","id":27079,"arcs":[[1208,1209,1210,1211,-1138,-1097]]},{"type":"Polygon","id":27131,"arcs":[[-1053,-1144,1212,1213,1214,-1209,-1096]]},{"type":"Polygon","id":46077,"arcs":[[-1100,1215,1216,1217,1218,-1175,-958]]},{"type":"Polygon","id":46011,"arcs":[[-1180,1219,1220,1221,-1216,-1099,-1045]]},{"type":"Polygon","id":26101,"arcs":[[1222,1223,1224,1225,-1112]]},{"type":"Polygon","id":26165,"arcs":[[1226,1227,1228,-1223,1229]]},{"type":"Polygon","id":26143,"arcs":[[1230,1231,1232,1233,-1084]]},{"type":"Polygon","id":26113,"arcs":[[-1234,1234,1235,-1227,-1081]]},{"type":"Polygon","id":26069,"arcs":[[1236,1237,1238,-1077]]},{"type":"Polygon","id":26129,"arcs":[[-1239,1239,1240,-1231,-1089]]},{"type":"Polygon","id":16045,"arcs":[[-937,1241,1242,1243,1244,-1090,-913]]},{"type":"Polygon","id":46103,"arcs":[[-1129,1245,1246,1247,1248,-1183,-983]]},{"type":"Polygon","id":50023,"arcs":[[1249,1250,-1130,-1102,-1117]]},{"type":"Polygon","id":27015,"arcs":[[1251,1252,1253,1254,-1145,-1067]]},{"type":"Polygon","id":23001,"arcs":[[1255,1256,-886,-816,-1137]]},{"type":"Polygon","id":27103,"arcs":[[1257,-1252,-1066,-1139,-1212]]},{"type":"Polygon","id":27157,"arcs":[[-1162,-1187,1258,1259,-1141]]},{"type":"Polygon","id":41045,"arcs":[[-1092,1260,1261,1262,1263,1264,-1035,-971]]},{"type":"Polygon","id":33009,"arcs":[[1265,1266,1267,1268,1269,1270,-1115,-996,-899]]},{"type":"Polygon","id":41017,"arcs":[[-1203,1271,1272,1273,1274,-1104,-1094]]},{"type":"Polygon","id":36045,"arcs":[[1275,1276,-1019,1277,1278,1279,1280,1281]]},{"type":"MultiPolygon","id":23013,"arcs":[[[1282,1283,-1119]]]},{"type":"Polygon","id":16015,"arcs":[[-1073,1284,1285,-1242,-936]]},{"type":"Polygon","id":23015,"arcs":[[-1120,-1284,1286,1287,1288,-1134]]},{"type":"Polygon","id":55071,"arcs":[[-1167,1289,1290,1291,-1158]]},{"type":"Polygon","id":50001,"arcs":[[-1251,1292,1293,1294,1295,-1205,-1131]]},{"type":"Polygon","id":41039,"arcs":[[-1275,1296,1297,1298,-980,-1133,-1105]]},{"type":"Polygon","id":33003,"arcs":[[-890,888,1299,1300,1301,-1266,-898]]},{"type":"Polygon","id":27013,"arcs":[[-1211,1302,1303,1304,1305,-1253,-1258]]},{"type":"Polygon","id":55057,"arcs":[[1306,1307,1308,1309,-1192,-1154]]},{"type":"Polygon","id":55001,"arcs":[[-1151,1310,1311,1312,-1307,-1153]]},{"type":"Polygon","id":55137,"arcs":[[-1165,1313,1314,1315,-1311,-1150]]},{"type":"Polygon","id":55139,"arcs":[[1316,1317,1318,-1314,-1164,-1196]]},{"type":"Polygon","id":55015,"arcs":[[-1159,-1292,1319,1320,-1317,-1195]]},{"type":"Polygon","id":16023,"arcs":[[-1198,1321,1322,1323,-1070,-1069,-810]]},{"type":"Polygon","id":50017,"arcs":[[-1271,1324,-1293,-1250,-1116]]},{"type":"Polygon","id":36049,"arcs":[[1325,1326,-1278,-1018,1327]]},{"type":"Polygon","id":46085,"arcs":[[1328,1329,1330,1331,1332,-1108,-1204,-1060,1333]]},{"type":"Polygon","id":27117,"arcs":[[-1182,1334,1335,1336,-1220,-1179]]},{"type":"Polygon","id":27101,"arcs":[[-1147,1337,1338,1339,-1335,-1181]]},{"type":"Polygon","id":46073,"arcs":[[-1177,1340,1341,1342,1343,-1063]]},{"type":"Polygon","id":27147,"arcs":[[1344,1345,1346,1347,-1214]]},{"type":"Polygon","id":27039,"arcs":[[1348,1349,-1345,-1213,-1143]]},{"type":"Polygon","id":46101,"arcs":[[-1337,1350,1351,-1221]]},{"type":"Polygon","id":27161,"arcs":[[-1348,1352,1353,-1303,-1210,-1215]]},{"type":"Polygon","id":46017,"arcs":[[-1344,1354,-1334,-1059,-1064]]},{"type":"Polygon","id":46111,"arcs":[[-1219,1355,1356,1357,1358,-1341,-1176]]},{"type":"Polygon","id":27109,"arcs":[[-1260,1359,1360,1361,-1349,-1142]]},{"type":"Polygon","id":27033,"arcs":[[-1255,1362,1363,1364,-1338,-1146]]},{"type":"Polygon","id":46079,"arcs":[[-1222,-1352,1365,1366,1367,-1217]]},{"type":"Polygon","id":46097,"arcs":[[-1368,1368,1369,-1356,-1218]]},{"type":"Polygon","id":27169,"arcs":[[-1186,-1191,1370,1371,1372,-1360,-1259]]},{"type":"Polygon","id":56045,"arcs":[[-1184,-1249,1373,1374,1375,-1025,-1034]]},{"type":"Polygon","id":26105,"arcs":[[1376,1377,1378,-1225]]},{"type":"Polygon","id":23005,"arcs":[[-1257,1379,1380,1381,1382,1383,-887]]},{"type":"Polygon","id":46075,"arcs":[[-1333,1384,1385,-1386,1386,-1127,-1109]]},{"type":"Polygon","id":56043,"arcs":[[-1201,1387,1388,1389,-1011,-1023]]},{"type":"MultiPolygon","id":23023,"arcs":[[[-1382,1390]],[[-1288,1391]],[[1392,-1380,-1256,-1136]]]},{"type":"Polygon","id":26085,"arcs":[[-1224,-1229,1393,1394,-1377]]},{"type":"Polygon","id":26133,"arcs":[[-1236,1395,1396,-1394,-1228]]},{"type":"Polygon","id":26035,"arcs":[[-1233,1397,1398,-1396,-1235]]},{"type":"Polygon","id":26051,"arcs":[[1399,1400,1401,-1398,-1232,-1241]]},{"type":"Polygon","id":55081,"arcs":[[-1310,1402,1403,-1193]]},{"type":"Polygon","id":16075,"arcs":[[-1245,1404,-1261,-1091]]},{"type":"Polygon","id":36041,"arcs":[[1405,1406,1407,1408,-1016,-1031,-1208]]},{"type":"Polygon","id":27165,"arcs":[[-1306,1409,1410,-1363,-1254]]},{"type":"Polygon","id":16039,"arcs":[[-1072,1411,1412,1413,1414,1415,1416,-1285]]},{"type":"Polygon","id":36043,"arcs":[[-1409,1417,1418,1419,1420,-1328,-1017]]},{"type":"Polygon","id":55063,"arcs":[[-1194,-1404,1421,1422,-1371,-1190,-1189]]},{"type":"Polygon","id":56017,"arcs":[[-1390,1423,-1012]]},{"type":"Polygon","id":16051,"arcs":[[-1125,1424,1425,1426,-1322,-1197]]},{"type":"Polygon","id":41025,"arcs":[[-1265,1427,1428,1429,-1272,-1202,-1036]]},{"type":"Polygon","id":56013,"arcs":[[-1424,-1389,1430,1431,1432,1433,-1170,-1013]]},{"type":"Polygon","id":26017,"arcs":[[1434,1435,1436,1437,-1401,1438]]},{"type":"Polygon","id":46071,"arcs":[[-1387,1385,1439,1440,1441,-1246,-1128]]},{"type":"Polygon","id":16013,"arcs":[[-1324,1442,1443,1444,1445,1446,1447,-1412,-1071]]},{"type":"Polygon","id":16081,"arcs":[[-1174,1448,1449,-1123]]},{"type":"Polygon","id":55047,"arcs":[[-1319,1450,1451,1452,1453,-1315]]},{"type":"Polygon","id":55077,"arcs":[[-1454,1454,-1312,-1316]]},{"type":"Polygon","id":50027,"arcs":[[-1270,1455,1456,1457,1458,-1294,-1325]]},{"type":"Polygon","id":41019,"arcs":[[1459,1460,1461,1462,1463,1464,-1298]]},{"type":"Polygon","id":55039,"arcs":[[1465,1466,1467,-1451,-1318,-1321]]},{"type":"Polygon","id":46003,"arcs":[[-1359,1468,1469,1470,1471,-1342]]},{"type":"Polygon","id":46015,"arcs":[[-1472,1472,-1329,-1355,-1343]]},{"type":"Polygon","id":16065,"arcs":[[-1450,1473,-1425,-1124]]},{"type":"Polygon","id":55117,"arcs":[[1474,1475,1476,-1466,-1320,-1291]]},{"type":"Polygon","id":16027,"arcs":[[-1244,1477,1478,-1262,-1405]]},{"type":"Polygon","id":46095,"arcs":[[-1332,1479,1480,-1440,-1386,-1385]]},{"type":"Polygon","id":16025,"arcs":[[1481,1482,-1413,-1448]]},{"type":"Polygon","id":50021,"arcs":[[1483,1484,-1295,-1459]]},{"type":"Polygon","id":46033,"arcs":[[1485,1486,1487,-1374,-1248]]},{"type":"Polygon","id":27133,"arcs":[[-1340,1488,1489,1490,-1336]]},{"type":"Polygon","id":27105,"arcs":[[-1365,1491,1492,1493,-1489,-1339]]},{"type":"Polygon","id":27047,"arcs":[[1494,1495,1496,1497,-1353,-1347]]},{"type":"Polygon","id":27099,"arcs":[[-1362,1498,1499,1500,1501,-1495,-1346,-1350]]},{"type":"Polygon","id":27055,"arcs":[[-1423,1502,1503,1504,1505,-1372]]},{"type":"Polygon","id":46035,"arcs":[[1506,1507,1508,-1469,-1358]]},{"type":"Polygon","id":46061,"arcs":[[-1370,1509,1510,-1507,-1357]]},{"type":"Polygon","id":27045,"arcs":[[-1373,-1506,1511,1512,-1499,-1361]]},{"type":"Polygon","id":27063,"arcs":[[-1411,1513,1514,1515,1516,-1492,-1364]]},{"type":"Polygon","id":27043,"arcs":[[-1354,-1498,1517,1518,1519,-1304]]},{"type":"Polygon","id":46099,"arcs":[[1520,1521,1522,1523,-1366,-1351,-1491]]},{"type":"Polygon","id":27091,"arcs":[[-1305,-1520,1524,1525,-1514,-1410]]},{"type":"Polygon","id":46087,"arcs":[[-1367,-1524,1526,1527,-1510,-1369]]},{"type":"Polygon","id":26111,"arcs":[[-1438,1528,1529,1530,-1402]]},{"type":"Polygon","id":26127,"arcs":[[1531,1532,1533,-1378]]},{"type":"Polygon","id":26073,"arcs":[[-1531,1534,1535,1536,-1399]]},{"type":"Polygon","id":23031,"arcs":[[1537,1538,-1300,-889,-888,-1384]]},{"type":"Polygon","id":26107,"arcs":[[-1537,1539,1540,-1397]]},{"type":"Polygon","id":26123,"arcs":[[-1541,1541,1542,1543,-1532,-1395]]},{"type":"Polygon","id":36115,"arcs":[[-1485,1544,1545,1546,1547,-1206,-1296]]},{"type":"Polygon","id":16001,"arcs":[[-1286,-1417,1548,-1478,-1243]]},{"type":"Polygon","id":36113,"arcs":[[1549,-1406,-1207,-1548]]},{"type":"Polygon","id":46123,"arcs":[[1550,1551,1552,-1480,-1331]]},{"type":"Polygon","id":33001,"arcs":[[1553,1554,-1267,-1302]]},{"type":"Polygon","id":26157,"arcs":[[1555,1556,1557,1558,1559,-1436,1560,1561]]},{"type":"Polygon","id":55123,"arcs":[[1562,1563,1564,1565,-1503,-1422,-1403,-1309]]},{"type":"Polygon","id":36075,"arcs":[[-1327,1566,1567,1568,1569,1570,-1279]]},{"type":"Polygon","id":46113,"arcs":[[1571,1572,1573,1574,-1486,-1247,-1442]]},{"type":"Polygon","id":26151,"arcs":[[1575,1576,-1557,1577,1578]]},{"type":"Polygon","id":16073,"arcs":[[-1549,-1416,1579,1580,1581,-1263,-1479]]},{"type":"Polygon","id":55021,"arcs":[[1582,1583,1584,-1313,-1455,-1453]]},{"type":"Polygon","id":55111,"arcs":[[-1585,1585,1586,1587,-1563,-1308]]},{"type":"Polygon","id":55027,"arcs":[[1588,1589,1590,1591,-1583,-1452,-1468]]},{"type":"Polygon","id":16019,"arcs":[[-1474,-1449,-1173,1592,1593,1594,-1426]]},{"type":"Polygon","id":16011,"arcs":[[1595,1596,1597,-1443,-1323,-1427,-1595]]},{"type":"Polygon","id":41035,"arcs":[[1598,1599,1600,1601,-1460,-1297,-1274]]},{"type":"Polygon","id":41037,"arcs":[[1602,1603,-1599,-1273,-1430]]},{"type":"Polygon","id":36065,"arcs":[[1604,1605,-1567,-1326,-1421]]},{"type":"Polygon","id":33013,"arcs":[[-1555,1606,1607,1608,1609,-1268]]},{"type":"Polygon","id":41011,"arcs":[[1610,1611,-1464]]},{"type":"Polygon","id":33019,"arcs":[[-1610,1612,1613,1614,-1456,-1269]]},{"type":"Polygon","id":33017,"arcs":[[-1539,1615,1616,-1607,-1554,-1301]]},{"type":"Polygon","id":26145,"arcs":[[-1560,1617,1618,1619,-1529,-1437]]},{"type":"Polygon","id":55103,"arcs":[[1620,1621,1622,-1564,-1588]]},{"type":"Polygon","id":55089,"arcs":[[1623,1624,1625,-1476]]},{"type":"Polygon","id":55131,"arcs":[[-1477,-1626,1626,-1589,-1467]]},{"type":"Polygon","id":19189,"arcs":[[1627,1628,1629,-1518,-1497]]},{"type":"Polygon","id":19109,"arcs":[[1630,1631,1632,-1525,-1519,-1630,1633]]},{"type":"Polygon","id":19059,"arcs":[[1634,1635,-1516,1636]]},{"type":"Polygon","id":19063,"arcs":[[1637,-1637,-1515,-1526,-1633]]},{"type":"Polygon","id":19195,"arcs":[[1638,-1628,-1496,-1502,1639]]},{"type":"Polygon","id":19143,"arcs":[[1640,1641,-1493,-1517,-1636]]},{"type":"Polygon","id":56027,"arcs":[[-1488,1642,1643,1644,1645,1646,-1375]]},{"type":"Polygon","id":19131,"arcs":[[1647,1648,-1640,-1501,1649]]},{"type":"Polygon","id":19119,"arcs":[[1650,1651,-1521,-1490,-1494,-1642]]},{"type":"Polygon","id":19089,"arcs":[[1652,1653,-1650,-1500,-1513]]},{"type":"Polygon","id":19005,"arcs":[[-1566,1654,1655,1656,-1504]]},{"type":"Polygon","id":19191,"arcs":[[1657,1658,-1653,-1512,-1505,-1657]]},{"type":"Polygon","id":46083,"arcs":[[-1652,1659,1660,1661,1662,-1522]]},{"type":"Polygon","id":56009,"arcs":[[-1647,1663,1664,1665,1666,-1199,-1026,-1376]]},{"type":"Polygon","id":46023,"arcs":[[-1471,1667,1668,1669,1670,1671,1672,-1473]]},{"type":"Polygon","id":46125,"arcs":[[-1523,-1663,1673,1674,1675,-1527]]},{"type":"Polygon","id":46067,"arcs":[[-1528,-1676,1676,1677,-1669,1678,-1508,-1511]]},{"type":"Polygon","id":56025,"arcs":[[-1200,-1667,1679,-1431,-1388]]},{"type":"Polygon","id":46043,"arcs":[[-1509,-1679,-1668,-1470]]},{"type":"Polygon","id":46053,"arcs":[[-1673,1680,1681,-1551,-1330]]},{"type":"Polygon","id":46047,"arcs":[[-1575,1682,1683,-1643,-1487]]},{"type":"Polygon","id":26121,"arcs":[[-1544,1684,1685,1686,-1533]]},{"type":"Polygon","id":26117,"arcs":[[-1536,1687,1688,1689,-1542,-1540]]},{"type":"Polygon","id":56035,"arcs":[[1690,1691,-1171,-1434]]},{"type":"Polygon","id":26057,"arcs":[[-1530,-1620,1692,1693,-1688,-1535]]},{"type":"Polygon","id":55023,"arcs":[[-1623,1694,1695,-1655,-1565]]},{"type":"Polygon","id":36011,"arcs":[[1696,1697,1698,1699,1700,1701,-1570]]},{"type":"Polygon","id":36091,"arcs":[[-1547,1702,1703,1704,1705,1706,-1407,-1550]]},{"type":"Polygon","id":46007,"arcs":[[1707,1708,-1572,-1441]]},{"type":"Polygon","id":46121,"arcs":[[-1553,1709,-1708,-1481]]},{"type":"Polygon","id":36073,"arcs":[[1710,1711,1712,1713]]},{"type":"Polygon","id":36063,"arcs":[[-1713,1714,1715,1716]]},{"type":"Polygon","id":36055,"arcs":[[1717,1718,1719,1720,-1711,1721]]},{"type":"Polygon","id":36117,"arcs":[[1722,1723,-1718,1724,-1701]]},{"type":"Polygon","id":26087,"arcs":[[1725,1726,1727,1728,-1558,-1577]]},{"type":"Polygon","id":56023,"arcs":[[-1692,1729,1730,1731,1732,1733,-1593,-1172]]},{"type":"Polygon","id":50003,"arcs":[[-1458,1734,1735,1736,1737,-1545,-1484]]},{"type":"Polygon","id":55025,"arcs":[[-1592,1738,1739,1740,1741,-1586,-1584]]},{"type":"Polygon","id":26081,"arcs":[[1742,1743,1744,1745,-1685,-1543,-1690]]},{"type":"Polygon","id":36035,"arcs":[[-1707,1746,-1418,-1408]]},{"type":"Polygon","id":33015,"arcs":[[1747,1748,1749,-1608,-1617]]},{"type":"Polygon","id":36067,"arcs":[[1750,1751,-1697,-1569]]},{"type":"Polygon","id":50025,"arcs":[[-1615,1752,1753,-1735,-1457]]},{"type":"Polygon","id":19167,"arcs":[[1754,1755,1756,-1660,-1651]]},{"type":"Polygon","id":19141,"arcs":[[1757,1758,-1755,-1641]]},{"type":"Polygon","id":19033,"arcs":[[-1649,1759,1760,1761,-1639]]},{"type":"Polygon","id":19081,"arcs":[[-1762,1762,-1634,-1629]]},{"type":"Polygon","id":19147,"arcs":[[-1632,1763,1764,-1638]]},{"type":"Polygon","id":19041,"arcs":[[-1765,1765,-1758,-1635]]},{"type":"Polygon","id":26049,"arcs":[[-1729,1766,1767,1768,-1618,-1559]]},{"type":"Polygon","id":19037,"arcs":[[-1659,1769,1770,1771,-1654]]},{"type":"Polygon","id":19067,"arcs":[[-1772,1772,-1760,-1648]]},{"type":"Polygon","id":55049,"arcs":[[-1587,-1742,1773,1774,1775,-1621]]},{"type":"Polygon","id":55043,"arcs":[[-1776,1776,1777,1778,1779,-1695,-1622]]},{"type":"Polygon","id":33011,"arcs":[[-1750,1780,1781,1782,1783,-1613,-1609]]},{"type":"Polygon","id":26139,"arcs":[[-1746,1784,1785,-1686]]},{"type":"Polygon","id":16063,"arcs":[[1786,1787,1788,-1482,-1447]]},{"type":"Polygon","id":16047,"arcs":[[-1789,1789,1790,1791,-1414,-1483]]},{"type":"Polygon","id":55055,"arcs":[[1792,1793,1794,-1739,-1591]]},{"type":"Polygon","id":16067,"arcs":[[1795,1796,-1787,-1446]]},{"type":"Polygon","id":55133,"arcs":[[-1627,1797,1798,1799,-1793,-1590]]},{"type":"Polygon","id":55079,"arcs":[[1800,1801,-1798,-1625]]},{"type":"Polygon","id":36053,"arcs":[[-1606,1802,1803,1804,-1751,-1568]]},{"type":"Polygon","id":33005,"arcs":[[-1784,1805,1806,-1753,-1614]]},{"type":"Polygon","id":46135,"arcs":[[1807,1808,1809,1810,-1677,-1675]]},{"type":"Polygon","id":46009,"arcs":[[-1811,1811,-1670,-1678]]},{"type":"Polygon","id":26155,"arcs":[[-1769,1812,1813,1814,-1693,-1619]]},{"type":"Polygon","id":36037,"arcs":[[1815,1816,1817,-1715,-1712,-1721]]},{"type":"Polygon","id":26067,"arcs":[[1818,1819,1820,-1743,-1689]]},{"type":"Polygon","id":26037,"arcs":[[-1815,1821,1822,-1819,-1694]]},{"type":"Polygon","id":16077,"arcs":[[-1598,1823,1824,1825,-1444]]},{"type":"MultiPolygon","id":36029,"arcs":[[[1826]],[[-1818,1827,1828,1829,1830,1831,-1716]]]},{"type":"Polygon","id":46127,"arcs":[[-1757,1832,1833,1834,1835,1836,-1661]]},{"type":"Polygon","id":46027,"arcs":[[-1837,1837,1838,-1808,-1674,-1662]]},{"type":"Polygon","id":19065,"arcs":[[1839,1840,1841,-1770,-1658]]},{"type":"Polygon","id":19043,"arcs":[[-1696,-1780,1842,1843,-1840,-1656]]},{"type":"Polygon","id":36057,"arcs":[[-1706,1844,1845,1846,-1419,-1747]]},{"type":"Polygon","id":36069,"arcs":[[1847,1848,1849,1850,-1719,-1724]]},{"type":"Polygon","id":16005,"arcs":[[1851,1852,1853,-1824,-1597]]},{"type":"Polygon","id":16029,"arcs":[[-1594,-1734,1854,1855,-1852,-1596]]},{"type":"Polygon","id":36099,"arcs":[[1856,1857,1858,-1848,-1723,-1700]]},{"type":"Polygon","id":31165,"arcs":[[1859,1860,1861,-1644,-1684,1862]]},{"type":"Polygon","id":31161,"arcs":[[1863,1864,1865,1866,1867,-1573,1868]]},{"type":"Polygon","id":31045,"arcs":[[1869,-1863,-1683,-1574,-1868]]},{"type":"Polygon","id":31015,"arcs":[[1870,1871,1872,-1681,-1672]]},{"type":"Polygon","id":31103,"arcs":[[-1873,1873,1874,1875,-1552,-1682]]},{"type":"Polygon","id":31031,"arcs":[[-1710,-1876,1876,1877,1878,1879,1880,-1869,-1709]]},{"type":"Polygon","id":41029,"arcs":[[-1602,1881,1882,-1461]]},{"type":"Polygon","id":36051,"arcs":[[-1851,1883,1884,1885,-1816,-1720]]},{"type":"Polygon","id":36083,"arcs":[[-1738,1886,1887,1888,-1703,-1546]]},{"type":"Polygon","id":36093,"arcs":[[1889,1890,-1845,-1705]]},{"type":"Polygon","id":41015,"arcs":[[-1463,1891,1892,1893,-1611]]},{"type":"Polygon","id":16083,"arcs":[[-1791,1894,1895,1896,-1580,-1415,-1792]]},{"type":"Polygon","id":19149,"arcs":[[1897,1898,-1833,-1756]]},{"type":"Polygon","id":19021,"arcs":[[1899,1900,1901,-1766]]},{"type":"Polygon","id":19035,"arcs":[[-1902,1902,1903,-1898,-1759]]},{"type":"Polygon","id":19151,"arcs":[[1904,1905,1906,-1900,-1764]]},{"type":"Polygon","id":19197,"arcs":[[1907,1908,1909,1910,-1763]]},{"type":"Polygon","id":19091,"arcs":[[-1911,1911,-1905,-1631]]},{"type":"Polygon","id":19069,"arcs":[[1912,1913,-1908,-1761]]},{"type":"Polygon","id":19023,"arcs":[[1914,1915,1916,-1913,-1773]]},{"type":"Polygon","id":19017,"arcs":[[-1842,1917,-1915,-1771]]},{"type":"Polygon","id":36077,"arcs":[[-1847,1918,1919,1920,-1803,-1605,-1420]]},{"type":"Polygon","id":31089,"arcs":[[1921,1922,1923,1924,1925,1926,-1872]]},{"type":"Polygon","id":26099,"arcs":[[1927,1928,1929,-1727,1930]]},{"type":"Polygon","id":26125,"arcs":[[1931,1932,1933,-1767,-1728,-1930]]},{"type":"Polygon","id":25009,"arcs":[[1934,1935,1936,-1781,-1749]]},{"type":"Polygon","id":31107,"arcs":[[-1812,-1810,1937,1938,1939,-1922,-1871,-1671]]},{"type":"Polygon","id":31027,"arcs":[[-1839,1940,1941,1942,-1938,-1809]]},{"type":"Polygon","id":36121,"arcs":[[-1886,1943,1944,-1828,-1817]]},{"type":"Polygon","id":55045,"arcs":[[1945,1946,1947,1948,-1774,-1741]]},{"type":"Polygon","id":16053,"arcs":[[-1797,1949,-1895,-1790,-1788]]},{"type":"Polygon","id":55105,"arcs":[[-1795,1950,1951,1952,-1946,-1740]]},{"type":"Polygon","id":31017,"arcs":[[1953,1954,1955,-1877,-1875]]},{"type":"Polygon","id":55127,"arcs":[[-1800,1956,1957,1958,1959,-1951,-1794]]},{"type":"Polygon","id":55101,"arcs":[[1960,1961,-1957,-1799,-1802]]},{"type":"Polygon","id":36095,"arcs":[[-1891,1962,1963,1964,-1919,-1846]]},{"type":"Polygon","id":36001,"arcs":[[-1889,1965,-1963,-1890,-1704]]},{"type":"Polygon","id":55065,"arcs":[[-1949,1966,1967,-1777,-1775]]},{"type":"Polygon","id":31149,"arcs":[[1968,-1954,-1874,-1927]]},{"type":"Polygon","id":36023,"arcs":[[1969,1970,-1698,-1752,-1805,1971,1972]]},{"type":"Polygon","id":41033,"arcs":[[-1462,-1883,1973,1974,-1892]]},{"type":"Polygon","id":26093,"arcs":[[-1934,1975,1976,1977,-1813,-1768]]},{"type":"Polygon","id":26065,"arcs":[[-1978,1978,1979,-1822,-1814]]},{"type":"Polygon","id":26045,"arcs":[[-1823,-1980,1980,1981,1982,-1820]]},{"type":"Polygon","id":26015,"arcs":[[-1983,1983,1984,1985,-1744,-1821]]},{"type":"Polygon","id":26005,"arcs":[[-1745,-1986,1986,1987,1988,-1785]]},{"type":"Polygon","id":36123,"arcs":[[1989,1990,-1849,-1859]]},{"type":"Polygon","id":31051,"arcs":[[-1836,1991,1992,1993,-1941,-1838]]},{"type":"Polygon","id":25003,"arcs":[[1994,1995,1996,1997,1998,1999,-1887,-1737]]},{"type":"Polygon","id":36017,"arcs":[[-1921,2000,2001,2002,-1972,-1804]]},{"type":"Polygon","id":25011,"arcs":[[2003,-1995,-1736,-1754,-1807,2004]]},{"type":"Polygon","id":25017,"arcs":[[2005,2006,2007,2008,2009,2010,2011,2012,2013,-1782,-1937]]},{"type":"Polygon","id":25027,"arcs":[[-1783,-2014,2014,2015,2016,2017,2018,2019,-2005,-1806]]},{"type":"Polygon","id":16031,"arcs":[[-1826,2020,2021,2022,-1896,-1950,-1796,-1445]]},{"type":"Polygon","id":19061,"arcs":[[2023,2024,2025,2026,-1843,-1779]]},{"type":"Polygon","id":55059,"arcs":[[2027,2028,2029,-1958,-1962]]},{"type":"Polygon","id":19055,"arcs":[[-2027,2030,2031,2032,-1844]]},{"type":"Polygon","id":19187,"arcs":[[-1910,2033,2034,2035,2036,-1906,-1912]]},{"type":"Polygon","id":19019,"arcs":[[-2033,2037,2038,2039,-1841]]},{"type":"Polygon","id":19013,"arcs":[[-2040,2040,2041,2042,-1916,-1918]]},{"type":"Polygon","id":36109,"arcs":[[-1971,2043,2044,2045,-1857,-1699]]},{"type":"Polygon","id":56015,"arcs":[[-1862,2046,2047,2048,2049,-1645]]},{"type":"Polygon","id":56031,"arcs":[[-2050,2050,2051,-1664,-1646]]},{"type":"Polygon","id":16007,"arcs":[[-1733,2052,2053,-1855]]},{"type":"Polygon","id":36101,"arcs":[[-1850,-1991,2054,2055,2056,2057,2058,-1884]]},{"type":"Polygon","id":36013,"arcs":[[2059,2060,2061,2062,-1831]]},{"type":"Polygon","id":19193,"arcs":[[-1904,2063,2064,2065,2066,-1834,-1899]]},{"type":"Polygon","id":19161,"arcs":[[2067,2068,2069,2070,-1901]]},{"type":"Polygon","id":19093,"arcs":[[-2071,2071,-2064,-1903]]},{"type":"Polygon","id":19025,"arcs":[[-2037,2072,2073,-2068,-1907]]},{"type":"Polygon","id":19079,"arcs":[[2074,2075,2076,-2034,-1909]]},{"type":"Polygon","id":19083,"arcs":[[-1914,2077,2078,2079,-2075]]},{"type":"Polygon","id":19075,"arcs":[[-2043,2080,2081,-2078,-1917]]},{"type":"Polygon","id":25015,"arcs":[[-2020,2082,-1996,-2004]]},{"type":"Polygon","id":36097,"arcs":[[-2046,2083,-2055,-1990,-1858]]},{"type":"Polygon","id":36009,"arcs":[[-1829,-1945,2084,2085,2086,-2060,-1830]]},{"type":"Polygon","id":31043,"arcs":[[-1835,-2067,2087,-1992]]},{"type":"Polygon","id":36003,"arcs":[[-1885,-2059,2088,2089,-2085,-1944]]},{"type":"Polygon","id":36025,"arcs":[[-1965,2090,2091,2092,2093,2094,-2001,-1920]]},{"type":"Polygon","id":17085,"arcs":[[-1968,2095,2096,2097,-2024,-1778]]},{"type":"Polygon","id":36021,"arcs":[[2098,2099,2100,-1888,-2000]]},{"type":"Polygon","id":17177,"arcs":[[2101,-2096,-1967,-1948,2102,2103]]},{"type":"Polygon","id":17201,"arcs":[[2104,2105,-2103,-1947,-1953]]},{"type":"Polygon","id":16071,"arcs":[[-1854,2106,2107,2108,-2021,-1825]]},{"type":"Polygon","id":17111,"arcs":[[2109,2110,2111,2112,2113,-1959,-2030]]},{"type":"Polygon","id":17007,"arcs":[[-1960,-2114,2114,-2105,-1952]]},{"type":"Polygon","id":17097,"arcs":[[2115,-2110,-2029,2116]]},{"type":"Polygon","id":36039,"arcs":[[2117,-2091,-1964,-1966,-2101]]},{"type":"MultiPolygon","id":25025,"arcs":[[[2118,2119,-2012,2120,-2010]]]},{"type":"Polygon","id":31139,"arcs":[[2121,2122,2123,-1939,-1943]]},{"type":"Polygon","id":31013,"arcs":[[2124,2125,-1860,-1870,-1867]]},{"type":"Polygon","id":31003,"arcs":[[-2124,2126,2127,2128,-1923,-1940]]},{"type":"Polygon","id":26161,"arcs":[[2129,2130,2131,-1976,-1933,2132]]},{"type":"Polygon","id":56007,"arcs":[[-1666,2133,2134,2135,2136,2137,-1432,-1680]]},{"type":"Polygon","id":56001,"arcs":[[-2052,2138,2139,2140,-2134,-1665]]},{"type":"Polygon","id":16041,"arcs":[[-2054,2141,-2107,-1853,-1856]]},{"type":"Polygon","id":26075,"arcs":[[-1977,-2132,2142,2143,2144,-1981,-1979]]},{"type":"Polygon","id":26025,"arcs":[[-2145,2145,2146,2147,-1984,-1982]]},{"type":"Polygon","id":26159,"arcs":[[2148,2149,2150,2151,-1988]]},{"type":"Polygon","id":26077,"arcs":[[-2148,2152,-2149,-1987,-1985]]},{"type":"Polygon","id":36007,"arcs":[[-2002,-2095,2153,2154,2155,-1973,-2003]]},{"type":"Polygon","id":36107,"arcs":[[-2156,2156,2157,2158,-2044,-1970]]},{"type":"Polygon","id":19097,"arcs":[[-2098,2159,2160,2161,-2025]]},{"type":"Polygon","id":31179,"arcs":[[-1994,2162,2163,2164,-2122,-1942]]},{"type":"Polygon","id":25021,"arcs":[[-2120,2165,2166,2167,2168,-2015,-2013]]},{"type":"Polygon","id":25013,"arcs":[[-2019,2169,2170,2171,-1997,-2083]]},{"type":"Polygon","id":25023,"arcs":[[2172,2173,2174,2175,2176,-2167,2177]]},{"type":"Polygon","id":19011,"arcs":[[2178,2179,2180,-2041,-2039]]},{"type":"Polygon","id":19113,"arcs":[[-2032,2181,2182,2183,-2179,-2038]]},{"type":"Polygon","id":19171,"arcs":[[-2181,2184,2185,-2081,-2042]]},{"type":"Polygon","id":19105,"arcs":[[-2026,-2162,2186,2187,-2182,-2031]]},{"type":"Polygon","id":36015,"arcs":[[-2045,-2159,2188,2189,-2056,-2084]]},{"type":"Polygon","id":31173,"arcs":[[-2066,2190,2191,2192,-2163,-1993,-2088]]},{"type":"Polygon","id":56037,"arcs":[[-1433,-2138,2193,2194,2195,2196,-1730,-1691]]},{"type":"Polygon","id":42049,"arcs":[[2197,2198,2199,2200,-2062]]},{"type":"Polygon","id":26021,"arcs":[[2201,2202,2203,2204,-2151]]},{"type":"Polygon","id":19133,"arcs":[[2205,2206,2207,-2191,-2065]]},{"type":"Polygon","id":19127,"arcs":[[-2186,2208,2209,-2079,-2082]]},{"type":"Polygon","id":19027,"arcs":[[-2074,2210,2211,2212,2213,-2069]]},{"type":"Polygon","id":19047,"arcs":[[-2072,-2070,-2214,2214,2215,-2206]]},{"type":"Polygon","id":19015,"arcs":[[-2077,2216,2217,2218,2219,-2035]]},{"type":"Polygon","id":19073,"arcs":[[-2220,2220,2221,-2211,-2073,-2036]]},{"type":"Polygon","id":19169,"arcs":[[-2080,-2210,2222,2223,-2217,-2076]]},{"type":"Polygon","id":17141,"arcs":[[2224,2225,2226,2227,-2104,-2106]]},{"type":"Polygon","id":17015,"arcs":[[-2228,2228,2229,-2160,-2097,-2102]]},{"type":"Polygon","id":36111,"arcs":[[-2100,2230,2231,2232,-2092,-2118]]},{"type":"Polygon","id":17031,"arcs":[[-2116,2233,2234,2235,2236,2237,2238,-2111]]},{"type":"Polygon","id":17037,"arcs":[[2239,2240,2241,2242,-2225,-2115,-2113]]},{"type":"Polygon","id":17089,"arcs":[[-2239,2243,2244,-2240,-2112]]},{"type":"Polygon","id":31075,"arcs":[[2245,2246,2247,-1864,-1881]]},{"type":"Polygon","id":25005,"arcs":[[2248,2249,2250,2251,2252,-2168,-2177]]},{"type":"Polygon","id":31091,"arcs":[[2253,2254,2255,-2246,-1880]]},{"type":"Polygon","id":31039,"arcs":[[-2193,2256,2257,2258,2259,-2164]]},{"type":"Polygon","id":31119,"arcs":[[2260,2261,2262,-2127,-2123]]},{"type":"Polygon","id":31167,"arcs":[[-2260,2263,2264,-2261,-2165]]},{"type":"Polygon","id":31171,"arcs":[[2265,2266,2267,-2254,-1879]]},{"type":"Polygon","id":31183,"arcs":[[2268,2269,2270,2271,-1924,-2129]]},{"type":"Polygon","id":31009,"arcs":[[-1878,-1956,2272,2273,2274,-2266]]},{"type":"Polygon","id":31115,"arcs":[[2275,2276,-2273,-1955,-1969,-1926]]},{"type":"Polygon","id":31071,"arcs":[[-2272,2277,2278,-2276,-1925]]},{"type":"Polygon","id":26091,"arcs":[[2279,2280,2281,2282,-2143,-2131]]},{"type":"Polygon","id":36027,"arcs":[[-1999,2283,2284,2285,2286,-2231,-2099]]},{"type":"Polygon","id":25001,"arcs":[[-2175,2287]]},{"type":"Polygon","id":26023,"arcs":[[2288,2289,2290,2291,-2147]]},{"type":"Polygon","id":26059,"arcs":[[-2283,2292,2293,2294,-2289,-2146,-2144]]},{"type":"Polygon","id":26149,"arcs":[[-2292,2295,2296,2297,-2153]]},{"type":"Polygon","id":26027,"arcs":[[-2298,2298,2299,-2202,-2150]]},{"type":"Polygon","id":9005,"arcs":[[-2172,2300,2301,2302,-2284,-1998]]},{"type":"Polygon","id":31021,"arcs":[[2303,2304,2305,-2257,-2192,-2208]]},{"type":"Polygon","id":9003,"arcs":[[2306,2307,2308,2309,-2301,-2171]]},{"type":"Polygon","id":9013,"arcs":[[-2018,2310,2311,-2307,-2170]]},{"type":"Polygon","id":19045,"arcs":[[-2230,2312,2313,2314,2315,2316,-2187,-2161]]},{"type":"Polygon","id":9015,"arcs":[[2317,2318,2319,-2311,-2017]]},{"type":"Polygon","id":44007,"arcs":[[-2253,2320,2321,2322,-2318,-2016,-2169]]},{"type":"Polygon","id":36105,"arcs":[[2323,2324,2325,-2093,-2233]]},{"type":"Polygon","id":6093,"arcs":[[-1601,2326,2327,2328,2329,2330,-1974,-1882]]},{"type":"Polygon","id":31069,"arcs":[[-2248,2331,2332,2333,2334,2335,-1865]]},{"type":"Polygon","id":31123,"arcs":[[-2336,2336,2337,2338,-2125,-1866]]},{"type":"Polygon","id":49005,"arcs":[[2339,2340,2341,-2108,-2142]]},{"type":"Polygon","id":31157,"arcs":[[-2339,2342,-2047,-1861,-2126]]},{"type":"Polygon","id":49033,"arcs":[[-1732,2343,2344,2345,2346,-2340,-2053]]},{"type":"Polygon","id":42015,"arcs":[[-2189,-2158,2347,2348,2349,2350,2351]]},{"type":"Polygon","id":42117,"arcs":[[-2190,-2352,2352,2353,-2057]]},{"type":"Polygon","id":49003,"arcs":[[2354,2355,2356,-2022,-2109,-2342]]},{"type":"Polygon","id":32013,"arcs":[[2357,2358,2359,-1428,-1264,-1582,2360]]},{"type":"Polygon","id":32007,"arcs":[[-2023,-2357,2361,2362,2363,2364,-2361,-1581,-1897]]},{"type":"Polygon","id":42083,"arcs":[[-2090,2365,2366,2367,2368,-2086]]},{"type":"Polygon","id":42105,"arcs":[[-2058,-2354,2369,2370,2371,-2366,-2089]]},{"type":"Polygon","id":6015,"arcs":[[-2331,2372,2373,-1893,-1975]]},{"type":"Polygon","id":42127,"arcs":[[-2094,-2326,2374,2375,2376,2377,-2154]]},{"type":"Polygon","id":42115,"arcs":[[2378,2379,-2348,-2157,-2155,-2378]]},{"type":"Polygon","id":42123,"arcs":[[-2369,2380,2381,2382,-2198,-2061,-2087]]},{"type":"Polygon","id":6049,"arcs":[[-1604,2383,2384,2385,-2327,-1600]]},{"type":"Polygon","id":32031,"arcs":[[2386,2387,2388,2389,2390,2391,2392,2393,2394,-2384,-1603,-1429,-2360]]},{"type":"Polygon","id":17043,"arcs":[[2395,2396,-2244,-2238]]},{"type":"Polygon","id":39007,"arcs":[[2397,2398,2399,2400,2401,-2200]]},{"type":"Polygon","id":19031,"arcs":[[-2188,-2317,2402,2403,2404,-2183]]},{"type":"Polygon","id":17195,"arcs":[[-2227,2405,2406,2407,2408,-2313,-2229]]},{"type":"Polygon","id":31011,"arcs":[[-2263,2409,2410,2411,-2269,-2128]]},{"type":"Polygon","id":17103,"arcs":[[-2243,2412,2413,-2406,-2226]]},{"type":"Polygon","id":19085,"arcs":[[-2216,2414,2415,2416,-2304,-2207]]},{"type":"Polygon","id":19095,"arcs":[[2417,2418,2419,2420,-2180]]},{"type":"Polygon","id":19049,"arcs":[[2421,2422,2423,-2221,-2219]]},{"type":"Polygon","id":19165,"arcs":[[2424,2425,2426,-2415,-2215]]},{"type":"Polygon","id":19009,"arcs":[[2427,2428,-2425,-2213]]},{"type":"Polygon","id":19157,"arcs":[[-2421,2429,2430,2431,-2185]]},{"type":"Polygon","id":19153,"arcs":[[-2224,2432,2433,2434,-2422,-2218]]},{"type":"Polygon","id":19099,"arcs":[[-2209,-2432,2435,2436,-2433,-2223]]},{"type":"Polygon","id":19077,"arcs":[[-2424,2437,-2428,-2212,-2222]]},{"type":"Polygon","id":19103,"arcs":[[-2405,2438,2439,2440,-2418,-2184]]},{"type":"Polygon","id":39085,"arcs":[[2441,2442,2443,-2401]]},{"type":"Polygon","id":42039,"arcs":[[-2383,2444,2445,2446,-2398,-2199]]},{"type":"Polygon","id":17161,"arcs":[[2447,2448,2449,2450,2451,-2314,-2409]]},{"type":"Polygon","id":44001,"arcs":[[2452,-2321,-2252]]},{"type":"Polygon","id":19163,"arcs":[[-2452,2453,-2403,-2316,-2315]]},{"type":"Polygon","id":44003,"arcs":[[2454,2455,2456,-2319,-2323]]},{"type":"Polygon","id":18039,"arcs":[[2457,2458,2459,2460,2461,-2299,-2297]]},{"type":"Polygon","id":18141,"arcs":[[2462,2463,2464,-2203,-2300,-2462]]},{"type":"Polygon","id":18091,"arcs":[[2465,2466,2467,-2204,-2465]]},{"type":"Polygon","id":18151,"arcs":[[2468,2469,-2290,-2295,2470]]},{"type":"Polygon","id":18087,"arcs":[[2471,-2458,-2296,-2291,-2470]]},{"type":"Polygon","id":31037,"arcs":[[-2259,2472,2473,2474,-2264]]},{"type":"Polygon","id":31141,"arcs":[[-2475,2475,2476,2477,2478,-2410,-2262,-2265]]},{"type":"Polygon","id":31053,"arcs":[[-2306,2479,2480,2481,2482,-2473,-2258]]},{"type":"Polygon","id":31117,"arcs":[[-2268,2483,2484,2485,2486,-2255]]},{"type":"Polygon","id":31005,"arcs":[[-2487,2487,-2332,-2247,-2256]]},{"type":"Polygon","id":31077,"arcs":[[2488,2489,2490,2491,-2270,-2412]]},{"type":"Polygon","id":31041,"arcs":[[-2279,2492,2493,2494,2495,2496,2497,-2274,-2277]]},{"type":"Polygon","id":31113,"arcs":[[-2275,-2498,2498,-2484,-2267]]},{"type":"Polygon","id":31175,"arcs":[[-2271,-2492,2499,-2493,-2278]]},{"type":"Polygon","id":39095,"arcs":[[2500,2501,2502,2503,-2281,2504,2505,2506,2507,2508,2509]]},{"type":"Polygon","id":17197,"arcs":[[-2237,2510,2511,2512,2513,-2396]]},{"type":"Polygon","id":39123,"arcs":[[2514,2515,2516,2517,2518,-2501]]},{"type":"Polygon","id":17093,"arcs":[[-2514,2519,2520,-2241,-2245,-2397]]},{"type":"Polygon","id":39051,"arcs":[[2521,2522,-2293,-2282,-2504]]},{"type":"Polygon","id":39055,"arcs":[[2523,2524,2525,-2442,-2400]]},{"type":"Polygon","id":9011,"arcs":[[-2457,2526,2527,2528,-2308,-2312,-2320]]},{"type":"Polygon","id":18089,"arcs":[[2529,2530,2531,2532,-2511,-2236,2533]]},{"type":"Polygon","id":18127,"arcs":[[2534,-2530,2535,-2467]]},{"type":"Polygon","id":39171,"arcs":[[2536,2537,2538,-2471,-2294,-2523]]},{"type":"Polygon","id":31007,"arcs":[[-2338,2539,2540,2541,-2048,-2343]]},{"type":"Polygon","id":31177,"arcs":[[-2417,2542,2543,-2480,-2305]]},{"type":"MultiPolygon","id":44005,"arcs":[[[2544]],[[2545,-2250]]]},{"type":"Polygon","id":9001,"arcs":[[2546,2547,2548,2549,-2285,-2303]]},{"type":"Polygon","id":56021,"arcs":[[-2049,-2542,2550,2551,2552,-2139,-2051]]},{"type":"Polygon","id":44009,"arcs":[[-2527,-2456,2553]]},{"type":"Polygon","id":42131,"arcs":[[-2380,2554,2555,2556,-2349]]},{"type":"Polygon","id":9007,"arcs":[[-2529,2557,2558,-2309]]},{"type":"Polygon","id":9009,"arcs":[[-2559,2559,2560,2561,-2547,-2302,-2310]]},{"type":"Polygon","id":42069,"arcs":[[-2377,2562,2563,-2555,-2379]]},{"type":"Polygon","id":36071,"arcs":[[-2287,2564,2565,2566,2567,2568,-2324,-2232]]},{"type":"Polygon","id":17099,"arcs":[[-2521,2569,2570,2571,2572,2573,2574,-2413,-2242]]},{"type":"Polygon","id":39035,"arcs":[[-2526,2575,2576,2577,2578,2579,-2443]]},{"type":"Polygon","id":42047,"arcs":[[2580,2581,2582,2583,-2368]]},{"type":"Polygon","id":42053,"arcs":[[-2584,2584,2585,2586,-2381]]},{"type":"Polygon","id":42121,"arcs":[[2587,2588,2589,-2445,-2382,-2587]]},{"type":"Polygon","id":39043,"arcs":[[2590,2591,2592,2593,2594,2595]]},{"type":"Polygon","id":39173,"arcs":[[-2519,2596,2597,2598,2599,-2502]]},{"type":"Polygon","id":42023,"arcs":[[-2372,2600,2601,-2581,-2367]]},{"type":"Polygon","id":42103,"arcs":[[-2569,2602,2603,-2375,-2325]]},{"type":"Polygon","id":19139,"arcs":[[-2404,-2454,-2451,2604,-2439]]},{"type":"Polygon","id":42081,"arcs":[[2605,2606,2607,2608,2609,2610,-2370,-2353,-2351]]},{"type":"Polygon","id":42113,"arcs":[[-2606,-2350,-2557,2611,2612]]},{"type":"Polygon","id":17011,"arcs":[[-2575,2613,2614,2615,2616,-2407,-2414]]},{"type":"Polygon","id":17073,"arcs":[[-2617,2617,2618,2619,-2448,-2408]]},{"type":"Polygon","id":56041,"arcs":[[-2197,2620,-2344,-1731]]},{"type":"Polygon","id":18033,"arcs":[[2621,2622,2623,-2469,-2539]]},{"type":"Polygon","id":18113,"arcs":[[-2624,2624,2625,2626,-2459,-2472]]},{"type":"Polygon","id":31125,"arcs":[[2627,2628,-2489,-2411,-2479]]},{"type":"Polygon","id":36079,"arcs":[[2629,2630,-2565,-2286,-2550,2631]]},{"type":"Polygon","id":25007,"arcs":[[2632]]},{"type":"Polygon","id":39093,"arcs":[[-2579,2633,2634,2635,-2591,2636]]},{"type":"Polygon","id":19183,"arcs":[[2637,2638,2639,2640,-2419,-2441]]},{"type":"Polygon","id":19181,"arcs":[[2641,2642,2643,2644,-2435]]},{"type":"Polygon","id":19107,"arcs":[[-2641,2645,2646,2647,-2430,-2420]]},{"type":"Polygon","id":19121,"arcs":[[2648,2649,2650,-2423,-2645]]},{"type":"Polygon","id":19123,"arcs":[[-2648,2651,2652,2653,-2436,-2431]]},{"type":"Polygon","id":19125,"arcs":[[-2654,2654,2655,-2642,-2434,-2437]]},{"type":"Polygon","id":19155,"arcs":[[-2427,2656,2657,2658,2659,2660,-2543,-2416]]},{"type":"Polygon","id":19029,"arcs":[[-2429,2661,2662,2663,-2657,-2426]]},{"type":"Polygon","id":19001,"arcs":[[-2438,-2651,2664,2665,-2662]]},{"type":"Polygon","id":39155,"arcs":[[-2447,2666,2667,2668,-2524,-2399]]},{"type":"Polygon","id":39143,"arcs":[[2669,-2593,2670,2671,-2597,-2518]]},{"type":"Polygon","id":42085,"arcs":[[-2590,2672,2673,2674,-2667,-2446]]},{"type":"Polygon","id":39069,"arcs":[[-2503,-2600,2675,2676,-2537,-2522]]},{"type":"Polygon","id":18099,"arcs":[[-2461,2677,2678,2679,-2463]]},{"type":"Polygon","id":42035,"arcs":[[-2611,2680,2681,2682,-2601,-2371]]},{"type":"Polygon","id":6023,"arcs":[[-2330,2683,2684,2685,-2373]]},{"type":"Polygon","id":17063,"arcs":[[2686,2687,-2570,-2520,-2513]]},{"type":"Polygon","id":31023,"arcs":[[-2483,2688,2689,2690,2691,-2476,-2474]]},{"type":"Polygon","id":31155,"arcs":[[2692,2693,2694,2695,-2689,-2482]]},{"type":"Polygon","id":18085,"arcs":[[-2627,2696,2697,2698,-2678,-2460]]},{"type":"Polygon","id":31033,"arcs":[[-2335,2699,2700,2701,2702,-2540,-2337]]},{"type":"Polygon","id":42031,"arcs":[[2703,2704,2705,-2588,-2586]]},{"type":"Polygon","id":49057,"arcs":[[-2341,-2347,2706,2707,-2355]]},{"type":"Polygon","id":18149,"arcs":[[-2680,2708,2709,-2466,-2464]]},{"type":"Polygon","id":42079,"arcs":[[2710,2711,2712,2713,-2612,-2556,-2564]]},{"type":"Polygon","id":39039,"arcs":[[2714,2715,2716,-2622,-2538,-2677]]},{"type":"Polygon","id":19115,"arcs":[[-2605,-2450,2717,2718,2719,-2638,-2440]]},{"type":"Polygon","id":31101,"arcs":[[2720,2721,2722,-2333,-2488,-2486]]},{"type":"Polygon","id":31111,"arcs":[[-2499,-2497,2723,2724,2725,2726,-2721,-2485]]},{"type":"Polygon","id":25019,"arcs":[[2727]]},{"type":"Polygon","id":31143,"arcs":[[2728,2729,2730,-2477,-2692]]},{"type":"Polygon","id":31105,"arcs":[[-2703,2731,2732,-2551,-2541]]},{"type":"Polygon","id":31121,"arcs":[[-2731,2733,2734,2735,-2628,-2478]]},{"type":"Polygon","id":31093,"arcs":[[-2629,-2736,2736,2737,2738,-2490]]},{"type":"Polygon","id":31163,"arcs":[[-2491,-2739,2739,-2494,-2500]]},{"type":"Polygon","id":31055,"arcs":[[-2544,-2661,2740,-2693,-2481]]},{"type":"Polygon","id":49029,"arcs":[[2741,2742,2743,-2707,-2346]]},{"type":"Polygon","id":42065,"arcs":[[2744,2745,2746,-2704,-2585,-2583]]},{"type":"Polygon","id":6105,"arcs":[[2747,2748,2749,-2684,-2329]]},{"type":"Polygon","id":36119,"arcs":[[2750,2751,-2632,-2549,2752]]},{"type":"Polygon","id":34037,"arcs":[[2753,2754,2755,2756,-2603,-2568]]},{"type":"Polygon","id":39153,"arcs":[[2757,2758,2759,2760,-2577]]},{"type":"Polygon","id":39133,"arcs":[[-2669,2761,2762,-2758,-2576,-2525]]},{"type":"Polygon","id":17131,"arcs":[[-2620,2763,2764,2765,2766,-2718,-2449]]},{"type":"Polygon","id":17155,"arcs":[[-2574,2767,-2614]]},{"type":"Polygon","id":36087,"arcs":[[2768,2769,-2566,-2631,2770]]},{"type":"Polygon","id":42037,"arcs":[[2771,2772,2773,-2607,-2613,-2714]]},{"type":"Polygon","id":17091,"arcs":[[-2533,2774,2775,2776,2777,-2687,-2512]]},{"type":"Polygon","id":18183,"arcs":[[2778,2779,2780,-2697,-2626]]},{"type":"MultiPolygon","id":36103,"arcs":[[[2781,2782]]]},{"type":"Polygon","id":39077,"arcs":[[-2636,2783,2784,2785,2786,-2671,-2592]]},{"type":"Polygon","id":18073,"arcs":[[-2710,2787,2788,2789,2790,-2531,-2535]]},{"type":"Polygon","id":39103,"arcs":[[-2761,2791,2792,-2634,-2578]]},{"type":"Polygon","id":18003,"arcs":[[2793,2794,2795,2796,2797,-2779,-2625,-2623,-2717]]},{"type":"Polygon","id":39147,"arcs":[[-2787,2798,2799,2800,-2598,-2672]]},{"type":"Polygon","id":42033,"arcs":[[2801,2802,2803,2804,-2745,-2582,-2602,-2683]]},{"type":"Polygon","id":49043,"arcs":[[-2621,-2196,2805,2806,2807,2808,-2742,-2345]]},{"type":"Polygon","id":42027,"arcs":[[2809,2810,2811,2812,-2802,-2682]]},{"type":"Polygon","id":42089,"arcs":[[-2757,2813,2814,2815,-2711,-2563,-2376,-2604]]},{"type":"Polygon","id":39125,"arcs":[[2816,2817,-2794,-2716]]},{"type":"Polygon","id":17175,"arcs":[[-2616,2818,2819,2820,-2618]]},{"type":"Polygon","id":31049,"arcs":[[-2723,2821,2822,-2700,-2334]]},{"type":"Polygon","id":18111,"arcs":[[2823,2824,-2775,-2532,-2791]]},{"type":"Polygon","id":34031,"arcs":[[2825,2826,-2754,-2567,-2770,2827]]},{"type":"Polygon","id":31153,"arcs":[[-2660,2828,2829,-2694,-2741]]},{"type":"Polygon","id":6035,"arcs":[[-2395,2830,2831,2832,-2385]]},{"type":"Polygon","id":6089,"arcs":[[-2386,-2833,2833,2834,-2748,-2328]]},{"type":"Polygon","id":42097,"arcs":[[2835,-2773,2836,2837,2838,2839,2840,-2609]]},{"type":"Polygon","id":18049,"arcs":[[2841,2842,2843,2844,-2679,-2699]]},{"type":"Polygon","id":31081,"arcs":[[2845,2846,2847,2848,-2734,-2730]]},{"type":"Polygon","id":18131,"arcs":[[-2845,2849,2850,-2788,-2709]]},{"type":"Polygon","id":42093,"arcs":[[-2774,-2836,-2608]]},{"type":"Polygon","id":42019,"arcs":[[-2706,2851,2852,2853,2854,-2673,-2589]]},{"type":"Polygon","id":42005,"arcs":[[-2747,2855,2856,2857,-2852,-2705]]},{"type":"Polygon","id":39063,"arcs":[[-2801,2858,2859,2860,2861,-2599]]},{"type":"Polygon","id":39137,"arcs":[[-2862,2862,2863,-2817,-2715,-2676]]},{"type":"Polygon","id":19101,"arcs":[[-2640,2864,2865,2866,-2646]]},{"type":"Polygon","id":19087,"arcs":[[-2720,2867,2868,2869,-2865,-2639]]},{"type":"Polygon","id":19179,"arcs":[[-2867,2870,2871,-2652,-2647]]},{"type":"Polygon","id":19039,"arcs":[[2872,2873,2874,-2649,-2644]]},{"type":"Polygon","id":19117,"arcs":[[-2656,2875,2876,-2873,-2643]]},{"type":"Polygon","id":19135,"arcs":[[-2872,2877,-2876,-2655,-2653]]},{"type":"Polygon","id":19129,"arcs":[[2878,2879,2880,-2829,-2659]]},{"type":"Polygon","id":19137,"arcs":[[-2664,2881,2882,-2879,-2658]]},{"type":"Polygon","id":19003,"arcs":[[-2666,2883,2884,-2882,-2663]]},{"type":"Polygon","id":19175,"arcs":[[-2650,-2875,2885,-2884,-2665]]},{"type":"Polygon","id":49011,"arcs":[[-2744,2886,2887,-2708]]},{"type":"Polygon","id":17095,"arcs":[[-2821,2888,2889,2890,-2764,-2619]]},{"type":"Polygon","id":42119,"arcs":[[2891,2892,-2810,-2681,-2610,-2841]]},{"type":"Polygon","id":17123,"arcs":[[-2768,-2573,2893,2894,-2819,-2615]]},{"type":"Polygon","id":34003,"arcs":[[2895,2896,-2828,-2769,2897]]},{"type":"Polygon","id":39099,"arcs":[[-2675,2898,2899,2900,-2762,-2668]]},{"type":"Polygon","id":42025,"arcs":[[-2816,2901,2902,2903,-2712]]},{"type":"Polygon","id":42073,"arcs":[[-2855,2904,2905,-2899,-2674]]},{"type":"Polygon","id":17105,"arcs":[[-2778,2906,2907,2908,-2571,-2688]]},{"type":"Polygon","id":34041,"arcs":[[2909,2910,2911,2912,-2814,-2756]]},{"type":"Polygon","id":34027,"arcs":[[2913,2914,2915,2916,-2910,-2755,-2827]]},{"type":"Polygon","id":49045,"arcs":[[2917,2918,2919,2920,-2362,-2356,-2888]]},{"type":"Polygon","id":19057,"arcs":[[-2767,2921,2922,2923,-2868,-2719]]},{"type":"Polygon","id":17071,"arcs":[[2924,2925,2926,2927,-2922,-2766]]},{"type":"Polygon","id":17187,"arcs":[[-2891,2928,2929,-2925,-2765]]},{"type":"Polygon","id":39005,"arcs":[[-2793,2930,2931,2932,2933,-2784,-2635]]},{"type":"Polygon","id":31025,"arcs":[[-2881,2934,2935,2936,-2695,-2830]]},{"type":"Polygon","id":31185,"arcs":[[2937,2938,2939,-2846,-2729]]},{"type":"Polygon","id":31079,"arcs":[[-2735,-2849,2940,2941,-2737]]},{"type":"Polygon","id":31047,"arcs":[[2942,2943,2944,2945,-2724,-2496]]},{"type":"Polygon","id":31019,"arcs":[[-2738,-2942,2946,2947,2948,-2943,-2495,-2740]]},{"type":"Polygon","id":31159,"arcs":[[2949,2950,-2938,-2691]]},{"type":"Polygon","id":31109,"arcs":[[-2937,2951,2952,2953,-2950,-2690,-2696]]},{"type":"Polygon","id":18169,"arcs":[[-2781,2954,2955,2956,-2842,-2698]]},{"type":"Polygon","id":17075,"arcs":[[-2825,2957,2958,2959,-2776]]},{"type":"Polygon","id":18069,"arcs":[[-2798,2960,2961,-2955,-2780]]},{"type":"Polygon","id":8123,"arcs":[[2962,2963,2964,2965,2966,-2552,-2733,2967]]},{"type":"Polygon","id":31135,"arcs":[[-2727,2968,2969,2970,2971,-2822,-2722]]},{"type":"Polygon","id":8107,"arcs":[[2972,2973,2974,2975,2976,-2136,2977]]},{"type":"Polygon","id":8057,"arcs":[[2978,-2978,-2135,-2141,2979]]},{"type":"Polygon","id":8081,"arcs":[[-2977,2980,2981,2982,-2194,-2137]]},{"type":"Polygon","id":8075,"arcs":[[2983,2984,2985,-2968,-2732,-2702,2986,2987]]},{"type":"Polygon","id":8115,"arcs":[[2988,-2987,-2701,-2823,-2972]]},{"type":"Polygon","id":49009,"arcs":[[2989,2990,-2806,-2195,-2983]]},{"type":"Polygon","id":32011,"arcs":[[2991,2992,2993,-2364]]},{"type":"Polygon","id":32015,"arcs":[[-2994,2994,2995,2996,-2358,-2365]]},{"type":"Polygon","id":8069,"arcs":[[2997,2998,-2980,-2140,-2553,-2967]]},{"type":"Polygon","id":18103,"arcs":[[-2957,2999,3000,3001,-2843]]},{"type":"Polygon","id":39033,"arcs":[[3002,3003,3004,3005,-2799,-2786]]},{"type":"Polygon","id":17053,"arcs":[[3006,3007,3008,-2907,-2777,-2960]]},{"type":"Polygon","id":39139,"arcs":[[-2934,3009,3010,-3003,-2785]]},{"type":"Polygon","id":39175,"arcs":[[-3006,3011,3012,-2859,-2800]]},{"type":"Polygon","id":39169,"arcs":[[-2760,3013,3014,-2931,-2792]]},{"type":"Polygon","id":39161,"arcs":[[-2864,3015,3016,3017,3018,-2795,-2818]]},{"type":"Polygon","id":39151,"arcs":[[-2901,3019,3020,3021,3022,-3014,-2759,-2763]]},{"type":"Polygon","id":17143,"arcs":[[-2895,3023,3024,3025,-2889,-2820]]},{"type":"Polygon","id":42095,"arcs":[[3026,3027,-2902,-2815,-2913]]},{"type":"Polygon","id":32027,"arcs":[[-2997,3028,-2387,-2359]]},{"type":"Polygon","id":42107,"arcs":[[-2904,3029,3030,3031,3032,-2837,-2772,-2713]]},{"type":"Polygon","id":39029,"arcs":[[-2906,3033,3034,3035,3036,-3020,-2900]]},{"type":"Polygon","id":17203,"arcs":[[3037,3038,-3024,-2894,-2572,-2909]]},{"type":"Polygon","id":18001,"arcs":[[3039,3040,3041,-2796,-3019]]},{"type":"Polygon","id":39003,"arcs":[[-2861,3042,3043,-3016,-2863]]},{"type":"Polygon","id":49035,"arcs":[[-2743,-2809,3044,3045,-2918,-2887]]},{"type":"Polygon","id":36005,"arcs":[[3046,3047,3048,-2751]]},{"type":"Polygon","id":18179,"arcs":[[-3042,3049,3050,3051,-2961,-2797]]},{"type":"Polygon","id":36059,"arcs":[[-2782,3052,3053,3054,3055,3056]]},{"type":"Polygon","id":18181,"arcs":[[3057,3058,3059,3060,-2789,-2851]]},{"type":"Polygon","id":18017,"arcs":[[-2844,-3002,3061,3062,-3058,-2850]]},{"type":"Polygon","id":42063,"arcs":[[-2805,3063,3064,-2856,-2746]]},{"type":"Polygon","id":34013,"arcs":[[-2826,-2897,3065,3066,3067,-2914]]},{"type":"Polygon","id":19071,"arcs":[[3068,3069,3070,-2935,-2880]]},{"type":"Polygon","id":19145,"arcs":[[3071,3072,3073,-3069,-2883]]},{"type":"Polygon","id":19173,"arcs":[[3074,3075,3076,-3072,-2885]]},{"type":"Polygon","id":19177,"arcs":[[-2870,3077,3078,3079,3080,-2866]]},{"type":"Polygon","id":19051,"arcs":[[-3081,3081,3082,3083,-2871]]},{"type":"Polygon","id":19159,"arcs":[[3084,3085,3086,-3075,-2886]]},{"type":"Polygon","id":19053,"arcs":[[3087,3088,3089,-3085,-2874]]},{"type":"Polygon","id":19185,"arcs":[[3090,3091,3092,-3088,-2877]]},{"type":"Polygon","id":19007,"arcs":[[-3084,3093,3094,-3091,-2878]]},{"type":"Polygon","id":42109,"arcs":[[-2840,3095,3096,-2892]]},{"type":"Polygon","id":36061,"arcs":[[3097,-3048]]},{"type":"Polygon","id":49047,"arcs":[[-2982,3098,3099,3100,3101,3102,3103,-2990]]},{"type":"Polygon","id":42007,"arcs":[[-2854,3104,3105,3106,-3034,-2905]]},{"type":"Polygon","id":42087,"arcs":[[3107,-2811,-2893,-3097,3108]]},{"type":"Polygon","id":49013,"arcs":[[-2991,-3104,3109,3110,3111,-2807]]},{"type":"Polygon","id":39065,"arcs":[[-3013,3112,3113,3114,3115,-3043,-2860]]},{"type":"Polygon","id":34017,"arcs":[[3116,-3066,-2896]]},{"type":"Polygon","id":19111,"arcs":[[-2924,-2923,-2928,3117,3118,-3078,-2869]]},{"type":"Polygon","id":36081,"arcs":[[-3056,3119,3120,3121]]},{"type":"Polygon","id":34019,"arcs":[[3122,3123,3124,-2911,-2917]]},{"type":"Polygon","id":42077,"arcs":[[3125,3126,3127,-3030,-2903,-3028]]},{"type":"Polygon","id":31131,"arcs":[[-3071,3128,3129,3130,-2952,-2936]]},{"type":"Polygon","id":34035,"arcs":[[3131,3132,3133,-3123,-2916]]},{"type":"Polygon","id":17113,"arcs":[[-3009,3134,3135,3136,3137,3138,-3038,-2908]]},{"type":"Polygon","id":8095,"arcs":[[-2971,3139,3140,-2988,-2989]]},{"type":"Polygon","id":17179,"arcs":[[-3139,3141,3142,3143,-3025,-3039]]},{"type":"Polygon","id":42061,"arcs":[[-3108,3144,3145,3146,3147,3148,3149,-2812]]},{"type":"Polygon","id":42013,"arcs":[[-3149,3150,3151,-2803,-2813,-3150]]},{"type":"Polygon","id":36047,"arcs":[[3152,-3121]]},{"type":"Polygon","id":18007,"arcs":[[-2790,-3061,3153,3154,3155,-2958,-2824]]},{"type":"Polygon","id":34039,"arcs":[[3156,3157,-3132,-2915,-3068]]},{"type":"Polygon","id":18015,"arcs":[[-3063,3158,3159,3160,-3059]]},{"type":"Polygon","id":39019,"arcs":[[-3037,3161,3162,3163,-3021]]},{"type":"Polygon","id":39107,"arcs":[[3164,3165,3166,3167,-3040,-3018]]},{"type":"Polygon","id":42021,"arcs":[[-3152,3168,3169,3170,-3064,-2804]]},{"type":"Polygon","id":17057,"arcs":[[-3026,-3144,3171,3172,3173,-2929,-2890]]},{"type":"Polygon","id":39117,"arcs":[[-3011,3174,3175,3176,-3004]]},{"type":"Polygon","id":39101,"arcs":[[-3177,3177,3178,-3113,-3012,-3005]]},{"type":"Polygon","id":31063,"arcs":[[-2946,3179,3180,3181,3182,3183,-2725]]},{"type":"Polygon","id":31001,"arcs":[[-2848,3184,3185,3186,-2947,-2941]]},{"type":"Polygon","id":31073,"arcs":[[3187,3188,-3180,-2945]]},{"type":"Polygon","id":31085,"arcs":[[-3184,3189,3190,3191,-2969,-2726]]},{"type":"Polygon","id":31029,"arcs":[[-3192,3192,3193,-3140,-2970]]},{"type":"Polygon","id":31059,"arcs":[[3194,3195,3196,3197,-2939]]},{"type":"Polygon","id":31151,"arcs":[[-2951,-2954,3198,3199,-3195]]},{"type":"Polygon","id":31035,"arcs":[[-3198,3200,3201,-3185,-2847,-2940]]},{"type":"Polygon","id":42067,"arcs":[[-2839,3202,3203,-3145,-3109,-3096]]},{"type":"Polygon","id":49051,"arcs":[[-3112,3204,-3045,-2808]]},{"type":"Polygon","id":31099,"arcs":[[3205,3206,3207,-2948,-3187]]},{"type":"Polygon","id":39011,"arcs":[[-3116,3208,3209,-3165,-3017,-3044]]},{"type":"Polygon","id":31137,"arcs":[[-2949,-3208,3210,3211,-3188,-2944]]},{"type":"Polygon","id":42129,"arcs":[[-3065,-3171,3212,3213,3214,3215,-2857]]},{"type":"Polygon","id":42011,"arcs":[[3216,3217,3218,3219,-3031,-3128]]},{"type":"Polygon","id":42003,"arcs":[[-2858,-3216,3220,-3105,-2853]]},{"type":"Polygon","id":39075,"arcs":[[-3023,3221,3222,3223,-2932,-3015]]},{"type":"Polygon","id":39157,"arcs":[[-3164,3224,3225,3226,-3222,-3022]]},{"type":"Polygon","id":42043,"arcs":[[-3033,3227,3228,3229,3230,3231,-2838]]},{"type":"Polygon","id":18053,"arcs":[[-3052,3232,3233,3234,3235,3236,-3000,-2956,-2962]]},{"type":"Polygon","id":36085,"arcs":[[3237]]},{"type":"Polygon","id":17067,"arcs":[[3238,3239,3240,3241,3242,-3118,-2927]]},{"type":"Polygon","id":54029,"arcs":[[3243,3244,3245,-3035,-3107]]},{"type":"Polygon","id":17109,"arcs":[[-3174,3246,-3239,-2926,-2930]]},{"type":"Polygon","id":42099,"arcs":[[3247,3248,-3203,-3232]]},{"type":"Polygon","id":29045,"arcs":[[-3243,3249,3250,3251,-3079,-3119]]},{"type":"Polygon","id":42017,"arcs":[[3252,3253,3254,3255,-3126,-3027,-2912,-3125]]},{"type":"Polygon","id":34023,"arcs":[[3256,3257,3258,-3133,-3158]]},{"type":"Polygon","id":29199,"arcs":[[-3252,3259,3260,3261,-3082,-3080]]},{"type":"Polygon","id":39081,"arcs":[[-3246,3262,3263,3264,3265,-3162,-3036]]},{"type":"Polygon","id":29197,"arcs":[[3266,3267,-3094,-3083,-3262]]},{"type":"Polygon","id":29171,"arcs":[[-3268,3268,3269,3270,-3092,-3095]]},{"type":"Polygon","id":29005,"arcs":[[-3074,3271,3272,3273,-3129,-3070]]},{"type":"Polygon","id":29129,"arcs":[[-3271,3274,3275,3276,-3089,-3093]]},{"type":"Polygon","id":29147,"arcs":[[-3077,3277,3278,3279,3280,-3272,-3073]]},{"type":"Polygon","id":49049,"arcs":[[-3111,3281,3282,3283,-2919,-3046,-3205]]},{"type":"Polygon","id":29081,"arcs":[[-3277,3284,3285,3286,3287,-3086,-3090]]},{"type":"Polygon","id":39083,"arcs":[[3288,3289,3290,-3175,-3010,-2933,-3224]]},{"type":"Polygon","id":18075,"arcs":[[-3168,3291,3292,3293,3294,-3050,-3041]]},{"type":"Polygon","id":29227,"arcs":[[-3288,3295,-3278,-3076,-3087]]},{"type":"Polygon","id":18009,"arcs":[[-3295,3296,-3233,-3051]]},{"type":"Polygon","id":18067,"arcs":[[3297,3298,-3159,-3062,-3001,-3237]]},{"type":"Polygon","id":18157,"arcs":[[-3161,3299,3300,3301,3302,-3154,-3060]]},{"type":"Polygon","id":31127,"arcs":[[3303,3304,3305,3306,-3130,-3274]]},{"type":"Polygon","id":42075,"arcs":[[-3228,-3032,-3220,3307]]},{"type":"Polygon","id":39091,"arcs":[[-3115,3308,3309,3310,-3209]]},{"type":"Polygon","id":8087,"arcs":[[-2986,3311,3312,-2963]]},{"type":"Polygon","id":31067,"arcs":[[3313,3314,3315,3316,3317,-3199,-2953]]},{"type":"Polygon","id":31097,"arcs":[[-3307,3318,-3314,-3131]]},{"type":"Polygon","id":39159,"arcs":[[3319,3320,3321,-3309,-3114,-3179,3322]]},{"type":"Polygon","id":17183,"arcs":[[-3156,3323,3324,3325,3326,-3007,-2959]]},{"type":"Polygon","id":8049,"arcs":[[3327,3328,3329,3330,3331,-2973,-2979,-2999]]},{"type":"Polygon","id":39149,"arcs":[[-3311,3332,3333,3334,-3166,-3210]]},{"type":"Polygon","id":42125,"arcs":[[-3221,-3215,3335,3336,3337,3338,3339,-3244,-3106]]},{"type":"Polygon","id":18171,"arcs":[[-3303,3340,3341,-3324,-3155]]},{"type":"Polygon","id":34025,"arcs":[[3342,3343,3344,3345,-3258,3346]]},{"type":"Polygon","id":39031,"arcs":[[-3227,3347,3348,3349,-3289,-3223]]},{"type":"Polygon","id":42091,"arcs":[[3350,3351,3352,3353,-3217,-3127,-3256]]},{"type":"Polygon","id":6103,"arcs":[[3354,3355,3356,3357,-2749,-2835]]},{"type":"Polygon","id":6063,"arcs":[[-2832,3358,3359,3360,-3355,-2834]]},{"type":"Polygon","id":39041,"arcs":[[-3291,3361,3362,-3323,-3178,-3176]]},{"type":"Polygon","id":8125,"arcs":[[-3194,3363,3364,3365,3366,-2984,-3141]]},{"type":"Polygon","id":8121,"arcs":[[-3367,3367,3368,3369,3370,-3312,-2985]]},{"type":"Polygon","id":17125,"arcs":[[3371,3372,3373,3374,-3172,-3143]]},{"type":"Polygon","id":39067,"arcs":[[-3266,3375,3376,-3225,-3163]]},{"type":"Polygon","id":18023,"arcs":[[-3299,3377,3378,3379,3380,-3300,-3160]]},{"type":"Polygon","id":34021,"arcs":[[-3259,-3346,3381,-3253,-3124,-3134]]},{"type":"Polygon","id":18159,"arcs":[[-3236,3382,3383,-3378,-3298]]},{"type":"Polygon","id":54009,"arcs":[[-3340,3384,-3263,-3245]]},{"type":"Polygon","id":17019,"arcs":[[-3327,3385,3386,-3135,-3008]]},{"type":"Polygon","id":29211,"arcs":[[3387,3388,3389,-3275,-3270]]},{"type":"Polygon","id":29075,"arcs":[[-3287,3390,3391,3392,-3279,-3296]]},{"type":"Polygon","id":18095,"arcs":[[3393,3394,3395,3396,-3383,-3235]]},{"type":"Polygon","id":18035,"arcs":[[-3297,-3294,3397,3398,-3394,-3234]]},{"type":"Polygon","id":18045,"arcs":[[-3302,3399,3400,3401,-3341]]},{"type":"Polygon","id":39037,"arcs":[[-3335,3402,3403,3404,3405,3406,-3292,-3167]]},{"type":"Polygon","id":31181,"arcs":[[-3202,3407,3408,3409,3410,-3206,-3186]]},{"type":"Polygon","id":31061,"arcs":[[-3411,3411,3412,3413,-3207]]},{"type":"Polygon","id":31129,"arcs":[[-3197,3414,3415,3416,-3408,-3201]]},{"type":"Polygon","id":31057,"arcs":[[3417,3418,3419,-3364,-3193,-3191]]},{"type":"Polygon","id":31065,"arcs":[[-3212,3420,3421,3422,3423,-3181,-3189]]},{"type":"Polygon","id":31169,"arcs":[[3424,3425,-3415,-3196]]},{"type":"Polygon","id":31095,"arcs":[[-3200,-3318,3426,-3425]]},{"type":"Polygon","id":31145,"arcs":[[-3424,3427,3428,3429,-3182]]},{"type":"Polygon","id":31087,"arcs":[[-3183,-3430,3430,-3418,-3190]]},{"type":"Polygon","id":31083,"arcs":[[-3414,3431,3432,-3421,-3211]]},{"type":"Polygon","id":29001,"arcs":[[-3261,3433,3434,3435,-3388,-3269,-3267]]},{"type":"Polygon","id":42041,"arcs":[[3436,3437,3438,-3248,-3231]]},{"type":"Polygon","id":17107,"arcs":[[3439,3440,3441,3442,-3372,-3142,-3138]]},{"type":"Polygon","id":42009,"arcs":[[-3148,3443,3444,3445,-3169,-3151]]},{"type":"Polygon","id":42071,"arcs":[[3446,3447,3448,3449,-3229,-3308,-3219]]},{"type":"Polygon","id":18135,"arcs":[[-3407,3450,3451,-3398,-3293]]},{"type":"Polygon","id":29103,"arcs":[[-3251,3452,3453,3454,-3434,-3260]]},{"type":"Polygon","id":42055,"arcs":[[-3439,3455,3456,3457,3458,-3146,-3204,-3249]]},{"type":"Polygon","id":42111,"arcs":[[-3446,3459,3460,3461,-3213,-3170]]},{"type":"Polygon","id":17039,"arcs":[[3462,3463,-3440,-3137]]},{"type":"Polygon","id":17169,"arcs":[[-3173,-3375,3464,3465,3466,-3240,-3247]]},{"type":"Polygon","id":17147,"arcs":[[-3387,3467,3468,3469,-3463,-3136]]},{"type":"Polygon","id":39089,"arcs":[[-3350,3470,3471,3472,3473,-3362,-3290]]},{"type":"Polygon","id":39021,"arcs":[[-3322,3474,3475,3476,-3333,-3310]]},{"type":"Polygon","id":29079,"arcs":[[-3390,3477,3478,3479,-3285,-3276]]},{"type":"Polygon","id":8013,"arcs":[[-2966,3480,3481,3482,-3328,-2998]]},{"type":"Polygon","id":31133,"arcs":[[-3306,3483,3484,3485,-3315,-3319]]},{"type":"Polygon","id":31147,"arcs":[[3486,3487,3488,3489,-3484,-3305]]},{"type":"Polygon","id":29087,"arcs":[[-3281,3490,3491,-3487,-3304,-3273]]},{"type":"Polygon","id":29111,"arcs":[[-3242,3492,3493,3494,-3453,-3250]]},{"type":"Polygon","id":42029,"arcs":[[3495,3496,3497,-3447,-3218,-3354]]},{"type":"Polygon","id":42133,"arcs":[[-3450,3498,3499,3500,3501,-3437,-3230]]},{"type":"Polygon","id":8103,"arcs":[[3502,-3099,-2981,-2976]]},{"type":"Polygon","id":39059,"arcs":[[3503,3504,-3348,-3226,-3377,3505]]},{"type":"Polygon","id":18057,"arcs":[[3506,3507,3508,-3379,-3384,-3397]]},{"type":"Polygon","id":18107,"arcs":[[-3381,3509,3510,3511,3512,-3400,-3301]]},{"type":"Polygon","id":17001,"arcs":[[-3467,3513,3514,3515,-3493,-3241]]},{"type":"Polygon","id":39109,"arcs":[[-3477,3516,3517,-3403,-3334]]},{"type":"Polygon","id":54069,"arcs":[[-3339,3518,3519,-3264,-3385]]},{"type":"Polygon","id":34005,"arcs":[[-3345,3520,3521,3522,3523,3524,3525,-3254,-3382]]},{"type":"Polygon","id":18011,"arcs":[[-3509,3526,3527,-3510,-3380]]},{"type":"Polygon","id":39013,"arcs":[[-3265,-3520,3528,3529,3530,-3506,-3376]]},{"type":"Polygon","id":34029,"arcs":[[-3343,3531,-3521,-3344]]},{"type":"Polygon","id":39119,"arcs":[[-3505,3532,3533,3534,-3471,-3349]]},{"type":"Polygon","id":42057,"arcs":[[-3459,3535,3536,-3444,-3147]]},{"type":"Polygon","id":17129,"arcs":[[-3443,3537,3538,-3373]]},{"type":"Polygon","id":6007,"arcs":[[3539,3540,3541,3542,-3356,-3361]]},{"type":"Polygon","id":18165,"arcs":[[-3402,3543,3544,3545,-3325,-3342]]},{"type":"Polygon","id":42051,"arcs":[[-3462,3546,3547,3548,3549,-3336,-3214]]},{"type":"Polygon","id":39049,"arcs":[[-3474,3550,3551,3552,-3320,-3363]]},{"type":"Polygon","id":42101,"arcs":[[-3526,3553,3554,-3352,-3351,-3255]]},{"type":"Polygon","id":29061,"arcs":[[-3286,-3480,3555,3556,3557,-3391]]},{"type":"Polygon","id":29003,"arcs":[[-3393,3558,3559,3560,-3491,-3280]]},{"type":"Polygon","id":32033,"arcs":[[-2921,3561,3562,3563,3564,-2992,-2363]]},{"type":"Polygon","id":17017,"arcs":[[-3374,-3539,3565,3566,3567,-3465]]},{"type":"Polygon","id":39097,"arcs":[[3568,3569,3570,3571,-3475,-3321,-3553]]},{"type":"Polygon","id":17009,"arcs":[[-3568,3572,3573,-3514,-3466]]},{"type":"Polygon","id":8045,"arcs":[[-2975,3574,3575,3576,3577,-3100,-3503]]},{"type":"Polygon","id":18065,"arcs":[[-3452,3578,3579,3580,3581,-3395,-3399]]},{"type":"Polygon","id":42001,"arcs":[[3582,3583,-3456,-3438,-3502]]},{"type":"Polygon","id":42045,"arcs":[[-3555,3584,3585,3586,3587,-3496,-3353]]},{"type":"Polygon","id":17115,"arcs":[[-3470,3588,3589,3590,3591,-3441,-3464]]},{"type":"Polygon","id":8014,"arcs":[[3592,3593,3594,-3481,-2965]]},{"type":"Polygon","id":29121,"arcs":[[-3455,3595,3596,3597,3598,3599,-3435]]},{"type":"Polygon","id":39023,"arcs":[[-3572,3600,3601,-3517,-3476]]},{"type":"Polygon","id":29115,"arcs":[[-3600,3602,3603,-3478,-3389,-3436]]},{"type":"Polygon","id":29063,"arcs":[[-3558,3604,3605,3606,-3559,-3392]]},{"type":"Polygon","id":54051,"arcs":[[3607,3608,-3529,-3519,-3338,3609]]},{"type":"Polygon","id":42059,"arcs":[[-3550,3610,3611,-3610,-3337]]},{"type":"Polygon","id":49023,"arcs":[[-3284,3612,3613,-3562,-2920]]},{"type":"Polygon","id":18177,"arcs":[[-3406,3614,3615,3616,-3579,-3451]]},{"type":"Polygon","id":20023,"arcs":[[3617,3618,3619,-3365,-3420]]},{"type":"Polygon","id":20153,"arcs":[[-3429,3620,3621,3622,-3618,-3419,-3431]]},{"type":"Polygon","id":6045,"arcs":[[-2750,-3358,3623,3624,3625,3626,-2685]]},{"type":"Polygon","id":20089,"arcs":[[3627,3628,3629,3630,3631,-3409,-3417]]},{"type":"Polygon","id":20183,"arcs":[[-3632,3632,3633,3634,-3412,-3410]]},{"type":"Polygon","id":20157,"arcs":[[3635,3636,-3628,-3416,-3426]]},{"type":"Polygon","id":20201,"arcs":[[-3317,3637,3638,3639,3640,-3636,-3427]]},{"type":"Polygon","id":20039,"arcs":[[-3423,3641,3642,3643,-3621,-3428]]},{"type":"Polygon","id":32001,"arcs":[[-2996,3644,3645,3646,-2388,-3029]]},{"type":"Polygon","id":20137,"arcs":[[3647,3648,3649,-3642,-3422,-3433]]},{"type":"Polygon","id":20147,"arcs":[[-3635,3650,3651,-3648,-3432,-3413]]},{"type":"Polygon","id":20117,"arcs":[[-3486,3652,3653,3654,-3638,-3316]]},{"type":"Polygon","id":8001,"arcs":[[-3371,3655,3656,3657,-3594,-3593,-2964,-3313]]},{"type":"Polygon","id":20013,"arcs":[[3658,3659,3660,3661,-3489]]},{"type":"Polygon","id":20131,"arcs":[[-3490,-3662,3662,3663,-3653,-3485]]},{"type":"Polygon","id":20043,"arcs":[[-3492,-3561,3664,3665,-3659,-3488]]},{"type":"Polygon","id":34007,"arcs":[[3666,3667,3668,-3524]]},{"type":"Polygon","id":17167,"arcs":[[-3592,3669,3670,3671,3672,-3566,-3538,-3442]]},{"type":"Polygon","id":29117,"arcs":[[3673,3674,3675,-3556,-3479,-3604]]},{"type":"Polygon","id":29205,"arcs":[[-3495,3676,3677,-3596,-3454]]},{"type":"Polygon","id":18121,"arcs":[[-3513,3678,3679,3680,-3544,-3401]]},{"type":"Polygon","id":39121,"arcs":[[-3531,3681,3682,3683,-3533,-3504]]},{"type":"Polygon","id":29127,"arcs":[[-3516,3684,3685,3686,-3677,-3494]]},{"type":"Polygon","id":18059,"arcs":[[-3582,3687,3688,3689,-3507,-3396]]},{"type":"Polygon","id":39045,"arcs":[[-3473,3690,3691,3692,-3551]]},{"type":"Polygon","id":8047,"arcs":[[3693,3694,-3329,-3483]]},{"type":"Polygon","id":39127,"arcs":[[3695,3696,3697,-3691,-3472,-3535]]},{"type":"Polygon","id":18097,"arcs":[[-3690,3698,3699,3700,3701,-3527,-3508]]},{"type":"Polygon","id":8037,"arcs":[[3702,3703,3704,-3575,-2974,-3332]]},{"type":"Polygon","id":8117,"arcs":[[3705,3706,3707,-3703,-3331]]},{"type":"Polygon","id":18063,"arcs":[[-3702,3708,3709,-3511,-3528]]},{"type":"Polygon","id":39113,"arcs":[[-3602,3710,3711,3712,3713,-3404,-3518]]},{"type":"Polygon","id":39135,"arcs":[[-3714,3714,3715,-3615,-3405]]},{"type":"Polygon","id":8059,"arcs":[[-3658,3716,3717,3718,3719,3720,3721,-3694,-3482,-3595]]},{"type":"Polygon","id":8031,"arcs":[[3722,-3717,-3657]]},{"type":"Polygon","id":34015,"arcs":[[3723,3724,3725,3726,-3668]]},{"type":"Polygon","id":17045,"arcs":[[3727,3728,3729,3730,-3326,-3546]]},{"type":"Polygon","id":17041,"arcs":[[-3731,3731,3732,-3468,-3386]]},{"type":"Polygon","id":17137,"arcs":[[-3673,3733,3734,3735,3736,-3573,-3567]]},{"type":"Polygon","id":39111,"arcs":[[-3609,3737,3738,3739,-3682,-3530]]},{"type":"Polygon","id":18133,"arcs":[[-3710,3740,3741,3742,-3679,-3512]]},{"type":"Polygon","id":8019,"arcs":[[-3722,3743,-3706,-3330,-3695]]},{"type":"Polygon","id":39057,"arcs":[[-3571,3744,3745,3746,-3711,-3601]]},{"type":"Polygon","id":17149,"arcs":[[-3737,3747,3748,3749,3750,3751,-3685,-3515,-3574]]},{"type":"Polygon","id":10003,"arcs":[[3752,3753,3754,3755,-3497,-3588,3756,-3586]]},{"type":"Polygon","id":17021,"arcs":[[-3591,3757,3758,-3670]]},{"type":"Polygon","id":29021,"arcs":[[-3607,3759,3760,3761,-3665,-3560]]},{"type":"Polygon","id":49007,"arcs":[[-3110,-3103,3762,3763,-3282]]},{"type":"Polygon","id":49039,"arcs":[[-3764,3764,3765,3766,-3613,-3283]]},{"type":"Polygon","id":39129,"arcs":[[-3693,3767,3768,3769,-3569,-3552]]},{"type":"Polygon","id":6021,"arcs":[[-3543,3770,3771,-3624,-3357]]},{"type":"Polygon","id":17139,"arcs":[[-3733,3772,3773,-3589,-3469]]},{"type":"Polygon","id":18041,"arcs":[[3774,3775,3776,-3580,-3617]]},{"type":"Polygon","id":18139,"arcs":[[-3777,3777,3778,3779,-3688,-3581]]},{"type":"Polygon","id":17171,"arcs":[[3780,-3748,-3736]]},{"type":"Polygon","id":29025,"arcs":[[-3676,3781,3782,3783,-3605,-3557]]},{"type":"Polygon","id":34033,"arcs":[[3784,3785,3786,3787,3788,3789,-3726]]},{"type":"Polygon","id":6091,"arcs":[[-2831,-2394,3790,3791,-3359]]},{"type":"Polygon","id":39115,"arcs":[[-3684,3792,3793,-3696,-3534]]},{"type":"Polygon","id":29049,"arcs":[[-3784,3794,3795,3796,-3760,-3606]]},{"type":"Polygon","id":8005,"arcs":[[-3370,3797,3798,3799,-3718,-3723,-3656]]},{"type":"Polygon","id":32019,"arcs":[[3800,3801,3802,3803,3804,-2389,-3647]]},{"type":"Polygon","id":34001,"arcs":[[3805,3806,3807,-3724,-3667,-3523]]},{"type":"Polygon","id":18161,"arcs":[[-3716,3808,3809,-3775,-3616]]},{"type":"Polygon","id":24043,"arcs":[[-3458,3810,3811,3812,3813,3814,3815,-3536]]},{"type":"Polygon","id":24001,"arcs":[[-3537,-3816,3816,3817,3818,3819,-3460,-3445]]},{"type":"Polygon","id":24023,"arcs":[[-3820,3820,3821,3822,-3547,-3461]]},{"type":"Polygon","id":24015,"arcs":[[-3756,3823,3824,3825,-3448,-3498]]},{"type":"Polygon","id":54061,"arcs":[[-3549,3826,3827,3828,3829,-3611]]},{"type":"Polygon","id":54077,"arcs":[[-3823,3830,3831,3832,3833,-3827,-3548]]},{"type":"Polygon","id":24025,"arcs":[[-3449,-3826,3834,3835,-3499]]},{"type":"Polygon","id":54103,"arcs":[[-3612,-3830,3836,3837,3838,3839,-3738,-3608]]},{"type":"Polygon","id":24005,"arcs":[[-3836,3840,3841,3842,3843,3844,-3500]]},{"type":"Polygon","id":24013,"arcs":[[-3845,3845,3846,-3583,-3501]]},{"type":"Polygon","id":24021,"arcs":[[-3847,3847,3848,3849,-3811,-3457,-3584]]},{"type":"Polygon","id":39047,"arcs":[[-3770,3850,3851,3852,-3745,-3570]]},{"type":"Polygon","id":49015,"arcs":[[-3102,3853,3854,3855,-3765,-3763]]},{"type":"Polygon","id":29041,"arcs":[[-3599,3856,3857,3858,3859,-3674,-3603]]},{"type":"Polygon","id":18145,"arcs":[[-3780,3860,3861,3862,-3699,-3689]]},{"type":"Polygon","id":54065,"arcs":[[3863,3864,3865,-3817,-3815]]},{"type":"Polygon","id":29173,"arcs":[[-3752,3866,3867,3868,-3686]]},{"type":"Polygon","id":17029,"arcs":[[-3730,3869,3870,3871,-3773,-3732]]},{"type":"Polygon","id":29137,"arcs":[[-3687,-3869,3872,3873,-3597,-3678]]},{"type":"Polygon","id":39073,"arcs":[[3874,3875,3876,-3768,-3692,-3698]]},{"type":"Polygon","id":20029,"arcs":[[-3641,3877,3878,3879,-3629,-3637]]},{"type":"Polygon","id":20085,"arcs":[[3880,3881,3882,3883,-3663,-3661]]},{"type":"Polygon","id":20005,"arcs":[[-3762,3884,3885,3886,-3881,-3660,-3666]]},{"type":"Polygon","id":17173,"arcs":[[-3774,-3872,3887,3888,3889,3890,-3758,-3590]]},{"type":"Polygon","id":54057,"arcs":[[3891,3892,-3821,-3819]]},{"type":"Polygon","id":39167,"arcs":[[-3740,3893,3894,3895,3896,-3793,-3683]]},{"type":"Polygon","id":54049,"arcs":[[-3829,3897,3898,-3837]]},{"type":"Polygon","id":18081,"arcs":[[-3863,3899,3900,3901,-3700]]},{"type":"Polygon","id":6115,"arcs":[[-3792,3902,3903,3904,-3540,-3360]]},{"type":"Polygon","id":18109,"arcs":[[-3902,3905,3906,3907,-3741,-3709,-3701]]},{"type":"Polygon","id":32029,"arcs":[[-2390,-3805]]},{"type":"Polygon","id":54003,"arcs":[[-3814,3908,3909,-3864]]},{"type":"Polygon","id":29033,"arcs":[[-3860,3910,3911,3912,-3782,-3675]]},{"type":"Polygon","id":29175,"arcs":[[-3874,3913,3914,3915,-3857,-3598]]},{"type":"Polygon","id":18167,"arcs":[[3916,3917,3918,-3728,-3545,-3681]]},{"type":"Polygon","id":18021,"arcs":[[-3743,3919,3920,3921,-3917,-3680]]},{"type":"Polygon","id":54095,"arcs":[[3922,3923,3924,-3894,-3739,-3840]]},{"type":"Polygon","id":29163,"arcs":[[3925,3926,3927,-3867,-3751,3928]]},{"type":"Polygon","id":39017,"arcs":[[3929,3930,3931,-3809,-3715,-3713]]},{"type":"Polygon","id":39165,"arcs":[[-3747,3932,3933,3934,-3930,-3712]]},{"type":"Polygon","id":6033,"arcs":[[3935,3936,3937,3938,-3625,-3772]]},{"type":"Polygon","id":8063,"arcs":[[-3620,3939,3940,3941,3942,-3368,-3366]]},{"type":"Polygon","id":34011,"arcs":[[3943,3944,-3785,-3725,-3808,3945,3946]]},{"type":"Polygon","id":20163,"arcs":[[3947,3948,3949,3950,-3651,-3634]]},{"type":"Polygon","id":39027,"arcs":[[3951,3952,-3933,-3746,-3853,3953]]},{"type":"Polygon","id":20181,"arcs":[[-3623,3954,3955,3956,-3940,-3619]]},{"type":"Polygon","id":20193,"arcs":[[-3644,3957,3958,3959,-3955,-3622]]},{"type":"Polygon","id":20141,"arcs":[[-3631,3960,3961,3962,3963,-3948,-3633]]},{"type":"Polygon","id":20179,"arcs":[[-3650,3964,3965,-3958,-3643]]},{"type":"Polygon","id":20027,"arcs":[[3966,3967,3968,3969,-3878,-3640]]},{"type":"Polygon","id":20123,"arcs":[[-3880,3970,3971,-3961,-3630]]},{"type":"Polygon","id":20065,"arcs":[[-3951,3972,3973,-3965,-3649,-3652]]},{"type":"Polygon","id":20161,"arcs":[[3974,3975,3976,-3967,-3639,-3655]]},{"type":"Polygon","id":8035,"arcs":[[3977,3978,3979,-3719,-3800]]},{"type":"Polygon","id":8039,"arcs":[[3980,3981,-3978,-3799]]},{"type":"Polygon","id":20149,"arcs":[[-3664,-3884,3982,3983,-3975,-3654]]},{"type":"Polygon","id":8073,"arcs":[[-3943,3984,3985,3986,3987,-3981,-3798,-3369]]},{"type":"Polygon","id":8093,"arcs":[[-3721,3988,3989,3990,3991,-3707,-3744]]},{"type":"Polygon","id":39009,"arcs":[[-3897,3992,3993,3994,-3875,-3697,-3794]]},{"type":"Polygon","id":49027,"arcs":[[-3767,3995,3996,3997,-3563,-3614]]},{"type":"Polygon","id":54027,"arcs":[[-3866,3998,3999,-3892,-3818]]},{"type":"Polygon","id":29165,"arcs":[[-3761,-3797,4000,4001,4002,-3885]]},{"type":"Polygon","id":18047,"arcs":[[-3810,-3932,4003,4004,4005,-3778,-3776]]},{"type":"Polygon","id":29177,"arcs":[[-3913,4006,4007,4008,-3795,-3783]]},{"type":"Polygon","id":17135,"arcs":[[-3759,-3891,4009,4010,4011,4012,-3671]]},{"type":"Polygon","id":17117,"arcs":[[-4013,4013,4014,4015,-3734,-3672]]},{"type":"Polygon","id":6057,"arcs":[[-2393,4016,-3903,-3791]]},{"type":"Polygon","id":17061,"arcs":[[-3735,-4016,4017,4018,-3749,-3781]]},{"type":"Polygon","id":39141,"arcs":[[-3877,4019,4020,4021,4022,-3851,-3769]]},{"type":"Polygon","id":54037,"arcs":[[4023,4024,-3909,-3813]]},{"type":"Polygon","id":49019,"arcs":[[-3578,4025,4026,-3854,-3101]]},{"type":"Polygon","id":17023,"arcs":[[-3919,4027,4028,4029,4030,-3870,-3729]]},{"type":"Polygon","id":54073,"arcs":[[4031,4032,-3895,-3925]]},{"type":"Polygon","id":18119,"arcs":[[-3908,4033,4034,-3920,-3742]]},{"type":"Polygon","id":54033,"arcs":[[4035,4036,4037,4038,4039,-3838,-3899]]},{"type":"Polygon","id":51069,"arcs":[[4040,4041,4042,4043,-3999,-3865,-3910]]},{"type":"Polygon","id":29047,"arcs":[[-3796,-4009,4044,4045,-4001]]},{"type":"Polygon","id":18031,"arcs":[[-4006,4046,4047,4048,-3861,-3779]]},{"type":"Polygon","id":54091,"arcs":[[4049,-4036,-3898,-3828,-3834]]},{"type":"Polygon","id":54017,"arcs":[[-4040,4050,4051,4052,-3923,-3839]]},{"type":"Polygon","id":20087,"arcs":[[4053,4054,4055,-3882,-3887]]},{"type":"Polygon","id":20103,"arcs":[[-4003,4056,4057,4058,-4054,-3886]]},{"type":"Polygon","id":6011,"arcs":[[-3542,4059,4060,-3936,-3771]]},{"type":"Polygon","id":29195,"arcs":[[-3859,4061,4062,4063,4064,-3911]]},{"type":"Polygon","id":54107,"arcs":[[-4033,4065,4066,4067,4068,-3993,-3896]]},{"type":"Polygon","id":17013,"arcs":[[-4019,4069,4070,4071,-3929,-3750]]},{"type":"Polygon","id":39163,"arcs":[[-3995,4072,4073,4074,-4020,-3876]]},{"type":"Polygon","id":54085,"arcs":[[-4053,4075,4076,4077,-4066,-4032,-3924]]},{"type":"Polygon","id":24029,"arcs":[[-3755,4078,4079,4080,-3824]]},{"type":"Polygon","id":8065,"arcs":[[-3708,-3992,4081,4082,-3704]]},{"type":"Polygon","id":17035,"arcs":[[-4031,4083,4084,-3888,-3871]]},{"type":"Polygon","id":39071,"arcs":[[-4023,4085,4086,4087,-3954,-3852]]},{"type":"Polygon","id":24510,"arcs":[[4088,4089,-3842]]},{"type":"Polygon","id":24027,"arcs":[[-3844,4090,4091,4092,-3848,-3846]]},{"type":"Polygon","id":8077,"arcs":[[4093,4094,4095,4096,-4026,-3577]]},{"type":"Polygon","id":8097,"arcs":[[-4083,4097,4098,-4094,-3576,-3705]]},{"type":"Polygon","id":10001,"arcs":[[4099,4100,4101,-4079,-3754,4102]]},{"type":"Polygon","id":18105,"arcs":[[4103,4104,4105,4106,-4034,-3907]]},{"type":"Polygon","id":18005,"arcs":[[-4049,4107,4108,4109,-3900,-3862]]},{"type":"Polygon","id":29007,"arcs":[[-3868,-3928,4110,4111,4112,-3914,-3873]]},{"type":"Polygon","id":24031,"arcs":[[4113,4114,4115,4116,-3849,-4093]]},{"type":"Polygon","id":18013,"arcs":[[-4110,4117,-4104,-3906,-3901]]},{"type":"Polygon","id":29089,"arcs":[[4118,-4062,-3858,-3916,4119]]},{"type":"Polygon","id":54023,"arcs":[[4120,4121,4122,4123,-3831,-3822,-3893]]},{"type":"Polygon","id":34009,"arcs":[[4124,-3946,-3807]]},{"type":"Polygon","id":51107,"arcs":[[-4117,4125,4126,4127,4128,-4024,-3812,-3850]]},{"type":"Polygon","id":6061,"arcs":[[-2392,4129,4130,4131,4132,4133,-3904,-4017]]},{"type":"Polygon","id":39061,"arcs":[[-3935,4134,4135,4136,4137,4138,-3931]]},{"type":"Polygon","id":18137,"arcs":[[4139,4140,4141,4142,4143,-4047,-4005]]},{"type":"Polygon","id":18029,"arcs":[[-4004,-4139,4144,4145,-4140]]},{"type":"Polygon","id":20143,"arcs":[[-3970,4146,4147,4148,-3971,-3879]]},{"type":"Polygon","id":6101,"arcs":[[-3905,-4134,4149,4150,-4060,-3541]]},{"type":"Polygon","id":54001,"arcs":[[4151,4152,4153,-4037,-4050,-3833]]},{"type":"Polygon","id":29107,"arcs":[[4154,4155,4156,-4007,-3912,-4065]]},{"type":"Polygon","id":54093,"arcs":[[4157,-4152,-3832,-4124]]},{"type":"Polygon","id":39025,"arcs":[[4158,4159,4160,-4135,-3934,-3953,4161]]},{"type":"Polygon","id":51043,"arcs":[[-4129,4162,4163,-4041,-4025]]},{"type":"Polygon","id":17083,"arcs":[[-4015,4164,4165,-4070,-4018]]},{"type":"MultiPolygon","id":24035,"arcs":[[[4166]],[[-4102,4167,4168,4169,-4080]]]},{"type":"Polygon","id":18153,"arcs":[[-3922,4170,4171,4172,-4028,-3918]]},{"type":"Polygon","id":8051,"arcs":[[-4099,4173,4174,4175,4176,4177,4178,-4095]]},{"type":"Polygon","id":39015,"arcs":[[4179,4180,4181,-4162,-3952,-4088]]},{"type":"Polygon","id":29019,"arcs":[[-4113,4182,4183,4184,4185,-4120,-3915]]},{"type":"Polygon","id":32510,"arcs":[[4186,-4130,-2391,-3804]]},{"type":"Polygon","id":54031,"arcs":[[-4044,4187,4188,4189,-4121,-4000]]},{"type":"Polygon","id":24003,"arcs":[[4190,4191,-4091,-3843,-4090,4192,4193,4194]]},{"type":"Polygon","id":29095,"arcs":[[-4008,-4157,4195,4196,4197,4198,-4045]]},{"type":"Polygon","id":29113,"arcs":[[-4072,4199,4200,4201,-3926]]},{"type":"Polygon","id":20061,"arcs":[[4202,4203,4204,-3968,-3977]]},{"type":"Polygon","id":8029,"arcs":[[-4179,4205,-4096]]},{"type":"Polygon","id":20105,"arcs":[[-4149,4206,4207,4208,-3962,-3972]]},{"type":"Polygon","id":20177,"arcs":[[-4056,4209,4210,4211,-3983,-3883]]},{"type":"Polygon","id":17051,"arcs":[[-3890,4212,4213,4214,4215,4216,-4010]]},{"type":"Polygon","id":17049,"arcs":[[-4085,4217,4218,-4213,-3889]]},{"type":"Polygon","id":20197,"arcs":[[-4212,4219,4220,4221,-4203,-3976,-3984]]},{"type":"Polygon","id":39079,"arcs":[[4222,4223,4224,4225,-4021,-4075]]},{"type":"Polygon","id":39105,"arcs":[[4226,4227,-4073,-3994,-4069,4228]]},{"type":"Polygon","id":20209,"arcs":[[-4002,-4046,-4199,4229,-4057]]},{"type":"Polygon","id":39131,"arcs":[[4230,4231,-4086,-4022,-4226]]},{"type":"Polygon","id":18079,"arcs":[[4232,4233,4234,-4108,-4048,-4144]]},{"type":"Polygon","id":54105,"arcs":[[4235,4236,4237,-4067,-4078]]},{"type":"Polygon","id":17033,"arcs":[[-4173,4238,4239,4240,4241,-4029]]},{"type":"Polygon","id":17079,"arcs":[[-4242,4242,4243,-4218,-4084,-4030]]},{"type":"Polygon","id":18055,"arcs":[[-4035,-4107,4244,4245,4246,4247,-4171,-3921]]},{"type":"Polygon","id":54041,"arcs":[[4248,4249,4250,4251,-4051,-4039]]},{"type":"Polygon","id":32023,"arcs":[[-2993,-3565,4252,4253,4254,4255,4256,-3645,-2995]]},{"type":"Polygon","id":29139,"arcs":[[-3927,-4202,4257,4258,4259,4260,-4111]]},{"type":"Polygon","id":21015,"arcs":[[4261,4262,4263,4264,4265,-4145,-4138]]},{"type":"Polygon","id":24011,"arcs":[[4266,4267,4268,4269,-4168,-4101]]},{"type":"Polygon","id":20109,"arcs":[[4270,4271,4272,4273,-3956,-3960]]},{"type":"Polygon","id":20199,"arcs":[[-4274,4274,4275,4276,-3941,-3957]]},{"type":"Polygon","id":20051,"arcs":[[-3964,4277,4278,4279,4280,-3949]]},{"type":"Polygon","id":20063,"arcs":[[-3966,-3974,4281,4282,4283,4284,-4271,-3959]]},{"type":"Polygon","id":20041,"arcs":[[-4205,4285,4286,4287,-4147,-3969]]},{"type":"Polygon","id":20167,"arcs":[[-4209,4288,4289,4290,-4278,-3963]]},{"type":"Polygon","id":20195,"arcs":[[-3950,-4281,4291,-4282,-3973]]},{"type":"Polygon","id":24033,"arcs":[[-4192,4292,4293,4294,4295,4296,-4114,-4092]]},{"type":"Polygon","id":8119,"arcs":[[4297,4298,-3989,-3720,-3980]]},{"type":"Polygon","id":8041,"arcs":[[-3982,-3988,4299,4300,-4298,-3979]]},{"type":"Polygon","id":21037,"arcs":[[-4161,4301,4302,-4136]]},{"type":"Polygon","id":54083,"arcs":[[-4123,4303,4304,4305,4306,-4153,-4158]]},{"type":"Polygon","id":32005,"arcs":[[-3803,4307,4308,4309,-4131,-4187]]},{"type":"Polygon","id":54097,"arcs":[[-4154,-4307,4310,-4249,-4038]]},{"type":"Polygon","id":54021,"arcs":[[-4252,4311,4312,-4076,-4052]]},{"type":"Polygon","id":51171,"arcs":[[4313,4314,4315,-4188,-4043]]},{"type":"Polygon","id":21117,"arcs":[[-4303,4316,4317,-4262,-4137]]},{"type":"Polygon","id":54035,"arcs":[[-4238,4318,4319,4320,4321,-4229,-4068]]},{"type":"Polygon","id":32021,"arcs":[[-4257,4322,4323,-3801,-3646]]},{"type":"Polygon","id":18071,"arcs":[[-4235,4324,4325,4326,-4105,-4118,-4109]]},{"type":"Polygon","id":20045,"arcs":[[-4059,4327,4328,4329,-4210,-4055]]},{"type":"Polygon","id":6017,"arcs":[[-4310,4330,4331,4332,-4132]]},{"type":"Polygon","id":29027,"arcs":[[-4112,-4261,4333,4334,-4183]]},{"type":"Polygon","id":29053,"arcs":[[-4186,4335,4336,4337,-4063,-4119]]},{"type":"Polygon","id":51059,"arcs":[[4338,4339,4340,4341,4342,4343,-4126,-4116]]},{"type":"Polygon","id":8015,"arcs":[[-3991,4344,4345,-4174,-4098,-4082]]},{"type":"Polygon","id":20091,"arcs":[[-4198,4346,4347,-4328,-4058,-4230]]},{"type":"Polygon","id":39001,"arcs":[[4348,4349,4350,-4180,-4087,-4232]]},{"type":"Polygon","id":49041,"arcs":[[-3856,4351,4352,4353,-3996,-3766]]},{"type":"Polygon","id":8017,"arcs":[[-4277,4354,4355,-3985,-3942]]},{"type":"Polygon","id":54013,"arcs":[[-4313,4356,4357,4358,-4236,-4077]]},{"type":"Polygon","id":51187,"arcs":[[4359,4360,4361,-4314,-4042,-4164]]},{"type":"Polygon","id":39053,"arcs":[[4362,4363,4364,-4223,-4074,-4228]]},{"type":"Polygon","id":18115,"arcs":[[4365,-4141,-4146,-4266]]},{"type":"Polygon","id":54053,"arcs":[[-4322,4366,4367,-4363,-4227]]},{"type":"Polygon","id":17005,"arcs":[[-4217,4368,4369,-4011]]},{"type":"Polygon","id":39145,"arcs":[[-4225,4370,4371,4372,-4349,-4231]]},{"type":"Polygon","id":51061,"arcs":[[4373,4374,4375,4376,-4360,-4163,-4128]]},{"type":"Polygon","id":17119,"arcs":[[-4014,-4012,-4370,4377,4378,4379,4380,4381,-4165]]},{"type":"Polygon","id":29219,"arcs":[[4382,4383,4384,-4258,-4201]]},{"type":"Polygon","id":11001,"arcs":[[4385,4386,-4115,-4297]]},{"type":"Polygon","id":18093,"arcs":[[-4327,4387,4388,4389,-4245,-4106]]},{"type":"Polygon","id":29183,"arcs":[[-4382,4390,4391,-4383,-4200,-4071,-4166]]},{"type":"Polygon","id":10005,"arcs":[[4392,4393,4394,4395,4396,4397,-4267,-4100]]},{"type":"Polygon","id":20169,"arcs":[[-4288,4398,4399,-4207,-4148]]},{"type":"Polygon","id":54071,"arcs":[[-4190,4400,4401,4402,4403,-4304,-4122]]},{"type":"Polygon","id":29159,"arcs":[[-4338,4404,4405,4406,4407,-4155,-4064]]},{"type":"Polygon","id":24041,"arcs":[[-4270,4408,-4169]]},{"type":"Polygon","id":51153,"arcs":[[-4344,4409,4410,-4374,-4127]]},{"type":"Polygon","id":54087,"arcs":[[-4359,4411,4412,-4319,-4237]]},{"type":"Polygon","id":29101,"arcs":[[-4408,4413,4414,-4196,-4156]]},{"type":"Polygon","id":51013,"arcs":[[4415,-4341,4416,-4339,-4387,4417]]},{"type":"Polygon","id":6003,"arcs":[[4418,4419,4420,4421,-4331,-4309]]},{"type":"Polygon","id":18155,"arcs":[[-4265,4422,4423,4424,-4142,-4366]]},{"type":"Polygon","id":29135,"arcs":[[4425,4426,4427,-4336,-4185]]},{"type":"Polygon","id":6113,"arcs":[[-4151,4428,4429,4430,-4431,4431,-3937,-4061]]},{"type":"Polygon","id":18077,"arcs":[[-4425,4432,4433,4434,4435,-4233,-4143]]},{"type":"Polygon","id":17025,"arcs":[[-4244,4436,4437,4438,-4214,-4219]]},{"type":"Polygon","id":18083,"arcs":[[4439,4440,4441,4442,4443,4444,-4239,-4172,-4248]]},{"type":"Polygon","id":18101,"arcs":[[-4390,4445,4446,4447,-4246]]},{"type":"Polygon","id":18027,"arcs":[[4448,4449,-4440,-4247,-4448]]},{"type":"Polygon","id":54007,"arcs":[[-4251,4450,4451,4452,-4357,-4312]]},{"type":"Polygon","id":29189,"arcs":[[-4381,4453,4454,4455,4456,4457,-4391]]},{"type":"Polygon","id":21191,"arcs":[[4458,4459,4460,-4317,-4302,-4160,4461]]},{"type":"Polygon","id":20127,"arcs":[[-4222,4462,4463,4464,-4286,-4204]]},{"type":"Polygon","id":20053,"arcs":[[-4400,4465,4466,4467,-4289,-4208]]},{"type":"Polygon","id":20139,"arcs":[[-4330,4468,4469,4470,-4220,-4211]]},{"type":"Polygon","id":6055,"arcs":[[4430,4471,4472,4473,4474,4475,-3938,-4432]]},{"type":"Polygon","id":51157,"arcs":[[4476,4477,4478,-4361,-4377]]},{"type":"Polygon","id":21077,"arcs":[[4479,4480,4481,-4423,-4264]]},{"type":"Polygon","id":6097,"arcs":[[-3939,-4476,4482,4483,4484,-3626]]},{"type":"Polygon","id":17101,"arcs":[[4485,4486,-4240,-4445]]},{"type":"Polygon","id":51165,"arcs":[[-4316,4487,4488,4489,4490,-4401,-4189]]},{"type":"Polygon","id":17159,"arcs":[[-4241,-4487,4491,4492,4493,-4437,-4243]]},{"type":"Polygon","id":39087,"arcs":[[4494,4495,4496,4497,-4371,-4224,-4365]]},{"type":"Polygon","id":29037,"arcs":[[-4415,4498,4499,4500,-4347,-4197]]},{"type":"Polygon","id":51139,"arcs":[[-4479,4501,4502,-4488,-4315,-4362]]},{"type":"Polygon","id":18143,"arcs":[[-4436,4503,4504,-4325,-4234]]},{"type":"Polygon","id":21023,"arcs":[[-4182,4505,4506,4507,-4462,-4159]]},{"type":"Polygon","id":17121,"arcs":[[-4439,4508,4509,4510,4511,-4215]]},{"type":"Polygon","id":21081,"arcs":[[-4318,-4461,4512,4513,4514,-4480,-4263]]},{"type":"Polygon","id":18175,"arcs":[[-4505,4515,4516,4517,4518,4519,-4388,-4326]]},{"type":"Polygon","id":29510,"arcs":[[-4454,-4380,4520]]},{"type":"Polygon","id":24009,"arcs":[[4521,-4293,-4191]]},{"type":"Polygon","id":21161,"arcs":[[-4351,4522,4523,4524,-4506,-4181]]},{"type":"Polygon","id":21041,"arcs":[[4525,4526,4527,-4433,-4424,-4482]]},{"type":"Polygon","id":21089,"arcs":[[-4498,4528,4529,4530,-4372]]},{"type":"Polygon","id":17027,"arcs":[[-4216,-4512,4531,4532,4533,-4378,-4369]]},{"type":"Polygon","id":54075,"arcs":[[-4404,4534,4535,4536,4537,-4305]]},{"type":"Polygon","id":29051,"arcs":[[-4335,4538,4539,-4426,-4184]]},{"type":"Polygon","id":20111,"arcs":[[-4471,4540,4541,4542,-4463,-4221]]},{"type":"Polygon","id":20059,"arcs":[[4543,4544,4545,-4469,-4329]]},{"type":"Polygon","id":20121,"arcs":[[-4501,4546,4547,-4544,-4348]]},{"type":"Polygon","id":54101,"arcs":[[-4311,-4306,-4538,4548,4549,-4451,-4250]]},{"type":"Polygon","id":6067,"arcs":[[4550,4551,4552,4553,-4429,-4150,-4133,-4333]]},{"type":"Polygon","id":21223,"arcs":[[-4528,4554,4555,4556,-4434]]},{"type":"Polygon","id":21187,"arcs":[[-4515,4557,4558,4559,-4526,-4481]]},{"type":"Polygon","id":21135,"arcs":[[4560,4561,4562,-4523,-4350,-4373,-4531]]},{"type":"Polygon","id":29073,"arcs":[[-4385,4563,4564,4565,4566,4567,-4259]]},{"type":"Polygon","id":6051,"arcs":[[-3802,-4324,4568,4569,4570,4571,4572,-4419,-4308]]},{"type":"Polygon","id":29071,"arcs":[[-4392,-4458,4573,4574,4575,-4564,-4384]]},{"type":"Polygon","id":29151,"arcs":[[-4260,-4568,4576,4577,-4539,-4334]]},{"type":"Polygon","id":6005,"arcs":[[-4422,4578,4579,-4551,-4332]]},{"type":"Polygon","id":24019,"arcs":[[-4268,-4398,4580,4581]]},{"type":"Polygon","id":20171,"arcs":[[-4285,4582,4583,4584,4585,-4272]]},{"type":"Polygon","id":20101,"arcs":[[4586,4587,-4583,-4284]]},{"type":"Polygon","id":20071,"arcs":[[4588,4589,4590,4591,-4355,-4276]]},{"type":"Polygon","id":20203,"arcs":[[-4586,4592,4593,-4589,-4275,-4273]]},{"type":"Polygon","id":51047,"arcs":[[4594,4595,4596,4597,-4477,-4376]]},{"type":"Polygon","id":20135,"arcs":[[-4292,-4280,4598,4599,4600,4601,-4587,-4283]]},{"type":"Polygon","id":29141,"arcs":[[-4428,4602,4603,4604,-4405,-4337]]},{"type":"Polygon","id":20009,"arcs":[[-4468,4605,4606,4607,4608,-4290]]},{"type":"Polygon","id":8043,"arcs":[[-4301,4609,4610,4611,-4345,-3990,-4299]]},{"type":"Polygon","id":20165,"arcs":[[-4291,-4609,4612,-4599,-4279]]},{"type":"Polygon","id":24017,"arcs":[[-4295,4613,4614,4615]]},{"type":"Polygon","id":18117,"arcs":[[-4520,4616,4617,-4446,-4389]]},{"type":"Polygon","id":54079,"arcs":[[4618,4619,-4367,-4321,4620]]},{"type":"Polygon","id":32017,"arcs":[[-3998,4621,4622,4623,4624,4625,-4253,-3564]]},{"type":"Polygon","id":8085,"arcs":[[-4178,4626,4627,4628,-4097,-4206]]},{"type":"Polygon","id":54015,"arcs":[[4629,4630,-4412,-4358,-4453]]},{"type":"Polygon","id":17163,"arcs":[[-4534,4631,4632,4633,-4455,-4521,-4379]]},{"type":"Polygon","id":51113,"arcs":[[-4598,4634,4635,-4502,-4478]]},{"type":"Polygon","id":54039,"arcs":[[-4413,-4631,4636,4637,4638,4639,4640,-4621,-4320]]},{"type":"Polygon","id":8061,"arcs":[[-4592,4641,4642,4643,4644,-3986,-4356]]},{"type":"Polygon","id":20113,"arcs":[[4645,4646,4647,4648,-4466,-4399]]},{"type":"Polygon","id":20115,"arcs":[[-4465,4649,4650,4651,-4646,-4287]]},{"type":"Polygon","id":21201,"arcs":[[-4525,4652,4653,4654,-4507]]},{"type":"Polygon","id":17191,"arcs":[[-4494,4655,4656,4657,4658,-4509,-4438]]},{"type":"Polygon","id":18019,"arcs":[[-4557,4659,4660,4661,-4516,-4504,-4435]]},{"type":"Polygon","id":54011,"arcs":[[-4368,-4620,4662,4663,-4495,-4364]]},{"type":"Polygon","id":21103,"arcs":[[4664,4665,4666,-4555,-4527,-4560]]},{"type":"Polygon","id":51091,"arcs":[[4667,4668,-4535,-4403]]},{"type":"Polygon","id":51179,"arcs":[[4669,4670,4671,4672,4673,4674,-4595,-4375,-4411]]},{"type":"Polygon","id":21097,"arcs":[[-4655,4675,4676,4677,-4513,-4460,-4459,-4508]]},{"type":"Polygon","id":49001,"arcs":[[-4354,4678,4679,4680,-4622,-3997]]},{"type":"Polygon","id":17047,"arcs":[[4681,4682,-4656,-4493]]},{"type":"Polygon","id":17185,"arcs":[[-4492,-4486,-4444,4683,4684,-4682]]},{"type":"Polygon","id":29083,"arcs":[[-4407,4685,4686,4687,-4499,-4414]]},{"type":"Polygon","id":24045,"arcs":[[4688,4689,4690,-4581,-4397]]},{"type":"Polygon","id":54067,"arcs":[[-4550,4691,4692,-4637,-4630,-4452]]},{"type":"Polygon","id":18125,"arcs":[[4693,4694,4695,-4441,-4450]]},{"type":"MultiPolygon","id":6095,"arcs":[[[4696,-4474]],[[-4554,4697,-4472,-4431,-4430]]]},{"type":"Polygon","id":29015,"arcs":[[-4605,4698,4699,4700,-4686,-4406]]},{"type":"Polygon","id":18051,"arcs":[[4701,4702,4703,4704,-4684,-4443,-4442,-4696]]},{"type":"Polygon","id":18037,"arcs":[[-4618,4705,4706,4707,4708,-4694,-4449,-4447]]},{"type":"Polygon","id":21069,"arcs":[[4709,4710,4711,-4653,-4524,-4563]]},{"type":"Polygon","id":21185,"arcs":[[-4667,4712,4713,-4660,-4556]]},{"type":"Polygon","id":20017,"arcs":[[-4543,4714,4715,-4650,-4464]]},{"type":"Polygon","id":8101,"arcs":[[4716,4717,4718,4719,4720,-4610,-4300]]},{"type":"Polygon","id":8025,"arcs":[[-4645,4721,4722,-4717,-3987]]},{"type":"Polygon","id":20159,"arcs":[[-4649,4723,4724,-4606,-4467]]},{"type":"Polygon","id":17133,"arcs":[[4725,4726,4727,-4456,-4634]]},{"type":"Polygon","id":17189,"arcs":[[-4532,-4511,4728,4729,4730,-4632,-4533]]},{"type":"Polygon","id":24037,"arcs":[[-4615,4731]]},{"type":"Polygon","id":6009,"arcs":[[-4421,4732,4733,4734,-4579]]},{"type":"Polygon","id":49031,"arcs":[[4735,4736,-4679,-4353]]},{"type":"Polygon","id":49055,"arcs":[[-3855,4737,4738,-4736,-4352]]},{"type":"Polygon","id":29099,"arcs":[[-4728,4739,4740,4741,-4574,-4457]]},{"type":"Polygon","id":21019,"arcs":[[4742,4743,-4529,-4497,4744]]},{"type":"Polygon","id":21043,"arcs":[[-4744,4745,4746,4747,-4561,-4530]]},{"type":"Polygon","id":49037,"arcs":[[-4629,4748,4749,4750,4751,4752,4753,4754,4755,-4738,-4027]]},{"type":"Polygon","id":21209,"arcs":[[4756,4757,4758,4759,-4558,-4514,-4678]]},{"type":"Polygon","id":51079,"arcs":[[4760,4761,-4489,-4503,-4636]]},{"type":"Polygon","id":51015,"arcs":[[4762,4763,4764,4765,-4668,-4402,-4491]]},{"type":"Polygon","id":17081,"arcs":[[-4659,4766,4767,4768,-4729,-4510]]},{"type":"Polygon","id":29013,"arcs":[[-4688,4769,4770,4771,-4547,-4500]]},{"type":"Polygon","id":32009,"arcs":[[4772,-4569,-4323,-4256]]},{"type":"Polygon","id":21181,"arcs":[[-4712,4773,4774,-4676,-4654]]},{"type":"Polygon","id":8109,"arcs":[[-4612,4775,4776,4777,4778,4779,4780,-4175,-4346]]},{"type":"MultiPolygon","id":24047,"arcs":[[[4781,4782,4783,-4689,-4396,4784]]]},{"type":"Polygon","id":6109,"arcs":[[-4573,4785,4786,4787,-4733,-4420]]},{"type":"Polygon","id":20031,"arcs":[[-4546,4788,4789,4790,-4541,-4470]]},{"type":"Polygon","id":29131,"arcs":[[-4540,-4578,4791,4792,4793,-4603,-4427]]},{"type":"Polygon","id":18025,"arcs":[[4794,4795,4796,-4706,-4617,-4519]]},{"type":"Polygon","id":18061,"arcs":[[4797,4798,4799,4800,-4795,-4518]]},{"type":"Polygon","id":54099,"arcs":[[-4664,4801,4802,4803,4804,-4745,-4496]]},{"type":"Polygon","id":18043,"arcs":[[-4662,4805,-4798,-4517]]},{"type":"Polygon","id":51099,"arcs":[[4806,4807,4808,4809,-4671,4810]]},{"type":"Polygon","id":21205,"arcs":[[-4748,4811,4812,4813,4814,-4710,-4562]]},{"type":"Polygon","id":51137,"arcs":[[4815,4816,4817,-4761,-4635,-4597]]},{"type":"Polygon","id":20003,"arcs":[[4818,4819,-4789,-4545]]},{"type":"Polygon","id":20107,"arcs":[[-4772,4820,4821,-4819,-4548]]},{"type":"Polygon","id":21111,"arcs":[[4822,4823,4824,4825,-4799,-4806,-4661,-4714]]},{"type":"Polygon","id":51177,"arcs":[[-4675,4826,-4673,4827,4828,4829,-4816,-4596]]},{"type":"Polygon","id":54043,"arcs":[[-4619,-4641,4830,4831,4832,-4802,-4663]]},{"type":"Polygon","id":21073,"arcs":[[-4559,-4760,4833,4834,4835,-4665]]},{"type":"Polygon","id":21017,"arcs":[[4836,4837,4838,-4757,-4677,-4775]]},{"type":"Polygon","id":21211,"arcs":[[4839,4840,-4823,-4713,-4666,-4836]]},{"type":"Polygon","id":20145,"arcs":[[-4608,4841,4842,4843,-4600,-4613]]},{"type":"Polygon","id":8091,"arcs":[[-4177,4844,4845,4846,-4627]]},{"type":"Polygon","id":6041,"arcs":[[4847,-4484]]},{"type":"Polygon","id":21011,"arcs":[[-4815,4848,4849,-4774,-4711]]},{"type":"Polygon","id":6077,"arcs":[[-4580,-4735,4850,4851,4852,4853,-4552]]},{"type":"Polygon","id":29125,"arcs":[[-4567,4854,4855,-4792,-4577]]},{"type":"Polygon","id":24039,"arcs":[[-4690,-4784,4856,4857,4858]]},{"type":"Polygon","id":51003,"arcs":[[-4818,4859,4860,4861,4862,-4763,-4490,-4762]]},{"type":"Polygon","id":51193,"arcs":[[4863,4864,4865,-4807,4866]]},{"type":"Polygon","id":29029,"arcs":[[-4794,4867,4868,4869,4870,-4699,-4604]]},{"type":"Polygon","id":21127,"arcs":[[-4805,4871,4872,4873,4874,-4746,-4743]]},{"type":"Polygon","id":51017,"arcs":[[-4669,-4766,4875,4876,4877,-4536]]},{"type":"Polygon","id":8099,"arcs":[[-4591,4878,4879,4880,4881,-4642]]},{"type":"Polygon","id":54025,"arcs":[[-4878,4882,4883,4884,4885,-4692,-4549,-4537]]},{"type":"Polygon","id":21063,"arcs":[[-4875,4886,-4812,-4747]]},{"type":"Polygon","id":8027,"arcs":[[-4721,4887,-4776,-4611]]},{"type":"Polygon","id":8011,"arcs":[[-4882,4888,4889,4890,-4643]]},{"type":"Polygon","id":8089,"arcs":[[-4891,4891,-4718,-4723,-4722,-4644]]},{"type":"Polygon","id":18123,"arcs":[[4892,4893,4894,4895,-4707,-4797]]},{"type":"Polygon","id":54019,"arcs":[[-4693,-4886,4896,4897,-4638]]},{"type":"Polygon","id":20093,"arcs":[[4898,4899,4900,-4593,-4585]]},{"type":"Polygon","id":20055,"arcs":[[-4588,-4602,4901,4902,4903,-4899,-4584]]},{"type":"Polygon","id":20075,"arcs":[[-4901,4904,-4879,-4590,-4594]]},{"type":"Polygon","id":17193,"arcs":[[-4685,-4705,4905,4906,4907,-4657,-4683]]},{"type":"Polygon","id":20185,"arcs":[[-4725,4908,4909,4910,-4842,-4607]]},{"type":"Polygon","id":20083,"arcs":[[-4844,4911,4912,4913,-4902,-4601]]},{"type":"Polygon","id":17065,"arcs":[[-4908,4914,4915,4916,-4767,-4658]]},{"type":"Polygon","id":51033,"arcs":[[-4810,4917,4918,4919,4920,-4828,-4672]]},{"type":"Polygon","id":18173,"arcs":[[-4709,4921,4922,4923,4924,4925,-4702,-4695]]},{"type":"Polygon","id":18129,"arcs":[[4926,4927,4928,4929,-4906,-4704]]},{"type":"Polygon","id":54005,"arcs":[[4930,4931,4932,-4831,-4640]]},{"type":"Polygon","id":17157,"arcs":[[-4633,-4731,4933,4934,4935,4936,-4726]]},{"type":"Polygon","id":29185,"arcs":[[-4701,4937,4938,4939,4940,-4770,-4687]]},{"type":"Polygon","id":17145,"arcs":[[-4730,-4769,4941,4942,-4934]]},{"type":"Polygon","id":29055,"arcs":[[-4576,4943,4944,4945,4946,-4565]]},{"type":"Polygon","id":21067,"arcs":[[4947,4948,4949,4950,-4758,-4839]]},{"type":"Polygon","id":29221,"arcs":[[-4742,4951,4952,-4944,-4575]]},{"type":"Polygon","id":18147,"arcs":[[-4896,4953,4954,-4923,-4922,-4708]]},{"type":"Polygon","id":21163,"arcs":[[4955,4956,-4893,-4796,-4801]]},{"type":"Polygon","id":21239,"arcs":[[-4951,4957,4958,4959,-4834,-4759]]},{"type":"Polygon","id":21173,"arcs":[[4960,4961,4962,-4837,-4850]]},{"type":"Polygon","id":20079,"arcs":[[4963,4964,4965,-4647,-4652]]},{"type":"Polygon","id":20073,"arcs":[[-4542,-4791,4966,4967,4968,4969,-4715]]},{"type":"Polygon","id":20155,"arcs":[[-4648,-4966,4970,4971,4972,-4909,-4724]]},{"type":"Polygon","id":18163,"arcs":[[-4926,4973,4974,-4927,-4703]]},{"type":"Polygon","id":29161,"arcs":[[-4947,4975,4976,4977,-4855,-4566]]},{"type":"Polygon","id":49017,"arcs":[[-4756,4978,4979,-4680,-4737,-4739]]},{"type":"Polygon","id":51057,"arcs":[[4980,4981,-4918,-4809,4982]]},{"type":"Polygon","id":8113,"arcs":[[-4847,4983,4984,-4749,-4628]]},{"type":"Polygon","id":51109,"arcs":[[-4830,4985,4986,4987,-4860,-4817]]},{"type":"Polygon","id":49021,"arcs":[[-4980,4988,4989,-4623,-4681]]},{"type":"Polygon","id":21215,"arcs":[[4990,4991,4992,-4824,-4841]]},{"type":"Polygon","id":8053,"arcs":[[-4781,4993,4994,4995,4996,-4845,-4176]]},{"type":"Polygon","id":21005,"arcs":[[-4960,4997,4998,4999,-4991,-4840,-4835]]},{"type":"Polygon","id":17055,"arcs":[[-4917,5000,5001,5002,-4942,-4768]]},{"type":"Polygon","id":51159,"arcs":[[5003,5004,5005,-4865]]},{"type":"Polygon","id":29186,"arcs":[[-4937,5006,5007,-4740,-4727]]},{"type":"Polygon","id":21029,"arcs":[[5008,5009,-4825,-4993]]},{"type":"Polygon","id":21175,"arcs":[[-4874,5010,5011,5012,5013,-4813,-4887]]},{"type":"Polygon","id":21049,"arcs":[[5014,5015,5016,-4948,-4838,-4963]]},{"type":"Polygon","id":6013,"arcs":[[-4853,5017,5018]]},{"type":"Polygon","id":20015,"arcs":[[-4716,-4970,5019,5020,5021,-4964,-4651]]},{"type":"Polygon","id":20047,"arcs":[[-4911,5022,5023,5024,-4912,-4843]]},{"type":"Polygon","id":51163,"arcs":[[5025,5026,5027,5028,-4876,-4765,5029]]},{"type":"Polygon","id":29187,"arcs":[[-5008,5030,5031,5032,-4952,-4741]]},{"type":"Polygon","id":6099,"arcs":[[5033,5034,5035,-4851,-4734,-4788]]},{"type":"Polygon","id":29085,"arcs":[[-4871,5036,5037,-4938,-4700]]},{"type":"Polygon","id":29217,"arcs":[[-4941,5038,5039,5040,5041,-4821,-4771]]},{"type":"Polygon","id":21165,"arcs":[[-4814,-5014,5042,5043,-4961,-4849]]},{"type":"Polygon","id":51125,"arcs":[[5044,5045,5046,-5030,-4764,-4863]]},{"type":"Polygon","id":21027,"arcs":[[5047,5048,5049,5050,-4894,-4957]]},{"type":"Polygon","id":20207,"arcs":[[5051,5052,-4967,-4790]]},{"type":"Polygon","id":20001,"arcs":[[5053,5054,-5052,-4820]]},{"type":"Polygon","id":20011,"arcs":[[-5042,5055,5056,-5054,-4822]]},{"type":"MultiPolygon","id":51001,"arcs":[[[5057,5058,-4782,5059]]]},{"type":"Polygon","id":54045,"arcs":[[-4933,5060,5061,-4832]]},{"type":"Polygon","id":51133,"arcs":[[5062,-5004,-4864,5063]]},{"type":"Polygon","id":29169,"arcs":[[-4856,-4978,5064,5065,-4868,-4793]]},{"type":"Polygon","id":8055,"arcs":[[-4720,5066,5067,5068,-4777,-4888]]},{"type":"Polygon","id":51085,"arcs":[[-4921,5069,5070,5071,5072,-4986,-4829]]},{"type":"Polygon","id":51065,"arcs":[[5073,5074,-4861,-4988,5075]]},{"type":"Polygon","id":21093,"arcs":[[5076,5077,5078,5079,5080,-5048,-4956,-4800,-4826,-5010]]},{"type":"Polygon","id":21113,"arcs":[[5081,5082,5083,-4958,-4950]]},{"type":"Polygon","id":21115,"arcs":[[5084,5085,5086,-5011,-4873]]},{"type":"Polygon","id":20069,"arcs":[[-4914,5087,5088,5089,-4903]]},{"type":"Polygon","id":21091,"arcs":[[-5051,5090,5091,-4954,-4895]]},{"type":"Polygon","id":54081,"arcs":[[-4639,-4898,5092,5093,5094,-4931]]},{"type":"Polygon","id":21179,"arcs":[[-5000,5095,5096,5097,-5077,-5009,-4992]]},{"type":"Polygon","id":54059,"arcs":[[5098,5099,5100,5101,5102,-4803,-4833,-5062]]},{"type":"Polygon","id":21101,"arcs":[[-4974,-4925,5103,5104,5105,5106,-4928,-4975]]},{"type":"Polygon","id":51097,"arcs":[[-4982,5107,5108,5109,5110,-4919]]},{"type":"Polygon","id":8111,"arcs":[[-4997,5111,5112,-4984,-4846]]},{"type":"Polygon","id":21167,"arcs":[[-5084,5113,5114,5115,-4998,-4959]]},{"type":"Polygon","id":8079,"arcs":[[5116,5117,-4994,-4780]]},{"type":"Polygon","id":21159,"arcs":[[-4804,-5103,5118,5119,-5085,-4872]]},{"type":"Polygon","id":51005,"arcs":[[-5029,5120,5121,5122,-4883,-4877]]},{"type":"Polygon","id":17077,"arcs":[[-5003,5123,5124,5125,-4935,-4943]]},{"type":"Polygon","id":21197,"arcs":[[-5044,5126,5127,5128,-5015,-4962]]},{"type":"Polygon","id":21059,"arcs":[[5129,5130,-5104,-4924,-4955,-5092]]},{"type":"Polygon","id":21151,"arcs":[[5131,5132,5133,5134,-5082,-4949,-5017]]},{"type":"Polygon","id":17059,"arcs":[[-4930,5135,5136,5137,-4915,-4907]]},{"type":"Polygon","id":21229,"arcs":[[-5116,5138,5139,-5096,-4999]]},{"type":"Polygon","id":20057,"arcs":[[-5025,5140,5141,5142,-5088,-4913]]},{"type":"Polygon","id":20173,"arcs":[[-5022,5143,5144,-4971,-4965]]},{"type":"Polygon","id":17165,"arcs":[[-5138,5145,5146,5147,-5001,-4916]]},{"type":"Polygon","id":51101,"arcs":[[-5111,5148,5149,-5070,-4920]]},{"type":"Polygon","id":29059,"arcs":[[-4870,5150,5151,5152,5153,-5037]]},{"type":"Polygon","id":6001,"arcs":[[-4852,-5036,5154,5155,-5018]]},{"type":"Polygon","id":51075,"arcs":[[5156,5157,5158,-5076,-4987,-5073]]},{"type":"Polygon","id":29157,"arcs":[[-5126,5159,5160,5161,5162,-5031,-5007,-4936]]},{"type":"Polygon","id":29039,"arcs":[[5163,5164,5165,-5039,-4940]]},{"type":"Polygon","id":6043,"arcs":[[5166,5167,-4787]]},{"type":"Polygon","id":21225,"arcs":[[5168,5169,5170,-5136,-4929,-5107]]},{"type":"Polygon","id":29105,"arcs":[[-5066,5171,5172,5173,-5151,-4869]]},{"type":"Polygon","id":8033,"arcs":[[-5113,5174,-4750,-4985]]},{"type":"Polygon","id":21153,"arcs":[[-5087,5175,5176,5177,5178,-5012]]},{"type":"Polygon","id":54089,"arcs":[[5179,5180,-5093,-4897,-4885,5181]]},{"type":"Polygon","id":17199,"arcs":[[-5148,5182,5183,-5124,-5002]]},{"type":"Polygon","id":21237,"arcs":[[-5179,5184,5185,-5127,-5043,-5013]]},{"type":"Polygon","id":21065,"arcs":[[-5129,5186,5187,-5132,-5016]]},{"type":"Polygon","id":51103,"arcs":[[-5005,-5063,5188]]},{"type":"Polygon","id":8105,"arcs":[[-4779,5189,5190,5191,-5117]]},{"type":"Polygon","id":6075,"arcs":[[5192,5193]]},{"type":"Polygon","id":29167,"arcs":[[-5038,-5154,5194,5195,-5164,-4939]]},{"type":"Polygon","id":21079,"arcs":[[-5135,5196,5197,5198,-5114,-5083]]},{"type":"Polygon","id":20151,"arcs":[[-4973,5199,5200,5201,-5023,-4910]]},{"type":"Polygon","id":51009,"arcs":[[5202,5203,5204,5205,-5026,-5047]]},{"type":"Polygon","id":8071,"arcs":[[-4890,5206,5207,5208,5209,-5067,-4719,-4892]]},{"type":"Polygon","id":51023,"arcs":[[5210,5211,5212,-5121,-5028]]},{"type":"Polygon","id":29065,"arcs":[[-4946,5213,5214,5215,5216,-4976]]},{"type":"Polygon","id":54109,"arcs":[[5217,5218,-5099,-5061,-4932,-5095]]},{"type":"Polygon","id":51029,"arcs":[[5219,5220,5221,-5045,-4862,-5075]]},{"type":"Polygon","id":6039,"arcs":[[-4572,5222,5223,-5167,-4786]]},{"type":"Polygon","id":51119,"arcs":[[5224,-5108,-4981,5225]]},{"type":"Polygon","id":21071,"arcs":[[-5120,5226,5227,-5176,-5086]]},{"type":"Polygon","id":8003,"arcs":[[-5069,5228,5229,-5190,-4778]]},{"type":"Polygon","id":51049,"arcs":[[-5159,5230,5231,5232,-5220,-5074]]},{"type":"Polygon","id":21195,"arcs":[[5233,5234,5235,5236,5237,-5227,-5119,-5102]]},{"type":"Polygon","id":29093,"arcs":[[-5033,5238,5239,5240,-5214,-4945,-4953]]},{"type":"Polygon","id":20187,"arcs":[[5241,5242,5243,5244,-4880,-4905]]},{"type":"Polygon","id":21183,"arcs":[[-5050,5245,5246,5247,5248,-5130,-5091]]},{"type":"Polygon","id":20067,"arcs":[[5249,5250,-5242,-4900]]},{"type":"Polygon","id":20081,"arcs":[[-5090,5251,5252,5253,-5250,-4904]]},{"type":"Polygon","id":20097,"arcs":[[-5202,5254,5255,5256,-5141,-5024]]},{"type":"Polygon","id":20095,"arcs":[[-5145,5257,5258,5259,-5200,-4972]]},{"type":"Polygon","id":20205,"arcs":[[5260,5261,5262,-4968,-5053]]},{"type":"Polygon","id":20133,"arcs":[[-5057,5263,5264,5265,-5261,-5055]]},{"type":"Polygon","id":21123,"arcs":[[5266,5267,5268,5269,-5078,-5098]]},{"type":"Polygon","id":21155,"arcs":[[-5140,5270,5271,5272,-5267,-5097]]},{"type":"Polygon","id":54063,"arcs":[[-5123,5273,5274,-5182,-4884]]},{"type":"Polygon","id":21129,"arcs":[[-5186,5275,5276,5277,-5187,-5128]]},{"type":"Polygon","id":21021,"arcs":[[-5199,5278,5279,-5271,-5139,-5115]]},{"type":"Polygon","id":51087,"arcs":[[5280,5281,5282,5283,5284,5285,5286,5287,-5157,-5072]]},{"type":"Polygon","id":6081,"arcs":[[5288,5289,5290,5291,-5193]]},{"type":"Polygon","id":21025,"arcs":[[-5178,5292,5293,5294,-5276,-5185]]},{"type":"Polygon","id":51145,"arcs":[[5295,5296,-5231,-5158]]},{"type":"Polygon","id":21149,"arcs":[[-5249,5297,5298,5299,-5105,-5131]]},{"type":"Polygon","id":20037,"arcs":[[-5041,5300,5301,5302,5303,-5264,-5056]]},{"type":"Polygon","id":51045,"arcs":[[5304,5305,5306,-5274,-5122,-5213]]},{"type":"Polygon","id":8023,"arcs":[[-5210,5307,5308,5309,-5229,-5068]]},{"type":"Polygon","id":29011,"arcs":[[-5166,5310,5311,-5301,-5040]]},{"type":"Polygon","id":21233,"arcs":[[5312,5313,5314,-5169,-5106,-5300]]},{"type":"Polygon","id":29123,"arcs":[[-5163,5315,5316,-5239,-5032]]},{"type":"Polygon","id":8009,"arcs":[[-5245,5317,5318,5319,-5207,-4889,-4881]]},{"type":"Polygon","id":8083,"arcs":[[5320,5321,-4751,-5175]]},{"type":"Polygon","id":8067,"arcs":[[-4996,5322,5323,-5321,-5112]]},{"type":"Polygon","id":6047,"arcs":[[-5224,5324,5325,5326,-5034,-5168]]},{"type":"Polygon","id":21137,"arcs":[[5327,5328,5329,-5279,-5198]]},{"type":"Polygon","id":51127,"arcs":[[5330,5331,5332,-5281,-5071,-5150]]},{"type":"Polygon","id":21085,"arcs":[[-5081,-5080,5333,5334,5335,-5246,-5049]]},{"type":"Polygon","id":51019,"arcs":[[5336,5337,5338,5339,5340,-5211,-5027,-5206]]},{"type":"Polygon","id":49053,"arcs":[[5341,5342,-4624,-4990]]},{"type":"Polygon","id":20049,"arcs":[[-5263,5343,5344,5345,-5020,-4969]]},{"type":"Polygon","id":29179,"arcs":[[5346,5347,5348,-5215,-5241]]},{"type":"Polygon","id":29031,"arcs":[[5349,5350,5351,5352,5353,-5161]]},{"type":"Polygon","id":29215,"arcs":[[-4977,-5217,5354,5355,5356,5357,-5172,-5065]]},{"type":"Polygon","id":17069,"arcs":[[-5137,-5171,5358,5359,5360,-5146]]},{"type":"Polygon","id":17151,"arcs":[[-5361,5361,5362,5363,-5147]]},{"type":"Polygon","id":51760,"arcs":[[-5285,5364,-5287,-5286]]},{"type":"Polygon","id":17087,"arcs":[[-5364,5365,5366,5367,-5183]]},{"type":"Polygon","id":17181,"arcs":[[-5184,-5368,5368,5369,-5350,-5160,-5125]]},{"type":"Polygon","id":51073,"arcs":[[5370,5371,5372,-5109,-5225]]},{"type":"Polygon","id":29017,"arcs":[[-5354,5373,5374,-5316,-5162]]},{"type":"Polygon","id":54055,"arcs":[[-5181,5375,5376,5377,5378,-5218,-5094]]},{"type":"Polygon","id":6019,"arcs":[[5379,5380,5381,5382,5383,-5325,-5223,-4571]]},{"type":"Polygon","id":29057,"arcs":[[-5196,5384,5385,5386,-5311,-5165]]},{"type":"Polygon","id":21109,"arcs":[[-5278,5387,5388,5389,5390,-5133,-5188]]},{"type":"Polygon","id":21107,"arcs":[[5391,5392,5393,-5313,-5299]]},{"type":"Polygon","id":51041,"arcs":[[-5365,-5284,5394,5395,5396,5397,5398,5399,5400,5401,-5296,-5288]]},{"type":"Polygon","id":51011,"arcs":[[5402,5403,5404,-5203,-5046,-5222]]},{"type":"MultiPolygon","id":51131,"arcs":[[[5405,-5058]]]},{"type":"Polygon","id":21045,"arcs":[[-5330,5406,5407,5408,5409,-5272,-5280]]},{"type":"Polygon","id":54047,"arcs":[[-5379,5410,5411,-5100,-5219]]},{"type":"Polygon","id":21055,"arcs":[[-5315,5412,5413,5414,-5359,-5170]]},{"type":"Polygon","id":49025,"arcs":[[-4979,-4755,5415,5416,-5342,-4989]]},{"type":"Polygon","id":21189,"arcs":[[-5295,5417,5418,-5388,-5277]]},{"type":"Polygon","id":21203,"arcs":[[-5391,5419,5420,-5328,-5197,-5134]]},{"type":"Polygon","id":51027,"arcs":[[-5412,5421,5422,5423,-5234,-5101]]},{"type":"Polygon","id":51115,"arcs":[[-5372,5424]]},{"type":"Polygon","id":21119,"arcs":[[-5177,-5228,-5238,5425,5426,-5293]]},{"type":"Polygon","id":51007,"arcs":[[-5402,5427,5428,5429,-5232,-5297]]},{"type":"Polygon","id":51036,"arcs":[[5430,5431,-5282,-5333]]},{"type":"Polygon","id":29225,"arcs":[[-5174,5432,5433,5434,5435,-5152]]},{"type":"Polygon","id":6085,"arcs":[[-5035,-5327,5436,5437,-5290,5438,-5155]]},{"type":"Polygon","id":21217,"arcs":[[-5273,-5410,5439,5440,-5268]]},{"type":"Polygon","id":29229,"arcs":[[-5358,5441,-5433,-5173]]},{"type":"Polygon","id":51071,"arcs":[[-5307,5442,5443,5444,-5376,-5180,-5275]]},{"type":"Polygon","id":20035,"arcs":[[-5346,5445,5446,5447,5448,-5021]]},{"type":"Polygon","id":20191,"arcs":[[-5449,5449,5450,5451,-5258,-5144]]},{"type":"Polygon","id":20119,"arcs":[[-5143,5452,5453,5454,-5252,-5089]]},{"type":"Polygon","id":20025,"arcs":[[-5257,5455,5456,5457,-5453,-5142]]},{"type":"Polygon","id":20007,"arcs":[[-5260,5458,5459,5460,5461,-5255,-5201]]},{"type":"Polygon","id":21087,"arcs":[[-5441,5462,5463,5464,-5269]]},{"type":"Polygon","id":51680,"arcs":[[-5205,5465,-5337]]},{"type":"Polygon","id":6027,"arcs":[[-4773,-4255,5466,5467,5468,5469,-5380,-4570]]},{"type":"Polygon","id":51095,"arcs":[[5470,5471,5472,-5431,-5332,5473,5474,5475]]},{"type":"Polygon","id":21099,"arcs":[[-5270,-5465,5476,5477,5478,-5334,-5079]]},{"type":"Polygon","id":21193,"arcs":[[-5427,5479,5480,5481,5482,-5418,-5294]]},{"type":"Polygon","id":51031,"arcs":[[-5405,5483,5484,5485,-5338,-5466,-5204]]},{"type":"Polygon","id":29077,"arcs":[[-5153,-5436,5486,5487,-5385,-5195]]},{"type":"Polygon","id":21139,"arcs":[[-5415,5488,5489,5490,5491,-5362,-5360]]},{"type":"Polygon","id":29203,"arcs":[[-5349,5492,5493,5494,-5355,-5216]]},{"type":"Polygon","id":8007,"arcs":[[-5118,-5192,5495,5496,5497,-5323,-4995]]},{"type":"Polygon","id":51161,"arcs":[[-5341,5498,5499,5500,-5305,-5212],[5501,5502]]},{"type":"Polygon","id":21177,"arcs":[[5503,5504,5505,5506,-5392,-5298,-5248]]},{"type":"Polygon","id":51147,"arcs":[[-5233,-5430,5507,5508,5509,-5403,-5221]]},{"type":"Polygon","id":8021,"arcs":[[-5191,-5230,-5310,5510,5511,-5496]]},{"type":"Polygon","id":21031,"arcs":[[5512,5513,-5504,-5247,-5336,5514]]},{"type":"Polygon","id":20129,"arcs":[[5515,5516,5517,-5318,-5244]]},{"type":"Polygon","id":20189,"arcs":[[-5254,5518,5519,-5516,-5243,-5251]]},{"type":"Polygon","id":20175,"arcs":[[-5455,5520,5521,-5519,-5253]]},{"type":"Polygon","id":20125,"arcs":[[-5262,-5266,5522,5523,5524,5525,-5344]]},{"type":"Polygon","id":20077,"arcs":[[5526,5527,-5459,-5259,-5452]]},{"type":"Polygon","id":20033,"arcs":[[5528,5529,-5456,-5256,-5462]]},{"type":"Polygon","id":20099,"arcs":[[-5304,5530,5531,5532,-5523,-5265]]},{"type":"Polygon","id":21033,"arcs":[[-5394,5533,5534,5535,-5413,-5314]]},{"type":"Polygon","id":51199,"arcs":[[5536,5537,5538,5539,-5471,5540,-5475]]},{"type":"Polygon","id":29097,"arcs":[[-5387,5541,5542,5543,-5302,-5312]]},{"type":"Polygon","id":51121,"arcs":[[5544,5545,5546,5547,-5443,-5306,-5501]]},{"type":"Polygon","id":21051,"arcs":[[-5483,5548,5549,5550,5551,-5389,-5419]]},{"type":"Polygon","id":21199,"arcs":[[5552,5553,5554,-5407,-5329,-5421,5555]]},{"type":"Polygon","id":20021,"arcs":[[-5544,5556,5557,5558,-5531,-5303]]},{"type":"Polygon","id":21061,"arcs":[[-5479,5559,5560,-5515,-5335]]},{"type":"Polygon","id":51770,"arcs":[[5561,-5503]]},{"type":"Polygon","id":17127,"arcs":[[-5492,5562,5563,-5366,-5363]]},{"type":"Polygon","id":51185,"arcs":[[-5378,5564,5565,5566,-5422,-5411]]},{"type":"Polygon","id":17003,"arcs":[[5567,5568,5569,5570,-5351,-5370]]},{"type":"Polygon","id":21125,"arcs":[[-5552,5571,5572,5573,-5556,-5420,-5390]]},{"type":"Polygon","id":17153,"arcs":[[-5367,-5564,5574,5575,-5568,-5369]]},{"type":"Polygon","id":21131,"arcs":[[5576,5577,-5549,-5482]]},{"type":"Polygon","id":29223,"arcs":[[-5375,5578,5579,5580,-5347,-5240,-5317]]},{"type":"Polygon","id":51149,"arcs":[[5581,5582,5583,5584,5585,-5397,5586]]},{"type":"Polygon","id":21001,"arcs":[[-5409,5587,5588,5589,-5463,-5440]]},{"type":"Polygon","id":51051,"arcs":[[5590,5591,-5235,-5424]]},{"type":"Polygon","id":20019,"arcs":[[-5526,5592,5593,-5446,-5345]]},{"type":"Polygon","id":51021,"arcs":[[5594,5595,5596,-5565,-5377,-5445]]},{"type":"Polygon","id":51135,"arcs":[[5597,5598,-5508,-5429,5599]]},{"type":"Polygon","id":29109,"arcs":[[-5488,5600,5601,5602,5603,-5542,-5386]]},{"type":"Polygon","id":6087,"arcs":[[5604,5605,5606,-5291,-5438]]},{"type":"Polygon","id":51053,"arcs":[[5607,-5585,5608,5609,5610,-5600,-5428,-5401]]},{"type":"Polygon","id":21133,"arcs":[[-5237,5611,5612,-5480,-5426]]},{"type":"Polygon","id":29201,"arcs":[[5613,5614,5615,-5352,-5571]]},{"type":"Polygon","id":51037,"arcs":[[5616,5617,5618,-5484,-5404,-5510]]},{"type":"Polygon","id":51155,"arcs":[[5619,-5546,5620,5621,5622,-5595,-5444,-5548]]},{"type":"Polygon","id":51181,"arcs":[[5623,5624,5625,-5583,5626]]},{"type":"Polygon","id":51067,"arcs":[[5627,5628,5629,5630,-5499,-5340]]},{"type":"Polygon","id":21007,"arcs":[[5631,5632,-5569,-5576,5633]]},{"type":"Polygon","id":21145,"arcs":[[-5491,5634,5635,5636,-5634,-5575,-5563]]},{"type":"Polygon","id":51700,"arcs":[[5637,5638,-5472,-5540]]},{"type":"Polygon","id":51195,"arcs":[[5639,5640,5641,5642,-5612,-5236,-5592]]},{"type":"Polygon","id":21227,"arcs":[[-5561,5643,5644,5645,5646,-5513]]},{"type":"Polygon","id":21207,"arcs":[[-5555,5647,5648,5649,-5588,-5408]]},{"type":"Polygon","id":21169,"arcs":[[-5590,5650,5651,5652,-5477,-5464]]},{"type":"Polygon","id":21143,"arcs":[[-5536,5653,5654,-5489,-5414]]},{"type":"Polygon","id":21009,"arcs":[[5655,5656,-5644,-5560,-5478,-5653]]},{"type":"Polygon","id":21047,"arcs":[[-5507,5657,5658,5659,5660,-5534,-5393]]},{"type":"Polygon","id":51093,"arcs":[[5661,5662,5663,5664,-5624,5665]]},{"type":"Polygon","id":51167,"arcs":[[5666,5667,5668,-5640,-5591,-5423,-5567]]},{"type":"Polygon","id":51143,"arcs":[[5669,5670,5671,5672,5673,5674,-5628,-5339,-5486]]},{"type":"Polygon","id":51063,"arcs":[[-5631,5675,5676,-5621,-5545,-5500]]},{"type":"Polygon","id":29207,"arcs":[[-5353,-5616,5677,5678,5679,-5579,-5374]]},{"type":"Polygon","id":51111,"arcs":[[-5599,5680,5681,-5617,-5509]]},{"type":"Polygon","id":51650,"arcs":[[-5638,-5539,-5683,5683]]},{"type":"Polygon","id":51183,"arcs":[[5684,5685,-5609,-5584,-5626]]},{"type":"Polygon","id":29035,"arcs":[[-5581,5686,5687,5688,-5493,-5348]]},{"type":"Polygon","id":29043,"arcs":[[-5435,5689,5690,5691,-5601,-5487]]},{"type":"Polygon","id":51197,"arcs":[[5692,5693,5694,-5596,-5623]]},{"type":"Polygon","id":21141,"arcs":[[5695,5696,5697,-5505,-5514,-5647]]},{"type":"Polygon","id":21219,"arcs":[[-5698,5698,5699,-5658,-5506]]},{"type":"Polygon","id":29067,"arcs":[[-5442,-5357,5700,5701,5702,-5690,-5434]]},{"type":"Polygon","id":21157,"arcs":[[-5655,5703,5704,5705,-5635,-5490]]},{"type":"Polygon","id":29133,"arcs":[[-5633,5706,5707,5708,5709,-5614,-5570]]},{"type":"Polygon","id":51083,"arcs":[[-5619,5710,5711,5712,5713,-5670,-5485]]},{"type":"Polygon","id":29091,"arcs":[[-5495,5714,5715,5716,-5701,-5356]]},{"type":"Polygon","id":29145,"arcs":[[-5604,5717,5718,5719,-5557,-5543]]},{"type":"Polygon","id":21121,"arcs":[[5720,5721,-5572,-5551]]},{"type":"Polygon","id":51025,"arcs":[[-5611,5722,5723,5724,5725,-5681,-5598]]},{"type":"Polygon","id":21095,"arcs":[[-5613,-5643,5726,5727,-5577,-5481]]},{"type":"Polygon","id":51173,"arcs":[[-5597,-5695,5728,5729,-5667,-5566]]},{"type":"Polygon","id":4017,"arcs":[[5730,5731,5732,5733,-4753]]},{"type":"Polygon","id":4005,"arcs":[[-5734,5734,5735,5736,-5416,-4754]]},{"type":"Polygon","id":21221,"arcs":[[5737,5738,-5704,-5654,-5535,-5661]]},{"type":"Polygon","id":40105,"arcs":[[-5533,5739,5740,5741,-5524]]},{"type":"Polygon","id":40113,"arcs":[[5742,5743,5744,5745,5746,-5447,-5594]]},{"type":"Polygon","id":40151,"arcs":[[-5461,5747,5748,5749,5750,5751,-5529]]},{"type":"Polygon","id":40035,"arcs":[[-5559,5752,5753,5754,5755,-5740,-5532]]},{"type":"Polygon","id":40147,"arcs":[[-5742,5756,5757,-5743,-5593,-5525]]},{"type":"Polygon","id":40053,"arcs":[[5758,5759,5760,-5527,-5451]]},{"type":"Polygon","id":40003,"arcs":[[-5528,-5761,5761,5762,-5748,-5460]]},{"type":"Polygon","id":40071,"arcs":[[-5747,5763,5764,-5759,-5450,-5448]]},{"type":"Polygon","id":40115,"arcs":[[-5720,5765,5766,-5753,-5558]]},{"type":"Polygon","id":40059,"arcs":[[-5530,-5752,-5751,5767,5768,5769,-5457]]},{"type":"Polygon","id":35039,"arcs":[[-5512,5770,5771,5772,5773,5774,5775,-5497]]},{"type":"Polygon","id":35045,"arcs":[[-5776,5776,5777,5778,-5322,-5324,-5498]]},{"type":"Polygon","id":4001,"arcs":[[-5779,5779,5780,5781,5782,5783,-5731,-4752]]},{"type":"Polygon","id":35059,"arcs":[[5784,5785,5786,5787,5788,5789,-5208,-5320]]},{"type":"Polygon","id":40025,"arcs":[[-5518,5790,5791,5792,-5785,-5319]]},{"type":"Polygon","id":40139,"arcs":[[5793,5794,5795,5796,-5791,-5517,-5520,-5522]]},{"type":"Polygon","id":40007,"arcs":[[-5458,-5770,5797,5798,5799,-5794,-5521,-5454]]},{"type":"Polygon","id":51175,"arcs":[[5800,-5663,5801,5802,5803,5804,5805,-5685,-5625,-5665]]},{"type":"Polygon","id":21231,"arcs":[[5806,5807,5808,5809,-5648,-5554]]},{"type":"Polygon","id":35055,"arcs":[[5810,5811,-5771,-5511,-5309]]},{"type":"Polygon","id":35007,"arcs":[[-5790,5812,5813,-5811,-5308,-5209]]},{"type":"Polygon","id":29209,"arcs":[[5814,5815,5816,-5602,-5692]]},{"type":"Polygon","id":6069,"arcs":[[-5326,-5384,5817,-5605,-5437]]},{"type":"Polygon","id":21235,"arcs":[[-5722,5818,5819,5820,5821,-5573]]},{"type":"Polygon","id":51710,"arcs":[[5822,5823]]},{"type":"Polygon","id":21147,"arcs":[[-5822,5824,5825,-5807,-5553,-5574]]},{"type":"Polygon","id":21013,"arcs":[[-5578,-5728,5826,5827,-5819,-5721,-5550]]},{"type":"Polygon","id":21039,"arcs":[[-5637,5828,5829,-5707,-5632]]},{"type":"Polygon","id":21083,"arcs":[[-5706,5830,5831,5832,5833,-5829,-5636]]},{"type":"Polygon","id":21057,"arcs":[[5834,5835,5836,-5651,-5589,-5650]]},{"type":"Polygon","id":21003,"arcs":[[-5657,5837,5838,5839,5840,-5645]]},{"type":"Polygon","id":29009,"arcs":[[-5817,5841,5842,5843,-5718,-5603]]},{"type":"Polygon","id":51810,"arcs":[[5844,5845,5846,5847,5848,5849,5850,-5823,5851]]},{"type":"Polygon","id":51035,"arcs":[[5852,5853,5854,5855,5856,-5693,-5622,-5677]]},{"type":"Polygon","id":51191,"arcs":[[5857,5858,5859,-5668,-5730,5860,5861,5862,5863]]},{"type":"Polygon","id":29023,"arcs":[[-5680,5864,5865,5866,-5687,-5580]]},{"type":"Polygon","id":51800,"arcs":[[-5868,5868,5869,5870,-5802,-5662,5871]]},{"type":"Polygon","id":6053,"arcs":[[-5818,-5383,5872,5873,5874,-5606]]},{"type":"Polygon","id":51081,"arcs":[[-5686,-5806,5875,-5723,-5610]]},{"type":"Polygon","id":51105,"arcs":[[5876,5877,5878,-5827,-5727,-5642]]},{"type":"Polygon","id":51117,"arcs":[[-5726,5879,5880,5881,-5711,-5618,-5682]]},{"type":"Polygon","id":21053,"arcs":[[-5810,5882,5883,-5835,-5649]]},{"type":"Polygon","id":29149,"arcs":[[-5689,5884,5885,5886,5887,-5715,-5494]]},{"type":"Polygon","id":51169,"arcs":[[-5669,-5860,5888,5889,5890,-5877,-5641]]},{"type":"Polygon","id":21213,"arcs":[[5891,5892,-5696,-5646,-5841]]},{"type":"Polygon","id":51141,"arcs":[[5893,5894,5895,-5853,-5676,-5630]]},{"type":"Polygon","id":29143,"arcs":[[-5710,5896,5897,5898,5899,5900,5901,-5678,-5615]]},{"type":"Polygon","id":51550,"arcs":[[5902,-5904,5904,5905,-5850,5906,5907,-5869,-5909]]},{"type":"Polygon","id":51089,"arcs":[[5909,5910,-5894,-5629,-5675]]},{"type":"Polygon","id":32003,"arcs":[[5911,5912,-5467,-4254,-4626]]},{"type":"Polygon","id":21171,"arcs":[[-5837,5913,5914,-5838,-5656,-5652]]},{"type":"Polygon","id":29181,"arcs":[[-5867,5915,5916,-5885,-5688]]},{"type":"Polygon","id":29213,"arcs":[[-5703,5917,5918,5919,5920,-5815,-5691]]},{"type":"Polygon","id":40153,"arcs":[[5921,5922,5923,-5768,5750,-5751,-5750]]},{"type":"Polygon","id":51077,"arcs":[[-5857,5924,-5855,5925,5926,5927,5928,-5861,-5729,-5694]]},{"type":"Polygon","id":29153,"arcs":[[-5717,5929,5930,5931,-5918,-5702]]},{"type":"Polygon","id":21105,"arcs":[[-5834,5932,5933,5934,-5708,-5830]]},{"type":"Polygon","id":29119,"arcs":[[-5844,5935,5936,-5766,-5719]]},{"type":"Polygon","id":21035,"arcs":[[-5739,5937,5938,-5831,-5705]]},{"type":"Polygon","id":6107,"arcs":[[5939,5940,-5381,-5470]]},{"type":"Polygon","id":47161,"arcs":[[-5660,5941,5942,5943,5944,-5938,-5738]]},{"type":"Polygon","id":40041,"arcs":[[-5937,5945,5946,5947,5948,-5754,-5767]]},{"type":"Polygon","id":47147,"arcs":[[5949,5950,5951,-5699,-5697,-5893,5952]]},{"type":"Polygon","id":47165,"arcs":[[5953,5954,5955,5956,-5953,-5892,-5840]]},{"type":"MultiPolygon","id":21075,"arcs":[[[5957,5958,-5897,-5709,-5935]]]},{"type":"Polygon","id":47125,"arcs":[[-5952,5959,5960,5961,-5942,-5659,-5700]]},{"type":"Polygon","id":51590,"arcs":[[5962,-5672]]},{"type":"Polygon","id":47111,"arcs":[[5963,5964,5965,-5954,-5839,-5915,5966]]},{"type":"Polygon","id":29069,"arcs":[[-5902,5967,5968,5969,5970,5971,5972,-5865,-5679]]},{"type":"Polygon","id":47137,"arcs":[[5973,5974,5975,5976,-5883,-5809]]},{"type":"Polygon","id":47027,"arcs":[[5977,5978,-5967,-5914,-5836,-5884,-5977]]},{"type":"Polygon","id":47163,"arcs":[[5979,5980,5981,-5889,-5859,-5983,-5863,5983]]},{"type":"Polygon","id":47091,"arcs":[[-5929,5984,5985,5986,5987,-5984,-5862]]},{"type":"Polygon","id":47151,"arcs":[[5988,5989,5990,5991,-5974,-5808,-5826]]},{"type":"Polygon","id":47025,"arcs":[[5992,5993,5994,5995,-5820,-5828,-5879]]},{"type":"Polygon","id":40103,"arcs":[[5996,5997,5998,5999,-5764,-5746]]},{"type":"Polygon","id":47067,"arcs":[[-5891,6000,6001,-5993,-5878]]},{"type":"Polygon","id":40131,"arcs":[[6002,6003,6004,-5757,-5741,-5756]]},{"type":"Polygon","id":47013,"arcs":[[6005,6006,-5989,-5825,-5821,-5996]]},{"type":"Polygon","id":47073,"arcs":[[-5982,6007,6008,6009,6010,-6001,-5890]]},{"type":"Polygon","id":40047,"arcs":[[-5765,-6000,6011,6012,6013,-5762,-5760]]},{"type":"Polygon","id":40045,"arcs":[[-5924,6014,6015,6016,6017,-5798,-5769]]},{"type":"Polygon","id":37009,"arcs":[[6018,6019,6020,-5985,-5928]]},{"type":"Polygon","id":47049,"arcs":[[-5992,6021,6022,6023,6024,-5975]]},{"type":"Polygon","id":37005,"arcs":[[6025,6026,-6019,-5927]]},{"type":"Polygon","id":40117,"arcs":[[6027,6028,6029,-5997,-5745]]},{"type":"Polygon","id":37171,"arcs":[[-5896,6030,6031,6032,6033,-6026,-5926,-5854]]},{"type":"Polygon","id":37073,"arcs":[[6034,6035,6036,6037,6038,6039,-5803,-5871]]},{"type":"MultiPolygon","id":37053,"arcs":[[[6040,-5907,-5849,6041]],[[-5845,6042,6043,6044]]]},{"type":"Polygon","id":37169,"arcs":[[-5911,6045,6046,-6031,-5895]]},{"type":"Polygon","id":37029,"arcs":[[-5870,-5908,-6041,6047,6048,-6035]]},{"type":"Polygon","id":37185,"arcs":[[6049,6050,6051,6052,-5880,-5725]]},{"type":"Polygon","id":37131,"arcs":[[6053,6054,-6050,-5724,-5876,-5805,6055]]},{"type":"Polygon","id":37091,"arcs":[[-6040,6056,6057,-6056,-5804]]},{"type":"Polygon","id":37145,"arcs":[[6058,6059,6060,6061,-5713]]},{"type":"Polygon","id":37181,"arcs":[[-6053,6062,6063,-5881]]},{"type":"Polygon","id":37077,"arcs":[[6064,6065,6066,-6059,-5712,-5882,-6064]]},{"type":"Polygon","id":37157,"arcs":[[-5674,6067,6068,6069,-6046,-5910]]},{"type":"Polygon","id":37033,"arcs":[[-6062,6070,6071,-6068,-5673,-5963,-5671,-5714]]},{"type":"Polygon","id":47133,"arcs":[[-6025,6072,6073,-5978,-5976]]},{"type":"Polygon","id":47087,"arcs":[[-6074,6074,6075,-5964,-5979]]},{"type":"Polygon","id":37083,"arcs":[[6076,6077,6078,6079,-6051,-6055]]},{"type":"Polygon","id":40097,"arcs":[[-5949,6080,6081,-6003,-5755]]},{"type":"Polygon","id":47019,"arcs":[[6082,6083,6084,6085,-5980,-5988]]},{"type":"Polygon","id":37139,"arcs":[[6086,6087,-6036,-6049]]},{"type":"Polygon","id":47131,"arcs":[[-5934,6088,6089,6090,6091,-5958]]},{"type":"Polygon","id":40093,"arcs":[[-5763,-6014,6092,6093,6094,-5922,-5749]]},{"type":"Polygon","id":47183,"arcs":[[6095,6096,6097,-6089,-5933,-5833]]},{"type":"Polygon","id":47095,"arcs":[[6098,6099,-5900,-6101,-5898,-5959,-6092]]},{"type":"Polygon","id":48421,"arcs":[[6101,6102,-5792,-5797,6103]]},{"type":"Polygon","id":47079,"arcs":[[-5945,6104,6105,-6096,-5832,-5939]]},{"type":"Polygon","id":48195,"arcs":[[6106,6107,-6104,-5796,6108]]},{"type":"Polygon","id":48111,"arcs":[[-5793,-6103,6109,-5786]]},{"type":"Polygon","id":48357,"arcs":[[6110,6111,-6109,-5795,-5800]]},{"type":"Polygon","id":48295,"arcs":[[6112,6113,-6111,-5799,-6018]]},{"type":"Polygon","id":5007,"arcs":[[-5843,6114,6115,6116,6117,-5946,-5936]]},{"type":"Polygon","id":5049,"arcs":[[6118,6119,6120,-5930,-5716,-5888]]},{"type":"Polygon","id":5015,"arcs":[[-5816,-5921,6121,6122,6123,-6115,-5842]]},{"type":"Polygon","id":5135,"arcs":[[-5887,6124,6125,6126,6127,-6119]]},{"type":"Polygon","id":5121,"arcs":[[6128,6129,-6125,-5886,-5917,6130]]},{"type":"Polygon","id":5009,"arcs":[[6131,6132,6133,-6122,-5920]]},{"type":"Polygon","id":5089,"arcs":[[6134,6135,-6132,-5919,-5932]]},{"type":"Polygon","id":5005,"arcs":[[-6121,6136,6137,6138,-6135,-5931]]},{"type":"Polygon","id":5021,"arcs":[[-5866,-5973,6139,-6131,-5916]]},{"type":"Polygon","id":6031,"arcs":[[6140,6141,-5873,-5382,-5941]]},{"type":"Polygon","id":47169,"arcs":[[-5966,6142,6143,-5955]]},{"type":"Polygon","id":47021,"arcs":[[6144,6145,6146,6147,-5960,-5951]]},{"type":"Polygon","id":47179,"arcs":[[-6086,6148,6149,-6008,-5981]]},{"type":"Polygon","id":37193,"arcs":[[-6034,6150,6151,6152,6153,6154,-6020,-6027]]},{"type":"Polygon","id":47173,"arcs":[[6155,6156,6157,-6006,-5995]]},{"type":"Polygon","id":47159,"arcs":[[-6076,6158,6159,6160,-6143,-5965]]},{"type":"Polygon","id":29155,"arcs":[[-6100,6161,6162,-5968,-5901]]},{"type":"Polygon","id":40143,"arcs":[[-6005,6163,6164,6165,-6028,-5744,-5758]]},{"type":"Polygon","id":47057,"arcs":[[-6002,-6011,6166,6167,6168,-6156,-5994]]},{"type":"Polygon","id":47037,"arcs":[[-5957,6169,6170,6171,-6145,-5950]]},{"type":"Polygon","id":47059,"arcs":[[6172,6173,6174,6175,6176,-6009,-6150]]},{"type":"Polygon","id":37189,"arcs":[[-6155,6177,6178,-5986,-6021]]},{"type":"Polygon","id":37143,"arcs":[[6179,6180,-6037,-6088]]},{"type":"Polygon","id":47129,"arcs":[[-5991,6181,6182,6183,-6022]]},{"type":"Polygon","id":47083,"arcs":[[-5962,6184,6185,6186,-5943]]},{"type":"Polygon","id":47005,"arcs":[[-6187,6187,6188,6189,6190,-6105,-5944]]},{"type":"Polygon","id":47189,"arcs":[[-6144,-6161,6191,6192,6193,-6170,-5956]]},{"type":"Polygon","id":37041,"arcs":[[6194,-6038,-6181]]},{"type":"Polygon","id":47063,"arcs":[[-6177,6195,6196,-6167,-6010]]},{"type":"Polygon","id":47043,"arcs":[[-6148,-6147,6197,6198,6199,-6185,-5961]]},{"type":"Polygon","id":5087,"arcs":[[6200,6201,6202,6203,6204,-6116,-6124]]},{"type":"Polygon","id":47141,"arcs":[[-6024,6205,6206,6207,-6159,-6075,-6073]]},{"type":"Polygon","id":47001,"arcs":[[-6158,6208,6209,-6182,-5990,-6007]]},{"type":"Polygon","id":37197,"arcs":[[6210,6211,6212,-6151,-6033]]},{"type":"Polygon","id":37011,"arcs":[[6213,6214,6215,6216,6217,-6083,-5987,-6179]]},{"type":"Polygon","id":37069,"arcs":[[6218,6219,-6065,-6063,-6052]]},{"type":"Polygon","id":5055,"arcs":[[-5972,-5971,6220,6221,-6129,-6140]]},{"type":"Polygon","id":35033,"arcs":[[-5814,6222,6223,6224,-5772,-5812]]},{"type":"Polygon","id":37067,"arcs":[[6225,6226,6227,-6211,-6032,-6047]]},{"type":"Polygon","id":5065,"arcs":[[-6128,6228,6229,-6137,-6120]]},{"type":"Polygon","id":47171,"arcs":[[6230,6231,6232,-6173,-6149,-6085]]},{"type":"Polygon","id":5075,"arcs":[[-6222,6233,6234,6235,-6126,-6130]]},{"type":"Polygon","id":37081,"arcs":[[6236,6237,6238,-6226,-6070]]},{"type":"Polygon","id":37001,"arcs":[[6239,6240,6241,-6237,-6069,-6072]]},{"type":"Polygon","id":40119,"arcs":[[6242,6243,6244,-5998,-6030]]},{"type":"Polygon","id":47085,"arcs":[[-6200,6245,6246,-6188,-6186]]},{"type":"Polygon","id":37015,"arcs":[[6247,6248,6249,-6250,6250,-6077,-6054,-6058]]},{"type":"Polygon","id":37135,"arcs":[[-6061,6251,6252,-6240,-6071]]},{"type":"Polygon","id":37063,"arcs":[[-6067,6253,6254,-6252,-6060]]},{"type":"Polygon","id":5143,"arcs":[[6255,6256,-6117,-6205]]},{"type":"MultiPolygon","id":37055,"arcs":[[[6257,6258]],[[-6044,6259]]]},{"type":"Polygon","id":47053,"arcs":[[6260,6261,6262,6263,-6090,-6098]]},{"type":"Polygon","id":35043,"arcs":[[6264,6265,6266,6267,6268,-5777,-5775]]},{"type":"Polygon","id":35021,"arcs":[[-5789,6269,6270,-6223,-5813]]},{"type":"Polygon","id":47045,"arcs":[[6271,6272,6273,-6162,-6099,-6091,-6264]]},{"type":"Polygon","id":37127,"arcs":[[-6080,6274,6275,6276,-6219]]},{"type":"Polygon","id":47089,"arcs":[[-6197,6277,6278,6279,-6168]]},{"type":"Polygon","id":47093,"arcs":[[-6280,6280,6281,6282,6283,-6209,-6157,-6169]]},{"type":"Polygon","id":47029,"arcs":[[-6175,6284,6285,6286,6287,-6278,-6196,-6176]]},{"type":"Polygon","id":47035,"arcs":[[-6184,6288,6289,6290,6291,6292,6293,6294,-6206,-6023]]},{"type":"Polygon","id":40073,"arcs":[[6295,6296,6297,-6093,-6013]]},{"type":"Polygon","id":40083,"arcs":[[-5999,-6245,6298,6299,-6296,-6012]]},{"type":"Polygon","id":40011,"arcs":[[-6298,6300,6301,6302,6303,-6094]]},{"type":"Polygon","id":40043,"arcs":[[6304,6305,-6015,-5923,-6095,-6304]]},{"type":"Polygon","id":40037,"arcs":[[-6166,6306,6307,6308,-6243,-6029]]},{"type":"Polygon","id":40145,"arcs":[[-6082,6309,6310,6311,-6164,-6004]]},{"type":"Polygon","id":40021,"arcs":[[-5948,6312,6313,6314,-6310,-6081]]},{"type":"Polygon","id":40001,"arcs":[[-6118,-6257,6315,6316,-6313,-5947]]},{"type":"Polygon","id":37121,"arcs":[[-6218,6317,6318,-6231,-6084]]},{"type":"Polygon","id":37065,"arcs":[[6319,6320,6321,-6275,-6079]]},{"type":"Polygon","id":47017,"arcs":[[-6191,6322,6323,6324,-6261,-6097,-6106]]},{"type":"Polygon","id":47041,"arcs":[[6325,6326,6327,-6192,-6160,-6208]]},{"type":"Polygon","id":5137,"arcs":[[6328,6329,6330,6331,-6138,-6230]]},{"type":"Polygon","id":5101,"arcs":[[-6134,6332,6333,6334,-6201,-6123]]},{"type":"Polygon","id":37027,"arcs":[[-6154,6335,6336,6337,-6214,-6178]]},{"type":"Polygon","id":5129,"arcs":[[-6139,-6332,6338,6339,-6333,-6133,-6136]]},{"type":"Polygon","id":47149,"arcs":[[6340,6341,6342,6343,6344,-6171,-6194]]},{"type":"Polygon","id":37199,"arcs":[[6345,6346,6347,-6232,-6319]]},{"type":"Polygon","id":47185,"arcs":[[-6295,6348,6349,-6326,-6207]]},{"type":"Polygon","id":37183,"arcs":[[-6220,6350,6351,6352,-6254,-6066]]},{"type":"Polygon","id":37117,"arcs":[[6249,6353,6354,6355,-6320,-6078,-6251]]},{"type":"Polygon","id":37115,"arcs":[[-6233,-6348,6356,6357,-6285,6174,-6175,-6174]]},{"type":"Polygon","id":37059,"arcs":[[6358,6359,6360,-6212,-6228]]},{"type":"Polygon","id":48393,"arcs":[[-6114,6361,6362,6363,6364,-6107,-6112]]},{"type":"Polygon","id":48211,"arcs":[[-6113,-6017,6365,6366,-6362]]},{"type":"Polygon","id":48233,"arcs":[[-6108,-6365,6367,6368]]},{"type":"Polygon","id":48205,"arcs":[[6369,6370,6371,-5787,-6110]]},{"type":"Polygon","id":37097,"arcs":[[-6213,-6361,6372,6373,6374,6375,6376,6377,-6152]]},{"type":"Polygon","id":48341,"arcs":[[-6369,6378,6379,6380,-6370,-6102]]},{"type":"Polygon","id":47187,"arcs":[[-6345,6381,6382,6383,-6198,-6146,-6172]]},{"type":"Polygon","id":37003,"arcs":[[6384,-6336,-6153,-6378]]},{"type":"Polygon","id":47145,"arcs":[[6385,6386,6387,6388,-6289,-6183,-6210,-6284,6389]]},{"type":"Polygon","id":47155,"arcs":[[-6288,-6287,6286,6390,6391,6392,-6281,-6279]]},{"type":"Polygon","id":37057,"arcs":[[-6239,6393,6394,6395,-6359,-6227]]},{"type":"Polygon","id":40129,"arcs":[[-6306,6396,6397,6398,-6366,-6016]]},{"type":"Polygon","id":35031,"arcs":[[-6269,6399,-5780,-5778]]},{"type":"Polygon","id":35049,"arcs":[[-6225,6400,6401,6402,-6266,6403,6404,6405,-5773]]},{"type":"Polygon","id":5093,"arcs":[[6406,6407,6408,6409,6410,6411,6412,-5969,-6163,-6274]]},{"type":"Polygon","id":37023,"arcs":[[-6338,6413,6414,6415,6416,6417,-6216,-6215]]},{"type":"Polygon","id":47033,"arcs":[[6418,6419,6420,-6272,-6263]]},{"type":"Polygon","id":5031,"arcs":[[-6413,6421,6422,-6234,-6221,-5970]]},{"type":"Polygon","id":37177,"arcs":[[6423,6424,6425]]},{"type":"Polygon","id":47081,"arcs":[[-6384,6426,6427,6428,-6246,-6199]]},{"type":"Polygon","id":37187,"arcs":[[-6425,6429,6430,-6354,-6250,-6249,6431]]},{"type":"Polygon","id":35028,"arcs":[[-5774,-6406,6432,-6404,-6265]]},{"type":"Polygon","id":47015,"arcs":[[6433,6434,-6341,-6193,-6328]]},{"type":"Polygon","id":37111,"arcs":[[6435,6436,-6346,-6318,-6217,-6418]]},{"type":"Polygon","id":47097,"arcs":[[-6421,6437,6438,-6407,-6273]]},{"type":"Polygon","id":40081,"arcs":[[-6309,6439,6440,6441,-6299,-6244]]},{"type":"Polygon","id":5063,"arcs":[[-6236,6442,6443,6444,-6329,-6229,-6127]]},{"type":"Polygon","id":37151,"arcs":[[-6242,6445,6446,6447,-6394,-6238]]},{"type":"Polygon","id":47105,"arcs":[[-6390,-6283,6448,6449,6450,-6386]]},{"type":"Polygon","id":5067,"arcs":[[-6235,-6423,6451,6452,6453,6454,-6443]]},{"type":"Polygon","id":47009,"arcs":[[6455,6456,6457,-6449,-6282,-6393]]},{"type":"Polygon","id":37037,"arcs":[[-6255,-6353,6458,6459,6460,6461,-6446,-6241,-6253]]},{"type":"Polygon","id":35047,"arcs":[[-6271,6462,6463,6464,-6401,-6224]]},{"type":"Polygon","id":37195,"arcs":[[6465,6466,6467,6468,-6276,-6322]]},{"type":"Polygon","id":37159,"arcs":[[-6396,6469,6470,-6373,-6360]]},{"type":"Polygon","id":40111,"arcs":[[-6165,-6312,6471,6472,6473,-6307]]},{"type":"Polygon","id":40101,"arcs":[[-6315,6474,6475,6476,-6472,-6311]]},{"type":"Polygon","id":47177,"arcs":[[-6350,6477,6478,6479,6480,-6434,-6327]]},{"type":"Polygon","id":47119,"arcs":[[6481,6482,6483,6484,-6427,-6383]]},{"type":"Polygon","id":47039,"arcs":[[6485,6486,6487,6488,-6323,-6190]]},{"type":"Polygon","id":47135,"arcs":[[-6429,6489,6490,-6486,-6189,-6247]]},{"type":"Polygon","id":37147,"arcs":[[-6356,6491,6492,6493,6494,6495,6496,-6466,-6321]]},{"type":"Polygon","id":37035,"arcs":[[-6377,6497,-6414,-6337,-6385]]},{"type":"Polygon","id":37021,"arcs":[[-6437,6498,6499,6500,-6357,-6347]]},{"type":"Polygon","id":47143,"arcs":[[6501,6502,6503,-6290,-6389]]},{"type":"Polygon","id":47175,"arcs":[[-6294,6504,-6292,6505,6506,-6478,-6349]]},{"type":"Polygon","id":47077,"arcs":[[-6489,6507,6508,6509,-6324]]},{"type":"Polygon","id":47075,"arcs":[[6510,6511,6512,6513,-6438,-6420]]},{"type":"Polygon","id":37101,"arcs":[[-6469,6514,6515,6516,-6351,-6277]]},{"type":"Polygon","id":40039,"arcs":[[-6303,6517,6518,6519,-6397,-6305]]},{"type":"Polygon","id":6071,"arcs":[[6520,6521,6522,6523,6524,6525,-5468,-5913]]},{"type":"Polygon","id":6079,"arcs":[[-6142,6526,6527,6528,-5874]]},{"type":"Polygon","id":6029,"arcs":[[-6526,6529,6530,6531,-6527,-6141,-5940,-5469]]},{"type":"Polygon","id":47113,"arcs":[[-6325,-6510,6532,6533,-6511,-6419,-6262]]},{"type":"Polygon","id":5141,"arcs":[[-6331,6534,6535,6536,6537,-6339]]},{"type":"Polygon","id":37087,"arcs":[[-6501,6538,6539,6540,-6391,-6287,-6286,-6358]]},{"type":"Polygon","id":5047,"arcs":[[6541,6542,6543,-6203,6544]]},{"type":"Polygon","id":47007,"arcs":[[-6504,6545,6546,-6506,-6291]]},{"type":"Polygon","id":5071,"arcs":[[-6202,-6335,6547,6548,-6545]]},{"type":"Polygon","id":5033,"arcs":[[6549,6550,-6316,-6256,-6204,-6544]]},{"type":"Polygon","id":47121,"arcs":[[6551,6552,6553,-6502,-6388]]},{"type":"Polygon","id":35037,"arcs":[[-6372,6554,6555,6556,6557,6558,6559,-6463,-6270,-5788]]},{"type":"MultiPolygon","id":37013,"arcs":[[[6560,6561,6562,-6494]],[[-6431,6563,6564,-6492,-6355]]]},{"type":"Polygon","id":5115,"arcs":[[-6340,-6538,6565,6566,6567,-6548,-6334]]},{"type":"Polygon","id":40017,"arcs":[[6568,6569,6570,6571,6572,-6301,-6297]]},{"type":"Polygon","id":40109,"arcs":[[-6442,6573,6574,-6569,-6300]]},{"type":"Polygon","id":5023,"arcs":[[-6445,6575,6576,-6535,-6330]]},{"type":"Polygon","id":47117,"arcs":[[6577,6578,6579,-6482,-6382,-6344]]},{"type":"Polygon","id":5111,"arcs":[[-6412,6580,6581,-6452,-6422]]},{"type":"Polygon","id":37095,"arcs":[[-6424,6582,-6258,6583,-6564,-6430]]},{"type":"Polygon","id":47031,"arcs":[[-6435,-6481,6584,6585,6586,6587,-6342]]},{"type":"Polygon","id":47003,"arcs":[[-6588,6588,6589,-6578,-6343]]},{"type":"Polygon","id":37173,"arcs":[[6590,6591,6592,-6456,-6392,-6541]]},{"type":"Polygon","id":47123,"arcs":[[-6458,6593,6594,6595,6596,6597,6598,-6450]]},{"type":"Polygon","id":47101,"arcs":[[-6485,6599,6600,-6490,-6428]]},{"type":"Polygon","id":37079,"arcs":[[6601,6602,-6467,-6497]]},{"type":"MultiPolygon","id":47167,"arcs":[[[6603,6604,-6410]],[[-6514,6605,6606,-6408,-6439]]]},{"type":"Polygon","id":47107,"arcs":[[-6451,-6599,6607,-6597,6608,6609,-6552,-6387]]},{"type":"Polygon","id":40135,"arcs":[[-6317,-6551,6610,6611,6612,-6475,-6314]]},{"type":"Polygon","id":40107,"arcs":[[-6474,6613,6614,6615,6616,-6440,-6308]]},{"type":"Polygon","id":37105,"arcs":[[6617,6618,-6461,-6460]]},{"type":"Polygon","id":48359,"arcs":[[-6381,6619,6620,-6555,-6371]]},{"type":"Polygon","id":48065,"arcs":[[-6364,6621,6622,6623,-6379,-6368]]},{"type":"Polygon","id":48179,"arcs":[[6624,6625,-6622,-6363]]},{"type":"Polygon","id":48483,"arcs":[[-6399,6626,6627,-6625,-6367]]},{"type":"Polygon","id":48375,"arcs":[[-6624,6628,-6620,-6380]]},{"type":"Polygon","id":37161,"arcs":[[6629,6630,6631,6632,6633,-6499,-6436,-6417]]},{"type":"Polygon","id":37191,"arcs":[[-6603,6634,6635,6636,-6515,-6468]]},{"type":"Polygon","id":47023,"arcs":[[6637,6638,6639,-6533,-6509]]},{"type":"Polygon","id":37085,"arcs":[[-6517,6640,6641,6642,-6618,-6459,-6352]]},{"type":"Polygon","id":37045,"arcs":[[6643,6644,6645,6646,-6630,-6416]]},{"type":"Polygon","id":37109,"arcs":[[-6376,6647,6648,-6644,-6415,-6498]]},{"type":"Polygon","id":47153,"arcs":[[6649,6650,6651,-6479,-6507,-6547]]},{"type":"Polygon","id":40091,"arcs":[[6652,6653,6654,-6614,-6473,-6477]]},{"type":"Polygon","id":40015,"arcs":[[-6573,6655,6656,6657,6658,-6518,-6302]]},{"type":"Polygon","id":5145,"arcs":[[-6455,6659,6660,6661,6662,-6576,-6444]]},{"type":"Polygon","id":47061,"arcs":[[6663,6664,-6585,-6480,-6652]]},{"type":"Polygon","id":4025,"arcs":[[6665,6666,6667,6668,6669,-5736]]},{"type":"Polygon","id":37099,"arcs":[[-6540,6670,6671,6672,6673,-6591]]},{"type":"Polygon","id":37119,"arcs":[[6674,6675,6676,6677,6678,-6648,-6375]]},{"type":"Polygon","id":37125,"arcs":[[-6619,-6643,6679,6680,6681,6682,-6447,-6462]]},{"type":"Polygon","id":37123,"arcs":[[-6683,6683,6684,-6395,-6448]]},{"type":"Polygon","id":37025,"arcs":[[6685,6686,-6675,-6374,-6471]]},{"type":"Polygon","id":40009,"arcs":[[-6520,6687,6688,6689,6690,6691,-6627,-6398]]},{"type":"Polygon","id":37167,"arcs":[[-6685,6692,6693,-6686,-6470]]},{"type":"Polygon","id":37089,"arcs":[[-6634,6694,6695,6696,-6500]]},{"type":"Polygon","id":47181,"arcs":[[6697,6698,6699,-6487,-6491,-6601]]},{"type":"Polygon","id":40133,"arcs":[[6700,6701,6702,-6616]]},{"type":"Polygon","id":37075,"arcs":[[6703,6704,-6594,-6457,-6593]]},{"type":"Polygon","id":40149,"arcs":[[-6659,6705,-6688,-6519]]},{"type":"Polygon","id":40125,"arcs":[[-6617,-6703,6706,6707,6708,-6574,-6441]]},{"type":"Polygon","id":5029,"arcs":[[6709,6710,6711,-6566,-6537]]},{"type":"Polygon","id":47099,"arcs":[[-6484,6712,6713,-6698,-6600]]},{"type":"Polygon","id":40061,"arcs":[[6714,6715,6716,-6653,-6476,-6613]]},{"type":"Polygon","id":47065,"arcs":[[-6554,6717,6718,6719,6720,6721,-6650,-6546,-6503]]},{"type":"Polygon","id":47055,"arcs":[[-6580,6722,6723,6724,-6713,-6483]]},{"type":"Polygon","id":5131,"arcs":[[-6543,6725,6726,6727,-6611,-6550]]},{"type":"Polygon","id":5037,"arcs":[[6728,6729,6730,-6453,-6582]]},{"type":"Polygon","id":5147,"arcs":[[-6731,6731,6732,6733,-6660,-6454]]},{"type":"Polygon","id":5035,"arcs":[[-6411,-6605,6734,6735,6736,6737,6738,-6729,-6581]]},{"type":"Polygon","id":47069,"arcs":[[-6534,-6640,6739,6740,6741,6742,6743,-6512]]},{"type":"Polygon","id":37107,"arcs":[[6744,6745,6746,-6635,-6602,-6496]]},{"type":"Polygon","id":5083,"arcs":[[-6549,-6568,6747,6748,-6726,-6542]]},{"type":"Polygon","id":37175,"arcs":[[6749,6750,6751,-6671,-6539,-6697]]},{"type":"Polygon","id":47071,"arcs":[[-6700,6752,6753,6754,6755,-6638,-6508,-6488]]},{"type":"Polygon","id":37071,"arcs":[[-6679,6756,-6645,-6649]]},{"type":"MultiPolygon","id":37049,"arcs":[[[6757,6758,6759]],[[-6563,6760,6761,6762,-6745,-6495]]]},{"type":"Polygon","id":47127,"arcs":[[6763,6764,-6589,-6587]]},{"type":"Polygon","id":47157,"arcs":[[6765,6766,6767,-6735,-6604,-6409,-6607]]},{"type":"Polygon","id":37149,"arcs":[[6768,6769,-6695,-6633]]},{"type":"Polygon","id":47047,"arcs":[[-6744,6770,6771,-6766,-6606,-6513]]},{"type":"Polygon","id":47109,"arcs":[[-6756,6772,-6740,-6639]]},{"type":"Polygon","id":40079,"arcs":[[6773,6774,6775,6776,6777,-6715,-6612,-6728]]},{"type":"Polygon","id":40051,"arcs":[[6778,6779,6780,6781,-6656,-6572]]},{"type":"Polygon","id":40027,"arcs":[[-6709,6782,-6570,-6575]]},{"type":"Polygon","id":47103,"arcs":[[-6765,6783,6784,6785,-6723,-6579,-6590]]},{"type":"Polygon","id":5045,"arcs":[[-6577,-6663,6786,6787,6788,-6710,-6536]]},{"type":"Polygon","id":47051,"arcs":[[-6665,6789,6790,6791,-6784,-6764,-6586]]},{"type":"Polygon","id":47011,"arcs":[[6792,6793,6794,-6718,-6553,-6610]]},{"type":"Polygon","id":35006,"arcs":[[-6268,6795,6796,6797,6798,-5781,-6400]]},{"type":"Polygon","id":40087,"arcs":[[-6708,6799,6800,-6779,-6571,-6783]]},{"type":"Polygon","id":37113,"arcs":[[6801,6802,6803,-6704,-6592,-6674]]},{"type":"Polygon","id":37137,"arcs":[[-6761,-6562,6804]]},{"type":"Polygon","id":47115,"arcs":[[-6722,6805,6806,-6790,-6664,-6651]]},{"type":"Polygon","id":37163,"arcs":[[-6637,6807,6808,6809,6810,-6641,-6516]]},{"type":"Polygon","id":5149,"arcs":[[-6712,6811,6812,6813,6814,-6748,-6567]]},{"type":"Polygon","id":40121,"arcs":[[-6717,6815,6816,6817,6818,6819,-6654]]},{"type":"Polygon","id":37039,"arcs":[[-6804,6820,6821,6822,6823,-6595,-6705]]},{"type":"Polygon","id":40063,"arcs":[[-6655,-6820,6824,6825,-6701,-6615]]},{"type":"Polygon","id":47139,"arcs":[[-6824,6826,6827,-6793,-6609,-6596]]},{"type":"Polygon","id":37051,"arcs":[[-6811,6828,6829,6830,-6680,-6642]]},{"type":"Polygon","id":37103,"arcs":[[6831,-6759,6832,6833,6834,-6746,-6763]]},{"type":"Polygon","id":35001,"arcs":[[-6403,6835,6836,-6796,-6267]]},{"type":"Polygon","id":35019,"arcs":[[-6560,6837,6838,6839,-6464]]},{"type":"Polygon","id":45045,"arcs":[[-6770,6840,6841,6842,6843,6844,-6750,-6696]]},{"type":"Polygon","id":37007,"arcs":[[6845,6846,6847,6848,-6693]]},{"type":"Polygon","id":37093,"arcs":[[-6831,6849,6850,6851,-6681]]},{"type":"Polygon","id":37179,"arcs":[[-6849,6852,6853,-6676,-6687,-6694]]},{"type":"Polygon","id":45083,"arcs":[[6854,6855,-6841,-6769,-6632,6856]]},{"type":"Polygon","id":37061,"arcs":[[-6747,-6835,6857,6858,-6808,-6636]]},{"type":"Polygon","id":48117,"arcs":[[6859,6860,6861,6862,-6556,-6621]]},{"type":"Polygon","id":45021,"arcs":[[6863,6864,-6857,-6631,-6647,6865]]},{"type":"Polygon","id":48129,"arcs":[[6866,6867,6868,6869,-6626]]},{"type":"Polygon","id":48087,"arcs":[[-6692,6870,6871,6872,-6867,-6628]]},{"type":"Polygon","id":48381,"arcs":[[6873,6874,6875,-6860,-6629]]},{"type":"Polygon","id":37153,"arcs":[[-6682,6876,6877,-6846,-6684]]},{"type":"Polygon","id":48011,"arcs":[[-6870,6878,6879,-6874,-6623]]},{"type":"Polygon","id":45091,"arcs":[[6880,6881,6882,-6866,-6646,-6757,-6678]]},{"type":"Polygon","id":37043,"arcs":[[-6803,6883,6884,6885,-6821]]},{"type":"Polygon","id":5123,"arcs":[[-6739,6886,6887,-6732,-6730]]},{"type":"Polygon","id":40075,"arcs":[[-6658,6888,6889,6890,6891,-6689,-6706]]},{"type":"MultiPolygon","id":37031,"arcs":[[[6892,-6833,-6758,6893]]]},{"type":"Polygon","id":40055,"arcs":[[-6892,6894,6895,-6690]]},{"type":"MultiPolygon","id":6083,"arcs":[[[6896]],[[6897]],[[-6532,6898,6899,-6528]]]},{"type":"Polygon","id":5105,"arcs":[[6900,6901,6902,-6812,-6711,-6789]]},{"type":"Polygon","id":5127,"arcs":[[-6815,6903,6904,-6774,-6727,-6749]]},{"type":"Polygon","id":5117,"arcs":[[-6734,6905,6906,6907,-6661]]},{"type":"Polygon","id":45077,"arcs":[[-6845,6908,6909,-6751]]},{"type":"Polygon","id":5085,"arcs":[[-6908,6910,6911,6912,-6787,-6662]]},{"type":"Polygon","id":45057,"arcs":[[-6854,6913,6914,6915,6916,-6881,-6677]]},{"type":"Polygon","id":40077,"arcs":[[-6778,6917,-6816,-6716]]},{"type":"Polygon","id":45073,"arcs":[[6918,6919,6920,6921,6922,6923,-6672,-6752,-6910]]},{"type":"Polygon","id":35057,"arcs":[[-6840,6924,6925,6926,-6836,-6402,-6465]]},{"type":"Polygon","id":37165,"arcs":[[-6851,6927,6928,-6877,-6852]]},{"type":"Polygon","id":40057,"arcs":[[-6896,6929,6930,6931,-6871,-6691]]},{"type":"Polygon","id":5119,"arcs":[[-6913,6932,6933,6934,-6901,-6788]]},{"type":"Polygon","id":1077,"arcs":[[6935,6936,6937,-6753,-6699,-6714,-6725,6938]]},{"type":"Polygon","id":5095,"arcs":[[-6888,6939,6940,6941,-6906,-6733]]},{"type":"Polygon","id":13241,"arcs":[[6942,6943,-6884,-6802,-6673,-6924]]},{"type":"Polygon","id":1083,"arcs":[[-6786,6944,6945,6946,-6939,-6724]]},{"type":"Polygon","id":28003,"arcs":[[6947,6948,-6741,-6773,-6755,6949]]},{"type":"Polygon","id":28141,"arcs":[[6950,6951,6952,-6950,-6754,-6938,6953]]},{"type":"Polygon","id":28139,"arcs":[[6954,6955,6956,-6742,-6949]]},{"type":"Polygon","id":28033,"arcs":[[6957,6958,6959,-6736,-6768,6960]]},{"type":"Polygon","id":28009,"arcs":[[6961,6962,-6771,-6743,-6957]]},{"type":"Polygon","id":28093,"arcs":[[6963,6964,6965,-6961,-6767,-6772,-6963]]},{"type":"Polygon","id":13281,"arcs":[[-6944,6966,6967,6968,-6885]]},{"type":"Polygon","id":1089,"arcs":[[-6792,6969,6970,6971,-6945,-6785]]},{"type":"Polygon","id":1071,"arcs":[[6972,6973,-6970,-6791,-6807,6974]]},{"type":"Polygon","id":13213,"arcs":[[6975,6976,6977,6978,-6794,-6828,6979]]},{"type":"Polygon","id":13111,"arcs":[[-6823,6980,6981,6982,6983,-6980,-6827]]},{"type":"Polygon","id":13313,"arcs":[[-6978,6984,6985,6986,-6795,-6979]]},{"type":"Polygon","id":13047,"arcs":[[6987,-6719,-6987]]},{"type":"Polygon","id":13291,"arcs":[[-6886,-6969,6988,6989,-6981,-6822]]},{"type":"Polygon","id":37133,"arcs":[[-6893,6990,6991,-6858,-6834]]},{"type":"Polygon","id":13083,"arcs":[[-6806,-6721,6992,6993,-6975]]},{"type":"Polygon","id":13295,"arcs":[[-6986,6994,6995,6996,6997,-6993,-6720,-6988]]},{"type":"Polygon","id":40123,"arcs":[[-6702,-6826,6998,6999,7000,7001,-6800,-6707]]},{"type":"Polygon","id":35061,"arcs":[[-6837,-6927,7002,-6797]]},{"type":"Polygon","id":37155,"arcs":[[7003,7004,7005,7006,7007,-6928,-6850,-6830]]},{"type":"Polygon","id":35009,"arcs":[[-6863,7008,7009,7010,-6557]]},{"type":"Polygon","id":45087,"arcs":[[-6864,-6883,7011,7012,7013,7014,-6855,-6865]]},{"type":"Polygon","id":5077,"arcs":[[-6738,7015,7016,-6940,-6887]]},{"type":"Polygon","id":1033,"arcs":[[7017,7018,-6954,-6937]]},{"type":"MultiPolygon","id":6111,"arcs":[[[7019]],[[7020,-6899,-6531,7021]]]},{"type":"Polygon","id":28143,"arcs":[[-6737,-6960,7022,7023,7024,7025,7026,-7016]]},{"type":"Polygon","id":1049,"arcs":[[-6998,7027,7028,7029,7030,-6973,-6994]]},{"type":"Polygon","id":37017,"arcs":[[7031,7032,-7004,-6829,-6810]]},{"type":"Polygon","id":40065,"arcs":[[7033,7034,7035,7036,-6930,-6895,-6891]]},{"type":"Polygon","id":5125,"arcs":[[-6935,7037,7038,7039,-6902]]},{"type":"Polygon","id":40031,"arcs":[[-6657,-6782,7040,7041,7042,-6889]]},{"type":"Polygon","id":40049,"arcs":[[-7002,7043,7044,7045,-6780,-6801]]},{"type":"Polygon","id":13123,"arcs":[[7046,7047,7048,-6976,-6984]]},{"type":"Polygon","id":13137,"arcs":[[-6923,7049,7050,7051,7052,-6967,-6943]]},{"type":"MultiPolygon","id":6037,"arcs":[[[7053]],[[7054]],[[-6525,7055,7056,-7022,-6530]]]},{"type":"Polygon","id":45023,"arcs":[[-6917,7057,-7012,-6882]]},{"type":"Polygon","id":45007,"arcs":[[-6843,7058,7059,7060,-6919,-6909,-6844]]},{"type":"Polygon","id":45025,"arcs":[[7061,7062,7063,-6914,-6853,-6848,7064]]},{"type":"Polygon","id":45069,"arcs":[[-7008,7065,7066,7067,-7065,-6847,-6878,-6929]]},{"type":"Polygon","id":1079,"arcs":[[-6947,7068,7069,7070,7071,-7018,-6936]]},{"type":"Polygon","id":13311,"arcs":[[7072,7073,-6989,-6968,-7053]]},{"type":"Polygon","id":45059,"arcs":[[-7015,7074,7075,7076,-6842,-6856]]},{"type":"Polygon","id":35011,"arcs":[[7077,7078,7079,-6838,-6559]]},{"type":"Polygon","id":28137,"arcs":[[-6966,7080,7081,-7023,-6959,-6958]]},{"type":"Polygon","id":5051,"arcs":[[-7040,7082,7083,-6813,-6903]]},{"type":"Polygon","id":40029,"arcs":[[-6819,7084,7085,-6999,-6825]]},{"type":"Polygon","id":28117,"arcs":[[-6953,7086,7087,7088,-6955,-6948]]},{"type":"Polygon","id":48437,"arcs":[[-6880,7089,7090,7091,7092,-6875]]},{"type":"Polygon","id":48045,"arcs":[[-6869,7093,7094,7095,-7090,-6879]]},{"type":"Polygon","id":48069,"arcs":[[-7093,7096,7097,7098,-6861,-6876]]},{"type":"Polygon","id":48191,"arcs":[[-6873,7099,7100,7101,-7094,-6868]]},{"type":"Polygon","id":48075,"arcs":[[-6932,7102,7103,-7100,-6872]]},{"type":"Polygon","id":5097,"arcs":[[-7084,7104,7105,7106,7107,-6904,-6814]]},{"type":"Polygon","id":48369,"arcs":[[-7099,7108,7109,-7009,-6862]]},{"type":"Polygon","id":13187,"arcs":[[-7074,7110,7111,-6982,-6990]]},{"type":"Polygon","id":37141,"arcs":[[-6992,7112,7113,7114,7115,-7032,-6809,-6859]]},{"type":"Polygon","id":5113,"arcs":[[7116,7117,7118,-6775,-6905,-7108]]},{"type":"Polygon","id":1103,"arcs":[[-6972,7119,7120,-7069,-6946]]},{"type":"Polygon","id":13257,"arcs":[[7121,7122,-7050,-6922]]},{"type":"Polygon","id":40137,"arcs":[[-7046,7123,7124,7125,-7041,-6781]]},{"type":"Polygon","id":40005,"arcs":[[7126,7127,7128,7129,-7085,-6818]]},{"type":"Polygon","id":40127,"arcs":[[-6777,7130,7131,-7127,-6817,-6918]]},{"type":"Polygon","id":5107,"arcs":[[-7027,7132,7133,7134,7135,-6941,-7017]]},{"type":"Polygon","id":40099,"arcs":[[-7001,7136,7137,-7044]]},{"type":"Polygon","id":40141,"arcs":[[-7043,7138,7139,7140,-7035,-7034,-6890]]},{"type":"Polygon","id":13129,"arcs":[[-7049,7141,7142,7143,-6995,-6985,-6977]]},{"type":"Polygon","id":45033,"arcs":[[7144,7145,7146,-7066,-7007]]},{"type":"Polygon","id":13085,"arcs":[[-7112,7147,7148,7149,7150,-7047,-6983]]},{"type":"Polygon","id":45055,"arcs":[[-7063,7151,7152,7153,7154,7155,-6915,-7064]]},{"type":"Polygon","id":35041,"arcs":[[-7011,7156,7157,7158,7159,-7078,-6558]]},{"type":"Polygon","id":28145,"arcs":[[-7089,7160,7161,7162,-6964,-6962,-6956]]},{"type":"Polygon","id":1095,"arcs":[[-7031,7163,7164,7165,-7120,-6971,-6974]]},{"type":"Polygon","id":13055,"arcs":[[7166,7167,-7028,-6997]]},{"type":"Polygon","id":13115,"arcs":[[-7144,7168,7169,7170,-7167,-6996]]},{"type":"Polygon","id":35053,"arcs":[[-6926,7171,7172,7173,-6798,-7003]]},{"type":"Polygon","id":35003,"arcs":[[-7174,7174,7175,7176,-5782,-6799]]},{"type":"Polygon","id":1059,"arcs":[[-7072,7177,7178,7179,-6951,-7019]]},{"type":"Polygon","id":48197,"arcs":[[-7037,7180,7181,7182,-7103,-6931]]},{"type":"Polygon","id":45039,"arcs":[[-6916,-7156,7183,7184,-7013,-7058]]},{"type":"Polygon","id":5001,"arcs":[[-6942,-7136,7185,7186,7187,-6911,-6907]]},{"type":"Polygon","id":13227,"arcs":[[-7151,7188,-7142,-7048]]},{"type":"Polygon","id":28071,"arcs":[[-7163,7189,7190,7191,7192,-7081,-6965]]},{"type":"Polygon","id":28107,"arcs":[[-7193,7193,7194,7195,-7024,-7082]]},{"type":"Polygon","id":13119,"arcs":[[7196,7197,7198,-7122,-6921]]},{"type":"Polygon","id":45031,"arcs":[[-7068,7199,7200,-7152,-7062]]},{"type":"Polygon","id":45071,"arcs":[[-7185,7201,7202,7203,7204,-7075,-7014]]},{"type":"Polygon","id":1019,"arcs":[[-7171,7205,7206,7207,7208,-7029,-7168]]},{"type":"Polygon","id":28027,"arcs":[[7209,7210,7211,-7133,-7026,7212]]},{"type":"Polygon","id":28119,"arcs":[[-7196,7213,-7213,-7025]]},{"type":"Polygon","id":13139,"arcs":[[-7052,7214,7215,7216,7217,-7148,-7111,-7073]]},{"type":"Polygon","id":28081,"arcs":[[7218,7219,7220,7221,-7161,-7088]]},{"type":"Polygon","id":40019,"arcs":[[-7138,7222,7223,7224,7225,-7124,-7045]]},{"type":"Polygon","id":40069,"arcs":[[-7000,-7086,-7130,7226,7227,-7223,-7137]]},{"type":"Polygon","id":40033,"arcs":[[-7126,7228,7229,7230,-7139,-7042]]},{"type":"Polygon","id":40089,"arcs":[[-7119,7231,7232,7233,7234,7235,-7131,-6776]]},{"type":"Polygon","id":5059,"arcs":[[-7039,7236,7237,7238,-7105,-7083]]},{"type":"Polygon","id":4007,"arcs":[[-5733,7239,7240,7241,-6667,-6666,-5735]]},{"type":"Polygon","id":13147,"arcs":[[-7061,7242,7243,-7197,-6920]]},{"type":"Polygon","id":5053,"arcs":[[-6934,7244,7245,7246,-7237,-7038]]},{"type":"Polygon","id":5069,"arcs":[[-6912,-7188,7247,7248,-7245,-6933]]},{"type":"Polygon","id":13011,"arcs":[[7249,7250,-7215,-7051,-7123,-7199]]},{"type":"Polygon","id":37047,"arcs":[[-7116,7251,7252,-7005,-7033]]},{"type":"Polygon","id":45001,"arcs":[[7253,7254,7255,-7059,-7077]]},{"type":"Polygon","id":28057,"arcs":[[-6952,-7180,7256,7257,-7219,-7087]]},{"type":"Polygon","id":48487,"arcs":[[-7141,7258,7259,7260,-7181,-7036]]},{"type":"Polygon","id":13015,"arcs":[[7261,7262,7263,-7169,-7143,7264]]},{"type":"Polygon","id":13057,"arcs":[[-7150,7265,7266,7267,-7265,-7189]]},{"type":"Polygon","id":45047,"arcs":[[-7205,7268,7269,7270,-7254,-7076]]},{"type":"Polygon","id":37129,"arcs":[[7271,7272,7273,7274,-7114]]},{"type":"Polygon","id":28115,"arcs":[[-7222,7275,7276,-7190,-7162]]},{"type":"Polygon","id":45061,"arcs":[[7277,7278,-7153,-7201]]},{"type":"Polygon","id":37019,"arcs":[[-7275,7279,7280,7281,7282,-7252,-7115]]},{"type":"Polygon","id":5061,"arcs":[[7283,7284,7285,7286,-7117]]},{"type":"Polygon","id":5109,"arcs":[[7287,7288,7289,-7284,-7107]]},{"type":"Polygon","id":35027,"arcs":[[-7080,7290,7291,7292,-7172,-6925,-6839]]},{"type":"Polygon","id":5019,"arcs":[[-7239,7293,7294,7295,-7288,-7106]]},{"type":"Polygon","id":13117,"arcs":[[-7218,7296,7297,-7266,-7149]]},{"type":"Polygon","id":1093,"arcs":[[7298,7299,7300,7301,7302,-7257,-7179]]},{"type":"Polygon","id":4012,"arcs":[[-6669,7303,7304,7305,7306,-6522,7307]]},{"type":"Polygon","id":48345,"arcs":[[7308,7309,7310,-7095,-7102]]},{"type":"Polygon","id":48101,"arcs":[[-7104,-7183,7311,7312,-7309,-7101]]},{"type":"Polygon","id":1043,"arcs":[[-7166,7313,7314,7315,-7070,-7121]]},{"type":"Polygon","id":48153,"arcs":[[-7311,7316,7317,-7091,-7096]]},{"type":"Polygon","id":48189,"arcs":[[-7097,-7092,-7318,7318,7319]]},{"type":"Polygon","id":48279,"arcs":[[-7320,7320,7321,-7109,-7098]]},{"type":"Polygon","id":45041,"arcs":[[7322,7323,7324,7325,-7278,-7200,-7067,-7147]]},{"type":"Polygon","id":48017,"arcs":[[-7322,7326,-7157,-7010,-7110]]},{"type":"Polygon","id":1133,"arcs":[[-7071,-7316,7327,-7299,-7178]]},{"type":"Polygon","id":45051,"arcs":[[-7253,-7283,7328,7329,7330,-7145,-7006]]},{"type":"Polygon","id":45067,"arcs":[[-7331,7331,7332,-7323,-7146]]},{"type":"Polygon","id":13157,"arcs":[[7333,7334,7335,-7216,-7251]]},{"type":"Polygon","id":40067,"arcs":[[-7226,7336,7337,7338,-7229,-7125]]},{"type":"Polygon","id":13105,"arcs":[[-7256,7339,7340,7341,7342,7343,-7243,-7060]]},{"type":"Polygon","id":13195,"arcs":[[-7344,7344,7345,7346,-7334,-7250,-7198,-7244]]},{"type":"Polygon","id":45079,"arcs":[[7347,7348,7349,-7202,-7184,-7155]]},{"type":"Polygon","id":1009,"arcs":[[-7165,7350,7351,7352,7353,-7314]]},{"type":"Polygon","id":48155,"arcs":[[-7182,-7261,7354,7355,7356,-7312]]},{"type":"Polygon","id":48485,"arcs":[[-7231,7357,7358,-7259,-7140]]},{"type":"Polygon","id":1055,"arcs":[[-7209,7359,7360,-7351,-7164,-7030]]},{"type":"Polygon","id":45063,"arcs":[[7361,7362,7363,7364,-7203,-7350]]},{"type":"Polygon","id":28161,"arcs":[[7365,7366,7367,-7194,-7192]]},{"type":"Polygon","id":5133,"arcs":[[7368,-7232,-7118,-7287]]},{"type":"Polygon","id":45081,"arcs":[[-7365,7369,7370,-7269,-7204]]},{"type":"Polygon","id":13121,"arcs":[[-7298,7371,7372,7373,7374,7375,7376,7377,7378,-7267]]},{"type":"Polygon","id":40095,"arcs":[[7379,7380,7381,-7224,-7228]]},{"type":"Polygon","id":5079,"arcs":[[-7187,7382,7383,7384,-7248]]},{"type":"Polygon","id":45085,"arcs":[[-7326,7385,7386,-7348,-7154,-7279]]},{"type":"Polygon","id":13135,"arcs":[[7387,7388,7389,7390,-7372,-7297,-7217]]},{"type":"Polygon","id":28135,"arcs":[[-7368,7391,7392,7393,-7210,-7214,-7195]]},{"type":"Polygon","id":28013,"arcs":[[-7277,7394,7395,7396,-7366,-7191]]},{"type":"Polygon","id":40013,"arcs":[[7397,7398,7399,7400,-7380,-7227,-7129]]},{"type":"Polygon","id":40023,"arcs":[[-7236,7401,7402,-7398,-7128,-7132]]},{"type":"Polygon","id":5039,"arcs":[[-7247,7403,7404,7405,-7294,-7238]]},{"type":"Polygon","id":48077,"arcs":[[-7339,7406,7407,7408,-7358,-7230]]},{"type":"Polygon","id":13013,"arcs":[[7409,7410,-7388,-7336]]},{"type":"Polygon","id":28011,"arcs":[[7411,7412,7413,7414,-7134,-7212]]},{"type":"Polygon","id":5041,"arcs":[[-7415,7415,7416,-7383,-7186,-7135]]},{"type":"Polygon","id":13233,"arcs":[[-7264,7417,7418,7419,-7206,-7170]]},{"type":"Polygon","id":28095,"arcs":[[-7258,-7303,7420,7421,7422,7423,-7220]]},{"type":"Polygon","id":35005,"arcs":[[-7160,7424,7425,7426,-7291,-7079]]},{"type":"Polygon","id":13067,"arcs":[[-7379,7427,7428,-7262,-7268]]},{"type":"Polygon","id":6065,"arcs":[[7429,7430,7431,-6523,-7307]]},{"type":"Polygon","id":13223,"arcs":[[-7429,7432,7433,7434,-7418,-7263]]},{"type":"Polygon","id":45065,"arcs":[[-7271,7435,7436,7437,-7340,-7255]]},{"type":"Polygon","id":28017,"arcs":[[-7221,-7424,7438,7439,-7395,-7276]]},{"type":"Polygon","id":40085,"arcs":[[-7382,7440,7441,7442,-7337,-7225]]},{"type":"Polygon","id":5025,"arcs":[[-7385,7443,7444,7445,-7404,-7246,-7249]]},{"type":"Polygon","id":1075,"arcs":[[7446,7447,7448,-7421,-7302]]},{"type":"Polygon","id":13221,"arcs":[[-7343,7449,7450,7451,7452,7453,-7346,-7345]]},{"type":"Polygon","id":4013,"arcs":[[-7242,7454,7455,7456,-7304,-6668]]},{"type":"Polygon","id":13059,"arcs":[[-7454,7457,-7335,-7347]]},{"type":"Polygon","id":5057,"arcs":[[7458,7459,7460,7461,-7285,-7290]]},{"type":"Polygon","id":1127,"arcs":[[-7315,-7354,7462,7463,7464,-7300,-7328]]},{"type":"Polygon","id":13317,"arcs":[[7465,7466,7467,7468,-7450,-7342]]},{"type":"Polygon","id":48337,"arcs":[[-7443,7469,7470,7471,-7407,-7338]]},{"type":"Polygon","id":1115,"arcs":[[7472,7473,7474,7475,-7352,-7361]]},{"type":"Polygon","id":28133,"arcs":[[-7394,7476,7477,7478,-7412,-7211]]},{"type":"Polygon","id":13181,"arcs":[[-7438,7479,7480,-7466,-7341]]},{"type":"Polygon","id":45037,"arcs":[[7481,7482,7483,-7436,-7270,-7371]]},{"type":"Polygon","id":13089,"arcs":[[-7391,7484,7485,7486,-7373]]},{"type":"Polygon","id":1015,"arcs":[[7487,-7473,-7360,-7208,7488]]},{"type":"Polygon","id":13219,"arcs":[[-7453,7489,7490,7491,-7410,-7458]]},{"type":"Polygon","id":1029,"arcs":[[-7420,7492,7493,7494,7495,7496,-7489,-7207]]},{"type":"Polygon","id":48387,"arcs":[[-7235,7497,7498,7499,7500,7501,7502,-7402]]},{"type":"Polygon","id":5099,"arcs":[[-7296,7503,7504,7505,-7459,-7289]]},{"type":"Polygon","id":48181,"arcs":[[-7401,7506,7507,7508,7509,-7441,-7381]]},{"type":"Polygon","id":48097,"arcs":[[-7510,7510,7511,-7470,-7442]]},{"type":"Polygon","id":5081,"arcs":[[-7286,-7462,7512,7513,-7233,-7369]]},{"type":"Polygon","id":45027,"arcs":[[7514,7515,7516,7517,-7386,-7325]]},{"type":"Polygon","id":6059,"arcs":[[-6524,-7432,7518,7519,-7056]]},{"type":"Polygon","id":48277,"arcs":[[-7503,7520,7521,-7399,-7403]]},{"type":"Polygon","id":13297,"arcs":[[-7492,7522,7523,7524,-7389,-7411]]},{"type":"Polygon","id":1057,"arcs":[[-7465,7525,7526,-7447,-7301]]},{"type":"Polygon","id":13143,"arcs":[[7527,-7493,-7419,-7435]]},{"type":"Polygon","id":28043,"arcs":[[-7397,7528,7529,7530,7531,-7392,-7367]]},{"type":"Polygon","id":45089,"arcs":[[-7333,7532,7533,-7515,-7324]]},{"type":"Polygon","id":48147,"arcs":[[-7522,7534,7535,7536,-7507,-7400]]},{"type":"Polygon","id":45017,"arcs":[[-7387,-7518,7537,-7362,-7349]]},{"type":"Polygon","id":45003,"arcs":[[7538,7539,7540,7541,-7482,-7370,-7364]]},{"type":"Polygon","id":1073,"arcs":[[-7476,7542,7543,7544,-7463,-7353]]},{"type":"Polygon","id":48269,"arcs":[[-7357,7545,7546,7547,-7313]]},{"type":"Polygon","id":48275,"arcs":[[7548,7549,-7546,-7356]]},{"type":"Polygon","id":48009,"arcs":[[-7409,7550,7551,7552,-7359]]},{"type":"Polygon","id":48125,"arcs":[[-7548,7553,7554,-7310]]},{"type":"Polygon","id":48107,"arcs":[[-7555,7555,7556,-7317]]},{"type":"Polygon","id":48023,"arcs":[[-7553,7557,-7549,-7355,-7260]]},{"type":"Polygon","id":48303,"arcs":[[-7557,7558,7559,-7319]]},{"type":"Polygon","id":48079,"arcs":[[7560,7561,7562,-7158,-7327]]},{"type":"Polygon","id":48219,"arcs":[[-7560,7563,-7561,-7321]]},{"type":"Polygon","id":5103,"arcs":[[-7406,7564,7565,7566,-7504,-7295]]},{"type":"Polygon","id":13211,"arcs":[[7567,7568,7569,7570,-7523,-7491]]},{"type":"Polygon","id":13045,"arcs":[[-7377,7571,7572,7573,-7494,-7528,-7434,7574]]},{"type":"Polygon","id":28083,"arcs":[[-7532,7575,7576,7577,-7477,-7393]]},{"type":"Polygon","id":28025,"arcs":[[-7423,7578,7579,7580,-7439]]},{"type":"Polygon","id":13097,"arcs":[[-7378,-7575,-7433,-7428]]},{"type":"Polygon","id":5013,"arcs":[[7581,7582,-7565,-7405,-7446]]},{"type":"Polygon","id":5043,"arcs":[[-7417,7583,7584,7585,-7444,-7384]]},{"type":"Polygon","id":13247,"arcs":[[7586,-7485,-7390,-7525,7587]]},{"type":"Polygon","id":45043,"arcs":[[-7330,7588,7589,7590,-7533,-7332]]},{"type":"Polygon","id":4011,"arcs":[[-7177,7591,7592,7593,7594,-5783]]},{"type":"Polygon","id":13133,"arcs":[[7595,7596,7597,-7568,-7490,-7452]]},{"type":"Polygon","id":28087,"arcs":[[-7449,7598,7599,7600,-7579,-7422]]},{"type":"Polygon","id":13217,"arcs":[[-7571,7601,7602,7603,-7588,-7524]]},{"type":"Polygon","id":28155,"arcs":[[-7581,7604,7605,7606,-7529,-7396,-7440]]},{"type":"Polygon","id":13265,"arcs":[[7607,7608,7609,-7596,-7451,-7469]]},{"type":"Polygon","id":48037,"arcs":[[-7514,7610,7611,7612,-7498,-7234]]},{"type":"Polygon","id":45075,"arcs":[[-7517,7613,7614,7615,7616,7617,-7539,-7363,-7538]]},{"type":"Polygon","id":5011,"arcs":[[-7586,7618,7619,-7582,-7445]]},{"type":"Polygon","id":13073,"arcs":[[-7437,-7484,7620,7621,-7480]]},{"type":"Polygon","id":1121,"arcs":[[-7488,-7497,7622,7623,7624,-7474]]},{"type":"Polygon","id":28097,"arcs":[[-7607,7625,7626,7627,-7530]]},{"type":"Polygon","id":28015,"arcs":[[-7628,7628,7629,-7576,-7531]]},{"type":"Polygon","id":13189,"arcs":[[-7481,-7622,7630,7631,7632,7633,-7467]]},{"type":"Polygon","id":4009,"arcs":[[-7595,7634,7635,7636,-7240,-5732,-5784]]},{"type":"Polygon","id":13063,"arcs":[[-7487,7637,7638,7639,-7374]]},{"type":"Polygon","id":13151,"arcs":[[-7587,-7604,7640,7641,-7638,-7486]]},{"type":"Polygon","id":5091,"arcs":[[7642,7643,7644,7645,-7611,-7513,-7461]]},{"type":"Polygon","id":13301,"arcs":[[7646,7647,7648,-7609,-7608,-7468,-7634]]},{"type":"Polygon","id":1125,"arcs":[[-7464,-7545,7649,7650,7651,7652,-7526]]},{"type":"Polygon","id":35025,"arcs":[[-7563,7653,7654,7655,7656,7657,7658,-7425,-7159]]},{"type":"Polygon","id":28105,"arcs":[[-7601,7659,7660,7661,-7605,-7580]]},{"type":"Polygon","id":5017,"arcs":[[-7414,7662,7663,7664,7665,7666,7667,-7584,-7416]]},{"type":"Polygon","id":13113,"arcs":[[7668,7669,-7375,-7640]]},{"type":"Polygon","id":1117,"arcs":[[-7625,7670,7671,7672,-7543,-7475]]},{"type":"Polygon","id":13245,"arcs":[[7673,7674,7675,-7631,-7621,-7483,-7542]]},{"type":"Polygon","id":1107,"arcs":[[-7527,-7653,7676,7677,7678,-7599,-7448]]},{"type":"Polygon","id":28019,"arcs":[[-7662,7679,7680,-7626,-7606]]},{"type":"Polygon","id":28151,"arcs":[[-7479,7681,7682,7683,-7663,-7413]]},{"type":"Polygon","id":13159,"arcs":[[7684,7685,7686,7687,-7602,-7570]]},{"type":"Polygon","id":13077,"arcs":[[-7670,7688,7689,7690,7691,-7572,-7376]]},{"type":"Polygon","id":45015,"arcs":[[-7591,7692,7693,7694,7695,-7614,-7516,-7534]]},{"type":"Polygon","id":6073,"arcs":[[7696,7697,-7519,-7431]]},{"type":"Polygon","id":1111,"arcs":[[-7574,7698,7699,7700,7701,7702,-7495]]},{"type":"Polygon","id":1027,"arcs":[[-7703,7703,7704,-7623,-7496]]},{"type":"Polygon","id":48119,"arcs":[[-7502,7705,7706,7707,-7535,-7521]]},{"type":"Polygon","id":45011,"arcs":[[7708,7709,7710,-7540,-7618]]},{"type":"Polygon","id":13237,"arcs":[[7711,7712,7713,-7685,-7569,-7598]]},{"type":"Polygon","id":35051,"arcs":[[-7293,7714,7715,7716,7717,-7175,-7173]]},{"type":"Polygon","id":5073,"arcs":[[-7506,7718,7719,7720,-7643,-7460]]},{"type":"Polygon","id":13141,"arcs":[[-7649,7721,7722,7723,-7712,-7597,-7610]]},{"type":"Polygon","id":4027,"arcs":[[-7457,7724,7725,7726,-7305]]},{"type":"Polygon","id":4021,"arcs":[[-7241,-7637,7727,-7455]]},{"type":"Polygon","id":48237,"arcs":[[-7472,7728,7729,7730,7731,-7551,-7408]]},{"type":"Polygon","id":5027,"arcs":[[-7567,7732,7733,7734,-7719,-7505]]},{"type":"Polygon","id":13035,"arcs":[[-7688,7735,7736,7737,-7641,-7603]]},{"type":"Polygon","id":45009,"arcs":[[7738,7739,-7709,-7617]]},{"type":"Polygon","id":6025,"arcs":[[-7727,7740,-7697,-7430,-7306]]},{"type":"Polygon","id":48497,"arcs":[[-7512,7741,7742,7743,-7729,-7471]]},{"type":"Polygon","id":48121,"arcs":[[7744,7745,7746,-7742,-7511,-7509]]},{"type":"Polygon","id":13149,"arcs":[[-7692,7747,-7699,-7573]]},{"type":"Polygon","id":48231,"arcs":[[7748,7749,7750,7751,7752,-7536,-7708,7753]]},{"type":"Polygon","id":48085,"arcs":[[-7537,-7753,7754,7755,-7745,-7508]]},{"type":"Polygon","id":48263,"arcs":[[7756,7757,7758,7759,-7554]]},{"type":"Polygon","id":48433,"arcs":[[7760,7761,7762,-7757,-7547]]},{"type":"Polygon","id":48449,"arcs":[[7763,7764,7765,-7500]]},{"type":"Polygon","id":48169,"arcs":[[-7760,7766,7767,7768,-7556]]},{"type":"Polygon","id":48447,"arcs":[[7769,7770,7771,7772,-7558]]},{"type":"Polygon","id":48503,"arcs":[[-7732,7773,7774,-7770,-7552]]},{"type":"Polygon","id":48207,"arcs":[[-7773,7775,7776,-7761,-7550]]},{"type":"Polygon","id":5003,"arcs":[[-7668,7777,7778,-7619,-7585]]},{"type":"Polygon","id":48305,"arcs":[[-7769,7779,7780,7781,-7559]]},{"type":"Polygon","id":35035,"arcs":[[-7427,7782,7783,7784,7785,7786,-7715,-7292]]},{"type":"Polygon","id":48501,"arcs":[[7787,7788,-7654,-7562]]},{"type":"Polygon","id":48445,"arcs":[[-7782,7789,7790,-7788,-7564]]},{"type":"Polygon","id":48159,"arcs":[[-7766,7791,7792,7793,-7706,-7501]]},{"type":"Polygon","id":5139,"arcs":[[-7583,-7620,-7779,7794,7795,-7733,-7566]]},{"type":"Polygon","id":48223,"arcs":[[-7794,7796,7797,-7754,-7707]]},{"type":"Polygon","id":48343,"arcs":[[-7613,7798,7799,7800,7801,-7764,-7499]]},{"type":"Polygon","id":28051,"arcs":[[-7630,7802,7803,7804,-7577]]},{"type":"Polygon","id":13255,"arcs":[[-7738,7805,7806,7807,-7689,-7669,-7639,-7642]]},{"type":"Polygon","id":45035,"arcs":[[-7696,7808,7809,-7615]]},{"type":"Polygon","id":28053,"arcs":[[-7578,-7805,7810,7811,-7682,-7478]]},{"type":"Polygon","id":13125,"arcs":[[7812,7813,7814,-7722,-7648]]},{"type":"Polygon","id":13163,"arcs":[[-7675,7815,7816,7817,7818,-7813,-7647,-7633,-7632,-7676]]},{"type":"Polygon","id":48067,"arcs":[[-7646,7819,7820,-7799,-7612]]},{"type":"Polygon","id":13033,"arcs":[[-7541,-7711,7821,7822,7823,7824,-7816,-7674]]},{"type":"Polygon","id":28103,"arcs":[[-7679,7825,7826,7827,-7660,-7600]]},{"type":"Polygon","id":28159,"arcs":[[-7828,7828,7829,7830,-7680,-7661]]},{"type":"Polygon","id":28007,"arcs":[[-7831,7831,7832,-7803,-7629,-7627,-7681]]},{"type":"Polygon","id":1007,"arcs":[[7833,7834,7835,-7650,-7544,-7673]]},{"type":"Polygon","id":13303,"arcs":[[-7815,-7814,-7819,7836,7837,7838,-7723]]},{"type":"Polygon","id":13199,"arcs":[[-7808,7839,7840,7841,7842,7843,-7690]]},{"type":"Polygon","id":13285,"arcs":[[-7844,7844,7845,-7700,-7748,-7691]]},{"type":"Polygon","id":35017,"arcs":[[-7718,7846,7847,-7592,-7176]]},{"type":"Polygon","id":13231,"arcs":[[7848,7849,-7840,-7807]]},{"type":"Polygon","id":13171,"arcs":[[7850,7851,-7849,-7806,-7737]]},{"type":"Polygon","id":13207,"arcs":[[-7687,7852,7853,7854,7855,-7851,-7736]]},{"type":"Polygon","id":13009,"arcs":[[-7724,-7839,7856,7857,-7713]]},{"type":"Polygon","id":13169,"arcs":[[-7858,7858,7859,7860,-7853,-7686,-7714]]},{"type":"Polygon","id":45029,"arcs":[[-7810,7861,7862,7863,7864,-7739,-7616]]},{"type":"Polygon","id":45005,"arcs":[[-7740,7865,7866,7867,-7822,-7710]]},{"type":"Polygon","id":1063,"arcs":[[7868,7869,7870,-7677,-7652]]},{"type":"Polygon","id":1017,"arcs":[[-7846,7871,7872,7873,-7701]]},{"type":"Polygon","id":1123,"arcs":[[-7874,7874,7875,7876,7877,-7704,-7702]]},{"type":"Polygon","id":1037,"arcs":[[-7878,7878,7879,-7671,-7624,-7705]]},{"type":"Polygon","id":28125,"arcs":[[-7812,7880,7881,-7683]]},{"type":"Polygon","id":48063,"arcs":[[-7802,7882,7883,-7792,-7765]]},{"type":"Polygon","id":1021,"arcs":[[-7880,7884,7885,7886,7887,-7834,-7672]]},{"type":"Polygon","id":35013,"arcs":[[7888,7889,7890,-7716,-7787]]},{"type":"Polygon","id":13251,"arcs":[[-7867,7891,7892,7893,7894,7895,-7823,-7868]]},{"type":"Polygon","id":45049,"arcs":[[7896,7897,7898,-7892,-7866,-7865]]},{"type":"Polygon","id":28163,"arcs":[[7899,7900,7901,7902,7903,-7881,-7811,-7804]]},{"type":"Polygon","id":22017,"arcs":[[7904,7905,7906,7907,7908,-7820,-7645,7909]]},{"type":"Polygon","id":22015,"arcs":[[7910,7911,7912,-7910,-7644,-7721]]},{"type":"Polygon","id":22119,"arcs":[[7913,-7911,-7720,-7735,7914]]},{"type":"Polygon","id":22027,"arcs":[[7915,7916,-7915,-7734,-7796,7917]]},{"type":"Polygon","id":22111,"arcs":[[7918,7919,-7918,-7795,7920]]},{"type":"Polygon","id":48499,"arcs":[[7921,7922,7923,7924,7925,-7797,-7793,-7884]]},{"type":"Polygon","id":28055,"arcs":[[-7882,-7904,7926,7927,-7664,-7684]]},{"type":"Polygon","id":13319,"arcs":[[-7838,7928,7929,7930,-7859,-7857]]},{"type":"Polygon","id":22067,"arcs":[[-7667,7931,7932,7933,-7921,-7778]]},{"type":"Polygon","id":1065,"arcs":[[-7836,7934,7935,-7869,-7651]]},{"type":"Polygon","id":22123,"arcs":[[7936,7937,-7932,-7666]]},{"type":"Polygon","id":48363,"arcs":[[7938,7939,7940,7941,7942,-7774,-7731]]},{"type":"Polygon","id":22035,"arcs":[[7943,7944,7945,-7937,-7665,-7928]]},{"type":"Polygon","id":48367,"arcs":[[7946,7947,7948,-7939,-7730,-7744]]},{"type":"Polygon","id":13293,"arcs":[[-7852,-7856,7949,7950,7951,-7841,-7850]]},{"type":"Polygon","id":1119,"arcs":[[7952,7953,7954,7955,-7826,-7678,-7871]]},{"type":"Polygon","id":48439,"arcs":[[-7743,-7747,7956,7957,7958,-7947]]},{"type":"Polygon","id":48113,"arcs":[[-7756,7959,7960,7961,-7957,-7746]]},{"type":"Polygon","id":48397,"arcs":[[-7752,7962,-7960,-7755]]},{"type":"Polygon","id":48379,"arcs":[[-7926,7963,-7749,-7798]]},{"type":"Polygon","id":48415,"arcs":[[7964,7965,7966,-7767,-7759]]},{"type":"Polygon","id":35015,"arcs":[[-7659,7967,7968,7969,-7783,-7426]]},{"type":"Polygon","id":48151,"arcs":[[-7763,7970,7971,-7965,-7758]]},{"type":"Polygon","id":48033,"arcs":[[-7967,7972,7973,7974,-7780,-7768]]},{"type":"Polygon","id":48115,"arcs":[[-7975,7975,7976,-7790,-7781]]},{"type":"Polygon","id":48165,"arcs":[[-7791,-7977,7977,7978,-7655,-7789]]},{"type":"Polygon","id":48253,"arcs":[[-7777,7979,7980,7981,-7971,-7762]]},{"type":"Polygon","id":48417,"arcs":[[7982,7983,7984,-7980,-7776,-7772]]},{"type":"Polygon","id":48429,"arcs":[[-7943,7985,-7983,-7771,-7775]]},{"type":"Polygon","id":13165,"arcs":[[-7896,7986,7987,-7824]]},{"type":"Polygon","id":13021,"arcs":[[7988,7989,7990,7991,-7854,-7861]]},{"type":"Polygon","id":28099,"arcs":[[7992,7993,7994,-7830]]},{"type":"Polygon","id":28079,"arcs":[[-7995,7995,7996,7997,-7832]]},{"type":"Polygon","id":28069,"arcs":[[-7956,7998,-7993,-7829,-7827]]},{"type":"Polygon","id":48459,"arcs":[[-7801,7999,8000,8001,8002,-7922,-7883]]},{"type":"Polygon","id":13289,"arcs":[[8003,8004,-7990,-7989,-7860,-7931]]},{"type":"Polygon","id":13263,"arcs":[[8005,8006,8007,8008,8009,-7842,-7952]]},{"type":"Polygon","id":48315,"arcs":[[-7909,8010,-8000,-7800,-7821]]},{"type":"Polygon","id":28089,"arcs":[[-7998,8011,8012,8013,-7901,-7900,-7833]]},{"type":"Polygon","id":1105,"arcs":[[-7888,8014,8015,-7935,-7835]]},{"type":"Polygon","id":13145,"arcs":[[-8010,8016,8017,-7872,-7845,-7843]]},{"type":"Polygon","id":13079,"arcs":[[-7992,8018,8019,8020,-7950,-7855]]},{"type":"Polygon","id":48257,"arcs":[[8021,8022,8023,-7961,-7963,-7751]]},{"type":"Polygon","id":13107,"arcs":[[-7825,-7988,8024,8025,8026,8027,8028,8029,-7817]]},{"type":"Polygon","id":48467,"arcs":[[-7964,-7925,8030,8031,-8022,-7750]]},{"type":"Polygon","id":13167,"arcs":[[-8030,8032,-7929,-7837,-7818]]},{"type":"Polygon","id":48203,"arcs":[[-7908,8033,8034,8035,-8001,-8011]]},{"type":"Polygon","id":35023,"arcs":[[8036,8037,8038,-7593,-7848]]},{"type":"Polygon","id":1051,"arcs":[[8039,8040,8041,-7885,-7879,-7877]]},{"type":"Polygon","id":22061,"arcs":[[8042,8043,8044,-7916,-7920]]},{"type":"Polygon","id":45053,"arcs":[[8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,-7898]]},{"type":"Polygon","id":13269,"arcs":[[-8021,8057,8058,8059,8060,-8006,-7951]]},{"type":"Polygon","id":1081,"arcs":[[-8018,8061,8062,8063,-7875,-7873]]},{"type":"Polygon","id":1047,"arcs":[[8064,8065,8066,8067,-8015,-7887]]},{"type":"Polygon","id":22073,"arcs":[[8068,8069,8070,-8043,-7919,-7934]]},{"type":"Polygon","id":13175,"arcs":[[8071,8072,8073,-7930,-8033,8074]]},{"type":"Polygon","id":1001,"arcs":[[-8042,8075,8076,-8065,-7886]]},{"type":"MultiPolygon","id":45013,"arcs":[[[8077]],[[-8053,-8052,8078]],[[8079]],[[8080]],[[8081,-8046,-7897,-7864]]]},{"type":"Polygon","id":13225,"arcs":[[8082,-8058,-8020,8083]]},{"type":"Polygon","id":13153,"arcs":[[-8005,8084,8085,8086,8087,-8084,-8019,-7991]]},{"type":"Polygon","id":48423,"arcs":[[-7923,-8003,8088,8089,8090,8091,-8031,-7924]]},{"type":"Polygon","id":22083,"arcs":[[-7946,8092,8093,8094,-8069,-7933,-7938]]},{"type":"Polygon","id":48183,"arcs":[[-8036,8095,-8089,-8002]]},{"type":"Polygon","id":13031,"arcs":[[-7894,8096,8097,8098,8099,-8025,-7987,-7895]]},{"type":"Polygon","id":28123,"arcs":[[-7997,8100,8101,8102,-8012]]},{"type":"Polygon","id":28149,"arcs":[[8103,8104,8105,8106,8107,8108,-7944,-7927,-7903]]},{"type":"Polygon","id":13215,"arcs":[[-8009,8109,8110,-8062,-8017]]},{"type":"Polygon","id":35029,"arcs":[[-7891,8111,-8037,-7847,-7717]]},{"type":"Polygon","id":13103,"arcs":[[-8057,-8056,8112,8113,-8097,-7893,-7899]]},{"type":"Polygon","id":1087,"arcs":[[8114,8115,8116,8117,-8040,-7876,-8064]]},{"type":"Polygon","id":28121,"arcs":[[-8103,8118,8119,8120,-8013]]},{"type":"Polygon","id":22013,"arcs":[[-8045,8121,8122,8123,8124,-7912,-7914,-7917]]},{"type":"Polygon","id":13023,"arcs":[[8125,8126,-8085,-8004,-8074]]},{"type":"Polygon","id":28075,"arcs":[[-7955,8127,8128,8129,-7999]]},{"type":"Polygon","id":28101,"arcs":[[-8130,8130,-8101,-7996,-7994]]},{"type":"Polygon","id":28049,"arcs":[[-8121,8131,8132,-8104,-7902,-8014]]},{"type":"Polygon","id":22065,"arcs":[[8133,8134,-8093,-7945,-8109]]},{"type":"Polygon","id":13197,"arcs":[[8135,8136,8137,8138,8139,-8007,-8061]]},{"type":"Polygon","id":13043,"arcs":[[8140,8141,-8026,-8100]]},{"type":"Polygon","id":48221,"arcs":[[8142,8143,8144,-7940,-7949]]},{"type":"Polygon","id":48251,"arcs":[[8145,8146,8147,8148,-8143,-7948,-7959]]},{"type":"Polygon","id":48139,"arcs":[[-7962,-8024,8149,8150,8151,-8146,-7958]]},{"type":"Polygon","id":1091,"arcs":[[-7936,-8016,-8068,8152,8153,8154,-7953,-7870]]},{"type":"Polygon","id":13053,"arcs":[[-8140,8155,8156,-8110,-8008]]},{"type":"Polygon","id":48227,"arcs":[[8157,8158,8159,8160,-7974]]},{"type":"Polygon","id":48335,"arcs":[[8161,8162,8163,-8158,-7973,-7966]]},{"type":"Polygon","id":48353,"arcs":[[8164,8165,8166,-8162,-7972]]},{"type":"Polygon","id":48317,"arcs":[[-8161,8167,8168,8169,-7978,-7976]]},{"type":"Polygon","id":48003,"arcs":[[-8170,8170,8171,8172,-7656,-7979]]},{"type":"Polygon","id":13193,"arcs":[[-8083,-8088,8173,8174,8175,-8059]]},{"type":"Polygon","id":48441,"arcs":[[8176,8177,8178,-8165,-7982]]},{"type":"Polygon","id":48133,"arcs":[[-7942,8179,8180,8181,8182,-7984,-7986]]},{"type":"Polygon","id":48143,"arcs":[[-7941,-8145,8183,8184,8185,8186,-8180]]},{"type":"Polygon","id":48059,"arcs":[[-8183,8187,8188,-8177,-7981,-7985]]},{"type":"Polygon","id":4019,"arcs":[[-7636,8189,8190,8191,-7725,-7456,-7728]]},{"type":"Polygon","id":13283,"arcs":[[8192,8193,-8075,-8029]]},{"type":"Polygon","id":1113,"arcs":[[-8111,-8157,8194,8195,8196,-8115,-8063]]},{"type":"Polygon","id":1101,"arcs":[[-8118,-8117,8197,8198,8199,8200,-8076,-8041]]},{"type":"Polygon","id":22049,"arcs":[[-8071,8201,8202,-8122,-8044]]},{"type":"Polygon","id":13091,"arcs":[[8203,8204,8205,8206,-8126,-8073]]},{"type":"Polygon","id":13249,"arcs":[[-8176,8207,-8136,-8060]]},{"type":"Polygon","id":4003,"arcs":[[-7594,-8039,8208,8209,-8190,-7635]]},{"type":"Polygon","id":1085,"arcs":[[-8201,8210,8211,8212,-8066,-8077]]},{"type":"Polygon","id":48401,"arcs":[[8213,8214,8215,8216,-8090,-8096,-8035]]},{"type":"Polygon","id":22041,"arcs":[[-8135,8217,8218,8219,-8094]]},{"type":"Polygon","id":13235,"arcs":[[-8127,-8207,8220,8221,-8086]]},{"type":"Polygon","id":48365,"arcs":[[-7907,8222,8223,-8214,-8034]]},{"type":"Polygon","id":48213,"arcs":[[-8032,-8092,8224,8225,8226,8227,-8150,-8023]]},{"type":"Polygon","id":13209,"arcs":[[8228,8229,-8193,8230]]},{"type":"Polygon","id":13279,"arcs":[[-8028,8231,8232,8233,-8231]]},{"type":"Polygon","id":22031,"arcs":[[8234,8235,8236,8237,-8223,-7906]]},{"type":"Polygon","id":48349,"arcs":[[8238,8239,8240,-8151,-8228]]},{"type":"Polygon","id":48425,"arcs":[[-8149,8241,-8184,-8144]]},{"type":"Polygon","id":13267,"arcs":[[8242,8243,8244,8245,8246,-8232,-8027,-8142]]},{"type":"Polygon","id":1023,"arcs":[[8247,8248,8249,8250,-8128,-7954,-8155]]},{"type":"Polygon","id":13309,"arcs":[[-8230,8251,8252,-8204,-8072,-8194]]},{"type":"Polygon","id":1011,"arcs":[[-8197,8253,8254,-8198,-8116]]},{"type":"Polygon","id":13093,"arcs":[[-8222,8255,8256,8257,8258,-8174,-8087]]},{"type":"Polygon","id":13109,"arcs":[[-8099,8259,8260,-8243,-8141]]},{"type":"Polygon","id":22021,"arcs":[[-8095,-8220,8261,8262,8263,-8202,-8070]]},{"type":"Polygon","id":1131,"arcs":[[-8067,-8213,8264,8265,8266,-8153]]},{"type":"Polygon","id":48217,"arcs":[[-8241,8267,8268,8269,-8147,-8152]]},{"type":"Polygon","id":48093,"arcs":[[8270,8271,8272,-8181,-8187]]},{"type":"Polygon","id":22107,"arcs":[[-8108,8273,-8106,8274,8275,8276,8277,8278,-8218,-8134]]},{"type":"Polygon","id":13029,"arcs":[[8279,8280,8281,-8260,-8098,-8114]]},{"type":"Polygon","id":22081,"arcs":[[-7913,-8125,8282,-8235,-7905]]},{"type":"MultiPolygon","id":13051,"arcs":[[[8283]],[[8284]],[[8285,-8280,-8113,-8055]]]},{"type":"Polygon","id":13307,"arcs":[[8286,8287,8288,8289,-8138]]},{"type":"Polygon","id":13259,"arcs":[[-8290,8290,8291,8292,-8195,-8156,-8139]]},{"type":"Polygon","id":13261,"arcs":[[-8259,-8258,8293,8294,8295,-8287,-8137,-8208,-8175]]},{"type":"Polygon","id":28023,"arcs":[[-8251,8296,8297,-8129]]},{"type":"Polygon","id":28021,"arcs":[[-8133,8298,8299,-8275,-8105]]},{"type":"Polygon","id":28061,"arcs":[[-8298,8300,8301,8302,-8131]]},{"type":"Polygon","id":28129,"arcs":[[-8303,8303,8304,8305,-8119,-8102]]},{"type":"Polygon","id":48035,"arcs":[[-8148,-8270,8306,8307,8308,-8185,-8242]]},{"type":"Polygon","id":13271,"arcs":[[8309,8310,8311,8312,-8205,-8253]]},{"type":"Polygon","id":22127,"arcs":[[-8203,-8264,8313,8314,8315,-8123]]},{"type":"Polygon","id":22069,"arcs":[[-8316,8316,8317,8318,8319,-8236,-8283,-8124]]},{"type":"Polygon","id":1005,"arcs":[[-8293,8320,8321,8322,8323,8324,8325,-8254,-8196]]},{"type":"Polygon","id":48073,"arcs":[[-8217,8326,8327,8328,8329,-8225,-8091]]},{"type":"Polygon","id":13315,"arcs":[[-8206,-8313,8330,8331,8332,-8256,-8221]]},{"type":"MultiPolygon","id":13179,"arcs":[[[8333]],[[8334,8335,-8244,-8261,-8282,8336]]]},{"type":"Polygon","id":48431,"arcs":[[-8164,8337,8338,8339,8340,-8159]]},{"type":"Polygon","id":48173,"arcs":[[-8341,8341,8342,-8168,-8160]]},{"type":"Polygon","id":48329,"arcs":[[-8343,8343,8344,-8171,-8169]]},{"type":"Polygon","id":48135,"arcs":[[-8345,8345,8346,8347,8348,-8172]]},{"type":"Polygon","id":48495,"arcs":[[-8349,8349,8350,-7657,-8173]]},{"type":"Polygon","id":48081,"arcs":[[-8167,8351,8352,-8338,-8163]]},{"type":"Polygon","id":48001,"arcs":[[8353,8354,8355,-8226,-8330]]},{"type":"Polygon","id":48083,"arcs":[[-8189,8356,8357,8358,8359,-8178]]},{"type":"Polygon","id":48399,"arcs":[[-8360,8360,8361,-8352,-8166,-8179]]},{"type":"Polygon","id":48049,"arcs":[[-8273,8362,8363,8364,-8357,-8188,-8182]]},{"type":"Polygon","id":1109,"arcs":[[-8326,-8325,8365,8366,8367,-8199,-8255]]},{"type":"Polygon","id":1041,"arcs":[[-8368,8368,8369,8370,-8211,-8200]]},{"type":"Polygon","id":28029,"arcs":[[8371,8372,8373,8374,-8299,-8132]]},{"type":"Polygon","id":28127,"arcs":[[-8306,8375,8376,8377,-8372,-8120]]},{"type":"Polygon","id":13081,"arcs":[[-8333,8378,8379,8380,-8294,-8257]]},{"type":"Polygon","id":48193,"arcs":[[8381,-8271,-8186,-8309,8382,8383]]},{"type":"Polygon","id":13183,"arcs":[[8384,8385,-8245,-8336]]},{"type":"Polygon","id":48161,"arcs":[[8386,8387,-8239,-8227,-8356]]},{"type":"Polygon","id":48109,"arcs":[[8388,8389,8390,-7784,-7970]]},{"type":"Polygon","id":48229,"arcs":[[8391,8392,8393,-7785,-8391]]},{"type":"Polygon","id":48141,"arcs":[[8394,-7889,-7786,-8394]]},{"type":"Polygon","id":48301,"arcs":[[8395,8396,-7968,-7658,-8351]]},{"type":"Polygon","id":48389,"arcs":[[8397,8398,8399,-8389,-7969,-8397]]},{"type":"Polygon","id":13239,"arcs":[[8400,8401,-8321,-8292]]},{"type":"Polygon","id":1025,"arcs":[[-8267,8402,8403,8404,-8248,-8154]]},{"type":"Polygon","id":48419,"arcs":[[8405,8406,8407,8408,-8215,-8224,-8238]]},{"type":"Polygon","id":22025,"arcs":[[-8279,8409,8410,8411,-8262,-8219]]},{"type":"Polygon","id":13161,"arcs":[[8412,8413,8414,-8310,-8252,-8229,-8234]]},{"type":"Polygon","id":13273,"arcs":[[8415,8416,8417,8418,-8288,-8296]]},{"type":"Polygon","id":13001,"arcs":[[-8247,8419,8420,8421,-8413,-8233]]},{"type":"Polygon","id":1013,"arcs":[[-8371,8422,8423,8424,-8265,-8212]]},{"type":"Polygon","id":13243,"arcs":[[-8289,-8419,8425,8426,-8401,-8291]]},{"type":"Polygon","id":22059,"arcs":[[-8412,8427,8428,8429,-8314,-8263]]},{"type":"Polygon","id":13177,"arcs":[[-8381,8430,8431,-8416,-8295]]},{"type":"Polygon","id":28153,"arcs":[[8432,8433,8434,-8301,-8297,-8250,8435]]},{"type":"Polygon","id":28063,"arcs":[[-8375,8436,8437,8438,-8276,-8300]]},{"type":"Polygon","id":48309,"arcs":[[8439,-8307,-8269,8440,8441,8442]]},{"type":"Polygon","id":13287,"arcs":[[8443,8444,8445,8446,-8379,-8332]]},{"type":"Polygon","id":13017,"arcs":[[-8312,8447,8448,-8444,-8331]]},{"type":"Polygon","id":13321,"arcs":[[-8380,-8447,8449,8450,8451,8452,-8431]]},{"type":"Polygon","id":48347,"arcs":[[-8409,8453,8454,-8327,-8216]]},{"type":"Polygon","id":22085,"arcs":[[-8320,8455,8456,8457,-8406,-8237]]},{"type":"Polygon","id":13305,"arcs":[[-8246,-8386,8458,8459,8460,8461,-8420]]},{"type":"Polygon","id":1099,"arcs":[[-8425,8462,8463,8464,-8403,-8266]]},{"type":"Polygon","id":28067,"arcs":[[8465,8466,8467,-8304,-8302,-8435]]},{"type":"Polygon","id":48293,"arcs":[[8468,-8441,-8268,-8240,-8388,8469,8470]]},{"type":"Polygon","id":13069,"arcs":[[8471,8472,8473,8474,8475,-8448,-8311,-8415]]},{"type":"Polygon","id":22043,"arcs":[[-8430,8476,-8317,-8315]]},{"type":"Polygon","id":28031,"arcs":[[-8468,8477,8478,8479,-8376,-8305]]},{"type":"Polygon","id":13061,"arcs":[[-8427,8480,8481,8482,-8322,-8402]]},{"type":"Polygon","id":1067,"arcs":[[-8483,8483,8484,8485,-8323]]},{"type":"Polygon","id":28065,"arcs":[[8486,8487,8488,-8377,-8480]]},{"type":"Polygon","id":13155,"arcs":[[-8476,8489,8490,-8445,-8449]]},{"type":"Polygon","id":22029,"arcs":[[-8278,8491,8492,8493,8494,8495,8496,-8410]]},{"type":"Polygon","id":28077,"arcs":[[8497,8498,8499,-8373,-8378,-8489]]},{"type":"Polygon","id":1035,"arcs":[[8500,8501,-8463,-8424]]},{"type":"Polygon","id":28001,"arcs":[[8502,8503,-8492,-8277,-8439]]},{"type":"Polygon","id":4023,"arcs":[[-8210,8504,-8191]]},{"type":"Polygon","id":48333,"arcs":[[8505,8506,-8363,-8272,-8382]]},{"type":"Polygon","id":28085,"arcs":[[8507,8508,8509,8510,-8437,-8374,-8500]]},{"type":"Polygon","id":13005,"arcs":[[8511,8512,-8472,-8414,-8422]]},{"type":"Polygon","id":48099,"arcs":[[8513,-8383,-8308,-8440,8514]]},{"type":"Polygon","id":48451,"arcs":[[-8362,8515,8516,8517,8518,-8339,-8353]]},{"type":"Polygon","id":1129,"arcs":[[-8405,8519,8520,8521,-8436,-8249]]},{"type":"MultiPolygon","id":13191,"arcs":[[[8522]],[[8523,8524,-8459,-8385,-8335]]]},{"type":"Polygon","id":48289,"arcs":[[8525,8526,8527,-8470,-8387,-8355]]},{"type":"Polygon","id":48461,"arcs":[[8528,8529,8530,-8346,-8344]]},{"type":"Polygon","id":48103,"arcs":[[-8531,8531,8532,8533,-8347]]},{"type":"Polygon","id":48405,"arcs":[[8534,8535,8536,-8454,-8408]]},{"type":"Polygon","id":48383,"arcs":[[-8340,-8519,8537,8538,-8529,-8342]]},{"type":"Polygon","id":48475,"arcs":[[-8396,-8350,-8348,-8534,8539,-8398]]},{"type":"Polygon","id":13095,"arcs":[[-8453,8540,8541,8542,-8417,-8432]]},{"type":"Polygon","id":13037,"arcs":[[-8418,-8543,8543,8544,-8481,-8426]]},{"type":"Polygon","id":1045,"arcs":[[-8486,8545,8546,8547,-8366,-8324]]},{"type":"Polygon","id":1031,"arcs":[[8548,8549,-8369,-8367,-8548]]},{"type":"Polygon","id":28037,"arcs":[[-8511,8550,8551,-8503,-8438]]},{"type":"Polygon","id":48403,"arcs":[[-8458,8552,8553,-8535,-8407]]},{"type":"Polygon","id":13277,"arcs":[[-8491,8554,8555,8556,-8450,-8446]]},{"type":"Polygon","id":48225,"arcs":[[8557,8558,8559,8560,-8526,-8354,-8329]]},{"type":"Polygon","id":48095,"arcs":[[-8359,8561,8562,-8516,-8361]]},{"type":"Polygon","id":13229,"arcs":[[-8462,8563,8564,-8512,-8421]]},{"type":"Polygon","id":1039,"arcs":[[-8550,8565,8566,8567,8568,-8501,-8423,-8370]]},{"type":"Polygon","id":48235,"arcs":[[8569,8570,-8538,-8518]]},{"type":"Polygon","id":48005,"arcs":[[-8537,8571,8572,8573,8574,-8558,-8328,-8455]]},{"type":"Polygon","id":13099,"arcs":[[-8545,8575,8576,8577,8578,-8484,-8482]]},{"type":"Polygon","id":48145,"arcs":[[8579,8580,-8442,-8469,8581]]},{"type":"Polygon","id":22079,"arcs":[[-8429,8582,8583,8584,8585,-8318,-8477]]},{"type":"Polygon","id":48307,"arcs":[[-8365,8586,8587,8588,-8562,-8358]]},{"type":"Polygon","id":48411,"arcs":[[-8507,8589,8590,8591,8592,-8587,-8364]]},{"type":"Polygon","id":13019,"arcs":[[-8475,8593,8594,8595,8596,-8555,-8490]]},{"type":"Polygon","id":13299,"arcs":[[-8565,8597,8598,8599,8600,8601,8602,-8473,-8513]]},{"type":"Polygon","id":48281,"arcs":[[8603,8604,-8590,-8506,-8384,-8514]]},{"type":"MultiPolygon","id":13127,"arcs":[[[8605,8606]],[[8607,8608,8609,8610,8611,-8460,-8525]]]},{"type":"Polygon","id":13007,"arcs":[[-8542,8612,8613,8614,-8576,-8544]]},{"type":"Polygon","id":13205,"arcs":[[-8452,8615,8616,8617,8618,-8613,-8541]]},{"type":"Polygon","id":28041,"arcs":[[-8522,8619,8620,8621,-8433]]},{"type":"Polygon","id":28035,"arcs":[[8622,8623,8624,8625,-8478,-8467]]},{"type":"Polygon","id":28073,"arcs":[[-8479,-8626,8626,8627,-8487]]},{"type":"Polygon","id":28111,"arcs":[[-8434,-8622,8628,8629,-8623,-8466]]},{"type":"Polygon","id":28091,"arcs":[[-8628,8630,8631,8632,-8498,-8488]]},{"type":"Polygon","id":13003,"arcs":[[-8603,-8602,8633,8634,-8594,-8474]]},{"type":"Polygon","id":48455,"arcs":[[8635,8636,8637,-8559,-8575]]},{"type":"Polygon","id":48371,"arcs":[[-8533,8638,8639,8640,8641,-8399,-8540]]},{"type":"Polygon","id":13025,"arcs":[[-8612,8642,8643,-8598,-8564,-8461]]},{"type":"Polygon","id":28157,"arcs":[[-8552,8644,8645,8646,-8493,-8504]]},{"type":"Polygon","id":22115,"arcs":[[-8586,8647,8648,8649,-8456,-8319]]},{"type":"Polygon","id":48395,"arcs":[[8650,8651,8652,-8582,-8471,-8528]]},{"type":"Polygon","id":13075,"arcs":[[8653,8654,8655,8656,-8556,-8597]]},{"type":"Polygon","id":28005,"arcs":[[-8510,8657,8658,8659,8660,-8645,-8551]]},{"type":"Polygon","id":28113,"arcs":[[8661,8662,8663,-8658,-8509]]},{"type":"Polygon","id":28147,"arcs":[[-8633,8664,-8662,-8508,-8499]]},{"type":"Polygon","id":22009,"arcs":[[-8411,-8497,8665,8666,8667,8668,-8583,-8428]]},{"type":"Polygon","id":13071,"arcs":[[-8557,-8657,8669,8670,-8616,-8451]]},{"type":"Polygon","id":48027,"arcs":[[-8581,8671,8672,8673,-8604,-8515,-8443]]},{"type":"Polygon","id":1003,"arcs":[[-8465,8674,8675,8676,8677,8678,8679,-8520,-8404]]},{"type":"Polygon","id":1069,"arcs":[[-8579,8680,8681,8682,-8546,-8485]]},{"type":"Polygon","id":1053,"arcs":[[-8569,8683,8684,8685,-8675,-8464,-8502]]},{"type":"Polygon","id":13201,"arcs":[[-8615,8686,8687,-8577]]},{"type":"Polygon","id":1061,"arcs":[[8688,8689,8690,-8566,-8549,-8547,-8683]]},{"type":"Polygon","id":48351,"arcs":[[8691,8692,8693,8694,-8553,-8457,-8650]]},{"type":"Polygon","id":13065,"arcs":[[-8601,8695,8696,8697,8698,-8634]]},{"type":"Polygon","id":13173,"arcs":[[-8699,8699,8700,-8595,-8635]]},{"type":"Polygon","id":1097,"arcs":[[8701,8702,8703,-8620,-8521,-8680]]},{"type":"MultiPolygon","id":13039,"arcs":[[[8704]],[[8705,8706,8707,-8643,-8611]]]},{"type":"Polygon","id":48241,"arcs":[[8708,8709,8710,-8572,-8536,-8554,-8695]]},{"type":"Polygon","id":48373,"arcs":[[8711,8712,8713,8714,-8636,-8574]]},{"type":"Polygon","id":48331,"arcs":[[8715,8716,8717,-8672,-8580,-8653]]},{"type":"Polygon","id":48243,"arcs":[[8718,-8392,-8390,-8400,-8642,8719]]},{"type":"Polygon","id":48313,"arcs":[[8720,8721,8722,-8527,-8561]]},{"type":"Polygon","id":48327,"arcs":[[-8589,8723,8724,8725,-8563]]},{"type":"Polygon","id":48413,"arcs":[[-8726,8726,8727,-8570,-8517]]},{"type":"Polygon","id":48105,"arcs":[[-8530,-8539,-8571,-8728,8728,8729,8730,-8639,-8532]]},{"type":"Polygon","id":13087,"arcs":[[-8614,-8619,8731,8732,8733,-8687]]},{"type":"Polygon","id":13131,"arcs":[[8734,8735,8736,-8732,-8618]]},{"type":"Polygon","id":13027,"arcs":[[-8655,8737,8738,8739,8740,-8670,-8656]]},{"type":"Polygon","id":13275,"arcs":[[-8671,-8741,8741,8742,-8735,-8617]]},{"type":"Polygon","id":13253,"arcs":[[-8734,8743,8744,-8681,-8578,-8688]]},{"type":"Polygon","id":13049,"arcs":[[8745,8746,-8599,-8644,-8708]]},{"type":"Polygon","id":48457,"arcs":[[-8711,8747,-8712,-8573]]},{"type":"Polygon","id":48471,"arcs":[[8748,8749,8750,-8721,-8560,-8638]]},{"type":"MultiPolygon","id":22125,"arcs":[[[8751,8752,-8494,-8647,8753]]]},{"type":"Polygon","id":48053,"arcs":[[-8674,8754,8755,8756,8757,-8591,-8605]]},{"type":"Polygon","id":13185,"arcs":[[-8596,-8701,8758,8759,8760,8761,-8738,-8654]]},{"type":"Polygon","id":22077,"arcs":[[-8495,-8753,8762,8763,8764,8765,-8667,-8767]]},{"type":"Polygon","id":28109,"arcs":[[-8625,8767,8768,8769,8770,-8631,-8627]]},{"type":"Polygon","id":22117,"arcs":[[-8771,8771,8772,-8663,-8665,-8632]]},{"type":"Polygon","id":22039,"arcs":[[-8669,8773,8774,8775,8776,-8584]]},{"type":"Polygon","id":12063,"arcs":[[-8745,8777,8778,8779,8780,8781,-8689,-8682]]},{"type":"Polygon","id":22105,"arcs":[[-8773,8782,8783,8784,8785,8786,-8659,-8664]]},{"type":"Polygon","id":12033,"arcs":[[8787,-8676,-8686,8788]]},{"type":"Polygon","id":12113,"arcs":[[8789,8790,-8789,-8685]]},{"type":"Polygon","id":28039,"arcs":[[-8704,8791,8792,-8629,-8621]]},{"type":"Polygon","id":22091,"arcs":[[-8787,8793,8794,8795,-8660]]},{"type":"MultiPolygon","id":12091,"arcs":[[[-8568,8796,8797,-8790,-8684]]]},{"type":"Polygon","id":22037,"arcs":[[-8796,8798,8799,-8754,-8646,-8661]]},{"type":"Polygon","id":12059,"arcs":[[-8782,8800,8801,-8690]]},{"type":"Polygon","id":12131,"arcs":[[-8691,-8802,8802,8803,8804,-8806,8806,-8797,-8567]]},{"type":"Polygon","id":48041,"arcs":[[8807,8808,8809,-8651,-8723]]},{"type":"Polygon","id":48319,"arcs":[[-8593,8810,8811,8812,-8724,-8588]]},{"type":"Polygon","id":48299,"arcs":[[-8758,8813,8814,-8811,-8592]]},{"type":"Polygon","id":28131,"arcs":[[-8793,8815,8816,-8768,-8624,-8630]]},{"type":"Polygon","id":48491,"arcs":[[8817,8818,8819,-8755,-8673,-8718]]},{"type":"Polygon","id":48407,"arcs":[[-8715,8820,8821,-8749,-8637]]},{"type":"Polygon","id":22003,"arcs":[[-8777,8822,8823,-8648,-8585]]},{"type":"Polygon","id":22011,"arcs":[[-8824,8824,8825,-8692,-8649]]},{"type":"Polygon","id":13101,"arcs":[[8826,8827,-8759,-8700,-8698]]},{"type":"Polygon","id":48185,"arcs":[[-8751,8828,8829,8830,-8808,-8722]]},{"type":"Polygon","id":22097,"arcs":[[-8766,8831,8832,8833,-8774,-8668]]},{"type":"Polygon","id":12133,"arcs":[[8834,-8803,-8801,-8781]]},{"type":"Polygon","id":12089,"arcs":[[-8707,8835,8836,8837,-8746]]},{"type":"Polygon","id":28059,"arcs":[[-8703,8838,8839,-8816,-8792]]},{"type":"Polygon","id":48051,"arcs":[[-8810,8840,8841,-8716,-8652]]},{"type":"Polygon","id":22033,"arcs":[[8842,8843,8844,8845,-8799,-8795]]},{"type":"Polygon","id":22103,"arcs":[[-8770,8846,8847,8848,8849,-8783,-8772]]},{"type":"Polygon","id":12039,"arcs":[[-8737,8850,8851,-8778,-8744,-8733]]},{"type":"Polygon","id":48267,"arcs":[[8852,8853,8854,8855,-8725,-8813]]},{"type":"Polygon","id":48435,"arcs":[[-8856,8856,8857,-8729,-8727]]},{"type":"Polygon","id":12073,"arcs":[[-8743,8858,8859,8860,-8851,-8736]]},{"type":"Polygon","id":28047,"arcs":[[-8840,8861,8862,-8817]]},{"type":"Polygon","id":12065,"arcs":[[-8740,8863,8864,8865,8866,-8859,-8742]]},{"type":"Polygon","id":48043,"arcs":[[8867,-8720,-8641,8868,8869]]},{"type":"Polygon","id":22121,"arcs":[[8870,-8763,-8752,-8800,-8846]]},{"type":"Polygon","id":48443,"arcs":[[8871,8872,-8869,-8640,-8731]]},{"type":"Polygon","id":22063,"arcs":[[-8786,8873,8874,-8843,-8794]]},{"type":"Polygon","id":12079,"arcs":[[-8762,8875,8876,8877,8878,8879,-8864,-8739]]},{"type":"Polygon","id":28045,"arcs":[[-8863,8880,-8847,-8769]]},{"type":"Polygon","id":12047,"arcs":[[-8828,8881,8882,-8877,-8760]]},{"type":"Polygon","id":48377,"arcs":[[-8868,8883,-8719]]},{"type":"Polygon","id":48339,"arcs":[[-8822,8884,8885,8886,-8829,-8750]]},{"type":"Polygon","id":48453,"arcs":[[8887,8888,8889,8890,-8756,-8820]]},{"type":"Polygon","id":12013,"arcs":[[8891,8892,8893,-8779]]},{"type":"Polygon","id":12077,"arcs":[[-8861,8894,8895,8896,-8892,-8852]]},{"type":"Polygon","id":12023,"arcs":[[-8697,8897,8898,8899,8900,8901,-8882,-8827]]},{"type":"MultiPolygon","id":12031,"arcs":[[[8902,8903]],[[8904,8905]],[[8906,8907,8908,-8837]]]},{"type":"Polygon","id":12003,"arcs":[[-8838,-8909,8909,8910,8911,-8898,-8696,-8600,-8747]]},{"type":"MultiPolygon","id":12005,"arcs":[[[8912,8913]],[[-8894,8914,8915,-8804,-8835,-8780]]]},{"type":"Polygon","id":48287,"arcs":[[8916,8917,8918,-8818,-8717,-8842]]},{"type":"Polygon","id":48199,"arcs":[[-8710,8919,8920,8921,-8713,-8748]]},{"type":"Polygon","id":48171,"arcs":[[-8815,8922,8923,8924,-8853,-8812]]},{"type":"Polygon","id":48031,"arcs":[[-8757,-8891,8925,8926,8927,-8923,-8814]]},{"type":"MultiPolygon","id":22099,"arcs":[[[8928,8929,8930]],[[8931,8932,-8832,-8765,8933]]]},{"type":"Polygon","id":22047,"arcs":[[-8871,-8845,8934,8935,8936,-8934,-8764]]},{"type":"Polygon","id":48291,"arcs":[[-8922,8937,8938,8939,-8885,-8821,-8714]]},{"type":"Polygon","id":22019,"arcs":[[8940,8941,8942,-8693,-8826]]},{"type":"Polygon","id":22053,"arcs":[[-8776,8943,8944,8945,8946,-8941,-8825,-8823]]},{"type":"Polygon","id":22001,"arcs":[[-8834,8947,8948,8949,-8945,-8944,-8775]]},{"type":"Polygon","id":12121,"arcs":[[-8902,8950,8951,-8878,-8883]]},{"type":"Polygon","id":48021,"arcs":[[8952,8953,-8888,-8819,-8919]]},{"type":"Polygon","id":48477,"arcs":[[-8831,8954,8955,8956,-8917,-8841,-8809]]},{"type":"Polygon","id":22055,"arcs":[[-8933,8957,8958,-8948,-8833]]},{"type":"Polygon","id":48209,"arcs":[[8959,8960,-8926,-8890,8961]]},{"type":"Polygon","id":22005,"arcs":[[-8875,8962,8963,8964,8965,-8935,-8844]]},{"type":"Polygon","id":12123,"arcs":[[8966,8967,8968,-8865,-8880]]},{"type":"Polygon","id":12129,"arcs":[[-8867,8969,8970,-8895,-8860]]},{"type":"Polygon","id":22095,"arcs":[[8971,8972,8973,8974,-8963,-8874,-8785]]},{"type":"Polygon","id":48465,"arcs":[[-8858,8975,8976,8977,-8872,-8730]]},{"type":"Polygon","id":48137,"arcs":[[8978,8979,8980,8981,-8976,-8857,-8855]]},{"type":"Polygon","id":48265,"arcs":[[8982,8983,8984,-8979,-8854,-8925]]},{"type":"Polygon","id":12067,"arcs":[[-8952,8985,8986,-8967,-8879]]},{"type":"MultiPolygon","id":12109,"arcs":[[[8987,8988,8989,8990,8991,-8903,8992]],[[-8905,8993]]]},{"type":"Polygon","id":48361,"arcs":[[-8943,8994,8995,-8920,-8709,-8694]]},{"type":"Polygon","id":48473,"arcs":[[8996,8997,8998,-8955,-8830,-8887]]},{"type":"Polygon","id":22089,"arcs":[[8999,-8972,9000]]},{"type":"Polygon","id":22051,"arcs":[[9001,9002,9003,9004,-9001,-8784,-8850]]},{"type":"Polygon","id":12045,"arcs":[[-8897,9005,9006,9007,9008,-8913,9009,-8915,-8893]]},{"type":"Polygon","id":22071,"arcs":[[9010,9011,9012,-9002,-8849]]},{"type":"Polygon","id":12019,"arcs":[[9013,9014,9015,-8910,-8908]]},{"type":"Polygon","id":48245,"arcs":[[-8996,9016,9017,9018,-8938,-8921]]},{"type":"Polygon","id":48201,"arcs":[[-8940,9019,9020,9021,9022,9023,-8997,-8886]]},{"type":"MultiPolygon","id":22087,"arcs":[[[9024,9025,9026,-9012,9027]],[[9028]]]},{"type":"Polygon","id":22093,"arcs":[[9029,9030,-8965,-8964,-8975]]},{"type":"Polygon","id":48149,"arcs":[[9031,9032,9033,9034,9035,-8953,-8918,-8957]]},{"type":"Polygon","id":22113,"arcs":[[-8959,9036,9037,9038,-8946,-8950,-8949]]},{"type":"Polygon","id":12007,"arcs":[[-9016,9039,9040,9041,-8911]]},{"type":"Polygon","id":12125,"arcs":[[-9042,9042,-8899,-8912]]},{"type":"Polygon","id":48259,"arcs":[[-8928,9043,9044,9045,-8983,-8924]]},{"type":"MultiPolygon","id":22045,"arcs":[[[9046]],[[-8937,9047,-8930,9048,9049,-9037,-8958,-8932]]]},{"type":"Polygon","id":48015,"arcs":[[-8999,9050,9051,9052,-9032,-8956]]},{"type":"Polygon","id":22007,"arcs":[[-8965,8964,-9031,9053,9054,9055,-8931,-9048,-8936,-8966]]},{"type":"Polygon","id":48385,"arcs":[[-8985,9056,9057,-8980]]},{"type":"Polygon","id":48055,"arcs":[[-8954,-9036,9058,9059,-8962,-8889]]},{"type":"Polygon","id":22023,"arcs":[[-8947,-9039,9060,-9017,-8995,-8942]]},{"type":"Polygon","id":48091,"arcs":[[9061,9062,-9044,-8927,-8961]]},{"type":"MultiPolygon","id":12037,"arcs":[[[9063]],[[-9008,9064]],[[-8971,9065,-9006,-8896]]]},{"type":"Polygon","id":48089,"arcs":[[9066,9067,9068,-9033,-9053]]},{"type":"Polygon","id":22101,"arcs":[[-9056,9069,9070,-9049,-8929]]},{"type":"Polygon","id":12001,"arcs":[[-9041,9071,9072,9073,9074,-8900,-9043]]},{"type":"Polygon","id":12041,"arcs":[[-9075,9075,9076,-8986,-8951,-8901]]},{"type":"Polygon","id":22057,"arcs":[[9077,9078,9079,9080,9081,9082,9083,-9054,-9030,-8974,-8973,-9000,-9005,9084]]},{"type":"Polygon","id":48019,"arcs":[[9085,-9057,-8984,-9046,9086,9087]]},{"type":"MultiPolygon","id":22075,"arcs":[[[9088]],[[-9003,-9013,-9027,9089]]]},{"type":"Polygon","id":48071,"arcs":[[-9019,9090,9091,9092,-9020,-8939]]},{"type":"Polygon","id":48187,"arcs":[[9093,9094,9095,-9062,-8960,-9060]]},{"type":"MultiPolygon","id":12107,"arcs":[[[-8991,9096,9097,9098]],[[9099,9100,-9072,-9040,-9015]]]},{"type":"Polygon","id":48157,"arcs":[[9101,9102,9103,-9051,-8998,-9024]]},{"type":"Polygon","id":48177,"arcs":[[9104,9105,9106,9107,-9094,-9059,-9035]]},{"type":"MultiPolygon","id":22109,"arcs":[[[9108]],[[-9070,-9055,-9084,9109]]]},{"type":"Polygon","id":48029,"arcs":[[-9096,9110,9111,9112,-9087,-9045,-9063]]},{"type":"Polygon","id":48325,"arcs":[[9113,9114,9115,-9088,-9113]]},{"type":"Polygon","id":12035,"arcs":[[9116,9117,-9097,-8990]]},{"type":"Polygon","id":48481,"arcs":[[-9104,9118,9119,9120,-9067,-9052]]},{"type":"Polygon","id":48285,"arcs":[[9121,9122,9123,-9105,-9034,-9069]]},{"type":"Polygon","id":48463,"arcs":[[-9116,9124,9125,-8981,-9058,-9086]]},{"type":"Polygon","id":48271,"arcs":[[-9126,9126,9127,-8977,-8982]]},{"type":"MultiPolygon","id":48167,"arcs":[[[9128]],[[9129,-9022,9130]],[[9131,-9092]]]},{"type":"Polygon","id":48039,"arcs":[[-9130,9132,9133,-9119,-9103,-9102,-9023]]},{"type":"Polygon","id":12075,"arcs":[[-9074,9134,9135,9136,9137,9138,-9076]]},{"type":"Polygon","id":12083,"arcs":[[9139,9140,9141,9142,-9135,-9073,-9101]]},{"type":"Polygon","id":48493,"arcs":[[-9108,9143,9144,-9111,-9095]]},{"type":"MultiPolygon","id":12127,"arcs":[[[9145,9146,9147,9148,9149,9150,9151,9152,-9098,-9118,9153]]]},{"type":"Polygon","id":48123,"arcs":[[9154,9155,-9106,-9124,9156]]},{"type":"Polygon","id":12069,"arcs":[[-9152,-9151,9157,9158,9159,9160,-9141,9161]]},{"type":"Polygon","id":48239,"arcs":[[9162,9163,9164,9165,9166,9167,9168,9169,-9122,-9068,-9121]]},{"type":"Polygon","id":48013,"arcs":[[9170,9171,-9114,-9112,-9145,9172,9173]]},{"type":"Polygon","id":48321,"arcs":[[9174,-9163,-9120,-9134,9175]]},{"type":"Polygon","id":48255,"arcs":[[9176,9177,-9173,-9144,-9107,-9156,9178]]},{"type":"Polygon","id":48469,"arcs":[[-9170,9179,9180,9181,9182,-9157,-9123]]},{"type":"Polygon","id":48163,"arcs":[[-9172,9183,9184,9185,-9115]]},{"type":"Polygon","id":48507,"arcs":[[-9186,9186,9187,-9125]]},{"type":"Polygon","id":48323,"arcs":[[-9188,9188,9189,9190,-9127]]},{"type":"Polygon","id":12017,"arcs":[[-9136,-9143,9191,9192,9193]]},{"type":"Polygon","id":12119,"arcs":[[-9161,9194,9195,9196,-9192,-9142]]},{"type":"Polygon","id":48175,"arcs":[[-9183,9197,9198,-9179,-9155]]},{"type":"Polygon","id":12117,"arcs":[[-9149,9199,-9158,-9150]]},{"type":"MultiPolygon","id":12009,"arcs":[[[9200,9201,9202,9203,-9148]],[[9204,9205,9206,-9146]]]},{"type":"Polygon","id":48297,"arcs":[[9207,9208,9209,-9174,-9178,9210,9211]]},{"type":"Polygon","id":12095,"arcs":[[-9200,-9204,9212,-9159]]},{"type":"MultiPolygon","id":48057,"arcs":[[[9213,9214]],[[9215,-9181,9216]],[[-9166,9217]]]},{"type":"Polygon","id":48025,"arcs":[[-9199,9218,9219,-9211,-9177]]},{"type":"Polygon","id":12053,"arcs":[[-9197,9220,9221,-9193]]},{"type":"Polygon","id":48283,"arcs":[[9222,9223,9224,-9184]]},{"type":"Polygon","id":48311,"arcs":[[-9210,9225,-9223,-9171]]},{"type":"Polygon","id":48127,"arcs":[[-9185,-9225,9226,-9189,-9187]]},{"type":"Polygon","id":48391,"arcs":[[-9216,9227,9228,9229,9230,9231,-9219,-9198,-9182]]},{"type":"Polygon","id":12101,"arcs":[[-9196,9232,9233,9234,9235,-9221]]},{"type":"Polygon","id":12105,"arcs":[[9236,9237,9238,9239,-9233,-9195,-9160]]},{"type":"Polygon","id":12097,"arcs":[[-9203,9240,9241,-9237,-9213]]},{"type":"MultiPolygon","id":48007,"arcs":[[[9242]],[[9243,9244,-9231]],[[9245,9246]],[[-9229,9247,9248,9249]]]},{"type":"Polygon","id":48479,"arcs":[[9250,9251,9252,9253,-9190,-9227,-9224]]},{"type":"Polygon","id":48409,"arcs":[[-9245,9254,-9246,9255,9256,9257,9258,9259,9260,-9212,-9220,-9232]]},{"type":"Polygon","id":12103,"arcs":[[9261,9262,-9235]]},{"type":"Polygon","id":12057,"arcs":[[-9240,9263,9264,-9262,-9234]]},{"type":"Polygon","id":48131,"arcs":[[9265,9266,9267,-9251,-9226,-9209]]},{"type":"Polygon","id":48249,"arcs":[[-9261,-9260,9268,9269,9270,-9266,-9208]]},{"type":"MultiPolygon","id":48355,"arcs":[[[9271]],[[9272,-9269,-9259,9273]]]},{"type":"MultiPolygon","id":12061,"arcs":[[[9274,9275,-9241,-9202,9276]]]},{"type":"Polygon","id":12055,"arcs":[[9277,9278,9279,9280,-9238]]},{"type":"Polygon","id":12049,"arcs":[[-9281,9281,9282,-9239]]},{"type":"Polygon","id":12081,"arcs":[[-9283,9283,9284,9285,-9264]]},{"type":"Polygon","id":12093,"arcs":[[-9276,9286,9287,9288,-9278,-9242]]},{"type":"MultiPolygon","id":48273,"arcs":[[[9289,9290,9291,9292]],[[9293,9294,9295,-9270,-9273]]]},{"type":"Polygon","id":12111,"arcs":[[9296,9297,9298,9299,-9287,-9275]]},{"type":"Polygon","id":12115,"arcs":[[-9285,9300,9301,9302,9303,9304]]},{"type":"Polygon","id":48247,"arcs":[[9305,9306,9307,-9252,-9268]]},{"type":"Polygon","id":12027,"arcs":[[-9280,9308,-9301,-9284,-9282]]},{"type":"Polygon","id":48505,"arcs":[[-9308,9309,9310,-9253]]},{"type":"MultiPolygon","id":48261,"arcs":[[[9311,9312]],[[9313,-9290,9314]],[[9315,9316,9317,-9295,9318]]]},{"type":"Polygon","id":48047,"arcs":[[-9271,-9296,-9318,9319,9320,-9306,-9267]]},{"type":"MultiPolygon","id":12085,"arcs":[[[9321,9322,9323,9324,9325,-9288,-9300,9326]]]},{"type":"Polygon","id":12043,"arcs":[[9327,9328,-9279,-9289]]},{"type":"MultiPolygon","id":12015,"arcs":[[[-9304,9329]],[[-9329,9330,9331,-9302,-9309]]]},{"type":"Polygon","id":12099,"arcs":[[9332,9333,9334,-9326]]},{"type":"Polygon","id":12051,"arcs":[[9335,9336,9337,-9328,-9335]]},{"type":"MultiPolygon","id":12071,"arcs":[[[9338]],[[-9338,9339,9340,-9331]]]},{"type":"Polygon","id":48427,"arcs":[[-9321,9341,9342,-9310,-9307]]},{"type":"Polygon","id":48215,"arcs":[[-9317,9343,9344,9345,-9342,-9320]]},{"type":"Polygon","id":48489,"arcs":[[9346,-9344,-9316,9347]]},{"type":"MultiPolygon","id":12021,"arcs":[[[9348,9349,9350,9351,-9340,-9337]]]},{"type":"Polygon","id":48061,"arcs":[[-9345,-9347,9352]]},{"type":"Polygon","id":12011,"arcs":[[9353,9354,-9349,-9336,-9334]]},{"type":"Polygon","id":12086,"arcs":[[9355,9356,9357,9358,9359,-9350,-9355,9360]]},{"type":"MultiPolygon","id":12087,"arcs":[[[9361]],[[-9360,9362,-9351]]]},{"type":"Polygon","id":4015,"arcs":[[-5737,-6670,-7308,-6521,-5912,-4625,-5343,-5417]]},{"type":"Polygon","id":12029,"arcs":[[-9077,-9139,9363,-8968,-8987]]},{"type":"Polygon","id":27077,"arcs":[[-125,-180,-108,9364]]},{"type":"Polygon","id":27031,"arcs":[[9365,-203,9366]]},{"type":"Polygon","id":55031,"arcs":[[9367,-675,-668,-593,-474,-148,9368]]},{"type":"Polygon","id":55007,"arcs":[[9369,-673,-9368,9370]]},{"type":"Polygon","id":55003,"arcs":[[-561,-721,-669,-9370,9371]]},{"type":"Polygon","id":55003,"arcs":[[9372]]},{"type":"Polygon","id":26083,"arcs":[[9373,9374,9375]]},{"type":"Polygon","id":26083,"arcs":[[9376]]},{"type":"Polygon","id":26061,"arcs":[[9377,-446,-592,-436,9378]]},{"type":"Polygon","id":26061,"arcs":[[9379,-9375]]},{"type":"Polygon","id":26103,"arcs":[[9380,9381,-716,-642,-586,-444,9382]]},{"type":"Polygon","id":26003,"arcs":[[-577,9383,-9381,9384,-491]]},{"type":"Polygon","id":26041,"arcs":[[-9384,-576,9385,-712,-9382]]},{"type":"Polygon","id":55075,"arcs":[[-715,9386,-879,-687,-704,-640]]},{"type":"Polygon","id":55029,"arcs":[[-1169,9387]]},{"type":"Polygon","id":26033,"arcs":[[9388,9389]]},{"type":"Polygon","id":26033,"arcs":[[9390]]},{"type":"Polygon","id":26033,"arcs":[[9391,9392,9393,-488,9394]]},{"type":"Polygon","id":26097,"arcs":[[9395]]},{"type":"Polygon","id":26097,"arcs":[[9396,9397,-574,-489,-9394]]},{"type":"Polygon","id":26047,"arcs":[[-771,9398,9399]]},{"type":"Polygon","id":26029,"arcs":[[-9399,-770,-953,-950,9400]]},{"type":"Polygon","id":26029,"arcs":[[9401]]},{"type":"Polygon","id":26089,"arcs":[[9402]]},{"type":"Polygon","id":26089,"arcs":[[9403,-1114,9404]]},{"type":"Polygon","id":26055,"arcs":[[-948,-1082,-1230,-1111,-9404,9405]]},{"type":"Polygon","id":26007,"arcs":[[9406,-1079,-954,-819]]},{"type":"Polygon","id":26011,"arcs":[[9407,-1439,-1400,-1240,-1238]]},{"type":"Polygon","id":26063,"arcs":[[-1578,-1556,9408]]},{"type":"Polygon","id":26147,"arcs":[[-1931,-1726,-1576,9409]]},{"type":"Polygon","id":26163,"arcs":[[9410,9411,-2133,-1932,-1929]]},{"type":"Polygon","id":26115,"arcs":[[9412,-2505,-2280,-2130,-9412]]},{"type":"MultiPolygon","id":45019,"arcs":[[[9413,9414,9415,-7862,-7809,-7695]],[[-7693,-7590,9416]]]},{"type":"Polygon","id":15001,"arcs":[[9417]]},{"type":"Polygon","id":15007,"arcs":[[9418]]},{"type":"Polygon","id":15009,"arcs":[[-9420,9420]]},{"type":"Polygon","id":15009,"arcs":[[9421]]},{"type":"Polygon","id":15009,"arcs":[[9422]]},{"type":"Polygon","id":15009,"arcs":[[9423]]},{"type":"Polygon","id":15003,"arcs":[[9424]]},{"type":"Polygon","id":15007,"arcs":[[9425]]},{"type":"MultiPolygon","id":2016,"arcs":[[[9426]],[[9427]],[[9428]],[[9429]],[[9430]],[[9431]],[[9432]],[[9433]],[[9434]],[[9435]],[[9436]],[[9437]],[[9438]],[[9439]],[[9440]],[[9441]],[[9442]],[[9443]],[[9444]],[[9445]],[[9446]],[[9447]],[[9448]],[[9449]]]},{"type":"MultiPolygon","id":2013,"arcs":[[[9450]],[[9451]],[[9452]],[[9453]],[[9454]],[[9455]],[[9456]],[[9457]],[[9458]],[[9459]],[[9460]],[[9461]],[[9462,9463,9464,9465]]]},{"type":"MultiPolygon","id":2130,"arcs":[[[9466]],[[9467]]]},{"type":"Polygon","id":2060,"arcs":[[9468,9469]]},{"type":"MultiPolygon","id":2070,"arcs":[[[9470]],[[9471,9472]],[[9473,9474,9475]]]},{"type":"MultiPolygon","id":2164,"arcs":[[[9476]],[[9477,9478,9479,-9465,9480,-9470,9481,-9475,9482]]]},{"type":"MultiPolygon","id":2150,"arcs":[[[9483]],[[9484]],[[9485]],[[9486]],[[9487]],[[9488]],[[9489]],[[9490]],[[9491]],[[9492]],[[9493,-9479,9494,9495]]]},{"type":"MultiPolygon","id":2110,"arcs":[[[9496,9497,9498,9499]],[[9500]],[[9501,9502,9503,9504,9505,9506]],[[9507,9508]]]},{"type":"MultiPolygon","id":2280,"arcs":[[[9509]],[[9510]],[[9511]],[[9512]],[[9513]],[[9514]],[[9515]],[[9516,9517,9518,9519]]]},{"type":"MultiPolygon","id":2232,"arcs":[[[9520,9521,9522,9523]],[[9524]],[[-9520,9525,9526,9527,-9503,9528]],[[-9497,9529,9530,9531]],[[9532,9533]],[[-9499,9534]],[[9535,9536,9537,9538]],[[9539,9540,9541,9542]]]},{"type":"MultiPolygon","id":2100,"arcs":[[[-9507,9543,-9508,9544,-9540,9545]],[[9546,-9538,9547,-9542]]]},{"type":"MultiPolygon","id":2220,"arcs":[[[9548]],[[9549,9550]],[[-9521,9551,-9533,9552]]]},{"type":"MultiPolygon","id":2270,"arcs":[[[9553]],[[9554]],[[9555]],[[9556,9557,9558,9559]]]},{"type":"MultiPolygon","id":2050,"arcs":[[[9560]],[[9561]],[[9562]],[[9563]],[[-9559,9564,9565,9566,-9483,-9474,9567,-9473,9568]]]},{"type":"Polygon","id":2170,"arcs":[[9569,9570,9571,9572,-9566,9573,9574,9575]]},{"type":"Polygon","id":2068,"arcs":[[9576,9577,-9575,9578]]},{"type":"Polygon","id":2020,"arcs":[[-9571,9579,9580,9581]]},{"type":"MultiPolygon","id":2261,"arcs":[[[9582]],[[9583]],[[9584]],[[9585]],[[9586]],[[9587]],[[9588]],[[9589]],[[9590,9591]],[[9592]],[[9593]],[[9594]],[[9595,9596]],[[9597]],[[9598,-9580,-9570,9599,9600,9601,9602]]]},{"type":"MultiPolygon","id":2122,"arcs":[[[9603]],[[9604]],[[9605]],[[-9581,-9599,9606,-9596,9607,-9591,9608]],[[-9495,-9478,-9567,-9573,9609]]]},{"type":"Polygon","id":2282,"arcs":[[-9602,9610,-9536,9611]]},{"type":"Polygon","id":2290,"arcs":[[9612,9613,9614,-9579,-9574,-9565,-9558,9615,9616,9617]]},{"type":"Polygon","id":2090,"arcs":[[9618,-9577,-9615]]},{"type":"Polygon","id":2240,"arcs":[[-9600,-9576,-9578,-9619,-9614,9619]]},{"type":"MultiPolygon","id":2185,"arcs":[[[9620]],[[-9618,9621,9622]]]},{"type":"Polygon","id":2188,"arcs":[[-9617,9623,9624,-9622]]},{"type":"MultiPolygon","id":2180,"arcs":[[[9625]],[[9626]],[[9627]],[[-9624,-9616,-9557,9628]]]},{"type":"Polygon","id":2201,"arcs":[[9629]]},{"type":"Polygon","id":2201,"arcs":[[9630]]},{"type":"Polygon","id":2201,"arcs":[[9631]]},{"type":"Polygon","id":2201,"arcs":[[9632]]},{"type":"Polygon","id":2201,"arcs":[[9633]]},{"type":"Polygon","id":2201,"arcs":[[9634]]},{"type":"Polygon","id":2201,"arcs":[[9635]]},{"type":"Polygon","id":2201,"arcs":[[9636]]},{"type":"Polygon","id":2201,"arcs":[[9637]]},{"type":"Polygon","id":2201,"arcs":[[9638]]},{"type":"Polygon","id":2201,"arcs":[[9639]]},{"type":"Polygon","id":2201,"arcs":[[9640]]},{"type":"Polygon","id":2201,"arcs":[[9641]]},{"type":"Polygon","id":2201,"arcs":[[9642]]},{"type":"Polygon","id":2201,"arcs":[[9643]]},{"type":"Polygon","id":2201,"arcs":[[-9518,9644]]},{"type":"Polygon","id":72125,"arcs":[[9645,9646,9647,9648,9649,9650]]},{"type":"Polygon","id":72003,"arcs":[[9651,9652,9653,9654,9655]]},{"type":"Polygon","id":72097,"arcs":[[9656,9657,-9651,9658,9659,9660,9661]]},{"type":"Polygon","id":72065,"arcs":[[9662,9663,9664,9665,9666]]},{"type":"Polygon","id":72055,"arcs":[[9667,9668,9669,9670]]},{"type":"Polygon","id":72083,"arcs":[[9671,9672,-9657,9673,9674]]},{"type":"Polygon","id":72025,"arcs":[[9675,9676,9677,9678,9679,9680,9681]]},{"type":"Polygon","id":72045,"arcs":[[9682,9683,9684,9685,9686]]},{"type":"Polygon","id":72133,"arcs":[[9687,9688,9689,9690]]},{"type":"Polygon","id":72121,"arcs":[[-9671,9691,-9647,9692,9693]]},{"type":"Polygon","id":72027,"arcs":[[-9666,9694,9695,9696,9697]]},{"type":"Polygon","id":72001,"arcs":[[9698,9699,9700,9701,9702,9703]]},{"type":"Polygon","id":72111,"arcs":[[9704,9705,9706,-9700]]},{"type":"Polygon","id":72047,"arcs":[[9707,9708,9709,9710,9711,9712]]},{"type":"Polygon","id":72091,"arcs":[[9713,9714,9715,9716,9717,9718]]},{"type":"Polygon","id":72013,"arcs":[[9719,9720,9721,9722,-9663,9723]]},{"type":"Polygon","id":72145,"arcs":[[9724,9725,-9714,9726]]},{"type":"Polygon","id":72031,"arcs":[[9727,9728,9729,9730,9731,9732]]},{"type":"Polygon","id":72061,"arcs":[[9733,9734,9735,9736,9737]]},{"type":"Polygon","id":72129,"arcs":[[9738,9739,9740,9741,9742,-9678,9743]]},{"type":"Polygon","id":72075,"arcs":[[9744,9745,-9691,9746,9747,9748,9749]]},{"type":"Polygon","id":72063,"arcs":[[-9729,9750,-9744,-9677,9751]]},{"type":"Polygon","id":72073,"arcs":[[9752,-9749,9753,9754,9755]]},{"type":"Polygon","id":72143,"arcs":[[9756,9757,-9712,9758,-9725,9759]]},{"type":"Polygon","id":72011,"arcs":[[9760,-9674,-9662,9761,9762,-9653,9763]]},{"type":"Polygon","id":72081,"arcs":[[-9665,9764,-9703,9765,9766,-9672,9767,-9695]]},{"type":"Polygon","id":72079,"arcs":[[-9692,-9670,9768,9769,-9648]]},{"type":"Polygon","id":72009,"arcs":[[9770,9771,9772,9773,9774]]},{"type":"Polygon","id":72099,"arcs":[[9775,9776,-9764,-9652,9777]]},{"type":"Polygon","id":72023,"arcs":[[9778,-9649,-9770,9779,-9660]]},{"type":"Polygon","id":72109,"arcs":[[9780,9781,9782,-9784,9784,9785,-9742]]},{"type":"Polygon","id":72101,"arcs":[[-9759,-9711,9786,9787,-9715,-9726]]},{"type":"Polygon","id":72005,"arcs":[[-9778,-9656,9788,9789]]},{"type":"Polygon","id":72059,"arcs":[[-9707,9790,9791,-9701]]},{"type":"Polygon","id":72021,"arcs":[[-9736,9792,-9683,9793,9794,9795,9796]]},{"type":"Polygon","id":72141,"arcs":[[9797,-9755,9798,-9704,-9765,-9664,-9723]]},{"type":"Polygon","id":72041,"arcs":[[-9680,9799,-9775,9800,-9685,9801]]},{"type":"Polygon","id":72123,"arcs":[[9802,9803,-9689,9804,-9772,9805]]},{"type":"Polygon","id":72131,"arcs":[[9806,-9696,-9768,-9675,-9761,-9777,9807]]},{"type":"Polygon","id":72035,"arcs":[[-9743,-9786,9808,-9806,-9771,-9800,-9679]]},{"type":"Polygon","id":72135,"arcs":[[-9795,9809,-9713,-9758,9810,9811]]},{"type":"Polygon","id":72115,"arcs":[[-9697,-9807,9812,9813]]},{"type":"Polygon","id":72054,"arcs":[[-9717,9814,-9721,9815]]},{"type":"Polygon","id":72105,"arcs":[[-9794,-9687,9816,-9708,-9810]]},{"type":"Polygon","id":72017,"arcs":[[-9718,-9816,-9720,9817]]},{"type":"Polygon","id":72127,"arcs":[[-9731,9818,-9682,9819,-9734,9820]]},{"type":"Polygon","id":72139,"arcs":[[-9730,-9752,-9676,-9819]]},{"type":"Polygon","id":72057,"arcs":[[-9785,-9822,9822,-9803,-9809]]},{"type":"Polygon","id":72153,"arcs":[[-9702,-9792,9823,-9668,-9694,9824,-9766]]},{"type":"Polygon","id":72043,"arcs":[[9825,9826,-9773,-9805,-9688,-9746,9827]]},{"type":"Polygon","id":72149,"arcs":[[-9828,-9745,9828]]},{"type":"Polygon","id":72039,"arcs":[[-9788,9829,-9756,-9798,-9722,-9815,-9716]]},{"type":"Polygon","id":72113,"arcs":[[-9748,9830,-9705,-9699,-9799,-9754]]},{"type":"Polygon","id":72107,"arcs":[[9831,-9826,-9829,-9750,-9753,-9830,-9787,-9710]]},{"type":"Polygon","id":72071,"arcs":[[-9813,-9808,-9776,-9790,9832]]},{"type":"Polygon","id":72007,"arcs":[[-9681,-9802,-9684,-9793,-9735,-9820]]},{"type":"Polygon","id":72019,"arcs":[[-9686,-9801,-9774,-9827,-9832,-9709,-9817]]},{"type":"Polygon","id":72093,"arcs":[[-9767,-9825,-9693,-9646,-9658,-9673]]},{"type":"Polygon","id":72151,"arcs":[[9833,9834,9835,-9781,-9741,9836]]},{"type":"Polygon","id":72137,"arcs":[[9837,-9796,-9812,9838,9839]]},{"type":"Polygon","id":78030,"arcs":[[9840]]},{"type":"Polygon","id":72089,"arcs":[[9841,9842,9843,9844]]},{"type":"Polygon","id":72087,"arcs":[[9845,9846,-9733,9847]]},{"type":"Polygon","id":72095,"arcs":[[9848,-9782,-9836]]},{"type":"Polygon","id":72119,"arcs":[[-9844,9849,9850,9851,9852,-9846,9853]]},{"type":"Polygon","id":72103,"arcs":[[9854,9855,9856,9857,-9851]]},{"type":"Polygon","id":72085,"arcs":[[-9858,9858,-9837,-9740,9859,9860,-9852]]},{"type":"Polygon","id":72029,"arcs":[[-9853,-9861,9861,-9728,-9847]]},{"type":"Polygon","id":72053,"arcs":[[9862,-9842,9863]]},{"type":"Polygon","id":72077,"arcs":[[-9860,-9739,-9751,-9862]]},{"type":"Polygon","id":72037,"arcs":[[9864,-9855,-9850,-9843,-9863]]},{"type":"Polygon","id":72069,"arcs":[[9865,-9834,-9859,-9857]]},{"type":"Polygon","id":72147,"arcs":[[9866]]},{"type":"Polygon","id":78010,"arcs":[[9867]]},{"type":"Polygon","id":72051,"arcs":[[-9839,-9811,-9757,9868]]}]},"states":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","id":2,"arcs":[[[9426]],[[9427]],[[9428]],[[9429]],[[9430]],[[9431]],[[9432]],[[9433]],[[9434]],[[9435]],[[9436]],[[9437]],[[9438]],[[9439]],[[9440]],[[9441]],[[9442]],[[9443]],[[9444]],[[9445]],[[9446]],[[9447]],[[9450]],[[9451]],[[9452]],[[9453]],[[9629]],[[9454]],[[9630]],[[9455]],[[9456]],[[9631]],[[9457]],[[9632]],[[9633]],[[9458]],[[9634]],[[9459]],[[9460]],[[9466]],[[9635]],[[9461]],[[9636]],[[9637]],[[9638]],[[9639]],[[9483]],[[9640]],[[9509]],[[9467]],[[9641]],[[9642]],[[9510]],[[9643]],[[9511]],[[9512]],[[9484]],[[9476]],[[9485]],[[9486]],[[9448]],[[9513]],[[9514]],[[9515]],[[9487]],[[9449]],[[9548]],[[9869,9550]],[[9488]],[[9489]],[[9524]],[[9490]],[[9552,9521,9870,9523,9551,9533]],[[9500]],[[9499,9529,9871,9531,9497,9534]],[[9491]],[[9492]],[[9470]],[[9603]],[[9604]],[[9582]],[[9583]],[[9584]],[[9585]],[[9560]],[[9586]],[[9587]],[[9561]],[[9588]],[[9605]],[[9589]],[[9562]],[[9592]],[[9593]],[[9594]],[[9563]],[[9597]],[[9553]],[[9554]],[[9555]],[[9625]],[[9626]],[[9627]],[[9620]],[[9611,9602,9606,9596,9607,9591,9608,9581,9571,9609,9872,9493,9479,9465,9873,9463,9480,9468,9481,9475,9567,9471,9568,9559,9628,9624,9622,9612,9619,9600,9610,9536,9547,9542,9545,9501,9528,9516,9644,9518,9525,9874,9527,9503,9875,9505,9543,9508,9544,9540,9546,9538]]]},{"type":"MultiPolygon","id":15,"arcs":[[[9417]],[[9422]],[[9421]],[[9423]],[[9876,9420]],[[9424]],[[9425]],[[9418]]]},{"type":"MultiPolygon","id":72,"arcs":[[[9866]],[[9813,9697,9666,9723,9817,9718,9726,9759,9868,9839,9877,9737,9820,9731,9847,9853,9844,9863,9864,9855,9865,9834,9848,9782,9878,9822,9803,9689,9746,9830,9705,9790,9823,9668,9768,9779,9660,9761,9879,9654,9788,9832]]]},{"type":"Polygon","id":1,"arcs":[[-6786,-6785,-6792,-6791,-6807,6974,-6994,-6998,7027,-7168,-7171,7205,-7420,7492,7493,-7574,7698,7699,-7846,7871,-8018,8061,-8111,-8157,8194,-8293,8320,8321,-8483,8483,-8579,8680,8681,8688,8689,8690,8566,8567,8683,8684,8685,8675,8676,9880,8678,8701,8702,8703,-8620,8521,-8436,8249,8250,-8128,7954,7955,-7826,7678,-7599,7448,-7421,7302,-7257,7179,-6951,-6954,6937,-6753,-6699,-6714,-6725,-6724]]},{"type":"Polygon","id":5,"arcs":[[-5843,-5842,-5816,-5921,-5920,-5919,-5932,-5931,-5930,-5716,-5888,-5887,-5886,-5917,-5916,-5866,-5973,-5972,-5971,-5970,-5969,-6163,-6274,6406,6407,6408,6409,-6605,6734,6735,6736,7015,-7027,7132,7133,-7415,-7414,7662,7663,7664,7665,7666,7777,7794,7795,7733,7734,7719,7720,7643,7644,7645,-7611,7513,-7233,-7232,7118,-6775,-6774,6727,-6611,6550,-6316,6256,6117,-5946,-5936]]},{"type":"Polygon","id":4,"arcs":[[-4752,-5779,5779,5780,5781,-7177,7591,7592,-8039,8208,8504,8191,7725,7726,7305,7306,-6522,-6521,-5912,-4625,-5343,-5417,-5416,-4754,-4753]]},{"type":"MultiPolygon","id":6,"arcs":[[[7053]],[[7019]],[[7054]],[[6896]],[[6897]],[[-1601,-1600,-1604,2383,-2395,-2394,-2393,-2392,4129,4130,-4310,-4309,-4308,-3802,-4324,4568,-4773,-4255,5466,-5913,6520,6521,-7307,-7306,-7727,7740,7697,7519,7056,7020,6899,6528,5874,5606,5291,5193,5288,5438,5155,5018,4853,4552,4697,4472,4696,4474,4482,4847,4484,3626,2685,2373,-1893,-1975,-1974,-1882]]]},{"type":"Polygon","id":8,"arcs":[[-2141,-2140,-2553,-2552,-2733,-2732,-2702,-2701,-2823,-2972,-2971,3139,-3194,3363,3364,-3620,3939,3940,-4277,4354,-4592,-4591,4878,4879,-5245,5317,5318,5319,5207,5208,5307,5308,5510,5511,5496,5497,5323,5321,-4751,-4750,-4749,4628,-4026,3577,-3100,-3099,2981,2982,-2194,-2137,-2136,-2135]]},{"type":"Polygon","id":9,"arcs":[[-2172,-2171,-2170,-2018,-2017,2317,2318,-2457,2526,2527,2557,2559,9881,2561,2547,2548,2549,-2285,-2284,-1998]]},{"type":"Polygon","id":11,"arcs":[[4385,4386,-4115,-4297]]},{"type":"Polygon","id":10,"arcs":[[3752,4102,4392,4393,4394,4395,4396,4397,-4267,4100,4101,-4079,3754,3755,-3497,-3588,3756,-3586]]},{"type":"MultiPolygon","id":12,"arcs":[[[9361]],[[9338]],[[9063]],[[9882,9883]],[[8993,8905]],[[9884,9356,9885,9358,9362,9351,9340,9331,9302,9329,9304,9285,9264,9262,9235,9221,9193,9886,9137,9363,8968,8865,8969,9065,9006,9064,9008,8913,9009,8915,8804,9887,8806,8797,8790,8787,-8676,-8686,-8685,-8684,-8568,-8567,-8691,-8690,-8689,-8682,-8745,-8744,-8733,-8737,-8736,-8743,-8742,-8740,-8739,-8762,8875,-8760,-8828,-8827,-8697,-8696,-8600,-8747,-8746,-8707,8835,8906,9013,9099,9139,9161,9152,9098,8991,8903,8992,9888,8988,9116,9153,9204,9889,9206,9146,9200,9276,9296,9890,9298,9326,9891,9322,9892,9324,9332,9353,9360]]]},{"type":"MultiPolygon","id":13,"arcs":[[[8704]],[[9893,8606]],[[8522]],[[8333]],[[8283]],[[8284]],[[8523,8607,9894,8609,8705,8706,8745,8746,8599,8695,8696,8826,8827,8759,-8876,8761,8738,8739,8741,8742,8735,8736,8732,8743,8744,-8681,8578,-8484,8482,-8322,-8321,8292,-8195,8156,8110,-8062,8017,-7872,7845,-7700,-7699,7573,-7494,-7493,7419,-7206,7170,7167,-7028,6997,6993,-6975,-6806,-6721,-6720,-6719,-6795,-6794,-6828,-6827,-6823,-6822,-6886,-6885,-6884,-6802,-6673,-6924,-6923,-6922,-6921,-6920,-7061,-7060,-7256,7339,-7438,-7437,-7484,-7483,-7542,-7541,-7711,7821,-7868,-7867,7891,-7899,-8057,-8056,-8055,8285,8280,8336]]]},{"type":"Polygon","id":19,"arcs":[[-1566,1654,-1696,-1780,-1779,2023,-2098,2159,-2230,2312,2313,-2452,-2451,-2450,2717,-2767,2921,-2928,3117,3118,3078,3079,3081,3082,3093,3094,3091,3092,3088,3089,3085,3086,3075,3076,3072,3073,3069,3070,-2935,2880,-2829,2659,2660,-2543,2416,-2304,2207,-2191,2065,2066,-1834,-1833,1756,-1660,1651,-1521,-1490,-1494,-1493,-1517,-1516,-1515,-1526,-1525,-1519,-1518,-1497,-1496,-1502,-1501,-1500,-1513,-1512,-1505,-1504]]},{"type":"Polygon","id":16,"arcs":[[20,-36,111,-202,240,-350,-329,-328,518,-528,-737,-736,-735,-758,-652,1121,-1174,-1173,1592,-1734,-1733,2052,2141,2107,2108,2021,2022,1896,1580,1581,-1263,-1262,-1261,1091,-970,914,-709,522,535,536,-396,-395,364,-248,-247,114,-82,22,23]]},{"type":"Polygon","id":17,"arcs":[[-1968,-1967,-1948,-1947,-1953,-1952,-1960,-1959,-2030,-2029,2116,2233,2234,2235,2510,-2533,2774,-2825,2957,-3156,3323,3324,-3546,3727,-3919,4027,-4173,4238,-4445,-4444,4683,-4705,4905,-4930,5135,-5171,5358,5359,5361,-5492,5562,5574,5575,5568,5569,5570,-5351,-5350,-5160,5125,4935,4936,4726,4727,-4456,-4455,-4521,4379,4380,4381,4165,4070,4071,-3929,3750,3751,-3685,3515,-3493,3241,3242,-3118,2927,-2922,2766,-2718,2449,2450,2451,-2314,-2313,2229,-2160,2097,-2024,-1778]]},{"type":"Polygon","id":18,"arcs":[[-2297,-2296,-2291,-2290,-2295,2470,-2539,2621,-2717,2793,2794,-3019,3039,-3168,3291,-3407,-3406,3614,-3716,3808,-3932,-4139,4144,-4266,-4265,4422,4423,4432,4433,-4557,4659,4660,4805,4798,4799,4800,4795,4892,4893,4894,4953,4954,4923,4924,4973,4974,4927,4928,4929,-4906,4704,-4684,4443,4444,-4239,4172,-4028,3918,-3728,3545,-3325,-3324,3155,-2958,2824,-2775,2532,-2511,-2236,2533,2535,2467,-2204,-2203,-2300,-2299]]},{"type":"Polygon","id":20,"arcs":[[-3419,-3431,-3429,-3428,-3423,-3422,-3433,-3432,-3413,-3412,-3410,-3409,-3417,-3416,-3426,-3427,-3317,-3316,-3486,-3485,-3490,-3489,-3488,-3492,-3561,3664,-3762,3884,-4003,-4002,-4046,-4199,-4198,4346,-4501,4546,-4772,4820,-5042,-5041,5300,5301,-5544,5556,5557,5558,5531,5532,5523,5524,5592,5593,5446,5447,5449,5450,5526,5527,5459,5460,5528,5529,5456,5457,5453,5520,5521,5519,5516,5517,-5318,5244,-4880,-4879,4590,4591,-4355,4276,-3941,-3940,3619,-3365,-3420]]},{"type":"MultiPolygon","id":21,"arcs":[[[-4137,-4136,-4161,-4160,-4159,-4182,-4181,-4351,-4350,-4373,-4372,-4498,-4497,4744,-4805,-4804,-5103,-5102,5233,5234,5235,5611,-5643,5726,5826,5827,5819,5820,5824,5825,5807,5808,5882,5883,5835,5913,5914,5838,5839,5891,5892,5696,5698,5699,5658,5659,5737,5937,5938,5831,5832,5932,5933,5957,5958,-5897,-5709,-5708,-5707,5632,-5569,-5576,-5575,-5563,5491,-5362,-5360,-5359,5170,-5136,-4929,-4928,-4975,-4974,-4925,-4924,-4955,-4954,-4895,-4894,-4893,-4796,-4801,-4800,-4799,-4806,-4661,-4660,4556,-4434,-4433,-4424,-4423,4264,4265,-4145,-4138]]]},{"type":"MultiPolygon","id":22,"arcs":[[[9108]],[[9088]],[[9046]],[[9028]],[[9899,9025,9089,9003,9084,9900,9078,9901,9080,9902,9082,9109,9070,9049,9037,9060,-9017,-8995,8942,-8693,-8692,8649,8456,8457,-8406,8237,-8223,7906,7907,7908,-7820,-7645,-7644,-7721,-7720,-7735,-7734,-7796,-7795,-7778,-7667,-7666,-7665,-7928,7943,-8109,-8108,-8107,-8106,8274,8275,8276,8491,8492,-8647,-8646,-8661,-8660,-8659,-8664,-8663,-8665,-8632,-8771,-8770,8846,8847,9010,9027]]]},{"type":"MultiPolygon","id":25,"arcs":[[[2727]],[[2632]],[[2175,2248,2249,2250,2251,2252,2168,2015,2016,2017,2169,2170,2171,1997,1998,1999,-1887,-1737,-1736,-1754,-1807,-1806,-1783,-1782,-1781,-1749,1934,9903,2006,9904,2008,2118,2165,2177,9905,2173,2287]]]},{"type":"MultiPolygon","id":24,"arcs":[[[4166]],[[4781,4782,4856,4857,4858,4690,4581,4268,4408,4169,4080,3824,3834,3840,4088,4192,9906,4194,4521,4293,4613,4731,4615,4295,4296,4114,4115,4116,3849,3811,3812,3813,3814,3816,3817,3818,3820,3821,3822,-3547,-3461,-3460,-3445,-3537,-3536,-3458,-3457,-3584,-3583,-3501,-3500,-3499,-3449,-3448,-3498,-3756,-3755,4078,-4102,-4101,4266,-4398,-4397,-4396,4784]]]},{"type":"MultiPolygon","id":23,"arcs":[[[918]],[[919]],[[1288,1134,1392,1380,1390,1382,1537,1538,-1300,-889,889,890,891,817,567,360,813,920,599,1117,1282,1286,1391]]]},{"type":"MultiPolygon","id":26,"arcs":[[[9402]],[[9401]],[[771,820,9406,1075,1236,9407,1434,1560,1561,9408,1578,9409,1927,9410,9412,-2505,2280,2281,2292,2293,2294,2289,2290,2295,2296,2298,2299,2202,2203,2204,2151,1988,1785,1686,1533,1378,1225,1112,9404,9405,948,9400,9399]],[[9395]],[[9388,9389]],[[9390]],[[9377,446,9382,9384,491,9394,9907,9392,9396,9397,574,9385,712,713,714,639,640,587,588,589,590,476,477,478,479,480,481,482,483,484,434,9378]],[[9373,9379,9375]],[[9376]]]},{"type":"Polygon","id":27,"arcs":[[125,151,204,9366,9365,203,137,138,139,140,141,142,143,144,145,146,147,473,592,593,594,-667,794,-800,901,902,1050,-1075,1139,-1162,-1187,-1186,-1191,1370,-1423,1502,1503,1504,1511,1512,1499,1500,1501,1495,1496,1517,1518,1524,1525,1514,1515,1516,1492,1493,1489,1490,1336,-1220,1179,-1044,-1043,917,-893,840,-746,702,-551,546,415,-404,348,-318,218,-210,164,165,-55,60,106,9364]]},{"type":"Polygon","id":29,"arcs":[[-3119,-3243,-3242,3492,-3516,3684,-3752,-3751,3928,-4072,-4071,-4166,-4382,-4381,-4380,4520,4454,4455,-4728,-4727,-4937,-4936,-5126,5159,5349,5350,-5571,-5570,-5633,5706,5707,5708,5896,5897,5898,5899,-6100,6161,6162,5968,5969,5970,5971,5972,5865,5915,5916,5885,5886,5887,5715,5929,5930,5931,5918,5919,5920,5815,5841,5842,5935,5936,-5766,5719,-5557,5543,-5302,-5301,5040,5041,-4821,4771,-4547,4500,-4347,4197,4198,4045,4001,4002,-3885,3761,-3665,3560,3491,-3487,-3304,3273,-3129,-3070,-3074,-3073,-3077,-3076,-3087,-3086,-3090,-3089,-3093,-3092,-3095,-3094,-3083,-3082,-3080,-3079]]},{"type":"Polygon","id":28,"arcs":[[-6755,-6754,-6938,6953,6950,-7180,7256,-7303,7420,-7449,7598,-7679,7825,-7956,-7955,8127,-8251,-8250,8435,-8522,8619,-8704,-8703,8838,8861,8880,-8847,8769,8770,8631,8664,8662,8663,8658,8659,8660,8645,8646,-8493,-8492,-8277,-8276,-8275,8105,8106,8107,8108,-7944,7927,-7664,-7663,7413,7414,-7134,-7133,7026,-7016,-6737,-6736,-6768,-6767,-6772,-6771,-6743,-6742,-6741,-6773]]},{"type":"Polygon","id":30,"arcs":[[43,99,88,46,50,29,9,53,110,-93,108,-133,221,-231,373,-381,514,515,516,675,676,677,763,764,765,697,698,826,827,655,649,650,651,757,734,735,736,527,-519,327,328,349,-241,201,-112,35,-21,36,19]]},{"type":"MultiPolygon","id":37,"arcs":[[[-5845,6042,6259,6044]],[[6047,6086,6179,6194,6038,6056,6247,6431,6425,6582,6258,6583,6564,6492,6560,6804,6761,6831,6759,6893,6990,7112,7271,9920,7273,7279,7280,7281,7282,7252,7005,7006,7007,6928,6877,6846,6847,6852,6853,6676,6677,6756,6645,6646,6630,6631,6768,6769,6695,6749,6750,6751,6671,6672,6801,6883,6884,6885,6821,6822,6823,-6595,-6594,-6457,-6456,-6392,-6391,-6287,-6286,-6285,6174,-6175,-6174,-6233,-6232,-6231,-6084,-6083,-5987,-5986,-5985,-5928,-5927,-5926,-5854,-5896,-5895,-5911,-5910,-5674,-5673,-5963,-5671,-5714,-5713,-5712,-5882,-5881,-5880,-5725,-5724,-5876,-5805,-5804,-5803,-5871,-5870,-5908,-5907,-5849,6041]]]},{"type":"Polygon","id":38,"arcs":[[54,-166,-165,209,-219,317,-349,403,-416,-547,550,551,627,628,633,634,631,632,530,583,623,624,625,635,-516,-515,380,-374,230,-222,132,-109,92,93,98,103,40,32,64,68,57]]},{"type":"Polygon","id":31,"arcs":[[-1710,-1552,-1682,-1681,-1672,-1671,-1812,-1810,-1809,-1839,-1838,-1836,-1835,-2067,-2066,2190,-2208,2303,-2417,2542,-2661,-2660,2828,-2881,2934,-3071,3128,-3274,3303,3486,3487,3488,3489,3484,3485,3315,3316,3426,3425,3415,3416,3408,3409,3411,3412,3431,3432,3421,3422,3427,3428,3430,3418,3419,-3364,3193,-3140,2970,2971,2822,2700,2701,2731,2732,-2551,2541,-2048,-2047,1861,-1644,-1684,-1683,-1574,-1573,-1709]]},{"type":"Polygon","id":33,"arcs":[[-890,888,1299,-1539,1615,1747,1748,1780,1781,1782,1805,1806,-1753,1614,-1456,1269,1270,-1115,-996,899,900,-891]]},{"type":"Polygon","id":34,"arcs":[[9921,3944,3785,3786,3787,3788,3789,3726,3668,3524,3525,-3254,-3253,3124,2911,2912,-2814,2756,-2603,-2568,-2567,-2770,-2769,2897,3116,3066,3156,3256,3346,3531,3521,3805,4124,3946]]},{"type":"Polygon","id":35,"arcs":[[5784,5785,5786,-6372,6554,6555,-6863,7008,7009,7156,7157,-7563,7653,7654,7655,7656,7657,7967,7968,7969,7783,7784,7785,7888,7889,8111,8037,8038,-7593,-7592,7176,-5782,-5781,-5780,5778,-5322,-5324,-5498,-5497,-5512,-5511,-5309,-5308,-5209,-5208,-5320]]},{"type":"Polygon","id":32,"arcs":[[-2023,-2357,2361,-2921,3561,3562,-3998,4621,4622,4623,4624,5911,5912,-5467,4254,4772,-4569,4323,3801,4307,4308,4309,-4131,-4130,2391,2392,2393,2394,-2384,-1603,-1429,-1428,-1264,-1582,-1581,-1897]]},{"type":"MultiPolygon","id":36,"arcs":[[[3237]],[[3052,9922,3054,3119,3152,3121,3056,2782]],[[1826]],[[3046,3097,3048,2751,2629,2770,2768,2769,2566,2567,2568,2324,2325,2093,2153,2154,2156,2157,2188,2189,2056,2057,2088,2089,2085,2086,2060,2061,2062,1831,1716,1713,1721,1724,1701,1570,1279,9923,1281,1275,1276,1019,1031,1005,-1001,1002,-1132,1204,-1296,-1485,1544,-1738,1886,-2000,-1999,2283,2284,-2550,-2549,2752]]]},{"type":"Polygon","id":39,"arcs":[[2397,-2447,2666,-2675,2898,-2906,3033,3034,-3246,3262,3263,-3520,3528,-3609,3737,3738,3893,3894,3895,3992,-4069,4228,4226,4362,4363,4494,4495,4496,4497,4371,4372,4349,4350,4180,4181,4158,4159,4160,4135,4136,4137,4138,3931,-3809,3715,-3615,3405,3406,-3292,3167,-3040,3018,-2795,-2794,2716,-2622,2538,-2471,-2294,-2293,-2282,-2281,2504,2505,2506,2507,2508,2509,2514,9926,2516,2669,2593,2594,2595,2636,2579,2443,2401,-2200]]},{"type":"Polygon","id":40,"arcs":[[-5458,-5457,-5530,-5529,-5461,-5460,-5528,-5527,-5451,-5450,-5448,-5447,-5594,-5593,-5525,-5524,-5533,-5532,-5559,-5558,-5720,5765,-5937,5945,-6118,-6257,6315,-6551,6610,-6728,6773,6774,-7119,7231,7232,7233,7234,7401,7402,7398,7399,7400,7380,7440,7441,7442,7337,7338,7229,7230,7139,7140,7035,7036,6930,6931,-6871,6691,-6627,6398,-6366,6016,6017,5798,5799,5794,5795,5796,5791,5792,-5785,-5319,-5518,-5517,-5520,-5522,-5521,-5454]]},{"type":"Polygon","id":41,"arcs":[[661,-608,658,-691,-604,-603,-696,-695,-694,-693,-692,-503,-502,-557,-555,-554,-513,-583,-536,-523,708,-915,969,-1092,1260,1261,1262,1263,1427,1428,1602,1603,1599,1600,1881,1973,1974,1892,1893,1611,1464,1298,980,776,622]]},{"type":"Polygon","id":42,"arcs":[[-2061,-2087,-2086,-2090,-2089,-2058,-2057,-2190,-2189,-2158,-2157,-2155,-2154,-2094,-2326,-2325,-2569,2602,-2757,2813,-2913,-2912,-3125,3252,3253,-3526,3553,3584,3585,-3757,3587,3496,3497,3447,3448,3498,3499,3500,3582,3583,3456,3457,3535,3536,3444,3459,3460,3546,3547,3548,3610,3611,-3610,3337,3338,3339,-3244,3106,-3034,2905,-2899,2674,-2667,2446,-2398,2199,2200,-2062]]},{"type":"MultiPolygon","id":44,"arcs":[[[2544]],[[2545,-2250]],[[-2253,-2252,2452,2321,2454,2553,-2527,2456,-2319,-2318,-2016,-2169]]]},{"type":"MultiPolygon","id":45,"arcs":[[[8077]],[[8079]],[[8080]],[[7693,9413,9930,9415,7862,8081,8046,9931,8048,9932,8050,8078,8053,8054,8055,8056,7898,-7892,7866,7867,-7822,7710,7540,7541,7482,7483,7436,7437,-7340,7255,7059,7060,6919,6920,6921,6922,6923,-6672,-6752,-6751,-6750,-6696,-6770,-6769,-6632,-6631,-6647,-6646,-6757,-6678,-6677,-6854,-6853,-6848,-6847,-6878,-6929,-7008,-7007,-7006,-7253,-7283,7328,7588,9416]]]},{"type":"Polygon","id":46,"arcs":[[-624,-584,-531,-633,-632,-635,-634,-629,-628,-552,-703,745,-841,892,-918,1042,1043,-1180,1219,-1337,-1491,1520,-1652,1659,-1757,1832,1833,1834,1835,1837,1838,1808,1809,1811,1670,1671,1680,1681,1551,1709,1708,1572,1573,1682,1683,-1643,1487,-1374,1248,1183,-1033,939,-677,-676,-517,-636,-626,-625]]},{"type":"Polygon","id":47,"arcs":[[-5660,-5659,-5700,-5699,-5697,-5893,-5892,-5840,-5839,-5915,-5914,-5836,-5884,-5883,-5809,-5808,-5826,-5825,-5821,-5820,-5828,-5879,-5878,-5891,-5890,-5889,-5859,-5983,-5863,-5862,-5929,5984,5985,5986,6082,6083,6230,6231,6232,6173,6174,-6175,6284,6285,6286,6390,6391,6455,6456,6593,6594,-6824,6826,6827,6793,6794,6718,6719,6720,6805,6806,6790,6791,6784,6785,6723,6724,6713,6698,6752,6753,6754,6772,6740,6741,6742,6770,6771,6766,6767,-6735,6604,-6410,-6409,-6408,-6407,6273,-6162,6099,-5900,-6101,-5898,-5959,-5958,-5934,-5933,-5833,-5832,-5939,-5938,-5738]]},{"type":"MultiPolygon","id":48,"arcs":[[[9933]],[[9311,9312]],[[9313,9290,9934,9292,9314]],[[9271]],[[9242]],[[9935,9214]],[[9128]],[[9132,9175,9936,9164,9217,9166,9937,9168,9179,9216,9227,9247,9938,9249,9229,9243,9254,9246,9255,9939,9257,9273,9293,9318,9347,9352,9345,9342,9310,9253,9190,9127,8977,8872,8869,8883,8392,8394,-7889,-7786,-7785,-7784,-7970,-7969,-7968,-7658,-7657,-7656,-7655,-7654,7562,-7158,-7157,-7010,-7009,6862,-6556,-6555,6371,-5787,-5786,-5793,-5792,-5797,-5796,-5795,-5800,-5799,-6018,-6017,6365,-6399,6626,-6692,6870,-6932,-6931,-7037,-7036,-7141,-7140,-7231,-7230,-7339,-7338,-7443,-7442,-7441,-7381,-7401,-7400,-7399,-7403,-7402,-7235,-7234,-7514,7610,-7646,7819,-7909,-7908,-7907,8222,-8238,8405,-8458,-8457,-8650,8691,8692,-8943,8994,9016,9017,9090,9131,9092,9020,9130]]]},{"type":"Polygon","id":49,"arcs":[[-1732,2343,-2621,-2196,-2195,-2983,-2982,3098,3099,-3578,4025,-4629,4748,4749,4750,4751,4752,4753,5415,5416,5342,-4624,-4623,-4622,3997,-3563,-3562,2920,-2362,2356,-2022,-2109,-2108,-2142,-2053]]},{"type":"MultiPolygon","id":51,"arcs":[[[5405,5058,-4782,5059]],[[5005,4865,4807,4982,5225,5370,5424,5372,5109,5148,5330,5473,5536,9940,5683,5638,5472,5431,5282,5394,9941,5581,5626,5665,5871,9942,5902,9943,9944,5905,5850,5823,5851,5844,5845,5846,5847,5848,5906,5907,5869,5870,5802,5803,5804,5875,5723,5724,5879,5880,5881,5711,5712,5713,5670,5962,5672,5673,5909,5910,5894,5895,5853,5925,5926,5927,5928,5861,5862,5982,5858,5888,5889,5890,5877,5878,-5827,-5727,5642,-5612,-5236,-5235,-5234,-5101,-5412,-5411,-5378,-5377,-5376,-5180,-5275,-5274,5122,-4883,4877,-4536,-4535,-4403,-4402,-4401,-4189,-4188,4043,-3999,-3865,-3910,-4025,-4024,-3812,-3850,-4117,-4116,-4387,4417,9945,4342,4409,4669,4810,4866,5063,5188]]]},{"type":"Polygon","id":50,"arcs":[[1008,998,-900,995,1114,-1271,-1270,1455,-1615,1752,1753,1735,1736,1737,-1545,1484,1295,-1205,1131,-1003,1000,1001,994]]},{"type":"MultiPolygon","id":53,"arcs":[[[303]],[[271]],[[184]],[[118]],[[119]],[[120]],[[126,2,3,75,85,80,83,-23,81,-115,246,247,-365,394,395,-537,582,512,553,554,556,501,502,691,692,693,694,695,602,603,690,-659,607,608,610,467,343,233,186,187,234,319,276,371,273,372,321,407,370,307,196,183,197,129]]]},{"type":"MultiPolygon","id":55,"arcs":[[[9372]],[[9371,561,557,-484,-483,-482,-481,-480,-479,-478,-477,-591,-590,-589,-588,-641,-640,-715,9386,879,9949,881,1155,1167,9387,1165,1289,1474,1623,1800,1960,2027,2028,2029,1958,1959,1951,1952,1946,1947,1966,1967,1777,1778,1779,1695,-1655,1565,-1503,1422,-1371,1190,1185,1186,1161,-1140,1074,-1051,-903,-902,799,-795,666,-595,-594,-593,-474,-148,9368,9370]]]},{"type":"Polygon","id":54,"arcs":[[3243,-3340,-3339,-3338,3609,-3612,-3611,-3549,-3548,-3823,-3822,-3821,-3819,-3818,-3817,-3815,-3814,-3813,4023,4024,3909,3864,3998,-4044,4187,4188,4400,4401,4402,4534,4535,-4878,4882,-5123,5273,5274,5179,5375,5376,5377,5410,5411,5100,5101,5102,4803,4804,-4745,-4496,-4495,-4364,-4363,-4227,-4229,4068,-3993,-3896,-3895,-3894,-3739,-3738,3608,-3529,3519,-3264,-3263,3245,-3035,-3107]]},{"type":"Polygon","id":56,"arcs":[[-827,-699,-698,-766,-765,-764,-678,-940,1032,-1184,-1249,1373,-1488,1642,1643,-1862,2046,2047,-2542,2550,2551,2552,2139,2140,2134,2135,2136,2193,2194,2195,2620,-2344,1731,1732,1733,-1593,1172,1173,-1122,-651,-650,-656,-828]]},{"type":"MultiPolygon","id":78,"arcs":[[[9867]],[[9840]]]}]},"land":{"type":"MultiPolygon","arcs":[[[9361]],[[9933]],[[9338]],[[9311,9312]],[[9313,9290,9934,9292,9314]],[[9271]],[[9242]],[[9935,9214]],[[9128]],[[9108]],[[9088]],[[9046]],[[9063]],[[9882,9883]],[[9028]],[[8993,8905]],[[8704]],[[9893,8606]],[[8522]],[[8333]],[[8283]],[[8284]],[[8077]],[[8079]],[[8080]],[[7053]],[[7019]],[[7054]],[[6896]],[[6897]],[[4166]],[[3237]],[[3052,9922,3054,3119,3152,3121,3056,2782]],[[2727]],[[2632]],[[2544]],[[1826]],[[918]],[[919]],[[9402]],[[9401]],[[9395]],[[9388,9389]],[[9390]],[[9372]],[[9373,9379,9375]],[[-9918]],[[1275,1276,1019,1031,1005,1001,994,1008,998,900,891,817,567,360,813,920,599,1117,1282,1286,1391,1288,1134,1392,1380,1390,1382,1537,1615,1747,1934,9903,2006,9904,2008,2118,2165,2177,9905,2173,2287,2175,2248,2545,2250,2452,2321,2454,2553,2527,2557,2559,9881,2561,2547,2752,3046,3097,3048,2751,2629,2770,2897,3116,3066,3156,3256,3346,3531,3521,3805,4124,3946,9921,3944,3785,9954,3787,9955,3789,3726,3668,3524,3553,3584,3752,4102,4392,9956,4394,4784,5059,5405,5058,4782,4856,9957,4858,4690,4581,4268,4408,4169,4080,3824,3834,3840,4088,4192,9906,4194,4521,4293,4613,4731,4615,4295,4385,4417,9945,4342,4409,4669,4810,4866,5063,5188,5005,4865,4807,4982,5225,5370,5424,5372,5109,5148,5330,5473,5536,9940,5683,5638,5472,5431,5282,5394,9941,5581,5626,5665,5871,9942,5902,9943,9944,5905,5850,5823,5851,6042,6259,6044,5845,9958,9959,9960,5847,6041,6047,6086,6179,6194,6038,6056,6247,6431,6425,6582,6258,6583,6564,6492,6560,6804,6761,6831,6759,6893,6990,7112,7271,9920,7273,7279,9961,7281,7328,7588,9416,7693,9413,9930,9415,7862,8081,8046,9931,8048,9932,8050,8078,8053,8285,8280,8336,8523,8607,9894,8609,8705,8835,8906,9013,9099,9139,9161,9152,9098,8991,8903,8992,9888,8988,9116,9153,9204,9889,9206,9146,9200,9276,9296,9890,9298,9326,9891,9322,9892,9324,9332,9353,9360,9884,9356,9885,9358,9362,9351,9340,9331,9302,9329,9304,9285,9264,9262,9235,9221,9193,9886,9137,9363,8968,8865,8969,9065,9006,9064,9008,8913,9009,8915,8804,9887,8806,8797,8790,8787,8676,9880,8678,8701,8838,8861,8880,8847,9010,9027,9899,9025,9089,9003,9084,9900,9078,9901,9080,9902,9082,9109,9070,9049,9037,9060,9017,9090,9131,9092,9020,9130,9132,9175,9936,9164,9217,9166,9937,9168,9179,9216,9227,9247,9938,9249,9229,9243,9254,9246,9255,9939,9257,9273,9293,9318,9347,9352,9345,9342,9310,9253,9190,9127,8977,8872,8869,8883,8392,8394,7889,8111,8037,8208,8504,8191,7725,7740,7697,7519,7056,7020,6899,6528,5874,5606,5291,5193,5288,5438,5155,5018,4853,4552,4697,4472,4696,4474,4482,4847,4484,3626,2685,2373,1893,1611,1464,1298,980,776,622,661,608,610,467,343,233,186,9946,9962,9948,3,75,85,80,83,23,36,19,43,99,88,46,50,29,9,53,110,93,98,103,40,32,64,68,57,60,106,9364,125,151,204,9366,9365,203,137,138,139,140,141,142,143,144,145,146,9368,9370,9371,561,557,484,434,9378,9377,446,9382,9384,491,9394,9907,9392,9396,9397,574,9385,712,713,9386,879,9949,881,1155,1167,9387,1165,1289,1474,1623,1800,1960,2027,2116,2233,2234,2533,2535,2467,2204,2151,1988,1785,1686,1533,1378,1225,1112,9404,9405,948,9400,9399,771,820,9406,1075,1236,9407,1434,1560,1561,9408,1578,9409,1927,9410,9412,2505,-9912,2507,-9910,2509,2514,9926,2516,2669,2593,2594,2595,2636,2579,2443,2401,2200,2062,1831,1716,1713,1721,1724,1701,1570,1279,9923,1281]],[[9612,9619,9600,9610,9536,9547,9542,9545,9501,9528,9516,9644,9518,9525,9874,9527,9503,9875,9505,9543,9508,9544,9540,9546,9538,9611,9602,9606,9596,9607,9591,9608,9581,9571,9609,9872,9493,9479,9465,9873,9463,9480,9468,9481,9475,9567,9471,9568,9559,9628,9624,9622]],[[9489]],[[9626]],[[9552,9521,9870,9523,9551,9533]],[[9561]],[[9499,9529,9871,9531,9497,9534]],[[9869,9550]],[[9455]],[[9515]],[[9447]],[[9563]],[[9514]],[[9491]],[[9445]],[[9555]],[[9554]],[[9440]],[[9586]],[[9510]],[[9444]],[[9434]],[[9513]],[[9512]],[[9588]],[[9511]],[[9431]],[[9548]],[[9642]],[[9460]],[[9438]],[[9562]],[[9432]],[[9470]],[[9451]],[[9589]],[[9487]],[[9458]],[[9426]],[[9553]],[[9437]],[[9524]],[[9492]],[[9500]],[[9441]],[[9435]],[[9490]],[[9592]],[[9439]],[[9625]],[[9486]],[[9485]],[[9488]],[[9442]],[[9452]],[[9443]],[[9597]],[[9454]],[[9436]],[[9453]],[[9585]],[[9483]],[[9449]],[[9428]],[[9456]],[[9446]],[[9620]],[[9603]],[[9459]],[[9448]],[[9457]],[[9450]],[[9594]],[[9583]],[[9584]],[[9582]],[[9476]],[[9587]],[[9605]],[[9604]],[[9484]],[[9627]],[[9461]],[[9560]],[[9429]],[[9427]],[[9433]],[[9593]],[[9430]],[[9629]],[[9630]],[[9631]],[[9632]],[[9633]],[[9634]],[[9466]],[[9635]],[[9636]],[[9637]],[[9638]],[[9639]],[[9640]],[[9509]],[[9467]],[[9641]],[[9643]],[[9867]],[[9866]],[[9840]],[[9813,9697,9666,9723,9817,9718,9726,9759,9868,9839,9877,9737,9820,9731,9847,9853,9844,9863,9864,9855,9865,9834,9848,9782,9878,9822,9803,9689,9746,9830,9705,9790,9823,9668,9768,9779,9660,9761,9879,9654,9788,9832]],[[9417]],[[9422]],[[9421]],[[9423]],[[9876,9420]],[[9424]],[[9425]],[[9418]]]}},"arcs":[[[162416,583189],[236,-863],[94,-3199],[220,-1079],[-271,-1241]],[[162695,576807],[-443,-309],[-4396,83]],[[157856,576581],[-6,1800],[-436,606],[-476,3062],[167,1173]],[[157105,583222],[2782,-89],[2529,56]],[[203483,583173],[-111,-3268],[363,0],[1,-4838],[604,-14]],[[204340,575053],[0,-6406],[-109,-3],[-1,-3886]],[[204230,564758],[-1074,300],[-478,661],[-49,-1946]],[[202629,563773],[-411,-2654],[-860,-2419],[-1043,-435],[-462,561]],[[199853,558826],[29,9804],[98,1617],[303,-7],[-114,3279],[302,529],[-36,7508],[72,1628]],[[200507,583184],[2976,-11]],[[181317,583162],[311,-3373],[318,707],[389,-2530],[-133,-1970],[788,-1235],[-38,-1636],[347,-662],[20,-2123]],[[183319,570340],[343,-1416],[-25,-1101],[608,-791]],[[184245,567032],[386,-2907],[-296,-416]],[[184335,563709],[-284,-667],[56,-2637],[-277,-1038],[59,-2316]],[[183889,557051],[-896,68]],[[182993,557119],[-468,-2]],[[182525,557117],[101,1562],[-233,2072],[31,1860],[-477,1550],[-122,1357],[-537,-515],[111,-1134],[-1263,-12],[41,-3203],[-354,-5]],[[179823,560649],[-1,1601],[-1073,-52],[-59,2655]],[[178690,564853],[-26,3920],[480,4],[-5,6466],[-109,1581],[659,10],[112,1730],[-222,1681],[-105,2947]],[[179474,583192],[1843,-30]],[[175797,583199],[0,-9287]],[[175797,573912],[-2052,-28],[-1,6456],[-689,-16]],[[173055,580324],[0,2844]],[[173055,583168],[2742,31]],[[199853,558826],[-98,-1296],[-681,144],[-597,-3335]],[[198477,554339],[-62,2205],[-374,544],[-690,-278]],[[197351,556810],[-1278,1156],[-333,1655]],[[195740,559621],[8,3507],[732,-36],[49,1307],[484,-269],[0,4521],[87,4167]],[[197100,572818],[159,-390],[75,5957],[166,-2],[64,4793]],[[197564,583176],[2943,8]],[[221924,574709],[-1820,8]],[[220104,574717],[-102,3252],[0,5201]],[[220002,583170],[1830,2]],[[221832,583172],[3,-5232],[89,-3231]],[[178690,564853],[-400,43],[-118,-1893],[-228,-480],[-676,326],[-48,1381],[-615,5245],[-698,-1923],[-112,1018]],[[175795,568570],[2,5342]],[[175797,583199],[3677,-7]],[[220104,574717],[-363,-10]],[[219741,574707],[-362,-1],[-1,1624],[-1819,10],[0,-1619]],[[217559,574721],[-1091,11],[0,3239],[-126,10],[-1,5192]],[[216341,583173],[3661,-3]],[[186539,583158],[25,-9701]],[[186564,573457],[-1094,108],[-9,-3230],[-2142,5]],[[181317,583162],[5222,-4]],[[193948,567081],[-538,-46],[0,1653],[-330,-43],[0,1617],[-2172,10],[0,-1617],[-363,1]],[[190545,568656],[35,14501]],[[190580,583157],[3492,32]],[[194072,583189],[-44,-7981],[115,-2218],[-242,-2960],[47,-2949]],[[195740,559621],[-133,1040],[-934,55],[-434,-1362],[-302,351]],[[193937,559705],[11,7376]],[[194072,583189],[3492,-13]],[[206421,583169],[53,-6498],[181,-1619]],[[206655,575052],[-2315,1]],[[203483,583173],[2938,-4]],[[228232,583191],[206,-4516],[166,-1312],[-187,-2686]],[[228417,574677],[-2130,0]],[[226287,574677],[-64,8514]],[[226223,583191],[2009,0]],[[230526,583184],[49,-8486]],[[230575,574698],[-2158,-21]],[[228232,583191],[2294,-7]],[[223380,574698],[-1,-3220],[-639,-11]],[[222740,571467],[-816,5]],[[221924,571472],[0,3237]],[[221832,583172],[1466,10]],[[223298,583182],[0,-5247],[82,-3237]],[[226287,574677],[-1090,12]],[[225197,574689],[-1817,9]],[[223298,583182],[2925,9]],[[168030,583185],[-42,-19407]],[[167988,563778],[-338,-262]],[[167650,563516],[-25,343]],[[167625,563859],[88,1056],[-308,2218],[-251,148],[-798,-1281],[-586,-1450],[-104,1725],[-570,-648],[55,-1799]],[[165151,563828],[-497,4],[-263,1945],[-611,1931],[-82,1381],[-532,1417],[-331,3957]],[[162835,574463],[-140,2344]],[[162416,583189],[2209,-15],[3405,11]],[[171951,583192],[-373,-3049],[-183,-3367],[361,7],[-7,-9706],[182,-1632]],[[171931,565445],[-274,12],[-1,-4693],[-436,1680],[-359,-1132]],[[170861,561312],[-166,418],[-548,-890],[-371,2707],[-364,-947]],[[169412,562600],[-132,2358],[405,757],[-4,1210],[289,2381],[-187,3288],[316,4420],[-331,3951],[45,2219]],[[169813,583184],[2138,8]],[[173055,580324],[-26,-14910]],[[173029,565414],[-1098,31]],[[171951,583192],[1104,-24]],[[169412,562600],[-45,-983],[-485,620],[-109,1069],[-446,-598],[-339,1070]],[[168030,583185],[1783,-1]],[[188725,567028],[0,1624]],[[188725,568652],[374,0],[11,14480]],[[189110,583132],[1470,25]],[[190545,568656],[-200,-1611],[-1620,-17]],[[212324,583170],[-3,-5175],[150,-1639]],[[212471,576356],[-3238,15]],[[209233,576371],[-1,6810]],[[209232,583181],[3092,-11]],[[214880,583162],[-1,-3570]],[[214879,579592],[-364,-1],[-1,-1615],[-226,0],[0,-3239]],[[214288,574737],[-1816,1]],[[212472,574738],[-1,1618]],[[212324,583170],[2556,-8]],[[186539,583158],[2571,-26]],[[188725,568652],[-718,-1],[2,2422],[-362,804],[-543,30],[-81,1075],[-459,475]],[[217559,574721],[0,-1621]],[[217559,573100],[-2179,21],[-1,4852],[-499,6],[-1,1613]],[[214880,583162],[1461,11]],[[233488,574623],[-724,-26]],[[232764,574597],[-2189,101]],[[230526,583184],[3019,-21]],[[233545,583163],[240,-2188],[402,728],[5,-3862],[-704,-3],[0,-3215]],[[209233,576371],[4,-4555]],[[209237,571816],[-1620,-4],[1,1622],[-363,4],[0,1612],[-600,2]],[[206421,583169],[2811,12]],[[175795,568570],[0,-4401]],[[175795,564169],[-503,1656],[-278,-929],[18,-2373]],[[175032,562523],[-508,-3],[3,1885],[-1501,-262]],[[173026,564143],[3,1271]],[[217559,573100],[127,-1619],[-2,-6492],[124,-2],[-3,-3238]],[[217805,561749],[-2509,-20]],[[215296,561729],[1,3269],[-141,0],[0,6485],[-143,10],[0,3259],[-725,-15]],[[156776,574866],[145,-2337],[-336,700],[191,1637]],[[156018,576188],[367,-1161],[-54,-1921],[-274,763],[-39,2319]],[[156711,577874],[437,-1003],[-572,-1182],[-174,1060],[309,1125]],[[239768,576252],[-26,-7172],[46,-6528]],[[239788,562552],[-1935,133],[-2,-978],[-1789,-11]],[[236062,561696],[-29,9709]],[[236033,571405],[-4,6210]],[[236029,577615],[339,173],[235,-1132],[1047,-347],[154,-2131],[907,561],[6,841],[719,948],[332,-276]],[[157403,572219],[-142,1501],[248,575],[362,-1247],[-15,3533]],[[162835,574463],[-341,252],[-585,-931],[-106,-3299],[197,-417]],[[162000,570068],[-3852,30]],[[158148,570098],[-745,2121]],[[212472,574738],[0,-3235],[160,6],[-1,-4641]],[[212631,566868],[-1041,215],[-260,-1783],[-494,-878],[-372,2570],[-383,-709],[-219,-2110],[-618,322]],[[209244,564495],[-7,7321]],[[219741,574707],[109,-3230],[1,-6504],[110,0],[-1,-3243]],[[219960,561730],[-1079,-3]],[[218881,561727],[-1076,22]],[[243362,568344],[29,-12216],[-17,-11280]],[[243374,544848],[-834,-2840],[212,-1505]],[[242752,540503],[-2,-7]],[[242750,540496],[-224,823]],[[242526,541319],[-10,0]],[[242516,541319],[-187,-592]],[[242329,540727],[-9,7]],[[242320,540734],[-75,-212]],[[242245,540522],[-5,-38]],[[242240,540484],[-9,-872]],[[242231,539612],[3,11]],[[242234,539623],[-248,57]],[[241986,539680],[-26,1879],[-2117,44]],[[239843,541603],[15,4838]],[[239858,546441],[-15,12915],[-55,3196]],[[239768,576252],[1003,-1644],[260,59],[-216,-1483],[572,-280],[382,-4206],[280,489],[20,1987],[577,82],[135,-1750],[581,-1162]],[[209244,564495],[-258,1115],[-593,-179],[-307,1362],[-1057,19],[-145,560],[-288,-1583],[-558,-1]],[[206038,565788],[-93,498],[-752,103],[-963,-1631]],[[165151,563828],[-359,-3363],[-516,-331],[-139,-2995],[-195,-1515],[49,-2367],[561,-1042],[-25,-1385]],[[164527,550830],[-822,-18],[-768,1529],[-383,1474],[-339,202],[-528,3049]],[[161687,557066],[129,2030],[-144,1373]],[[161672,560469],[135,875],[-307,1331],[76,2648],[386,644],[303,1650],[-265,2451]],[[215296,561729],[-1431,3],[-2,-1673]],[[213863,560059],[-714,1226]],[[213149,561285],[-15,1450],[265,1806],[-308,1452],[-460,875]],[[232764,574597],[24,-6811]],[[232788,567786],[-2527,21]],[[230261,567807],[-1799,-6]],[[228462,567801],[14,367]],[[228476,568168],[71,2441],[-130,4068]],[[221924,571472],[-986,7],[-3,-6507],[100,-3249]],[[221035,561723],[-716,0]],[[220319,561723],[-359,7]],[[225197,574689],[73,-6488]],[[225270,568201],[-362,-8],[-2,-3234],[-287,1],[0,-1975]],[[224619,562985],[-263,25],[-571,2718],[-293,-1216],[-752,3114],[0,3841]],[[228476,568168],[-2123,27]],[[226353,568195],[-1083,6]],[[236062,561696],[6,-7465]],[[236068,554231],[0,-615],[-707,-32]],[[235361,553584],[-1430,50]],[[233931,553634],[-29,8560],[-224,1564],[125,1180],[-986,11]],[[232817,564949],[-29,2837]],[[233488,574623],[363,-5],[3,-3239],[2179,26]],[[188725,567028],[1,-2703]],[[188726,564325],[-1602,-42],[-179,1901],[-363,820],[-2337,28]],[[158090,569229],[27,-389]],[[158117,568840],[-233,-1009],[277,-1641],[-369,861],[-55,2156],[353,22]],[[157568,571941],[243,-1776],[-417,-307],[-219,-1059],[350,-339],[185,-3598],[45,1502],[415,-1154],[-2,-2382],[-642,2318],[-20,2344],[-434,1258],[298,3296],[198,-103]],[[156634,565779],[-60,-3687],[-1564,-7],[0,264],[-3066,-4]],[[151944,562345],[-337,5365],[202,2998],[-202,971]],[[151607,571679],[463,-265],[484,-1494],[396,-424],[748,-1863],[763,58],[868,-995],[776,701],[529,-1618]],[[224619,562985],[0,-1281]],[[224619,561704],[-2151,10]],[[222468,561714],[-1433,9]],[[193937,559705],[-803,-422],[-51,-3212],[-1027,-2365]],[[192056,553706],[-1187,-7]],[[190869,553699],[-361,552],[1,1469],[-266,4],[-517,1364],[204,1867],[-1205,-7]],[[188725,558948],[1,5377]],[[161672,560469],[-3555,-37]],[[158117,560432],[249,3191],[301,1598],[-407,1180],[-143,2439]],[[158090,569229],[58,869]],[[179823,560649],[58,-3498],[649,4],[-91,-2233],[238,251],[-154,-1949],[417,-649],[44,-4053]],[[180984,548522],[-292,-238],[-171,1188],[-551,1163],[-685,298]],[[179285,550933],[-478,836],[-38,1568],[-837,1677],[-963,-135]],[[176969,554879],[-354,1336],[183,799],[-95,1862],[-283,1075],[-625,4218]],[[245498,568091],[24,-13480]],[[245522,554611],[-1265,-6316],[-883,-3447]],[[243362,568344],[242,-1593],[425,-163],[-24,-1207],[886,751],[607,1959]],[[226353,568195],[59,-3242],[-1,-6490]],[[226411,558463],[-285,2]],[[226126,558465],[-1436,0]],[[224690,558465],[-71,3239]],[[228462,567801],[350,-5611],[344,-3679]],[[229156,558511],[-1603,-50]],[[227553,558461],[-1142,2]],[[230261,567807],[50,-3920]],[[230311,563887],[2,-2161],[360,-5],[2,-1615],[1435,5],[0,1629],[356,7],[-1,1624]],[[232465,563371],[355,-34]],[[232820,563337],[77,-8073]],[[232897,555264],[-1430,-21]],[[231467,555243],[-2182,14]],[[229285,555257],[-129,3254]],[[232817,564949],[3,-1612]],[[232465,563371],[-1,531],[-2153,-15]],[[209244,564495],[-2,-11147]],[[209242,553348],[-241,-806],[-805,9]],[[208196,552551],[-259,2],[1,3249],[-225,-5],[0,1619],[-1072,7],[1,1622],[-715,4],[0,1622]],[[205927,560671],[111,1440],[0,3677]],[[167625,563859],[-339,-5],[-301,-1380],[-1,-1619],[-240,-1347],[-120,-2159],[-533,-1577],[-2,-1607],[-955,-85],[-358,-2172],[-6,-1862]],[[164770,550046],[-243,784]],[[213149,561285],[0,-2790],[-1274,10],[2,-6436]],[[211877,552069],[-1581,12]],[[210296,552081],[-1055,15]],[[209241,552096],[1,1252]],[[156465,557234],[-1439,15],[0,-1663]],[[155026,555586],[-1512,9],[-857,298]],[[152657,555893],[-215,4015],[-498,2437]],[[156634,565779],[273,1293],[567,-4576],[-189,-396],[-251,-3033],[-105,2479],[-246,-3231],[-218,-1081]],[[188725,558948],[-718,-7],[0,-1612],[-713,3],[0,-1972],[-347,194]],[[186947,555554],[-644,-185],[-426,1863],[-409,506],[-656,-490],[-280,1681],[6,2406],[-203,2374]],[[205927,560671],[-357,-7],[-3,-4859],[-120,-3],[2,-6473]],[[205449,549329],[-1188,-10],[0,-1636],[-355,-3],[0,1641],[-354,-3]],[[203552,549318],[-232,0],[-1,3235],[-355,-6],[105,3251],[-2,6316],[-270,1],[-168,1658]],[[176969,554879],[-257,-1008],[473,-1408],[60,-942],[526,-680],[549,-2997],[263,-2458],[250,-686]],[[178833,544700],[-3820,28]],[[175013,544728],[0,1637]],[[175013,546365],[0,7286]],[[175013,553651],[19,8872]],[[182525,557117],[-825,-26],[-58,-2280],[224,-1574],[136,-3906],[-311,-808],[-707,-1]],[[173026,564143],[8,-11380]],[[173034,552763],[0,-1987]],[[173034,550776],[-2181,20]],[[170853,550796],[8,10516]],[[233931,553634],[40,-4845]],[[233971,548789],[-1065,-20]],[[232906,548769],[-9,6495]],[[175013,553651],[-715,16],[-120,-800],[-1144,-104]],[[203552,549318],[2,-5970]],[[203554,543348],[0,-266]],[[203554,543082],[-1766,-14],[-2,268],[-3263,-152]],[[198523,543184],[-142,489],[173,2154],[-209,2560],[-11,4245],[143,1707]],[[167650,563516],[-17,-12700]],[[167633,550816],[-9,-6518],[-1075,22],[-3,-3262]],[[166546,541058],[-233,-1081]],[[166313,539977],[-187,857],[-295,-1494],[-690,-306]],[[165141,539034],[-276,2022]],[[164865,541056],[127,1141],[-311,5065],[89,2784]],[[170853,550796],[-381,1]],[[170472,550797],[-2839,19]],[[186947,555554],[7,-6012],[711,-1191],[-2,-4005],[368,-11]],[[188031,544335],[35,-1328],[411,-1480]],[[188477,541527],[-392,-449],[14,-3150],[-430,-3]],[[187669,537925],[-672,2],[-784,-2757]],[[186213,535170],[46,3441],[-325,1748],[-347,-22],[-1,2529],[-723,-49],[-4,6432],[-731,40],[-1,5728],[-238,2034]],[[157723,558953],[152,-2103],[-263,244],[111,1859]],[[157679,553460],[-209,2]],[[157470,553462],[-20,-1]],[[157450,553461],[-465,10]],[[156985,553471],[3,2161],[-621,2]],[[156367,555634],[297,1874],[455,873],[193,2438],[440,2118],[103,-3144],[-199,149],[-132,-3407],[313,-1094],[-158,-1981]],[[239858,546441],[-2004,75]],[[237854,546516],[-6,4597],[-694,1379],[-255,2407],[-570,-1212],[-261,544]],[[218881,561727],[0,-3232],[-241,5],[-5,-6449]],[[218635,552051],[-211,-1],[0,-3173],[-602,-11]],[[217822,548866],[-251,2540],[-563,-513]],[[217008,550893],[-256,567],[-256,3108],[36,1844],[-852,-555],[-222,-665],[-1091,1453]],[[214367,556645],[-155,784],[-3,3078],[-346,-448]],[[224690,558465],[0,-1585]],[[224690,556880],[-2133,9]],[[222557,556889],[-89,4825]],[[222557,556889],[-2,-4848]],[[222555,552041],[-597,-4]],[[221958,552037],[-1539,4]],[[220419,552041],[1,6449],[-101,3233]],[[220419,552041],[-222,0]],[[220197,552041],[-1562,10]],[[214367,556645],[0,-4588],[170,0],[-1,-5915]],[[214536,546142],[-1061,-2],[0,-539],[-1412,-13]],[[212063,545588],[-1,6481],[-185,0]],[[197351,556810],[-6,-4998],[-770,-161],[-356,-670],[-49,-3204],[356,-6],[-61,-6487]],[[196465,541284],[-1055,22]],[[195410,541306],[-1057,8],[-1,-1068]],[[194352,540246],[-993,3]],[[193359,540249],[-236,2014],[209,1754],[-4,5386],[-1034,1610],[0,1620],[-238,1073]],[[208196,552551],[218,-2029],[102,-3785],[-297,-2572],[-534,-806]],[[207685,543359],[-1181,12],[-117,1073],[-355,1],[0,1079],[-356,1],[0,3802],[-227,2]],[[157999,553531],[-253,-1157],[151,3089],[102,-1932]],[[161687,557066],[-282,-523],[-596,-2846],[-98,-1164],[460,-3838],[-225,-1131]],[[160946,547564],[-1160,1608],[-293,-321]],[[159493,548851],[-540,718],[-133,1180],[-534,2],[-231,1165]],[[158055,551916],[258,528],[-269,4233],[225,530],[-269,1061],[117,2164]],[[190869,553699],[1,-1066],[-358,1],[-13,-4900],[354,-2],[-21,-5066]],[[190832,542666],[-725,2921],[-441,463],[-28,1539],[-216,-1426],[-1061,-216],[1,-1610],[-331,-2]],[[227553,558461],[-3,-6470],[62,-1591]],[[227612,550400],[-709,17]],[[226903,550417],[-711,10]],[[226192,550427],[-72,1593],[6,6445]],[[226192,550427],[-1411,-1]],[[224781,550426],[-88,1602]],[[224693,552028],[-3,4852]],[[229285,555257],[53,-4884]],[[229338,550373],[-1726,27]],[[156465,557234],[-98,-1600]],[[156985,553471],[-2,-837]],[[156983,552634],[-349,-1455],[-54,-1446],[-357,-1953]],[[156223,547780],[-354,-250]],[[155869,547530],[-801,-41],[-42,8097]],[[182993,557119],[1,-7838],[454,9],[0,-6466]],[[183448,542824],[-493,-548],[1,-1075],[-524,-539],[1,-1072],[-447,49]],[[181986,539639],[-1407,-5]],[[180579,539634],[-732,-499]],[[179847,539135],[-222,1916]],[[179625,541051],[352,195],[-48,4028],[320,550],[-90,1379],[-636,2137],[-238,1593]],[[186213,535170],[-690,-2887]],[[185523,532283],[-1333,17]],[[184190,532300],[-6,8737],[-214,-420],[-522,2207]],[[198523,543184],[180,-1780]],[[198703,541404],[-2238,-120]],[[164865,541056],[-1495,18],[1,1609],[-349,24],[-1,1604],[-1091,-12],[-177,1484],[-533,1821],[-274,-40]],[[224693,552028],[-2138,13]],[[217008,550893],[-1,-451],[-1411,-2],[0,-4839]],[[215596,545601],[-928,-4]],[[214668,545597],[-132,545]],[[155869,547530],[120,-1651],[-5,-3776]],[[155984,542103],[-587,-24]],[[155397,542079],[-2025,38]],[[153372,542117],[-110,2053],[253,-202],[623,1195],[-914,1191],[-230,4847],[-241,1362],[-96,3330]],[[232906,548769],[-1437,4]],[[231469,548773],[-2,6470]],[[231469,548773],[-356,-11]],[[231113,548762],[-1799,-4]],[[229314,548758],[24,1615]],[[179625,541051],[-761,2278],[-31,1371]],[[237854,546516],[-2,-4237]],[[237852,542279],[-1578,50],[42,-9604],[-40,-223]],[[236276,532502],[-231,1006],[-307,-538],[-332,854]],[[235406,533824],[-216,372]],[[235190,534196],[-133,486],[-22,7620]],[[235035,542302],[353,-11],[-27,11293]],[[310206,521389],[-674,-758]],[[309532,520631],[-1071,-1126],[-11,14936],[-1066,258]],[[307384,534699],[-8,3291],[-2505,26]],[[304871,538016],[-841,2]],[[304030,538018],[72,2263],[2153,14228],[505,-616],[6,-3382],[393,-1252],[815,1288],[76,747],[564,5],[41,1253],[358,12],[783,-2953],[455,-2410],[25,-20921],[-70,-4891]],[[193359,540249],[-620,1062],[-850,-749]],[[191889,540562],[-514,-598],[-543,2702]],[[175013,546365],[-1409,188],[-569,1764]],[[173035,548317],[-1,2459]],[[235035,542302],[-1048,14]],[[233987,542316],[-16,6473]],[[160946,547564],[-215,-3053],[-185,-928],[189,-1670]],[[160735,541913],[-845,11],[-206,-1040],[-1032,654]],[[158652,541538],[-352,1507],[-447,420],[-411,2054],[-166,2243]],[[157276,547762],[314,1630],[142,2452],[323,72]],[[157679,553460],[-93,-2779],[-243,609],[127,2172]],[[157450,553461],[-258,-1218],[-95,-3180],[-196,1415],[82,2156]],[[209241,552096],[0,-12823]],[[209241,539273],[-860,0],[-178,810],[-527,0]],[[207676,540083],[9,3276]],[[212063,545588],[-553,-13],[-2,-6518]],[[211508,539057],[-1052,-1]],[[210456,539056],[-1,6519],[-160,-2],[1,6508]],[[210456,539056],[-534,-4],[0,-1652],[-681,3]],[[209241,537403],[0,1870]],[[221958,552037],[-1,-6447],[97,4],[-9,-6501]],[[222045,539093],[-1299,23]],[[220746,539116],[-462,8]],[[220284,539124],[18,6480],[-110,4],[5,6433]],[[224781,550426],[0,-4857],[78,2],[0,-6489]],[[224859,539082],[-1664,-10]],[[223195,539072],[-1150,21]],[[220284,539124],[-1617,18]],[[218667,539142],[-333,973],[-96,2185],[-334,3330]],[[217904,545630],[153,619],[-235,2617]],[[217904,545630],[-2308,-29]],[[170472,550797],[5,-6432],[-150,-2317],[-550,-959]],[[169777,541089],[-3231,-31]],[[173035,548317],[0,-10901]],[[173035,537416],[-1,-2155]],[[173034,535261],[-435,-110],[-89,788]],[[172510,535939],[-70,1545],[-616,2886],[-769,-192],[-280,-1214]],[[170775,538964],[-894,-1263],[-120,595]],[[169761,538296],[16,2793]],[[226903,550417],[68,-4868],[-1,-6487]],[[226970,539062],[-981,13]],[[225989,539075],[-1130,7]],[[229314,548758],[6,-2652],[212,-1371],[-110,-2548],[10,-3117]],[[229432,539070],[-1342,-24]],[[228090,539046],[-1120,16]],[[158652,541538],[-2669,23],[1,542]],[[156223,547780],[371,1366],[-165,-1818],[270,11],[248,1911],[329,-1488]],[[207676,540083],[-352,-1344]],[[207324,538739],[-349,-4],[-351,-1338],[-710,7],[-585,557],[-127,1621],[-225,-2],[-117,3243],[-599,530],[-707,-5]],[[233987,542316],[-1,-1623]],[[233986,540693],[-2817,4]],[[231169,540697],[-56,8065]],[[231169,540697],[7,-1623],[-303,3]],[[230873,539077],[-1399,-8]],[[229474,539069],[-42,1]],[[175013,544728],[1,-5708],[-353,21]],[[174661,539041],[-461,-3],[-274,-1604],[-891,-18]],[[165141,539034],[20,-10944]],[[165161,528090],[-2024,0],[-2593,63]],[[160544,528153],[0,6416]],[[160544,534569],[359,11],[-157,2684],[251,3313],[-262,1336]],[[191889,540562],[-24,-9125]],[[191865,531437],[0,-675]],[[191865,530762],[-1399,153]],[[190466,530915],[-777,9]],[[189689,530924],[-178,1515],[195,2306],[-474,569],[-329,2182],[-426,4031]],[[239843,541603],[18,-6465]],[[239861,535138],[2,-4863]],[[239863,530275],[-1052,-76]],[[238811,530199],[4,1716],[-1019,-55]],[[237796,531860],[-43,6341],[94,109],[5,3969]],[[251183,535146],[2,-1610]],[[251185,533536],[-1045,-5],[1,3214],[-1046,-7],[1,1617],[-346,13],[-67,3221]],[[248683,541589],[281,995],[1035,453],[493,1189],[335,1615],[517,690]],[[251344,546531],[2,-4943],[190,-1609],[-348,15],[-5,-4848]],[[214668,545597],[3,-4901]],[[214671,540696],[-1,-1616]],[[214670,539080],[-2316,-18]],[[212354,539062],[-846,-5]],[[218667,539142],[262,-751],[-62,-3093]],[[218867,535298],[-369,-884],[-548,257],[-360,-2039]],[[217590,532632],[0,1615],[-698,1],[0,4816],[-1166,16],[-1,1620],[-1054,-4]],[[253820,544308],[0,-2728],[148,-1606],[-346,-13],[-2,-4817]],[[253620,535144],[-1568,10]],[[252052,535154],[1,8035],[354,0],[-1,1615],[281,8]],[[252687,544812],[-46,-3487],[634,3347],[545,-364]],[[179847,539135],[-2885,-2989],[-517,-3856],[-988,1959]],[[175457,534249],[-555,1774]],[[174902,536023],[-222,561],[-19,2457]],[[207324,538739],[0,-2429],[-481,-1],[56,-6431]],[[206899,529878],[-149,-3],[0,-6510],[-119,1]],[[206631,523366],[-3371,30]],[[203260,523396],[2,6487],[106,4],[-6,6446],[97,2],[-1,6474],[96,273]],[[203260,523396],[-118,-5],[-3,-8127],[-123,-27],[0,-3173]],[[203016,512064],[-1361,-4],[-1,3224],[108,-22],[0,5983],[-512,206],[100,2748],[-171,715]],[[201179,524914],[0,4963],[-191,-49],[-58,4866],[-348,2],[-60,1616],[-1571,-11]],[[198951,536301],[-119,265]],[[198832,536566],[-129,4838]],[[184190,532300],[-1,-814],[-687,-6],[15,-3299],[-666,-1967]],[[182851,526214],[-255,180],[-220,1599],[-323,48],[141,1392],[-197,1673],[207,1275],[-352,4420],[134,2838]],[[235190,534196],[-1183,4]],[[234007,534200],[-21,6493]],[[237796,531860],[-40,-1612]],[[237756,530248],[-1572,8],[92,2246]],[[155397,542079],[36,-7597]],[[155433,534482],[-1024,26],[-6,-1764]],[[154403,532744],[-413,-941],[-401,1402],[-173,-855],[164,5828],[40,-3886],[154,66],[163,3197],[-178,1201],[335,1945],[-445,-237],[-277,1653]],[[160544,534569],[-1998,-62]],[[158546,534507],[-2722,-5]],[[155824,534502],[-391,-20]],[[189689,530924],[-790,-90],[-193,-3456],[-681,-3145]],[[188025,524233],[-2,4020],[-344,10],[-10,9662]],[[241986,539680],[-2,-4580]],[[241984,535100],[-2123,38]],[[251185,533536],[-1,-4392]],[[251184,529144],[-281,766],[-2333,3002]],[[248570,532912],[1,-217]],[[248571,532695],[-1,217]],[[248570,532912],[-533,692],[-150,1914]],[[247887,535518],[-158,1305]],[[247729,536823],[-232,120]],[[247497,536943],[-117,450]],[[247380,537393],[-170,465]],[[247210,537858],[1092,2058],[381,1673]],[[198832,536566],[-2,-1875],[-409,1],[-280,-2448],[-812,5],[-234,-521],[0,-1926],[-1045,-3]],[[196050,529799],[2,2685],[-229,1641],[-121,3955],[-233,23],[-59,3203]],[[261640,541399],[0,-9499]],[[261640,531900],[-1747,-14]],[[259893,531886],[0,4842]],[[259893,536728],[1,3448]],[[259894,540176],[1066,-173],[680,1396]],[[196050,529799],[-402,-5]],[[195648,529794],[-1369,1],[-6,-1634]],[[194273,528161],[-522,16],[-137,3239]],[[193614,531416],[699,2],[39,8828]],[[193614,531416],[-1749,21]],[[169761,538296],[-37,88]],[[169724,538384],[-623,62],[-454,-1721],[-56,-1735],[-390,-2246],[-741,-1821]],[[167460,530923],[-633,1584],[-9,4567],[-505,2903]],[[167460,530923],[206,-1170],[-54,-2423]],[[167612,527330],[-388,-1247],[-851,-272]],[[166373,525811],[-390,134],[-275,-1277],[-551,-390]],[[165157,524278],[4,3812]],[[234007,534200],[29,-4880]],[[234036,529320],[-1739,14]],[[232297,529334],[-1380,20]],[[230917,529354],[-44,9723]],[[217590,532632],[-397,-2552],[-436,-1343],[-920,-1191],[-478,1151],[-416,-370]],[[214943,528327],[1,2829]],[[214944,531156],[-135,1457],[-12,6465],[-127,2]],[[172510,535939],[0,-949],[-531,-522],[0,-4866],[-168,2],[-1,-2312]],[[171810,527292],[-342,20]],[[171468,527312],[-26,6322],[-175,-16],[-173,2490],[-351,-8],[32,2864]],[[209241,537403],[-2,-4854]],[[209239,532549],[2,-6235]],[[209241,526314],[3,-1180]],[[209244,525134],[-252,2],[0,1618],[-714,26],[2,1575],[-351,-6],[0,1522],[-1030,7]],[[180579,539634],[-29,-2628],[-262,-4539],[-67,-3326],[-131,-1223],[266,-995],[5,-2349],[-249,-34],[-187,-1420],[189,-1949],[-181,-2072]],[[179933,519099],[-282,-1616],[-344,766],[-14,-1410],[527,-2617],[-250,-1838]],[[179570,512384],[-3571,-27],[-470,-1640]],[[175529,510717],[-390,422],[-163,2564],[-956,-4]],[[174020,513699],[362,4439],[258,2019],[-236,2563],[-686,1930]],[[173718,524650],[258,2608]],[[173976,527258],[446,46],[76,2435],[240,1363],[665,-892],[157,1127],[335,203],[-438,2709]],[[182851,526214],[3,-24]],[[182854,526190],[-34,-1070],[-471,-700],[-670,-2752]],[[181679,521668],[-944,-3979],[-194,-400],[-349,1946],[-259,-136]],[[220746,539116],[-2,-6512],[105,-7]],[[220849,532597],[-3,-6355]],[[220846,526242],[-1761,43]],[[219085,526285],[-327,3734],[198,1955],[-89,3324]],[[223195,539072],[-2,-6466]],[[223193,532606],[-2344,-9]],[[174902,536023],[1,-2306],[-958,-326],[31,-6133]],[[173718,524650],[-339,2599]],[[173379,527249],[-122,1925],[104,1310],[-372,3279],[45,1498]],[[212354,539062],[9,-6489]],[[212363,532573],[-197,-14]],[[212166,532559],[-2927,-10]],[[225989,539075],[-2,-6478]],[[225987,532597],[-2698,1]],[[223289,532598],[-96,8]],[[214944,531156],[-1391,13],[0,1436],[-1190,-32]],[[230917,529354],[-1,-1621]],[[230916,527733],[-866,4]],[[230050,527737],[45,1766],[-114,3993],[-380,2928],[-127,2645]],[[228090,539046],[-2,-6457]],[[228088,532589],[-2023,4]],[[226065,532593],[-78,4]],[[230050,527737],[35,-1611]],[[230085,526126],[-1852,-1]],[[228233,526125],[-87,1154],[-58,5310]],[[171468,527312],[-1045,34]],[[170423,527346],[-53,1]],[[170370,527347],[16,3854],[-350,1],[2,1631],[-349,-8],[35,5559]],[[170370,527347],[-2758,-17]],[[247207,537862],[3,-4]],[[248571,532695],[0,-5698],[-321,-1]],[[248250,526996],[-719,-11]],[[247531,526985],[-3,3230],[-343,-15],[1,1609],[-352,7],[6,6374]],[[246840,538190],[367,-328]],[[304871,538016],[-24,-11134],[233,-2084],[-240,-2015],[-258,-234],[344,-2135],[-221,-1593],[445,-9902],[739,1165]],[[305889,510084],[248,-6545]],[[306137,503539],[-330,592],[-241,-1132]],[[305566,502999],[-450,139],[79,-2294],[-907,625]],[[304288,501469],[-183,1244],[-102,3478],[-276,-236],[62,1778],[-139,3374],[-376,-344],[-347,651],[-372,9721]],[[302555,521135],[466,1247],[-87,1101],[431,1781],[-152,2424],[219,2371],[-153,838],[286,2948],[372,1242],[93,2931]],[[307384,534699],[-16,-13241],[-374,-415],[-14,-2790],[297,274],[227,-5338],[-292,-284],[68,-1531],[-1391,-1290]],[[188025,524233],[-403,-667]],[[187622,523566],[-350,1101],[-490,-286],[-233,-1732]],[[186549,522649],[-588,1549],[-293,6520],[-198,-55]],[[185470,530663],[53,1620]],[[259893,531886],[-1,-5144]],[[259892,526742],[-133,-900],[-413,823],[-698,-828],[-156,-2487],[-258,-538]],[[258234,522812],[-83,2590],[0,4873],[-349,11]],[[257802,530286],[0,3251],[697,-26],[0,3238],[1394,-21]],[[198951,536301],[351,-3235],[408,-2428],[-126,-2500]],[[199584,528138],[-454,7],[0,-1079],[-345,0],[-233,-1614],[-461,6],[-62,-7075],[-689,-1094],[-914,66]],[[196426,517355],[-551,2736]],[[195875,520091],[-174,1330],[10,5159],[-63,3214]],[[201179,524914],[-661,1614],[-693,2],[0,1610],[-241,-2]],[[173379,527249],[-1569,43]],[[219085,526285],[-4142,17]],[[214943,526302],[0,2025]],[[253620,535144],[-3,-3220]],[[253617,531924],[2,-6051]],[[253619,525873],[-776,1095]],[[252843,526968],[-385,757],[-418,-132]],[[252040,527593],[-694,1110]],[[251346,528703],[-162,441]],[[251183,535146],[869,8]],[[241984,535100],[-2,-4840]],[[241982,530260],[-158,-2623],[-854,-1719]],[[240970,525918],[-513,-3612]],[[240457,522306],[-838,12]],[[239619,522318],[-5,4660],[247,5],[2,3292]],[[309532,520631],[304,-6938],[-325,-226]],[[309511,513467],[-690,-626],[93,-2259],[-353,-313],[61,-1593],[-355,-304],[157,-4050],[-1023,-1483]],[[307401,502839],[-7,-12]],[[307394,502827],[-61,341],[-964,-1079],[-232,1450]],[[160544,528153],[-247,-4],[10,-4864],[241,-1079]],[[160548,522206],[-796,-345],[-318,-1062]],[[159434,520799],[-910,-1886]],[[158524,518913],[9,9424]],[[158533,528337],[13,6170]],[[158533,528337],[-318,-1795],[-454,494],[-602,-1308],[-130,-1178]],[[157029,524550],[-330,4339],[-600,1896],[-259,-235]],[[155840,530550],[-2,54]],[[155838,530604],[-14,3898]],[[155838,530604],[-183,-462],[-495,2189],[-757,413]],[[235406,533824],[28,-10701]],[[235434,523123],[-1381,-10]],[[234053,523113],[-17,6207]],[[237756,530248],[0,-3231],[116,-9],[14,-2987]],[[237886,524021],[-1641,-2],[226,-872]],[[236471,523147],[-1037,-24]],[[251026,525384],[-2773,33]],[[248253,525417],[-3,1579]],[[251346,528703],[-2,-1704],[-318,2],[0,-1617]],[[155418,529962],[8,-6731]],[[155426,523231],[-1689,63]],[[153737,523294],[-68,3037],[184,1180],[-262,4093],[309,-882],[393,425],[493,-351],[259,901],[373,-1735]],[[214943,526302],[-5,-2]],[[214938,526300],[-2623,9]],[[212315,526309],[-150,2]],[[212165,526311],[1,6248]],[[228233,526125],[-2090,12]],[[226143,526137],[-83,1]],[[226060,526138],[5,6455]],[[223289,532598],[-7,-6387]],[[223282,526211],[-1986,21]],[[221296,526232],[-450,10]],[[226060,526138],[-1995,52]],[[224065,526190],[-783,21]],[[212165,526311],[-2924,3]],[[185470,530663],[-558,-802],[1,-1628],[-449,-1027],[40,-1093],[-451,-1375]],[[184053,524738],[-389,163],[-476,-1895],[-334,3184]],[[255011,527072],[0,-1623],[-222,0],[-2,-3274],[-416,-8]],[[254371,522167],[-587,1081]],[[253784,523248],[-213,794],[48,1831]],[[253617,531924],[1399,-8],[-5,-4844]],[[238811,530199],[-2,-3213],[-238,7],[11,-4605]],[[238582,522388],[9,-3269]],[[238591,519119],[-694,16]],[[237897,519135],[-11,4886]],[[194273,528161],[-16,-1570],[-232,-20],[-119,-1641],[-35,-4874],[-1029,-1611],[-3,-3241],[-365,3],[-1,-3287]],[[192473,511920],[-459,14],[21,11394],[-200,2],[30,7432]],[[190466,530915],[-30,-11211],[-346,-1209],[4,-3242],[-336,0],[-17,-6512]],[[189741,508741],[-32,-6238]],[[189709,502503],[19,-3579]],[[189728,498924],[-493,1905],[18,850],[-441,2415]],[[188812,504094],[13,11149],[64,-1],[-3,5424],[-518,4],[-341,1882],[-405,1014]],[[192473,511920],[739,-89]],[[193212,511831],[-1,-3075]],[[193211,508756],[-2525,-184],[-945,169]],[[186549,522649],[-756,-104],[-628,-2190]],[[185165,520355],[-202,2288],[-910,2095]],[[157029,524550],[63,-2277]],[[157092,522273],[-463,-110]],[[156629,522163],[-284,1059],[-919,9]],[[155418,529962],[422,588]],[[239619,522318],[-1037,70]],[[242661,530268],[51,-9640]],[[242712,520628],[-343,-3]],[[242369,520625],[1,1598],[-1042,59],[-2,-1612],[-997,38]],[[240329,520708],[128,1598]],[[241982,530260],[679,8]],[[245796,530213],[-1,-3233],[691,9]],[[246486,526989],[-5,-6392]],[[246481,520597],[-2401,-12]],[[244080,520585],[-30,9671]],[[244050,530256],[1746,-43]],[[244080,520585],[-1368,43]],[[242661,530268],[1389,-12]],[[209244,525134],[12,-12455]],[[209256,512679],[-50,-4012]],[[209206,508667],[-2732,55]],[[206474,508722],[1,6547],[142,-1],[14,8098]],[[195875,520091],[-795,-463],[-177,-2270],[-459,3],[-573,-1888],[-130,-1894],[-228,1],[-3,-1752],[-298,3]],[[232297,529334],[32,-6470]],[[232329,522864],[-1381,-3]],[[230948,522861],[-32,4872]],[[234053,523113],[0,-269]],[[234053,522844],[-1724,20]],[[252040,527593],[20,-5420],[700,-8]],[[252760,522165],[-8,-6432]],[[252752,515733],[-696,32]],[[252056,515765],[-692,-1],[9,1610],[-345,-7]],[[251028,517367],[-2,8017]],[[158524,518913],[-1068,1088],[-329,768],[-35,1504]],[[165157,524278],[-366,-437]],[[164791,523841],[-600,-1643],[-745,-544],[-478,786]],[[162968,522440],[-730,-1784]],[[162238,520656],[-782,-457],[-46,928],[-635,569]],[[160775,521696],[-227,510]],[[203016,512064],[45,-3465]],[[203061,508599],[-4592,141]],[[198469,508740],[-941,-34]],[[197528,508706],[337,4066],[-1591,0],[48,4006],[104,577]],[[230948,522861],[3,-3246]],[[230951,519615],[-1623,13]],[[229328,519628],[-7,1157],[513,1813],[251,3528]],[[253784,523248],[-5,-1258],[-1019,175]],[[170423,527346],[14,-2610]],[[170437,524736],[-401,-3204],[0,-4052],[-226,-813],[-642,33],[1,-1372],[-752,-187],[118,-2760],[304,1],[77,-3742]],[[168916,508640],[-1798,-1]],[[167118,508639],[49,1621],[4,8063],[-288,1],[0,1596],[-518,16],[8,5875]],[[174020,513699],[-270,-3512]],[[173750,510187],[-1345,32]],[[172405,510219],[-2,1583],[-584,-9],[-295,3221],[-171,-21],[-111,3312],[-289,3248],[113,3191],[-629,-8]],[[255706,527058],[117,-1614],[-5,-6481],[175,-7]],[[255993,518956],[-481,-4769],[-453,-2674],[26,-1006]],[[255085,510507],[-74,93]],[[255011,510600],[-348,1798],[263,2651],[-666,243],[263,2751],[-117,1110],[148,2102],[-183,912]],[[255011,527072],[695,-14]],[[248253,525417],[-2,-6367]],[[248251,519050],[4,-3225]],[[248255,515825],[-1774,-77]],[[246481,515748],[0,4849]],[[246486,526989],[1045,-4]],[[214938,526300],[2,-8789]],[[214940,517511],[-1,-8089]],[[214939,509422],[-2667,29]],[[212272,509451],[0,3227]],[[212272,512678],[43,13631]],[[219085,526285],[420,-1613],[146,-2779],[-339,-2104]],[[219312,519789],[-135,-1298],[382,-971]],[[219559,517520],[-3145,-9]],[[216414,517511],[-1474,0]],[[212272,512678],[-3016,1]],[[221296,526232],[3,-6469]],[[221299,519763],[-1987,26]],[[185165,520355],[-3,-2744],[506,-650],[135,-1730],[3,-4866],[343,-1],[-3,-1637],[400,-13],[67,-3224],[282,-801],[790,-48],[2,-1347],[860,8]],[[188547,503302],[-99,-3225],[-305,274]],[[188143,500351],[-567,-772],[-129,1024],[-637,-765],[-533,835],[-280,-2222],[-238,584],[-857,90],[-96,-2021]],[[184806,497104],[-526,1386],[-10,1397],[-348,4611],[-316,914],[-262,-706],[-323,1502],[13,3600],[-287,1010],[-383,2793],[-233,2701],[-86,3613],[-272,361],[-94,1382]],[[224065,526190],[-1,-6467]],[[224064,519723],[-2739,40]],[[221325,519763],[-26,0]],[[226143,526137],[-2,-6467]],[[226141,519670],[-6,-6480]],[[226135,513190],[-2051,63]],[[224084,513253],[-13,1]],[[224071,513254],[-7,6469]],[[229328,519628],[389,-3087],[628,-1746]],[[230345,514795],[-1456,6],[-40,-559],[-610,15]],[[228239,514257],[-2,4850]],[[228237,519107],[-4,7018]],[[228237,519107],[-408,548],[-1688,15]],[[167118,508639],[-1414,-28]],[[165704,508611],[-332,4],[2,1361]],[[165374,509976],[84,1859],[-342,39],[1,1607],[-347,28],[21,10332]],[[251028,517367],[-1054,48]],[[249974,517415],[-9,1640],[-1714,-5]],[[172405,510219],[-826,-23],[-2,-1616],[-596,-10],[-301,1240],[-304,-1200],[-378,943],[-318,-1615]],[[169680,507938],[-764,702]],[[188812,504094],[-265,-792]],[[237897,519135],[-1085,-11]],[[236812,519124],[-341,4023]],[[165374,509976],[-1964,15]],[[163410,509991],[-24,269]],[[163386,510260],[-111,2406],[145,4765],[366,767],[-140,1600],[-678,2642]],[[206474,508722],[-142,2]],[[206332,508724],[-2606,-129]],[[203726,508595],[-665,4]],[[264518,520373],[-131,-4],[15,-7954]],[[264402,512415],[-335,1]],[[264067,512416],[-1024,59]],[[263043,512475],[5,1628]],[[263048,514103],[0,9277]],[[263048,523380],[752,-2508],[718,-499]],[[155426,523231],[0,-1322],[-345,8],[171,-1358],[345,-537],[-450,-2154],[-12,-1076]],[[155135,516792],[6,-4051],[-896,-4],[0,-2601],[169,-5]],[[154414,510131],[-4,-597]],[[154410,509534],[-766,17]],[[153644,509551],[191,6727],[-98,7016]],[[156629,522163],[0,-1647],[515,-2132],[1,-1597]],[[157145,516787],[-1,-1893],[-346,-271]],[[156798,514623],[-744,2159],[-919,10]],[[236812,519124],[284,-2536]],[[237096,516588],[-222,-1934],[-374,-651]],[[236500,514003],[-341,795],[-1058,-11]],[[235101,514787],[1,1614],[-1027,-8]],[[234075,516393],[-22,6451]],[[232329,522864],[30,-6471]],[[232359,516393],[-1030,-8]],[[231329,516385],[-347,13],[-31,3217]],[[234075,516393],[-344,3]],[[233731,516396],[-1372,-3]],[[163386,510260],[-629,17],[17,874],[-376,1203],[-462,444],[26,1607],[414,1539],[112,2268],[-250,2444]],[[239619,522318],[0,-3212],[333,-17],[8,-2705]],[[239960,516384],[-1367,53]],[[238593,516437],[-2,2682]],[[240329,520708],[8,-1270],[308,-144],[354,-2360],[-276,-2707]],[[240723,514227],[-762,15]],[[239961,514242],[-1,2142]],[[242369,520625],[-6,-8009]],[[242363,512616],[-1675,1]],[[240688,512617],[35,1610]],[[159434,520799],[0,-1905],[284,-1586]],[[159718,517308],[-2288,-7],[-285,-514]],[[160775,521696],[0,-3313],[-116,6],[3,-4865],[-600,-5]],[[160062,513519],[3,2149],[-347,1640]],[[163410,509991],[119,-3799],[225,-798]],[[163754,505394],[-3866,76]],[[159888,505470],[69,1165]],[[159957,506635],[-196,2311],[405,1008],[-239,2616],[135,949]],[[184806,497104],[3,-2717],[-506,66]],[[184303,494453],[-906,-18]],[[183397,494435],[-56,1597],[-348,2544],[-106,-614],[-845,1225],[-633,3398],[-141,1578],[-365,-189],[52,2183],[-181,-234],[-402,-2430],[55,-905],[-491,-1771],[-716,3192],[20,1138]],[[179240,505147],[217,1310],[9,5102],[104,825]],[[309697,499440],[-326,8144],[343,307],[-203,5576]],[[310206,521389],[551,-1389],[510,-516],[-213,-1647],[200,-1810],[-163,-2048],[408,-2916],[145,1141],[349,-534],[352,-3817],[161,-2744],[-592,-2997],[-880,-140],[-164,-1985],[-252,636],[-149,-1354],[-202,2089],[-181,-786],[-141,-3116],[-248,1984]],[[304288,501469],[-305,-404],[-9,-1934],[-241,39]],[[303733,499170],[-304,-527]],[[303429,498643],[-117,2061],[-640,1070],[-291,3135],[-430,-1180],[-152,5251],[122,80],[-151,4819]],[[301770,513879],[26,2283],[518,-340],[-235,2392],[476,2921]],[[266792,512571],[-1372,-94]],[[265420,512477],[-1018,-62]],[[264518,520373],[261,-2225],[563,-388],[377,-1459],[555,-1119],[218,171],[319,-1624],[-19,-1158]],[[244080,520585],[-2,-6434]],[[244078,514151],[-2,-1590],[-344,26]],[[243732,512587],[-1369,29]],[[246481,515748],[-686,31],[0,-1629]],[[245795,514150],[-1717,1]],[[197528,508706],[-1036,15]],[[196492,508721],[-3281,35]],[[221325,519763],[-3,-6470]],[[221322,513293],[-1536,18]],[[219786,513311],[-158,1348],[120,1153],[-189,1708]],[[224071,513254],[-2371,30]],[[221700,513284],[-378,9]],[[228239,514257],[0,-2714]],[[228239,511543],[-746,-4]],[[227493,511539],[-1359,31]],[[226134,511570],[1,1620]],[[231329,516385],[38,-4380]],[[231367,512005],[-336,821]],[[231031,512826],[-637,896]],[[230394,513722],[-49,1073]],[[238593,516437],[-6,-3147]],[[238587,513290],[-26,17]],[[238561,513307],[-163,843],[-522,101],[-780,2337]],[[249974,517415],[-2,-6482]],[[249972,510933],[-1721,20]],[[248251,510953],[4,4872]],[[219786,513311],[-178,-2703],[123,-1550],[-312,142],[-35,-2389]],[[219384,506811],[-387,-2543],[-370,1156],[-115,-974]],[[218512,504450],[-583,57],[-208,-834],[-377,334]],[[217344,504007],[2,4597],[-1015,-5],[83,8912]],[[217344,504007],[-269,-1030],[-621,-1015],[-210,-1237],[-503,175],[-264,-1035],[-539,-243]],[[214938,499622],[1,9800]],[[252056,515765],[-7,-3234],[109,-1632]],[[252158,510899],[-950,13],[2,-1661]],[[251210,509251],[-675,9]],[[250535,509260],[-1,1662],[-562,11]],[[159957,506635],[-1846,-55],[-387,968],[-169,1538],[-534,2059],[129,2390],[-300,15]],[[156850,513550],[-52,1073]],[[156850,513550],[-43,-124]],[[156807,513426],[-486,-577],[117,-1993],[-201,-742]],[[156237,510114],[-1823,17]],[[238561,513307],[-382,-977],[-277,-2080],[-23,-1945]],[[237879,508305],[-685,14]],[[237194,508319],[-679,14]],[[236515,508333],[-15,5670]],[[239961,514242],[-4,-3220]],[[239957,511022],[-577,12],[2,-1654]],[[239382,509380],[-216,1965],[-579,1945]],[[235101,514787],[15,-8081]],[[235116,506706],[-1367,-14]],[[233749,506692],[6,4861]],[[233755,511553],[-24,4843]],[[233755,511553],[-2201,-4]],[[231554,511549],[-187,456]],[[248251,510953],[-430,7],[0,-1618],[-327,3]],[[247494,509345],[-1694,-51]],[[245800,509294],[-5,4856]],[[252752,515733],[340,-44],[-9,-3220],[342,-69],[182,-3245],[999,-1069]],[[254606,508086],[-385,-2583],[-242,-2789]],[[253979,502714],[-8,-1]],[[253971,502713],[-10,-1]],[[253961,502712],[-693,38]],[[253268,502750],[-16,3221],[-670,52]],[[252582,506023],[14,4857],[-438,19]],[[303429,498643],[-266,-4622],[-406,-3326]],[[302757,490695],[-370,576],[-32,2012],[-647,-2107],[393,-1789],[-189,-2754]],[[301912,486633],[-573,-426]],[[301339,486207],[0,-16]],[[301339,486207],[-59,9193]],[[301280,495400],[-86,9641],[-121,9365]],[[301073,514406],[217,752],[480,-1279]],[[230394,513722],[3,-5426]],[[230397,508296],[-1199,-12]],[[229198,508284],[-5,3228],[-954,31]],[[236515,508333],[-686,5],[-1,-1627]],[[235828,506711],[-712,-5]],[[301280,495400],[-90,-875],[-585,121],[-254,-2830],[-201,2230]],[[300150,494046],[-446,795],[-524,2812]],[[299180,497653],[520,1849],[112,1480],[-264,3054],[383,3039],[-19,1891]],[[299912,508966],[388,4730],[214,623],[386,-1123],[173,1210]],[[240688,512617],[-96,-2433],[64,-4037]],[[240656,506147],[-95,-2137]],[[240561,504010],[-562,444],[-38,2207]],[[239961,506661],[97,22],[-1,4337],[-100,2]],[[245800,509294],[3,-3236]],[[245803,506058],[-2030,-24]],[[243773,506034],[-41,6553]],[[159888,505470],[-167,-669],[70,-1970]],[[159791,502831],[-1153,206],[-234,1076],[-631,10],[-781,720],[-578,-1960],[-382,1172]],[[156032,504055],[-98,1557],[388,2208],[-85,2294]],[[175529,510717],[154,-826],[-340,-5246],[151,-1455],[0,-3805]],[[175494,499385],[-398,-1021]],[[175096,498364],[-634,868],[-4,2312],[-267,893],[0,3275],[-765,34]],[[173426,505746],[189,1739],[-44,1635],[179,1067]],[[231554,511549],[662,-3749],[173,-272]],[[232389,507528],[-309,-828],[-3,-1608],[-1680,19]],[[230397,505111],[0,3185]],[[307819,495119],[63,-2040],[-255,1149],[192,891]],[[308823,498239],[322,-1210],[-422,-2791],[-256,1682],[356,2319]],[[309697,499440],[-194,-3153],[-121,2654],[-613,1160],[154,-1192],[-465,-1333],[31,1761],[-402,-1706],[118,-3275],[-828,3345],[180,1911],[-237,2132],[81,1095]],[[221700,513284],[1,-6478]],[[221701,506806],[-279,1]],[[221422,506807],[-2038,4]],[[224084,513253],[3,-6454]],[[224087,506799],[-1659,3]],[[222428,506802],[-727,4]],[[239382,509380],[134,-2743]],[[239516,506637],[-427,-1841]],[[239089,504796],[-534,227]],[[238555,505023],[9,1658],[-687,3],[2,1621]],[[226134,511570],[12,-9713]],[[226146,501857],[-2029,49]],[[224117,501906],[-30,4893]],[[179240,505147],[-395,-1629],[-367,938],[-230,-2310],[-308,-655],[142,-3509],[-185,-1566]],[[177897,496416],[-297,-1464],[-332,-476],[-1622,25],[-30,-1653],[-277,66]],[[175339,492914],[2,3219],[164,2],[-11,3250]],[[212272,509451],[-19,-8102],[-1681,-4]],[[210572,501345],[-701,13],[-661,-630]],[[209210,500728],[-4,7939]],[[242363,512616],[57,-6548]],[[242420,506068],[-1764,79]],[[243773,506034],[0,-3210]],[[243773,502824],[-1350,15]],[[242423,502839],[-3,3229]],[[262700,510887],[28,-4815]],[[262728,506072],[-1240,27],[-113,-876]],[[261375,505223],[-305,883]],[[261070,506106],[220,4694],[-69,1784]],[[261221,512584],[458,-42],[1,-1633],[1020,-22]],[[264067,512416],[-14,-6399]],[[264053,506017],[-1325,55]],[[262700,510887],[342,-32],[1,1620]],[[265420,512477],[-20,-6431]],[[265400,506046],[-1347,-29]],[[227493,511539],[8,-6473]],[[227501,505066],[-4,-4842]],[[227497,500224],[-1004,10]],[[226493,500234],[-9,1613],[-338,10]],[[229198,508284],[-7,-3209]],[[229191,505075],[-1690,-9]],[[233749,506692],[-652,-11],[0,-2565]],[[233097,504116],[-708,3412]],[[239961,506661],[-445,-24]],[[250535,509260],[0,-6476]],[[250535,502784],[-1731,65]],[[248804,502849],[-1313,5]],[[247491,502854],[3,6491]],[[252582,506023],[-689,18],[2,1616],[-685,-6],[0,1600]],[[173426,505746],[-385,-1718],[-296,-3771],[-219,-1145],[9,-3403]],[[172535,495709],[-741,0],[0,1607],[-294,1057],[-1059,-21],[-726,-3486]],[[169715,494866],[-738,-18],[245,2192],[-29,1556],[314,2473],[-552,1434],[612,1573],[-29,2092],[142,1770]],[[156032,504055],[-16,-548]],[[156016,503507],[-1264,17]],[[154752,503524],[-340,334],[-2,5676]],[[165704,508611],[55,-3187],[-11,-9610]],[[165748,495814],[-676,-6],[-1,1543],[-342,912],[-1014,-19],[1,2354]],[[163716,500598],[38,4796]],[[154752,503524],[16,-5366],[-345,3],[16,-1350],[-284,-293],[116,-1140]],[[154271,495378],[-947,-137]],[[153324,495241],[89,2631],[44,7616],[170,1569],[17,2494]],[[214938,499622],[-3,-12]],[[214935,499610],[-311,-1407],[-474,240],[-222,-2776],[-71,-2959],[-2964,12]],[[210893,492720],[-2,2156],[-338,-10],[19,6479]],[[247491,502854],[1,-4850]],[[247492,498004],[-1354,-31],[0,1610],[-337,6],[2,1612]],[[245803,501201],[0,4857]],[[253268,502750],[-7,-1765]],[[253261,500985],[-1005,107]],[[252256,501092],[2,1635],[-1723,57]],[[296979,508865],[60,-3257],[-127,-958]],[[296912,504650],[-471,86],[-134,-1750],[-359,-1102]],[[295948,501884],[-849,1672]],[[295099,503556],[103,5410]],[[295202,508966],[1777,-101]],[[299180,497653],[-205,-1076]],[[298975,496577],[-266,1736],[213,1023],[-144,948],[183,1193],[-188,668],[204,1295],[-286,977]],[[298691,504417],[181,2000],[-64,2446]],[[298808,508863],[1104,103]],[[295099,503556],[-145,-2596],[-226,-366]],[[294728,500594],[-75,974],[149,3512],[-119,604],[97,3231]],[[294780,508915],[422,51]],[[294728,500594],[65,-315]],[[294793,500279],[-930,-2003],[-662,-178]],[[293201,498098],[-213,5176],[-115,5362]],[[292873,508636],[1907,279]],[[298691,504417],[-203,-1307],[-284,945],[-413,-3859],[-312,777]],[[297479,500973],[-299,925],[174,1659],[-442,1093]],[[296979,508865],[1829,-2]],[[196492,508721],[81,-2400],[-1,-6524],[53,-2],[-1,-6560],[65,0]],[[196689,493235],[-1,-1658]],[[196688,491577],[-673,4],[0,-1650],[-344,-3],[9,-1603],[-502,-5],[2,-1644],[-615,-55]],[[194565,486621],[-361,2183],[-278,575],[-278,-718],[-65,-1424],[-340,-839],[-198,2909],[-378,-147],[-165,1088]],[[192502,490248],[0,2320],[-270,2958],[-406,2562],[50,1661],[-272,1204],[-814,-4],[0,1554],[-1081,0]],[[290927,508615],[234,-781],[324,-14558],[-26,-1329]],[[291459,491947],[-889,-543]],[[290570,491404],[-581,-367],[-299,867]],[[289690,491904],[-769,2247]],[[288921,494151],[-1154,3457]],[[287767,497608],[260,2084],[1343,6200],[870,2516],[687,207]],[[198469,508740],[221,-3931],[453,-2060],[152,402],[684,-2631]],[[199979,500520],[185,-1795],[287,-397],[154,-2198],[-5,-2947]],[[200600,493183],[-3911,52]],[[206332,508724],[28,-15346]],[[206360,493378],[-1,-12616]],[[206359,480762],[-2612,-66]],[[203747,480696],[21,19902]],[[203768,500598],[-42,7997]],[[203768,500598],[-1168,-134],[-2621,56]],[[293201,498098],[-645,-417],[133,-5014],[-525,-324]],[[292164,492343],[-705,-396]],[[290927,508615],[1946,21]],[[209210,500728],[5,-7271]],[[209215,493457],[-2855,-79]],[[169715,494866],[13,-4024]],[[169728,490842],[-1637,145],[-4,-1633],[-2343,-17]],[[165744,489337],[4,6477]],[[237194,508319],[5,-4865]],[[237199,503454],[-679,9],[-2,-1632],[-677,-6],[-1,1627]],[[235840,503452],[-12,3259]],[[238555,505023],[-264,-1740],[-417,-1264]],[[237874,502019],[-336,1431],[-339,4]],[[230397,505111],[0,-3258]],[[230397,501853],[0,-1635]],[[230397,500218],[-1208,4]],[[229189,500222],[2,4853]],[[233097,504116],[341,-1014]],[[233438,503102],[0,-2921],[-654,12]],[[232784,500193],[-25,1632],[-1362,11]],[[231397,501836],[-1000,17]],[[240561,504010],[200,-612]],[[240761,503398],[-169,-3191],[-689,-567],[0,-757]],[[239903,498883],[-674,2],[0,1341]],[[239229,500226],[-140,4570]],[[221422,506807],[-9,-6505]],[[221413,500302],[-2368,-13]],[[219045,500289],[-317,676],[77,2217],[-293,1268]],[[222428,506802],[33,-13076]],[[222461,493726],[-769,-45]],[[221692,493681],[-243,467]],[[221449,494148],[-36,6154]],[[224117,501906],[15,-8145]],[[224132,493761],[-628,-3]],[[223504,493758],[-1043,-32]],[[235840,503452],[-367,-8],[16,-4852]],[[235489,498592],[-437,8]],[[235052,498600],[-236,771]],[[234816,499371],[-1378,3731]],[[183397,494435],[-268,4],[1,-3240],[-116,1],[10,-3446],[227,-982],[-443,-1878]],[[182808,484894],[-596,-1711],[-145,-1114]],[[182067,482069],[-654,3911],[-113,-748],[-563,1718],[-9,879],[-657,322],[-39,-921],[-426,1521],[-370,1],[1,1214],[-439,-1021]],[[178798,488945],[-56,216]],[[178742,489161],[-154,1983],[62,1848],[-398,879],[-33,1744],[-322,801]],[[242423,502839],[0,-2695],[-505,27]],[[241918,500171],[-647,507],[-510,2720]],[[266980,506080],[138,-2703],[-131,-3752]],[[266987,499625],[-1582,-51]],[[265405,499574],[-5,6472]],[[265400,506046],[1580,34]],[[262728,506072],[-10,-6460]],[[262718,499612],[-1346,23]],[[261372,499635],[3,5588]],[[264053,506017],[3,-6475]],[[264056,499542],[-1338,70]],[[245803,501201],[-678,11]],[[245125,501212],[-1014,-15]],[[244111,501197],[-336,9]],[[243775,501206],[-2,1618]],[[265405,499574],[-1349,-32]],[[175096,498364],[-132,-2275],[-32,-3181],[-260,7]],[[174672,492915],[-1240,21]],[[173432,492936],[-217,1684],[-680,1089]],[[163716,500598],[-1231,-21],[0,-1605],[-451,-3],[2,-1609],[-331,10]],[[161705,497370],[-2049,35]],[[159656,497405],[135,5426]],[[239229,500226],[-676,-7]],[[238553,500219],[-1077,-9]],[[237476,500210],[398,1809]],[[229189,500222],[-676,-12]],[[228513,500210],[-1016,14]],[[297479,500973],[-166,-1451]],[[297313,499522],[-157,-1497],[-296,998],[-160,-1510],[-420,996]],[[296280,498509],[-67,1872],[-265,1503]],[[159656,497405],[121,-2501]],[[159777,494904],[-1469,-89],[-166,-673],[-532,204],[-411,1117],[-498,-541],[-6,-1096],[-722,-4],[-55,1558]],[[155918,495380],[-123,1127],[43,2998],[-132,924],[521,1787],[-211,1291]],[[219045,500289],[-133,-1711],[523,-288],[58,-1572],[780,-877],[539,-1239],[-128,-869]],[[220684,493733],[-1196,-11],[0,-483]],[[219488,493239],[-1893,-6]],[[217595,493233],[-334,-5],[34,9715],[49,1064]],[[260032,504518],[-8,-4869]],[[260024,499649],[-1160,99]],[[258864,499748],[-13,3454],[458,1388]],[[259309,504590],[723,-72]],[[298975,496577],[-544,-513],[-20,-3063]],[[298411,493001],[-914,898]],[[297497,493899],[402,4106],[-586,1517]],[[307394,502827],[-140,-1573],[180,-625],[-64,-1886],[-523,-588],[177,-1427],[-225,-1986]],[[306799,494742],[-257,115],[-412,2029],[-390,-679]],[[305740,496207],[-272,275]],[[305468,496482],[309,2126],[8,3412],[-219,979]],[[189728,498924],[5,-9133]],[[189733,489791],[-389,-951],[-593,-175]],[[188751,488665],[-448,-740],[-1162,820]],[[187141,488745],[-1,811],[-499,8],[1,1607]],[[186642,491171],[338,-6],[2,1607],[490,820],[15,2406],[170,1557],[484,19],[2,2777]],[[217595,493233],[-48,-3229]],[[217547,490004],[-2628,-7]],[[214919,489997],[16,9613]],[[296280,498509],[-410,-5407]],[[295870,493102],[-68,2572],[-938,-658]],[[294864,495016],[48,3058],[-119,2205]],[[155918,495380],[-1647,-2]],[[305468,496482],[-133,-1505],[-266,329],[-18,-2929],[-277,307]],[[304774,492684],[-7,9]],[[304767,492693],[-269,531],[-119,-1120],[-300,314]],[[304079,492418],[-196,1521],[-150,5231]],[[237476,500210],[-51,-1566]],[[237425,498644],[-1936,-52]],[[241918,500171],[207,-1615]],[[242125,498556],[-525,16],[0,-1617],[-334,5],[-1,-3232]],[[241265,493728],[-356,11]],[[240909,493739],[-1010,22]],[[239899,493761],[4,5122]],[[234816,499371],[-1,-4018],[-672,-9],[-5,-1614]],[[234138,493730],[-984,19]],[[233154,493749],[-366,-7]],[[232788,493742],[-4,6451]],[[250535,502784],[-3,-8151]],[[250532,494633],[-1040,40]],[[249492,494673],[-353,36]],[[249139,494709],[-6,4906],[-327,5],[-2,3229]],[[249139,494709],[-495,33]],[[248644,494742],[-1141,-12]],[[247503,494730],[-11,3274]],[[253961,502712],[-152,-2104],[333,-532],[464,2018]],[[254606,502094],[-10,-5904]],[[254596,496190],[-339,8],[-1,-1624],[-432,11]],[[253824,494585],[-416,19]],[[253408,494604],[6,6419],[-153,-38]],[[243775,501206],[-1056,-193],[-152,-3331]],[[242567,497682],[-442,874]],[[252256,501092],[-365,1],[-8,-6465]],[[251883,494628],[-410,-12]],[[251473,494616],[-941,17]],[[255685,502676],[-302,-3069],[-169,-3411]],[[255214,496196],[-618,-6]],[[254606,502094],[72,609]],[[254678,502703],[1007,-27]],[[192502,490248],[5,-10113]],[[192507,480135],[-16,-1620],[-799,3],[0,-1615],[-653,8],[-1,-1051]],[[191038,475860],[-655,-1],[0,1504],[-643,-3]],[[189740,477360],[-2,3452]],[[189738,480812],[-5,8979]],[[226493,500234],[-2,-6499]],[[226491,493735],[-1332,24]],[[225159,493759],[-1027,2]],[[231397,501836],[40,-8076]],[[231437,493760],[-1042,2]],[[230395,493762],[2,6456]],[[232788,493742],[-1310,16]],[[231478,493758],[-41,2]],[[210893,492720],[-1678,5]],[[209215,492725],[0,732]],[[244111,501197],[-1,-6504],[-219,-857],[207,-1948],[-69,-1318]],[[244029,490570],[-834,3122]],[[243195,493692],[-279,3080],[-349,910]],[[245125,501212],[38,-9630]],[[245163,491582],[-120,124]],[[245043,491706],[-313,-400],[-41,-1496],[-287,-3]],[[244402,489807],[-373,763]],[[247503,494730],[-1,-1740]],[[247502,492990],[-1654,56],[-187,-1630]],[[245661,491416],[-498,166]],[[253408,494604],[-589,39]],[[252819,494643],[-936,-15]],[[186642,491171],[-1501,14],[-1,-1610]],[[185140,489575],[-834,8],[-3,4870]],[[203747,480696],[-170,-9]],[[203577,480687],[-2877,-39],[0,148]],[[200700,480796],[-49,12388],[-51,-1]],[[165744,489337],[-329,0],[-5,-4859],[-338,5]],[[165072,484483],[-1001,8],[0,1610],[-336,-4],[-2,1618],[-1027,-13],[-1,1606],[-664,64],[-2,3219],[-321,77],[-13,4702]],[[221449,494148],[180,-1781],[-749,47],[-196,1319]],[[294864,495016],[-214,-1344],[-132,-2763],[162,-4374]],[[294680,486535],[-165,-92]],[[294515,486443],[-1724,-1101]],[[292791,485342],[28,960],[-465,275],[-343,2130],[225,833],[-72,2803]],[[238553,500219],[-2,-6472]],[[238551,493747],[-677,-2]],[[237874,493745],[1,807],[-681,-7]],[[237194,494545],[221,1970],[10,2129]],[[239899,493761],[-13,0]],[[239886,493761],[-1006,-6]],[[238880,493755],[-329,-8]],[[228513,500210],[-4,-6463]],[[228509,493747],[-670,-20]],[[227839,493727],[-1336,7]],[[226503,493734],[-12,1]],[[230395,493762],[0,-2]],[[230395,493760],[-1217,-20]],[[229178,493740],[-669,7]],[[260024,499649],[-9,-6494]],[[260015,493155],[-615,55]],[[259400,493210],[-964,215]],[[258436,493425],[364,3555],[64,2768]],[[261372,499635],[-2,-6463]],[[261370,493172],[-640,-4]],[[260730,493168],[-715,-13]],[[260024,499649],[1348,-14]],[[264056,499542],[8,-6454]],[[264064,493088],[-669,-1]],[[263395,493087],[-679,16]],[[262716,493103],[2,6509]],[[262716,493103],[-656,52]],[[262060,493155],[-690,17]],[[266987,499625],[-62,-3376],[-470,-1067],[-157,-2040]],[[266298,493142],[-886,-31]],[[265412,493111],[-7,6463]],[[265412,493111],[-786,0]],[[264626,493111],[-562,-23]],[[175339,492914],[-169,-3],[-23,-6408]],[[175147,486503],[-644,5]],[[174503,486508],[-557,-1]],[[173946,486507],[0,3241],[391,-17],[114,1594],[220,-13],[1,1603]],[[214919,489997],[-33,-5323],[-334,-145]],[[214552,484529],[-104,-245],[-1766,9]],[[212682,484293],[343,3115],[-3812,-38]],[[209213,487370],[2,5355]],[[297497,493899],[-208,-1404],[-408,589],[-262,-2738],[-163,304]],[[296456,490650],[-487,788],[-99,1664]],[[235052,498600],[861,-2186],[275,-1379]],[[236188,495035],[12,-2914]],[[236200,492121],[-1368,-13]],[[234832,492108],[-669,3],[-25,1619]],[[304079,492418],[-79,-2770]],[[304000,489648],[-229,-1286],[-556,2438],[-134,-953],[-324,848]],[[237194,494545],[-162,-1485],[-844,1975]],[[243195,493692],[-616,1],[0,-1602]],[[242579,492091],[-668,7],[-1,1620],[-645,10]],[[173432,492936],[-215,-1206],[111,-1864],[-135,-2004]],[[173193,487862],[-118,-728],[-1,-2989]],[[173074,484145],[-2,-31284]],[[173072,452861],[-3259,-52]],[[169813,452809],[-49,5195],[-6,11887],[-34,1],[4,20950]],[[300150,494046],[150,-5520],[-565,-417],[90,-2385]],[[299825,485724],[28,-1263],[-360,-306],[-213,-2182]],[[299280,481973],[-251,-349],[-88,1241],[-239,-1545]],[[298702,481320],[-1098,1335]],[[297604,482655],[73,1782],[273,1403]],[[297950,485840],[461,7161]],[[165072,484483],[0,-1675]],[[165072,482808],[-3996,131]],[[161076,482939],[-1867,-3]],[[159209,482936],[78,4514],[296,1024],[283,3753],[-89,2677]],[[286590,490299],[-326,1891]],[[286264,492190],[242,1614],[1261,3804]],[[288921,494151],[-278,-2136],[171,-535],[-163,-1981],[-600,-1658],[-229,98],[184,-3632]],[[288006,484307],[-698,337],[-439,-517]],[[286869,484127],[-30,11]],[[286839,484138],[-17,6]],[[286822,484144],[-93,2654],[-183,296],[473,1068],[-221,1526],[192,1728],[-400,-1117]],[[306799,494742],[-208,-3178],[83,-580],[-394,-2170],[-422,630],[40,936]],[[305898,490380],[198,677],[-157,2940],[-190,25],[-9,2185]],[[178742,489161],[-408,649],[-97,1865],[-374,-2892],[-523,-708],[-420,-3554],[-518,-1775],[-403,-257]],[[175999,482489],[-852,4014]],[[305898,490380],[-88,1150],[-333,-4456],[-153,1112],[-294,-803],[27,3034],[-191,-1422]],[[304866,488995],[63,1229],[-293,335]],[[304636,490559],[138,2125]],[[255214,496196],[10,-3137],[-283,-948],[-252,-4020]],[[254689,488091],[-861,-9]],[[253828,488082],[-4,6503]],[[296456,490650],[-138,-1260]],[[296318,489390],[-526,-1476],[60,-1043]],[[295852,486871],[-725,197],[35,-1311],[-435,-257]],[[294727,485500],[-47,1035]],[[159209,482936],[-356,-1083],[-4,-2172]],[[158849,479681],[-1695,-61],[-4,1999],[-1023,-130],[-80,4507],[-584,9],[-506,918],[-251,1689],[-581,464],[-272,-1480],[-649,-38]],[[153204,487558],[120,7683]],[[301339,486191],[74,-4637]],[[301413,481554],[-561,-31]],[[300852,481523],[-271,609],[-756,3592]],[[237874,493745],[1,-6477]],[[237875,487268],[-1335,-3]],[[236540,487265],[-340,-1]],[[236200,487264],[0,4857]],[[248644,494742],[4,-1203],[-356,-1775],[167,-1777],[17,-2211],[270,-1702],[223,-2658]],[[248969,483416],[-1467,-1]],[[247502,483415],[1,1681]],[[247503,485096],[-1,7894]],[[249492,494673],[0,-4905]],[[249492,489768],[-4,-6324]],[[249488,483444],[-519,-28]],[[251473,494616],[2,-4829]],[[251475,489787],[-785,-8]],[[250690,489779],[-1198,-11]],[[252819,494643],[-1,-5695]],[[252818,488948],[3,-842],[-1344,42]],[[251477,488148],[-2,1639]],[[253828,488082],[-336,-5]],[[253492,488077],[2,862],[-676,9]],[[185140,489575],[-7,-6496]],[[185133,483079],[-5,-1541],[-325,-81],[-2,-1617],[-333,6],[-31,-3059],[-167,-6]],[[184270,476781],[-988,-2],[0,1538],[-762,6],[71,2286],[-253,1758],[-271,-298]],[[297950,485840],[-1609,2937],[-23,613]],[[289857,482936],[-1180,-3640],[-620,942]],[[288057,480238],[-51,4069]],[[289690,491904],[167,-8968]],[[222306,488875],[139,-1400],[-277,-1473],[-155,-2285],[239,-7],[214,-2924]],[[222466,480786],[-655,1]],[[221811,480787],[-251,2],[-1,4520],[-205,288],[-400,-1289],[-686,-69],[-402,533]],[[219866,484772],[-299,59]],[[219567,484831],[-77,2419],[-2,5989]],[[221692,493681],[38,-1693],[582,-1977],[-6,-1136]],[[231478,493758],[-2,-6467]],[[231476,487291],[-1083,9]],[[230393,487300],[2,6460]],[[233154,493749],[0,-6482]],[[233154,487267],[-1644,21]],[[231510,487288],[-34,3]],[[225159,493759],[1,-4821]],[[225160,488938],[-1327,-45]],[[223833,488893],[-333,-2]],[[223500,488891],[4,4867]],[[239886,493761],[1,-6484]],[[239887,487277],[-11,1]],[[239876,487278],[-996,-7]],[[238880,487271],[0,6484]],[[240909,493739],[-31,-6461]],[[240878,487278],[-991,-1]],[[230393,487300],[-1213,-24]],[[229180,487276],[-2,6464]],[[238880,487271],[-672,1]],[[238208,487272],[-333,-4]],[[223500,488891],[-1194,-16]],[[226503,493734],[-5,-6430]],[[226498,487304],[-323,15]],[[226175,487319],[-998,7]],[[225177,487326],[-17,1612]],[[242579,492091],[0,-4839]],[[242579,487252],[-1030,-242]],[[241549,487010],[-671,268]],[[234832,492108],[2,-4840]],[[234834,487268],[-1653,0]],[[233181,487268],[-27,-1]],[[229180,487276],[-670,-7]],[[228510,487269],[-670,12]],[[227840,487281],[-1,6446]],[[227840,487281],[-666,8]],[[227174,487289],[-676,15]],[[244402,489807],[392,-2555]],[[244794,487252],[-1243,-3]],[[243551,487249],[-972,3]],[[209213,487370],[2,-6520]],[[209215,480850],[-2355,-66]],[[206860,480784],[-501,-22]],[[259400,493210],[11,-6545]],[[259411,486665],[-1095,72]],[[258316,486737],[-227,4105],[347,2583]],[[304000,489648],[314,-1030]],[[304314,488618],[155,528]],[[304469,489146],[-41,-1011]],[[304428,488135],[-42,-1969],[-144,1438],[-555,-1235],[-307,-2321],[164,-2049],[-435,-545]],[[303109,481454],[-386,1324],[-161,2030],[-306,-178],[3,1605],[-347,398]],[[219567,484831],[-690,962],[-261,-1066],[-279,233],[-415,1973],[-376,207]],[[217546,487140],[0,-1]],[[217546,487140],[1,2864]],[[200700,480796],[-1181,20]],[[199519,480816],[-168,0]],[[199351,480816],[0,2700],[-338,-12],[1,1631],[-671,1],[0,1587],[-983,520],[0,1054],[-332,2],[5,1652],[-345,1626]],[[304469,489146],[96,425],[146,-4224],[-211,-753],[-72,3541]],[[304866,488995],[-144,-863],[186,-1284],[-136,-1342],[-199,4245],[63,808]],[[304767,492693],[-187,-2521],[-266,-1554]],[[260730,493168],[6,-6502]],[[260736,486666],[-1325,-1]],[[262060,493155],[-5,-6525]],[[262055,486630],[-1319,36]],[[263395,493087],[5,-6429]],[[263400,486658],[-1345,-28]],[[264626,493111],[-1,-3070]],[[264625,490041],[-2,-3183]],[[264623,486858],[-1223,-200]],[[247503,485096],[-1667,-111]],[[245836,484985],[-8,6443],[-167,-12]],[[173946,486507],[-392,-272],[-361,1627]],[[292791,485342],[-439,-295],[152,-6649]],[[292504,478398],[55,-2188]],[[292559,476210],[-1099,-481],[-496,1080]],[[290964,476809],[-432,1000],[257,2733],[-219,10862]],[[236200,487264],[-1352,5]],[[234848,487269],[-14,-1]],[[178798,488945],[-51,-1480]],[[178747,487465],[-147,-2107],[27,-2295],[-141,-364],[-9,-7526]],[[178477,475173],[-2,-5280],[149,-49]],[[178624,469844],[-11,-2674]],[[178613,467170],[-1161,-3],[35,3027],[-978,384],[-398,937],[-84,-1083],[-654,1955],[-183,1188]],[[175190,473575],[801,17],[8,8897]],[[290964,476809],[48,-2087],[-179,-2358]],[[290833,472364],[-10,-3429]],[[290823,468935],[-322,652],[-79,-1360],[-540,1549],[-309,-528]],[[289573,469248],[-20,3211],[418,3255],[-260,632],[239,1293],[-93,5297]],[[245836,484985],[-965,57]],[[244871,485042],[-77,2210]],[[199351,480816],[0,-542],[-2071,-233],[-330,808],[-664,541],[-332,1359],[-996,270],[0,1480],[-393,2122]],[[187141,488745],[-18,-3230],[155,229],[839,-2595]],[[188117,483149],[-2489,-4]],[[185628,483145],[-495,-66]],[[169813,452809],[-3140,-59]],[[166673,452750],[-102,8]],[[166571,452758],[-13,14052],[-1606,-147],[6,8084],[116,22],[-2,8039]],[[199519,480816],[49,-535],[44,-12867],[-117,0],[4,-6462],[53,0]],[[199552,460952],[1,-3214]],[[199553,457738],[-4238,36]],[[195315,457774],[-81,8002],[-208,644],[-621,4049],[-508,1245],[-388,4713],[-175,3678],[-827,30]],[[265345,488432],[-13,-4364],[594,-1608]],[[265926,482460],[2,-2061]],[[265928,480399],[-330,807],[-651,39],[-327,827]],[[264620,482072],[3,4786]],[[264625,490041],[337,2],[2,-1583],[381,-28]],[[217546,487139],[-458,-846],[2,-7566]],[[217090,478727],[-2459,14]],[[214631,478741],[-79,1615],[0,4173]],[[184270,476781],[-1,-3235]],[[184269,473546],[-657,2],[18,-6493],[161,-1616],[-161,-935]],[[183630,464504],[-371,1135],[-285,-316]],[[182974,465323],[1,3349],[164,1],[-2,6527],[-838,4]],[[182299,475204],[-1840,-8]],[[180459,475196],[-55,2307],[-390,208],[75,2719],[-486,2042],[-29,3598],[-455,236],[-372,1159]],[[189738,480812],[-430,714],[-126,1528],[-434,6]],[[188748,483060],[3,5605]],[[251477,488148],[-2,-4871]],[[251475,483277],[-336,-10]],[[251139,483267],[-664,186]],[[250475,483453],[215,6326]],[[250475,483453],[-987,-9]],[[297604,482655],[-139,-531],[-150,-6299]],[[297315,475825],[-695,-198],[-380,613]],[[296240,476240],[-135,842]],[[296105,477082],[40,1309],[261,-315],[91,2132],[-178,490],[251,3497],[-332,632],[104,1629],[-255,1003],[-235,-588]],[[158849,479681],[187,-616],[254,-2713],[-330,-3406],[-529,-206],[-3,-1355]],[[158428,471385],[-331,3],[-437,-1062],[-659,-2951],[-995,-473],[-214,-851]],[[155792,466051],[-606,-123],[-747,708],[-3,821]],[[154436,467457],[-267,104]],[[154169,467561],[-22,3824],[329,1721],[-5,3184],[-170,-23],[1,3263],[-310,1557],[0,1719],[-955,38]],[[153037,482844],[167,4714]],[[253492,488077],[4,-6488]],[[253496,481589],[-667,11]],[[252829,481600],[-2,1626],[-1352,51]],[[225177,487326],[14,-6561]],[[225191,480765],[-1074,13]],[[224117,480778],[-247,-3]],[[223870,480775],[-37,8118]],[[223870,480775],[-1404,11]],[[188748,483060],[-631,89]],[[254689,488091],[84,-3796],[-251,-2704]],[[254522,481591],[-691,-12]],[[253831,481579],[-335,10]],[[174503,486508],[-1,-3222],[107,-1],[3,-3245],[-111,-9],[5,-3147]],[[174506,476884],[-751,3480],[-169,2160],[-512,1621]],[[219866,484772],[49,-6023]],[[219915,478749],[-2825,-22]],[[180459,475196],[-612,-25]],[[179847,475171],[-1370,2]],[[296105,477082],[-1078,260]],[[295027,477342],[17,4427],[-151,1362],[-345,330],[179,2039]],[[212682,484293],[-532,-1541],[1,-2393]],[[212151,480359],[-2937,18]],[[209214,480377],[1,473]],[[231510,487288],[-3,-6495]],[[231507,480793],[-1113,5]],[[230394,480798],[-1,6502]],[[233181,487268],[-6,-6467]],[[233175,480801],[-1132,-10]],[[232043,480791],[-536,2]],[[239876,487278],[3,-6493]],[[239879,480785],[-1250,-4]],[[238629,480781],[-423,3]],[[238206,480784],[2,6488]],[[241549,487010],[0,-6211]],[[241549,480799],[-290,-4]],[[241259,480795],[-1313,-10]],[[239946,480785],[-67,0]],[[244871,485042],[-35,-2081],[144,-2160]],[[244980,480801],[-1096,2]],[[243884,480803],[-334,1]],[[243550,480804],[1,6445]],[[226175,487319],[6,-6546]],[[226181,480773],[-417,-14]],[[225764,480759],[-573,6]],[[227174,487289],[5,-6502]],[[227179,480787],[-998,-14]],[[243550,480804],[-972,-1]],[[242578,480803],[-1029,-4]],[[234848,487269],[-4,-6462]],[[234844,480807],[-164,-8]],[[234680,480799],[-1319,-4]],[[233361,480795],[-186,6]],[[238206,480784],[-897,-1]],[[237309,480783],[-772,10]],[[236537,480793],[3,6472]],[[230394,480798],[-407,0]],[[229987,480798],[-908,-8]],[[229079,480790],[-570,-5]],[[228509,480785],[1,6484]],[[236537,480793],[-544,5]],[[235993,480798],[-1149,9]],[[228509,480785],[-758,1]],[[227751,480786],[-572,1]],[[264620,482072],[-6,-1618],[-556,-296]],[[264058,480158],[-662,0]],[[263396,480158],[4,6500]],[[259411,486665],[-4,-6481]],[[259407,480184],[-1175,91]],[[258232,480275],[-219,3393],[303,3069]],[[263396,480158],[-664,2]],[[262732,480160],[-666,1]],[[262066,480161],[-11,6469]],[[303109,481454],[-237,-3363],[-309,-544],[-343,-4752],[-437,1185]],[[301783,473980],[56,1699],[-493,2897],[67,2978]],[[262066,480161],[-1330,37]],[[260736,480198],[0,6468]],[[260736,480198],[0,-3238]],[[260736,476960],[-635,-23]],[[260101,476937],[-693,9],[-1,3238]],[[295027,477342],[-54,-6909]],[[294973,470433],[-1008,-44]],[[293965,470389],[167,2590],[-54,4202]],[[294078,477181],[-94,3357],[378,3142],[153,2763]],[[175190,473575],[-334,1506],[-129,1913],[-221,-110]],[[294078,477181],[-671,-975],[-134,2686],[-769,-494]],[[221811,480787],[-2,-9343]],[[221809,471444],[-1850,12]],[[219959,471456],[-44,7293]],[[300852,481523],[10,-3416],[-211,-1325]],[[300651,476782],[-895,3175],[-123,-380],[-353,2396]],[[266573,485031],[2,-1116],[972,143]],[[267547,484058],[-7,-6487]],[[267540,477571],[-652,-91],[7,-1620],[-304,-225]],[[266591,475635],[-654,-32]],[[265937,475603],[-9,4796]],[[265926,482460],[77,10]],[[266003,482470],[432,2693],[138,-132]],[[247502,483415],[3,-1619]],[[247505,481796],[-1004,-19],[9,-2420]],[[246510,479357],[-1496,-1]],[[245014,479356],[-34,1445]],[[288057,480238],[-163,246],[-201,-2951],[7,-3154]],[[287700,474379],[-304,516]],[[287396,474895],[-580,1634],[-156,-692],[-618,-119]],[[286042,475718],[-350,485],[-33,3060]],[[285659,479263],[575,1959],[489,118],[146,2787]],[[214631,478741],[5,-4840],[73,-2432]],[[214709,471469],[-1978,12]],[[212731,471481],[-580,15]],[[212151,471496],[0,8863]],[[269259,474627],[-1374,-276]],[[267885,474351],[-11,2434],[-334,786]],[[267547,484058],[1423,278]],[[268970,484336],[189,-4720],[100,-4989]],[[178613,467170],[-2,-14382]],[[178611,452788],[-3086,41],[-2428,19]],[[173097,452848],[-25,13]],[[251139,483267],[-6,-6483]],[[251133,476784],[-1982,151]],[[249151,476935],[334,1631],[4,3332],[-358,174],[-162,1344]],[[249151,476935],[-328,-1617]],[[248823,475318],[-991,-774]],[[247832,474544],[6,7269],[-333,-17]],[[252829,481600],[-49,-6493]],[[252780,475107],[-328,24]],[[252452,475131],[-1318,30]],[[251134,475161],[-1,1623]],[[189740,477360],[2,-5505]],[[189742,471855],[-1523,-1]],[[188219,471854],[6,4870],[-654,10],[0,1562],[-614,11],[-169,1087],[-1161,0],[1,3751]],[[188219,471854],[-1319,42]],[[186900,471896],[-1651,-7],[-264,-1313]],[[184985,470576],[-183,-1642],[-532,-4],[-1,4616]],[[161076,482939],[-47,-16196],[1299,-29],[11,-13965]],[[162339,452749],[-1582,70]],[[160757,452819],[-2346,190]],[[158411,453009],[17,18376]],[[166571,452758],[-1779,10]],[[164792,452768],[-2453,-19]],[[289573,469248],[-100,-158]],[[289473,469090],[-527,-154],[-20,1300],[-279,-24],[-23,1968],[-519,2370],[-405,-171]],[[300651,476782],[-32,-195]],[[300619,476587],[-404,-4938]],[[300215,471649],[-352,1116],[-342,-274],[-74,1832],[-524,-693],[-159,1711],[-267,-361]],[[298497,474980],[-226,2506],[101,2208],[330,1626]],[[154169,467561],[-316,-270],[-199,-1661],[-396,-276],[-61,3940],[-268,1346],[-619,4]],[[152310,470644],[269,5888],[458,6312]],[[298497,474980],[-81,-1100]],[[298416,473880],[-391,59],[61,931],[-822,-385]],[[297264,474485],[51,1340]],[[301783,473980],[-163,-962]],[[301620,473018],[-513,-14],[127,1049],[-615,2534]],[[265937,475603],[-658,-19],[7,-1630]],[[265286,473954],[-1222,-81]],[[264064,473873],[-6,6285]],[[247832,474544],[-657,679]],[[247175,475223],[-660,-544]],[[246515,474679],[-5,4678]],[[254522,481591],[-329,-5330],[49,-1204]],[[254242,475057],[-476,2]],[[253766,475059],[65,6520]],[[253766,475059],[-986,48]],[[238629,480781],[-1,-4543]],[[238628,476238],[-1318,-2]],[[237310,476236],[-1,4547]],[[237308,469765],[-1315,6]],[[235993,469771],[0,6459]],[[235993,476230],[0,4568]],[[237310,476236],[-2,-6471]],[[234682,476230],[-1321,3]],[[233361,476233],[0,4562]],[[234680,480799],[2,-4569]],[[235993,476230],[-1311,0]],[[239947,476239],[-1319,-1]],[[239946,480785],[1,-4546]],[[233361,476233],[-1320,43]],[[232041,476276],[2,4515]],[[209214,480377],[5,-8812]],[[209219,471565],[0,-7313]],[[209219,464252],[-1679,-40]],[[207540,464212],[-659,-10]],[[206881,464202],[-21,16582]],[[241256,475444],[-1309,0]],[[239947,475444],[0,795]],[[241259,480795],[-3,-5351]],[[232041,476276],[-1933,42]],[[230108,476318],[88,2490],[-209,1990]],[[242578,480803],[-3,-5357]],[[242575,475446],[-1319,-2]],[[245014,479356],[4,-1361],[405,-1717],[-331,-3302]],[[245092,472976],[-1192,26]],[[243900,473002],[-16,7801]],[[243900,473002],[-1326,21]],[[242574,473023],[1,2423]],[[230108,476318],[224,-745],[59,-2539]],[[230391,473034],[-980,6]],[[229411,473040],[-330,1]],[[229081,473041],[-2,7749]],[[206881,464202],[-1098,-58],[7,-3247]],[[205790,460897],[-134,-6],[-121,-2624],[-664,265],[160,2348],[-1441,51]],[[203590,460931],[-7,-1]],[[203583,460930],[-6,19757]],[[224117,480778],[91,-2393],[1571,-3239]],[[225779,475146],[90,-530]],[[225869,474616],[-47,-3529],[-165,-2603]],[[225657,468484],[-436,813]],[[225221,469297],[-526,2160]],[[224695,471457],[-1032,3041],[-78,1580],[-470,1325],[-243,2027],[-406,1356]],[[229081,473041],[-659,-11]],[[228422,473030],[0,1617],[-665,-11]],[[227757,474636],[-6,6150]],[[227757,474636],[-663,-12]],[[227094,474624],[-1225,-8]],[[225779,475146],[-15,5613]],[[203583,460930],[-1530,-51],[-2501,73]],[[224695,471457],[-2109,-11]],[[222586,471446],[-777,-2]],[[212151,471496],[-1401,0]],[[210750,471496],[-1531,69]],[[260101,476937],[-1,-1635]],[[260100,475302],[-329,14],[4,-1620],[-1016,-10]],[[258759,473686],[-527,6589]],[[262732,480160],[25,-6465]],[[262757,473695],[-1325,-1]],[[261432,473694],[1,3265],[-697,1]],[[195315,457774],[-2814,132]],[[192501,457906],[-1359,125],[-5,3185],[-131,-2],[32,14646]],[[264064,473873],[0,-195]],[[264064,473678],[-1307,17]],[[246515,474679],[-1111,-3345],[-255,-73]],[[245149,471261],[-57,1715]],[[286042,475718],[-35,-4144],[115,-2963],[261,67],[229,-1455]],[[286612,467223],[26,-2749]],[[286638,464474],[-1117,-2]],[[285521,464472],[-187,1943],[55,5513]],[[285389,471928],[-24,5905]],[[285365,477833],[294,1430]],[[293965,470389],[-115,-2942]],[[293850,467447],[-369,-82]],[[293481,467365],[-266,2462],[-523,832]],[[292692,470659],[-14,505]],[[292678,471164],[-119,5046]],[[217090,478727],[0,-7285]],[[217090,471442],[-2381,27]],[[219959,471456],[-2869,-14]],[[281818,478275],[-5,-4317]],[[281813,473958],[-1305,-81]],[[280508,473877],[0,4510]],[[280508,478387],[1310,-112]],[[280508,473877],[4,-838]],[[280512,473039],[-752,7],[-414,-1125]],[[279346,471921],[-518,1158],[12,3307],[719,1122],[949,879]],[[283548,476628],[9,-4501]],[[283557,472127],[-318,-2],[8,-1701],[-272,15]],[[282975,470439],[-429,33],[9,794],[-498,-13]],[[282057,471253],[10,2716],[-254,-11]],[[281818,478275],[657,-443],[527,-1887],[546,683]],[[285389,471928],[-697,-201]],[[284692,471727],[-474,498],[-661,-98]],[[283548,476628],[635,251],[429,-526],[753,1480]],[[267885,474351],[36,-4847]],[[267921,469504],[-333,-96]],[[267588,469408],[-976,-152]],[[266612,469256],[-21,6379]],[[192501,457906],[15,-12908]],[[192516,444998],[-2779,45]],[[189737,445043],[-3,7851]],[[189734,452894],[0,9524]],[[189734,462418],[8,9437]],[[296240,476240],[-137,-2650],[-357,111],[-31,-3519],[241,-61],[-25,-3494]],[[295931,466627],[-259,37]],[[295672,466664],[-674,89]],[[294998,466753],[-25,3680]],[[251134,475161],[-13,-6521]],[[251121,468640],[-991,-43]],[[250130,468597],[-1307,230]],[[248823,468827],[0,6491]],[[261432,473694],[8,-6496]],[[261440,467198],[-657,-32]],[[260783,467166],[-660,1]],[[260123,467167],[-23,8135]],[[292678,471164],[-1239,47],[-606,1153]],[[301620,473018],[189,655],[301,-1389],[-295,-3187]],[[301815,469097],[-594,-238],[-94,-983],[-503,-1186]],[[300624,466690],[-506,1531],[-67,1971],[164,1457]],[[287396,474895],[215,-2005],[56,-5300]],[[287667,467590],[-1055,-367]],[[297264,474485],[21,-2797],[-310,-2918],[270,-2372]],[[297245,466398],[-1314,229]],[[232041,476276],[7,-6486]],[[232048,469790],[-1892,-6]],[[230156,469784],[78,2628],[157,622]],[[233361,476233],[0,-6428]],[[233361,469805],[-1313,-15]],[[239947,475444],[-4,-5679]],[[239943,469765],[-1318,14]],[[238625,469779],[3,6459]],[[238625,469779],[-1317,-14]],[[235993,469771],[-1311,30]],[[234682,469801],[0,6429]],[[234682,469801],[-1321,4]],[[266612,469256],[-658,-171],[8,-1638]],[[265962,467447],[-657,-45]],[[265305,467402],[-19,6552]],[[242574,473023],[-2,-3272]],[[242572,469751],[-1316,2]],[[241256,469753],[0,5691]],[[241256,469753],[-1313,12]],[[248823,468827],[0,-812]],[[248823,468015],[-1640,-18]],[[247183,467997],[-8,7226]],[[247183,467997],[1,-5692]],[[247184,462305],[-597,23]],[[246587,462328],[-172,2280],[-542,826]],[[245873,465434],[-469,1433],[-255,4394]],[[300624,466690],[-29,-121]],[[300595,466569],[-107,-729],[-1684,270]],[[298804,466110],[-84,15]],[[298720,466125],[-215,4313],[-157,16],[68,3426]],[[260123,467167],[-1187,-13]],[[258936,467154],[-50,4104],[-127,2428]],[[182299,475204],[2,-6522],[-141,-1591],[-469,14]],[[181691,467105],[-327,810],[-823,11],[-55,776],[-638,0]],[[179848,468702],[-1,6469]],[[179848,468702],[-63,-3749]],[[179785,464953],[-565,398],[-162,1616]],[[179058,466967],[-63,1875],[-371,1002]],[[252452,475131],[-16,-6573]],[[252436,468558],[-656,-5]],[[251780,468553],[-659,87]],[[182974,465323],[-238,-239],[-275,-2258],[-767,3]],[[181694,462829],[-3,4276]],[[253766,475059],[-16,-6494]],[[253750,468565],[-660,-23]],[[253090,468542],[-654,16]],[[254242,475057],[185,-6512]],[[254427,468545],[-677,20]],[[289473,469090],[-133,-2371]],[[289340,466719],[-1655,-378]],[[287685,466341],[-18,1249]],[[298720,466125],[-986,173]],[[297734,466298],[-489,100]],[[228422,473030],[0,-5278]],[[228422,467752],[-410,1264],[-493,-321]],[[227519,468695],[-420,21]],[[227099,468716],[-5,5908]],[[227099,468716],[-647,153],[-239,-1688],[-225,-93],[-331,1396]],[[265305,467402],[-657,-79]],[[264648,467323],[-572,-16]],[[264076,467307],[-12,6371]],[[282057,471253],[-126,-2331]],[[281931,468922],[-1419,93]],[[280512,469015],[0,4024]],[[262757,473695],[0,-6486]],[[262757,467209],[-661,6]],[[262096,467215],[-656,-17]],[[264076,467307],[-666,-109]],[[263410,467198],[-653,11]],[[184985,470576],[7,-703],[463,1104],[183,-1172],[54,-3295],[325,-1616],[-111,-2670]],[[185906,462224],[-218,4],[1,-1621],[-435,0],[0,-1622],[-966,-25]],[[184288,458960],[-6,4851],[-652,693]],[[279029,472686],[285,-724],[-124,-1251],[-161,1975]],[[280512,469015],[1,-6165]],[[280513,462850],[-1219,-1634]],[[279294,461216],[-444,1662]],[[278850,462878],[-210,586]],[[278640,463464],[245,2248],[543,1799],[-163,3149],[81,1261]],[[230156,469784],[-257,-2656],[18,-1098],[319,-1424],[30,-1300]],[[230266,463306],[144,-1322]],[[230410,461984],[-513,643]],[[229897,462627],[-187,2346],[-300,1001]],[[229410,465974],[1,7066]],[[229410,465974],[-586,1070]],[[228824,467044],[-402,708]],[[243900,473002],[-5,-8148]],[[243895,464854],[-1323,-36]],[[242572,464818],[0,4933]],[[245873,465434],[-1,-548],[-656,3]],[[245216,464889],[-1321,-35]],[[292692,470659],[24,-1088],[-500,-1877]],[[292216,467694],[-534,-438],[-538,1053]],[[291144,468309],[-321,626]],[[284692,471727],[-24,-4636]],[[284668,467091],[-949,-53],[-149,-3444]],[[283570,463594],[-344,17]],[[283226,463611],[9,1733],[-312,31],[52,5064]],[[186900,471896],[-241,-2319],[147,-3747],[355,398],[146,-1874],[116,-3740]],[[187423,460614],[-60,-2973],[-639,535]],[[186724,458176],[-180,1226],[-380,-494],[84,2409],[-342,907]],[[189734,462418],[-524,-641],[35,1743],[-1064,341],[14,-3257]],[[188195,460604],[-772,10]],[[285521,464472],[224,-1369],[-308,-60]],[[285437,463043],[-555,-97]],[[284882,462946],[2,2100],[-216,2045]],[[210915,461007],[1,-6453],[118,-1623]],[[211034,452931],[-1815,-34]],[[209219,452897],[0,11355]],[[210750,471496],[65,-4017],[1,-6473],[99,1]],[[214922,454659],[-168,-1624]],[[214754,453035],[-1702,-71]],[[213052,452964],[-57,-9]],[[212995,452955],[-124,1630],[-20,6469],[-66,0]],[[212785,461054],[0,6430],[-54,3997]],[[214709,471469],[45,-10348],[76,-3],[-4,-6452],[96,-7]],[[212785,461054],[-1870,-47]],[[225221,469297],[13,-2261]],[[225234,467036],[-777,345],[-862,1235],[-166,869],[-848,-1646]],[[222581,467839],[5,3607]],[[222581,467839],[-781,-1614],[-391,247]],[[221409,466472],[-1271,1432],[-179,713]],[[219959,468617],[0,2839]],[[219959,468617],[86,-14154]],[[220045,454463],[-279,6]],[[219766,454469],[-1612,38]],[[218154,454507],[-1617,75]],[[216537,454582],[-1615,77]],[[158411,453009],[-2622,-72]],[[155789,452937],[3,13114]],[[283226,463611],[-473,58],[-176,-2031]],[[282577,461638],[-328,866],[-551,60]],[[281698,462564],[229,2735],[4,3623]],[[294998,466753],[-244,-4393]],[[294754,462360],[-1202,-852]],[[293552,461508],[61,2653],[237,3286]],[[293481,467365],[-1033,-910]],[[292448,466455],[-257,-293],[25,1532]],[[154436,467457],[-322,-2815],[-164,-2462],[-328,-79],[-48,-2548],[372,-119],[281,-2180],[-183,-1761],[99,-2713]],[[154143,452780],[-1087,57]],[[153056,452837],[-394,1953],[-208,4302],[105,4473],[-71,1599],[-264,1356],[-114,2029],[200,2095]],[[179785,464953],[674,-952],[683,-1920],[360,583]],[[181502,462664],[-185,-223],[-6,-1813],[-601,5],[9,-7878]],[[180719,452755],[-2108,33]],[[232048,469790],[-2,-6489]],[[232046,463301],[-1780,5]],[[234682,469801],[-2,-6505]],[[234680,463296],[-1319,27]],[[233361,463323],[0,6482]],[[233361,463323],[-985,-8]],[[232376,463315],[-330,-14]],[[235993,469771],[0,-4895]],[[235993,464876],[0,-1607]],[[235993,463269],[-1313,27]],[[238625,469779],[-3,-6531]],[[238622,463248],[-1315,8]],[[237307,463256],[0,1612]],[[237307,464868],[1,4897]],[[237307,464868],[-1314,8]],[[239943,469765],[-4,-6533]],[[239939,463232],[-1317,16]],[[241256,469753],[-1,-4930]],[[241255,464823],[1,-1610]],[[241256,463213],[-1317,19]],[[242572,464818],[-1317,5]],[[291144,468309],[49,-3778],[-226,-2026]],[[290967,462505],[-369,-97],[-984,-2871],[-607,-823]],[[289007,458714],[112,1789],[-67,1881],[190,1044],[98,3291]],[[225234,467036],[12,-6037]],[[225246,460999],[0,-6480]],[[225246,454519],[-1283,-6]],[[223963,454513],[-1286,-11]],[[222677,454502],[-33,1]],[[222644,454503],[-31,12930],[-32,406]],[[268694,465642],[-316,-1305],[-142,-3076]],[[268236,461261],[-593,-71]],[[267643,461190],[-55,8218]],[[267921,469504],[681,71],[92,-3933]],[[267643,461190],[-1306,-223]],[[266337,460967],[-314,-75]],[[266023,460892],[-61,6555]],[[301815,469097],[129,-3011],[504,-1291],[-172,-917],[-656,-1009],[-20,-1435],[-247,-532]],[[301353,460902],[-115,246]],[[301238,461148],[-90,2974],[-550,962],[-3,1485]],[[227519,468695],[-2,-7665]],[[227517,461030],[-972,-16]],[[226545,461014],[-1299,-15]],[[228824,467044],[-4,-7638]],[[228820,459406],[-975,10]],[[227845,459416],[1,1618],[-329,-4]],[[281698,462564],[-753,1]],[[280945,462565],[-432,285]],[[250130,468597],[9,-6418]],[[250139,462179],[-99,3]],[[250040,462182],[-1216,98]],[[248824,462280],[-1,5735]],[[181694,462829],[-192,-165]],[[251780,468553],[1,-6529]],[[251781,462024],[-457,58]],[[251324,462082],[-1185,97]],[[221409,466472],[43,-12006]],[[221452,454466],[-68,2]],[[221384,454468],[-1339,-5]],[[253090,468542],[2,-4305]],[[253092,464237],[4,-2164]],[[253096,462073],[-1122,-19]],[[251974,462054],[-193,-30]],[[254427,468545],[185,-1078],[-127,-2165]],[[254485,465302],[-1064,31],[0,-1088],[-329,-8]],[[292448,466455],[-171,-3336],[-36,-2654]],[[292241,460465],[-527,-991]],[[291714,459474],[-489,1291],[-258,1740]],[[293552,461508],[-1311,-1043]],[[248824,462280],[-247,1]],[[248577,462281],[-1393,24]],[[222644,454503],[-1192,-37]],[[287015,460504],[-343,-51]],[[286672,460453],[-34,4021]],[[287685,466341],[71,-5738]],[[287756,460603],[-741,-99]],[[155789,452937],[-801,-56]],[[154988,452881],[-845,-101]],[[266023,460892],[-1299,-123]],[[264724,460769],[-27,1]],[[264697,460770],[-49,6553]],[[264697,460770],[-1281,-49]],[[263416,460721],[-6,6477]],[[263416,460721],[-329,-8]],[[263087,460713],[-985,-2]],[[262102,460711],[-6,6504]],[[262102,460711],[-632,-30]],[[261470,460681],[-681,30]],[[260789,460711],[-6,6455]],[[260789,460711],[-616,-16]],[[260173,460695],[-1419,-24]],[[258754,460671],[182,6483]],[[284882,462946],[17,-1460],[-606,385]],[[284293,461871],[-102,1733],[-621,-10]],[[229897,462627],[-253,6],[-13,-4592]],[[229631,458041],[-268,-255]],[[229363,457786],[-543,3],[0,1617]],[[295672,466664],[201,-1871],[-69,-1578]],[[295804,463215],[-69,-4535]],[[295735,458680],[-148,-5073]],[[295587,453607],[-1209,182]],[[294378,453789],[-26,1]],[[294352,453790],[-31,692],[433,7878]],[[289007,458714],[-9,-2219]],[[288998,456495],[-609,12],[-4,988],[-551,-86]],[[287834,457409],[-78,3194]],[[297645,459260],[-169,1432],[-916,-278],[9,882],[-474,583],[-291,1336]],[[297734,466298],[148,-1093],[-43,-2779],[-194,-3166]],[[301238,461148],[-70,-970]],[[301168,460178],[-67,-41]],[[301101,460137],[28,-397]],[[301129,459740],[-2,-4]],[[301127,459736],[-256,-726]],[[300871,459010],[-22,-492]],[[300849,458518],[-74,-390]],[[300775,458128],[-385,553],[-40,-2081],[-373,-819]],[[299977,455781],[-294,713],[-11,1200],[281,1310],[-388,368],[185,1162],[57,2438],[-390,-234],[39,1513],[-540,411],[-112,1448]],[[299977,455781],[-56,-2596]],[[299921,453185],[-840,-171]],[[299081,453014],[-844,387]],[[298237,453401],[-93,27]],[[298144,453428],[2,2448],[-359,413],[119,1141]],[[297906,457430],[27,1226],[-288,604]],[[184288,458960],[0,-6128]],[[184288,452832],[-2898,-86]],[[181390,452746],[-671,9]],[[246587,462328],[-37,-556],[502,-1805]],[[247052,459967],[-532,14],[-2,-1629],[-648,10]],[[245870,458362],[-647,9]],[[245223,458371],[-7,6518]],[[254485,465302],[3,-3266]],[[254488,462036],[-1092,47]],[[253396,462083],[-300,-10]],[[245223,458371],[-649,13]],[[244574,458384],[-652,-1]],[[243922,458383],[-27,6471]],[[237307,463256],[111,-1603],[1,-4876]],[[237419,456777],[-650,-3]],[[236769,456774],[-649,-15]],[[236120,456759],[0,4918],[-127,1592]],[[243922,458383],[-651,50]],[[243271,458433],[-651,-34]],[[242620,458399],[-48,6419]],[[242620,458399],[-653,5]],[[241967,458404],[-654,-10]],[[241313,458394],[-57,4819]],[[286672,460453],[9,-2065],[-460,403],[-3,-1030],[-340,349]],[[285878,458110],[-226,21]],[[285652,458131],[-201,28],[-14,4884]],[[209219,452897],[0,-5656]],[[209219,447241],[2,-2488]],[[209221,444753],[-1673,14],[-1,1638]],[[207547,446405],[-7,17807]],[[207547,446405],[-1742,68]],[[205805,446473],[-15,14424]],[[189734,452894],[-1286,-39]],[[188448,452855],[-243,1756],[-87,2141],[178,1265],[-101,2587]],[[284293,461871],[21,-3935],[375,114]],[[284689,458050],[-2,-5187]],[[284687,452863],[-1795,-1]],[[282892,452862],[-390,-48]],[[282502,452814],[75,8824]],[[278850,462878],[-1,-10015]],[[278849,452863],[-1529,-47]],[[277320,452816],[-423,27],[0,5034]],[[276897,457877],[602,1758],[633,2570],[508,1259]],[[232376,463315],[-1,-1600],[202,-13],[-4,-4901]],[[232573,456801],[-1911,67]],[[230662,456868],[1,1145]],[[230663,458013],[-154,1201],[39,2679],[-138,91]],[[234680,463296],[161,-1608],[-5,-4919]],[[234836,456769],[-647,13]],[[234189,456782],[-648,10]],[[233541,456792],[3,4901],[-183,1630]],[[233541,456792],[-968,9]],[[236120,456759],[-644,5]],[[235476,456764],[-640,5]],[[238622,463248],[103,-1618],[-1,-4868]],[[238724,456762],[-656,0]],[[238068,456762],[-649,15]],[[239939,463232],[70,-6471]],[[240009,456761],[-640,-7]],[[239369,456754],[-645,8]],[[241313,458394],[-653,-6],[2,-1611]],[[240662,456777],[-653,-16]],[[297906,457430],[-486,-1106],[-24,856],[-523,-374],[-118,1160],[-154,-1681],[-621,1035],[76,1737],[-321,-377]],[[285652,458131],[-963,-81]],[[280945,462565],[4,-9702]],[[280949,452863],[-1704,-50]],[[279245,452813],[-396,50]],[[230663,458013],[-1032,28]],[[282502,452814],[-1272,49]],[[281230,452863],[-281,0]],[[291714,459474],[-261,-2859],[238,-600]],[[291691,456015],[-916,-2845]],[[290775,453170],[-1003,-3057]],[[289772,450113],[-329,184],[-290,2566]],[[289153,452863],[-165,772],[10,2860]],[[248577,462281],[18,-5761]],[[248595,456520],[-1108,-48]],[[247487,456472],[-211,623],[-224,2872]],[[294352,453790],[-85,-1335],[-514,519],[-607,1358]],[[293146,454332],[53,903]],[[293199,455235],[352,2851],[1,3422]],[[249240,456572],[-645,-52]],[[250040,462182],[14,-5553]],[[250054,456629],[-814,-57]],[[251324,462082],[2,-6381]],[[251326,455701],[-650,-38],[2,1005],[-624,-39]],[[186724,458176],[47,-5357]],[[186771,452819],[-155,1]],[[186616,452820],[-2328,12]],[[253396,462083],[-8,-6346]],[[253388,455737],[-109,0]],[[253279,455737],[-975,-13]],[[252304,455724],[-325,0]],[[251979,455724],[-5,6330]],[[251979,455724],[-653,-23]],[[254614,455702],[-1226,35]],[[254488,462036],[-82,-3532],[208,-2802]],[[293199,455235],[-367,801],[-92,-1372],[-647,330],[-402,1021]],[[301127,459736],[69,-1616]],[[301196,458120],[-253,-1012],[-168,1020]],[[300849,458518],[22,492]],[[227845,459416],[-2,-4858]],[[227843,454558],[-1298,-23]],[[226545,454535],[0,6479]],[[212995,452955],[-1853,-35]],[[211142,452920],[-108,11]],[[226545,454535],[3,-3229]],[[226548,451306],[-1288,-24]],[[225260,451282],[-14,3237]],[[266372,454459],[-653,-60]],[[265719,454399],[-998,-201]],[[264721,454198],[3,6571]],[[266337,460967],[35,-6508]],[[203590,460931],[13,-19328],[-708,2],[8,-7373]],[[202903,434232],[-1501,65]],[[201402,434297],[-1279,5]],[[200123,434302],[-1673,-16]],[[198450,434286],[-31,12241],[1170,-39],[16,8015],[-52,3235]],[[205805,446473],[4,-12257]],[[205809,434216],[-2545,-6]],[[203264,434210],[-361,22]],[[188448,452855],[-1677,-36]],[[264721,454198],[-644,35]],[[264077,454233],[-965,-59]],[[263112,454174],[-25,6539]],[[263112,454174],[-326,40]],[[262786,454214],[-1301,-17]],[[261485,454197],[-15,6484]],[[260173,460695],[3,-6540]],[[260176,454155],[-1280,41]],[[258896,454196],[-2,3199],[-393,-4]],[[258501,457391],[253,3280]],[[261485,454197],[-1309,-42]],[[289153,452863],[-334,-23]],[[288819,452840],[-1736,23]],[[287083,452863],[-29,3458],[98,834],[-137,3349]],[[287083,452863],[-115,0]],[[286968,452863],[-1145,0]],[[285823,452863],[55,5247]],[[247487,456472],[432,-1434],[26,-1577]],[[247945,453461],[-2077,28]],[[245868,453489],[2,4873]],[[229363,457786],[-2,-3238]],[[229361,454548],[-545,3]],[[228816,454551],[-973,7]],[[301196,458120],[304,-647]],[[301500,457473],[18,-1677],[-433,-1150]],[[301085,454646],[-839,-2060]],[[300246,452586],[-325,599]],[[298144,453428],[-1041,73]],[[297103,453501],[-1391,88]],[[295712,453589],[-125,18]],[[301793,457791],[116,-445]],[[301909,457346],[403,-2846],[-196,-1501],[475,-1514],[5,-2152]],[[302596,449333],[-234,-1189]],[[302362,448144],[-280,-204],[-97,-1526],[-241,-453]],[[301744,445961],[-218,3011],[-291,-217],[146,1519],[-214,1940],[-82,2432]],[[301500,457473],[293,318]],[[243271,458433],[-1,-8140]],[[243270,450293],[-1301,18]],[[241969,450311],[-2,8093]],[[244574,458384],[-7,-6498]],[[244567,451886],[-1,-1627]],[[244566,450259],[-1296,34]],[[241969,450311],[-1303,-7]],[[240666,450304],[-4,6473]],[[245868,453489],[0,-1629]],[[245868,451860],[-1301,26]],[[285823,452863],[-1027,0]],[[284796,452863],[-109,0]],[[230662,456868],[249,-1941],[-15,-1182]],[[230896,453745],[-107,-597],[-679,13]],[[230110,453161],[-2,1379],[-747,8]],[[198450,434286],[-3154,-25]],[[195296,434261],[-2647,-56]],[[192649,434205],[-133,0]],[[192516,434205],[0,10793]],[[277320,452816],[-6,-2742]],[[277314,450074],[-2528,-14]],[[274786,450060],[0,2383]],[[274786,452443],[526,1090],[1585,4344]],[[258896,454196],[-10,-5792]],[[258886,448404],[-830,-14]],[[258056,448390],[-837,12]],[[257219,448402],[579,2539],[358,3966],[345,2484]],[[232573,456801],[-5,-6484]],[[232568,450317],[-1299,59]],[[231269,450376],[19,2011],[-392,1358]],[[240666,450304],[-1299,5]],[[239367,450309],[2,6445]],[[235476,456764],[0,-6454]],[[235476,450310],[-323,-7]],[[235153,450303],[-970,19]],[[234183,450322],[6,6460]],[[234183,450322],[-1294,1]],[[232889,450323],[-321,-6]],[[238068,456762],[0,-6440]],[[238068,450322],[-326,1]],[[237742,450323],[-971,-4]],[[236771,450319],[-2,6455]],[[236771,450319],[-324,-4]],[[236447,450315],[-971,-5]],[[239367,450309],[-322,8]],[[239045,450317],[-977,5]],[[251326,455701],[-4,-4851]],[[251322,450850],[-1168,-69],[-750,255]],[[249404,451036],[-159,538]],[[249245,451574],[-5,4998]],[[249245,451574],[-1296,-32]],[[247949,451542],[-4,1919]],[[293146,454332],[-66,-9100]],[[293080,445232],[-482,-138],[-384,934],[-288,-777]],[[291926,445251],[-77,1003],[-501,1869],[338,2426],[-911,2621]],[[254614,455702],[218,-1446],[316,-5438]],[[255148,448818],[123,-1399]],[[255271,447419],[-6,-4485]],[[255265,442934],[-737,66],[-9,1648],[-322,-35],[-7,1623],[-327,774]],[[253863,447010],[319,582],[-16,5161],[-954,-144]],[[253212,452609],[67,3128]],[[252304,455724],[-37,-8080]],[[252267,447644],[0,-1641]],[[252267,446003],[-938,-57]],[[251329,445946],[-7,4904]],[[253212,452609],[3,-4870]],[[253215,447739],[-948,-95]],[[216537,454582],[2,-6500]],[[216539,448082],[-1559,-14]],[[214980,448068],[-230,-4],[4,4971]],[[301744,445961],[-236,-1674],[-533,-780]],[[300975,443507],[-36,3034],[-176,277]],[[300763,446818],[-87,707]],[[300676,447525],[-253,1172]],[[300423,448697],[-177,3889]],[[218154,454507],[10,-6475]],[[218164,448032],[-1572,52]],[[216592,448084],[-53,-2]],[[230110,453161],[-2,-5099]],[[230108,448062],[-976,13]],[[229132,448075],[-318,5]],[[228814,448080],[2,6471]],[[227843,454558],[1,-6473]],[[227844,448085],[-1288,-18]],[[226556,448067],[-8,3239]],[[228814,448080],[-648,2]],[[228166,448082],[-322,3]],[[219766,454469],[6,-6447]],[[219772,448022],[-1243,-2]],[[218529,448020],[-365,12]],[[225260,451282],[0,-3235]],[[225260,448047],[-1272,-15]],[[223988,448032],[-19,0]],[[223969,448032],[-6,6481]],[[221384,454468],[0,-6437]],[[221384,448031],[-1572,-10]],[[219812,448021],[-40,1]],[[222677,454502],[3,-6462]],[[222680,448040],[-1296,-9]],[[223969,448032],[-1263,4]],[[222706,448036],[-26,4]],[[265719,454399],[30,-6681]],[[265749,447718],[-327,-64]],[[265422,447654],[-1337,-251]],[[264085,447403],[-8,6830]],[[294378,453789],[-86,-7126]],[[294292,446663],[-33,-2600]],[[294259,444063],[-1125,-725],[-133,-918]],[[293001,442420],[79,2812]],[[302596,449333],[321,-1189],[408,-369],[764,1511],[-341,4569],[401,-2137],[107,-3239],[-210,-1768],[-1085,-604],[-241,-1586],[-502,-404],[144,4027]],[[262786,454214],[4,-5818]],[[262790,448396],[-1035,-6]],[[261755,448390],[-267,4]],[[261488,448394],[-3,5803]],[[264085,447403],[-109,-15]],[[263976,447388],[-1133,-180]],[[262843,447208],[-53,1188]],[[261488,448394],[-1023,-15]],[[260465,448379],[-349,0]],[[260116,448379],[69,741],[-9,5035]],[[260116,448379],[-774,27]],[[259342,448406],[-456,-2]],[[295712,453589],[-58,-1345],[397,121],[-173,-3103],[-189,-155],[94,-2951]],[[295783,446156],[-481,-2335],[-431,-845]],[[294871,442976],[-365,419],[-214,3268]],[[231269,450376],[205,-1283],[-160,-2129]],[[231314,446964],[-897,11]],[[230417,446975],[1,1083],[-310,4]],[[297103,453501],[5,-4180],[88,63],[182,-3932]],[[297378,445452],[-156,-333]],[[297222,445119],[-108,1173],[-581,-358],[-107,-908]],[[296426,445026],[-541,-412],[-102,1542]],[[298237,453401],[8,-1301],[-328,-15],[-2,-2289],[170,-1515],[-230,-737]],[[297855,447544],[-477,-2092]],[[247949,451542],[-252,-2717]],[[247697,448825],[-205,-1009]],[[247492,447816],[-632,692]],[[246860,448508],[-476,-580],[-516,680]],[[245868,448608],[0,3252]],[[299081,453014],[27,-5277]],[[299108,447737],[6,-1575]],[[299114,446162],[-459,-104],[-560,583],[-240,903]],[[300423,448697],[-95,-429]],[[300328,448268],[-110,206]],[[300218,448474],[-189,-592],[-921,-145]],[[291926,445251],[-301,-1608],[-771,-203],[-6,-1282]],[[290848,442158],[-634,1017],[-245,2280]],[[289969,445455],[47,2798],[-244,1860]],[[160757,452819],[3,-15155]],[[160760,437664],[-2931,-15]],[[157829,437649],[50,2566],[-253,887],[-643,-3074],[-236,36],[-242,-1729],[156,-2198],[-334,192],[-289,1393],[-274,-63],[-470,1939]],[[155294,437598],[-187,3492],[-519,272]],[[154588,441362],[111,941],[-260,2964],[146,1892],[-113,2512],[387,1397],[129,1813]],[[214980,448068],[2,-6471]],[[214982,441597],[-197,8],[0,-3232]],[[214785,438373],[-1547,1]],[[213238,438374],[-73,4047]],[[213165,442421],[1,5662],[-117,1089],[3,3792]],[[213165,442421],[-2040,-26]],[[211125,442395],[-4,4869]],[[211121,447264],[21,5656]],[[188448,452855],[2,-2742],[226,-3238],[-46,-2736],[-189,-2015]],[[188441,442124],[-433,106],[-167,-983],[-443,939]],[[187398,442186],[-88,2093],[-182,-89],[-193,3078],[-4,3038],[-315,2514]],[[211121,447264],[-1902,-23]],[[189737,445043],[-2,-6109]],[[189735,438934],[-608,-2000]],[[189127,436934],[120,1271],[-305,2684],[-249,88]],[[188693,440977],[-252,1147]],[[286968,452863],[88,-6473]],[[287056,446390],[-234,-102],[-57,-1948]],[[286765,444340],[-1655,896]],[[285110,445236],[-170,121]],[[284940,445357],[-144,7506]],[[284940,445357],[-238,-844],[-1781,-169]],[[282921,444344],[-29,8518]],[[187398,442186],[-205,139],[-194,-1813],[-584,5],[-711,-4841]],[[185704,435676],[-852,-1423],[-3463,-5]],[[181389,434248],[1,18498]],[[173097,434253],[-1,-6651],[-636,-10],[-149,-2165]],[[172311,425427],[-25,2930],[-933,15],[0,3230],[-3183,-37],[0,1955],[-1457,-9]],[[166713,433511],[-57,0],[17,19239]],[[173097,452848],[0,-18595]],[[181389,434248],[-13,-16439]],[[181376,417809],[-3391,104],[-1592,99]],[[176393,418012],[-461,-9],[-438,10035],[-1,6209],[-1195,9]],[[174298,434256],[-1201,-3]],[[281230,452863],[9,-7106]],[[281239,445757],[-601,-298]],[[280638,445459],[-179,516],[-1317,-113]],[[279142,445862],[103,6951]],[[282921,444344],[4,-1186]],[[282925,443158],[-1089,-71]],[[281836,443087],[-171,12],[-426,2658]],[[154588,441362],[-303,-18],[-4,1572],[-819,-16]],[[153462,442900],[-267,5082],[-262,812],[123,4043]],[[289969,445455],[-804,-6748]],[[289165,438707],[-411,-130]],[[288754,438577],[180,478],[-59,7138]],[[288875,446193],[-56,6647]],[[288875,446193],[-721,12]],[[288154,446205],[-1098,185]],[[279142,445862],[-1549,13]],[[277593,445875],[-281,-13]],[[277312,445862],[2,4212]],[[164792,452768],[-2,-15095]],[[164790,437673],[-3709,-1]],[[161081,437672],[-321,-8]],[[166713,433511],[-9,-8230],[-71,-9],[-2,-9666],[318,13]],[[166949,415619],[45,-3525],[106,-405],[-51,-2898]],[[167049,408791],[-264,-205]],[[166785,408586],[-505,-709],[-438,-1338],[-205,182],[104,-3535],[-151,-1501]],[[165590,401685],[-469,-1590],[-343,3]],[[164778,400098],[-9,2800]],[[164769,402898],[12,2458]],[[164781,405356],[6,5108]],[[164787,410464],[3,27209]],[[253863,447010],[-4,809],[-643,-82]],[[253216,447737],[-1,2]],[[274786,450060],[0,-6514]],[[274786,443546],[-1348,42]],[[273438,443588],[-1,3974]],[[273437,447562],[3,2573]],[[273440,450135],[1346,2308]],[[245868,448608],[-3,-3243]],[[245865,445365],[-1300,22]],[[244565,445387],[1,4872]],[[249404,451036],[-5,-5898]],[[249399,445138],[-644,-16]],[[248755,445122],[-900,11]],[[247855,445133],[-158,3692]],[[226556,448067],[2,-4023]],[[226558,444044],[-753,-845],[-533,-1]],[[225272,443198],[-12,4849]],[[251329,445946],[-636,7],[1,-814]],[[250694,445139],[-1295,-1]],[[232889,450323],[0,-4862],[165,-1791]],[[233054,443670],[-1389,16]],[[231665,443686],[-256,439],[-95,2839]],[[243270,450293],[6,-6524]],[[243276,443769],[-326,-13]],[[242950,443756],[-979,-17]],[[241971,443739],[-2,6572]],[[237742,450323],[68,-6545]],[[237810,443778],[-1255,-153]],[[236555,443625],[-107,1818],[-1,4872]],[[234183,450322],[1,-4860],[144,-1818]],[[234328,443644],[-317,10]],[[234011,443654],[-957,16]],[[235153,450303],[2,-4797],[121,-1872]],[[235276,443634],[-948,10]],[[241971,443739],[-319,-4]],[[241652,443735],[-960,-14]],[[240692,443721],[-26,6583]],[[239045,450317],[53,-6615]],[[239098,443702],[0,-314]],[[239098,443388],[-1288,390]],[[240692,443721],[-320,-6]],[[240372,443715],[-1274,-13]],[[236555,443625],[-1279,9]],[[244565,445387],[-5,-3261]],[[244560,442126],[-322,12]],[[244238,442138],[-104,1623],[-858,8]],[[273437,447562],[-275,-15],[3,-1357],[-539,-11],[-3,-1320],[-265,-4]],[[272358,444855],[-272,1146]],[[272086,446001],[570,2452],[784,1682]],[[277312,445862],[-602,-34],[-476,-2456]],[[276234,443372],[-1448,-20]],[[274786,443352],[0,194]],[[247855,445133],[-29,-825],[-657,-1555],[-5,-2418]],[[247164,440335],[-1778,120]],[[245386,440455],[0,4]],[[245386,440459],[89,1581],[707,640]],[[246182,442680],[363,171],[871,2340],[76,2625]],[[300676,447525],[-94,-1308],[-254,2051]],[[246182,442680],[7,2674],[-324,11]],[[300218,448474],[-108,-2110]],[[300110,446364],[-154,-894],[-847,-110]],[[299109,445360],[5,802]],[[260465,448379],[14,-4389]],[[260479,443990],[3,-1610]],[[260482,442380],[-1130,-18]],[[259352,442362],[-1,806]],[[259351,443168],[-9,5238]],[[259351,443168],[-1136,-50],[2,-810]],[[258217,442308],[-163,-1]],[[258054,442307],[104,4029],[-102,2054]],[[258054,442307],[-490,-569],[-231,-2173],[-408,-905]],[[256925,438660],[-7,8808]],[[256918,447468],[301,934]],[[262847,444118],[-1085,-69]],[[261762,444049],[-7,4341]],[[262843,447208],[4,-3090]],[[261762,444049],[-1283,-59]],[[229132,448075],[0,-5329]],[[229132,442746],[-759,-1483],[-211,138]],[[228162,441401],[4,6681]],[[228162,441401],[-318,227]],[[227844,441628],[-643,-1180]],[[227201,440448],[0,1151],[-292,1]],[[226909,441600],[0,2456],[-351,-12]],[[230417,446975],[2,-2974],[320,-2434]],[[230739,441567],[-395,2]],[[230344,441569],[-276,747],[-936,373]],[[229132,442689],[0,57]],[[218529,448020],[-5,-6446]],[[218524,441574],[-1550,27]],[[216974,441601],[-383,9]],[[216591,441610],[1,6474]],[[216591,441610],[-1609,-13]],[[225272,443198],[0,-1617]],[[225272,441581],[-1262,6]],[[224010,441587],[-20,-2]],[[223990,441585],[-2,6447]],[[222706,448036],[25,-6450]],[[222731,441586],[-12,-6463]],[[222719,435123],[-609,-9]],[[222110,435114],[-2224,2]],[[219886,435116],[-74,6454]],[[219812,441570],[0,6451]],[[219812,441570],[-1288,4]],[[223990,441585],[-1259,1]],[[267414,445850],[-697,-80]],[[266717,445770],[-430,-32],[-394,-2264],[-479,-1510]],[[265414,441964],[1,1360]],[[265415,443324],[7,4330]],[[265749,447718],[781,161]],[[266530,447879],[6,1]],[[266536,447880],[30,6]],[[266566,447886],[16,1]],[[266582,447887],[26,6]],[[266608,447893],[806,-2043]],[[255265,442934],[-2,-3134]],[[255263,439800],[-1357,-110],[6,-1614],[-648,-80]],[[253264,437996],[-23,4868]],[[253241,442864],[-25,4873]],[[267414,445850],[546,-1925],[381,1255],[294,-1578],[-868,-836]],[[267767,442766],[-50,-4]],[[267717,442762],[-15,-1]],[[267702,442761],[-769,5],[-213,794]],[[266720,443560],[-3,2210]],[[253241,442864],[-956,-107]],[[252285,442757],[-18,3246]],[[265415,443324],[-1279,-37]],[[264136,443287],[-108,529],[-52,3572]],[[273438,443588],[0,-2864]],[[273438,440724],[-1081,8]],[[272357,440732],[1,4123]],[[299109,445360],[-23,-3357],[-140,-1618]],[[298946,440385],[-436,-421],[-482,288],[-416,-840],[-291,2723]],[[297321,442135],[350,235],[-50,1824],[-299,-181],[-100,1106]],[[256110,445860],[11,-7106]],[[256121,438754],[-158,-435]],[[255963,438319],[-386,-1051],[-314,71]],[[255263,437339],[0,2461]],[[255271,447419],[248,-1015],[591,-544]],[[256925,438660],[-559,918],[-245,-824]],[[256110,445860],[808,1608]],[[264136,443287],[1,-1079]],[[264137,442208],[-1288,-29]],[[262849,442179],[-2,1939]],[[211125,442395],[-24,-800]],[[211101,441595],[-1879,-26]],[[209222,441569],[-1,3184]],[[231665,443686],[164,-2163]],[[231829,441523],[-1090,44]],[[300704,446133],[-85,-2793],[-210,505],[295,2288]],[[300975,443507],[-208,-748],[-4,4059]],[[294871,442976],[348,-1153],[336,-2034],[-121,-1229]],[[295434,438560],[-200,-1187],[-705,-2090],[-626,-1185]],[[293903,434098],[-195,2025],[683,2086],[-173,2860]],[[294218,441069],[41,2994]],[[209222,441569],[-4,-7295]],[[209218,434274],[-2479,-59]],[[206739,434215],[-930,1]],[[300110,446364],[27,-3366],[-179,-1833],[-1042,-1242],[30,462]],[[288154,446205],[-316,-4003]],[[287838,442202],[-487,-794],[-761,-136]],[[286590,441272],[175,3068]],[[297321,442135],[207,-2884],[-531,-114]],[[296997,439137],[-298,3270],[-256,-278],[-17,2897]],[[296997,439137],[9,-62]],[[297006,439075],[21,-79]],[[297027,438996],[-1112,58],[-473,-1600],[-8,1106]],[[288754,438577],[-264,-1321]],[[288490,437256],[-133,486],[-104,2827],[-415,1633]],[[293001,442420],[-13,-2190]],[[292988,440230],[-683,-3302]],[[292305,436928],[-373,1054]],[[291932,437982],[-934,2867]],[[290998,440849],[-150,1309]],[[252285,442757],[26,-6500]],[[252311,436257],[-960,-39],[-1,-3314]],[[251350,432904],[-324,-34]],[[251026,432870],[0,3329],[-319,-14]],[[250707,436185],[-5,3838]],[[250702,440023],[-8,5116]],[[272357,440732],[-1,0]],[[272356,440732],[-569,47],[73,-1359],[-321,-13]],[[271539,439407],[-538,-38]],[[271001,439369],[3,1405],[-263,14],[8,2861]],[[270749,443649],[623,-332],[714,2684]],[[280638,445459],[-3,-3672],[463,-4],[46,-3243]],[[281144,438540],[-1140,433],[-177,-968]],[[279827,438005],[-70,1137],[-624,1848],[-379,-396]],[[278754,440594],[88,2092],[292,-302],[8,3478]],[[278754,440594],[-317,-166]],[[278437,440428],[5,1839],[-538,103],[-216,-927]],[[277688,441443],[-95,4432]],[[277688,441443],[-1,-945],[-351,-264],[-253,-2768]],[[277083,437466],[-849,-18]],[[276234,437448],[0,5924]],[[269692,442195],[16,-2668]],[[269708,439527],[-1391,120]],[[268317,439647],[-18,2605],[-150,10]],[[268149,442262],[253,825],[384,-407]],[[268786,442680],[-5,-153]],[[268781,442527],[480,-1172],[431,840]],[[266720,443560],[-15,-4583]],[[266705,438977],[-3,-1624]],[[266702,437353],[-1282,19]],[[265420,437372],[-6,4592]],[[281836,443087],[1,-1967],[-292,-2833]],[[281545,438287],[-401,253]],[[290998,440849],[-384,-1439],[-427,-3445]],[[290187,435965],[-461,1079],[82,1909],[-643,-246]],[[245386,440459],[-830,46],[4,1621]],[[285110,445236],[175,-3416],[441,-1905],[405,-536]],[[286131,439379],[-539,-2232]],[[285592,437147],[-256,304]],[[285336,437451],[-455,-615]],[[284881,436836],[-228,-951],[-463,-355]],[[284190,435530],[-1068,5402],[-197,2226]],[[286590,441272],[-78,-1277]],[[286512,439995],[-381,-616]],[[250702,440023],[-480,-176],[-57,-1256],[-306,11],[0,-1588]],[[249859,437014],[-479,1]],[[249380,437015],[-1,1587],[-610,12]],[[248769,438614],[-14,6508]],[[248769,438614],[-31,-1592],[-323,7]],[[248415,437029],[-1262,34]],[[247153,437063],[11,3272]],[[192516,434205],[-2782,5],[1,4724]],[[262849,442179],[1,-2880]],[[262850,439299],[-1082,-133]],[[261768,439166],[-6,4883]],[[261768,439166],[-323,-1]],[[261445,439165],[-639,38],[-321,533]],[[260485,439736],[-3,2644]],[[226909,441600],[-6,-1597],[-967,-298],[-621,-536],[-31,2413]],[[225284,441582],[-12,-1]],[[293006,440243],[-18,-18]],[[292988,440225],[0,5]],[[294218,441069],[-1212,-826]],[[302428,442673],[372,-1939],[-773,-264],[113,1840],[288,363]],[[271001,439369],[-263,5],[-6,-1403],[-273,-2],[-271,-1169],[-5,-1369]],[[270183,435431],[-459,41]],[[269724,435472],[-16,4055]],[[269692,442195],[936,1653],[121,-199]],[[244238,442138],[-5,-4866]],[[244233,437272],[-641,8]],[[243592,437280],[-640,13]],[[242952,437293],[-2,6463]],[[239098,443388],[2,-6149]],[[239100,437239],[-639,12]],[[238461,437251],[-646,14]],[[237815,437265],[-5,6513]],[[242952,437293],[-653,-16]],[[242299,437277],[-642,-14]],[[241657,437263],[-5,6472]],[[237815,437265],[-627,-98]],[[237188,437167],[-633,7]],[[236555,437174],[0,6451]],[[241657,437263],[-642,-12]],[[241015,437251],[-638,-8]],[[240377,437243],[-5,6472]],[[240377,437243],[-639,-2]],[[239738,437241],[-638,-2]],[[234011,443654],[-4,-6441]],[[234007,437213],[-636,14]],[[233371,437227],[-1382,-2]],[[231989,437225],[-120,575]],[[231869,437800],[88,2413],[-128,1310]],[[235276,443634],[0,-6443]],[[235276,437191],[-633,8]],[[234643,437199],[-636,14]],[[236555,437174],[-638,8]],[[235917,437182],[-641,9]],[[274786,443352],[1,-6623]],[[274787,436729],[-1339,18]],[[273448,436747],[-10,3977]],[[267702,442761],[447,-499]],[[268317,439647],[3,-645]],[[268320,439002],[-1615,-25]],[[276234,437448],[-271,-1900]],[[275963,435548],[-140,819],[-1037,201]],[[274786,436568],[1,161]],[[265420,437372],[-967,-37]],[[264453,437335],[-1,4878],[-315,-5]],[[259352,442362],[14,-4890],[-65,-6]],[[259301,437466],[-1086,-26]],[[258215,437440],[2,4868]],[[284190,435530],[0,-456]],[[284190,435074],[-1015,-1516],[-180,1961],[-470,731],[-132,1393],[-289,-77],[-14,1365],[-389,-1859]],[[281701,437072],[-156,1215]],[[155294,437598],[-138,-2080],[141,-717],[-208,-2138],[-386,312],[218,-3716],[-6,-13593]],[[154915,415666],[-1334,-12]],[[153581,415654],[-243,1901],[-703,2914],[-129,3412],[387,4770],[132,-280],[308,6363],[-131,874],[260,7292]],[[253264,437996],[-21,-1627]],[[253243,436369],[-932,-112]],[[229132,442689],[-7,-7583]],[[229125,435106],[-7,1]],[[229118,435107],[-1274,15]],[[227844,435122],[0,6506]],[[230344,441569],[400,-3784]],[[230744,437785],[23,-2699]],[[230767,435086],[-404,-540]],[[230363,434546],[0,542],[-1238,18]],[[260485,439736],[-89,-4618]],[[260396,435118],[-728,-71]],[[259668,435047],[-364,782],[-3,1637]],[[213238,438374],[-29,-4081]],[[213209,434293],[-91,-1]],[[213118,434292],[-2030,-1]],[[211088,434291],[13,7304]],[[278437,440428],[-17,-5242]],[[278420,435186],[-185,-771],[-669,-629],[-401,1395],[-70,2246]],[[277095,437427],[-12,39]],[[188693,440977],[-212,-2506],[-449,-761],[-413,552],[-140,-1426]],[[187479,436836],[-928,257],[-847,-1417]],[[258215,437440],[-1290,17]],[[256925,437457],[0,1203]],[[288490,437256],[-135,-732]],[[288355,436524],[-329,-581],[98,-1543],[-739,-1772]],[[287385,432628],[-586,684]],[[286799,433312],[-59,3514],[-251,1238],[23,1931]],[[264453,437335],[-316,-6]],[[264137,437329],[-325,1637],[-962,-17]],[[262850,438949],[0,350]],[[245386,440455],[-115,-1740],[344,-1568],[113,-1545]],[[245728,435602],[-1175,26]],[[244553,435628],[2,1613],[-322,31]],[[216974,441601],[-2,-6470],[56,-810]],[[217028,434321],[-2233,-1]],[[214795,434320],[-10,4053]],[[219886,435116],[3,-6448]],[[219889,428668],[-1545,-2]],[[218344,428666],[-1309,-44]],[[217035,428622],[-7,5699]],[[304069,440802],[121,-1847],[-424,-197],[303,2044]],[[227844,435122],[-1276,-6]],[[226568,435116],[-6,2365]],[[226562,437481],[639,2967]],[[211088,434291],[-535,-10]],[[210553,434281],[-1335,-7]],[[226562,437481],[-534,-2005],[-733,-3605]],[[225295,431871],[-11,3241]],[[225284,435112],[0,6470]],[[225284,435112],[-1212,5]],[[224072,435117],[-74,0]],[[223998,435117],[12,6470]],[[223998,435117],[-1279,6]],[[231869,437800],[-1125,-15]],[[189127,436934],[-680,-1517],[-235,-1307],[316,-2474],[-193,-1471],[-256,343]],[[188079,430508],[-272,1154]],[[187807,431662],[-214,1796],[-114,3378]],[[279827,438005],[-264,-1317],[-1,-4191]],[[279562,432497],[-1143,101]],[[278419,432598],[1,2588]],[[157829,437649],[146,-436],[-429,-4820],[-421,-4012],[145,-2152],[-836,-2813],[-185,-2444]],[[156249,420972],[222,-710],[144,-5037]],[[156615,415225],[-1701,-22],[1,463]],[[293524,432082],[-325,588]],[[293199,432670],[123,2992],[-28,2071],[-288,2510]],[[293903,434098],[-379,-2016]],[[291932,437982],[-383,-2133]],[[291549,435849],[-417,-3054],[-322,-187]],[[290810,432608],[-554,3400]],[[290256,436008],[-69,-43]],[[272356,440732],[-5,-6697]],[[272351,434035],[-74,-1524],[-634,144]],[[271643,432655],[-114,1381]],[[271529,434036],[10,5371]],[[273448,436747],[0,-2714],[-243,-5]],[[273205,434028],[-854,7]],[[247153,437063],[-6,-1623]],[[247147,435440],[-963,88]],[[246184,435528],[-456,35]],[[245728,435563],[0,39]],[[250707,436185],[-548,-8],[-300,837]],[[293219,434221],[-863,2534]],[[292356,436755],[-51,173]],[[292988,440225],[220,-3323],[11,-2681]],[[286799,433312],[-277,-2753],[-204,-490]],[[286318,430069],[-412,1992]],[[285906,432061],[44,1187],[-292,2181],[-66,1718]],[[255263,437339],[2,-2898]],[[255265,434441],[-1688,-234]],[[253577,434207],[-321,-56]],[[253256,434151],[-13,2218]],[[261445,439165],[-77,-4820]],[[261368,434345],[-859,-54]],[[260509,434291],[-113,827]],[[294554,427872],[-111,3761]],[[294443,431633],[-93,1192],[769,-305],[174,1128],[1072,-46],[376,298],[903,2985],[-441,-2838],[-371,-1388],[292,-372],[379,1926],[532,898],[205,-1023],[552,1761],[82,-626],[-1554,-3632],[-192,472],[-405,-1606],[-231,346],[-428,-1336],[-389,99],[-351,-945],[-238,353],[-532,-1102]],[[269724,435472],[-278,-7],[9,-1349]],[[269455,434116],[-813,51]],[[268642,434167],[-292,19]],[[268350,434186],[-30,4816]],[[256925,437457],[-1,-4839]],[[256924,432618],[-156,-1387],[-315,-5],[2,-1882]],[[256455,429344],[-469,-1]],[[255986,429343],[-23,8976]],[[271529,434036],[-1228,59]],[[270301,434095],[-118,1336]],[[262850,438949],[1,-4898]],[[262851,434051],[1,-1244]],[[262852,432807],[-755,-89]],[[262097,432718],[-730,-14]],[[261367,432704],[1,1641]],[[268350,434186],[-789,-60]],[[267561,434126],[-857,-30]],[[266704,434096],[-2,3257]],[[281701,437072],[-194,-834],[74,-2825],[-363,-706],[-462,-3035],[47,-403]],[[280803,429269],[26,-143]],[[280829,429126],[-1257,-6]],[[279572,429120],[-10,3377]],[[192649,434205],[0,-3424]],[[192649,430781],[-728,405],[-315,-879],[-787,-888],[-261,131],[-420,-1293]],[[190138,428257],[-340,-1866],[-343,-529],[-618,1479],[-69,1143],[-267,-1698],[-177,190]],[[188324,426976],[-245,3532]],[[284190,435074],[-613,-3675]],[[283577,431399],[-884,-2182]],[[282693,429217],[-399,259],[-333,-970],[-479,890]],[[281482,429396],[-679,-127]],[[290256,436008],[-428,-2351]],[[289828,433657],[-466,-1940],[-519,-917]],[[288843,430800],[-280,2542],[218,671],[-426,2511]],[[264137,437329],[-1,-3255],[-160,-7]],[[263976,434067],[-1125,-16]],[[249380,437015],[-1,-3256]],[[249379,433759],[-966,19]],[[248413,433778],[2,3251]],[[214795,434320],[-2,-28]],[[214793,434292],[-1584,1]],[[255986,429343],[-721,8]],[[255265,429351],[0,5090]],[[292587,430897],[-395,1442]],[[292192,432339],[-104,1880],[-539,1630]],[[292356,436755],[-165,-2166],[367,-971],[29,-2721]],[[231989,437225],[3,-1985]],[[231992,435240],[-431,236],[-484,-1309],[-310,919]],[[164787,410464],[-407,-275]],[[164380,410189],[102,1081],[5,3235],[-258,1376],[-24,1351],[-366,545],[-472,2488],[-707,1250],[-457,-2310],[-371,1200],[1,3539],[-743,-22]],[[161090,423922],[22,8573],[-31,5177]],[[161090,423922],[-473,4]],[[160617,423926],[-1427,-349],[-831,-1032],[-549,336],[-407,-1138],[-271,689],[-883,-1460]],[[285336,437451],[-167,-4196],[366,397],[371,-1591]],[[286318,430069],[-895,-2188]],[[285423,427881],[-525,-887],[-165,332]],[[284733,427326],[26,188]],[[284759,427514],[265,1448],[124,3090]],[[285148,432052],[-223,1660],[-44,3124]],[[259668,435047],[-2,-813]],[[259666,434234],[-620,-58],[0,-1610]],[[259046,432566],[-835,5]],[[258211,432571],[4,4869]],[[226568,435116],[1,-6480]],[[226569,428636],[-1260,-4]],[[225309,428632],[-14,-1]],[[225295,428631],[0,3240]],[[258211,432571],[-314,19]],[[257897,432590],[-973,28]],[[277095,437427],[-6,-9328]],[[277089,428099],[-1270,90]],[[275819,428189],[-27,3362]],[[275792,431551],[-19,2706],[190,1291]],[[278419,432598],[1,-2521],[-655,-4576]],[[277765,425501],[-675,2580]],[[277090,428081],[-1,18]],[[266704,434096],[-266,-3234]],[[266438,430862],[-1015,34]],[[265423,430896],[-1,1871]],[[265422,432767],[-2,4605]],[[265422,432767],[-638,-293],[0,-813],[-644,-36]],[[264140,431625],[-164,2442]],[[243592,437280],[-8,-4878]],[[243584,432402],[-1283,-20]],[[242301,432382],[-2,4895]],[[244553,435628],[-3,-4868],[-104,1]],[[244446,430761],[-862,15]],[[243584,430776],[0,1626]],[[242301,432382],[-1281,-16]],[[241020,432366],[-5,4885]],[[238461,437251],[3,-4896]],[[238464,432355],[-1277,-24]],[[237187,432331],[1,4836]],[[239738,437241],[4,-4883]],[[239742,432358],[-1278,-3]],[[241020,432366],[-1278,-8]],[[233371,437227],[-2,-4811]],[[233369,432416],[-1193,2]],[[232176,432418],[-184,2822]],[[234643,437199],[-2,-4800]],[[234641,432399],[-1272,17]],[[235917,437182],[-1,-4805]],[[235916,432377],[-1275,22]],[[237187,432331],[-1271,46]],[[187807,431662],[-565,-723],[-182,1854],[-716,-2763]],[[186344,430030],[-640,5646]],[[248413,433778],[-2,-4886]],[[248411,428892],[-1277,44]],[[247134,428936],[13,6504]],[[285148,432052],[-398,107],[-1152,-1498]],[[283598,430661],[-21,738]],[[251026,432870],[-1183,-88]],[[249843,432782],[68,968],[-532,9]],[[292970,430541],[-431,-269]],[[292539,430272],[48,625]],[[293219,434221],[-249,-3680]],[[274786,436568],[0,-4189]],[[274786,432379],[-1580,38]],[[273206,432417],[-1,1611]],[[288843,430800],[-376,-510]],[[288467,430290],[-415,-967]],[[288052,429323],[-667,3305]],[[275792,431551],[-1004,-68]],[[274788,431483],[-2,896]],[[253256,434151],[34,-7012],[-625,-15]],[[252665,427124],[-321,-16],[-28,2626],[-961,-79]],[[251355,429655],[-5,3249]],[[290810,432608],[-339,-2310]],[[290471,430298],[-220,-1439],[-616,-2210]],[[289635,426649],[-20,311]],[[289615,426960],[68,3155],[341,1723],[-196,1819]],[[292192,432339],[-162,208],[-116,-3152]],[[291914,429395],[-248,-1212]],[[291666,428183],[-265,1560],[-471,-723]],[[290930,429020],[-459,1278]],[[186344,430030],[155,-1074],[97,-4631]],[[186596,424325],[-109,-154],[37,-2824],[149,-2529],[-95,-2971]],[[186578,415847],[-452,-1998],[-1271,-19],[-3480,52]],[[181375,413882],[1,3927]],[[245728,435563],[-37,-2695],[-356,-1884],[-63,-2389]],[[245272,428595],[-424,1079]],[[244848,429674],[-402,1087]],[[246184,435528],[-12,-8061]],[[246172,427467],[-319,64]],[[245853,427531],[-783,-26]],[[245070,427505],[202,1090]],[[247134,428936],[-3,-1616]],[[247131,427320],[-959,147]],[[270301,434095],[8,-6024]],[[270309,428071],[-263,-11],[2,-1850]],[[270048,426210],[-326,-246]],[[269722,425964],[-6,3195],[-215,1865],[-46,3092]],[[232176,432418],[-58,-2195]],[[232118,430223],[-1754,3]],[[230364,430226],[-1,4320]],[[227844,435122],[-1,-6484]],[[227843,428638],[-1271,-2]],[[226572,428636],[-3,0]],[[225295,428631],[-1221,12]],[[224074,428643],[-2,6474]],[[222110,435114],[25,-6995]],[[222135,428119],[-630,263]],[[221505,428382],[-943,281]],[[220562,428663],[-673,5]],[[224074,428643],[-9,-170]],[[224065,428473],[-507,-690],[-760,186]],[[222798,427969],[-663,150]],[[229118,435107],[-7,-6481]],[[229111,428626],[-1268,12]],[[230364,430226],[0,-4858]],[[230364,425368],[-1251,12]],[[229113,425380],[-2,3246]],[[260509,434291],[14,-6500]],[[260523,427791],[-630,-27]],[[259893,427764],[-208,-13],[-19,6483]],[[255265,429351],[-1,-4575]],[[255264,424776],[-1140,-98]],[[254124,424678],[-508,40],[-39,9489]],[[261367,432704],[3,-4889],[-318,-15]],[[261052,427800],[-529,-9]],[[210532,425375],[-1577,18],[-7,-9746]],[[208948,415647],[-2260,-10]],[[206688,415637],[-254,-1]],[[206434,415636],[-6,4869]],[[206428,420505],[-5,1629],[310,-3],[6,12084]],[[210553,434281],[-21,-8906]],[[217035,428622],[-272,6]],[[216763,428628],[-1968,-10]],[[214795,428618],[0,969]],[[214795,429587],[-2,4705]],[[201978,423908],[55,-1918],[16,-7760]],[[202049,414230],[-1129,-108]],[[200920,414122],[-15,3214]],[[200905,417336],[-2,2479],[-1118,-26]],[[199785,419789],[29,5937],[320,1081],[-11,7495]],[[201402,434297],[26,-1459],[436,-670],[159,-1784],[-185,-3985],[140,-2491]],[[204199,424684],[-292,-2572],[-164,468],[-589,-929],[-98,691],[-519,-162],[-107,1114],[-340,-603],[-112,1217]],[[203264,434210],[15,-1191],[530,-3758],[390,-4577]],[[199785,419789],[-1878,-31],[-2612,18]],[[195295,419776],[7,8024]],[[195302,427800],[-6,6461]],[[213087,423794],[-321,0]],[[212766,423794],[-1910,-39]],[[210856,423755],[-5,1618],[-319,2]],[[213118,434292],[7,-4708]],[[213125,429584],[-38,-5790]],[[214795,429587],[-1670,-3]],[[195302,427800],[-315,562],[-118,3255],[-531,-11],[-250,-2208],[-269,1599],[-807,-1146],[-299,857]],[[192713,430708],[-64,73]],[[176393,418012],[113,-5116],[-101,-2197],[49,-2635],[-263,-2403],[2,-5633]],[[176193,400028],[-1933,-7]],[[174260,400021],[29,16934],[-18,16297],[27,1004]],[[174260,400021],[-2037,36],[-1236,-1303]],[[170987,398754],[153,2224],[-118,2607],[482,3073],[266,298],[86,1838],[-89,2169],[75,3206],[-204,1481]],[[171638,415650],[673,9777]],[[206428,420505],[-1667,-25]],[[204761,420480],[-562,4204]],[[259893,427764],[3,-1604]],[[259896,426160],[-839,-53]],[[259057,426107],[-11,6459]],[[268642,434167],[-7,-5295]],[[268635,428872],[-365,-116]],[[268270,428756],[-705,-39]],[[267565,428717],[-4,5409]],[[254124,424678],[8,-1608]],[[254132,423070],[-1470,-13]],[[252662,423057],[3,4067]],[[269722,425964],[-798,-95]],[[268924,425869],[-10,2970],[-279,33]],[[267565,428717],[-860,-299]],[[266705,428418],[-211,275],[-56,2169]],[[271643,432655],[-7,-4586]],[[271636,428069],[-1327,2]],[[264140,431625],[-158,-803],[1,-2439]],[[263983,428383],[-165,-1]],[[263818,428382],[0,807],[-964,-2]],[[262854,429187],[-2,3620]],[[273206,432417],[-2,-3235]],[[273204,429182],[-418,-80],[-224,-1340]],[[272562,427762],[-923,-316]],[[271639,427446],[-3,623]],[[249843,432782],[-231,-3232]],[[249612,429550],[-356,-3635],[-528,-731]],[[248728,425184],[-4,2060],[-320,38],[7,1610]],[[289615,426960],[-382,-1335]],[[289233,425625],[-268,2542],[-150,-335],[-348,2458]],[[171638,415650],[-2672,-44],[-2017,13]],[[288052,429323],[-372,-1084]],[[287680,428239],[-781,-2648],[-748,-727]],[[286151,424864],[-265,1103]],[[285886,425967],[-463,1914]],[[274788,431483],[-1,-3962]],[[274787,427521],[-415,-1047]],[[274372,426474],[-540,317]],[[273832,426791],[-154,2374],[-474,17]],[[251355,429655],[-154,-1644],[-415,-1270],[-378,-47]],[[250408,426694],[-162,394],[-9,2476],[-625,-14]],[[262854,429187],[-1,-2903]],[[262853,426284],[-742,-74]],[[262111,426210],[-14,6508]],[[265423,430896],[0,-3263]],[[265423,427633],[-634,-31],[-321,800],[-485,-19]],[[188324,426976],[-114,-601]],[[188210,426375],[-465,-891],[-618,-2134],[-142,895],[-389,80]],[[293524,432082],[-12,-1259],[-325,-351]],[[293187,430472],[-27,1524]],[[293160,431996],[39,674]],[[262111,426210],[-369,-18]],[[261742,426192],[-685,-6]],[[261057,426186],[-5,1614]],[[294554,427872],[-875,-1167]],[[293679,426705],[-79,470]],[[293600,427175],[63,323]],[[293663,427498],[119,2121],[-126,535]],[[293656,430154],[90,1670],[410,854],[287,-1045]],[[257897,432590],[-1,-3261]],[[257896,429329],[-463,33],[-65,-3266]],[[257368,426096],[-903,15]],[[256465,426111],[-10,3233]],[[259057,426107],[-583,-24]],[[258474,426083],[2,2440],[-422,-1],[-158,807]],[[279572,429120],[-482,-6118]],[[279090,423002],[-351,-508],[-158,819],[-661,807],[-155,1381]],[[292539,430272],[83,-963]],[[292622,429309],[-118,-889]],[[292504,428420],[-590,975]],[[233369,432416],[31,-5977]],[[233400,426439],[-1091,87]],[[232309,426526],[-329,3028],[138,669]],[[234641,432399],[38,-6061]],[[234679,426338],[-801,63]],[[233878,426401],[-478,38]],[[235916,432377],[-1,-6119]],[[235915,426258],[-449,10]],[[235466,426268],[-787,70]],[[243584,430776],[5,-4002]],[[243589,426774],[-630,136]],[[242959,426910],[-660,-98]],[[242299,426812],[2,5570]],[[242299,426812],[-476,-61]],[[241823,426751],[-800,-120]],[[241023,426631],[-3,5735]],[[237187,432331],[-2,-6015]],[[237185,426316],[-604,-38]],[[236581,426278],[-666,-20]],[[238464,432355],[-1,-5921]],[[238463,426434],[-606,-50]],[[237857,426384],[-672,-68]],[[239742,432358],[1,-5855]],[[239743,426503],[-772,-67]],[[238971,426436],[-508,-2]],[[241023,426631],[-213,-26]],[[240810,426605],[-1067,-102]],[[284759,427514],[-273,768],[-697,261]],[[283789,428543],[-185,151],[-6,1967]],[[293187,430472],[-271,-1807],[244,3331]],[[195295,419776],[-1,-10465]],[[195294,409311],[0,-3031]],[[195294,406280],[-156,-665],[-2555,-5]],[[192583,405610],[1,135]],[[192584,405745],[-39,1805],[122,2542],[304,1923],[-230,5]],[[192741,412020],[-28,18688]],[[275819,428189],[-81,-1216],[-510,-2451]],[[275228,424522],[-441,-3]],[[274787,424519],[0,3002]],[[282497,422685],[-451,359],[271,1888],[-71,939],[431,2360],[16,986]],[[283789,428543],[-584,-2082],[-708,-3776]],[[192741,412020],[-2481,120]],[[190260,412140],[-95,1614]],[[190165,413754],[-27,14503]],[[266705,428418],[4,-3381]],[[266709,425037],[-283,-21]],[[266426,425016],[-1003,645]],[[265423,425661],[0,1972]],[[292970,430541],[-211,-2552],[-210,-378],[73,1698]],[[245070,427505],[-470,-582],[-146,-1016],[115,-2813],[-151,-420]],[[244418,422674],[-829,4100]],[[293663,427498],[-315,245]],[[293348,427743],[-288,1615]],[[293060,429358],[139,999],[457,-203]],[[290930,429020],[33,-2516],[-174,-1499],[76,-1477]],[[290865,423528],[-301,-1443],[-241,-92]],[[290323,421993],[-332,1496],[-16,2220],[-340,940]],[[289233,425625],[-418,-2203]],[[288815,423422],[-127,532]],[[288688,423954],[-1008,4285]],[[232309,426526],[155,-1143]],[[232464,425383],[-995,-12]],[[231469,425371],[-1105,-3]],[[291666,428183],[-6,-1402]],[[291660,426781],[-177,-793],[187,-1217],[-446,-2170]],[[291224,422601],[-359,927]],[[252662,423057],[2,-2183]],[[252664,420874],[-322,-1]],[[252342,420873],[-1598,9]],[[250744,420882],[-321,803]],[[250423,421685],[-15,5009]],[[214795,428618],[0,-4795]],[[214795,423823],[-1708,-29]],[[250423,421685],[-945,-94]],[[249478,421591],[-311,-17],[-6,2159],[-579,14]],[[248582,423747],[146,1437]],[[282497,422685],[136,-2142]],[[282633,420543],[-450,-3766]],[[282183,416777],[-753,1929]],[[281430,418706],[-282,1104],[-60,1366]],[[281088,421176],[343,3266],[-54,1256]],[[281377,425698],[-185,2188],[290,1510]],[[281088,421176],[-85,-1011],[-408,1094],[-38,-1088],[-480,1549]],[[280077,421720],[157,810],[68,2530],[527,4066]],[[293348,427743],[-53,-1237],[-451,497],[216,2355]],[[256465,426111],[5,-1623]],[[256470,424488],[-1206,27]],[[255264,424515],[0,261]],[[292504,428420],[-134,-1705]],[[292370,426715],[-710,66]],[[258474,426083],[-4,-2412]],[[258470,423671],[-889,5]],[[257581,423676],[-3,2416],[-210,4]],[[273832,426791],[-165,-804],[-57,-2449]],[[273610,423538],[-915,163]],[[272695,423701],[15,2450],[-148,1611]],[[263818,428382],[2,-6071],[59,-79]],[[263879,422232],[-1,-5]],[[263878,422227],[-1029,-28]],[[262849,422199],[4,4085]],[[280077,421720],[-106,-1566]],[[279971,420154],[-653,120],[-455,659]],[[278863,420933],[227,2069]],[[248582,423747],[-330,-1227],[-73,-1405],[-363,-2059]],[[247816,419056],[-702,92],[4,1628]],[[247118,420776],[13,6544]],[[268924,425869],[-64,-3813],[-274,84]],[[268586,422140],[-515,158],[-254,1409]],[[267817,423707],[174,1059],[2,2875],[277,1115]],[[267817,423707],[-635,190]],[[267182,423897],[2,1173],[-475,-33]],[[220562,428663],[2,-4872],[-317,7],[0,-1627]],[[220247,422171],[-287,-23]],[[219960,422148],[-1562,-10]],[[218398,422138],[-52,0]],[[218346,422138],[-2,6528]],[[225309,428632],[0,-6478]],[[225309,422154],[-1242,1]],[[224067,422155],[-2,6318]],[[221505,428382],[3,-6212]],[[221508,422170],[-1261,1]],[[218346,422138],[-1521,20]],[[216825,422158],[-55,-2]],[[216770,422156],[-7,6472]],[[216770,422156],[-1975,-23]],[[214795,422133],[0,1690]],[[227843,428638],[0,-6483]],[[227843,422155],[-1260,3]],[[226583,422158],[-9,0]],[[226574,422158],[-2,6478]],[[229113,425380],[-8,-3237]],[[229105,422143],[-1262,12]],[[226574,422158],[-1253,-4]],[[225321,422154],[-12,0]],[[284733,427326],[-651,-856],[-995,-3406],[-367,-2037]],[[282720,421027],[-87,-484]],[[190165,413754],[-530,18],[-2,802],[-456,2164],[59,2009],[-250,2239],[-310,-14],[-357,1412],[-183,1615],[74,2376]],[[224067,422155],[-8,0]],[[224059,422155],[-1261,5]],[[222798,422160],[0,5809]],[[265423,425661],[-341,-1036]],[[265082,424625],[-938,-40],[1,-1903],[-266,-450]],[[222798,422160],[-1257,8]],[[221541,422168],[-33,2]],[[278863,420933],[-360,-3256],[-302,-1293]],[[278201,416384],[-562,1959],[-401,-1171],[-297,845],[-366,-25]],[[276575,417992],[19,1314]],[[276594,419306],[179,812],[290,5226],[-200,1084],[227,1653]],[[288688,423954],[-466,-3820]],[[288222,420134],[-493,-1946]],[[287729,418188],[-773,3321]],[[286956,421509],[-805,3355]],[[276594,419306],[-123,1029],[-749,1490],[-494,2697]],[[271639,427446],[-58,-3551],[-110,16]],[[271471,423911],[-1324,215]],[[270147,424126],[-99,2084]],[[272695,423701],[-15,-2420],[-175,-1661]],[[272505,419620],[-793,132]],[[271712,419752],[19,2733],[-268,49],[8,1377]],[[285886,425967],[-397,-1498],[304,-5190]],[[285793,419279],[-424,-1382]],[[285369,417897],[-35,1119],[-345,857]],[[284989,419873],[-161,1874]],[[284828,421747],[-318,1084],[208,1376],[-107,1919],[122,1200]],[[261057,426186],[8,-3496]],[[261065,422690],[-374,7]],[[260691,422697],[-791,-21]],[[259900,422676],[0,530]],[[259900,423206],[-4,2954]],[[292731,427719],[-75,-1794],[-401,-1052],[179,2727],[297,119]],[[245853,427531],[-16,-6606]],[[245837,420925],[-6,-1698]],[[245831,419227],[-1653,137]],[[244178,419364],[22,898]],[[244200,420262],[218,2412]],[[274787,424519],[3,-1461]],[[274790,423058],[-309,-66]],[[274481,422992],[90,1247],[-199,2235]],[[247118,420776],[-1281,149]],[[284828,421747],[-989,-927],[-267,651],[-693,-2144]],[[282879,419327],[-159,1700]],[[244200,420262],[-1263,158]],[[242937,420420],[2,812]],[[242939,421232],[20,5678]],[[290323,421993],[609,-3619]],[[290932,418374],[-696,-1839]],[[290236,416535],[-114,1663]],[[290122,418198],[-1307,5224]],[[292370,426715],[-184,-1985],[143,-700]],[[292329,424030],[-474,-3179],[-254,-504]],[[291601,420347],[-383,1322],[6,932]],[[242939,421232],[-1108,36]],[[241831,421268],[-6,813]],[[241825,422081],[-2,4670]],[[274481,422992],[82,-1388],[-230,-2519]],[[274333,419085],[-58,-527]],[[274275,418558],[-502,43]],[[273773,418601],[49,4903],[-212,34]],[[241825,422081],[-931,-55]],[[240894,422026],[21,2915],[-105,1664]],[[240894,422026],[-478,-14]],[[240416,422012],[1,803],[-1426,-54]],[[238991,422761],[-20,3675]],[[233878,426401],[60,-5898]],[[233938,420503],[-1042,58]],[[232896,420561],[-163,921],[-269,3901]],[[238991,422761],[0,-2171]],[[238991,420590],[-1104,-44]],[[237887,420546],[-30,5838]],[[235466,426268],[95,-3437]],[[235561,422831],[-21,-4851]],[[235540,417980],[-1218,74]],[[234322,418054],[-79,2428],[-305,21]],[[190260,412140],[-1085,14]],[[189175,412154],[-1095,-4]],[[188080,412150],[-519,2499],[-397,-2608],[-336,-472],[101,2059],[-351,2219]],[[237887,420546],[-2,-2440]],[[237885,418106],[-1261,68]],[[236624,418174],[7,4610]],[[236631,422784],[-50,3494]],[[270147,424126],[-32,-4044]],[[270115,420082],[-784,126],[-762,580]],[[268569,420788],[17,1352]],[[262849,422199],[1,-796]],[[262850,421403],[-1157,-62]],[[261693,421341],[-3,1350]],[[261690,422691],[52,3501]],[[236631,422784],[-1070,47]],[[261690,422691],[-625,-1]],[[259900,423206],[-1060,-73],[0,-541]],[[258840,422592],[-370,1079]],[[257581,423676],[-3,-4054]],[[257578,419622],[-1105,9]],[[256473,419631],[1,2822]],[[256474,422453],[-4,2035]],[[232896,420561],[7,-55]],[[232903,420506],[-1276,-7]],[[231627,420499],[-157,10]],[[231470,420509],[-1,4862]],[[286956,421509],[-435,-1129],[-728,-1101]],[[266426,425016],[-87,-5114]],[[266339,419902],[-1291,820]],[[265048,420722],[34,3903]],[[210856,423755],[-18,-8096],[-651,-3]],[[210187,415656],[-1239,-9]],[[230364,425368],[0,-4857]],[[230364,420511],[0,-4861]],[[230364,415650],[-953,8]],[[229411,415658],[-308,1]],[[229103,415659],[2,6484]],[[231470,420509],[-1106,2]],[[267401,418295],[-101,-658]],[[267300,417637],[-828,69]],[[266472,417706],[25,2123],[-158,73]],[[267182,423897],[1,-3714],[212,-4],[6,-1884]],[[255264,424515],[-14,-6129]],[[255250,418386],[-5,-4933]],[[255245,413453],[-1127,-59]],[[254118,413394],[14,9676]],[[204761,420480],[44,-3995],[-107,-2111]],[[204698,414374],[-40,-1499]],[[204658,412875],[-515,-982],[-138,-1866]],[[204005,410027],[-269,-196],[-186,2235],[-440,1922],[-526,245]],[[202584,414233],[-535,-3]],[[265048,420722],[-23,-1666]],[[265025,419056],[-1141,243]],[[263884,419299],[-6,2928]],[[276575,417992],[2,-1690],[-338,-982]],[[276239,415320],[-807,669],[-645,-1057]],[[274787,414932],[1,1006]],[[274788,415938],[-1,2667]],[[274787,418605],[3,4453]],[[256474,422453],[-391,-1026],[-571,-2640],[86,-782]],[[255598,418005],[-348,381]],[[292681,417933],[-2,100]],[[292679,418033],[-411,-199],[-60,940],[-392,65],[-407,-1734]],[[291409,417105],[-97,1099]],[[291312,418204],[289,2143]],[[292329,424030],[617,-741],[71,-1974],[-164,-3756],[-172,374]],[[271712,419752],[-260,-1288]],[[271452,418464],[-1312,274]],[[270140,418738],[-25,1344]],[[290122,418198],[-263,-1712]],[[289859,416486],[-319,873],[49,-1506],[-196,-651]],[[289393,415202],[-235,1650]],[[289158,416852],[-265,413],[-399,2752],[-272,117]],[[160617,423926],[82,-1783],[339,-681],[-59,-1870],[-213,-1153]],[[160766,418439],[-393,-947],[-168,-2179],[-364,-1740],[-738,-94],[-15,-1615]],[[159088,411864],[-2483,10]],[[156605,411874],[10,3351]],[[164380,410189],[-1412,-44],[-74,-533],[-535,1856],[-381,-2584]],[[161978,408884],[-186,-741]],[[161792,408143],[-928,5114],[-31,2656],[120,1726],[-187,800]],[[268569,420788],[-30,-2813]],[[268539,417975],[-1138,320]],[[214795,422133],[0,-6444]],[[214795,415689],[6,-7987]],[[214801,407702],[-2099,-116]],[[212702,407586],[-2,8093],[66,8115]],[[212702,407586],[-979,-41]],[[211723,407545],[-1541,11]],[[210182,407556],[3,3232]],[[210185,410788],[2,4868]],[[249478,421591],[4,-3680]],[[249482,417911],[-1008,385],[-87,-647]],[[248387,417649],[-390,-864],[-421,-125],[-193,1284]],[[247383,417944],[433,1112]],[[273773,418601],[-955,197]],[[272818,418798],[-313,822]],[[258840,422592],[0,-2942]],[[258840,419650],[1,-653]],[[258841,418997],[-1263,-39]],[[257578,418958],[0,664]],[[291312,418204],[-380,170]],[[259900,422676],[0,-2968]],[[259900,419708],[-1060,-58]],[[274787,418605],[-454,480]],[[254118,413394],[-1462,-13]],[[252656,413381],[8,7493]],[[240416,422012],[-1,-5688]],[[240415,416324],[-1409,-76]],[[239006,416248],[-15,4342]],[[236624,418174],[-6,-1893]],[[236618,416281],[-1077,81]],[[235541,416362],[-1,1618]],[[260691,422697],[7,-5629]],[[260698,417068],[-1,-2446]],[[260697,414622],[-797,-40]],[[259900,414582],[0,5126]],[[261693,421341],[13,-4278]],[[261706,417063],[-1008,5]],[[256473,419631],[4,-4874]],[[256477,414757],[-917,-11]],[[255560,414746],[38,3259]],[[263884,419299],[17,-5164]],[[263901,414135],[-164,-21]],[[263737,414114],[-912,-29]],[[262825,414085],[5,1641]],[[262830,415726],[20,5677]],[[225321,422154],[-1,-6473]],[[225320,415681],[-642,-7]],[[224678,415674],[-618,2]],[[224060,415676],[-1,6479]],[[224060,415676],[-949,-1]],[[223111,415675],[-312,-4]],[[222799,415671],[-1,6489]],[[226583,422158],[-2,-6488]],[[226581,415670],[-307,0]],[[226274,415670],[-954,11]],[[216825,422158],[-7,-6476]],[[216818,415682],[-238,-3]],[[216580,415679],[-1785,10]],[[221541,422168],[6,-6503]],[[221547,415665],[-1532,-5]],[[220015,415660],[-43,2]],[[219972,415662],[-12,6486]],[[227843,422155],[-2,-6487]],[[227841,415668],[-1260,2]],[[229103,415659],[-1262,9]],[[219972,415662],[-1519,9]],[[218453,415671],[-56,3]],[[218397,415674],[1,6464]],[[218397,415674],[-1579,8]],[[222799,415671],[-1245,-6]],[[221554,415665],[-7,0]],[[241831,421268],[7,-4945]],[[241838,416323],[-1399,2]],[[240439,416325],[-24,-1]],[[284989,419873],[-135,-1158],[-365,-437],[-280,-1345]],[[284209,416933],[-135,-748],[-607,-656],[-188,-939]],[[283279,414590],[-400,4737]],[[250744,420882],[11,-4342]],[[250755,416540],[4,-2437],[-209,-17]],[[250550,414086],[-738,301],[-265,799]],[[249547,415186],[-65,2725]],[[281430,418706],[-459,-6339],[-226,-1900]],[[280745,410467],[-1192,6]],[[279553,410473],[143,1890],[-17,4331],[292,3460]],[[287729,418188],[-193,-522],[-134,-4476],[-402,-2750]],[[287000,410440],[-272,4]],[[286728,410444],[-19,0]],[[286709,410444],[-635,4132],[-197,2069],[-508,1252]],[[262830,415726],[-1089,-10]],[[261741,415716],[-35,1347]],[[242937,420420],[-5,-5731]],[[242932,414689],[-936,53]],[[241996,414742],[-158,1581]],[[283279,414590],[33,-4171]],[[283312,410419],[-28,0]],[[283284,410419],[-1756,39]],[[281528,410458],[270,1944],[385,4375]],[[279553,410473],[-342,-2]],[[279211,410471],[-1285,-23]],[[277926,410448],[-70,2461],[345,3475]],[[252342,420873],[-474,-4214]],[[251868,416659],[-1113,-119]],[[247383,417944],[-442,-2539]],[[246941,415405],[-262,-106],[-246,2264],[-607,13]],[[245826,417576],[5,1651]],[[252656,413381],[-31,-1626]],[[252625,411755],[-759,5]],[[251866,411760],[2,4899]],[[270140,418738],[-33,-4034],[-98,-688]],[[270009,414016],[-637,319]],[[269372,414335],[-891,172]],[[268481,414507],[58,3468]],[[266472,417706],[-35,-1885]],[[266437,415821],[-1449,559]],[[264988,416380],[37,2676]],[[239006,416248],[0,-1219]],[[239006,415029],[-1115,-150]],[[237891,414879],[-6,3227]],[[206434,415636],[-263,-1609]],[[206171,414027],[-698,-18]],[[205473,414009],[-2,412],[-773,-47]],[[231627,420499],[-1,-4856]],[[231626,415643],[-637,4]],[[230989,415647],[-625,3]],[[232903,420506],[433,-2548],[-67,-1276],[313,-1051]],[[233582,415631],[-87,0]],[[233495,415631],[-1249,8]],[[232246,415639],[-620,4]],[[234322,418054],[138,-4323]],[[234460,413731],[-255,-671],[-623,2571]],[[244178,419364],[30,-3037],[165,-1715]],[[244373,414612],[-1128,56]],[[243245,414668],[-313,21]],[[289158,416852],[-454,-2262],[-196,-1986]],[[288508,412604],[-541,-2144]],[[287967,410460],[-967,-20]],[[286709,410444],[-918,-3]],[[285791,410441],[-606,-7]],[[285185,410434],[-592,-13]],[[284593,410421],[124,2546],[-179,2926],[-329,1040]],[[200905,417336],[-779,-15],[-5,-3273],[-315,52],[0,-1664],[-1412,-62],[0,-2430],[-1717,-16],[1,-809],[-1384,192]],[[272795,414723],[-423,-10],[-218,-1045],[-319,59],[-5,-1092],[-317,67]],[[271513,412702],[-96,1662],[35,4100]],[[272818,418798],[-23,-4075]],[[259900,414582],[-209,-308]],[[259691,414274],[-843,-20]],[[258848,414254],[-7,4743]],[[257578,418958],[2,-4763]],[[257580,414195],[0,-1081]],[[257580,413114],[-876,36]],[[256704,413150],[-229,10],[2,1597]],[[245826,417576],[-7,-4829]],[[245819,412747],[1,-1636],[-1253,29]],[[244567,411140],[-193,1581],[-1,1891]],[[264988,416380],[-41,-2986]],[[264947,413394],[-298,808],[-748,-67]],[[274788,415938],[-600,318]],[[274188,416256],[87,2302]],[[291409,417105],[453,-5673],[-67,-3974]],[[291795,407458],[-8,-68]],[[291787,407390],[-674,1374],[-215,1839]],[[290898,410603],[-464,1137],[-81,1797],[-341,1921]],[[290012,415458],[-13,49]],[[289999,415507],[237,1028]],[[258848,414254],[-240,-36]],[[258608,414218],[-1028,-23]],[[274188,416256],[-53,-2245],[-194,-1195]],[[273941,412816],[-1155,355]],[[272786,413171],[9,1552]],[[292681,417933],[179,-418],[-159,-5398],[-46,2228],[-255,-3465],[103,-763],[-505,-2576],[-203,-83]],[[271513,412702],[-9,-1621]],[[271504,411081],[-1056,287]],[[270448,411368],[-261,927],[22,1648],[-200,73]],[[281528,410458],[-678,3]],[[280850,410461],[-105,6]],[[249547,415186],[-334,-14],[-11,-1088],[-814,-276]],[[248388,413808],[-1,3841]],[[161792,408143],[-203,-1301],[-432,-149],[-282,-3313],[-609,-861]],[[160266,402519],[-794,177]],[[159472,402696],[52,1463]],[[159524,404159],[106,2863],[-398,-48],[-7,2486],[153,591],[-290,1813]],[[255560,414746],[183,-1655],[-78,-4758]],[[255665,408333],[-417,-12]],[[255248,408321],[-3,5132]],[[277926,410448],[-234,-9]],[[277692,410439],[-800,-6]],[[276892,410433],[-426,0]],[[276466,410433],[-22,3775],[-205,1112]],[[268481,414507],[-116,-2692]],[[268365,411815],[-1169,326]],[[267196,412141],[-43,3579],[147,1917]],[[289999,415507],[-235,-1943],[-206,-350]],[[289558,413214],[-165,1988]],[[237891,414879],[8,-3256]],[[237899,411623],[-1244,79]],[[236655,411702],[-37,4579]],[[235541,416362],[8,-4089]],[[235549,412273],[-763,19]],[[234786,412292],[-326,1439]],[[181375,413882],[-2,-6764]],[[181373,407118],[-6,-16110]],[[181367,391008],[-2649,0]],[[178718,391008],[-2525,9020]],[[248388,413808],[0,-544]],[[248388,413264],[-1641,72]],[[246747,413336],[194,2069]],[[267196,412141],[-24,-2179]],[[267172,409962],[-1117,398]],[[266055,410360],[17,1046]],[[266072,411406],[162,-81],[203,4496]],[[246747,413336],[32,-697]],[[246779,412639],[-960,108]],[[200920,414122],[-228,4],[1,-10296]],[[200693,403830],[-885,2]],[[199808,403832],[-4513,9]],[[195295,403841],[-1,2439]],[[261741,415716],[-55,-4023]],[[261686,411693],[-223,-17]],[[261463,411676],[-823,-18]],[[260640,411658],[57,2964]],[[284593,410421],[-604,-5]],[[283989,410416],[-677,3]],[[289558,413214],[-576,-1173]],[[288982,412041],[-434,587]],[[288548,412628],[-38,-23]],[[288510,412605],[-2,-1]],[[251866,411760],[-181,-2587]],[[251685,409173],[-599,19]],[[251086,409192],[-316,21],[-7,2708],[-211,269]],[[250552,412190],[-2,1896]],[[206688,415637],[-41,-6]],[[206647,415631],[-213,-1605]],[[206434,414026],[-263,1]],[[241996,414742],[-30,-6459]],[[241966,408283],[-4,0]],[[241962,408283],[-1090,94]],[[240872,408377],[8,1624],[-470,45]],[[240410,410046],[29,6279]],[[266072,411406],[-502,924],[-631,517]],[[264939,412847],[8,547]],[[240410,410046],[-1140,66]],[[239270,410112],[-272,4],[8,4913]],[[236655,411702],[-1,-802]],[[236654,410900],[-1104,25]],[[235550,410925],[-1,1348]],[[274786,410447],[-874,-18]],[[273912,410429],[29,2387]],[[274787,414932],[-1,-4485]],[[276466,410433],[-1406,8]],[[275060,410441],[-274,6]],[[188080,412150],[154,-1357],[-372,-847],[15,-4365],[-94,-1439],[-489,-27],[-259,-1246]],[[187035,402869],[-502,281],[-66,4178],[-5094,-210]],[[262825,414085],[-5,-3544]],[[262820,410541],[-613,-224]],[[262207,410317],[-419,17],[-102,1359]],[[216580,415679],[-8,-8083]],[[216572,407596],[-1771,-4]],[[214801,407592],[0,110]],[[218453,415671],[-6,-8082]],[[218447,407589],[-1806,7]],[[216641,407596],[-69,0]],[[156605,411874],[135,-4012]],[[156740,407862],[1,-964],[-483,-512],[-38,-1771],[225,-3191],[-238,-1152],[-36,-1898],[296,-1405],[109,-1803],[362,-938]],[[156938,394228],[-728,41],[-164,-808],[-645,-63],[-455,-694]],[[154946,392704],[-541,2801],[109,2093],[-386,5926],[150,3428],[-35,2228],[-194,3368],[-468,3106]],[[226274,415670],[1,-6485]],[[226275,409185],[-1,-1617]],[[226274,407568],[-1548,10]],[[224726,407578],[-50,3]],[[224676,407581],[2,8093]],[[224676,407581],[-1502,8]],[[223174,407589],[-61,1]],[[223113,407590],[-2,8085]],[[227841,415668],[2,-6478]],[[227843,409190],[-1568,-5]],[[229411,415658],[-2,-8099]],[[229409,407559],[-425,-1]],[[228984,407558],[-1141,12]],[[227843,407570],[0,1620]],[[220015,415660],[-6,-8093]],[[220009,407567],[-1504,22]],[[218505,407589],[-58,0]],[[170987,398754],[-249,-368]],[[170738,398386],[-2476,18]],[[168262,398404],[-1,696],[-1014,5147],[112,6217],[-310,-1673]],[[221554,415665],[-6,-8087]],[[221548,407578],[-1487,-3]],[[220061,407575],[-52,-8]],[[223113,407590],[-1493,-14]],[[221620,407576],[-72,2]],[[230989,415647],[1,-8092]],[[230990,407555],[-955,2]],[[230035,407557],[-626,2]],[[210185,410788],[-3283,6]],[[206902,410794],[415,545],[-67,968],[390,99],[54,1354],[-365,-16],[-165,-1868],[-731,-135]],[[206433,411741],[1,2285]],[[233495,415631],[0,-6461]],[[233495,409170],[-625,0]],[[232870,409170],[-626,1]],[[232244,409171],[2,6468]],[[232244,409171],[-1,-1611],[-687,-7]],[[231556,407553],[-566,2]],[[234786,412292],[-21,-1748],[-200,350],[-276,-2271]],[[234289,408623],[-168,539],[-626,8]],[[290898,410603],[-392,-2264]],[[290506,408339],[-409,2275],[-302,2865]],[[289795,413479],[217,1979]],[[250552,412190],[-498,-1355],[-387,-1885],[5,-2169]],[[249672,406781],[-468,-23]],[[249204,406758],[-627,-24]],[[248577,406734],[-163,3649],[-26,2881]],[[239270,410112],[-32,-1637]],[[239238,408475],[-1337,-78]],[[237901,408397],[-2,3226]],[[243245,414668],[-19,-5394]],[[243226,409274],[-941,82],[-5,-1096],[-314,23]],[[256704,413150],[-11,-4877]],[[256693,408273],[-517,45]],[[256176,408318],[-511,15]],[[272786,413171],[-213,31],[-15,-3018],[100,-1891]],[[272658,408293],[-850,-351]],[[271808,407942],[-304,3139]],[[244567,411140],[169,-1392]],[[244736,409748],[-1143,47],[1,-537]],[[243594,409258],[-368,16]],[[260640,411658],[-101,-1640]],[[260539,410018],[-888,-25]],[[259651,409993],[40,4281]],[[269372,414335],[-25,-1734],[207,-77],[64,-3317]],[[269618,409207],[-318,124],[-21,-1094],[-338,108],[-318,-1009]],[[268623,407336],[-310,141],[52,4338]],[[205473,414009],[-1,-3086]],[[205472,410923],[-407,495],[-407,1457]],[[270448,411368],[146,-862],[-65,-3237]],[[270529,407269],[-311,107]],[[270218,407376],[-615,748],[15,1083]],[[259651,409993],[-1,-1094]],[[259650,408899],[-829,-88]],[[258821,408811],[-213,-27]],[[258608,408784],[0,5434]],[[202584,414233],[137,-2936],[562,-2151],[-209,-2932],[145,-2133]],[[203219,404081],[-612,-329]],[[202607,403752],[-1914,78]],[[204005,410027],[367,-1170],[-102,-1326]],[[204270,407531],[-525,-3718],[-328,267]],[[203417,404080],[-198,1]],[[258608,408784],[-389,-585],[-532,8]],[[257687,408207],[-86,542],[-21,4365]],[[264939,412847],[-109,-226],[-59,-4847]],[[264771,407774],[-700,215]],[[264071,407989],[-317,28]],[[263754,408017],[-17,6097]],[[263754,408017],[1,-413],[-936,-24]],[[262819,407580],[1,2961]],[[206433,411741],[-1,-3287]],[[206432,408454],[13,-903]],[[206445,407551],[-516,-5958],[-264,-2164]],[[205665,399429],[-5,0]],[[205660,399429],[-187,-2],[-3,8127]],[[205470,407554],[2,3369]],[[206902,410794],[-80,-2161],[-167,812],[-223,-991]],[[290506,408339],[-301,-1740]],[[290205,406599],[-214,1002]],[[289991,407601],[-385,1831],[-352,446],[-281,1743]],[[288973,411621],[822,1858]],[[255248,408321],[1,-2424]],[[255249,405897],[-1194,77]],[[254055,405974],[-17,3810]],[[254038,409784],[80,3610]],[[254038,409784],[-270,-622],[-1139,-17]],[[252629,409145],[-4,2610]],[[248577,406734],[-633,-33]],[[247944,406701],[-412,-2]],[[247532,406699],[2,2166],[-201,554],[5,1620],[-635,683]],[[246703,411722],[76,917]],[[273912,410429],[-309,-2118]],[[273603,408311],[-264,-1244]],[[273339,407067],[6,599],[-687,627]],[[257687,408207],[-84,-2441]],[[257603,405766],[-705,61]],[[256898,405827],[-209,8],[4,2438]],[[205470,407554],[-1200,-23]],[[266055,410360],[-47,-3101]],[[266008,407259],[-855,352]],[[265153,407611],[-382,163]],[[246703,411722],[-132,-1725],[183,-3269]],[[246754,406728],[-92,-2345]],[[246662,404383],[-900,73]],[[245762,404456],[-253,771],[-419,2924]],[[245090,408151],[-354,1597]],[[288982,412041],[-534,-3560],[147,-1015],[-73,-1880],[204,-1804]],[[288726,403782],[-376,-1333],[-304,88]],[[288046,402537],[-18,1506]],[[288028,404043],[-61,6417]],[[288510,412605],[38,23]],[[251086,409192],[2,-5734],[-320,52]],[[250768,403510],[-1088,3],[-8,3268]],[[235550,410925],[3,-4037]],[[235553,406888],[-1398,56]],[[234155,406944],[134,1679]],[[192584,405745],[-2935,12],[-153,2687],[-321,1686]],[[189175,410130],[0,2024]],[[189175,410130],[1,-4419],[-152,2],[6,-8099]],[[189030,397614],[-1545,14],[-447,229]],[[187038,397857],[-3,5012]],[[268623,407336],[-26,-1603]],[[268597,405733],[-717,218],[40,496],[-788,178]],[[267132,406625],[40,3337]],[[159524,404159],[-693,578],[2,-532],[-1674,-52]],[[157159,404153],[9,3692],[-428,17]],[[252629,409145],[5,-3808]],[[252634,405337],[-318,9],[-371,2452],[-255,17],[-5,1358]],[[262207,410317],[-5,-3506]],[[262202,406811],[-729,-13]],[[261473,406798],[-10,4878]],[[261473,406798],[1,-1345]],[[261474,405453],[-925,-9]],[[260549,405444],[-10,4574]],[[247532,406699],[-778,29]],[[237901,408397],[-2,-1616]],[[237899,406781],[-1252,49]],[[236647,406830],[7,4070]],[[289991,407601],[-61,-2065],[-434,1889],[-494,-3193]],[[289002,404232],[-350,2027]],[[288652,406259],[12,7]],[[288664,406266],[-51,2043]],[[288613,408309],[-8,430]],[[288605,408739],[368,2882]],[[164781,405356],[-1401,-15],[-152,1283],[-273,170],[-234,-1182],[-772,-1245]],[[161949,404367],[29,4517]],[[271808,407942],[-352,-103],[16,-1874],[-379,-569]],[[271093,405396],[-587,184],[23,1689]],[[236647,406830],[-6,-1351]],[[236641,405479],[-1087,27]],[[235554,405506],[-1,1382]],[[210182,407556],[-20,1]],[[210162,407557],[-2635,-8]],[[207527,407549],[-1082,2]],[[168262,398404],[-491,-22],[-237,-2422],[1,-1714],[313,16],[-13,-8145],[-697,1]],[[167138,386118],[-482,2257]],[[166656,388375],[-55,3726],[-157,-50],[-42,4120],[307,671],[-2,1728],[-666,42]],[[166041,398612],[-32,2039],[-419,1034]],[[165590,401685],[652,1617],[543,5284]],[[291787,407390],[22,-3591],[-686,-1401]],[[291123,402398],[-572,644]],[[290551,403042],[14,1877],[-360,1680]],[[262819,407580],[-2,-848]],[[262817,406732],[-615,79]],[[283284,410419],[-281,-1862],[-298,-5500]],[[282705,403057],[-115,-74]],[[282590,402983],[-298,3217]],[[282292,406200],[-167,1078],[132,1025],[-513,247]],[[281744,408550],[-440,1436],[-237,-1383],[-192,274]],[[280875,408877],[-25,1584]],[[280875,408877],[-278,-307],[-96,-1937]],[[280501,406633],[-526,345]],[[279975,406978],[-386,1376],[-475,-3170],[-283,767]],[[278831,405951],[380,4520]],[[278831,405951],[-568,-2831]],[[278263,403120],[-600,-2270]],[[277663,400850],[29,9589]],[[288028,404043],[-186,-68]],[[287842,403975],[-578,293],[198,3147],[-296,-282]],[[287166,407133],[-438,3311]],[[276892,410433],[-365,-5307]],[[276527,405126],[-123,314]],[[276404,405440],[-598,2940],[-675,502]],[[275131,408882],[-71,1559]],[[277663,400850],[0,-206]],[[277663,400644],[-557,1424],[-342,-761]],[[276764,401307],[-239,1285]],[[276525,402592],[2,2534]],[[287166,407133],[-74,-2015],[-419,-1267],[83,1880],[-379,-1384]],[[286377,404347],[-194,1934],[-292,888],[-100,3272]],[[275131,408882],[-285,-1378],[11,-1745]],[[274857,405759],[-140,-755]],[[274717,405004],[-207,396]],[[274510,405400],[-283,562],[-368,2261],[-256,88]],[[286377,404347],[69,-1031],[-251,-2457],[-293,640]],[[285902,401499],[0,2434],[-506,6],[2,-1756],[256,-748]],[[285654,401435],[-221,-442]],[[285433,400993],[-513,2542]],[[284920,403535],[-27,1753],[292,5146]],[[284920,403535],[-797,69]],[[284123,403604],[171,2561],[-558,2378],[253,1873]],[[284123,403604],[-2,-8]],[[284121,403596],[-805,-2420]],[[283316,401176],[-301,1526],[-310,355]],[[267132,406625],[-296,-2585]],[[266836,404040],[-607,26]],[[266229,404066],[40,3087],[-261,106]],[[192583,405610],[37,-825],[-294,-4891],[-129,-5401],[227,-2018],[156,-4770]],[[192580,387705],[-3568,0],[0,191]],[[189012,387896],[18,9718]],[[240872,408377],[-43,-5375]],[[240829,403002],[-232,408],[-163,-2184]],[[240434,401226],[-711,2931]],[[239723,404157],[-347,980],[-138,3338]],[[260549,405444],[-153,-1912]],[[260396,403532],[-746,-50]],[[259650,403482],[0,5417]],[[281744,408550],[-325,-479],[-251,-3773]],[[281168,404298],[-330,1391]],[[280838,405689],[-337,944]],[[245090,408151],[-786,-2744],[61,-2460]],[[244365,402947],[-779,381]],[[243586,403328],[8,5930]],[[254055,405974],[-144,-1904]],[[253911,404070],[-1278,-83]],[[252633,403987],[1,1350]],[[243586,403328],[-1650,162]],[[241936,403490],[26,4793]],[[270218,407376],[-23,-1681],[-315,124],[-26,-1652]],[[269854,404167],[-626,216],[-9,-491],[-644,-24]],[[268575,403868],[22,1865]],[[227843,407570],[-4,-4859]],[[227839,402711],[-1559,8]],[[226280,402719],[-6,4849]],[[232870,409170],[-17,-4355]],[[232853,404815],[-53,-3774]],[[232800,401041],[-1244,5]],[[231556,401046],[0,6507]],[[234155,406944],[373,-2132]],[[234528,404812],[-590,6]],[[233938,404818],[-1085,-3]],[[252633,403987],[0,-2970]],[[252633,401017],[-933,24]],[[251700,401041],[-932,31]],[[250768,401072],[0,2438]],[[279975,406978],[-539,-3798],[-360,-1739]],[[279076,401441],[-431,1393],[-382,286]],[[273339,407067],[-230,-1522]],[[273109,405545],[-695,-2161]],[[272414,403384],[-195,1249],[-314,-1223],[-55,-1445],[-293,114],[-131,-1044]],[[271426,401035],[10,997],[-367,905],[24,2459]],[[276404,405440],[-240,-950],[-479,-156]],[[275685,404334],[-828,1425]],[[259650,403482],[-372,-61]],[[259278,403421],[-462,-45]],[[258816,403376],[5,5435]],[[161949,404367],[-299,-280],[-426,-2782],[0,-3647]],[[161224,397658],[-376,-706]],[[160848,396952],[-363,-449],[-90,-981],[-129,6997]],[[258816,403376],[-362,-36]],[[258454,403340],[-695,149]],[[257759,403489],[-4,2280],[-152,-3]],[[282292,406200],[-394,-2354],[-185,-1907]],[[281713,401939],[-545,2359]],[[239723,404157],[-203,523],[-147,-1561],[-300,-406],[-194,-1441],[-195,1193]],[[238684,402465],[-29,-1189],[-453,360],[-301,-768]],[[237901,400868],[-2,5913]],[[241936,403490],[-12,-1887]],[[241924,401603],[-322,44]],[[241602,401647],[-773,1355]],[[256176,408318],[-109,-1613],[-6,-4868]],[[256061,401837],[-1014,8]],[[255047,401845],[202,1649],[0,2403]],[[256898,405827],[-7,-2443],[-310,8],[-2,-3248]],[[256579,400144],[-520,69]],[[256059,400213],[2,1624]],[[274510,405400],[-752,-2906]],[[273758,402494],[-136,1719],[-196,-664]],[[273426,403549],[-49,2100],[-268,-104]],[[246361,401187],[-1284,58],[-7,-1638],[-209,11]],[[244861,399618],[-414,50]],[[244447,399668],[-82,3279]],[[245762,404456],[468,-1904],[131,-1365]],[[264071,407989],[93,-711],[-59,-4822]],[[264105,402456],[-1299,240]],[[262806,402696],[11,4036]],[[265153,407611],[-83,-5848]],[[265070,401763],[-704,292]],[[264366,402055],[-261,401]],[[157159,404153],[-103,-1293],[316,-1811],[516,-796],[-42,-2231],[424,-2417]],[[158270,395605],[-153,-1117]],[[158117,394488],[-193,-2961],[-454,-702]],[[157470,390825],[-532,3403]],[[214801,407592],[7,-8099]],[[214808,399493],[2,-1604]],[[214810,397889],[-3111,-174]],[[211699,397715],[24,9830]],[[289029,404122],[-16,45]],[[289013,404167],[-11,65]],[[290551,403042],[-150,-2724]],[[290401,400318],[-533,654],[-508,1437],[-331,1713]],[[223174,407589],[-9,-8099]],[[223165,399490],[-1516,-10]],[[221649,399480],[-38,0]],[[221611,399480],[9,8096]],[[265463,401619],[-346,126]],[[265117,401745],[-47,18]],[[266229,404066],[-541,-2162],[-225,-285]],[[216641,407596],[-7,-8066]],[[216634,399530],[-241,-6]],[[216393,399524],[-1585,-31]],[[218505,407589],[-3,-8092]],[[218502,399497],[-253,0]],[[218249,399497],[-1615,33]],[[224726,407578],[-8,-6473]],[[224718,401105],[0,-1621]],[[224718,399484],[-1525,8]],[[223193,399492],[-28,-2]],[[220061,407575],[-7,-8104]],[[220054,399471],[-1552,26]],[[228984,407558],[-8,-6447]],[[228976,401111],[-4,-1634]],[[228972,399477],[-1137,-7]],[[227835,399470],[4,3241]],[[226280,402719],[-2,-1625]],[[226278,401094],[-1560,11]],[[221611,399480],[-1512,-5]],[[220099,399475],[-45,-4]],[[230035,407557],[-404,-3028],[468,-4114],[473,-185]],[[230572,400230],[-5,-2410],[-307,8]],[[230260,397828],[0,542],[-975,290],[5,2433],[-314,18]],[[207527,407549],[-7,-8122]],[[207520,399427],[-1032,5]],[[206488,399432],[-823,-3]],[[210162,407557],[-14,-13021],[-936,36]],[[209212,394572],[12,4830],[-1704,25]],[[231556,401046],[-18,-1625]],[[231538,399421],[-118,1200],[-442,280],[-406,-671]],[[211699,397715],[-29,-7916]],[[211670,389799],[2,-1622],[-925,-165]],[[210747,388012],[-1530,111]],[[209217,388123],[-5,6449]],[[205660,399429],[4,-8051]],[[205664,391378],[-1785,-68]],[[203879,391310],[176,2110],[-338,2531],[-236,-28],[-218,2136]],[[203263,398059],[20,4732],[134,1289]],[[271426,401035],[-87,-662]],[[271339,400373],[-1426,435]],[[269913,400808],[-59,3359]],[[187038,397857],[-586,-3353],[17,-2559],[-254,-958],[-384,92],[-188,-2026]],[[185643,389053],[-4276,11]],[[181367,389064],[0,1944]],[[280838,405689],[20,-2091],[-220,-1799],[43,-1667],[-291,-1467]],[[280390,398665],[-1091,2059],[-223,717]],[[235554,405506],[-2,-5520]],[[235552,399986],[-482,732]],[[235070,400718],[-348,1876],[57,1415],[-251,803]],[[262806,402696],[-686,37]],[[262120,402733],[-425,22],[-218,-746]],[[261477,402009],[-3,3444]],[[237901,400868],[-183,147],[-782,-1329]],[[236936,399686],[-300,1183]],[[236636,400869],[5,4610]],[[250768,401072],[-307,-8],[0,-3525]],[[250461,397539],[-935,2],[-151,-542]],[[249375,396999],[-164,-3]],[[249211,396996],[-7,9762]],[[249211,396996],[-1245,20]],[[247966,397016],[-6,4876]],[[247960,401892],[-16,4809]],[[164769,402898],[-1779,-16],[-231,-508],[-692,-3277],[-169,-1785],[-674,346]],[[247960,401892],[-463,-687],[1,-945],[-743,197],[-64,-1253]],[[246691,399204],[-29,5179]],[[268575,403868],[-39,-2983]],[[268536,400885],[-64,-729]],[[268472,400156],[-1582,537]],[[266890,400693],[-54,3347]],[[282590,402983],[-306,-3506]],[[282284,399477],[-571,2462]],[[195295,403841],[-25,-16136]],[[195270,387705],[-2690,0]],[[255047,401845],[-69,-1900]],[[254978,399945],[-895,326]],[[254083,400271],[-160,-18]],[[253923,400253],[-12,3817]],[[273426,403549],[-646,-1538]],[[272780,402011],[-366,1373]],[[257759,403489],[-152,-219],[7,-3170]],[[257614,400100],[-1035,44]],[[275685,404334],[85,-2807]],[[275770,401527],[-169,-2411]],[[275601,399116],[-203,-165]],[[275398,398951],[-825,1176]],[[274573,400127],[195,794],[-216,1514],[165,2569]],[[281713,401939],[-331,-4249]],[[281382,397690],[-453,-530]],[[280929,397160],[-54,1697],[-336,-1326],[-249,538]],[[280290,398069],[100,596]],[[236636,400869],[-257,453],[-437,-2067],[-407,-128]],[[235535,399127],[17,859]],[[261477,402009],[-400,-1353]],[[261077,400656],[-346,-1150],[-342,-59]],[[260389,399447],[7,4085]],[[276525,402592],[-354,-957],[-401,-108]],[[274573,400127],[-368,-1330]],[[274205,398797],[-236,255]],[[273969,399052],[-281,3046],[70,396]],[[233938,404818],[-18,-6982]],[[233920,397836],[-872,234]],[[233048,398070],[-272,169],[24,2802]],[[235070,400718],[-349,74],[-25,-3937]],[[234696,396855],[-411,-173]],[[234285,396682],[-361,-327],[-4,1481]],[[159472,402696],[-103,-2315],[298,-2192],[9,-2579]],[[159676,395610],[-1406,-5]],[[240434,401226],[-265,-1911],[27,-1099]],[[240196,398216],[-322,-2537]],[[239874,395679],[-1243,272]],[[238631,395951],[53,6514]],[[272780,402011],[-162,-1543]],[[272618,400468],[-357,-942],[-433,-2022]],[[271828,397504],[-465,1315]],[[271363,398819],[-24,1554]],[[246691,399204],[104,-2426],[318,-370]],[[247113,396408],[-268,-1767],[-327,1147]],[[246518,395788],[-157,5399]],[[269913,400808],[-106,32],[-45,-3310]],[[269762,397530],[-314,137]],[[269448,397667],[30,1913],[-311,800],[-631,505]],[[273969,399052],[-615,-1858]],[[273354,397194],[-359,392]],[[272995,397586],[-242,74],[-135,2808]],[[288046,402537],[11,-942]],[[288057,401595],[-639,-5]],[[287418,401590],[-372,-2533],[-163,577],[-139,-1617],[-138,1747],[461,4160],[775,51]],[[203263,398059],[-1079,33]],[[202184,398092],[232,2578],[24,2143],[167,939]],[[253923,400253],[-983,-53]],[[252940,400200],[-307,817]],[[266890,400693],[-89,-2651]],[[266801,398042],[-801,-648]],[[266000,397394],[-555,16],[18,4209]],[[285902,401499],[-150,-622]],[[285752,400877],[-98,558]],[[285433,400993],[-397,-2058]],[[285036,398935],[-134,518]],[[284902,399453],[-167,-26],[-614,4169]],[[199808,403832],[101,-2046]],[[199909,401786],[-296,-714]],[[199613,401072],[-737,-3251],[-270,662],[-334,-354],[-440,-2814],[-665,-1480],[1,-2999]],[[197168,390836],[-2,-3131],[-1896,0]],[[202184,398092],[-58,-1116]],[[202126,396976],[-415,809],[-150,-1174],[-541,1039],[-198,1577],[-600,-2],[-313,2561]],[[289289,396094],[-480,-882],[-190,-1251],[-469,-135]],[[288150,393826],[-70,5854]],[[288080,399680],[-23,1915]],[[288726,403782],[311,-1995],[21,-3695],[231,-1998]],[[258454,403340],[32,-5425],[144,8]],[[258630,397923],[2,-1078]],[[258632,396845],[-1016,28]],[[257616,396873],[-2,3227]],[[260389,399447],[-315,-33],[3,-1128]],[[260077,398286],[-173,-511],[-611,176]],[[259293,397951],[-15,5470]],[[244447,399668],[-615,99],[-12,-1654]],[[243820,398113],[-1328,97]],[[242492,398210],[16,3269],[-584,124]],[[284902,399453],[-317,-3074]],[[284585,396379],[-327,-588]],[[284258,395791],[-575,2284]],[[283683,398075],[-376,337],[-185,1327],[194,1437]],[[259293,397951],[-663,-28]],[[241246,396473],[-791,166],[-259,1577]],[[241602,401647],[-356,-5174]],[[279076,401441],[-306,-3713],[122,-2044],[-246,-2142]],[[278646,393542],[-601,2684]],[[278045,396226],[-22,130]],[[278023,396356],[164,2029],[-157,242],[174,1961],[-541,56]],[[291123,402398],[69,-689],[-433,-4685],[-217,-1125],[-299,-2],[197,2821],[-39,1600]],[[283683,398075],[-584,-3904]],[[283099,394171],[-333,1776]],[[282766,395947],[-855,1322]],[[281911,397269],[373,2208]],[[164778,400098],[2,-985]],[[164780,399113],[3,-842]],[[164783,398271],[-389,10],[-272,-829],[-495,64],[-430,-2100],[-547,1772],[-795,-2034],[-254,-3502]],[[161601,391652],[-950,430]],[[160651,392082],[48,3551],[149,1319]],[[264366,402055],[-167,-4639]],[[264199,397416],[-520,1367]],[[263679,398783],[-327,-384]],[[263352,398399],[-336,1361],[-212,-782]],[[262804,398978],[2,3718]],[[262120,402733],[-187,-6686]],[[261933,396047],[-9,-343]],[[261924,395704],[-187,-294]],[[261737,395410],[-674,-15]],[[261063,395395],[14,5261]],[[262804,398978],[-161,-1387]],[[262643,397591],[-710,-1544]],[[227835,399470],[-1,-3241]],[[227834,396229],[-1551,10]],[[226283,396239],[-5,4855]],[[160651,392082],[-328,7]],[[160323,392089],[-249,595],[-92,1588],[-306,1338]],[[276764,401307],[-43,-2135]],[[276721,399172],[-197,-2650],[-527,-489]],[[275997,396033],[78,1671],[-474,1412]],[[238631,395951],[-2,-269]],[[238629,395682],[-940,177],[-5,-542],[-774,158]],[[236910,395475],[26,4211]],[[278023,396356],[-421,199],[-771,1158],[-110,1459]],[[264942,392757],[-495,1045]],[[264447,393802],[-4,881]],[[264443,394683],[-244,2733]],[[265117,401745],[-175,-8988]],[[281911,397269],[-117,-636]],[[281794,396633],[-412,1057]],[[247966,397016],[-356,-13],[-7,-1413]],[[247603,395590],[-490,818]],[[286601,396690],[-270,-2438],[180,3428],[90,-990]],[[288080,399680],[-243,-645],[-318,-3541]],[[287519,395494],[-452,119]],[[287067,395613],[-237,-813],[-18,1649],[166,2200],[440,2941]],[[256059,400213],[0,-4914]],[[256059,395299],[-785,-99]],[[255274,395200],[-296,4745]],[[202126,396976],[391,-1636],[384,-265],[-241,-1239],[-125,-2430],[202,-1122],[70,-1956],[300,-2059]],[[203107,386269],[-2100,52],[-1,-5185]],[[201006,381136],[-1582,2]],[[199424,381138],[-184,2879]],[[199240,384017],[376,1],[-3,6826]],[[199613,390844],[0,10228]],[[266000,397394],[-90,-7128]],[[265910,390266],[-554,2430]],[[265356,392696],[-414,61]],[[242492,398210],[-119,-2235],[32,-2529],[-220,-3074]],[[242185,390372],[-394,741],[-91,1045]],[[241700,392158],[-289,3405]],[[241411,395563],[-165,910]],[[166041,398612],[-586,525],[-675,-24]],[[280290,398069],[-483,-2836],[-192,-318],[-231,-2313]],[[279384,392602],[-347,1620],[-177,-1641]],[[278860,392581],[-214,961]],[[285904,391677],[-438,651]],[[285466,392328],[40,2580],[-96,1946],[-374,2081]],[[285752,400877],[17,-34]],[[285769,400843],[123,37]],[[285892,400880],[302,-2195],[-274,-289],[359,-1162],[-397,-2847],[22,-2710]],[[236910,395475],[-14,-1566]],[[236896,393909],[-1362,260]],[[235534,394169],[1,3667]],[[235535,397836],[0,1291]],[[246518,395788],[-459,-1047],[-357,-130]],[[245702,394611],[-426,36],[-426,2233]],[[244850,396880],[11,2738]],[[230260,397828],[-3,-3239]],[[230257,394589],[-1081,7]],[[229176,394596],[-204,1767],[0,3114]],[[199613,390844],[-2445,-8]],[[226283,396239],[-1,-1625]],[[226282,394614],[-1549,-5]],[[224733,394609],[-15,4875]],[[233048,398070],[-2,-3479]],[[233046,394591],[-1241,3]],[[231805,394594],[-1,4258],[-266,569]],[[251700,401041],[-3,-5671],[315,56]],[[252012,395426],[-4,-1645]],[[252008,393781],[-1234,-55],[-1,-1621]],[[250773,392105],[-323,107]],[[250450,392212],[11,5327]],[[252940,400200],[-3,-4846]],[[252937,395354],[-925,72]],[[231805,394594],[2,-2436]],[[231807,392158],[-1134,-2]],[[230673,392156],[-105,1611],[-311,822]],[[269448,397667],[-55,-3546],[-336,-2]],[[269057,394119],[-207,85]],[[268850,394204],[-308,109],[-130,1734]],[[268412,396047],[60,4109]],[[270916,394754],[20,1086],[-281,1702],[-269,-1234]],[[270386,396308],[9,758],[-633,464]],[[271363,398819],[-98,-3218],[-349,-847]],[[235535,397836],[-738,278],[-101,-1259]],[[268412,396047],[-1128,225],[-164,1037]],[[267120,397309],[-319,733]],[[261063,395395],[-665,-1817]],[[260398,393578],[-311,-147]],[[260087,393431],[-10,4855]],[[272995,397586],[-322,-2153]],[[272673,395433],[-626,51]],[[272047,395484],[-219,2020]],[[255274,395200],[-23,-931]],[[255251,394269],[-1050,-45]],[[254201,394224],[-106,0]],[[254095,394224],[-12,6047]],[[254095,394224],[-871,-49]],[[253224,394175],[-287,84],[0,1095]],[[257616,396873],[-2,-1632]],[[257614,395241],[-617,-10]],[[256997,395231],[-542,-4]],[[256455,395227],[-396,72]],[[275398,398951],[-49,-2705],[-193,-1560],[-17,-2747]],[[275139,391939],[-179,223]],[[274960,392162],[-177,2249],[-237,821]],[[274546,395232],[-309,1940],[-32,1625]],[[178718,391008],[0,-11659],[-2488,-10],[-9,-22498]],[[176221,356841],[9,-15660]],[[176230,341181],[-3544,18062]],[[172686,359243],[1,19187],[-1464,8789]],[[171223,387219],[-1407,8282],[-2,1512],[924,1373]],[[244850,396880],[-2,-2773],[-421,28],[-7,-2523]],[[244420,391612],[-356,-627],[-262,515]],[[243802,391500],[-20,-7]],[[243782,391493],[38,6620]],[[263352,398399],[22,-5065]],[[263374,393334],[-124,-465]],[[263250,392869],[-377,1491]],[[262873,394360],[-210,810]],[[262663,395170],[-20,2421]],[[288150,393826],[43,-3599]],[[288193,390227],[-151,927],[-491,-152]],[[287551,391002],[-166,1427],[180,785]],[[287565,393214],[-46,2280]],[[218249,399497],[-18,-8071]],[[218231,391426],[-863,14]],[[217368,391440],[-992,-7]],[[216376,391433],[17,8091]],[[216376,391433],[-231,-10]],[[216145,391423],[-1332,-39]],[[214813,391384],[-3,6505]],[[223193,399492],[-14,-8122]],[[223179,391370],[-1512,-4]],[[221667,391366],[-36,-1]],[[221631,391365],[18,8115]],[[220099,399475],[-16,-8095]],[[220083,391380],[-260,15]],[[219823,391395],[-1228,34]],[[218595,391429],[-364,-3]],[[229176,394596],[-104,-1079],[-8,-3775]],[[229064,389742],[-1230,0]],[[227834,389742],[0,6487]],[[224733,394609],[-4,-3237]],[[224729,391372],[-1523,-3]],[[223206,391369],[-27,1]],[[221631,391365],[-1548,15]],[[285466,392328],[-31,-1556]],[[285435,390772],[-7,-2276]],[[285428,388496],[-134,1401],[-606,809],[-230,-837],[-81,1376]],[[284377,391245],[169,2219]],[[284546,393464],[298,1555],[-259,1360]],[[206488,399432],[13,-4858],[-121,-1295],[371,-47],[-10,-2736]],[[206741,390496],[-830,-42],[-247,924]],[[209217,388123],[-2473,-52]],[[206744,388071],[-3,2425]],[[264443,394683],[-524,-1280]],[[263919,393403],[-110,901],[24,2588],[-154,1891]],[[278045,396226],[-294,-515],[-232,-1658],[80,-1120],[-325,-2167]],[[277274,390766],[-416,1407],[-243,-3513],[-463,-1711],[-244,275],[-358,-1593]],[[275550,385631],[171,2537],[-267,3168]],[[275454,391336],[428,949],[115,3748]],[[166656,388375],[-699,3239]],[[165957,391614],[-901,4159]],[[165056,395773],[-269,1240],[-4,1258]],[[275454,391336],[-315,603]],[[274546,395232],[-268,-471],[-788,-2996]],[[273490,391765],[-200,1393],[150,994],[-86,3042]],[[280929,397160],[39,-1197],[-240,-2110]],[[280728,393853],[-452,-1704],[-259,-2493]],[[280017,389656],[-633,2946]],[[263919,393403],[-308,-257]],[[263611,393146],[-237,188]],[[272047,395484],[-122,-4567],[68,-1111]],[[271993,389806],[-308,-1084],[-178,1340]],[[271507,390062],[-213,1013]],[[271294,391075],[-378,3679]],[[171223,387219],[-1840,-10801],[-214,48]],[[169169,376466],[-2031,9652]],[[260087,393431],[-260,-1361]],[[259827,392070],[-266,627],[-811,-80]],[[258750,392617],[-16,4231],[-102,-3]],[[234285,396682],[0,-4534]],[[234285,392148],[-1239,4]],[[233046,392152],[0,2439]],[[165056,395773],[67,-1276],[-536,-3016]],[[164587,391481],[-681,-2964],[-867,-752],[-370,962],[-735,-860]],[[161934,387867],[-256,3852],[-77,-67]],[[243782,391493],[-600,-672],[-237,-1354]],[[242945,389467],[-301,-676],[-459,1581]],[[241411,395563],[-330,-4505],[-622,73]],[[240459,391131],[-612,170]],[[239847,391301],[27,4378]],[[284258,395791],[-146,-762]],[[284112,395029],[62,-330]],[[284174,394699],[109,-599]],[[284283,394100],[166,-999]],[[284449,393101],[22,-1315],[-319,-1468],[-235,541]],[[283917,390859],[-818,3312]],[[203879,391310],[232,-1351],[-63,-2148],[-283,-1101]],[[203765,386710],[-658,-441]],[[235534,394169],[-3,-2030]],[[235531,392139],[-1246,9]],[[267120,397309],[10,-7398]],[[267130,389911],[-689,1520],[-363,-1183]],[[266078,390248],[-168,18]],[[189012,387896],[-1284,-154]],[[187728,387742],[-2094,148]],[[185634,387890],[9,1163]],[[214813,391384],[1,-1534]],[[214814,389850],[-3144,-51]],[[273490,391765],[-131,-932]],[[273359,390833],[-145,-1041]],[[273214,389792],[-209,606],[-29,1581],[-303,3454]],[[281794,396633],[-352,-2134]],[[281442,394499],[-181,-1569],[-249,-398]],[[281012,392532],[-284,1321]],[[270386,396308],[-126,-2312],[-210,-922],[124,-3421],[-112,-240]],[[270062,389413],[-201,-166]],[[269861,389247],[-208,45],[20,1691],[-328,121],[-31,1670],[-276,128],[19,1217]],[[262663,395170],[-751,43],[12,491]],[[271294,391075],[-509,-438],[-303,-919],[26,-2485]],[[270508,387233],[-446,2180]],[[250450,392212],[-956,23]],[[249494,392235],[-119,4764]],[[268850,394204],[-252,-4689],[-210,-491]],[[268388,389024],[-201,3414],[-398,-533]],[[267789,391905],[-350,-1991],[-309,-3]],[[282766,395947],[-168,-2056],[513,-5136]],[[283111,388755],[-288,-2729]],[[282823,386026],[-280,58],[-558,5269]],[[281985,391353],[-543,3146]],[[249494,392235],[6,-1626],[-311,-14]],[[249189,390595],[-1322,101]],[[247867,390696],[42,2085]],[[247909,392781],[135,617]],[[248044,393398],[6,862],[-447,1330]],[[245702,394611],[-17,-6019]],[[245685,388592],[-299,1157],[-435,348],[-393,1319]],[[244558,391416],[-138,196]],[[284546,393464],[-223,1829]],[[284323,395293],[-65,498]],[[258750,392617],[-93,-1410]],[[258657,391207],[-1043,-28]],[[257614,391179],[0,4062]],[[248044,393398],[-494,1528],[-406,-1104],[-259,-2536],[-553,-983]],[[246332,390303],[-515,-1949],[-132,238]],[[289289,396094],[351,-2735],[270,-53],[-16,-3322],[132,-3186]],[[290026,386798],[-57,0]],[[289969,386798],[-44,0]],[[289925,386798],[-712,13]],[[289213,386811],[-982,153],[-22,1873]],[[288209,388837],[-16,1390]],[[227834,389742],[-1541,10]],[[226293,389752],[-11,4862]],[[278860,392581],[-466,-5287]],[[278394,387294],[-254,-1223]],[[278140,386071],[-449,839],[-166,1723],[-310,768]],[[277215,389401],[59,1365]],[[239847,391301],[-20,-3034]],[[239827,388267],[-622,98],[-4,-541],[-615,114]],[[238586,387938],[4,815]],[[238590,388753],[39,6929]],[[287565,393214],[-230,-1318],[167,-933],[-195,-1781],[-402,1979],[-480,1174],[215,1900],[256,-1835],[-68,1744],[239,1469]],[[283917,390859],[-162,-3064]],[[283755,387795],[-414,1424],[-230,-464]],[[273214,389792],[-307,-1569]],[[272907,388223],[-755,413],[-159,1170]],[[238590,388753],[-1541,208]],[[237049,388961],[-153,25],[0,4923]],[[284458,394060],[-175,40]],[[284174,394699],[-62,330]],[[284323,395293],[135,-1233]],[[165957,391614],[-111,-1812],[217,-2118],[-268,-3202]],[[165795,384482],[-318,1675],[-351,-1063],[-392,1451]],[[164734,386545],[-147,1347]],[[164587,387892],[0,3589]],[[262873,394360],[-58,-1367],[-578,-418]],[[262237,392575],[-496,-1308]],[[261741,391267],[-4,4143]],[[241700,392158],[-280,-5796]],[[241420,386362],[-362,56]],[[241058,386418],[-603,3090],[4,1623]],[[160323,392089],[-77,-1062],[333,-1452],[-117,-1633],[135,-802],[-46,-1999],[-216,-908]],[[160335,384233],[-267,44],[0,3908],[-681,143],[-458,-370]],[[158929,387958],[0,-4]],[[158929,387958],[-514,6077],[-298,453]],[[261741,391267],[-366,837]],[[261375,392104],[-331,-489],[66,-2303]],[[261110,389312],[-395,371]],[[260715,389683],[-3,1350],[-313,1080],[-1,1465]],[[253224,394175],[-108,-3960],[133,-658]],[[253249,389557],[-1250,128]],[[251999,389685],[9,4096]],[[256455,395227],[-410,-1812],[-93,-2129],[104,-2737]],[[256056,388549],[-615,-232]],[[255441,388317],[-297,-785]],[[255144,387532],[-486,-1420]],[[254658,386112],[-34,905],[308,954],[-17,1005]],[[254915,388976],[435,3214],[-99,2079]],[[257614,391179],[2,-2983]],[[257616,388196],[-674,-391]],[[256942,387805],[55,7426]],[[256942,387805],[-413,171]],[[256529,387976],[-473,573]],[[274960,392162],[-143,-1744],[-396,-2216]],[[274421,388202],[-376,577],[-266,-940]],[[273779,387839],[-420,2994]],[[247909,392781],[-238,-998],[-192,-2324],[175,-1160]],[[247654,388299],[-24,-168]],[[247630,388131],[-211,-2528]],[[247419,385603],[-176,2124],[-512,9],[-410,-650]],[[246321,387086],[11,3217]],[[264517,389239],[-698,-957]],[[263819,388282],[-57,221]],[[263762,388503],[-151,4643]],[[264447,393802],[70,-4563]],[[230673,392156],[-3,-4046]],[[230670,388110],[-1298,15]],[[229372,388125],[-307,-1],[-1,1618]],[[226293,389752],[2,-1622]],[[226295,388130],[-1550,-17]],[[224745,388113],[-16,3259]],[[233046,392152],[-20,-5676]],[[233026,386476],[-1232,4]],[[231794,386480],[13,5678]],[[158929,387954],[-62,-1644],[169,-2032],[-399,3],[-19,-2538],[-216,-434]],[[158402,381309],[-24,5]],[[158378,381314],[-291,-21]],[[158087,381293],[-3,45]],[[158084,381338],[140,477],[-107,2272],[-522,4538],[-125,2200]],[[281985,391353],[-669,-3258],[-157,217]],[[281159,388312],[-296,1764]],[[280863,390076],[149,2456]],[[263250,392869],[-350,-1063]],[[262900,391806],[-413,-1090]],[[262487,390716],[-250,1859]],[[158084,381338],[-237,-853],[-152,859]],[[157695,381344],[-539,908],[-435,1971],[-296,-310]],[[156425,383913],[-353,2861],[-569,2152],[-557,3778]],[[254915,388976],[-726,35]],[[254189,389011],[12,5213]],[[280017,389656],[-138,-1763],[572,-1648]],[[280451,386245],[-493,-2674]],[[279958,383571],[-240,-1325]],[[279718,382246],[-1324,5048]],[[254189,389011],[-119,3]],[[254070,389014],[-537,-21]],[[253533,388993],[-284,564]],[[269861,389247],[-95,-2476],[-512,-708]],[[269254,386063],[-253,186]],[[269001,386249],[-194,1565]],[[268807,387814],[-419,1210]],[[237049,388961],[-4,-2241]],[[237045,386720],[-1525,568]],[[235520,387288],[11,4851]],[[280863,390076],[-319,-2827]],[[280544,387249],[-93,-1004]],[[260715,389683],[-623,-25],[-151,-811]],[[259941,388847],[-106,262],[-8,2961]],[[265356,392696],[-244,-3246]],[[265112,389450],[-475,-738]],[[264637,388712],[-120,527]],[[251999,389685],[-2,-2447]],[[251997,387238],[-1241,-17]],[[250756,387221],[2,543]],[[250758,387764],[15,4341]],[[263762,388503],[-226,-927]],[[263536,387576],[-64,-376]],[[263472,387200],[-541,2720],[-31,1886]],[[259941,388847],[-406,-1355],[-4,-1306]],[[259531,386186],[-106,-8]],[[259425,386178],[-618,89]],[[258807,386267],[-150,4]],[[258657,386271],[0,4936]],[[247867,390696],[-213,-2397]],[[285904,391677],[33,-3347],[377,-2748],[-110,-1238],[-607,2727],[-162,3701]],[[266078,390248],[8,-2072]],[[266086,388176],[-605,-1279],[-198,665]],[[265283,387562],[-171,1888]],[[262487,390716],[-392,-1207]],[[262095,389509],[-262,-210]],[[261833,389299],[-458,2805]],[[268807,387814],[-424,-2456]],[[268383,385358],[-426,367],[-546,2055]],[[267411,387780],[397,3341],[-19,784]],[[250758,387764],[-457,107]],[[250301,387871],[-488,-745],[-369,60],[-248,-998]],[[249196,386188],[-7,4407]],[[277215,389401],[-117,-2971],[-334,-2300],[41,-777]],[[276805,383353],[-350,-1565],[-111,-2182]],[[276344,379606],[-848,-338],[-274,1261],[9,2076]],[[275231,382605],[22,2224],[297,802]],[[242945,389467],[-266,-2385],[-345,60],[127,-1459],[-203,-1038]],[[242258,384645],[-596,107],[14,1563],[-256,47]],[[231794,386480],[-23,-4900]],[[231771,381580],[-1110,51]],[[230661,381631],[9,6479]],[[234285,392148],[-26,-6491]],[[234259,385657],[-1233,6]],[[233026,385663],[0,813]],[[235520,387288],[0,-1654]],[[235520,385634],[-1261,23]],[[275231,382605],[-213,772]],[[275018,383377],[-482,1699],[-115,3126]],[[161934,387867],[6,-3922]],[[161940,383945],[-1040,-1303],[-210,591],[-282,-2812]],[[160408,380421],[-311,-431],[76,1800]],[[160173,381790],[162,2443]],[[261833,389299],[-405,-1730]],[[261428,387569],[-332,583]],[[261096,388152],[14,1160]],[[263472,387200],[-446,-2246]],[[263026,384954],[-363,80]],[[262663,385034],[-258,1506],[-110,2136],[-200,833]],[[267411,387780],[-197,-1449],[23,-1521],[-313,-464]],[[266924,384346],[-311,1158]],[[266613,385504],[-354,897],[-173,1775]],[[244558,391416],[4,-9113]],[[244562,382303],[-467,23],[2,-1088]],[[244097,381238],[-267,17]],[[243830,381255],[-40,2514]],[[243790,383769],[12,7731]],[[169169,376466],[1659,-8029]],[[170828,368437],[-2625,-35]],[[168203,368402],[-689,2284]],[[167514,370686],[-267,2691],[-422,166]],[[166825,373543],[187,2774],[-290,1077],[-121,2597],[-312,216],[-475,1906],[-19,2369]],[[246321,387086],[-122,-4889]],[[246199,382197],[-880,-1]],[[245319,382196],[-757,107]],[[243790,383769],[-1536,69]],[[242254,383838],[4,807]],[[164587,387892],[-720,-834],[-259,133],[-515,-1390],[-61,-1062],[-1009,-2141]],[[162023,382598],[-83,1347]],[[288209,388837],[-340,-1484],[-14,-1069]],[[287855,386284],[-365,-3226],[-285,1002],[9,-1396],[-759,4562],[218,1227],[-54,1256],[301,244],[335,-1096],[296,2145]],[[218595,391429],[0,-8114]],[[218595,383315],[-1157,7]],[[217438,383322],[-63,-1]],[[217375,383321],[-7,8119]],[[219823,391395],[8,-8114]],[[219831,383281],[-1236,34]],[[216145,391423],[-1,-8126]],[[216144,383297],[-1330,-14]],[[214814,383283],[1,118]],[[214815,383401],[-1,6449]],[[217375,383321],[-1161,-23]],[[216214,383298],[-70,-1]],[[282823,386026],[45,-780]],[[282868,385246],[-236,-135]],[[282632,385111],[-191,603],[-899,-1519]],[[281542,384195],[7,1473],[-390,2644]],[[221667,391366],[1,-6464]],[[221668,384902],[2,-1623]],[[221670,383279],[-1791,1]],[[219879,383280],[-48,1]],[[241058,386418],[-180,-1533],[-17,-2354]],[[240861,382531],[-193,-605],[-544,142],[-327,1182]],[[239797,383250],[30,5017]],[[224745,388113],[2,-4860]],[[224747,383253],[-1206,6]],[[223541,383259],[-334,2],[0,1622]],[[223207,384883],[-1,6486]],[[206744,388071],[3,-4865],[-303,-5]],[[206444,383201],[-2083,130]],[[204361,383331],[-596,3379]],[[223207,384883],[-1539,19]],[[285428,388496],[2,-844]],[[285430,387652],[-211,220],[-263,-2218]],[[284956,385654],[81,-2289],[-234,434],[-329,2869],[-459,-1569],[-187,2281],[549,3865]],[[258657,386271],[-1,-537],[-1038,13]],[[257618,385747],[-2,2449]],[[270898,384461],[-214,-1052],[-154,1960]],[[270530,385369],[-22,1864]],[[271507,390062],[-150,-656],[68,-2319],[-484,-1260],[-43,-1366]],[[181367,389064],[0,-7900]],[[181367,381164],[-7,-10123]],[[181360,371041],[4,-11253]],[[181364,359788],[2,-2927]],[[181366,356861],[-1984,13],[0,178],[-2727,-7],[-434,-204]],[[199240,384017],[-2,565],[-1384,-11],[128,-1422],[415,-674],[-79,-1241]],[[198318,381234],[-2999,12]],[[195319,381246],[-49,6459]],[[273779,387839],[177,-533],[-261,-1185],[-892,-2812]],[[272803,383309],[-146,3878],[250,1036]],[[249196,386188],[3,-3707]],[[249199,382481],[-545,27]],[[248654,382508],[-40,1621],[-342,19],[-642,3983]],[[281542,384195],[-437,-1435],[-99,693]],[[281006,383453],[-396,1782],[-66,2014]],[[272803,383309],[-1,-6]],[[272802,383303],[-272,-1508],[-143,-3971]],[[272387,377824],[-212,340]],[[272175,378164],[-165,2328],[-356,2011],[-528,-202]],[[271126,382301],[46,1976],[-274,184]],[[214815,383401],[-1944,-34]],[[212871,383367],[-1832,-28]],[[211039,383339],[-284,-8]],[[210755,383331],[-8,4681]],[[227834,389742],[0,-8111]],[[227834,381631],[-920,3]],[[226914,381634],[-613,-2]],[[226301,381632],[-6,6498]],[[229372,388125],[-59,-8133]],[[229313,379992],[-869,39]],[[228444,380031],[-2,1618],[-608,-18]],[[265283,387562],[-139,-989]],[[265144,386573],[-341,379]],[[264803,386952],[-166,1760]],[[253533,388993],[-9,-5827]],[[253524,383166],[-612,-14]],[[252912,383152],[-924,24]],[[251988,383176],[9,4062]],[[261096,388152],[-573,-2670]],[[260523,385482],[-285,-2089],[-141,377]],[[260097,383770],[-46,2157],[-520,259]],[[270530,385369],[-363,-645],[-243,-2058]],[[269924,382666],[-670,3397]],[[262663,385034],[-353,-388]],[[262310,384646],[-796,417]],[[261514,385063],[-86,2506]],[[278140,386071],[-341,-3644],[-207,-671]],[[277592,381756],[-787,1597]],[[283755,387795],[-68,-3119]],[[283687,384676],[-6,-1714]],[[283681,382962],[-121,26]],[[283560,382988],[-214,707]],[[283346,383695],[-232,459]],[[283114,384154],[-246,1092]],[[264803,386952],[-255,-1635]],[[264548,385317],[-418,-1608],[-274,-40]],[[263856,383669],[-44,1680],[-276,2227]],[[185634,387890],[509,-3310],[-59,-2002],[-242,-1389]],[[185842,381189],[-97,-48]],[[185745,381141],[-4378,23]],[[254070,389014],[36,-2007],[-137,-3775]],[[253969,383232],[-445,-66]],[[254658,386112],[-463,-2723],[-218,-213]],[[253977,383176],[-8,56]],[[238586,387938],[-30,-5629]],[[238556,382309],[-1467,73]],[[237089,382382],[-71,8],[27,4330]],[[289213,386811],[95,-1816],[-160,-1192],[-692,-216]],[[288456,383587],[-506,-230]],[[287950,383357],[-283,-697],[-32,1164],[220,2460]],[[275018,383377],[-768,-3505],[-473,452]],[[273777,380324],[-279,2237],[-256,-553],[-440,1295]],[[256529,387976],[-3,-5248]],[[256526,382728],[-678,251]],[[255848,382979],[2,2497],[-255,-92],[-154,2933]],[[158378,381314],[146,-1464],[-437,1443]],[[160173,381790],[-408,-2224],[-354,-188],[-351,1518],[-215,-1698],[-283,502],[-160,1609]],[[239797,383250],[35,-3689]],[[239832,379561],[-1222,173]],[[238610,379734],[-54,2575]],[[255848,382979],[-1,-825],[-418,-677]],[[255429,381477],[-616,58]],[[254813,381535],[-309,1118],[-517,34]],[[253987,382687],[-10,489]],[[257618,385747],[6,-2451]],[[257624,383296],[-312,-1080]],[[257312,382216],[-630,-29]],[[256682,382187],[-156,541]],[[266613,385504],[-146,-2035],[-362,-1580]],[[266105,381889],[-246,1825],[-347,209]],[[265512,383923],[-368,2650]],[[261514,385063],[-513,-1353]],[[261001,383710],[-478,1772]],[[230661,381631],[-3,-1635],[-459,10]],[[230199,380006],[-886,-14]],[[209217,388123],[-12,-6998]],[[209205,381125],[-8,-7666]],[[209197,373459],[-808,1541]],[[208389,375000],[-823,1546],[-1023,-359],[-102,637]],[[206441,376824],[3,6377]],[[210755,383331],[-21,-1721],[-306,-20],[0,-1082],[-596,-8],[-593,529]],[[209239,381029],[-34,96]],[[226301,381632],[-1535,-18]],[[224766,381614],[-19,1639]],[[248654,382508],[-383,35],[1,-1620],[-477,-883]],[[247795,380040],[-127,736]],[[247668,380776],[-303,1892],[54,2935]],[[250756,387221],[-8,-4860]],[[250748,382361],[-1241,119]],[[249507,382480],[-308,1]],[[285430,387652],[553,-2587],[494,-4061],[-10,-1655],[-344,2010],[-710,2346],[-112,-1069],[-345,3018]],[[164734,386545],[-434,-1184],[-950,-7856],[-382,-2239]],[[162968,375266],[-758,4581]],[[162210,379847],[-187,2751]],[[187728,387742],[-228,-1434],[16,-5094]],[[187516,381214],[-1674,-25]],[[192580,387705],[27,-2493],[351,-3273],[-106,-713]],[[192852,381226],[-4142,-34],[-1194,22]],[[247668,380776],[-455,-1591]],[[247213,379185],[-466,-722],[-158,1359]],[[246589,379822],[-390,2375]],[[268978,383008],[-530,-70]],[[268448,382938],[-65,2420]],[[269001,386249],[-23,-3241]],[[268448,382938],[-363,-1281]],[[268085,381657],[-378,305],[-289,1389],[-223,-1372]],[[267195,381979],[-271,2367]],[[195319,381246],[2,-5061]],[[195321,376185],[-5,-7382]],[[195316,368803],[-5,-9039]],[[195311,359764],[-2662,-21]],[[192649,359743],[-2090,97]],[[190559,359840],[-1844,-32]],[[188715,359808],[653,1884],[604,385],[346,3275],[287,901],[-33,1956],[278,1645]],[[190850,369854],[446,2473],[227,3835],[527,220],[571,4056],[231,788]],[[263856,383669],[113,-1403]],[[263969,382266],[-621,-1698]],[[263348,380568],[-281,1465]],[[263067,382033],[-41,2921]],[[281006,383453],[-231,-1615]],[[280775,381838],[-817,1733]],[[279718,382246],[-89,-2346],[-162,-617]],[[279467,379283],[-168,-1840],[-296,-1251],[-422,177]],[[278581,376369],[-906,3632]],[[277675,380001],[127,1436],[-210,319]],[[251988,383176],[-8,-2447]],[[251980,380729],[-1183,-9]],[[250797,380720],[-49,1641]],[[237089,382382],[-24,-3302]],[[237065,379080],[-1548,436]],[[235517,379516],[3,6118]],[[172686,359243],[-1858,9194]],[[265512,383923],[-362,-1946]],[[265150,381977],[-326,1245],[-276,2095]],[[204361,383331],[336,-2212],[254,-3271],[312,-1387]],[[205263,376461],[44,-2691]],[[205307,373770],[-1620,-57]],[[203687,373713],[-1526,-10],[-2,1613],[-297,15]],[[201862,375331],[0,678],[-568,1790],[-287,-220]],[[201007,377579],[-1,3557]],[[289111,378680],[-677,-384]],[[288434,378296],[-6,32]],[[288428,378328],[-108,834],[337,902],[-201,3523]],[[289925,386798],[-186,-3801],[-305,-810],[-323,-3507]],[[166825,373543],[-110,722]],[[166715,374265],[-627,2326],[-335,-1722],[-420,-936],[-390,89],[-379,1183],[-853,-3610]],[[163711,371595],[-743,3671]],[[233026,385663],[-31,-6553]],[[232995,379110],[-1225,36]],[[231770,379146],[1,2434]],[[242254,383838],[30,-5137]],[[242284,378701],[-616,91]],[[241668,378792],[-306,22],[-345,3550],[-156,167]],[[258807,386267],[-62,-3640],[-147,-849]],[[258598,381778],[-366,-1124]],[[258232,380654],[2,1594],[-309,13],[3,1094],[-304,-59]],[[259425,386178],[1,-1624],[368,-2837]],[[259794,381717],[-134,-3193]],[[259660,378524],[-140,-131]],[[259520,378393],[-503,215],[-244,853],[-175,2317]],[[269924,382666],[-59,-1571],[261,-1815],[-318,-1930]],[[269808,377350],[-304,-1659]],[[269504,375691],[-230,1692]],[[269274,377383],[-144,2308],[-237,1273],[85,2044]],[[260097,383770],[-303,-2053]],[[284512,383385],[-92,-1945]],[[284420,381440],[-8,-27]],[[284412,381413],[-144,-224]],[[284268,381189],[-437,1843],[-150,-70]],[[283687,384676],[250,-96],[535,1272],[40,-2467]],[[267195,381979],[-57,-1464]],[[267138,380515],[-472,-1482]],[[266666,379033],[-181,318]],[[266485,379351],[-380,2538]],[[282632,385111],[-701,-4528]],[[281931,380583],[-408,650],[-297,-356]],[[281226,380877],[-451,961]],[[234259,385657],[-34,-6557]],[[234225,379100],[-1230,10]],[[235517,379516],[0,-428]],[[235517,379088],[-1292,12]],[[261001,383710],[173,-405],[-53,-2162]],[[261121,381143],[-14,-546]],[[261107,380597],[-355,-820],[-434,244],[-629,-1650]],[[259689,378371],[-29,153]],[[283114,384154],[232,-459]],[[283560,382988],[-758,-4755]],[[282802,378233],[-126,314]],[[282676,378547],[-383,1648],[-362,388]],[[271126,382301],[-263,-1063],[-13,-2367]],[[270850,378871],[-720,-941]],[[270130,377930],[-322,-580]],[[263067,382033],[-389,-1467]],[[262678,380566],[-442,233]],[[262236,380799],[74,3847]],[[265150,381977],[-286,-1440]],[[264864,380537],[-573,-892]],[[264291,379645],[-263,850],[-59,1771]],[[262236,380799],[-219,-1712]],[[262017,379087],[-896,2056]],[[223541,383259],[-1,-4853],[-304,-4]],[[223236,378402],[-914,9],[-1,1610],[-610,3]],[[221711,380024],[-41,3255]],[[199424,381138],[158,-1618],[-158,-1773]],[[199424,377747],[-472,-1110]],[[198952,376637],[-30,888],[-421,1384],[24,1647],[-207,678]],[[157695,381344],[162,-972],[-41,-3299],[179,-856],[-251,-1183],[-370,1731],[-114,-336],[-479,2414],[-374,-283],[165,2872],[317,-1457],[-464,3938]],[[266485,379351],[-223,-717],[-503,-259]],[[265759,378375],[-341,2566],[-268,1036]],[[162210,379847],[2,-6325],[-188,423],[-596,-1237],[-739,-3958]],[[160689,368750],[-239,1114],[0,5132]],[[160450,374996],[-71,4167]],[[160379,379163],[29,1258]],[[243830,381255],[-6,-1908],[-732,4],[-351,-755]],[[242741,378596],[-457,105]],[[288428,378328],[-760,-1368],[99,2154],[225,837]],[[287992,379951],[5,43]],[[287997,379994],[-216,-302],[-1,1870],[-264,-794],[434,2589]],[[281226,380877],[-275,-2361]],[[280951,378516],[-515,-3903]],[[280436,374613],[-425,-1184]],[[280011,373429],[-544,5854]],[[285766,378696],[-155,-920]],[[285611,377776],[-363,657],[-314,2280],[-163,-800]],[[284771,379913],[-351,1527]],[[284512,383385],[528,-1942],[635,-277],[253,-1943],[-162,-527]],[[241668,378792],[-8,-3016]],[[241660,375776],[-363,-1063],[-225,1683],[-655,61]],[[240417,376457],[-605,128]],[[239812,376585],[20,2976]],[[269274,377383],[-231,160],[-89,-1393]],[[268954,376150],[-910,2229],[-138,-652]],[[267906,377727],[-93,803]],[[267813,378530],[371,1947],[-99,1180]],[[277675,380001],[-469,-3994]],[[277206,376007],[-657,395],[-135,1144],[-337,-42]],[[276077,377504],[267,2102]],[[214814,383283],[8,-9753]],[[214822,373530],[1,-1754]],[[214823,371776],[-1967,-12]],[[212856,371764],[15,11603]],[[276077,377504],[-296,-1431],[-373,-3413]],[[275408,372660],[-430,-146],[-592,890]],[[274386,373404],[-399,2555]],[[273987,375959],[102,2169],[-312,2196]],[[267813,378530],[-479,65],[-196,1920]],[[206441,376824],[-330,1926],[-322,-2223],[-84,711],[-442,-777]],[[212856,371764],[-914,-4]],[[211942,371760],[-915,4]],[[211027,371764],[12,11575]],[[211027,371764],[-1822,7],[-8,1688]],[[258232,380654],[-83,-1403]],[[258149,379251],[-55,-2225],[-404,-1554]],[[257690,375472],[32,1005],[-295,274],[-178,1615]],[[257249,378366],[114,-4],[-51,3854]],[[273987,375959],[-386,-927]],[[273601,375032],[-357,1057],[-619,250],[-238,1485]],[[217438,383322],[-3,-8107],[40,-1726]],[[217475,373489],[-1218,0]],[[216257,373489],[-44,1699],[1,8110]],[[219879,383280],[1,-4863]],[[219880,378417],[-1219,28],[33,-4957]],[[218694,373488],[-1219,1]],[[216257,373489],[-1435,41]],[[253987,382687],[206,-1256],[-505,-5063]],[[253688,376368],[-787,325]],[[252901,376693],[11,6459]],[[224766,381614],[1,-6484]],[[224767,375130],[-1507,16]],[[223260,375146],[-24,3256]],[[221711,380024],[-1,-3245]],[[221710,376779],[-1831,17]],[[219879,376796],[1,1621]],[[252901,376693],[0,-15]],[[252901,376678],[-925,-16]],[[251976,376662],[4,4067]],[[284268,381189],[-150,-1311],[278,-2136]],[[284396,377742],[-309,-256],[-1,-1105]],[[284086,376381],[-456,-1904]],[[283630,374477],[-165,-177],[-222,1929],[-441,2004]],[[256682,382187],[-392,-3475]],[[256290,378712],[-307,-2568]],[[255983,376144],[-94,369]],[[255889,376513],[-415,787]],[[255474,377300],[-45,4177]],[[254813,381535],[-35,-5040]],[[254778,376495],[-630,72]],[[254148,376567],[54,-1761],[-336,-146]],[[253866,374660],[-178,1708]],[[272175,378164],[-318,-1099],[158,-2552]],[[272015,374513],[-260,-47]],[[271755,374466],[-295,397],[-169,2098],[-573,1278],[132,632]],[[249507,382480],[-7,-4915]],[[249500,377565],[-220,-2832]],[[249280,374733],[-473,1903],[-262,-565]],[[248545,376071],[-165,1642],[-585,2327]],[[238610,379734],[-22,-2902],[-171,-1635]],[[238417,375197],[-154,26]],[[238263,375223],[-509,95],[7,1074],[-716,163]],[[237045,376555],[20,2525]],[[250797,380720],[-133,-3247]],[[250664,377473],[-1164,92]],[[245319,382196],[-11,-8638]],[[245308,373558],[-149,-795]],[[245159,372763],[-438,51],[4,1622],[-612,34]],[[244113,374470],[-16,6768]],[[264291,379645],[-143,-3260]],[[264148,376385],[-273,-833]],[[263875,375552],[-122,1730],[-504,1185]],[[263249,378467],[99,2101]],[[246589,379822],[-14,-6361]],[[246575,373461],[-1267,97]],[[257249,378366],[-460,-1268]],[[256789,377098],[-280,-2533],[-526,1579]],[[259520,378393],[-23,-3367],[-403,-371]],[[259094,374655],[-945,4596]],[[263249,378467],[-138,-2638]],[[263111,375829],[-141,-279],[-100,2291]],[[262870,377841],[-192,2725]],[[265759,378375],[-26,-1497]],[[265733,376878],[-550,230]],[[265183,377108],[-319,3429]],[[228444,380031],[1,-3258]],[[228445,376773],[-1531,-4]],[[226914,376769],[0,4865]],[[231770,379146],[-5,-5695]],[[231765,373451],[0,-2430]],[[231765,371021],[-1573,61]],[[230192,371082],[7,8924]],[[226914,376769],[9,-3303],[-304,-24]],[[226619,373442],[-1831,-22]],[[224788,373420],[-21,1710]],[[255474,377300],[-169,-643],[-206,1280]],[[255099,377937],[-83,-2666],[-238,1224]],[[244113,374470],[-771,42],[-10,-3582]],[[243332,370930],[-613,69]],[[242719,370999],[22,7597]],[[190850,369854],[-4778,-85],[-898,125]],[[185174,369894],[-16,4888],[309,-23],[-28,1599],[335,1],[-29,4782]],[[285474,374121],[-189,-776]],[[285285,373345],[-143,1232],[-392,-213],[-211,1145],[-143,2233]],[[284412,381413],[24,-1012],[357,-714],[24,-1757],[347,-1481],[310,-2328]],[[198952,376637],[-342,-2418]],[[198610,374219],[-358,1511],[-614,-665],[-130,1368],[-1561,20],[-626,-268]],[[282676,378547],[-305,-5181]],[[282371,373366],[-288,723],[-132,1443],[-320,1091]],[[281631,376623],[-680,1893]],[[185174,369894],[-607,4],[0,-813]],[[184567,369085],[-377,-469],[-604,143],[0,868],[-616,2],[-1,1663],[-315,-252],[-1294,1]],[[262017,379087],[-182,-1209]],[[261835,377878],[-647,-598],[-256,976]],[[260932,378256],[175,2341]],[[201007,377579],[-383,-319],[-19,-4903],[45,-4703]],[[200650,367654],[-984,-5]],[[199666,367649],[-1,4038]],[[199665,371687],[0,2392],[-241,3668]],[[262870,377841],[-381,-297],[-271,-1165]],[[262218,376379],[-341,113]],[[261877,376492],[-42,1386]],[[251976,376662],[-1,-808]],[[251975,375854],[-1238,-25]],[[250737,375829],[-73,1644]],[[285611,377776],[352,-2379]],[[285963,375397],[-300,-592]],[[285663,374805],[-240,293],[-546,3121],[-106,1694]],[[248545,376071],[-481,-3793]],[[248064,372278],[-249,-32],[-722,3898],[380,1913],[-260,1128]],[[260932,378256],[-418,-2942],[-267,-430]],[[260247,374884],[-558,3487]],[[267906,377727],[-44,-1950]],[[267862,375777],[-303,91],[-437,-1812],[23,-1008]],[[267145,373048],[-650,2775]],[[266495,375823],[171,3210]],[[265183,377108],[-100,-1732]],[[265083,375376],[-218,283]],[[264865,375659],[-717,726]],[[160450,374996],[-1125,-1844],[-234,1488],[-260,115],[-482,1735]],[[158349,376490],[-209,1238],[349,1656],[315,-572],[373,668],[783,-708],[357,1506],[62,-1115]],[[230192,371082],[-1,-2432]],[[230191,368650],[-1749,-16]],[[228442,368634],[3,8139]],[[223260,375146],[0,-1720]],[[223260,373426],[-1521,36]],[[221739,373462],[-29,3317]],[[278540,374733],[-257,-158],[-226,-2494],[-255,-813]],[[277802,371268],[-172,-1567]],[[277630,369701],[-515,2398],[26,1888]],[[277141,373987],[65,2020]],[[278581,376369],[-41,-1636]],[[248064,372278],[-101,-552]],[[247963,371726],[-1081,38]],[[246882,371764],[-315,-16],[8,1713]],[[163711,371595],[-1656,-4355],[43,-1065],[-727,-3846]],[[161371,362329],[-154,872],[-328,-612],[-163,2474],[146,498],[-186,3197]],[[160686,368758],[3,-8]],[[239812,376585],[-307,30],[-14,-1889]],[[239491,374726],[-1074,471]],[[237045,376555],[-22,-4864]],[[237023,371691],[-1517,258]],[[235506,371949],[0,363]],[[235506,372312],[11,6776]],[[266495,375823],[-378,-675]],[[266117,375148],[-384,1730]],[[280011,373429],[-196,-1763],[-242,63],[-67,-1661]],[[279506,370068],[-122,-195]],[[279384,369873],[-552,4224],[-292,636]],[[259094,374655],[-346,-3823]],[[258748,370832],[-372,-503],[-265,1038],[-246,-1075]],[[257865,370292],[-129,1809]],[[257736,372101],[-46,3371]],[[232995,379110],[-18,-5688]],[[232977,373422],[-1212,29]],[[234225,379100],[-29,-5681]],[[234196,373419],[-1219,3]],[[235506,372312],[-1310,27]],[[234196,372339],[0,1080]],[[287953,369117],[-126,1004]],[[287827,370121],[-283,134],[320,3324],[379,1762],[191,2955]],[[289111,378680],[-116,-2440],[-517,-3407],[-55,-2436],[-470,-1280]],[[271755,374466],[-438,-677],[176,-948],[-282,-761]],[[271211,372080],[-347,405],[-184,-776],[-249,1135],[-83,2839],[-218,2247]],[[286401,372837],[-192,2274],[-246,286]],[[285766,378696],[289,-8],[647,-2450],[-301,-3401]],[[242719,370999],[-614,37]],[[242105,371036],[2,817],[-459,1220],[12,2703]],[[208389,375000],[-289,-1427],[-262,-3093],[-561,-3167],[-509,-171],[-616,-1904]],[[206152,365238],[46,2010],[-135,4024],[-310,764],[-525,-1496]],[[205228,370540],[79,3230]],[[283630,374477],[147,-1396],[514,-1038],[-44,-591]],[[284247,371452],[-292,-1688]],[[283955,369764],[-489,1286],[-105,1395],[-525,503]],[[282836,372948],[-465,418]],[[281362,373717],[-225,-1081]],[[281137,372636],[-621,1277],[-80,700]],[[281631,376623],[-269,-2906]],[[260247,374884],[160,-1473]],[[260407,373411],[-544,-3500],[-48,-1933]],[[259815,367978],[-431,176]],[[259384,368154],[-184,2177],[-263,88]],[[258937,370419],[-189,413]],[[263875,375552],[-250,-1451]],[[263625,374101],[-126,-753],[-407,1614]],[[263092,374962],[19,867]],[[268954,376150],[-162,-516],[84,-2449]],[[268876,373185],[-340,667],[-495,-733]],[[268041,373119],[-179,2658]],[[219879,376796],[30,-8168]],[[219909,368628],[-1216,-7]],[[218693,368621],[1,4867]],[[257736,372101],[-514,1415]],[[257222,373516],[-85,1915],[-348,1667]],[[273601,375032],[187,-2459],[-193,530],[-410,-2364]],[[273185,370739],[-292,-249],[-64,-1205]],[[272829,369285],[-281,1663],[-394,3474],[-139,91]],[[261877,376492],[-288,-708],[-405,-2399]],[[261184,373385],[-333,-3287]],[[260851,370098],[-286,-39],[142,1604],[-300,1748]],[[271211,372080],[-148,-2078]],[[271063,370002],[-199,-676]],[[270864,369326],[-114,472]],[[270750,369798],[-437,240],[-582,3546]],[[269731,373584],[-227,2107]],[[255889,376513],[81,-2236],[-378,-1771]],[[255592,372506],[-241,-671]],[[255351,371835],[-666,-172]],[[254685,371663],[-57,1803],[-480,3101]],[[285285,373345],[270,-2335]],[[285555,371010],[-138,-2862]],[[285417,368148],[-256,2601]],[[285161,370749],[-819,3092],[-256,2540]],[[199665,371687],[-1364,1]],[[198301,371688],[8,1040],[301,1491]],[[263092,374962],[-79,-1906]],[[263013,373056],[-780,-638]],[[262233,372418],[68,3271],[-83,690]],[[201862,375331],[-47,-8024]],[[201815,367307],[-1165,-220],[0,567]],[[269731,373584],[-340,-1357],[-300,301]],[[269091,372528],[-215,657]],[[277141,373987],[-397,706],[-568,-2859]],[[276176,371834],[-345,-947],[-213,581]],[[275618,371468],[-210,1192]],[[250737,375829],[-7,-4869]],[[250730,370960],[-827,-8],[-198,-520]],[[249705,370432],[27,2111],[-434,1360],[-18,830]],[[266117,375148],[-215,-2029]],[[265902,373119],[-39,-3]],[[265863,373116],[-510,788],[-270,1472]],[[257222,373516],[17,-1185],[-615,-2106]],[[256624,370225],[-1032,2281]],[[264865,375659],[-28,-5332]],[[264837,370327],[-303,-813]],[[264534,369514],[-414,301]],[[264120,369815],[-495,4286]],[[253866,374660],[-364,-2527],[71,-1661]],[[253573,370472],[-674,471]],[[252899,370943],[2,5735]],[[262233,372418],[-14,-886]],[[262219,371532],[-865,379],[-170,1474]],[[221739,373462],[9,-4974]],[[221748,368488],[-1535,133]],[[220213,368621],[-304,7]],[[228442,368634],[-1822,-25]],[[226620,368609],[-1,4833]],[[252899,370943],[-103,7]],[[252796,370950],[-827,-12]],[[251969,370938],[6,4916]],[[285161,370749],[-468,-117]],[[284693,370632],[-446,820]],[[240417,376457],[5,-7665]],[[240422,368792],[-608,47],[-4,-1332]],[[239810,367507],[-305,42]],[[239505,367549],[-14,7177]],[[160686,368758],[-1094,44],[-338,-404]],[[159254,368398],[-341,754],[-149,3106],[-463,2406],[48,1826]],[[282836,372948],[-67,-2692]],[[282769,370256],[-815,2165],[-30,-1006],[-320,603]],[[281604,372018],[-242,1699]],[[249705,370432],[0,-110]],[[249705,370322],[-946,616]],[[248759,370938],[-796,-36]],[[247963,370902],[0,824]],[[238263,375223],[35,-4781]],[[238298,370442],[-1280,166]],[[237018,370608],[5,1083]],[[166715,374265],[-765,-4053],[-188,-2675],[-313,4],[-790,-4320]],[[164659,363221],[-270,1013],[-380,3367],[-298,3994]],[[254685,371663],[-553,-2946]],[[254132,368717],[-234,1246],[-124,-776]],[[253774,369187],[-201,1285]],[[242105,371036],[-9,-2451]],[[242096,368585],[-1210,161]],[[240886,368746],[-464,46]],[[198301,371688],[-2633,-143],[-352,-2742]],[[268041,373119],[135,-3677],[-93,-602]],[[268083,368840],[-64,308]],[[268019,369148],[-398,2375],[-439,724]],[[267182,372247],[-37,801]],[[273842,367755],[-4,20]],[[273838,367775],[-653,2964]],[[274386,373404],[-544,-5649]],[[251969,370938],[-926,-51]],[[251043,370887],[-313,73]],[[267182,372247],[-389,564],[-373,-1145]],[[266420,371666],[-518,1453]],[[265863,373116],[-284,-991],[-227,-2237]],[[265352,369888],[-515,439]],[[286401,372837],[-31,-1676],[-479,915],[-228,2729]],[[203687,373713],[-2,-6471]],[[203685,367242],[-1781,53]],[[201904,367295],[-89,12]],[[158120,372965],[-303,-2]],[[157817,372963],[-33,1344],[287,552],[49,-1894]],[[239505,367549],[-1221,189]],[[238284,367738],[14,2704]],[[264120,369815],[-276,-992]],[[263844,368823],[-589,2769]],[[263255,371592],[-242,1464]],[[224788,373420],[0,-4871]],[[224788,368549],[-1526,-10]],[[223262,368539],[-2,4887]],[[279384,369873],[-416,-2088]],[[278968,367785],[-186,-655]],[[278782,367130],[-282,1313]],[[278500,368443],[-442,1074],[-256,1751]],[[211942,371760],[-29,-11975]],[[211913,359785],[-2568,-74]],[[209345,359711],[-3196,-18]],[[206149,359693],[3,5545]],[[277630,369701],[-234,-1501],[-213,613],[-430,-1507],[-95,-1769]],[[276658,365537],[-630,2108]],[[276028,367645],[291,2275],[-143,1914]],[[245159,372763],[-5,-2033]],[[245154,370730],[-438,88],[-5,-1634],[288,-70],[-3,-1602]],[[244996,367512],[-1212,138]],[[243784,367650],[-301,26],[0,3252],[-151,2]],[[272829,369285],[-248,-1599]],[[272581,367686],[-815,1322],[-628,339],[-75,655]],[[281137,372636],[-25,-1023],[-602,-5508]],[[280510,366105],[-361,1084]],[[280149,367189],[-643,2879]],[[167514,370686],[-806,-4323],[-52,-2727],[-160,-1067],[-478,-108],[49,-890],[-436,-1627],[-319,-2893],[-1552,-1282],[-242,1461],[-239,3370]],[[163279,360600],[183,976],[522,1046],[675,599]],[[285850,370354],[-295,656]],[[285474,374121],[422,-2948],[651,-1011],[-346,-835],[-351,1027]],[[269091,372528],[-167,-3365],[109,-686],[-352,-3385]],[[268681,365092],[-160,2649],[-438,1099]],[[205228,370540],[-718,-4116]],[[204510,366424],[-823,2],[-2,816]],[[281604,372018],[-166,-3772]],[[281438,368246],[-287,-1612]],[[281151,366634],[-415,-1159],[-226,630]],[[270750,369798],[-954,-4452]],[[269796,365346],[-678,-1792]],[[269118,363554],[-32,-122]],[[269086,363432],[-466,1404]],[[268620,364836],[61,256]],[[246882,371764],[-42,-6070]],[[246840,365694],[-2,-838],[-515,-29]],[[246323,364827],[-104,1909],[11,4271],[-1076,-277]],[[216257,373489],[3,-6477]],[[216260,367012],[-86,2]],[[216174,367014],[-1351,13]],[[214823,367027],[0,4749]],[[257865,370292],[-200,-146],[146,-3006]],[[257811,367140],[-547,-1924],[-253,-1484]],[[257011,363732],[-559,3794]],[[256452,367526],[172,2699]],[[217475,373489],[0,-6490]],[[217475,366999],[-1215,13]],[[218693,368621],[0,-1623]],[[218693,366998],[-1158,2]],[[217535,367000],[-60,-1]],[[223262,368539],[4,-1605]],[[223266,366934],[-1483,-59]],[[221783,366875],[-35,1613]],[[226620,368609],[1,-1637]],[[226621,366972],[-1512,-41]],[[225109,366931],[-321,1],[0,1617]],[[232977,373422],[0,-6492]],[[232977,366930],[-1214,49]],[[231763,366979],[2,4042]],[[234196,372339],[0,-5412]],[[234196,366927],[-1206,3]],[[232990,366930],[-13,0]],[[260851,370098],[153,-1651]],[[261004,368447],[-327,81]],[[260677,368528],[-206,-892]],[[260471,367636],[-656,342]],[[262219,371532],[-27,-1601]],[[262192,369931],[-95,-2448]],[[262097,367483],[-273,950],[-278,-893],[-215,1025],[-327,-118]],[[275618,371468],[-300,-1181],[80,-1044],[-490,-1589]],[[274908,367654],[-100,1094],[-720,-2036],[-246,1043]],[[266420,371666],[-159,-2460]],[[266261,369206],[-144,586],[-553,-948],[-155,568]],[[265409,369412],[-57,476]],[[263255,371592],[-527,-1618]],[[262728,369974],[-536,-43]],[[283955,369764],[143,-836]],[[284098,368928],[-199,-2026]],[[283899,366902],[-182,62]],[[283717,366964],[-298,1139]],[[283419,368103],[99,1639],[-146,1185]],[[283372,370927],[-246,-568]],[[283126,370359],[-198,-214]],[[282928,370145],[-159,111]],[[158120,372965],[96,-2153],[271,-374],[409,-1981]],[[158896,368457],[-209,-644],[106,-2702]],[[158793,365111],[-4,-1304],[-465,-535],[78,-1485]],[[158402,361787],[-314,1660],[11,3040],[-319,2976],[37,3500]],[[268019,369148],[-408,283],[-84,-2105]],[[267527,367326],[-252,702],[-463,-1950],[-186,747],[-277,-816]],[[266349,366009],[-88,3197]],[[282769,370256],[-560,-2687]],[[282209,367569],[-433,1404],[-338,-727]],[[256452,367526],[-546,-453]],[[255906,367073],[-158,651],[-62,2671]],[[255686,370395],[-335,1440]],[[235506,371949],[0,-5388]],[[235506,366561],[0,-480]],[[235506,366081],[-1273,28]],[[234233,366109],[-37,818]],[[276028,367645],[-525,-1521]],[[275503,366124],[-183,485],[-294,-965]],[[275026,365644],[-118,2010]],[[206149,359693],[-184,-2]],[[205965,359691],[-1385,13]],[[204580,359704],[-148,938],[143,4466],[-65,1316]],[[237018,370608],[-19,-4325]],[[236999,366283],[-1493,278]],[[255686,370395],[-1221,-4085]],[[254465,366310],[33,525]],[[254498,366835],[-359,563],[-7,1319]],[[247963,370902],[3,-5312],[-200,55]],[[247766,365645],[-926,49]],[[214823,367027],[-1,-7366]],[[214822,359661],[-2676,121]],[[212146,359782],[-233,3]],[[198301,371688],[-141,-896],[-30,-2362],[-478,-2240],[-241,-2267],[2,-1425],[-247,-2726]],[[197166,359772],[-1855,-8]],[[199666,367649],[1,-7868]],[[199667,359781],[-2501,-9]],[[163279,360600],[-1049,-5634]],[[162230,354966],[-621,1774],[-205,2320]],[[161404,359060],[-33,3269]],[[263844,368823],[-156,-2927]],[[263688,365896],[-150,509],[-457,-2191]],[[263081,364214],[-5,2272],[-355,1236],[7,2252]],[[284693,370632],[402,-618],[175,-1717]],[[285270,368297],[-384,-511],[-28,-974]],[[284858,366812],[-760,2116]],[[259384,368154],[-65,-2032],[-241,-92]],[[259078,366030],[-868,-273]],[[258210,365757],[-399,1383]],[[278500,368443],[-229,-637],[32,-1405]],[[278303,366401],[-518,-5580]],[[277785,360821],[-108,-926],[-313,672]],[[277364,360567],[-363,2794],[-342,617]],[[276659,363978],[-1,1559]],[[184567,369085],[6,-9298]],[[184573,359787],[-3209,1]],[[231763,366979],[-8,-1628]],[[231755,365351],[-1561,66]],[[230194,365417],[-3,3233]],[[246323,364827],[-123,-4110]],[[246200,360717],[-515,62],[-148,783]],[[245537,361562],[-47,1372],[-348,1595],[-44,2975],[-102,8]],[[249705,370322],[275,-3108],[-171,-1185]],[[249809,366029],[-13,-1567]],[[249796,364462],[-367,-344],[-402,-1991]],[[249027,362127],[-283,3]],[[248744,362130],[15,8808]],[[243784,367650],[-24,-6958]],[[243760,360692],[-1208,136]],[[242552,360828],[-452,64]],[[242100,360892],[-4,7693]],[[253774,369187],[-63,-598],[-543,-370],[-221,-906]],[[252947,367313],[-159,350]],[[252788,367663],[8,3287]],[[252788,367663],[-169,-665],[-98,-2358],[240,-2056],[-183,-1537]],[[252578,361047],[0,1701],[-613,3308]],[[251965,366056],[4,4882]],[[283419,368103],[-491,2042]],[[251965,366056],[-546,-28],[-64,-613]],[[251355,365415],[-321,507]],[[251034,365922],[9,4965]],[[251034,365922],[-568,97]],[[250466,366019],[-657,10]],[[285850,370354],[308,-1052]],[[286158,369302],[-18,-1124]],[[286140,368178],[152,-3489],[-321,-310],[-554,3769]],[[248744,362130],[-259,20],[1,-1356],[-425,-246]],[[248061,360548],[-311,844],[16,4253]],[[273838,367775],[29,-1536],[-368,-994]],[[273499,365245],[-679,-1091]],[[272820,364154],[-382,1913]],[[272438,366067],[143,1619]],[[168203,368402],[-33,-2228],[201,-311],[166,-3441],[607,-1527],[212,-3239],[-22,-2583]],[[169334,355073],[-1716,-82],[-1,-1560],[-890,26],[-3,-1596],[-460,19],[-298,-1620]],[[165966,350260],[-246,-1296],[-814,-375],[-3,-4045],[-992,-5108]],[[163911,339436],[-928,3750],[56,1793],[-140,1162]],[[162899,346141],[229,1144],[-1,2966],[-897,4715]],[[238284,367738],[-14,-2707]],[[238270,365031],[-1188,150]],[[237082,365181],[-83,1102]],[[265409,369412],[279,-3141]],[[265688,366271],[-442,-1825]],[[265246,364446],[-535,1287]],[[264711,365733],[-177,3781]],[[255906,367073],[-251,-1812],[146,-2556]],[[255801,362705],[-529,-954],[-438,809]],[[254834,362560],[-346,1711],[-23,2039]],[[283717,366964],[-7,-1436]],[[283710,365528],[-51,69]],[[283659,365597],[-117,-1255]],[[283542,364342],[-75,-143]],[[283467,364199],[-36,-77]],[[283431,364122],[-87,-195]],[[283344,363927],[-565,790]],[[282779,364717],[-265,34],[-366,1828],[61,990]],[[280149,367189],[-243,-2778]],[[279906,364411],[-397,-807]],[[279509,363604],[-259,695],[-282,3486]],[[287953,369117],[-346,-3597],[-150,-3563],[-151,2650],[266,5441],[255,73]],[[263081,364214],[-502,-2273]],[[262579,361941],[-398,1304]],[[262181,363245],[-37,1322],[-302,999]],[[261842,365566],[255,1917]],[[272438,366067],[-555,-2439],[-498,578]],[[271385,364206],[-316,930],[-383,3657],[178,533]],[[254498,366835],[-802,-2923],[-19,-787]],[[253677,363125],[-271,-607]],[[253406,362518],[-71,2344],[-388,2451]],[[188715,359808],[-3142,-15]],[[185573,359793],[-1000,-6]],[[266349,366009],[57,-1412]],[[266406,364597],[-349,1839],[-369,-165]],[[264711,365733],[-224,-683],[-203,-2441]],[[264284,362609],[-596,3287]],[[271385,364206],[-448,-1771]],[[270937,362435],[-326,-1378],[-364,-500]],[[270247,360557],[-283,4288],[-168,501]],[[286158,369302],[207,215],[310,-1575],[-73,-2372],[-462,2608]],[[268620,364836],[-243,-50],[-502,-1356]],[[267875,363430],[-354,1381],[6,2515]],[[282779,364717],[-405,-1350]],[[282374,363367],[-1213,1929]],[[281161,365296],[-10,1338]],[[284858,366812],[77,-164]],[[284935,366648],[-7,-2001],[-380,948],[-673,137],[24,1170]],[[240886,368746],[3,-7717]],[[240889,361029],[-605,67]],[[240284,361096],[-452,335]],[[239832,361431],[-22,6076]],[[161404,359060],[-763,407],[-257,-1537]],[[160384,357930],[-486,2766],[-658,1780],[-447,2635]],[[158896,368457],[358,-59]],[[261842,365566],[-523,-2202]],[[261319,363364],[-642,5164]],[[242100,360892],[-1211,137]],[[275026,365644],[-484,-1303]],[[274542,364341],[-690,-1814]],[[273852,362527],[-445,2380],[92,338]],[[230194,365417],[-2,-5660]],[[230192,359757],[-625,5]],[[229567,359762],[-1109,1]],[[228458,359763],[-16,8871]],[[228458,359763],[-876,-6]],[[227582,359757],[-948,0]],[[226634,359757],[-13,7215]],[[220213,368621],[49,-8799]],[[220262,359822],[-1515,-40]],[[218747,359782],[-2,7215],[-52,1]],[[221783,366875],[7,-7101]],[[221790,359774],[-1286,38]],[[220504,359812],[-242,10]],[[225109,366931],[7,-7184]],[[225116,359747],[-550,11]],[[224566,359758],[-1269,13]],[[223297,359771],[-31,7163]],[[261319,363364],[-484,-1545]],[[260835,361819],[-445,1353]],[[260390,363172],[-31,2226],[112,2238]],[[278782,367130],[-479,-729]],[[176230,341181],[676,-3535]],[[176906,337646],[-237,-293],[-2131,-6],[-3163,16]],[[171375,337363],[-1036,-168]],[[170339,337195],[74,1516],[-404,8051],[81,566],[-423,2802],[-72,2164],[-261,2779]],[[285483,364729],[247,-950]],[[285730,363779],[-49,-868]],[[285681,362911],[-94,912],[-633,479],[-19,2346]],[[285270,368297],[233,-1659]],[[285503,366638],[-153,-1180]],[[285350,365458],[133,-729]],[[260390,363172],[-160,-225]],[[260230,362947],[-453,-403],[-418,352]],[[259359,362896],[21,897],[-302,2237]],[[267875,363430],[-170,-1501],[19,-1797],[-189,-331]],[[267535,359801],[-167,368]],[[267368,360169],[-60,2882],[-338,936],[-80,1342],[-349,-222],[-82,-931]],[[266459,364176],[-53,421]],[[279509,363604],[-224,-3408]],[[279285,360196],[-519,775]],[[278766,360971],[-292,-175],[-159,1424],[-530,-1399]],[[239832,361431],[-1514,177]],[[238318,361608],[-48,3423]],[[253406,362518],[-128,-3094]],[[253278,359424],[-344,1547],[-334,-766]],[[252600,360205],[-233,1071]],[[252367,361276],[211,-229]],[[245537,361562],[-556,-176],[-16,-3767]],[[244965,357619],[-1212,97]],[[243753,357716],[7,2976]],[[201904,367295],[0,-3259],[564,-4371]],[[202468,359665],[-2632,116]],[[199836,359781],[-169,0]],[[276659,363978],[-321,-1646],[-128,663],[-334,-926]],[[275876,362069],[-139,-177]],[[275737,361892],[-37,2241],[-197,1991]],[[276171,365518],[-31,-845]],[[276140,364673],[211,-935],[217,1690],[-397,90]],[[257011,363732],[-118,-2665]],[[256893,361067],[-311,-151]],[[256582,360916],[-548,-371],[-28,565]],[[256006,361110],[-205,1595]],[[281161,365296],[-22,-3279]],[[281139,362017],[-569,-758]],[[280570,361259],[-694,2327],[30,825]],[[204580,359704],[-804,-10]],[[203776,359694],[-1308,-29]],[[258405,362945],[-625,205],[-142,-3375]],[[257638,359775],[-745,1292]],[[258210,365757],[195,-2812]],[[216174,367014],[4,-7320]],[[216178,359694],[-1317,-41]],[[214861,359653],[-39,8]],[[217535,367000],[4,-7258]],[[217539,359742],[-1361,-48]],[[218747,359782],[-870,-30]],[[217877,359752],[-338,-10]],[[232990,366930],[-4,-7162]],[[232986,359768],[-736,0]],[[232250,359768],[-495,-4]],[[231755,359764],[0,5587]],[[226634,359757],[-863,-11]],[[225771,359746],[-655,1]],[[223297,359771],[-1270,0]],[[222027,359771],[-237,3]],[[234233,366109],[3,-6336]],[[234236,359773],[-930,-5]],[[233306,359768],[-320,0]],[[254834,362560],[-147,-2742]],[[254687,359818],[-400,-772]],[[254287,359046],[-461,3988],[-149,91]],[[285503,366638],[154,-1165],[635,-2093],[-66,-1012]],[[286226,362368],[53,-609]],[[286279,361759],[-115,-211]],[[286164,361548],[-434,2231]],[[285483,364729],[-133,729]],[[237082,365181],[-19,-4504]],[[237063,360677],[-1557,162]],[[235506,360839],[0,5242]],[[275737,361892],[-473,-1709],[-546,-689]],[[274718,359494],[-101,1954]],[[274617,361448],[153,1099]],[[274770,362547],[-228,1794]],[[266459,364176],[-121,-2911],[119,-2630]],[[266457,358635],[-224,322]],[[266233,358957],[-784,1845]],[[265449,360802],[-274,2103],[71,1541]],[[264091,359038],[-613,-1731]],[[263478,357307],[-281,2109],[-435,319]],[[262762,359735],[-183,2206]],[[264284,362609],[-193,-3571]],[[235506,360839],[0,-1078]],[[235506,359761],[-1085,11]],[[234421,359772],[-185,1]],[[259359,362896],[-159,-1977]],[[259200,360919],[-468,373],[-327,1653]],[[276140,364673],[31,845]],[[252367,361276],[-1008,2722]],[[251359,363998],[-4,1417]],[[272820,364154],[-287,-1786],[161,-862],[-535,-1063],[70,-474]],[[272229,359969],[-685,-1435],[-271,477]],[[271273,359011],[-336,3424]],[[250466,366019],[-48,-4180],[274,-850]],[[250692,360989],[92,-1564]],[[250784,359425],[-347,1556],[-155,-1005]],[[250282,359976],[-177,539],[-309,3947]],[[265449,360802],[-249,-1448],[-375,-410]],[[264825,358944],[-564,-169]],[[264261,358775],[-170,263]],[[251359,363998],[-15,-29]],[[251344,363969],[-427,-1199],[-225,-1781]],[[267368,360169],[-217,-969],[-641,-1367]],[[266510,357833],[-53,802]],[[248061,360548],[-409,-2218]],[[247652,358330],[-1170,82]],[[246482,358412],[-282,2305]],[[283884,365227],[441,265],[239,-1371]],[[284564,364121],[-405,-2255]],[[284159,361866],[-678,-2215]],[[283481,359651],[-2,3311]],[[283479,362962],[63,1380]],[[283659,365597],[225,-370]],[[262181,363245],[-452,-3529],[-71,-1327]],[[261658,358389],[-614,240]],[[261044,358629],[-209,3190]],[[270247,360557],[-500,-1318]],[[269747,359239],[-387,951],[-242,3364]],[[231755,359764],[-101,-4]],[[231654,359760],[-1462,-3]],[[273852,362527],[-162,-1380]],[[273690,361147],[-561,-945],[-310,462],[-429,-1770]],[[272390,358894],[-161,1075]],[[282112,359572],[-317,633]],[[281795,360205],[-220,-114],[-436,1926]],[[282374,363367],[-290,-906],[28,-2889]],[[238318,361608],[-4,-1905]],[[238314,359703],[-2,-1358]],[[238312,358345],[-1259,166]],[[237053,358511],[10,2166]],[[160384,357930],[-174,-102]],[[160210,357828],[-281,264],[-164,-998]],[[159765,357094],[-379,2271],[-464,-404],[-520,2826]],[[283344,363927],[135,-965]],[[283481,359651],[-614,-2145]],[[282867,357506],[-109,311]],[[282758,357817],[-299,1492],[-347,263]],[[269086,363432],[-450,-1508],[10,-1311],[-407,-1312]],[[268239,359301],[-193,764],[-584,-1127],[73,863]],[[250282,359976],[-572,-2622]],[[249710,357354],[-479,-188]],[[249231,357166],[11,1267],[-274,2900],[59,794]],[[280570,361259],[-138,-3504]],[[280432,357755],[-433,-3598]],[[279999,354157],[-48,2703],[-666,3336]],[[274770,362547],[-153,-1099]],[[274718,359494],[-251,-983]],[[274467,358511],[-297,-983]],[[274170,357528],[-480,3619]],[[285497,362381],[-63,-1487],[-424,-1183]],[[285010,359711],[-289,-964]],[[284721,358747],[-34,2055],[-528,1064]],[[284564,364121],[581,-507],[352,-1233]],[[277364,360567],[-130,-3464]],[[277234,357103],[-337,-1260],[-663,787],[-116,-677]],[[276118,355953],[-70,868],[-471,580]],[[275577,357401],[360,2850],[-61,1818]],[[251671,358926],[-486,-648],[-308,443]],[[250877,358721],[-93,704]],[[251344,363969],[327,-5043]],[[252600,360205],[-4,-1497]],[[252596,358708],[-916,78]],[[251680,358786],[-9,140]],[[286164,361548],[133,-1960]],[[286297,359588],[-664,2557],[48,766]],[[269747,359239],[82,-1209],[-301,-552]],[[269528,357478],[-635,40],[-381,-1462]],[[268512,356056],[-298,1723]],[[268214,357779],[25,1522]],[[259200,360919],[-148,-2366]],[[259052,358553],[-666,-2939]],[[258386,355614],[14,578],[-508,429],[-79,979]],[[257813,357600],[-175,2175]],[[262762,359735],[-638,-2584]],[[262124,357151],[-421,-78]],[[261703,357073],[-45,1316]],[[261044,358629],[-402,-2234]],[[260642,356395],[-399,432]],[[260243,356827],[-13,6120]],[[254287,359046],[-781,-1739]],[[253506,357307],[-228,2117]],[[260243,356827],[-662,-2212]],[[259581,354615],[-529,3938]],[[256006,361110],[-211,-8003]],[[255795,353107],[-851,-64]],[[254944,353043],[-147,-18]],[[254797,353025],[95,6137],[-205,656]],[[285916,358061],[-1039,-4907]],[[284877,353154],[-34,77]],[[284843,353231],[-42,1109]],[[284801,354340],[305,3818],[-96,1553]],[[285497,362381],[59,-1873],[467,-1557],[-107,-890]],[[271273,359011],[-157,-551]],[[271116,358460],[-308,-1199],[-364,-179],[-73,-1054],[-635,-1658]],[[269736,354370],[-208,3108]],[[278766,360971],[-356,-9724]],[[278410,351247],[-345,-4]],[[278065,351243],[106,760],[-263,1161],[-285,-493],[86,-1438]],[[277709,351233],[-112,-1]],[[277597,351232],[-569,21]],[[277028,351253],[206,5850]],[[275577,357401],[-419,-1374],[-218,-1669]],[[274940,354358],[-473,4153]],[[249231,357166],[-25,-4320],[-720,33]],[[248486,352879],[-527,25]],[[247959,352904],[-9,1582],[-298,3844]],[[281795,360205],[-66,-4560]],[[281729,355645],[-596,561],[-701,1549]],[[286315,361864],[-36,-105]],[[286315,361864],[307,-509],[-325,-1767]],[[284721,358747],[-1328,-4408]],[[283393,354339],[-167,252],[88,2639],[-447,276]],[[246482,358412],[44,-2141]],[[246526,356271],[-1263,227]],[[245263,356498],[-303,38],[5,1083]],[[240284,361096],[-17,-4867]],[[240267,356229],[-1101,142]],[[239166,356371],[-106,8],[13,3262],[-759,62]],[[274170,357528],[-841,-1351]],[[273329,356177],[-156,-696],[-455,-110]],[[272718,355371],[-328,3523]],[[257813,357600],[-221,-728],[-203,-3628]],[[257389,353244],[-828,-107]],[[256561,353137],[21,7779]],[[256561,353137],[-151,-14]],[[256410,353123],[-615,-16]],[[242552,360828],[-65,-4878]],[[242487,355950],[-1819,221]],[[240668,356171],[-401,58]],[[253506,357307],[130,-2237]],[[253636,355070],[-1045,64]],[[252591,355134],[5,3574]],[[250877,358721],[-61,-2945]],[[250816,355776],[-215,-1258],[64,-1202]],[[250665,353316],[-204,-1647],[-215,1259]],[[250246,352928],[-536,4426]],[[279999,354157],[-151,-412],[-88,-2492]],[[279760,351253],[-173,-5]],[[279587,351248],[-953,1]],[[278634,351249],[-224,-2]],[[243753,357716],[-40,-7253]],[[243713,350463],[-1248,-11]],[[242465,350452],[22,5498]],[[237053,358511],[-17,-3425]],[[237036,355086],[-1531,348]],[[235505,355434],[1,4327]],[[266233,358957],[17,-976],[-599,-2205],[-221,-1818]],[[265430,353958],[-521,3091],[-84,1895]],[[282758,357817],[6,-3369],[-310,-3129]],[[282454,351319],[-369,-16]],[[282085,351303],[-408,-9]],[[281677,351294],[52,4351]],[[268214,357779],[-540,-708],[-177,-2081],[-906,-1448]],[[266591,353542],[-141,2662],[60,1629]],[[272718,355371],[-733,-1028],[-226,-1288]],[[271759,353055],[-261,2813],[-382,2592]],[[192649,359743],[0,-24860],[483,-3],[-46,-2691],[-3,-12919],[-57,-4902],[46,-1624],[-29,-12941],[-91,-9],[0,-3908]],[[192952,295886],[-303,169]],[[192649,296055],[0,7877],[-2090,0],[0,4900]],[[190559,308832],[0,51008]],[[190559,308832],[-267,69],[-549,2097],[-586,1352],[-625,-723],[-214,1094]],[[188318,312721],[8,6150],[-629,15],[-1,3313],[-1550,-154],[-3,3263],[-297,21],[4,2068],[-380,-319],[-149,1054],[-899,1045],[-616,2799],[-445,401]],[[183361,332377],[1,5120],[66,1656],[-122,2775],[363,944],[70,1118],[518,1618],[615,865],[469,2332],[-89,1927],[91,1455],[24,3834],[237,2874],[-31,898]],[[254797,353025],[-1049,763]],[[253748,353788],[-112,1282]],[[233306,359768],[-67,-1052],[1,-6427]],[[233240,352289],[-1054,-2]],[[232186,352287],[-1,6412],[65,1069]],[[231654,359760],[-1,-10708]],[[231653,349052],[-2,-4884],[-743,12]],[[230908,344180],[41,1148],[-278,232],[-357,1844],[-191,-673],[-230,2345],[-236,376],[-145,2238],[-299,-1766],[-371,677]],[[228842,350601],[273,1701],[-395,-68]],[[228720,352234],[-26,1706],[357,-36],[129,1256],[379,564],[8,4038]],[[224566,359758],[31,-9970]],[[224597,349788],[-210,-1342],[-482,1078],[-172,1064],[-325,12]],[[223408,350600],[-48,1718],[-452,3424],[-433,679]],[[222475,356421],[0,1]],[[222475,356422],[-448,3349]],[[234421,359772],[22,-6122]],[[234443,353650],[-18,-2995]],[[234425,350655],[-897,9]],[[233528,350664],[-1,1625],[-287,0]],[[232186,352287],[-8,-3237]],[[232178,349050],[-525,2]],[[227582,359757],[-1,-7542]],[[227581,352215],[-1788,-1]],[[225793,352214],[-22,7532]],[[225793,352214],[0,-2428]],[[225793,349786],[-1196,2]],[[228720,352234],[-1136,-19]],[[227584,352215],[-3,0]],[[235505,355434],[1,-1837]],[[235506,353597],[-1063,53]],[[222475,356421],[0,-4177],[-865,-45]],[[221610,352199],[-1108,8]],[[220502,352207],[2,7605]],[[203776,359694],[98,-2074],[-26,-3169],[117,-4650],[-91,-2222],[-239,-893],[559,-1233],[337,-2424],[573,-1622]],[[205104,341407],[-115,-753],[-407,115]],[[204582,340769],[2,439],[-988,-6],[48,-1326],[-533,2]],[[203111,339878],[-7,660]],[[203104,340538],[1,655],[-1776,-49],[0,4052],[-2059,59]],[[199270,345255],[16,10890],[481,2044],[69,1592]],[[199270,345255],[-7,-4085]],[[199263,341170],[-3954,38]],[[195309,341208],[2,18556]],[[195309,341208],[0,-19410]],[[195309,321798],[-1,-7083]],[[195308,314715],[-3,-14913]],[[195305,299802],[-837,-13],[-15,-900],[-398,-1421]],[[194055,297468],[-881,-3135],[-222,1553]],[[212146,359782],[0,-9302]],[[212146,350480],[-110,1],[3,-8289]],[[212039,342192],[-2,-5881]],[[212037,336311],[-929,13]],[[211108,336324],[28,6448],[-1196,-12],[1,1644],[-599,9],[0,810]],[[209342,345223],[3,14488]],[[214861,359653],[-12,-9170]],[[214849,350483],[-362,-4]],[[214487,350479],[-2341,1]],[[217877,359752],[-24,-9286]],[[217853,350466],[-365,-7]],[[217488,350459],[-1501,5]],[[215987,350464],[-1138,19]],[[220502,352207],[-2,-1740]],[[220500,350467],[-1510,-6]],[[218990,350461],[-1137,5]],[[284801,354340],[42,-1109]],[[284877,353154],[-51,-1711]],[[284826,351443],[-1,-153]],[[284825,351290],[-691,44]],[[284134,351334],[-370,-26]],[[283764,351308],[-248,1789],[-323,550],[200,692]],[[263478,357307],[2,-789],[-559,-4123]],[[262921,352395],[-20,2]],[[262901,352397],[-528,227]],[[262373,352624],[-249,4527]],[[205965,359691],[58,-1482],[-85,-3570],[-387,-996],[-22,-2199],[163,-1118],[-61,-4279]],[[205631,346047],[-184,-448],[-36,-1983],[-307,-2209]],[[209342,345223],[-1191,14]],[[208151,345237],[-1196,-14],[2,803],[-1326,21]],[[239166,356371],[-30,-5933]],[[239136,350438],[-750,14]],[[238386,350452],[29,5979],[-103,1914]],[[162899,346141],[-231,-1190],[-456,1973],[-261,-928],[-61,1185],[-572,3411],[-183,-60],[-19,1981],[-417,1414],[44,778],[-533,3123]],[[265430,353958],[-148,-1853]],[[265282,352105],[-222,46]],[[265060,352151],[-603,35]],[[264457,352186],[-224,1544],[-135,2569],[163,2476]],[[286870,358327],[-79,-1657]],[[286791,356670],[-328,768],[3,1656],[404,-767]],[[264457,352186],[-96,-2]],[[264361,352184],[-1440,211]],[[266591,353542],[-596,-1193]],[[265995,352349],[-713,-244]],[[251680,358786],[-1,-3231]],[[251679,355555],[-863,221]],[[252591,355134],[-9,-4639]],[[252582,350495],[-78,9]],[[252504,350504],[-835,20]],[[251669,350524],[10,5031]],[[261703,357073],[-226,-4256]],[[261477,352817],[-391,-141]],[[261086,352676],[-444,3719]],[[259581,354615],[12,-1749]],[[259593,352866],[-647,210]],[[258946,353076],[-576,206]],[[258370,353282],[16,2332]],[[238386,350452],[-787,-3]],[[237599,350449],[-586,0]],[[237013,350449],[23,4637]],[[287748,351418],[-69,0]],[[287679,351418],[-139,3114],[-110,-3118]],[[287430,351414],[-90,0]],[[287340,351414],[-61,2]],[[287279,351416],[-242,-2]],[[287037,351414],[1,2143],[150,496],[-378,1441],[-61,1239]],[[286749,356733],[42,-63]],[[286870,358327],[530,-179],[348,-6730]],[[274940,354358],[-364,-882],[-48,-1926]],[[274528,351550],[-629,24]],[[273899,351574],[-213,1696]],[[273686,353270],[-50,397]],[[273636,353667],[-307,2510]],[[270321,353193],[-338,-940]],[[269983,352253],[-141,1]],[[269842,352254],[-106,2116]],[[271759,353055],[-114,-499]],[[271645,352556],[-501,43]],[[271144,352599],[-890,-363]],[[270254,352236],[67,957]],[[247959,352904],[-202,-2471]],[[247757,350433],[-990,13]],[[246767,350446],[-44,3365],[-197,2460]],[[286206,357292],[36,565]],[[286206,357292],[-103,-959],[-95,-4917]],[[286008,351416],[-140,0]],[[285868,351416],[-1042,27]],[[285916,358061],[-22,-1250],[348,1046]],[[163911,339436],[276,-2210]],[[164187,337226],[-3149,125]],[[161038,337351],[-326,1746],[-77,1735],[-231,787],[-396,3161],[-503,2053],[-222,5105],[442,1739],[40,3417]],[[283764,351308],[-1310,11]],[[268512,356056],[-491,-2310],[-105,-1529]],[[267916,352217],[-1356,67]],[[266560,352284],[-565,65]],[[281677,351294],[-774,-7]],[[280903,351287],[-371,-27]],[[280532,351260],[-772,-7]],[[262373,352624],[-838,204]],[[261535,352828],[-58,-11]],[[245263,356498],[-29,-6068]],[[245234,350430],[-782,-12]],[[244452,350418],[-119,11]],[[244333,350429],[-620,34]],[[269842,352254],[-878,-31]],[[268964,352223],[-617,-6]],[[268347,352217],[-431,0]],[[258370,353282],[-422,-315]],[[257948,352967],[-559,277]],[[276118,355953],[-148,-277],[114,-4413]],[[276084,351263],[-1077,152]],[[275007,351415],[-479,135]],[[250246,352928],[-253,-2473]],[[249993,350455],[-186,-21]],[[249807,350434],[-151,5]],[[249656,350439],[-18,-3004]],[[249638,347435],[-129,1228],[-367,441],[-80,-746],[-582,45]],[[248480,348403],[6,4476]],[[286305,356800],[-51,-466]],[[286570,356468],[-316,-134]],[[286570,356468],[124,213]],[[286694,356681],[55,52]],[[287037,351414],[-532,-2]],[[286505,351412],[-497,4]],[[286305,356800],[-99,492]],[[277028,351253],[-871,10]],[[276157,351263],[-73,0]],[[181366,356861],[18,-12097],[-305,-3169],[-223,-192],[-381,2417],[-725,-8],[-350,-1053],[144,-4362],[76,-6300],[227,-3470],[73,-3058],[-216,-1125],[36,-1876]],[[179740,322568],[-2834,15078]],[[261086,352676],[-980,65]],[[260106,352741],[-513,125]],[[246767,350446],[-580,-1]],[[246187,350445],[-953,-15]],[[240668,356171],[-20,-5742]],[[240648,350429],[-227,4]],[[240421,350433],[-1234,7]],[[239187,350440],[-51,-2]],[[223408,350600],[12,-6428]],[[223420,344172],[-1187,51]],[[222233,344223],[-596,-4],[-27,7980]],[[273636,353667],[50,-397]],[[273899,351574],[-178,50]],[[273721,351624],[-1258,239]],[[272463,351863],[-903,250]],[[271560,352113],[85,443]],[[242465,350452],[-84,-5]],[[242381,350447],[-1055,0]],[[241326,350447],[-678,-18]],[[251669,350524],[-28,4]],[[251641,350528],[-22,-4]],[[251619,350524],[-191,1382],[-763,1410]],[[237013,350449],[-1507,13]],[[235506,350462],[0,3135]],[[253748,353788],[47,-3358]],[[253795,350430],[-1213,65]],[[170339,337195],[-4266,60]],[[166073,337255],[29,8917],[143,-16],[5,2474],[-284,1630]],[[254944,353043],[136,-5034]],[[255080,348009],[-640,-725],[-443,466]],[[253997,347750],[-26,131]],[[253971,347881],[-176,2549]],[[235506,350462],[154,-6283]],[[235660,344179],[-653,-10]],[[235007,344169],[-597,8]],[[234410,344177],[15,6478]],[[257414,348712],[-201,-1047],[-242,621]],[[256971,348286],[-207,-250],[-369,1607]],[[256395,349643],[15,3480]],[[257948,352967],[-373,-4227],[-161,-28]],[[258946,353076],[-66,-2837]],[[258880,350239],[-152,-2605]],[[258728,347634],[-470,-221],[-397,-1687]],[[257861,345726],[-447,2986]],[[251619,350524],[-1425,9]],[[250194,350533],[-201,-78]],[[256395,349643],[-463,-2485]],[[255932,347158],[-632,238]],[[255300,347396],[-220,613]],[[278065,351243],[-356,-10]],[[260035,350463],[-39,-1632]],[[259996,348831],[-420,265]],[[259576,349096],[-528,339],[-168,804]],[[260106,352741],[-71,-2278]],[[248480,348403],[6,-7256]],[[248486,341147],[-919,-50]],[[247567,341097],[-247,-13]],[[247320,341084],[102,953]],[[247422,342037],[419,2876]],[[247841,344913],[353,1892],[-44,1811],[-209,1819],[-184,-2]],[[262901,352397],[149,-1465]],[[263050,350932],[-592,1050],[-298,-536],[-193,-2703]],[[261967,348743],[-458,2312]],[[261509,351055],[26,1773]],[[261509,351055],[-433,-573],[-153,-1811]],[[260923,348671],[-582,2219],[-306,-427]],[[270706,350628],[-572,-2009],[-308,-73]],[[269826,348546],[-389,912],[-672,-256]],[[268765,349202],[199,3021]],[[270254,352236],[-271,17]],[[271144,352599],[-438,-1971]],[[271560,352113],[-142,-3665]],[[271418,348448],[-528,-1943]],[[270890,346505],[-41,-397]],[[270849,346108],[-351,1893],[300,1976],[-92,651]],[[264361,352184],[5,-1438],[-252,-900],[56,-3382],[-120,-1264]],[[264050,345200],[-190,-992]],[[263860,344208],[-474,1989],[-250,1871]],[[263136,348068],[117,454],[-203,2410]],[[266560,352284],[206,-1169],[31,-2258]],[[266797,348857],[-174,-720],[-607,-562]],[[266016,347575],[-183,13],[-202,1691],[-279,-297]],[[265352,348982],[-292,3169]],[[228842,350601],[-61,-3232],[298,0],[0,-1617]],[[229079,345752],[-602,-1],[-1,-1624],[-593,-2]],[[227883,344125],[-297,101]],[[227586,344226],[-2,7989]],[[268347,352217],[-502,-559],[-752,-3147]],[[267093,348511],[-296,346]],[[233528,350664],[-299,-2],[-14,-8097]],[[233215,342565],[-365,1],[-131,1627],[-399,1]],[[232320,344194],[-150,-1],[8,4857]],[[265352,348982],[-275,-2785]],[[265077,346197],[-193,-790],[-429,315],[-38,-1252],[-367,730]],[[268765,349202],[-61,-397]],[[268704,348805],[-665,-1448],[-393,-1682]],[[267646,345675],[-224,1917],[-258,-1046]],[[267164,346546],[-71,1965]],[[227586,344226],[-599,4]],[[226987,344230],[-1193,4]],[[225794,344234],[-1,5552]],[[222233,344223],[3,-2818]],[[222236,341405],[-226,-158],[-275,-2614],[-162,-422],[-441,841],[-101,2156],[-521,-2268]],[[220510,338940],[0,3261]],[[220510,342201],[-10,8266]],[[272463,351863],[277,-3899]],[[272740,347964],[-622,-2325]],[[272118,345639],[-700,2809]],[[263136,348068],[-494,-1684],[-81,-2308]],[[262561,344076],[-537,-332]],[[262024,343744],[-54,115]],[[261970,343859],[103,956],[-106,3928]],[[273721,351624],[-182,-2986]],[[273539,348638],[-167,-516],[-189,1242],[-443,-1400]],[[230908,344180],[-82,5]],[[230826,344185],[-902,-44]],[[229924,344141],[-550,-15],[0,1626],[-295,0]],[[275007,351415],[-33,-5379]],[[274974,346036],[-1,-378]],[[274973,345658],[-247,762],[-926,-859]],[[273800,345561],[12,1685],[-273,1392]],[[285868,351416],[140,-749]],[[286008,350667],[106,-2464]],[[286114,348203],[-296,-486]],[[285818,347717],[-335,-961]],[[285483,346756],[-266,1180],[-452,774]],[[284765,348710],[60,2580]],[[287331,347551],[-272,271],[-554,3590]],[[287279,351416],[112,-2597],[320,-2367],[229,-3945],[-412,3972],[-197,1072]],[[287748,351418],[261,-5943]],[[288009,345475],[-7,-9]],[[288002,345466],[-124,1107],[-199,4845]],[[276157,351263],[-22,-5309]],[[276135,345954],[-1161,82]],[[287331,347551],[294,-3319],[-296,418],[-595,3435]],[[286734,348085],[-726,2582]],[[282085,351303],[5,-704]],[[282090,350599],[-40,-2323],[-263,-3337]],[[281787,344939],[-837,1178]],[[280950,346117],[82,750],[-129,4420]],[[284010,345759],[-232,-1457]],[[283778,344302],[-264,840],[-153,2057],[-292,-389],[-26,2140],[-250,1169],[-703,480]],[[284134,351334],[123,-1350],[-247,-4225]],[[284765,348710],[428,-835],[170,-2171]],[[285363,345704],[-1353,55]],[[279587,351248],[-16,-5691]],[[279571,345557],[-415,60]],[[279156,345617],[-565,56]],[[278591,345673],[43,5576]],[[280950,346117],[-322,-1897],[-207,205]],[[280421,344425],[-40,5196],[151,1639]],[[280421,344425],[-138,-2849]],[[280283,341576],[-564,914]],[[279719,342490],[-155,442],[7,2625]],[[277597,351232],[-60,-5440]],[[277537,345792],[-1,-133]],[[277536,345659],[-1401,295]],[[278591,345673],[-288,31]],[[278303,345704],[-766,88]],[[261970,343859],[-836,1715],[-211,1218]],[[260923,346792],[0,1879]],[[260923,346792],[-350,-1703],[-444,506]],[[260129,345595],[-184,949],[51,2287]],[[283778,344302],[137,-1341],[-235,-398]],[[283680,342563],[-211,-1306]],[[283469,341257],[-343,603],[-21,992],[-459,1162]],[[282646,344014],[-526,-168],[-333,1093]],[[234410,344177],[-298,-3],[1,-1624],[-250,5]],[[233863,342555],[-648,10]],[[270849,346108],[-412,-3021]],[[270437,343087],[-395,999]],[[270042,344086],[-95,1419],[-234,366]],[[269713,345871],[113,2675]],[[286734,348085],[37,-1381],[441,-2720],[-295,-510],[-337,1726]],[[286580,345200],[-247,781],[-219,2222]],[[251641,350528],[29,-1722],[-373,-22],[-27,-3471]],[[251270,345313],[-542,-338]],[[250728,344975],[-915,150]],[[249813,345125],[341,3659],[40,1749]],[[225794,344234],[-297,0]],[[225497,344234],[-1188,0]],[[224309,344234],[-889,-62]],[[252504,350504],[-37,-6508]],[[252467,343996],[-452,-1664]],[[252015,342332],[-416,1162],[-329,1819]],[[249813,345125],[-408,-510]],[[249405,344615],[-185,1255],[449,35],[-218,1039],[187,491]],[[249807,350434],[-151,5]],[[215987,342196],[-1502,-4]],[[214485,342192],[2,8287]],[[215987,350464],[0,-8268]],[[253971,347881],[-287,-10],[29,-1851],[-361,-2614]],[[253352,343406],[3,475],[-888,115]],[[217486,342236],[0,-44]],[[217486,342192],[-1499,4]],[[217488,350459],[-2,-8223]],[[214485,342192],[-2446,0]],[[218990,350461],[-2,-8244]],[[218988,342217],[-1502,19]],[[220510,342201],[-1504,15]],[[219006,342216],[-18,1]],[[237599,350449],[-67,-2392],[210,-1186]],[[237742,346871],[-201,-1331]],[[237541,345540],[-238,-554],[-1004,172],[-161,-2143],[-448,53]],[[235690,343068],[-30,1111]],[[244333,350429],[-13,-3019],[-310,36],[-1,-1628],[-349,62]],[[243660,345880],[-1297,148]],[[242363,346028],[18,4419]],[[239187,350440],[-9,-7019]],[[239178,343421],[-500,72]],[[238678,343493],[-199,24],[-297,3289],[-440,65]],[[244452,350418],[273,-1429],[140,-3024]],[[244865,345965],[-253,-501],[-21,-6336]],[[244591,339128],[-295,860],[-689,92]],[[243607,340080],[77,1094],[-24,4706]],[[246124,346133],[-9,-2184]],[[246115,343949],[-921,327],[-329,1689]],[[246187,350445],[91,-4020],[-154,-292]],[[240421,350433],[-86,-130],[-16,-7014]],[[240319,343289],[-151,19]],[[240168,343308],[-990,113]],[[241326,350447],[-51,-4301],[214,-302],[163,-1657],[2,-1854]],[[241654,342333],[-1188,137],[-147,819]],[[242363,346028],[-109,-2389]],[[242254,343639],[-4,-1372],[-299,33],[-7,-1620],[-298,35]],[[241646,340715],[8,1618]],[[247841,344913],[-363,-14],[3,1092],[-1357,142]],[[166073,337255],[-1825,-24]],[[164248,337231],[-61,-5]],[[259576,349096],[-441,-2425]],[[259135,346671],[-407,963]],[[256971,348286],[-234,-4732],[-157,-1542]],[[256580,342012],[-358,78]],[[256222,342090],[31,3291]],[[256253,345381],[-11,1627],[-310,150]],[[269713,345871],[-270,-1826],[-440,-1091]],[[269003,342954],[-147,935],[39,5066],[-191,-150]],[[273800,345561],[-24,-3359]],[[273776,342202],[-410,-186]],[[273366,342016],[-834,-921]],[[272532,341095],[-604,2256]],[[271928,343351],[190,2288]],[[266016,347575],[-182,-3347]],[[265834,344228],[-583,406]],[[265251,344634],[-174,1563]],[[260129,345595],[-76,-1981]],[[260053,343614],[-159,-706],[-544,-143]],[[259350,342765],[-215,3906]],[[249405,344615],[100,-1065],[-238,-811],[-78,-1540]],[[249189,341199],[-703,-52]],[[232320,344194],[0,-4873],[-163,-839]],[[232157,338482],[-593,17]],[[231564,338499],[9,4068],[-746,8],[-1,1610]],[[267164,346546],[-203,141],[-387,-2271]],[[266574,344416],[-254,92],[-305,-1843]],[[266015,342665],[-181,1563]],[[257861,345726],[219,-2689]],[[258080,343037],[-288,-2464]],[[257792,340573],[-469,1261],[-395,312],[-275,-1179],[-73,1045]],[[269003,342954],[-22,-1048]],[[268981,341906],[-95,483],[-414,-1436],[-99,-1242],[-215,430]],[[268158,340141],[0,1]],[[268158,340142],[-746,4390]],[[267412,344532],[234,1143]],[[271928,343351],[-738,-110]],[[271190,343241],[-274,1942],[-26,1322]],[[286580,345200],[260,-2059],[-166,-58],[-563,1793],[417,-1963],[-516,-159]],[[286012,342754],[-231,471],[37,4492]],[[263860,344208],[277,-2133]],[[264137,342075],[-291,-1173],[-653,-1442]],[[263193,339460],[-112,1610],[-520,3006]],[[255300,347396],[-148,-2919]],[[255152,344477],[-646,1243],[-422,-29]],[[254084,345691],[-87,2059]],[[254084,345691],[77,-2250],[-252,-3270],[243,-246],[-104,-1722]],[[254048,338203],[-22,-470]],[[254026,337733],[-578,561]],[[253448,338294],[-109,14],[13,5098]],[[259350,342765],[125,-2327]],[[259475,340438],[-385,-123]],[[259090,340315],[-438,450],[-572,2272]],[[286012,342754],[225,-326],[-290,-1136],[-496,1123],[-83,1530],[115,2811]],[[267412,344532],[-191,-1784]],[[267221,342748],[-165,990],[-482,678]],[[256222,342090],[-60,-1686]],[[256162,340404],[-921,638]],[[255241,341042],[-89,3435]],[[238678,343493],[80,-2934],[-203,-1599],[13,-2199]],[[238568,336761],[-493,96]],[[238075,336857],[-599,-165]],[[237476,336692],[-145,21]],[[237331,336713],[52,6147],[158,2680]],[[262024,343744],[-409,-705],[-49,-2263]],[[261566,340776],[-126,977],[-554,938],[-379,-1246]],[[260507,341445],[-454,2169]],[[265251,344634],[-424,-2187],[97,-598],[-378,-805],[-214,-1553]],[[264332,339491],[-195,2584]],[[274973,345658],[38,-1939],[-162,-1685]],[[274849,342034],[-546,79]],[[274303,342113],[-527,89]],[[271190,343241],[205,-849],[-197,-1935]],[[271198,340457],[-257,707]],[[270941,341164],[-122,-754]],[[270819,340410],[-107,-893]],[[270712,339517],[-146,572],[-129,2998]],[[281787,344939],[-692,-7162]],[[281095,337777],[-139,1398],[-673,2401]],[[247320,341084],[-33,-576],[-1290,60]],[[245997,340568],[118,3381]],[[208151,345237],[293,-4778],[-163,-1891],[63,-1472]],[[208344,337096],[-1781,-187],[-951,1848],[-1038,6]],[[204574,338763],[8,2006]],[[276135,345954],[-22,-4592]],[[276113,341362],[-980,-698]],[[275133,340664],[-284,1370]],[[243607,340080],[-387,-1384]],[[243220,338696],[-296,1224],[-438,78],[155,1793],[-387,1848]],[[270042,344086],[-542,-1570]],[[269500,342516],[-247,-1768]],[[269253,340748],[-294,-190],[22,1348]],[[245997,340568],[-63,-1620],[-438,76]],[[245496,339024],[-464,93]],[[245032,339117],[-441,11]],[[277536,345659],[-27,-6364]],[[277509,339295],[-1406,392]],[[276103,339687],[10,1675]],[[278303,345704],[22,-6834]],[[278325,338870],[33,-603],[-850,-17]],[[277508,338250],[1,1045]],[[229924,344141],[1,-4065]],[[229925,340076],[-1447,8]],[[228478,340084],[-594,800],[-1,3241]],[[255241,341042],[-480,-1635],[-27,-1245]],[[254734,338162],[-379,-650],[-307,691]],[[285363,345704],[-90,-1720],[200,-3016],[-54,-1230]],[[285419,339738],[-161,-1089]],[[285258,338649],[0,-1]],[[285258,338649],[-207,364],[-191,-1126],[-97,1433],[-186,-785],[-144,1522],[-394,-15],[-22,1228],[-337,1293]],[[279156,345617],[-183,-6999]],[[278973,338618],[-648,252]],[[279719,342490],[139,-1156],[-370,-2639],[-207,11]],[[279281,338706],[-308,-88]],[[237331,336713],[-1478,-32]],[[235853,336681],[-163,6387]],[[287690,334442],[-349,563]],[[287341,335005],[74,4092],[488,660],[174,-762],[41,-4814],[-337,-751],[-91,1012]],[[288009,345475],[568,-6870],[-469,3339],[-106,3522]],[[252015,342332],[-40,-5057]],[[251975,337275],[-583,117]],[[251392,337392],[-539,1204],[-221,2559]],[[250632,341155],[96,3820]],[[203104,340538],[-422,-118],[-2,-2837],[423,-966]],[[203103,336617],[9,-10066]],[[203112,326551],[-2650,80]],[[200462,326631],[-119,1601],[-198,-3]],[[200145,328229],[4,12910],[-886,31]],[[211108,336324],[-14,-6367],[-716,-155]],[[210378,329802],[-244,606],[-702,7065],[-124,-377],[-964,0]],[[250632,341155],[-254,-2106],[-175,-101]],[[250203,338948],[-180,1222],[-661,-786]],[[249362,339384],[-173,1815]],[[282646,344014],[-362,-5323]],[[282284,338691],[-1014,-2547]],[[281270,336144],[-175,1633]],[[267221,342748],[-212,-3523]],[[267009,339225],[-457,517],[-553,2139]],[[265999,341881],[16,784]],[[265999,341881],[52,-1240],[-389,-1579]],[[265662,339062],[-165,-855],[-257,652],[-539,-385],[-75,-938]],[[264626,337536],[-271,1710]],[[264355,339246],[-23,245]],[[268158,340141],[-176,-2867]],[[267982,337274],[-326,-27],[-492,-1365]],[[267164,335882],[-1,-24]],[[267163,335858],[-154,3367]],[[263193,339460],[-282,-1555]],[[262911,337905],[-375,-1179]],[[262536,336726],[-941,75]],[[261595,336801],[0,25]],[[261595,336826],[-52,385]],[[261543,337211],[10,106]],[[261553,337317],[156,2178],[-143,1281]],[[226987,344230],[5,-8168]],[[226992,336062],[-1485,-16]],[[225507,336046],[-10,8188]],[[228478,340084],[-1,-4054]],[[228477,336030],[-1485,32]],[[225507,336046],[-296,-3],[0,-3229]],[[225211,332814],[-863,2]],[[224348,332816],[-25,4855]],[[224323,337671],[-14,6563]],[[224323,337671],[-2072,-4]],[[222251,337667],[-15,3738]],[[231564,338499],[-444,3],[-1,-4058]],[[231119,334444],[-1192,-1]],[[229927,334443],[-2,5633]],[[233863,342555],[-208,-1974],[145,-1820],[-98,-1074]],[[233702,337687],[-1043,-408],[-29,1219],[-323,-7]],[[232307,338491],[-150,-9]],[[235007,344169],[-28,-9734]],[[234979,334435],[-892,6]],[[234087,334441],[0,3236],[-385,10]],[[235853,336681],[58,-2247]],[[235911,334434],[-932,1]],[[270712,339517],[-422,-1622]],[[270290,337895],[-183,3520],[-607,1101]],[[283469,341257],[168,-1847],[-22,-1611]],[[283615,337799],[-112,244],[-755,-2883]],[[282748,335160],[-250,2798],[-214,733]],[[253448,338294],[-3,-541]],[[253445,337753],[-1089,148],[-102,-658]],[[252254,337243],[-279,32]],[[260507,341445],[21,-2479],[-126,-943]],[[260402,338023],[-565,156]],[[259837,338179],[-362,2259]],[[243220,338696],[34,-3025]],[[243254,335671],[-1124,134]],[[242130,335805],[-496,72],[5,1351]],[[241639,337228],[7,3487]],[[240168,343308],[-18,-7271]],[[240150,336037],[-594,79]],[[239556,336116],[-989,104],[1,541]],[[272532,341095],[-16,-3720]],[[272516,337375],[-83,-532]],[[272433,336843],[-535,176],[-700,3438]],[[241639,337228],[-595,42],[-2,-1349],[-498,75]],[[240544,335996],[-394,41]],[[259090,340315],[-150,-4665]],[[258940,335650],[-106,-1338]],[[258834,334312],[-300,532],[-141,-775],[-313,1293],[-345,-45]],[[257735,335317],[-130,449]],[[257605,335766],[203,1497],[-16,3310]],[[270290,337895],[-396,-2233]],[[269894,335662],[-202,1972],[-170,143]],[[269522,337777],[-269,2971]],[[261553,337317],[-455,475],[-475,-445]],[[260623,337347],[-221,676]],[[281095,337777],[-585,-2047],[-679,-3519]],[[279831,332211],[-571,1186]],[[279260,333397],[-227,517],[248,4792]],[[285258,338648],[-235,-2967]],[[285023,335681],[-392,-875],[-524,1390]],[[284107,336196],[-492,1603]],[[269522,337777],[-293,-274],[-813,-2185],[-219,-149]],[[268197,335169],[-215,2105]],[[275133,340664],[83,-1448],[-296,-1329],[32,-1467]],[[274952,336420],[-480,1873],[-210,137]],[[274262,338430],[41,3683]],[[219006,342216],[1,-8139]],[[219007,334077],[-1521,-4]],[[217486,334073],[0,114]],[[217486,334187],[0,8005]],[[220510,338940],[0,-4867]],[[220510,334073],[-1503,4]],[[217486,334187],[-1496,-22]],[[215990,334165],[-3,8031]],[[214485,342192],[1,-7963]],[[214486,334229],[-2449,-95]],[[212037,334134],[0,2177]],[[274262,338430],[-178,-3320],[96,-3115]],[[274180,331995],[-135,-24]],[[274045,331971],[-450,-339]],[[273595,331632],[-36,1117]],[[273559,332749],[96,1381],[-522,2938]],[[273133,337068],[300,3339],[-67,1609]],[[215990,334165],[0,-71]],[[215990,334094],[-1504,-3]],[[214486,334091],[0,138]],[[257605,335766],[-267,-59]],[[257338,335707],[-1207,2676]],[[256131,338383],[31,2021]],[[273133,337068],[-79,883],[-538,-576]],[[263585,335029],[-124,-484]],[[263461,334545],[-99,4]],[[263362,334549],[-9,1249],[-281,766]],[[263072,336564],[-161,1341]],[[264355,339246],[-770,-4217]],[[267163,335858],[4,-355]],[[267167,335503],[-680,-2475],[-459,116]],[[266028,333144],[-109,2607],[-257,3311]],[[276103,339687],[-56,-7726]],[[276047,331961],[-323,-24]],[[275724,331937],[-70,1389],[-359,2653],[-343,441]],[[222251,337667],[32,-5647]],[[222283,332020],[-589,1],[-2,-1624],[-1182,13]],[[220510,330410],[0,3663]],[[200145,328229],[-3228,29],[-2,-6474],[-1606,14]],[[204574,338763],[16,-15442]],[[204590,323321],[-1474,-28]],[[203116,323293],[-4,3258]],[[203103,336617],[208,1296],[-208,257]],[[203103,338170],[0,312]],[[203103,338482],[8,1396]],[[249362,339384],[-275,31],[115,-1382],[-335,-1404],[-366,-378],[270,-1925],[-281,-846],[135,-919]],[[248625,332561],[-364,176],[-4,-2806]],[[248257,329931],[-36,-137]],[[248221,329794],[-36,1335],[-212,-483]],[[247973,330646],[-400,66]],[[247573,330712],[0,4865]],[[247573,335577],[-6,5520]],[[272433,336843],[-475,-3705]],[[271958,333138],[-10,-83]],[[271948,333055],[-430,282]],[[271518,333337],[-367,-86]],[[271151,333251],[-126,2692],[-326,1639],[222,1422],[-102,1406]],[[251392,337392],[-291,-2345],[-136,397]],[[250965,335444],[-553,1154],[-247,1169]],[[250165,337767],[38,1181]],[[247573,335577],[-2090,162]],[[245483,335739],[13,3285]],[[286926,335501],[-145,-1821],[-233,206],[79,1506],[-351,140]],[[286276,335532],[78,4358]],[[286354,339890],[552,1171],[303,-80],[50,-5636],[-333,156]],[[256131,338383],[-53,-2345],[-292,-1220]],[[255786,334818],[-336,-820],[-354,712],[-199,-818]],[[254897,333892],[-239,1015],[76,3255]],[[286276,335532],[-676,145]],[[285600,335677],[-577,4]],[[285419,339738],[847,1102],[88,-950]],[[203103,338482],[0,-312]],[[259837,338179],[-278,-1956],[-1,-1386]],[[259558,334837],[-289,-248],[-329,1061]],[[271151,333251],[-416,-936],[-546,60]],[[270189,332375],[-338,1184],[43,2103]],[[250165,337767],[-126,96],[-281,-4503]],[[249758,333360],[-309,1168],[-404,124],[-420,-2091]],[[229927,334443],[-12,-3281]],[[229915,331162],[-1439,22]],[[228476,331184],[1,4846]],[[245032,339117],[-92,-1440],[-340,-1929],[-44,-3402],[-591,77]],[[243965,332423],[-591,68]],[[243374,332491],[12,3306],[-132,-126]],[[277508,338250],[-37,-6115]],[[277471,332135],[-595,-66]],[[276876,332069],[-829,-108]],[[264626,337536],[88,-2617],[-150,-1005]],[[264564,333914],[-285,822],[-464,206],[-191,-774]],[[263624,334168],[-163,377]],[[245483,335739],[-6,-4945]],[[245477,330794],[-2,-1651]],[[245475,329143],[-590,63],[-3,1642],[-263,-127]],[[244619,330721],[-662,64],[8,1638]],[[266028,333144],[-304,-143],[-504,-1878]],[[265220,331123],[-22,58]],[[265198,331181],[-124,1694],[-214,-289],[-296,1328]],[[279260,333397],[-157,-1140]],[[279103,332257],[-411,1984],[-405,-1720],[-166,127]],[[278121,332648],[-77,-460]],[[278044,332188],[-573,-53]],[[210378,329802],[0,-2771],[-614,433],[-745,-2270]],[[209019,325194],[-2,1368],[-3247,12],[1,-3243]],[[205771,323331],[-1181,-10]],[[282748,335160],[-108,-471]],[[282640,334689],[-343,-1479]],[[282297,333210],[-672,237]],[[281625,333447],[-169,331],[-186,2366]],[[275724,331937],[-313,-27]],[[275411,331910],[-1231,85]],[[232307,338491],[0,-2433],[148,-23],[1,-3216]],[[232456,332819],[-305,-2],[-149,-3256],[-295,1]],[[231707,329562],[-295,1],[-1,3262],[-292,-4],[0,1623]],[[234087,334441],[-14,-2089],[230,-1261]],[[234303,331091],[-538,-3686],[-283,598]],[[233482,328003],[-1,4815],[-1025,1]],[[260623,337347],[23,-3296],[103,-1581]],[[260749,332470],[-138,-25]],[[260611,332445],[-753,-140]],[[259858,332305],[-300,2532]],[[257338,335707],[-156,-2905],[-342,-2492]],[[256840,330310],[-446,716],[-239,-414]],[[256155,330612],[-245,215]],[[255910,330827],[24,1814],[-148,2177]],[[254026,337733],[-164,-1607],[-17,-2092],[167,-1717],[-89,-1888]],[[253923,330429],[-48,-579]],[[253875,329850],[-477,-215],[-128,791]],[[253270,330426],[-3,1967],[147,1493],[31,3867]],[[254897,333892],[-166,-2346]],[[254731,331546],[-712,-436],[-96,-681]],[[284107,336196],[0,-1815],[235,-1426]],[[284342,332955],[-25,-150]],[[284317,332805],[-216,-594],[-40,-1864]],[[284061,330347],[-198,-1249],[-361,-217]],[[283502,328881],[-237,1612]],[[283265,330493],[-76,1699],[-549,2497]],[[273559,332749],[-1601,389]],[[270189,332375],[-269,-1121]],[[269920,331254],[-1335,-829]],[[268585,330425],[-153,883],[95,1791],[-330,2070]],[[263072,336564],[-195,-3681],[-172,-21],[-175,-2137],[-273,-558]],[[262257,330167],[-331,919]],[[261926,331086],[76,2096],[534,3544]],[[261543,337211],[52,-385]],[[261595,336801],[-473,-3690]],[[261122,333111],[-373,-641]],[[253270,330426],[-331,-79]],[[252939,330347],[-8,1375],[-395,358],[-301,1417]],[[252235,333497],[19,3746]],[[250965,335444],[-26,-4865]],[[250939,330579],[-293,-638]],[[250646,329941],[-810,109]],[[249836,330050],[-78,3310]],[[281625,333447],[-251,-3124],[4,-1252],[-421,-1196]],[[280957,327875],[-522,-413],[-138,954]],[[280297,328416],[-332,3370],[-134,425]],[[224348,332816],[-1,-1627]],[[224347,331189],[-2064,20]],[[222283,331209],[0,811]],[[179740,322568],[3,-2452],[444,-2894],[103,-2182],[267,-2704],[564,-2760]],[[181121,309576],[-326,-2417],[-494,-1592]],[[180301,305567],[-2460,-124],[1,-805],[-4499,-63],[2,-553],[-829,-9],[-928,528],[-315,-3026]],[[171273,301515],[-312,1400]],[[170961,302915],[145,1407],[238,4958],[-64,9969]],[[171280,319249],[98,4],[-3,18110]],[[164248,337231],[-3,-3233],[301,-23],[0,-1605],[244,-1640],[325,-33],[5,-1631],[192,12],[4,-1614],[397,-45],[3,-1614],[314,77],[-22,-1690],[246,-211],[0,-3299]],[[166254,320682],[-755,1375],[-936,2625],[-284,-1411],[-421,-724],[101,-1704],[-444,1648],[-536,-409]],[[162979,322082],[-5,3222],[-296,222],[-393,1771],[197,1535],[-165,1791],[-326,509],[-446,3198],[-339,588],[-168,2433]],[[171280,319249],[-3410,-90],[36,-551]],[[167906,318608],[-267,446],[-750,39],[-88,1202],[-462,376]],[[166339,320671],[-85,11]],[[252235,333497],[-177,-1852],[-458,-1134]],[[251600,330511],[-661,68]],[[242130,335805],[-34,-6486]],[[242096,329319],[-637,87]],[[241459,329406],[3,1623],[-1032,137]],[[240430,331166],[104,1602],[10,3228]],[[268585,330425],[-242,-1949],[-248,-496]],[[268095,327980],[-738,4146]],[[267357,332126],[82,740],[-272,2637]],[[238036,329533],[-270,1020],[-9,-2177],[-298,111],[-9,-1669],[-302,-290]],[[237148,326528],[-149,21],[20,4291]],[[237019,330840],[144,2397],[-140,1638],[249,-26],[204,1843]],[[238075,336857],[-39,-7324]],[[261926,331086],[-253,-1944]],[[261673,329142],[-494,2572],[-57,1397]],[[239556,336116],[-9,-2441],[-149,23],[-7,-2427],[-202,25],[-8,-2654]],[[239181,328642],[-294,242],[-94,1576],[-757,-927]],[[237019,330840],[-164,-1085],[-526,-532],[-175,1675],[-128,-957]],[[236026,329941],[-115,4493]],[[263362,334549],[-670,-5484]],[[262692,329065],[-240,-1164]],[[262452,327901],[-195,2266]],[[212037,334134],[-2,-8177]],[[212035,325957],[-1,-4264]],[[212034,321693],[-669,4],[-4,-1665],[-293,7],[-3,-1619],[-292,8],[-1,-1623],[-585,17],[-91,-1634]],[[210096,315188],[-586,7]],[[209510,315195],[-502,3],[-1,3241]],[[209007,318439],[12,6755]],[[284317,332805],[371,-2175],[955,-1730],[26,-1206]],[[285669,327694],[-54,-767],[-593,-358],[-140,698]],[[284882,327267],[-821,3080]],[[285600,335677],[126,-1604],[273,-883]],[[285999,333190],[-398,-1100],[175,-2297],[-1124,1768],[-310,1394]],[[240430,331166],[-12,-5402],[-114,-39]],[[240304,325725],[-550,-592],[-185,1872],[-331,1451]],[[239238,328456],[-57,186]],[[226992,336062],[8,-6492]],[[227000,329570],[-1,-749]],[[226999,328821],[0,-19]],[[226999,328802],[-475,-44],[-290,766],[-418,55]],[[225816,329579],[-586,-9],[-19,3244]],[[228476,331184],[-1,-1622]],[[228475,329562],[-1475,8]],[[243374,332491],[-161,-3273],[-723,82]],[[242490,329300],[-394,19]],[[257735,335317],[-73,-4276],[185,-1700]],[[257847,329341],[-411,-2087],[-227,202]],[[257209,327456],[-369,2854]],[[247573,330712],[-600,58]],[[246973,330770],[-1496,24]],[[286926,335501],[415,-496]],[[287690,334442],[20,-1175],[-419,-3065],[-333,-1394],[-288,214],[-380,1512],[-221,-1047],[-325,2540],[265,-143],[-10,1306]],[[259858,332305],[-101,-4380]],[[259757,327925],[-680,1377],[-289,-544]],[[258788,328758],[11,1469]],[[258799,330227],[35,4085]],[[258799,330227],[-519,-1708],[-228,632]],[[258052,329151],[-205,190]],[[267357,332126],[-461,-863],[33,-2552]],[[266929,328711],[-948,-960]],[[265981,327751],[263,2892],[-1024,480]],[[265198,331181],[-169,-1111],[-21,-2086]],[[265008,327984],[-272,-947],[-243,467],[-219,-1109]],[[264274,326395],[-566,1467]],[[263708,327862],[264,835],[-23,1267],[-316,3898]],[[263633,333862],[1,202]],[[263634,334064],[-10,104]],[[255910,330827],[-429,244],[-353,-1106]],[[255128,329965],[-397,1581]],[[283265,330493],[-572,-1458],[-346,398]],[[282347,329433],[-50,3777]],[[248221,329794],[-58,-95]],[[248163,329699],[-190,947]],[[249836,330050],[-441,-507]],[[249395,329543],[-1138,388]],[[263634,334064],[-1,-202]],[[263708,327862],[-580,-828]],[[263128,327034],[-436,2031]],[[236026,329941],[-4,-304]],[[236022,329637],[-175,-1477],[-443,-195],[-252,1214],[-191,-612]],[[234961,328567],[-77,886],[-581,1638]],[[231707,329562],[0,-1617]],[[231707,327945],[-1281,2]],[[230426,327947],[0,3299],[-261,-1414],[-247,176]],[[229918,330008],[-3,1154]],[[279103,332257],[-595,-3991]],[[278508,328266],[-251,855],[-213,3067]],[[214486,334091],[-13,-8132]],[[214473,325959],[-2438,-2]],[[217486,334073],[-2,-8135]],[[217484,325938],[-1494,19]],[[215990,325957],[0,8137]],[[219007,334077],[3,-8124]],[[219010,325953],[-1526,-15]],[[220510,330410],[0,-4461]],[[220510,325949],[-1500,4]],[[215990,325957],[-1517,2]],[[271518,333337],[-29,-4139],[-182,-3291]],[[271307,325907],[-296,68]],[[271011,325975],[-264,59]],[[270747,326034],[1,1307],[-511,2796],[-304,-278]],[[269933,329859],[-13,1395]],[[282347,329433],[-80,-3574]],[[282267,325859],[-165,-563],[-420,837],[-332,-60]],[[281350,326073],[-393,1802]],[[252939,330347],[-5,-701]],[[252934,329646],[-672,-91],[-323,-2399],[-173,1]],[[251766,327157],[-166,3354]],[[280297,328416],[-211,-1293]],[[280086,327123],[-581,255],[-754,-1252]],[[278751,326126],[-353,1413],[110,727]],[[271948,333055],[227,-2695]],[[272175,330360],[382,-2967],[-24,-1802]],[[272533,325591],[-107,26]],[[272426,325617],[-1119,290]],[[273595,331632],[-24,-1620]],[[273571,330012],[-1396,348]],[[261673,329142],[-449,-3851]],[[261224,325291],[-188,2236],[-289,965]],[[260747,328492],[203,1622],[-339,2331]],[[233482,328003],[-312,226]],[[233170,328229],[-399,-1548],[-1070,-1312]],[[231701,325369],[6,2576]],[[225816,329579],[10,-9732]],[[225826,319847],[-1469,0]],[[224357,319847],[-5,4513]],[[224352,324360],[-5,6829]],[[244619,330721],[-212,-1147],[105,-2458],[-223,-2903]],[[244289,324213],[-330,36],[-3,-1236],[-368,689],[-238,-589]],[[243350,323113],[-586,854],[-297,-183]],[[242467,323784],[23,5516]],[[260747,328492],[-422,-561],[-84,-1375],[-372,150]],[[259869,326706],[-112,1219]],[[188318,312721],[-108,-986]],[[188210,311735],[-183,-611],[-147,-4378],[653,-3],[-47,-2816]],[[188486,303927],[-643,1],[-1223,898],[-311,-3086],[-1306,2189],[-1641,-13]],[[183362,303916],[1,5933]],[[183363,309849],[-2,22528]],[[268095,327980],[-175,-2988],[-203,-1444],[134,-484]],[[267851,323064],[-277,-501]],[[267574,322563],[-1,-3]],[[267573,322560],[-644,6151]],[[274045,331971],[332,-4443],[324,-1102]],[[274701,326426],[-806,-3867]],[[273895,322559],[-185,1400]],[[273710,323959],[-377,-576],[22,1922]],[[273355,325305],[216,4707]],[[278751,326126],[-5,-338]],[[278746,325788],[-367,682],[-294,-913],[-345,-2209]],[[277740,323348],[-312,427],[-120,1819]],[[277308,325594],[-233,1635],[-199,4840]],[[277308,325594],[-662,369],[-623,-753]],[[276023,325210],[-58,1792],[126,2469],[-367,2466]],[[275411,331910],[-586,-5936]],[[274825,325974],[-124,452]],[[222283,331209],[11,-6489]],[[222294,324720],[-137,-41]],[[222157,324679],[-1041,42],[0,-1614],[-294,3]],[[220822,323110],[-312,20]],[[220510,323130],[0,2819]],[[276023,325210],[-562,989]],[[275461,326199],[-228,-565],[-408,340]],[[269933,329859],[-238,-2104],[-19,-1655]],[[269676,326100],[-619,-853]],[[269057,325247],[-122,2958],[-350,2220]],[[255128,329965],[-90,-7353]],[[255038,322612],[-1051,45]],[[253987,322657],[8,5395],[-120,1798]],[[230426,327947],[0,-3244],[-137,1],[-1,-3821]],[[230288,320883],[-667,-984],[-127,786]],[[229494,320685],[-2,9491],[426,-168]],[[265981,327751],[-64,-576]],[[265917,327175],[-396,127],[-315,-711],[-198,1393]],[[224352,324360],[-359,353],[-1699,7]],[[229494,320685],[-431,1199]],[[229063,321884],[-238,-1062],[-352,454]],[[228473,321276],[2,8286]],[[241459,329406],[-204,-4750]],[[241255,324656],[-449,-779],[-905,103]],[[239901,323980],[403,1745]],[[256155,330612],[-49,-8076]],[[256106,322536],[-1068,76]],[[234961,328567],[-3,-2253],[-315,-6],[0,-2676]],[[234643,323632],[-1174,5]],[[233469,323637],[0,1895],[-295,3],[-4,2694]],[[262452,327901],[-222,-2978],[129,-2605]],[[262359,322318],[-796,-48]],[[261563,322270],[-276,-33]],[[261287,322237],[-306,-7]],[[260981,322230],[247,1084],[-4,1977]],[[257209,327456],[-20,-5059]],[[257189,322397],[-1046,132]],[[256143,322529],[-37,7]],[[237148,326528],[-7,-1358],[-305,-767]],[[236836,324403],[-229,-383],[-21,-2059],[-606,-644]],[[235980,321317],[42,8320]],[[246973,330770],[-2,-5539]],[[246971,325231],[-1504,75]],[[245467,325306],[8,3837]],[[245467,325306],[-8,-2742],[-290,30]],[[245169,322594],[-399,-324],[-210,-1347]],[[244560,320923],[13,2577],[-284,713]],[[248163,329699],[-214,-2387],[219,-627],[20,-1533],[-293,-395],[-116,-1725],[-268,-566]],[[247511,322466],[186,-1296],[-172,-1230]],[[247525,319940],[-289,-503]],[[247236,319437],[-2,1326]],[[247234,320763],[22,4543],[-285,-75]],[[251766,327157],[-13,-4699]],[[251753,322458],[-101,0]],[[251652,322458],[-541,-5]],[[251111,322453],[-505,-9]],[[250606,322444],[40,7497]],[[283502,328881],[-231,-2074]],[[283271,326807],[-356,-2933],[-358,-1181]],[[282557,322693],[-108,2562],[-182,604]],[[239238,328456],[-4,-1941],[-493,49],[-203,-1309],[-493,-195],[5,-2146]],[[238050,322914],[-1029,136],[-185,1353]],[[269057,325247],[-524,-1430]],[[268533,323817],[-371,-223]],[[268162,323594],[-311,-530]],[[253987,322657],[-600,-192]],[[253387,322465],[-453,-3]],[[252934,322462],[-51,3]],[[252883,322465],[51,7181]],[[273355,325305],[-822,286]],[[285469,320638],[-203,-948],[-926,-816]],[[284340,318874],[-64,5013]],[[284276,323887],[204,503],[398,-2748],[591,-1004]],[[284882,327267],[-235,-2198],[118,-897]],[[284765,324172],[-259,864],[-282,-1162]],[[284224,323874],[-953,2933]],[[258788,328758],[-158,-3843]],[[258630,324915],[-206,2015],[-376,1415],[4,806]],[[249395,329543],[-32,-7084]],[[249363,322459],[-223,-9]],[[249140,322450],[-1629,16]],[[270747,326034],[-688,163]],[[270059,326197],[-383,-97]],[[250606,322444],[-430,-12]],[[250176,322432],[-813,27]],[[252883,322465],[-1130,-7]],[[235980,321317],[-18,-3815]],[[235962,317502],[-20,-4124]],[[235942,313378],[-1326,-11]],[[234616,313367],[-2,3239],[-338,-2]],[[234276,316604],[0,3244],[171,1607],[196,17],[0,2160]],[[226999,328802],[9,-8951]],[[227008,319851],[-1,-3236]],[[227007,316615],[-1172,1]],[[225835,316616],[-9,3231]],[[228473,321276],[-555,611],[-74,2247],[-845,4687]],[[258630,324915],[-2,-2532]],[[258628,322383],[-1295,15]],[[257333,322398],[-144,-1]],[[242467,323784],[-5,-1009]],[[242462,322775],[-297,41],[-5,-1617],[-876,479]],[[241284,321678],[-151,871],[122,2107]],[[259869,326706],[27,-4377]],[[259896,322329],[-1243,53]],[[258653,322382],[-25,1]],[[263128,327034],[11,-1303],[-212,-3409]],[[262927,322322],[-101,-5]],[[262826,322317],[-467,1]],[[200462,326631],[361,-4881]],[[200823,321750],[-379,16],[-5,-7060]],[[200439,314706],[-1451,-14]],[[198988,314692],[-3680,23]],[[229063,321884],[-7,-2046]],[[229056,319838],[-2048,13]],[[267573,322560],[-1043,-137]],[[266530,322423],[-489,3118],[-223,-91]],[[265818,325450],[99,1725]],[[285669,327694],[310,746],[30,-1788],[-452,-995],[295,-346],[-138,-1387],[-575,-2025],[-396,1477],[22,796]],[[260981,322230],[-364,32]],[[260617,322262],[-721,67]],[[281350,326073],[46,-5342],[-149,-3077],[243,-284]],[[281490,317370],[-394,-3132]],[[281096,314238],[-204,2184],[-465,3449]],[[280427,319871],[-419,2517],[-71,1882],[149,2853]],[[239901,323980],[-690,-4023],[1,-1632]],[[239212,318325],[-296,-555]],[[238916,317770],[-881,35]],[[238035,317805],[15,5109]],[[233469,323637],[-441,-557],[-20,-6469]],[[233008,316611],[1,-1619],[-439,-6]],[[232570,314986],[-587,-6],[0,1619],[-585,2]],[[231398,316601],[2,1620]],[[231400,318221],[7,5253],[294,1895]],[[265818,325450],[-331,-347],[-413,-2793]],[[265074,322310],[-349,6]],[[264725,322316],[-533,16]],[[264192,322332],[82,4063]],[[231400,318221],[-877,0]],[[230523,318221],[1,2620],[-236,42]],[[264192,322332],[-835,-2]],[[263357,322330],[-430,-8]],[[280427,319871],[-1132,-401]],[[279295,319470],[-372,2213]],[[278923,321683],[-155,1648],[-22,2457]],[[284224,323874],[52,13]],[[284340,318874],[-211,-331]],[[284129,318543],[-198,2128],[-360,239],[-380,1072],[-481,71]],[[282710,322053],[-153,640]],[[203116,323293],[0,-1615],[261,2],[1,-1550],[-729,1]],[[202649,320131],[-58,616],[-705,53],[-101,-673],[-844,4],[-118,1619]],[[209007,318439],[-587,-7],[1,-1615],[-294,-10],[-3,-1617],[-1242,-7],[0,-4792]],[[206882,310391],[-1173,-5]],[[205709,310386],[1,4846],[62,-6],[-1,8105]],[[270059,326197],[-28,-6431],[221,-1212]],[[270252,318554],[-254,-3697],[-212,-1915]],[[269786,312942],[-11,23]],[[269775,312965],[-379,2612],[-91,3608]],[[269305,319185],[-142,3645],[-154,854],[-476,133]],[[276023,325210],[227,-1072],[186,597],[147,-1356],[71,-2679],[-218,-1752]],[[276436,318948],[-6,0]],[[276430,318948],[-1089,137]],[[275341,319085],[120,7114]],[[278923,321683],[-437,-2239],[-436,98]],[[278050,319542],[11,671]],[[278061,320213],[-25,1291],[-296,1844]],[[275341,319085],[-679,65]],[[274662,319150],[-651,42],[43,2132],[-159,1235]],[[271464,320921],[-199,-1405],[-198,-4516]],[[271067,315000],[-604,2048],[-211,1506]],[[271011,325975],[333,-4682],[120,-372]],[[282710,322053],[66,-1015],[-81,-3692]],[[282695,317346],[-1205,24]],[[214473,325959],[-5,-8115]],[[214468,317844],[-992,-9]],[[213476,317835],[-1442,8]],[[212034,317843],[0,3850]],[[272173,319555],[-237,565]],[[271936,320120],[-472,801]],[[272426,325617],[-120,-2206],[-216,-215],[83,-3641]],[[219010,325953],[-5,-8103]],[[219005,317850],[-1126,11]],[[217879,317861],[-406,0]],[[217473,317861],[11,8077]],[[220510,323130],[0,-5304]],[[220510,317826],[-1158,20]],[[219352,317846],[-347,4]],[[215990,325957],[-18,-8108]],[[215972,317849],[-1028,11]],[[214944,317860],[-476,-16]],[[277740,323348],[-316,-945],[31,-1526],[-351,-1962]],[[277104,318915],[-668,33]],[[217473,317861],[-1061,-16]],[[216412,317845],[-440,4]],[[273710,323959],[112,-2797],[-91,-1953]],[[273731,319209],[-1617,15]],[[272114,319224],[59,331]],[[266530,322423],[-186,-14]],[[266344,322409],[-1079,-93]],[[265265,322316],[-191,-6]],[[247234,320763],[-1924,142],[-2,-829]],[[245308,320076],[-139,2518]],[[224357,319847],[-575,10],[0,-4860]],[[223782,314997],[-488,-1],[-284,811]],[[223010,315807],[139,1188],[-267,11],[14,2696],[-285,-467]],[[222611,319235],[-167,661],[-83,3113],[-204,1670]],[[284158,318179],[-29,364]],[[285469,320638],[29,1355],[695,561],[-107,-1081],[521,322],[-484,-2668],[-165,-1717],[-182,-44],[-131,1684],[-204,-1777],[-551,162],[-575,-954],[-157,1698]],[[222611,319235],[-441,-168],[-51,-1639],[-679,-8]],[[221440,317420],[-149,817],[-33,3268],[-436,-2],[0,1607]],[[164640,304627],[231,-1775],[-418,-877],[-322,2121],[509,531]],[[165054,305328],[976,-1440],[-461,-704],[-359,131],[-156,2013]],[[166339,320671],[-2,-7969],[-90,-1807]],[[166247,310895],[-250,760],[-867,-159],[-357,994],[-804,202],[-490,-416],[-116,1396],[-373,1056],[124,2395],[-24,2471],[-171,1150],[60,1338]],[[241284,321678],[-584,-794],[39,-1065]],[[240739,319819],[-931,86],[-3,-1605]],[[239805,318300],[-593,25]],[[238035,317805],[-614,-1483]],[[237421,316322],[-244,500],[-834,91],[-381,589]],[[244560,320923],[-20,-4593],[-199,25],[193,-1934]],[[244534,314421],[-604,81],[-3,-1622],[-230,23]],[[243697,312903],[96,2891],[-160,660],[20,4598],[-307,36],[4,2025]],[[269305,319185],[-840,-2741],[-145,-912]],[[268320,315532],[-168,2206],[10,5856]],[[243697,312903],[-75,13]],[[243622,312916],[-905,125]],[[242717,313041],[1,2457],[-235,29],[98,2072],[20,5168],[-139,8]],[[274662,319150],[434,-3775]],[[275096,315375],[-397,-1019],[74,-878],[-605,-586],[-6,1090],[-378,-1531]],[[273784,312451],[4,1591]],[[273788,314042],[49,2841],[-106,2326]],[[234276,316604],[-1268,7]],[[268320,315532],[-415,-2628]],[[267905,312904],[-174,218]],[[267731,313122],[-145,795]],[[267586,313917],[-653,2806]],[[266933,316723],[-40,540]],[[266893,317263],[305,3008],[323,1133],[53,1159]],[[205709,310386],[-2,-1614],[-1700,0]],[[204007,308772],[-1371,-6],[-3,3352]],[[202633,312118],[-147,1515],[16,6496],[147,2]],[[278050,319542],[43,-1242],[-360,-2633]],[[277733,315667],[-629,3248]],[[221440,317420],[1,-4034],[-493,-32]],[[220948,313354],[-223,1273],[-207,-261]],[[220518,314366],[-8,3460]],[[242717,313041],[-496,63]],[[242221,313104],[-106,14]],[[242115,313118],[5,1627],[-291,31],[-264,1665],[-303,325],[6,1345],[-291,53],[9,1622],[-247,33]],[[256004,318053],[-462,772]],[[255542,318825],[-243,556],[-714,-1852],[-404,1290],[-162,1541],[-347,181]],[[253672,320541],[-285,1924]],[[256143,322529],[-11,-3407],[-128,-1069]],[[245308,320076],[-7,-2464],[140,-1661]],[[245441,315951],[-7,-3254],[151,-26],[-6,-2481],[-150,6]],[[245429,310196],[-103,136],[-579,3569],[-213,520]],[[266893,317263],[-555,643],[-280,1346]],[[266058,319252],[-12,1037],[298,2120]],[[257333,322398],[-17,-8213]],[[257316,314185],[-332,545],[-546,1972]],[[256438,316702],[-434,1351]],[[252925,317998],[-982,22]],[[251943,318020],[-96,1897],[-197,-2],[2,2543]],[[252934,322462],[-9,-4464]],[[253555,314761],[-47,-2207]],[[253508,312554],[-481,7]],[[253027,312561],[-4,5160],[-98,277]],[[253672,320541],[-117,-5780]],[[251943,318020],[-47,-2986]],[[251896,315034],[-984,33]],[[250912,315067],[1,4042],[197,807],[1,2537]],[[249142,318304],[-519,9],[-251,-975]],[[248372,317338],[-343,700],[-215,-623]],[[247814,317415],[-5,2533],[-284,-8]],[[249140,322450],[2,-4146]],[[250912,315067],[-438,-278]],[[250474,314789],[-147,-6],[-2,4867],[-149,0],[0,2782]],[[250474,314789],[-2,-1631]],[[250472,313158],[-642,1090],[-534,3]],[[249296,314251],[-2,2446],[-152,1607]],[[266058,319252],[-82,-420]],[[265976,318832],[-275,-140]],[[265701,318692],[-106,2241],[-330,1383]],[[258653,322382],[-137,-6674],[89,-612]],[[258605,315096],[-29,-1679],[-447,-518],[-146,1195]],[[257983,314094],[-427,804],[-240,-713]],[[260678,319948],[-562,-4378],[-610,-2702],[-150,-76]],[[259356,312792],[-223,839],[-30,1451],[-498,14]],[[260617,322262],[61,-2314]],[[263365,319856],[101,-595],[-208,-1794],[7,-2679]],[[263265,314788],[-172,733],[-550,214]],[[262543,315735],[233,4869]],[[262776,320604],[50,1713]],[[263357,322330],[8,-2474]],[[264725,322316],[-135,-684],[239,-2782],[-180,-2853]],[[264649,315997],[-86,-841]],[[264563,315156],[-22,277]],[[264541,315433],[-329,3527],[-293,882],[-554,14]],[[262543,315735],[-381,-217]],[[262162,315518],[-1,1816],[-262,888]],[[261899,318222],[232,964],[228,3132]],[[261899,318222],[-334,1613],[-2,2435]],[[265701,318692],[-212,-1319]],[[265489,317373],[-231,351],[-271,-1838],[-338,111]],[[284158,318179],[119,-1091],[-640,-3358],[-489,-1594]],[[283148,312136],[-159,657],[-294,4553]],[[261287,322237],[-239,-2821],[0,-1352],[-233,-2520]],[[260815,315544],[-137,4404]],[[262162,315518],[-52,-656]],[[262110,314862],[-108,4]],[[262002,314866],[-1168,24]],[[260834,314890],[-19,654]],[[230523,318221],[0,-1628],[-295,-3],[-4,-3251]],[[230224,313339],[-873,12]],[[229351,313351],[0,1622],[-293,812]],[[229058,315785],[-2,4053]],[[202633,312118],[-979,1703],[-317,896],[-898,-11]],[[279295,319470],[266,-2708],[-183,-3842]],[[279378,312920],[-224,-636],[-333,-2783]],[[278821,309501],[-4,24]],[[278817,309525],[-1052,5966]],[[277765,315491],[-32,176]],[[212034,317843],[-3,-8091]],[[212031,309752],[0,-188]],[[212031,309564],[-1940,9],[5,5615]],[[272114,319224],[155,-4645]],[[272269,314579],[-1,-1445]],[[272268,313134],[-327,-920],[-286,1648]],[[271655,313862],[-588,1138]],[[247236,319437],[-213,565],[88,-2172],[-320,-435],[282,-923],[-325,-595]],[[246748,315877],[-1307,74]],[[255542,318825],[30,-628],[-318,-3711]],[[255254,314486],[-1699,275]],[[166086,290611],[276,-965],[-300,-16],[24,981]],[[167726,304768],[-743,1873],[-183,2255],[-553,1999]],[[167906,318608],[691,-9433],[-104,-2110],[-329,6],[-438,-2303]],[[247814,317415],[-122,-2322],[127,-841]],[[247819,314252],[0,-807]],[[247819,313445],[-294,-28],[6,-1584],[-272,-13]],[[247259,311820],[-473,1881]],[[246786,313701],[-38,2176]],[[260834,314890],[37,-1200]],[[260871,313690],[-340,-2929],[-579,-3107]],[[259952,307654],[-731,14]],[[259221,307668],[-12,4227],[147,897]],[[281096,314238],[217,-1643],[-222,-1225]],[[281091,311370],[-528,-425],[-618,1727],[-567,248]],[[223010,315807],[-346,-3461]],[[222664,312346],[46,-2146]],[[222710,310200],[-463,2268],[-59,-1528],[-214,361]],[[221974,311301],[-292,391],[-321,-718],[-413,2380]],[[242115,313118],[-438,43],[-4,-817],[-514,69],[-222,-771]],[[240937,311642],[-45,1094],[-302,570]],[[240590,313306],[-42,1616],[-478,872],[30,2513],[-295,-7]],[[225835,316616],[-146,-4],[-1,-3243]],[[225688,313369],[-284,3],[-145,-1083],[-582,7],[-438,-808]],[[224239,311488],[-1,1890],[-456,-2],[0,1621]],[[229058,315785],[-745,-262],[155,-2162],[-579,4]],[[227889,313365],[-586,3]],[[227303,313368],[-1,3244],[-295,3]],[[264541,315433],[-415,-1026]],[[264126,314407],[-860,-258]],[[263266,314149],[-1,639]],[[266933,316723],[-339,-3833]],[[266594,312890],[-433,-921]],[[266161,311969],[-142,1338]],[[266019,313307],[139,813],[-135,1990],[115,1469],[-162,1253]],[[168718,285870],[613,-3553],[-362,241],[-251,3312]],[[168675,294217],[663,-1336],[119,-1995],[-366,418],[-149,2047],[-267,866]],[[170961,302915],[-533,9],[-383,-3729]],[[170045,299195],[-299,468],[-188,-1226],[-342,667],[55,1824],[-185,2348],[-237,1371],[-531,-106],[-203,-603],[-389,830]],[[273788,314042],[-1519,537]],[[269786,312942],[-1189,-5125]],[[268597,307817],[-93,1502]],[[268504,309319],[-251,3128],[-348,457]],[[276707,313833],[-152,-754],[-450,18],[-676,-2348]],[[275429,310749],[-151,2724]],[[275278,313473],[-182,1902]],[[276430,318948],[164,-2140],[207,-809],[-94,-2166]],[[277765,315491],[-510,-6013]],[[277255,309478],[-68,132]],[[277187,309610],[-190,3520],[-290,703]],[[256438,316702],[-14,-6930]],[[256424,309772],[0,-270]],[[256424,309502],[-1170,99]],[[255254,309601],[0,4885]],[[266019,313307],[-494,36]],[[265525,313343],[-95,2291],[59,1739]],[[271655,313862],[-387,-3128],[-316,-1221],[-138,-1800]],[[270814,307713],[-619,2360],[-220,1485]],[[269975,311558],[-189,1384]],[[209510,315195],[7,-9723]],[[209517,305472],[-585,10],[0,-1637],[-1755,87],[0,1633],[-298,9]],[[206879,305574],[3,4817]],[[249296,314251],[-147,-1]],[[249149,314250],[-1330,2]],[[240590,313306],[-340,47],[-91,-2176],[-1279,142]],[[238880,311319],[36,6451]],[[231398,316601],[2,-3247],[-148,-1629],[-731,-2]],[[230521,311723],[-297,19],[0,1597]],[[253027,312561],[-593,32]],[[252434,312593],[1,817],[-542,-5]],[[251893,313405],[3,1629]],[[216412,317845],[0,-8101]],[[216412,309744],[-260,3]],[[216152,309747],[-1208,11]],[[214944,309758],[0,8102]],[[217879,317861],[-4,-8109]],[[217875,309752],[-265,-6]],[[217610,309746],[-1198,-2]],[[214944,309758],[-258,1]],[[214686,309759],[-1211,-2]],[[213475,309757],[1,8078]],[[219352,317846],[-4,-8079]],[[219348,309767],[-278,10]],[[219070,309777],[-1195,-25]],[[220518,314366],[0,-4631]],[[220518,309735],[-1170,32]],[[238880,311319],[-3,-1067]],[[238877,310252],[-196,24]],[[238681,310276],[-1273,171]],[[237408,310447],[13,5875]],[[213475,309757],[-250,-2]],[[213225,309755],[-1194,-3]],[[265525,313343],[-379,-1617]],[[265146,311726],[-589,2243],[6,1187]],[[283148,312136],[-617,-2746]],[[282531,309390],[-232,1787],[-388,-117],[-188,-953]],[[281723,310107],[-370,469]],[[281353,310576],[-262,794]],[[237408,310447],[-890,102],[31,-3035]],[[236549,307514],[-631,-50]],[[235918,307464],[24,5914]],[[257983,314094],[-89,-4491]],[[257894,309603],[-1470,169]],[[267586,313917],[-206,-1091],[-615,-312]],[[266765,312514],[-171,376]],[[227303,313368],[-1,-4055]],[[227302,309313],[-1606,12]],[[225696,309325],[-8,4044]],[[232570,314986],[0,-1620],[-300,-11],[2,-6507]],[[232272,306848],[-593,2]],[[231679,306850],[-1159,9]],[[230520,306859],[1,4864]],[[234616,313367],[-304,7],[0,-4907],[-291,4],[-15,-1618]],[[234006,306853],[-1734,-5]],[[246786,313701],[-19,-2054],[-497,-863],[38,-1147],[-293,-1724],[-253,399],[310,-1738],[-364,-407]],[[245708,306167],[3,-24]],[[245711,306143],[-453,5]],[[245258,306148],[92,410],[79,3638]],[[229351,313351],[-149,-2],[-1,-3219],[-146,-6]],[[229055,310124],[-301,797],[-865,13],[0,2431]],[[224239,311488],[147,-1345],[-3,-3288]],[[224383,306855],[-432,-385],[-522,1415]],[[223429,307885],[-656,27],[-63,2288]],[[263266,314149],[3,-2538]],[[263269,311611],[-982,-374]],[[262287,311237],[-274,215],[97,3410]],[[278817,309525],[-155,-872]],[[278662,308653],[-702,872],[-466,-1308]],[[277494,308217],[-239,1261]],[[265146,311726],[62,-1577]],[[265208,310149],[-838,21]],[[264370,310170],[1,855]],[[264371,311025],[-245,3382]],[[275429,310749],[0,-38]],[[275429,310711],[-371,-1301],[-162,-2339]],[[274896,307071],[-379,-1286]],[[274517,305785],[-288,-570],[-418,2121],[121,1598]],[[273932,308934],[155,2001],[-303,1516]],[[212031,309564],[-10,-8889]],[[212021,300675],[-15,-4739]],[[212006,295936],[-1274,-7]],[[210732,295929],[1,1618],[-582,-19],[5,3039],[-348,-1],[0,4885],[-291,21]],[[251893,313405],[-148,-262],[-98,-2422]],[[251647,310721],[-1175,275]],[[250472,310996],[0,2162]],[[259221,307668],[-550,-1892]],[[258671,305776],[-416,2982]],[[258255,308758],[-361,845]],[[262002,314866],[-202,-2820],[-428,-1223],[-148,-1566],[-209,4]],[[261015,309261],[-144,4429]],[[262287,311237],[-115,-5511]],[[262172,305726],[-1045,-291]],[[261127,305435],[-112,3826]],[[204007,308772],[-2,-8089],[-357,6],[0,-3269],[-895,189],[3,-3357]],[[202756,294252],[-282,-80],[-3451,20]],[[199023,294192],[-10,14576],[-25,5924]],[[199023,294192],[-802,21],[0,-5147]],[[198221,289066],[-2916,138]],[[195305,289204],[0,10598]],[[255254,309601],[-292,45]],[[254962,309646],[-1501,262]],[[253461,309908],[47,2646]],[[221974,311301],[-1,-5776]],[[221973,305525],[-842,203],[-613,2379]],[[220518,308107],[0,1628]],[[273932,308934],[-751,-1023],[-232,-720],[-385,1197]],[[272564,308388],[-296,4746]],[[245258,306148],[-220,-1244],[179,-1807],[-328,48],[-478,1054]],[[244411,304199],[-66,1224]],[[244345,305423],[-235,2560],[-507,303],[19,4630]],[[264371,311025],[-903,8],[-199,578]],[[250472,310996],[3,-4065]],[[250475,306931],[-737,17]],[[249738,306948],[0,538],[-588,29]],[[249150,307515],[-1,6735]],[[249150,307515],[-2,-541],[-585,15]],[[248563,306989],[-568,-78]],[[247995,306911],[2,1971],[-165,659],[-13,3904]],[[267731,313122],[-172,-4100]],[[267559,309022],[-165,-650],[-348,481],[-159,-755]],[[266887,308098],[-122,4416]],[[277187,309610],[-200,-184],[-957,-3894]],[[276030,305532],[-239,1408],[128,659],[-179,3128],[-311,-16]],[[272564,308388],[-61,-777]],[[272503,307611],[-371,-2256]],[[272132,305355],[-182,82],[-533,1971],[-394,-959]],[[271023,306449],[-209,1264]],[[261127,305435],[65,-2172]],[[261192,303263],[-366,-424]],[[260826,302839],[-582,505]],[[260244,303344],[-292,4310]],[[247116,305288],[0,-1624]],[[247116,303664],[-574,36]],[[246542,303700],[-7,2441],[-827,26]],[[247259,311820],[2,-3021],[-145,16],[0,-3527]],[[247995,306911],[-1,-1623],[-878,0]],[[266161,311969],[-151,-1209],[137,-1333]],[[266147,309427],[-550,-3124]],[[265597,306303],[-143,-536],[-540,1289]],[[264914,307056],[377,2075],[-83,1018]],[[252434,312593],[-3,-7006]],[[252431,305587],[-491,-269]],[[251940,305318],[-293,8]],[[251647,305326],[0,5395]],[[229055,310124],[0,-2981]],[[229055,307143],[-102,-1894]],[[228953,305249],[-1646,5]],[[227307,305254],[-5,4059]],[[230520,306859],[-129,-799],[-366,1]],[[230025,306061],[-236,1077],[-734,5]],[[225696,309325],[4,-2728]],[[225700,306597],[-87,-540],[-545,799],[-164,-1383]],[[224904,305473],[-175,-372],[-346,1754]],[[235918,307464],[-20,-4634]],[[235898,302830],[-25,-5641]],[[235873,297189],[-725,1210]],[[235148,298399],[-85,1118],[-236,-357],[-302,2195],[-518,1395]],[[234007,302750],[-1,4103]],[[240937,311642],[-27,-4926]],[[240910,306716],[-580,117]],[[240330,306833],[-387,76],[-25,1423],[-898,817],[-143,1103]],[[192649,296055],[0,-2067],[-471,-22],[-761,-1596],[-17,-3435]],[[191400,288935],[-519,-982],[-411,-2924],[-457,4942],[-260,4020]],[[189753,293991],[-316,3938],[-198,-1382],[-453,2730],[43,1284],[-343,3366]],[[268504,309319],[-576,-1452],[-270,224]],[[267658,308091],[-99,931]],[[242221,313104],[-71,-8013]],[[242150,305091],[-288,-50]],[[241862,305041],[-455,1583],[-497,92]],[[244345,305423],[-785,1742],[-49,-1484],[-582,-12],[0,-545]],[[242929,305124],[-779,-33]],[[266887,308098],[-133,-492]],[[266754,307606],[-217,1202],[-390,619]],[[281353,310576],[-256,-2617],[-334,-211],[-135,-1226],[-339,132],[-50,-1711],[-247,-2039]],[[279992,302904],[-1171,6597]],[[269975,311558],[-244,-1242],[240,-2297],[-54,-2071],[-167,-825]],[[269750,305123],[-567,148],[-179,-1083]],[[269004,304188],[-407,3629]],[[253461,309908],[-84,-4366]],[[253377,305542],[-946,45]],[[223429,307885],[-1,-7045]],[[223428,300840],[-1456,0]],[[221972,300840],[1,4685]],[[263252,305382],[-219,27]],[[263033,305409],[-515,58]],[[262518,305467],[-346,259]],[[263269,311611],[-17,-6229]],[[264370,310170],[-2,-2778]],[[264368,307392],[-267,-204],[-179,-1893]],[[263922,305295],[-670,87]],[[271023,306449],[-385,-3232]],[[270638,303217],[-108,-158]],[[270530,303059],[5,561],[-727,-210],[-58,1713]],[[282531,309390],[61,24]],[[282592,309414],[10,-65]],[[282602,309349],[-405,-2626],[-165,-1820],[-109,2615]],[[281923,307518],[-200,2589]],[[251647,305326],[-877,-15]],[[250770,305311],[-293,-4],[-2,1624]],[[276030,305532],[200,-730]],[[276230,304802],[-500,-1759],[-394,2383],[-444,601],[4,1044]],[[281923,307518],[8,-4063],[-186,-1610],[-387,486],[-737,-285],[-373,-589]],[[280248,301457],[-33,176]],[[280215,301633],[-11,67]],[[280204,301700],[-212,1204]],[[237408,310447],[27,-3044],[293,-50],[-7,-3257]],[[237721,304096],[-23,-4862],[-351,60]],[[237347,299294],[-4,1]],[[237343,299295],[-252,2449],[-133,5739],[-409,31]],[[238681,310276],[-66,-2358],[143,-158],[46,-2922],[169,-1709]],[[238973,303129],[-231,-2]],[[238742,303127],[-202,-247],[-819,1216]],[[206879,305574],[2,-12856],[-37,-4822],[-1146,-121]],[[205698,287775],[-6,3219],[-1134,-5],[-3,1594],[-1724,6]],[[202831,292589],[-75,1663]],[[240330,306833],[-20,-6441]],[[240310,300392],[-587,-612]],[[239723,299780],[-511,1233],[-239,2116]],[[264914,307056],[-97,-2181]],[[264817,304875],[-449,1093],[0,1424]],[[254962,309646],[-4,-5675]],[[254958,303971],[0,-1619]],[[254958,302352],[-879,89]],[[254079,302441],[-98,2459],[-614,117]],[[253367,305017],[10,525]],[[183362,303916],[0,-11575]],[[183362,292341],[-1740,3],[0,1620],[-862,-20],[-3,-8075],[-686,-61]],[[180071,285808],[-439,260],[-94,887],[82,3389],[-151,600],[21,1938],[272,564]],[[179762,293446],[283,2148],[77,2692],[-106,4262],[274,1899],[11,1120]],[[181121,309576],[281,-790],[1201,-586],[253,1502],[507,147]],[[219070,309777],[-4,-8906]],[[219066,300871],[-1455,-38]],[[217611,300833],[-1,8913]],[[220518,308107],[-138,101],[-4,-7331]],[[220376,300877],[-1310,-6]],[[258255,308758],[-186,-144],[-224,-2438],[-291,-747],[-162,-1946],[-430,-1123],[-129,-1066]],[[256833,301294],[-358,590],[-165,1921]],[[256310,303805],[109,-16],[5,5713]],[[217611,300833],[-1456,-60]],[[216155,300773],[-3,8974]],[[216155,300773],[-1454,-106]],[[214701,300667],[-15,9092]],[[214701,300667],[-1476,8]],[[213225,300675],[0,9080]],[[277494,308217],[-65,-786],[217,-4445],[468,-2796]],[[278114,300190],[-479,-436],[-840,1115],[-215,922]],[[276580,301791],[-276,1144]],[[276304,302935],[225,772],[-299,1095]],[[213225,300675],[-1204,0]],[[256310,303805],[-1352,166]],[[280204,301700],[21,-471],[-685,-2076],[-529,-3188]],[[279011,295965],[-269,-6],[-253,2493]],[[278489,298452],[-185,3128],[-229,1784],[245,1596],[342,3693]],[[278489,298452],[-265,205],[-88,1174]],[[278136,299831],[-22,359]],[[266754,307606],[118,-2921]],[[266872,304685],[-494,-1390]],[[266378,303295],[-72,1227],[-571,652],[-138,1129]],[[227307,305254],[-1,-3184]],[[227306,302070],[-352,1622],[-507,-2568],[-302,757]],[[226145,301881],[90,1860],[-381,232],[-154,2624]],[[269004,304188],[84,-1081]],[[269088,303107],[-225,529]],[[268863,303636],[-374,-245]],[[268489,303391],[-548,1345]],[[267941,304736],[-283,3355]],[[267941,304736],[-591,-490]],[[267350,304246],[-195,-334]],[[267155,303912],[-283,773]],[[274517,305785],[-85,-1864],[134,-4155],[-61,-616]],[[274505,299150],[-581,663],[-511,1884]],[[273413,301697],[-135,2327],[-372,1680],[-227,39],[-176,1868]],[[258671,305776],[-63,-2961]],[[258608,302815],[-229,-1970],[-471,-601],[9,-685]],[[257917,299559],[-515,1403],[-542,-470]],[[256860,300492],[-27,802]],[[221972,300840],[4,-1864]],[[221976,298976],[-229,1201],[-392,509],[-834,191]],[[220521,300877],[-145,0]],[[224904,305473],[0,-4595]],[[224904,300878],[-1476,-38]],[[260244,303344],[-448,-474],[-461,-1878]],[[259335,300992],[-374,2733],[-353,-910]],[[273413,301697],[-85,-3220]],[[273328,298477],[-403,-1010]],[[272925,297467],[-503,1412],[-567,2766]],[[271855,301645],[277,3710]],[[249738,306948],[7,-5486]],[[249745,301462],[-730,-2],[-438,571]],[[248577,302031],[-14,4958]],[[237343,299295],[-645,694],[-800,2841]],[[271855,301645],[-224,-1169]],[[271631,300476],[-514,964],[-162,2031],[-317,-254]],[[264817,304875],[-499,-1732]],[[264318,303143],[-198,104],[-7,-5871]],[[264113,297376],[-299,18],[-3,-1823]],[[263811,295571],[-420,-902]],[[263391,294669],[-672,168]],[[262719,294837],[116,1165]],[[262835,296002],[415,1551],[228,1602]],[[263478,299155],[298,1539],[245,2560],[-99,2041]],[[230025,306061],[101,-881],[-211,-1084],[101,-2120]],[[230016,301976],[-186,350],[-327,-1482],[-269,387],[-183,1849]],[[229051,303080],[-98,2169]],[[244411,304199],[-353,-701],[-25,-3600]],[[244033,299898],[-1166,155]],[[242867,300053],[62,5071]],[[276304,302935],[-783,-2654],[-394,-674],[-382,-2307]],[[274745,297300],[-240,1850]],[[265597,306303],[-143,-2279],[195,-1400]],[[265649,302624],[-510,-2675]],[[265139,299949],[-116,-620]],[[265023,299329],[-659,3103],[-46,711]],[[248577,302031],[0,-1380],[-585,-270],[-2,-1632]],[[247990,298749],[-442,543],[316,1089],[-750,38]],[[247114,300419],[2,3245]],[[250770,305311],[4,-4878],[-150,-1369]],[[250624,299064],[-878,-312]],[[249746,298752],[-1,2710]],[[231679,306850],[149,-590],[1,-3199],[271,-1474],[224,-5]],[[232324,301582],[-241,-630]],[[232083,300952],[-247,888],[-429,-565],[-250,-1798],[-558,-652]],[[230599,298825],[-125,949],[-568,1263],[110,939]],[[234007,302750],[-176,481],[-257,-1570]],[[233574,301661],[-669,201],[-133,967],[-448,-1247]],[[241862,305041],[-376,-48],[-11,-1571],[394,-3307]],[[241869,300115],[-693,133]],[[241176,300248],[-866,144]],[[226145,301881],[-3,-7871]],[[226142,294010],[-1232,-6]],[[224910,294004],[-6,6874]],[[266378,303295],[-305,-1110]],[[266073,302185],[-424,439]],[[246542,303700],[-5,-6913],[-293,-2],[0,-1616]],[[246244,295169],[-1256,-5]],[[244988,295164],[-45,601]],[[244943,295765],[269,599],[-236,1265],[282,815],[-40,1455],[303,-382],[-185,3716],[560,1252],[-185,1658]],[[244943,295765],[-41,-823],[-579,866]],[[244323,295808],[8,4034],[-298,56]],[[262518,305467],[-156,-2441],[-200,-874]],[[262162,302152],[-936,-50]],[[261226,302102],[-34,1161]],[[253367,305017],[-117,-5834]],[[253250,299183],[-737,-1766]],[[252513,297417],[38,554],[-611,6],[-2,2436]],[[251938,300413],[2,4905]],[[210732,295929],[-587,-11],[-3,-3235],[-124,-7],[0,-8008],[-134,-3]],[[209884,284665],[-2861,-35],[-28,-8243]],[[206995,276387],[-1400,-32],[4,8250],[101,1],[-2,3169]],[[263478,299155],[-127,1132],[-280,33]],[[263071,300320],[-38,5089]],[[179762,293446],[-4058,-181]],[[175704,293265],[-2643,-5],[-585,89],[-362,1122],[-387,245]],[[171727,294716],[267,2870],[-339,971],[-382,2958]],[[263071,300320],[-494,-473]],[[262577,299847],[-380,582]],[[262197,300429],[-35,1723]],[[270530,303059],[-303,-446],[112,-1813],[-159,-1241],[160,-3138]],[[270340,296421],[-326,1801]],[[270014,298222],[-319,2646],[-607,2239]],[[251938,300413],[-588,24],[-1,-1081],[-287,-276]],[[251062,299080],[-438,-16]],[[229051,303080],[-27,-97]],[[229024,302983],[-420,-2885],[-33,-1359],[-271,1490],[50,1869],[-342,-239],[-177,-1289],[-249,387],[-61,1401]],[[227521,302358],[-215,-288]],[[242867,300053],[0,-1626]],[[242867,298427],[-989,64]],[[241878,298491],[-9,1624]],[[254079,302441],[14,-7371]],[[254093,295070],[-914,185]],[[253179,295255],[71,3928]],[[268489,303391],[-191,-580],[-387,-2963],[106,-884]],[[268017,298964],[-130,-739]],[[267887,298225],[-343,99],[-450,1171]],[[267094,299495],[12,1605]],[[267106,301100],[49,2812]],[[189753,293991],[-1506,-3],[-6,-4849],[-1376,-19],[-349,1601],[-5,-14590]],[[186511,276131],[-3149,-35]],[[183362,276096],[0,16245]],[[267106,301100],[-728,2195]],[[238742,303127],[-74,-8950]],[[238668,294177],[-668,109]],[[238000,294286],[-287,2381]],[[237713,296667],[-388,1098],[22,1529]],[[256860,300492],[-290,-2960],[-338,-792],[-245,-1877]],[[255987,294863],[-144,1386],[-293,274]],[[255550,296523],[0,1620],[-291,54],[-9,3268],[-292,887]],[[268863,303636],[139,-2861],[323,-3555]],[[269325,297220],[-471,-581]],[[268854,296639],[-87,-160]],[[268767,296479],[-371,1042],[-216,-421],[-163,1864]],[[227521,302358],[-8,-8969]],[[227513,293389],[-1201,1]],[[226312,293390],[-170,620]],[[259335,300992],[56,-1316],[-280,-1720]],[[259111,297956],[-212,-1709],[70,-887],[-508,-2769]],[[258461,292591],[2,2075],[-386,811]],[[258077,295477],[-160,4082]],[[247114,300419],[-4,-8971]],[[247110,291448],[-285,-7],[1,-1091],[-449,-9]],[[246377,290341],[-133,6],[0,4822]],[[270014,298222],[-538,-798]],[[269476,297424],[-151,-204]],[[271631,300476],[-1005,-5256]],[[270626,295220],[-44,238]],[[270582,295458],[-242,963]],[[265023,299329],[-257,-2572],[-190,585]],[[264576,297342],[-271,24]],[[264305,297366],[-192,10]],[[260085,295668],[2,547],[-556,17],[-158,1641],[-262,83]],[[260826,302839],[-296,-1218],[-7,-4236],[-438,-1717]],[[267094,299495],[-351,-1180]],[[266743,298315],[-277,2222]],[[266466,300537],[-393,1648]],[[261226,302102],[133,-4629]],[[261359,297473],[96,-3170]],[[261455,294303],[-945,242]],[[260510,294545],[-581,52]],[[259929,294597],[156,1071]],[[235148,298399],[-1,-6962]],[[235147,291437],[-172,647]],[[234975,292084],[-223,645],[-660,-165]],[[234092,292564],[-504,-212]],[[233588,292352],[-6,49]],[[233582,292401],[-8,9260]],[[239723,299780],[-33,-6035]],[[239690,293745],[-694,-157]],[[238996,293588],[-328,589]],[[230599,298825],[-15,-6105]],[[230584,292720],[-1252,143]],[[229332,292863],[-306,203]],[[229026,293066],[-2,9917]],[[229026,293066],[-1224,262]],[[227802,293328],[-289,61]],[[237713,296667],[-606,-1073]],[[237107,295594],[-320,702],[-637,-837],[-277,1730]],[[276580,301791],[-335,-2182],[7,-1181],[-302,-3863]],[[275950,294565],[-336,-991]],[[275614,293574],[-478,39],[-285,2097]],[[274851,295710],[-106,1590]],[[171727,294716],[-239,-2194]],[[171488,292522],[-527,2873],[-607,2124],[-309,1676]],[[233582,292401],[-516,1393],[-745,742],[-269,-626]],[[232052,293910],[31,7042]],[[266466,300537],[-488,-4110]],[[265978,296427],[-652,2740]],[[265326,299167],[-187,782]],[[255550,296523],[-579,144],[-98,-1641],[-485,59]],[[254388,295085],[-295,-15]],[[262197,300429],[-36,-1811],[-802,-1145]],[[249746,298752],[0,-823]],[[249746,297929],[-780,-17]],[[248966,297912],[-952,5]],[[248014,297917],[-24,832]],[[278136,299831],[-261,-1729],[-65,-2062],[-295,-1492],[-382,-3555]],[[277133,290993],[-221,469],[-599,3177],[-363,-74]],[[232052,293910],[-3,-968]],[[232049,292942],[-1216,-1076]],[[230833,291866],[-249,854]],[[274851,295710],[-156,131],[-298,-1760],[-415,2481],[-367,85],[-287,1830]],[[272925,297467],[-517,-3023]],[[272408,294444],[-1070,-5442]],[[271338,289002],[-265,919]],[[271073,289921],[-257,2318],[43,1727],[-233,1254]],[[258077,295477],[-439,-1478],[-435,-2504],[-548,-1594]],[[256655,289901],[-109,9]],[[256546,289910],[-267,1112],[-470,3450],[178,391]],[[220521,300877],[16,-8166]],[[220537,292711],[-1467,10]],[[219070,292721],[-4,8150]],[[221976,298976],[5,-6234]],[[221981,292742],[-1444,-31]],[[224910,294004],[2,-1315]],[[224912,292689],[-1486,26]],[[223426,292715],[2,8125]],[[219070,292721],[-1453,-13]],[[217617,292708],[-6,8125]],[[217617,292708],[-1443,-45]],[[216174,292663],[-19,8110]],[[223426,292715],[-1445,27]],[[216174,292663],[-1446,-96]],[[214728,292567],[-27,8100]],[[213225,300675],[57,-8129]],[[213282,292546],[-1287,-1]],[[211995,292545],[11,3391]],[[214728,292567],[-1446,-21]],[[241176,300248],[-12,-1321],[-518,-4118],[192,-1475],[382,-1184]],[[241220,292150],[-1146,188]],[[240074,292338],[-391,56],[7,1351]],[[266743,298315],[382,-3067],[-30,-933]],[[267095,294315],[-707,-913]],[[266388,293402],[-414,1708]],[[265974,295110],[4,1317]],[[262719,294837],[-459,-1602]],[[262260,293235],[-776,48]],[[261484,293283],[-29,1020]],[[262577,299847],[-12,-3859],[270,14]],[[248014,297917],[76,-4060],[-205,-780],[1,-1558]],[[247886,291519],[-437,-567]],[[247449,290952],[-227,-1245],[-112,1741]],[[252513,297417],[69,-2403],[-508,-277]],[[252074,294737],[0,1098],[-968,-56]],[[251106,295779],[-44,3301]],[[241878,298491],[54,-3825],[-183,-2389],[75,-1398]],[[241824,290879],[-230,-523],[-374,1794]],[[244323,295808],[-11,-3253]],[[244312,292555],[-1484,172]],[[242828,292727],[39,5700]],[[264965,295106],[-389,2236]],[[265326,299167],[-46,-1734],[-315,-2327]],[[279011,295965],[-403,-3616],[-92,-2363],[-262,1132],[231,-2620],[-212,-589],[-375,805]],[[277898,288714],[-123,574]],[[277775,289288],[-642,1705]],[[195305,289204],[0,-8032]],[[195305,281172],[-1,-6537]],[[195304,274635],[-186,-4]],[[195118,274631],[-312,2178],[43,3573],[-198,582],[-596,5810],[0,10694]],[[267887,298225],[124,-661],[-175,-1445],[3,-2070]],[[267839,294049],[-421,-2128]],[[267418,291921],[-323,2394]],[[253179,295255],[-83,-4574]],[[253096,290681],[-1016,-26]],[[252080,290655],[-6,4082]],[[265974,295110],[21,-726],[-419,-926],[-105,-1288]],[[265471,292170],[-170,1415]],[[265301,293585],[-336,1521]],[[251106,295779],[-194,-540]],[[250912,295239],[-465,-210],[-350,-1146]],[[250097,293883],[-350,16],[-1,4030]],[[268767,296479],[-104,-668]],[[268663,295811],[-273,-796],[-103,-1445]],[[268287,293570],[-448,479]],[[237107,295594],[1,-5232]],[[237108,290362],[-341,757],[-196,-1322],[-639,965],[-521,-443]],[[235411,290319],[-264,1118]],[[275614,293574],[-88,-2688],[-301,-779]],[[275225,290107],[-353,382],[-40,1051],[-800,-2860]],[[274032,288680],[-22,-72]],[[274010,288608],[-398,2352],[-785,2545]],[[272827,293505],[-419,939]],[[242828,292727],[22,-1854],[-368,-1418],[-65,-1107]],[[242417,288348],[-241,1667],[-352,864]],[[270582,295458],[-741,-3541]],[[269841,291917],[-395,3623],[30,1884]],[[259929,294597],[-147,0],[-211,-3806],[-383,38],[-157,-3571]],[[259031,287258],[-882,-28]],[[258149,287230],[-35,1334],[210,2007],[198,282],[-61,1738]],[[250097,293883],[-203,-505],[0,-2741]],[[249894,290637],[-534,-9]],[[249360,290628],[-4,2180],[-385,256],[-5,4848]],[[249360,290628],[-290,-1321]],[[249070,289307],[-1184,2212]],[[269841,291917],[-165,-789]],[[269676,291128],[-4,-5]],[[269672,291123],[-80,1]],[[269592,291124],[-424,845],[-314,4670]],[[195118,274631],[-3725,22]],[[191393,274653],[0,1610]],[[191393,276263],[7,12672]],[[264305,297366],[79,-1215],[-282,-4274]],[[264102,291877],[-95,1]],[[264007,291878],[19,2058],[-215,1635]],[[265301,293585],[-113,-1287],[-385,-1434]],[[264803,290864],[-134,698],[-567,315]],[[238000,294286],[55,-4237],[-203,-2132],[-208,87],[128,-2331]],[[237772,285673],[-29,1]],[[237743,285674],[-635,-3]],[[237108,285671],[0,4691]],[[269592,291124],[-134,-694]],[[269458,290430],[-356,976],[-547,-1372]],[[268555,290034],[-268,3536]],[[256546,289910],[-601,-2119],[-102,-2363],[-288,-51]],[[255555,285377],[-818,63]],[[254737,285440],[-326,195],[-14,2539]],[[254397,288174],[-9,6911]],[[211995,292545],[-22,-7993]],[[211973,284552],[0,-8133]],[[211973,276419],[1,-8101]],[[211974,268318],[0,-1611],[-731,-3]],[[211243,266704],[-1104,-3]],[[210139,266701],[0,9724],[-255,-1],[0,8241]],[[252080,290655],[-401,-9]],[[251679,290646],[-766,-8]],[[250913,290638],[-1,4601]],[[244988,295164],[-59,-1673],[289,734],[-26,-3356],[151,-2943],[-317,-598],[225,-984],[-128,-820]],[[245123,285524],[0,-134]],[[245123,285390],[-271,18]],[[244852,285408],[-481,19]],[[244371,285427],[-67,-3]],[[244304,285424],[8,7131]],[[264007,291878],[-125,-1789],[-179,18]],[[263703,290107],[-245,1867],[-67,2695]],[[258149,287230],[-73,-1530]],[[258076,285700],[-260,915],[-756,37],[2,-410]],[[257062,286242],[-403,2158],[-4,1501]],[[271073,289921],[-669,-319],[-229,1236],[-260,-546]],[[269915,290292],[-148,616]],[[269767,290908],[-91,220]],[[254397,288174],[-931,-2937]],[[253466,285237],[-470,-87]],[[252996,285150],[100,5531]],[[250913,290638],[-58,-1638],[-291,-9],[-3,-1640],[-289,-10]],[[250272,287341],[5,3289],[-383,7]],[[246377,290341],[40,-3234]],[[246417,287107],[-592,20],[0,-1670]],[[245825,285457],[-702,67]],[[266388,293402],[-34,-4888]],[[266354,288514],[-753,-747]],[[265601,287767],[-17,901]],[[265584,288668],[-113,3502]],[[263703,290107],[-14,-676]],[[263689,289431],[-975,44],[-28,-604]],[[262686,288871],[-213,626]],[[262473,289497],[-213,3738]],[[277775,289288],[-200,-1210],[-345,-446],[-431,-3536]],[[276799,284096],[-357,-1958],[-73,1501]],[[276369,283639],[-170,-185],[-119,1854],[-263,409]],[[275817,285717],[-479,2444],[-113,1946]],[[175704,293265],[8,-6545],[-64,-14],[-11,-8498]],[[175637,278208],[-2838,-1564],[17,2580],[-320,834],[-131,1949],[82,971],[-206,4490],[-532,4208],[-221,846]],[[261484,293283],[160,-5557]],[[261644,287726],[11,-400]],[[261655,287326],[-1005,-14]],[[260650,287312],[-168,-13]],[[260482,287299],[28,7246]],[[260482,287299],[-991,-305]],[[259491,286994],[-460,264]],[[233588,292352],[-6,-55]],[[233582,292297],[-854,-556],[-398,-900],[-289,-1444]],[[232041,289397],[8,3545]],[[272827,293505],[-15,-5200],[98,-784]],[[272910,287521],[-478,-195],[-495,933],[-201,-1171]],[[271736,287088],[-363,872],[-35,1042]],[[267418,291921],[45,-836],[-297,-951],[-55,-1334]],[[267111,288800],[-431,-35]],[[266680,288765],[-326,-251]],[[202831,292589],[15,-6292]],[[202846,286297],[-1525,-4281],[1,-811],[-1146,18],[-2,-3253]],[[200174,277970],[-860,-3]],[[199314,277967],[-358,449],[43,2766],[-165,3253],[-161,392],[-104,4258],[-348,-19]],[[238996,293588],[-214,-3466],[-111,31],[-24,-4496]],[[238647,285657],[-85,2]],[[238562,285659],[-790,14]],[[268555,290034],[21,-284]],[[268576,289750],[-391,-1856],[-455,-1079]],[[267730,286815],[-127,1309],[-492,676]],[[183362,276096],[1,-8676]],[[183363,267420],[-4125,8475],[13,2284],[251,1898]],[[179502,280077],[536,715],[179,2807],[-146,2209]],[[191393,276263],[-1966,-35],[0,-192],[-2916,95]],[[226312,293390],[-10,-8052]],[[226302,285338],[-375,38]],[[225927,285376],[-1032,85]],[[224895,285461],[17,7228]],[[240074,292338],[-28,-6700]],[[240046,285638],[-697,10]],[[239349,285648],[-702,9]],[[265584,288668],[-611,418]],[[264973,289086],[-229,4]],[[264744,289090],[59,1774]],[[274010,288608],[-793,-2802]],[[273217,285806],[-307,1715]],[[179502,280077],[-3865,-1869]],[[227802,293328],[-42,-8197]],[[227760,285131],[-406,73]],[[227354,285204],[-1052,134]],[[229332,292863],[-29,-7782]],[[229303,285081],[-523,-53]],[[228780,285028],[-1020,103]],[[262473,289497],[-829,-1771]],[[232039,284934],[-231,5],[-115,-1982],[146,-674]],[[231839,282283],[-397,23]],[[231442,282306],[-615,61]],[[230827,282367],[1,2606]],[[230828,284973],[5,6893]],[[232041,289397],[-2,-4463]],[[230828,284973],[-612,11]],[[230216,284984],[-913,97]],[[219070,292721],[-5,-8098]],[[219065,284623],[-381,10]],[[218684,284633],[-1066,127]],[[217618,284760],[-1,7948]],[[220537,292711],[5,-8140]],[[220542,284571],[-432,-2]],[[220110,284569],[-1045,54]],[[234975,292084],[-31,-7088]],[[234944,284996],[-292,1575],[-561,-613]],[[234091,285958],[1,6606]],[[217618,284760],[-376,-125]],[[217242,284635],[-1070,-47]],[[216172,284588],[2,8075]],[[223426,292715],[8,-8204]],[[223434,284511],[-404,2]],[[223030,284513],[-1045,0]],[[221985,284513],[-4,8229]],[[224895,285461],[-2,-1035],[-413,38]],[[224480,284464],[-1046,47]],[[221985,284513],[-393,-1]],[[221592,284512],[-1050,59]],[[244304,285424],[-1696,42]],[[242608,285466],[-191,2882]],[[216172,284588],[-374,14]],[[215798,284602],[-1072,-38]],[[214726,284564],[2,8003]],[[206995,276387],[10,-9680]],[[207005,266707],[-197,-1]],[[206808,266706],[-3007,34]],[[203801,266740],[-1057,-19]],[[202744,266721],[2,17810],[100,1766]],[[213282,292546],[0,-7999]],[[213282,284547],[-1309,5]],[[214726,284564],[-368,-14]],[[214358,284550],[-1076,-3]],[[234091,285958],[-73,-393]],[[234018,285565],[-60,-961],[-377,12]],[[233581,284616],[1,7681]],[[242608,285466],[-1828,115]],[[240780,285581],[-734,57]],[[233581,284616],[-993,-39]],[[232588,284577],[-549,357]],[[235411,290319],[-5,-7248]],[[235406,283071],[-145,-6]],[[235261,283065],[-39,471]],[[235222,283536],[-278,1460]],[[249070,289307],[-206,-1883],[-209,-3399],[-189,-953]],[[248466,283072],[-1108,2439]],[[247358,285511],[-151,1938],[245,380],[-3,3123]],[[264744,289090],[-346,-257]],[[264398,288833],[-567,369],[-126,-463]],[[263705,288739],[-16,692]],[[275817,285717],[197,-1750],[-222,-2037],[-677,747]],[[275115,282677],[4,3611],[-520,96],[-567,2296]],[[247358,285511],[-237,-29],[-3,-1592],[-571,-19]],[[246547,283871],[-8,3240],[-122,-4]],[[269458,290430],[-641,-2764]],[[268817,287666],[-197,886]],[[268620,288552],[-44,1198]],[[269915,290292],[98,-679],[-163,-3128],[52,-2328],[-122,-1899]],[[269780,282258],[-329,-1370]],[[269451,280888],[-242,1119]],[[269209,282007],[-81,3665],[-311,1994]],[[237108,285671],[0,-2571]],[[237108,283100],[-1702,-29]],[[271736,287088],[202,-924]],[[271938,286164],[-630,-2537]],[[271308,283627],[-251,828],[-618,-687],[-182,-1942]],[[270257,281826],[-477,432]],[[252996,285150],[-21,-1156]],[[252975,283994],[-1295,-59]],[[251680,283935],[-1,6711]],[[251680,283935],[-283,11]],[[251397,283946],[-1128,96]],[[250269,284042],[3,3299]],[[250269,284042],[-1132,-33],[-12,-840]],[[249125,283169],[-659,-97]],[[257062,286242],[14,-3976],[-399,14]],[[256677,282280],[-836,-103],[-284,800]],[[255557,282977],[-2,2400]],[[269209,282007],[-689,-991],[-95,755],[-402,-936]],[[268023,280835],[-353,3484]],[[267670,284319],[60,2496]],[[263705,288739],[-84,-3973]],[[263621,284766],[55,-1652]],[[263676,283114],[-539,-692]],[[263137,282422],[-449,518]],[[262688,282940],[-2,5931]],[[262688,282940],[-898,-38]],[[261790,282902],[-135,4424]],[[199314,277967],[-878,-19],[0,-1622],[-852,-5],[-2,-8135],[36,-4019]],[[197618,264167],[-857,-7],[-37,4023],[2,8133],[-306,3],[2,1614],[-576,1],[-5,3232],[-536,6]],[[264398,288833],[-62,-3686]],[[264336,285147],[-715,-381]],[[264973,289086],[-7,-4742],[-221,-294]],[[264745,284050],[2,1070],[-411,27]],[[265601,287767],[265,-1986],[29,-1346]],[[265895,284435],[-506,-1945]],[[265389,282490],[-646,23]],[[264743,282513],[2,1537]],[[267670,284319],[-205,1161],[-587,-1542]],[[266878,283938],[-198,4827]],[[266878,283938],[-137,-519]],[[266741,283419],[-297,-993]],[[266444,282426],[-403,799],[-146,1210]],[[275115,282677],[-128,-2424],[77,-2306]],[[275064,277947],[21,-1799],[-453,1073]],[[274632,277221],[-397,2101],[-304,487]],[[273931,279809],[-206,2389],[-508,3608]],[[273217,285806],[-382,-1361],[-117,-2128],[-399,-1751]],[[272319,280566],[-269,3521],[-24,1416]],[[272026,285503],[-88,661]],[[254737,285440],[-323,-2639],[122,-3923],[141,-1192],[-210,-1223]],[[254467,276463],[-114,140]],[[254353,276603],[-184,1820],[-374,-689],[-62,3380],[-367,2778],[100,1345]],[[261790,282902],[136,-2308]],[[261926,280594],[-1276,-334]],[[260650,280260],[0,7052]],[[260650,280260],[-288,-579],[2,-1890]],[[260364,277791],[-286,-278],[4,-1615],[-248,-23]],[[259834,275875],[-17,4870],[-320,8]],[[259497,280753],[-6,6241]],[[259497,280753],[-1025,-27]],[[258472,280726],[-231,1150],[-165,3824]],[[246547,283871],[-292,-1615],[176,-342],[-73,-2890]],[[246358,279024],[-674,12],[3,3263],[138,3158]],[[235222,283536],[-1204,-38]],[[234018,283498],[0,2067]],[[258472,280726],[-106,-860]],[[258366,279866],[-839,-31],[-2,-819],[-563,45]],[[256962,279061],[-281,-16],[0,1226]],[[256681,280271],[-4,2009]],[[202744,266721],[-672,-16],[-49,-2500],[301,-1531]],[[202324,262674],[-2142,-5]],[[200182,262669],[-8,15301]],[[272319,280566],[44,-2784]],[[272363,277782],[-442,-1977]],[[271921,275805],[-595,2074]],[[271326,277879],[-222,903]],[[271104,278782],[-65,751],[269,4094]],[[273931,279809],[-121,-807]],[[273810,279002],[-90,-725],[-314,2439],[-742,-3661]],[[272664,277055],[-301,727]],[[248466,283072],[-231,-2682],[-557,-1363]],[[247678,279027],[-560,-1640]],[[247118,277387],[-289,-1241]],[[246829,276146],[-463,2072]],[[246366,278218],[-8,806]],[[238701,271113],[-400,6]],[[238301,271119],[-149,1513],[-322,444],[-467,-2738],[-254,8]],[[237109,270346],[-1,3653]],[[237108,273999],[0,5600]],[[237108,279599],[0,3501]],[[237743,285674],[-73,-1364],[157,-1652],[-2,-3964],[475,-5512],[401,-2069]],[[238562,285659],[194,-3036],[29,-8285],[191,-5]],[[238976,274333],[-156,-3244]],[[238820,271089],[-119,24]],[[239516,277585],[89,-2415],[-250,-839],[-379,2]],[[239349,285648],[4,-5606],[141,-1],[22,-2456]],[[240779,280837],[-287,-14],[-146,-3236]],[[240346,277587],[-830,-2]],[[240780,285581],[-1,-4744]],[[242619,280157],[-575,-2639],[-400,30]],[[241644,277548],[0,1623],[-290,937],[-575,729]],[[242608,285466],[11,-5309]],[[234018,283498],[-3,-6187]],[[234015,277311],[-813,788]],[[233202,278099],[-417,1389]],[[232785,279488],[-113,619]],[[232672,280107],[-84,4470]],[[246366,278218],[-28,-989],[-363,176],[-2,-2478],[-251,42],[-36,2444],[-221,12]],[[245465,277425],[-297,1279],[258,1420],[-227,256],[-7,1864],[186,934],[-62,1882],[-224,-1603],[31,1933]],[[268023,280835],[-29,-951]],[[267994,279884],[-750,-2311]],[[267244,277573],[-503,5846]],[[244371,285427],[-163,-2146],[-308,-2022],[-90,-2138]],[[243810,279121],[-368,-2107],[-400,-899]],[[243042,276115],[-26,3010],[-397,1032]],[[255557,282977],[-143,-816],[-4,-3254],[-143,-3],[2,-3233]],[[255269,275671],[-569,-21],[-233,813]],[[244852,285408],[-216,-2699],[-7,-2066],[-283,-3112]],[[244346,277531],[-420,5],[-116,1585]],[[225927,285376],[-30,-8275]],[[225897,277101],[-4,-879]],[[225893,276222],[-1134,26]],[[224759,276248],[-281,39]],[[224478,276287],[2,8177]],[[245465,277425],[-76,-261]],[[245389,277164],[-175,-453],[-903,-2]],[[244311,276709],[35,822]],[[227354,285204],[-18,-8167]],[[227336,277037],[-186,1]],[[227150,277038],[-1253,63]],[[264743,282513],[-219,-2968]],[[264524,279545],[-235,1092]],[[264289,280637],[-264,580],[-349,1897]],[[254353,276603],[-498,-1834],[-40,-1059],[323,-1231]],[[254138,272479],[-1368,-35]],[[252770,272444],[91,5015]],[[252861,277459],[114,6535]],[[228780,285028],[-17,-8118]],[[228763,276910],[-135,16]],[[228628,276926],[-1292,111]],[[230216,284984],[-6,-3141]],[[230210,281843],[-31,-4995]],[[230179,276848],[-1416,62]],[[230827,282367],[0,-513],[-617,-11]],[[232672,280107],[-600,939],[-233,1237]],[[218684,284633],[-13,-8156]],[[218671,276477],[-1432,43]],[[217239,276520],[3,8115]],[[210139,266701],[-717,-2]],[[209422,266699],[-123,-1]],[[209299,266698],[-2294,9]],[[220110,284569],[-7,-8139]],[[220103,276430],[-1432,47]],[[217239,276520],[0,-66]],[[217239,276454],[-1432,21]],[[215807,276475],[-9,8127]],[[215807,276475],[-1432,-37]],[[214375,276438],[-17,8112]],[[214375,276438],[-25,-1]],[[214350,276437],[-2377,-18]],[[221592,284512],[0,-8234]],[[221592,276278],[-49,0]],[[221543,276278],[-1440,152]],[[223030,284513],[0,-8233]],[[223030,276280],[-51,1]],[[222979,276281],[-1387,-3]],[[224478,276287],[-1448,-7]],[[271104,278782],[-447,-786]],[[270657,277996],[-226,1046],[-174,2784]],[[266444,282426],[-237,-2443]],[[266207,279983],[2,-920]],[[266209,279063],[-288,519]],[[265921,279582],[-345,931],[-187,1977]],[[251397,283946],[0,-6508]],[[251397,277438],[-1123,-9]],[[250274,277429],[-5,6613]],[[250274,277429],[-14,-1]],[[250260,277428],[-1136,15],[0,1061]],[[249124,278504],[1,4665]],[[252861,277459],[-1464,-21]],[[235261,283065],[11,-1603]],[[235272,281462],[1,-2618]],[[235273,278844],[-795,-2143]],[[234478,276701],[-463,610]],[[267244,277573],[-756,-2456]],[[266488,275117],[-124,3123],[-155,823]],[[264289,280637],[-142,-524],[-197,-2955],[-99,3]],[[263851,277161],[-538,-506]],[[263313,276655],[-159,-301]],[[263154,276354],[0,1215]],[[263154,277569],[-17,4853]],[[237108,279599],[-281,902],[-86,-872],[-299,1007],[-286,-1037],[-341,13],[-543,1850]],[[249124,278504],[-151,-881]],[[248973,277623],[-205,-34],[-580,-3455]],[[248188,274134],[-494,8],[0,1631],[-576,8],[0,1606]],[[256681,280271],[-69,-2498],[-191,-1960],[-869,-125],[4,-3255],[-143,-9]],[[255413,272424],[-143,-6],[-1,3253]],[[263154,277569],[-1076,448]],[[262078,278017],[-152,2577]],[[265921,279582],[1,-28]],[[265922,279554],[-184,35],[-659,-3027]],[[265079,276562],[-284,2688],[-271,295]],[[231442,282306],[2,-8953]],[[231444,273353],[-1049,21]],[[230395,273374],[-216,3474]],[[270657,277996],[-80,-1269]],[[270577,276727],[-329,-341],[-291,-3111],[55,-643]],[[270012,272632],[0,-5]],[[270012,272627],[-338,-491],[-153,1148]],[[269521,273284],[74,1606],[-301,1073],[-437,275]],[[268857,276238],[507,2500],[87,2150]],[[232785,279488],[1,-3858],[404,-2322]],[[233190,273308],[-1746,45]],[[268857,276238],[-59,1856],[-542,1927],[-262,-137]],[[237108,273999],[-848,-1143],[-402,1183]],[[235858,274039],[-244,1]],[[235614,274040],[-342,532],[1,4272]],[[197618,264167],[24,-1497]],[[197642,262670],[0,-8384],[-2346,-23]],[[195296,254263],[8,20372]],[[259834,275875],[18,-769],[-399,-590]],[[259453,274516],[-479,386],[-118,1013],[-486,-1586]],[[258370,274329],[-4,5537]],[[241644,277548],[-1,-1627]],[[241643,275921],[-577,18],[2,-799],[-433,-2]],[[240635,275138],[-285,12],[-4,2437]],[[273810,279002],[98,-1654]],[[273908,277348],[8,-2098]],[[273916,275250],[-11,-827]],[[273905,274423],[15,-90]],[[273920,274333],[-20,-184]],[[273900,274149],[-60,-392]],[[273840,273757],[-438,-2518],[175,-1903]],[[273577,269336],[17,-224]],[[273594,269112],[-42,-1026],[-431,800]],[[273121,268886],[-76,2024]],[[273045,270910],[44,2085],[-299,3226]],[[272790,276221],[-126,834]],[[265079,276562],[-41,-437]],[[265038,276125],[-259,143],[-399,-2644]],[[264380,273624],[-384,781]],[[263996,274405],[-145,2756]],[[262078,278017],[222,-1817]],[[262300,276200],[-162,-699],[-765,-79],[10,-1076],[-289,-21]],[[261094,274325],[-155,1623],[-575,1843]],[[256962,279061],[29,-2256],[255,-3763]],[[257246,273042],[-260,-2156],[4,-3296]],[[256990,267590],[-755,-8],[-207,1771],[-614,2276]],[[255414,271629],[-1,795]],[[243042,276115],[-252,-2320],[-86,-1940]],[[242704,271855],[-773,7]],[[241931,271862],[-288,2425],[0,1634]],[[268650,272453],[-454,-2106]],[[268196,270347],[-296,-908],[-412,5134]],[[267488,274573],[-244,3000]],[[268857,276238],[-273,-3365],[66,-420]],[[258370,274329],[-238,-1220]],[[258132,273109],[-630,1133],[-256,-1200]],[[274213,271739],[154,-1026],[-395,-1964],[241,2990]],[[273840,273757],[261,-1594],[-185,-2612],[-322,-439]],[[274414,275981],[264,-153],[280,-1524],[-294,-990],[-167,-1798],[-139,1959],[56,2506]],[[274160,276707],[170,-315],[46,-4156],[-277,1435],[-122,1906],[183,1130]],[[274632,277221],[33,-1171],[-536,816],[-157,-984],[-64,1466]],[[265516,275419],[-478,706]],[[265922,279554],[-53,-2957],[-353,-1178]],[[266488,275117],[0,-942]],[[266488,274175],[-328,-2106]],[[266160,272069],[-649,44]],[[265511,272113],[5,3306]],[[234478,276701],[5,-3100]],[[234483,273601],[0,-4335]],[[234483,269266],[-1322,-45]],[[233161,269221],[-81,1800],[110,2287]],[[244311,276709],[-53,-2458]],[[244258,274251],[-441,-8],[-351,-1303],[-29,-1625],[-344,-1798]],[[243093,269517],[-234,272],[-155,2066]],[[235614,274040],[-175,-434],[-956,-5]],[[271921,275805],[37,-1771],[275,-2845]],[[272233,271189],[-961,-1642]],[[271272,269547],[-98,1564],[-427,591]],[[270747,271702],[140,2717],[-310,2308]],[[250260,277428],[-1,-6571]],[[250259,270857],[-1135,-31]],[[249124,270826],[0,2438],[-151,4359]],[[246829,276146],[-140,-527],[-67,-2600],[-183,267],[-97,-2398]],[[246342,270888],[-114,-1301],[-411,-1386],[-315,624]],[[245502,268825],[-3,115]],[[245499,268940],[-61,70]],[[245438,269010],[-315,191],[118,1426]],[[245241,270627],[337,223],[252,2167],[-256,411],[68,1606],[-306,122],[53,2008]],[[263154,276354],[-211,-1787],[-562,-838]],[[262381,273729],[-81,2471]],[[200182,262669],[-2540,1]],[[273045,270910],[-142,209],[-547,-2637]],[[272356,268482],[-123,2707]],[[261094,274325],[1,-3262]],[[261095,271063],[-1173,-46],[-180,788]],[[259742,271805],[-224,1640]],[[259518,273445],[-65,1071]],[[249124,270826],[0,-3253]],[[249124,267573],[-1393,50]],[[247731,267623],[-42,2293],[499,4218]],[[240635,275138],[6,-4081],[-110,-1625]],[[240531,269432],[-347,19]],[[240184,269451],[-691,9]],[[239493,269460],[-75,1632],[-598,-3]],[[267488,274573],[-96,548],[-482,-3351]],[[266910,271770],[-422,2405]],[[252770,272444],[-27,-1509]],[[252743,270935],[-1345,-64]],[[251398,270871],[-1,6567]],[[251398,270871],[-1139,-14]],[[247731,267623],[-1360,-26]],[[246371,267597],[-29,3291]],[[245241,270627],[-1027,-144]],[[244214,270483],[-103,1786],[147,1982]],[[263996,274405],[-106,-4613]],[[263890,269792],[-3,-599]],[[263887,269193],[-267,9],[-340,1832]],[[263280,271034],[-27,-2]],[[263253,271032],[60,5623]],[[270747,271702],[-157,187]],[[270590,271889],[-578,743]],[[227150,277038],[6,-4410]],[[227156,272628],[-469,-47],[-452,-1537]],[[226235,271044],[-342,5178]],[[228628,276926],[1,-5287]],[[228629,271639],[-1086,-1713]],[[227543,269926],[-107,-742],[-280,1303]],[[227156,270487],[0,2141]],[[230395,273374],[194,-555]],[[230589,272819],[-1430,-4745]],[[229159,268074],[-124,-408],[-406,3973]],[[255414,271629],[-142,-188],[4,-2273],[-284,-8],[4,-2361],[-126,-263]],[[254870,266536],[-1130,-23]],[[253740,266513],[-126,1159],[208,569],[68,3761],[248,477]],[[263253,271032],[-736,-38]],[[262517,270994],[98,589],[-330,1226],[96,920]],[[217239,276454],[-26,-8133]],[[217213,268321],[-225,-2]],[[216988,268319],[-1199,8]],[[215789,268327],[18,8148]],[[218671,276477],[-13,-8190]],[[218658,268287],[-436,22]],[[218222,268309],[-1009,12]],[[220103,276430],[-15,-8195]],[[220088,268235],[-232,-5]],[[219856,268230],[-1198,57]],[[215789,268327],[-226,-12]],[[215563,268315],[-1213,-2]],[[214350,268313],[0,8124]],[[214350,268313],[-210,4]],[[214140,268317],[-1427,-23]],[[212713,268294],[-739,24]],[[265511,272113],[-316,-757],[-183,-1474]],[[265012,269882],[-430,1091]],[[264582,270973],[-206,1238],[4,1413]],[[221543,276278],[-5,-8068]],[[221538,268210],[-231,14]],[[221307,268224],[-1219,11]],[[224759,276248],[2,-3983],[-213,-701]],[[224548,271564],[-1040,-3414]],[[223508,268150],[-541,29]],[[222967,268179],[12,8102]],[[226235,271044],[225,-2721]],[[226460,268323],[-392,-1293]],[[226068,267030],[-565,-1869]],[[225503,265161],[-119,1166],[-213,-724],[-623,5961]],[[222967,268179],[-215,-7]],[[222752,268172],[-1214,38]],[[191393,274653],[-1,-12960]],[[191392,261693],[-1985,-97],[1,-3801],[-565,-10],[0,-1773]],[[188843,256012],[-5480,11408]],[[269521,273284],[-686,-1046]],[[268835,272238],[-185,215]],[[262517,270994],[-386,-1847],[16,-1276]],[[262147,267871],[-360,-24],[-203,1604],[-425,-24]],[[261159,269427],[-64,1636]],[[259742,271805],[-223,-445],[6,-3713]],[[259525,267647],[5,-1554],[-546,-20]],[[258984,266073],[-309,-26],[-4,1611],[-286,-16]],[[258385,267642],[-7,3607],[-246,1860]],[[241931,271862],[-1,-2445]],[[241930,269417],[-1399,15]],[[268196,270347],[-120,-1132]],[[268076,269215],[-774,-4371]],[[267302,264844],[-222,1408],[-144,2418]],[[266936,268670],[128,1356],[-154,1744]],[[264582,270973],[-5,-1325],[-687,144]],[[195296,254263],[-3927,9]],[[191369,254272],[23,7421]],[[258385,267642],[-117,-1603]],[[258268,266039],[-1141,-46]],[[257127,265993],[-137,1597]],[[235858,274039],[-247,-3595],[-56,-4246],[248,15]],[[235803,266213],[165,-2415]],[[235968,263798],[-1351,24]],[[234617,263822],[-133,12],[-1,5432]],[[244214,270483],[8,-2105],[-240,-3867]],[[243982,264511],[-60,1623],[-510,-1824],[-304,1856]],[[243108,266166],[-15,3351]],[[266936,268670],[-756,231]],[[266180,268901],[-20,3168]],[[237109,270346],[74,-4024]],[[237183,266322],[-1380,-109]],[[233161,269221],[87,-951]],[[233248,268270],[-1739,-1463]],[[231509,266807],[-6,123]],[[231503,266930],[-162,2701],[-752,3188]],[[269315,266119],[-168,-187]],[[269147,265932],[-152,1040],[-160,5266]],[[269521,273284],[-206,-7165]],[[270012,272627],[143,-2843],[-121,-4705]],[[270034,265079],[-575,985]],[[269459,266064],[-144,55]],[[238301,271119],[215,-818],[-12,-1664],[522,-3202]],[[239026,265435],[-240,-345],[-1,-1274]],[[238785,263816],[-1220,-19]],[[237565,263797],[-382,2525]],[[231503,266930],[-1231,-4027]],[[230272,262903],[-620,348]],[[229652,263251],[-493,4823]],[[227156,270487],[-696,-2164]],[[270590,271889],[127,-3676],[608,-623]],[[271325,267590],[-175,-617]],[[271150,266973],[-403,-4199]],[[270747,262774],[-221,704]],[[270526,263478],[-177,1370],[-315,231]],[[253740,266513],[-294,-3347],[251,-2068]],[[253697,261098],[-1046,-26]],[[252651,261072],[-26,3649]],[[252625,264721],[118,6214]],[[269147,265932],[-285,-745]],[[268862,265187],[-233,1642],[-442,1367],[-111,1019]],[[261159,269427],[-50,-2453],[-440,-327],[-199,-2179]],[[260470,264468],[-372,2],[4,1617],[-263,0],[-26,1492],[-288,68]],[[266180,268901],[-4,-1686]],[[266176,267215],[-979,52]],[[265197,267267],[-144,1878]],[[265053,269145],[-41,737]],[[271272,269547],[173,-1188]],[[271445,268359],[-120,-769]],[[243108,266166],[-323,-822]],[[242785,265344],[-856,1]],[[241929,265345],[1,4072]],[[257127,265993],[-143,-9],[6,-2440]],[[256990,263544],[-1656,-27]],[[255334,263517],[-331,-38],[-133,3057]],[[229652,263251],[-593,-1974]],[[229059,261277],[-293,2871],[-669,-2188]],[[228097,261960],[2,1607],[-453,1892],[173,815],[-272,611],[-4,3041]],[[225503,265161],[144,-1412],[-855,-2935]],[[224792,260814],[-82,738],[-489,-431]],[[224221,261121],[-713,7029]],[[245438,269010],[61,-70]],[[245502,268825],[-127,-1815],[-313,-1032],[-168,-1704]],[[244894,264274],[-270,-484],[77,-1752]],[[244701,262038],[-172,-287]],[[244529,261751],[-462,332]],[[244067,262083],[-85,2428]],[[272356,268482],[444,-3810]],[[272800,264672],[248,-708],[-50,-2336],[-442,1524]],[[272556,263152],[-244,2510],[-518,506],[-349,2191]],[[239493,269460],[179,-3272],[-322,2],[-3,-1288],[-321,533]],[[273103,263918],[241,-620],[-261,-1764],[-124,1738],[144,646]],[[273429,267956],[229,-1123],[-211,-968],[-18,2091]],[[273121,268886],[209,-711],[80,-2196],[219,-966],[-158,-953],[-438,1415],[-233,-803]],[[263887,269193],[-34,-3123]],[[263853,266070],[-27,-877],[-408,18]],[[263418,265211],[-156,2]],[[263262,265213],[18,5821]],[[263262,265213],[-700,78]],[[262562,265291],[-449,1252]],[[262113,266543],[34,1328]],[[265197,267267],[107,-2252]],[[265304,265015],[-1157,121],[0,-794]],[[264147,264342],[-294,1728]],[[252625,264721],[-414,-683],[-803,-568]],[[251408,263470],[-10,7401]],[[246371,267597],[-50,-4882]],[[246321,262715],[-773,1410],[-654,149]],[[251408,263470],[-93,-39]],[[251315,263431],[-1039,-418]],[[250276,263013],[-17,7844]],[[250276,263013],[-235,-98]],[[250041,262915],[-702,-302]],[[249339,262613],[-25,4964],[-190,-4]],[[228097,261960],[-913,-2938]],[[227184,259022],[-236,2295],[-214,-718]],[[226734,260599],[-666,6431]],[[268862,265187],[-531,-2011]],[[268331,263176],[-444,-556]],[[267887,262620],[-507,1245]],[[267380,263865],[-78,979]],[[241929,265345],[-140,-2434]],[[241789,262911],[-714,10],[-2,-1631],[-985,-12]],[[240088,261278],[64,2739],[215,1718],[-183,3716]],[[240088,261278],[187,-1588],[292,-495],[230,-1479]],[[240797,257716],[-541,-2780],[-190,-403]],[[240066,254533],[-710,332]],[[239356,254865],[-1,3236],[-281,-4],[-5,3280],[-287,5],[3,2434]],[[262113,266543],[-202,-2490],[-1,-1443]],[[261910,262610],[38,-331]],[[261948,262279],[-247,-1122],[-557,78],[-1,-1623]],[[261143,259612],[-925,-26]],[[260218,259586],[89,792]],[[260307,260378],[163,4090]],[[234617,263822],[-104,-1184],[69,-2704],[234,-2044]],[[234816,257890],[-383,-1877]],[[234433,256013],[-270,786],[-111,1767],[-372,551]],[[233680,259117],[-7,1203],[-351,1944],[-118,1559],[44,4447]],[[267380,263865],[-842,-11]],[[266538,263854],[-369,126]],[[266169,263980],[7,3235]],[[273082,261033],[-133,-2581],[-38,2028],[171,553]],[[272467,260258],[-390,845]],[[272077,261103],[-418,1230],[-343,2022],[41,1842],[-207,776]],[[272556,263152],[364,-1898],[-453,-996]],[[218222,268309],[-10,-7269]],[[218212,261040],[-112,-2492],[-1121,-109]],[[216979,258439],[2,1757]],[[216981,260196],[7,8123]],[[216981,260196],[-1417,10]],[[215564,260206],[-1,8109]],[[215564,260206],[-1425,-1]],[[214139,260205],[1,8112]],[[214139,260205],[-87,1]],[[214052,260206],[-1250,7]],[[212802,260213],[-89,1]],[[212713,260214],[0,8080]],[[212713,260214],[-1472,-6]],[[211241,260208],[2,6496]],[[219856,268230],[-1,-7250]],[[219855,260980],[-1643,60]],[[233680,259117],[-1054,-950],[-246,-706]],[[232380,257461],[15,2779],[-147,-648]],[[232248,259592],[-249,2566],[-298,601],[38,1653],[-230,2395]],[[222752,268172],[-19,-11396]],[[222733,256776],[-311,-1069],[-354,1218],[-198,-944],[-249,1262]],[[221621,257243],[-334,1575]],[[221287,258818],[20,9406]],[[221287,258818],[-1085,65]],[[220202,258883],[-345,20],[-2,2077]],[[224221,261121],[-256,-235],[-55,-1438],[-590,-2354]],[[223320,257094],[-275,-434]],[[223045,256660],[-312,116]],[[260218,259586],[-114,-1]],[[260104,259585],[-994,-4]],[[259110,259581],[-7,3224],[-142,-9],[23,3277]],[[259110,259581],[-135,-3310]],[[258975,256271],[-230,291],[-9,1358],[-330,-1425],[-5,1399],[-275,-34]],[[258126,257860],[-1,2419],[142,6],[1,5754]],[[247731,267623],[274,-3564],[25,-1966]],[[248030,262093],[-341,-656]],[[247689,261437],[-106,-329],[-1263,-24]],[[246320,261084],[1,1631]],[[249339,262613],[-284,-111]],[[249055,262502],[-612,-243]],[[248443,262259],[-413,-166]],[[266169,263980],[-1,-929],[-528,-12]],[[265640,263039],[-382,824]],[[265258,263863],[46,1152]],[[225328,255832],[-536,4982]],[[226734,260599],[-1152,-3887]],[[225582,256712],[-254,-880]],[[272077,261103],[-207,-2290],[-271,-705]],[[271599,258108],[-852,4666]],[[232248,259592],[-1251,-3816]],[[230997,255776],[-725,7127]],[[209299,266698],[-218,-16661]],[[209081,250037],[-2269,-8219]],[[206812,241818],[27,3208],[-31,21680]],[[206812,241818],[-175,-639]],[[206637,241179],[-655,3287],[-500,980],[-452,2433],[-137,1784],[-467,1522],[-266,2270],[-357,1834]],[[203803,255289],[-2,11451]],[[203803,255289],[-618,1714],[-454,4718],[-407,953]],[[211241,260208],[-789,7]],[[210452,260215],[-226,1786],[-294,419],[-120,2210],[-128,-359],[-262,2428]],[[210452,260215],[261,-433],[176,-3774],[534,31],[187,-1030],[512,-17]],[[212122,254992],[-1599,-11259]],[[210523,243733],[-1442,6304]],[[262562,265291],[-9,-2748],[-135,18]],[[262418,262561],[-508,49]],[[255334,263517],[-41,-2445],[-142,-14],[4,-2674],[-156,-742],[132,-1478],[-365,-604],[-167,-1944]],[[254599,253616],[-506,-1944]],[[254093,251672],[-63,1221],[229,2446],[-147,-275],[95,2173],[-484,2051],[-26,1810]],[[237565,263797],[234,-2648],[-111,-2155]],[[237688,258994],[-417,-314]],[[237271,258680],[-297,954],[-857,614]],[[236117,260248],[-149,3550]],[[244067,262083],[-416,-314],[-36,-1776],[-276,-171],[-2,-3574],[-156,-1569],[81,-1641]],[[243262,253038],[-258,531],[-178,-1296],[-48,1873]],[[242778,254146],[7,11198]],[[269459,266064],[0,-2383],[-247,7],[-4,-2375]],[[269208,261313],[-295,-711]],[[268913,260602],[-583,-22],[1,2596]],[[264147,264342],[212,-842],[-100,-3841]],[[264259,259659],[-425,-12]],[[263834,259647],[-269,0]],[[263565,259647],[-156,2805],[9,2759]],[[270526,263478],[-236,-1000],[1,-5622]],[[270291,256856],[-262,1105]],[[270029,257961],[-821,3352]],[[258126,257860],[-564,-27]],[[257562,257833],[-384,26],[-188,2000],[3,2240]],[[256993,262099],[-3,1445]],[[263565,259647],[-754,-30]],[[262811,259617],[-348,-20],[-45,2964]],[[242778,254146],[-219,178]],[[242559,254324],[-305,2653]],[[242254,256977],[-195,277],[-241,2436],[-29,3221]],[[265258,263863],[-181,-811],[-39,-2867]],[[265038,260185],[-69,-496],[-710,-30]],[[252692,256194],[-1093,-41]],[[251599,256153],[-284,-4]],[[251315,256149],[0,7282]],[[252651,261072],[41,-4878]],[[246320,261084],[-2,-1627]],[[246318,259457],[-1160,-19]],[[245158,259438],[-408,1159],[-49,1441]],[[227703,254041],[-519,4981]],[[229059,261277],[364,-3474]],[[229423,257803],[-1328,-4514]],[[228095,253289],[-182,-662],[-210,1414]],[[266538,263854],[73,-1664]],[[266611,262190],[-131,-3053]],[[266480,259137],[-414,-482]],[[266066,258655],[-411,1022],[-15,3362]],[[267887,262620],[-7,-2008]],[[267880,260612],[-912,138],[0,1415],[-357,25]],[[266066,258655],[-13,-4419]],[[266053,254236],[-962,79]],[[265091,254315],[4,2025]],[[265095,256340],[-57,3845]],[[236117,260248],[245,-1198],[-44,-6786]],[[236318,252264],[-314,1644],[-175,1815],[-632,880],[-381,1287]],[[239356,254865],[-430,-6],[-146,-1627],[-240,7],[-65,-1705]],[[238475,251534],[-133,-174]],[[238342,251360],[-234,2339],[-88,3954],[-332,1341]],[[271599,258108],[109,-1595]],[[271708,256513],[-299,-2289]],[[271409,254224],[-861,806]],[[270548,255030],[-29,1447],[-228,379]],[[256993,262099],[-405,-645],[-234,-1413],[-90,-2314],[-724,-4800]],[[255540,252927],[-525,-296]],[[255015,252631],[-416,985]],[[251315,256149],[-565,11]],[[250750,256160],[-705,0]],[[250045,256160],[-4,6755]],[[229993,252193],[-570,5610]],[[230997,255776],[-230,-1047]],[[230767,254729],[-774,-2536]],[[268913,260602],[84,-3783]],[[268997,256819],[-88,-1964]],[[268909,254855],[-525,10],[-61,691],[-839,350]],[[267484,255906],[-15,966]],[[267469,256872],[411,3740]],[[242254,256977],[-1212,-1625],[-245,2364]],[[250045,256160],[-145,0]],[[249900,256160],[-376,-7]],[[249524,256153],[-46,1959],[-425,1320],[2,3070]],[[262811,259617],[-6,-2207]],[[262805,257410],[-584,-281],[-45,579]],[[262176,257708],[-228,4571]],[[262176,257708],[-117,-3882]],[[262059,253826],[-920,118]],[[261139,253944],[4,5668]],[[249524,256153],[-188,2]],[[249336,256155],[-474,-1],[2,-814],[-378,9]],[[248486,255349],[-43,6910]],[[267469,256872],[-538,69]],[[266931,256941],[-451,2196]],[[244529,261751],[-62,-2123],[-258,460],[229,-1495],[-276,-599],[18,-3120],[-205,750],[174,-2365],[-387,-521],[182,-1100]],[[243944,251638],[-102,-1383],[173,-931],[-202,-1256]],[[243813,248068],[-73,-540]],[[243740,247528],[12,447]],[[243752,247975],[-182,929]],[[243570,248904],[129,2677],[-437,1457]],[[248486,255349],[-225,-1013]],[[248261,254336],[-569,265]],[[247692,254601],[-3,6836]],[[257562,257833],[96,-2876],[-100,-437],[8,-2858]],[[257566,251662],[-179,1283],[-1847,-18]],[[245158,259438],[-12,-4904]],[[245146,254534],[-217,450],[-649,-954],[-49,-1688],[-287,-704]],[[191369,254272],[-1713,-9],[-813,1749]],[[225328,255832],[-812,-3459]],[[224516,252373],[-177,743],[-194,2530],[-443,141],[-382,1307]],[[247692,254601],[-45,0]],[[247647,254601],[-802,-13]],[[246845,254588],[-237,-7]],[[246608,254581],[0,4882],[-290,-6]],[[270029,257961],[-328,-1873],[-203,-243]],[[269498,255845],[-501,974]],[[226342,249372],[-760,7340]],[[227703,254041],[-1361,-4669]],[[220202,258883],[-12,-9165]],[[220190,249718],[-1597,-27]],[[218593,249691],[-12,8144],[-1602,88]],[[216979,257923],[0,516]],[[254093,251672],[-73,-563]],[[254020,251109],[-140,-343],[-854,-8],[-285,-550]],[[252741,250208],[-49,5986]],[[272895,258076],[-221,-2947],[-140,1836],[361,1111]],[[272467,260258],[359,-497],[69,-955],[-372,-536],[-14,-3438],[142,-738],[-530,300]],[[272121,254394],[-413,2119]],[[232380,257461],[233,-3410],[-192,-919],[-109,-3298]],[[232312,249834],[-587,-40],[-741,-2203]],[[230984,247591],[-246,5282],[29,1856]],[[215564,260206],[-1,-10641]],[[215563,249565],[-1463,119]],[[214100,249684],[-48,10522]],[[214100,249684],[-246,18]],[[213854,249702],[-112,1974],[-687,2489],[-255,-616]],[[212800,253549],[2,6664]],[[237271,258680],[3,-1922],[-169,-1045],[14,-5133]],[[237119,250580],[-252,-652]],[[236867,249928],[-549,2336]],[[216979,257923],[-20,-8366]],[[216959,249557],[-1396,8]],[[212800,253549],[-158,-489],[-520,1932]],[[265095,256340],[-399,-67]],[[264696,256273],[-805,-61]],[[263891,256212],[-57,3435]],[[263891,256212],[-578,-54]],[[263313,256158],[-423,46],[-85,1206]],[[261139,253944],[-190,-1282],[-485,462],[-142,-1410]],[[260322,251714],[-224,22]],[[260098,251736],[6,7849]],[[260098,251736],[-1121,-78]],[[258977,251658],[-2,4613]],[[246608,254581],[-1058,-7],[-230,-519]],[[245320,254055],[-174,479]],[[238342,251360],[-866,-337]],[[237476,251023],[-357,-443]],[[266931,256941],[-267,-2338]],[[266664,254603],[-217,-428]],[[266447,254175],[-394,61]],[[234433,256013],[126,-728]],[[234559,255285],[-1328,-6123]],[[233231,249162],[-512,-2377]],[[232719,246785],[-160,1025],[33,1830],[-280,194]],[[221621,257243],[-4,-7538]],[[221617,249705],[-1427,13]],[[270548,255030],[135,-1217],[-559,-1966],[-260,400]],[[269864,252247],[-282,1360],[-84,2238]],[[258977,251658],[18,-3690]],[[258995,247968],[-561,3]],[[258434,247971],[-835,7]],[[257599,247978],[-33,3684]],[[218593,249691],[-762,-75]],[[217831,249616],[-872,-59]],[[236867,249928],[-914,-1225]],[[235953,248703],[-290,477]],[[235663,249180],[-783,1632]],[[234880,250812],[-186,3541],[-135,932]],[[263313,256158],[-12,-3257]],[[263301,252901],[-768,-60],[-14,-3409]],[[262519,249432],[-296,57]],[[262223,249489],[-201,1664],[37,2673]],[[229345,250051],[-671,-2227]],[[228674,247824],[-579,5465]],[[229993,252193],[-648,-2142]],[[242559,254324],[-409,-313],[69,-6634],[-201,53]],[[242018,247430],[-298,679],[-278,-1715],[-307,-248]],[[241135,246146],[-630,-114]],[[240505,246032],[-17,6745],[-422,1756]],[[223045,256660],[-5,-9678]],[[223040,246982],[-1093,-7]],[[221947,246975],[-331,2],[1,2728]],[[224516,252373],[110,-2638],[233,-1105]],[[224859,248630],[-17,-2012]],[[224842,246618],[-1446,-2]],[[223396,246616],[-356,366]],[[267484,255906],[289,-2603],[-29,-1804]],[[267744,251499],[-329,-678],[-91,-2266]],[[267324,248555],[-270,35]],[[267054,248590],[-114,4038],[-276,1975]],[[269864,252247],[216,-986],[1,-1604],[213,-1377]],[[270294,248280],[-791,53],[-15,-4066],[756,-202],[-181,-4018]],[[270063,240047],[-569,247]],[[269494,240294],[-47,4435],[-166,-9],[13,2675],[-283,1029],[-221,3072]],[[268790,251496],[-78,1758],[187,-78]],[[268899,253176],[10,1679]],[[226342,249372],[-12,-642]],[[226330,248730],[-1471,-100]],[[272518,253791],[20,18]],[[272538,253809],[99,-1699],[-281,-1544],[-109,1279],[124,2060],[147,-114]],[[272121,254394],[4,-51]],[[272125,254343],[81,-132]],[[272206,254211],[155,-845],[-204,-1996],[71,-2600],[-325,802]],[[271903,249572],[-591,1666]],[[271312,251238],[97,2986]],[[264696,256273],[-167,-1561],[-391,-949],[-69,-1201],[-328,-1573],[-68,-1447]],[[263673,249542],[-96,10]],[[263577,249552],[15,3293],[-291,56]],[[265091,254315],[-12,-4796]],[[265079,249519],[-315,12]],[[264764,249531],[-724,18]],[[264040,249549],[-367,-7]],[[252741,250208],[18,-2159]],[[252759,248049],[-1139,-6]],[[251620,248043],[-21,8110]],[[250750,256160],[24,-9758]],[[250774,246402],[-565,1]],[[250209,246403],[-23,1870]],[[250186,248273],[3,6261],[-287,-6],[-2,1632]],[[250186,248273],[-850,-146]],[[249336,248127],[0,8028]],[[251620,248043],[-141,-1624]],[[251479,246419],[-705,-17]],[[249336,248127],[-206,-4]],[[249130,248123],[-300,-5]],[[248830,248118],[0,1358],[-237,-6],[-309,1882],[-23,2984]],[[268790,251496],[-833,9]],[[267957,251505],[-213,-6]],[[234880,250812],[-269,-1952],[-727,-4046]],[[233884,244814],[-145,1529],[-209,-878]],[[233530,245465],[-193,-35],[-106,3732]],[[213854,249702],[556,-1560],[549,-266],[329,-1468],[180,-3869],[116,-913]],[[215584,241626],[-1029,50],[-1,-1090],[-571,24],[0,-5857],[-623,-16],[0,-4293]],[[213360,230444],[-2433,11417]],[[210927,241861],[-404,1872]],[[271312,251238],[-472,-2258]],[[270840,248980],[-349,503],[-197,-1203]],[[245320,254055],[101,-733],[-2,-5263]],[[245419,248059],[-325,3]],[[245094,248062],[-1281,6]],[[240505,246032],[-431,-220]],[[240074,245812],[-1234,93],[-382,-268]],[[238458,245637],[138,2982],[-121,2915]],[[230984,247591],[-297,-1133],[-306,-3132],[-307,-919]],[[230074,242407],[-150,660]],[[229924,243067],[-83,1790],[-230,1424],[-92,2592],[-174,1178]],[[267054,248590],[-504,85]],[[266550,248675],[-89,305]],[[266461,248980],[-188,553]],[[266273,249533],[181,2384],[-7,2258]],[[246845,254588],[1,-6514]],[[246846,248074],[-55,0]],[[246791,248074],[-720,-7]],[[246071,248067],[-652,-8]],[[247647,254601],[2,-6508]],[[247649,248093],[-244,-6]],[[247405,248087],[-559,-13]],[[248830,248118],[-1181,-25]],[[243570,248904],[-75,-474]],[[243495,248430],[-154,-909],[-26,-2268]],[[243315,245253],[-1107,8]],[[242208,245261],[-190,2169]],[[266273,249533],[3,-822],[-452,71]],[[265824,248782],[-746,72],[1,665]],[[228674,247824],[-526,-1799],[-157,-2556]],[[227991,243469],[-863,2199],[-567,665]],[[226561,246333],[-231,2397]],[[255015,252631],[47,-4598]],[[255062,248033],[-100,-2449],[292,-2293],[343,-1258],[-72,-3553]],[[255525,238480],[118,-709],[-472,-3244],[-776,-834],[-363,138],[617,1003],[-445,2269],[13,2457],[-99,3216],[-227,556]],[[253891,243332],[-3,424]],[[253888,243756],[51,358]],[[253939,244114],[171,4892],[-90,2103]],[[262223,249489],[73,-1396]],[[262296,248093],[-1355,-67]],[[260941,248026],[8,3775],[-627,-87]],[[257599,247978],[-271,46]],[[257328,248024],[-1052,37]],[[256276,248061],[-1214,-28]],[[263577,249552],[-524,-184]],[[263053,249368],[-534,64]],[[260941,248026],[-26,-3]],[[260915,248023],[-1496,-68]],[[259419,247955],[-424,13]],[[238458,245637],[-203,-3553],[-301,-2557],[116,-1801],[-122,-774]],[[237948,236952],[-67,-1097],[156,-1846]],[[238037,234009],[-534,-28]],[[237503,233981],[98,13117],[-125,3925]],[[269494,240294],[-114,45]],[[269380,240339],[-346,137]],[[269034,240476],[-18,2136],[-493,492],[-222,1908],[-346,636]],[[267955,245648],[2,5857]],[[267955,245648],[-134,-370]],[[267821,245278],[-66,1821],[-380,52],[-51,1404]],[[253939,244114],[-283,-5327],[-10,-2293],[-805,174]],[[252841,236668],[-47,6490]],[[252794,243158],[-35,4891]],[[272307,246842],[-203,-3711],[-81,2742],[284,969]],[[271903,249572],[306,-2478],[-160,-4072],[-292,-203]],[[271757,242819],[-831,2065]],[[270926,244884],[0,3895],[-86,201]],[[237503,233981],[-603,-19]],[[236900,233962],[96,1937],[-93,1644],[125,1714]],[[237028,239257],[57,2122],[-200,796],[-362,6258],[-570,270]],[[235663,249180],[-268,-877],[313,-9029]],[[235708,239274],[21,-670],[-542,-17]],[[235187,238587],[-329,77]],[[234858,238664],[56,882],[-384,658],[-240,1922],[-168,-357],[-46,2247],[-192,798]],[[229924,243067],[-953,-3232]],[[228971,239835],[-534,-1857]],[[228437,237978],[-325,5186],[-121,305]],[[209922,237143],[-279,-6],[-3006,4042]],[[210927,241861],[-1005,-4718]],[[232719,246785],[-682,-1234]],[[232037,245551],[-850,-766]],[[231187,244785],[-203,2806]],[[221947,246975],[2,-4279]],[[221949,242696],[-1761,-8]],[[220188,242688],[2,7030]],[[220188,242688],[-2353,-81]],[[217835,242607],[-4,7009]],[[217835,242607],[0,-7787]],[[217835,234820],[-2223,6]],[[215612,234826],[279,1284],[-229,1216],[263,2565],[-18,1122],[-323,613]],[[264040,249549],[-12,-7241]],[[264028,242308],[-1345,403]],[[262683,242711],[300,3247],[70,3410]],[[264764,249531],[114,-3092],[-22,-4394]],[[264856,242045],[-554,176]],[[264302,242221],[-274,87]],[[266550,248675],[98,-2368],[249,-1172],[-274,-444],[-99,-1222],[356,-2141]],[[266880,241328],[-709,260]],[[266171,241588],[-368,134]],[[265803,241722],[21,7060]],[[265803,241722],[-735,254]],[[265068,241976],[-212,69]],[[262683,242711],[-3,0]],[[262680,242711],[-384,5382]],[[270926,244884],[-366,-1369],[-37,-1852],[123,-1709],[-124,-3745]],[[270522,236209],[-335,-64],[-107,1022],[-17,2880]],[[237028,239257],[-1320,17]],[[233530,245465],[-89,-6610]],[[233441,238855],[-666,84],[-646,2258]],[[232129,241197],[-92,4354]],[[244740,241601],[-76,124]],[[244664,241725],[-138,1864],[-596,-160],[213,1883],[-298,-206],[-105,2422]],[[245094,248062],[-354,-6461]],[[226561,246333],[-375,-2252],[-241,-2998]],[[225945,241083],[-212,-3685]],[[225733,237398],[-624,1108]],[[225109,238506],[-245,3503],[173,1353],[-5,1659],[-190,1597]],[[267821,245278],[-326,-1352],[-1,-2846]],[[267494,241080],[-481,193]],[[267013,241273],[-88,37]],[[266925,241310],[-45,18]],[[244664,241725],[-233,-2739],[-196,-268]],[[244235,238718],[-602,5]],[[243633,238723],[-154,6]],[[243479,238729],[63,3797],[-227,2727]],[[243752,247975],[-257,455]],[[250209,246403],[-2,-4881]],[[250207,241522],[-565,12],[0,-2449],[-406,-1071]],[[249236,238014],[-349,2359],[-75,1498]],[[248812,241871],[318,6252]],[[248812,241871],[-426,-22],[-726,870]],[[247660,242719],[-255,5368]],[[242208,245261],[112,-1501],[-109,-3720],[-662,-628],[-123,-1003]],[[241426,238409],[-387,12]],[[241039,238421],[5,125]],[[241044,238546],[92,1719],[-1,5881]],[[262680,242711],[-189,-1959]],[[262491,240752],[-656,31],[-11,-813],[-591,47]],[[261233,240017],[-143,13]],[[261090,240030],[8,4056],[-466,837]],[[260632,244923],[283,3100]],[[247660,242719],[34,-9078]],[[247694,233641],[-96,120]],[[247598,233761],[-55,1170],[-290,-153]],[[247253,234778],[-284,1435],[-176,2313],[-2,3039]],[[246791,241565],[0,6509]],[[256232,239600],[16,-2077],[-262,-1642],[-543,-650],[107,1725],[233,527],[-258,997]],[[256276,248061],[-334,-1385],[-81,-3536],[371,-3540]],[[257328,248024],[-39,-10998]],[[257289,237026],[-1052,-1037],[665,1910],[-225,961],[-136,-1053],[-250,2451],[-59,-658]],[[252794,243158],[-1314,0]],[[251480,243158],[-1,3261]],[[246791,241565],[-956,-12]],[[245835,241553],[167,1301]],[[246002,242854],[-21,4096],[90,1117]],[[258434,247971],[-17,-10056]],[[258417,237915],[-166,1067],[-410,-2043],[-552,87]],[[246002,242854],[-1125,-260],[-121,-1038]],[[244756,241556],[-16,45]],[[260632,244923],[-55,-1607],[-562,869],[-66,-1633]],[[259949,242552],[-537,37],[7,5366]],[[259949,242552],[-196,-1239],[99,-2459],[-315,-2140]],[[259537,236714],[-9,-2240]],[[259528,234474],[-1118,2046]],[[258410,236875],[0,-355]],[[258410,236875],[816,-133],[-426,1780],[-383,-607]],[[231187,244785],[-45,-4378],[221,-3089],[-139,-1697]],[[231224,235621],[12,737],[-414,180]],[[230822,236538],[-165,3013],[-358,1438],[-320,391],[95,1027]],[[223396,246616],[1,-7873]],[[223397,238743],[-946,26]],[[222451,238769],[-503,-4],[1,3931]],[[225109,238506],[-674,264]],[[224435,238770],[-1038,-27]],[[251480,243158],[0,-1087]],[[251480,242071],[-990,-2],[-283,-547]],[[228437,237978],[-499,-1008]],[[227938,236970],[-97,304]],[[227841,237274],[-634,1522],[-437,-1264],[-263,726],[-303,2900],[-259,-75]],[[234858,238664],[-878,-2778]],[[233980,235886],[-396,1124],[-143,1845]],[[241044,238546],[-396,8],[-9,-943],[-990,-262]],[[239649,237349],[2,3245],[421,9],[2,5209]],[[239649,237349],[0,-382]],[[239649,236967],[-709,-8],[2,1629],[-283,7],[1,-1639],[-712,-4]],[[269034,240476],[-293,113]],[[268741,240589],[-1247,491]],[[232129,241197],[72,-7162]],[[232201,234035],[-806,-384]],[[231395,233651],[-171,1970]],[[243479,238729],[216,-1917],[-535,411],[-328,-897]],[[242832,236326],[-172,207],[-257,-1508]],[[242403,235025],[-94,2569],[-194,809],[-689,6]],[[261090,240030],[-142,0],[-5,-2437],[-1018,73],[-388,-952]],[[271757,242819],[498,-308],[-34,-3432],[-155,926],[-295,-107]],[[271771,239898],[-322,203],[-925,-5548]],[[270524,234553],[-2,1656]],[[252841,236668],[-233,-1277],[-178,1270],[-575,-702],[-371,1453]],[[251484,237412],[-4,4659]],[[230822,236538],[-952,-1549]],[[229870,234989],[-278,409],[-621,4437]],[[245835,241553],[-210,-1460],[-15,-2062],[278,-2140]],[[245888,235891],[-360,-439]],[[245528,235452],[-338,30]],[[245190,235482],[-277,639],[124,2784],[-183,-36],[-98,2687]],[[249236,238014],[203,-4319],[261,-907]],[[249700,232788],[-283,-440]],[[249417,232348],[-471,-68],[-254,869],[-304,-894],[-309,779]],[[248079,233034],[-385,607]],[[264302,242221],[-267,-2074],[-54,-1701],[-693,-1753]],[[263288,236693],[-375,1330],[-2,1097],[-281,268],[-139,1364]],[[222451,238769],[6,-3970]],[[222457,234799],[-1261,76]],[[221196,234875],[-1009,-7]],[[220187,234868],[1,7820]],[[220187,234868],[-1627,-38]],[[218560,234830],[-725,-10]],[[265068,241976],[85,-2796],[-178,-1],[-97,-4622]],[[264878,234557],[-479,557],[-1297,-63]],[[263102,235051],[186,1642]],[[251484,237412],[-1134,-2305],[-141,1298]],[[250209,236405],[-2,5117]],[[266171,241588],[21,-1291],[-370,-1383],[42,-1369],[-274,-2432]],[[265590,235113],[-266,-1104],[-213,-2775]],[[265111,231234],[-234,66]],[[264877,231300],[1,3257]],[[209944,215738],[-22,21405]],[[213360,230444],[686,-3232]],[[214046,227212],[-190,-2194],[-356,428],[-422,-724],[-393,-4187],[-190,-3082],[-26,-2697],[-288,-495],[-452,-3923],[-784,1354],[-338,2103],[-458,443],[-205,1500]],[[245190,235482],[-472,-15],[-483,3251]],[[215612,234826],[-8,-9436]],[[215604,225390],[-988,210],[-570,1612]],[[247253,234778],[-437,-1709],[-207,516]],[[246609,233585],[-184,-841],[-537,3147]],[[266925,241310],[88,-37]],[[267013,241273],[105,-135],[78,-2865],[203,-1637]],[[267399,236636],[-213,-2319]],[[267186,234317],[-334,-5]],[[266852,234312],[-283,815],[-979,-14]],[[250209,236405],[34,-1301],[-543,-2316]],[[268741,240589],[-104,-715],[226,-2817],[-101,-1193],[-315,-130]],[[268447,235734],[-586,1764],[-462,-862]],[[209944,215738],[-499,619],[-308,933],[-500,3117],[-209,111],[-481,2314],[-467,5014],[-27,4955],[-481,3934],[-35,2230],[-300,2214]],[[233980,235886],[192,-3310]],[[234172,232576],[-466,-2513],[-754,2533],[-380,-1253],[-369,-201]],[[232203,231142],[-2,2893]],[[227841,237274],[-344,-3901],[-437,-2646]],[[227060,230727],[-169,-807]],[[226891,229920],[-1289,6177]],[[225602,236097],[131,1301]],[[262491,240752],[-511,-7567]],[[261980,233185],[-763,18]],[[261217,233203],[16,6814]],[[263102,235051],[119,-3211],[349,-2174]],[[263570,229666],[-1288,55],[-50,-791]],[[262232,228930],[-308,1351],[56,2904]],[[269380,240339],[4,-8335]],[[269384,232004],[-309,-3002],[110,-640]],[[269185,228362],[-359,-2062]],[[268826,226300],[-394,1903]],[[268432,228203],[15,7531]],[[272248,234159],[-9,-2722],[-434,368]],[[271805,231805],[-186,100],[91,1895],[-113,885],[151,2029],[471,-634],[29,-1921]],[[272388,234172],[-135,-12]],[[272253,234160],[-2,2672],[137,-2660]],[[271771,239898],[387,-696],[23,-1979],[-488,-401],[1,-1430],[-265,-958],[92,-1411]],[[271521,233023],[-998,-79]],[[270523,232944],[1,1609]],[[270523,232944],[0,-816]],[[270523,232128],[-259,0]],[[270264,232128],[-880,-124]],[[261213,230026],[6,-1939]],[[261219,228087],[-831,3621],[181,87],[319,-1692],[325,-77]],[[261217,233203],[-4,-3055]],[[261213,230148],[-256,-46],[-113,1656],[-199,-122],[-386,1289],[-6,-1143],[-725,2692]],[[229870,234989],[-428,-2537]],[[229442,232452],[-640,-2032]],[[228802,230420],[-160,3872],[-704,2678]],[[236900,233962],[5,-1513]],[[236905,232449],[-445,185],[-184,-1246],[-288,178]],[[235988,231566],[-422,-16],[-379,7037]],[[224435,238770],[11,-6721]],[[224446,232049],[-926,-12]],[[223520,232037],[-1061,-73],[-2,2835]],[[225602,236097],[-347,-5926]],[[225255,230171],[-325,-1870]],[[224930,228301],[-484,3748]],[[245308,223867],[-799,1569],[36,944],[-274,2264]],[[244271,228644],[603,287]],[[244874,228931],[203,-2331],[251,-832],[-20,-1901]],[[244558,230559],[-645,-479],[-351,1662],[-258,-1459],[-367,543]],[[242937,230826],[126,1509],[-231,3991]],[[243633,238723],[169,-1018],[54,-2471],[406,-1498],[38,-2365],[258,-812]],[[245528,235452],[-238,-4825]],[[245290,230627],[-329,-692]],[[244961,229935],[-403,624]],[[235988,231566],[8,-4159]],[[235996,227407],[-1499,-100]],[[234497,227307],[-325,5269]],[[239649,236967],[279,-442],[95,-4141],[287,-11],[14,-1373],[-301,-819]],[[240023,230181],[-367,261],[-1652,-20]],[[238004,230422],[33,3587]],[[241039,238421],[19,-2543]],[[241058,235878],[90,-2556],[-90,-2140]],[[241058,231182],[-312,-1023]],[[240746,230159],[-723,22]],[[242403,235025],[-396,-2817]],[[242007,232208],[-408,-1799],[-460,906]],[[241139,231315],[-81,-133]],[[268432,228203],[-222,-845]],[[268210,227358],[-526,3596],[-439,645],[-59,2718]],[[228802,230420],[-812,-4930]],[[227990,225490],[-930,5237]],[[231395,233651],[-275,-1643],[131,-1238]],[[231251,230770],[-412,483],[-916,-965]],[[229923,230288],[-71,1866],[-410,298]],[[242937,230826],[-38,-676]],[[242899,230150],[-457,1473],[-435,585]],[[226432,226825],[-346,-1970]],[[226086,224855],[-87,1789],[-744,3527]],[[226891,229920],[-513,-2622],[54,-473]],[[246609,233585],[-25,-1023]],[[246584,232562],[-762,-996],[-135,-865]],[[245687,230701],[0,-1]],[[245687,230700],[-397,-73]],[[266852,234312],[-10,-6935],[145,-1217]],[[266987,226160],[-200,-2815]],[[266787,223345],[-399,937],[-283,2980],[-405,1944],[-589,2028]],[[264877,231300],[-794,-653],[8,-1736],[-255,56]],[[263836,228967],[-266,699]],[[247598,233761],[-477,-3687],[-248,-294],[-10,-2337]],[[246863,227443],[-276,26]],[[246587,227469],[-43,-63]],[[246544,227406],[-91,2727],[131,2429]],[[218560,234830],[1,-12369]],[[218561,222461],[3,-3801],[-131,-3064],[-135,-246]],[[218298,215350],[-586,2295],[-155,1738],[-559,1471],[-109,1938],[-428,2706],[-230,-539],[-627,431]],[[221196,234875],[-9,-4032]],[[221187,230843],[-585,153],[-126,-5325],[-5,-3218]],[[220471,222453],[-272,-3]],[[220199,222450],[-1638,11]],[[223520,232037],[7,-6643]],[[223527,225394],[-721,2115],[-1183,235]],[[221623,227744],[-251,17],[4,3079],[-189,3]],[[268210,227358],[-114,-1168]],[[268096,226190],[-1109,-30]],[[272837,223331],[-14,0]],[[272823,223331],[-64,-213]],[[272759,223118],[-215,-625],[-556,-55]],[[271988,222438],[-4,2546]],[[271984,224984],[-177,2427],[99,1442],[-322,1679],[221,1273]],[[272248,234159],[350,-6434],[-19,-1080],[258,-3314]],[[272388,234172],[216,-5656],[-351,5644]],[[238004,230422],[-370,-3472]],[[237634,226950],[-15,2086],[-480,949],[-234,2464]],[[232203,231142],[-438,1363],[375,-6983]],[[232140,225522],[-575,-1123]],[[231565,224399],[-196,1520],[-118,4851]],[[247737,223729],[-329,25],[-92,1327],[-453,2362]],[[247598,233761],[-7,-4805],[112,-2059],[203,-841],[-169,-2327]],[[248079,233034],[-93,-5082],[222,493],[142,-926]],[[248350,227519],[-169,-1243],[4,-1675],[243,-2463],[7,-2735]],[[248435,219403],[-412,1679],[32,1884],[-166,601]],[[247889,223567],[-152,162]],[[262232,228930],[-64,-3572]],[[262168,225358],[-1,-31]],[[262167,225327],[-472,-1559]],[[261695,223768],[-260,-97],[30,2044],[-246,2372]],[[261213,230026],[0,122]],[[249417,232348],[-288,-1736],[-365,-1099]],[[248764,229513],[-363,-244],[-62,-812],[282,-1440]],[[248621,227017],[-271,502]],[[271521,233023],[-209,-1367],[211,19],[-61,-1459],[280,-1434],[17,-2305]],[[271759,226477],[-575,-58],[-356,-1658],[-304,-535]],[[270524,224226],[-1,7902]],[[237634,226950],[-209,-1155],[251,-2061]],[[237676,223734],[-488,-232],[-948,-2204]],[[236240,221298],[-9,6070],[-235,39]],[[234497,227307],[188,-998],[-40,-2779]],[[234645,223530],[-249,562],[-163,2138],[-77,-1073],[335,-1692],[-100,-2415]],[[234391,221050],[-400,-946],[-152,1094]],[[233839,221198],[-128,697],[-451,-247]],[[233260,221648],[-1120,3874]],[[249637,222999],[-31,137]],[[249606,223136],[-17,-11]],[[249589,223125],[-854,2530],[-114,1362]],[[248764,229513],[178,-1314],[189,484],[62,-1577],[278,-41],[74,2259],[374,1265],[70,-3363],[267,-194],[-426,-2469],[-490,256],[297,-1820]],[[250525,230647],[-312,-71],[261,1146],[51,-1075]],[[246544,227406],[-360,597],[-279,-302]],[[245905,227701],[-208,1350],[-10,1649]],[[229923,230288],[145,-1541]],[[230068,228747],[-848,-6121]],[[229220,222626],[-749,-87]],[[228471,222539],[-487,2914]],[[227984,225453],[6,37]],[[242899,230150],[-21,-3785]],[[242878,226365],[-34,-727],[-510,-1743],[182,-15],[-22,-1563],[-530,-1558],[-885,886]],[[241079,221645],[5,8529],[-338,-15]],[[270524,224226],[-18,-8]],[[270506,224218],[-216,2191],[-389,132],[-406,1491]],[[269495,228032],[311,619],[458,3477]],[[269495,228032],[-310,330]],[[224930,228301],[-647,-3579]],[[224283,224722],[-370,-472]],[[223913,224250],[-386,1144]],[[243094,222650],[507,-1497],[-373,-1379],[-504,1635],[370,1241]],[[244961,229935],[-87,-1004]],[[244271,228644],[-426,-208],[-645,-3854]],[[243200,224582],[80,1697],[-402,86]],[[231565,224399],[21,-2330],[-179,-21]],[[231407,222048],[-240,599]],[[231167,222647],[-226,617],[-208,2752],[-251,273],[-414,2458]],[[245905,227701],[-338,-3548]],[[245567,224153],[-211,-1645]],[[245356,222508],[-48,1359]],[[221623,227744],[-6,-5221]],[[221617,222523],[-1146,-70]],[[227984,225453],[-780,-2865],[-98,358]],[[227106,222946],[-308,892],[-366,2987]],[[241079,221645],[-915,2302],[-643,1244],[-860,-33],[-722,-625],[-263,-799]],[[226086,224855],[-251,-1276],[-617,-1664]],[[225218,221915],[-190,1265],[73,1338],[-818,204]],[[261984,223666],[48,-1027],[-349,843],[301,184]],[[262167,225327],[153,-1172],[-625,-387]],[[263836,228967],[267,-1312],[-501,151],[-1029,-3276],[-405,828]],[[231167,222647],[-368,-2222],[-115,-1978],[-812,-2987]],[[229872,215460],[-51,299]],[[229821,215759],[273,1332],[-648,4505],[-226,1030]],[[245356,222508],[-369,-726]],[[244987,221782],[-280,-1858],[-256,1228],[-396,-628],[-7,2090],[-206,-84],[-20,2140],[-622,-88]],[[270506,224218],[-1,-4598]],[[270505,219620],[-384,-936],[-50,1175],[-543,18]],[[269528,219877],[-418,-93],[-2,1070],[-275,505]],[[268833,221359],[-7,4941]],[[268833,221359],[-783,495]],[[268050,221854],[-36,3076],[82,1260]],[[248195,214699],[-70,-748]],[[248125,213951],[-368,-1498],[-381,4155],[-144,-1654]],[[247232,214954],[0,260]],[[247232,215214],[0,103]],[[247232,215317],[15,318]],[[247247,215635],[13,86]],[[247260,215721],[55,1625],[-668,4635],[-414,1833],[-105,1452],[-208,-1076],[-353,-37]],[[247889,223567],[32,-2068],[-180,-982],[125,-870],[386,-448],[38,-1287],[-225,-2000],[130,-1213]],[[222150,222529],[-533,-6]],[[223913,224250],[-73,-521]],[[223840,223729],[-340,-2416],[-157,1139],[-1193,77]],[[249173,217874],[111,-1305],[-400,134],[289,1171]],[[249589,223125],[-488,-958],[203,-1847],[362,-1192],[-111,-777],[530,-230],[375,-1687],[141,831],[307,-3039],[-50,-1667],[-254,-1182],[-172,579],[-447,-2429],[422,3793],[-138,1557],[-368,-603],[-134,2620],[-304,1182],[-628,94],[58,1184],[-307,734],[-151,-685]],[[236240,221298],[-45,-112]],[[236195,221186],[-276,35]],[[235919,221221],[-211,269],[-540,-841],[124,4279],[-302,699],[-198,-2304],[-147,207]],[[227106,222946],[-578,-5086]],[[226528,217860],[-680,53],[-139,1116]],[[225709,219029],[22,814],[-513,2072]],[[271988,222438],[9,-2348],[241,-1825]],[[272238,218265],[-390,-928]],[[271848,217337],[-291,1592],[-5,2834],[246,456],[-91,1669],[277,1096]],[[271759,226477],[138,-1242],[-266,-1802],[-119,-4400],[73,-1266]],[[271585,217767],[-204,-13],[-96,2166],[-186,606],[-594,-906]],[[233260,221648],[-107,-2624],[-243,-16],[-116,-2071]],[[232794,216937],[-175,-671],[-275,621],[-264,-1151]],[[232080,215736],[-404,3185],[-269,3127]],[[228471,222539],[-170,-901],[-100,-3633]],[[228201,218005],[-1040,-5116]],[[227161,212889],[-321,2085]],[[226840,214974],[-364,2442],[52,444]],[[244928,217715],[211,-933],[-107,-1820],[-305,1569],[201,1184]],[[247260,215721],[-525,940],[-7,-1505],[-198,-130],[-95,-1883],[-522,-151],[-171,914],[376,1325],[-332,809],[-84,1095],[-261,-2776],[-233,825],[15,1953],[-358,1998],[122,2647]],[[225709,219029],[-761,-6052]],[[224948,212977],[-1106,2536]],[[223842,215513],[-2,8216]],[[223842,215513],[-1,-2983]],[[223841,212530],[-1697,16]],[[222144,212546],[6,9983]],[[272759,223118],[386,-4323]],[[273145,218795],[-132,-298],[16,-2699],[-744,-89],[-47,2556]],[[232080,215736],[-73,-613]],[[232007,215123],[-254,-1543],[-960,-3417]],[[230793,210163],[-921,5297]],[[229821,215759],[-780,-3735]],[[229041,212024],[-105,759]],[[228936,212783],[-735,5222]],[[222144,212546],[-1943,-92]],[[220201,212454],[-2,9996]],[[220201,212454],[-1549,-37]],[[218652,212417],[-301,1679],[-53,1254]],[[235183,217123],[-168,-988],[-897,-3581],[738,3848],[327,721]],[[234284,214573],[-491,4941],[46,1684]],[[234391,221050],[301,-995],[33,-3555],[-122,190],[-319,-2117]],[[236195,221186],[-1085,-2978],[545,2519],[264,494]],[[234284,214573],[-259,-341],[-245,-3555],[-456,-2355],[-295,-718]],[[233029,207604],[-168,76],[-313,2527],[-238,31],[-6,1604],[-193,734],[-104,2547]],[[269528,219877],[10,-5017],[-370,-17],[1,-3161]],[[269169,211682],[-610,-875]],[[268559,210807],[-4,-26]],[[268555,210781],[11,1180],[-229,1769],[-631,423],[-130,2753]],[[267576,216906],[349,3015],[125,1933]],[[271585,217767],[74,-1765]],[[271659,216002],[-47,-5892],[-823,-7]],[[270789,210103],[-996,7]],[[269793,210110],[-470,1716],[-154,-144]],[[226840,214974],[-1288,-6318]],[[225552,208656],[-604,4321]],[[274038,206958],[-133,1]],[[273905,206959],[-39,-1]],[[273866,206958],[-329,-17],[-54,-3299]],[[273483,203642],[-296,3940]],[[273187,207582],[-245,-773],[-517,1780]],[[272425,208589],[33,1990],[-268,1417]],[[272190,211996],[-290,2402]],[[271900,214398],[73,2026],[-125,913]],[[273145,218795],[71,-1438],[822,-10399]],[[228017,208315],[-311,1140],[-437,-2085]],[[227269,207370],[-501,3617],[393,1902]],[[228936,212783],[-919,-4468]],[[272425,208589],[-133,-1746]],[[272292,206843],[-680,-113],[4,-8039]],[[271616,198691],[-837,-35]],[[270779,198656],[10,11447]],[[271659,216002],[241,-1604]],[[230793,210163],[-40,-5357]],[[230753,204806],[-186,-16]],[[230567,204790],[-105,611]],[[230462,205401],[-405,-37]],[[230057,205364],[-229,272]],[[229828,205636],[-9,-8]],[[229819,205628],[-2,32]],[[229817,205660],[-203,3106],[-295,2552],[-278,706]],[[225150,203636],[-1,663],[-1297,-17]],[[223852,204282],[-11,8248]],[[225552,208656],[258,-1776]],[[225810,206880],[-660,-3244]],[[230757,204203],[-4,603]],[[233029,207604],[-514,-1808],[-270,336],[-409,-941],[-73,-1321],[716,1768],[-1755,-5263],[983,3206],[18,865],[-525,-948],[-443,705]],[[226700,204666],[-382,955],[-249,-541]],[[226069,205080],[-259,1800]],[[227269,207370],[-569,-2704]],[[229817,205660],[1,-376]],[[229818,205284],[-753,-2126],[109,-1486]],[[229174,201672],[-69,-398],[-683,1260]],[[228422,202534],[5,4144],[-122,1448],[-288,189]],[[223852,204282],[-1657,-123]],[[222195,204159],[-37,-4]],[[222158,204155],[-14,8391]],[[222158,204155],[-1965,141]],[[220193,204296],[8,8158]],[[220193,204296],[2,-8383]],[[220195,195913],[-275,-20]],[[219920,195893],[-228,1634],[-299,5632],[-270,1346],[-137,3111],[-290,2181],[-44,2620]],[[269793,210110],[391,-3170],[-256,-2281]],[[269928,204659],[-433,506],[-598,-8]],[[268897,205157],[-149,697],[-6,3295],[-183,1658]],[[270779,198656],[-274,-620]],[[270505,198036],[2,3099]],[[270507,201135],[2,766],[-428,978],[-153,1780]],[[228422,202534],[-599,-3072]],[[227823,199462],[-496,1215],[-66,1282],[-333,364],[-228,2343]],[[273483,203642],[-949,-51],[-367,555],[125,2697]],[[273866,206958],[152,-4435],[384,-6703],[460,-6126],[-21,-545]],[[274841,189149],[-1029,-223]],[[273812,188926],[17,9772]],[[273829,198698],[-61,3007],[-285,1937]],[[274038,206958],[411,-2425],[-276,2427]],[[274173,206960],[19,0]],[[274192,206960],[437,-3794],[144,-2446],[-167,-836],[-12,3069],[-288,-3646],[-72,100],[-11,3804],[-174,606],[153,1506],[-297,1636]],[[226409,193288],[-981,21]],[[225428,193309],[-276,-3]],[[225152,193306],[-2,10330]],[[226069,205080],[-235,-508],[782,-8928],[-25,-123]],[[226591,195521],[-240,-1164],[58,-1069]],[[273829,198698],[-2213,-7]],[[229313,193901],[29,366]],[[229342,194267],[112,1478],[226,125],[508,2370],[340,470],[-1215,-4809]],[[229467,200562],[-293,1110]],[[229818,205284],[138,-1955],[593,-2862],[-702,-2230],[-380,2325]],[[230462,205401],[-19,-1857],[-353,715],[-33,1105]],[[227823,199462],[-461,-4167]],[[227362,195295],[-76,-648],[-695,874]],[[270507,201135],[-552,2],[0,-813],[-1166,-23]],[[268789,200301],[108,4856]],[[223852,204282],[-7,-10983]],[[223845,193299],[-1631,-503],[-15,3242]],[[222199,196038],[-4,8121]],[[225152,193306],[-1307,-7]],[[222199,196038],[-2004,-125]],[[229467,200562],[-206,-608],[191,-1783]],[[229452,198171],[-926,-864],[295,-1302]],[[228821,196005],[-626,-2606]],[[228195,193399],[-53,240]],[[228142,193639],[-158,1151],[-622,505]],[[270505,198036],[-139,-2611]],[[270366,195425],[-1519,30]],[[268847,195455],[-374,-12]],[[268473,195443],[316,4858]],[[271616,198691],[0,-1635],[277,2],[94,-2171],[192,-1069],[303,-11],[-262,-959],[585,-3549],[246,-3711]],[[273051,185588],[-1173,63]],[[271878,185651],[-1368,-4]],[[270510,185647],[-6,9777],[-138,1]],[[273812,188926],[-11,-3356]],[[273801,185570],[-750,18]],[[229222,193536],[-326,-2723],[39,1456],[287,1267]],[[228195,193399],[229,-262],[-76,-1380]],[[228348,191757],[-206,1882]],[[228490,190446],[-134,1235]],[[228356,191681],[444,2665],[-7,-1493],[-303,-2407]],[[229452,198171],[-21,-806]],[[229431,197365],[-30,-1032]],[[229401,196333],[-338,-1783],[-242,1455]],[[223845,193299],[14,-13095]],[[223859,180204],[1,-1601],[-436,24]],[[223424,178627],[-1056,73],[-103,854],[-232,-1005]],[[222033,178549],[-141,1379],[72,2611],[-322,2960],[-327,370],[-463,2627],[-155,3392],[-155,198],[-278,2896],[-344,911]],[[228348,191757],[8,-76]],[[228490,190446],[-3,-28]],[[228487,190418],[-16,-156]],[[228471,190262],[-133,-1330],[-231,1091],[-604,-774]],[[227503,189249],[-413,475],[-457,1288],[12,1137]],[[226645,192149],[-45,799]],[[226600,192948],[-191,340]],[[268847,195455],[7,-2885]],[[268854,192570],[-198,-1538],[342,-1335],[-115,-2957],[-287,863],[-300,2065],[148,2365],[29,3410]],[[270510,185647],[-1388,-19]],[[269122,185628],[467,3254],[-294,1838],[49,-1786],[-175,307],[19,1799],[-334,1530]],[[225428,193309],[7,-14809]],[[225435,178500],[-810,49]],[[224625,178549],[3,1455],[-769,200]],[[226645,192149],[-378,-2056],[-22,-4642]],[[226245,185451],[-328,-1],[5,-6978]],[[225922,178472],[-487,28]],[[228402,187096],[249,1941],[-343,-3973],[94,2032]],[[227963,184054],[-1438,-46],[-280,1443]],[[227503,189249],[288,8],[201,-2841],[170,164],[-199,-2526]],[[275241,183987],[-902,23]],[[274339,184010],[-271,4],[-3,1573],[-264,-17]],[[274841,189149],[341,-3281],[59,-1881]],[[273051,185588],[-176,-2846],[396,-2050],[334,-3158]],[[273605,177534],[-628,-17],[1,-1639],[-277,-12],[2,-1649],[-824,22]],[[271879,174239],[-2,5717]],[[271877,179956],[1,5695]],[[271877,179956],[-1371,-47]],[[270506,179909],[4,5738]],[[270506,179909],[-2,-2429]],[[270504,177480],[-549,22],[3,3302],[-874,53]],[[269084,180857],[-345,1646],[240,734],[143,2391]],[[274339,184010],[6,-6562]],[[274345,177448],[1,-1562],[-580,-3038]],[[273766,172848],[42,3614],[-203,1072]],[[227901,178788],[-37,1]],[[227864,178789],[9,1767],[307,3881]],[[228180,184437],[70,-94]],[[228250,184343],[-349,-5555]],[[227963,184054],[-251,-4475],[-258,-852],[114,2438],[-407,-1626],[-336,1829],[200,-2389],[-320,-88]],[[226705,178891],[-582,-1386]],[[226123,177505],[-201,967]],[[275241,183987],[343,-5478]],[[275584,178509],[-145,-584]],[[275439,177925],[-1,-410]],[[275438,177515],[-1093,-67]],[[270504,177480],[-3,-3270]],[[270501,174210],[-551,17],[0,-506]],[[269950,173721],[0,-130]],[[269950,173591],[-1,-996],[-273,12]],[[269676,172607],[-254,2093],[-338,6157]],[[224625,178549],[159,-3917],[135,10],[-13,-5059]],[[224906,169583],[-1481,40]],[[223425,169623],[-1,9004]],[[271879,174239],[-1378,-29]],[[223425,169623],[-158,-2061],[-441,-1922]],[[222826,165640],[-276,5054],[-494,3303],[54,2886],[-77,1666]],[[228015,167092],[-166,1925],[-8,2670]],[[227841,171687],[174,-4595]],[[227841,171687],[-52,110],[22,6050],[53,942]],[[227901,178788],[-82,-3294],[22,-3807]],[[227632,166164],[-1163,-35],[-267,256]],[[226202,166385],[-78,3148]],[[226124,169533],[-1,7972]],[[226705,178891],[360,-137],[283,-871],[341,625],[-132,-4582],[-184,-313],[-31,-3271],[212,-1257],[78,-2921]],[[226124,169533],[-934,42]],[[225190,169575],[-284,8]],[[275994,173067],[-63,2]],[[275931,173069],[-9,1]],[[275922,173070],[-37,2]],[[275885,173072],[-22,0]],[[275863,173072],[-26,-266],[-2071,42]],[[275438,177515],[375,-1551],[181,-2897]],[[273766,172848],[-167,-3535],[-1729,10]],[[271870,169323],[9,4916]],[[269950,173591],[197,-1158],[100,-2595],[-427,921],[-144,1848]],[[271870,169323],[-1374,16]],[[270496,169339],[-105,2644],[304,1032],[-368,4],[-94,-803],[-283,1505]],[[275863,173072],[173,-517],[58,-7156],[-69,-4426]],[[276025,160973],[-424,252],[-1823,-64]],[[273778,161161],[-12,11687]],[[273778,161161],[4,-1336]],[[273782,159825],[-1083,-119],[-9,4916],[-814,-70]],[[271876,164552],[-6,4771]],[[270224,168129],[277,-3877],[-101,-154],[-176,4031]],[[271876,164552],[5,-1688],[-271,-31],[4,-1924],[-522,237]],[[271092,161146],[-65,2473],[-474,1226],[-124,2786],[67,1708]],[[225190,169575],[-740,-9780]],[[224450,159795],[-249,-323],[-357,2361],[-856,1101],[54,931],[-216,1775]],[[226202,166385],[-130,-3036],[395,-282],[0,-1591]],[[226467,161476],[2,-5174]],[[226469,156302],[-921,-317],[-542,1946],[-162,1244],[-394,620]],[[227781,162637],[-161,-1600],[-221,-469],[-932,908]],[[227632,166164],[36,-3208],[113,-319]],[[273782,159825],[19,-5212]],[[273801,154613],[0,-3238]],[[273801,151375],[-1312,-39]],[[272489,151336],[-461,1867],[-228,-193],[-395,1936],[-191,1815],[-122,4385]],[[227781,162637],[266,-4006],[-45,-1342],[291,-825],[-120,-2091],[-349,-1094],[6,-1266],[-411,861],[-516,2812],[-434,616]],[[276025,160973],[-123,-6440]],[[275902,154533],[-491,-343],[-1072,2],[-538,421]],[[275036,140768],[-16,1]],[[275020,140769],[-149,-434]],[[274871,140335],[3,-76]],[[274874,140259],[-199,601],[-388,-1467],[-445,274]],[[273842,139667],[-42,3489],[1,8219]],[[275902,154533],[-196,-4031],[-305,-2455],[-117,-2922],[81,-1855],[-329,-2502]],[[275491,142866],[-401,-4417],[-362,-2015],[523,3742],[240,2690]],[[273842,139667],[-118,-686],[-512,-438],[-244,1966],[102,2254],[184,-1641],[296,-971],[166,920],[-246,1771],[-349,146],[-259,2834],[-188,3420],[234,599],[-210,868],[-82,-1356],[-127,1983]],[[267576,216906],[-181,85],[-177,1931],[-468,2015],[37,2408]],[[233545,583163],[470,-1],[0,7179],[546,-266],[367,-1412],[396,-7638],[-21,-1975],[288,-1125],[438,-310]],[[249572,564554],[-1138,-3158],[-1287,-1848],[-816,-1938],[-809,-2999]],[[245498,568091],[407,1054],[402,-2818],[1697,311],[722,-2325],[296,673],[550,-432]],[[244050,541402],[0,-11146]],[[242234,539623],[263,1550],[296,-1143],[509,150],[748,1222]],[[245788,538230],[8,-8017]],[[244050,541402],[832,1557],[406,335],[672,1956],[311,-1206],[-365,-2639],[91,-1053],[-209,-2122]],[[245788,538230],[630,1480],[422,-1520]],[[246668,543604],[119,-491],[-601,-1772],[482,2263]],[[254361,554779],[386,-1343],[-683,-275],[52,-770],[-806,-2719]],[[253310,549672],[-198,1603],[-596,-3]],[[252516,551272],[245,1549],[576,1487],[1024,471]],[[252129,567028],[638,1075],[-743,-3451],[-872,-1783],[142,-551],[-582,-1037],[-166,1627],[1583,4120]],[[252473,548019],[214,-3207]],[[251344,546531],[128,1308],[717,2354],[12,-1815],[272,-359]],[[253310,549672],[-511,-4124],[-63,2158],[-507,612],[-28,1852],[315,1102]],[[256406,536544],[0,-6253]],[[256406,530291],[-348,-1],[-4,-3236],[-348,4]],[[253820,544308],[634,-392],[509,-1456],[171,-1720],[674,-4188],[598,-8]],[[257802,530286],[-1396,5]],[[256406,536544],[265,725],[573,-1784],[182,767],[315,-1250],[489,2628],[901,2228],[763,318]],[[258234,522812],[-689,-2000],[491,3712],[-698,206],[-249,-2795],[-468,641],[-361,-1504],[-267,-2116]],[[255011,510600],[-35,-2168],[-370,-346]],[[254678,502703],[346,2967],[570,1286],[473,4864],[330,489],[143,1898],[235,8],[-572,-6086],[-44,-1740],[-320,-1641],[-154,-2072]],[[266291,525881],[-781,769]],[[265510,526650],[490,1336],[-121,1234],[374,-217],[304,-1926],[-266,-1196]],[[264534,537282],[192,-119],[-169,-2149],[-263,1387],[240,881]],[[264771,527003],[-281,49]],[[264490,527052],[-48,-2]],[[264442,527050],[-19,1612],[-346,2],[-1,1612],[-2086,1],[-3,1628],[-347,-5]],[[261640,541399],[788,243],[-207,-1485],[-13,-3740],[568,-816],[557,744],[103,-1308],[702,1641],[226,-1325],[215,-3355],[-110,-1628],[279,286],[140,-1587],[477,-2056],[-594,-10]],[[263518,523913],[579,-847],[-387,-679],[-192,1526]],[[264442,527050],[-1182,1276],[-230,-2015],[-35,-1966],[-708,3125],[-1172,1762],[-254,-167],[-506,-2455]],[[260355,526610],[-463,132]],[[263048,514103],[-754,-309],[-259,1732]],[[262035,515526],[484,1050],[-316,238],[-233,2467],[498,2959],[580,1140]],[[261221,512584],[62,1278],[458,1591],[294,73]],[[260809,522684],[123,-2641],[-358,-487],[235,3128]],[[259619,509895],[-266,697],[189,946],[77,-1643]],[[260516,504530],[-484,-12]],[[259309,504590],[9,2168],[372,1310],[375,-215],[515,4334],[143,-2358],[-221,-3319],[14,-1980]],[[260516,504530],[127,-152],[342,4121],[-150,-4481],[235,2088]],[[266792,512571],[208,-2839],[-312,126],[-6,-2477],[298,-1301]],[[266298,493142],[-35,-2125],[-276,-1072],[-460,40],[-182,-1553]],[[266573,485031],[572,4601],[580,621],[347,1131],[524,-1430],[297,-2969],[77,-2649]],[[269259,474627],[236,-3607],[-157,-1606],[-122,-4884],[-353,83],[-169,1029]],[[268236,461261],[-80,-1234],[-498,-1330],[-248,-2669],[-87,-2521]],[[267323,453507],[-275,1112],[-676,-160]],[[267323,453507],[-736,-4608],[-57,-1020]],[[276369,283639],[51,-2897],[155,-81],[-317,-2464],[-721,-1619]],[[275537,276578],[-263,-628]],[[275274,275950],[-210,1997]],[[277898,288714],[355,-1067],[-412,-2026],[-248,443],[-747,-4416],[-356,-321],[309,2769]],[[64909,48285],[735,-2763],[362,-391],[488,-1483],[555,-3196],[-25,-2084],[244,11],[54,-1736],[492,-2286],[-474,-3219],[-428,-1373],[-453,-186],[-605,-2496],[-405,-3858],[-627,2125],[-103,1501],[89,4218],[-292,5441],[-196,1715],[345,2265],[317,3334],[-187,1774],[-23,2014],[137,673]],[[55028,84760],[233,-813],[-51,-4138],[-317,-1724],[-531,856],[-341,1190],[-70,1626],[168,1566],[392,1359],[517,78]],[[61944,65038],[-272,274]],[[61944,65038],[565,-356],[-456,-1900],[-525,1012],[-688,11],[160,2281],[672,-774]],[[61752,60573],[246,-292],[244,-1961],[-82,-859],[-351,-533],[-258,3324],[201,321]],[[62904,54516],[45,-1246],[-351,-599],[9,965],[297,880]],[[62814,62495],[340,-2480],[439,903],[263,-353],[320,-1916],[312,-600],[35,-1559],[-160,-1021],[-712,-1316],[-391,412],[-54,3221],[-459,616],[-172,1326],[59,2293],[180,474]],[[58972,75138],[409,-3430],[-19,-1219],[215,21],[315,-3031],[-404,-786],[-271,1419],[-580,-706],[-493,5221],[435,169],[393,2342]],[[53118,80469],[25,-1794],[-233,-683],[-126,-1603],[-75,1953],[409,2127]],[[996993,632383],[817,-1163],[91,-906],[715,-2639],[-621,1211],[-350,1710],[-879,1732],[227,55]],[[949,635992],[99,-1643],[-281,619],[182,1024]],[[7983,636500],[-23,-2275],[-307,-73],[-67,2101],[397,247]],[[8254,636861],[430,-729],[-177,-971],[-343,386],[90,1314]],[[8791,637399],[79,-1229],[-422,751],[343,478]],[[2943,637533],[355,-28],[110,-1138],[762,-730],[-472,-573],[-84,-1947],[-423,-823],[-299,1293],[442,1083],[-738,1716],[347,1147]],[[5406,633632],[-183,-597],[-329,1038],[-855,-380],[1115,1264],[256,737],[15,1940],[429,-501],[-230,-1194],[22,-1773],[-240,-534]],[[996376,638802],[311,-785],[-243,-852],[-68,1637]],[[7153,639094],[-123,-3160],[551,52],[-111,-1993],[-622,-692],[-248,-1116],[-148,1715],[-276,-2445],[-150,1181],[346,1636],[-142,1180],[574,-355],[-294,2578],[643,1419]],[[999634,639522],[333,-975],[-327,-1865],[-356,430],[-110,1601],[460,809]],[[8394,641129],[361,-843],[-150,-1151],[-356,-113],[145,2107]],[[993962,641501],[134,-1164],[-301,-1591],[5,-1345],[-561,-90],[-112,-1517],[-310,1266],[482,1562],[297,123],[366,2756]],[[15681,641867],[-88,-644],[551,-599],[499,441],[600,-278],[-1374,-850],[-663,468],[-396,-613],[-512,1117],[346,752],[243,-725],[794,931]],[[18716,646240],[355,-1060],[-312,-984],[-542,-452],[86,1790],[413,706]],[[13937,646817],[445,-1871],[-209,-1713],[-378,-563],[294,-1046],[-846,-839],[-955,-1616],[-414,666],[-938,-680],[1039,1800],[664,138],[756,1388],[293,1606],[-346,796],[246,1637],[349,297]],[[983194,648582],[-58,-2897],[-305,734],[-723,157],[686,1802],[400,204]],[[23639,652034],[277,-453],[-113,-1345],[-515,-1146],[-83,1789],[434,1155]],[[26147,655623],[246,-1330],[-168,-813],[-713,1494],[635,649]],[[980646,657671],[765,-147],[436,-2390],[463,-235],[-708,-1136],[-317,775],[-432,-1614],[-470,872],[165,1668],[-516,-336],[77,1140],[-541,-71],[552,1545],[526,-71]],[[28035,654543],[906,4624],[-94,1472],[527,2186],[747,66],[-272,830],[81,1805],[502,2014],[613,648],[607,-970],[-156,-2372],[-1193,-2675],[-517,-3466],[-1751,-4162]],[[36357,673363],[-391,-2467],[-196,1415],[587,1052]],[[34797,676523],[213,-3286],[496,2734],[387,-123],[69,-1817],[-313,-391],[-520,-2697],[580,1301],[182,-1595],[-673,-869],[-156,-1540],[-280,592],[46,-1877],[-401,265],[-1841,-3579],[-465,-1377],[-652,1241],[1054,2460],[1094,1206],[-224,1758],[468,338],[-151,1493],[938,464],[-875,524],[-340,2033],[352,1704],[1012,1038]],[[26197,724966],[756,-263],[-288,-1191],[-468,1454]],[[25148,736553],[-442,-1993],[-390,1138],[832,855]],[[39421,678834],[125,-1114],[-550,-30],[-134,746],[559,398]],[[36825,680387],[730,-1661],[-578,-1781],[-479,150],[-104,2381],[431,911]],[[38083,681762],[-169,-1483],[356,-62],[-384,-1861],[-336,2175],[180,1214],[353,17]],[[45571,685391],[688,-1487],[-645,-37],[-43,1524]],[[46952,694607],[166,-1890],[-229,-1028],[-301,1739],[364,1179]],[[42853,695877],[635,14],[266,-1568],[335,-4089],[373,437],[214,-1478],[-487,52],[-124,932],[-254,-1722],[-453,-779],[-609,441],[-827,-359],[-641,-1585],[-62,-1249],[-802,-1375],[-569,491],[-279,2148],[72,1348],[583,1047],[405,3984],[357,1064],[527,-514],[982,2495],[358,265]],[[48297,698203],[503,-1314],[-281,-972],[-458,2014],[236,272]],[[54719,699114],[35,-1698],[-430,-1611],[395,3309]],[[53768,699716],[-57,-3065],[-690,-2054],[16,3270],[392,-758],[85,2465],[254,142]],[[52387,701641],[19,-2213],[-523,1390],[504,823]],[[51366,702388],[94,-1872],[270,219],[343,-2313],[-187,-1094],[-921,1412],[40,2470],[361,1178]],[[52632,703466],[224,-1137],[-482,351],[258,786]],[[56428,729876],[0,-164]],[[56428,729712],[1,-1271]],[[56429,728441],[-376,-902],[0,-1576],[-688,44],[0,-1691],[-885,0],[-1,-1609],[-854,-47],[-10,-3153],[262,-17],[11,-6313],[-174,-1752],[845,0],[0,-4665]],[[54559,706760],[-221,3584],[-465,487],[-226,-1331],[-227,543],[-128,-1791],[-942,-1954],[-501,-2558],[-203,1961],[-156,-2246],[-321,-160],[-388,1335],[-213,-1550],[-896,-1527],[-526,87],[101,2154],[312,2133],[-635,501],[-315,-1612],[38,-2336],[-533,-3433],[-423,296],[235,-2134],[-319,-953],[-328,1503],[-197,-2494],[-614,575],[-124,3742],[-387,952],[-195,-964],[305,-1471],[135,-4091],[-322,1731],[-87,-1650],[-581,-104],[-229,2389],[-557,961],[-44,-1927],[533,-1473],[-911,-2585],[204,4150],[-79,1484],[293,977],[934,318],[218,2402],[379,1261],[396,-106],[-126,1804],[846,4218],[1241,3631],[1202,1199],[764,131],[636,709],[-429,-1919],[670,-3198],[315,-565],[-272,3531],[664,-282],[156,-1434],[616,-516],[78,1328],[-802,1925],[-146,1183],[588,5125],[1475,4921],[1402,2354],[1201,3895]],[[131839,702693],[478,-1815],[-261,-3590],[-338,3444],[121,1961]],[[133475,712615],[472,-2306],[365,-3908],[-109,-3956],[-237,-2723],[-412,-1256],[-725,1926],[513,3110],[-666,-3077],[-842,2748],[552,2915],[-268,716],[-19,1677],[519,1253],[-147,1905],[1004,976]],[[60956,762087],[579,2152],[207,3039]],[[61742,767278],[1861,118],[1,-5313],[-2648,4]],[[51410,765657],[-525,-4199],[-534,-542],[50,2808],[1009,1933]],[[50361,766039],[-741,-1613]],[[49620,764426],[-84,1634],[825,-21]],[[50463,766367],[0,3048],[447,4],[153,1512],[-4,3289],[475,13],[-1,1618],[474,68],[155,1546],[1,3271],[484,-4],[8,3225],[637,43],[12,3203],[445,89],[14,3067],[182,1579],[477,25],[0,3225],[493,-12],[187,1563],[6,3225],[507,4],[7,1610],[466,16],[197,3194],[2958,4],[8,-1469],[509,-23],[-9,1634],[498,0],[0,1661],[983,-7],[4,-1637],[3363,-86]],[[64599,804865],[6,-22904],[-455,-40],[-4,-1619],[-951,22],[-1,-1609],[-472,18],[-264,-3260],[-959,50],[-1,-1622],[-475,33],[8,-3299],[224,-22],[8,-3864]],[[61263,766749],[-1094,-1969],[-1642,-2596],[-488,694],[-100,1404],[-595,1396],[200,3649],[-346,-1592],[-442,-553],[-70,-2804],[-205,-87],[353,-4364],[-131,-1596],[-719,558],[-940,6038],[-710,1488],[71,1756],[-303,-417],[-191,-2035],[-311,-514],[-282,1932],[-662,238],[-84,2398],[-285,617],[-1091,-3021],[-733,-1002]],[[61033,724292],[684,-545],[-930,-219],[246,764]],[[71633,804882],[114,-1587],[1,-6528],[-370,-12],[-9,-6508],[-350,-18],[4,-6265],[-356,2],[-2,-1646],[-479,-11],[4,-3276],[-475,-9],[9,-1643],[-816,-49],[14,-3240],[-942,-29],[5,-3278],[149,-20],[-2,-6355],[154,-1634],[924,0]],[[69210,762776],[7,-3471],[-453,-1843],[-736,-1056],[-774,-256],[-138,-1018],[-764,-799],[4,-5901],[-324,-916],[-689,-542],[-206,-2415],[-365,-3],[219,-1278],[-365,-813],[-334,533],[-169,-1391],[-664,236],[-689,-3490],[-377,-3219],[1107,-39]],[[63500,735095],[-534,-3229],[-498,991],[-283,-2643],[-165,1250],[-876,-3730],[-513,1840],[-93,-1738],[-418,-1467],[297,-1220],[-476,-272],[-290,1208],[-838,-1435],[-237,-1294],[835,518],[-97,-1512],[-773,886],[47,-1061],[-586,328],[-1008,-4054],[729,1416],[658,-1055],[-890,-5668],[-359,2476],[4,-2388],[-569,564],[-201,-1660],[-1170,-915],[-208,-1647],[-122,1992],[-209,-168],[97,-2311],[-195,-2337]],[[56429,728441],[768,-812],[-200,4018],[209,1634],[848,4197],[641,1528],[416,1983],[586,1663],[449,-1864],[-119,2914],[-249,-206],[-35,2059],[292,6723],[196,1491],[338,171],[-417,2931],[211,2814],[593,2402]],[[61742,767278],[-123,1251],[-356,-1780]],[[64599,804865],[4288,-12],[2746,29]],[[65699,709069],[-504,744],[538,1338],[-34,-2082]],[[70400,724037],[-204,-1087],[-508,-19],[712,1106]],[[68718,724702],[-249,-2013],[-521,-1694],[196,2303],[574,1404]],[[69851,724354],[-436,-1711],[-363,957],[373,1310],[426,-556]],[[72263,735888],[654,-276],[179,-1133],[-749,-602],[-369,-1913],[-213,2136],[498,1788]],[[71587,750055],[468,-1112],[218,-1969],[-712,1537],[26,1544]],[[72121,750653],[752,-1609],[143,801],[402,-896],[-319,-1580],[498,-23],[268,1873],[864,-1804],[-645,-1900],[256,-24],[-10,-2224],[878,340],[-525,-3652],[-488,209],[-628,1356],[-204,-635],[516,-1217],[-216,-2411],[-309,-183],[-530,1368],[-251,-544],[428,-942],[-369,-902],[-533,226],[-638,-2935],[-448,348],[322,-1679],[-993,-4198],[-693,-436],[211,1779],[606,2267],[-320,-122],[143,1970],[-433,-1663],[-186,436],[448,2279],[-693,794],[-670,-679],[120,-1420],[344,1135],[575,213],[-523,-3914],[-670,1507],[-38,3723],[-597,1836],[85,2427],[257,1668],[757,2434],[973,102],[63,-1862],[628,-4462],[-147,2063],[79,2795],[-204,1554],[706,-247],[-928,1791],[8,1470],[588,1559],[419,-1165],[70,-2442],[174,2478],[786,-908],[-91,1984],[527,-1432],[-621,2635],[26,690]],[[72294,752633],[298,-243],[384,-2001],[-771,1279],[-524,168],[436,1600],[177,-803]],[[74768,758552],[203,-1494],[403,602],[-149,-1955],[513,1173],[-64,-2164],[-263,-1096],[-683,1715],[168,-2076],[-475,81],[-333,-1022],[-37,2484],[-168,-2623],[-420,-227],[-2,-1319],[-1063,2147],[-114,1830],[590,-260],[-304,1148],[155,946],[718,-477],[-72,2281],[417,1422],[495,-330],[341,-2521],[144,1735]],[[73815,761335],[865,1186],[-376,-3031],[-417,471],[-72,1374]],[[72144,766667],[-256,-165],[-279,-2562],[-649,-1819],[-613,-91],[-174,-2213],[-343,-43],[106,-2403],[-387,-650],[215,-848],[-602,-2221],[-49,-1387],[-356,1779],[54,-1574],[-325,275],[-479,-1769],[-793,237],[-111,-2260],[-819,-2014],[-130,-1038],[-600,882],[68,-2347],[-396,-579],[9,-1505],[-775,384],[-35,-2432],[-520,654],[-902,-2724],[-22,-1053],[573,813],[-196,-1902],[142,-997]],[[69210,762776],[1368,8],[-5,1620],[1015,10],[-7,2250],[405,-14]],[[71986,766650],[158,17]],[[124853,753145],[-549,-606],[-394,-1297],[-255,1284]],[[123655,752526],[58,1721]],[[123713,754247],[93,682]],[[123806,754929],[27,-1188],[798,113],[222,-709]],[[124293,757146],[749,-2547],[-1014,763],[-164,962],[429,822]],[[124853,768717],[211,-1953],[1165,-2450],[370,-2181],[920,-3383],[-235,-797],[808,-4371]],[[128092,753582],[-945,-4191]],[[127147,749391],[-329,-1604]],[[126818,747787],[-267,-754]],[[126551,747033],[-348,2791],[-600,2743],[-36,3375],[303,711],[-120,1531],[-569,-3645],[-841,2824],[-590,340],[-226,2827],[-376,2538],[-6,5749]],[[123142,768817],[1711,-100]],[[122507,768865],[608,-35]],[[123115,768830],[94,-1237],[-284,-3190],[-329,1968],[-89,2494]],[[125028,711856],[427,56],[-445,-1309],[18,1253]],[[130215,719801],[107,-2063],[756,-2315],[-338,-626],[254,-2100],[-618,-805],[-298,1242],[209,718],[-487,1319],[-280,-690],[-164,3076],[325,413],[163,1718],[371,113]],[[129378,721918],[249,-1134],[-115,-2167],[-590,-788],[-540,1882],[182,1807],[814,400]],[[130830,716910],[-489,1840],[74,2204],[-143,1693],[379,-778],[302,-2036],[326,196],[295,-2757],[-436,-1557],[-308,1195]],[[128815,728558],[1034,-4174],[-772,-1663],[-360,265],[62,2359],[-148,3099],[184,114]],[[126153,727422],[-66,1104],[446,-558],[-459,-4949],[-272,-4761],[208,396],[-146,-3602],[-196,615],[-111,3651],[-137,-5807],[-277,1260],[-136,3641],[146,2921],[525,49],[-191,2101],[-591,341],[101,963],[-332,2219],[-28,2428],[338,-759],[186,2187],[562,-1046],[430,-2394]],[[126096,733937],[1281,-1597],[902,-116],[343,-1458],[134,-4906],[-199,-1131],[-500,1925],[-370,3179],[207,-4437],[380,-383],[50,-1490],[-321,-1688],[-659,1031],[14,-897],[-617,-308],[-202,4527],[180,2218],[-303,119],[-132,1682],[-636,2448],[448,1282]],[[130329,738612],[336,-2561],[-336,-2230],[901,-864],[-218,-3192],[698,-1259],[105,-3850],[709,243],[1430,-3886]],[[133954,721013],[215,-2257],[-268,-1573],[-450,60],[-523,-1243],[217,-2328],[-367,57],[-534,1418],[-526,-1313],[-53,-1739],[-415,-1188],[272,-1077],[-70,-1918],[-374,-1019],[-347,1785]],[[130731,708678],[461,1375],[54,2694],[202,40],[-10,3932],[574,625],[-464,526],[-186,2188],[-506,719],[-71,1280],[-436,1390],[254,2614],[-500,-62],[-115,1369],[-779,1724],[-462,2944],[356,-607],[-84,2467],[-160,-1289],[-1099,1537],[-631,1283]],[[127129,735427],[607,1116],[481,-957],[392,2691],[952,1778],[768,-1443]],[[120135,747679],[-911,-75]],[[119224,747604],[-113,-9]],[[119111,747595],[-67,-5]],[[119044,747590],[175,3136],[916,-3047]],[[118824,752542],[436,-1596],[-323,-3068],[-279,1217],[166,3447]],[[127129,735427],[-11,1829],[1069,643],[-784,626],[-296,2733],[133,1559],[-543,1078],[247,1825],[1153,-2770],[-708,2710],[-430,722],[26,2218]],[[126985,748600],[107,525]],[[127092,749125],[55,266]],[[128092,753582],[282,-2841],[560,-2991],[880,-6389],[515,-2749]],[[124853,753145],[18,23]],[[124871,753168],[418,537]],[[125289,753705],[-148,-676],[909,-5880],[23,-2256],[-213,92],[-809,7066],[78,-1904],[-258,510],[590,-4994],[507,-2211],[51,-2144],[-521,218],[645,-2298],[-310,-1473],[-533,1666],[53,-3416],[-405,-716],[-196,-1446],[-544,-1275],[-190,2104],[50,2518],[367,839],[-3,1567],[-686,5962],[69,2065],[-286,4181],[126,722]],[[120491,750760],[-344,-2996]],[[120147,747764],[-1106,4388],[166,2241],[347,-765],[278,1062],[445,-194],[427,1507],[913,-2103],[-367,-2249],[68,-1158],[543,2952],[316,-1048],[502,33],[561,-2130],[-236,-1608],[-622,1179],[757,-2767],[-774,-493],[-454,1349],[-1420,2800]],[[123713,754247],[-95,-1670],[-341,1775],[-156,4018],[685,-3441]],[[114794,765672],[1165,1936]],[[115959,767608],[1943,4721],[682,110],[264,1748]],[[118848,774187],[1665,-1619],[529,-1279],[326,-2198],[-480,-4537],[582,-819],[409,-1530],[231,-2153],[-489,-11]],[[121621,760041],[49,-2296],[-405,961],[-824,-873],[206,2553],[-684,5535],[900,1274],[-791,545],[-394,2927],[235,-3862],[-191,-2032],[-886,1580],[-101,2460],[-280,-1505],[-688,1343],[-390,-1137],[761,-460],[670,-1418],[-346,-493],[774,-1580],[-470,-1770],[538,847],[342,-513],[455,-4297],[-639,-1196],[-13,909],[-621,-1129],[-298,1069],[41,-2621],[-717,2666],[-654,322],[-1470,4078],[-936,3744]],[[122912,775799],[-900,-103]],[[122012,775696],[-90,222]],[[121922,775918],[-936,7001]],[[120986,782919],[676,1289],[685,-1898],[571,-2465],[-202,-2534],[196,-1512]],[[123142,768817],[-27,13]],[[122507,768865],[-495,6831]],[[122912,775799],[198,-1219],[722,-593],[59,-1056],[546,-1130],[416,-3084]],[[121922,775918],[-145,-2315],[-358,301],[513,-2663],[-50,-2481],[722,-6540],[-70,-1018],[302,-3962],[-98,-2100],[-512,-56],[-321,1677],[-284,3280]],[[118848,774187],[34,3836],[479,-24],[183,1767],[-318,752],[1118,1161],[642,1240]],[[120877,738496],[389,-2216],[137,-2451],[-166,-1459],[-605,-380],[11,6413],[234,93]],[[123928,718235],[-2,-1610]],[[123926,716625],[-393,1362],[-697,5371],[278,1647],[-447,-368],[-256,2377],[77,1437],[-515,245],[-59,2351],[446,1679],[-481,1224],[98,2800],[-464,-184],[-452,2135],[588,60],[-326,842],[146,1989],[629,565],[-77,-1197],[395,257],[557,-1676],[490,7],[-81,-2391],[463,-6886],[222,-4906],[-139,-7130]],[[120135,747679],[12,85]],[[120491,750760],[1455,-3708],[395,-1834],[349,1018],[504,16],[258,-5147],[-689,-337],[-265,1057],[-1794,4644],[718,-3300],[33,-2583],[-443,-1626],[-365,435],[-451,2590],[538,-1592],[-959,3723],[84,790],[-635,2698]],[[40063,839903],[770,-536],[-859,-2772],[-125,3412],[214,-104]],[[40964,844347],[883,-2223],[79,-1915],[441,-2171],[-40,-1740],[-704,2418],[-1774,1537],[90,1825],[445,2301],[580,-32]],[[42065,848667],[903,-976],[563,-1663],[-706,-1821],[-339,-2285],[-564,-2],[-711,2401],[-620,812],[14,1297],[651,1761],[809,476]],[[46153,848898],[568,1],[10,-1610],[529,1],[18,-1676],[524,-12],[-4,-1547],[3176,0]],[[50974,844055],[-395,-2136],[-20,-6445],[-126,-25],[-6,-6437],[383,-5],[-10,-4748],[1058,-39]],[[51858,824220],[180,-1451],[604,-215],[-1456,-2220],[-980,-2588],[-900,-571],[-1213,-1602],[-1234,662],[-494,709],[-1854,-1999],[-659,648],[-690,-2756],[-941,669],[31,-2392],[-389,-2165],[-92,-1943],[-1046,-1523],[-746,776],[-935,-1159]],[[39044,805100],[-172,1112],[664,830],[-1128,3201],[-13,-2176],[-520,182],[-234,2567],[116,849],[-614,571],[-207,2123],[418,1187],[-481,1394],[-546,-1187],[-95,2644],[1073,795],[-526,599],[-413,1924],[1380,582],[-440,3023],[251,2549],[1109,5289],[619,2101],[570,-119],[933,3977],[823,-896],[965,-4031],[-209,4581],[-457,1793],[12,1197],[848,640],[78,1725],[725,1785],[524,-1399],[778,464],[610,2670],[668,1252]],[[46896,791982],[261,-1285],[-270,-665],[9,1950]],[[36192,795959],[180,-1952],[581,363],[562,-947],[-123,-4413],[448,-2402],[-1265,-1162],[-486,-2126],[-685,2000],[-493,-131],[-1055,2670],[-324,-89],[-644,1570],[-206,2197],[272,858],[1286,-625],[56,1283],[1008,2111],[905,-187],[-17,982]],[[17304,799216],[126,-1745],[804,-2158],[616,-183],[448,-1365],[-1028,65],[-1000,3083],[-322,373],[356,1930]],[[39654,805231],[136,-1106],[641,589],[-101,-1482],[649,41],[525,-808],[139,-1889],[-482,-1833],[-426,-534],[213,-1308],[-375,-571],[-319,-2845],[-422,135],[-775,2413],[439,1980],[-612,-774],[-640,997],[1252,2977],[-199,1359],[401,589],[-44,2070]],[[51858,824220],[3536,-32],[10,1609],[2034,-5],[-4,1617],[4083,203],[1,-1838],[5893,-29],[3388,4],[-14,1716],[962,59],[3,1571],[903,-11],[192,1616]],[[72845,830700],[-3,-16190]],[[72842,814510],[-1303,45],[-14,-5422],[124,-21],[-16,-4230]],[[50463,766367],[-102,-328]],[[49620,764426],[-139,-1468],[-1061,-1905],[-97,1293],[-1035,446],[862,1205],[617,1650],[-307,160],[-238,3846],[703,1138],[-113,1059],[-716,-1213],[-383,2903],[195,2895],[687,2210],[-441,2484],[-273,3082],[-346,1471],[-416,3726],[137,1138],[-767,3115],[393,1259],[285,3791],[-129,577],[-402,-4189],[-434,-1001],[311,-2534],[-69,-3036],[-406,-1085],[-1628,-2447],[-1520,-851],[-1012,789],[-258,2086],[267,429],[-760,1956],[-694,3087],[-87,1177],[383,1597],[-110,1291],[397,379],[-183,1458],[364,50],[277,1573],[411,342],[228,1752],[702,-118],[-16,-3249],[425,240],[607,2498],[-384,1562],[-1050,843],[629,147],[400,1001],[-600,267],[-481,-1345],[-125,3490],[-458,-1834],[195,-1307],[-1242,-569],[-216,1520],[-538,-627],[-174,927],[-743,-457]],[[91002,847056],[9,-3988],[145,-1795],[8,-11469],[-1548,26],[56,-1646],[46,-12769],[-726,14],[-2,-927],[-3493,32]],[[85497,814534],[-2026,-32],[-141,995]],[[83330,815497],[-404,601],[-735,-459],[-672,-2022],[-283,-2604],[-1335,126],[-328,2166],[-15,-1517],[-1058,-1636]],[[78500,810152],[-4,1152],[-1002,21],[-4,3164],[-4648,21]],[[72845,830700],[0,8044]],[[72845,838744],[3088,-82],[10,1347],[6637,9993],[4096,-25],[12,2587],[2946,186]],[[89634,852750],[1353,59],[15,-5753]],[[86653,868811],[757,-1570],[2145,14]],[[89555,867255],[87,-6323],[-8,-8182]],[[72845,838744],[1580,8236],[-1,2534],[-536,-83],[-516,926],[-152,2433],[36,3161],[1704,93],[24,3109],[496,-4],[22,3291],[619,95],[97,1432],[588,58],[151,-985],[625,-419],[1536,6612],[4538,-401],[2997,-21]],[[85497,814534],[-37,-10730],[-760,-83],[1,-2090]],[[84701,801631],[-828,17],[9,1987]],[[83882,803635],[-435,1931],[-460,-308],[-1062,1669],[-902,2471],[707,3049],[1129,2748],[471,302]],[[97244,787641],[-970,-3439],[63,995],[907,2444]],[[87222,789210],[-181,-1772],[-422,-410],[603,2182]],[[86635,788749],[223,2200],[232,-961],[-455,-1239]],[[86658,791573],[-369,-3115],[-330,1166],[699,1949]],[[89188,794370],[360,-14],[-243,-1523],[503,637],[-806,-2688],[-814,-3927],[156,-1241],[-672,-1392],[-694,-249],[130,1479],[1249,4306],[686,2953],[145,1659]],[[86769,795107],[-71,-1859],[-324,817],[395,1042]],[[90857,797012],[511,-366],[-57,-1276],[666,500],[124,-712],[-950,-1371],[-533,-1467],[-218,828],[596,1566],[-651,-377],[-25,892],[537,1783]],[[87021,792777],[237,3392],[601,-294],[-413,-4995],[-425,1897]],[[84910,786500],[234,323],[68,9012],[-286,660]],[[84926,796495],[584,1623],[519,-1019],[523,1881],[285,-1347],[30,-1922],[-996,-2869],[605,-1030],[-717,-2215],[-215,-2677],[-634,-420]],[[92921,798974],[-9,-545],[-1147,-2071],[-222,1208],[1378,1408]],[[88339,800844],[383,-576],[-511,-771],[128,1347]],[[86236,802132],[283,-1843],[-421,600],[138,1243]],[[84951,797243],[-1,3142]],[[84950,800385],[697,2105],[-36,-2998],[388,2501],[244,-2671],[-390,-1481],[-418,814],[-484,-1412]],[[86676,805210],[325,-2117],[-624,-286],[299,2403]],[[84951,801507],[-250,124]],[[91002,847056],[976,234],[63,648],[2682,18],[0,-1651],[1595,-292],[4037,-37],[350,-2273],[-454,-2972],[436,-1269],[-270,-2840],[732,-302],[295,1951],[1174,-336],[-15,-1588],[537,-65],[-10,-1550],[466,-24],[-40,-6434],[413,-697],[4,-4218],[2303,15]],[[106276,823374],[-1,-28114]],[[106275,795260],[-589,822],[-1600,-31],[4,1610],[-3847,-34],[-2014,-8871],[13,-855]],[[98242,787901],[-1021,2713],[47,775],[-1005,-33],[-276,1650],[-683,426],[369,3141],[18,2628],[-612,-1565],[-178,-1401],[-659,-2022],[-457,1505],[-714,1071],[-573,-359],[943,3800],[-1116,-764],[259,1691],[-925,-1558],[532,2101],[-1009,-888],[-677,62],[-94,801],[1014,956],[446,1115],[-1050,-704],[-516,1833],[317,3213],[1053,57],[-177,903],[-744,-283],[-1116,-3389],[-359,1426],[-193,-1467],[-586,-1116],[-376,408],[6,3472],[-402,-3497],[-547,-1350],[-586,2075],[324,2590],[504,2086],[123,1742],[-770,-3524],[-194,-1549],[-275,1236],[-413,-4415],[-943,-1986]],[[71670,777076],[233,-1112],[-578,-408],[345,1520]],[[79473,776784],[-279,-2074],[90,2387],[189,-313]],[[75949,796147],[-337,-1236],[224,2635],[113,-1399]],[[84951,801507],[-1,-1122]],[[84951,797243],[-25,-748]],[[84910,786500],[-1245,807],[240,1474],[-371,-167],[-386,-2038],[-206,3702],[-29,-2396],[-481,-1666],[-173,-1732],[-183,2620],[-197,-5326],[-848,3357],[-39,-1545],[420,-800],[-371,-1104],[-68,-1569],[-635,-858],[208,3841],[-673,-5212],[-363,1475],[21,-2088],[-388,-20],[-756,-4011],[-74,2111],[-347,-2231],[-660,934],[-173,-859],[-799,-887],[-18,1049],[-623,715],[205,2741],[546,1203],[718,23],[17,1317],[737,963],[-66,842],[764,2927],[-372,25],[-1227,-2967],[-387,246],[-629,2275],[460,4880],[786,3381],[112,2715],[231,475],[102,3025],[-410,3227],[967,1254],[994,2799],[846,1832],[515,-1977],[448,-352],[796,1052],[346,-814],[1490,-887],[200,-646]],[[78500,810152],[-529,-2655],[-889,-709],[-891,-2927],[268,-2258],[-402,43],[-550,-1341],[-153,-1302],[-582,-1608],[-230,-3803],[-474,-1479],[-1035,411],[707,-1449],[308,-1771],[-381,-2913],[-287,-680],[-1149,-274],[-159,-989],[796,2],[-164,-2224],[-453,-1068],[-562,296],[227,1314],[-337,1411],[33,-1984],[-398,-2576],[-671,-197],[279,-1966],[-1055,-1700],[-61,-2764],[-263,-488],[166,-2860],[277,1050],[1025,35],[413,-1682],[604,-1164],[58,-1233]],[[106275,795260],[0,-1588],[1343,-1612],[173,1644],[1330,-2348],[801,2853],[1723,322],[-345,-4919],[404,-1740],[964,-1648],[226,-2564],[2839,-9771],[300,-4810],[-74,-1471]],[[114794,765672],[-73,1821],[-694,2541],[-828,1292],[163,1473],[-568,-631],[-1881,4464],[-679,903],[-783,1959],[551,424],[542,2604],[-421,3603],[333,1618],[530,-2532],[164,177],[-480,2635],[-360,838],[-174,-1871],[-463,-2242],[-1472,-2407],[-1544,735],[-1623,2726],[527,2089],[-371,3153],[-375,-856],[437,-1616],[-624,-1272],[-2761,2302],[-2696,-711],[-929,-990]],[[106279,946179],[-1,-49412]],[[106278,896767],[-929,-2457],[-130,-1600],[-1321,-3359],[-907,419],[-783,-1693],[-450,408],[-349,-3372],[-325,-1449],[-654,-436],[-1188,-2953],[58,-3794],[-686,-1988],[-821,654]],[[97793,875147],[-205,2151],[358,3325],[-316,719],[513,846],[-159,1080],[-963,-156],[-338,-900],[-1244,1394],[-886,-1195],[-579,221],[-639,-953],[-286,1202],[374,853],[-1289,1884],[-166,1202],[398,1802],[-514,869],[-625,-618],[-460,-1403],[-1061,-1321],[-1073,-10],[-601,-1159],[-3102,6],[49,-11363],[273,317],[853,-2473],[548,-2656]],[[50974,844055],[10,4776],[492,29],[-58,4949],[548,10],[4,1425],[1103,13],[-17,1635],[486,23],[-3,1682],[645,-27],[-89,4840],[-627,-26],[-61,12986],[569,33],[-9,3217],[557,13],[-4,6309],[539,-18],[-5,4867],[-575,-8]],[[54479,890783],[-5,8105],[1752,-14],[2,3093],[2984,34],[5,6543],[2343,38],[1,-3290],[1183,54],[6,3236],[1194,12],[-3,-1576],[600,61],[1,-1630],[1168,-18],[135,4836],[1805,-29],[9,2778],[1841,-6],[167,1643],[-10,6646],[-437,-20],[-10,1684],[-1234,59],[4,4809],[169,1664],[-624,-6],[17,1606],[-634,-27],[7,1645],[-621,10],[151,4212]],[[66445,936935],[6419,-2],[8315,-30],[7299,18],[3888,6],[-10,9096],[4663,309],[4790,-300],[4470,147]],[[97793,875147],[-1158,-1860],[-1437,-204],[-262,-1096],[-804,-486],[-476,-1291],[-576,796],[-732,-1427],[-433,43],[-568,-2104],[-1792,-263]],[[106278,896767],[-2,-73393]],[[79659,983425],[-186,-1458],[-395,1373],[581,85]],[[66445,936935],[-1,525],[-2610,-23],[-8,1900],[-2541,-186],[-15,1669],[-3117,28],[-4016,91],[-18,1253],[-1129,58],[26,-1250],[-2705,21],[-18,1268],[-1182,3],[11,-1279],[-1329,46],[-7,1283],[-2020,165],[0,-1272],[-4957,-98],[15,-3782],[-2411,70]],[[38413,937425],[-1695,2109],[-331,1545],[-1320,2645],[530,804],[403,3101],[38,5653],[2426,-416],[2905,1304],[905,1071],[1222,2916],[1184,4349],[538,5906],[-329,649],[1231,3476],[365,2385],[846,2065],[658,2577],[521,-1587],[1146,663],[1622,2412],[1470,3493],[882,527],[-302,-3710],[454,-2622],[-62,3461],[380,972],[-494,2433],[-541,46],[1260,3273],[1370,1209],[-523,-1007],[415,-852],[3297,1404],[1421,2118],[704,1933],[1322,4593],[409,808],[627,-1392],[915,-472],[117,-1342],[1298,-97],[153,-1576],[-589,-1821],[-1263,-1269],[606,-390],[-400,-1319],[1303,-54],[456,606],[-100,1673],[703,1368],[285,1695],[248,-1305],[706,928],[682,-1755],[-272,-1975],[1375,-2189],[693,2096],[1211,87],[987,691],[970,-830],[279,-2575],[299,2682],[989,-1071],[-561,-2519],[5,-1532],[1009,-525],[-1482,-681],[2474,169],[-499,-2280],[1552,-378],[326,-1080],[240,1607],[1280,271],[-195,-2495],[904,1573],[845,524],[665,1466],[1963,-425],[886,-1703],[688,50],[281,-1515],[1081,464],[877,-2131],[2068,-1579],[1439,785],[1493,-1038],[433,638],[1637,-3240],[1773,-387],[359,912],[3399,1866],[1396,-1344],[1104,-2165],[387,-1505],[1266,-1051],[1131,-2960],[450,854],[588,-630],[-1,-21362]],[[54479,890783],[-578,0],[-10,-1617],[-6227,42],[-4789,-36],[-1,3200],[-592,6],[0,3250],[-769,-10],[8,6456],[-205,26],[-5,6430],[-226,1957]],[[41085,910487],[1578,205],[202,-2556],[-311,-1225],[120,-2178],[-263,-1028],[215,-1763],[590,-1196],[375,540],[1138,-445],[965,699],[321,-1177],[667,-159],[982,797],[546,-2004],[189,2045],[810,3513],[796,-959],[609,527],[-495,1902],[-1494,1020],[-695,-1271],[194,3234],[-839,3465],[-836,788],[-422,2410],[386,1581],[446,30],[876,-3094],[-154,-2498],[448,-1913],[931,-1944],[1114,1832],[1074,-3146],[1511,331],[131,1770],[-331,2163],[-932,-162],[-460,1241],[-885,-263],[-253,-1860],[-717,-285],[-1099,3517],[232,3056],[871,1516],[-974,1717],[-1121,-1076],[-1026,-153],[-389,1249],[-528,-564],[-2241,1824],[-397,5492],[-677,3578],[-1097,2080],[-2353,5735]],[[46592,855663],[131,-1524],[-910,378],[779,1146]],[[20846,858392],[155,-1918],[1767,-2169],[1395,2514],[527,-232],[506,-1478],[153,-2243],[1093,-1044],[302,-1308],[1483,-327],[899,-741],[-443,-2851],[-1263,664],[-756,-2937],[125,-925],[-599,-398],[122,1508],[-581,2032],[-993,769],[95,1587],[-980,2254],[-777,1164],[-1179,-1499],[-406,-1269],[-853,1089],[-307,2233],[515,5525]],[[40155,909679],[-378,-812],[-1698,-1707],[2076,2519]],[[46153,848898],[640,3384],[128,1617],[836,-1042],[-394,-958],[1743,358],[1080,995],[1027,4968],[-512,5797],[-74,2808],[-783,2760],[-729,205],[138,2075],[1089,-245],[770,2178],[52,1988],[-320,1965],[-760,1982],[-574,-2906],[-898,82],[-597,-1411],[-710,-399],[-196,-1163],[-840,-1617],[-252,-2634],[-446,-1194],[-161,3173],[-951,2836],[-459,-1140],[680,-1515],[9,-1792],[-1367,2870],[-2018,-58],[-2019,-2251],[-807,901],[-2508,1784],[-689,2790],[279,1486],[-107,1445],[-749,1760],[-607,2842],[664,-527],[574,1254],[301,1828],[876,-777],[601,-2903],[499,-323],[640,1345],[-382,828],[-828,195],[-166,-711],[-669,2577],[-1941,1613],[-1534,482],[-1420,2818],[-465,461],[786,2442],[578,22],[0,1593],[845,1741],[325,-909],[992,2481],[418,1888],[1044,1672],[643,-1028],[1215,99],[319,783],[-1041,1553],[504,1846],[720,1193],[1099,506],[107,-679],[853,2834],[831,668]],[[129335,693546],[271,-1010],[-142,-1955],[-385,2864],[256,101]],[[133465,694933],[144,-1619],[-433,-1116],[-420,1401],[709,1334]],[[129050,698432],[385,-3029],[-187,-665],[-381,868],[233,1060],[-50,1766]],[[128271,699419],[264,-2151],[-73,-1620],[899,-5179],[112,-1526],[-465,199],[-651,4105],[-450,3522],[53,2603],[311,47]],[[132791,699517],[329,-1553],[-33,-2741],[-745,304],[319,2136],[-199,1261],[329,593]],[[127590,701351],[340,-1447],[-98,-960],[-490,-120],[14,2204],[234,323]],[[126995,702605],[287,-601],[-587,-1676],[300,2277]],[[127349,703974],[-507,-707],[254,1440],[253,-733]],[[126549,705223],[400,-333],[-240,-1814],[-293,1014],[133,1133]],[[127577,705503],[192,-1281],[-213,-946],[-252,1520],[273,707]],[[126975,710441],[673,-1209],[-593,136],[46,-1542],[-470,1638],[344,977]],[[127738,711890],[119,-2595],[-286,1329],[167,1266]],[[132951,712558],[-517,-394],[513,1288],[4,-894]],[[127377,716539],[387,-260],[-15,-2495],[-236,369],[-706,-1255],[-240,-1211],[-257,709],[519,3076],[548,1067]],[[126878,720140],[451,-579],[750,57],[384,-2788],[-191,-1469],[383,-1822],[435,266],[497,-1761],[456,-2620],[47,-3196],[267,734],[169,-1960],[371,-1718],[-850,2044],[-552,-1434],[684,586],[160,-2342],[299,487],[445,-2791],[-464,-922],[454,-352],[205,1480],[89,-3147],[-431,-827],[396,-512],[101,-2502],[-398,-59],[421,-1193],[-183,-2479],[-613,702],[-449,4336],[-561,-35],[258,2640],[-329,-710],[132,1822],[-300,-502],[-725,2251],[-725,264],[28,1947],[514,-21],[-361,1667],[236,2818],[-439,-873],[-448,796],[643,3530],[-238,1458],[-150,5160],[-814,306],[-187,1877],[133,1386]],[[133954,721013],[796,-683],[442,-1861],[432,-443],[118,-1890],[501,-841],[396,492],[280,-2136],[-1,-1873],[-414,-2628],[68,-3449],[429,-5569],[-359,-1662],[-236,-2416],[-441,-2702],[-867,-2699],[-213,1932],[-286,-2060],[-269,663],[-207,4192],[490,1686],[-537,-477],[-156,1948],[582,2169],[-76,7458],[-887,5088],[-486,-470],[-72,869],[-950,-2430],[-396,-118],[344,-1651],[-545,-5283],[-588,1664],[-115,2845]],[[312327,9345],[187,-607]],[[312514,8738],[-15,-1699]],[[312499,7039],[-350,67]],[[312149,7106],[17,912]],[[312166,8018],[43,812]],[[312209,8830],[118,515]],[[312084,13310],[6,-1330]],[[312090,11980],[-147,-91]],[[311943,11889],[-157,1158]],[[311786,13047],[223,739]],[[312009,13786],[75,-476]],[[312224,10808],[178,-1249]],[[312402,9559],[-75,-214]],[[312209,8830],[-202,83]],[[312007,8913],[-56,276]],[[311951,9189],[-19,1837]],[[311932,11026],[292,-218]],[[313107,15065],[-14,-2951]],[[313093,12114],[-156,-33]],[[312937,12081],[5,365]],[[312942,12446],[-35,2687]],[[312907,15133],[200,-68]],[[312774,6524],[70,-1308]],[[312844,5216],[-339,-42]],[[312505,5174],[62,1491]],[[312567,6665],[207,-141]],[[312709,10759],[26,-1200]],[[312735,9559],[-333,0]],[[312224,10808],[123,645]],[[312347,11453],[362,-694]],[[315123,11875],[54,-128]],[[315177,11747],[78,-1803]],[[315255,9944],[-163,-1770]],[[315092,8174],[-119,1033]],[[314973,9207],[-63,762]],[[314910,9969],[144,1736]],[[315054,11705],[69,170]],[[314670,11208],[37,-330]],[[314707,10878],[60,-642]],[[314767,10236],[-199,-737]],[[314568,9499],[-72,1129]],[[314496,10628],[174,580]],[[314052,6833],[264,-476]],[[314316,6357],[-19,-702]],[[314297,5655],[-318,75]],[[313979,5730],[73,1103]],[[312567,6665],[-68,374]],[[312514,8738],[144,137]],[[312658,8875],[116,-2351]],[[312942,12446],[-192,449]],[[312750,12895],[-16,-17]],[[312734,12878],[-7,2191]],[[312727,15069],[180,64]],[[313370,8907],[-65,-415]],[[313305,8492],[-209,82]],[[313096,8574],[-80,-28]],[[313016,8546],[-82,705]],[[312934,9251],[27,1093]],[[312961,10344],[345,-244],[64,-1193]],[[313305,8492],[-14,-2847]],[[313291,5645],[-154,398]],[[313137,6043],[-41,2531]],[[314464,12204],[-98,-1501]],[[314366,10703],[-105,-151]],[[314261,10552],[-75,983]],[[314186,11535],[35,729]],[[314221,12264],[129,637]],[[314350,12901],[114,-697]],[[314016,15104],[-14,-2136]],[[314002,12968],[-54,9]],[[313948,12977],[-196,-375]],[[313752,12602],[-27,1006]],[[313725,13608],[25,1394]],[[313750,15002],[266,102]],[[313604,15085],[-4,-1775]],[[313600,13310],[-8,-955]],[[313592,12355],[-45,-184]],[[313547,12171],[-454,-57]],[[313107,15065],[497,20]],[[314264,15070],[-76,-2600]],[[314188,12470],[-186,498]],[[314016,15104],[248,-34]],[[315464,13512],[1,-2420]],[[315465,11092],[-66,434]],[[315399,11526],[-159,1610]],[[315240,13136],[-103,1307]],[[315137,14443],[122,138]],[[315259,14581],[205,-1069]],[[314938,14053],[76,-2457]],[[315014,11596],[-176,-329]],[[314838,11267],[34,2700]],[[314872,13967],[51,292]],[[314923,14259],[15,-206]],[[315375,10330],[63,-1609]],[[315438,8721],[6,-427]],[[315444,8294],[-234,-827]],[[315210,7467],[-116,640]],[[315094,8107],[-2,67]],[[315255,9944],[120,386]],[[313784,8891],[255,-1303]],[[314039,7588],[13,-755]],[[313979,5730],[-242,-150]],[[313737,5580],[-39,3313]],[[313698,8893],[16,19]],[[313714,8912],[70,-21]],[[315465,11092],[-90,-762]],[[315177,11747],[222,-221]],[[313725,9097],[-11,-185]],[[313698,8893],[-269,126]],[[313429,9019],[231,2602]],[[313660,11621],[65,-2524]],[[314361,14911],[31,-1699]],[[314392,13212],[-42,-311]],[[314221,12264],[-33,206]],[[314264,15070],[97,-159]],[[312306,11771],[41,-318]],[[311932,11026],[-107,569]],[[311825,11595],[118,294]],[[312090,11980],[216,-209]],[[312937,12081],[24,-1737]],[[312934,9251],[-27,-13]],[[312907,9238],[-172,321]],[[312709,10759],[41,2136]],[[312505,5174],[-359,-115]],[[312146,5059],[3,2047]],[[314634,8728],[-21,-893]],[[314613,7835],[-92,-362]],[[314521,7473],[-160,1420]],[[314361,8893],[201,525]],[[314562,9418],[72,-690]],[[312295,14639],[81,-1251]],[[312376,13388],[-70,-1617]],[[312084,13310],[211,1329]],[[312007,8913],[159,-895]],[[312146,5059],[-281,903],[86,3227]],[[315210,7467],[60,-308]],[[315270,7159],[221,-1461]],[[315491,5698],[-308,-32]],[[315009,6674],[174,-1008]],[[315009,6674],[81,1384]],[[315090,8058],[4,49]],[[314186,11535],[-217,-675]],[[313969,10860],[-21,2117]],[[312009,13786],[157,1824]],[[312166,15610],[129,-971]],[[313137,6043],[-273,-821]],[[312864,5222],[152,3324]],[[314838,11267],[-131,-389]],[[314670,11208],[-8,753]],[[314662,11961],[28,1346]],[[314690,13307],[76,779]],[[314766,14086],[106,-119]],[[313547,12171],[113,-550]],[[313429,9019],[-59,-112]],[[314973,9207],[-339,-479]],[[314562,9418],[6,81]],[[314767,10236],[143,-267]],[[314776,6994],[-112,-1632]],[[314664,5362],[-367,293]],[[314316,6357],[205,1116]],[[314613,7835],[163,-841]],[[312679,13385],[55,-507]],[[312376,13388],[303,-3]],[[315090,8058],[-314,-1064]],[[314662,11961],[-198,243]],[[314392,13212],[143,200]],[[314535,13412],[155,-105]],[[312679,13385],[-109,1772]],[[312570,15157],[157,-88]],[[313752,12602],[-160,-247]],[[313600,13310],[125,298]],[[314496,10628],[-130,75]],[[313604,15085],[146,-83]],[[315240,13136],[-117,-1261]],[[315054,11705],[-40,-109]],[[314938,14053],[199,390]],[[315043,5450],[-34,1224]],[[315043,5450],[-379,-88]],[[312864,5222],[-20,-6]],[[312658,8875],[249,363]],[[314001,9350],[196,-57]],[[314197,9293],[164,-400]],[[314039,7588],[-38,1762]],[[313784,8891],[217,459]],[[313969,10860],[-244,-1763]],[[313737,5580],[-446,65]],[[314261,10552],[-64,-1259]],[[312166,15610],[404,-453]],[[315579,8262],[226,-901]],[[315805,7361],[-150,-1087]],[[315655,6274],[-385,885]],[[315444,8294],[135,-32]],[[314849,14669],[-83,-583]],[[314535,13412],[108,1312]],[[314643,14724],[206,-55]],[[318309,12804],[169,-865],[-544,829],[375,36]],[[316158,12800],[-233,-1215]],[[315925,11585],[-15,-114]],[[315910,11471],[23,1757]],[[315933,13228],[225,-428]],[[315714,13935],[-106,-832]],[[315608,13103],[-144,409]],[[315259,14581],[455,-646]],[[315655,6274],[-164,-576]],[[315910,11471],[-22,-197]],[[315888,11274],[-160,-129]],[[315728,11145],[-34,40]],[[315694,11185],[-86,1918]],[[315714,13935],[219,-707]],[[315888,11274],[293,-1348]],[[316181,9926],[-216,-625]],[[315965,9301],[-242,491]],[[315723,9792],[5,1353]],[[315723,9792],[-144,-1530]],[[315438,8721],[211,2085]],[[315649,10806],[45,379]],[[315649,10806],[-184,286]],[[316256,11346],[-331,239]],[[316158,12800],[154,393],[-56,-1847]],[[316256,11346],[125,-1004],[-200,-416]],[[315965,9301],[-160,-1940]],[[316936,9055],[328,-560],[-757,-909],[-91,685],[520,784]],[[318661,1986],[376,-1085],[-740,-781],[24,1181],[340,685]],[[314361,14911],[282,-187]],[[123928,718235],[-2,-1610]],[[119111,747595],[-67,-5]],[[124871,753168],[418,537]],[[71986,766650],[158,17]],[[56428,729876],[0,-164]],[[126985,748600],[107,525]],[[126818,747787],[-267,-754]],[[61672,65312],[272,-274]],[[314849,14669],[74,-410]],[[315183,5666],[-140,-216]],[[311825,11595],[-39,1452]],[[253891,243332],[-3,424]],[[297006,439075],[21,-79]],[[273150,218795],[-218,2571],[-109,2556],[341,-5125]],[[273164,218797],[-14,-2]],[[275036,140768],[-16,1]],[[274871,140335],[3,-76]],[[268559,210807],[-4,-26]],[[258410,236520],[0,355]],[[272837,223331],[-14,0]],[[274173,206960],[19,0]],[[275584,178509],[-145,-584]],[[275994,173067],[-63,2]],[[275922,173070],[-37,2]],[[272518,253791],[20,18]],[[272125,254343],[81,-132]],[[256680,462075],[-142,-2897],[-384,-10769]],[[256154,448409],[-883,-7],[0,-983]],[[254488,462036],[2192,39]],[[256154,448409],[1065,-7]],[[249637,222999],[-31,137]],[[248195,214699],[-70,-748]],[[247232,214954],[0,260]],[[247232,215317],[15,318]],[[301353,460902],[-185,-724]],[[301101,460137],[28,-397]],[[301793,457791],[116,-445]],[[285769,400843],[123,37]],[[264771,527003],[-281,49]],[[267568,452013],[-852,-4103],[-108,-17]],[[266608,447893],[-26,-6]],[[266582,447887],[-16,-1]],[[266566,447886],[-30,-6]],[[266536,447880],[-6,-1]],[[256680,462075],[-375,16538],[12,3500],[187,5880],[609,12037],[445,5943],[542,3980],[721,3116],[-1423,3912],[-936,-37],[-588,-3704],[-267,-718],[-95,-2358],[-427,343]],[[247207,537862],[1281,13508]],[[248488,551370],[1322,13439]],[[249810,564809],[408,-727],[1834,5024],[865,1148],[2109,-5688],[7666,-20686],[271,-4739],[574,-3230],[509,900],[683,396],[-47,-2079],[105,-3301],[426,-3438],[360,1156],[708,-243],[385,-2004],[-455,-3293],[3005,-8985],[1103,-32532],[-926,-12370],[-34,-3060],[-156,-2886],[-328,-976],[-521,-3379],[-656,-1036],[-180,-1472],[-60,-3681],[110,-1615]],[[252129,567028],[-1583,-4120],[166,-1627],[582,1037],[-142,551],[872,1783],[743,3451],[-638,-1075]],[[248488,551370],[-1963,212],[-2260,-6869],[-1513,-4210]],[[249572,564554],[238,255]],[[282592,309414],[10,-65]],[[289029,404122],[-16,45]],[[293679,426705],[-79,470]],[[286839,484138],[-17,6]],[[276897,457877],[-3,4558]],[[276894,462435],[2305,5850],[8,2378],[-220,544],[-164,5160],[-363,3502],[1422,3362],[1923,0],[3353,0],[997,8619],[109,340]],[[267767,442766],[-50,-4]],[[267568,452013],[114,-1687],[1085,-3482],[787,0],[3209,9884],[2039,2175]],[[274802,458903],[-16,-6460]],[[274802,458903],[1209,1289],[883,2243]],[[275537,276578],[-263,-628]],[[273916,275250],[-11,-827]],[[273920,274333],[-20,-184]],[[228015,167092],[147,-2633],[-252,2651],[105,-18]],[[228180,184437],[70,-94]],[[229313,193901],[29,366]],[[230757,204203],[-190,587]],[[229828,205636],[-9,-8]],[[229431,197365],[-30,-1032]],[[228487,190418],[-16,-156]],[[286226,362368],[89,-504]],[[283710,365528],[174,-301]],[[286242,357857],[63,-1057]],[[286254,356334],[304,311]],[[286558,356645],[136,36]],[[284458,394060],[-9,-959]],[[151607,571679],[12,2074],[1993,-3664],[1312,-1342],[815,1107],[372,2584],[-289,2342],[-137,2706],[722,1361],[0,1194],[-873,3181],[648,-1]],[[156182,583221],[153,1]],[[156335,583222],[770,0]],[[253979,502714],[-8,-1]],[[242231,539612],[9,872]],[[242245,540522],[75,212]],[[242329,540727],[187,592]],[[242526,541319],[224,-823]],[[288652,406259],[12,7]],[[288613,408309],[-8,430]],[[290026,386798],[-57,0]],[[287992,379951],[5,43]],[[287430,351414],[50,-2]],[[287480,351412],[118,4]],[[287598,351416],[-258,-2]],[[280248,301457],[-33,176]],[[156182,583221],[153,1]]],"transform":{"scale":[0.00035892617892657177,0.00005371486851395936],"translate":[-179.1473400003406,17.67439566600018]}} diff --git a/float-no-zero/examples/data/topojson/world-110m.json b/float-no-zero/examples/data/topojson/world-110m.json new file mode 100644 index 0000000000..2f4dd1fa57 --- /dev/null +++ b/float-no-zero/examples/data/topojson/world-110m.json @@ -0,0 +1 @@ +{"type":"Topology","transform":{"scale":[0.0036000360003600037,0.0016925586033320111],"translate":[-180,-85.60903777459777]},"objects":{"land":{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[7,8,9]],[[10,11]],[[12]],[[13]],[[14]],[[15]],[[16]],[[17]],[[18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29,30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42,43]],[[44]],[[45]],[[46]],[[47,48,49,50]],[[51]],[[52]],[[53]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]],[[60]],[[61]],[[62,63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76,77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90,91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221]],[[222,223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230,231,232,233]],[[234]],[[235]],[[236]],[[237]],[[238]],[[239]],[[240]],[[241]],[[242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477],[478,479,480,481,482,483,484]],[[485]],[[486]],[[487]],[[488]],[[489]],[[490]],[[491]],[[492]],[[493]],[[494]],[[495]],[[496]],[[497]],[[498]]]},"countries":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[499,500,501,502,503,504]],"id":4},{"type":"MultiPolygon","arcs":[[[505,506,352,507]],[[354,508,509]]],"id":24},{"type":"Polygon","arcs":[[510,511,414,512,513,514]],"id":8},{"type":"Polygon","arcs":[[312,515,314,516,517]],"id":784},{"type":"MultiPolygon","arcs":[[[518,11]],[[519,520,521,166,522,168,523,524]]],"id":32},{"type":"Polygon","arcs":[[525,526,527,528,529]],"id":51},{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[530,531]]],"id":10},{"type":"Polygon","arcs":[[13]],"id":260},{"type":"MultiPolygon","arcs":[[[14]],[[24]]],"id":36},{"type":"Polygon","arcs":[[532,533,534,535,536,537,538]],"id":40},{"type":"MultiPolygon","arcs":[[[539,-528]],[[484,540,479,541,-526,542,543]]],"id":31},{"type":"Polygon","arcs":[[544,545,546]],"id":108},{"type":"Polygon","arcs":[[547,548,549,550,437]],"id":56},{"type":"Polygon","arcs":[[551,552,553,554,366]],"id":204},{"type":"Polygon","arcs":[[555,556,557,-553,558,559]],"id":854},{"type":"Polygon","arcs":[[560,561,289,562]],"id":50},{"type":"Polygon","arcs":[[563,404,564,565,566,567]],"id":100},{"type":"MultiPolygon","arcs":[[[71]],[[73]],[[74]]],"id":44},{"type":"Polygon","arcs":[[568,569,570]],"id":70},{"type":"Polygon","arcs":[[571,572,573,574,575]],"id":112},{"type":"Polygon","arcs":[[576,145,577]],"id":84},{"type":"Polygon","arcs":[[578,579,580,581,-525]],"id":68},{"type":"Polygon","arcs":[[-521,582,-581,583,584,585,586,587,588,164,589]],"id":76},{"type":"Polygon","arcs":[[48,590]],"id":96},{"type":"Polygon","arcs":[[591,592]],"id":64},{"type":"Polygon","arcs":[[593,594,595,596]],"id":72},{"type":"Polygon","arcs":[[597,598,599,600,601,602,603]],"id":140},{"type":"MultiPolygon","arcs":[[[84]],[[85]],[[86]],[[87]],[[88]],[[96]],[[97]],[[99]],[[101]],[[103]],[[604,107,605,109,606,111,607,113,608,115,609,117,610,199,611,201,612,215,613,217,614,219,615,221]],[[616,223]],[[224]],[[225]],[[226]],[[227]],[[229]],[[230,617,232,618]],[[235]],[[237]],[[238]],[[240]],[[241]],[[485]],[[486]],[[488]],[[489]],[[490]],[[496]],[[497]]],"id":124},{"type":"Polygon","arcs":[[-536,619,620,621]],"id":756},{"type":"MultiPolygon","arcs":[[[-519,622,623,624]],[[-524,169,625,171,626,-579]]],"id":152},{"type":"MultiPolygon","arcs":[[[64]],[[627,274,628,276,629,278,630,280,631,632,633,634,635,-593,636,637,638,639,-503,640,641,642,643,644,645]]],"id":156},{"type":"Polygon","arcs":[[369,646,647,648,-556,649]],"id":384},{"type":"Polygon","arcs":[[650,651,652,359,653,654,655,656,-604,657]],"id":120},{"type":"Polygon","arcs":[[658,659,-545,660,661,662,663,-508,353,-510,664,-602,665]],"id":180},{"type":"Polygon","arcs":[[-509,355,666,-658,-603,-665]],"id":178},{"type":"Polygon","arcs":[[667,174,668,155,669,-585,670]],"id":170},{"type":"Polygon","arcs":[[178,671,151,672]],"id":188},{"type":"Polygon","arcs":[[70]],"id":192},{"type":"Polygon","arcs":[[77,673]],"id":-99},{"type":"Polygon","arcs":[[76,-674]],"id":196},{"type":"Polygon","arcs":[[-538,674,675,676]],"id":203},{"type":"Polygon","arcs":[[445,677,-675,-537,-622,678,679,-549,680,441,681]],"id":276},{"type":"Polygon","arcs":[[337,682,683,684]],"id":262},{"type":"MultiPolygon","arcs":[[[92]],[[-682,442,685,444]]],"id":208},{"type":"Polygon","arcs":[[62,686]],"id":214},{"type":"Polygon","arcs":[[687,688,689,690,691,384,692,693]],"id":12},{"type":"Polygon","arcs":[[173,-668,694]],"id":218},{"type":"Polygon","arcs":[[333,695,696,390,697]],"id":818},{"type":"Polygon","arcs":[[698,699,700,336,-685]],"id":232},{"type":"Polygon","arcs":[[431,701,433,702,427,703,429,704]],"id":724},{"type":"Polygon","arcs":[[450,705,706]],"id":233},{"type":"Polygon","arcs":[[-684,707,708,709,710,711,712,-699]],"id":231},{"type":"Polygon","arcs":[[713,452,714,715,455,716,717]],"id":246},{"type":"MultiPolygon","arcs":[[[18]],[[19]],[[20]]],"id":242},{"type":"Polygon","arcs":[[12]],"id":238},{"type":"MultiPolygon","arcs":[[[718,719,163,-589]],[[82]],[[720,-679,-621,721,426,-703,434,722,436,-551]]],"id":250},{"type":"Polygon","arcs":[[356,723,-651,-667]],"id":266},{"type":"MultiPolygon","arcs":[[[724,90]],[[725,726,727,728,729,730,731,732]]],"id":826},{"type":"Polygon","arcs":[[400,733,-543,-530,734]],"id":268},{"type":"Polygon","arcs":[[368,-650,-560,735]],"id":288},{"type":"Polygon","arcs":[[736,737,374,738,739,740,-648]],"id":324},{"type":"Polygon","arcs":[[741,377]],"id":270},{"type":"Polygon","arcs":[[375,742,-739]],"id":624},{"type":"Polygon","arcs":[[357,-652,-724]],"id":226},{"type":"MultiPolygon","arcs":[[[78]],[[407,743,409,744,411,745,413,-512,746,-566,747]]],"id":300},{"type":"Polygon","arcs":[[498]],"id":304},{"type":"Polygon","arcs":[[185,748,-578,146,749,750]],"id":320},{"type":"Polygon","arcs":[[161,751,-587,752]],"id":328},{"type":"Polygon","arcs":[[182,753,754,-750,147,755,149,756]],"id":340},{"type":"Polygon","arcs":[[757,-571,758,417,759,419,760,761]],"id":191},{"type":"Polygon","arcs":[[-687,63]],"id":332},{"type":"Polygon","arcs":[[-533,762,763,764,765,-762,766]],"id":348},{"type":"MultiPolygon","arcs":[[[26]],[[767,30]],[[31]],[[32]],[[35]],[[36]],[[39]],[[40]],[[768,43]],[[44]],[[45]],[[769,50]],[[46]]],"id":360},{"type":"Polygon","arcs":[[-639,770,-637,-592,-636,771,-563,290,772,292,773,294,774,296,775]],"id":356},{"type":"Polygon","arcs":[[91,-725]],"id":372},{"type":"Polygon","arcs":[[776,-505,777,300,778,302,779,780,781,-540,-527,-542,480]],"id":364},{"type":"Polygon","arcs":[[782,783,784,785,786,-781,787]],"id":368},{"type":"Polygon","arcs":[[100]],"id":352},{"type":"Polygon","arcs":[[788,789,-698,391,790,791,792]],"id":376},{"type":"MultiPolygon","arcs":[[[79]],[[80]],[[793,421,794,423,795,425,-722,-620,-535]]],"id":380},{"type":"Polygon","arcs":[[61]],"id":388},{"type":"Polygon","arcs":[[796,-785,797,332,-790,798,-793]],"id":400},{"type":"MultiPolygon","arcs":[[[75]],[[81]],[[83]]],"id":392},{"type":"Polygon","arcs":[[799,800,482,801,-643,802]],"id":398},{"type":"Polygon","arcs":[[342,803,804,805,-710,806]],"id":404},{"type":"Polygon","arcs":[[-803,-642,807,808]],"id":417},{"type":"Polygon","arcs":[[809,810,811,283]],"id":116},{"type":"Polygon","arcs":[[265,812,267,813]],"id":410},{"type":"Polygon","arcs":[[-515,814,815,816]],"id":-99},{"type":"Polygon","arcs":[[304,817,-783]],"id":414},{"type":"Polygon","arcs":[[818,819,-634,820,-811]],"id":418},{"type":"Polygon","arcs":[[-791,392,821]],"id":422},{"type":"Polygon","arcs":[[370,822,372,823,-737,-647]],"id":430},{"type":"Polygon","arcs":[[824,-694,825,388,826,-697,827,828]],"id":434},{"type":"Polygon","arcs":[[52]],"id":144},{"type":"Polygon","arcs":[[829]],"id":426},{"type":"Polygon","arcs":[[830,448,831,-572,832]],"id":440},{"type":"Polygon","arcs":[[-680,-721,-550]],"id":442},{"type":"Polygon","arcs":[[449,-707,833,-573,-832]],"id":428},{"type":"Polygon","arcs":[[-692,834,835,836,837,383]],"id":504},{"type":"Polygon","arcs":[[838,839]],"id":498},{"type":"Polygon","arcs":[[23]],"id":450},{"type":"Polygon","arcs":[[840,-577,-749,186,841,188,842,190,843,192,844,194,845]],"id":484},{"type":"Polygon","arcs":[[-817,846,-567,-747,-511]],"id":807},{"type":"Polygon","arcs":[[847,-689,848,-557,-649,-741,849]],"id":466},{"type":"Polygon","arcs":[[287,-561,-772,-635,-820,850]],"id":104},{"type":"Polygon","arcs":[[416,-759,-570,851,-815,-514,852]],"id":499},{"type":"Polygon","arcs":[[853,-645]],"id":496},{"type":"Polygon","arcs":[[854,344,855,856,347,857,858,859,860,861,862]],"id":508},{"type":"Polygon","arcs":[[863,379,864,-690,-848]],"id":478},{"type":"Polygon","arcs":[[-863,865,866]],"id":454},{"type":"MultiPolygon","arcs":[[[285,867]],[[-770,47,-591,49]]],"id":458},{"type":"Polygon","arcs":[[351,-507,868,-595,869]],"id":516},{"type":"Polygon","arcs":[[17]],"id":540},{"type":"Polygon","arcs":[[-558,-849,-688,-825,870,-656,871,-554]],"id":562},{"type":"Polygon","arcs":[[361,872,363,873,365,-555,-872,-655]],"id":566},{"type":"Polygon","arcs":[[179,874,181,-757,150,-672]],"id":558},{"type":"Polygon","arcs":[[-681,-548,438,875,440]],"id":528},{"type":"MultiPolygon","arcs":[[[876,-718,877,457,878,459,879,461]],[[487]],[[492]],[[493]]],"id":578},{"type":"Polygon","arcs":[[-771,-638]],"id":524},{"type":"MultiPolygon","arcs":[[[15]],[[16]]],"id":554},{"type":"MultiPolygon","arcs":[[[880,319,881,882,883,-517,315,884,317]],[[-516,313]]],"id":512},{"type":"Polygon","arcs":[[-640,-776,297,885,299,-778,-504]],"id":586},{"type":"Polygon","arcs":[[175,886,177,-673,152,887,154,-669]],"id":591},{"type":"Polygon","arcs":[[-627,172,-695,-671,-584,-580]],"id":604},{"type":"MultiPolygon","arcs":[[[51]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]]],"id":608},{"type":"MultiPolygon","arcs":[[[37]],[[38]],[[-769,42]],[[41]]],"id":598},{"type":"Polygon","arcs":[[-678,446,888,-833,-576,889,890,-676]],"id":616},{"type":"Polygon","arcs":[[60]],"id":630},{"type":"Polygon","arcs":[[262,891,264,-814,892,269,893,271,894,273,-628,895]],"id":408},{"type":"Polygon","arcs":[[-705,430]],"id":620},{"type":"Polygon","arcs":[[-582,-583,-520]],"id":600},{"type":"Polygon","arcs":[[-799,-789]],"id":275},{"type":"Polygon","arcs":[[308,896,310,897]],"id":634},{"type":"Polygon","arcs":[[898,-840,899,403,-564,900,-765]],"id":642},{"type":"MultiPolygon","arcs":[[[89]],[[-889,447,-831]],[[102]],[[104]],[[105]],[[228]],[[234]],[[236]],[[239]],[[901,243,902,245,903,247,904,249,905,251,906,253,907,255,908,257,909,259,910,261,-896,-646,-854,-644,-802,483,-544,-734,401,911,-574,-834,-706,451,-714,-877,912,913,914,915,464,916,466,917,468,918,470,919,920,473,921,475,922,477]],[[491]],[[494]],[[495]]],"id":643},{"type":"Polygon","arcs":[[923,-546,-660,924]],"id":646},{"type":"Polygon","arcs":[[-691,-865,380,-835]],"id":732},{"type":"Polygon","arcs":[[925,329,926,331,-798,-784,-818,305,927,307,-898,311,-518,-884,928]],"id":682},{"type":"Polygon","arcs":[[-599,929,-828,-696,334,-700,-713,930,931,932]],"id":729},{"type":"Polygon","arcs":[[-711,-806,933,-666,-601,934,-932,935]],"id":728},{"type":"Polygon","arcs":[[378,-864,-850,-740,-743,376,-742]],"id":686},{"type":"MultiPolygon","arcs":[[[25]],[[27]],[[28]],[[33]],[[34]]],"id":90},{"type":"Polygon","arcs":[[373,-738,-824]],"id":694},{"type":"Polygon","arcs":[[184,-751,-755,936]],"id":222},{"type":"Polygon","arcs":[[-708,-683,338,937,340,938]],"id":-99},{"type":"Polygon","arcs":[[-807,-709,-939,341]],"id":706},{"type":"Polygon","arcs":[[-568,-847,-816,-852,-569,-758,-766,-901]],"id":688},{"type":"Polygon","arcs":[[162,-720,939,-588,-752]],"id":740},{"type":"Polygon","arcs":[[-891,940,-763,-539,-677]],"id":703},{"type":"Polygon","arcs":[[-534,-767,-761,420,-794]],"id":705},{"type":"Polygon","arcs":[[-878,-717,456]],"id":752},{"type":"Polygon","arcs":[[941,-859]],"id":748},{"type":"Polygon","arcs":[[-797,-792,-822,393,942,-786]],"id":760},{"type":"Polygon","arcs":[[-871,-829,-930,-598,-657]],"id":148},{"type":"Polygon","arcs":[[-736,-559,-552,367]],"id":768},{"type":"Polygon","arcs":[[284,-868,286,-851,-819,-810]],"id":764},{"type":"Polygon","arcs":[[-808,-641,-502,943]],"id":762},{"type":"Polygon","arcs":[[-777,481,-801,944,-500]],"id":795},{"type":"Polygon","arcs":[[29,-768]],"id":626},{"type":"Polygon","arcs":[[53]],"id":780},{"type":"Polygon","arcs":[[-693,385,945,387,-826]],"id":788},{"type":"MultiPolygon","arcs":[[[399,-735,-529,-782,-787,-943,394,946,947,397,948]],[[949,-748,-565,405]]],"id":792},{"type":"Polygon","arcs":[[72]],"id":158},{"type":"Polygon","arcs":[[-804,343,-855,-867,950,-663,951,-661,-547,-924,952]],"id":834},{"type":"Polygon","arcs":[[-925,-659,-934,-805,-953]],"id":800},{"type":"Polygon","arcs":[[-912,402,-900,-839,-899,-764,-941,-890,-575]],"id":804},{"type":"Polygon","arcs":[[-590,165,-522]],"id":858},{"type":"MultiPolygon","arcs":[[[65]],[[66]],[[67]],[[68]],[[69]],[[118,953,120,954,122,955,124,956,126,957,128,958,130,959,132,960,134,961,136,962,138,963,140,964,142,-846,195,965,966,967,968,969,-611]],[[93]],[[95]],[[98]],[[-613,202,970,204,971,206,972,208,973,210,974,212,975,214]]],"id":840},{"type":"Polygon","arcs":[[-945,-800,-809,-944,-501]],"id":860},{"type":"Polygon","arcs":[[156,976,158,977,160,-753,-586,-670]],"id":862},{"type":"Polygon","arcs":[[282,-812,-821,-633]],"id":704},{"type":"MultiPolygon","arcs":[[[21]],[[22]]],"id":548},{"type":"Polygon","arcs":[[321,978,323,979,325,980,327,-929,-883,981]],"id":887},{"type":"Polygon","arcs":[[982,350,-870,-594,983,-860,-942,-858,348],[-830]],"id":710},{"type":"Polygon","arcs":[[-866,-862,984,-596,-869,-506,-664,-951]],"id":894},{"type":"Polygon","arcs":[[-984,-597,-985,-861]],"id":716}]}},"arcs":[[[31586,3163],[625,-23],[599,-58],[207,243],[147,208],[288,-243],[-82,-301],[-81,-266],[-582,81],[-621,-35],[-348,197],[0,23],[-152,174]],[[4524,4144],[169,220],[517,-93],[277,-185],[212,-209],[76,-266],[-533,-81],[-364,208],[-163,209],[-11,35],[-180,162]],[[34954,2940],[49,243],[593,162],[239,197],[174,254],[126,220],[168,209],[180,243],[141,0],[414,127],[419,-127],[342,-255],[120,-359],[33,-254],[11,-301],[-430,-186],[-452,-150],[-522,-139],[-582,-116],[-658,35],[-365,197]],[[15938,7061],[60,197],[332,-104],[359,-93],[332,104],[-158,-208],[-261,-151],[-386,47],[-278,208]],[[14643,7177],[202,127],[277,-139],[425,-231],[-164,23],[-359,58],[-381,162]],[[21575,8103],[174,104],[353,-81],[403,-46],[305,-81],[304,69],[163,-335],[-217,46],[-337,-23],[-343,23],[-376,-35],[-283,116],[-146,243]],[[29163,8241],[305,231],[190,70],[321,-23],[82,301],[16,219],[-6,475],[158,278],[256,93],[147,-220],[65,-220],[120,-267],[92,-254],[76,-267],[33,-266],[-49,-231],[-76,-220],[-326,-81],[-311,-116],[-364,11],[136,232],[-327,-81],[-310,-81],[-212,174],[-16,243]],[[794,704],[78,49],[94,61],[81,52],[41,26]],[[1088,892],[41,-1],[29,-10]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81],[375,-57],[414,-58],[386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-139],[-202,-150],[-136,-174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47],[430,23],[408,81],[343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[229,-162],[266,-35],[223,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[174,-162],[49,-266],[92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21]],[[31400,18145],[-92,-239],[-238,-183],[-301,67],[-202,177],[-291,86],[-350,330],[-283,317],[-383,662],[229,-124],[390,-395],[369,-212],[143,271],[90,405],[256,244],[198,-70]],[[30935,19481],[106,-274],[139,-443],[361,-355],[389,-147],[-125,-296],[-264,-29],[-141,208]],[[33000,19946],[333,354],[236,-148],[167,237],[222,-266],[-83,-207],[-375,-177],[-125,207],[-236,-266],[-139,266]],[[69088,21486],[41,244],[19,121],[179,-186],[263,-74],[9,-112],[-77,-269],[-427,-38],[-7,314]],[[90199,26260],[7,271],[181,-52],[269,-204],[151,81],[217,113],[166,-39],[20,-702],[-95,-203],[-29,-476],[-97,162],[-193,-412],[-57,32],[-171,19],[-171,505],[-38,390],[-160,515]],[[96252,23489],[149,438],[349,583],[179,111],[200,225],[238,310],[167,306],[123,441],[106,149],[41,330],[195,273],[61,-251],[63,-244],[198,239],[80,-249],[0,-249],[-103,-274],[-182,-435],[-142,-238],[103,-284],[-214,-7],[-238,-223],[-75,-387],[-157,-597],[-219,-264],[-138,-169],[-256,13],[-180,194],[-302,42],[-46,217]],[[97953,30179],[104,46],[151,-328],[216,-153],[78,-526],[202,-622],[5,403],[126,-161],[41,-447],[224,-192],[188,-48],[158,226],[141,-69],[-67,-524],[-85,-345],[-212,12],[-74,-179],[26,-254],[-41,-110],[-105,-319],[-138,-404],[-214,-236],[-48,155],[-116,85],[160,486],[-91,326],[-299,236],[8,214],[201,206],[47,455],[-13,382],[-113,396],[8,104],[-133,244],[-218,523],[-117,418]],[[95563,38701],[119,-9],[156,-201],[122,-200],[89,-166],[228,-366],[144,-272],[-105,-142],[-153,160],[-199,266],[-179,313],[-184,416],[-38,201]],[[99245,40108],[107,203],[126,-74],[69,98],[96,-171],[-46,-308],[-172,-81],[-153,73],[-27,260]],[[99609,40749],[139,121],[88,33],[163,184],[0,-289],[-177,-145],[-177,-124],[-36,220]],[[0,40798],[0,289],[57,27],[-34,-284],[-23,-32]],[[96438,41032],[10,158],[175,-339],[-92,-78],[-93,259]],[[96285,41938],[133,-182],[45,-476],[-75,74],[-58,-32],[-39,163],[-6,453]],[[62014,37548],[50,426],[128,102],[1,197],[133,447],[25,377],[-65,280],[-52,372],[-23,544],[97,331],[38,375],[138,22],[155,121],[103,107],[122,7],[158,337],[229,364],[83,297],[-38,253],[118,-71],[153,410],[6,356],[92,264],[96,-254],[74,-251],[69,-390],[45,-711],[72,-276],[-28,-284],[-49,-174],[-94,347],[-53,-175],[53,-438],[-24,-250],[-77,-137],[-18,-500],[-109,-689],[-137,-814],[-172,-1120],[-106,-821],[-125,-685],[-226,-140],[-243,-250],[-160,151],[-220,211],[-77,312],[-18,524],[-98,471],[-26,425]],[[81482,35149],[122,-255],[-93,548],[137,-171],[83,-229],[-5,303],[-138,465],[-26,186],[-65,177],[31,341],[56,146],[38,295],[-29,346],[114,425],[21,-450],[118,406],[225,198],[136,252],[212,217],[126,46],[77,-73],[219,220],[168,66],[42,129],[74,54],[153,-14],[292,173],[151,262],[71,316],[163,300],[13,236],[7,321],[194,502],[117,-510],[119,118],[-99,279],[87,287],[122,-128],[34,449],[152,291],[67,233],[140,101],[4,165],[122,-69],[5,148],[122,85],[134,80],[205,-271],[155,-350],[173,-4],[177,-56],[-59,325],[133,473],[126,155],[-44,147],[121,338],[168,208],[142,-70],[234,111],[-5,302],[-204,195],[148,86],[184,-147],[148,-242],[234,-151],[79,60],[172,-182],[162,169],[105,-51],[65,113],[127,-292],[-74,-316],[-105,-239],[-96,-20],[32,-236],[-81,-295],[-99,-291],[20,-166],[221,-327],[214,-189],[143,-204],[201,-350],[78,1],[145,-151],[43,-183],[265,-200],[183,202],[55,317],[56,262],[34,324],[85,470],[-39,286],[20,171],[-32,339],[37,445],[53,120],[-43,197],[67,313],[52,325],[7,168],[104,222],[78,-289],[19,-371],[70,-71],[11,-249],[101,-300],[21,-335],[-10,-214],[100,-464],[179,223],[92,-250],[133,-231],[-29,-262],[60,-506],[42,-295],[70,-72],[75,-505],[-27,-307],[90,-400],[301,-309],[197,-281],[186,-257],[-37,-143],[159,-371],[108,-639],[111,130],[113,-256],[68,91],[48,-626],[197,-363],[129,-226],[217,-478],[78,-475],[7,-337],[-19,-365],[132,-502],[-16,-523],[-48,-274],[-75,-527],[6,-339],[-55,-423],[-123,-538],[-205,-290],[-102,-458],[-93,-292],[-82,-510],[-107,-294],[-70,-442],[-36,-407],[14,-187],[-159,-205],[-311,-22],[-257,-242],[-127,-229],[-168,-254],[-230,262],[-170,104],[43,308],[-152,-112],[-243,-428],[-240,160],[-158,94],[-159,42],[-269,171],[-179,364],[-52,449],[-64,298],[-137,240],[-267,71],[91,287],[-67,438],[-136,-408],[-247,-109],[146,327],[42,341],[107,289],[-22,438],[-226,-504],[-174,-202],[-106,-470],[-217,243],[9,313],[-174,429],[-147,221],[52,137],[-356,358],[-195,17],[-267,287],[-498,-56],[-359,-211],[-317,-197],[-265,39],[-294,-303],[-241,-137],[-53,-309],[-103,-240],[-236,-15],[-174,-52],[-246,107],[-199,-64],[-191,-27],[-165,-315],[-81,26],[-140,-167],[-133,-187],[-203,23],[-186,0],[-295,377],[-149,113],[6,338],[138,81],[47,134],[-10,212],[34,411],[-31,350],[-147,598],[-45,337],[12,336],[-111,385],[-7,174],[-123,235],[-35,463],[-158,467],[-39,252]],[[94810,44550],[166,-142],[56,-22],[78,-203],[-194,4],[-106,363]],[[83046,44933],[259,116],[146,-180],[97,-180],[-17,-159],[-117,-11],[-368,414]],[[94344,44884],[17,235],[183,-93],[91,-124],[45,-155],[-108,-14],[-170,60],[-58,91]],[[94605,45664],[94,0],[100,-473],[111,-283],[-42,-109],[-206,512],[-57,353]],[[84713,45326],[32,139],[239,133],[194,20],[87,74],[105,-74],[-102,-160],[-289,-258],[-233,-170]],[[84746,45030],[-181,-441],[-238,-130],[-33,71],[25,201],[119,360],[275,235]],[[82427,45243],[95,340],[153,5],[74,209],[100,-158],[172,48],[69,-251],[-321,-119],[-193,-79],[-149,5]],[[83311,45374],[0,216],[220,123],[174,-177],[185,45],[249,216],[-41,-328],[-417,-168],[-370,73]],[[93947,46195],[41,60],[128,-142],[228,-272],[65,-187],[12,-119],[-218,251],[-152,212],[-104,197]],[[93469,46582],[14,99],[166,-250],[111,-193],[-56,-33],[-121,134],[-114,243]],[[79267,46532],[191,564],[337,-35],[224,-231],[115,-45],[38,-210],[533,-59],[61,244],[515,-284],[101,-383],[417,-108],[341,-351],[-317,-225],[-306,238],[-251,-16],[-288,44],[-260,106],[-322,225],[-204,59],[-116,-74],[-506,243],[-48,254],[-255,44]],[[87253,46951],[49,212],[58,200],[63,-173],[0,-282],[-143,-402],[-27,445]],[[92920,47543],[38,57],[30,-175],[84,-134],[135,-375],[131,-200],[-39,-166],[-78,-59],[-120,227],[-122,375],[-59,450]],[[91199,47184],[23,183],[249,-86],[152,46],[42,283],[40,15],[27,-314],[158,45],[78,202],[155,211],[-30,348],[166,11],[56,-97],[-5,-327],[-93,-361],[-146,-48],[-44,-166],[-152,-144],[-142,-138],[-148,1],[-228,171],[-158,165]],[[84996,48702],[281,29],[69,-195],[-104,-196],[-192,108],[-54,254]],[[85527,48575],[65,325],[344,24],[305,-172],[101,-452],[-234,244],[-232,49],[-157,-39],[-192,21]],[[91850,48960],[77,143],[150,-166],[94,-130],[117,-142],[111,-248],[106,-189],[33,-307],[-87,-157],[-52,348],[-65,229],[-126,193],[-158,252],[-200,174]],[[89166,49043],[482,-407],[513,-338],[192,-302],[154,-297],[43,-349],[462,-365],[68,-313],[-256,-64],[62,-393],[248,-388],[180,-627],[159,20],[-11,-262],[215,-100],[-84,-111],[295,-249],[-30,-171],[-184,-41],[-69,153],[-238,66],[-281,89],[-216,377],[-158,325],[-144,517],[-362,259],[-235,-169],[-170,-195],[35,-436],[-218,-203],[-155,99],[-288,25]],[[89175,45193],[-247,485],[-282,118],[-69,-168],[-352,-18],[118,481],[175,164],[-72,642],[-134,496],[-538,500],[-229,50],[-417,546],[-82,-287],[-107,-52],[-63,216],[-1,257],[-212,290],[299,213],[198,-11],[-23,156],[-407,1],[-110,352],[-248,109],[-117,293],[374,143],[142,192],[446,-242],[44,-220],[78,-955],[287,-354],[232,627],[319,356],[247,1],[238,-206],[206,-212],[298,-113]],[[82990,48924],[115,387],[40,469],[139,891],[58,243],[237,439],[217,-174],[350,-82],[319,25],[275,429],[48,-132],[-223,-587],[-209,-113],[-267,115],[-463,-29],[-243,-85],[-39,-447],[248,-526],[150,268],[518,201],[-22,-272],[-121,86],[-121,-347],[-245,-229],[263,-757],[-50,-203],[249,-682],[-2,-388],[-148,-173],[-109,207],[134,484],[-273,-229],[-69,164],[36,228],[-200,346],[21,576],[-186,-179],[24,-689],[11,-846],[-176,-85],[-119,173],[79,544],[-43,570],[-117,4],[-86,405]],[[85388,51177],[56,472],[92,215],[20,-322],[164,-52],[26,-241],[-15,-517],[-143,58],[-42,-359],[114,-312],[-78,-71],[-112,374],[-82,755]],[[76470,53817],[178,-24],[430,-114],[246,-577],[215,-401],[153,-246],[263,-635],[283,-9],[233,-405],[161,-495],[211,-270],[-111,-482],[159,-205],[100,-15],[47,-412],[97,-330],[204,-52],[135,-374],[-70,-735],[-11,-914],[-308,-12],[-234,494],[-356,482],[-119,358],[-210,481],[-138,443],[-212,827],[-244,493],[-81,508],[-103,461],[-250,372],[-145,506],[-209,330],[-290,652],[-24,300]],[[80461,51765],[204,-202],[214,110],[56,500],[119,112],[333,128],[199,467],[137,374]],[[81723,53254],[110,221],[236,323]],[[82069,53798],[214,411],[140,462],[112,2],[143,-299],[13,-257],[183,-165],[231,-177],[-20,-232],[-186,-29],[50,-289],[-205,-201]],[[82744,53024],[-158,-533],[204,-560],[-48,-272],[312,-546],[-329,-70],[-93,-403],[12,-535],[-267,-404],[-7,-589],[-107,-903],[-41,210],[-316,-266],[-110,361],[-198,34],[-139,189],[-330,-212],[-101,285],[-182,-32],[-229,68],[-43,793],[-138,164],[-134,505],[-38,517],[32,548],[165,392]],[[83866,54829],[109,498],[175,166],[151,223],[98,-268],[212,162],[45,264],[196,15],[-16,457],[225,-280],[23,-297],[20,-218],[28,-392],[16,-332],[-94,-540],[-102,602],[-130,-300],[89,-435],[-79,-277],[-327,343],[-78,428],[84,280],[-176,280],[-87,-245],[-131,23],[-205,-330],[-46,173]],[[72137,55425],[126,959],[192,-328],[129,-416],[134,-616],[-42,-615],[-116,-168],[-242,-135],[-132,470],[-49,849]],[[32791,56541],[81,163],[-6,233],[160,77],[58,-21],[-11,-440],[-232,-65],[-50,53]],[[83994,56319],[57,158],[70,165],[30,367],[153,35],[-44,-398],[205,570],[-26,-563],[-100,-195],[-87,-373],[-87,-175],[-171,409]],[[82548,55523],[136,414],[200,364],[167,409],[146,587],[49,-482],[-183,-325],[-146,-406],[-369,-561]],[[83856,57606],[166,-183],[177,1],[-5,-247],[-129,-251],[-176,-178],[-10,275],[20,301],[-43,282]],[[84518,57999],[266,-13],[77,-220],[78,-660],[-214,157],[5,-199],[68,-364],[-132,-133],[-11,416],[-84,31],[-43,357],[163,-47],[-4,224],[-169,451]],[[83422,58536],[238,-22],[97,-213],[-74,-510],[-119,295],[-142,450]],[[83300,60248],[112,-195],[29,925],[90,535],[169,-1],[171,-168],[85,153],[26,-150],[-46,-245],[95,-423],[-73,-491],[-164,-196],[-43,-476],[62,-471],[147,-65],[123,70],[347,-328],[-27,-321],[91,-142],[-29,-272],[-216,290],[-103,310],[-71,-217],[-177,354],[-253,-87],[-138,130],[14,244],[87,151],[-83,136],[-36,-213],[-137,340],[-41,257],[-11,566]],[[31321,61436],[40,86],[227,-3],[142,-52],[50,-118],[-71,-149],[-209,4],[-163,-21],[-16,253]],[[28239,61348],[34,135],[116,41],[64,-20],[187,-53],[147,-142],[46,-161],[-195,-11],[-84,-99],[-156,95],[-159,215]],[[30080,62227],[34,101],[217,-3],[165,-152],[73,15],[50,-209],[152,11],[-9,-176],[124,-21],[136,-217],[-103,-240],[-132,128],[-127,-25],[-92,28],[-50,-107],[-106,-37],[-43,144],[-92,-85],[-111,-405],[-71,94],[-14,170]],[[30081,61241],[-185,100],[-131,-41],[-169,43],[-130,-110],[-149,184],[24,190],[256,-82],[210,-47],[100,131],[-127,256],[2,226],[-175,92],[62,163],[170,-26],[241,-93]],[[80173,62023],[137,267],[304,166],[159,-14],[62,-226],[-122,-260],[-64,-341],[-240,-284],[-228,183],[-8,509]],[[6646,62221],[14,65],[48,97],[-19,116],[16,55],[21,-11],[107,-100],[49,-51],[45,-79],[71,-207],[-7,-33],[-108,-126],[-89,-92],[-41,-99],[-69,84],[8,165],[-46,216]],[[6469,62944],[27,50],[99,-56],[73,-90],[-23,-71],[-94,-43],[-47,125],[-32,48],[-3,37]],[[6298,63045],[21,72],[137,-26],[-9,-63],[-149,17]],[[6030,63329],[74,82],[23,-38],[80,-196],[-15,-34],[-19,8],[-97,21],[-35,133],[-11,24]],[[5611,63616],[14,43],[43,58],[64,-12],[5,-138],[-33,-58],[-93,107]],[[26396,63516],[146,183],[60,213],[126,131],[142,116],[210,56],[67,65],[240,-42],[219,-7],[261,-201],[110,-216],[260,66],[98,-138],[235,-366],[173,-267],[92,8],[165,-120],[-20,-167],[205,-24],[210,-242],[-33,-138],[-185,-75],[-187,-29],[-191,46],[-398,-57],[186,329],[-113,154],[-179,39],[-96,171],[-66,336],[-157,-23],[-259,159],[-83,124],[-362,91],[-97,115],[104,148],[-273,30],[-199,-307],[-115,-8],[-40,-144],[-138,-65],[-118,56]],[[28220,65099],[60,375],[84,-23],[97,-491],[1,-343],[-68,-29],[-70,340],[-104,171]],[[83362,64497],[163,581],[223,447],[127,-176],[-49,-357],[-167,-947],[-119,-485],[-146,499],[-32,438]],[[28061,66408],[130,47],[184,-18],[8,-153],[-303,-95],[-19,219]],[[28391,66555],[220,-265],[-48,-420],[-51,75],[4,309],[-124,234],[-1,67]],[[86767,70070],[2,281],[154,352],[158,-68],[114,248],[204,-127],[35,-203],[-156,-357],[-114,189],[-143,-137],[-73,-346],[-181,168]],[[59437,71293],[8,-48],[-285,-240],[-136,77],[-64,237],[132,22]],[[59092,71341],[19,3],[40,143],[200,-8],[253,176],[-188,-251],[21,-111]],[[56531,71424],[52,251],[152,-199],[216,34],[207,-42],[-7,-103],[151,71],[-35,-175],[-400,-50],[3,98],[-339,115]],[[53453,72802],[38,304],[325,-54],[284,64],[211,51],[-100,-465],[41,-183],[-58,-303],[-213,222],[-141,64],[-387,300]],[[52266,74774],[153,-30],[139,183],[166,-419],[-39,-782],[-126,38],[-113,-197],[-105,156],[-11,713],[-64,338]],[[85946,70252],[263,182],[145,371],[280,306],[203,403],[553,177],[297,-121],[291,1050],[185,-282],[408,591],[158,229],[174,723],[-47,664],[117,374],[295,108],[152,-819],[-9,-479],[-256,-595],[4,-610],[-104,-472],[48,-296],[-145,-416],[-355,-278],[-488,-36],[-396,-675],[-186,227],[-12,442],[-483,-130],[-329,-279],[-325,-11],[282,-435],[-186,-1004],[-179,-248],[-135,229],[69,533],[-176,172],[-113,405]],[[52373,75546],[56,219],[179,226],[47,-507],[-92,-456],[-126,120],[-64,398]],[[88837,75727],[138,455],[296,33],[81,817],[83,460],[326,-615],[213,-198],[195,-126],[197,250],[62,-663],[-412,-162],[-244,-587],[-436,404],[-152,-646],[-308,-9],[-39,587]],[[32113,78187],[105,183],[97,-288],[202,-79],[257,16],[-137,-242],[-102,-38],[-353,250],[-69,198]],[[32078,80046],[96,49],[365,-148],[284,-247],[8,-108],[-135,-11],[-360,186],[-258,279]],[[14321,80439],[24,137],[291,-129],[171,-89],[261,-63],[94,-204],[138,-280],[277,-244],[115,-327],[-140,-82],[-456,269],[-84,209],[-248,207],[-50,168],[-286,107],[-107,321]],[[33494,78880],[173,208],[-121,160],[234,356],[287,941],[172,336],[241,204],[129,-26],[-54,-160],[-148,-372],[-184,-517],[181,199],[187,-126],[-98,-206],[247,-162],[128,144],[277,-182],[-86,-433],[194,101],[36,-313],[86,-367],[-117,-520],[-125,-22],[-183,111],[60,484],[-77,75],[-322,-513],[-166,21],[196,277],[-267,144],[-298,-35],[-539,18],[-43,175]],[[12989,82396],[16,188],[131,-76],[267,47],[-84,-671],[242,-475],[-111,1],[-167,270],[-103,272],[-140,184],[-51,260]],[[89331,81264],[24,808],[257,271],[-110,274],[123,83],[73,-391],[96,-569],[-7,-581],[114,-597],[280,-1046],[-411,195],[-171,-854],[271,-605],[-8,-413],[-211,356],[-182,-457],[-51,496],[31,575],[-32,638],[64,446],[13,790],[-163,581]],[[47896,83153],[233,24],[298,-365],[-149,-406]],[[48278,82406],[46,-422],[-210,-528],[-493,-349],[-393,89],[225,617],[-145,601],[378,463],[210,276]],[[53028,83536],[408,195],[88,-296],[-166,-478],[-291,333],[-39,246]],[[7036,84529],[252,210],[148,90],[185,-40],[117,-183],[-240,-281],[-277,-225],[-142,152],[-43,277]],[[48291,84129],[101,611],[216,480],[222,-47],[335,49],[-297,-639],[283,81],[304,-3],[-72,-481],[-250,-530],[287,-38],[270,-759],[190,-95],[171,-673],[79,-233],[337,-113],[-34,-378],[-142,-173],[111,-305],[-250,-310],[-371,6],[-473,-163],[-130,116],[-183,-276],[-257,67],[-195,-226],[-148,118],[407,621],[249,127],[-436,99],[-79,235],[291,183],[-152,319],[52,387],[414,-54],[40,343],[-190,372],[-337,104],[-66,160],[101,264],[-92,163],[-149,-279],[-17,569],[-140,301]],[[3485,86155],[274,101],[220,-54],[27,-226],[-171,-92],[-182,110],[-168,161]],[[27677,87220],[13,41],[107,177],[114,-13],[70,-121],[-108,-310],[-123,50],[-73,176]],[[26668,87478],[207,273],[381,-6],[-6,-114],[-325,-326],[-196,13],[-61,160]],[[2280,88041],[17,223],[171,-113],[173,61],[225,-156],[276,-79],[-23,-64],[-211,-125],[-211,128],[-106,107],[-245,-34],[-66,52]],[[25771,88121],[242,292],[35,465],[95,542],[201,-49],[51,-259],[143,91],[161,-155],[304,-203],[318,-184],[25,-281],[204,46],[199,-196],[-247,-186],[-432,142],[-156,266],[-275,-314],[-396,-306],[-95,346],[-377,-57]],[[43242,89344],[188,385],[421,87],[433,-400],[422,321],[349,-167],[453,315],[461,-42],[-64,-382],[314,-403],[-361,-451],[-801,-405],[-240,-107],[-365,87],[-775,187],[273,261],[-605,289],[492,114],[-12,174],[-583,137]],[[28545,90512],[118,331],[255,82],[217,-163],[3,-253],[-32,-82],[-180,-174],[-312,-30],[-69,289]],[[0,88971],[0,2354],[681,-451],[728,-588],[-24,-367],[187,-147],[-64,429],[754,-88],[544,-553],[-276,-257],[-455,-61],[-7,-578],[-111,-122],[-260,17],[-212,206],[-369,172],[-62,257],[-283,96],[-315,-76],[-151,207],[60,219],[-333,-140],[126,-278],[-158,-251]],[[22278,91583],[245,183],[194,256],[295,-168],[166,-106],[84,-112],[169,-226],[-173,-207],[-374,179],[-226,-65],[-380,266]],[[99645,92586],[354,247],[0,-404],[-305,-30],[-49,187]],[[0,92429],[0,404],[36,24],[235,-1],[402,-169],[-24,-81],[-286,-141],[-363,-36]],[[26228,91219],[16,648],[394,-45]],[[26638,91822],[411,-87],[373,-293],[17,-293],[-207,-315],[196,-316],[-36,-288],[-544,-413],[-386,-91],[-287,178],[-83,-297],[-268,-498]],[[25824,89109],[-81,-258],[-322,-400]],[[25421,88451],[-397,-39],[-220,-250],[-18,-384],[-323,-74],[-340,-479],[-301,-665],[-108,-466]],[[23714,86094],[-15,-686],[408,-99]],[[24107,85309],[125,-553],[130,-448],[388,117],[517,-256],[277,-225],[199,-279]],[[25743,83665],[348,-162],[294,-249]],[[26385,83254],[459,-34],[302,-58],[-45,-511],[86,-594],[201,-661],[414,-561],[214,192],[150,607],[-145,934],[-196,311],[445,276],[314,415],[154,411]],[[28738,83981],[-22,395],[-189,502]],[[28527,84878],[-338,445],[328,619],[-121,535],[-93,922],[194,137],[476,-161],[286,-57],[230,155],[258,-200],[342,-343],[85,-229],[495,-45],[-8,-496],[92,-747],[254,-92],[201,-348],[402,328],[266,652],[184,274],[216,-527],[362,-754],[307,-709],[-112,-371],[370,-333],[250,-338],[442,-152],[179,-189],[110,-500],[216,-78],[112,-223],[20,-664],[-202,-222],[-199,-207],[-458,-210],[-349,-486],[-470,-96],[-594,125],[-417,4],[-287,-41],[-233,-424],[-354,-262],[-401,-782],[-320,-545],[236,97],[446,776],[583,493]],[[31513,79609],[416,59],[245,-290]],[[32174,79378],[-262,-397],[88,-637],[91,-446],[361,-295],[459,86],[278,664],[19,-429],[180,-214],[-344,-387],[-615,-351],[-276,-239],[-310,-426],[-211,44],[-11,500],[483,488],[-445,-19],[-309,-72]],[[31350,77248],[48,-194],[-296,-286],[-286,-204],[-293,-175]],[[30523,76389],[-159,-386],[-35,-98]],[[30329,75905],[-3,-313],[92,-313],[115,-15],[-29,216],[83,-131],[-22,-169],[-188,-96]],[[30377,75084],[-133,12],[-205,-104]],[[30039,74992],[-121,-29],[-162,-29],[-231,-171],[408,111],[82,-112],[-389,-177],[-177,-1],[8,72],[-84,-164],[82,-27],[-60,-424],[-203,-455],[-20,152]],[[29172,73738],[-61,31],[-91,147]],[[29020,73916],[57,-318]],[[29077,73598],[66,-106],[8,-222]],[[29151,73270],[-89,-230],[-157,-472],[-25,24],[86,402]],[[28966,72994],[-142,226],[-33,490]],[[28791,73710],[-53,-255],[59,-375]],[[28797,73080],[-175,88],[183,-186]],[[28805,72982],[12,-562],[79,-41],[29,-204],[39,-591],[-176,-439],[-288,-175],[-182,-346],[-139,-38],[-141,-217],[-39,-199],[-305,-383],[-157,-281],[-131,-351],[-43,-419],[50,-411],[92,-505],[124,-418],[1,-256],[132,-685],[-9,-398],[-12,-230],[-69,-361]],[[27672,65472],[-83,-74],[-137,71]],[[27452,65469],[-44,259]],[[27408,65728],[-106,136],[-147,508]],[[27155,66372],[-129,452],[-42,231],[57,393],[-77,325],[-217,494]],[[26747,68267],[-108,91],[-281,-269]],[[26358,68089],[-49,30]],[[26309,68119],[-135,276],[-174,146]],[[26000,68541],[-314,-75],[-247,66],[-212,-41]],[[25227,68491],[-118,-83],[54,-166]],[[25163,68242],[-5,-240],[59,-117],[-53,-77],[-103,87],[-104,-112],[-202,18]],[[24755,67801],[-207,313],[-242,-74]],[[24306,68040],[-202,137],[-173,-42],[-234,-138],[-253,-438],[-276,-255],[-152,-282],[-63,-266],[-3,-407],[14,-284],[52,-201]],[[23016,65864],[1,-1],[-1,-1],[-107,-516]],[[22909,65346],[-49,-426],[-20,-791],[-27,-289],[48,-322],[86,-288],[56,-458],[184,-440],[65,-337],[109,-291],[295,-157],[114,-247],[244,165],[212,60],[208,106],[175,101],[176,241],[67,345],[22,496],[48,173],[188,155],[294,137],[246,-21],[169,50],[66,-125],[-9,-285],[-149,-351],[-66,-360],[51,-103],[-42,-255],[-69,-461],[-71,152],[-58,-10]],[[25472,61510],[1,-87],[53,-3],[-5,-160],[-45,-256],[24,-91],[-29,-212],[18,-56],[-32,-299],[-55,-156],[-50,-19],[-55,-205]],[[25297,59966],[90,-107],[24,88],[82,-75]],[[25493,59872],[29,-23],[61,104],[79,8],[26,-48],[43,29],[129,-53]],[[25860,59889],[128,16],[90,65]],[[26078,59970],[32,66],[89,-31],[66,-40],[73,14],[55,51],[127,-82],[44,-13],[85,-110],[80,-132],[101,-91],[73,-162]],[[26903,59440],[-24,-57],[-14,-132],[29,-216],[-64,-202],[-30,-237],[-9,-261],[15,-152],[7,-266],[-43,-58],[-26,-253],[19,-156],[-56,-151],[12,-159],[43,-97]],[[26762,57043],[70,-321],[108,-238],[130,-252]],[[27070,56232],[100,-212]],[[27170,56020],[-6,-125],[111,-27]],[[27275,55868],[26,48],[77,-145],[136,42],[119,150],[168,119],[95,176],[153,-34],[-10,-58],[155,-21],[124,-102],[90,-177],[105,-164]],[[28513,55702],[143,-18],[209,412],[114,63],[3,195],[51,500],[159,274],[175,11],[22,123],[218,-49],[218,298],[109,132],[134,285],[98,-36],[73,-156],[-54,-199]],[[30185,57537],[-8,-139],[-163,-69],[91,-268],[-3,-309]],[[30102,56752],[-123,-343],[105,-469]],[[30084,55940],[120,38],[62,427],[-86,208],[-14,447],[346,241],[-38,278],[97,186],[100,-415],[195,-9],[180,-330],[11,-195],[249,-6],[297,61],[159,-264]],[[31762,56607],[213,-73],[155,184]],[[32130,56718],[4,149],[344,35],[333,9],[-236,-175],[95,-279],[222,-44],[210,-291],[45,-473],[144,13],[109,-139]],[[33400,55523],[183,-217],[171,-385],[8,-304],[105,-14],[149,-289],[109,-205]],[[34125,54109],[333,-119],[30,107],[225,43],[298,-159]],[[35011,53981],[95,-65],[204,-140],[294,-499],[46,-242]],[[35650,53035],[95,28],[69,-327],[155,-1033],[149,-97],[7,-408],[-208,-487],[86,-178],[491,-92],[10,-593],[211,388],[349,-212],[462,-361],[135,-346],[-45,-327],[323,182],[540,-313],[415,23],[411,-489],[355,-662],[214,-170],[237,-24],[101,-186],[94,-752],[46,-358],[-110,-977],[-142,-385],[-391,-822],[-177,-668],[-206,-513],[-69,-11],[-78,-435],[20,-1107],[-77,-910],[-30,-390],[-88,-233],[-49,-790],[-282,-771],[-47,-610],[-225,-256],[-65,-355],[-302,2],[-437,-227],[-195,-263],[-311,-173],[-327,-470],[-235,-586],[-41,-441],[46,-326],[-51,-597],[-63,-289],[-195,-325],[-308,-1040],[-244,-468],[-189,-277],[-127,-562],[-183,-337]],[[35174,30629],[-121,-372],[-313,-328],[-205,118],[-151,-63],[-256,253],[-189,-19],[-169,327]],[[33770,30545],[-19,-308],[353,-506],[-38,-408],[173,-257],[-14,-289],[-267,-757],[-412,-317],[-557,-123],[-305,59],[59,-352],[-57,-442],[51,-298],[-167,-208],[-284,-82],[-267,216],[-108,-155],[39,-587],[188,-178],[152,186],[82,-307],[-255,-183],[-223,-367],[-41,-595],[-66,-316],[-262,-2],[-218,-302],[-80,-443]],[[31227,23224],[274,-433],[265,-119]],[[31766,22672],[-96,-531],[-328,-333],[-180,-692],[-254,-234],[-113,-276],[89,-614],[185,-342],[-117,30]],[[30952,19680],[-247,4],[-134,-145],[-250,-213],[-45,-552],[-118,-14],[-313,192],[-318,412],[-346,338],[-87,374],[79,346],[-140,393],[-36,1007],[119,568],[293,457],[-422,172],[265,522],[94,982],[309,-208],[145,1224],[-186,157],[-87,-738],[-175,83],[87,845],[95,1095],[127,404]],[[29661,27385],[-79,576],[-23,666]],[[29559,28627],[117,19],[170,954],[192,945],[118,881],[-64,885],[83,487],[-34,730],[163,721],[50,1143],[89,1227],[87,1321],[-20,967],[-58,832]],[[30452,39739],[-279,340],[-24,242],[-551,593],[-498,646],[-214,365],[-115,488],[46,170],[-236,775],[-274,1090],[-262,1177],[-114,269],[-87,435],[-216,386],[-198,239],[90,264],[-134,563],[86,414],[221,373]],[[27693,48568],[148,442],[-60,258],[-106,-275],[-166,259],[56,167],[-47,536],[97,89],[52,368],[105,381],[-20,241],[153,126],[190,236]],[[28095,51396],[-37,183],[103,44],[-12,296],[65,214],[138,40],[117,371],[106,310],[-102,141],[52,343],[-62,540],[59,155],[-44,500],[-112,315]],[[28366,54848],[-93,170],[-59,319],[68,158],[-70,40]],[[28212,55535],[-52,195],[-138,165]],[[28022,55895],[-122,-38],[-56,-205],[-112,-149],[-61,-20],[-27,-123],[132,-321],[-75,-76],[-40,-87],[-130,-30],[-48,353],[-36,-101],[-92,35],[-56,238],[-114,39],[-72,69],[-119,-1],[-8,-128],[-32,89]],[[26954,55439],[-151,131],[-56,124],[32,103],[-11,130],[-77,142],[-109,116],[-95,76],[-19,173],[-73,105],[18,-172],[-55,-141],[-64,164],[-89,58],[-38,120],[2,179],[36,187],[-78,83],[64,114]],[[26191,57131],[-96,186],[-130,238],[-61,200],[-117,185],[-140,267]],[[25647,58207],[31,92],[46,-89]],[[25724,58210],[21,41]],[[25745,58251],[-48,185]],[[25697,58436],[-84,52],[-31,-140]],[[25582,58348],[-161,9],[-100,57],[-115,117],[-154,37],[-79,127]],[[24973,58695],[-142,103],[-174,11],[-127,117],[-149,244]],[[24381,59170],[-314,636]],[[24067,59806],[-144,192],[-226,154]],[[23697,60152],[-156,-43],[-223,-223],[-140,-58],[-196,156],[-208,112],[-260,271],[-208,83],[-314,275],[-233,282],[-70,158],[-155,35],[-284,187],[-116,270],[-299,335],[-139,373],[-66,288],[93,57],[-29,169],[64,153],[1,204],[-93,266],[-25,235],[-94,298],[-244,587],[-280,462],[-135,368],[-238,241],[-51,145],[42,365]],[[19641,66203],[-142,137],[-164,288]],[[19335,66628],[-69,412],[-149,48],[-162,311],[-130,288],[-12,184],[-149,446],[-99,452],[5,227]],[[18570,68996],[-201,235],[-93,-26]],[[18276,69205],[-159,163],[-44,-240],[46,-284],[27,-444],[95,-243],[206,-407],[46,-139],[42,-42],[37,-203],[49,8],[56,-381],[85,-150],[59,-210],[174,-300],[92,-550],[83,-259],[77,-277],[15,-311],[134,-20],[112,-268],[100,-264],[-6,-106],[-117,-217],[-49,3],[-74,359]],[[19362,64423],[-182,337],[-200,286]],[[18980,65046],[-142,150],[9,432],[-42,320],[-132,183],[-191,264],[-37,-76],[-70,154],[-171,143],[-164,343],[20,44],[115,-33],[103,221],[10,266],[-214,422],[-163,163],[-102,369],[-103,388],[-129,472],[-113,531]],[[17464,69802],[-46,302],[-180,340],[-130,71],[-30,169],[-156,30],[-100,159],[-258,59]],[[16564,70932],[-70,95],[-34,324]],[[16460,71351],[-270,594],[-231,821],[10,137],[-123,195],[-215,495],[-38,482],[-148,323],[61,489],[-10,507],[-89,453],[109,557],[67,1072],[-50,792],[-88,506],[-80,274],[33,115],[402,-200],[148,-558]],[[15948,78405],[68,156],[-44,485],[-94,484]],[[15878,79530],[-38,1],[-537,581],[-199,255]],[[15104,80367],[-503,245],[-155,523],[40,362]],[[14486,81497],[-356,252],[-48,476],[-336,429],[-6,304]],[[13740,82958],[-153,223],[-245,188],[-78,515],[-358,478],[-150,558],[-267,38],[-441,15],[-326,170],[-574,613],[-266,112],[-486,211]],[[10396,86079],[-385,-50],[-546,271]],[[9465,86300],[-330,252],[-309,-125],[58,-411],[-154,-38],[-321,-123],[-245,-199]],[[8164,85656],[-307,-126],[-40,348]],[[7817,85878],[125,580],[295,182],[-76,148],[-354,-329],[-190,-394],[-400,-420],[203,-287],[-262,-424]],[[7158,84934],[-299,-247],[-278,-181]],[[6581,84506],[-69,-261],[-434,-305],[-87,-278],[-325,-252],[-191,45],[-259,-165],[-282,-201],[-231,-197],[-477,-169],[-43,99],[304,276],[271,182],[296,324],[345,66],[137,243],[385,353],[62,119],[205,208],[48,448],[141,349],[-320,-179],[-90,102],[-150,-215],[-181,300],[-75,-212],[-104,294],[-278,-236],[-170,0],[-24,352]],[[4985,85596],[50,217],[-179,210]],[[4856,86023],[-361,-113],[-235,277],[-190,142],[-1,334],[-214,252],[108,340],[226,330],[99,303],[225,43],[191,-94],[224,285],[201,-51],[212,183],[-52,270],[-155,106],[205,228],[-170,-7],[-295,-128],[-85,-131],[-219,131],[-392,-67],[-407,142],[-117,238],[-351,343],[390,247],[620,289],[228,0]],[[4541,89915],[-38,-295],[586,22]],[[5089,89642],[-225,366]],[[4864,90008],[-342,226],[-197,295]],[[4325,90529],[-267,252],[-381,187],[155,309],[493,19],[350,270],[66,287],[284,281],[271,68],[526,262],[256,-40],[427,315],[421,-124],[201,-266],[123,114],[469,-35],[-16,-136],[425,-101],[283,59],[585,-186],[534,-56],[214,-77],[370,96],[421,-177],[302,-83]],[[10837,91767],[518,-142]],[[11355,91625],[438,-284],[289,-55]],[[12082,91286],[244,247],[336,184],[413,-72],[416,259],[455,148],[191,-245],[207,138],[62,278],[192,-63],[470,-530],[369,401]],[[15437,92031],[38,-448],[341,96]],[[15816,91679],[105,173],[337,-34],[424,-248],[650,-217],[383,-100],[272,38]],[[17987,91291],[375,-300],[-391,-293]],[[17971,90698],[502,-127],[750,70],[236,103],[296,-354],[302,299],[-283,251],[179,202],[338,27],[223,59],[224,-141],[279,-321],[310,47],[491,-266],[431,94],[405,-14],[-32,367],[247,103],[431,-200],[-2,-559],[177,471],[223,-16],[126,594],[-298,364],[-324,239],[22,653],[329,429],[366,-95],[281,-261],[378,-666],[-247,-290],[517,-120],[-1,-604],[371,463],[332,-380],[-83,-438],[269,-399],[290,427],[202,510]],[[19722,91216],[-824,-103],[-374,-41]],[[18524,91072],[-151,279],[-379,161],[-246,-66],[-343,468],[185,62],[429,101],[392,-26],[362,103],[-537,138],[-594,-47],[-394,12],[-146,217],[644,237],[-428,-9],[-485,156],[233,443],[193,235],[744,359],[284,-114],[-139,-277],[618,179],[386,-298],[314,302],[254,-194],[227,-580],[140,244],[-197,606],[244,86],[276,-94],[311,-239],[175,-575],[86,-417],[466,-293],[502,-279],[-31,-260],[-456,-48],[178,-227],[-94,-217],[-503,93],[-478,160],[-322,-36],[-522,-201]],[[20294,93981],[95,83],[372,24],[211,-130],[-244,-390],[-434,413]],[[27534,93906],[12,213],[133,39],[636,-63],[479,-325],[25,-163],[-296,17],[-299,13],[-304,-80],[-80,36],[-306,313]],[[24943,93258],[213,528],[286,241],[717,158],[-204,-382],[219,-369],[256,477],[704,242],[477,-611],[-42,-387],[550,172],[263,235],[616,-299],[383,-282],[36,-258],[515,134],[290,-376],[670,-234],[242,-238],[263,-553],[-510,-275],[654,-386],[441,-130],[400,-543],[437,-39],[-87,-414],[-487,-687],[-342,253],[-437,568],[-359,-74],[-35,-338],[292,-344],[377,-272],[114,-157],[181,-584],[-96,-425],[-350,160],[-697,473],[393,-509],[289,-357],[45,-206],[-753,236],[-596,343],[-337,287],[97,167],[-414,304],[-405,286],[5,-171],[-803,-94],[-235,203],[183,435],[522,10],[571,76],[-92,211],[96,294],[360,576],[-77,261],[-107,203],[-425,286],[-563,201],[178,150],[-294,367],[-245,34],[-219,201],[-149,-175],[-503,-76],[-1011,132],[-588,174],[-450,89],[-231,207],[290,270],[-394,2],[-88,599]],[[21528,93420],[5,189],[567,-73],[-306,386],[329,286],[331,-124],[496,75],[72,-172],[-259,-283],[420,-254],[-50,-532],[-455,-229],[-268,50],[-192,225],[-690,456]],[[88850,93928],[263,234],[348,54],[394,-226],[34,-155],[-421,-4],[-569,66],[-49,31]],[[23324,93674],[4,294],[145,251],[276,161],[579,-20],[530,-144],[-415,-526],[-331,-115],[-298,-442],[-317,22],[-173,519]],[[15808,92470],[-147,259],[-641,312]],[[15020,93041],[93,193],[218,489]],[[15331,93723],[241,388],[-272,362],[939,93],[397,-123],[709,-33],[270,-171],[298,-249],[-349,-149],[-681,-415],[-344,-414]],[[16539,93012],[0,-248],[-731,-294]],[[90588,94993],[66,192],[518,-89],[697,-155],[-321,-234],[-444,53],[-516,233]],[[23105,94849],[148,266],[399,159],[243,-208],[101,-187],[-151,-229],[-403,44],[-337,155]],[[88048,95046],[149,406],[366,111],[734,-26],[1004,-313],[-219,-439],[-1023,16],[-461,-139],[-550,384]],[[21509,95681],[299,-18],[419,201],[390,-34],[22,77],[212,-273],[9,-303],[-127,-440],[-458,-60],[-298,94],[5,345],[-455,-46],[-18,457]],[[17302,95023],[379,577],[262,165],[782,-199],[493,-350],[485,-45],[-397,565],[255,215],[286,-68],[94,-282],[109,-210],[247,99],[291,-26],[49,-289],[-169,-281],[-940,-91],[-701,-256],[-423,-14],[-35,193],[577,261],[-1255,-70],[-389,106]],[[64293,93128],[284,126],[-10,323],[551,503],[-255,73],[665,518],[-75,268],[621,312],[917,380],[925,110],[475,220],[541,76],[193,-233],[-187,-184],[-984,-293],[-848,-282],[-863,-562],[-414,-577],[-435,-568],[56,-491],[531,-484],[-164,-52],[-907,77],[-74,262],[-503,158],[-40,320]],[[23022,95926],[104,242],[573,-37],[308,-190],[547,1],[240,-194],[-64,-222],[319,-134],[177,-140],[374,-26],[406,-50],[441,128],[566,51],[451,-42],[298,-223],[62,-244],[-174,-157],[-414,-127],[-355,72],[-797,-91],[-570,-11],[-449,73],[-738,190],[-96,325],[-34,293],[-279,258],[-574,72],[-322,183]],[[15873,95551],[472,442],[570,383],[426,-9],[381,87],[-38,-454],[-214,-205],[-259,-29],[-517,-252],[-444,-91],[-377,128]],[[81143,94175],[250,112],[142,-379]],[[81535,93908],[122,153],[444,93],[892,-97],[67,-276],[1162,-88],[15,451]],[[84237,94144],[590,-103],[443,3]],[[85270,94044],[449,-312],[128,-378],[-165,-247],[349,-465],[437,-240],[268,620],[446,-266],[473,159],[538,-182],[204,166],[455,-83],[-201,549],[367,256],[2509,-384],[236,-351],[727,-451],[1122,112],[553,-98],[231,-244],[-33,-432],[342,-168],[372,121],[492,15],[525,-116],[526,66],[484,-526],[344,189],[-224,378]],[[97224,91732],[123,263],[886,-166]],[[98233,91829],[578,36],[799,-282],[389,-258],[0,-2354],[-2,-3],[-357,-260],[-360,44],[250,-315],[166,-487],[128,-159],[32,-244],[-71,-157],[-518,129],[-777,-445],[-247,-69],[-425,-415],[-403,-362],[-102,-269],[-397,409],[-724,-464]],[[96192,85904],[-126,220],[-268,-254]],[[95798,85870],[-371,81],[-90,-388],[-333,-572],[10,-239],[316,-132],[-37,-860],[-258,-22],[-119,-494],[116,-255]],[[95032,82989],[-486,-301],[-96,-675]],[[94450,82013],[-415,-144],[-83,-600],[-400,-551],[-103,407],[-119,862],[-155,1313],[134,819],[234,353]],[[93543,84472],[15,276],[431,132]],[[93989,84880],[496,744],[479,608],[499,471],[223,833],[-337,-50],[-167,-487]],[[95182,86999],[-705,-648],[-227,726]],[[94250,87077],[-717,-201],[-696,-990],[230,-362],[-620,-154],[-430,-61],[20,427],[-431,90],[-344,-291],[-850,102]],[[90412,85637],[-913,-175],[-900,-1153]],[[88599,84309],[-1065,-1394],[438,-74],[136,-370],[270,-132]],[[88378,82339],[178,296],[305,-39]],[[88861,82596],[401,-650]],[[89262,81946],[9,-502],[-217,-591]],[[89054,80853],[-23,-705],[-126,-945],[-418,-855],[-94,-409],[-377,-688],[-374,-682],[-179,-349],[-370,-346],[-175,-8],[-175,287],[-373,-432],[-43,-197]],[[86327,75524],[-106,36]],[[86221,75560],[-120,-201],[-83,-201]],[[86018,75158],[10,-424],[-143,-130],[-50,-105],[-104,-174],[-185,-97],[-121,-159],[-9,-256],[-32,-65],[111,-96],[157,-259]],[[85652,73393],[240,-697],[68,-383],[3,-681],[-105,-325],[-252,-113],[-222,-245],[-250,-51],[-31,322]],[[85103,71220],[52,443],[-123,615]],[[85032,72278],[206,99],[-190,506]],[[85048,72883],[-135,113],[-34,-112]],[[84879,72884],[-81,-49],[-10,112],[-72,54],[-75,94]],[[84641,73095],[77,260],[65,69]],[[84783,73424],[-25,108],[71,319]],[[84829,73851],[-18,97],[-163,64]],[[84648,74012],[-131,158]],[[84517,74170],[-388,-171],[-204,-277],[-300,-161],[148,274],[-58,230],[220,397],[-147,310],[-242,-209],[-314,-411],[-171,-381],[-272,-29],[-142,-275],[147,-400],[227,-97],[9,-265]],[[83030,72705],[220,-172],[311,421]],[[83561,72954],[247,-230],[179,-15]],[[83987,72709],[46,-310],[-394,-165]],[[83639,72234],[-130,-319],[-270,-296],[-142,-414]],[[83097,71205],[299,-324],[109,-582]],[[83505,70299],[169,-541],[189,-454],[-5,-439],[-174,-161],[66,-315],[164,-184],[-43,-481],[-71,-468],[-155,-53],[-203,-640],[-225,-775],[-258,-705],[-382,-545],[-386,-498],[-313,-68],[-170,-262],[-96,192],[-157,-294],[-388,-296],[-294,-90],[-95,-624],[-154,-35],[-73,429],[66,228]],[[80517,63220],[-373,190],[-131,-97]],[[80013,63313],[-371,-505],[-231,-558],[-61,-410],[212,-623],[260,-772],[252,-365],[169,-475],[127,-1093],[-37,-1039],[-232,-389],[-318,-381],[-227,-492],[-346,-550],[-101,378],[78,401],[-206,335]],[[78981,56775],[-233,87],[-112,307],[-141,611]],[[78495,57780],[-249,271],[-238,-11],[41,464],[-245,-3],[-22,-650],[-150,-863],[-90,-522],[19,-428],[181,-18],[113,-539],[50,-512],[155,-338],[168,-69],[144,-306]],[[78372,54256],[64,-56],[164,-356],[116,-396],[16,-398],[-29,-269],[27,-203],[20,-349],[98,-163],[109,-523],[-5,-199],[-197,-40],[-263,438],[-329,469],[-32,301],[-161,395],[-38,489],[-100,322],[30,431],[-61,250]],[[77801,54399],[-110,227],[-47,292],[-148,334],[-135,280],[-45,-347],[-53,328],[30,369],[82,566]],[[77375,56448],[-27,439],[86,452],[-94,350],[23,644],[-113,306],[-90,707],[-50,746],[-121,490],[-183,-297],[-315,-421],[-156,53],[-172,138],[96,732],[-58,554],[-218,681],[34,213],[-163,76],[-197,481]],[[75657,62792],[-79,309],[-16,301],[-53,284]],[[75509,63686],[-116,344],[-256,23],[25,-243],[-87,-329],[-118,120],[-41,-108],[-78,65],[-108,53]],[[74730,63611],[-39,-216],[-189,7],[-343,-122],[16,-445],[-148,-349],[-400,-398],[-311,-695],[-209,-373]],[[73107,61020],[-276,-386],[-1,-272]],[[72830,60362],[-138,-146]],[[72692,60216],[-250,-212],[-130,-31]],[[72312,59973],[-84,-450],[58,-769],[15,-490],[-118,-561],[-1,-1004],[-144,-29],[-126,-450],[84,-195]],[[71996,56025],[-253,-167],[-93,-402]],[[71650,55456],[-112,-170],[-263,552],[-128,827],[-107,596],[-97,279],[-148,568],[-69,739],[-48,369],[-253,811],[-115,1145],[-83,756],[1,716],[-54,553],[-404,-353],[-196,70],[-362,716],[133,214],[-82,232],[-326,501]],[[68937,64577],[-203,150]],[[68734,64727],[-83,425],[-215,449]],[[68436,65601],[-512,-111],[-451,-11],[-391,-83]],[[67082,65396],[-523,179]],[[66559,65575],[-302,136],[-314,76]],[[65943,65787],[-118,725],[-133,105],[-214,-106],[-280,-286],[-339,196],[-281,454],[-267,168],[-186,561],[-205,788],[-149,-96],[-177,196]],[[63594,68492],[-103,-231],[-165,29]],[[63326,68290],[58,-261],[-25,-135],[89,-445]],[[63448,67449],[109,-510],[137,-135],[47,-207]],[[63741,66597],[190,-248],[16,-244]],[[63947,66105],[-27,-197],[35,-199],[80,-165],[37,-194],[41,-145]],[[64113,65205],[-18,430],[75,310],[76,64]],[[64246,66009],[84,-186],[5,-345]],[[64335,65478],[-61,-348]],[[64274,65130],[53,-226]],[[64327,64904],[49,29],[11,-162],[217,93],[230,-15],[168,-18],[190,400],[207,379],[176,364]],[[65575,65974],[80,201],[35,-51],[-26,-244],[-37,-108]],[[65627,65772],[38,-466]],[[65665,65306],[125,-404],[155,-214]],[[65945,64688],[204,-78],[164,-107]],[[66313,64503],[125,-339],[75,-196],[100,-75],[-1,-132],[-101,-352],[-44,-166],[-117,-189],[-104,-404],[-126,31],[-58,-141],[-44,-300],[34,-395],[-26,-72],[-128,2],[-174,-221],[-27,-288],[-63,-125],[-173,5],[-109,-149]],[[65352,60997],[1,-239],[-134,-164]],[[65219,60594],[-153,56],[-186,-199]],[[64880,60451],[-128,-33],[-201,-159]],[[64551,60259],[-54,-263],[-6,-201],[-277,-249],[-444,-276],[-249,-417]],[[63521,58853],[-122,-32],[-83,34]],[[63316,58855],[-163,-245]],[[63153,58610],[-177,-113],[-233,-31]],[[62743,58466],[-70,-34],[-61,-156],[-73,-43]],[[62539,58233],[-42,-150],[-138,13]],[[62359,58096],[-89,-80],[-192,30],[-72,345],[8,323],[-46,174],[-54,437],[-80,243],[56,29],[-29,270],[34,114],[-12,257]],[[61883,60238],[-36,253],[-84,177]],[[61763,60668],[-22,236],[-143,212],[-148,495],[-79,482],[-192,406],[-124,97],[-184,563],[-32,411],[12,350],[-159,655],[-130,231],[-150,122],[-92,339],[15,133]],[[60335,65400],[-77,307],[-81,131]],[[60177,65838],[-108,440],[-170,476],[-141,406],[-139,-3],[44,325],[12,206],[34,236]],[[59709,67924],[-9,86]],[[59700,68010],[-78,-238],[-60,-446],[-75,-308],[-65,-103],[-93,191],[-125,263],[-198,847],[-29,-53],[115,-624],[171,-594],[210,-920],[102,-321],[90,-334],[249,-654],[-55,-103],[9,-384],[323,-530],[49,-121]],[[60240,63578],[90,-580],[-61,-107],[40,-608],[102,-706],[106,-145],[152,-219]],[[60669,61213],[161,-683],[77,-543]],[[60907,59987],[152,-288],[379,-558],[154,-336],[151,-341],[87,-203],[136,-178]],[[61966,58083],[66,-183],[-9,-245],[-158,-142],[119,-161]],[[61984,57352],[91,-109]],[[62075,57243],[54,-244],[125,-248]],[[62254,56751],[138,-2],[262,151],[302,70],[245,184],[138,39],[99,108],[158,20]],[[63596,57321],[89,12],[128,88],[147,59],[132,202],[105,2],[6,-163],[-25,-344],[1,-310],[-59,-214],[-78,-639],[-134,-659],[-172,-755],[-238,-866],[-237,-661],[-327,-806],[-278,-479],[-415,-586],[-259,-450],[-304,-715],[-64,-312],[-63,-140]],[[61551,49585],[-195,-236],[-68,-246],[-104,-44],[-40,-416],[-89,-238],[-54,-393],[-112,-195]],[[60889,47817],[-128,-728],[16,-335],[178,-216],[8,-153],[-76,-357],[16,-180],[-18,-282],[97,-370],[115,-583],[101,-129]],[[61198,44484],[45,-265],[-11,-588],[34,-519],[11,-923],[49,-290],[-83,-422],[-108,-410],[-177,-366],[-254,-225],[-313,-287],[-313,-634],[-107,-108],[-194,-420],[-115,-136],[-23,-421],[132,-448],[54,-346],[4,-177],[49,29],[-8,-579]],[[59870,36949],[-45,-274],[65,-102]],[[59890,36573],[-41,-246],[-116,-210]],[[59733,36117],[-229,-199],[-334,-320],[-122,-219],[24,-248],[71,-40],[-24,-311]],[[59119,34780],[-70,-430],[-32,-491],[-72,-267],[-190,-298],[-54,-86],[-118,-300],[-77,-303],[-158,-424],[-314,-609],[-196,-355]],[[57838,31217],[-209,-269],[-291,-229]],[[57338,30719],[-141,-31],[-36,-164],[-169,88],[-138,-113],[-301,114],[-168,-72],[-115,31],[-286,-233],[-238,-94],[-171,-223],[-127,-14],[-117,210],[-94,11],[-120,264],[-13,-82],[-37,159],[2,346],[-90,396],[89,108],[-7,453],[-182,553],[-139,501],[-1,1],[-199,768]],[[54540,33696],[-207,446],[-108,432],[-62,575],[-68,428],[-93,910],[-7,707],[-35,322],[-108,243],[-144,489],[-146,708],[-60,371],[-226,577],[-17,453]],[[53259,40357],[-26,372],[38,519],[96,541],[15,254],[90,532],[66,243],[159,386],[90,263],[29,438],[-15,335],[-83,211],[-74,358],[-68,355],[15,122],[85,235],[-84,570],[-57,396],[-139,374],[26,115]],[[53422,46976],[-39,183]],[[53383,47159],[-74,444]],[[53309,47603],[-228,626]],[[53081,48229],[-285,596],[-184,488],[-169,610],[9,196],[61,189],[67,430],[56,438]],[[52636,51176],[-52,90],[96,663]],[[52680,51929],[40,467],[-108,390]],[[52612,52786],[-127,100],[-56,265]],[[52429,53151],[-71,85],[3,163]],[[52361,53399],[-289,-213]],[[52072,53186],[-105,32],[-107,-133]],[[51860,53085],[-222,13],[-149,370],[-91,427]],[[51398,53895],[-197,390],[-209,-8]],[[50992,54277],[-245,1]],[[50747,54278],[-229,-69]],[[50518,54209],[-224,-126]],[[50294,54083],[-436,-346],[-154,-203],[-250,-171],[-248,168]],[[49206,53531],[-126,-7],[-194,116],[-178,-7],[-329,-103],[-193,-170],[-275,-217],[-54,15]],[[47857,53158],[-73,-5],[-286,282]],[[47498,53435],[-252,450],[-237,323]],[[47009,54208],[-187,381]],[[46822,54589],[-75,44],[-200,238],[-144,316],[-49,216],[-34,437]],[[46320,55840],[-122,349],[-108,232],[-71,76],[-69,118],[-32,261],[-41,130],[-80,97]],[[45797,57103],[-149,247],[-117,39],[-63,166],[1,90],[-84,125],[-18,127]],[[45367,57897],[-46,453]],[[45321,58350],[36,262]],[[45357,58612],[-115,460],[-138,210],[122,112],[134,415],[66,304]],[[45426,60113],[-24,318],[78,291],[34,557],[-30,583],[-34,294],[28,295],[-72,281],[-146,255]],[[45260,62987],[12,249]],[[45272,63236],[13,274],[106,161],[91,308],[-18,200],[96,417],[155,376],[93,95],[74,344],[6,315],[100,365],[185,216],[177,603],[144,235]],[[46494,67145],[259,66],[219,403],[139,158]],[[47111,67772],[232,493],[-70,735],[106,508],[37,312],[179,399],[278,270],[206,244],[186,612],[87,362],[205,-2],[167,-251],[264,41],[288,-131],[121,-6]],[[49397,71358],[267,323],[300,102],[175,244],[268,180],[471,105],[459,48],[140,-87],[262,232],[297,5],[113,-137],[190,35]],[[52339,72408],[302,239],[195,-71],[-9,-299],[236,217],[20,-113]],[[53083,72381],[-139,-289],[-2,-274]],[[52942,71818],[96,-147],[-36,-511],[-183,-297],[53,-322],[143,-10],[70,-281],[106,-92]],[[53191,70158],[326,-204],[117,51],[232,-98],[368,-264],[130,-526],[250,-114],[391,-248],[296,-293],[136,153],[133,272],[-65,452],[87,288],[200,277],[192,80],[375,-121],[95,-264],[104,-2],[88,-101]],[[56646,69496],[276,-69],[68,-196]],[[56990,69231],[369,10],[268,-156],[275,-175],[129,-92],[214,188],[114,169],[245,49],[198,-75],[75,-293],[65,193],[222,-140],[217,-33],[137,149]],[[59518,69025],[80,194],[-19,34],[74,276],[56,446],[40,149],[8,6]],[[59757,70130],[99,482],[138,416],[5,21]],[[59999,71049],[-26,452],[68,243]],[[60041,71744],[-102,268],[105,222],[-169,-51],[-233,136],[-191,-340],[-421,-66],[-225,317],[-300,20],[-64,-245]],[[58441,72005],[-192,-71],[-268,315]],[[57981,72249],[-303,-10],[-165,587]],[[57513,72826],[-203,328],[135,459],[-176,283],[308,565],[428,23],[117,449],[529,-78],[334,383],[324,167],[459,13]],[[59768,75418],[485,-416],[399,-229]],[[60652,74773],[323,91],[239,-53],[328,309]],[[61542,75120],[42,252],[-70,403],[-160,218],[-154,68],[-102,181]],[[61098,76242],[-354,499],[-317,223],[-240,347],[202,95],[231,494],[-156,234],[410,241],[-8,129],[-249,-95]],[[60617,78409],[-222,-48],[-185,-191],[-260,-31],[-239,-220],[16,-368],[136,-142],[284,35],[-55,-210],[-304,-103],[-377,-342],[-154,121],[61,277],[-304,173],[50,113],[265,197],[-80,135],[-432,149],[-19,221],[-257,-73],[-103,-325],[-215,-437]],[[58223,77340],[6,-152],[-135,-128],[-84,56],[-78,-713]],[[57932,76403],[-144,-245],[-101,-422],[89,-337]],[[57776,75399],[33,-228],[243,-190],[-51,-145],[-330,-33],[-118,-182],[-232,-319]],[[57321,74302],[-87,275],[3,122]],[[57237,74699],[-169,17],[-145,56],[-336,-154],[192,-332],[-141,-96]],[[56638,74190],[-154,0],[-147,304]],[[56337,74494],[-52,-130],[62,-353],[139,-277]],[[56486,73734],[-105,-130],[155,-272]],[[56536,73332],[137,-171],[4,-334],[-257,157],[82,-302],[-176,-62],[105,-521]],[[56431,72099],[-184,-7],[-228,257],[-104,472]],[[55915,72821],[-49,393],[-108,272],[-143,337],[-18,168]],[[55597,73991],[-48,41],[-5,130],[-154,199],[-24,281],[23,403],[38,184]],[[55427,75229],[-46,93],[-59,46]],[[55322,75368],[-78,192],[-120,118]],[[55124,75678],[-261,218],[-161,213],[-254,176]],[[54448,76285],[-233,435],[56,44]],[[54271,76764],[-127,248],[-5,200],[-179,93],[-85,-255],[-82,198],[6,205],[10,9]],[[53809,77462],[62,54]],[[53871,77516],[-221,86],[-226,-210],[15,-293],[-34,-168],[91,-301],[261,-298],[140,-488],[309,-476],[217,3],[68,-130],[-78,-118]],[[54413,75123],[249,-213],[204,-179]],[[54866,74731],[238,-308],[29,-111],[-52,-211],[-154,276],[-242,97],[-116,-382],[200,-219],[-33,-309],[-116,-35],[-148,-506],[-116,-46],[1,181],[57,317],[60,126],[-108,342],[-85,298],[-115,74],[-82,255],[-179,107],[-120,238],[-206,38],[-217,267],[-254,384]],[[53108,75604],[-189,341],[-86,584]],[[52833,76529],[-138,68],[-226,195],[-128,-80],[-161,-274],[-115,-43]],[[52065,76395],[-252,-334],[-548,160],[-404,-192],[-32,-355]],[[50829,75674],[15,-344],[-263,-393],[-356,-125],[-25,-199],[-171,-327],[-107,-481],[108,-338],[-160,-263],[-60,-384],[-210,-118]],[[49600,72702],[-197,-455],[-352,-8]],[[49051,72239],[-265,11],[-174,-209],[-106,-223],[-136,49],[-103,199],[-79,340],[-259,92]],[[47929,72498],[-112,-153],[-146,83],[-143,-65],[42,462],[-26,363],[-124,55],[-67,224],[22,386],[111,215],[20,239],[58,355],[-6,250],[-56,212],[-12,200]],[[47490,75324],[14,420],[-114,257],[393,426]],[[47783,76427],[340,-107],[373,4]],[[48496,76324],[296,-101],[230,31],[449,-19]],[[49471,76235],[144,354],[53,1177],[-287,620],[-205,299]],[[49176,78685],[-424,228],[-28,430]],[[48724,79343],[360,129],[466,-152],[-88,669],[263,-254],[646,461],[84,484],[243,119]],[[50698,80799],[222,117]],[[50920,80916],[143,162]],[[51063,81078],[244,870],[380,247]],[[51687,82195],[231,-17]],[[51918,82178],[54,125],[232,32],[52,-130],[188,291],[-63,222],[-13,335]],[[52368,83053],[-113,328],[-8,604],[46,159]],[[52293,84144],[80,178],[244,36]],[[52617,84358],[98,163],[223,167],[-9,-304],[-82,-192],[33,-166],[151,-89],[-68,-223],[-83,64],[-200,-425],[76,-288]],[[52756,83065],[4,-228],[281,-138],[-3,-210],[283,111],[156,162],[313,-233],[132,-189]],[[53922,82340],[189,174],[434,273],[350,200],[277,-100],[21,-144],[268,-7]],[[55461,82736],[63,260],[383,191]],[[55907,83187],[-59,497]],[[55848,83684],[10,445],[136,371],[262,202],[221,-442],[223,12],[53,453]],[[56753,84725],[32,349],[-102,-75],[-176,210],[-24,340],[351,164],[350,86],[301,-97],[287,17]],[[57772,85719],[316,327],[-291,280]],[[57797,86326],[-504,-47],[-489,-216],[-452,-125]],[[56352,85938],[-161,322],[-269,195],[62,581]],[[55984,87036],[-135,534],[133,344]],[[55982,87914],[252,371],[635,640],[185,124],[-28,250],[-387,279]],[[56639,89578],[-478,-167],[-269,-413],[43,-361],[-441,-475],[-537,-509],[-202,-832],[198,-416],[265,-328],[-255,-666],[-289,-138],[-106,-992],[-157,-554],[-337,57],[-158,-468],[-321,-27],[-89,558],[-232,671],[-211,835]],[[53063,85353],[-187,363],[-548,-684]],[[52328,85032],[-370,-138],[-385,301]],[[51573,85195],[-99,635]],[[51474,85830],[-88,1364],[256,380]],[[51642,87574],[733,496],[549,609],[508,824],[668,1141],[465,444],[763,741],[610,259],[457,-31],[423,489],[506,-26],[499,118],[869,-433],[-358,-158],[305,-371]],[[58639,91676],[286,206],[456,-358],[761,-140],[1050,-668],[213,-281],[18,-393],[-308,-311],[-454,-157],[-1240,449],[-204,-75],[453,-433],[36,-878],[358,-180],[217,-153],[36,286]],[[60317,88590],[-174,263],[183,215]],[[60326,89068],[672,-368]],[[60998,88700],[234,144],[-187,433]],[[61045,89277],[647,578],[256,-34],[260,-206],[161,406],[-231,352],[136,353],[-204,367],[777,-190],[158,-331],[-351,-73]],[[62654,90499],[2,-328],[218,-203]],[[62874,89968],[429,128],[68,377]],[[63371,90473],[581,282],[969,507]],[[64921,91262],[209,-29],[-273,-359],[344,-61],[199,202],[521,16],[412,245],[317,-356],[315,391],[-291,343],[145,195],[820,-179],[385,-185],[1006,-675],[186,309],[-282,313],[-8,125],[-335,58],[92,280],[-149,461],[-8,189],[512,535]],[[69038,93080],[182,537],[207,116]],[[69427,93733],[735,-156],[58,-328]],[[70220,93249],[-263,-479],[173,-189],[89,-413],[-63,-809],[307,-362],[-120,-395],[-544,-839],[318,-87],[110,213],[306,151],[74,293],[240,281],[-162,336],[130,390],[-304,49],[-67,328]],[[70444,91717],[222,594],[-361,481]],[[70305,92792],[497,398],[-64,421],[139,13],[145,-328],[-109,-570],[297,-108],[-127,426],[465,233],[577,31],[513,-337],[-247,492],[-28,630]],[[72363,94093],[484,119],[668,-26]],[[73515,94186],[602,77],[-226,309],[321,388],[319,16],[540,293],[734,79],[93,162],[729,55],[227,-133],[624,314],[510,-10],[77,255],[265,252],[656,242],[476,-191],[-378,-146],[629,-90],[75,-292],[254,143],[812,-7],[626,-289],[223,-221],[-69,-307],[-307,-175],[-730,-328],[-209,-175],[345,-83],[410,-149]],[[63720,73858],[-47,-207],[-102,-138]],[[63571,73513],[7,-293]],[[63578,73220],[88,-436],[263,-123],[193,-296],[395,-102],[434,156],[27,139]],[[64978,72558],[-52,417],[40,618],[-216,200],[71,405],[-184,34],[61,498],[262,-145],[244,189],[-202,355],[-80,338],[-224,-151],[-28,-433],[-87,383]],[[64583,75266],[-15,144],[68,246],[-53,206],[-322,202],[-125,530],[-154,150],[-9,192],[270,-56],[11,432],[236,96],[243,-88],[50,576],[-50,365],[-278,-28],[-236,144],[-321,-260],[-259,-124]],[[63639,77993],[-127,-350],[-269,-97],[-276,-610],[252,-561],[-27,-398],[303,-696]],[[63495,75281],[146,-311],[141,-419],[130,-28],[85,-159],[-228,-47],[-49,-459]],[[23212,96566],[559,-9],[195,-109],[-33,-68],[-126,-17],[-521,38],[-74,165]],[[18463,96506],[224,188],[406,60],[392,-92],[-93,-177],[-518,-170],[-411,191]],[[55757,96473],[191,152],[-167,189],[575,119],[110,-222],[401,-134],[-620,-241],[-490,137]],[[18738,96905],[5,84],[285,177],[149,-27],[361,-120],[-339,-115],[-461,1]],[[22602,97179],[360,-24],[162,-39],[332,-205],[-76,-214],[-411,-122],[-226,138],[-119,221],[-22,245]],[[20696,97433],[546,-81],[751,-215],[212,-281],[108,-247],[-453,66],[-457,192],[-619,21],[268,176],[-335,142],[-21,227]],[[77621,96617],[507,776],[229,66],[208,-38],[704,-336],[-82,-240],[-1566,-228]],[[52901,97640],[757,212],[152,-207],[396,8],[105,202],[408,20],[350,-206],[915,-440],[-699,-233],[-155,-435],[-243,-111],[-132,-490],[-335,-23],[-598,361],[252,210],[-416,170],[-541,499],[-216,463]],[[54824,98034],[858,165],[403,-142],[281,177],[702,-148],[545,-207],[-412,-318],[-806,-70],[-819,98],[-50,163],[-398,11],[-304,271]],[[62457,98194],[542,107],[422,8],[57,-160],[159,142],[262,97],[412,-129],[-107,-90],[-373,-78],[-250,-45],[-39,-97],[-324,-98],[-301,140],[158,185],[-618,18]],[[75327,98047],[722,404],[600,133],[540,-297],[640,-572],[-69,-531],[-606,-73],[-773,170],[-462,226],[-213,423],[-379,117]],[[23136,97939],[193,262],[192,180],[285,42],[-122,135],[646,30],[355,-315],[468,-127],[455,-112],[220,-390],[334,-190],[-381,-176],[-513,-445],[-492,-42],[-575,76],[-299,240],[4,215],[220,157],[-508,-4],[-306,196],[-176,268]],[[24559,98965],[413,112],[324,19],[545,96],[409,220],[344,-30],[300,-166],[211,319],[367,95],[498,65],[849,24],[148,-63],[802,100],[601,-38],[602,-37],[742,-47],[597,-75],[508,-161],[-12,-157],[-678,-257],[-672,-119],[-251,-133],[605,3],[-656,-358],[-452,-167],[-476,-483],[-573,-98],[-177,-120],[-841,-64],[383,-74],[-192,-105],[230,-292],[-264,-202],[-429,-167],[-132,-232],[-388,-176],[39,-134],[475,23],[6,-144],[-742,-355],[-726,163],[-816,-91],[-414,71],[-525,31],[-35,284],[514,133],[-137,427],[170,41],[742,-255],[-379,379],[-450,113],[225,229],[492,141],[79,206],[-392,231],[-118,304],[759,-26],[220,-64],[433,216],[-625,68],[-972,-38],[-491,201],[-232,239],[-324,173],[-61,202]],[[29639,96690],[39,229],[1051,285],[1018,284],[107,214],[-750,213],[243,235],[961,413],[404,63],[-115,265],[658,156],[854,93],[853,5],[303,-184],[737,325],[663,-221],[390,-46],[577,-192],[-660,318],[38,253],[932,353],[975,-27],[354,218],[982,57],[2219,-74],[1737,-469],[-513,-227],[-1062,-26],[-1496,-58],[140,-105],[984,65],[836,-204],[540,181],[231,-212],[-305,-344],[707,220],[1348,229],[833,-114],[156,-253],[-1132,-420],[-157,-136],[-888,-102],[643,-28],[-324,-431],[-224,-383],[9,-658],[333,-386],[-434,-24],[-457,-187],[513,-313],[65,-502],[-297,-55],[360,-508],[-617,-42],[322,-241],[-91,-208],[-391,-91],[-388,-2],[348,-400],[4,-263],[-549,244],[-143,-158],[375,-148],[364,-361],[105,-476],[-495,-114],[-214,228],[-344,340],[95,-401],[-322,-311],[732,-25],[383,-32],[-745,-515],[-755,-466],[-813,-204],[-306,-2],[-288,-228],[-386,-624],[-597,-414],[-192,-24],[-370,-145],[-399,-138],[-238,-365],[-4,-415],[-141,-388],[-453,-472],[112,-462],[-125,-488],[-142,-577],[-391,-36],[-410,482],[-556,3],[-269,324],[-186,577],[-481,735],[-141,385],[-38,530],[-384,546],[100,435],[-186,208],[275,691],[418,220],[110,247],[58,461],[-318,-209],[-151,-88],[-249,-84],[-341,193],[-19,401],[109,314],[258,9],[567,-157],[-478,375],[-249,202],[-276,-83],[-232,147],[310,550],[-169,220],[-220,409],[-335,626],[-353,230],[3,247],[-745,346],[-590,43],[-743,-24],[-677,-44],[-323,188],[-482,372],[729,186],[559,31],[-1188,154],[-627,241]],[[67002,71642],[284,-224],[209,79],[58,268],[219,89],[157,180],[55,472],[234,114],[44,211],[131,-158],[84,-19]],[[68477,72654],[154,-4],[210,-124]],[[68841,72526],[85,-72],[201,189],[93,-114],[90,271],[166,-12],[43,86],[29,239],[120,205],[150,-134],[-30,-181],[84,-28],[-26,-496],[110,-194],[97,125],[123,58],[173,265],[192,-44],[286,-1]],[[70827,72688],[50,-169]],[[70877,72519],[-162,-67],[-141,-109],[-319,-68],[-298,-124],[-163,-258],[66,-250],[32,-294],[-139,-248],[12,-227],[-76,-213],[-265,18],[110,-390],[-177,-150],[-118,-356],[15,-355],[-108,-166],[-103,55],[-212,-77],[-31,-166],[-207,1],[-154,-334],[-10,-503],[-361,-246],[-194,52],[-56,-129],[-166,75],[-278,-88],[-465,301]],[[66909,68203],[252,536],[-23,380],[-210,100],[-22,375],[-91,472],[119,323],[-121,87],[76,430],[113,736]],[[56642,44124],[29,-184],[-32,-286],[49,-277],[-41,-222],[24,-203],[-579,7],[-13,-1880],[188,-483],[181,-369]],[[56448,40227],[-510,-241],[-673,83],[-192,284],[-1126,-26],[-42,-41],[-166,267],[-180,17],[-166,-100],[-134,-113]],[[53422,46976],[115,79],[80,-11],[98,71],[820,-8],[68,-440],[80,-354],[64,-191],[106,-309],[184,47],[91,83],[154,-83],[42,148],[69,344],[172,23],[15,103],[142,2],[-24,-213],[337,5],[5,-372],[56,-228],[-41,-356],[21,-363],[93,-219],[-15,-703],[68,54],[121,-15],[172,89],[127,-35]],[[53309,47603],[112,255],[84,100],[104,-203]],[[53609,47755],[-101,-124],[-45,-152],[-9,-258],[-71,-62]],[[55719,75309],[-35,-201],[39,-254],[115,-144]],[[55838,74710],[-5,-155],[-91,-85],[-16,-192],[-129,-287]],[[55427,75229],[-47,93]],[[55380,75322],[-18,188],[120,291],[18,-111],[75,52]],[[55575,75742],[59,-159],[66,-60],[19,-214]],[[65575,65974],[52,-202]],[[65665,65306],[-142,-3],[-23,-384],[50,-82],[-126,-117],[-1,-241],[-81,-245],[-7,-238]],[[65335,63996],[-56,-125],[-835,298],[-106,599],[-11,136]],[[31400,18145],[-168,16],[-297,1],[0,1319]],[[32587,37434],[511,-964],[227,-89],[339,-437],[286,-231],[40,-261],[-273,-898],[280,-160],[312,-91],[220,95],[252,453],[45,521]],[[34826,35372],[138,114],[139,-341],[-6,-472],[-234,-326],[-186,-241],[-314,-573],[-370,-806]],[[33993,32727],[-70,-473],[-74,-607],[3,-588],[-61,-132],[-21,-382]],[[31227,23224],[273,-433],[266,-119]],[[30952,19680],[-257,93],[-672,79],[-115,344],[6,443],[-185,-38],[-98,214],[-24,626],[213,260],[88,375],[-33,299],[148,504],[101,782],[-30,347],[122,112],[-30,223],[-129,118],[92,248],[-126,224],[-65,682],[112,120],[-47,720],[65,605],[75,527],[166,215],[-84,576],[-1,543],[210,386],[-7,494],[159,576],[1,544],[-72,108],[-128,1020],[171,607],[-27,572],[100,537],[182,555],[196,367],[-83,232],[58,190],[-9,985],[302,291],[96,614],[-34,148]],[[31359,37147],[231,534],[364,-144],[163,-427],[109,475],[316,-24],[45,-127]],[[62492,74950],[57,-155],[106,-103],[-56,-148],[148,-202],[-78,-189],[118,-160],[124,-97],[7,-410]],[[62918,73486],[-101,-17]],[[62817,73469],[-113,342],[1,91],[-123,-2],[-82,159],[-58,-16]],[[62442,74043],[-109,172],[-207,147],[27,288],[-47,208]],[[62106,74858],[386,92]],[[1088,892],[38,-7],[32,-4]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81],[375,-57],[414,-58],[386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-139],[-202,-150],[-136,-174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47],[430,23],[408,81],[343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[229,-162],[266,-35],[223,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[174,-162],[49,-266],[92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21],[294,188]],[[54716,79012],[-21,-241],[-156,-2],[53,-128],[-92,-380]],[[54500,78261],[-53,-100],[-243,-14],[-140,-134],[-229,45]],[[53835,78058],[-398,153],[-62,205],[-274,-102],[-32,-113],[-169,84]],[[52900,78285],[-142,16],[-125,108],[42,145],[-10,104]],[[52665,78658],[83,33],[141,-164],[39,156],[245,-25],[199,106],[133,-18],[87,-121],[26,100],[-40,385],[100,75],[98,272]],[[53776,79457],[206,-190],[157,242],[98,44],[215,-180],[131,30],[128,-111]],[[54711,79292],[-23,-75],[28,-205]],[[62817,73469],[-190,78],[-141,273],[-44,223]],[[63720,73858],[-48,-207],[-101,-138]],[[63578,73220],[-69,-29],[-173,309],[95,292],[-82,174],[-104,-44],[-327,-436]],[[62492,74950],[68,96],[207,-169],[149,-36],[38,70],[-136,319],[72,82]],[[62890,75312],[78,-20],[191,-359],[122,-40],[48,150],[166,238]],[[58149,47921],[-17,713],[-70,268]],[[58062,48902],[169,-46],[85,336],[147,-38]],[[58463,49154],[16,-233],[60,-134],[3,-192],[-69,-124],[-108,-308],[-101,-214],[-115,-28]],[[50920,80916],[204,-47],[257,123],[176,-258],[153,-138]],[[51710,80596],[-32,-400]],[[51678,80196],[-72,-22],[-30,-331]],[[51576,79843],[-243,269],[-143,-46],[-194,279],[-129,237],[-129,10],[-40,207]],[[50518,54209],[-69,407],[13,1357],[-56,122],[-11,290],[-96,207],[-85,174],[35,311]],[[50249,57077],[96,67],[56,258],[136,56],[61,176]],[[50598,57634],[93,173],[100,2],[212,-340]],[[51003,57469],[-11,-197],[62,-350],[-54,-238],[29,-159],[-135,-366],[-86,-181],[-52,-372],[7,-376],[-16,-952]],[[49214,56277],[-190,152],[-130,-22],[-97,-149],[-125,125],[-49,195],[-125,129]],[[48498,56707],[-18,343],[76,250],[-7,200],[221,490],[41,405],[76,144],[134,-79],[116,120],[38,152],[216,265],[53,184],[259,246],[153,84],[70,-114],[178,3]],[[50104,59400],[-22,-286],[37,-269],[156,-386],[9,-286],[320,-134],[-6,-405]],[[50249,57077],[-243,13]],[[50006,57090],[-128,47],[-90,-96],[-123,43],[-482,-27],[-7,-336],[38,-444]],[[75742,63602],[-6,-424],[-97,90],[18,-476]],[[75657,62792],[-79,308],[-16,301],[-53,285]],[[74730,63611],[-43,486],[-96,444],[47,356],[-171,159],[62,215],[173,220],[-200,313],[98,401],[220,-255],[133,-30],[24,-410],[265,-81],[257,8],[160,-101],[-128,-500],[-124,-34],[-86,-336],[152,-306],[46,377],[76,2],[147,-937]],[[56293,76715],[80,-243],[108,43],[213,-92],[408,-31],[138,150],[327,138],[202,-215],[163,-62]],[[57776,75399],[-239,79],[-283,-186]],[[57254,75292],[-3,-294],[-252,-56],[-196,206],[-222,-162],[-206,17]],[[56375,75003],[-20,391],[-139,189]],[[56216,75583],[46,84],[-30,70],[47,188],[105,185],[-135,255],[-24,216],[68,134]],[[55279,77084],[100,2],[-69,-260],[134,-227],[-41,-278],[-65,-27]],[[55338,76294],[-52,-53],[-90,-138],[-41,-325]],[[55155,75778],[-246,224],[-105,247],[-106,130],[-127,221],[-61,183],[-136,277],[59,245],[99,-136],[60,123],[130,13],[239,-98],[192,8],[126,-131]],[[56523,82432],[268,-4],[302,223],[64,333],[228,190],[-26,264]],[[57359,83438],[169,100],[298,228]],[[57826,83766],[293,-149],[39,-146],[146,70],[272,-141],[27,-277],[-60,-159],[174,-387],[113,-108],[-16,-107],[187,-104],[80,-157],[-108,-129],[-224,20],[-54,-55],[66,-196],[68,-379]],[[58829,81362],[-239,-35],[-85,-129],[-18,-298],[-111,57],[-250,-28],[-73,138],[-104,-103],[-105,86],[-218,12],[-310,141],[-281,47],[-215,-14],[-152,-160],[-133,-23]],[[56535,81053],[-6,263],[-85,274],[166,121],[2,235],[-77,225],[-12,261]],[[25238,61101],[-2,87],[33,27],[51,-70],[99,357],[53,8]],[[25297,59966],[-83,0],[22,667],[2,468]],[[31359,37147],[-200,-81],[-109,814],[-150,663],[88,572],[-146,250],[-37,426],[-136,402]],[[30669,40193],[175,638],[-119,496],[63,199],[-49,219],[108,295],[6,503],[13,415],[60,200],[-240,951]],[[30686,44109],[206,-50],[143,13],[62,179],[243,239],[147,222],[363,100],[-29,-443],[34,-227],[-23,-396],[302,-529],[311,-98],[109,-220],[188,-117],[115,-172],[175,6],[161,-175],[12,-342],[55,-172],[3,-255],[-81,-10],[107,-688],[533,-24],[-41,-342],[30,-233],[151,-166],[66,-367],[-49,-465],[-77,-259],[27,-337],[-87,-122]],[[33842,38659],[-4,182],[-259,302],[-258,9],[-484,-172],[-133,-520],[-7,-318],[-110,-708]],[[34826,35372],[54,341],[38,350],[0,325],[-100,107],[-104,-96],[-103,26],[-33,228],[-26,541],[-52,177],[-187,160],[-114,-116],[-293,113],[18,802],[-82,329]],[[30686,44109],[-157,-102],[-126,68],[18,898],[-228,-348],[-245,15],[-105,315],[-184,34],[59,254],[-155,359],[-115,532],[73,108],[0,250],[168,171],[-28,319],[71,206],[20,275],[318,402],[227,114],[37,89],[251,-28]],[[30585,48040],[125,1620],[6,256],[-43,339],[-123,215],[1,430],[156,97],[56,-61],[9,226],[-162,61],[-4,370],[541,-13],[92,203],[77,-187],[55,-349],[52,73]],[[31423,51320],[153,-312],[216,38],[54,181],[206,138],[115,97],[32,250],[198,168],[-15,124],[-235,51],[-39,372],[12,396],[-125,153],[52,55],[206,-76],[221,-148],[80,140],[200,92],[310,221],[102,225],[-37,167]],[[33129,53652],[145,26],[64,-136],[-36,-259],[96,-90],[63,-274],[-77,-209],[-44,-502],[71,-299],[20,-274],[171,-277],[137,-29],[30,116],[88,25],[126,104],[90,157],[154,-50],[67,21]],[[34294,51702],[151,-48],[25,120],[-46,118],[28,171],[112,-53],[131,61],[159,-125]],[[34854,51946],[121,-122],[86,160],[62,-25],[38,-166],[133,42],[107,224],[85,436],[164,540]],[[35174,30629],[-77,334],[122,280],[-160,402],[-218,327],[-286,379],[-103,-18],[-279,457],[-180,-63]],[[82069,53798],[-13,-291],[-16,-377],[-133,19],[-58,-202],[-126,307]],[[75471,66988],[113,-189],[-20,-363],[-227,-17],[-234,39],[-175,-92],[-252,224],[-6,119]],[[74670,66709],[184,439],[150,150],[198,-137],[147,-14],[122,-159]],[[58175,37528],[-393,-435],[-249,-442],[-93,-393],[-83,-222],[-152,-47],[-48,-283],[-28,-184],[-178,-138],[-226,29],[-133,166],[-117,71],[-135,-137],[-68,-283],[-132,-177],[-139,-264],[-199,-60],[-62,207],[26,360],[-165,562],[-75,88]],[[55526,35946],[0,1725],[274,20],[8,2105],[207,19],[428,207],[106,-243],[177,231],[85,2],[156,133]],[[56967,40145],[50,-44]],[[57017,40101],[107,-473],[56,-105],[87,-342],[315,-649],[119,-64],[0,-208],[82,-375],[215,-90],[177,-267]],[[54244,54965],[229,44],[52,152],[46,-11],[69,-134],[350,226],[118,230],[145,207],[-28,208],[78,54],[269,-36],[261,273],[201,645],[141,239],[176,101]],[[56351,57163],[31,-253],[160,-369],[1,-241],[-45,-246],[18,-184],[96,-170]],[[56612,55700],[212,-258]],[[56824,55442],[152,-239],[2,-192],[187,-308],[116,-255],[70,-355],[208,-234],[44,-187]],[[57603,53672],[-91,-63],[-178,14],[-209,62],[-104,-51],[-41,-143],[-90,-18],[-110,125],[-309,-295],[-127,60],[-38,-46],[-83,-357],[-207,115],[-203,59],[-177,218],[-229,200],[-149,-190],[-108,-300],[-25,-412]],[[55125,52650],[-178,33],[-188,99],[-166,-313],[-146,-550]],[[54447,51919],[-29,172],[-12,269],[-127,190],[-103,305],[-23,212],[-132,309],[23,176],[-28,249],[21,458],[67,107],[140,599]],[[26228,91219],[16,649],[394,-46]],[[25824,89109],[-81,-259],[-322,-399]],[[23714,86094],[-16,-686],[409,-99]],[[25743,83665],[348,-163],[294,-248]],[[28738,83981],[-23,395],[-188,502]],[[31513,79609],[415,58],[246,-289]],[[31350,77248],[-181,334],[0,805],[-123,171],[-187,-100],[-92,155],[-212,-446],[-84,-460],[-99,-269],[-118,-91],[-89,-30],[-28,-146],[-512,0],[-422,-4],[-125,-109],[-294,-425],[-34,-46],[-89,-231],[-255,1],[-273,-3],[-125,-93],[44,-116],[25,-181],[-5,-60],[-363,-293],[-286,-93],[-323,-316],[-70,0],[-94,93],[-31,85],[6,61],[61,207],[131,325],[81,349],[-56,514],[-59,536],[-290,277],[35,105],[-41,73],[-76,0],[-56,93],[-14,140],[-54,-61],[-75,18],[17,59],[-65,58],[-27,155],[-216,189],[-224,197],[-272,229],[-261,214],[-248,-167],[-91,-6],[-342,154],[-225,-77],[-269,183],[-284,94],[-194,36],[-86,100],[-49,325],[-94,-3],[-1,-227],[-575,0],[-951,0],[-944,0],[-833,0],[-834,0],[-819,0],[-847,0],[-273,0],[-825,0],[-788,0]],[[15104,80367],[-503,244],[-155,523],[40,363]],[[13740,82958],[154,285],[-7,373],[-473,376],[-284,674],[-173,424],[-255,266],[-187,242],[-147,306],[-279,-192],[-270,-330],[-247,388],[-194,259],[-271,164],[-273,17],[1,3364],[2,2193]],[[11355,91625],[438,-285],[289,-54]],[[15437,92031],[38,-449],[341,97]],[[17987,91291],[374,-300],[-390,-293]],[[19722,91216],[-704,-88],[-494,-56]],[[15020,93041],[119,250],[192,432]],[[16539,93012],[0,-257],[-731,-285]],[[52900,78285],[-22,-242],[-122,-100],[-206,75],[-60,-239],[-132,-19],[-48,94],[-156,-200],[-134,-28],[-120,126]],[[51900,77752],[-95,259],[-133,-92],[5,267],[203,332],[-9,150],[126,-54],[77,101]],[[52074,78715],[236,-4],[57,128],[298,-181]],[[31400,18145],[-92,-239],[-238,-183]],[[31070,17723],[-137,19],[-164,48]],[[30769,17790],[-202,177],[-291,86],[-350,330],[-283,317],[-383,662],[229,-124],[390,-395],[369,-212],[143,271],[90,405],[256,244],[198,-70]],[[29661,27385],[-80,576],[-22,666]],[[30452,39739],[143,151],[74,303]],[[86288,75628],[-179,348],[-111,-331],[-429,-254],[44,-312],[-241,22],[-131,185],[-191,-419],[-306,-318],[-227,-379]],[[83030,72705],[220,-173],[311,422]],[[83987,72709],[45,-310],[-393,-165]],[[83097,71205],[299,-325],[109,-581]],[[80517,63220],[-373,189],[-131,-96]],[[80013,63313],[-280,154],[-132,240],[44,340],[-254,108],[-134,222],[-236,-315],[-271,-68],[-221,3],[-149,-145]],[[78380,63852],[-144,-86],[42,-676],[-148,16],[-25,139]],[[78105,63245],[-9,244],[-203,-172],[-121,109],[-206,222],[81,490],[-176,115],[-66,544],[-293,-98],[33,701],[263,493],[11,487],[-8,452],[-121,141],[-93,348],[-162,-44]],[[77035,67277],[-300,89],[94,248],[-130,367],[-198,-249],[-233,145],[-321,-376],[-252,-439],[-224,-74]],[[74670,66709],[-23,465],[-170,-124]],[[74477,67050],[-324,57],[-314,136],[-225,259],[-216,117],[-93,284],[-157,84],[-280,385],[-223,182],[-115,-141]],[[72530,68413],[-386,413],[-273,374],[-78,651],[200,-79],[9,301],[-111,303],[28,482],[-298,692]],[[71621,71550],[-457,239],[-82,454],[-205,276]],[[70827,72688],[-42,337],[10,230],[-169,134],[-91,-59],[-70,546]],[[70465,73876],[79,136],[-39,138],[266,279],[192,116],[294,-80],[105,378],[356,70],[99,234],[438,320],[39,134]],[[72294,75601],[-22,337],[190,154],[-250,1026],[550,236],[143,131],[200,1058],[551,-194],[155,267],[13,592],[230,56],[212,393]],[[74266,79657],[109,49]],[[74375,79706],[73,-413],[233,-313],[396,-222],[192,-476],[-107,-690],[100,-256],[330,-101],[374,-83],[336,-368],[171,-66],[127,-544],[163,-351],[306,14],[574,-133],[369,82],[274,-88],[411,-359],[336,1],[123,-184],[324,318],[448,205],[417,22],[324,208],[200,316],[194,199],[-45,195],[-89,227],[146,381],[156,-53],[286,-120],[277,313],[423,229],[204,391],[195,168],[404,78],[219,-66],[30,210],[-251,413],[-223,189],[-214,-219],[-274,92],[-157,-74],[-72,241],[197,590],[135,446]],[[82410,80055],[333,-223],[392,373],[-3,260],[251,627],[155,189],[-4,326],[-152,141],[229,294],[345,106],[369,16],[415,-176],[244,-217],[172,-596],[104,-254],[97,-363],[103,-579],[483,-189],[329,-420],[112,-555],[423,-1],[240,233],[459,175],[-146,-532],[-107,-216],[-96,-647],[-186,-575],[-338,104],[-238,-208],[73,-506],[-40,-698],[-142,-16],[2,-300]],[[47857,53158],[22,487],[26,74],[-8,233],[-118,247],[-88,40],[-81,162],[60,262],[-28,286],[13,172]],[[47655,55121],[44,0],[17,258],[-22,114],[27,82],[103,71],[-69,473],[-64,245],[23,200],[55,46]],[[47769,56610],[36,54],[77,-89],[215,-5],[51,172],[48,-11],[80,67],[43,-253],[65,74],[114,88]],[[49214,56277],[74,-841],[-117,-496],[-73,-667],[121,-509],[-13,-233]],[[53632,51919],[-35,32],[-164,-76],[-169,79],[-132,-38]],[[53132,51916],[-452,13]],[[52680,51929],[40,466],[-108,391]],[[52429,53151],[-72,85],[4,163]],[[52361,53399],[71,418],[132,570],[81,6],[165,345],[105,10],[156,-243],[191,199],[26,246],[63,238],[43,299],[148,243],[56,414],[59,132],[39,307],[74,377],[234,457],[14,196],[31,107],[-110,235]],[[53939,57955],[9,188],[78,34]],[[54026,58177],[111,-378],[18,-392],[-10,-393],[151,-537],[-155,6],[-78,-42],[-127,60],[-60,-279],[164,-345],[121,-100],[39,-245],[87,-407],[-43,-160]],[[54447,51919],[-20,-319],[-220,140],[-225,156],[-350,23]],[[58564,52653],[-16,-691],[111,-80],[-89,-210],[-107,-157],[-106,-308],[-59,-274],[-15,-475],[-65,-225],[-2,-446]],[[58216,49787],[-80,-165],[-10,-351],[-38,-46],[-26,-323]],[[58149,47921],[50,-544],[-27,-307]],[[58172,47070],[55,-343],[161,-330]],[[58388,46397],[150,-745]],[[58538,45652],[-109,60],[-373,-99],[-75,-71],[-79,-377],[62,-261],[-49,-699],[-34,-593],[75,-105],[194,-230],[76,107],[23,-637],[-212,5],[-114,325],[-103,252],[-213,82],[-62,310],[-170,-187],[-222,83],[-93,268],[-176,55],[-131,-15],[-15,184],[-96,15]],[[53609,47755],[73,-60],[95,226],[152,-6],[17,-167],[104,-105],[164,370],[161,289],[71,189],[-10,486],[121,574],[127,304],[183,285],[32,189],[7,216],[45,205],[-14,335],[34,524],[55,368],[83,316],[16,357]],[[57603,53672],[169,-488],[124,-71],[75,99],[128,-39],[155,125],[66,-252],[244,-393]],[[53081,48229],[212,326],[-105,391],[95,148],[187,73],[23,261],[148,-283],[245,-25],[85,279],[36,393],[-31,461],[-131,350],[120,684],[-69,117],[-207,-48],[-78,305],[21,258]],[[29063,50490],[-119,140],[-137,195],[-79,-94],[-235,82],[-68,255],[-52,-10],[-278,338]],[[28366,54848],[36,287],[89,-43],[52,176],[-64,348],[34,86]],[[30185,57537],[-178,-99],[-71,-295],[-107,-169],[-81,-220],[-34,-422],[-77,-345],[144,-40],[35,-271],[62,-130],[21,-238],[-33,-219],[10,-123],[69,-49],[66,-207],[357,57],[161,-75],[196,-508],[112,63],[200,-32],[158,68],[99,-102],[-50,-318],[-62,-199],[-22,-423],[56,-393],[79,-175],[9,-133],[-140,-294],[100,-130],[74,-207],[85,-589]],[[30585,48040],[-139,314],[-83,14],[179,602],[-213,276],[-166,-51],[-101,103],[-153,-157],[-207,74],[-163,620],[-129,152],[-89,279],[-184,280],[-74,-56]],[[26191,57131],[42,76],[183,-156],[63,77],[89,-50],[46,-121],[82,-40],[66,126]],[[27070,56232],[-107,-53],[1,-238],[58,-88],[-41,-70],[10,-107],[-23,-120],[-14,-117]],[[59437,71293],[-30,21],[-53,-45],[-42,12],[-14,-22],[-5,59],[-20,37],[-54,6],[-75,-51],[-52,31]],[[53776,79457],[-157,254],[-141,142],[-30,249],[-49,176],[202,129],[103,147],[200,114],[70,113],[73,-68],[124,62]],[[54171,80775],[132,-191],[207,-51],[-17,-163],[151,-122],[41,153],[191,-66],[26,-185],[207,-36],[127,-291]],[[55236,79823],[-82,-1],[-43,-106],[-64,-26],[-18,-134],[-54,-28],[-7,-55],[-95,-61],[-123,10],[-39,-130]],[[53922,82340],[64,-300],[-77,-158],[101,-210],[69,-316],[-22,-204],[114,-377]],[[52074,78715],[35,421],[140,404],[-400,109],[-131,155]],[[51718,79804],[16,259],[-56,133]],[[51710,80596],[-47,619],[167,0],[70,222],[69,541],[-51,200]],[[52368,83053],[210,-78],[178,90]],[[61984,57352],[-102,-317]],[[61882,57035],[-62,106],[-67,-42],[-155,10],[-4,180],[-22,163],[94,277],[98,261]],[[61764,57990],[119,-51],[83,144]],[[52293,84144],[80,177],[244,37]],[[30081,61241],[5,161],[-71,177],[68,99],[21,228],[-24,321]],[[53333,64447],[-952,-1126],[-804,-1161],[-392,-263]],[[51185,61897],[-308,-58],[-3,376],[-129,96],[-173,169],[-66,277],[-937,1289],[-937,1289]],[[48632,65335],[-1045,1431]],[[47587,66766],[6,114],[-1,40]],[[47592,66920],[-2,700],[449,436],[277,90],[227,159],[107,295],[324,234],[12,438],[161,51],[126,219],[363,99],[51,230],[-73,125],[-96,624],[-17,359],[-104,379]],[[52339,72408],[-57,-303],[44,-563],[-65,-487],[-171,-330],[24,-445],[227,-352],[3,-143],[171,-238],[118,-1061]],[[52633,68486],[90,-522],[15,-274],[-49,-482],[21,-270],[-36,-323],[24,-371],[-110,-247],[164,-431],[11,-253],[99,-330],[130,109],[219,-275],[122,-370]],[[29063,50490],[38,-449],[-86,-384],[-303,-619],[-334,-233],[-170,-514],[-53,-398],[-157,-243],[-116,298],[-113,64],[-114,-47],[-8,216],[79,141],[-33,246]],[[60240,63578],[-1102,0],[-1077,0],[-1117,0]],[[56944,63578],[0,2175],[0,2101],[-83,476],[71,365],[-43,253],[101,283]],[[59518,69025],[182,-1015]],[[61764,57990],[-95,191],[-114,346],[-124,190],[-71,204],[-242,237],[-191,7],[-67,124],[-163,-139],[-168,268],[-87,-441],[-323,124]],[[60119,59101],[-30,236],[120,868],[27,393],[88,181],[204,97],[141,337]],[[60669,61213],[161,-684],[77,-542]],[[47783,76427],[340,-106],[373,3]],[[49471,76235],[111,-230],[511,-268],[101,127],[313,-267],[322,77]],[[49600,72702],[-197,-454],[-352,-9]],[[47929,72498],[-23,195],[103,222],[38,161],[-96,175],[77,388],[-111,355],[120,48],[11,280],[45,86],[3,461],[129,160],[-78,296],[-162,21],[-47,-75],[-164,0],[-70,289],[-113,-86],[-101,-150]],[[57772,85719],[42,-103],[-198,-341],[83,-551],[-120,-187]],[[57579,84537],[-229,1],[-239,219],[-121,73],[-237,-105]],[[61882,57035],[-61,-209],[103,-325],[102,-285],[106,-210],[909,-702],[233,4]],[[63274,55308],[-785,-1773],[-362,-26],[-247,-417],[-178,-11],[-76,-186]],[[61626,52895],[-190,0],[-112,200],[-254,-247],[-82,-247],[-185,47],[-62,68],[-65,-16],[-87,6],[-352,502],[-193,0],[-95,194],[0,332],[-145,99]],[[59804,53833],[-164,643],[-127,137],[-48,236],[-141,288],[-171,42],[95,337],[147,14],[42,181]],[[59437,55711],[-4,531]],[[59433,56242],[82,618],[132,166],[28,241],[119,451],[168,293],[112,582],[45,508]],[[57942,91385],[-41,-414],[425,-394],[-256,-445],[323,-673],[-187,-506],[250,-440],[-113,-385],[411,-405],[-105,-301],[-258,-341],[-594,-755]],[[56352,85938],[-161,323],[-269,193],[62,582]],[[55984,87036],[-135,533],[133,345]],[[56639,89578],[-93,230],[-8,910],[-433,402],[-371,289]],[[55734,91409],[167,156],[309,-312],[362,29],[298,-143],[265,262],[137,433],[431,200],[356,-235],[-117,-414]],[[34854,51946],[70,252],[24,269],[48,253],[-107,349]],[[34889,53069],[-22,404],[144,508]],[[51576,79843],[62,-52],[80,13]],[[51900,77752],[-11,-167],[82,-222],[-97,-180],[72,-457],[151,-75],[-32,-256]],[[49176,78685],[-424,227],[-28,431]],[[52636,51176],[94,35],[404,-6],[-2,711]],[[48278,82406],[-210,122],[-172,-9],[57,317],[-57,317]],[[49420,83612],[22,-62],[248,-697]],[[49690,82853],[190,-95],[171,-673],[79,-233],[337,-113],[-34,-378],[-142,-173],[111,-305],[-250,-310],[-371,6],[-473,-163],[-130,116],[-183,-276],[-257,67],[-195,-226],[-148,118],[407,621],[249,127]],[[49051,80963],[-2,1],[-434,98]],[[48615,81062],[-79,235],[291,183],[-152,319],[52,387]],[[48727,82186],[413,-54],[1,0]],[[49141,82132],[40,343]],[[49181,82475],[-186,364],[-4,8]],[[48991,82847],[-337,104],[-66,160],[101,264],[-92,163],[-149,-279],[-17,569],[-140,301],[101,611],[216,480],[222,-47],[335,49],[-297,-639],[283,81],[304,-3],[-72,-481],[-250,-530],[287,-38]],[[61098,76242],[34,70],[235,-101],[409,-96],[378,-283],[48,-110],[169,93],[259,-124],[85,-242],[175,-137]],[[62106,74858],[-268,290],[-296,-28]],[[50006,57090],[-20,-184],[116,-305],[-1,-429],[27,-466],[69,-215],[-61,-532],[22,-294],[74,-375],[62,-207]],[[47655,55121],[-78,15],[-57,-238],[-78,3],[-55,126],[19,237],[-116,362],[-73,-67],[-59,-13]],[[47158,55546],[-77,-34],[3,217],[-44,155],[9,171],[-60,249],[-78,211],[-222,1],[-65,-112],[-76,-13],[-48,-128],[-32,-163],[-148,-260]],[[45797,57103],[123,288],[84,-11],[73,99],[61,1],[44,78],[-24,196],[31,62],[5,200]],[[46194,58016],[134,-6],[200,-144],[61,13],[21,66],[151,-47],[40,33]],[[46801,57931],[16,-216],[44,1],[73,78],[46,-19],[77,-150],[119,-48],[76,128],[90,79],[67,83],[55,-15],[62,-130],[33,-163],[114,-248],[-57,-152],[-11,-192],[59,58],[35,-69],[-15,-176],[85,-170]],[[45357,58612],[302,17],[63,140],[88,9],[110,-145],[86,-3],[92,99],[56,-170],[-120,-133],[-121,11],[-119,124],[-103,-136],[-50,-5],[-67,-83],[-253,13]],[[45367,57897],[147,96],[92,-19],[75,67],[513,-25]],[[56638,74190],[-154,-1],[-147,305]],[[56486,73734],[-105,-129],[155,-273]],[[56431,72099],[-184,-8],[-228,257],[-104,473]],[[55838,74710],[182,53],[106,129],[150,-12],[46,103],[53,20]],[[57254,75292],[135,-157],[-86,-369],[-66,-67]],[[24381,59170],[7,172],[32,138],[-39,111],[133,481],[357,2],[7,201],[-45,36],[-31,128],[-103,136],[-103,198],[125,1],[1,333],[259,1],[257,-7]],[[25493,59872],[-127,-225],[-131,-166],[-20,-113],[22,-116],[-58,-150]],[[25179,59102],[-65,-37],[15,-69],[-52,-66],[-95,-149],[-9,-86]],[[34125,54109],[-44,-532],[-169,-154],[15,-139],[-51,-305],[123,-429],[89,-1],[37,-333],[169,-514]],[[33129,53652],[-188,448],[75,163],[-5,273],[171,95],[69,110],[-95,220],[24,215],[220,347]],[[25697,58436],[-84,51]],[[25613,58487],[19,237],[-38,64],[-57,42],[-122,-70],[-10,79],[-84,95],[-60,118],[-82,50]],[[25860,59889],[128,15],[90,66]],[[26903,59440],[-95,12],[-38,-81],[-97,-77],[-70,0],[-61,-76],[-56,27],[-47,90],[-29,-17],[-36,-141],[-27,5],[-4,-121],[-97,-163],[-51,-70],[-29,-74],[-82,120],[-60,-158],[-58,4],[-65,-14],[6,-290],[-41,-5],[-35,-135],[-86,-25]],[[55230,77704],[67,-229],[89,-169],[-107,-222]],[[55155,75778],[-31,-100]],[[54448,76285],[-233,434],[56,45]],[[53809,77462],[194,-20],[51,100],[94,-97],[109,-11],[-1,165],[97,60],[27,239],[221,157]],[[54601,78055],[88,-73],[208,-253],[229,-114],[104,89]],[[54716,79012],[141,-151],[103,-65],[233,73],[22,118],[111,18],[135,92],[30,-38],[130,74],[66,139],[91,36],[297,-180],[59,61]],[[56134,79189],[155,-161],[19,-159]],[[56308,78869],[-170,-123],[-131,-401],[-168,-401],[-223,-111]],[[55616,77833],[-173,26],[-213,-155]],[[54601,78055],[-54,200],[-47,6]],[[84713,45326],[28,-117],[5,-179]],[[89166,49043],[5,-1925],[4,-1925]],[[80461,51765],[47,-395],[190,-334],[179,121],[177,-43],[162,299],[133,52],[263,-166],[226,126],[143,822],[107,205],[96,672],[319,0],[241,-100]],[[72530,68413],[-176,-268],[-108,-553],[269,-224],[262,-289],[362,-332],[381,-76],[160,-301],[215,-56],[334,-138],[231,10],[32,234],[-36,375],[21,255]],[[77035,67277],[20,-224],[-97,-108],[23,-364],[-199,107],[-359,-408],[8,-338],[-153,-496],[-14,-288],[-124,-487],[-217,135],[-11,-612],[-63,-201],[30,-251],[-137,-140]],[[73107,61020],[-276,-387],[-1,-271]],[[72692,60216],[-251,-212],[-129,-31]],[[71996,56025],[-253,-168],[-93,-401]],[[68937,64577],[185,395],[612,-2],[-56,507],[-156,300],[-31,455],[-182,265],[306,619],[323,-45],[290,620],[174,599],[270,593],[-4,421],[236,342],[-224,292],[-96,400],[-99,517],[137,255],[421,-144],[310,88],[268,496]],[[64978,72558],[244,114],[197,338],[186,-17],[122,110],[197,-55],[308,-299],[221,-65],[318,-523],[207,-21],[24,-498]],[[66909,68203],[137,-310],[112,-357],[266,-260],[7,-520],[133,-96],[23,-272],[-400,-305],[-105,-687]],[[66559,65575],[-303,136],[-313,76]],[[63594,68492],[-104,-231]],[[63490,68261],[-153,311],[-3,314],[-89,0],[46,428],[-143,449],[-340,324],[-193,562],[65,461],[139,204],[-21,345],[-182,177],[-180,705]],[[62436,72541],[-152,473],[55,183],[-87,678],[190,168]],[[63326,68290],[-187,49],[-204,-567]],[[62935,67772],[-516,47],[-784,1188],[-413,414],[-335,160]],[[60887,69581],[-112,720]],[[60775,70301],[615,614],[105,715],[-26,431],[152,146],[142,369]],[[61763,72576],[119,92],[324,-77],[97,-150],[133,100]],[[63490,68261],[-164,29]],[[59873,69719],[-100,82],[-58,-394],[69,-66],[-71,-81],[-12,-156],[131,80]],[[59832,69184],[7,-230],[-139,-944]],[[59757,70130],[93,-1],[25,104],[75,8]],[[59950,70241],[4,-242],[-38,-90],[6,-4]],[[59922,69905],[-49,-186]],[[53835,78058],[-31,-291],[67,-251]],[[54413,75123],[249,-214],[204,-178]],[[53108,75604],[-189,340],[-86,585]],[[59922,69905],[309,-234],[544,630]],[[60887,69581],[-53,-89],[-556,-296],[277,-591],[-92,-101],[-46,-197],[-212,-82],[-66,-213],[-120,-182],[-310,94]],[[59832,69184],[41,173],[0,362]],[[69711,75551],[-159,-109],[-367,-412],[-121,-422],[-104,-4],[-76,280],[-353,19],[-57,484],[-135,4],[21,593],[-333,431],[-476,-46],[-326,-86],[-265,533],[-227,223],[-431,423],[-52,51],[-715,-349],[11,-2178]],[[65546,74986],[-142,-29],[-195,463],[-188,166],[-315,-123],[-123,-197]],[[63639,77993],[-142,96],[29,304],[-177,395],[-207,-17],[-235,401],[160,448],[-81,120],[222,649],[285,-342],[35,431],[573,643],[434,15],[612,-409],[329,-239],[295,249],[440,12],[356,-306],[80,175],[391,-25],[69,280],[-450,406],[267,288],[-52,161],[266,153],[-200,405],[127,202],[1039,205],[136,146],[695,218],[250,245],[499,-127],[88,-612],[290,144],[356,-202],[-23,-322],[267,33],[696,558],[-102,-185],[355,-457],[620,-1500],[148,309],[383,-340],[399,151],[154,-106],[133,-341],[194,-115],[119,-251],[358,79],[147,-361]],[[72294,75601],[-171,87],[-140,212],[-412,62],[-461,16],[-100,-65],[-396,248],[-158,-122],[-43,-349],[-457,204],[-183,-84],[-62,-259]],[[60889,47817],[-399,590],[-19,343],[-1007,1203],[-47,65]],[[59417,50018],[-3,627],[80,239],[137,391],[101,431],[-123,678],[-32,296],[-132,411]],[[59445,53091],[171,352],[188,390]],[[61626,52895],[-243,-670],[3,-2152],[165,-488]],[[70465,73876],[-526,-89],[-343,192],[-301,-46],[26,340],[303,-98],[101,182]],[[69725,74357],[212,-58],[355,425],[-329,311],[-198,-147],[-205,223],[234,382],[-83,58]],[[78495,57780],[-66,713],[178,492],[359,112],[261,-84]],[[79227,59013],[229,-232],[126,407],[246,-217]],[[79828,58971],[64,-394],[-34,-708],[-467,-455],[122,-358],[-292,-43],[-240,-238]],[[85103,71220],[51,443],[-122,615]],[[85048,72883],[17,54],[124,-21],[108,266],[197,29],[118,39],[40,143]],[[55575,75742],[52,132]],[[55627,75874],[66,43],[38,196],[50,33],[40,-84],[52,-36],[36,-94],[46,-28],[54,-110],[39,4],[-31,-144],[-33,-71],[9,-44]],[[55993,75539],[-62,-23],[-164,-91],[-13,-121],[-35,5]],[[63448,67449],[-196,-16],[-69,282],[-248,57]],[[79227,59013],[90,266],[12,500],[-224,515],[-18,583],[-211,480],[-210,40],[-56,-205],[-163,-17],[-83,104],[-293,-353],[-6,530],[68,623],[-188,27],[-16,355],[-120,182]],[[77809,62643],[59,218],[237,384]],[[78380,63852],[162,-466],[125,-537],[342,-5],[108,-515],[-178,-155],[-80,-212],[333,-353],[231,-699],[175,-520],[210,-411],[70,-418],[-50,-590]],[[59999,71049],[125,-31],[45,-231],[-151,-223],[-68,-323]],[[47498,53435],[-252,449],[-237,324]],[[46822,54589],[66,189],[15,172],[126,320],[129,276]],[[54125,64088],[-197,-220],[-156,324],[-439,255]],[[52633,68486],[136,137],[24,250],[-30,244],[191,228],[86,189],[135,170],[16,454]],[[56646,69496],[276,-70],[68,-195]],[[56944,63578],[0,-1180],[-320,-2],[-3,-248]],[[56621,62148],[-1108,1131],[-1108,1132],[-280,-323]],[[57499,32928],[148,374],[151,232],[130,120],[121,-182],[96,-178],[-85,-288],[-47,-192],[-155,-93],[-51,-188],[-99,-59],[-209,454]],[[56314,82678],[-23,150],[30,162],[-123,94],[-291,103]],[[55848,83684],[318,181],[466,-38],[273,59],[39,-123],[148,-38],[267,-287]],[[56523,82432],[-67,182],[-142,64]],[[57579,84537],[134,-136],[24,-287],[89,-348]],[[47592,66920],[-42,0],[7,-317],[-172,-19],[-90,-134],[-126,0],[-100,76],[-234,-63],[-91,-460],[-86,-44],[-131,-745],[-386,-637],[-92,-816],[-114,-265],[-33,-213],[-625,-48],[-5,1]],[[45272,63236],[13,274],[106,161],[91,308],[-18,200],[96,417],[155,376],[93,95],[74,344],[6,315],[100,365],[185,216],[177,603]],[[46350,66910],[5,8],[139,227]],[[46494,67145],[259,65],[218,404],[140,158]],[[57394,79070],[66,87],[185,58],[204,-184],[115,-22],[125,-159],[-20,-200],[101,-97],[40,-247],[97,-150],[-19,-88],[52,-60],[-74,-44],[-164,18],[-27,81],[-58,-47],[20,-106],[-76,-188],[-49,-203],[-70,-64]],[[57842,77455],[-50,270],[30,252],[-9,259],[-160,352],[-89,249],[-86,175],[-84,58]],[[23016,65864],[-107,-518],[-49,-426],[-20,-791],[-27,-289],[48,-322],[86,-288],[56,-458],[184,-440],[65,-337],[109,-291],[295,-157],[114,-247],[244,165],[212,60],[208,106],[175,101],[176,241],[67,345],[22,496],[48,173],[188,155],[294,137],[246,-21],[169,50],[66,-125],[-9,-285],[-149,-351],[-66,-360],[51,-103],[-42,-255],[-69,-461],[-71,152],[-58,-10]],[[24067,59806],[-144,191],[-226,155]],[[19641,66203],[-142,138],[-164,287]],[[18570,68996],[-201,234],[-93,-25]],[[19362,64423],[-181,337],[-201,286]],[[17464,69802],[316,46],[353,64],[-26,-116],[419,-287],[634,-416],[552,4],[221,0],[0,244],[481,0],[102,-210],[142,-186],[165,-260],[92,-309],[69,-325],[144,-178],[230,-177],[175,467],[227,11],[196,-236],[139,-404],[96,-346],[164,-337],[61,-414],[78,-277],[217,-184],[197,-130],[108,18]],[[55993,75539],[95,35],[128,9]],[[46619,59216],[93,107],[47,348],[88,14],[194,-165],[157,117],[107,-39],[42,131],[1114,9],[62,414],[-48,73],[-134,2550],[-134,2550],[425,10]],[[51185,61897],[1,-1361],[-152,-394],[-24,-364],[-247,-94],[-379,-51],[-102,-210],[-178,-23]],[[46801,57931],[13,184],[-24,229],[-104,166],[-54,338],[-13,368]],[[77809,62643],[-159,-137],[-162,-256],[-196,-26],[-127,-639],[-117,-107],[134,-519],[177,-431],[113,-390],[-101,-514],[-96,-109],[66,-296],[185,-470],[32,-330],[-4,-274],[108,-539],[-152,-551],[-135,-607]],[[55338,76294],[74,-101],[40,-82],[91,-63],[106,-123],[-22,-51]],[[55380,75322],[-58,46]],[[74375,79706],[292,102],[530,509],[423,278],[242,-182],[289,-8],[186,-276],[277,-22],[402,-148],[270,411],[-113,348],[288,612],[311,-244],[252,-69],[327,-152],[53,-443],[394,-248],[263,109],[351,78],[279,-78],[272,-284],[168,-302],[258,6],[350,-96],[255,146],[366,98],[407,416],[166,-63],[146,-198],[331,49]],[[59599,43773],[209,48],[334,-166],[73,74],[193,16],[99,177],[167,-10],[303,230],[221,342]],[[59870,36949],[-45,-275],[65,-101]],[[59890,36573],[-41,-245],[-116,-211]],[[59119,34780],[-211,5]],[[58908,34785],[-24,261],[-41,265]],[[58843,35311],[-23,212],[49,659],[-72,419],[-133,832]],[[58664,37433],[292,671],[74,426],[42,53],[31,348],[-45,175],[12,442],[54,409],[0,748],[-145,190],[-132,43],[-60,146],[-128,125],[-232,-12],[-18,220]],[[58409,41417],[-26,421],[843,487]],[[59226,42325],[159,-284],[77,54],[110,-149],[16,-237],[-59,-274],[21,-417],[181,-365],[85,410],[120,124],[-24,760],[-116,427],[-100,191],[-97,-9],[-77,768],[77,449]],[[46619,59216],[-184,405],[-168,435],[-184,157],[-133,173],[-155,-6],[-135,-129],[-138,51],[-96,-189]],[[45260,62987],[60,197],[1088,-4],[-53,853],[68,304],[261,53],[-9,1512],[911,-31],[1,895]],[[59226,42325],[-147,153],[85,549],[87,205],[-53,490],[56,479],[47,160],[-71,501],[-131,264]],[[59099,45126],[273,-110],[55,-164],[95,-275],[77,-804]],[[77801,54399],[48,105],[227,-258],[22,-304],[183,71],[91,243]],[[56448,40227],[228,134],[180,-34],[109,-133],[2,-49]],[[55526,35946],[0,-2182],[-248,-302],[-149,-43],[-175,112],[-125,43],[-47,252],[-109,162],[-133,-292]],[[54125,64088],[68,-919],[104,-153],[4,-188],[116,-203],[-60,-254],[-107,-1199],[-15,-769],[-354,-557],[-120,-778],[115,-219],[0,-380],[178,-13],[-28,-279]],[[53939,57955],[-52,-13],[-188,647],[-65,24],[-217,-331],[-215,173],[-150,34],[-80,-83],[-163,18],[-164,-252],[-141,-14],[-337,305],[-131,-145],[-142,10],[-104,223],[-279,221],[-298,-70],[-72,-128],[-39,-340],[-80,-238],[-19,-527]],[[52072,53186],[-105,31],[-107,-132]],[[51398,53895],[-197,389],[-209,-7]],[[25647,58207],[31,91],[46,-88]],[[51063,81078],[244,869],[380,248]],[[58639,91676],[-473,-237],[-224,-54]],[[55734,91409],[-172,-24],[-41,-389],[-523,95],[-74,-329],[-267,2],[-183,-421],[-278,-655],[-431,-831],[101,-202],[-97,-234],[-275,10],[-180,-554],[17,-784],[177,-300],[-92,-694],[-231,-405],[-122,-341]],[[52328,85032],[-371,-138],[-384,301]],[[51474,85830],[-88,1363],[256,381]],[[65352,60997],[1,-238],[-134,-165]],[[64880,60451],[-128,-34]],[[64752,60417],[-91,413],[-217,975]],[[64444,61805],[833,591],[185,1182],[-127,418]],[[65945,64688],[203,-78],[165,-107]],[[68734,64727],[-83,424],[-215,450]],[[28212,55535],[-52,196],[-138,164]],[[27170,56020],[-6,-126],[111,-26]],[[55461,82736],[342,-67],[511,9]],[[56535,81053],[139,-515],[-29,-166],[-138,-69],[-252,-491],[71,-266],[-60,35]],[[56266,79581],[-264,227],[-200,-84],[-131,61],[-165,-127],[-140,210],[-114,-81],[-16,36]],[[86221,75560],[-120,-200],[-83,-202]],[[85048,72883],[-135,112],[-34,-111]],[[84641,73095],[76,260],[66,69]],[[84829,73851],[-18,96],[-163,65]],[[86288,75628],[39,-104]],[[64246,66009],[84,-185],[5,-346]],[[64274,65130],[-77,-42],[-84,117]],[[56308,78869],[120,127],[172,-65],[178,-3],[129,-144],[95,91],[205,56],[69,139],[118,0]],[[57842,77455],[124,-109],[131,95],[126,-101]],[[56293,76715],[-51,103],[65,99],[-69,74],[-87,-133],[-162,172],[-22,244],[-169,139],[-31,188],[-151,232]],[[81143,94175],[251,112],[141,-379]],[[84237,94144],[590,-104],[443,4]],[[97224,91732],[123,262],[886,-165]],[[96192,85904],[-126,219],[-268,-253]],[[95032,82989],[-486,-302],[-96,-674]],[[93543,84472],[14,276],[432,132]],[[95182,86999],[-705,-649],[-227,727]],[[90412,85637],[-914,-175],[-899,-1153]],[[88378,82339],[178,295],[305,-38]],[[89262,81946],[9,-503],[-217,-590]],[[60617,78409],[9,262],[143,165],[269,43],[44,197],[-62,326],[113,310],[-3,173],[-410,192],[-162,-6],[-172,277],[-213,-94],[-352,208],[6,116],[-99,256],[-222,29],[-23,183],[70,120],[-178,334],[-288,-57],[-84,30],[-70,-134],[-104,23]],[[58639,91676],[286,206],[456,-358],[761,-140],[1050,-668],[213,-281],[18,-393],[-308,-311],[-454,-157],[-1240,449],[-204,-75],[453,-433]],[[59670,89515],[18,-274],[18,-604]],[[59706,88637],[358,-180],[217,-153],[36,286]],[[60317,88590],[-168,254],[177,224]],[[60998,88700],[233,144],[-186,433]],[[62654,90499],[1,-328],[219,-203]],[[63371,90473],[580,282],[970,507]],[[69038,93080],[183,537],[206,116]],[[69427,93733],[736,-156],[57,-328]],[[70444,91717],[222,593],[-361,482]],[[72363,94093],[483,119],[669,-26]],[[58449,49909],[110,-333],[-16,-348],[-80,-74]],[[58216,49787],[67,-60],[166,182]],[[61883,60238],[-37,252],[-83,178]],[[60335,65400],[-77,306],[-81,132]],[[63741,66597],[190,-249],[16,-243]],[[64444,61805],[-801,-226],[-259,-266],[-199,-620],[-130,-99],[-70,197],[-106,-30],[-269,60],[-50,59],[-321,-14],[-75,-53],[-114,153],[-74,-290],[28,-249],[-121,-189]],[[56351,57163],[3,143],[-102,174],[-3,343],[-58,228],[-98,-34],[28,217],[72,246],[-32,245],[92,181],[-58,138],[73,365],[127,435],[240,-41],[-14,2345]],[[59433,56242],[1,-71]],[[59434,56171],[-39,12],[5,294],[-33,203],[-143,233],[-34,426],[34,436],[-129,41],[-19,-132],[-167,-30],[67,-173],[23,-355],[-152,-324],[-138,-426],[-144,-61],[-233,345],[-105,-122],[-29,-172],[-143,-112],[-9,-122],[-277,0],[-38,122],[-200,20],[-100,-101],[-77,51],[-143,344],[-48,163],[-200,-81],[-76,-274],[-72,-528],[-95,-111],[-85,-65]],[[56635,55672],[-23,28]],[[59445,53091],[-171,-272],[-195,1],[-224,-138],[-176,132],[-115,-161]],[[56824,55442],[-189,230]],[[59434,56171],[3,-460]],[[25613,58487],[-31,-139]],[[62075,57243],[54,-245],[125,-247]],[[63596,57321],[-2,-9],[-1,-244],[0,-596],[0,-308],[-125,-363],[-194,-493]],[[34889,53069],[109,-351],[-49,-254],[-24,-270],[-71,-248]],[[56266,79581],[-77,-154],[-55,-238]],[[58908,34785],[-56,-263],[-163,-63],[-166,320],[-2,204],[76,222],[26,172],[80,42],[140,-108]],[[60041,71744],[74,129],[75,130],[15,329],[91,-115],[306,165],[147,-112],[229,2],[320,222],[149,-10],[316,92]],[[68841,72526],[156,598],[-60,440],[-204,140],[72,261],[232,-28],[132,326],[89,380],[371,137],[-58,-274],[40,-164],[114,15]],[[65546,74986],[313,8],[-45,297],[237,204],[234,343],[374,-312],[30,-471],[106,-121],[301,27],[93,-108],[137,-609],[317,-408],[181,-278],[291,-289],[369,-253],[-7,-362]],[[53083,72381],[-139,-290],[-2,-273]],[[58441,72005],[-192,-70],[-268,314]],[[57981,72249],[-303,-11],[-165,588]],[[59768,75418],[485,-417],[399,-228]],[[57321,74302],[-87,276],[3,121]],[[59099,45126],[-157,177],[-177,100],[-111,99],[-116,150]],[[58388,46397],[-161,331],[-55,342]],[[58449,49909],[98,71],[304,-7],[566,45]],[[30523,76389],[-147,-351],[-47,-133]],[[30377,75084],[-133,11],[-205,-103]],[[29172,73738],[-61,30],[-91,148]],[[29077,73598],[69,-105],[5,-223]],[[28966,72994],[-142,225],[-33,491]],[[28797,73080],[-183,93],[191,-191]],[[27672,65472],[-83,-75],[-137,72]],[[27408,65728],[-105,136],[-148,508]],[[26747,68267],[-108,90],[-281,-268]],[[26309,68119],[-135,275],[-174,147]],[[25227,68491],[-114,-92],[50,-157]],[[24755,67801],[-207,312],[-242,-73]],[[16564,70932],[-71,95],[-33,324]],[[16460,71351],[-270,594],[-231,821],[10,137],[-123,195],[-215,495],[-38,482],[-148,323],[61,489],[-10,507],[-89,453],[109,557]],[[15516,76404],[34,536],[33,536]],[[15583,77476],[-50,792],[-88,506],[-80,274],[33,115],[402,-200],[148,-558]],[[15948,78405],[69,156],[-45,484],[-94,485]],[[10396,86079],[-385,-51],[-546,272]],[[8164,85656],[-308,-126],[-39,348]],[[7158,84934],[-299,-248],[-278,-180]],[[4985,85596],[50,216],[-179,211]],[[4541,89915],[-38,-296],[586,23]],[[4864,90008],[-342,225],[-197,296]],[[30102,56752],[-123,-344],[105,-468]],[[31762,56607],[213,-74],[155,185]],[[63521,58853],[-122,-33],[-83,35]],[[63153,58610],[-177,-114],[-233,-30]],[[62539,58233],[-43,-150],[-137,13]],[[64752,60417],[-201,-158]],[[57838,31217],[-210,-269],[-290,-229]],[[58175,37528],[113,-7],[134,-100],[94,71],[148,-59]],[[58409,41417],[-210,-81],[-159,-235],[-33,-205],[-100,-46],[-241,-486],[-154,-383],[-94,-13],[-90,68],[-311,65]]]} diff --git a/float-no-zero/examples/device-orientation-require.js b/float-no-zero/examples/device-orientation-require.js new file mode 100644 index 0000000000..762abf5972 --- /dev/null +++ b/float-no-zero/examples/device-orientation-require.js @@ -0,0 +1,6 @@ +goog.require('ol.DeviceOrientation'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.dom.Input'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/device-orientation.html b/float-no-zero/examples/device-orientation.html new file mode 100644 index 0000000000..192ae81066 --- /dev/null +++ b/float-no-zero/examples/device-orientation.html @@ -0,0 +1,58 @@ + + + + + + + + + + + Device-Orientation example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Device orientation example

+ +

α :

+

β :

+

γ :

+

heading :

+

Listen to DeviceOrientation events

+
+

See the device-orientation.js source to see how this is done.

+
+
orientation, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/device-orientation.js b/float-no-zero/examples/device-orientation.js new file mode 100644 index 0000000000..041c88c542 --- /dev/null +++ b/float-no-zero/examples/device-orientation.js @@ -0,0 +1,39 @@ +var view = new ol.View2D({ + center: [0, 0], + zoom: 2 +}); +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: view +}); + +var deviceOrientation = new ol.DeviceOrientation(); +var track = new ol.dom.Input(document.getElementById('track')); +track.bindTo('checked', deviceOrientation, 'tracking'); + +deviceOrientation.on('propertychange', function(event) { + // event.key is the changed property name + var element = document.getElementById(event.key); + if (element) { + element.innerHTML = deviceOrientation.get(event.key); + } +}); + +// tilt the map +deviceOrientation.on(['change:beta', 'change:gamma'], function(event) { + var center = view.getCenter(); + var resolution = view.getResolution(); + var beta = event.target.getBeta() || 0; + var gamma = event.target.getGamma() || 0; + + center[0] -= resolution * gamma * 25; + center[1] += resolution * beta * 25; + + view.setCenter(center); +}); diff --git a/float-no-zero/examples/drag-and-drop-image-vector-require.js b/float-no-zero/examples/drag-and-drop-image-vector-require.js new file mode 100644 index 0000000000..b0a4c95d9f --- /dev/null +++ b/float-no-zero/examples/drag-and-drop-image-vector-require.js @@ -0,0 +1,18 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.format.GPX'); +goog.require('ol.format.GeoJSON'); +goog.require('ol.format.IGC'); +goog.require('ol.format.KML'); +goog.require('ol.format.TopoJSON'); +goog.require('ol.interaction'); +goog.require('ol.interaction.DragAndDrop'); +goog.require('ol.layer.Image'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.BingMaps'); +goog.require('ol.source.ImageVector'); +goog.require('ol.source.Vector'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/drag-and-drop-image-vector.html b/float-no-zero/examples/drag-and-drop-image-vector.html new file mode 100644 index 0000000000..f813a0e88c --- /dev/null +++ b/float-no-zero/examples/drag-and-drop-image-vector.html @@ -0,0 +1,56 @@ + + + + + + + + + + + Drag-and-Drop image vector example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Drag-and-Drop image vector example

+

Example of using the drag-and-drop interaction with a ol.source.ImageVector. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client.

+
+

See the drag-and-drop-image-vector.js source to see how this is done.

+
+
drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, image
+
+
+
+   +
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/drag-and-drop-image-vector.js b/float-no-zero/examples/drag-and-drop-image-vector.js new file mode 100644 index 0000000000..cd5b275628 --- /dev/null +++ b/float-no-zero/examples/drag-and-drop-image-vector.js @@ -0,0 +1,134 @@ +var defaultStyle = { + 'Point': [new ol.style.Style({ + image: new ol.style.Circle({ + fill: new ol.style.Fill({ + color: 'rgba(255,255,0,0.5)' + }), + radius: 5, + stroke: new ol.style.Stroke({ + color: '#ff0', + width: 1 + }) + }) + })], + 'LineString': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#f00', + width: 3 + }) + })], + 'Polygon': [new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(0,255,255,0.5)' + }), + stroke: new ol.style.Stroke({ + color: '#0ff', + width: 1 + }) + })], + 'MultiPoint': [new ol.style.Style({ + image: new ol.style.Circle({ + fill: new ol.style.Fill({ + color: 'rgba(255,0,255,0.5)' + }), + radius: 5, + stroke: new ol.style.Stroke({ + color: '#f0f', + width: 1 + }) + }) + })], + 'MultiLineString': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#0f0', + width: 3 + }) + })], + 'MultiPolygon': [new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(0,0,255,0.5)' + }), + stroke: new ol.style.Stroke({ + color: '#00f', + width: 1 + }) + })] +}; + +var styleFunction = function(feature, resolution) { + var featureStyleFunction = feature.getStyleFunction(); + if (featureStyleFunction) { + return featureStyleFunction.call(feature, resolution); + } else { + return defaultStyle[feature.getGeometry().getType()]; + } +}; + +var dragAndDropInteraction = new ol.interaction.DragAndDrop({ + formatConstructors: [ + ol.format.GPX, + ol.format.GeoJSON, + ol.format.IGC, + ol.format.KML, + ol.format.TopoJSON + ] +}); + +var map = new ol.Map({ + interactions: ol.interaction.defaults().extend([dragAndDropInteraction]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.BingMaps({ + imagerySet: 'Aerial', + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3' + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +dragAndDropInteraction.on('addfeatures', function(event) { + var vectorSource = new ol.source.Vector({ + features: event.features, + projection: event.projection + }); + map.getLayers().push(new ol.layer.Image({ + source: new ol.source.ImageVector({ + source: vectorSource, + style: styleFunction + }) + })); + var view2D = map.getView().getView2D(); + view2D.fitExtent(vectorSource.getExtent(), map.getSize()); +}); + +var displayFeatureInfo = function(pixel) { + var features = []; + map.forEachFeatureAtPixel(pixel, function(feature, layer) { + features.push(feature); + }); + if (features.length > 0) { + var info = []; + var i, ii; + for (i = 0, ii = features.length; i < ii; ++i) { + info.push(features[i].get('name')); + } + document.getElementById('info').innerHTML = info.join(', ') || ' '; + } else { + document.getElementById('info').innerHTML = ' '; + } +}; + +$(map.getViewport()).on('mousemove', function(evt) { + var pixel = map.getEventPixel(evt.originalEvent); + displayFeatureInfo(pixel); +}); + +map.on('singleclick', function(evt) { + displayFeatureInfo(evt.pixel); +}); diff --git a/float-no-zero/examples/drag-and-drop-require.js b/float-no-zero/examples/drag-and-drop-require.js new file mode 100644 index 0000000000..c51fe2a759 --- /dev/null +++ b/float-no-zero/examples/drag-and-drop-require.js @@ -0,0 +1,17 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.format.GPX'); +goog.require('ol.format.GeoJSON'); +goog.require('ol.format.IGC'); +goog.require('ol.format.KML'); +goog.require('ol.format.TopoJSON'); +goog.require('ol.interaction'); +goog.require('ol.interaction.DragAndDrop'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.BingMaps'); +goog.require('ol.source.Vector'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/drag-and-drop.html b/float-no-zero/examples/drag-and-drop.html new file mode 100644 index 0000000000..df4ad8c5dc --- /dev/null +++ b/float-no-zero/examples/drag-and-drop.html @@ -0,0 +1,56 @@ + + + + + + + + + + + Drag-and-Drop example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Drag-and-Drop example

+

Example of using the drag-and-drop interaction. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map.

+
+

See the drag-and-drop.js source to see how this is done.

+
+
drag-and-drop, gpx, geojson, igc, kml, topojson
+
+
+
+   +
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/drag-and-drop.js b/float-no-zero/examples/drag-and-drop.js new file mode 100644 index 0000000000..3a3d646c87 --- /dev/null +++ b/float-no-zero/examples/drag-and-drop.js @@ -0,0 +1,132 @@ +var defaultStyle = { + 'Point': [new ol.style.Style({ + image: new ol.style.Circle({ + fill: new ol.style.Fill({ + color: 'rgba(255,255,0,0.5)' + }), + radius: 5, + stroke: new ol.style.Stroke({ + color: '#ff0', + width: 1 + }) + }) + })], + 'LineString': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#f00', + width: 3 + }) + })], + 'Polygon': [new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(0,255,255,0.5)' + }), + stroke: new ol.style.Stroke({ + color: '#0ff', + width: 1 + }) + })], + 'MultiPoint': [new ol.style.Style({ + image: new ol.style.Circle({ + fill: new ol.style.Fill({ + color: 'rgba(255,0,255,0.5)' + }), + radius: 5, + stroke: new ol.style.Stroke({ + color: '#f0f', + width: 1 + }) + }) + })], + 'MultiLineString': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#0f0', + width: 3 + }) + })], + 'MultiPolygon': [new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(0,0,255,0.5)' + }), + stroke: new ol.style.Stroke({ + color: '#00f', + width: 1 + }) + })] +}; + +var styleFunction = function(feature, resolution) { + var featureStyleFunction = feature.getStyleFunction(); + if (featureStyleFunction) { + return featureStyleFunction.call(feature, resolution); + } else { + return defaultStyle[feature.getGeometry().getType()]; + } +}; + +var dragAndDropInteraction = new ol.interaction.DragAndDrop({ + formatConstructors: [ + ol.format.GPX, + ol.format.GeoJSON, + ol.format.IGC, + ol.format.KML, + ol.format.TopoJSON + ] +}); + +var map = new ol.Map({ + interactions: ol.interaction.defaults().extend([dragAndDropInteraction]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.BingMaps({ + imagerySet: 'Aerial', + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3' + }) + }) + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +dragAndDropInteraction.on('addfeatures', function(event) { + var vectorSource = new ol.source.Vector({ + features: event.features, + projection: event.projection + }); + map.getLayers().push(new ol.layer.Vector({ + source: vectorSource, + style: styleFunction + })); + var view2D = map.getView().getView2D(); + view2D.fitExtent(vectorSource.getExtent(), map.getSize()); +}); + +var displayFeatureInfo = function(pixel) { + var features = []; + map.forEachFeatureAtPixel(pixel, function(feature, layer) { + features.push(feature); + }); + if (features.length > 0) { + var info = []; + var i, ii; + for (i = 0, ii = features.length; i < ii; ++i) { + info.push(features[i].get('name')); + } + document.getElementById('info').innerHTML = info.join(', ') || ' '; + } else { + document.getElementById('info').innerHTML = ' '; + } +}; + +$(map.getViewport()).on('mousemove', function(evt) { + var pixel = map.getEventPixel(evt.originalEvent); + displayFeatureInfo(pixel); +}); + +map.on('singleclick', function(evt) { + displayFeatureInfo(evt.pixel); +}); diff --git a/float-no-zero/examples/drag-rotate-and-zoom-require.js b/float-no-zero/examples/drag-rotate-and-zoom-require.js new file mode 100644 index 0000000000..b594f4d607 --- /dev/null +++ b/float-no-zero/examples/drag-rotate-and-zoom-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.interaction'); +goog.require('ol.interaction.DragRotateAndZoom'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.MapQuest'); diff --git a/float-no-zero/examples/drag-rotate-and-zoom.html b/float-no-zero/examples/drag-rotate-and-zoom.html new file mode 100644 index 0000000000..ebe543f794 --- /dev/null +++ b/float-no-zero/examples/drag-rotate-and-zoom.html @@ -0,0 +1,52 @@ + + + + + + + + + + + Drag rotate and zoom example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Drag rotate and zoom example

+

A single interaction to drag, rotate, and zoom.

+
+

Shift + Drag to rotate and zoom the map around its center.

+

See the drag-rotate-and-zoom.js source to see how this is done.

+
+
drag, rotate, zoom, interaction
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/drag-rotate-and-zoom.js b/float-no-zero/examples/drag-rotate-and-zoom.js new file mode 100644 index 0000000000..bece1b7bd2 --- /dev/null +++ b/float-no-zero/examples/drag-rotate-and-zoom.js @@ -0,0 +1,16 @@ +var map = new ol.Map({ + interactions: ol.interaction.defaults().extend([ + new ol.interaction.DragRotateAndZoom() + ]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/draw-features-require.js b/float-no-zero/examples/draw-features-require.js new file mode 100644 index 0000000000..bb7a5240e3 --- /dev/null +++ b/float-no-zero/examples/draw-features-require.js @@ -0,0 +1,12 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.interaction'); +goog.require('ol.interaction.Draw'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.MapQuest'); +goog.require('ol.source.Vector'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/draw-features.html b/float-no-zero/examples/draw-features.html new file mode 100644 index 0000000000..8a7014c428 --- /dev/null +++ b/float-no-zero/examples/draw-features.html @@ -0,0 +1,60 @@ + + + + + + + + + + + Draw features example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Draw features example

+

Example of using the ol.interaction.Draw interaction.

+
+ + +
+ +
+

See the draw-features.js source to see how this is done.

+
+
draw, edit, vector
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/draw-features.js b/float-no-zero/examples/draw-features.js new file mode 100644 index 0000000000..6e89aff8d9 --- /dev/null +++ b/float-no-zero/examples/draw-features.js @@ -0,0 +1,57 @@ +var raster = new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) +}); + +var source = new ol.source.Vector(); + +var vector = new ol.layer.Vector({ + source: source, + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255, 255, 255, 0.2)' + }), + stroke: new ol.style.Stroke({ + color: '#ffcc33', + width: 2 + }), + image: new ol.style.Circle({ + radius: 7, + fill: new ol.style.Fill({ + color: '#ffcc33' + }) + }) + }) +}); + +var map = new ol.Map({ + layers: [raster, vector], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [-11000000, 4600000], + zoom: 4 + }) +}); + +var typeSelect = document.getElementById('type'); + +var draw; // global so we can remove it later +function addInteraction() { + draw = new ol.interaction.Draw({ + source: source, + type: /** @type {ol.geom.GeometryType} */ (typeSelect.value) + }); + map.addInteraction(draw); +} + + +/** + * Let user change the geometry type. + * @param {Event} e Change event. + */ +typeSelect.onchange = function(e) { + map.removeInteraction(draw); + addInteraction(); +}; + +addInteraction(); diff --git a/float-no-zero/examples/dynamic-data-require.js b/float-no-zero/examples/dynamic-data-require.js new file mode 100644 index 0000000000..2d04b486fa --- /dev/null +++ b/float-no-zero/examples/dynamic-data-require.js @@ -0,0 +1,8 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.geom.MultiPoint'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.MapQuest'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); diff --git a/float-no-zero/examples/dynamic-data.html b/float-no-zero/examples/dynamic-data.html new file mode 100644 index 0000000000..86dfbcea3d --- /dev/null +++ b/float-no-zero/examples/dynamic-data.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Dynamic data example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Dynamic data example

+

Example of dynamic data.

+
+

See the dynamic-data.js source to see how this is done.

+
+
dynamic-data
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/dynamic-data.js b/float-no-zero/examples/dynamic-data.js new file mode 100644 index 0000000000..cb05a69786 --- /dev/null +++ b/float-no-zero/examples/dynamic-data.js @@ -0,0 +1,43 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }) + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +var imageStyle = new ol.style.Circle({ + radius: 5, + fill: new ol.style.Fill({color: 'yellow'}), + stroke: new ol.style.Stroke({color: 'red', width: 1}) +}); + +var n = 200; +var omegaTheta = 30000; // Rotation period in ms +var R = 7e6; +var r = 2e6; +var p = 2e6; +map.on('postcompose', function(event) { + var vectorContext = event.vectorContext; + var frameState = event.frameState; + var theta = 2 * Math.PI * frameState.time / omegaTheta; + var coordinates = []; + var i; + for (i = 0; i < n; ++i) { + var t = theta + 2 * Math.PI * i / n; + var x = (R + r) * Math.cos(t) + p * Math.cos((R + r) * t / r); + var y = (R + r) * Math.sin(t) + p * Math.sin((R + r) * t / r); + coordinates.push([x, y]); + } + vectorContext.setImageStyle(imageStyle); + vectorContext.drawMultiPointGeometry( + new ol.geom.MultiPoint(coordinates), null); + map.render(); +}); +map.render(); diff --git a/float-no-zero/examples/epsg-4326-require.js b/float-no-zero/examples/epsg-4326-require.js new file mode 100644 index 0000000000..aeebd3cae4 --- /dev/null +++ b/float-no-zero/examples/epsg-4326-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.control'); +goog.require('ol.control.ScaleLine'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.TileWMS'); diff --git a/float-no-zero/examples/epsg-4326.html b/float-no-zero/examples/epsg-4326.html new file mode 100644 index 0000000000..41e6fefcb9 --- /dev/null +++ b/float-no-zero/examples/epsg-4326.html @@ -0,0 +1,51 @@ + + + + + + + + + + + EPSG:4326 example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

EPSG:4326 example

+

Example of a map in EPSG:4326.

+
+

See the epsg-4326.js source to see how this is done.

+
+
epsg4326
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/epsg-4326.js b/float-no-zero/examples/epsg-4326.js new file mode 100644 index 0000000000..79886eb98b --- /dev/null +++ b/float-no-zero/examples/epsg-4326.js @@ -0,0 +1,29 @@ +var layers = [ + new ol.layer.Tile({ + source: new ol.source.TileWMS({ + url: 'http://vmap0.tiles.osgeo.org/wms/vmap0', + params: { + 'VERSION': '1.1.1', + 'LAYERS': 'basic', + 'FORMAT': 'image/jpeg' + } + }) + }) +]; + +var map = new ol.Map({ + controls: ol.control.defaults().extend([ + new ol.control.ScaleLine({ + units: 'degrees' + }) + ]), + layers: layers, + // The OSgeo server does not set cross origin headers, so we cannot use WebGL + renderer: ['canvas', 'dom'], + target: 'map', + view: new ol.View2D({ + projection: 'EPSG:4326', + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/example-list.js b/float-no-zero/examples/example-list.js new file mode 100644 index 0000000000..7422f9a197 --- /dev/null +++ b/float-no-zero/examples/example-list.js @@ -0,0 +1 @@ +var info={"index": {"parsing": {"66": 2}, "moveend": {"45": 2}, "code": {"9": 2, "12": 2}, "background": {"27": 1}, "geolocation": {"42": 1, "20": 3}, "api": {"51": 1}, "please": {"51": 1}, "over": {"36": 1}, "top": {"22": 1}, "dynamic": {"13": 3}, "feature": {"64": 1, "27": 1}, "openaerial": {"48": 1, "47": 1}, "getcapabilities": {"66": 3}, "manipulation": {"36": 1, "28": 1}, "selection": {"53": 1}, "openlayers": {"2": 1}, "same": {"27": 1, "55": 1}, "proj4js": {"67": 2}, "d3": {"7": 3}, "localized": {"38": 3}, "rtree": {"51": 1}, "layers": {"67": 1, "68": 1, "5": 1, "70": 1, "41": 1, "55": 1, "57": 2}, "current": {"41": 1}, "style": {"64": 1, "75": 1, "24": 1, "26": 1, "31": 1, "30": 1, "63": 1}, "group": {"35": 3}, "how": {"46": 1, "21": 1, "6": 1}, "wms": {"66": 3, "67": 3, "68": 3, "69": 3, "70": 3, "71": 3, "21": 2}, "show": {"41": 1}, "complex": {"27": 1}, "controls": {"75": 1, "46": 2, "6": 2}, "transparent": {"54": 3}, "to": {"2": 1, "70": 1, "6": 1, "8": 1, "9": 2, "10": 1, "11": 1, "46": 1, "48": 1, "21": 1, "22": 1, "26": 1, "27": 1, "28": 1, "61": 1, "30": 1, "53": 2}, "only": {"25": 1, "51": 1, "4": 1}, "animation": {"1": 2}, "projection": {"67": 3, "68": 2, "70": 3}, "input": {"2": 3, "35": 1}, "earthquakes": {"24": 1, "30": 1}, "tiles": {"73": 1, "5": 2}, "move": {"45": 1}, "attribution": {"38": 1}, "read": {"27": 1}, "rotated": {"50": 1}, "watercolor": {"57": 2}, "popover": {"47": 1}, "terrain": {"57": 2}, "five": {"27": 1}, "tiled": {"67": 2, "71": 2}, "base": {"57": 1, "38": 1, "22": 1}, "not": {"51": 2, "38": 1}, "using": {"32": 1, "65": 1, "67": 1, "70": 1, "7": 1, "9": 1, "10": 1, "43": 1, "12": 1, "53": 1, "73": 1, "23": 1, "26": 1}, "rotation": {"1": 1, "50": 2, "55": 1}, "unique": {"27": 1}, "fractal": {"16": 3}, "day": {"27": 1}, "zoomslider": {"75": 3}, "rotate": {"17": 3, "11": 3}, "imagevector": {"9": 1}, "semi": {"54": 2}, "brightness": {"4": 3}, "edit": {"43": 1, "12": 1}, "xyz": {"73": 3}, "drop": {"9": 4, "10": 4}, "zoom": {"64": 1, "1": 1, "11": 3, "75": 1, "17": 3, "27": 1}, "000": {"67": 2}, "server": {"38": 2}, "spy": {"36": 2}, "vector": {"64": 3, "51": 1, "65": 1, "9": 3, "43": 1, "12": 1, "63": 1, "16": 1, "19": 1, "53": 1, "24": 1, "26": 1, "59": 1, "60": 1, "29": 3, "30": 1, "31": 1}, "min": {"41": 1}, "each": {"9": 1}, "osm": {"65": 3}, "works": {"51": 1}, "side": {"55": 4}, "view": {"41": 1, "36": 1}, "accessible": {"0": 1}, "www": {"27": 1, "38": 2}, "google": {"22": 3}, "saturation": {"25": 3}, "timezones": {"31": 2}, "national": {"67": 1}, "707": {"27": 1}, "mapguide": {"39": 3}, "sync": {"55": 1}, "4326": {"14": 2}, "mapquest": {"40": 3, "48": 1, "54": 1, "47": 1}, "see": {"27": 1}, "popup": {"48": 3, "26": 1, "47": 1}, "export": {"15": 2}, "examples": {"51": 1}, "hosted": {"51": 1}, "wmts": {"72": 3}, "http": {"58": 1, "27": 1, "38": 3}, "click": {"21": 1}, "bootstrap": {"47": 1}, "fullscreen": {"42": 1}, "canvas": {"5": 2, "55": 3}, "preloading": {"49": 1}, "hide": {"41": 1}, "for": {"5": 1, "21": 1}, "overlay": {"48": 2, "64": 1, "38": 1, "47": 2}, "support": {"38": 1}, "demonstrates": {"1": 1, "2": 1, "47": 1, "24": 1, "63": 1, "30": 1, "31": 1}, "labels": {"64": 1, "57": 2}, "kml": {"32": 3, "9": 2, "10": 2, "24": 1, "30": 2, "31": 3}, "recorded": {"27": 1}, "integration": {"22": 1, "7": 1}, "polygons": {"53": 1}, "content": {"22": 1}, "outside": {"44": 1}, "heatmap": {"24": 3}, "various": {"75": 1}, "deviceorientation": {"8": 1}, "exporting": {"15": 1}, "it": {"51": 2}, "parks": {"67": 1}, "three": {"55": 1}, "contrast": {"4": 3}, "shows": {"46": 1, "21": 1, "6": 1}, "preload": {"49": 2}, "synthetic": {"59": 2, "60": 2}, "full": {"17": 3, "18": 3, "42": 2}, "untiled": {"39": 2}, "screen": {"17": 3, "18": 3, "42": 2}, "contain": {"27": 1}, "modify": {"43": 3}, "styling": {"75": 1}, "composed": {"57": 1}, "by": {"53": 1, "55": 2}, "xml": {"65": 3}, "topojson": {"9": 2, "10": 2, "63": 3}, "objects": {"2": 1}, "extent": {"46": 1}, "openseamap": {"38": 4}, "org": {"27": 1, "38": 3}, "epsg4326": {"14": 1}, "earthquake": {"30": 1}, "topology": {"63": 1}, "on": {"64": 1, "4": 1, "9": 2, "10": 1, "21": 1, "22": 1, "41": 1, "25": 1, "27": 1}, "ol": {"9": 1, "12": 1}, "geometry": {"27": 1}, "of": {"0": 1, "2": 1, "3": 1, "4": 1, "7": 1, "9": 1, "10": 1, "12": 1, "13": 1, "14": 1, "15": 1, "16": 1, "17": 1, "18": 1, "19": 1, "20": 1, "22": 1, "23": 1, "24": 1, "25": 1, "27": 2, "29": 1, "30": 1, "32": 1, "35": 1, "36": 1, "37": 1, "38": 1, "39": 1, "40": 1, "42": 1, "43": 1, "44": 1, "45": 1, "49": 1, "50": 1, "52": 1, "53": 1, "54": 1, "56": 1, "57": 1, "58": 1, "61": 1, "62": 1, "63": 1, "64": 1, "65": 1, "66": 1, "67": 1, "68": 1, "69": 1, "70": 1, "71": 1, "72": 1, "73": 1, "74": 1, "75": 1}, "tracks": {"27": 2}, "filter": {"28": 3}, "openstreetmap": {"33": 1, "2": 1, "5": 1, "38": 4, "8": 1, "44": 1, "34": 1, "15": 1, "50": 1, "19": 1, "20": 1, "56": 1, "52": 1, "61": 1, "37": 1}, "ol3": {"22": 2, "7": 1}, "unknown": {"70": 1}, "moving": {"61": 1}, "requests": {"21": 1}, "symbolize": {"26": 1}, "navigation": {"46": 3}, "or": {"9": 1, "10": 1}, "tabindex": {"0": 1}, "key": {"53": 1}, "control": {"4": 1, "6": 1, "75": 2, "44": 1, "46": 1, "17": 1, "18": 2, "22": 1, "25": 1}, "rendered": {"9": 1}, "features": {"43": 1, "19": 1, "12": 1, "53": 2, "63": 1}, "render": {"30": 1}, "point": {"26": 1}, "simple": {"56": 3}, "image": {"36": 1, "69": 3, "9": 4, "15": 1, "21": 1, "68": 3, "58": 3, "28": 2, "29": 3}, "cors": {"38": 3}, "clipping": {"33": 3, "34": 3}, "zoomify": {"74": 3}, "one": {"36": 1, "61": 1, "55": 3}, "rendering": {"63": 1, "31": 1}, "tilelayer": {"67": 1, "71": 1}, "href": {"58": 1, "27": 1, "38": 3}, "coordinates": {"27": 1, "5": 1}, "another": {"36": 1, "61": 1}, "marker": {"26": 1}, "apply": {"28": 1}, "total": {"27": 1}, "opencyclemap": {"27": 3, "38": 2}, "tilejson": {"35": 1, "62": 3, "54": 1}, "select": {"53": 4}, "esri": {"73": 3}, "use": {"24": 1, "45": 1, "30": 1}, "from": {"63": 1, "27": 3, "61": 1, "38": 1, "31": 1}, "com": {"58": 2}, "source": {"32": 1, "65": 1, "72": 1, "9": 1, "74": 1, "73": 1, "23": 1, "57": 1, "58": 1}, "css": {"75": 1}, "epsg": {"67": 1, "70": 1, "14": 2}, "create": {"48": 1, "6": 1}, "swipe": {"37": 3}, "two": {"57": 2, "2": 1, "67": 1, "68": 1, "70": 1}, "symbolizer": {"30": 1}, "custom": {"68": 1, "38": 2, "6": 3}, "pixelmap": {"67": 1}, "trigger": {"21": 1}, "gpx": {"9": 2, "10": 2, "23": 3}, "way": {"2": 1}, "countries": {"64": 1}, "listen": {"8": 1}, "files": {"9": 1, "10": 1}, "hue": {"25": 3}, "enable": {"38": 1}, "that": {"51": 1}, "clicking": {"53": 1}, "share": {"55": 1}, "levels": {"64": 1}, "locations": {"30": 1}, "slider": {"75": 1}, "interaction": {"43": 1, "9": 1, "10": 1, "11": 2, "12": 2, "53": 1}, "because": {"51": 1}, "21781": {"67": 1, "70": 1}, "gmaps": {"22": 1}, "getfeatureinfo": {"21": 3}, "line": {"52": 3}, "hold": {"53": 1}, "with": {"64": 1, "35": 1, "68": 1, "5": 1, "38": 2, "9": 1, "17": 1, "67": 1, "22": 2, "57": 1, "54": 1}, "png": {"15": 2}, "static": {"58": 3}, "target": {"61": 1}, "this": {"51": 2, "21": 1, "6": 1}, "points": {"60": 2}, "work": {"51": 1}, "tree": {"51": 3}, "as": {"22": 1, "15": 1}, "accesses": {"51": 1}, "paraglider": {"27": 1}, "xkcd": {"58": 3}, "headers": {"38": 1}, "r": {"51": 3}, "renders": {"5": 1}, "shape": {"30": 1}, "256": {"58": 2}, "shift": {"53": 1}, "locally": {"51": 1}, "animated": {"1": 1}, "example": {"0": 2, "1": 1, "2": 1, "3": 2, "4": 2, "5": 1, "6": 1, "7": 2, "8": 1, "9": 2, "10": 2, "11": 1, "12": 2, "13": 2, "14": 2, "15": 2, "16": 2, "17": 2, "18": 2, "19": 2, "20": 2, "21": 2, "22": 2, "23": 2, "25": 2, "26": 2, "27": 2, "28": 1, "29": 2, "32": 2, "33": 2, "34": 2, "35": 2, "36": 1, "37": 2, "38": 2, "39": 2, "40": 2, "41": 1, "42": 2, "43": 2, "44": 2, "45": 1, "46": 1, "47": 1, "48": 1, "49": 2, "50": 2, "51": 3, "52": 2, "53": 2, "54": 2, "55": 1, "56": 2, "57": 2, "58": 2, "59": 2, "60": 2, "61": 2, "62": 2, "63": 1, "64": 2, "65": 2, "66": 2, "67": 2, "68": 2, "69": 2, "70": 2, "71": 2, "72": 2, "73": 2, "74": 2, "75": 1}, "capabilities": {"66": 1}, "are": {"57": 1, "51": 2}, "and": {"64": 1, "1": 1, "67": 1, "38": 1, "7": 1, "9": 4, "10": 4, "11": 2, "17": 2, "55": 1}, "debugging": {"5": 1}, "layer": {"64": 2, "33": 2, "34": 2, "3": 1, "36": 2, "37": 2, "38": 1, "71": 1, "35": 2, "21": 1, "54": 2, "24": 1, "57": 1, "58": 1, "27": 1, "29": 1, "62": 1, "69": 1}, "flights": {"27": 1}, "orientation": {"8": 2}, "give": {"22": 1}, "is": {"9": 1, "27": 1, "70": 1, "38": 1, "51": 1}, "internals": {"51": 1}, "binding": {"2": 1}, "accessibility": {"0": 2}, "layergroup": {"35": 1}, "an": {"0": 1, "38": 1, "9": 1, "48": 1, "22": 1, "26": 1, "27": 1, "29": 1}, "single": {"11": 1, "68": 3, "69": 2}, "hover": {"64": 1}, "at": {"64": 1}, "file": {"9": 1, "27": 1}, "in": {"51": 1, "27": 1, "30": 1, "14": 1, "31": 1}, "1": {"67": 2}, "overlays": {"47": 1}, "mouse": {"44": 3}, "teleport": {"61": 2}, "end": {"45": 1}, "49": {"27": 1}, "country": {"64": 2}, "webgl": {"25": 2, "55": 2, "4": 2, "33": 3}, "when": {"51": 1}, "detail": {"27": 1}, "geojson": {"64": 1, "9": 2, "10": 2, "19": 3}, "event": {"45": 2}, "note": {"51": 1}, "maps": {"17": 1, "18": 1, "3": 3, "22": 1, "55": 1}, "html": {"2": 2}, "igc": {"9": 2, "10": 2, "27": 3}, "which": {"51": 1, "70": 1}, "tile": {"49": 1, "71": 1, "67": 1, "38": 2, "57": 1}, "events": {"8": 1}, "pan": {"1": 1}, "higher": {"64": 1}, "stamen": {"57": 3}, "map": {"0": 1, "61": 1, "35": 1, "37": 1, "38": 1, "39": 1, "40": 1, "9": 1, "10": 1, "44": 1, "45": 1, "14": 1, "15": 2, "50": 1, "20": 1, "22": 3, "56": 1, "54": 1, "42": 1}, "draw": {"12": 3}, "elements": {"2": 1}, "multiple": {"27": 1}, "users": {"22": 1}, "closest": {"27": 1}, "information": {"64": 1}, "max": {"41": 1}, "object": {"55": 1}, "effect": {"17": 1}, "drag": {"9": 4, "10": 4, "11": 3, "17": 3}, "scale": {"52": 3}, "uses": {"48": 1}, "exported": {"51": 1}, "position": {"44": 3}, "device": {"8": 1}, "data": {"51": 1, "13": 3}, "response": {"66": 1}, "structure": {"51": 1}, "icon": {"26": 3}, "a": {"3": 1, "9": 1, "11": 1, "14": 1, "15": 2, "16": 1, "18": 1, "20": 1, "21": 1, "22": 2, "24": 1, "26": 1, "27": 3, "28": 1, "30": 1, "35": 1, "36": 1, "37": 1, "38": 9, "39": 1, "40": 1, "42": 1, "44": 1, "48": 1, "50": 1, "52": 1, "54": 2, "56": 1, "57": 1, "58": 3, "61": 1, "62": 1, "63": 1, "64": 1, "66": 1, "69": 1, "71": 1, "72": 1, "73": 1, "74": 1}, "imagery": {"28": 1}, "center": {"55": 1}, "dom": {"55": 2}, "mobile": {"42": 2}, "bind": {"2": 2, "35": 1}, "bing": {"17": 2, "18": 2, "3": 4, "42": 1, "49": 1}, "depending": {"41": 1}, "lines": {"59": 2}, "together": {"7": 1}, "without": {"70": 1}, "more": {"27": 1}, "portion": {"36": 1}, "client": {"9": 1, "4": 1, "70": 2, "25": 1}, "does": {"51": 1, "38": 1}, "add": {"53": 1, "46": 1}, "maxresolution": {"41": 1}, "the": {"32": 1, "57": 2, "67": 1, "4": 1, "70": 2, "38": 2, "65": 1, "9": 3, "10": 2, "43": 1, "12": 1, "45": 1, "44": 1, "51": 3, "55": 2, "53": 3, "23": 1, "24": 1, "25": 1, "27": 3, "30": 1}, "resolution": {"41": 3, "55": 1}, "minresolution": {"41": 1}}, "examples": [{"author": "Tom Payne", "tags": "accessibility, tabindex", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "accessible.html", "shortdesc": "Example of an accessible map.", "title": "Accessibility example", "example": "accessible.html"}, {"author": "Tom Payne", "tags": "animation", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "animation.html", "shortdesc": "Demonstrates animated pan, zoom, and rotation.", "title": "Animation example", "example": "animation.html"}, {"author": "Tom Payne", "tags": "input, bind, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "bind-input.html", "shortdesc": "Demonstrates two-way binding of HTML input elements to OpenLayers objects.", "title": "Bind HTML input example", "example": "bind-input.html"}, {"author": "Tom Payne", "tags": "bing, bing-maps", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "bing-maps.html", "shortdesc": "Example of a Bing Maps layer.", "title": "Bing Maps example", "example": "bing-maps.html"}, {"author": "Tom Payne", "tags": "brightness, contrast, webgl", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "brightness-contrast.html", "shortdesc": "Example of brightness/contrast control on the client (WebGL only).", "title": "Brightness/contrast example", "example": "brightness-contrast.html"}, {"author": "Tom Payne", "tags": "layers, openstreetmap, canvas", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "canvas-tiles.html", "shortdesc": "Renders tiles with coordinates for debugging.", "title": "Canvas tiles example", "example": "canvas-tiles.html"}, {"author": "Tom Payne", "tags": "custom, control", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "custom-controls.html", "shortdesc": "This example shows how to create custom controls.", "title": "Custom controls", "example": "custom-controls.html"}, {"author": "Tim Schaub", "tags": "d3", "modified": "2014-02-21T18:45:46-0700", "classes": [], "link": "d3.html", "shortdesc": "Example of using ol3 and d3 together.", "title": "d3 integration example", "example": "d3.html"}, {"author": "Tom Payne", "tags": "orientation, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "device-orientation.html", "shortdesc": "Listen to DeviceOrientation events", "title": "Device orientation example", "example": "device-orientation.html"}, {"author": "Tom Payne", "tags": "drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, image", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "drag-and-drop-image-vector.html", "shortdesc": "Example of using the drag-and-drop interaction with a ol.source.ImageVector. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client.", "title": "Drag-and-Drop image vector example", "example": "drag-and-drop-image-vector.html"}, {"author": "Tom Payne", "tags": "drag-and-drop, gpx, geojson, igc, kml, topojson", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "drag-and-drop.html", "shortdesc": "Example of using the drag-and-drop interaction. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map.", "title": "Drag-and-Drop example", "example": "drag-and-drop.html"}, {"author": "Tom Payne", "tags": "drag, rotate, zoom, interaction", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "drag-rotate-and-zoom.html", "shortdesc": "A single interaction to drag, rotate, and zoom.", "title": "Drag rotate and zoom example", "example": "drag-rotate-and-zoom.html"}, {"author": "Tom Payne", "tags": "draw, edit, vector", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "draw-features.html", "shortdesc": "Example of using the ol.interaction.Draw interaction.", "title": "Draw features example", "example": "draw-features.html"}, {"author": "Tom Payne", "tags": "dynamic-data", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "dynamic-data.html", "shortdesc": "Example of dynamic data.", "title": "Dynamic data example", "example": "dynamic-data.html"}, {"author": "Tom Payne", "tags": "epsg4326", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "epsg-4326.html", "shortdesc": "Example of a map in EPSG:4326.", "title": "EPSG:4326 example", "example": "epsg-4326.html"}, {"author": "Tom Payne", "tags": "export, png, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "export-map.html", "shortdesc": "Example of exporting a map as a PNG image.", "title": "Export map example", "example": "export-map.html"}, {"author": "Tim Schaub", "tags": "fractal, vector", "modified": "2014-02-21T17:48:17-0700", "classes": [], "link": "fractal.html", "shortdesc": "Example of a fractal.", "title": "Fractal Example", "example": "fractal.html"}, {"author": "Tom Payne", "tags": "full-screen, drag, rotate, zoom, bing, bing-maps", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "full-screen-drag-rotate-and-zoom.html", "shortdesc": "Example of drag rotate and zoom control with full screen effect.", "title": "Full screen drag rotate and zoom example", "example": "full-screen-drag-rotate-and-zoom.html"}, {"author": "Frederic Junod", "tags": "full-screen, bing, bing-maps", "modified": "2014-02-26T15:18:14+0100", "classes": [], "link": "full-screen.html", "shortdesc": "Example of a full screen control.", "title": "Full screen control example", "example": "full-screen.html"}, {"author": "Tom Payne", "tags": "geojson, vector, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "geojson.html", "shortdesc": "Example of GeoJSON features.", "title": "GeoJSON example", "example": "geojson.html"}, {"author": "Tom Payne", "tags": "geolocation, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "geolocation.html", "shortdesc": "Example of a geolocation map.", "title": "Geolocation example", "example": "geolocation.html"}, {"author": "Tom Payne", "tags": "getfeatureinfo", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "getfeatureinfo.html", "shortdesc": "This example shows how to trigger WMS GetFeatureInfo requests on click for a WMS image layer.", "title": "GetFeatureInfo example", "example": "getfeatureinfo.html"}, {"author": "ahocevar", "tags": "google", "modified": "2014-03-02T15:56:21+0100", "classes": [], "link": "google-map.html", "shortdesc": "Example of a GMaps map with an ol3 map as control, to give users a Google base map with ol3 content on top.", "title": "Google Maps integration example", "example": "google-map.html"}, {"author": "Tom Payne", "tags": "GPX", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "gpx.html", "shortdesc": "Example of using the GPX source.", "title": "GPX example", "example": "gpx.html"}, {"author": "Frederic Junod", "tags": "heatmap, kml, vector, style", "modified": "2014-02-19T12:06:13+0100", "classes": [], "link": "heatmap-earthquakes.html", "shortdesc": "Demonstrates the use of a heatmap layer.", "title": "Earthquakes heatmap", "example": "heatmap-earthquakes.html"}, {"author": "Tom Payne", "tags": "hue, saturation, webgl", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "hue-saturation.html", "shortdesc": "Example of hue/saturation control on the client (WebGL only).", "title": "Hue/saturation example", "example": "hue-saturation.html"}, {"author": "Tom Payne", "tags": "vector, style, icon, marker, popup", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "icon.html", "shortdesc": "Example using an icon to symbolize a point.", "title": "Icon example", "example": "icon.html"}, {"author": "Frederic Junod", "tags": "complex-geometry, closest-feature, igc, opencyclemap", "modified": "2014-02-28T10:25:19+0100", "classes": [], "link": "igc.html", "shortdesc": "Example of tracks recorded from multiple paraglider flights on the same day, read from an IGC file. The five tracks contain a total of 49,707 unique coordinates. Zoom in to see more detail. The background layer is from OpenCycleMap.", "title": "IGC example", "example": "igc.html"}, {"author": "Tim Schaub", "tags": "filter, image manipulation", "modified": "2014-03-01T17:44:43-0700", "classes": [], "link": "image-filter.html", "shortdesc": "Apply a filter to imagery", "title": "Image filter example", "example": "image-filter.html"}, {"author": "Tom Payne", "tags": "vector, image", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "image-vector-layer.html", "shortdesc": "Example of an image vector layer.", "title": "Image vector example", "example": "image-vector-layer.html"}, {"author": "Tom Payne", "tags": "KML, vector, style", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "kml-earthquakes.html", "shortdesc": "Demonstrates the use of a Shape symbolizer to render earthquake locations.", "title": "Earthquakes in KML", "example": "kml-earthquakes.html"}, {"author": "Tom Payne", "tags": "KML, vector, style", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "kml-timezones.html", "shortdesc": "Demonstrates rendering timezones from KML.", "title": "Timezones in KML", "example": "kml-timezones.html"}, {"author": "Tom Payne", "tags": "KML", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "kml.html", "shortdesc": "Example of using the KML source.", "title": "KML example", "example": "kml.html"}, {"author": "Tim Schaub", "tags": "clipping, webgl, openstreetmap", "modified": "2014-02-21T18:45:46-0700", "classes": [], "link": "layer-clipping-webgl.html", "shortdesc": "Layer WebGL clipping example.", "title": "Layer WebGL clipping example", "example": "layer-clipping-webgl.html"}, {"author": "Tom Payne", "tags": "clipping, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "layer-clipping.html", "shortdesc": "Layer clipping example.", "title": "Layer clipping example", "example": "layer-clipping.html"}, {"author": "Tom Payne", "tags": "tilejson, input, bind, group, layergroup", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "layer-group.html", "shortdesc": "Example of a map with layer group.", "title": "Layer group example", "example": "layer-group.html"}, {"author": "Tom Payne", "tags": "spy, image manipulation", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "layer-spy.html", "shortdesc": "View a portion of one layer over another", "title": "Layer spy example", "example": "layer-spy.html"}, {"author": "Tom Payne", "tags": "swipe, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "layer-swipe.html", "shortdesc": "Example of a Layer swipe map.", "title": "Layer Swipe example", "example": "layer-swipe.html"}, {"author": "Tom Payne", "tags": "cors, localized-openstreetmap, openseamap, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "localized-openstreetmap.html", "shortdesc": "Example of a localized OpenStreetMap map with a custom tile server and a custom attribution. The base layer is OpenCycleMap with an overlay from OpenSeaMap. The OpenSeaMap tile server does not support CORS headers.", "title": "Localized OpenStreetMap example", "example": "localized-openstreetmap.html"}, {"author": "Tom Payne", "tags": "mapguide", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "mapguide-untiled.html", "shortdesc": "Example of a untiled MapGuide map.", "title": "MapGuide untiled example", "example": "mapguide-untiled.html"}, {"author": "Tom Payne", "tags": "mapquest", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "mapquest.html", "shortdesc": "Example of a MapQuest map.", "title": "MapQuest example", "example": "mapquest.html"}, {"author": "Tim Schaub", "tags": "minResolution, maxResolution, resolution", "modified": "2014-02-21T18:45:46-0700", "classes": [], "link": "min-max-resolution.html", "shortdesc": "Show/hide layers depending on current view resolution.", "title": "Min/max resolution example", "example": "min-max-resolution.html"}, {"author": "Antoine Abt", "tags": "fullscreen, bing, geolocation, mobile", "modified": "2014-02-13T16:50:49+0100", "classes": [], "link": "mobile-full-screen.html", "shortdesc": "Example of a full screen map.", "title": "Mobile full screen example", "example": "mobile-full-screen.html"}, {"author": "ahocevar", "tags": "modify, edit, vector", "modified": "2014-03-06T22:43:10+0100", "classes": [], "link": "modify-features.html", "shortdesc": "Example of using the Modify interaction.", "title": "Modify features example", "example": "modify-features.html"}, {"author": "Tom Payne", "tags": "mouse-position, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "mouse-position.html", "shortdesc": "Example of a mouse position control, outside the map.", "title": "Mouse position example", "example": "mouse-position.html"}, {"author": "Tom Payne", "tags": "moveend, map, event", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "moveend.html", "shortdesc": "Use of the moveend event.", "title": "Move end example", "example": "moveend.html"}, {"author": "Tom Payne", "tags": "control, navigation, extent", "modified": "2014-02-26T17:58:43+0100", "classes": ["ol.control.Zoom "], "link": "navigation-controls.html", "shortdesc": "Shows how to add navigation controls.", "title": "Navigation controls example", "example": "navigation-controls.html"}, {"author": "Tom Payne", "tags": "overlay, popup, bootstrap, popover, mapquest, openaerial", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "overlay.html", "shortdesc": "Demonstrates overlays.", "title": "Overlay example", "example": "overlay.html"}, {"author": "Tom Payne", "tags": "overlay, popup, mapquest, openaerial", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "popup.html", "shortdesc": "Uses an overlay to create a popup.", "title": "Popup example", "example": "popup.html"}, {"author": "Tom Payne", "tags": "preload, bing", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "preload.html", "shortdesc": "Example of tile preloading.", "title": "Preload example", "example": "preload.html"}, {"author": "Tom Payne", "tags": "rotation, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "rotation.html", "shortdesc": "Example of a rotated map.", "title": "Rotation example", "example": "rotation.html"}, {"author": "Tim Schaub", "tags": "vector, rtree", "modified": "2014-02-21T18:45:46-0700", "classes": [], "link": "rtree.html", "shortdesc": "R-Tree example. Please note that this example only works locally, it does not work when the examples are hosted. This is because it accesses internals the R-Tree data structure, which are not exported in the API.", "title": "R-Tree example", "example": "rtree.html"}, {"author": "Tom Payne", "tags": "scale-line, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "scale-line.html", "shortdesc": "Example of a scale line.", "title": "Scale line example", "example": "scale-line.html"}, {"author": "Tom Payne", "tags": "select, vector", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "select-features.html", "shortdesc": "Example of using the Select interaction. Select features by clicking polygons. Hold the Shift-key to add to the selection.", "title": "Select features example", "example": "select-features.html"}, {"author": "Tom Payne", "tags": "transparent, mapquest, tilejson", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "semi-transparent-layer.html", "shortdesc": "Example of a map with a semi-transparent layer.", "title": "Semi-transparent layer example", "example": "semi-transparent-layer.html"}, {"author": "Tom Payne", "tags": "side-by-side, canvas, webgl, dom, canvas, sync, object", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "side-by-side.html", "shortdesc": "The three maps, one WebGL, one Canvas, one DOM, share the same center, resolution, rotation and layers.", "title": "Side-by-side example", "example": "side-by-side.html"}, {"author": "Tom Payne", "tags": "simple, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "simple.html", "shortdesc": "Example of a simple map.", "title": "Simple example", "example": "simple.html"}, {"author": "Tom Payne", "tags": "stamen, watercolor, terrain-labels, two-layers", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "stamen.html", "shortdesc": "Example of a Stamen tile source. Two layers are composed: the watercolor base layer with the terrain labels.", "title": "Stamen example", "example": "stamen.html"}, {"author": "Tom Payne", "tags": "static image, xkcd", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "static-image.html", "shortdesc": "Example of a static image layer. Source: xkcd.com/256/", "title": "Static image example", "example": "static-image.html"}, {"author": "Tim Schaub", "tags": "vector", "modified": "2014-02-21T18:45:46-0700", "classes": [], "link": "synthetic-lines.html", "shortdesc": "Synthetic lines example.", "title": "Synthetic lines example", "example": "synthetic-lines.html"}, {"author": "Tim Schaub", "tags": "vector", "modified": "2014-02-21T18:45:46-0700", "classes": [], "link": "synthetic-points.html", "shortdesc": "Synthetic points example.", "title": "Synthetic points example", "example": "synthetic-points.html"}, {"author": "Tom Payne", "tags": "teleport, openstreetmap", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "teleport.html", "shortdesc": "Example of moving a map from one target to another.", "title": "Teleport example", "example": "teleport.html"}, {"author": "Tom Payne", "tags": "tilejson", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "tilejson.html", "shortdesc": "Example of a TileJSON layer.", "title": "TileJSON example", "example": "tilejson.html"}, {"author": "Tom Payne", "tags": "vector, topojson, style", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "topojson.html", "shortdesc": "Demonstrates rendering of features from a TopoJSON topology.", "title": "TopoJSON example", "example": "topojson.html"}, {"author": "Tom Payne", "tags": "vector, geojson, style, feature overlay", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "vector-layer.html", "shortdesc": "Example of a countries vector layer with country information on hover and country labels at higher zoom levels.", "title": "Vector layer example", "example": "vector-layer.html"}, {"author": "Frederic Junod", "tags": "vector, osm, xml", "modified": "2014-01-20T17:16:03+0100", "classes": [], "link": "vector-osm.html", "shortdesc": "Example of using the OSM XML source.", "title": "OSM XML example", "example": "vector-osm.html"}, {"author": "Tom Payne", "tags": "wms, capabilities, getcapabilities", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "wms-capabilities.html", "shortdesc": "Example of parsing a WMS GetCapabilities response.", "title": "WMS GetCapabilities parsing example", "example": "wms-capabilities.html"}, {"author": "Tom Payne", "tags": "wms, tile, tilelayer, proj4js, projection", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "wms-custom-proj.html", "shortdesc": "Example of two tiled WMS layers (Pixelmap 1:1'000'000 and national parks) using the projection EPSG:21781.", "title": "Tiled WMS with Proj4js projection example", "example": "wms-custom-proj.html"}, {"author": "Tom Payne", "tags": "wms, single image, projection", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "wms-image-custom-proj.html", "shortdesc": "Example of two single image WMS layers.", "title": "Single image WMS with custom projection example", "example": "wms-image-custom-proj.html"}, {"author": "Tom Payne", "tags": "wms, image", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "wms-image.html", "shortdesc": "Example of a single image WMS layer.", "title": "Single image WMS example", "example": "wms-image.html"}, {"author": "Tom Payne", "tags": "wms, projection", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "wms-no-proj.html", "shortdesc": "Example of two WMS layers using the projection EPSG:21781, which is unknown to the client.", "title": "WMS without client projection example", "example": "wms-no-proj.html"}, {"author": "Tom Payne", "tags": "wms, tile, tilelayer", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "wms-tiled.html", "shortdesc": "Example of a tiled WMS layer.", "title": "Tiled WMS example", "example": "wms-tiled.html"}, {"author": "Tom Payne", "tags": "wmts", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "wmts.html", "shortdesc": "Example of a WMTS source.", "title": "WMTS example", "example": "wmts.html"}, {"author": "Tom Payne", "tags": "xyz, esri", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "xyz-esri.html", "shortdesc": "Example of a XYZ source using Esri tiles.", "title": "XYZ Esri example", "example": "xyz-esri.html"}, {"author": "Tom Payne", "tags": "zoomify", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "zoomify.html", "shortdesc": "Example of a Zoomify source.", "title": "Zoomify example", "example": "zoomify.html"}, {"author": "Tom Payne", "tags": "zoom, zoomslider, slider, style, styling, css, control", "modified": "2014-02-26T17:58:43+0100", "classes": [], "link": "zoomslider.html", "shortdesc": "Example of various ZoomSlider controls.", "title": "ZoomSlider control", "example": "zoomslider.html"}]}; \ No newline at end of file diff --git a/float-no-zero/examples/example-list.xml b/float-no-zero/examples/example-list.xml new file mode 100644 index 0000000000..f0789c975e --- /dev/null +++ b/float-no-zero/examples/example-list.xml @@ -0,0 +1 @@ +OpenLayers Exampleshttp://openlayers.github.io/ol3/master/examples/example-list.xml#2014-03-07T09:54:05Z2014-03-07T09:54:05ZModify features examplemodify, edit, vectorExample of using the Modify interaction.2014-03-06T22:43:10+0100ahocevarhttp://openlayers.github.io/ol3/master/examples/modify-features.html#2014-03-06T22:43:10+0100Google Maps integration examplegoogleExample of a GMaps map with an ol3 map as control, to give users a Google base map with ol3 content on top.2014-03-02T15:56:21+0100ahocevarhttp://openlayers.github.io/ol3/master/examples/google-map.html#2014-03-02T15:56:21+0100Image filter examplefilter, image manipulationApply a filter to imagery2014-03-01T17:44:43-0700Tim Schaubhttp://openlayers.github.io/ol3/master/examples/image-filter.html#2014-03-01T17:44:43-0700IGC examplecomplex-geometry, closest-feature, igc, opencyclemapExample of tracks recorded from multiple paraglider flights on the same day, read from an IGC file. The five tracks contain a total of 49,707 unique coordinates. Zoom in to see more detail. The background layer is from <a href="http://www.opencyclemap.org/">OpenCycleMap</a>.2014-02-28T10:25:19+0100Frederic Junodhttp://openlayers.github.io/ol3/master/examples/igc.html#2014-02-28T10:25:19+0100Accessibility exampleaccessibility, tabindexExample of an accessible map.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/accessible.html#2014-02-26T17:58:43+0100Animation exampleanimationDemonstrates animated pan, zoom, and rotation.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/animation.html#2014-02-26T17:58:43+0100Bind HTML input exampleinput, bind, openstreetmapDemonstrates two-way binding of HTML input elements to OpenLayers objects.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/bind-input.html#2014-02-26T17:58:43+0100Bing Maps examplebing, bing-mapsExample of a Bing Maps layer.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/bing-maps.html#2014-02-26T17:58:43+0100Brightness/contrast examplebrightness, contrast, webglExample of brightness/contrast control on the client (WebGL only).2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/brightness-contrast.html#2014-02-26T17:58:43+0100Canvas tiles examplelayers, openstreetmap, canvasRenders tiles with coordinates for debugging.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/canvas-tiles.html#2014-02-26T17:58:43+0100Custom controlscustom, controlThis example shows how to create custom controls.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/custom-controls.html#2014-02-26T17:58:43+0100Device orientation exampleorientation, openstreetmapListen to DeviceOrientation events2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/device-orientation.html#2014-02-26T17:58:43+0100Drag-and-Drop image vector exampledrag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, imageExample of using the drag-and-drop interaction with a <code>ol.source.ImageVector</code>. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/drag-and-drop-image-vector.html#2014-02-26T17:58:43+0100Drag-and-Drop exampledrag-and-drop, gpx, geojson, igc, kml, topojsonExample of using the drag-and-drop interaction. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/drag-and-drop.html#2014-02-26T17:58:43+0100Drag rotate and zoom exampledrag, rotate, zoom, interactionA single interaction to drag, rotate, and zoom.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/drag-rotate-and-zoom.html#2014-02-26T17:58:43+0100Draw features exampledraw, edit, vectorExample of using the <code>ol.interaction.Draw</code> interaction.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/draw-features.html#2014-02-26T17:58:43+0100Dynamic data exampledynamic-dataExample of dynamic data.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/dynamic-data.html#2014-02-26T17:58:43+0100EPSG:4326 exampleepsg4326Example of a map in EPSG:4326.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/epsg-4326.html#2014-02-26T17:58:43+0100Export map exampleexport, png, openstreetmapExample of exporting a map as a PNG image.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/export-map.html#2014-02-26T17:58:43+0100Full screen drag rotate and zoom examplefull-screen, drag, rotate, zoom, bing, bing-mapsExample of drag rotate and zoom control with full screen effect.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/full-screen-drag-rotate-and-zoom.html#2014-02-26T17:58:43+0100GeoJSON examplegeojson, vector, openstreetmapExample of GeoJSON features.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/geojson.html#2014-02-26T17:58:43+0100Geolocation examplegeolocation, openstreetmapExample of a geolocation map.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/geolocation.html#2014-02-26T17:58:43+0100GetFeatureInfo examplegetfeatureinfoThis example shows how to trigger WMS GetFeatureInfo requests on click for a WMS image layer.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/getfeatureinfo.html#2014-02-26T17:58:43+0100GPX exampleGPXExample of using the GPX source.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/gpx.html#2014-02-26T17:58:43+0100Hue/saturation examplehue, saturation, webglExample of hue/saturation control on the client (WebGL only).2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/hue-saturation.html#2014-02-26T17:58:43+0100Icon examplevector, style, icon, marker, popupExample using an icon to symbolize a point.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/icon.html#2014-02-26T17:58:43+0100Image vector examplevector, imageExample of an image vector layer.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/image-vector-layer.html#2014-02-26T17:58:43+0100Earthquakes in KMLKML, vector, styleDemonstrates the use of a Shape symbolizer to render earthquake locations.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/kml-earthquakes.html#2014-02-26T17:58:43+0100Timezones in KMLKML, vector, styleDemonstrates rendering timezones from KML.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/kml-timezones.html#2014-02-26T17:58:43+0100KML exampleKMLExample of using the KML source.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/kml.html#2014-02-26T17:58:43+0100Layer clipping exampleclipping, openstreetmapLayer clipping example.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/layer-clipping.html#2014-02-26T17:58:43+0100Layer group exampletilejson, input, bind, group, layergroupExample of a map with layer group.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/layer-group.html#2014-02-26T17:58:43+0100Layer spy examplespy, image manipulationView a portion of one layer over another2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/layer-spy.html#2014-02-26T17:58:43+0100Layer Swipe exampleswipe, openstreetmapExample of a Layer swipe map.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/layer-swipe.html#2014-02-26T17:58:43+0100Localized OpenStreetMap examplecors, localized-openstreetmap, openseamap, openstreetmapExample of a localized OpenStreetMap map with a custom tile server and a custom attribution. The base layer is <a href="http://www.opencyclemap.org/">OpenCycleMap</a> with an overlay from <a href="http://www.openseamap.org/">OpenSeaMap</a>. The OpenSeaMap tile server does not support <a href="http://enable-cors.org/">CORS</a> headers.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/localized-openstreetmap.html#2014-02-26T17:58:43+0100MapGuide untiled examplemapguideExample of a untiled MapGuide map.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/mapguide-untiled.html#2014-02-26T17:58:43+0100MapQuest examplemapquestExample of a MapQuest map.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/mapquest.html#2014-02-26T17:58:43+0100Mouse position examplemouse-position, openstreetmapExample of a mouse position control, outside the map.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/mouse-position.html#2014-02-26T17:58:43+0100Move end examplemoveend, map, eventUse of the moveend event.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/moveend.html#2014-02-26T17:58:43+0100Navigation controls examplecontrol, navigation, extentShows how to add navigation controls.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/navigation-controls.html#2014-02-26T17:58:43+0100Overlay exampleoverlay, popup, bootstrap, popover, mapquest, openaerialDemonstrates overlays.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/overlay.html#2014-02-26T17:58:43+0100Popup exampleoverlay, popup, mapquest, openaerialUses an overlay to create a popup.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/popup.html#2014-02-26T17:58:43+0100Preload examplepreload, bingExample of tile preloading.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/preload.html#2014-02-26T17:58:43+0100Rotation examplerotation, openstreetmapExample of a rotated map.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/rotation.html#2014-02-26T17:58:43+0100Scale line examplescale-line, openstreetmapExample of a scale line.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/scale-line.html#2014-02-26T17:58:43+0100Select features exampleselect, vectorExample of using the Select interaction. Select features by clicking polygons. Hold the Shift-key to add to the selection.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/select-features.html#2014-02-26T17:58:43+0100Semi-transparent layer exampletransparent, mapquest, tilejsonExample of a map with a semi-transparent layer.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/semi-transparent-layer.html#2014-02-26T17:58:43+0100Side-by-side exampleside-by-side, canvas, webgl, dom, canvas, sync, objectThe three maps, one WebGL, one Canvas, one DOM, share the same center, resolution, rotation and layers.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/side-by-side.html#2014-02-26T17:58:43+0100Simple examplesimple, openstreetmapExample of a simple map.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/simple.html#2014-02-26T17:58:43+0100Stamen examplestamen, watercolor, terrain-labels, two-layersExample of a Stamen tile source. Two layers are composed: the watercolor base layer with the terrain labels.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/stamen.html#2014-02-26T17:58:43+0100Static image examplestatic image, xkcdExample of a static image layer. Source: <a href="http://xkcd.com/256/">xkcd.com/256/</a>2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/static-image.html#2014-02-26T17:58:43+0100Teleport exampleteleport, openstreetmapExample of moving a map from one target to another.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/teleport.html#2014-02-26T17:58:43+0100TileJSON exampletilejsonExample of a TileJSON layer.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/tilejson.html#2014-02-26T17:58:43+0100TopoJSON examplevector, topojson, styleDemonstrates rendering of features from a TopoJSON topology.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/topojson.html#2014-02-26T17:58:43+0100Vector layer examplevector, geojson, style, feature overlayExample of a countries vector layer with country information on hover and country labels at higher zoom levels.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/vector-layer.html#2014-02-26T17:58:43+0100WMS GetCapabilities parsing examplewms, capabilities, getcapabilitiesExample of parsing a WMS GetCapabilities response.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/wms-capabilities.html#2014-02-26T17:58:43+0100Tiled WMS with Proj4js projection examplewms, tile, tilelayer, proj4js, projectionExample of two tiled WMS layers (Pixelmap 1:1'000'000 and national parks) using the projection EPSG:21781.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/wms-custom-proj.html#2014-02-26T17:58:43+0100Single image WMS with custom projection examplewms, single image, projectionExample of two single image WMS layers.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/wms-image-custom-proj.html#2014-02-26T17:58:43+0100Single image WMS examplewms, imageExample of a single image WMS layer.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/wms-image.html#2014-02-26T17:58:43+0100WMS without client projection examplewms, projectionExample of two WMS layers using the projection EPSG:21781, which is unknown to the client.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/wms-no-proj.html#2014-02-26T17:58:43+0100Tiled WMS examplewms, tile, tilelayerExample of a tiled WMS layer.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/wms-tiled.html#2014-02-26T17:58:43+0100WMTS examplewmtsExample of a WMTS source.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/wmts.html#2014-02-26T17:58:43+0100XYZ Esri examplexyz, esriExample of a XYZ source using Esri tiles.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/xyz-esri.html#2014-02-26T17:58:43+0100Zoomify examplezoomifyExample of a Zoomify source.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/zoomify.html#2014-02-26T17:58:43+0100ZoomSlider controlzoom, zoomslider, slider, style, styling, css, controlExample of various ZoomSlider controls.2014-02-26T17:58:43+0100Tom Paynehttp://openlayers.github.io/ol3/master/examples/zoomslider.html#2014-02-26T17:58:43+0100Full screen control examplefull-screen, bing, bing-mapsExample of a full screen control.2014-02-26T15:18:14+0100Frederic Junodhttp://openlayers.github.io/ol3/master/examples/full-screen.html#2014-02-26T15:18:14+0100d3 integration exampled3Example of using ol3 and d3 together.2014-02-21T18:45:46-0700Tim Schaubhttp://openlayers.github.io/ol3/master/examples/d3.html#2014-02-21T18:45:46-0700Layer WebGL clipping exampleclipping, webgl, openstreetmapLayer WebGL clipping example.2014-02-21T18:45:46-0700Tim Schaubhttp://openlayers.github.io/ol3/master/examples/layer-clipping-webgl.html#2014-02-21T18:45:46-0700Min/max resolution exampleminResolution, maxResolution, resolutionShow/hide layers depending on current view resolution.2014-02-21T18:45:46-0700Tim Schaubhttp://openlayers.github.io/ol3/master/examples/min-max-resolution.html#2014-02-21T18:45:46-0700R-Tree examplevector, rtreeR-Tree example. Please note that this example only works locally, it does not work when the examples are hosted. This is because it accesses internals the R-Tree data structure, which are not exported in the API.2014-02-21T18:45:46-0700Tim Schaubhttp://openlayers.github.io/ol3/master/examples/rtree.html#2014-02-21T18:45:46-0700Synthetic lines examplevectorSynthetic lines example.2014-02-21T18:45:46-0700Tim Schaubhttp://openlayers.github.io/ol3/master/examples/synthetic-lines.html#2014-02-21T18:45:46-0700Synthetic points examplevectorSynthetic points example.2014-02-21T18:45:46-0700Tim Schaubhttp://openlayers.github.io/ol3/master/examples/synthetic-points.html#2014-02-21T18:45:46-0700Fractal Examplefractal, vectorExample of a fractal.2014-02-21T17:48:17-0700Tim Schaubhttp://openlayers.github.io/ol3/master/examples/fractal.html#2014-02-21T17:48:17-0700Earthquakes heatmapheatmap, kml, vector, styleDemonstrates the use of a heatmap layer.2014-02-19T12:06:13+0100Frederic Junodhttp://openlayers.github.io/ol3/master/examples/heatmap-earthquakes.html#2014-02-19T12:06:13+0100Mobile full screen examplefullscreen, bing, geolocation, mobileExample of a full screen map.2014-02-13T16:50:49+0100Antoine Abthttp://openlayers.github.io/ol3/master/examples/mobile-full-screen.html#2014-02-13T16:50:49+0100OSM XML examplevector, osm, xmlExample of using the OSM XML source.2014-01-20T17:16:03+0100Frederic Junodhttp://openlayers.github.io/ol3/master/examples/vector-osm.html#2014-01-20T17:16:03+0100 \ No newline at end of file diff --git a/float-no-zero/examples/export-map-require.js b/float-no-zero/examples/export-map-require.js new file mode 100644 index 0000000000..b59a219231 --- /dev/null +++ b/float-no-zero/examples/export-map-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/export-map.html b/float-no-zero/examples/export-map.html new file mode 100644 index 0000000000..8a89927510 --- /dev/null +++ b/float-no-zero/examples/export-map.html @@ -0,0 +1,56 @@ + + + + + + + + + + + Export map example + + + + + +
+ +
+
+
+ + Export PNG +
+
+ +
+ +
+

Export map example

+

Example of exporting a map as a PNG image.

+
+

See the export-map.js source to see how this is done.

+
+
export, png, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/export-map.js b/float-no-zero/examples/export-map.js new file mode 100644 index 0000000000..d8adbdd320 --- /dev/null +++ b/float-no-zero/examples/export-map.js @@ -0,0 +1,31 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +var exportPNGElement = document.getElementById('export-png'); + +if ('download' in exportPNGElement) { + exportPNGElement.addEventListener('click', function(e) { + map.once('postcompose', function(event) { + var canvas = event.context.canvas; + exportPNGElement.href = canvas.toDataURL('image/png'); + }); + map.render(); + }, false); +} else { + var info = document.getElementById('no-download'); + /** + * display error message + */ + info.style.display = ''; +} diff --git a/float-no-zero/examples/fractal-require.js b/float-no-zero/examples/fractal-require.js new file mode 100644 index 0000000000..562724110e --- /dev/null +++ b/float-no-zero/examples/fractal-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Feature'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.geom.LineString'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.Vector'); diff --git a/float-no-zero/examples/fractal.html b/float-no-zero/examples/fractal.html new file mode 100644 index 0000000000..b576c4d94b --- /dev/null +++ b/float-no-zero/examples/fractal.html @@ -0,0 +1,64 @@ + + + + + + + + + + + Fractal Example + + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Fractal Example

+

Example of a fractal.

+ +
+

See the fractal.js source to see how this is done.

+
+
fractal, vector
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/fractal.js b/float-no-zero/examples/fractal.js new file mode 100644 index 0000000000..7896625941 --- /dev/null +++ b/float-no-zero/examples/fractal.js @@ -0,0 +1,118 @@ +var radius = 10e6; +var cos30 = Math.cos(Math.PI / 6); +var sin30 = Math.sin(Math.PI / 6); +var rise = radius * sin30; +var run = radius * cos30; + +var triangle = new ol.geom.LineString([ + [0, radius], [run, -rise], [-run, -rise], [0, radius] +]); + +var feature = new ol.Feature(triangle); + +var layer = new ol.layer.Vector({ + source: new ol.source.Vector({ + features: [feature] + }) +}); + +var map = new ol.Map({ + layers: [layer], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 1 + }) +}); + +function makeFractal(depth) { + var geometry = /** @type {ol.geom.LineString} */ (triangle.clone()); + var graph = coordsToGraph(geometry.getCoordinates()); + for (var i = 0; i < depth; ++i) { + var node = graph; + while (node.next) { + var next = node.next; + injectNodes(node); + node = next; + } + } + var coordinates = graphToCoords(graph); + document.getElementById('count').innerHTML = coordinates.length; + geometry.setCoordinates(coordinates); + feature.setGeometry(geometry); +} + +function injectNodes(startNode) { + var endNode = startNode.next; + + var start = startNode.point; + var end = startNode.next.point; + var dx = end[0] - start[0]; + var dy = end[1] - start[1]; + + // first point at 1/3 along the segment + var firstNode = { + point: [start[0] + dx / 3, start[1] + dy / 3] + }; + + // second point at peak of _/\_ + var r = Math.sqrt(dx * dx + dy * dy) / (2 * cos30); + var a = Math.atan2(dy, dx) + Math.PI / 6; + var secondNode = { + point: [start[0] + r * Math.cos(a), start[1] + r * Math.sin(a)] + }; + + // third point at 2/3 along the segment + var thirdNode = { + point: [end[0] - dx / 3, end[1] - dy / 3] + }; + + startNode.next = firstNode; + firstNode.next = secondNode; + secondNode.next = thirdNode; + thirdNode.next = endNode; +} + + +function coordsToGraph(coordinates) { + var graph = { + point: coordinates[0] + }; + var length = coordinates.length; + for (var level = 0, node = graph; level < length - 1; ++level) { + node.next = { + point: coordinates[level + 1] + }; + node = node.next; + } + return graph; +} + +function graphToCoords(graph) { + var coordinates = [graph.point]; + for (var node = graph, i = 1; node.next; node = node.next, ++i) { + coordinates[i] = node.next.point; + } + return coordinates; +} + +var depthInput = document.getElementById('depth'); + +function update() { + makeFractal(Number(depthInput.value)); +} + +var updateTimer; + + +/** + * Regenerate fractal on depth change. Change events are debounced so updates + * only occur every 200ms. + */ +depthInput.onchange = function() { + window.clearTimeout(updateTimer); + updateTimer = window.setTimeout(update, 200); +}; + +update(); diff --git a/float-no-zero/examples/full-screen-drag-rotate-and-zoom-require.js b/float-no-zero/examples/full-screen-drag-rotate-and-zoom-require.js new file mode 100644 index 0000000000..bddc0a4eba --- /dev/null +++ b/float-no-zero/examples/full-screen-drag-rotate-and-zoom-require.js @@ -0,0 +1,8 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.control'); +goog.require('ol.control.FullScreen'); +goog.require('ol.interaction'); +goog.require('ol.interaction.DragRotateAndZoom'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.BingMaps'); diff --git a/float-no-zero/examples/full-screen-drag-rotate-and-zoom.html b/float-no-zero/examples/full-screen-drag-rotate-and-zoom.html new file mode 100644 index 0000000000..0ec6518aa7 --- /dev/null +++ b/float-no-zero/examples/full-screen-drag-rotate-and-zoom.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + Full screen drag rotate and zoom example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Full screen drag rotate and zoom example

+

Example of drag rotate and zoom control with full screen effect.

+
+

Hold down Shift + drag to rotate and zoom. Click the button in the top right corner to go full screen. Then do the Shift + drag thing again.

+

If there is no button on the map, your browser does not support the Full Screen API.

+

See the full-screen-drag-rotate-and-zoom.js source to see how this is done.

+
+
full-screen, drag, rotate, zoom, bing, bing-maps
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/full-screen-drag-rotate-and-zoom.js b/float-no-zero/examples/full-screen-drag-rotate-and-zoom.js new file mode 100644 index 0000000000..ab2d9aa0e5 --- /dev/null +++ b/float-no-zero/examples/full-screen-drag-rotate-and-zoom.js @@ -0,0 +1,24 @@ +var map = new ol.Map({ + controls: ol.control.defaults().extend([ + new ol.control.FullScreen() + ]), + interactions: ol.interaction.defaults().extend([ + new ol.interaction.DragRotateAndZoom() + ]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.BingMaps({ + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3', + imagerySet: 'Aerial' + }) + }) + ], + // Use the canvas renderer because it's currently the fastest + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [-33519607, 5616436], + rotation: -Math.PI / 8, + zoom: 8 + }) +}); diff --git a/float-no-zero/examples/full-screen-require.js b/float-no-zero/examples/full-screen-require.js new file mode 100644 index 0000000000..f7ed70ab7b --- /dev/null +++ b/float-no-zero/examples/full-screen-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.control'); +goog.require('ol.control.FullScreen'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.BingMaps'); diff --git a/float-no-zero/examples/full-screen.html b/float-no-zero/examples/full-screen.html new file mode 100644 index 0000000000..a1cf2a3c38 --- /dev/null +++ b/float-no-zero/examples/full-screen.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + Full screen control example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Full screen control example

+

Example of a full screen control.

+
+

Click the control in the top right corner to go full screen. Click it again to exit full screen.

+

If there is no button on the map, your browser does not support the Full Screen API.

+

See the full-screen.js source to see how this is done.

+
+
full-screen, bing, bing-maps
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/full-screen.js b/float-no-zero/examples/full-screen.js new file mode 100644 index 0000000000..f86b2a63d6 --- /dev/null +++ b/float-no-zero/examples/full-screen.js @@ -0,0 +1,21 @@ +var view = new ol.View2D({ + center: [-9101767, 2822912], + zoom: 14 +}); + +var map = new ol.Map({ + controls: ol.control.defaults().extend([ + new ol.control.FullScreen() + ]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.BingMaps({ + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3', + imagerySet: 'Aerial' + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: view +}); diff --git a/float-no-zero/examples/geojson-require.js b/float-no-zero/examples/geojson-require.js new file mode 100644 index 0000000000..9b107f338a --- /dev/null +++ b/float-no-zero/examples/geojson-require.js @@ -0,0 +1,12 @@ +goog.require('ol.Feature'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.geom.Circle'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.GeoJSON'); +goog.require('ol.source.OSM'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/geojson.html b/float-no-zero/examples/geojson.html new file mode 100644 index 0000000000..c44be2a2bb --- /dev/null +++ b/float-no-zero/examples/geojson.html @@ -0,0 +1,51 @@ + + + + + + + + + + + GeoJSON example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

GeoJSON example

+

Example of GeoJSON features.

+
+

See the geojson.js source to see how this is done.

+
+
geojson, vector, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/geojson.js b/float-no-zero/examples/geojson.js new file mode 100644 index 0000000000..c77722b93d --- /dev/null +++ b/float-no-zero/examples/geojson.js @@ -0,0 +1,182 @@ +var image = new ol.style.Circle({ + radius: 5, + fill: null, + stroke: new ol.style.Stroke({color: 'red', width: 1}) +}); + +var styles = { + 'Point': [new ol.style.Style({ + image: image + })], + 'LineString': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'green', + width: 1 + }) + })], + 'MultiLineString': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'green', + width: 1 + }) + })], + 'MultiPoint': [new ol.style.Style({ + image: image + })], + 'MultiPolygon': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'yellow', + width: 1 + }), + fill: new ol.style.Fill({ + color: 'rgba(255, 255, 0, 0.1)' + }) + })], + 'Polygon': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'blue', + lineDash: [4], + width: 3 + }), + fill: new ol.style.Fill({ + color: 'rgba(0, 0, 255, 0.1)' + }) + })], + 'GeometryCollection': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'magenta', + width: 2 + }), + fill: new ol.style.Fill({ + color: 'magenta' + }), + image: new ol.style.Circle({ + radius: 10, + fill: null, + stroke: new ol.style.Stroke({ + color: 'magenta' + }) + }) + })], + 'Circle': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'red', + width: 2 + }), + fill: new ol.style.Fill({ + color: 'rgba(255,0,0,0.2)' + }) + })] +}; + +var styleFunction = function(feature, resolution) { + return styles[feature.getGeometry().getType()]; +}; + +var vectorSource = new ol.source.GeoJSON( + /** @type {olx.source.GeoJSONOptions} */ ({ + object: { + 'type': 'FeatureCollection', + 'crs': { + 'type': 'name', + 'properties': { + 'name': 'EPSG:3857' + } + }, + 'features': [ + { + 'type': 'Feature', + 'geometry': { + 'type': 'Point', + 'coordinates': [0, 0] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'LineString', + 'coordinates': [[4e6, -2e6], [8e6, 2e6]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'LineString', + 'coordinates': [[4e6, 2e6], [8e6, -2e6]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'Polygon', + 'coordinates': [[[-5e6, -1e6], [-4e6, 1e6], [-3e6, -1e6]]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'MultiLineString', + 'coordinates': [ + [[-1e6, -7.5e5], [-1e6, 7.5e5]], + [[1e6, -7.5e5], [1e6, 7.5e5]], + [[-7.5e5, -1e6], [7.5e5, -1e6]], + [[-7.5e5, 1e6], [7.5e5, 1e6]] + ] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'MultiPolygon', + 'coordinates': [ + [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6], [-3e6, 6e6]]], + [[[-2e6, 6e6], [-2e6, 8e6], [0e6, 8e6], [0e6, 6e6]]], + [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6], [3e6, 6e6]]] + ] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'GeometryCollection', + 'geometries': [ + { + 'type': 'LineString', + 'coordinates': [[-5e6, -5e6], [0e6, -5e6]] + }, + { + 'type': 'Point', + 'coordinates': [4e6, -5e6] + }, + { + 'type': 'Polygon', + 'coordinates': [[[1e6, -6e6], [2e6, -4e6], [3e6, -6e6]]] + } + ] + } + } + ] + } + })); + +vectorSource.addFeature(new ol.Feature(new ol.geom.Circle([5e6, 7e6], 1e6))); + +var vectorLayer = new ol.layer.Vector({ + source: vectorSource, + style: styleFunction +}); + +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }), + vectorLayer + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/geolocation-require.js b/float-no-zero/examples/geolocation-require.js new file mode 100644 index 0000000000..52f472a0e6 --- /dev/null +++ b/float-no-zero/examples/geolocation-require.js @@ -0,0 +1,7 @@ +goog.require('ol.Geolocation'); +goog.require('ol.Map'); +goog.require('ol.Overlay'); +goog.require('ol.View2D'); +goog.require('ol.dom.Input'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/geolocation.html b/float-no-zero/examples/geolocation.html new file mode 100644 index 0000000000..8b5ec77a5d --- /dev/null +++ b/float-no-zero/examples/geolocation.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + Geolocation example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Geolocation example

+ +

position accuracy :

+

altitude :

+

altitude accuracy :

+

heading :

+

speed :

+ +

Example of a geolocation map.

+
+

See the geolocation.js source to see how this is done.

+
+
geolocation, openstreetmap
+
+
+ +
+ +
+ + + + + + + + diff --git a/float-no-zero/examples/geolocation.js b/float-no-zero/examples/geolocation.js new file mode 100644 index 0000000000..0aa150414a --- /dev/null +++ b/float-no-zero/examples/geolocation.js @@ -0,0 +1,49 @@ +var view = new ol.View2D({ + center: [0, 0], + zoom: 2 +}); + +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: view +}); + +var geolocation = new ol.Geolocation(); +geolocation.bindTo('projection', view); + +var track = new ol.dom.Input(document.getElementById('track')); +track.bindTo('checked', geolocation, 'tracking'); + +geolocation.on('propertychange', function() { + $('#accuracy').text(geolocation.getAccuracy() + ' [m]'); + $('#altitude').text(geolocation.getAltitude() + ' [m]'); + $('#altitudeAccuracy').text(geolocation.getAltitudeAccuracy() + ' [m]'); + $('#heading').text(geolocation.getHeading() + ' [rad]'); + $('#speed').text(geolocation.getSpeed() + ' [m/s]'); +}); + +var marker = new ol.Overlay({ + element: /** @type {Element} */ ($('').addClass('icon-flag').get(0)), + positioning: 'bottom-left', + stopEvent: false +}); +map.addOverlay(marker); +// bind the marker position to the device location. +marker.bindTo('position', geolocation); + +geolocation.on('change:accuracy', function() { + $(marker.getElement()).tooltip({ + title: this.getAccuracy() + 'm from this point' + }); +}); +geolocation.on('error', function(error) { + var info = document.getElementById('info'); + info.innerHTML = error.message; + info.style.display = ''; +}); diff --git a/float-no-zero/examples/getfeatureinfo-require.js b/float-no-zero/examples/getfeatureinfo-require.js new file mode 100644 index 0000000000..3fc2530e20 --- /dev/null +++ b/float-no-zero/examples/getfeatureinfo-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.TileWMS'); diff --git a/float-no-zero/examples/getfeatureinfo.html b/float-no-zero/examples/getfeatureinfo.html new file mode 100644 index 0000000000..ce4404151d --- /dev/null +++ b/float-no-zero/examples/getfeatureinfo.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + Get feature info example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

GetFeatureInfo example

+

This example shows how to trigger WMS GetFeatureInfo requests on click for a WMS image layer.

+
+

See the getfeatureinfo.js source to see how this is done.

+
+
getfeatureinfo
+
+
+
+   +
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/getfeatureinfo.js b/float-no-zero/examples/getfeatureinfo.js new file mode 100644 index 0000000000..6f8eb6d29c --- /dev/null +++ b/float-no-zero/examples/getfeatureinfo.js @@ -0,0 +1,35 @@ +var wmsSource = new ol.source.TileWMS({ + url: 'http://demo.opengeo.org/geoserver/wms', + params: {'LAYERS': 'ne:ne'} +}); + +var wmsLayer = new ol.layer.Tile({ + source: wmsSource +}); + +var view = new ol.View2D({ + center: [0, 0], + zoom: 1 +}); + +var viewProjection = /** @type {ol.proj.Projection} */ + (view.getProjection()); + +var map = new ol.Map({ + layers: [wmsLayer], + renderer: 'canvas', + target: 'map', + view: view +}); + +map.on('singleclick', function(evt) { + document.getElementById('info').innerHTML = ''; + var viewResolution = /** @type {number} */ (view.getResolution()); + var url = wmsSource.getGetFeatureInfoUrl( + evt.coordinate, viewResolution, viewProjection, + {'INFO_FORMAT': 'text/html'}); + if (url) { + document.getElementById('info').innerHTML = + ''; + } +}); diff --git a/float-no-zero/examples/google-map-require.js b/float-no-zero/examples/google-map-require.js new file mode 100644 index 0000000000..2c9694d9c9 --- /dev/null +++ b/float-no-zero/examples/google-map-require.js @@ -0,0 +1,10 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.interaction'); +goog.require('ol.interaction.DragPan'); +goog.require('ol.layer.Vector'); +goog.require('ol.proj'); +goog.require('ol.source.GeoJSON'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/google-map.html b/float-no-zero/examples/google-map.html new file mode 100644 index 0000000000..fd82495071 --- /dev/null +++ b/float-no-zero/examples/google-map.html @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + Google Maps integration example + + + + + +
+ +
+
+
+
+
+
+
+
+ +
+ +
+

Google Maps integration example

+

Example of a GMaps map with an ol3 map as control, to give users a Google base map with ol3 content on top.

+
+

See the google-map.js source to see how this is done.

+
+
google
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/google-map.js b/float-no-zero/examples/google-map.js new file mode 100644 index 0000000000..54d7be6d1b --- /dev/null +++ b/float-no-zero/examples/google-map.js @@ -0,0 +1,51 @@ +var gmap = new google.maps.Map(document.getElementById('gmap'), { + disableDefaultUI: true, + keyboardShortcuts: false, + draggable: false, + disableDoubleClickZoom: true, + scrollwheel: false, + streetViewControl: false +}); + +var view = new ol.View2D(); +view.on('change:center', function() { + var center = ol.proj.transform(view.getCenter(), 'EPSG:3857', 'EPSG:4326'); + gmap.setCenter(new google.maps.LatLng(center[1], center[0])); +}); +view.on('change:resolution', function() { + gmap.setZoom(view.getZoom()); +}); + +var vector = new ol.layer.Vector({ + source: new ol.source.GeoJSON({ + url: 'data/geojson/countries.geojson', + projection: 'EPSG:3857' + }), + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255, 255, 255, 0.6)' + }), + stroke: new ol.style.Stroke({ + color: '#319FD3', + width: 1 + }) + }) +}); + +var olMapDiv = document.getElementById('olmap'); +var map = new ol.Map({ + layers: [vector], + interactions: ol.interaction.defaults({ + altShiftDragRotate: false, + dragPan: false, + touchRotate: false + }).extend([new ol.interaction.DragPan({kinetic: false})]), + renderer: 'canvas', + target: olMapDiv, + view: view +}); +view.setCenter([0, 0]); +view.setZoom(1); + +olMapDiv.parentNode.removeChild(olMapDiv); +gmap.controls[google.maps.ControlPosition.TOP_LEFT].push(olMapDiv); diff --git a/float-no-zero/examples/gpx-require.js b/float-no-zero/examples/gpx-require.js new file mode 100644 index 0000000000..8609425fb3 --- /dev/null +++ b/float-no-zero/examples/gpx-require.js @@ -0,0 +1,10 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.BingMaps'); +goog.require('ol.source.GPX'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/gpx.html b/float-no-zero/examples/gpx.html new file mode 100644 index 0000000000..decc16d0b1 --- /dev/null +++ b/float-no-zero/examples/gpx.html @@ -0,0 +1,56 @@ + + + + + + + + + + + GPX example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

GPX example

+

Example of using the GPX source.

+
+

See the gpx.js source to see how this is done.

+
+
GPX
+
+
+
+   +
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/gpx.js b/float-no-zero/examples/gpx.js new file mode 100644 index 0000000000..a24fa7da69 --- /dev/null +++ b/float-no-zero/examples/gpx.js @@ -0,0 +1,81 @@ +var raster = new ol.layer.Tile({ + source: new ol.source.BingMaps({ + imagerySet: 'Aerial', + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3' + }) +}); + +var style = { + 'Point': [new ol.style.Style({ + image: new ol.style.Circle({ + fill: new ol.style.Fill({ + color: 'rgba(255,255,0,0.4)' + }), + radius: 5, + stroke: new ol.style.Stroke({ + color: '#ff0', + width: 1 + }) + }) + })], + 'LineString': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#f00', + width: 3 + }) + })], + 'MultiLineString': [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#0f0', + width: 3 + }) + })] +}; + +var vector = new ol.layer.Vector({ + source: new ol.source.GPX({ + projection: 'EPSG:3857', + url: 'data/gpx/fells_loop.gpx' + }), + style: function(feature, resolution) { + return style[feature.getGeometry().getType()]; + } +}); + +var map = new ol.Map({ + layers: [raster, vector], + renderer: 'canvas', + target: document.getElementById('map'), + view: new ol.View2D({ + center: [-7916041.528716288, 5228379.045749711], + zoom: 12 + }) +}); + +var displayFeatureInfo = function(pixel) { + var features = []; + map.forEachFeatureAtPixel(pixel, function(feature, layer) { + features.push(feature); + }); + if (features.length > 0) { + var info = []; + var i, ii; + for (i = 0, ii = features.length; i < ii; ++i) { + info.push(features[i].get('desc')); + } + document.getElementById('info').innerHTML = info.join(', ') || '(unknown)'; + map.getTarget().style.cursor = 'pointer'; + } else { + document.getElementById('info').innerHTML = ' '; + map.getTarget().style.cursor = ''; + } +}; + +$(map.getViewport()).on('mousemove', function(evt) { + var pixel = map.getEventPixel(evt.originalEvent); + displayFeatureInfo(pixel); +}); + +map.on('singleclick', function(evt) { + displayFeatureInfo(evt.pixel); +}); diff --git a/float-no-zero/examples/heatmap-earthquakes-require.js b/float-no-zero/examples/heatmap-earthquakes-require.js new file mode 100644 index 0000000000..90f268d5a1 --- /dev/null +++ b/float-no-zero/examples/heatmap-earthquakes-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Heatmap'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.KML'); +goog.require('ol.source.Stamen'); diff --git a/float-no-zero/examples/heatmap-earthquakes.html b/float-no-zero/examples/heatmap-earthquakes.html new file mode 100644 index 0000000000..f65000e383 --- /dev/null +++ b/float-no-zero/examples/heatmap-earthquakes.html @@ -0,0 +1,52 @@ + + + + + + + + + + Earthquakes heatmap + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Earthquakes heatmap

+

Demonstrates the use of a heatmap layer.

+
+

+ This example parses a KML file and renders the features as a ol.layer.Heatmap layer. +

+

See the heatmap-earthquakes.js source to see how this is done.

+
+
heatmap, kml, vector, style
+
+
+ +
+ + + + + + + diff --git a/float-no-zero/examples/heatmap-earthquakes.js b/float-no-zero/examples/heatmap-earthquakes.js new file mode 100644 index 0000000000..6230b91e42 --- /dev/null +++ b/float-no-zero/examples/heatmap-earthquakes.js @@ -0,0 +1,32 @@ +var vector = new ol.layer.Heatmap({ + source: new ol.source.KML({ + projection: 'EPSG:3857', + url: 'data/kml/2012_Earthquakes_Mag5.kml' + }), + radius: 5 +}); + +vector.getSource().on('addfeature', function(event) { + // 2012_Earthquakes_Mag5.kml stores the magnitude of each earthquake in a + // standards-violating tag in each Placemark. We extract it from + // the Placemark's name instead. + var name = event.feature.get('name'); + var magnitude = parseFloat(name.substr(2)); + event.feature.set('weight', magnitude - 5); +}); + +var raster = new ol.layer.Tile({ + source: new ol.source.Stamen({ + layer: 'toner' + }) +}); + +var map = new ol.Map({ + layers: [raster, vector], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/hue-saturation-require.js b/float-no-zero/examples/hue-saturation-require.js new file mode 100644 index 0000000000..44a855d5ce --- /dev/null +++ b/float-no-zero/examples/hue-saturation-require.js @@ -0,0 +1,6 @@ +goog.require('ol.BrowserFeature'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.BingMaps'); diff --git a/float-no-zero/examples/hue-saturation.html b/float-no-zero/examples/hue-saturation.html new file mode 100644 index 0000000000..48596561fb --- /dev/null +++ b/float-no-zero/examples/hue-saturation.html @@ -0,0 +1,74 @@ + + + + + + + + + + + Hue/saturation example + + + + + + +
+ +
+
+
+ + + +
+ + + +
+
+ + + +
+
+
+ +
+ +
+

Hue/saturation example

+

Example of hue/saturation control on the client (WebGL only).

+
+

See the hue-saturation.js source to see how this is done.

+
+
hue, saturation, webgl
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/hue-saturation.js b/float-no-zero/examples/hue-saturation.js new file mode 100644 index 0000000000..61c0559201 --- /dev/null +++ b/float-no-zero/examples/hue-saturation.js @@ -0,0 +1,71 @@ +function setResetHueButtonHTML() { + resetHue.innerHTML = 'Hue (' + layer.getHue().toFixed(2) + ')'; +} + +function setResetSaturationButtonHTML() { + resetSaturation.innerHTML = 'Saturation (' + + layer.getSaturation().toFixed(2) + ')'; +} + +if (!ol.BrowserFeature.HAS_WEBGL) { + var info = document.getElementById('no-webgl'); + /** + * display error message + */ + info.style.display = ''; +} else { + var layer = new ol.layer.Tile({ + source: new ol.source.BingMaps({ + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3', + imagerySet: 'Aerial' + }) + }); + + var map = new ol.Map({ + layers: [layer], + renderer: 'webgl', + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform([-9.375, 51.483333], 'EPSG:4326', 'EPSG:3857'), + zoom: 15 + }) + }); + + var increaseHue = document.getElementById('increase-hue'); + var resetHue = document.getElementById('reset-hue'); + var decreaseHue = document.getElementById('decrease-hue'); + + setResetHueButtonHTML(); + + increaseHue.addEventListener('click', function() { + layer.setHue(layer.getHue() + 0.25); + setResetHueButtonHTML(); + }, false); + resetHue.addEventListener('click', function() { + layer.setHue(0); + setResetHueButtonHTML(); + }, false); + decreaseHue.addEventListener('click', function() { + layer.setHue(layer.getHue() - 0.25); + setResetHueButtonHTML(); + }, false); + + var increaseSaturation = document.getElementById('increase-saturation'); + var resetSaturation = document.getElementById('reset-saturation'); + var decreaseSaturation = document.getElementById('decrease-saturation'); + + setResetSaturationButtonHTML(); + + increaseSaturation.addEventListener('click', function() { + layer.setSaturation(layer.getSaturation() + 0.25); + setResetSaturationButtonHTML(); + }, false); + resetSaturation.addEventListener('click', function() { + layer.setSaturation(1); + setResetSaturationButtonHTML(); + }, false); + decreaseSaturation.addEventListener('click', function() { + layer.setSaturation(Math.max(layer.getSaturation() - 0.25, 0)); + setResetSaturationButtonHTML(); + }, false); +} diff --git a/float-no-zero/examples/icon-require.js b/float-no-zero/examples/icon-require.js new file mode 100644 index 0000000000..247038475b --- /dev/null +++ b/float-no-zero/examples/icon-require.js @@ -0,0 +1,11 @@ +goog.require('ol.Feature'); +goog.require('ol.Map'); +goog.require('ol.Overlay'); +goog.require('ol.View2D'); +goog.require('ol.geom.Point'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.TileJSON'); +goog.require('ol.source.Vector'); +goog.require('ol.style.Icon'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/icon.html b/float-no-zero/examples/icon.html new file mode 100644 index 0000000000..b789f8be38 --- /dev/null +++ b/float-no-zero/examples/icon.html @@ -0,0 +1,62 @@ + + + + + + + + + + + Vector Icon Example + + + + + + +
+ +
+
+
+ +
+
+
+ +
+ +
+

Icon example

+

Example using an icon to symbolize a point.

+
+

See the icon.js source to see how this is done.

+
+
vector, style, icon, marker, popup
+
+ +
+ +
+ + + + + + + + diff --git a/float-no-zero/examples/icon.js b/float-no-zero/examples/icon.js new file mode 100644 index 0000000000..36a28b7450 --- /dev/null +++ b/float-no-zero/examples/icon.js @@ -0,0 +1,85 @@ +var iconFeature = new ol.Feature({ + geometry: new ol.geom.Point([0, 0]), + name: 'Null Island', + population: 4000, + rainfall: 500 +}); + +var iconStyle = new ol.style.Style({ + image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ + anchor: [0.5, 46], + anchorXUnits: 'fraction', + anchorYUnits: 'pixels', + opacity: 0.75, + src: 'data/icon.png' + })) +}); + +iconFeature.setStyle(iconStyle); + +var vectorSource = new ol.source.Vector({ + features: [iconFeature] +}); + +var vectorLayer = new ol.layer.Vector({ + source: vectorSource +}); + +var rasterLayer = new ol.layer.Tile({ + source: new ol.source.TileJSON({ + url: 'http://api.tiles.mapbox.com/v3/mapbox.geography-class.jsonp' + }) +}); + +var map = new ol.Map({ + layers: [rasterLayer, vectorLayer], + renderer: 'canvas', + target: document.getElementById('map'), + view: new ol.View2D({ + center: [0, 0], + zoom: 3 + }) +}); + +var element = document.getElementById('popup'); + +var popup = new ol.Overlay({ + element: element, + positioning: 'bottom-center', + stopEvent: false +}); +map.addOverlay(popup); + +// display popup on click +map.on('singleclick', function(evt) { + var feature = map.forEachFeatureAtPixel(evt.pixel, + function(feature, layer) { + return feature; + }); + if (feature) { + var geometry = feature.getGeometry(); + var coord = geometry.getCoordinates(); + popup.setPosition(coord); + $(element).popover({ + 'placement': 'top', + 'html': true, + 'content': feature.get('name') + }); + $(element).popover('show'); + } else { + $(element).popover('destroy'); + } +}); + +// change mouse cursor when over marker +$(map.getViewport()).on('mousemove', function(e) { + var pixel = map.getEventPixel(e.originalEvent); + var hit = map.forEachFeatureAtPixel(pixel, function(feature, layer) { + return true; + }); + if (hit) { + map.getTarget().style.cursor = 'pointer'; + } else { + map.getTarget().style.cursor = ''; + } +}); diff --git a/float-no-zero/examples/igc-require.js b/float-no-zero/examples/igc-require.js new file mode 100644 index 0000000000..7216add6b1 --- /dev/null +++ b/float-no-zero/examples/igc-require.js @@ -0,0 +1,15 @@ +goog.require('ol.Attribution'); +goog.require('ol.Feature'); +goog.require('ol.FeatureOverlay'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.Point'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.IGC'); +goog.require('ol.source.OSM'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/igc.html b/float-no-zero/examples/igc.html new file mode 100644 index 0000000000..5fd0925a10 --- /dev/null +++ b/float-no-zero/examples/igc.html @@ -0,0 +1,57 @@ + + + + + + + + + + + IGC example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

IGC example

+

Example of tracks recorded from multiple paraglider flights on the same day, read from an IGC file. The five tracks contain a total of 49,707 unique coordinates. Zoom in to see more detail. The background layer is from OpenCycleMap.

+
+

See the igc.js source to see how this is done.

+
+ +
complex-geometry, closest-feature, igc, opencyclemap
+
+
+
+   +
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/igc.js b/float-no-zero/examples/igc.js new file mode 100644 index 0000000000..6583c017d4 --- /dev/null +++ b/float-no-zero/examples/igc.js @@ -0,0 +1,169 @@ +var colors = { + 'Clement Latour': 'rgba(0, 0, 255, 0.7)', + 'Damien de Baesnt': 'rgba(0, 215, 255, 0.7)', + 'Sylvain Dhonneur': 'rgba(0, 165, 255, 0.7)', + 'Tom Payne': 'rgba(0, 255, 255, 0.7)', + 'Ulrich Prinz': 'rgba(0, 215, 255, 0.7)' +}; + +var styleCache = {}; +var styleFunction = function(feature, resolution) { + var color = colors[feature.get('PLT')]; + var styleArray = styleCache[color]; + if (!styleArray) { + styleArray = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: color, + width: 3 + }) + })]; + styleCache[color] = styleArray; + } + return styleArray; +}; + +var vectorSource = new ol.source.IGC({ + projection: 'EPSG:3857', + urls: [ + 'data/igc/Clement-Latour.igc', + 'data/igc/Damien-de-Baenst.igc', + 'data/igc/Sylvain-Dhonneur.igc', + 'data/igc/Tom-Payne.igc', + 'data/igc/Ulrich-Prinz.igc' + ] +}); + +var time = { + start: Infinity, + stop: -Infinity, + duration: 0 +}; +vectorSource.on('addfeature', function(event) { + var geometry = event.feature.getGeometry(); + time.start = Math.min(time.start, geometry.getFirstCoordinate()[2]); + time.stop = Math.max(time.stop, geometry.getLastCoordinate()[2]); + time.duration = time.stop - time.start; +}); + + +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM({ + attributions: [ + new ol.Attribution({ + html: 'All maps © ' + + 'OpenCycleMap' + }), + ol.source.OSM.DATA_ATTRIBUTION + ], + url: 'http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png' + }) + }), + new ol.layer.Vector({ + source: vectorSource, + style: styleFunction + }) + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [703365.7089403362, 5714629.865071137], + zoom: 9 + }) +}); + + +var point = null; +var line = null; +var displaySnap = function(coordinate) { + var closestFeature = vectorSource.getClosestFeatureToCoordinate(coordinate); + var info = document.getElementById('info'); + if (closestFeature === null) { + point = null; + line = null; + info.innerHTML = ' '; + } else { + var geometry = closestFeature.getGeometry(); + var closestPoint = geometry.getClosestPoint(coordinate); + if (point === null) { + point = new ol.geom.Point(closestPoint); + } else { + point.setCoordinates(closestPoint); + } + var date = new Date(closestPoint[2] * 1000); + info.innerHTML = + closestFeature.get('PLT') + ' (' + date.toUTCString() + ')'; + var coordinates = [coordinate, [closestPoint[0], closestPoint[1]]]; + if (line === null) { + line = new ol.geom.LineString(coordinates); + } else { + line.setCoordinates(coordinates); + } + } + map.render(); +}; + +$(map.getViewport()).on('mousemove', function(evt) { + var coordinate = map.getEventCoordinate(evt.originalEvent); + displaySnap(coordinate); +}); + +map.on('singleclick', function(evt) { + displaySnap(evt.coordinate); +}); + +var imageStyle = new ol.style.Circle({ + radius: 5, + fill: null, + stroke: new ol.style.Stroke({ + color: 'rgba(255,0,0,0.9)', + width: 1 + }) +}); +var strokeStyle = new ol.style.Stroke({ + color: 'rgba(255,0,0,0.9)', + width: 1 +}); +map.on('postcompose', function(evt) { + var vectorContext = evt.vectorContext; + if (point !== null) { + vectorContext.setImageStyle(imageStyle); + vectorContext.drawPointGeometry(point); + } + if (line !== null) { + vectorContext.setFillStrokeStyle(null, strokeStyle); + vectorContext.drawLineStringGeometry(line); + } +}); + +var featureOverlay = new ol.FeatureOverlay({ + map: map, + style: new ol.style.Style({ + image: new ol.style.Circle({ + radius: 5, + fill: new ol.style.Fill({ + color: 'rgba(255,0,0,0.9)' + }), + stroke: null + }) + }) +}); + +$('#time').on('input', function(event) { + var value = parseInt($(this).val(), 10) / 100; + var m = time.start + (time.duration * value); + vectorSource.forEachFeature(function(feature) { + var geometry = /** @type {ol.geom.LineString} */ (feature.getGeometry()); + var coordinate = geometry.getCoordinateAtM(m, true); + var highlight = feature.get('highlight'); + if (highlight == undefined) { + highlight = new ol.Feature(new ol.geom.Point(coordinate)); + feature.set('highlight', highlight); + featureOverlay.addFeature(highlight); + } else { + highlight.getGeometry().setCoordinates(coordinate); + } + }); + map.render(); +}); diff --git a/float-no-zero/examples/image-filter-require.js b/float-no-zero/examples/image-filter-require.js new file mode 100644 index 0000000000..6ef82a9158 --- /dev/null +++ b/float-no-zero/examples/image-filter-require.js @@ -0,0 +1,5 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.BingMaps'); diff --git a/float-no-zero/examples/image-filter.html b/float-no-zero/examples/image-filter.html new file mode 100644 index 0000000000..64c6e12438 --- /dev/null +++ b/float-no-zero/examples/image-filter.html @@ -0,0 +1,65 @@ + + + + + + + + + + + Image Filter Example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Image filter example

+

Apply a filter to imagery

+ +
+

+ Layer rendering can be manipulated in precompose and postcompose event listeners. + These listeners get an event with a reference to the Canvas rendering context. + In this example, the postcompose listener applies a filter to the image data. +

+

See the image-filter.js source for details on how this is done.

+
+
filter, image manipulation
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/image-filter.js b/float-no-zero/examples/image-filter.js new file mode 100644 index 0000000000..ec43d6ffa8 --- /dev/null +++ b/float-no-zero/examples/image-filter.js @@ -0,0 +1,141 @@ +var key = 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'; + +var imagery = new ol.layer.Tile({ + source: new ol.source.BingMaps({key: key, imagerySet: 'Aerial'}) +}); + +var map = new ol.Map({ + layers: [imagery], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform([-120, 50], 'EPSG:4326', 'EPSG:3857'), + zoom: 6 + }) +}); + +var kernels = { + none: [ + 0, 0, 0, + 0, 1, 0, + 0, 0, 0 + ], + sharpen: [ + 0, -1, 0, + -1, 5, -1, + 0, -1, 0 + ], + sharpenless: [ + 0, -1, 0, + -1, 10, -1, + 0, -1, 0 + ], + blur: [ + 1, 1, 1, + 1, 1, 1, + 1, 1, 1 + ], + shadow: [ + 1, 2, 1, + 0, 1, 0, + -1, -2, -1 + ], + emboss: [ + -2, 1, 0, + -1, 1, 1, + 0, 1, 2 + ], + edge: [ + 0, 1, 0, + 1, -4, 1, + 0, 1, 0 + ] +}; + +function normalize(kernel) { + var len = kernel.length; + var normal = new Array(len); + var i, sum = 0; + for (i = 0; i < len; ++i) { + sum += kernel[i]; + } + if (sum <= 0) { + normal.normalized = false; + sum = 1; + } else { + normal.normalized = true; + } + for (i = 0; i < len; ++i) { + normal[i] = kernel[i] / sum; + } + return normal; +} + +var select = document.getElementById('kernel'); +var selectedKernel = normalize(kernels[select.value]); + + +/** + * Update the kernel and re-render on change. + */ +select.onchange = function() { + selectedKernel = normalize(kernels[select.value]); + map.render(); +}; + + +/** + * Apply a filter on "postcompose" events. + * @param {ol.render.Event} event Render event. + */ +imagery.on('postcompose', function(event) { + convolve(event.context, selectedKernel); +}); + + +/** + * Apply a convolution kernel to canvas. This works for any size kernel, but + * performance starts degrading above 3 x 3. + * @param {CanvasRenderingContext2D} context Canvas 2d context. + * @param {Array.} kernel Kernel. + */ +function convolve(context, kernel) { + var canvas = context.canvas; + var width = canvas.width; + var height = canvas.height; + + var size = Math.sqrt(kernel.length); + var half = Math.floor(size / 2); + + var inputData = context.getImageData(0, 0, width, height).data; + + var output = context.createImageData(width, height); + var outputData = output.data; + + for (var pixelY = 0; pixelY < height; ++pixelY) { + var pixelsAbove = pixelY * width; + for (var pixelX = 0; pixelX < width; ++pixelX) { + var r = 0, g = 0, b = 0, a = 0; + for (var kernelY = 0; kernelY < size; ++kernelY) { + for (var kernelX = 0; kernelX < size; ++kernelX) { + var weight = kernel[kernelY * size + kernelX]; + var neighborY = Math.min( + height - 1, Math.max(0, pixelY + kernelY - half)); + var neighborX = Math.min( + width - 1, Math.max(0, pixelX + kernelX - half)); + var inputIndex = (neighborY * width + neighborX) * 4; + r += inputData[inputIndex] * weight; + g += inputData[inputIndex + 1] * weight; + b += inputData[inputIndex + 2] * weight; + a += inputData[inputIndex + 3] * weight; + } + } + var outputIndex = (pixelsAbove + pixelX) * 4; + outputData[outputIndex] = r; + outputData[outputIndex + 1] = g; + outputData[outputIndex + 2] = b; + outputData[outputIndex + 3] = kernel.normalized ? a : 255; + } + } + context.putImageData(output, 0, 0); +} diff --git a/float-no-zero/examples/image-vector-layer-require.js b/float-no-zero/examples/image-vector-layer-require.js new file mode 100644 index 0000000000..c8f29858f5 --- /dev/null +++ b/float-no-zero/examples/image-vector-layer-require.js @@ -0,0 +1,11 @@ +goog.require('ol.FeatureOverlay'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Image'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.GeoJSON'); +goog.require('ol.source.ImageVector'); +goog.require('ol.source.MapQuest'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/image-vector-layer.html b/float-no-zero/examples/image-vector-layer.html new file mode 100644 index 0000000000..5995d9a630 --- /dev/null +++ b/float-no-zero/examples/image-vector-layer.html @@ -0,0 +1,59 @@ + + + + + + + + + + + Image vector layer example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Image vector example

+

Example of an image vector layer.

+
+

This example uses a ol.source.ImageVector source. That source gets vector features from the + ol.source.Vector it's configured with, and draw these features to an HTML5 canvas element that + is then used as the image of an image layer.

+

See the image-vector-layer.js source to see how this is done.

+
+
vector, image
+
+
+
+   +
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/image-vector-layer.js b/float-no-zero/examples/image-vector-layer.js new file mode 100644 index 0000000000..184c17965f --- /dev/null +++ b/float-no-zero/examples/image-vector-layer.js @@ -0,0 +1,78 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }), + new ol.layer.Image({ + source: new ol.source.ImageVector({ + source: new ol.source.GeoJSON({ + projection: 'EPSG:3857', + url: 'data/geojson/countries.geojson' + }), + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255, 255, 255, 0.6)' + }), + stroke: new ol.style.Stroke({ + color: '#319FD3', + width: 1 + }) + }) + }) + }) + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 1 + }) +}); + +var featureOverlay = new ol.FeatureOverlay({ + map: map, + style: new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#f00', + width: 1 + }), + fill: new ol.style.Fill({ + color: 'rgba(255,0,0,0.1)' + }) + }) +}); + +var highlight; +var displayFeatureInfo = function(pixel) { + + var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) { + return feature; + }); + + var info = document.getElementById('info'); + if (feature) { + info.innerHTML = feature.getId() + ': ' + feature.get('name'); + } else { + info.innerHTML = ' '; + } + + if (feature !== highlight) { + if (highlight) { + featureOverlay.removeFeature(highlight); + } + if (feature) { + featureOverlay.addFeature(feature); + } + highlight = feature; + } + +}; + +$(map.getViewport()).on('mousemove', function(evt) { + var pixel = map.getEventPixel(evt.originalEvent); + displayFeatureInfo(pixel); +}); + +map.on('singleclick', function(evt) { + displayFeatureInfo(evt.pixel); +}); diff --git a/float-no-zero/examples/index.html b/float-no-zero/examples/index.html new file mode 100644 index 0000000000..696db3930d --- /dev/null +++ b/float-no-zero/examples/index.html @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + OpenLayers 3 Examples + + + + + +
+ +
+ +
+
+ +
+
+ +
+ + diff --git a/float-no-zero/examples/jquery.min.js b/float-no-zero/examples/jquery.min.js new file mode 100644 index 0000000000..16ad06c5ac --- /dev/null +++ b/float-no-zero/examples/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.2 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/float-no-zero/examples/kml-earthquakes-require.js b/float-no-zero/examples/kml-earthquakes-require.js new file mode 100644 index 0000000000..0d54042bec --- /dev/null +++ b/float-no-zero/examples/kml-earthquakes-require.js @@ -0,0 +1,10 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.KML'); +goog.require('ol.source.Stamen'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/kml-earthquakes.html b/float-no-zero/examples/kml-earthquakes.html new file mode 100644 index 0000000000..cb0a3c2ab5 --- /dev/null +++ b/float-no-zero/examples/kml-earthquakes.html @@ -0,0 +1,75 @@ + + + + + + + + + + + Earthquakes in KML + + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Earthquakes in KML

+

Demonstrates the use of a Shape symbolizer to render earthquake locations.

+
+

+ This example parses a KML file and renders the features as a vector layer. The layer is given a style that renders earthquake locations with a size relative to their magnitude. +

+

See the kml-earthquakes.js source to see how this is done.

+
+
KML, vector, style
+
+
+ +
+ + + + + + + + diff --git a/float-no-zero/examples/kml-earthquakes.js b/float-no-zero/examples/kml-earthquakes.js new file mode 100644 index 0000000000..7e1729c038 --- /dev/null +++ b/float-no-zero/examples/kml-earthquakes.js @@ -0,0 +1,82 @@ +var styleCache = {}; +var styleFunction = function(feature, resolution) { + // 2012_Earthquakes_Mag5.kml stores the magnitude of each earthquake in a + // standards-violating tag in each Placemark. We extract it from + // the Placemark's name instead. + var name = feature.get('name'); + var magnitude = parseFloat(name.substr(2)); + var radius = 5 + 20 * (magnitude - 5); + var style = styleCache[radius]; + if (!style) { + style = [new ol.style.Style({ + image: new ol.style.Circle({ + radius: radius, + fill: new ol.style.Fill({ + color: 'rgba(255, 153, 0, 0.4)' + }), + stroke: new ol.style.Stroke({ + color: 'rgba(255, 204, 0, 0.2)', + width: 1 + }) + }) + })]; + styleCache[radius] = style; + } + return style; +}; + +var vector = new ol.layer.Vector({ + source: new ol.source.KML({ + projection: 'EPSG:3857', + url: 'data/kml/2012_Earthquakes_Mag5.kml' + }), + style: styleFunction +}); + +var raster = new ol.layer.Tile({ + source: new ol.source.Stamen({ + layer: 'toner' + }) +}); + +var map = new ol.Map({ + layers: [raster, vector], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +var info = $('#info'); +info.tooltip({ + animation: false, + trigger: 'manual' +}); + +var displayFeatureInfo = function(pixel) { + info.css({ + left: pixel[0] + 'px', + top: (pixel[1] - 15) + 'px' + }); + var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) { + return feature; + }); + if (feature) { + info.tooltip('hide') + .attr('data-original-title', feature.get('name')) + .tooltip('fixTitle') + .tooltip('show'); + } else { + info.tooltip('hide'); + } +}; + +$(map.getViewport()).on('mousemove', function(evt) { + displayFeatureInfo(map.getEventPixel(evt.originalEvent)); +}); + +map.on('singleclick', function(evt) { + displayFeatureInfo(evt.pixel); +}); diff --git a/float-no-zero/examples/kml-require.js b/float-no-zero/examples/kml-require.js new file mode 100644 index 0000000000..b61eebcd75 --- /dev/null +++ b/float-no-zero/examples/kml-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.BingMaps'); +goog.require('ol.source.KML'); diff --git a/float-no-zero/examples/kml-timezones-require.js b/float-no-zero/examples/kml-timezones-require.js new file mode 100644 index 0000000000..e3e3f9bcd6 --- /dev/null +++ b/float-no-zero/examples/kml-timezones-require.js @@ -0,0 +1,9 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.KML'); +goog.require('ol.source.Stamen'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/kml-timezones.html b/float-no-zero/examples/kml-timezones.html new file mode 100644 index 0000000000..9db9d00077 --- /dev/null +++ b/float-no-zero/examples/kml-timezones.html @@ -0,0 +1,63 @@ + + + + + + + + + + + Timezones in KML + + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Timezones in KML

+

Demonstrates rendering timezones from KML.

+
+

This example parses a KML file and renders the features as a vector layer. The layer is given a ol.style.Style that fills timezones yellow with an opacity calculated based on the current offset to local noon.

+

See the kml-timezones.js source to see how this is done.

+
+
KML, vector, style
+
+
+ +
+ + + + + + + + diff --git a/float-no-zero/examples/kml-timezones.js b/float-no-zero/examples/kml-timezones.js new file mode 100644 index 0000000000..1626671e3b --- /dev/null +++ b/float-no-zero/examples/kml-timezones.js @@ -0,0 +1,90 @@ +/* + * Compute the style of the feature. Here we want the opacity of polygons to + * be based on the offset from local noon. For example, a timezone where it is + * currently noon would have an opacity of 0.75. And a timezone where it is + * currently midnight would have an opacity of 0. This doesn't account for + * daylight savings, so don't use it to plan your vacation. + */ +var styleFunction = function(feature, resolution) { + var offset = 0; + var name = feature.get('name'); // e.g. GMT -08:30 + var match = name.match(/([\-+]\d{2}):(\d{2})$/); + if (match) { + var hours = parseInt(match[1], 10); + var minutes = parseInt(match[2], 10); + offset = 60 * hours + minutes; + } + var date = new Date(); + var local = new Date(date.getTime() + + (date.getTimezoneOffset() + offset) * 60000); + // offset from local noon (in hours) + var delta = Math.abs(12 - local.getHours() + (local.getMinutes() / 60)); + if (delta > 12) { + delta = 24 - delta; + } + var opacity = 0.75 * (1 - delta / 12); + return [new ol.style.Style({ + fill: new ol.style.Fill({ + color: [0xff, 0xff, 0x33, opacity] + }), + stroke: new ol.style.Stroke({ + color: '#ffffff' + }) + })]; +}; + +var vector = new ol.layer.Vector({ + source: new ol.source.KML({ + projection: 'EPSG:3857', + url: 'data/kml/timezones.kml' + }), + style: styleFunction +}); + +var raster = new ol.layer.Tile({ + source: new ol.source.Stamen({ + layer: 'toner' + }) +}); + +var map = new ol.Map({ + layers: [raster, vector], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +var info = $('#info'); +info.tooltip({ + animation: false, + trigger: 'manual' +}); + +var displayFeatureInfo = function(pixel) { + info.css({ + left: pixel[0] + 'px', + top: (pixel[1] - 15) + 'px' + }); + var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) { + return feature; + }); + if (feature) { + info.tooltip('hide') + .attr('data-original-title', feature.get('name')) + .tooltip('fixTitle') + .tooltip('show'); + } else { + info.tooltip('hide'); + } +}; + +$(map.getViewport()).on('mousemove', function(evt) { + displayFeatureInfo(map.getEventPixel(evt.originalEvent)); +}); + +map.on('singleclick', function(evt) { + displayFeatureInfo(evt.pixel); +}); diff --git a/float-no-zero/examples/kml.html b/float-no-zero/examples/kml.html new file mode 100644 index 0000000000..aac41b78c9 --- /dev/null +++ b/float-no-zero/examples/kml.html @@ -0,0 +1,56 @@ + + + + + + + + + + + KML example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

KML example

+

Example of using the KML source.

+
+

See the kml.js source to see how this is done.

+
+
KML
+
+
+
+   +
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/kml.js b/float-no-zero/examples/kml.js new file mode 100644 index 0000000000..f472ce5452 --- /dev/null +++ b/float-no-zero/examples/kml.js @@ -0,0 +1,51 @@ +var raster = new ol.layer.Tile({ + source: new ol.source.BingMaps({ + imagerySet: 'Aerial', + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3' + }) +}); + +var vector = new ol.layer.Vector({ + source: new ol.source.KML({ + projection: 'EPSG:3857', + url: 'data/kml/2012-02-10.kml' + }) +}); + +var map = new ol.Map({ + layers: [raster, vector], + renderer: 'canvas', + target: document.getElementById('map'), + view: new ol.View2D({ + center: [876970.8463461736, 5859807.853963373], + zoom: 10 + }) +}); + +var displayFeatureInfo = function(pixel) { + var features = []; + map.forEachFeatureAtPixel(pixel, function(feature, layer) { + features.push(feature); + }); + if (features.length > 0) { + var info = []; + var i, ii; + for (i = 0, ii = features.length; i < ii; ++i) { + info.push(features[i].get('name')); + } + document.getElementById('info').innerHTML = info.join(', ') || '(unknown)'; + map.getTarget().style.cursor = 'pointer'; + } else { + document.getElementById('info').innerHTML = ' '; + map.getTarget().style.cursor = ''; + } +}; + +$(map.getViewport()).on('mousemove', function(evt) { + var pixel = map.getEventPixel(evt.originalEvent); + displayFeatureInfo(pixel); +}); + +map.on('singleclick', function(evt) { + displayFeatureInfo(evt.pixel); +}); diff --git a/float-no-zero/examples/layer-clipping-require.js b/float-no-zero/examples/layer-clipping-require.js new file mode 100644 index 0000000000..b59a219231 --- /dev/null +++ b/float-no-zero/examples/layer-clipping-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/layer-clipping-webgl-require.js b/float-no-zero/examples/layer-clipping-webgl-require.js new file mode 100644 index 0000000000..f3cf7e066c --- /dev/null +++ b/float-no-zero/examples/layer-clipping-webgl-require.js @@ -0,0 +1,5 @@ +goog.require('ol.BrowserFeature'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/layer-clipping-webgl.html b/float-no-zero/examples/layer-clipping-webgl.html new file mode 100644 index 0000000000..bd8dbb4f56 --- /dev/null +++ b/float-no-zero/examples/layer-clipping-webgl.html @@ -0,0 +1,56 @@ + + + + + + + + + + + Layer WebGL clipping example + + + + + +
+ +
+
+
+
+
+ + + +
+ +
+

Layer WebGL clipping example

+

Layer WebGL clipping example.

+
+

This example shows how to use the precompose and postcompose rendering hooks to clip layers using WebGL.

+

See the layer-clipping-webgl.js source to see how this is done.

+
+
clipping, webgl, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/layer-clipping-webgl.js b/float-no-zero/examples/layer-clipping-webgl.js new file mode 100644 index 0000000000..f3fb361ccc --- /dev/null +++ b/float-no-zero/examples/layer-clipping-webgl.js @@ -0,0 +1,96 @@ +if (!ol.BrowserFeature.HAS_WEBGL) { + var info = document.getElementById('no-webgl'); + /** + * display error message + */ + info.style.display = ''; +} else { + + var osm = new ol.layer.Tile({ + source: new ol.source.OSM() + }); + + var map = new ol.Map({ + layers: [osm], + renderer: 'webgl', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) + }); + + var fragmentShaderSource = [ + 'precision mediump float;', + 'void main() {', + '}' + ].join(''); + + var vertexShaderSource = [ + 'attribute vec2 a_position;', + 'void main() {', + ' gl_Position = vec4(a_position, 0, 1);', + '}' + ].join(''); + + osm.on('precompose', function(event) { + var context = event.glContext; + + var gl = context.getGL(); + var program = gl.createProgram(); + + var vertexShader = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vertexShader, vertexShaderSource); + gl.compileShader(vertexShader); + gl.attachShader(program, vertexShader); + + var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fragmentShader, fragmentShaderSource); + gl.compileShader(fragmentShader); + gl.attachShader(program, fragmentShader); + + gl.linkProgram(program); + context.useProgram(program); + + var positionLocation = gl.getAttribLocation(program, 'a_position'); + + gl.enable(gl.STENCIL_TEST); + gl.colorMask(false, false, false, false); + gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE); + gl.stencilFunc(gl.ALWAYS, 1, 0xff); + + var buffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ + // first band + -1.0, -1.0, -0.75, -1.0, -1.0, 1.0, + -1.0, 1.0, -0.75, -1.0, -0.75, 1.0, + // second band + -0.5, -1.0, -0.25, -1.0, -0.5, 1.0, + -0.5, 1.0, -0.25, -1.0, -0.25, 1.0, + // third band + 0.0, -1.0, 0.25, -1.0, 0.0, 1.0, + 0.0, 1.0, 0.25, -1.0, 0.25, 1.0, + // forth band + 0.5, -1.0, 0.75, -1.0, 0.5, 1.0, + 0.5, 1.0, 0.75, -1.0, 0.75, 1.0 + ]), gl.STATIC_DRAW); + + gl.enableVertexAttribArray(positionLocation); + gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); + gl.drawArrays(gl.TRIANGLES, 0, 24); + + gl.bindBuffer(gl.ARRAY_BUFFER, null); + gl.deleteBuffer(buffer); + + gl.colorMask(true, true, true, true); + gl.stencilFunc(gl.NOTEQUAL, 0, 0xff); + gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); + }); + + osm.on('postcompose', function(event) { + var context = event.glContext; + var gl = context.getGL(); + gl.disable(gl.STENCIL_TEST); + }); +} diff --git a/float-no-zero/examples/layer-clipping.html b/float-no-zero/examples/layer-clipping.html new file mode 100644 index 0000000000..44ca7a1abb --- /dev/null +++ b/float-no-zero/examples/layer-clipping.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Layer clipping example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Layer clipping example

+

Layer clipping example.

+
+

See the layer-clipping.js source to see how this is done.

+
+
clipping, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/layer-clipping.js b/float-no-zero/examples/layer-clipping.js new file mode 100644 index 0000000000..f7bc51ce01 --- /dev/null +++ b/float-no-zero/examples/layer-clipping.js @@ -0,0 +1,36 @@ +var osm = new ol.layer.Tile({ + source: new ol.source.OSM() +}); + +var map = new ol.Map({ + layers: [osm], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +osm.on('precompose', function(event) { + var ctx = event.context; + ctx.save(); + ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2); + ctx.scale(3, 3); + ctx.translate(-75, -80); + ctx.beginPath(); + ctx.moveTo(75, 40); + ctx.bezierCurveTo(75, 37, 70, 25, 50, 25); + ctx.bezierCurveTo(20, 25, 20, 62.5, 20, 62.5); + ctx.bezierCurveTo(20, 80, 40, 102, 75, 120); + ctx.bezierCurveTo(110, 102, 130, 80, 130, 62.5); + ctx.bezierCurveTo(130, 62.5, 130, 25, 100, 25); + ctx.bezierCurveTo(85, 25, 75, 37, 75, 40); + ctx.clip(); + ctx.setTransform(1, 0, 0, 1, 0, 0); +}); + +osm.on('postcompose', function(event) { + var ctx = event.context; + ctx.restore(); +}); diff --git a/float-no-zero/examples/layer-group-require.js b/float-no-zero/examples/layer-group-require.js new file mode 100644 index 0000000000..21fcec0af1 --- /dev/null +++ b/float-no-zero/examples/layer-group-require.js @@ -0,0 +1,8 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.dom.Input'); +goog.require('ol.layer.Group'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.MapQuest'); +goog.require('ol.source.TileJSON'); diff --git a/float-no-zero/examples/layer-group.html b/float-no-zero/examples/layer-group.html new file mode 100644 index 0000000000..cd5bba33d2 --- /dev/null +++ b/float-no-zero/examples/layer-group.html @@ -0,0 +1,126 @@ + + + + + + + + + + + + Layer group example + + + + + +
+ +
+
+
+ +

Layer group example

+

Example of a map with layer group.

+
+

See the layer-group.js source to see how this is done.

+
+
tilejson, input, bind, group, layergroup
+
+ +
+
Click on layer nodes below to change their properties.
+
    +
  • OpenAerial layer +
    + + + + + + + + + + + +
    +
  • +
  • Layer group +
    + + + + + + + + + + + +
    +
      +
    • Food insecurity layer +
      + + + + + + + + + + + +
      +
    • +
    • World borders layer +
      + + + + + + + + + + + +
      +
    • +
    +
  • +
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/layer-group.js b/float-no-zero/examples/layer-group.js new file mode 100644 index 0000000000..bfa1e7a897 --- /dev/null +++ b/float-no-zero/examples/layer-group.js @@ -0,0 +1,54 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }), new ol.layer.Group({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.TileJSON({ + url: 'http://api.tiles.mapbox.com/v3/' + + 'mapbox.20110804-hoa-foodinsecurity-3month.jsonp', + crossOrigin: 'anonymous' + }) + }), + new ol.layer.Tile({ + source: new ol.source.TileJSON({ + url: 'http://api.tiles.mapbox.com/v3/' + + 'mapbox.world-borders-light.jsonp', + crossOrigin: 'anonymous' + }) + }) + ] + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform([37.40570, 8.81566], 'EPSG:4326', 'EPSG:3857'), + zoom: 4 + }) +}); + +function bindInputs(layerid, layer) { + new ol.dom.Input($(layerid + ' .visible')[0]) + .bindTo('checked', layer, 'visible'); + $.each(['opacity', 'hue', 'saturation', 'contrast', 'brightness'], + function(i, v) { + new ol.dom.Input($(layerid + ' .' + v)[0]) + .bindTo('value', layer, v) + .transform(parseFloat, String); + } + ); +} +map.getLayers().forEach(function(layer, i) { + bindInputs('#layer' + i, layer); + if (layer instanceof ol.layer.Group) { + layer.getLayers().forEach(function(sublayer, j) { + bindInputs('#layer' + i + j, sublayer); + }); + } +}); + +$('#layertree li > span').click(function() { + $(this).siblings('fieldset').toggle(); +}).siblings('fieldset').hide(); diff --git a/float-no-zero/examples/layer-spy-require.js b/float-no-zero/examples/layer-spy-require.js new file mode 100644 index 0000000000..6ef82a9158 --- /dev/null +++ b/float-no-zero/examples/layer-spy-require.js @@ -0,0 +1,5 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.BingMaps'); diff --git a/float-no-zero/examples/layer-spy.html b/float-no-zero/examples/layer-spy.html new file mode 100644 index 0000000000..3197da3bc9 --- /dev/null +++ b/float-no-zero/examples/layer-spy.html @@ -0,0 +1,60 @@ + + + + + + + + + + + Layer Spy Example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Layer spy example

+

View a portion of one layer over another

+
+

+ Layer rendering can be manipulated in precompose and postcompose event listeners. + These listeners get an event with a reference to the Canvas rendering context. + In this example, the precompose listener sets a clipping mask around the most + recent mouse position, giving you a spyglass effect for viewing one layer over another. +

+

+ Move around the map to see the effect. Use the ↑ up and ↓ down arrow keys to adjust the spyglass size. +

+

See the layer-spy.js source to see how this is done.

+
+
spy, image manipulation
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/layer-spy.js b/float-no-zero/examples/layer-spy.js new file mode 100644 index 0000000000..fc97da1cfe --- /dev/null +++ b/float-no-zero/examples/layer-spy.js @@ -0,0 +1,61 @@ +var key = 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'; + +var roads = new ol.layer.Tile({ + source: new ol.source.BingMaps({key: key, imagerySet: 'Road'}) +}); + +var imagery = new ol.layer.Tile({ + source: new ol.source.BingMaps({key: key, imagerySet: 'Aerial'}) +}); + +var map = new ol.Map({ + layers: [roads, imagery], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform([-109, 46.5], 'EPSG:4326', 'EPSG:3857'), + zoom: 6 + }) +}); + +var radius = 75; +$(document).keydown(function(evt) { + if (evt.which === 38) { + radius = Math.min(radius + 5, 150); + map.render(); + } else if (evt.which === 40) { + radius = Math.max(radius - 5, 25); + map.render(); + } +}); + +// get the pixel position with every move +var mousePosition = null; +$(map.getViewport()).on('mousemove', function(evt) { + mousePosition = map.getEventPixel(evt.originalEvent); + map.render(); +}).on('mouseout', function() { + mousePosition = null; + map.render(); +}); + +// before rendering the layer, do some clipping +imagery.on('precompose', function(event) { + var ctx = event.context; + ctx.save(); + ctx.beginPath(); + if (mousePosition) { + // only show a circle around the mouse + ctx.arc(mousePosition[0], mousePosition[1], radius, 0, 2 * Math.PI); + ctx.lineWidth = 5; + ctx.strokeStyle = 'rgba(0,0,0,0.5)'; + ctx.stroke(); + } + ctx.clip(); +}); + +// after rendering the layer, restore the canvas context +imagery.on('postcompose', function(event) { + var ctx = event.context; + ctx.restore(); +}); diff --git a/float-no-zero/examples/layer-swipe-require.js b/float-no-zero/examples/layer-swipe-require.js new file mode 100644 index 0000000000..e197f81e73 --- /dev/null +++ b/float-no-zero/examples/layer-swipe-require.js @@ -0,0 +1,5 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.BingMaps'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/layer-swipe.html b/float-no-zero/examples/layer-swipe.html new file mode 100644 index 0000000000..c766274bfe --- /dev/null +++ b/float-no-zero/examples/layer-swipe.html @@ -0,0 +1,52 @@ + + + + + + + + + + + Layer Swipe example + + + + + +
+ +
+
+
+ +
+
+ +
+ +
+

Layer Swipe example

+

Example of a Layer swipe map.

+
+

See the layer-swipe.js source to see how this is done.

+
+
swipe, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/layer-swipe.js b/float-no-zero/examples/layer-swipe.js new file mode 100644 index 0000000000..62ae9920af --- /dev/null +++ b/float-no-zero/examples/layer-swipe.js @@ -0,0 +1,40 @@ +var osm = new ol.layer.Tile({ + source: new ol.source.OSM() +}); +var bing = new ol.layer.Tile({ + source: new ol.source.BingMaps({ + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3', + imagerySet: 'Aerial' + }) +}); + +var map = new ol.Map({ + layers: [osm, bing], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +var swipe = document.getElementById('swipe'); + +bing.on('precompose', function(event) { + var ctx = event.context; + var width = ctx.canvas.width * (swipe.value / 100); + + ctx.save(); + ctx.beginPath(); + ctx.rect(width, 0, ctx.canvas.width - width, ctx.canvas.height); + ctx.clip(); +}); + +bing.on('postcompose', function(event) { + var ctx = event.context; + ctx.restore(); +}); + +swipe.addEventListener('input', function() { + map.render(); +}, false); diff --git a/float-no-zero/examples/loader.js b/float-no-zero/examples/loader.js new file mode 100644 index 0000000000..d5dda87429 --- /dev/null +++ b/float-no-zero/examples/loader.js @@ -0,0 +1,78 @@ +/** + * Loader to add ol.css, ol.js and the example-specific js file to the + * documents. + * + * This loader is used for the hosted examples. It is used in place of the + * development loader (examples/loader.js). + * + * ol.js, ol-simple.js, ol-whitespace.js, and ol-deps.js are built + * by OL3's build.py script. They are located in the ../build/ directory, + * relatively to this script. + * + * The script must be named loader.js. + * + * Usage: + * + * + */ + +(function() { + + var i, pair; + + var href = window.location.href, start, end, paramsString, pairs, + pageParams = {}; + if (href.indexOf('?') > 0) { + start = href.indexOf('?') + 1; + end = href.indexOf('#') > 0 ? href.indexOf('#') : href.length; + paramsString = href.substring(start, end); + pairs = paramsString.split(/[&;]/); + for (i = 0; i < pairs.length; ++i) { + pair = pairs[i].split('='); + if (pair[0]) { + pageParams[decodeURIComponent(pair[0])] = + decodeURIComponent(pair[1]); + } + } + } + + var scripts = document.getElementsByTagName('script'); + var src, index, search, chunks, scriptParams = {}; + for (i = scripts.length - 1; i >= 0; --i) { + src = scripts[i].getAttribute('src'); + if (~(index = src.indexOf('loader.js?'))) { + search = src.substr(index + 10); + chunks = search ? search.split('&') : []; + for (i = chunks.length - 1; i >= 0; --i) { + pair = chunks[i].split('='); + if (pair[0]) { + scriptParams[decodeURIComponent(pair[0])] = + decodeURIComponent(pair[1]); + } + } + break; + } + } + + var oljs = 'ol.js', mode; + if ('mode' in pageParams) { + mode = pageParams.mode.toLowerCase(); + if (mode == 'debug') { + mode = 'raw'; + } + if (mode != 'advanced' && mode != 'raw') { + oljs = 'ol-' + mode + '.js'; + } + } + + var scriptId = encodeURIComponent(scriptParams.id); + if (mode != 'raw') { + document.write(''); + } else { + window.CLOSURE_NO_DEPS = true; // we've got our own deps file + document.write(''); + document.write(''); + document.write(''); + } + document.write(''); +}()); diff --git a/float-no-zero/examples/localized-openstreetmap-require.js b/float-no-zero/examples/localized-openstreetmap-require.js new file mode 100644 index 0000000000..e76328140e --- /dev/null +++ b/float-no-zero/examples/localized-openstreetmap-require.js @@ -0,0 +1,5 @@ +goog.require('ol.Attribution'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/localized-openstreetmap.html b/float-no-zero/examples/localized-openstreetmap.html new file mode 100644 index 0000000000..cdcc3b8f3a --- /dev/null +++ b/float-no-zero/examples/localized-openstreetmap.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Localized OpenStreetMap example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Localized OpenStreetMap example

+

Example of a localized OpenStreetMap map with a custom tile server and a custom attribution. The base layer is OpenCycleMap with an overlay from OpenSeaMap. The OpenSeaMap tile server does not support CORS headers.

+
+

See the localized-openstreetmap.js source to see how this is done.

+
+
cors, localized-openstreetmap, openseamap, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/localized-openstreetmap.js b/float-no-zero/examples/localized-openstreetmap.js new file mode 100644 index 0000000000..5e47ed3207 --- /dev/null +++ b/float-no-zero/examples/localized-openstreetmap.js @@ -0,0 +1,44 @@ +// tiles.openseamap.org does not set CORS headers, so we have to disable +// crossOrigin and we cannot use WebGL. + +var openCycleMapLayer = new ol.layer.Tile({ + source: new ol.source.OSM({ + attributions: [ + new ol.Attribution({ + html: 'All maps © ' + + 'OpenCycleMap' + }), + ol.source.OSM.DATA_ATTRIBUTION + ], + url: 'http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png' + }) +}); + +var openSeaMapLayer = new ol.layer.Tile({ + source: new ol.source.OSM({ + attributions: [ + new ol.Attribution({ + html: 'All maps © ' + + 'OpenSeaMap' + }), + ol.source.OSM.DATA_ATTRIBUTION + ], + crossOrigin: null, + url: 'http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png' + }) +}); + + +var map = new ol.Map({ + layers: [ + openCycleMapLayer, + openSeaMapLayer + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + maxZoom: 18, + center: [-244780.24508882355, 5986452.183179816], + zoom: 15 + }) +}); diff --git a/float-no-zero/examples/mapguide-untiled-require.js b/float-no-zero/examples/mapguide-untiled-require.js new file mode 100644 index 0000000000..6e15a9385c --- /dev/null +++ b/float-no-zero/examples/mapguide-untiled-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Image'); +goog.require('ol.source.MapGuide'); diff --git a/float-no-zero/examples/mapguide-untiled.html b/float-no-zero/examples/mapguide-untiled.html new file mode 100644 index 0000000000..a0acdfc64f --- /dev/null +++ b/float-no-zero/examples/mapguide-untiled.html @@ -0,0 +1,51 @@ + + + + + + + + + + + MapGuide untiled example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

MapGuide untiled example

+

Example of a untiled MapGuide map.

+
+

See the mapguide-untiled.js source to see how this is done.

+
+
mapguide
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/mapguide-untiled.js b/float-no-zero/examples/mapguide-untiled.js new file mode 100644 index 0000000000..6bb00678b3 --- /dev/null +++ b/float-no-zero/examples/mapguide-untiled.js @@ -0,0 +1,34 @@ +var mdf = 'Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition'; +var agentUrl = + 'http://data.mapguide.com/mapguide/mapagent/mapagent.fcgi?USERNAME=Anonymous'; +var bounds = [ + -87.865114442365922, + 43.665065564837931, + -87.595394059497067, + 43.823852564430069 +]; +var map = new ol.Map({ + layers: [ + new ol.layer.Image({ + source: new ol.source.MapGuide({ + projection: 'EPSG:4326', + url: agentUrl, + useOverlay: false, + metersPerUnit: 111319.4908, //value returned from mapguide + params: { + MAPDEFINITION: mdf, + FORMAT: 'PNG' + }, + ratio: 2, + extent: bounds + }) + }) + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [-87.7302542509315, 43.744459064634], + projection: 'EPSG:4326', + zoom: 12 + }) +}); diff --git a/float-no-zero/examples/mapquest-require.js b/float-no-zero/examples/mapquest-require.js new file mode 100644 index 0000000000..0149e26ed2 --- /dev/null +++ b/float-no-zero/examples/mapquest-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Group'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.MapQuest'); diff --git a/float-no-zero/examples/mapquest.html b/float-no-zero/examples/mapquest.html new file mode 100644 index 0000000000..4cf374813b --- /dev/null +++ b/float-no-zero/examples/mapquest.html @@ -0,0 +1,56 @@ + + + + + + + + + + + MapQuest example + + + + + +
+ +
+
+
+ +
+
+ +
+ +
+

MapQuest example

+

Example of a MapQuest map.

+
+

See the mapquest.js source to see how this is done.

+
+
mapquest
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/mapquest.js b/float-no-zero/examples/mapquest.js new file mode 100644 index 0000000000..9c6aa559c2 --- /dev/null +++ b/float-no-zero/examples/mapquest.js @@ -0,0 +1,43 @@ +var layers = [ + new ol.layer.Tile({ + style: 'Road', + source: new ol.source.MapQuest({layer: 'osm'}) + }), + new ol.layer.Tile({ + style: 'Aerial', + visible: false, + source: new ol.source.MapQuest({layer: 'sat'}) + }), + new ol.layer.Group({ + style: 'AerialWithLabels', + visible: false, + layers: [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }), + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'hyb'}) + }) + ] + }) +]; + +var map = new ol.Map({ + layers: layers, + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform( + [-73.979378, 40.702222], 'EPSG:4326', 'EPSG:3857'), + zoom: 9 + }) +}); + +$('#layer-select').change(function() { + var style = $(this).find(':selected').val(); + var i, ii; + for (i = 0, ii = layers.length; i < ii; ++i) { + layers[i].set('visible', (layers[i].get('style') == style)); + } +}); +$('#layer-select').trigger('change'); diff --git a/float-no-zero/examples/min-max-resolution-require.js b/float-no-zero/examples/min-max-resolution-require.js new file mode 100644 index 0000000000..6ed5346733 --- /dev/null +++ b/float-no-zero/examples/min-max-resolution-require.js @@ -0,0 +1,5 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); +goog.require('ol.source.TileJSON'); diff --git a/float-no-zero/examples/min-max-resolution.html b/float-no-zero/examples/min-max-resolution.html new file mode 100644 index 0000000000..cce4c11a8f --- /dev/null +++ b/float-no-zero/examples/min-max-resolution.html @@ -0,0 +1,60 @@ + + + + + + + + + + + Min/max resolution example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Min/max resolution example

+

Show/hide layers depending on current view resolution.

+
+

+ Zoom in twice: the MapBox layer should hide whereas the OSM layer should be shown. +

+

+ If you continue to zoom in, you'll see the OSM layer also disappear. +

+

+ The rendering of the layers are here controlled using minResolution and maxResolution options. +

+

See the min-max-resolution.js source to see how this is done.

+
+
minResolution, maxResolution, resolution
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/min-max-resolution.js b/float-no-zero/examples/min-max-resolution.js new file mode 100644 index 0000000000..b5dc2f0cf3 --- /dev/null +++ b/float-no-zero/examples/min-max-resolution.js @@ -0,0 +1,27 @@ +/** + * Create the map. + */ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM(), + minResolution: 200, + maxResolution: 2000 + }), + new ol.layer.Tile({ + source: new ol.source.TileJSON({ + url: 'http://api.tiles.mapbox.com/v3/' + + 'mapbox.natural-earth-hypso-bathy.jsonp', + crossOrigin: 'anonymous' + }), + minResolution: 2000, + maxResolution: 20000 + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [653600, 5723680], + zoom: 5 + }) +}); diff --git a/float-no-zero/examples/mobile-full-screen-require.js b/float-no-zero/examples/mobile-full-screen-require.js new file mode 100644 index 0000000000..bb9a112f35 --- /dev/null +++ b/float-no-zero/examples/mobile-full-screen-require.js @@ -0,0 +1,5 @@ +goog.require('ol.Geolocation'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.BingMaps'); diff --git a/float-no-zero/examples/mobile-full-screen.html b/float-no-zero/examples/mobile-full-screen.html new file mode 100644 index 0000000000..bc146cd230 --- /dev/null +++ b/float-no-zero/examples/mobile-full-screen.html @@ -0,0 +1,29 @@ + + + + + + + Mobile full screen example + + + +
+ + + + +
+
Mobile full screen example
+
Example of a full screen map.
+
fullscreen, bing, geolocation, mobile
+
+ + diff --git a/float-no-zero/examples/mobile-full-screen.js b/float-no-zero/examples/mobile-full-screen.js new file mode 100644 index 0000000000..bde27ee0ff --- /dev/null +++ b/float-no-zero/examples/mobile-full-screen.js @@ -0,0 +1,27 @@ +var view = new ol.View2D({ + center: [0, 0], + zoom: 2 +}); + +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.BingMaps({ + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3', + imagerySet: 'Road' + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: view +}); + +var geolocation = new ol.Geolocation({ + tracking: true +}); +geolocation.bindTo('projection', view); +geolocation.once('change:position', function() { + view.setCenter(geolocation.getPosition()); + view.setResolution(2.388657133911758); +}); diff --git a/float-no-zero/examples/modify-features-require.js b/float-no-zero/examples/modify-features-require.js new file mode 100644 index 0000000000..2649db675f --- /dev/null +++ b/float-no-zero/examples/modify-features-require.js @@ -0,0 +1,13 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.interaction'); +goog.require('ol.interaction.Modify'); +goog.require('ol.interaction.Select'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.GeoJSON'); +goog.require('ol.source.MapQuest'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/modify-features.html b/float-no-zero/examples/modify-features.html new file mode 100644 index 0000000000..9be79fe94a --- /dev/null +++ b/float-no-zero/examples/modify-features.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + Modify features example + + + + + +
+ +
+
+
+ +
+
+ +
+ +
+

Modify features example

+

Example of using the Modify interaction.

+
+

Select a feature on the Test Data layer and drag the circle that appears when the cursor gets close to the selected geometry. On the Real data (topology) layer, editing adjacent countries that are selected preserves the topology.

+

See the modify-features.js source to see how this is done.

+
+
modify, edit, vector
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/modify-features.js b/float-no-zero/examples/modify-features.js new file mode 100644 index 0000000000..0793608ad1 --- /dev/null +++ b/float-no-zero/examples/modify-features.js @@ -0,0 +1,261 @@ +var raster = new ol.layer.Tile({ + style: 'Aerial', + source: new ol.source.MapQuest({ + layer: 'sat' + }) +}); + +var styleFunction = (function() { + var styles = {}; + var image = new ol.style.Circle({ + radius: 5, + fill: null, + stroke: new ol.style.Stroke({color: 'orange', width: 2}) + }); + styles['Point'] = [new ol.style.Style({image: image})]; + styles['Polygon'] = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'blue', + width: 3 + }), + fill: new ol.style.Fill({ + color: 'rgba(0, 0, 255, 0.1)' + }) + })]; + styles['MultiLinestring'] = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'green', + width: 3 + }) + })]; + styles['MultiPolygon'] = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'yellow', + width: 1 + }), + fill: new ol.style.Fill({ + color: 'rgba(255, 255, 0, 0.1)' + }) + })]; + styles['default'] = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'red', + width: 3 + }), + fill: new ol.style.Fill({ + color: 'rgba(255, 0, 0, 0.1)' + }), + image: image + })]; + return function(feature, resolution) { + return styles[feature.getGeometry().getType()] || styles['default']; + }; +})(); + +var testDataSource = new ol.source.GeoJSON( + /** @type {olx.source.GeoJSONOptions} */ ({ + object: { + 'type': 'FeatureCollection', + 'crs': { + 'type': 'name', + 'properties': { + 'name': 'EPSG:3857' + } + }, + 'features': [ + { + 'type': 'Feature', + 'geometry': { + 'type': 'Point', + 'coordinates': [0, 0] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'MultiPoint', + 'coordinates': [[-2e6, 0], [0, -2e6]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'LineString', + 'coordinates': [[4e6, -2e6], [8e6, 2e6], [9e6, 2e6]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'LineString', + 'coordinates': [[4e6, -2e6], [8e6, 2e6], [8e6, 3e6]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'Polygon', + 'coordinates': [[[-5e6, -1e6], [-4e6, 1e6], + [-3e6, -1e6], [-5e6, -1e6]]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'MultiLineString', + 'coordinates': [ + [[-1e6, -7.5e5], [-1e6, 7.5e5]], + [[1e6, -7.5e5], [1e6, 7.5e5]], + [[-7.5e5, -1e6], [7.5e5, -1e6]], + [[-7.5e5, 1e6], [7.5e5, 1e6]] + ] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'MultiPolygon', + 'coordinates': [ + [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6], + [-3e6, 6e6], [-5e6, 6e6]]], + [[[-2e6, 6e6], [-2e6, 8e6], [0e6, 8e6], + [0e6, 6e6], [-2e6, 6e6]]], + [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6], + [3e6, 6e6], [1e6, 6e6]]] + ] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'GeometryCollection', + 'geometries': [ + { + 'type': 'LineString', + 'coordinates': [[-5e6, -5e6], [0e6, -5e6]] + }, + { + 'type': 'Point', + 'coordinates': [4e6, -5e6] + }, + { + 'type': 'Polygon', + 'coordinates': [ + [[1e6, -6e6], [2e6, -4e6], [3e6, -6e6], [1e6, -6e6]] + ] + } + ] + } + } + ] + } + })); + +var testDataLayer = new ol.layer.Vector({ + source: testDataSource, + style: styleFunction +}); + +var realDataSource = new ol.source.GeoJSON({ + projection: 'EPSG:3857', + url: 'data/geojson/countries.geojson' +}); + +var realDataLayer = new ol.layer.Vector({ + source: realDataSource, + style: styleFunction +}); + +var overlayStyle = (function() { + var styles = {}; + styles['Polygon'] = [ + new ol.style.Style({ + fill: new ol.style.Fill({ + color: [255, 255, 255, 0.5] + }) + }), + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [255, 255, 255, 1], + width: 5 + }) + }), + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [0, 153, 255, 1], + width: 3 + }) + }) + ]; + styles['MultiPolygon'] = styles['Polygon']; + + styles['LineString'] = [ + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [255, 255, 255, 1], + width: 5 + }) + }), + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [0, 153, 255, 1], + width: 3 + }) + }) + ]; + styles['MultiLineString'] = styles['LineString']; + + styles['Point'] = [ + new ol.style.Style({ + image: new ol.style.Circle({ + radius: 7, + fill: new ol.style.Fill({ + color: [0, 153, 255, 1] + }), + stroke: new ol.style.Stroke({ + color: [255, 255, 255, 0.75], + width: 1.5 + }) + }), + zIndex: 100000 + }) + ]; + styles['MultiPoint'] = styles['Point']; + + styles['GeometryCollection'] = styles['Polygon'].concat(styles['Point']); + + return function(feature, resolution) { + return styles[feature.getGeometry().getType()]; + }; +})(); + +var select = new ol.interaction.Select({ + style: overlayStyle +}); + +var modify = new ol.interaction.Modify({ + features: select.getFeatures(), + style: overlayStyle +}); + +var map = new ol.Map({ + interactions: ol.interaction.defaults().extend([select, modify]), + layers: [raster, testDataLayer, realDataLayer], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +$('#layer-select').change(function() { + select.getFeatures().clear(); + var index = $(this).children().index($(this).find(':selected')); + var layers = [testDataLayer, realDataLayer]; + var i, ii; + for (i = 0, ii = layers.length; i < ii; ++i) { + layers[i].setVisible(index == i); + } +}); +$('#layer-select').trigger('change'); diff --git a/float-no-zero/examples/mouse-position-require.js b/float-no-zero/examples/mouse-position-require.js new file mode 100644 index 0000000000..77780918bb --- /dev/null +++ b/float-no-zero/examples/mouse-position-require.js @@ -0,0 +1,9 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.control'); +goog.require('ol.control.MousePosition'); +goog.require('ol.coordinate'); +goog.require('ol.dom.Input'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/mouse-position.html b/float-no-zero/examples/mouse-position.html new file mode 100644 index 0000000000..1f81320e37 --- /dev/null +++ b/float-no-zero/examples/mouse-position.html @@ -0,0 +1,59 @@ + + + + + + + + + + + Mouse position example + + + + + +
+ +
+
+
+
+
+ +
+
+

Mouse position example

+

Example of a mouse position control, outside the map.

+
+

See the mouse-position.js source to see how this is done.

+
+
mouse-position, openstreetmap
+
+ + + + + +
+
 
+
+ +
+ + + + + + + diff --git a/float-no-zero/examples/mouse-position.js b/float-no-zero/examples/mouse-position.js new file mode 100644 index 0000000000..e2acd89bdd --- /dev/null +++ b/float-no-zero/examples/mouse-position.js @@ -0,0 +1,42 @@ +var mousePositionControl = new ol.control.MousePosition({ + coordinateFormat: ol.coordinate.createStringXY(4), + projection: 'EPSG:4326', + // comment the following two lines to have the mouse position + // be placed within the map. + className: 'custom-mouse-position', + target: document.getElementById('mouse-position'), + undefinedHTML: ' ' +}); + +var map = new ol.Map({ + controls: ol.control.defaults().extend([mousePositionControl]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +var projectionSelect = new ol.dom.Input(document.getElementById('projection')); +projectionSelect.bindTo('value', mousePositionControl, 'projection') + .transform( + function(code) { + // projectionSelect.value -> mousePositionControl.projection + return ol.proj.get(/** @type {string} */ (code)); + }, + function(projection) { + // mousePositionControl.projection -> projectionSelect.value + return projection.getCode(); + }); + +var precisionInput = document.getElementById('precision'); +precisionInput.addEventListener('change', function() { + var format = ol.coordinate.createStringXY(precisionInput.valueAsNumber); + mousePositionControl.setCoordinateFormat(format); +}, false); diff --git a/float-no-zero/examples/moveend-require.js b/float-no-zero/examples/moveend-require.js new file mode 100644 index 0000000000..221faa5f7d --- /dev/null +++ b/float-no-zero/examples/moveend-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.extent'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/moveend.html b/float-no-zero/examples/moveend.html new file mode 100644 index 0000000000..4293b19b93 --- /dev/null +++ b/float-no-zero/examples/moveend.html @@ -0,0 +1,54 @@ + + + + + + + + + + + Moveend Example + + + + + +
+
+
+
+
+
+ +
+
+

Move end example

+

Use of the moveend event.

+
+

In this example, a listener is registered for the map's moveend event. Whenever this listener is called, it updates the inputs below with the map extent in decimal degrees.

+

See the moveend.js source for details on how this is done.

+
+
moveend, map, event
+ + + + +
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/moveend.js b/float-no-zero/examples/moveend.js new file mode 100644 index 0000000000..482ffedff9 --- /dev/null +++ b/float-no-zero/examples/moveend.js @@ -0,0 +1,37 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +function display(id, value) { + document.getElementById(id).value = value.toFixed(2); +} + +function wrapLon(value) { + var worlds = Math.floor((value + 180) / 360); + return value - (worlds * 360); +} + +function onMoveEnd(evt) { + var map = evt.map; + var extent = map.getView().calculateExtent(map.getSize()); + var bottomLeft = ol.proj.transform(ol.extent.getBottomLeft(extent), + 'EPSG:3857', 'EPSG:4326'); + var topRight = ol.proj.transform(ol.extent.getTopRight(extent), + 'EPSG:3857', 'EPSG:4326'); + display('left', wrapLon(bottomLeft[0])); + display('bottom', bottomLeft[1]); + display('right', wrapLon(topRight[0])); + display('top', topRight[1]); +} + +map.on('moveend', onMoveEnd); diff --git a/float-no-zero/examples/navigation-controls-require.js b/float-no-zero/examples/navigation-controls-require.js new file mode 100644 index 0000000000..bc5b68a6c2 --- /dev/null +++ b/float-no-zero/examples/navigation-controls-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.control'); +goog.require('ol.control.ZoomToExtent'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/navigation-controls.html b/float-no-zero/examples/navigation-controls.html new file mode 100644 index 0000000000..5f26bf6ddc --- /dev/null +++ b/float-no-zero/examples/navigation-controls.html @@ -0,0 +1,56 @@ + + + + + + + + + + + Navigation controls example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Navigation controls example

+

Shows how to add navigation controls.

+ The following navigation controls are added to the map: +
    +
  • ol.control.Zoom (added by default)
  • +
  • ol.control.ZoomToExtent
  • +
+
+

See the navigation-controls.js source to see how this is done.

+
+
control, navigation, extent
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/navigation-controls.js b/float-no-zero/examples/navigation-controls.js new file mode 100644 index 0000000000..97a1055f1e --- /dev/null +++ b/float-no-zero/examples/navigation-controls.js @@ -0,0 +1,21 @@ +var map = new ol.Map({ + controls: ol.control.defaults().extend([ + new ol.control.ZoomToExtent({ + extent: [ + 813079.7791264898, 5929220.284081122, + 848966.9639063801, 5936863.986909639 + ] + }) + ]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/overlay-require.js b/float-no-zero/examples/overlay-require.js new file mode 100644 index 0000000000..89c096d414 --- /dev/null +++ b/float-no-zero/examples/overlay-require.js @@ -0,0 +1,7 @@ +goog.require('ol.Map'); +goog.require('ol.Overlay'); +goog.require('ol.View2D'); +goog.require('ol.coordinate'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.MapQuest'); diff --git a/float-no-zero/examples/overlay.html b/float-no-zero/examples/overlay.html new file mode 100644 index 0000000000..fbcd35d983 --- /dev/null +++ b/float-no-zero/examples/overlay.html @@ -0,0 +1,85 @@ + + + + + + + + + + + + Overlay example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Overlay example

+

Demonstrates overlays.

+
+

The popups are created using + Popovers from Bootstrap.

+

See the overlay.js source to see how this is done.

+
+
overlay, popup, bootstrap, popover, mapquest, openaerial
+
+ +
+ +
+ +
+ + Vienna +
+ + +
+ + + + + + + + diff --git a/float-no-zero/examples/overlay.js b/float-no-zero/examples/overlay.js new file mode 100644 index 0000000000..75a59366b6 --- /dev/null +++ b/float-no-zero/examples/overlay.js @@ -0,0 +1,55 @@ +var layer = new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) +}); + +var map = new ol.Map({ + layers: [layer], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +var pos = ol.proj.transform([16.3725, 48.208889], 'EPSG:4326', 'EPSG:3857'); + +// Vienna marker +var marker = new ol.Overlay({ + position: pos, + positioning: 'center-center', + element: document.getElementById('marker'), + stopEvent: false +}); +map.addOverlay(marker); + +// Vienna label +var vienna = new ol.Overlay({ + position: pos, + element: document.getElementById('vienna') +}); +map.addOverlay(vienna); + +// Popup showing the position the user clicked +var popup = new ol.Overlay({ + element: document.getElementById('popup') +}); +map.addOverlay(popup); + +map.on('singleclick', function(evt) { + var element = popup.getElement(); + var coordinate = evt.coordinate; + var hdms = ol.coordinate.toStringHDMS(ol.proj.transform( + coordinate, 'EPSG:3857', 'EPSG:4326')); + + $(element).popover('destroy'); + popup.setPosition(coordinate); + // the keys are quoted to prevent renaming in ADVANCED_OPTIMIZATIONS mode. + $(element).popover({ + 'placement': 'top', + 'animation': false, + 'html': true, + 'content': '

The location you clicked was:

' + hdms + '' + }); + $(element).popover('show'); +}); diff --git a/float-no-zero/examples/popup-require.js b/float-no-zero/examples/popup-require.js new file mode 100644 index 0000000000..8bc5f759b7 --- /dev/null +++ b/float-no-zero/examples/popup-require.js @@ -0,0 +1,7 @@ +goog.require('ol.Map'); +goog.require('ol.Overlay'); +goog.require('ol.View2D'); +goog.require('ol.coordinate'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.TileJSON'); diff --git a/float-no-zero/examples/popup.html b/float-no-zero/examples/popup.html new file mode 100644 index 0000000000..cac36a8c1e --- /dev/null +++ b/float-no-zero/examples/popup.html @@ -0,0 +1,106 @@ + + + + + + + + + + + + Popup example + + + + + +
+ +
+
+
+ +
+
+
+ +
+ +
+

Popup example

+

Uses an overlay to create a popup.

+
+

+ Click on the map to get a popup. The popup is composed of a few basic elements: a container, a close button, and a place for the content. To anchor the popup to the map, an ol.Overlay is created with the popup container. A listener is registered for the map's click event to display the popup, and another listener is set as the click handler for the close button to hide the popup. +

+

+ See the popup.js source to see how this is done. +

+
+
overlay, popup, mapquest, openaerial
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/popup.js b/float-no-zero/examples/popup.js new file mode 100644 index 0000000000..c01236e212 --- /dev/null +++ b/float-no-zero/examples/popup.js @@ -0,0 +1,64 @@ +/** + * Elements that make up the popup. + */ +var container = document.getElementById('popup'); +var content = document.getElementById('popup-content'); +var closer = document.getElementById('popup-closer'); + + +/** + * Add a click handler to hide the popup. + * @return {boolean} Don't follow the href. + */ +closer.onclick = function() { + container.style.display = 'none'; + closer.blur(); + return false; +}; + + +/** + * Create an overlay to anchor the popup to the map. + */ +var overlay = new ol.Overlay({ + element: container +}); + + +/** + * Create the map. + */ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.TileJSON({ + url: 'http://api.tiles.mapbox.com/v3/' + + 'mapbox.natural-earth-hypso-bathy.jsonp', + crossOrigin: 'anonymous' + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + overlays: [overlay], + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + + +/** + * Add a click handler to the map to render the popup. + */ +map.on('singleclick', function(evt) { + var coordinate = evt.coordinate; + var hdms = ol.coordinate.toStringHDMS(ol.proj.transform( + coordinate, 'EPSG:3857', 'EPSG:4326')); + + overlay.setPosition(coordinate); + content.innerHTML = '

You clicked here:

' + hdms + + ''; + container.style.display = 'block'; + +}); diff --git a/float-no-zero/examples/preload-require.js b/float-no-zero/examples/preload-require.js new file mode 100644 index 0000000000..a99a9ac828 --- /dev/null +++ b/float-no-zero/examples/preload-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.BingMaps'); diff --git a/float-no-zero/examples/preload.html b/float-no-zero/examples/preload.html new file mode 100644 index 0000000000..ea7991a48c --- /dev/null +++ b/float-no-zero/examples/preload.html @@ -0,0 +1,55 @@ + + + + + + + + + + + Preload example + + + + + +
+ +
+
+
+
+
+
+
+
+ +
+ +
+

Preload example

+

Example of tile preloading.

+
+

The map on the left preloads low resolution tiles. The map on the right does not use any preloading. Try zooming out and panning to see the difference.

+

See the preload.js source to see how this is done.

+
+
preload, bing
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/preload.js b/float-no-zero/examples/preload.js new file mode 100644 index 0000000000..4f06ac2ed1 --- /dev/null +++ b/float-no-zero/examples/preload.js @@ -0,0 +1,32 @@ +var map1 = new ol.Map({ + layers: [ + new ol.layer.Tile({ + preload: Infinity, + source: new ol.source.BingMaps({ + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3', + imagerySet: 'Aerial' + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map1', + view: new ol.View2D({ + center: [-4808600, -2620936], + zoom: 8 + }) +}); + +var map2 = new ol.Map({ + layers: [ + new ol.layer.Tile({ + preload: 0, // default value + source: new ol.source.BingMaps({ + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3', + imagerySet: 'AerialWithLabels' + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map2' +}); +map2.bindTo('view', map1); diff --git a/float-no-zero/examples/rotation-require.js b/float-no-zero/examples/rotation-require.js new file mode 100644 index 0000000000..b59a219231 --- /dev/null +++ b/float-no-zero/examples/rotation-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/rotation.html b/float-no-zero/examples/rotation.html new file mode 100644 index 0000000000..c9aeda2df1 --- /dev/null +++ b/float-no-zero/examples/rotation.html @@ -0,0 +1,52 @@ + + + + + + + + + + + Rotation example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Rotation example

+

Example of a rotated map.

+
+

Use Alt+Shift+drag to rotate the map.

+

See the rotation.js source to see how this is done.

+
+
rotation, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/rotation.js b/float-no-zero/examples/rotation.js new file mode 100644 index 0000000000..cd4ec486df --- /dev/null +++ b/float-no-zero/examples/rotation.js @@ -0,0 +1,14 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [-25860000, 4130000], + rotation: Math.PI / 6, + zoom: 10 + }) +}); diff --git a/float-no-zero/examples/rtree-require.js b/float-no-zero/examples/rtree-require.js new file mode 100644 index 0000000000..8633f97fae --- /dev/null +++ b/float-no-zero/examples/rtree-require.js @@ -0,0 +1,11 @@ +goog.require('ol.Feature'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.extent'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.Polygon'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.Vector'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/rtree.html b/float-no-zero/examples/rtree.html new file mode 100644 index 0000000000..937100ce3b --- /dev/null +++ b/float-no-zero/examples/rtree.html @@ -0,0 +1,51 @@ + + + + + + + + + + + R-Tree example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

R-Tree example

+

R-Tree example. Please note that this example only works locally, it does not work when the examples are hosted. This is because it accesses internals the R-Tree data structure, which are not exported in the API.

+
+

See the rtree.js source to see how this is done.

+
+
vector, rtree
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/rtree.js b/float-no-zero/examples/rtree.js new file mode 100644 index 0000000000..804689ced3 --- /dev/null +++ b/float-no-zero/examples/rtree.js @@ -0,0 +1,91 @@ +var i, ii, j, jj; + +var count = 2000; +var features = new Array(count); +var e = 18000000; +for (i = 0; i < count; ++i) { + features[i] = new ol.Feature({ + 'geometry': new ol.geom.Point( + [2 * e * Math.random() - e, 2 * e * Math.random() - e]) + }); +} +var vectorSource = new ol.source.Vector({ + features: features +}); + +var styleArray = [new ol.style.Style({ + image: new ol.style.Circle({ + radius: 3, + fill: null, + stroke: new ol.style.Stroke({color: 'red', width: 1}) + }) +})]; + +var colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']; +var depthStyle = []; +for (i = 0, ii = colors.length; i < ii; ++i) { + depthStyle[i] = new ol.style.Style({ + fill: null, + image: null, + stroke: new ol.style.Stroke({ + color: colors[i], + width: (7 - i) / 2 + }), + zIndex: i + }); +} +var extentsByDepth = []; +vectorSource.rBush_.forEachNode(function(node) { + if (node.height > 0) { + if (goog.isDef(extentsByDepth[node.height])) { + extentsByDepth[node.height].push(node.extent); + } else { + extentsByDepth[node.height] = [node.extent]; + } + } +}); +var rtreeExtentFeatures = []; +for (i = 0, ii = extentsByDepth.length; i < ii; ++i) { + var extents = extentsByDepth[i]; + if (!goog.isDef(extents)) { + continue; + } + for (j = 0, jj = extents.length; j < jj; ++j) { + var extent = extents[j]; + var geometry = new ol.geom.Polygon([[ + ol.extent.getBottomLeft(extent), + ol.extent.getTopLeft(extent), + ol.extent.getTopRight(extent), + ol.extent.getBottomRight(extent) + ]]); + var feature = new ol.Feature({ + 'geometry': geometry, + 'styleArray': [depthStyle[i]] + }); + rtreeExtentFeatures.push(feature); + } +} + +var vector = new ol.layer.Vector({ + source: vectorSource, + style: styleArray +}); + +var rtree = new ol.layer.Vector({ + source: new ol.source.Vector({ + features: rtreeExtentFeatures + }), + style: function(feature, resolution) { + return feature.get('styleArray'); + } +}); + +var map = new ol.Map({ + layers: [vector, rtree], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/scale-line-require.js b/float-no-zero/examples/scale-line-require.js new file mode 100644 index 0000000000..7458a596eb --- /dev/null +++ b/float-no-zero/examples/scale-line-require.js @@ -0,0 +1,7 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.control'); +goog.require('ol.control.ScaleLine'); +goog.require('ol.dom.Input'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/scale-line.html b/float-no-zero/examples/scale-line.html new file mode 100644 index 0000000000..41ff9734e1 --- /dev/null +++ b/float-no-zero/examples/scale-line.html @@ -0,0 +1,56 @@ + + + + + + + + + + + Scale line example + + + + + +
+ +
+
+
+ +
+
+ +
+ +
+

Scale line example

+

Example of a scale line.

+
+

See the scale-line.js source to see how this is done.

+
+
scale-line, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/scale-line.js b/float-no-zero/examples/scale-line.js new file mode 100644 index 0000000000..00c028030b --- /dev/null +++ b/float-no-zero/examples/scale-line.js @@ -0,0 +1,22 @@ +var scaleLineControl = new ol.control.ScaleLine(); + +var map = new ol.Map({ + controls: ol.control.defaults().extend([ + scaleLineControl + ]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + + +var unitsSelect = new ol.dom.Input(document.getElementById('units')); +unitsSelect.bindTo('value', scaleLineControl, 'units'); diff --git a/float-no-zero/examples/select-features-require.js b/float-no-zero/examples/select-features-require.js new file mode 100644 index 0000000000..f4660c9b96 --- /dev/null +++ b/float-no-zero/examples/select-features-require.js @@ -0,0 +1,11 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.interaction'); +goog.require('ol.interaction.Select'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.GeoJSON'); +goog.require('ol.source.MapQuest'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/select-features.html b/float-no-zero/examples/select-features.html new file mode 100644 index 0000000000..b2d66b34b3 --- /dev/null +++ b/float-no-zero/examples/select-features.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + Select features example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Select features example

+

Example of using the Select interaction. Select features by clicking polygons. Hold the Shift-key to add to the selection.

+
+

See the select-features.js source to see how this is done.

+
+
select, vector
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/select-features.js b/float-no-zero/examples/select-features.js new file mode 100644 index 0000000000..caf9905550 --- /dev/null +++ b/float-no-zero/examples/select-features.js @@ -0,0 +1,37 @@ +var raster = new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) +}); + +var vector = new ol.layer.Vector({ + source: new ol.source.GeoJSON({ + projection: 'EPSG:3857', + url: 'data/geojson/countries.geojson' + }), + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255,255,255,0.25)' + }), + stroke: new ol.style.Stroke({ + color: '#6666ff' + }) + }) +}); + +var select = new ol.interaction.Select({ + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255,255,255,0.5)' + }) + }) +}); + +var map = new ol.Map({ + interactions: ol.interaction.defaults().extend([select]), + layers: [raster, vector], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/semi-transparent-layer-require.js b/float-no-zero/examples/semi-transparent-layer-require.js new file mode 100644 index 0000000000..3b7758e7f4 --- /dev/null +++ b/float-no-zero/examples/semi-transparent-layer-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.MapQuest'); +goog.require('ol.source.TileJSON'); diff --git a/float-no-zero/examples/semi-transparent-layer.html b/float-no-zero/examples/semi-transparent-layer.html new file mode 100644 index 0000000000..0884ae3cfe --- /dev/null +++ b/float-no-zero/examples/semi-transparent-layer.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Semi-transparent layer example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Semi-transparent layer example

+

Example of a map with a semi-transparent layer.

+
+

See the semi-transparent-layer.js source to see how this is done.

+
+
transparent, mapquest, tilejson
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/semi-transparent-layer.js b/float-no-zero/examples/semi-transparent-layer.js new file mode 100644 index 0000000000..2ddb88013c --- /dev/null +++ b/float-no-zero/examples/semi-transparent-layer.js @@ -0,0 +1,19 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }), + new ol.layer.Tile({ + source: new ol.source.TileJSON({ + url: 'http://api.tiles.mapbox.com/v3/mapbox.va-quake-aug.jsonp', + crossOrigin: 'anonymous' + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform([-77.93255, 37.9555], 'EPSG:4326', 'EPSG:3857'), + zoom: 5 + }) +}); diff --git a/float-no-zero/examples/side-by-side-require.js b/float-no-zero/examples/side-by-side-require.js new file mode 100644 index 0000000000..30f445845f --- /dev/null +++ b/float-no-zero/examples/side-by-side-require.js @@ -0,0 +1,5 @@ +goog.require('ol.BrowserFeature'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.MapQuest'); diff --git a/float-no-zero/examples/side-by-side.html b/float-no-zero/examples/side-by-side.html new file mode 100644 index 0000000000..92607bdb6d --- /dev/null +++ b/float-no-zero/examples/side-by-side.html @@ -0,0 +1,63 @@ + + + + + + + + + + + Side-by-side example + + + + + +
+ +
+
+

Canvas

+
+
+
+

WebGL

+
+ +
+
+

DOM

+
+
+
+ +
+ +
+

Side-by-side example

+

The three maps, one WebGL, one Canvas, one DOM, share the same center, resolution, rotation and layers.

+
+

See the side-by-side.js source to see how this is done.

+
+
side-by-side, canvas, webgl, dom, canvas, sync, object
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/side-by-side.js b/float-no-zero/examples/side-by-side.js new file mode 100644 index 0000000000..f32716246d --- /dev/null +++ b/float-no-zero/examples/side-by-side.js @@ -0,0 +1,35 @@ +var domMap = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }) + ], + renderer: 'dom', + target: 'domMap', + view: new ol.View2D({ + center: [0, 0], + zoom: 1 + }) +}); + +if (ol.BrowserFeature.HAS_WEBGL) { + var webglMap = new ol.Map({ + renderer: 'webgl', + target: 'webglMap' + }); + webglMap.bindTo('layergroup', domMap); + webglMap.bindTo('view', domMap); +} else { + var info = document.getElementById('no-webgl'); + /** + * display error message + */ + info.style.display = ''; +} + +var canvasMap = new ol.Map({ + renderer: 'canvas', + target: 'canvasMap' +}); +canvasMap.bindTo('layergroup', domMap); +canvasMap.bindTo('view', domMap); diff --git a/float-no-zero/examples/simple-require.js b/float-no-zero/examples/simple-require.js new file mode 100644 index 0000000000..b59a219231 --- /dev/null +++ b/float-no-zero/examples/simple-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/simple.html b/float-no-zero/examples/simple.html new file mode 100644 index 0000000000..e25cbb6228 --- /dev/null +++ b/float-no-zero/examples/simple.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Simple example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Simple example

+

Example of a simple map.

+
+

See the simple.js source to see how this is done.

+
+
simple, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/simple.js b/float-no-zero/examples/simple.js new file mode 100644 index 0000000000..0b035bdd41 --- /dev/null +++ b/float-no-zero/examples/simple.js @@ -0,0 +1,13 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/stamen-require.js b/float-no-zero/examples/stamen-require.js new file mode 100644 index 0000000000..b03c98a672 --- /dev/null +++ b/float-no-zero/examples/stamen-require.js @@ -0,0 +1,5 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.Stamen'); diff --git a/float-no-zero/examples/stamen.html b/float-no-zero/examples/stamen.html new file mode 100644 index 0000000000..7e010089d7 --- /dev/null +++ b/float-no-zero/examples/stamen.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Stamen example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Stamen example

+

Example of a Stamen tile source. Two layers are composed: the watercolor base layer with the terrain labels.

+
+

See the stamen.js source to see how this is done.

+
+
stamen, watercolor, terrain-labels, two-layers
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/stamen.js b/float-no-zero/examples/stamen.js new file mode 100644 index 0000000000..119da38371 --- /dev/null +++ b/float-no-zero/examples/stamen.js @@ -0,0 +1,21 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.Stamen({ + layer: 'watercolor' + }) + }), + new ol.layer.Tile({ + source: new ol.source.Stamen({ + layer: 'terrain-labels' + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform( + [-122.416667, 37.783333], 'EPSG:4326', 'EPSG:3857'), + zoom: 12 + }) +}); diff --git a/float-no-zero/examples/static-image-require.js b/float-no-zero/examples/static-image-require.js new file mode 100644 index 0000000000..a50d9b0761 --- /dev/null +++ b/float-no-zero/examples/static-image-require.js @@ -0,0 +1,7 @@ +goog.require('ol.Attribution'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.extent'); +goog.require('ol.layer.Image'); +goog.require('ol.proj.Projection'); +goog.require('ol.source.ImageStatic'); diff --git a/float-no-zero/examples/static-image.html b/float-no-zero/examples/static-image.html new file mode 100644 index 0000000000..9dc9142288 --- /dev/null +++ b/float-no-zero/examples/static-image.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Static image example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Static image example

+

Example of a static image layer. Source: xkcd.com/256/

+
+

See the static-image.js source to see how this is done.

+
+
static image, xkcd
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/static-image.js b/float-no-zero/examples/static-image.js new file mode 100644 index 0000000000..c6d25bc311 --- /dev/null +++ b/float-no-zero/examples/static-image.js @@ -0,0 +1,33 @@ +// Maps always need a projection, but the static image is not geo-referenced, +// and are only measured in pixels. So, we create a fake projection that the +// map can use to properly display the layer. +var pixelProjection = new ol.proj.Projection({ + code: 'pixel', + units: 'pixels', + extent: [0, 0, 1024, 968] +}); + +var map = new ol.Map({ + layers: [ + new ol.layer.Image({ + source: new ol.source.ImageStatic({ + attributions: [ + new ol.Attribution({ + html: '© xkcd' + }) + ], + url: 'http://imgs.xkcd.com/comics/online_communities.png', + imageSize: [1024, 968], + projection: pixelProjection, + imageExtent: pixelProjection.getExtent() + }) + }) + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + projection: pixelProjection, + center: ol.extent.getCenter(pixelProjection.getExtent()), + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/synthetic-lines-require.js b/float-no-zero/examples/synthetic-lines-require.js new file mode 100644 index 0000000000..57461b3176 --- /dev/null +++ b/float-no-zero/examples/synthetic-lines-require.js @@ -0,0 +1,8 @@ +goog.require('ol.Feature'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.geom.LineString'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.Vector'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/synthetic-lines.html b/float-no-zero/examples/synthetic-lines.html new file mode 100644 index 0000000000..50cb31c7bf --- /dev/null +++ b/float-no-zero/examples/synthetic-lines.html @@ -0,0 +1,110 @@ + + + + + + + + + + + Synthetic lines example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Synthetic lines example

+

Synthetic lines example.

+
+

See the synthetic-lines.js source to see how this is done.

+

Performance results:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Device/Browser200 lines500 lines1000 lines2000 lines5000 lines10000 lines20000 lines
Mac Book Air / Chrome 33 canary60 fps60 fps60 fps60 fps60 fps60 fps60 fps
Mac Book Air / FireFox 2560 fps60 fps60 fps60 fps60 fps22 fps6 fps
Mac Book Air / Safari 760 fps60 fps60 fps40 fps10 fpsN/AN/A
iPhone 4S / iOS 7 / Safari60 fps33 fps15 fps5 fpsN/AN/AN/A
+ +
+
vector
+ + + + + + + + + + + + + diff --git a/float-no-zero/examples/synthetic-lines.js b/float-no-zero/examples/synthetic-lines.js new file mode 100644 index 0000000000..06018a906e --- /dev/null +++ b/float-no-zero/examples/synthetic-lines.js @@ -0,0 +1,51 @@ +var count = 10000; +var features = new Array(count); + +var startPoint = [0, 0]; +var endPoint; + +var delta, deltaX, deltaY; +var signX = 1; +var signY = -1; + +// Create a square spiral. +var i; +for (i = 0; i < count; ++i) { + delta = (i + 1) * 2500; + if (i % 2 === 0) { + signY *= -1; + } else { + signX *= -1; + } + deltaX = delta * signX; + deltaY = delta * signY; + endPoint = [startPoint[0] + deltaX, startPoint[1] + deltaY]; + features[i] = new ol.Feature({ + 'geometry': new ol.geom.LineString([startPoint, endPoint]) + }); + startPoint = endPoint; +} + +var vector = new ol.layer.Vector({ + source: new ol.source.Vector({ + features: features + }), + style: new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#666666', + width: 1 + }) + }) +}); + +var view = new ol.View2D({ + center: [0, 0], + zoom: 0 +}); + +var map = new ol.Map({ + layers: [vector], + renderer: 'canvas', + target: 'map', + view: view +}); diff --git a/float-no-zero/examples/synthetic-points-require.js b/float-no-zero/examples/synthetic-points-require.js new file mode 100644 index 0000000000..e5ab72e833 --- /dev/null +++ b/float-no-zero/examples/synthetic-points-require.js @@ -0,0 +1,12 @@ +goog.require('ol.Feature'); +goog.require('ol.Map'); +goog.require('ol.Overlay'); +goog.require('ol.View2D'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.Point'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.Vector'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/synthetic-points.html b/float-no-zero/examples/synthetic-points.html new file mode 100644 index 0000000000..60cc6ddb71 --- /dev/null +++ b/float-no-zero/examples/synthetic-points.html @@ -0,0 +1,52 @@ + + + + + + + + + + + Synthetic points example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Synthetic points example

+

Synthetic points example.

+
+

See the synthetic-points.js source to see how this is done.

+
+
vector
+
+ +
+ +
+ + + + + + + + diff --git a/float-no-zero/examples/synthetic-points.js b/float-no-zero/examples/synthetic-points.js new file mode 100644 index 0000000000..f14e189489 --- /dev/null +++ b/float-no-zero/examples/synthetic-points.js @@ -0,0 +1,124 @@ +var count = 20000; +var features = new Array(count); +var e = 18000000; +for (var i = 0; i < count; ++i) { + features[i] = new ol.Feature({ + 'geometry': new ol.geom.Point( + [2 * e * Math.random() - e, 2 * e * Math.random() - e]), + 'i': i, + 'size': i % 2 ? 10 : 20 + }); +} + +var styles = { + '10': [new ol.style.Style({ + image: new ol.style.Circle({ + radius: 5, + fill: new ol.style.Fill({color: '#666666'}), + stroke: new ol.style.Stroke({color: '#bada55', width: 1}) + }) + })], + '20': [new ol.style.Style({ + image: new ol.style.Circle({ + radius: 10, + fill: new ol.style.Fill({color: '#666666'}), + stroke: new ol.style.Stroke({color: '#bada55', width: 1}) + }) + })] +}; + +var vectorSource = new ol.source.Vector({ + features: features +}); +var vector = new ol.layer.Vector({ + source: vectorSource, + style: function(feature, resolution) { + return styles[feature.get('size')]; + } +}); + +var popup = new ol.Overlay({ + element: document.getElementById('popup') +}); + +var map = new ol.Map({ + layers: [vector], + renderer: 'canvas', + target: document.getElementById('map'), + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }), + overlays: [popup] +}); + +var point = null; +var line = null; +var displaySnap = function(coordinate) { + var closestFeature = vectorSource.getClosestFeatureToCoordinate(coordinate); + if (closestFeature === null) { + point = null; + line = null; + } else { + var geometry = closestFeature.getGeometry(); + var closestPoint = geometry.getClosestPoint(coordinate); + if (point === null) { + point = new ol.geom.Point(closestPoint); + } else { + point.setCoordinates(closestPoint); + } + if (line === null) { + line = new ol.geom.LineString([coordinate, closestPoint]); + } else { + line.setCoordinates([coordinate, closestPoint]); + } + } + map.render(); +}; + +$(map.getViewport()).on('mousemove', function(evt) { + var coordinate = map.getEventCoordinate(evt.originalEvent); + displaySnap(coordinate); +}); + +map.on('singleclick', function(evt) { + displaySnap(evt.coordinate); +}); + +var imageStyle = new ol.style.Circle({ + radius: 10, + fill: null, + stroke: new ol.style.Stroke({ + color: 'rgba(255,255,0,0.9)', + width: 3 + }) +}); +var strokeStyle = new ol.style.Stroke({ + color: 'rgba(255,255,0,0.9)', + width: 3 +}); +map.on('postcompose', function(evt) { + var vectorContext = evt.vectorContext; + if (point !== null) { + vectorContext.setImageStyle(imageStyle); + vectorContext.drawPointGeometry(point); + } + if (line !== null) { + vectorContext.setFillStrokeStyle(null, strokeStyle); + vectorContext.drawLineStringGeometry(line); + } +}); + +$(map.getViewport()).on('mousemove', function(e) { + var pixel = map.getEventPixel(e.originalEvent); + + var hit = map.forEachFeatureAtPixel(pixel, function(feature, layer) { + return true; + }); + + if (hit) { + map.getTarget().style.cursor = 'pointer'; + } else { + map.getTarget().style.cursor = ''; + } +}); diff --git a/float-no-zero/examples/teleport-require.js b/float-no-zero/examples/teleport-require.js new file mode 100644 index 0000000000..b59a219231 --- /dev/null +++ b/float-no-zero/examples/teleport-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); diff --git a/float-no-zero/examples/teleport.html b/float-no-zero/examples/teleport.html new file mode 100644 index 0000000000..41e5b87fc3 --- /dev/null +++ b/float-no-zero/examples/teleport.html @@ -0,0 +1,61 @@ + + + + + + + + + + + Teleport example + + + + + +
+ +
+
+
+
+
+
+
+
+ +
+
+ Teleport +
+
+ +
+ +
+

Teleport example

+

Example of moving a map from one target to another.

+
+

Click on the Teleport button below the map to move the map from one target to another.

+

See the teleport.js source to see how this is done.

+
+
teleport, openstreetmap
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/teleport.js b/float-no-zero/examples/teleport.js new file mode 100644 index 0000000000..4986d312c5 --- /dev/null +++ b/float-no-zero/examples/teleport.js @@ -0,0 +1,21 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); + +map.setTarget('map1'); + +var teleportButton = document.getElementById('teleport'); + +teleportButton.addEventListener('click', function() { + var target = map.getTarget() === 'map1' ? 'map2' : 'map1'; + map.setTarget(target); +}, false); diff --git a/float-no-zero/examples/tilejson-require.js b/float-no-zero/examples/tilejson-require.js new file mode 100644 index 0000000000..c4ca0376fa --- /dev/null +++ b/float-no-zero/examples/tilejson-require.js @@ -0,0 +1,4 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.TileJSON'); diff --git a/float-no-zero/examples/tilejson.html b/float-no-zero/examples/tilejson.html new file mode 100644 index 0000000000..79f4906f04 --- /dev/null +++ b/float-no-zero/examples/tilejson.html @@ -0,0 +1,51 @@ + + + + + + + + + + + TileJSON example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

TileJSON example

+

Example of a TileJSON layer.

+
+

See the tilejson.js source to see how this is done.

+
+
tilejson
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/tilejson.js b/float-no-zero/examples/tilejson.js new file mode 100644 index 0000000000..ed1f71ad93 --- /dev/null +++ b/float-no-zero/examples/tilejson.js @@ -0,0 +1,16 @@ +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.TileJSON({ + url: 'http://api.tiles.mapbox.com/v3/mapbox.geography-class.jsonp', + crossOrigin: 'anonymous' + }) + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/topojson-require.js b/float-no-zero/examples/topojson-require.js new file mode 100644 index 0000000000..d6d7f076d2 --- /dev/null +++ b/float-no-zero/examples/topojson-require.js @@ -0,0 +1,9 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.TileJSON'); +goog.require('ol.source.TopoJSON'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/topojson.html b/float-no-zero/examples/topojson.html new file mode 100644 index 0000000000..7ee61092be --- /dev/null +++ b/float-no-zero/examples/topojson.html @@ -0,0 +1,53 @@ + + + + + + + + + + + + TopoJSON Example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

TopoJSON example

+

Demonstrates rendering of features from a TopoJSON topology.

+
+

See the topojson.js source to see how this is done.

+
+
vector, topojson, style
+
+
 
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/topojson.js b/float-no-zero/examples/topojson.js new file mode 100644 index 0000000000..ad35bc0758 --- /dev/null +++ b/float-no-zero/examples/topojson.js @@ -0,0 +1,36 @@ +var raster = new ol.layer.Tile({ + source: new ol.source.TileJSON({ + url: 'http://api.tiles.mapbox.com/v3/mapbox.world-dark.jsonp' + }) +}); + +var styleArray = [new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255, 255, 255, 0.6)' + }), + stroke: new ol.style.Stroke({ + color: '#319FD3', + width: 1 + }) +})]; + +var vector = new ol.layer.Vector({ + source: new ol.source.TopoJSON({ + projection: 'EPSG:3857', + url: 'data/topojson/world-110m.json' + }), + style: function(feature, resolution) { + // don't want to render the full world polygon, which repeats all countries + return feature.getId() !== undefined ? styleArray : null; + } +}); + +var map = new ol.Map({ + layers: [raster, vector], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 1 + }) +}); diff --git a/float-no-zero/examples/vector-layer-require.js b/float-no-zero/examples/vector-layer-require.js new file mode 100644 index 0000000000..4d31e1f10e --- /dev/null +++ b/float-no-zero/examples/vector-layer-require.js @@ -0,0 +1,11 @@ +goog.require('ol.FeatureOverlay'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.GeoJSON'); +goog.require('ol.source.MapQuest'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); +goog.require('ol.style.Text'); diff --git a/float-no-zero/examples/vector-layer.html b/float-no-zero/examples/vector-layer.html new file mode 100644 index 0000000000..96be2d6075 --- /dev/null +++ b/float-no-zero/examples/vector-layer.html @@ -0,0 +1,56 @@ + + + + + + + + + + + Vector layer example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Vector layer example

+

Example of a countries vector layer with country information on hover and country labels at higher zoom levels.

+
+

See the vector-layer.js source to see how this is done.

+
+
vector, geojson, style, feature overlay
+
+
+
+   +
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/vector-layer.js b/float-no-zero/examples/vector-layer.js new file mode 100644 index 0000000000..5130ee4420 --- /dev/null +++ b/float-no-zero/examples/vector-layer.js @@ -0,0 +1,115 @@ +var styleCache = {}; +var vectorLayer = new ol.layer.Vector({ + source: new ol.source.GeoJSON({ + projection: 'EPSG:3857', + url: 'data/geojson/countries.geojson' + }), + style: function(feature, resolution) { + var text = resolution < 5000 ? feature.get('name') : ''; + if (!styleCache[text]) { + styleCache[text] = [new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255, 255, 255, 0.6)' + }), + stroke: new ol.style.Stroke({ + color: '#319FD3', + width: 1 + }), + text: new ol.style.Text({ + font: '12px Calibri,sans-serif', + text: text, + fill: new ol.style.Fill({ + color: '#000' + }), + stroke: new ol.style.Stroke({ + color: '#fff', + width: 3 + }) + }) + })]; + } + return styleCache[text]; + } +}); + +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }), + vectorLayer + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 1 + }) +}); + +var highlightStyleCache = {}; + +var featureOverlay = new ol.FeatureOverlay({ + map: map, + style: function(feature, resolution) { + var text = resolution < 5000 ? feature.get('name') : ''; + if (!highlightStyleCache[text]) { + highlightStyleCache[text] = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#f00', + width: 1 + }), + fill: new ol.style.Fill({ + color: 'rgba(255,0,0,0.1)' + }), + text: new ol.style.Text({ + font: '12px Calibri,sans-serif', + text: text, + fill: new ol.style.Fill({ + color: '#000' + }), + stroke: new ol.style.Stroke({ + color: '#f00', + width: 3 + }) + }) + })]; + } + return highlightStyleCache[text]; + } +}); + +var highlight; +var displayFeatureInfo = function(pixel) { + + var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) { + return feature; + }); + + var info = document.getElementById('info'); + if (feature) { + info.innerHTML = feature.getId() + ': ' + feature.get('name'); + } else { + info.innerHTML = ' '; + } + + if (feature !== highlight) { + if (highlight) { + featureOverlay.removeFeature(highlight); + } + if (feature) { + featureOverlay.addFeature(feature); + } + highlight = feature; + } + +}; + +$(map.getViewport()).on('mousemove', function(evt) { + var pixel = map.getEventPixel(evt.originalEvent); + displayFeatureInfo(pixel); +}); + +map.on('singleclick', function(evt) { + displayFeatureInfo(evt.pixel); +}); diff --git a/float-no-zero/examples/vector-osm-require.js b/float-no-zero/examples/vector-osm-require.js new file mode 100644 index 0000000000..473190d457 --- /dev/null +++ b/float-no-zero/examples/vector-osm-require.js @@ -0,0 +1,10 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.BingMaps'); +goog.require('ol.source.OSMXML'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); diff --git a/float-no-zero/examples/vector-osm.html b/float-no-zero/examples/vector-osm.html new file mode 100644 index 0000000000..6a0e5ea7ef --- /dev/null +++ b/float-no-zero/examples/vector-osm.html @@ -0,0 +1,56 @@ + + + + + + + + + + + OSM XML example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

OSM XML example

+

Example of using the OSM XML source.

+
+

See the vector-osm.js source to see how this is done.

+
+
vector, osm, xml
+
+
+
+   +
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/vector-osm.js b/float-no-zero/examples/vector-osm.js new file mode 100644 index 0000000000..ec58a276fb --- /dev/null +++ b/float-no-zero/examples/vector-osm.js @@ -0,0 +1,112 @@ +var styles = { + 'amenity': { + 'parking': [ + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'rgba(170, 170, 170, 1.0)', + width: 1 + }), + fill: new ol.style.Fill({ + color: 'rgba(170, 170, 170, 0.3)' + }) + }) + ] + }, + 'building': { + '.*': [ + new ol.style.Style({ + zIndex: 100, + stroke: new ol.style.Stroke({ + color: 'rgba(246, 99, 79, 1.0)', + width: 1 + }), + fill: new ol.style.Fill({ + color: 'rgba(246, 99, 79, 0.3)' + }) + }) + ] + }, + 'highway': { + 'service': [ + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'rgba(255, 255, 255, 1.0)', + width: 2 + }) + }) + ], + '.*': [ + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'rgba(255, 255, 255, 1.0)', + width: 3 + }) + }) + ] + }, + 'landuse': { + 'forest|grass|allotments': [ + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'rgba(140, 208, 95, 1.0)', + width: 1 + }), + fill: new ol.style.Fill({ + color: 'rgba(140, 208, 95, 0.3)' + }) + }) + ] + }, + 'natural': { + 'tree': [ + new ol.style.Style({ + image: new ol.style.Circle({ + radius: 2, + fill: new ol.style.Fill({ + color: 'rgba(140, 208, 95, 1.0)' + }), + stroke: null + }) + }) + ] + } +}; + +var vectorSource = new ol.source.OSMXML({ + projection: 'EPSG:3857', + url: 'data/osm/map.osm' +}); + +var vector = new ol.layer.Vector({ + source: vectorSource, + style: function(feature, resolution) { + for (var key in styles) { + var value = feature.get(key); + if (value !== undefined) { + for (var regexp in styles[key]) { + if (new RegExp(regexp).test(value)) { + return styles[key][regexp]; + } + } + } + } + return null; + } +}); + +var raster = new ol.layer.Tile({ + source: new ol.source.BingMaps({ + imagerySet: 'Aerial', + key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3' + }) +}); + +var map = new ol.Map({ + layers: [raster, vector], + renderer: 'canvas', + target: document.getElementById('map'), + view: new ol.View2D({ + center: [739218, 5906096], + zoom: 17 + }) +}); diff --git a/float-no-zero/examples/wms-capabilities-require.js b/float-no-zero/examples/wms-capabilities-require.js new file mode 100644 index 0000000000..504d6c437d --- /dev/null +++ b/float-no-zero/examples/wms-capabilities-require.js @@ -0,0 +1 @@ +goog.require('ol.parser.ogc.WMSCapabilities'); diff --git a/float-no-zero/examples/wms-capabilities.html b/float-no-zero/examples/wms-capabilities.html new file mode 100644 index 0000000000..9fb393e496 --- /dev/null +++ b/float-no-zero/examples/wms-capabilities.html @@ -0,0 +1,49 @@ + + + + + + + + + + + WMS GetCapabilities parsing example + + + + + +
+ +
+ +
+

WMS GetCapabilities parsing example

+

Example of parsing a WMS GetCapabilities response.

+
+

See the wms-capabilities.js source to see how this is done.

+
+
wms, capabilities, getcapabilities
+
+ +
+

+        
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/wms-capabilities.js b/float-no-zero/examples/wms-capabilities.js new file mode 100644 index 0000000000..6ea9ee5bda --- /dev/null +++ b/float-no-zero/examples/wms-capabilities.js @@ -0,0 +1,18 @@ +var parser = new ol.parser.ogc.WMSCapabilities(), result; +var url = 'data/ogcsample.xml'; + +var xhr = new XMLHttpRequest(); +xhr.open('GET', url, true); + + +/** + * onload handler for the XHR request. + */ +xhr.onload = function() { + if (xhr.status == 200) { + result = parser.read(xhr.responseXML); + document.getElementById('log').innerHTML = + window.JSON.stringify(result, undefined, 2); + } +}; +xhr.send(); diff --git a/float-no-zero/examples/wms-custom-proj-require.js b/float-no-zero/examples/wms-custom-proj-require.js new file mode 100644 index 0000000000..a824a7b876 --- /dev/null +++ b/float-no-zero/examples/wms-custom-proj-require.js @@ -0,0 +1,8 @@ +goog.require('ol.Attribution'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.control'); +goog.require('ol.control.ScaleLine'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.TileWMS'); diff --git a/float-no-zero/examples/wms-custom-proj.html b/float-no-zero/examples/wms-custom-proj.html new file mode 100644 index 0000000000..12a1dec0f1 --- /dev/null +++ b/float-no-zero/examples/wms-custom-proj.html @@ -0,0 +1,53 @@ + + + + + + + + + + + Tiled WMS with Proj4js projection example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Tiled WMS with Proj4js projection example

+

Example of two tiled WMS layers (Pixelmap 1:1'000'000 and national parks) using the projection EPSG:21781.

+
+

See the wms-custom-proj.js source to see how this is done.

+
+
wms, tile, tilelayer, proj4js, projection
+
+ +
+ +
+ + + + + + + + + diff --git a/float-no-zero/examples/wms-custom-proj.js b/float-no-zero/examples/wms-custom-proj.js new file mode 100644 index 0000000000..5773f30d78 --- /dev/null +++ b/float-no-zero/examples/wms-custom-proj.js @@ -0,0 +1,58 @@ +var projection = ol.proj.configureProj4jsProjection({ + code: 'EPSG:21781', + extent: [485869.5728, 76443.1884, 837076.5648, 299941.7864] +}); + +var extent = [420000, 30000, 900000, 350000]; +var layers = [ + new ol.layer.Tile({ + source: new ol.source.TileWMS({ + url: 'http://wms.geo.admin.ch/', + crossOrigin: 'anonymous', + attributions: [new ol.Attribution({ + html: '© ' + + '' + + 'Pixelmap 1:1000000 / geo.admin.ch' + })], + params: { + 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', + 'FORMAT': 'image/jpeg' + }, + extent: extent, + serverType: 'mapserver' + }) + }), + new ol.layer.Tile({ + source: new ol.source.TileWMS({ + url: 'http://wms.geo.admin.ch/', + crossOrigin: 'anonymous', + attributions: [new ol.Attribution({ + html: '© ' + + '' + + 'National parks / geo.admin.ch' + })], + params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, + extent: extent, + serverType: 'mapserver' + }) + }) +]; + +var map = new ol.Map({ + controls: ol.control.defaults().extend([ + new ol.control.ScaleLine({ + units: 'metric' + }) + ]), + layers: layers, + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + projection: projection, + center: [660000, 190000], + extent: extent, + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/wms-image-custom-proj-require.js b/float-no-zero/examples/wms-image-custom-proj-require.js new file mode 100644 index 0000000000..dd04beec9f --- /dev/null +++ b/float-no-zero/examples/wms-image-custom-proj-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Attribution'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Image'); +goog.require('ol.proj'); +goog.require('ol.source.ImageWMS'); diff --git a/float-no-zero/examples/wms-image-custom-proj.html b/float-no-zero/examples/wms-image-custom-proj.html new file mode 100644 index 0000000000..e8c7230996 --- /dev/null +++ b/float-no-zero/examples/wms-image-custom-proj.html @@ -0,0 +1,54 @@ + + + + + + + + + + + Single image WMS with custom projection example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Single image WMS with custom projection example

+

Example of two single image WMS layers.

+
+

Pixelmap 1:1'000'000 with National Parks overlay using the projection EPSG:21781.

+

See the wms-image-custom-proj.js source to see how this is done.

+
+
wms, single image, projection
+
+ +
+ +
+ + + + + + + + + diff --git a/float-no-zero/examples/wms-image-custom-proj.js b/float-no-zero/examples/wms-image-custom-proj.js new file mode 100644 index 0000000000..f0e79ab19c --- /dev/null +++ b/float-no-zero/examples/wms-image-custom-proj.js @@ -0,0 +1,53 @@ +var projection = ol.proj.configureProj4jsProjection({ + code: 'EPSG:21781', + extent: [485869.5728, 76443.1884, 837076.5648, 299941.7864] +}); + +var extent = [420000, 30000, 900000, 350000]; +var layers = [ + new ol.layer.Image({ + source: new ol.source.ImageWMS({ + url: 'http://wms.geo.admin.ch/', + crossOrigin: 'anonymous', + attributions: [new ol.Attribution({ + html: '© ' + + '' + + 'Pixelmap 1:1000000 / geo.admin.ch' + })], + params: { + 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', + 'FORMAT': 'image/jpeg' + }, + serverType: /** @type {ol.source.wms.ServerType} */ ('mapserver'), + extent: extent + }) + }), + new ol.layer.Image({ + source: new ol.source.ImageWMS({ + url: 'http://wms.geo.admin.ch/', + crossOrigin: 'anonymous', + attributions: [new ol.Attribution({ + html: '© ' + + '' + + 'National parks / geo.admin.ch' + })], + params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, + serverType: /** @type {ol.source.wms.ServerType} */ ('mapserver'), + extent: extent + }) + }) +]; + +var map = new ol.Map({ + layers: layers, + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + projection: projection, + center: [660000, 190000], + extent: extent, + zoom: 2 + }) +}); diff --git a/float-no-zero/examples/wms-image-require.js b/float-no-zero/examples/wms-image-require.js new file mode 100644 index 0000000000..15d77d23fb --- /dev/null +++ b/float-no-zero/examples/wms-image-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Image'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.ImageWMS'); +goog.require('ol.source.MapQuest'); diff --git a/float-no-zero/examples/wms-image.html b/float-no-zero/examples/wms-image.html new file mode 100644 index 0000000000..04be1175dd --- /dev/null +++ b/float-no-zero/examples/wms-image.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Single image WMS example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Single image WMS example

+

Example of a single image WMS layer.

+
+

See the wms-image.js source to see how this is done.

+
+
wms, image
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/wms-image.js b/float-no-zero/examples/wms-image.js new file mode 100644 index 0000000000..474663c8ea --- /dev/null +++ b/float-no-zero/examples/wms-image.js @@ -0,0 +1,22 @@ +var layers = [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }), + new ol.layer.Image({ + source: new ol.source.ImageWMS({ + url: 'http://demo.opengeo.org/geoserver/wms', + params: {'LAYERS': 'topp:states'}, + serverType: 'geoserver', + extent: [-13884991, 2870341, -7455066, 6338219] + }) + }) +]; +var map = new ol.Map({ + renderer: 'canvas', + layers: layers, + target: 'map', + view: new ol.View2D({ + center: [-10997148, 4569099], + zoom: 4 + }) +}); diff --git a/float-no-zero/examples/wms-no-proj-require.js b/float-no-zero/examples/wms-no-proj-require.js new file mode 100644 index 0000000000..4f855ab5cf --- /dev/null +++ b/float-no-zero/examples/wms-no-proj-require.js @@ -0,0 +1,8 @@ +goog.require('ol.Attribution'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Image'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj.Projection'); +goog.require('ol.source.ImageWMS'); +goog.require('ol.source.TileWMS'); diff --git a/float-no-zero/examples/wms-no-proj.html b/float-no-zero/examples/wms-no-proj.html new file mode 100644 index 0000000000..e694e758cc --- /dev/null +++ b/float-no-zero/examples/wms-no-proj.html @@ -0,0 +1,51 @@ + + + + + + + + + + + WMS without client projection example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

WMS without client projection example

+

Example of two WMS layers using the projection EPSG:21781, which is unknown to the client.

+
+

See the wms-no-proj.js source to see how this is done.

+
+
wms, projection
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/wms-no-proj.js b/float-no-zero/examples/wms-no-proj.js new file mode 100644 index 0000000000..3d9f8e6d88 --- /dev/null +++ b/float-no-zero/examples/wms-no-proj.js @@ -0,0 +1,51 @@ +var layers = [ + new ol.layer.Tile({ + source: new ol.source.TileWMS({ + attributions: [new ol.Attribution({ + html: '© ' + + '' + + 'Pixelmap 1:1000000 / geo.admin.ch' + })], + crossOrigin: 'anonymous', + params: { + 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', + 'FORMAT': 'image/jpeg' + }, + url: 'http://wms.geo.admin.ch/' + }) + }), + new ol.layer.Image({ + source: new ol.source.ImageWMS({ + attributions: [new ol.Attribution({ + html: '© ' + + '' + + 'National parks / geo.admin.ch' + })], + crossOrigin: 'anonymous', + params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, + serverType: 'mapserver', + url: 'http://wms.geo.admin.ch/' + }) + }) +]; + +// A minimal projection object is configured with only the SRS code and the map +// units. No client side coordinate transforms are possible with such a +// projection object. +var projection = new ol.proj.Projection({ + code: 'EPSG:21781', + units: 'm' +}); + +var map = new ol.Map({ + layers: layers, + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + center: [660000, 190000], + projection: projection, + zoom: 9 + }) +}); diff --git a/float-no-zero/examples/wms-tiled-require.js b/float-no-zero/examples/wms-tiled-require.js new file mode 100644 index 0000000000..27998b1a08 --- /dev/null +++ b/float-no-zero/examples/wms-tiled-require.js @@ -0,0 +1,5 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.MapQuest'); +goog.require('ol.source.TileWMS'); diff --git a/float-no-zero/examples/wms-tiled.html b/float-no-zero/examples/wms-tiled.html new file mode 100644 index 0000000000..5fe680ccca --- /dev/null +++ b/float-no-zero/examples/wms-tiled.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Tiled WMS example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Tiled WMS example

+

Example of a tiled WMS layer.

+
+

See the wms-tiled.js source to see how this is done.

+
+
wms, tile, tilelayer
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/wms-tiled.js b/float-no-zero/examples/wms-tiled.js new file mode 100644 index 0000000000..4449f5a204 --- /dev/null +++ b/float-no-zero/examples/wms-tiled.js @@ -0,0 +1,22 @@ +var layers = [ + new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}) + }), + new ol.layer.Tile({ + source: new ol.source.TileWMS(/** @type {olx.source.TileWMSOptions} */ ({ + url: 'http://demo.opengeo.org/geoserver/wms', + params: {'LAYERS': 'topp:states', 'TILED': true}, + extent: [-13884991, 2870341, -7455066, 6338219], + serverType: 'geoserver' + })) + }) +]; +var map = new ol.Map({ + renderer: 'canvas', + layers: layers, + target: 'map', + view: new ol.View2D({ + center: [-10997148, 4569099], + zoom: 4 + }) +}); diff --git a/float-no-zero/examples/wmts-require.js b/float-no-zero/examples/wmts-require.js new file mode 100644 index 0000000000..ea815d5585 --- /dev/null +++ b/float-no-zero/examples/wmts-require.js @@ -0,0 +1,8 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.extent'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.OSM'); +goog.require('ol.source.WMTS'); +goog.require('ol.tilegrid.WMTS'); diff --git a/float-no-zero/examples/wmts.html b/float-no-zero/examples/wmts.html new file mode 100644 index 0000000000..46619f9ce0 --- /dev/null +++ b/float-no-zero/examples/wmts.html @@ -0,0 +1,51 @@ + + + + + + + + + + + WMTS example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

WMTS example

+

Example of a WMTS source.

+
+

See the wmts.js source to see how this is done.

+
+
wmts
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/wmts.js b/float-no-zero/examples/wmts.js new file mode 100644 index 0000000000..ffd06c18ce --- /dev/null +++ b/float-no-zero/examples/wmts.js @@ -0,0 +1,43 @@ +var projection = ol.proj.get('EPSG:900913'); +var projectionExtent = projection.getExtent(); +var size = ol.extent.getWidth(projectionExtent) / 256; +var resolutions = new Array(18); +var matrixIds = new Array(18); +for (var z = 0; z < 18; ++z) { + // generate resolutions and matrixIds arrays for this WMTS + resolutions[z] = size / Math.pow(2, z); + matrixIds[z] = z; +} + +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM(), + opacity: 0.7 + }), + new ol.layer.Tile({ + opacity: 0.7, + source: new ol.source.WMTS({ + url: 'http://demo-apollo.geospatial.intergraph.com/erdas-iws/ogc/wmts/', + layer: 'sampleiws_images_geodetic_worldgeodemo.ecw', + matrixSet: 'ogc:1.0:googlemapscompatible', + format: 'image/jpeg', + projection: projection, + tileGrid: new ol.tilegrid.WMTS({ + origin: ol.extent.getTopLeft(projectionExtent), + resolutions: resolutions, + matrixIds: matrixIds + }), + extent: [-20037508.34, -20037508.34, 20037508.34, 20037508.34], + style: 'default' + }) + }) + ], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 0, + maxResolution: resolutions[1] + }) +}); diff --git a/float-no-zero/examples/xyz-esri-require.js b/float-no-zero/examples/xyz-esri-require.js new file mode 100644 index 0000000000..ce07e4e817 --- /dev/null +++ b/float-no-zero/examples/xyz-esri-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Attribution'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.source.XYZ'); diff --git a/float-no-zero/examples/xyz-esri.html b/float-no-zero/examples/xyz-esri.html new file mode 100644 index 0000000000..89d7b91178 --- /dev/null +++ b/float-no-zero/examples/xyz-esri.html @@ -0,0 +1,51 @@ + + + + + + + + + + + XYZ Esri example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

XYZ Esri example

+

Example of a XYZ source using Esri tiles.

+
+

See the xyz-esri.js source for details on how this is done.

+
+
xyz, esri
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/xyz-esri.js b/float-no-zero/examples/xyz-esri.js new file mode 100644 index 0000000000..9953229fde --- /dev/null +++ b/float-no-zero/examples/xyz-esri.js @@ -0,0 +1,22 @@ +var attribution = new ol.Attribution({ + html: 'Tiles © ArcGIS' +}); + +var map = new ol.Map({ + target: 'map', + layers: [ + new ol.layer.Tile({ + source: new ol.source.XYZ({ + attributions: [attribution], + url: 'http://server.arcgisonline.com/ArcGIS/rest/services/' + + 'World_Topo_Map/MapServer/tile/{z}/{y}/{x}' + }) + }) + ], + renderer: 'canvas', + view: new ol.View2D({ + center: ol.proj.transform([-121.1, 47.5], 'EPSG:4326', 'EPSG:3857'), + zoom: 7 + }) +}); diff --git a/float-no-zero/examples/zoomify-require.js b/float-no-zero/examples/zoomify-require.js new file mode 100644 index 0000000000..588c09d980 --- /dev/null +++ b/float-no-zero/examples/zoomify-require.js @@ -0,0 +1,6 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.layer.Tile'); +goog.require('ol.proj'); +goog.require('ol.proj.Projection'); +goog.require('ol.source.Zoomify'); diff --git a/float-no-zero/examples/zoomify.html b/float-no-zero/examples/zoomify.html new file mode 100644 index 0000000000..be050323af --- /dev/null +++ b/float-no-zero/examples/zoomify.html @@ -0,0 +1,51 @@ + + + + + + + + + + + Zoomify example + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Zoomify example

+

Example of a Zoomify source.

+
+

See the zoomify.js source to see how this is done.

+
+
zoomify
+
+ +
+ +
+ + + + + + + diff --git a/float-no-zero/examples/zoomify.js b/float-no-zero/examples/zoomify.js new file mode 100644 index 0000000000..1eaa3dc272 --- /dev/null +++ b/float-no-zero/examples/zoomify.js @@ -0,0 +1,43 @@ +// This server does not support CORS, and so is incompatible with WebGL. +//var imgWidth = 8001; +//var imgHeight = 6943; +//var url = 'http://mapy.mzk.cz/AA22/0103/'; +//var crossOrigin = undefined; + +var imgWidth = 9911; +var imgHeight = 6100; +var url = 'http://vips.vtech.fr/cgi-bin/iipsrv.fcgi?zoomify=' + + '/mnt/MD1/AD00/plan_CHU-4HD-01/FOND.TIF/'; +var crossOrigin = 'anonymous'; + +var imgCenter = [imgWidth / 2, - imgHeight / 2]; + +// Maps always need a projection, but Zoomify layers are not geo-referenced, and +// are only measured in pixels. So, we create a fake projection that the map +// can use to properly display the layer. +var proj = new ol.proj.Projection({ + code: 'ZOOMIFY', + units: 'pixels', + extent: [0, 0, imgWidth, imgHeight] +}); + +var source = new ol.source.Zoomify({ + url: url, + size: [imgWidth, imgHeight], + crossOrigin: crossOrigin +}); + +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: source + }) + ], + renderer: exampleNS.getRendererFromQueryString(), + target: 'map', + view: new ol.View2D({ + projection: proj, + center: imgCenter, + zoom: 0 + }) +}); diff --git a/float-no-zero/examples/zoomslider-require.js b/float-no-zero/examples/zoomslider-require.js new file mode 100644 index 0000000000..2e66ea18e6 --- /dev/null +++ b/float-no-zero/examples/zoomslider-require.js @@ -0,0 +1,5 @@ +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.control.ZoomSlider'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.MapQuest'); diff --git a/float-no-zero/examples/zoomslider.html b/float-no-zero/examples/zoomslider.html new file mode 100644 index 0000000000..cdb173dc33 --- /dev/null +++ b/float-no-zero/examples/zoomslider.html @@ -0,0 +1,116 @@ + + + + + + + + + + + + ol3 ZoomSlider demo + + + + + +
+ +
+
+

Default style

+
+
+
+

Placed between zoom controls

+
+
+
+

Horizontal and completely re-styled

+
+
+
+ +
+ +
+

ZoomSlider control

+

Example of various ZoomSlider controls.

+
+

+ See the zoomslider.js + source to see how this is done. +

+
+
+ zoom, zoomslider, slider, style, styling, css, control +
+
+
+
+ + + + + + + + diff --git a/float-no-zero/examples/zoomslider.js b/float-no-zero/examples/zoomslider.js new file mode 100644 index 0000000000..5e7b69ba6e --- /dev/null +++ b/float-no-zero/examples/zoomslider.js @@ -0,0 +1,29 @@ +/** + * Helper method for map-creation. + * + * @param {string} divId The id of the div for the map. + * @return {ol.Map} The ol.Map instance. + */ +var createMap = function(divId) { + var source, layer, map, zoomslider, resolutions; + + source = new ol.source.MapQuest({layer: 'sat'}); + layer = new ol.layer.Tile({ + source: source + }); + map = new ol.Map({ + layers: [layer], + target: divId, + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) + }); + zoomslider = new ol.control.ZoomSlider(); + map.addControl(zoomslider); + return map; +}; + +var map1 = createMap('map1'); +var map2 = createMap('map2'); +var map3 = createMap('map3'); diff --git a/float-no-zero/ol/ol/animation.exports b/float-no-zero/ol/ol/animation.exports new file mode 100644 index 0000000000..5cab49819d --- /dev/null +++ b/float-no-zero/ol/ol/animation.exports @@ -0,0 +1,4 @@ +@exportSymbol ol.animation.bounce +@exportSymbol ol.animation.pan +@exportSymbol ol.animation.rotate +@exportSymbol ol.animation.zoom diff --git a/float-no-zero/ol/ol/animation.js b/float-no-zero/ol/ol/animation.js new file mode 100644 index 0000000000..17207baea0 --- /dev/null +++ b/float-no-zero/ol/ol/animation.js @@ -0,0 +1,154 @@ +// FIXME works for View2D only + +goog.provide('ol.animation'); + +goog.require('ol.PreRenderFunction'); +goog.require('ol.ViewHint'); +goog.require('ol.easing'); + + +/** + * @param {olx.animation.BounceOptions} options Bounce options. + * @return {ol.PreRenderFunction} Pre-render function. + * @todo stability experimental + */ +ol.animation.bounce = function(options) { + var resolution = options.resolution; + var start = goog.isDef(options.start) ? options.start : goog.now(); + var duration = goog.isDef(options.duration) ? options.duration : 1000; + var easing = goog.isDef(options.easing) ? + options.easing : ol.easing.upAndDown; + return ( + /** + * @param {ol.Map} map Map. + * @param {?ol.FrameState} frameState Frame state. + */ + function(map, frameState) { + if (frameState.time < start) { + frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true; + } else if (frameState.time < start + duration) { + var delta = easing((frameState.time - start) / duration); + var deltaResolution = resolution - frameState.view2DState.resolution; + frameState.animate = true; + frameState.view2DState.resolution += delta * deltaResolution; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true; + } else { + return false; + } + }); +}; + + +/** + * @param {olx.animation.PanOptions} options Pan options. + * @return {ol.PreRenderFunction} Pre-render function. + * @todo stability experimental + */ +ol.animation.pan = function(options) { + var source = options.source; + var start = goog.isDef(options.start) ? options.start : goog.now(); + var sourceX = source[0]; + var sourceY = source[1]; + var duration = goog.isDef(options.duration) ? options.duration : 1000; + var easing = goog.isDef(options.easing) ? + options.easing : ol.easing.inAndOut; + return ( + /** + * @param {ol.Map} map Map. + * @param {?ol.FrameState} frameState Frame state. + */ + function(map, frameState) { + if (frameState.time < start) { + frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true; + } else if (frameState.time < start + duration) { + var delta = 1 - easing((frameState.time - start) / duration); + var deltaX = sourceX - frameState.view2DState.center[0]; + var deltaY = sourceY - frameState.view2DState.center[1]; + frameState.animate = true; + frameState.view2DState.center[0] += delta * deltaX; + frameState.view2DState.center[1] += delta * deltaY; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true; + } else { + return false; + } + }); +}; + + +/** + * @param {olx.animation.RotateOptions} options Rotate options. + * @return {ol.PreRenderFunction} Pre-render function. + * @todo stability experimental + */ +ol.animation.rotate = function(options) { + var sourceRotation = options.rotation; + var start = goog.isDef(options.start) ? options.start : goog.now(); + var duration = goog.isDef(options.duration) ? options.duration : 1000; + var easing = goog.isDef(options.easing) ? + options.easing : ol.easing.inAndOut; + + return ( + /** + * @param {ol.Map} map Map. + * @param {?ol.FrameState} frameState Frame state. + */ + function(map, frameState) { + if (frameState.time < start) { + frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true; + } else if (frameState.time < start + duration) { + var delta = 1 - easing((frameState.time - start) / duration); + var deltaRotation = + sourceRotation - frameState.view2DState.rotation; + frameState.animate = true; + frameState.view2DState.rotation += delta * deltaRotation; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true; + } else { + return false; + } + }); +}; + + +/** + * @param {olx.animation.ZoomOptions} options Zoom options. + * @return {ol.PreRenderFunction} Pre-render function. + * @todo stability experimental + */ +ol.animation.zoom = function(options) { + var sourceResolution = options.resolution; + var start = goog.isDef(options.start) ? options.start : goog.now(); + var duration = goog.isDef(options.duration) ? options.duration : 1000; + var easing = goog.isDef(options.easing) ? + options.easing : ol.easing.inAndOut; + return ( + /** + * @param {ol.Map} map Map. + * @param {?ol.FrameState} frameState Frame state. + */ + function(map, frameState) { + if (frameState.time < start) { + frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true; + } else if (frameState.time < start + duration) { + var delta = 1 - easing((frameState.time - start) / duration); + var deltaResolution = + sourceResolution - frameState.view2DState.resolution; + frameState.animate = true; + frameState.view2DState.resolution += delta * deltaResolution; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; + return true; + } else { + return false; + } + }); +}; diff --git a/float-no-zero/ol/ol/animation.jsdoc b/float-no-zero/ol/ol/animation.jsdoc new file mode 100644 index 0000000000..0c748f124d --- /dev/null +++ b/float-no-zero/ol/ol/animation.jsdoc @@ -0,0 +1,12 @@ +/** + * The {ol.animation} static methods are designed to be used with the {@link ol.Map#beforeRender} method. For example: + * + * var map = new ol.Map({ ... }); + * var zoom = ol.animation.zoom({ + * resolution: map.getView().getResolution() + * }); + * map.beforeRender(zoom); + * map.getView().setResolution(map.getView().getResolution() * 2); + * + * @namespace ol.animation + */ diff --git a/float-no-zero/ol/ol/array.js b/float-no-zero/ol/ol/array.js new file mode 100644 index 0000000000..882a501262 --- /dev/null +++ b/float-no-zero/ol/ol/array.js @@ -0,0 +1,104 @@ +goog.provide('ol.array'); + +goog.require('goog.array'); +goog.require('goog.asserts'); + + +/** + * @param {Array.} arr Array. + * @param {number} target Target. + * @return {number} Index. + */ +ol.array.binaryFindNearest = function(arr, target) { + var index = goog.array.binarySearch(arr, target, + /** + * @param {number} a A. + * @param {number} b B. + * @return {number} b minus a. + */ + function(a, b) { + return b - a; + }); + if (index >= 0) { + return index; + } else if (index == -1) { + return 0; + } else if (index == -arr.length - 1) { + return arr.length - 1; + } else { + var left = -index - 2; + var right = -index - 1; + if (arr[left] - target < target - arr[right]) { + return left; + } else { + return right; + } + } +}; + + +/** + * @param {Array.} arr Array. + * @param {number} target Target. + * @param {number} direction 0 means return the nearest, > 0 + * means return the largest nearest, < 0 means return the + * smallest nearest. + * @return {number} Index. + */ +ol.array.linearFindNearest = function(arr, target, direction) { + var n = arr.length; + if (arr[0] <= target) { + return 0; + } else if (target <= arr[n - 1]) { + return n - 1; + } else { + var i; + if (direction > 0) { + for (i = 1; i < n; ++i) { + if (arr[i] < target) { + return i - 1; + } + } + } else if (direction < 0) { + for (i = 1; i < n; ++i) { + if (arr[i] <= target) { + return i; + } + } + } else { + for (i = 1; i < n; ++i) { + if (arr[i] == target) { + return i; + } else if (arr[i] < target) { + if (arr[i - 1] - target < target - arr[i]) { + return i - 1; + } else { + return i; + } + } + } + } + // We should never get here, but the compiler complains + // if it finds a path for which no number is returned. + goog.asserts.fail(); + return n - 1; + } +}; + + +/** + * @param {Array.<*>} arr Array. + * @param {number} begin Begin index. + * @param {number} end End index. + */ +ol.array.reverseSubArray = function(arr, begin, end) { + goog.asserts.assert(begin >= 0); + goog.asserts.assert(end < arr.length); + while (begin < end) { + var tmp = arr[begin]; + arr[begin] = arr[end]; + arr[end] = tmp; + ++begin; + --end; + } +}; diff --git a/float-no-zero/ol/ol/attribution.exports b/float-no-zero/ol/ol/attribution.exports new file mode 100644 index 0000000000..053c0abeae --- /dev/null +++ b/float-no-zero/ol/ol/attribution.exports @@ -0,0 +1 @@ +@exportSymbol ol.Attribution diff --git a/float-no-zero/ol/ol/attribution.js b/float-no-zero/ol/ol/attribution.js new file mode 100644 index 0000000000..3c95c8b83d --- /dev/null +++ b/float-no-zero/ol/ol/attribution.js @@ -0,0 +1,74 @@ +goog.provide('ol.Attribution'); + +goog.require('ol.TileRange'); + + + +/** + * Create a new attribution to be associated with a layer source. + * + * Example: + * + * source: new ol.source.OSM({ + * attributions: [ + * new ol.Attribution({ + * html: 'All maps © ' + + * 'OpenCycleMap' + * }), + * ol.source.OSM.DATA_ATTRIBUTION + * ], + * .. + * + * @constructor + * @param {olx.AttributionOptions} options Attribution options. + * @struct + * @todo stability experimental + */ +ol.Attribution = function(options) { + + /** + * @private + * @type {string} + */ + this.html_ = options.html; + + /** + * @private + * @type {Object.>} + */ + this.tileRanges_ = goog.isDef(options.tileRanges) ? + options.tileRanges : null; + +}; + + +/** + * @return {string} HTML. + */ +ol.Attribution.prototype.getHTML = function() { + return this.html_; +}; + + +/** + * @param {Object.} tileRanges Tile ranges. + * @return {boolean} Intersects any tile range. + */ +ol.Attribution.prototype.intersectsAnyTileRange = function(tileRanges) { + if (goog.isNull(this.tileRanges_)) { + return true; + } + var i, ii, tileRange, z; + for (z in tileRanges) { + if (!(z in this.tileRanges_)) { + continue; + } + tileRange = tileRanges[z]; + for (i = 0, ii = this.tileRanges_[z].length; i < ii; ++i) { + if (this.tileRanges_[z][i].intersects(tileRange)) { + return true; + } + } + } + return false; +}; diff --git a/float-no-zero/ol/ol/binary.js b/float-no-zero/ol/ol/binary.js new file mode 100644 index 0000000000..96f27492ee --- /dev/null +++ b/float-no-zero/ol/ol/binary.js @@ -0,0 +1,174 @@ +// FIXME Test on Internet Explorer with VBArray + +goog.provide('ol.binary.Buffer'); +goog.provide('ol.binary.IReader'); + +goog.require('goog.asserts'); +goog.require('goog.userAgent'); +goog.require('ol.BrowserFeature'); + + + +/** + * @constructor + * @param {ArrayBuffer|string} data Data. + */ +ol.binary.Buffer = function(data) { + + /** + * @private + * @type {ArrayBuffer|string} + */ + this.data_ = data; + +}; + + +/** + * @return {ol.binary.IReader} Reader. + */ +ol.binary.Buffer.prototype.getReader = function() { + var data = this.data_; + if (ol.BrowserFeature.HAS_ARRAY_BUFFER) { + var arrayBuffer; + if (data instanceof ArrayBuffer) { + arrayBuffer = data; + } else if (goog.isString(data)) { + // FIXME check what happens with Unicode + arrayBuffer = new ArrayBuffer(data.length); + var uint8View = new Uint8Array(arrayBuffer); + var i, ii; + for (i = 0, ii = data.length; i < ii; ++i) { + uint8View[i] = data.charCodeAt(i); + } + } else { + goog.asserts.fail(); + return null; + } + return new ol.binary.ArrayBufferReader(arrayBuffer); + } else { + goog.asserts.assert(goog.isString(data)); + goog.asserts.assert( + goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('10.0')); + return new ol.binary.ArrayReader(new VBArray(data).toArray()); + } +}; + + + +/** + * @interface + */ +ol.binary.IReader = function() {}; + + +/** + * @return {boolean} At EOF. + */ +ol.binary.IReader.prototype.atEOF = function() {}; + + +/** + * @return {number} Byte. + */ +ol.binary.IReader.prototype.readByte = function() {}; + + + +/** + * @constructor + * @param {ArrayBuffer} arrayBuffer Array buffer. + * @implements {ol.binary.IReader} + */ +ol.binary.ArrayBufferReader = function(arrayBuffer) { + + /** + * @private + * @type {Uint8Array} + */ + this.uint8View_ = new Uint8Array(arrayBuffer); + + /** + * @private + * @type {number} + */ + this.length_ = this.uint8View_.length; + + /** + * @private + * @type {number} + */ + this.offset_ = 0; + +}; + + +/** + * @inheritDoc + */ +ol.binary.ArrayBufferReader.prototype.atEOF = function() { + return this.offset_ == this.length_; +}; + + +/** + * @inheritDoc + */ +ol.binary.ArrayBufferReader.prototype.readByte = function() { + if (this.offset_ < this.length_) { + return this.uint8View_[this.offset_++]; + } else { + goog.asserts.fail(); + return 0; + } +}; + + + +/** + * @constructor + * @implements {ol.binary.IReader} + * @param {Array.} array Array. + */ +ol.binary.ArrayReader = function(array) { + + /** + * @private + * @type {Array.} + */ + this.array_ = array; + + /** + * @private + * @type {number} + */ + this.length_ = array.length; + + /** + * @private + * @type {number} + */ + this.offset_ = 0; + +}; + + +/** + * @inheritDoc + */ +ol.binary.ArrayReader.prototype.atEOF = function() { + return this.offset_ == this.length_; +}; + + +/** + * @inheritDoc + */ +ol.binary.ArrayReader.prototype.readByte = function() { + if (this.offset_ < this.length_) { + return this.array_[this.offset_++]; + } else { + goog.asserts.fail(); + return 0; + } +}; diff --git a/float-no-zero/ol/ol/browserfeature.exports b/float-no-zero/ol/ol/browserfeature.exports new file mode 100644 index 0000000000..832c611d89 --- /dev/null +++ b/float-no-zero/ol/ol/browserfeature.exports @@ -0,0 +1,7 @@ +@exportSymbol ol.BrowserFeature +@exportProperty ol.BrowserFeature.DEVICE_PIXEL_RATIO +@exportProperty ol.BrowserFeature.HAS_CANVAS +@exportProperty ol.BrowserFeature.HAS_DEVICE_ORIENTATION +@exportProperty ol.BrowserFeature.HAS_GEOLOCATION +@exportProperty ol.BrowserFeature.HAS_TOUCH +@exportProperty ol.BrowserFeature.HAS_WEBGL diff --git a/float-no-zero/ol/ol/browserfeature.js b/float-no-zero/ol/ol/browserfeature.js new file mode 100644 index 0000000000..265ba06fdd --- /dev/null +++ b/float-no-zero/ol/ol/browserfeature.js @@ -0,0 +1,188 @@ +goog.provide('ol.BrowserFeature'); + +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.userAgent'); +goog.require('ol.webgl'); + + +/** + * @define {boolean} Assume touch. + */ +ol.ASSUME_TOUCH = false; + + +/** + * @define {boolean} Whether to enable canvas. + */ +ol.ENABLE_CANVAS = true; + + +/** + * @define {boolean} Whether to enable DOM. + */ +ol.ENABLE_DOM = true; + + +/** + * @define {boolean} Whether to enable rendering of image layers. + */ +ol.ENABLE_IMAGE = true; + + +/** + * @define {boolean} Whether to enable rendering of tile layers. + */ +ol.ENABLE_TILE = true; + + +/** + * @define {boolean} Whether to enable rendering of vector layers. + */ +ol.ENABLE_VECTOR = true; + + +/** + * @define {boolean} Whether to enable WebGL. + */ +ol.ENABLE_WEBGL = true; + + +/** + * @define {boolean} Whether to support legacy IE (7-8). + */ +ol.LEGACY_IE_SUPPORT = false; + + +/** + * Whether the current browser is legacy IE + * @const + * @type {boolean} + */ +ol.IS_LEGACY_IE = goog.userAgent.IE && + !goog.userAgent.isVersionOrHigher('9.0') && goog.userAgent.VERSION !== ''; + + +/** + * The ratio between physical pixels and device-independent pixels + * (dips) on the device (`window.devicePixelRatio`). + * @const + * @type {number} + * @todo stability experimental + */ +ol.BrowserFeature.DEVICE_PIXEL_RATIO = goog.global.devicePixelRatio || 1; + + +/** + * True if the browser supports ArrayBuffers. + * @type {boolean} + * @todo stability experimental + */ +ol.BrowserFeature.HAS_ARRAY_BUFFER = 'ArrayBuffer' in goog.global; + + +/** + * True if the browser's Canvas implementation implements {get,set}LineDash. + * @type {boolean} + * @todo stability experimental + */ +ol.BrowserFeature.HAS_CANVAS_LINE_DASH = false; + + +/** + * True if browser supports Canvas. + * @const + * @type {boolean} + * @todo stability experimental + */ +ol.BrowserFeature.HAS_CANVAS = ol.ENABLE_CANVAS && ( + /** + * @return {boolean} Canvas supported. + */ + function() { + if (!('HTMLCanvasElement' in goog.global)) { + return false; + } + try { + var canvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + var context = /** @type {CanvasRenderingContext2D} */ + (canvas.getContext('2d')); + if (goog.isNull(context)) { + return false; + } else { + if (goog.isDef(context.setLineDash)) { + ol.BrowserFeature.HAS_CANVAS_LINE_DASH = true; + } + return true; + } + } catch (e) { + return false; + } + })(); + + +/** + * Indicates if DeviceOrientation is supported in the user's browser. + * @const + * @type {boolean} + * @todo stability experimental + */ +ol.BrowserFeature.HAS_DEVICE_ORIENTATION = + 'DeviceOrientationEvent' in goog.global; + + +/** + * True if browser supports DOM. + * @const + * @type {boolean} + * @todo stability experimental + */ +ol.BrowserFeature.HAS_DOM = ol.ENABLE_DOM; + + +/** + * Is HTML5 geolocation supported in the current browser? + * @const + * @type {boolean} + * @todo stability experimental + */ +ol.BrowserFeature.HAS_GEOLOCATION = 'geolocation' in goog.global.navigator; + + +/** + * True if browser supports touch events. + * @const + * @type {boolean} + * @todo stability experimental + */ +ol.BrowserFeature.HAS_TOUCH = ol.ASSUME_TOUCH || + (goog.global.document && + 'ontouchstart' in goog.global.document.documentElement) || + !!(goog.global.navigator.msPointerEnabled); + + +/** + * True if browser supports WebGL. + * @const + * @type {boolean} + * @todo stability experimental + */ +ol.BrowserFeature.HAS_WEBGL = ol.ENABLE_WEBGL && ( + /** + * @return {boolean} WebGL supported. + */ + function() { + if (!('WebGLRenderingContext' in goog.global)) { + return false; + } + try { + var canvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + return !goog.isNull(ol.webgl.getContext(canvas, { + failIfMajorPerformanceCaveat: true + })); + } catch (e) { + return false; + } + })(); diff --git a/float-no-zero/ol/ol/browserfeature.jsdoc b/float-no-zero/ol/ol/browserfeature.jsdoc new file mode 100644 index 0000000000..b07b409986 --- /dev/null +++ b/float-no-zero/ol/ol/browserfeature.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.BrowserFeature + */ diff --git a/float-no-zero/ol/ol/canvasfunction.js b/float-no-zero/ol/ol/canvasfunction.js new file mode 100644 index 0000000000..10caa4be88 --- /dev/null +++ b/float-no-zero/ol/ol/canvasfunction.js @@ -0,0 +1,17 @@ +goog.provide('ol.CanvasFunctionType'); + + +/** + * A function returning the canvas element (`{HTMLCanvasElement}`) + * used by the source as an image. The arguments passed to the function are: + * {@link ol.Extent} the image extent, `{number}` the image resolution, + * `{number}` the device pixel ratio, {@link ol.Size} the image size, and + * {@link ol.proj.Projection} the image projection. The canvas returned by + * this function is cached by the source. The this keyword inside the function + * references the {@link ol.source.ImageCanvas}. + * + * @typedef {function(this:ol.source.ImageCanvas, ol.Extent, number, + * number, ol.Size, ol.proj.Projection): HTMLCanvasElement} + * @todo stability experimental + */ +ol.CanvasFunctionType; diff --git a/float-no-zero/ol/ol/centerconstraint.js b/float-no-zero/ol/ol/centerconstraint.js new file mode 100644 index 0000000000..790e53237f --- /dev/null +++ b/float-no-zero/ol/ol/centerconstraint.js @@ -0,0 +1,43 @@ +goog.provide('ol.CenterConstraint'); +goog.provide('ol.CenterConstraintType'); + +goog.require('goog.math'); + + +/** + * @typedef {function((ol.Coordinate|undefined)): (ol.Coordinate|undefined)} + * @todo stability experimental + */ +ol.CenterConstraintType; + + +/** + * @param {ol.Extent} extent Extent. + * @return {ol.CenterConstraintType} + */ +ol.CenterConstraint.createExtent = function(extent) { + return ( + /** + * @param {ol.Coordinate|undefined} center Center. + * @return {ol.Coordinate|undefined} Center. + */ + function(center) { + if (goog.isDef(center)) { + return [ + goog.math.clamp(center[0], extent[0], extent[2]), + goog.math.clamp(center[1], extent[1], extent[3]) + ]; + } else { + return undefined; + } + }); +}; + + +/** + * @param {ol.Coordinate|undefined} center Center. + * @return {ol.Coordinate|undefined} Center. + */ +ol.CenterConstraint.none = function(center) { + return center; +}; diff --git a/float-no-zero/ol/ol/collection.exports b/float-no-zero/ol/ol/collection.exports new file mode 100644 index 0000000000..afd0bd9b97 --- /dev/null +++ b/float-no-zero/ol/ol/collection.exports @@ -0,0 +1,13 @@ +@exportSymbol ol.Collection +@exportProperty ol.Collection.prototype.clear +@exportProperty ol.Collection.prototype.extend +@exportProperty ol.Collection.prototype.forEach +@exportProperty ol.Collection.prototype.getArray +@exportProperty ol.Collection.prototype.getAt +@exportProperty ol.Collection.prototype.getLength +@exportProperty ol.Collection.prototype.insertAt +@exportProperty ol.Collection.prototype.pop +@exportProperty ol.Collection.prototype.push +@exportProperty ol.Collection.prototype.remove +@exportProperty ol.Collection.prototype.removeAt +@exportProperty ol.Collection.prototype.setAt diff --git a/float-no-zero/ol/ol/collection.js b/float-no-zero/ol/ol/collection.js new file mode 100644 index 0000000000..4ef1849391 --- /dev/null +++ b/float-no-zero/ol/ol/collection.js @@ -0,0 +1,254 @@ + +/** + * An implementation of Google Maps' MVCArray. + * @see https://developers.google.com/maps/documentation/javascript/reference + */ + +goog.provide('ol.Collection'); +goog.provide('ol.CollectionEvent'); +goog.provide('ol.CollectionEventType'); + +goog.require('goog.array'); +goog.require('goog.events.Event'); +goog.require('ol.Object'); + + +/** + * @enum {string} + */ +ol.CollectionEventType = { + ADD: 'add', + REMOVE: 'remove' +}; + + + +/** + * @constructor + * @extends {goog.events.Event} + * @implements {oli.CollectionEvent} + * @param {ol.CollectionEventType} type Type. + * @param {*=} opt_element Element. + * @param {Object=} opt_target Target. + */ +ol.CollectionEvent = function(type, opt_element, opt_target) { + + goog.base(this, type, opt_target); + + /** + * @type {*} + */ + this.element = opt_element; + +}; +goog.inherits(ol.CollectionEvent, goog.events.Event); + + +/** + * @enum {string} + */ +ol.CollectionProperty = { + LENGTH: 'length' +}; + + + +/** + * A mutable MVC Array. + * @constructor + * @extends {ol.Object} + * @param {Array=} opt_array Array. + * @todo stability experimental + * @todo observable length {number} readonly the length of the array + */ +ol.Collection = function(opt_array) { + + goog.base(this); + + /** + * @private + * @type {Array.<*>} + */ + this.array_ = opt_array || []; + + this.updateLength_(); + +}; +goog.inherits(ol.Collection, ol.Object); + + +/** + * Remove all elements from the collection. + * @todo stability experimental + */ +ol.Collection.prototype.clear = function() { + while (this.getLength() > 0) { + this.pop(); + } +}; + + +/** + * @param {Array} arr Array. + * @return {ol.Collection} This collection. + * @todo stability experimental + */ +ol.Collection.prototype.extend = function(arr) { + var i, ii; + for (i = 0, ii = arr.length; i < ii; ++i) { + this.push(arr[i]); + } + return this; +}; + + +/** + * Iterate over each element, calling the provided callback. + * @param {function(this: S, T, number, Array.): *} f The function to call + * for every element. This function takes 3 arguments (the element, the + * index and the array). The return value is ignored. + * @param {S=} opt_this The object to use as `this` in `f`. + * @template T,S + * @todo stability experimental + */ +ol.Collection.prototype.forEach = function(f, opt_this) { + goog.array.forEach(this.array_, f, opt_this); +}; + + +/** + * Get a reference to the underlying Array object. Warning: if the array + * is mutated, no events will be dispatched by the collection, and the + * collection's "length" property won't be in sync with the actual length + * of the array. + * @return {Array} Array. + * @todo stability experimental + */ +ol.Collection.prototype.getArray = function() { + return this.array_; +}; + + +/** + * Get the element at the provided index. + * @param {number} index Index. + * @return {*} Element. + * @todo stability experimental + */ +ol.Collection.prototype.getAt = function(index) { + return this.array_[index]; +}; + + +/** + * Get the length of this collection. + * @return {number} Length. + * @todo stability experimental + */ +ol.Collection.prototype.getLength = function() { + return /** @type {number} */ (this.get(ol.CollectionProperty.LENGTH)); +}; + + +/** + * Insert an element at the provided index. + * @param {number} index Index. + * @param {*} elem Element. + * @todo stability experimental + */ +ol.Collection.prototype.insertAt = function(index, elem) { + goog.array.insertAt(this.array_, elem, index); + this.updateLength_(); + this.dispatchEvent( + new ol.CollectionEvent(ol.CollectionEventType.ADD, elem, this)); +}; + + +/** + * Remove the last element of the collection. + * @return {*} Element. + * @todo stability experimental + */ +ol.Collection.prototype.pop = function() { + return this.removeAt(this.getLength() - 1); +}; + + +/** + * Insert the provided element at the end of the collection. + * @param {*} elem Element. + * @return {number} Length. + * @todo stability experimental + */ +ol.Collection.prototype.push = function(elem) { + var n = this.array_.length; + this.insertAt(n, elem); + return n; +}; + + +/** + * Removes the first occurence of elem from the collection. + * @param {*} elem Element. + * @return {*} The removed element or undefined if elem was not found. + * @todo stability experimental + */ +ol.Collection.prototype.remove = function(elem) { + var arr = this.array_; + var i, ii; + for (i = 0, ii = arr.length; i < ii; ++i) { + if (arr[i] === elem) { + return this.removeAt(i); + } + } + return undefined; +}; + + +/** + * Remove the element at the provided index. + * @param {number} index Index. + * @return {*} Value. + * @todo stability experimental + */ +ol.Collection.prototype.removeAt = function(index) { + var prev = this.array_[index]; + goog.array.removeAt(this.array_, index); + this.updateLength_(); + this.dispatchEvent( + new ol.CollectionEvent(ol.CollectionEventType.REMOVE, prev, this)); + return prev; +}; + + +/** + * Set the element at the provided index. + * @param {number} index Index. + * @param {*} elem Element. + * @todo stability experimental + */ +ol.Collection.prototype.setAt = function(index, elem) { + var n = this.getLength(); + if (index < n) { + var prev = this.array_[index]; + this.array_[index] = elem; + this.dispatchEvent( + new ol.CollectionEvent(ol.CollectionEventType.REMOVE, prev, this)); + this.dispatchEvent( + new ol.CollectionEvent(ol.CollectionEventType.ADD, elem, this)); + } else { + var j; + for (j = n; j < index; ++j) { + this.insertAt(j, undefined); + } + this.insertAt(index, elem); + } +}; + + +/** + * @private + */ +ol.Collection.prototype.updateLength_ = function() { + this.set(ol.CollectionProperty.LENGTH, this.array_.length); +}; diff --git a/float-no-zero/ol/ol/color/color.exports b/float-no-zero/ol/ol/color/color.exports new file mode 100644 index 0000000000..cc1d37a73a --- /dev/null +++ b/float-no-zero/ol/ol/color/color.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.color.asArray +@exportSymbol ol.color.asString diff --git a/float-no-zero/ol/ol/color/color.js b/float-no-zero/ol/ol/color/color.js new file mode 100644 index 0000000000..a0befe3df5 --- /dev/null +++ b/float-no-zero/ol/ol/color/color.js @@ -0,0 +1,354 @@ +// We can't use goog.color or goog.color.alpha because they interally use a hex +// string representation that encodes each channel in a single byte. This +// causes occasional loss of precision and rounding errors, especially in the +// alpha channel. + +goog.provide('ol.color'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.color'); +goog.require('goog.color.names'); +goog.require('goog.math'); +goog.require('goog.vec.Mat4'); + + +/** + * @define {boolean} Enable named colors. + * Enabling named colors adds about 3KB uncompressed / 1.5KB compressed to the + * final build size. + */ +ol.color.ENABLE_NAMED_COLORS = true; + + +/** + * A color represented as a short array [red, green, blue, alpha]. + * red, green, and blue should be integers in the range 0..255 inclusive. + * alpha should be a float in the range 0..1 inclusive. + * @typedef {Array.} + */ +ol.Color; + + +/** + * This RegExp matches # followed by 3 or 6 hex digits. + * @const + * @type {RegExp} + * @private + */ +ol.color.hexColorRe_ = /^#(?:[0-9a-f]{3}){1,2}$/i; + + +/** + * @see goog.color.rgbColorRe_ + * @const + * @type {RegExp} + * @private + */ +ol.color.rgbColorRe_ = + /^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i; + + +/** + * @see goog.color.alpha.rgbaColorRe_ + * @const + * @type {RegExp} + * @private + */ +ol.color.rgbaColorRe_ = + /^(?:rgba)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|1|0\.\d{0,10})\)$/i; + + +/** + * @param {ol.Color} dst Destination. + * @param {ol.Color} src Source. + * @param {ol.Color=} opt_color Color. + * @return {ol.Color} Color. + */ +ol.color.blend = function(dst, src, opt_color) { + // http://en.wikipedia.org/wiki/Alpha_compositing + // FIXME do we need to scale by 255? + var out = goog.isDef(opt_color) ? opt_color : []; + var dstA = dst[3]; + var srcA = dst[3]; + if (dstA == 1) { + out[0] = (src[0] * srcA + dst[0] * (1 - srcA) + 0.5) | 0; + out[1] = (src[1] * srcA + dst[1] * (1 - srcA) + 0.5) | 0; + out[2] = (src[2] * srcA + dst[2] * (1 - srcA) + 0.5) | 0; + out[4] = 1; + } else if (srcA === 0) { + out[0] = dst[0]; + out[1] = dst[1]; + out[2] = dst[2]; + out[3] = dstA; + } else { + var outA = srcA + dstA * (1 - srcA); + if (outA === 0) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + } else { + out[0] = ((src[0] * srcA + dst[0] * dstA * (1 - srcA)) / outA + 0.5) | 0; + out[1] = ((src[1] * srcA + dst[1] * dstA * (1 - srcA)) / outA + 0.5) | 0; + out[2] = ((src[2] * srcA + dst[2] * dstA * (1 - srcA)) / outA + 0.5) | 0; + out[3] = outA; + } + } + goog.asserts.assert(ol.color.isValid(out)); + return out; +}; + + +/** + * @param {ol.Color|string} color Color. + * @return {ol.Color} Color. + */ +ol.color.asArray = function(color) { + if (goog.isArray(color)) { + return color; + } else { + goog.asserts.assert(goog.isString(color)); + return ol.color.fromString(color); + } +}; + + +/** + * @param {ol.Color|string} color Color. + * @return {string} String. + */ +ol.color.asString = function(color) { + if (goog.isString(color)) { + return color; + } else { + goog.asserts.assert(goog.isArray(color)); + return ol.color.toString(color); + } +}; + + +/** + * @param {ol.Color} color1 Color1. + * @param {ol.Color} color2 Color2. + * @return {boolean} Equals. + */ +ol.color.equals = function(color1, color2) { + return color1 === color2 || ( + color1[0] == color2[0] && color1[1] == color2[1] && + color1[2] == color2[2] && color1[3] == color2[3]); +}; + + +/** + * @param {string} s String. + * @param {ol.Color=} opt_color Color. + * @return {ol.Color} Color. + */ +ol.color.fromString = ( + /** + * @return {function(string, ol.Color=): ol.Color} + */ + function() { + + // We maintain a small cache of parsed strings. To provide cheap LRU-like + // semantics, whenever the cache grows too large we simply delete an + // arbitrary 25% of the entries. + + /** + * @const + * @type {number} + */ + var MAX_CACHE_SIZE = 1024; + + /** + * @type {Object.} + */ + var cache = {}; + + /** + * @type {number} + */ + var cacheSize = 0; + + return ( + /** + * @param {string} s String. + * @param {ol.Color=} opt_color Color. + * @return {ol.Color} Color. + */ + function(s, opt_color) { + var color; + if (cache.hasOwnProperty(s)) { + color = cache[s]; + } else { + if (cacheSize >= MAX_CACHE_SIZE) { + var i = 0; + var key; + for (key in cache) { + if ((i++ & 3) === 0) { + delete cache[key]; + --cacheSize; + } + } + } + color = ol.color.fromStringInternal_(s); + cache[s] = color; + ++cacheSize; + } + return ol.color.returnOrUpdate(color, opt_color); + }); + + })(); + + +/** + * @param {string} s String. + * @private + * @return {ol.Color} Color. + */ +ol.color.fromStringInternal_ = function(s) { + + var isHex = false; + if (ol.color.ENABLE_NAMED_COLORS && goog.color.names.hasOwnProperty(s)) { + // goog.color.names does not have a type declaration, so add a typecast + s = /** @type {string} */ (goog.color.names[s]); + isHex = true; + } + + var r, g, b, a, color, match; + if (isHex || (match = ol.color.hexColorRe_.exec(s))) { // hex + var n = s.length - 1; // number of hex digits + goog.asserts.assert(n == 3 || n == 6); + var d = n == 3 ? 1 : 2; // number of digits per channel + r = parseInt(s.substr(1 + 0 * d, d), 16); + g = parseInt(s.substr(1 + 1 * d, d), 16); + b = parseInt(s.substr(1 + 2 * d, d), 16); + if (d == 1) { + r = (r << 4) + r; + g = (g << 4) + g; + b = (b << 4) + b; + } + a = 1; + color = [r, g, b, a]; + goog.asserts.assert(ol.color.isValid(color)); + return color; + } else if ((match = ol.color.rgbaColorRe_.exec(s))) { // rgba() + r = Number(match[1]); + g = Number(match[2]); + b = Number(match[3]); + a = Number(match[4]); + color = [r, g, b, a]; + return ol.color.normalize(color, color); + } else if ((match = ol.color.rgbColorRe_.exec(s))) { // rgb() + r = Number(match[1]); + g = Number(match[2]); + b = Number(match[3]); + color = [r, g, b, 1]; + return ol.color.normalize(color, color); + } else { + throw new Error(s + ' is not a valid color'); + } + +}; + + +/** + * @param {ol.Color} color Color. + * @return {boolean} Is valid. + */ +ol.color.isValid = function(color) { + return 0 <= color[0] && color[0] < 256 && + 0 <= color[1] && color[1] < 256 && + 0 <= color[2] && color[2] < 256 && + 0 <= color[3] && color[3] <= 1; +}; + + +/** + * @param {ol.Color} color Color. + * @param {ol.Color=} opt_color Color. + * @return {ol.Color} Clamped color. + */ +ol.color.normalize = function(color, opt_color) { + var result = goog.isDef(opt_color) ? opt_color : []; + result[0] = goog.math.clamp((color[0] + 0.5) | 0, 0, 255); + result[1] = goog.math.clamp((color[1] + 0.5) | 0, 0, 255); + result[2] = goog.math.clamp((color[2] + 0.5) | 0, 0, 255); + result[3] = goog.math.clamp(color[3], 0, 1); + return result; +}; + + +/** + * @param {ol.Color} color Color. + * @param {ol.Color=} opt_color Color. + * @return {ol.Color} Color. + */ +ol.color.returnOrUpdate = function(color, opt_color) { + if (goog.isDef(opt_color)) { + opt_color[0] = color[0]; + opt_color[1] = color[1]; + opt_color[2] = color[2]; + opt_color[3] = color[3]; + return opt_color; + } else { + return color; + } +}; + + +/** + * @param {ol.Color} color Color. + * @return {string} String. + */ +ol.color.toString = function(color) { + var r = color[0]; + if (r != (r | 0)) { + r = (r + 0.5) | 0; + } + var g = color[1]; + if (g != (g | 0)) { + g = (g + 0.5) | 0; + } + var b = color[2]; + if (b != (b | 0)) { + b = (b + 0.5) | 0; + } + var a = color[3]; + return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; +}; + + +/** + * @param {ol.Color} color Color. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {ol.Color=} opt_color Color. + * @return {ol.Color} Transformed color. + */ +ol.color.transform = function(color, transform, opt_color) { + var result = goog.isDef(opt_color) ? opt_color : []; + result = goog.vec.Mat4.multVec3(transform, color, result); + goog.asserts.assert(goog.isArray(result)); + result[3] = color[3]; + return ol.color.normalize(result, result); +}; + + +/** + * @param {ol.Color|string} color1 Color2. + * @param {ol.Color|string} color2 Color2. + * @return {boolean} Equals. + */ +ol.color.stringOrColorEquals = function(color1, color2) { + if (color1 === color2 || color1 == color2) { + return true; + } + if (goog.isString(color1)) { + color1 = ol.color.fromString(color1); + } + if (goog.isString(color2)) { + color2 = ol.color.fromString(color2); + } + return ol.color.equals(color1, color2); +}; diff --git a/float-no-zero/ol/ol/color/colormatrix.js b/float-no-zero/ol/ol/color/colormatrix.js new file mode 100644 index 0000000000..ac947263fc --- /dev/null +++ b/float-no-zero/ol/ol/color/colormatrix.js @@ -0,0 +1,205 @@ +goog.provide('ol.color.Matrix'); + +goog.require('goog.vec.Mat4'); + + + +/** + * @constructor + */ +ol.color.Matrix = function() { + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.colorMatrix_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {number|undefined} + */ + this.brightness_ = undefined; + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.brightnessMatrix_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {number|undefined} + */ + this.contrast_ = undefined; + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.contrastMatrix_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {number|undefined} + */ + this.hue_ = undefined; + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.hueMatrix_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {number|undefined} + */ + this.saturation_ = undefined; + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.saturationMatrix_ = goog.vec.Mat4.createNumber(); + +}; + + +/** + * @param {!goog.vec.Mat4.Number} matrix Matrix. + * @param {number} value Brightness value. + * @return {!goog.vec.Mat4.Number} Matrix. + */ +ol.color.Matrix.makeBrightness = function(matrix, value) { + goog.vec.Mat4.makeTranslate(matrix, value, value, value); + return matrix; +}; + + +/** + * @param {!goog.vec.Mat4.Number} matrix Matrix. + * @param {number} value Contrast value. + * @return {!goog.vec.Mat4.Number} Matrix. + */ +ol.color.Matrix.makeContrast = function(matrix, value) { + goog.vec.Mat4.makeScale(matrix, value, value, value); + var translateValue = (-0.5 * value + 0.5); + goog.vec.Mat4.setColumnValues(matrix, 3, + translateValue, translateValue, translateValue, 1); + return matrix; +}; + + +/** + * @param {!goog.vec.Mat4.Number} matrix Matrix. + * @param {number} value Hue value. + * @return {!goog.vec.Mat4.Number} Matrix. + */ +ol.color.Matrix.makeHue = function(matrix, value) { + var cosHue = Math.cos(value); + var sinHue = Math.sin(value); + var v00 = 0.213 + cosHue * 0.787 - sinHue * 0.213; + var v01 = 0.715 - cosHue * 0.715 - sinHue * 0.715; + var v02 = 0.072 - cosHue * 0.072 + sinHue * 0.928; + var v03 = 0; + var v10 = 0.213 - cosHue * 0.213 + sinHue * 0.143; + var v11 = 0.715 + cosHue * 0.285 + sinHue * 0.140; + var v12 = 0.072 - cosHue * 0.072 - sinHue * 0.283; + var v13 = 0; + var v20 = 0.213 - cosHue * 0.213 - sinHue * 0.787; + var v21 = 0.715 - cosHue * 0.715 + sinHue * 0.715; + var v22 = 0.072 + cosHue * 0.928 + sinHue * 0.072; + var v23 = 0; + var v30 = 0; + var v31 = 0; + var v32 = 0; + var v33 = 1; + goog.vec.Mat4.setFromValues(matrix, + v00, v10, v20, v30, + v01, v11, v21, v31, + v02, v12, v22, v32, + v03, v13, v23, v33); + return matrix; +}; + + +/** + * @param {!goog.vec.Mat4.Number} matrix Matrix. + * @param {number} value Saturation value. + * @return {!goog.vec.Mat4.Number} Matrix. + */ +ol.color.Matrix.makeSaturation = function(matrix, value) { + var v00 = 0.213 + 0.787 * value; + var v01 = 0.715 - 0.715 * value; + var v02 = 0.072 - 0.072 * value; + var v03 = 0; + var v10 = 0.213 - 0.213 * value; + var v11 = 0.715 + 0.285 * value; + var v12 = 0.072 - 0.072 * value; + var v13 = 0; + var v20 = 0.213 - 0.213 * value; + var v21 = 0.715 - 0.715 * value; + var v22 = 0.072 + 0.928 * value; + var v23 = 0; + var v30 = 0; + var v31 = 0; + var v32 = 0; + var v33 = 1; + goog.vec.Mat4.setFromValues(matrix, + v00, v10, v20, v30, + v01, v11, v21, v31, + v02, v12, v22, v32, + v03, v13, v23, v33); + return matrix; +}; + + +/** + * @param {number|undefined} brightness Brightness. + * @param {number|undefined} contrast Contrast. + * @param {number|undefined} hue Hue. + * @param {number|undefined} saturation Saturation. + * @return {!goog.vec.Mat4.Number} Matrix. + */ +ol.color.Matrix.prototype.getMatrix = function( + brightness, contrast, hue, saturation) { + var colorMatrixDirty = false; + if (goog.isDef(brightness) && brightness !== this.brightness_) { + ol.color.Matrix.makeBrightness(this.brightnessMatrix_, brightness); + this.brightness_ = brightness; + colorMatrixDirty = true; + } + if (goog.isDef(contrast) && contrast !== this.contrast_) { + ol.color.Matrix.makeContrast(this.contrastMatrix_, contrast); + this.contrast_ = contrast; + colorMatrixDirty = true; + } + if (goog.isDef(hue) && hue !== this.hue_) { + ol.color.Matrix.makeHue(this.hueMatrix_, hue); + this.hue_ = hue; + colorMatrixDirty = true; + } + if (goog.isDef(saturation) && saturation !== this.saturation_) { + ol.color.Matrix.makeSaturation(this.saturationMatrix_, saturation); + this.saturation_ = saturation; + colorMatrixDirty = true; + } + if (colorMatrixDirty) { + var colorMatrix = this.colorMatrix_; + goog.vec.Mat4.makeIdentity(colorMatrix); + if (goog.isDef(contrast)) { + goog.vec.Mat4.multMat(colorMatrix, this.contrastMatrix_, colorMatrix); + } + if (goog.isDef(brightness)) { + goog.vec.Mat4.multMat(colorMatrix, this.brightnessMatrix_, colorMatrix); + } + if (goog.isDef(saturation)) { + goog.vec.Mat4.multMat(colorMatrix, this.saturationMatrix_, colorMatrix); + } + if (goog.isDef(hue)) { + goog.vec.Mat4.multMat(colorMatrix, this.hueMatrix_, colorMatrix); + } + } + return this.colorMatrix_; +}; diff --git a/float-no-zero/ol/ol/constraints.js b/float-no-zero/ol/ol/constraints.js new file mode 100644 index 0000000000..84fc289b6f --- /dev/null +++ b/float-no-zero/ol/ol/constraints.js @@ -0,0 +1,35 @@ +goog.provide('ol.Constraints'); + +goog.require('ol.CenterConstraintType'); +goog.require('ol.ResolutionConstraintType'); +goog.require('ol.RotationConstraintType'); + + + +/** + * @constructor + * @param {ol.CenterConstraintType} centerConstraint Center constraint. + * @param {ol.ResolutionConstraintType} resolutionConstraint + * Resolution constraint. + * @param {ol.RotationConstraintType} rotationConstraint + * Rotation constraint. + */ +ol.Constraints = + function(centerConstraint, resolutionConstraint, rotationConstraint) { + + /** + * @type {ol.CenterConstraintType} + */ + this.center = centerConstraint; + + /** + * @type {ol.ResolutionConstraintType} + */ + this.resolution = resolutionConstraint; + + /** + * @type {ol.RotationConstraintType} + */ + this.rotation = rotationConstraint; + +}; diff --git a/float-no-zero/ol/ol/control.jsdoc b/float-no-zero/ol/ol/control.jsdoc new file mode 100644 index 0000000000..bd09e4c9b2 --- /dev/null +++ b/float-no-zero/ol/ol/control.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.control + */ diff --git a/float-no-zero/ol/ol/control/attributioncontrol.exports b/float-no-zero/ol/ol/control/attributioncontrol.exports new file mode 100644 index 0000000000..a9fa893101 --- /dev/null +++ b/float-no-zero/ol/ol/control/attributioncontrol.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.control.Attribution +@exportProperty ol.control.Attribution.prototype.setMap diff --git a/float-no-zero/ol/ol/control/attributioncontrol.js b/float-no-zero/ol/ol/control/attributioncontrol.js new file mode 100644 index 0000000000..b8e6e63b58 --- /dev/null +++ b/float-no-zero/ol/ol/control/attributioncontrol.js @@ -0,0 +1,189 @@ +// FIXME handle date line wrap + +goog.provide('ol.control.Attribution'); + +goog.require('goog.array'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.object'); +goog.require('goog.style'); +goog.require('ol.Attribution'); +goog.require('ol.FrameState'); +goog.require('ol.control.Control'); +goog.require('ol.css'); + + + +/** + * Create a new attribution control to show all the attributions associated + * with the layer sources in the map. A default map has this control included. + * By default it will show in the bottom right portion of the map, but it can + * be changed by using a css selector for `.ol-attribution`. + * @constructor + * @extends {ol.control.Control} + * @param {olx.control.AttributionOptions=} opt_options Attribution options. + * @todo stability experimental + */ +ol.control.Attribution = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {Element} + */ + this.ulElement_ = goog.dom.createElement(goog.dom.TagName.UL); + + var className = goog.isDef(options.className) ? + options.className : 'ol-attribution'; + var element = goog.dom.createDom(goog.dom.TagName.DIV, { + 'class': className + ' ' + ol.css.CLASS_UNSELECTABLE + }, this.ulElement_); + + goog.base(this, { + element: element, + target: options.target + }); + + /** + * @private + * @type {boolean} + */ + this.renderedVisible_ = true; + + /** + * @private + * @type {Object.} + */ + this.attributionElements_ = {}; + + /** + * @private + * @type {Object.} + */ + this.attributionElementRenderedVisible_ = {}; + +}; +goog.inherits(ol.control.Attribution, ol.control.Control); + + +/** + * @param {?ol.FrameState} frameState Frame state. + * @return {Array.>} Attributions. + */ +ol.control.Attribution.prototype.getSourceAttributions = + function(frameState) { + var i, ii, j, jj, tileRanges, source, sourceAttribution, + sourceAttributionKey, sourceAttributions, sourceKey; + var layers = frameState.layersArray; + /** @type {Object.} */ + var attributions = goog.object.clone(frameState.attributions); + /** @type {Object.} */ + var hiddenAttributions = {}; + for (i = 0, ii = layers.length; i < ii; i++) { + source = layers[i].getSource(); + sourceKey = goog.getUid(source).toString(); + sourceAttributions = source.getAttributions(); + if (goog.isNull(sourceAttributions)) { + continue; + } + for (j = 0, jj = sourceAttributions.length; j < jj; j++) { + sourceAttribution = sourceAttributions[j]; + sourceAttributionKey = goog.getUid(sourceAttribution).toString(); + if (sourceAttributionKey in attributions) { + continue; + } + tileRanges = frameState.usedTiles[sourceKey]; + if (goog.isDef(tileRanges) && + sourceAttribution.intersectsAnyTileRange(tileRanges)) { + if (sourceAttributionKey in hiddenAttributions) { + delete hiddenAttributions[sourceAttributionKey]; + } + attributions[sourceAttributionKey] = sourceAttribution; + } + else { + hiddenAttributions[sourceAttributionKey] = sourceAttribution; + } + } + } + return [attributions, hiddenAttributions]; +}; + + +/** + * @inheritDoc + */ +ol.control.Attribution.prototype.handleMapPostrender = function(mapEvent) { + this.updateElement_(mapEvent.frameState); +}; + + +/** + * @private + * @param {?ol.FrameState} frameState Frame state. + */ +ol.control.Attribution.prototype.updateElement_ = function(frameState) { + + if (goog.isNull(frameState)) { + if (this.renderedVisible_) { + goog.style.setElementShown(this.element, false); + this.renderedVisible_ = false; + } + return; + } + + var attributions = this.getSourceAttributions(frameState); + /** @type {Object.} */ + var visibleAttributions = attributions[0]; + /** @type {Object.} */ + var hiddenAttributions = attributions[1]; + + var attributionElement, attributionKey; + for (attributionKey in this.attributionElements_) { + if (attributionKey in visibleAttributions) { + if (!this.attributionElementRenderedVisible_[attributionKey]) { + goog.style.setElementShown( + this.attributionElements_[attributionKey], true); + this.attributionElementRenderedVisible_[attributionKey] = true; + } + delete visibleAttributions[attributionKey]; + } + else if (attributionKey in hiddenAttributions) { + if (this.attributionElementRenderedVisible_[attributionKey]) { + goog.style.setElementShown( + this.attributionElements_[attributionKey], false); + delete this.attributionElementRenderedVisible_[attributionKey]; + } + delete hiddenAttributions[attributionKey]; + } + else { + goog.dom.removeNode(this.attributionElements_[attributionKey]); + delete this.attributionElements_[attributionKey]; + delete this.attributionElementRenderedVisible_[attributionKey]; + } + } + for (attributionKey in visibleAttributions) { + attributionElement = goog.dom.createElement(goog.dom.TagName.LI); + attributionElement.innerHTML = + visibleAttributions[attributionKey].getHTML(); + goog.dom.appendChild(this.ulElement_, attributionElement); + this.attributionElements_[attributionKey] = attributionElement; + this.attributionElementRenderedVisible_[attributionKey] = true; + } + for (attributionKey in hiddenAttributions) { + attributionElement = goog.dom.createElement(goog.dom.TagName.LI); + attributionElement.innerHTML = + hiddenAttributions[attributionKey].getHTML(); + goog.style.setElementShown(attributionElement, false); + goog.dom.appendChild(this.ulElement_, attributionElement); + this.attributionElements_[attributionKey] = attributionElement; + } + + var renderVisible = + !goog.object.isEmpty(this.attributionElementRenderedVisible_); + if (this.renderedVisible_ != renderVisible) { + goog.style.setElementShown(this.element, renderVisible); + this.renderedVisible_ = renderVisible; + } + +}; diff --git a/float-no-zero/ol/ol/control/control.exports b/float-no-zero/ol/ol/control/control.exports new file mode 100644 index 0000000000..1d184d239e --- /dev/null +++ b/float-no-zero/ol/ol/control/control.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.control.Control +@exportProperty ol.control.Control.prototype.getMap +@exportProperty ol.control.Control.prototype.setMap diff --git a/float-no-zero/ol/ol/control/control.js b/float-no-zero/ol/ol/control/control.js new file mode 100644 index 0000000000..ab61fc8c0b --- /dev/null +++ b/float-no-zero/ol/ol/control/control.js @@ -0,0 +1,108 @@ +goog.provide('ol.control.Control'); + +goog.require('goog.array'); +goog.require('goog.dom'); +goog.require('goog.events'); +goog.require('ol.MapEventType'); +goog.require('ol.Object'); + + + +/** + * Something to be painted over the map to provide a means for interaction + * (buttons) or to show annotations (status bars). + * + * @constructor + * @extends {ol.Object} + * @implements {oli.control.Control} + * @param {olx.control.ControlOptions} options Control options. + * @todo stability experimental + */ +ol.control.Control = function(options) { + + goog.base(this); + + /** + * @protected + * @type {Element} + */ + this.element = goog.isDef(options.element) ? options.element : null; + + /** + * @private + * @type {Element} + */ + this.target_ = goog.isDef(options.target) ? + goog.dom.getElement(options.target) : null; + + /** + * @private + * @type {ol.Map} + */ + this.map_ = null; + + /** + * @protected + * @type {!Array.} + */ + this.listenerKeys = []; + +}; +goog.inherits(ol.control.Control, ol.Object); + + +/** + * @inheritDoc + */ +ol.control.Control.prototype.disposeInternal = function() { + goog.dom.removeNode(this.element); + goog.base(this, 'disposeInternal'); +}; + + +/** + * Get the map associated with this control. + * @return {ol.Map} Map. + * @todo stability experimental + */ +ol.control.Control.prototype.getMap = function() { + return this.map_; +}; + + +/** + * Function called on each map render. Executes in a requestAnimationFrame + * callback. Can be implemented in sub-classes to re-render the control's + * UI. + * @param {ol.MapEvent} mapEvent Map event. + */ +ol.control.Control.prototype.handleMapPostrender = goog.nullFunction; + + +/** + * Remove the control from its current map and attach it to the new map. + * Subclasses may set up event handlers to get notified about changes to + * the map here. + * @param {ol.Map} map Map. + * @todo stability experimental + */ +ol.control.Control.prototype.setMap = function(map) { + if (!goog.isNull(this.map_)) { + goog.dom.removeNode(this.element); + } + if (!goog.array.isEmpty(this.listenerKeys)) { + goog.array.forEach(this.listenerKeys, goog.events.unlistenByKey); + this.listenerKeys.length = 0; + } + this.map_ = map; + if (!goog.isNull(this.map_)) { + var target = !goog.isNull(this.target_) ? + this.target_ : map.getOverlayContainerStopEvent(); + goog.dom.appendChild(target, this.element); + if (this.handleMapPostrender !== goog.nullFunction) { + this.listenerKeys.push(goog.events.listen(map, + ol.MapEventType.POSTRENDER, this.handleMapPostrender, false, this)); + } + map.render(); + } +}; diff --git a/float-no-zero/ol/ol/control/controldefaults.exports b/float-no-zero/ol/ol/control/controldefaults.exports new file mode 100644 index 0000000000..a9c4315ac3 --- /dev/null +++ b/float-no-zero/ol/ol/control/controldefaults.exports @@ -0,0 +1 @@ +@exportSymbol ol.control.defaults diff --git a/float-no-zero/ol/ol/control/controldefaults.js b/float-no-zero/ol/ol/control/controldefaults.js new file mode 100644 index 0000000000..9a771c14ab --- /dev/null +++ b/float-no-zero/ol/ol/control/controldefaults.js @@ -0,0 +1,46 @@ +goog.provide('ol.control'); + +goog.require('ol.Collection'); +goog.require('ol.control.Attribution'); +goog.require('ol.control.Logo'); +goog.require('ol.control.Zoom'); + + +/** + * @param {olx.control.DefaultsOptions=} opt_options Defaults options. + * @return {ol.Collection} Controls. + * @todo stability experimental + */ +ol.control.defaults = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + var controls = new ol.Collection(); + + var zoomControl = goog.isDef(options.zoom) ? + options.zoom : true; + if (zoomControl) { + var zoomControlOptions = goog.isDef(options.zoomOptions) ? + options.zoomOptions : undefined; + controls.push(new ol.control.Zoom(zoomControlOptions)); + } + + var attributionControl = goog.isDef(options.attribution) ? + options.attribution : true; + if (attributionControl) { + var attributionControlOptions = goog.isDef(options.attributionOptions) ? + options.attributionOptions : undefined; + controls.push(new ol.control.Attribution(attributionControlOptions)); + } + + var logoControl = goog.isDef(options.logo) ? + options.logo : true; + if (logoControl) { + var logoControlOptions = goog.isDef(options.logoOptions) ? + options.logoOptions : undefined; + controls.push(new ol.control.Logo(logoControlOptions)); + } + + return controls; + +}; diff --git a/float-no-zero/ol/ol/control/fullscreencontrol.exports b/float-no-zero/ol/ol/control/fullscreencontrol.exports new file mode 100644 index 0000000000..6b8c9b566c --- /dev/null +++ b/float-no-zero/ol/ol/control/fullscreencontrol.exports @@ -0,0 +1 @@ +@exportSymbol ol.control.FullScreen diff --git a/float-no-zero/ol/ol/control/fullscreencontrol.js b/float-no-zero/ol/ol/control/fullscreencontrol.js new file mode 100644 index 0000000000..ffc8a89ab8 --- /dev/null +++ b/float-no-zero/ol/ol/control/fullscreencontrol.js @@ -0,0 +1,131 @@ +goog.provide('ol.control.FullScreen'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.dom.classes'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('googx.dom.fullscreen'); +goog.require('googx.dom.fullscreen.EventType'); +goog.require('ol.control.Control'); +goog.require('ol.css'); + + + +/** + * Provides a button that when clicked fills up the full screen with the map. + * When in full screen mode, a close button is shown to exit full screen mode. + * The [Fullscreen API](http://www.w3.org/TR/fullscreen/) is used to + * toggle the map in full screen mode. + * + * + * @constructor + * @extends {ol.control.Control} + * @param {olx.control.FullScreenOptions=} opt_options Options. + * @todo stability experimental + */ +ol.control.FullScreen = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {string} + */ + this.cssClassName_ = goog.isDef(options.className) ? + options.className : 'ol-full-screen'; + + var tipLabel = goog.isDef(options.tipLabel) ? + options.tipLabel : 'Toggle full-screen'; + var tip = goog.dom.createDom(goog.dom.TagName.SPAN, { + 'role' : 'tooltip' + }, tipLabel); + + var button = goog.dom.createDom(goog.dom.TagName.BUTTON, { + 'class': this.cssClassName_ + '-' + googx.dom.fullscreen.isFullScreen() + + ' ol-has-tooltip' + }); + goog.dom.appendChild(button, tip); + goog.events.listen(button, [ + goog.events.EventType.CLICK, + goog.events.EventType.TOUCHEND + ], this.handleClick_, false, this); + + goog.events.listen(button, [ + goog.events.EventType.MOUSEOUT, + goog.events.EventType.FOCUSOUT + ], function() { + this.blur(); + }, false); + + goog.events.listen(goog.global.document, + googx.dom.fullscreen.EventType.CHANGE, + this.handleFullScreenChange_, false, this); + + var element = goog.dom.createDom(goog.dom.TagName.DIV, { + 'class': this.cssClassName_ + ' ' + ol.css.CLASS_UNSELECTABLE + ' ' + + (!googx.dom.fullscreen.isSupported() ? ol.css.CLASS_UNSUPPORTED : '') + }, button); + + goog.base(this, { + element: element, + target: options.target + }); + + /** + * @private + * @type {boolean} + */ + this.keys_ = goog.isDef(options.keys) ? options.keys : false; + +}; +goog.inherits(ol.control.FullScreen, ol.control.Control); + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.control.FullScreen.prototype.handleClick_ = function(browserEvent) { + if (!googx.dom.fullscreen.isSupported()) { + return; + } + browserEvent.preventDefault(); + var map = this.getMap(); + if (goog.isNull(map)) { + return; + } + if (googx.dom.fullscreen.isFullScreen()) { + googx.dom.fullscreen.exitFullScreen(); + } else { + var target = map.getTarget(); + goog.asserts.assert(goog.isDefAndNotNull(target)); + var element = goog.dom.getElement(target); + goog.asserts.assert(goog.isDefAndNotNull(element)); + if (this.keys_) { + googx.dom.fullscreen.requestFullScreenWithKeys(element); + } else { + googx.dom.fullscreen.requestFullScreen(element); + } + } +}; + + +/** + * @private + */ +ol.control.FullScreen.prototype.handleFullScreenChange_ = function() { + var opened = this.cssClassName_ + '-true'; + var closed = this.cssClassName_ + '-false'; + var anchor = goog.dom.getFirstElementChild(this.element); + var map = this.getMap(); + if (googx.dom.fullscreen.isFullScreen()) { + goog.dom.classes.swap(anchor, closed, opened); + } else { + goog.dom.classes.swap(anchor, opened, closed); + } + if (!goog.isNull(map)) { + map.updateSize(); + } +}; diff --git a/float-no-zero/ol/ol/control/logocontrol.exports b/float-no-zero/ol/ol/control/logocontrol.exports new file mode 100644 index 0000000000..ccae41d4aa --- /dev/null +++ b/float-no-zero/ol/ol/control/logocontrol.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.control.Logo +@exportProperty ol.control.Logo.prototype.setMap diff --git a/float-no-zero/ol/ol/control/logocontrol.js b/float-no-zero/ol/ol/control/logocontrol.js new file mode 100644 index 0000000000..a25d09ced9 --- /dev/null +++ b/float-no-zero/ol/ol/control/logocontrol.js @@ -0,0 +1,121 @@ +goog.provide('ol.control.Logo'); + +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.object'); +goog.require('goog.style'); +goog.require('ol.FrameState'); +goog.require('ol.control.Control'); +goog.require('ol.css'); + + + +/** + * Shows a logo for all the layer sources in the map that have a logo + * associated with them, such as Bing. This control is part of a default map. + * By default it will show in the bottom-left portion of the map, but it can + * be styled by using a css selector for `.ol-logo`. + * @constructor + * @extends {ol.control.Control} + * @param {olx.control.LogoOptions=} opt_options Logo options. + * @todo stability experimental + */ +ol.control.Logo = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {Element} + */ + this.ulElement_ = goog.dom.createElement(goog.dom.TagName.UL); + + var className = goog.isDef(options.className) ? options.className : 'ol-logo'; + + var element = goog.dom.createDom(goog.dom.TagName.DIV, { + 'class': className + ' ' + ol.css.CLASS_UNSELECTABLE + }, this.ulElement_); + + goog.base(this, { + element: element, + target: options.target + }); + + /** + * @private + * @type {boolean} + */ + this.renderedVisible_ = true; + + /** + * @private + * @type {Object.} + */ + this.logoElements_ = {}; + +}; +goog.inherits(ol.control.Logo, ol.control.Control); + + +/** + * @param {ol.MapEvent} mapEvent Map event. + */ +ol.control.Logo.prototype.handleMapPostrender = function(mapEvent) { + this.updateElement_(mapEvent.frameState); +}; + + +/** + * @param {?ol.FrameState} frameState Frame state. + * @private + */ +ol.control.Logo.prototype.updateElement_ = function(frameState) { + + if (goog.isNull(frameState)) { + if (this.renderedVisible_) { + goog.style.setElementShown(this.element, false); + this.renderedVisible_ = false; + } + return; + } + + var logo; + var logos = frameState.logos; + var logoElements = this.logoElements_; + + for (logo in logoElements) { + if (!(logo in logos)) { + goog.dom.removeNode(logoElements[logo]); + delete logoElements[logo]; + } + } + + var image, logoElement, logoKey; + for (logoKey in logos) { + if (!(logoKey in logoElements)) { + image = new Image(); + image.src = logoKey; + var logoValue = logos[logoKey]; + var child; + if (logoValue === '') { + child = image; + } else { + child = goog.dom.createDom(goog.dom.TagName.A, { + 'href': logoValue, + 'target': '_blank' + }); + child.appendChild(image); + } + logoElement = goog.dom.createDom(goog.dom.TagName.LI, undefined, child); + goog.dom.appendChild(this.ulElement_, logoElement); + logoElements[logoKey] = logoElement; + } + } + + var renderVisible = !goog.object.isEmpty(logos); + if (this.renderedVisible_ != renderVisible) { + goog.style.setElementShown(this.element, renderVisible); + this.renderedVisible_ = renderVisible; + } + +}; diff --git a/float-no-zero/ol/ol/control/mousepositioncontrol.exports b/float-no-zero/ol/ol/control/mousepositioncontrol.exports new file mode 100644 index 0000000000..73f28771eb --- /dev/null +++ b/float-no-zero/ol/ol/control/mousepositioncontrol.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.control.MousePosition +@exportProperty ol.control.MousePosition.prototype.setMap diff --git a/float-no-zero/ol/ol/control/mousepositioncontrol.js b/float-no-zero/ol/ol/control/mousepositioncontrol.js new file mode 100644 index 0000000000..c103e9ad84 --- /dev/null +++ b/float-no-zero/ol/ol/control/mousepositioncontrol.js @@ -0,0 +1,260 @@ +// FIXME should listen on appropriate pane, once it is defined +// FIXME works for View2D only + +goog.provide('ol.control.MousePosition'); + +goog.require('goog.array'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.style'); +goog.require('ol.CoordinateFormatType'); +goog.require('ol.Object'); +goog.require('ol.Pixel'); +goog.require('ol.TransformFunction'); +goog.require('ol.control.Control'); +goog.require('ol.proj'); +goog.require('ol.proj.Projection'); + + +/** + * @enum {string} + */ +ol.control.MousePositionProperty = { + PROJECTION: 'projection', + COORDINATE_FORMAT: 'coordinateFormat' +}; + + + +/** + * Create a new control to show the position of the mouse in the map's + * projection (or any other supplied projection). By default the control is + * shown in the top right corner of the map but this can be changed by using + * a css selector `.ol-mouse-position`. + * + * @constructor + * @extends {ol.control.Control} + * @param {olx.control.MousePositionOptions=} opt_options Mouse position + * options. + * @todo stability experimental + * @todo observable projection {ol.proj.Projection} the projection to report + * mouse position in + * @todo observable coordinateFormat {ol.CoordinateFormatType} the format to + * render the current position in + */ +ol.control.MousePosition = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + var className = goog.isDef(options.className) ? + options.className : 'ol-mouse-position'; + + var element = goog.dom.createDom(goog.dom.TagName.DIV, { + 'class': className + }); + + goog.base(this, { + element: element, + target: options.target + }); + + goog.events.listen(this, + ol.Object.getChangeEventType(ol.control.MousePositionProperty.PROJECTION), + this.handleProjectionChanged_, false, this); + + if (goog.isDef(options.coordinateFormat)) { + this.setCoordinateFormat(options.coordinateFormat); + } + if (goog.isDef(options.projection)) { + this.setProjection(ol.proj.get(options.projection)); + } + + /** + * @private + * @type {string} + */ + this.undefinedHTML_ = goog.isDef(options.undefinedHTML) ? + options.undefinedHTML : ''; + + /** + * @private + * @type {string} + */ + this.renderedHTML_ = element.innerHTML; + + /** + * @private + * @type {ol.proj.Projection} + */ + this.mapProjection_ = null; + + /** + * @private + * @type {?ol.TransformFunction} + */ + this.transform_ = null; + + /** + * @private + * @type {ol.Pixel} + */ + this.lastMouseMovePixel_ = null; + +}; +goog.inherits(ol.control.MousePosition, ol.control.Control); + + +/** + * @inheritDoc + */ +ol.control.MousePosition.prototype.handleMapPostrender = function(mapEvent) { + var frameState = mapEvent.frameState; + if (goog.isNull(frameState)) { + this.mapProjection_ = null; + } else { + if (this.mapProjection_ != frameState.view2DState.projection) { + this.mapProjection_ = frameState.view2DState.projection; + this.transform_ = null; + } + } + this.updateHTML_(this.lastMouseMovePixel_); +}; + + +/** + * @private + */ +ol.control.MousePosition.prototype.handleProjectionChanged_ = function() { + this.transform_ = null; +}; + + +/** + * @return {ol.CoordinateFormatType|undefined} projection. + * @todo stability experimental + */ +ol.control.MousePosition.prototype.getCoordinateFormat = function() { + return /** @type {ol.CoordinateFormatType|undefined} */ ( + this.get(ol.control.MousePositionProperty.COORDINATE_FORMAT)); +}; +goog.exportProperty( + ol.control.MousePosition.prototype, + 'getCoordinateFormat', + ol.control.MousePosition.prototype.getCoordinateFormat); + + +/** + * @return {ol.proj.Projection|undefined} projection. + * @todo stability experimental + */ +ol.control.MousePosition.prototype.getProjection = function() { + return /** @type {ol.proj.Projection|undefined} */ ( + this.get(ol.control.MousePositionProperty.PROJECTION)); +}; +goog.exportProperty( + ol.control.MousePosition.prototype, + 'getProjection', + ol.control.MousePosition.prototype.getProjection); + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @protected + */ +ol.control.MousePosition.prototype.handleMouseMove = function(browserEvent) { + var map = this.getMap(); + var eventPosition = goog.style.getRelativePosition( + browserEvent, map.getViewport()); + this.lastMouseMovePixel_ = [eventPosition.x, eventPosition.y]; + this.updateHTML_(this.lastMouseMovePixel_); +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @protected + */ +ol.control.MousePosition.prototype.handleMouseOut = function(browserEvent) { + this.updateHTML_(null); + this.lastMouseMovePixel_ = null; +}; + + +/** + * @inheritDoc + */ +ol.control.MousePosition.prototype.setMap = function(map) { + goog.base(this, 'setMap', map); + if (!goog.isNull(map)) { + var viewport = map.getViewport(); + this.listenerKeys.push( + goog.events.listen(viewport, goog.events.EventType.MOUSEMOVE, + this.handleMouseMove, false, this), + goog.events.listen(viewport, goog.events.EventType.MOUSEOUT, + this.handleMouseOut, false, this) + ); + } +}; + + +/** + * @param {ol.CoordinateFormatType} format Coordinate format. + * @todo stability experimental + */ +ol.control.MousePosition.prototype.setCoordinateFormat = function(format) { + this.set(ol.control.MousePositionProperty.COORDINATE_FORMAT, format); +}; +goog.exportProperty( + ol.control.MousePosition.prototype, + 'setCoordinateFormat', + ol.control.MousePosition.prototype.setCoordinateFormat); + + +/** + * @param {ol.proj.Projection} projection Projection. + * @todo stability experimental + */ +ol.control.MousePosition.prototype.setProjection = function(projection) { + this.set(ol.control.MousePositionProperty.PROJECTION, projection); +}; +goog.exportProperty( + ol.control.MousePosition.prototype, + 'setProjection', + ol.control.MousePosition.prototype.setProjection); + + +/** + * @param {?ol.Pixel} pixel Pixel. + * @private + */ +ol.control.MousePosition.prototype.updateHTML_ = function(pixel) { + var html = this.undefinedHTML_; + if (!goog.isNull(pixel) && !goog.isNull(this.mapProjection_)) { + if (goog.isNull(this.transform_)) { + var projection = this.getProjection(); + if (goog.isDef(projection)) { + this.transform_ = ol.proj.getTransformFromProjections( + this.mapProjection_, projection); + } else { + this.transform_ = ol.proj.identityTransform; + } + } + var map = this.getMap(); + var coordinate = map.getCoordinateFromPixel(pixel); + if (!goog.isNull(coordinate)) { + this.transform_(coordinate, coordinate); + var coordinateFormat = this.getCoordinateFormat(); + if (goog.isDef(coordinateFormat)) { + html = coordinateFormat(coordinate); + } else { + html = coordinate.toString(); + } + } + } + if (!goog.isDef(this.renderedHTML_) || html != this.renderedHTML_) { + this.element.innerHTML = html; + this.renderedHTML_ = html; + } +}; diff --git a/float-no-zero/ol/ol/control/scalelinecontrol.exports b/float-no-zero/ol/ol/control/scalelinecontrol.exports new file mode 100644 index 0000000000..4493ffde49 --- /dev/null +++ b/float-no-zero/ol/ol/control/scalelinecontrol.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.control.ScaleLine +@exportProperty ol.control.ScaleLine.prototype.setMap diff --git a/float-no-zero/ol/ol/control/scalelinecontrol.js b/float-no-zero/ol/ol/control/scalelinecontrol.js new file mode 100644 index 0000000000..2aafe41044 --- /dev/null +++ b/float-no-zero/ol/ol/control/scalelinecontrol.js @@ -0,0 +1,329 @@ +goog.provide('ol.control.ScaleLine'); +goog.provide('ol.control.ScaleLineProperty'); +goog.provide('ol.control.ScaleLineUnits'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.math'); +goog.require('goog.style'); +goog.require('ol.Object'); +goog.require('ol.TransformFunction'); +goog.require('ol.View2DState'); +goog.require('ol.control.Control'); +goog.require('ol.css'); +goog.require('ol.proj'); +goog.require('ol.proj.Units'); +goog.require('ol.sphere.NORMAL'); + + +/** + * @enum {string} + * @todo stability experimental + */ +ol.control.ScaleLineProperty = { + UNITS: 'units' +}; + + +/** + * @enum {string} + * @todo stability experimental + */ +ol.control.ScaleLineUnits = { + DEGREES: 'degrees', + IMPERIAL: 'imperial', + NAUTICAL: 'nautical', + METRIC: 'metric', + US: 'us' +}; + + + +/** + * Create a control to help users estimate distances on a map. + * By default it will show in the bottom left portion of the map, but it can + * be changed by using a css selector for `.ol-scale-line`. + * + * @constructor + * @extends {ol.control.Control} + * @param {olx.control.ScaleLineOptions=} opt_options Scale line options. + * @todo stability experimental + * @todo observable units {ol.control.ScaleLineUnits} the units to use in the + * scale line + */ +ol.control.ScaleLine = function(opt_options) { + + var options = opt_options || {}; + + var className = goog.isDef(options.className) ? + options.className : 'ol-scale-line'; + + /** + * @private + * @type {Element} + */ + this.innerElement_ = goog.dom.createDom(goog.dom.TagName.DIV, { + 'class': className + '-inner' + }); + + /** + * @private + * @type {Element} + */ + this.element_ = goog.dom.createDom(goog.dom.TagName.DIV, { + 'class': className + ' ' + ol.css.CLASS_UNSELECTABLE + }, this.innerElement_); + + /** + * @private + * @type {?ol.View2DState} + */ + this.view2DState_ = null; + + /** + * @private + * @type {number} + */ + this.minWidth_ = goog.isDef(options.minWidth) ? options.minWidth : 64; + + /** + * @private + * @type {boolean} + */ + this.renderedVisible_ = false; + + /** + * @private + * @type {number|undefined} + */ + this.renderedWidth_ = undefined; + + /** + * @private + * @type {string} + */ + this.renderedHTML_ = ''; + + /** + * @private + * @type {?ol.TransformFunction} + */ + this.toEPSG4326_ = null; + + goog.base(this, { + element: this.element_, + target: options.target + }); + + goog.events.listen( + this, ol.Object.getChangeEventType(ol.control.ScaleLineProperty.UNITS), + this.handleUnitsChanged_, false, this); + + this.setUnits(/** @type {ol.control.ScaleLineUnits} */ (options.units) || + ol.control.ScaleLineUnits.METRIC); + +}; +goog.inherits(ol.control.ScaleLine, ol.control.Control); + + +/** + * @const + * @type {Array.} + * @todo stability experimental + */ +ol.control.ScaleLine.LEADING_DIGITS = [1, 2, 5]; + + +/** + * @return {ol.control.ScaleLineUnits|undefined} units. + * @todo stability experimental + */ +ol.control.ScaleLine.prototype.getUnits = function() { + return /** @type {ol.control.ScaleLineUnits|undefined} */ ( + this.get(ol.control.ScaleLineProperty.UNITS)); +}; +goog.exportProperty( + ol.control.ScaleLine.prototype, + 'getUnits', + ol.control.ScaleLine.prototype.getUnits); + + +/** + * @inheritDoc + */ +ol.control.ScaleLine.prototype.handleMapPostrender = function(mapEvent) { + var frameState = mapEvent.frameState; + if (goog.isNull(frameState)) { + this.view2DState_ = null; + } else { + this.view2DState_ = frameState.view2DState; + } + this.updateElement_(); +}; + + +/** + * @private + */ +ol.control.ScaleLine.prototype.handleUnitsChanged_ = function() { + this.updateElement_(); +}; + + +/** + * @param {ol.control.ScaleLineUnits} units Units. + * @todo stability experimental + */ +ol.control.ScaleLine.prototype.setUnits = function(units) { + this.set(ol.control.ScaleLineProperty.UNITS, units); +}; +goog.exportProperty( + ol.control.ScaleLine.prototype, + 'setUnits', + ol.control.ScaleLine.prototype.setUnits); + + +/** + * @private + */ +ol.control.ScaleLine.prototype.updateElement_ = function() { + var view2DState = this.view2DState_; + + if (goog.isNull(view2DState)) { + if (this.renderedVisible_) { + goog.style.setElementShown(this.element_, false); + this.renderedVisible_ = false; + } + return; + } + + var center = view2DState.center; + var projection = view2DState.projection; + var pointResolution = + projection.getPointResolution(view2DState.resolution, center); + var projectionUnits = projection.getUnits(); + + var cosLatitude; + var units = this.getUnits(); + if (projectionUnits == ol.proj.Units.DEGREES && + (units == ol.control.ScaleLineUnits.METRIC || + units == ol.control.ScaleLineUnits.IMPERIAL)) { + + // Convert pointResolution from degrees to meters + this.toEPSG4326_ = null; + cosLatitude = Math.cos(goog.math.toRadians(center[1])); + pointResolution *= Math.PI * cosLatitude * ol.sphere.NORMAL.radius / 180; + projectionUnits = ol.proj.Units.METERS; + + } else if ((projectionUnits == ol.proj.Units.FEET || + projectionUnits == ol.proj.Units.METERS) && + units == ol.control.ScaleLineUnits.DEGREES) { + + // Convert pointResolution from meters or feet to degrees + if (goog.isNull(this.toEPSG4326_)) { + this.toEPSG4326_ = ol.proj.getTransformFromProjections( + projection, ol.proj.get('EPSG:4326')); + } + cosLatitude = Math.cos(goog.math.toRadians(this.toEPSG4326_(center)[1])); + var radius = ol.sphere.NORMAL.radius; + if (projectionUnits == ol.proj.Units.FEET) { + radius /= 0.3048; + } + pointResolution *= 180 / (Math.PI * cosLatitude * radius); + projectionUnits = ol.proj.Units.DEGREES; + + } else { + this.toEPSG4326_ = null; + } + + goog.asserts.assert( + ((units == ol.control.ScaleLineUnits.METRIC || + units == ol.control.ScaleLineUnits.IMPERIAL) && + projectionUnits == ol.proj.Units.METERS) || + (units == ol.control.ScaleLineUnits.DEGREES && + projectionUnits == ol.proj.Units.DEGREES)); + + var nominalCount = this.minWidth_ * pointResolution; + var suffix = ''; + if (units == ol.control.ScaleLineUnits.DEGREES) { + if (nominalCount < 1 / 60) { + suffix = '\u2033'; // seconds + pointResolution *= 3600; + } else if (nominalCount < 1) { + suffix = '\u2032'; // minutes + pointResolution *= 60; + } else { + suffix = '\u00b0'; // degrees + } + } else if (units == ol.control.ScaleLineUnits.IMPERIAL) { + if (nominalCount < 0.9144) { + suffix = 'in'; + pointResolution /= 0.0254; + } else if (nominalCount < 1609.344) { + suffix = 'ft'; + pointResolution /= 0.3048; + } else { + suffix = 'mi'; + pointResolution /= 1609.344; + } + } else if (units == ol.control.ScaleLineUnits.NAUTICAL) { + pointResolution /= 1852; + suffix = 'nm'; + } else if (units == ol.control.ScaleLineUnits.METRIC) { + if (nominalCount < 1) { + suffix = 'mm'; + pointResolution *= 1000; + } else if (nominalCount < 1000) { + suffix = 'm'; + } else { + suffix = 'km'; + pointResolution /= 1000; + } + } else if (units == ol.control.ScaleLineUnits.US) { + if (nominalCount < 0.9144) { + suffix = 'in'; + pointResolution *= 39.37; + } else if (nominalCount < 1609.344) { + suffix = 'ft'; + pointResolution /= 0.30480061; + } else { + suffix = 'mi'; + pointResolution /= 1609.3472; + } + } else { + goog.asserts.fail(); + } + + var i = 3 * Math.floor( + Math.log(this.minWidth_ * pointResolution) / Math.log(10)); + var count, width; + while (true) { + count = ol.control.ScaleLine.LEADING_DIGITS[i % 3] * + Math.pow(10, Math.floor(i / 3)); + width = Math.round(count / pointResolution); + if (width >= this.minWidth_) { + break; + } + ++i; + } + + var html = count + suffix; + if (this.renderedHTML_ != html) { + this.innerElement_.innerHTML = html; + this.renderedHTML_ = html; + } + + if (this.renderedWidth_ != width) { + this.innerElement_.style.width = width + 'px'; + this.renderedWidth_ = width; + } + + if (!this.renderedVisible_) { + goog.style.setElementShown(this.element_, true); + this.renderedVisible_ = true; + } + +}; diff --git a/float-no-zero/ol/ol/control/zoomcontrol.exports b/float-no-zero/ol/ol/control/zoomcontrol.exports new file mode 100644 index 0000000000..8d8123f761 --- /dev/null +++ b/float-no-zero/ol/ol/control/zoomcontrol.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.control.Zoom +@exportProperty ol.control.Zoom.prototype.setMap diff --git a/float-no-zero/ol/ol/control/zoomcontrol.js b/float-no-zero/ol/ol/control/zoomcontrol.js new file mode 100644 index 0000000000..c5eb49ad42 --- /dev/null +++ b/float-no-zero/ol/ol/control/zoomcontrol.js @@ -0,0 +1,131 @@ +// FIXME works for View2D only + +goog.provide('ol.control.Zoom'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('ol.View2D'); +goog.require('ol.animation'); +goog.require('ol.control.Control'); +goog.require('ol.css'); +goog.require('ol.easing'); + + + +/** + * Create a new control with 2 buttons, one for zoom in and one for zoom out. + * This control is part of the default controls of a map. To style this control + * use css selectors `.ol-zoom-in` and `.ol-zoom-out`. + * @constructor + * @extends {ol.control.Control} + * @param {olx.control.ZoomOptions=} opt_options Zoom options. + * @todo stability experimental + */ +ol.control.Zoom = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + var className = goog.isDef(options.className) ? options.className : 'ol-zoom'; + + var delta = goog.isDef(options.delta) ? options.delta : 1; + + var zoomInLabel = goog.isDef(options.zoomInLabel) ? + options.zoomInLabel : '+'; + var zoomOutLabel = goog.isDef(options.zoomOutLabel) ? + options.zoomOutLabel : '\u2212'; + + var zoomInTipLabel = goog.isDef(options.zoomInTipLabel) ? + options.zoomInTipLabel : 'Zoom in'; + var zoomOutTipLabel = goog.isDef(options.zoomOutTipLabel) ? + options.zoomOutTipLabel : 'Zoom out'; + + var tTipZoomIn = goog.dom.createDom(goog.dom.TagName.SPAN, { + 'role' : 'tooltip' + }, zoomInTipLabel); + var inElement = goog.dom.createDom(goog.dom.TagName.BUTTON, { + 'class': className + '-in ol-has-tooltip', + 'name' : 'ZoomIn', + 'type' : 'button' + }, tTipZoomIn, zoomInLabel); + + goog.events.listen(inElement, [ + goog.events.EventType.TOUCHEND, + goog.events.EventType.CLICK + ], goog.partial(ol.control.Zoom.prototype.zoomByDelta_, delta), false, this); + + goog.events.listen(inElement, [ + goog.events.EventType.MOUSEOUT, + goog.events.EventType.FOCUSOUT + ], function() { + this.blur(); + }, false); + + var tTipsZoomOut = goog.dom.createDom(goog.dom.TagName.SPAN, { + 'role' : 'tooltip', + 'type' : 'button' + }, zoomOutTipLabel); + var outElement = goog.dom.createDom(goog.dom.TagName.BUTTON, { + 'class': className + '-out ol-has-tooltip', + 'name' : 'ZoomOut' + }, tTipsZoomOut, zoomOutLabel); + goog.events.listen(outElement, [ + goog.events.EventType.TOUCHEND, + goog.events.EventType.CLICK + ], goog.partial(ol.control.Zoom.prototype.zoomByDelta_, -delta), false, this); + + goog.events.listen(outElement, [ + goog.events.EventType.MOUSEOUT, + goog.events.EventType.FOCUSOUT + ], function() { + this.blur(); + }, false); + + var cssClasses = className + ' ' + ol.css.CLASS_UNSELECTABLE; + var element = goog.dom.createDom(goog.dom.TagName.DIV, cssClasses, inElement, + outElement); + + goog.base(this, { + element: element, + target: options.target + }); + + /** + * @type {number} + * @private + */ + this.duration_ = goog.isDef(options.duration) ? options.duration : 250; + +}; +goog.inherits(ol.control.Zoom, ol.control.Control); + + +/** + * @param {number} delta Zoom delta. + * @param {goog.events.BrowserEvent} browserEvent The browser event to handle. + * @private + */ +ol.control.Zoom.prototype.zoomByDelta_ = function(delta, browserEvent) { + browserEvent.preventDefault(); + // prevent the anchor from getting appended to the url + var map = this.getMap(); + // FIXME works for View2D only + var view = map.getView(); + goog.asserts.assert(goog.isDef(view)); + var view2D = view.getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + var currentResolution = view2D.getResolution(); + if (goog.isDef(currentResolution)) { + if (this.duration_ > 0) { + map.beforeRender(ol.animation.zoom({ + resolution: currentResolution, + duration: this.duration_, + easing: ol.easing.easeOut + })); + } + var newResolution = view2D.constrainResolution(currentResolution, delta); + view2D.setResolution(newResolution); + } +}; diff --git a/float-no-zero/ol/ol/control/zoomslidercontrol.exports b/float-no-zero/ol/ol/control/zoomslidercontrol.exports new file mode 100644 index 0000000000..3be7924ba6 --- /dev/null +++ b/float-no-zero/ol/ol/control/zoomslidercontrol.exports @@ -0,0 +1 @@ +@exportSymbol ol.control.ZoomSlider diff --git a/float-no-zero/ol/ol/control/zoomslidercontrol.js b/float-no-zero/ol/ol/control/zoomslidercontrol.js new file mode 100644 index 0000000000..c2cf84481e --- /dev/null +++ b/float-no-zero/ol/ol/control/zoomslidercontrol.js @@ -0,0 +1,304 @@ +// FIXME works for View2D only +// FIXME should possibly show tooltip when dragging? + +goog.provide('ol.control.ZoomSlider'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.Event'); +goog.require('goog.events.EventType'); +goog.require('goog.fx.Dragger'); +goog.require('goog.fx.Dragger.EventType'); +goog.require('goog.math'); +goog.require('goog.math.Rect'); +goog.require('goog.style'); +goog.require('ol.animation'); +goog.require('ol.control.Control'); +goog.require('ol.css'); +goog.require('ol.easing'); + + +/** + * @define {number} Animation duration. + */ +ol.control.ZOOMSLIDER_ANIMATION_DURATION = 200; + + + +/** + * A slider type of control for zooming. + * + * Example: + * + * map.addControl(new ol.control.ZoomSlider()); + * + * @constructor + * @extends {ol.control.Control} + * @param {olx.control.ZoomSliderOptions=} opt_options Zoom slider options. + * @todo stability experimental + */ +ol.control.ZoomSlider = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * Will hold the current resolution of the view. + * + * @type {number|undefined} + * @private + */ + this.currentResolution_ = undefined; + + /** + * The direction of the slider. Will be determined from actual display of the + * container and defaults to ol.control.ZoomSlider.direction.VERTICAL. + * + * @type {ol.control.ZoomSlider.direction} + * @private + */ + this.direction_ = ol.control.ZoomSlider.direction.VERTICAL; + + /** + * Whether the slider is initialized. + * @type {boolean} + * @private + */ + this.sliderInitialized_ = false; + + var className = goog.isDef(options.className) ? + options.className : 'ol-zoomslider'; + var thumbElement = goog.dom.createDom(goog.dom.TagName.DIV, + [className + '-thumb', ol.css.CLASS_UNSELECTABLE]); + var sliderElement = goog.dom.createDom(goog.dom.TagName.DIV, + [className, ol.css.CLASS_UNSELECTABLE], thumbElement); + + /** + * @type {goog.fx.Dragger} + * @private + */ + this.dragger_ = new goog.fx.Dragger(thumbElement); + this.registerDisposable(this.dragger_); + + goog.events.listen(this.dragger_, [ + goog.fx.Dragger.EventType.DRAG, + goog.fx.Dragger.EventType.END + ], this.handleSliderChange_, undefined, this); + + goog.events.listen(sliderElement, goog.events.EventType.CLICK, + this.handleContainerClick_, false, this); + goog.events.listen(thumbElement, goog.events.EventType.CLICK, + goog.events.Event.stopPropagation); + + goog.base(this, { + element: sliderElement + }); +}; +goog.inherits(ol.control.ZoomSlider, ol.control.Control); + + +/** + * The enum for available directions. + * + * @enum {number} + */ +ol.control.ZoomSlider.direction = { + VERTICAL: 0, + HORIZONTAL: 1 +}; + + +/** + * @inheritDoc + */ +ol.control.ZoomSlider.prototype.setMap = function(map) { + goog.base(this, 'setMap', map); + if (!goog.isNull(map)) { + map.render(); + } +}; + + +/** + * Initializes the slider element. This will determine and set this controls + * direction_ and also constrain the dragging of the thumb to always be within + * the bounds of the container. + * + * @private + */ +ol.control.ZoomSlider.prototype.initSlider_ = function() { + var container = this.element, + thumb = goog.dom.getFirstElementChild(container), + elemSize = goog.style.getContentBoxSize(container), + thumbBounds = goog.style.getBounds(thumb), + thumbMargins = goog.style.getMarginBox(thumb), + thumbBorderBox = goog.style.getBorderBox(thumb), + w = elemSize.width - + thumbMargins.left - thumbMargins.right - + thumbBorderBox.left - thumbBorderBox.right - + thumbBounds.width, + h = elemSize.height - + thumbMargins.top - thumbMargins.bottom - + thumbBorderBox.top - thumbBorderBox.bottom - + thumbBounds.height, + limits; + if (elemSize.width > elemSize.height) { + this.direction_ = ol.control.ZoomSlider.direction.HORIZONTAL; + limits = new goog.math.Rect(0, 0, w, 0); + } else { + this.direction_ = ol.control.ZoomSlider.direction.VERTICAL; + limits = new goog.math.Rect(0, 0, 0, h); + } + this.dragger_.setLimits(limits); + this.sliderInitialized_ = true; +}; + + +/** + * @inheritDoc + */ +ol.control.ZoomSlider.prototype.handleMapPostrender = function(mapEvent) { + if (goog.isNull(mapEvent.frameState)) { + return; + } + goog.asserts.assert( + goog.isDefAndNotNull(mapEvent.frameState.view2DState)); + if (!this.sliderInitialized_) { + this.initSlider_(); + } + var res = mapEvent.frameState.view2DState.resolution; + if (res !== this.currentResolution_) { + this.currentResolution_ = res; + this.positionThumbForResolution_(res); + } +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent The browser event to handle. + * @private + */ +ol.control.ZoomSlider.prototype.handleContainerClick_ = function(browserEvent) { + var map = this.getMap(); + var view = map.getView().getView2D(); + var resolution; + var amountDragged = this.amountDragged_(browserEvent.offsetX, + browserEvent.offsetY); + resolution = this.resolutionForAmount_(amountDragged); + goog.asserts.assert(goog.isDef(resolution)); + map.beforeRender(ol.animation.zoom({ + resolution: resolution, + duration: ol.control.ZOOMSLIDER_ANIMATION_DURATION, + easing: ol.easing.easeOut + })); + resolution = view.constrainResolution(resolution); + view.setResolution(resolution); +}; + + +/** + * Positions the thumb inside its container according to the given resolution. + * + * @param {number} res The res. + * @private + */ +ol.control.ZoomSlider.prototype.positionThumbForResolution_ = function(res) { + var amount = this.amountForResolution_(res), + dragger = this.dragger_, + thumb = goog.dom.getFirstElementChild(this.element); + + if (this.direction_ == ol.control.ZoomSlider.direction.HORIZONTAL) { + var left = dragger.limits.left + dragger.limits.width * amount; + goog.style.setPosition(thumb, left); + } else { + var top = dragger.limits.top + dragger.limits.height * amount; + goog.style.setPosition(thumb, dragger.limits.left, top); + } +}; + + +/** + * Calculates the amount the thumb has been dragged to allow for calculation + * of the corresponding resolution. + * + * @param {number} x Pixel position relative to the left of the slider. + * @param {number} y Pixel position relative to the top of the slider. + * @return {number} The amount the thumb has been dragged. + * @private + */ +ol.control.ZoomSlider.prototype.amountDragged_ = function(x, y) { + var draggerLimits = this.dragger_.limits, + amount = 0; + if (this.direction_ === ol.control.ZoomSlider.direction.HORIZONTAL) { + amount = (x - draggerLimits.left) / draggerLimits.width; + } else { + amount = (y - draggerLimits.top) / draggerLimits.height; + } + return amount; +}; + + +/** + * Calculates the corresponding resolution of the thumb by the amount it has + * been dragged from its minimum. + * + * @param {number} amount The amount the thumb has been dragged. + * @return {number} The corresponding resolution. + * @private + */ +ol.control.ZoomSlider.prototype.resolutionForAmount_ = function(amount) { + // FIXME do we really need this affine transform? + amount = (goog.math.clamp(amount, 0, 1) - 1) * -1; + var fn = this.getMap().getView().getView2D().getResolutionForValueFunction(); + return fn(amount); +}; + + +/** + * Determines an amount of dragging relative to this minimum position by the + * given resolution. + * + * @param {number} res The resolution to get the amount for. + * @return {number} The corresponding value (between 0 and 1). + * @private + */ +ol.control.ZoomSlider.prototype.amountForResolution_ = function(res) { + var fn = this.getMap().getView().getView2D().getValueForResolutionFunction(); + var value = fn(res); + // FIXME do we really need this affine transform? + return (value - 1) * -1; +}; + + +/** + * Handles the user caused changes of the slider thumb and adjusts the + * resolution of our map accordingly. Will be called both while dragging and + * when dragging ends. + * + * @param {goog.fx.DragDropEvent} e The dragdropevent. + * @private + */ +ol.control.ZoomSlider.prototype.handleSliderChange_ = function(e) { + var map = this.getMap(); + var view = map.getView().getView2D(); + var resolution; + if (e.type === goog.fx.Dragger.EventType.DRAG) { + var amountDragged = this.amountDragged_(e.left, e.top); + resolution = this.resolutionForAmount_(amountDragged); + if (resolution !== this.currentResolution_) { + this.currentResolution_ = resolution; + view.setResolution(resolution); + } + } else { + goog.asserts.assert(goog.isDef(this.currentResolution_)); + map.beforeRender(ol.animation.zoom({ + resolution: this.currentResolution_, + duration: ol.control.ZOOMSLIDER_ANIMATION_DURATION, + easing: ol.easing.easeOut + })); + resolution = view.constrainResolution(this.currentResolution_); + view.setResolution(resolution); + } +}; diff --git a/float-no-zero/ol/ol/control/zoomtoextentcontrol.exports b/float-no-zero/ol/ol/control/zoomtoextentcontrol.exports new file mode 100644 index 0000000000..485e551f42 --- /dev/null +++ b/float-no-zero/ol/ol/control/zoomtoextentcontrol.exports @@ -0,0 +1 @@ +@exportSymbol ol.control.ZoomToExtent diff --git a/float-no-zero/ol/ol/control/zoomtoextentcontrol.js b/float-no-zero/ol/ol/control/zoomtoextentcontrol.js new file mode 100644 index 0000000000..9db50f69d0 --- /dev/null +++ b/float-no-zero/ol/ol/control/zoomtoextentcontrol.js @@ -0,0 +1,84 @@ +// FIXME works for View2D only + +goog.provide('ol.control.ZoomToExtent'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('ol.control.Control'); +goog.require('ol.css'); + + + +/** + * Create a control that adds a button, which, when pressed, changes + * the map view to a specific extent. To style this control use the + * css selector `.ol-zoom-extent`. + * @constructor + * @extends {ol.control.Control} + * @param {olx.control.ZoomToExtentOptions=} opt_options Options. + * @todo stability experimental + */ +ol.control.ZoomToExtent = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @type {ol.Extent} + * @private + */ + this.extent_ = goog.isDef(options.extent) ? options.extent : null; + + var className = goog.isDef(options.className) ? options.className : + 'ol-zoom-extent'; + + var tipLabel = goog.isDef(options.tipLabel) ? + options.tipLabel : 'Fit to extent'; + var tip = goog.dom.createDom(goog.dom.TagName.SPAN, { + 'role' : 'tooltip' + }, tipLabel); + var element = goog.dom.createDom(goog.dom.TagName.DIV, { + 'class': className + ' ' + ol.css.CLASS_UNSELECTABLE + }); + var button = goog.dom.createDom(goog.dom.TagName.BUTTON, { + 'class': 'ol-has-tooltip' + }); + goog.dom.appendChild(button, tip); + goog.dom.appendChild(element, button); + + goog.events.listen(button, [ + goog.events.EventType.TOUCHEND, + goog.events.EventType.CLICK + ], this.handleZoomToExtent_, false, this); + + goog.events.listen(button, [ + goog.events.EventType.MOUSEOUT, + goog.events.EventType.FOCUSOUT + ], function() { + this.blur(); + }, false); + + goog.base(this, { + element: element, + target: options.target + }); +}; +goog.inherits(ol.control.ZoomToExtent, ol.control.Control); + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.control.ZoomToExtent.prototype.handleZoomToExtent_ = function(browserEvent) { + browserEvent.preventDefault(); + // prevent #zoomExtent anchor from getting appended to the url + var map = this.getMap(); + var view = map.getView(); + goog.asserts.assert(goog.isDef(view)); + var view2D = view.getView2D(); + var extent = goog.isNull(this.extent_) ? + view2D.getProjection().getExtent() : this.extent_; + view2D.fitExtent(extent, map.getSize()); +}; diff --git a/float-no-zero/ol/ol/coordinate.exports b/float-no-zero/ol/ol/coordinate.exports new file mode 100644 index 0000000000..49eedf5f75 --- /dev/null +++ b/float-no-zero/ol/ol/coordinate.exports @@ -0,0 +1,6 @@ +@exportSymbol ol.coordinate.createStringXY +@exportSymbol ol.coordinate.format +@exportSymbol ol.coordinate.fromProjectedArray +@exportSymbol ol.coordinate.rotate +@exportSymbol ol.coordinate.toStringHDMS +@exportSymbol ol.coordinate.toStringXY diff --git a/float-no-zero/ol/ol/coordinate.js b/float-no-zero/ol/ol/coordinate.js new file mode 100644 index 0000000000..e027da504d --- /dev/null +++ b/float-no-zero/ol/ol/coordinate.js @@ -0,0 +1,251 @@ +goog.provide('ol.Coordinate'); +goog.provide('ol.CoordinateArray'); +goog.provide('ol.CoordinateFormatType'); +goog.provide('ol.coordinate'); + +goog.require('goog.math'); + + +/** + * A function that takes a {@link ol.Coordinate} and transforms it into a + * `{string}`. + * + * @typedef {function((ol.Coordinate|undefined)): string} + * @todo stability experimental + */ +ol.CoordinateFormatType; + + +/** + * An array of numbers representing a coordinate. + * @typedef {Array.} ol.Coordinate + * @todo stability experimental + */ +ol.Coordinate; + + +/** + * An array of coordinate arrays. + * @typedef {Array.} + * @todo stability experimental + */ +ol.CoordinateArray; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @param {ol.Coordinate} delta Delta. + * @return {ol.Coordinate} Coordinate. + */ +ol.coordinate.add = function(coordinate, delta) { + coordinate[0] += delta[0]; + coordinate[1] += delta[1]; + return coordinate; +}; + + +/** + * Calculates the point closest to the passed coordinate on the passed segment. + * This is the foot of the perpendicular of the coordinate to the segment when + * the foot is on the segment, or the closest segment coordinate when the foot + * is outside the segment. + * + * @param {ol.Coordinate} coordinate The coordinate. + * @param {Array.} segment The two coordinates of the segment. + * @return {ol.Coordinate} The foot of the perpendicular of the coordinate to + * the segment. + */ +ol.coordinate.closestOnSegment = function(coordinate, segment) { + var x0 = coordinate[0]; + var y0 = coordinate[1]; + var start = segment[0]; + var end = segment[1]; + var x1 = start[0]; + var y1 = start[1]; + var x2 = end[0]; + var y2 = end[1]; + var dx = x2 - x1; + var dy = y2 - y1; + var along = (dx == 0 && dy == 0) ? 0 : + ((dx * (x0 - x1)) + (dy * (y0 - y1))) / ((dx * dx + dy * dy) || 0); + var x, y; + if (along <= 0) { + x = x1; + y = y1; + } else if (along >= 1) { + x = x2; + y = y2; + } else { + x = x1 + along * dx; + y = y1 + along * dy; + } + return [x, y]; +}; + + +/** + * @param {number=} opt_fractionDigits The number of digits to include + * after the decimal point. Default is `0`. + * @return {ol.CoordinateFormatType} Coordinate format. + * @todo stability experimental + */ +ol.coordinate.createStringXY = function(opt_fractionDigits) { + return ( + /** + * @param {ol.Coordinate|undefined} coordinate Coordinate. + * @return {string} String XY. + */ + function(coordinate) { + return ol.coordinate.toStringXY(coordinate, opt_fractionDigits); + }); +}; + + +/** + * @private + * @param {number} degrees Degrees. + * @param {string} hemispheres Hemispheres. + * @return {string} String. + */ +ol.coordinate.degreesToStringHDMS_ = function(degrees, hemispheres) { + var normalizedDegrees = goog.math.modulo(degrees + 180, 360) - 180; + var x = Math.abs(Math.round(3600 * normalizedDegrees)); + return Math.floor(x / 3600) + '\u00b0 ' + + Math.floor((x / 60) % 60) + '\u2032 ' + + Math.floor(x % 60) + '\u2033 ' + + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0); +}; + + +/** + * @param {ol.Coordinate|undefined} coordinate Coordinate. + * @param {string} template A template string with `{x}` and `{y}` placeholders + * that will be replaced by first and second coordinate values. + * @param {number=} opt_fractionDigits The number of digits to include + * after the decimal point. Default is `0`. + * @return {string} Formated coordinate. + * @todo stability experimental + */ +ol.coordinate.format = function(coordinate, template, opt_fractionDigits) { + if (goog.isDef(coordinate)) { + return template + .replace('{x}', coordinate[0].toFixed(opt_fractionDigits)) + .replace('{y}', coordinate[1].toFixed(opt_fractionDigits)); + } else { + return ''; + } +}; + + +/** + * @param {ol.Coordinate} coordinate1 First coordinate. + * @param {ol.Coordinate} coordinate2 Second coordinate. + * @return {boolean} Whether the passed coordinates are equal. + */ +ol.coordinate.equals = function(coordinate1, coordinate2) { + var equals = true; + for (var i = coordinate1.length - 1; i >= 0; --i) { + if (coordinate1[i] != coordinate2[i]) { + equals = false; + break; + } + } + return equals; +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @param {number} angle Angle. + * @return {ol.Coordinate} Coordinate. + */ +ol.coordinate.rotate = function(coordinate, angle) { + var cosAngle = Math.cos(angle); + var sinAngle = Math.sin(angle); + var x = coordinate[0] * cosAngle - coordinate[1] * sinAngle; + var y = coordinate[1] * cosAngle + coordinate[0] * sinAngle; + coordinate[0] = x; + coordinate[1] = y; + return coordinate; +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @param {number} s Scale. + * @return {ol.Coordinate} Coordinate. + */ +ol.coordinate.scale = function(coordinate, s) { + coordinate[0] *= s; + coordinate[1] *= s; + return coordinate; +}; + + +/** + * @param {ol.Coordinate} coord1 First coordinate. + * @param {ol.Coordinate} coord2 Second coordinate. + * @return {number} Squared distance between coord1 and coord2. + */ +ol.coordinate.squaredDistance = function(coord1, coord2) { + var dx = coord1[0] - coord2[0]; + var dy = coord1[1] - coord2[1]; + return dx * dx + dy * dy; +}; + + +/** + * Calculate the squared distance from a coordinate to a line segment. + * + * @param {ol.Coordinate} coordinate Coordinate of the point. + * @param {Array.} segment Line segment (2 coordinates). + * @return {number} Squared distance from the point to the line segment. + */ +ol.coordinate.squaredDistanceToSegment = function(coordinate, segment) { + return ol.coordinate.squaredDistance(coordinate, + ol.coordinate.closestOnSegment(coordinate, segment)); +}; + + +/** + * @param {ol.Coordinate|undefined} coordinate Coordinate. + * @return {string} Hemisphere, degrees, minutes and seconds. + * @todo stability experimental + */ +ol.coordinate.toStringHDMS = function(coordinate) { + if (goog.isDef(coordinate)) { + return ol.coordinate.degreesToStringHDMS_(coordinate[1], 'NS') + ' ' + + ol.coordinate.degreesToStringHDMS_(coordinate[0], 'EW'); + } else { + return ''; + } +}; + + +/** + * @param {ol.Coordinate|undefined} coordinate Coordinate. + * @param {number=} opt_fractionDigits The number of digits to include + * after the decimal point. Default is `0`. + * @return {string} XY. + * @todo stability experimental + */ +ol.coordinate.toStringXY = function(coordinate, opt_fractionDigits) { + return ol.coordinate.format(coordinate, '{x}, {y}', opt_fractionDigits); +}; + + +/** + * Create an ol.Coordinate from an Array and take into account axis order. + * @param {Array} array The array with coordinates. + * @param {string} axis the axis info. + * @return {ol.Coordinate} The coordinate created. + * @todo stability experimental + */ +ol.coordinate.fromProjectedArray = function(array, axis) { + var firstAxis = axis.charAt(0); + if (firstAxis === 'n' || firstAxis === 's') { + return [array[1], array[0]]; + } else { + return array; + } +}; diff --git a/float-no-zero/ol/ol/css.js b/float-no-zero/ol/ol/css.js new file mode 100644 index 0000000000..80eb7b523d --- /dev/null +++ b/float-no-zero/ol/ol/css.js @@ -0,0 +1,19 @@ +goog.provide('ol.css'); + + +/** + * The CSS class that we'll give the DOM elements to have them unselectable. + * + * @const + * @type {string} + */ +ol.css.CLASS_UNSELECTABLE = 'ol-unselectable'; + + +/** + * The CSS class for unsupported feature. + * + * @const + * @type {string} + */ +ol.css.CLASS_UNSUPPORTED = 'ol-unsupported'; diff --git a/float-no-zero/ol/ol/deviceorientation.exports b/float-no-zero/ol/ol/deviceorientation.exports new file mode 100644 index 0000000000..4496aa24b9 --- /dev/null +++ b/float-no-zero/ol/ol/deviceorientation.exports @@ -0,0 +1 @@ +@exportSymbol ol.DeviceOrientation diff --git a/float-no-zero/ol/ol/deviceorientation.js b/float-no-zero/ol/ol/deviceorientation.js new file mode 100644 index 0000000000..aab556ebef --- /dev/null +++ b/float-no-zero/ol/ol/deviceorientation.js @@ -0,0 +1,249 @@ +goog.provide('ol.DeviceOrientation'); +goog.provide('ol.DeviceOrientationProperty'); + +goog.require('goog.events'); +goog.require('goog.math'); +goog.require('ol.BrowserFeature'); +goog.require('ol.Object'); + + +/** + * @enum {string} + */ +ol.DeviceOrientationProperty = { + ALPHA: 'alpha', + BETA: 'beta', + GAMMA: 'gamma', + HEADING: 'heading', + TRACKING: 'tracking' +}; + + + +/** + * The ol.DeviceOrientation class provides access to DeviceOrientation + * information and events, see the [HTML 5 DeviceOrientation Specification]( + * http://dev.w3.org/geo/api/spec-source-orientation) for more details. + * + * Many new computers, and especially mobile phones + * and tablets, provide hardware support for device orientation. Web + * developers targetting mobile devices will be especially interested in this + * class. + * + * Device orientation data are relative to a common starting point. For mobile + * devices, the starting point is to lay your phone face up on a table with the + * top of the phone pointing north. This represents the zero state. All + * angles are then relative to this state. For computers, it is the same except + * the screen is open at 90 degrees. + * + * Device orientation is reported as three angles - `alpha`, `beta`, and + * `gamma` - relative to the starting position along the three planar axes X, Y + * and Z. The X axis runs from the left edge to the right edge through the + * middle of the device. Similarly, the Y axis runs from the bottom to the top + * of the device through the middle. The Z axis runs from the back to the front + * through the middle. In the starting position, the X axis points to the + * right, the Y axis points away from you and the Z axis points straight up + * from the device lying flat. + * + * The three angles representing the device orientation are relative to the + * three axes. `alpha` indicates how much the device has been rotated around the + * Z axis, which is commonly interpreted as the compass heading (see note + * below). `beta` indicates how much the device has been rotated around the X + * axis, or how much it is tilted from front to back. `gamma` indicates how + * much the device has been rotated around the Y axis, or how much it is tilted + * from left to right. + * + * For most browsers, the `alpha` value returns the compass heading so if the + * device points north, it will be 0. With Safari on iOS, the 0 value of + * `alpha` is calculated from when device orientation was first requested. + * ol.DeviceOrientation provides the `heading` property which normalizes this + * behavior across all browsers for you. + * + * It is important to note that the HTML 5 DeviceOrientation specification + * indicates that `alpha`, `beta` and `gamma` are in degrees while the + * equivalent properties in ol.DeviceOrientation are in radians for consistency + * with all other uses of angles throughout OpenLayers. + * + * @see http://dev.w3.org/geo/api/spec-source-orientation + * + * @constructor + * @extends {ol.Object} + * @param {olx.DeviceOrientationOptions=} opt_options Options. + * @todo stability experimental + * @todo observable alpha {number} readonly the euler angle in radians of the + * device from the standard X axis + * @todo observable beta {number} readonly the euler angle in radians of the + * device from the planar Z axis + * @todo observable gamma {number} readonly the euler angle in radians of the + * device from the planar X axis + * @todo observable heading {number} readonly the euler angle in radians of the + * device from the planar Y axis + * @todo observable tracking {boolean} the status of tracking changes to alpha, + * beta and gamma. If true, changes are tracked and reported immediately. + */ +ol.DeviceOrientation = function(opt_options) { + + goog.base(this); + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {goog.events.Key} + */ + this.listenerKey_ = null; + + goog.events.listen(this, + ol.Object.getChangeEventType(ol.DeviceOrientationProperty.TRACKING), + this.handleTrackingChanged_, false, this); + + this.setTracking(goog.isDef(options.tracking) ? options.tracking : false); + +}; +goog.inherits(ol.DeviceOrientation, ol.Object); + + +/** + * @inheritDoc + */ +ol.DeviceOrientation.prototype.disposeInternal = function() { + this.setTracking(false); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @private + * @param {goog.events.BrowserEvent} browserEvent Event. + */ +ol.DeviceOrientation.prototype.orientationChange_ = function(browserEvent) { + var event = /** @type {DeviceOrientationEvent} */ + (browserEvent.getBrowserEvent()); + if (goog.isDefAndNotNull(event.alpha)) { + var alpha = goog.math.toRadians(event.alpha); + this.set(ol.DeviceOrientationProperty.ALPHA, alpha); + // event.absolute is undefined in iOS. + if (goog.isBoolean(event.absolute) && event.absolute) { + this.set(ol.DeviceOrientationProperty.HEADING, alpha); + } else if (goog.isDefAndNotNull(event.webkitCompassHeading) && + goog.isDefAndNotNull(event.webkitCompassAccuracy) && + event.webkitCompassAccuracy != -1) { + var heading = goog.math.toRadians(event.webkitCompassHeading); + this.set(ol.DeviceOrientationProperty.HEADING, heading); + } + } + if (goog.isDefAndNotNull(event.beta)) { + this.set(ol.DeviceOrientationProperty.BETA, + goog.math.toRadians(event.beta)); + } + if (goog.isDefAndNotNull(event.gamma)) { + this.set(ol.DeviceOrientationProperty.GAMMA, + goog.math.toRadians(event.gamma)); + } +}; + + +/** + * @return {number|undefined} The alpha value of the DeviceOrientation, + * in radians. + * @todo stability experimental + */ +ol.DeviceOrientation.prototype.getAlpha = function() { + return /** @type {number|undefined} */ ( + this.get(ol.DeviceOrientationProperty.ALPHA)); +}; +goog.exportProperty( + ol.DeviceOrientation.prototype, + 'getAlpha', + ol.DeviceOrientation.prototype.getAlpha); + + +/** + * @return {number|undefined} The beta value of the DeviceOrientation, + * in radians. + * @todo stability experimental + */ +ol.DeviceOrientation.prototype.getBeta = function() { + return /** @type {number|undefined} */ ( + this.get(ol.DeviceOrientationProperty.BETA)); +}; +goog.exportProperty( + ol.DeviceOrientation.prototype, + 'getBeta', + ol.DeviceOrientation.prototype.getBeta); + + +/** + * @return {number|undefined} The gamma value of the DeviceOrientation, + * in radians. + * @todo stability experimental + */ +ol.DeviceOrientation.prototype.getGamma = function() { + return /** @type {number|undefined} */ ( + this.get(ol.DeviceOrientationProperty.GAMMA)); +}; +goog.exportProperty( + ol.DeviceOrientation.prototype, + 'getGamma', + ol.DeviceOrientation.prototype.getGamma); + + +/** + * @return {number|undefined} The heading of the device relative to + * north, in radians, normalizing for different browser behavior. + * @todo stability experimental + */ +ol.DeviceOrientation.prototype.getHeading = function() { + return /** @type {number|undefined} */ ( + this.get(ol.DeviceOrientationProperty.HEADING)); +}; +goog.exportProperty( + ol.DeviceOrientation.prototype, + 'getHeading', + ol.DeviceOrientation.prototype.getHeading); + + +/** + * Are we tracking the device's orientation? + * @return {boolean} The current tracking state, true if tracking is on. + * @todo stability experimental + */ +ol.DeviceOrientation.prototype.getTracking = function() { + return /** @type {boolean} */ ( + this.get(ol.DeviceOrientationProperty.TRACKING)); +}; +goog.exportProperty( + ol.DeviceOrientation.prototype, + 'getTracking', + ol.DeviceOrientation.prototype.getTracking); + + +/** + * @private + */ +ol.DeviceOrientation.prototype.handleTrackingChanged_ = function() { + if (ol.BrowserFeature.HAS_DEVICE_ORIENTATION) { + var tracking = this.getTracking(); + if (tracking && goog.isNull(this.listenerKey_)) { + this.listenerKey_ = goog.events.listen(goog.global, 'deviceorientation', + this.orientationChange_, false, this); + } else if (!tracking && !goog.isNull(this.listenerKey_)) { + goog.events.unlistenByKey(this.listenerKey_); + this.listenerKey_ = null; + } + } +}; + + +/** + * Enable or disable tracking of DeviceOrientation events. + * @param {boolean} tracking True to enable and false to disable tracking. + * @todo stability experimental + */ +ol.DeviceOrientation.prototype.setTracking = function(tracking) { + this.set(ol.DeviceOrientationProperty.TRACKING, tracking); +}; +goog.exportProperty( + ol.DeviceOrientation.prototype, + 'setTracking', + ol.DeviceOrientation.prototype.setTracking); diff --git a/float-no-zero/ol/ol/dom/dom.js b/float-no-zero/ol/ol/dom/dom.js new file mode 100644 index 0000000000..a95e591dda --- /dev/null +++ b/float-no-zero/ol/ol/dom/dom.js @@ -0,0 +1,282 @@ +// FIXME add tests for browser features (Modernizr?) + +goog.provide('ol.dom'); +goog.provide('ol.dom.BrowserFeature'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.style'); +goog.require('goog.userAgent'); +goog.require('goog.vec.Mat4'); + + +/** + * @enum {boolean} + */ +ol.dom.BrowserFeature = { + USE_MS_MATRIX_TRANSFORM: ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE, + USE_MS_ALPHA_FILTER: ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE +}; + + +/** + * Detect 2d transform. + * Adapted from http://stackoverflow.com/q/5661671/130442 + * http://caniuse.com/#feat=transforms2d + * @return {boolean} + */ +ol.dom.canUseCssTransform = (function() { + var canUseCssTransform; + return function() { + if (!goog.isDef(canUseCssTransform)) { + goog.asserts.assert(!goog.isNull(document.body)); + if (!goog.global.getComputedStyle) { + // this browser is ancient + canUseCssTransform = false; + } else { + var el = goog.dom.createElement(goog.dom.TagName.P), + has2d, + transforms = { + 'webkitTransform': '-webkit-transform', + 'OTransform': '-o-transform', + 'msTransform': '-ms-transform', + 'MozTransform': '-moz-transform', + 'transform': 'transform' + }; + goog.dom.appendChild(document.body, el); + for (var t in transforms) { + if (t in el.style) { + el.style[t] = 'translate(1px,1px)'; + has2d = goog.global.getComputedStyle(el).getPropertyValue( + transforms[t]); + } + } + goog.dom.removeNode(el); + + canUseCssTransform = (has2d && has2d !== 'none'); + } + } + return canUseCssTransform; + }; +}()); + + +/** + * Detect 3d transform. + * Adapted from http://stackoverflow.com/q/5661671/130442 + * http://caniuse.com/#feat=transforms3d + * @return {boolean} + */ +ol.dom.canUseCssTransform3D = (function() { + var canUseCssTransform3D; + return function() { + if (!goog.isDef(canUseCssTransform3D)) { + goog.asserts.assert(!goog.isNull(document.body)); + if (!goog.global.getComputedStyle) { + // this browser is ancient + canUseCssTransform3D = false; + } else { + var el = goog.dom.createElement(goog.dom.TagName.P), + has3d, + transforms = { + 'webkitTransform': '-webkit-transform', + 'OTransform': '-o-transform', + 'msTransform': '-ms-transform', + 'MozTransform': '-moz-transform', + 'transform': 'transform' + }; + goog.dom.appendChild(document.body, el); + for (var t in transforms) { + if (t in el.style) { + el.style[t] = 'translate3d(1px,1px,1px)'; + has3d = goog.global.getComputedStyle(el).getPropertyValue( + transforms[t]); + } + } + goog.dom.removeNode(el); + + canUseCssTransform3D = (has3d && has3d !== 'none'); + } + } + return canUseCssTransform3D; + }; +}()); + + +/** + * @param {Element} element Element. + * @param {string} value Value. + */ +ol.dom.setTransform = function(element, value) { + var style = element.style; + style.WebkitTransform = value; + style.MozTransform = value; + style.OTransform = value; + style.msTransform = value; + style.transform = value; + + // IE 9+ seems to assume transform-origin: 100% 100%; for some unknown reason + if (goog.userAgent.IE && !ol.IS_LEGACY_IE) { + element.style.transformOrigin = '0 0'; + } +}; + + +/** + * Sets the opacity of an element, in an IE-compatible way + * @param {!Element} element Element + * @param {number} value Opacity, [0..1] + */ +ol.dom.setOpacity = function(element, value) { + if (ol.dom.BrowserFeature.USE_MS_ALPHA_FILTER) { + /** @type {string} */ + var filter = element.currentStyle.filter; + + /** @type {RegExp} */ + var regex; + + /** @type {string} */ + var alpha; + + if (goog.userAgent.VERSION == '8.0') { + regex = /progid:DXImageTransform\.Microsoft\.Alpha\(.*?\)/i, + alpha = 'progid:DXImageTransform.Microsoft.Alpha(Opacity=' + + (value * 100) + ')'; + } else { + regex = /alpha\(.*?\)/i; + alpha = 'alpha(opacity=' + (value * 100) + ')'; + } + + var newFilter = filter.replace(regex, alpha); + if (newFilter === filter) { + // no replace was made? just append the new alpha filter instead + newFilter += ' ' + alpha; + } + + element.style.filter = newFilter; + + // Fix to apply filter to absolutely-positioned children element + if (element.currentStyle.zIndex === 'auto') { + element.style.zIndex = 0; + } + } else { + goog.style.setOpacity(element, value); + } +}; + + +/** + * Sets the IE matrix transform without replacing other filters + * @private + * @param {!Element} element Element + * @param {string} value The new progid string + */ +ol.dom.setIEMatrix_ = function(element, value) { + var filter = element.currentStyle.filter; + var newFilter = + filter.replace(/progid:DXImageTransform.Microsoft.Matrix\(.*?\)/i, value); + + if (newFilter === filter) { + newFilter = ' ' + value; + } + + element.style.filter = newFilter; + + // Fix to apply filter to absolutely-positioned children element + if (element.currentStyle.zIndex === 'auto') { + element.style.zIndex = 0; + } +}; + + +/** + * @param {!Element} element Element. + * @param {goog.vec.Mat4.Number} transform Matrix. + * @param {number=} opt_precision Precision. + * @param {Element=} opt_translationElement Required for IE7-8 + */ +ol.dom.transformElement2D = + function(element, transform, opt_precision, opt_translationElement) { + // using matrix() causes gaps in Chrome and Firefox on Mac OS X, so prefer + // matrix3d() + var i; + if (ol.dom.canUseCssTransform3D()) { + var value3D; + + if (goog.isDef(opt_precision)) { + /** @type {Array.} */ + var strings3D = new Array(16); + for (i = 0; i < 16; ++i) { + strings3D[i] = transform[i].toFixed(opt_precision); + } + value3D = strings3D.join(','); + } else { + value3D = transform.join(','); + } + ol.dom.setTransform(element, 'matrix3d(' + value3D + ')'); + } else if (ol.dom.canUseCssTransform()) { + /** @type {Array.} */ + var transform2D = [ + goog.vec.Mat4.getElement(transform, 0, 0), + goog.vec.Mat4.getElement(transform, 1, 0), + goog.vec.Mat4.getElement(transform, 0, 1), + goog.vec.Mat4.getElement(transform, 1, 1), + goog.vec.Mat4.getElement(transform, 0, 3), + goog.vec.Mat4.getElement(transform, 1, 3) + ]; + var value2D; + if (goog.isDef(opt_precision)) { + /** @type {Array.} */ + var strings2D = new Array(6); + for (i = 0; i < 6; ++i) { + strings2D[i] = transform2D[i].toFixed(opt_precision); + } + value2D = strings2D.join(','); + } else { + value2D = transform2D.join(','); + } + ol.dom.setTransform(element, 'matrix(' + value2D + ')'); + } else if (ol.dom.BrowserFeature.USE_MS_MATRIX_TRANSFORM) { + var m11 = goog.vec.Mat4.getElement(transform, 0, 0), + m12 = goog.vec.Mat4.getElement(transform, 0, 1), + m21 = goog.vec.Mat4.getElement(transform, 1, 0), + m22 = goog.vec.Mat4.getElement(transform, 1, 1), + dx = goog.vec.Mat4.getElement(transform, 0, 3), + dy = goog.vec.Mat4.getElement(transform, 1, 3); + + // See: http://msdn.microsoft.com/en-us/library/ms533014(v=vs.85).aspx + // and: http://extremelysatisfactorytotalitarianism.com/blog/?p=1002 + // @TODO: fix terrible IE bbox rotation issue. + var s = 'progid:DXImageTransform.Microsoft.Matrix('; + s += 'sizingMethod="auto expand"'; + s += ',M11=' + m11.toFixed(opt_precision || 20); + s += ',M12=' + m12.toFixed(opt_precision || 20); + s += ',M21=' + m21.toFixed(opt_precision || 20); + s += ',M22=' + m22.toFixed(opt_precision || 20); + s += ')'; + ol.dom.setIEMatrix_(element, s); + + // scale = m11 = m22 = target resolution [m/px] / current res [m/px] + // dx = (viewport width [px] / 2) * scale + // + (layer.x [m] - view.x [m]) / target resolution [m / px] + // except that we're positioning the child element relative to the + // viewport, not the map. + // dividing by the scale factor isn't the exact correction, but it's + // close enough that you can barely tell unless you're looking for it + dx /= m11; + dy /= m22; + + opt_translationElement.style.left = Math.round(dx) + 'px'; + opt_translationElement.style.top = Math.round(dy) + 'px'; + } else { + element.style.left = + Math.round(goog.vec.Mat4.getElement(transform, 0, 3)) + 'px'; + element.style.top = + Math.round(goog.vec.Mat4.getElement(transform, 1, 3)) + 'px'; + + // TODO: Add scaling here. This isn't quite as simple as multiplying + // width/height, because that only changes the container size, not the + // content size. + } +}; diff --git a/float-no-zero/ol/ol/dom/input.exports b/float-no-zero/ol/ol/dom/input.exports new file mode 100644 index 0000000000..0b6e668625 --- /dev/null +++ b/float-no-zero/ol/ol/dom/input.exports @@ -0,0 +1 @@ +@exportSymbol ol.dom.Input diff --git a/float-no-zero/ol/ol/dom/input.js b/float-no-zero/ol/ol/dom/input.js new file mode 100644 index 0000000000..45ab97ff5b --- /dev/null +++ b/float-no-zero/ol/ol/dom/input.js @@ -0,0 +1,145 @@ +goog.provide('ol.dom.Input'); +goog.provide('ol.dom.InputProperty'); + +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('ol.Object'); + + +/** + * @enum {string} + */ +ol.dom.InputProperty = { + VALUE: 'value', + CHECKED: 'checked' +}; + + + +/** + * Helper class for binding HTML input to an {@link ol.Object}. + * + * Example: + * + * // bind a checkbox with id 'visible' to a layer's visibility + * var visible = new ol.dom.Input(document.getElementById('visible')); + * visible.bindTo('checked', layer, 'visible'); + * + * @constructor + * @extends {ol.Object} + * @param {Element} target Target element. + * @todo stability experimental + * @todo observable value {string} the value of the Input + * @todo observable checked {boolean} the checked state of the Input + */ +ol.dom.Input = function(target) { + goog.base(this); + + /** + * @private + * @type {HTMLInputElement} + */ + this.target_ = /** @type {HTMLInputElement} */ (target); + + goog.events.listen(this.target_, + [goog.events.EventType.CHANGE, goog.events.EventType.INPUT], + this.handleInputChanged_, false, this); + + goog.events.listen(this, + ol.Object.getChangeEventType(ol.dom.InputProperty.VALUE), + this.handleValueChanged_, false, this); + goog.events.listen(this, + ol.Object.getChangeEventType(ol.dom.InputProperty.CHECKED), + this.handleCheckedChanged_, false, this); +}; +goog.inherits(ol.dom.Input, ol.Object); + + +/** + * If the input is a checkbox, return whether or not the checbox is checked. + * @return {boolean|undefined} checked. + * @todo stability experimental + */ +ol.dom.Input.prototype.getChecked = function() { + return /** @type {boolean} */ (this.get(ol.dom.InputProperty.CHECKED)); +}; +goog.exportProperty( + ol.dom.Input.prototype, + 'getChecked', + ol.dom.Input.prototype.getChecked); + + +/** + * Get the value of the input. + * @return {string|undefined} input value. + * @todo stability experimental + */ +ol.dom.Input.prototype.getValue = function() { + return /** @type {string} */ (this.get(ol.dom.InputProperty.VALUE)); +}; +goog.exportProperty( + ol.dom.Input.prototype, + 'getValue', + ol.dom.Input.prototype.getValue); + + +/** + * Sets the value of the input. + * @param {string} value Value. + * @todo stability experimental + */ +ol.dom.Input.prototype.setValue = function(value) { + this.set(ol.dom.InputProperty.VALUE, value); +}; +goog.exportProperty( + ol.dom.Input.prototype, + 'setValue', + ol.dom.Input.prototype.setValue); + + +/** + * Set whether or not a checkbox is checked. + * @param {boolean} checked Checked. + * @todo stability experimental + */ +ol.dom.Input.prototype.setChecked = function(checked) { + this.set(ol.dom.InputProperty.CHECKED, checked); +}; +goog.exportProperty( + ol.dom.Input.prototype, + 'setChecked', + ol.dom.Input.prototype.setChecked); + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.dom.Input.prototype.handleInputChanged_ = function(browserEvent) { + goog.asserts.assert(browserEvent.currentTarget == this.target_); + var target = this.target_; + if (target.type === 'checkbox' || target.type === 'radio') { + this.setChecked(target.checked); + } else { + this.setValue(target.value); + } +}; + + +/** + * @param {goog.events.Event} event Change event. + * @private + */ +ol.dom.Input.prototype.handleCheckedChanged_ = function(event) { + this.target_.checked = /** @type {boolean} */ (this.getChecked()); +}; + + +/** + * @param {goog.events.Event} event Change event. + * @private + */ +ol.dom.Input.prototype.handleValueChanged_ = function(event) { + this.target_.value = /** @type {string} */ (this.getValue()); +}; diff --git a/float-no-zero/ol/ol/easing.exports b/float-no-zero/ol/ol/easing.exports new file mode 100644 index 0000000000..d8653acfe3 --- /dev/null +++ b/float-no-zero/ol/ol/easing.exports @@ -0,0 +1,7 @@ +@exportSymbol ol.easing.bounce +@exportSymbol ol.easing.easeIn +@exportSymbol ol.easing.easeOut +@exportSymbol ol.easing.elastic +@exportSymbol ol.easing.inAndOut +@exportSymbol ol.easing.linear +@exportSymbol ol.easing.upAndDown diff --git a/float-no-zero/ol/ol/easing.js b/float-no-zero/ol/ol/easing.js new file mode 100644 index 0000000000..9e829f3a93 --- /dev/null +++ b/float-no-zero/ol/ol/easing.js @@ -0,0 +1,83 @@ +goog.provide('ol.easing'); + +goog.require('goog.fx.easing'); + + +/** + * from https://raw.github.com/DmitryBaranovskiy/raphael/master/raphael.js + * @param {number} t Input between 0 and 1. + * @return {number} Output between 0 and 1. + */ +ol.easing.bounce = function(t) { + var s = 7.5625, p = 2.75, l; + if (t < (1 / p)) { + l = s * t * t; + } else { + if (t < (2 / p)) { + t -= (1.5 / p); + l = s * t * t + 0.75; + } else { + if (t < (2.5 / p)) { + t -= (2.25 / p); + l = s * t * t + 0.9375; + } else { + t -= (2.625 / p); + l = s * t * t + 0.984375; + } + } + } + return l; +}; + + +/** + * @param {number} t Input between 0 and 1. + * @return {number} Output between 0 and 1. + */ +ol.easing.easeIn = goog.fx.easing.easeIn; + + +/** + * @param {number} t Input between 0 and 1. + * @return {number} Output between 0 and 1. + */ +ol.easing.easeOut = goog.fx.easing.easeOut; + + +/** + * from https://raw.github.com/DmitryBaranovskiy/raphael/master/raphael.js + * @param {number} t Input between 0 and 1. + * @return {number} Output between 0 and 1. + */ +ol.easing.elastic = function(t) { + return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1; +}; + + +/** + * @param {number} t Input between 0 and 1. + * @return {number} Output between 0 and 1. + */ +ol.easing.inAndOut = goog.fx.easing.inAndOut; + + +/** + * @param {number} t Input between 0 and 1. + * @return {number} Output between 0 and 1. + */ +ol.easing.linear = function(t) { + return t; +}; + + +/** + * @param {number} t Input between 0 and 1. + * @return {number} Output between 0 and 1. + */ +ol.easing.upAndDown = function(t) { + if (t < 0.5) { + return ol.easing.inAndOut(2 * t); + } else { + return 1 - ol.easing.inAndOut(2 * (t - 0.5)); + } +}; diff --git a/float-no-zero/ol/ol/ellipsoid/bessel1841ellipsoid.js b/float-no-zero/ol/ol/ellipsoid/bessel1841ellipsoid.js new file mode 100644 index 0000000000..198a8eb76b --- /dev/null +++ b/float-no-zero/ol/ol/ellipsoid/bessel1841ellipsoid.js @@ -0,0 +1,10 @@ +goog.provide('ol.ellipsoid.BESSEL1841'); + +goog.require('ol.Ellipsoid'); + + +/** + * @const + * @type {ol.Ellipsoid} + */ +ol.ellipsoid.BESSEL1841 = new ol.Ellipsoid(6377397.155, 1 / 299.15281285); diff --git a/float-no-zero/ol/ol/ellipsoid/ellipsoid.js b/float-no-zero/ol/ol/ellipsoid/ellipsoid.js new file mode 100644 index 0000000000..88ef01335f --- /dev/null +++ b/float-no-zero/ol/ol/ellipsoid/ellipsoid.js @@ -0,0 +1,185 @@ +goog.provide('ol.Ellipsoid'); + +goog.require('goog.math'); +goog.require('ol.Coordinate'); + + + +/** + * @constructor + * @param {number} a Major radius. + * @param {number} flattening Flattening. + */ +ol.Ellipsoid = function(a, flattening) { + + /** + * @const + * @type {number} + */ + this.a = a; + + /** + * @const + * @type {number} + */ + this.flattening = flattening; + + /** + * @const + * @type {number} + */ + this.b = this.a * (1 - this.flattening); + + /** + * @const + * @type {number} + */ + this.eSquared = 2 * flattening - flattening * flattening; + + /** + * @const + * @type {number} + */ + this.e = Math.sqrt(this.eSquared); + +}; + + +/** + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 1. + * @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence. + * @param {number=} opt_maxIterations Maximum iterations. + * @return {{distance: number, initialBearing: number, finalBearing: number}} + * Vincenty. + */ +ol.Ellipsoid.prototype.vincenty = + function(c1, c2, opt_minDeltaLambda, opt_maxIterations) { + var minDeltaLambda = goog.isDef(opt_minDeltaLambda) ? + opt_minDeltaLambda : 1e-12; + var maxIterations = goog.isDef(opt_maxIterations) ? + opt_maxIterations : 100; + var f = this.flattening; + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + var U1 = Math.atan((1 - f) * Math.tan(lat1)); + var cosU1 = Math.cos(U1); + var sinU1 = Math.sin(U1); + var U2 = Math.atan((1 - f) * Math.tan(lat2)); + var cosU2 = Math.cos(U2); + var sinU2 = Math.sin(U2); + var lambda = deltaLon; + var cosSquaredAlpha, sinAlpha; + var cosLambda, deltaLambda = Infinity, sinLambda; + var cos2SigmaM, cosSigma, sigma, sinSigma; + var i; + for (i = maxIterations; i > 0; --i) { + cosLambda = Math.cos(lambda); + sinLambda = Math.sin(lambda); + var x = cosU2 * sinLambda; + var y = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda; + sinSigma = Math.sqrt(x * x + y * y); + if (sinSigma === 0) { + return { + distance: 0, + initialBearing: 0, + finalBearing: 0 + }; + } + cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda; + sigma = Math.atan2(sinSigma, cosSigma); + sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma; + cosSquaredAlpha = 1 - sinAlpha * sinAlpha; + cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSquaredAlpha; + if (isNaN(cos2SigmaM)) { + cos2SigmaM = 0; + } + var C = f / 16 * cosSquaredAlpha * (4 + f * (4 - 3 * cosSquaredAlpha)); + var lambdaPrime = deltaLon + (1 - C) * f * sinAlpha * (sigma + + C * sinSigma * (cos2SigmaM + + C * cosSigma * (2 * cos2SigmaM * cos2SigmaM - 1))); + deltaLambda = Math.abs(lambdaPrime - lambda); + lambda = lambdaPrime; + if (deltaLambda < minDeltaLambda) { + break; + } + } + if (i === 0) { + return { + distance: NaN, + finalBearing: NaN, + initialBearing: NaN + }; + } + var aSquared = this.a * this.a; + var bSquared = this.b * this.b; + var uSquared = cosSquaredAlpha * (aSquared - bSquared) / bSquared; + var A = 1 + uSquared / 16384 * + (4096 + uSquared * (uSquared * (320 - 175 * uSquared) - 768)); + var B = uSquared / 1024 * + (256 + uSquared * (uSquared * (74 - 47 * uSquared) - 128)); + var deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * + (cosSigma * (2 * cos2SigmaM * cos2SigmaM - 1) - + B / 6 * cos2SigmaM * (4 * sinSigma * sinSigma - 3) * + (4 * cos2SigmaM * cos2SigmaM - 3))); + cosLambda = Math.cos(lambda); + sinLambda = Math.sin(lambda); + var alpha1 = Math.atan2(cosU2 * sinLambda, + cosU1 * sinU2 - sinU1 * cosU2 * cosLambda); + var alpha2 = Math.atan2(cosU1 * sinLambda, + cosU1 * sinU2 * cosLambda - sinU1 * cosU2); + return { + distance: this.b * A * (sigma - deltaSigma), + initialBearing: goog.math.toDegrees(alpha1), + finalBearing: goog.math.toDegrees(alpha2) + }; +}; + + +/** + * Returns the distance from c1 to c2 using Vincenty. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 1. + * @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence. + * @param {number=} opt_maxIterations Maximum iterations. + * @return {number} Vincenty distance. + */ +ol.Ellipsoid.prototype.vincentyDistance = + function(c1, c2, opt_minDeltaLambda, opt_maxIterations) { + var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations); + return vincenty.distance; +}; + + +/** + * Returns the final bearing from c1 to c2 using Vincenty. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 1. + * @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence. + * @param {number=} opt_maxIterations Maximum iterations. + * @return {number} Initial bearing. + */ +ol.Ellipsoid.prototype.vincentyFinalBearing = + function(c1, c2, opt_minDeltaLambda, opt_maxIterations) { + var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations); + return vincenty.finalBearing; +}; + + +/** + * Returns the initial bearing from c1 to c2 using Vincenty. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 1. + * @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence. + * @param {number=} opt_maxIterations Maximum iterations. + * @return {number} Initial bearing. + */ +ol.Ellipsoid.prototype.vincentyInitialBearing = + function(c1, c2, opt_minDeltaLambda, opt_maxIterations) { + var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations); + return vincenty.initialBearing; +}; diff --git a/float-no-zero/ol/ol/ellipsoid/wgs84ellipsoid.js b/float-no-zero/ol/ol/ellipsoid/wgs84ellipsoid.js new file mode 100644 index 0000000000..e5244b80d7 --- /dev/null +++ b/float-no-zero/ol/ol/ellipsoid/wgs84ellipsoid.js @@ -0,0 +1,10 @@ +goog.provide('ol.ellipsoid.WGS84'); + +goog.require('ol.Ellipsoid'); + + +/** + * @const + * @type {ol.Ellipsoid} + */ +ol.ellipsoid.WGS84 = new ol.Ellipsoid(6378137, 1 / 298.257223563); diff --git a/float-no-zero/ol/ol/events/condition.exports b/float-no-zero/ol/ol/events/condition.exports new file mode 100644 index 0000000000..c61f44c6a2 --- /dev/null +++ b/float-no-zero/ol/ol/events/condition.exports @@ -0,0 +1,7 @@ +@exportSymbol ol.events.condition.altKeyOnly +@exportSymbol ol.events.condition.altShiftKeysOnly +@exportSymbol ol.events.condition.always +@exportSymbol ol.events.condition.noModifierKeys +@exportSymbol ol.events.condition.platformModifierKeyOnly +@exportSymbol ol.events.condition.shiftKeyOnly +@exportSymbol ol.events.condition.targetNotEditable diff --git a/float-no-zero/ol/ol/events/condition.js b/float-no-zero/ol/ol/events/condition.js new file mode 100644 index 0000000000..d6afa87bfc --- /dev/null +++ b/float-no-zero/ol/ol/events/condition.js @@ -0,0 +1,122 @@ +goog.provide('ol.events.ConditionType'); +goog.provide('ol.events.condition'); + +goog.require('goog.asserts'); +goog.require('goog.dom.TagName'); +goog.require('goog.functions'); +goog.require('ol.MapBrowserEvent.EventType'); + + +/** + * A function that takes an {@link ol.MapBrowserEvent} and returns a + * `{boolean}`. If the condition is met, true should be returned. + * + * @typedef {function(ol.MapBrowserEvent): boolean} + * @todo stability experimental + */ +ol.events.ConditionType; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} True if only the alt key is pressed. + * @todo stability experimental + */ +ol.events.condition.altKeyOnly = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return ( + browserEvent.altKey && + !browserEvent.platformModifierKey && + !browserEvent.shiftKey); +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} True if only the alt and shift keys are pressed. + * @todo stability experimental + */ +ol.events.condition.altShiftKeysOnly = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return ( + browserEvent.altKey && + !browserEvent.platformModifierKey && + browserEvent.shiftKey); +}; + + +/** + * Always true. + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} True. + * @todo stability experimental + */ +ol.events.condition.always = goog.functions.TRUE; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} True if the event is a click event. + * @todo stability experimental + */ +ol.events.condition.singleClick = function(mapBrowserEvent) { + return mapBrowserEvent.type == ol.MapBrowserEvent.EventType.SINGLECLICK; +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} True only if there no modifier keys are pressed. + * @todo stability experimental + */ +ol.events.condition.noModifierKeys = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return ( + !browserEvent.altKey && + !browserEvent.platformModifierKey && + !browserEvent.shiftKey); +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} True if only the platform modifier key is pressed. + * @todo stability experimental + */ +ol.events.condition.platformModifierKeyOnly = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return ( + !browserEvent.altKey && + browserEvent.platformModifierKey && + !browserEvent.shiftKey); +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} True if only the shift key is pressed. + * @todo stability experimental + */ +ol.events.condition.shiftKeyOnly = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + return ( + !browserEvent.altKey && + !browserEvent.platformModifierKey && + browserEvent.shiftKey); +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} True only if the target element is not editable. + * @todo stability experimental + */ +ol.events.condition.targetNotEditable = function(mapBrowserEvent) { + var target = mapBrowserEvent.browserEvent.target; + goog.asserts.assertInstanceof(target, Element); + var tagName = target.tagName; + return ( + tagName !== goog.dom.TagName.INPUT && + tagName !== goog.dom.TagName.SELECT && + tagName !== goog.dom.TagName.TEXTAREA); +}; diff --git a/float-no-zero/ol/ol/events/condition.jsdoc b/float-no-zero/ol/ol/events/condition.jsdoc new file mode 100644 index 0000000000..74ed0abb2b --- /dev/null +++ b/float-no-zero/ol/ol/events/condition.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.events.condition + */ diff --git a/float-no-zero/ol/ol/extent.exports b/float-no-zero/ol/ol/extent.exports new file mode 100644 index 0000000000..387a75529f --- /dev/null +++ b/float-no-zero/ol/ol/extent.exports @@ -0,0 +1,18 @@ +@exportSymbol ol.extent.boundingExtent +@exportSymbol ol.extent.buffer +@exportSymbol ol.extent.containsCoordinate +@exportSymbol ol.extent.containsExtent +@exportSymbol ol.extent.createEmpty +@exportSymbol ol.extent.equals +@exportSymbol ol.extent.extend +@exportSymbol ol.extent.getBottomLeft +@exportSymbol ol.extent.getBottomRight +@exportSymbol ol.extent.getCenter +@exportSymbol ol.extent.getHeight +@exportSymbol ol.extent.getSize +@exportSymbol ol.extent.getTopLeft +@exportSymbol ol.extent.getTopRight +@exportSymbol ol.extent.getWidth +@exportSymbol ol.extent.intersects +@exportSymbol ol.extent.isEmpty +@exportSymbol ol.extent.transform diff --git a/float-no-zero/ol/ol/extent.js b/float-no-zero/ol/ol/extent.js new file mode 100644 index 0000000000..ba146637fc --- /dev/null +++ b/float-no-zero/ol/ol/extent.js @@ -0,0 +1,766 @@ +goog.provide('ol.Extent'); +goog.provide('ol.extent'); +goog.provide('ol.extent.Relationship'); + +goog.require('goog.asserts'); +goog.require('goog.vec.Mat4'); +goog.require('ol.Coordinate'); +goog.require('ol.Size'); +goog.require('ol.TransformFunction'); + + +/** + * An array of numbers representing an extent: `[minx, miny, maxx, maxy]`. + * @typedef {Array.} + * @todo stability experimental + */ +ol.Extent; + + +/** + * Relationship to an extent. + * @enum {number} + */ +ol.extent.Relationship = { + UNKNOWN: 0, + INTERSECTING: 1, + ABOVE: 2, + RIGHT: 4, + BELOW: 8, + LEFT: 16 +}; + + +/** + * Builds an extent that includes all given coordinates. + * + * @param {Array.} coordinates Coordinates. + * @return {ol.Extent} Bounding extent. + * @todo stability experimental + */ +ol.extent.boundingExtent = function(coordinates) { + var extent = ol.extent.createEmpty(); + for (var i = 0, ii = coordinates.length; i < ii; ++i) { + ol.extent.extendCoordinate(extent, coordinates[i]); + } + return extent; +}; + + +/** + * @param {Array.} xs Xs. + * @param {Array.} ys Ys. + * @param {ol.Extent=} opt_extent Destination extent. + * @private + * @return {ol.Extent} Extent. + * @todo stability experimental + */ +ol.extent.boundingExtentXYs_ = function(xs, ys, opt_extent) { + goog.asserts.assert(xs.length > 0); + goog.asserts.assert(ys.length > 0); + var minX = Math.min.apply(null, xs); + var minY = Math.min.apply(null, ys); + var maxX = Math.max.apply(null, xs); + var maxY = Math.max.apply(null, ys); + return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent); +}; + + +/** + * Return extent increased by the provided value. + * @param {ol.Extent} extent Extent. + * @param {number} value The amount by wich the extent should be buffered. + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.extent.buffer = function(extent, value, opt_extent) { + if (goog.isDef(opt_extent)) { + opt_extent[0] = extent[0] - value; + opt_extent[1] = extent[1] - value; + opt_extent[2] = extent[2] + value; + opt_extent[3] = extent[3] + value; + return opt_extent; + } else { + return [ + extent[0] - value, + extent[1] - value, + extent[2] + value, + extent[3] + value + ]; + } +}; + + +/** + * Creates a clone of an extent. + * + * @param {ol.Extent} extent Extent to clone. + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} The clone. + * @todo stability experimental + */ +ol.extent.clone = function(extent, opt_extent) { + if (goog.isDef(opt_extent)) { + opt_extent[0] = extent[0]; + opt_extent[1] = extent[1]; + opt_extent[2] = extent[2]; + opt_extent[3] = extent[3]; + return opt_extent; + } else { + return extent.slice(); + } +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} x X. + * @param {number} y Y. + * @return {number} Closest squared distance. + */ +ol.extent.closestSquaredDistanceXY = function(extent, x, y) { + var dx, dy; + if (x < extent[0]) { + dx = extent[0] - x; + } else if (extent[2] < x) { + dx = x - extent[2]; + } else { + dx = 0; + } + if (y < extent[1]) { + dy = extent[1] - y; + } else if (extent[3] < y) { + dy = y - extent[3]; + } else { + dy = 0; + } + return dx * dx + dy * dy; +}; + + +/** + * Checks if the passed coordinate is contained or on the edge of the extent. + * + * @param {ol.Extent} extent Extent. + * @param {ol.Coordinate} coordinate Coordinate. + * @return {boolean} Contains. + * @todo stability experimental + */ +ol.extent.containsCoordinate = function(extent, coordinate) { + return extent[0] <= coordinate[0] && coordinate[0] <= extent[2] && + extent[1] <= coordinate[1] && coordinate[1] <= extent[3]; +}; + + +/** + * Checks if `extent2` is contained by or on the edge of `extent1`. + * + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent 2. + * @return {boolean} Contains. + * @todo stability experimental + */ +ol.extent.containsExtent = function(extent1, extent2) { + return extent1[0] <= extent2[0] && extent2[2] <= extent1[2] && + extent1[1] <= extent2[1] && extent2[3] <= extent1[3]; +}; + + +/** + * Get the relationship between a coordinate and extent. + * @param {ol.Extent} extent The extent. + * @param {ol.Coordinate} coordinate The coordinate. + * @return {number} The relationship (bitwise compare with + * ol.extent.Relationship). + */ +ol.extent.coordinateRelationship = function(extent, coordinate) { + var minX = extent[0]; + var minY = extent[1]; + var maxX = extent[2]; + var maxY = extent[3]; + var x = coordinate[0]; + var y = coordinate[1]; + var relationship = ol.extent.Relationship.UNKNOWN; + if (x < minX) { + relationship = relationship | ol.extent.Relationship.LEFT; + } else if (x > maxX) { + relationship = relationship | ol.extent.Relationship.RIGHT; + } + if (y < minY) { + relationship = relationship | ol.extent.Relationship.BELOW; + } else if (y > maxY) { + relationship = relationship | ol.extent.Relationship.ABOVE; + } + if (relationship === ol.extent.Relationship.UNKNOWN) { + relationship = ol.extent.Relationship.INTERSECTING; + } + return relationship; +}; + + +/** + * @return {ol.Extent} Empty extent. + * @todo stability experimental + */ +ol.extent.createEmpty = function() { + return [Infinity, Infinity, -Infinity, -Infinity]; +}; + + +/** + * @param {number} minX Minimum X. + * @param {number} minY Minimum Y. + * @param {number} maxX Maximum X. + * @param {number} maxY Maximum Y. + * @param {ol.Extent=} opt_extent Destination extent. + * @return {ol.Extent} Extent. + * @todo stability experimental + */ +ol.extent.createOrUpdate = function(minX, minY, maxX, maxY, opt_extent) { + if (goog.isDef(opt_extent)) { + opt_extent[0] = minX; + opt_extent[1] = minY; + opt_extent[2] = maxX; + opt_extent[3] = maxY; + return opt_extent; + } else { + return [minX, minY, maxX, maxY]; + } +}; + + +/** + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.extent.createOrUpdateEmpty = function(opt_extent) { + return ol.extent.createOrUpdate( + Infinity, Infinity, -Infinity, -Infinity, opt_extent); +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.extent.createOrUpdateFromCoordinate = function(coordinate, opt_extent) { + var x = coordinate[0]; + var y = coordinate[1]; + return ol.extent.createOrUpdate(x, y, x, y, opt_extent); +}; + + +/** + * @param {Array.} coordinates Coordinates. + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.extent.createOrUpdateFromCoordinates = function(coordinates, opt_extent) { + var extent = ol.extent.createOrUpdateEmpty(opt_extent); + return ol.extent.extendCoordinates(extent, coordinates); +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.extent.createOrUpdateFromFlatCoordinates = + function(flatCoordinates, offset, end, stride, opt_extent) { + var extent = ol.extent.createOrUpdateEmpty(opt_extent); + return ol.extent.extendFlatCoordinates( + extent, flatCoordinates, offset, end, stride); +}; + + +/** + * @param {Array.>} rings Rings. + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.extent.createOrUpdateFromRings = function(rings, opt_extent) { + var extent = ol.extent.createOrUpdateEmpty(opt_extent); + return ol.extent.extendRings(extent, rings); +}; + + +/** + * Empties extent in place. + * @param {ol.Extent} extent Extent. + * @return {ol.Extent} Extent. + * @todo stability experimental + */ +ol.extent.empty = function(extent) { + extent[0] = extent[1] = Infinity; + extent[2] = extent[3] = -Infinity; + return extent; +}; + + +/** + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent 2. + * @return {boolean} Equals. + * @todo stability experimental + */ +ol.extent.equals = function(extent1, extent2) { + return extent1[0] == extent2[0] && extent1[2] == extent2[2] && + extent1[1] == extent2[1] && extent1[3] == extent2[3]; +}; + + +/** + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent 2. + * @return {ol.Extent} Extent. + * @todo stability experimental + */ +ol.extent.extend = function(extent1, extent2) { + if (extent2[0] < extent1[0]) { + extent1[0] = extent2[0]; + } + if (extent2[2] > extent1[2]) { + extent1[2] = extent2[2]; + } + if (extent2[1] < extent1[1]) { + extent1[1] = extent2[1]; + } + if (extent2[3] > extent1[3]) { + extent1[3] = extent2[3]; + } + return extent1; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {ol.Coordinate} coordinate Coordinate. + * @todo stability experimental + */ +ol.extent.extendCoordinate = function(extent, coordinate) { + if (coordinate[0] < extent[0]) { + extent[0] = coordinate[0]; + } + if (coordinate[0] > extent[2]) { + extent[2] = coordinate[0]; + } + if (coordinate[1] < extent[1]) { + extent[1] = coordinate[1]; + } + if (coordinate[1] > extent[3]) { + extent[3] = coordinate[1]; + } +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {Array.} coordinates Coordinates. + * @return {ol.Extent} Extent. + */ +ol.extent.extendCoordinates = function(extent, coordinates) { + var i, ii; + for (i = 0, ii = coordinates.length; i < ii; ++i) { + ol.extent.extendCoordinate(extent, coordinates[i]); + } + return extent; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @return {ol.Extent} Extent. + */ +ol.extent.extendFlatCoordinates = + function(extent, flatCoordinates, offset, end, stride) { + for (; offset < end; offset += stride) { + ol.extent.extendXY( + extent, flatCoordinates[offset], flatCoordinates[offset + 1]); + } + return extent; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {Array.>} rings Rings. + * @return {ol.Extent} Extent. + */ +ol.extent.extendRings = function(extent, rings) { + var i, ii; + for (i = 0, ii = rings.length; i < ii; ++i) { + ol.extent.extendCoordinates(extent, rings[i]); + } + return extent; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} x X. + * @param {number} y Y. + */ +ol.extent.extendXY = function(extent, x, y) { + extent[0] = Math.min(extent[0], x); + extent[1] = Math.min(extent[1], y); + extent[2] = Math.max(extent[2], x); + extent[3] = Math.max(extent[3], y); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {number} Area. + */ +ol.extent.getArea = function(extent) { + return ol.extent.getWidth(extent) * ol.extent.getHeight(extent); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {ol.Coordinate} Bottom left coordinate. + * @todo stability experimental + */ +ol.extent.getBottomLeft = function(extent) { + return [extent[0], extent[1]]; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {ol.Coordinate} Bottom right coordinate. + * @todo stability experimental + */ +ol.extent.getBottomRight = function(extent) { + return [extent[2], extent[1]]; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {ol.Coordinate} Center. + * @todo stability experimental + */ +ol.extent.getCenter = function(extent) { + return [(extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2]; +}; + + +/** + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent 2. + * @return {number} Enlarged area. + */ +ol.extent.getEnlargedArea = function(extent1, extent2) { + var minX = Math.min(extent1[0], extent2[0]); + var minY = Math.min(extent1[1], extent2[1]); + var maxX = Math.max(extent1[2], extent2[2]); + var maxY = Math.max(extent1[3], extent2[3]); + return (maxX - minX) * (maxY - minY); +}; + + +/** + * @param {ol.Coordinate} center Center. + * @param {number} resolution Resolution. + * @param {number} rotation Rotation. + * @param {ol.Size} size Size. + * @param {ol.Extent=} opt_extent Destination extent. + * @return {ol.Extent} Extent. + * @todo stability experimental + */ +ol.extent.getForView2DAndSize = + function(center, resolution, rotation, size, opt_extent) { + var dx = resolution * size[0] / 2; + var dy = resolution * size[1] / 2; + var cosRotation = Math.cos(rotation); + var sinRotation = Math.sin(rotation); + /** @type {Array.} */ + var xs = [-dx, -dx, dx, dx]; + /** @type {Array.} */ + var ys = [-dy, dy, -dy, dy]; + var i, x, y; + for (i = 0; i < 4; ++i) { + x = xs[i]; + y = ys[i]; + xs[i] = center[0] + x * cosRotation - y * sinRotation; + ys[i] = center[1] + x * sinRotation + y * cosRotation; + } + return ol.extent.boundingExtentXYs_(xs, ys, opt_extent); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {number} Height. + * @todo stability experimental + */ +ol.extent.getHeight = function(extent) { + return extent[3] - extent[1]; +}; + + +/** + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent 2. + * @return {number} Intersection area. + */ +ol.extent.getIntersectionArea = function(extent1, extent2) { + var minX = Math.max(extent1[0], extent2[0]); + var minY = Math.max(extent1[1], extent2[1]); + var maxX = Math.min(extent1[2], extent2[2]); + var maxY = Math.min(extent1[3], extent2[3]); + return Math.max(0, maxX - minX) * Math.max(0, maxY - minY); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {number} Margin. + */ +ol.extent.getMargin = function(extent) { + return ol.extent.getWidth(extent) + ol.extent.getHeight(extent); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {ol.Size} Size. + * @todo stability experimental + */ +ol.extent.getSize = function(extent) { + return [extent[2] - extent[0], extent[3] - extent[1]]; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {ol.Coordinate} Top left coordinate. + * @todo stability experimental + */ +ol.extent.getTopLeft = function(extent) { + return [extent[0], extent[3]]; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {ol.Coordinate} Top right coordinate. + * @todo stability experimental + */ +ol.extent.getTopRight = function(extent) { + return [extent[2], extent[3]]; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {number} Width. + * @todo stability experimental + */ +ol.extent.getWidth = function(extent) { + return extent[2] - extent[0]; +}; + + +/** + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent. + * @return {boolean} Intersects. + * @todo stability experimental + */ +ol.extent.intersects = function(extent1, extent2) { + return extent1[0] <= extent2[2] && + extent1[2] >= extent2[0] && + extent1[1] <= extent2[3] && + extent1[3] >= extent2[1]; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {boolean} Is empty. + * @todo stability experimental + */ +ol.extent.isEmpty = function(extent) { + return extent[2] < extent[0] || extent[3] < extent[1]; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol.Coordinate} Coordinate. + * @todo stability experimental + */ +ol.extent.normalize = function(extent, coordinate) { + return [ + (coordinate[0] - extent[0]) / (extent[2] - extent[0]), + (coordinate[1] - extent[1]) / (extent[3] - extent[1]) + ]; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.extent.returnOrUpdate = function(extent, opt_extent) { + if (goog.isDef(opt_extent)) { + opt_extent[0] = extent[0]; + opt_extent[1] = extent[1]; + opt_extent[2] = extent[2]; + opt_extent[3] = extent[3]; + return opt_extent; + } else { + return extent; + } +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} value Value. + * @todo stability experimental + */ +ol.extent.scaleFromCenter = function(extent, value) { + var deltaX = ((extent[2] - extent[0]) / 2) * (value - 1); + var deltaY = ((extent[3] - extent[1]) / 2) * (value - 1); + extent[0] -= deltaX; + extent[2] += deltaX; + extent[1] -= deltaY; + extent[3] += deltaY; +}; + + +/** + * Determine if the segment between two coordinates intersects (crosses, + * touches, or is contained by) the provided extent. + * @param {ol.Extent} extent The extent. + * @param {ol.Coordinate} start Segment start coordinate. + * @param {ol.Coordinate} end Segment end coordinate. + * @return {boolean} The segment intersects the extent. + */ +ol.extent.segmentIntersects = function(extent, start, end) { + var intersects = false; + var startRel = ol.extent.coordinateRelationship(extent, start); + var endRel = ol.extent.coordinateRelationship(extent, end); + if (startRel === ol.extent.Relationship.INTERSECTING || + endRel === ol.extent.Relationship.INTERSECTING) { + intersects = true; + } else { + var minX = extent[0]; + var minY = extent[1]; + var maxX = extent[2]; + var maxY = extent[3]; + var startX = start[0]; + var startY = start[1]; + var endX = end[0]; + var endY = end[1]; + var slope = (endY - startY) / (endX - startX); + var x, y; + if (!!(endRel & ol.extent.Relationship.ABOVE) && + !(startRel & ol.extent.Relationship.ABOVE)) { + // potentially intersects top + x = endX - ((endY - maxY) / slope); + intersects = x >= minX && x <= maxX; + } else if (!!(endRel & ol.extent.Relationship.RIGHT) && + !(startRel & ol.extent.Relationship.RIGHT)) { + // potentially intersects right + y = endY - ((endX - maxX) * slope); + intersects = y >= minY && y <= maxY; + } else if (!!(endRel & ol.extent.Relationship.BELOW) && + !(startRel & ol.extent.Relationship.BELOW)) { + // potentially intersects bottom + x = endX - ((endY - minY) / slope); + intersects = x >= minX && x <= maxX; + } else if (!!(endRel & ol.extent.Relationship.LEFT) && + !(startRel & ol.extent.Relationship.LEFT)) { + // potentially intersects left + y = endY - ((endX - minX) * slope); + intersects = y >= minY && y <= maxY; + } + + } + return intersects; +}; + + +/** + * @param {ol.Extent} extent1 Extent 1. + * @param {ol.Extent} extent2 Extent 2. + * @return {boolean} Touches. + * @todo stability experimental + */ +ol.extent.touches = function(extent1, extent2) { + var intersects = ol.extent.intersects(extent1, extent2); + return intersects && + (extent1[0] == extent2[2] || extent1[2] == extent2[0] || + extent1[1] == extent2[3] || extent1[3] == extent2[1]); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {ol.TransformFunction} transformFn Transform function. + * @param {ol.Extent=} opt_extent Destination extent. + * @return {ol.Extent} Extent. + * @todo stability experimental + */ +ol.extent.transform = function(extent, transformFn, opt_extent) { + var coordinates = [ + extent[0], extent[1], + extent[0], extent[3], + extent[2], extent[1], + extent[2], extent[3] + ]; + transformFn(coordinates, coordinates, 2); + var xs = [coordinates[0], coordinates[2], coordinates[4], coordinates[6]]; + var ys = [coordinates[1], coordinates[3], coordinates[5], coordinates[7]]; + return ol.extent.boundingExtentXYs_(xs, ys, opt_extent); +}; + + +/** + * Apply a 2d transform to an extent. + * @param {ol.Extent} extent Input extent. + * @param {goog.vec.Mat4.Number} transform The transform matrix. + * @param {ol.Extent=} opt_extent Optional extent for return values. + * @return {ol.Extent} The transformed extent. + */ +ol.extent.transform2D = function(extent, transform, opt_extent) { + var dest = goog.isDef(opt_extent) ? opt_extent : []; + var m00 = goog.vec.Mat4.getElement(transform, 0, 0); + var m10 = goog.vec.Mat4.getElement(transform, 1, 0); + var m01 = goog.vec.Mat4.getElement(transform, 0, 1); + var m11 = goog.vec.Mat4.getElement(transform, 1, 1); + var m03 = goog.vec.Mat4.getElement(transform, 0, 3); + var m13 = goog.vec.Mat4.getElement(transform, 1, 3); + var xi = [0, 2, 0, 2]; + var yi = [1, 1, 3, 3]; + var xs = []; + var ys = []; + var i, x, y; + for (i = 0; i < 4; ++i) { + x = extent[xi[i]]; + y = extent[yi[i]]; + xs[i] = m00 * x + m01 * y + m03; + ys[i] = m10 * x + m11 * y + m13; + } + dest[0] = Math.min.apply(null, xs); + dest[1] = Math.min.apply(null, ys); + dest[2] = Math.max.apply(null, xs); + dest[3] = Math.max.apply(null, ys); + return dest; +}; diff --git a/float-no-zero/ol/ol/feature.exports b/float-no-zero/ol/ol/feature.exports new file mode 100644 index 0000000000..6c1f200ea6 --- /dev/null +++ b/float-no-zero/ol/ol/feature.exports @@ -0,0 +1,8 @@ +@exportSymbol ol.Feature +@exportProperty ol.Feature.prototype.getGeometryName +@exportProperty ol.Feature.prototype.getId +@exportProperty ol.Feature.prototype.getStyle +@exportProperty ol.Feature.prototype.getStyleFunction +@exportProperty ol.Feature.prototype.setGeometryName +@exportProperty ol.Feature.prototype.setId +@exportProperty ol.Feature.prototype.setStyle diff --git a/float-no-zero/ol/ol/feature.js b/float-no-zero/ol/ol/feature.js new file mode 100644 index 0000000000..642b602d80 --- /dev/null +++ b/float-no-zero/ol/ol/feature.js @@ -0,0 +1,340 @@ +goog.provide('ol.Feature'); +goog.provide('ol.feature'); + +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.functions'); +goog.require('ol.Object'); +goog.require('ol.geom.Geometry'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); + + + +/** + * @constructor + * @extends {ol.Object} + * @param {ol.geom.Geometry|Object.=} opt_geometryOrValues + * Values or geometry. + * @todo stability experimental + */ +ol.Feature = function(opt_geometryOrValues) { + + goog.base(this); + + /** + * @private + * @type {number|string|undefined} + */ + this.id_ = undefined; + + /** + * @type {string} + * @private + */ + this.geometryName_ = 'geometry'; + + /** + * User provided style. + * @private + * @type {ol.style.Style|Array.| + * ol.feature.FeatureStyleFunction} + */ + this.style_ = null; + + /** + * @private + * @type {ol.feature.FeatureStyleFunction|undefined} + */ + this.styleFunction_ = undefined; + + /** + * @private + * @type {goog.events.Key} + */ + this.geometryChangeKey_ = null; + + goog.events.listen( + this, ol.Object.getChangeEventType(this.geometryName_), + this.handleGeometryChanged_, false, this); + + if (goog.isDefAndNotNull(opt_geometryOrValues)) { + if (opt_geometryOrValues instanceof ol.geom.Geometry) { + var geometry = /** @type {ol.geom.Geometry} */ (opt_geometryOrValues); + this.setGeometry(geometry); + } else { + goog.asserts.assert(goog.isObject(opt_geometryOrValues)); + var values = /** @type {Object.} */ (opt_geometryOrValues); + this.setValues(values); + } + } else { + this.setGeometry(null); + } +}; +goog.inherits(ol.Feature, ol.Object); + + +/** + * @return {ol.geom.Geometry|undefined} Geometry. + * @todo stability experimental + */ +ol.Feature.prototype.getGeometry = function() { + return /** @type {ol.geom.Geometry|undefined} */ ( + this.get(this.geometryName_)); +}; +goog.exportProperty( + ol.Feature.prototype, + 'getGeometry', + ol.Feature.prototype.getGeometry); + + +/** + * @return {number|string|undefined} Id. + * @todo stability experimental + */ +ol.Feature.prototype.getId = function() { + return this.id_; +}; + + +/** + * @return {string} Geometry property name. + * @todo stability experimental + */ +ol.Feature.prototype.getGeometryName = function() { + return this.geometryName_; +}; + + +/** + * @return {ol.style.Style|Array.| + * ol.feature.FeatureStyleFunction} User provided style. + * @todo stability experimental + */ +ol.Feature.prototype.getStyle = function() { + return this.style_; +}; + + +/** + * @return {ol.feature.FeatureStyleFunction|undefined} Style function. + * @todo stability experimental + */ +ol.Feature.prototype.getStyleFunction = function() { + return this.styleFunction_; +}; + + +/** + * @private + */ +ol.Feature.prototype.handleGeometryChange_ = function() { + this.dispatchChangeEvent(); +}; + + +/** + * @private + */ +ol.Feature.prototype.handleGeometryChanged_ = function() { + if (!goog.isNull(this.geometryChangeKey_)) { + goog.events.unlistenByKey(this.geometryChangeKey_); + this.geometryChangeKey_ = null; + } + var geometry = this.getGeometry(); + if (goog.isDefAndNotNull(geometry)) { + this.geometryChangeKey_ = goog.events.listen(geometry, + goog.events.EventType.CHANGE, this.handleGeometryChange_, false, this); + } + this.dispatchChangeEvent(); +}; + + +/** + * @param {ol.geom.Geometry|undefined} geometry Geometry. + * @todo stability experimental + */ +ol.Feature.prototype.setGeometry = function(geometry) { + this.set(this.geometryName_, geometry); +}; +goog.exportProperty( + ol.Feature.prototype, + 'setGeometry', + ol.Feature.prototype.setGeometry); + + +/** + * @param {ol.style.Style|Array.| + * ol.feature.FeatureStyleFunction} style Feature style. + * @todo stability experimental + */ +ol.Feature.prototype.setStyle = function(style) { + this.style_ = style; + this.styleFunction_ = ol.feature.createFeatureStyleFunction(style); + this.dispatchChangeEvent(); +}; + + +/** + * @param {number|string|undefined} id Id. + * @todo stability experimental + */ +ol.Feature.prototype.setId = function(id) { + this.id_ = id; +}; + + +/** + * @param {string} name Geometry property name. + * @todo stability experimental + */ +ol.Feature.prototype.setGeometryName = function(name) { + goog.events.unlisten( + this, ol.Object.getChangeEventType(this.geometryName_), + this.handleGeometryChanged_, false, this); + this.geometryName_ = name; + goog.events.listen( + this, ol.Object.getChangeEventType(this.geometryName_), + this.handleGeometryChanged_, false, this); + this.handleGeometryChanged_(); +}; + + +/** + * A function that takes a `{number}` representing the view's resolution. It + * returns an Array of {@link ol.style.Style}. This way individual features + * can be styled. The this keyword inside the function references the + * {@link ol.Feature} to be styled. + * + * @typedef {function(this: ol.Feature, number): Array.} + * @todo stability experimental + */ +ol.feature.FeatureStyleFunction; + + +/** + * Default style function for features. + * @param {number} resolution Resolution. + * @return {Array.} Style. + * @this {ol.Feature} + * @todo stability experimental + */ +ol.feature.defaultFeatureStyleFunction = (function() { + var fill = new ol.style.Fill({ + color: 'rgba(255,255,255,0.4)' + }); + var stroke = new ol.style.Stroke({ + color: '#3399CC', + width: 1.25 + }); + var styles = [ + new ol.style.Style({ + image: new ol.style.Circle({ + fill: fill, + stroke: stroke, + radius: 5 + }), + fill: fill, + stroke: stroke + }) + ]; + return function(resolution) { + return styles; + }; +})(); + + +/** + * A function that takes an {@link ol.Feature} and a `{number}` representing + * the view's resolution. The function should return an array of + * {@link ol.style.Style}. This way e.g. a vector layer can be styled. + * + * @typedef {function(ol.Feature, number): Array.} + * @todo stability experimental + */ +ol.feature.StyleFunction; + + +/** + * @param {ol.Feature} feature Feature. + * @param {number} resolution Resolution. + * @return {Array.} Style. + * @todo stability experimental + */ +ol.feature.defaultStyleFunction = function(feature, resolution) { + var featureStyleFunction = feature.getStyleFunction(); + if (!goog.isDef(featureStyleFunction)) { + featureStyleFunction = ol.feature.defaultFeatureStyleFunction; + } + return featureStyleFunction.call(feature, resolution); +}; + + +/** + * Convert the provided object into a feature style function. Functions passed + * through unchanged. Arrays of ol.style.Style or single style objects wrapped + * in a new feature style function. + * @param {ol.feature.FeatureStyleFunction|Array.| + * ol.style.Style} obj A feature style function, a single style, or an array + * of styles. + * @return {ol.feature.FeatureStyleFunction} A style function. + */ +ol.feature.createFeatureStyleFunction = function(obj) { + /** + * @type {ol.feature.FeatureStyleFunction} + */ + var styleFunction; + + if (goog.isFunction(obj)) { + styleFunction = /** @type {ol.feature.FeatureStyleFunction} */ (obj); + } else { + /** + * @type {Array.} + */ + var styles; + if (goog.isArray(obj)) { + styles = obj; + } else { + goog.asserts.assertInstanceof(obj, ol.style.Style); + styles = [obj]; + } + styleFunction = goog.functions.constant(styles); + } + return styleFunction; +}; + + +/** + * Convert the provided object into a style function. Functions passed through + * unchanged. Arrays of ol.style.Style or single style objects wrapped in a + * new style function. + * @param {ol.feature.StyleFunction|Array.|ol.style.Style} obj + * A style function, a single style, or an array of styles. + * @return {ol.feature.StyleFunction} A style function. + */ +ol.feature.createStyleFunction = function(obj) { + /** + * @type {ol.feature.StyleFunction} + */ + var styleFunction; + + if (goog.isFunction(obj)) { + styleFunction = /** @type {ol.feature.StyleFunction} */ (obj); + } else { + /** + * @type {Array.} + */ + var styles; + if (goog.isArray(obj)) { + styles = obj; + } else { + goog.asserts.assertInstanceof(obj, ol.style.Style); + styles = [obj]; + } + styleFunction = goog.functions.constant(styles); + } + return styleFunction; +}; diff --git a/float-no-zero/ol/ol/feature.jsdoc b/float-no-zero/ol/ol/feature.jsdoc new file mode 100644 index 0000000000..7eeb59f500 --- /dev/null +++ b/float-no-zero/ol/ol/feature.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.feature + */ diff --git a/float-no-zero/ol/ol/featureoverlay.exports b/float-no-zero/ol/ol/featureoverlay.exports new file mode 100644 index 0000000000..b471a281f6 --- /dev/null +++ b/float-no-zero/ol/ol/featureoverlay.exports @@ -0,0 +1,9 @@ +@exportSymbol ol.FeatureOverlay +@exportProperty ol.FeatureOverlay.prototype.addFeature +@exportProperty ol.FeatureOverlay.prototype.getFeatures +@exportProperty ol.FeatureOverlay.prototype.getStyle +@exportProperty ol.FeatureOverlay.prototype.getStyleFunction +@exportProperty ol.FeatureOverlay.prototype.removeFeature +@exportProperty ol.FeatureOverlay.prototype.setFeatures +@exportProperty ol.FeatureOverlay.prototype.setMap +@exportProperty ol.FeatureOverlay.prototype.setStyle diff --git a/float-no-zero/ol/ol/featureoverlay.js b/float-no-zero/ol/ol/featureoverlay.js new file mode 100644 index 0000000000..84df05262a --- /dev/null +++ b/float-no-zero/ol/ol/featureoverlay.js @@ -0,0 +1,275 @@ +goog.provide('ol.FeatureOverlay'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.object'); +goog.require('ol.Collection'); +goog.require('ol.CollectionEventType'); +goog.require('ol.Feature'); +goog.require('ol.feature'); +goog.require('ol.render.EventType'); + + + +/** + * @constructor + * @param {olx.FeatureOverlayOptions=} opt_options Options. + * @todo stability experimental + */ +ol.FeatureOverlay = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.Collection} + */ + this.features_ = null; + + /** + * @private + * @type {Array.} + */ + this.featuresListenerKeys_ = null; + + /** + * @private + * @type {Object.} + */ + this.featureChangeListenerKeys_ = null; + + /** + * @private + * @type {ol.Map} + */ + this.map_ = null; + + /** + * @private + * @type {goog.events.Key} + */ + this.postComposeListenerKey_ = null; + + /** + * @private + * @type {ol.style.Style|Array.|ol.feature.StyleFunction} + */ + this.style_ = null; + + /** + * @private + * @type {ol.feature.StyleFunction|undefined} + */ + this.styleFunction_ = goog.isDef(options.style) ? + ol.feature.createStyleFunction(options.style) : undefined; + + if (goog.isDef(options.features)) { + if (goog.isArray(options.features)) { + this.setFeatures(new ol.Collection(goog.array.clone(options.features))); + } else { + goog.asserts.assertInstanceof(options.features, ol.Collection); + this.setFeatures(options.features); + } + } else { + this.setFeatures(new ol.Collection()); + } + + if (goog.isDef(options.map)) { + this.setMap(options.map); + } + +}; + + +/** + * @param {ol.Feature} feature Feature. + * @todo stability experimental + */ +ol.FeatureOverlay.prototype.addFeature = function(feature) { + this.features_.push(feature); +}; + + +/** + * @return {ol.Collection} Features collection. + * @todo stability experimental + */ +ol.FeatureOverlay.prototype.getFeatures = function() { + return this.features_; +}; + + +/** + * @private + */ +ol.FeatureOverlay.prototype.handleFeatureChange_ = function() { + this.render_(); +}; + + +/** + * @private + * @param {ol.CollectionEvent} collectionEvent Collection event. + */ +ol.FeatureOverlay.prototype.handleFeaturesAdd_ = + function(collectionEvent) { + goog.asserts.assert(!goog.isNull(this.featureChangeListenerKeys_)); + var feature = /** @type {ol.Feature} */ (collectionEvent.element); + this.featureChangeListenerKeys_[goog.getUid(feature).toString()] = + goog.events.listen(feature, goog.events.EventType.CHANGE, + this.handleFeatureChange_, false, this); + this.render_(); +}; + + +/** + * @private + * @param {ol.CollectionEvent} collectionEvent Collection event. + */ +ol.FeatureOverlay.prototype.handleFeaturesRemove_ = + function(collectionEvent) { + goog.asserts.assert(!goog.isNull(this.featureChangeListenerKeys_)); + var feature = /** @type {ol.Feature} */ (collectionEvent.element); + var key = goog.getUid(feature).toString(); + goog.events.unlistenByKey(this.featureChangeListenerKeys_[key]); + delete this.featureChangeListenerKeys_[key]; + this.render_(); +}; + + +/** + * @param {ol.render.Event} event Event. + * @private + */ +ol.FeatureOverlay.prototype.handleMapPostCompose_ = function(event) { + if (goog.isNull(this.features_) || !goog.isDef(this.styleFunction_)) { + return; + } + var resolution = event.frameState.view2DState.resolution; + var vectorContext = event.vectorContext; + var i, ii, feature, styles; + this.features_.forEach(function(feature) { + styles = this.styleFunction_(feature, resolution); + if (!goog.isDefAndNotNull(styles)) { + return; + } + ii = styles.length; + for (i = 0; i < ii; ++i) { + vectorContext.drawFeature(feature, styles[i]); + } + }, this); +}; + + +/** + * @param {ol.Feature} feature Feature. + * @todo stability experimental + */ +ol.FeatureOverlay.prototype.removeFeature = function(feature) { + this.features_.remove(feature); +}; + + +/** + * @private + */ +ol.FeatureOverlay.prototype.render_ = function() { + if (!goog.isNull(this.map_)) { + this.map_.render(); + } +}; + + +/** + * @param {ol.Collection} features Features collection. + * @todo stability experimental + */ +ol.FeatureOverlay.prototype.setFeatures = function(features) { + if (!goog.isNull(this.featuresListenerKeys_)) { + goog.array.forEach(this.featuresListenerKeys_, goog.events.unlistenByKey); + this.featuresListenerKeys_ = null; + } + if (!goog.isNull(this.featureChangeListenerKeys_)) { + goog.array.forEach( + goog.object.getValues(this.featureChangeListenerKeys_), + goog.events.unlistenByKey); + this.featureChangeListenerKeys_ = null; + } + this.features_ = features; + if (!goog.isNull(features)) { + this.featuresListenerKeys_ = [ + goog.events.listen(features, ol.CollectionEventType.ADD, + this.handleFeaturesAdd_, false, this), + goog.events.listen(features, ol.CollectionEventType.REMOVE, + this.handleFeaturesRemove_, false, this) + ]; + this.featureChangeListenerKeys_ = {}; + var featuresArray = features.getArray(); + var i, ii = featuresArray.length; + var feature; + for (i = 0; i < ii; ++i) { + feature = featuresArray[i]; + this.featureChangeListenerKeys_[goog.getUid(feature).toString()] = + goog.events.listen(feature, goog.events.EventType.CHANGE, + this.handleFeatureChange_, false, this); + } + } + this.render_(); +}; + + +/** + * @param {ol.Map} map Map. + * @todo stability experimental + */ +ol.FeatureOverlay.prototype.setMap = function(map) { + if (!goog.isNull(this.postComposeListenerKey_)) { + goog.events.unlistenByKey(this.postComposeListenerKey_); + this.postComposeListenerKey_ = null; + } + this.render_(); + this.map_ = map; + if (!goog.isNull(map)) { + this.postComposeListenerKey_ = goog.events.listen( + map, ol.render.EventType.POSTCOMPOSE, this.handleMapPostCompose_, false, + this); + map.render(); + } +}; + + +/** + * Set the style for features. This can be a single style object, an array + * of styles, or a function that takes a feature and resolution and returns + * an array of styles. + * @param {ol.style.Style|Array.|ol.feature.StyleFunction} style + * Overlay style. + * @todo stability experimental + */ +ol.FeatureOverlay.prototype.setStyle = function(style) { + this.style_ = style; + this.styleFunction_ = ol.feature.createStyleFunction(style); + this.render_(); +}; + + +/** + * Get the style for features. This returns whatever was passed to the `style` + * option at construction or to the `setStyle` method. + * @return {ol.style.Style|Array.|ol.feature.StyleFunction} + * Overlay style. + */ +ol.FeatureOverlay.prototype.getStyle = function() { + return this.style_; +}; + + +/** + * Get the style function. + * @return {ol.feature.StyleFunction|undefined} Style function. + */ +ol.FeatureOverlay.prototype.getStyleFunction = function() { + return this.styleFunction_; +}; diff --git a/float-no-zero/ol/ol/format/binaryfeatureformat.js b/float-no-zero/ol/ol/format/binaryfeatureformat.js new file mode 100644 index 0000000000..a3f6f5cdc9 --- /dev/null +++ b/float-no-zero/ol/ol/format/binaryfeatureformat.js @@ -0,0 +1,111 @@ +goog.provide('ol.format.BinaryFeature'); + +goog.require('goog.asserts'); +goog.require('ol.BrowserFeature'); +goog.require('ol.binary.Buffer'); +goog.require('ol.format.Feature'); +goog.require('ol.format.FormatType'); +goog.require('ol.proj'); + + + +/** + * @constructor + * @extends {ol.format.Feature} + */ +ol.format.BinaryFeature = function() { + goog.base(this); +}; +goog.inherits(ol.format.BinaryFeature, ol.format.Feature); + + +/** + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @private + * @return {ol.binary.Buffer} Buffer. + */ +ol.format.BinaryFeature.getBuffer_ = function(source) { + if (ol.BrowserFeature.HAS_ARRAY_BUFFER && source instanceof ArrayBuffer) { + return new ol.binary.Buffer(source); + } else if (goog.isString(source)) { + return new ol.binary.Buffer(source); + } else { + goog.asserts.fail(); + return null; + } +}; + + +/** + * @inheritDoc + */ +ol.format.BinaryFeature.prototype.getType = function() { + return ol.format.FormatType.BINARY; +}; + + +/** + * @inheritDoc + */ +ol.format.BinaryFeature.prototype.readFeature = function(source) { + return this.readFeatureFromBuffer(ol.format.BinaryFeature.getBuffer_(source)); +}; + + +/** + * @inheritDoc + */ +ol.format.BinaryFeature.prototype.readFeatures = function(source) { + return this.readFeaturesFromBuffer( + ol.format.BinaryFeature.getBuffer_(source)); +}; + + +/** + * @param {ol.binary.Buffer} buffer Buffer. + * @protected + * @return {ol.Feature} Feature. + */ +ol.format.BinaryFeature.prototype.readFeatureFromBuffer = goog.abstractMethod; + + +/** + * @param {ol.binary.Buffer} buffer Buffer. + * @protected + * @return {Array.} Feature. + */ +ol.format.BinaryFeature.prototype.readFeaturesFromBuffer = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.BinaryFeature.prototype.readGeometry = function(source) { + return this.readGeometryFromBuffer( + ol.format.BinaryFeature.getBuffer_(source)); +}; + + +/** + * @param {ol.binary.Buffer} buffer Buffer. + * @protected + * @return {ol.geom.Geometry} Geometry. + */ +ol.format.BinaryFeature.prototype.readGeometryFromBuffer = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.BinaryFeature.prototype.readProjection = function(source) { + return this.readProjectionFromBuffer( + ol.format.BinaryFeature.getBuffer_(source)); +}; + + +/** + * @param {ol.binary.Buffer} buffer Buffer. + * @return {ol.proj.Projection} Projection. + */ +ol.format.BinaryFeature.prototype.readProjectionFromBuffer = + goog.abstractMethod; diff --git a/float-no-zero/ol/ol/format/featureformat.js b/float-no-zero/ol/ol/format/featureformat.js new file mode 100644 index 0000000000..62d7b4b4ad --- /dev/null +++ b/float-no-zero/ol/ol/format/featureformat.js @@ -0,0 +1,72 @@ +goog.provide('ol.format.Feature'); + +goog.require('goog.functions'); + + + +/** + * @constructor + */ +ol.format.Feature = function() { +}; + + +/** + * @return {Array.} Extensions. + */ +ol.format.Feature.prototype.getExtensions = goog.abstractMethod; + + +/** + * @return {ol.format.FormatType} Format. + */ +ol.format.Feature.prototype.getType = goog.abstractMethod; + + +/** + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {ol.Feature} Feature. + */ +ol.format.Feature.prototype.readFeature = goog.abstractMethod; + + +/** + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {Array.} Features. + */ +ol.format.Feature.prototype.readFeatures = goog.abstractMethod; + + +/** + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {ol.geom.Geometry} Geometry. + */ +ol.format.Feature.prototype.readGeometry = goog.abstractMethod; + + +/** + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {ol.proj.Projection} Projection. + */ +ol.format.Feature.prototype.readProjection = goog.abstractMethod; + + +/** + * @param {ol.Feature} feature Feature. + * @return {ArrayBuffer|Node|Object|string} Result. + */ +ol.format.Feature.prototype.writeFeature = goog.abstractMethod; + + +/** + * @param {Array.} features Features. + * @return {ArrayBuffer|Node|Object|string} Result. + */ +ol.format.Feature.prototype.writeFeatures = goog.abstractMethod; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @return {ArrayBuffer|Node|Object|string} Node. + */ +ol.format.Feature.prototype.writeGeometry = goog.abstractMethod; diff --git a/float-no-zero/ol/ol/format/format.js b/float-no-zero/ol/ol/format/format.js new file mode 100644 index 0000000000..bdedb916d1 --- /dev/null +++ b/float-no-zero/ol/ol/format/format.js @@ -0,0 +1,12 @@ +goog.provide('ol.format.FormatType'); + + +/** + * @enum {string} + */ +ol.format.FormatType = { + BINARY: 'binary', + JSON: 'json', + TEXT: 'text', + XML: 'xml' +}; diff --git a/float-no-zero/ol/ol/format/geojsonformat.exports b/float-no-zero/ol/ol/format/geojsonformat.exports new file mode 100644 index 0000000000..620f1bfad7 --- /dev/null +++ b/float-no-zero/ol/ol/format/geojsonformat.exports @@ -0,0 +1,8 @@ +@exportSymbol ol.format.GeoJSON +@exportProperty ol.format.GeoJSON.prototype.readFeature +@exportProperty ol.format.GeoJSON.prototype.readFeatures +@exportProperty ol.format.GeoJSON.prototype.readGeometry +@exportProperty ol.format.GeoJSON.prototype.readProjection +@exportProperty ol.format.GeoJSON.prototype.writeFeature +@exportProperty ol.format.GeoJSON.prototype.writeFeatures +@exportProperty ol.format.GeoJSON.prototype.writeGeometry diff --git a/float-no-zero/ol/ol/format/geojsonformat.js b/float-no-zero/ol/ol/format/geojsonformat.js new file mode 100644 index 0000000000..903affd392 --- /dev/null +++ b/float-no-zero/ol/ol/format/geojsonformat.js @@ -0,0 +1,438 @@ +// FIXME coordinate order +// FIXME reprojection + +goog.provide('ol.format.GeoJSON'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.object'); +goog.require('ol.Feature'); +goog.require('ol.format.JSONFeature'); +goog.require('ol.geom.GeometryCollection'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.MultiPoint'); +goog.require('ol.geom.MultiPolygon'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.Polygon'); +goog.require('ol.proj'); + + + +/** + * @constructor + * @extends {ol.format.JSONFeature} + * @param {olx.format.GeoJSONOptions=} opt_options Options. + * @todo stability experimental + */ +ol.format.GeoJSON = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + /** + * @private + * @type {ol.proj.Projection} + */ + this.defaultProjection_ = ol.proj.get(options.defaultProjection ? + options.defaultProjection : 'EPSG:4326'); + +}; +goog.inherits(ol.format.GeoJSON, ol.format.JSONFeature); + + +/** + * @const + * @type {Array.} + * @private + */ +ol.format.GeoJSON.EXTENSIONS_ = ['.geojson']; + + +/** + * @param {GeoJSONObject} object Object. + * @private + * @return {ol.geom.Geometry} Geometry. + */ +ol.format.GeoJSON.readGeometry_ = function(object) { + if (goog.isNull(object)) { + return null; + } + var geometryReader = ol.format.GeoJSON.GEOMETRY_READERS_[object.type]; + goog.asserts.assert(goog.isDef(geometryReader)); + return geometryReader(object); +}; + + +/** + * @param {GeoJSONGeometryCollection} object Object. + * @private + * @return {ol.geom.GeometryCollection} Geometry collection. + */ +ol.format.GeoJSON.readGeometryCollectionGeometry_ = function(object) { + goog.asserts.assert(object.type == 'GeometryCollection'); + var geometries = goog.array.map( + object.geometries, ol.format.GeoJSON.readGeometry_); + return new ol.geom.GeometryCollection(geometries); +}; + + +/** + * @param {GeoJSONGeometry} object Object. + * @private + * @return {ol.geom.Point} Point. + */ +ol.format.GeoJSON.readPointGeometry_ = function(object) { + goog.asserts.assert(object.type == 'Point'); + return new ol.geom.Point(object.coordinates); +}; + + +/** + * @param {GeoJSONGeometry} object Object. + * @private + * @return {ol.geom.LineString} LineString. + */ +ol.format.GeoJSON.readLineStringGeometry_ = function(object) { + goog.asserts.assert(object.type == 'LineString'); + return new ol.geom.LineString(object.coordinates); +}; + + +/** + * @param {GeoJSONGeometry} object Object. + * @private + * @return {ol.geom.MultiLineString} MultiLineString. + */ +ol.format.GeoJSON.readMultiLineStringGeometry_ = function(object) { + goog.asserts.assert(object.type == 'MultiLineString'); + return new ol.geom.MultiLineString(object.coordinates); +}; + + +/** + * @param {GeoJSONGeometry} object Object. + * @private + * @return {ol.geom.MultiPoint} MultiPoint. + */ +ol.format.GeoJSON.readMultiPointGeometry_ = function(object) { + goog.asserts.assert(object.type == 'MultiPoint'); + return new ol.geom.MultiPoint(object.coordinates); +}; + + +/** + * @param {GeoJSONGeometry} object Object. + * @private + * @return {ol.geom.MultiPolygon} MultiPolygon. + */ +ol.format.GeoJSON.readMultiPolygonGeometry_ = function(object) { + goog.asserts.assert(object.type == 'MultiPolygon'); + return new ol.geom.MultiPolygon(object.coordinates); +}; + + +/** + * @param {GeoJSONGeometry} object Object. + * @private + * @return {ol.geom.Polygon} Polygon. + */ +ol.format.GeoJSON.readPolygonGeometry_ = function(object) { + goog.asserts.assert(object.type == 'Polygon'); + return new ol.geom.Polygon(object.coordinates); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONObject} GeoJSON geometry. + */ +ol.format.GeoJSON.writeGeometry_ = function(geometry) { + var geometryWriter = ol.format.GeoJSON.GEOMETRY_WRITERS_[geometry.getType()]; + goog.asserts.assert(goog.isDef(geometryWriter)); + return geometryWriter(geometry); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONGeometryCollection} Empty GeoJSON geometry collection. + */ +ol.format.GeoJSON.writeEmptyGeometryCollectionGeometry_ = function(geometry) { + return /** @type {GeoJSONGeometryCollection} */ ({ + 'type': 'GeometryCollection', + 'geometries': [] + }); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONGeometryCollection} GeoJSON geometry collection. + */ +ol.format.GeoJSON.writeGeometryCollectionGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.GeometryCollection); + var geometries = goog.array.map( + geometry.getGeometriesArray(), ol.format.GeoJSON.writeGeometry_); + return /** @type {GeoJSONGeometryCollection} */ ({ + 'type': 'GeometryCollection', + 'geometries': geometries + }); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONGeometry} GeoJSON geometry. + */ +ol.format.GeoJSON.writeLineStringGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + return /** @type {GeoJSONGeometry} */ ({ + 'type': 'LineString', + 'coordinates': geometry.getCoordinates() + }); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONGeometry} GeoJSON geometry. + */ +ol.format.GeoJSON.writeMultiLineStringGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString); + goog.asserts.assert( + geometry.getType() == ol.geom.GeometryType.MULTI_LINE_STRING); + return /** @type {GeoJSONGeometry} */ ({ + 'type': 'MultiLineString', + 'coordinates': geometry.getCoordinates() + }); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONGeometry} GeoJSON geometry. + */ +ol.format.GeoJSON.writeMultiPointGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPoint); + return /** @type {GeoJSONGeometry} */ ({ + 'type': 'MultiPoint', + 'coordinates': geometry.getCoordinates() + }); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONGeometry} GeoJSON geometry. + */ +ol.format.GeoJSON.writeMultiPolygonGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon); + return /** @type {GeoJSONGeometry} */ ({ + 'type': 'MultiPolygon', + 'coordinates': geometry.getCoordinates() + }); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONGeometry} GeoJSON geometry. + */ +ol.format.GeoJSON.writePointGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + return /** @type {GeoJSONGeometry} */ ({ + 'type': 'Point', + 'coordinates': geometry.getCoordinates() + }); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONGeometry} GeoJSON geometry. + */ +ol.format.GeoJSON.writePolygonGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + return /** @type {GeoJSONGeometry} */ ({ + 'type': 'Polygon', + 'coordinates': geometry.getCoordinates() + }); +}; + + +/** + * @const + * @private + * @type {Object.} + */ +ol.format.GeoJSON.GEOMETRY_READERS_ = { + 'Point': ol.format.GeoJSON.readPointGeometry_, + 'LineString': ol.format.GeoJSON.readLineStringGeometry_, + 'Polygon': ol.format.GeoJSON.readPolygonGeometry_, + 'MultiPoint': ol.format.GeoJSON.readMultiPointGeometry_, + 'MultiLineString': ol.format.GeoJSON.readMultiLineStringGeometry_, + 'MultiPolygon': ol.format.GeoJSON.readMultiPolygonGeometry_, + 'GeometryCollection': ol.format.GeoJSON.readGeometryCollectionGeometry_ +}; + + +/** + * @const + * @private + * @type {Object.} + */ +ol.format.GeoJSON.GEOMETRY_WRITERS_ = { + 'Point': ol.format.GeoJSON.writePointGeometry_, + 'LineString': ol.format.GeoJSON.writeLineStringGeometry_, + 'Polygon': ol.format.GeoJSON.writePolygonGeometry_, + 'MultiPoint': ol.format.GeoJSON.writeMultiPointGeometry_, + 'MultiLineString': ol.format.GeoJSON.writeMultiLineStringGeometry_, + 'MultiPolygon': ol.format.GeoJSON.writeMultiPolygonGeometry_, + 'GeometryCollection': ol.format.GeoJSON.writeGeometryCollectionGeometry_, + 'Circle': ol.format.GeoJSON.writeEmptyGeometryCollectionGeometry_ +}; + + +/** + * @inheritDoc + */ +ol.format.GeoJSON.prototype.getExtensions = function() { + return ol.format.GeoJSON.EXTENSIONS_; +}; + + +/** + * @inheritDoc + */ +ol.format.GeoJSON.prototype.readFeatureFromObject = function(object) { + var geoJSONFeature = /** @type {GeoJSONFeature} */ (object); + goog.asserts.assert(geoJSONFeature.type == 'Feature'); + var geometry = ol.format.GeoJSON.readGeometry_(geoJSONFeature.geometry); + var feature = new ol.Feature(geometry); + if (goog.isDef(geoJSONFeature.id)) { + feature.setId(geoJSONFeature.id); + } + if (goog.isDef(geoJSONFeature.properties)) { + feature.setValues(geoJSONFeature.properties); + } + return feature; +}; + + +/** + * @inheritDoc + */ +ol.format.GeoJSON.prototype.readFeaturesFromObject = function(object) { + var geoJSONObject = /** @type {GeoJSONObject} */ (object); + if (geoJSONObject.type == 'Feature') { + return [this.readFeatureFromObject(object)]; + } else if (geoJSONObject.type == 'FeatureCollection') { + var geoJSONFeatureCollection = /** @type {GeoJSONFeatureCollection} */ + (object); + /** @type {Array.} */ + var features = []; + var geoJSONFeatures = geoJSONFeatureCollection.features; + var i, ii; + for (i = 0, ii = geoJSONFeatures.length; i < ii; ++i) { + features.push(this.readFeatureFromObject(geoJSONFeatures[i])); + } + return features; + } else { + goog.asserts.fail(); + return []; + } +}; + + +/** + * @inheritDoc + */ +ol.format.GeoJSON.prototype.readGeometryFromObject = function(object) { + return ol.format.GeoJSON.readGeometry_( + /** @type {GeoJSONGeometry} */ (object)); +}; + + +/** + * @inheritDoc + */ +ol.format.GeoJSON.prototype.readProjection = function(object) { + var geoJSONObject = /** @type {GeoJSONObject} */ (object); + var crs = geoJSONObject.crs; + if (goog.isDefAndNotNull(crs)) { + if (crs.type == 'name') { + return ol.proj.get(crs.properties.name); + } else if (crs.type == 'EPSG') { + // 'EPSG' is not part of the GeoJSON specification, but is generated by + // GeoServer. + // TODO: remove this when http://jira.codehaus.org/browse/GEOS-5996 + // is fixed and widely deployed. + return ol.proj.get('EPSG:' + crs.properties.code); + } else { + goog.asserts.fail(); + return null; + } + } else { + return this.defaultProjection_; + } +}; + + +/** + * @inheritDoc + */ +ol.format.GeoJSON.prototype.writeFeatureObject = function(feature) { + var object = { + 'type': 'Feature' + }; + var id = feature.getId(); + if (goog.isDefAndNotNull(id)) { + goog.object.set(object, 'id', id); + } + var geometry = feature.getGeometry(); + if (goog.isDefAndNotNull(geometry)) { + goog.object.set( + object, 'geometry', ol.format.GeoJSON.writeGeometry_(geometry)); + } + var properties = feature.getProperties(); + goog.object.remove(properties, 'geometry'); + if (!goog.object.isEmpty(properties)) { + goog.object.set(object, 'properties', properties); + } + return object; +}; + + +/** + * @inheritDoc + */ +ol.format.GeoJSON.prototype.writeFeaturesObject = function(features) { + var objects = []; + var i, ii; + for (i = 0, ii = features.length; i < ii; ++i) { + objects.push(this.writeFeatureObject(features[i])); + } + return /** @type {GeoJSONFeatureCollection} */ ({ + 'type': 'FeatureCollection', + 'features': objects + }); +}; + + +/** + * @inheritDoc + */ +ol.format.GeoJSON.prototype.writeGeometryObject = + ol.format.GeoJSON.writeGeometry_; diff --git a/float-no-zero/ol/ol/format/gmlformat.js b/float-no-zero/ol/ol/format/gmlformat.js new file mode 100644 index 0000000000..0eaeabf093 --- /dev/null +++ b/float-no-zero/ol/ol/format/gmlformat.js @@ -0,0 +1,1632 @@ +goog.provide('ol.format.GML'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.NodeType'); +goog.require('goog.object'); +goog.require('goog.string'); +goog.require('ol.Feature'); +goog.require('ol.extent'); +goog.require('ol.format.XMLFeature'); +goog.require('ol.format.XSD'); +goog.require('ol.geom.Geometry'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.LinearRing'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.MultiPoint'); +goog.require('ol.geom.MultiPolygon'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.Polygon'); +goog.require('ol.proj'); +goog.require('ol.xml'); + + + +/** + * @constructor + * @param {olx.format.GMLOptions=} opt_options + * Optional configuration object. + * @extends {ol.format.XMLFeature} + * @todo stability experimental + */ +ol.format.GML = function(opt_options) { + var options = /** @type {olx.format.GMLOptions} */ + (goog.isDef(opt_options) ? opt_options : {}); + + /** + * @private + * @type {string} + */ + this.featureType_ = options.featureType; + + /** + * @private + * @type {string} + */ + this.featureNS_ = options.featureNS; + + /** + * @private + * @type {string} + */ + this.srsName_ = options.srsName; + + /** + * @private + * @type {boolean} + */ + this.surface_ = goog.isDef(options.surface) ? + options.surface : false; + + /** + * @private + * @type {boolean} + */ + this.curve_ = goog.isDef(options.curve) ? + options.curve : false; + + /** + * @private + * @type {boolean} + */ + this.multiCurve_ = goog.isDef(options.multiCurve) ? + options.multiCurve : true; + + /** + * @private + * @type {boolean} + */ + this.multiSurface_ = goog.isDef(options.multiSurface) ? + options.multiSurface : true; + + /** + * @private + * @type {string} + */ + this.schemaLocation_ = goog.isDef(options.schemaLocation) ? + options.schemaLocation : ol.format.GML.schemaLocation_; + + goog.base(this); +}; +goog.inherits(ol.format.GML, ol.format.XMLFeature); + + +/** + * @const + * @type {string} + * @private + */ +ol.format.GML.schemaLocation_ = 'http://www.opengis.net/gml ' + + 'http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/' + + '1.0.0/gmlsf.xsd'; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @return {Array.} Features. + * @private + */ +ol.format.GML.readFeatures_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + var localName = ol.xml.getLocalName(node); + var context = objectStack[0]; + goog.asserts.assert(goog.isObject(context)); + var featureType = goog.object.get(context, 'featureType'); + var features; + if (localName == 'FeatureCollection') { + features = ol.xml.pushParseAndPop(null, + ol.format.GML.FEATURE_COLLECTION_PARSERS_, node, objectStack); + } else if (localName == 'featureMembers') { + var parsers = {}; + var parsersNS = {}; + parsers[featureType] = ol.xml.makeArrayPusher(ol.format.GML.readFeature_); + parsersNS[goog.object.get(context, 'featureNS')] = parsers; + features = ol.xml.pushParseAndPop([], parsersNS, node, objectStack); + } + if (!goog.isDef(features)) { + features = []; + } + return features; +}; + + +/** + * @type {Object.>} + * @private + */ +ol.format.GML.FEATURE_COLLECTION_PARSERS_ = { + 'http://www.opengis.net/gml': { + 'featureMembers': ol.xml.makeReplacer(ol.format.GML.readFeatures_) + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @return {ol.geom.Geometry|undefined} Geometry. + * @private + */ +ol.format.GML.readGeometry_ = function(node, objectStack) { + var context = objectStack[0]; + goog.asserts.assert(goog.isObject(context)); + goog.object.set(context, 'srsName', + node.firstElementChild.getAttribute('srsName')); + var geometry = ol.xml.pushParseAndPop(/** @type {ol.geom.Geometry} */(null), + ol.format.GML.GEOMETRY_PARSERS_, node, objectStack); + if (goog.isDefAndNotNull(geometry)) { + return geometry; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @return {ol.Feature} Feature. + * @private + */ +ol.format.GML.readFeature_ = function(node, objectStack) { + var n; + var fid = node.getAttribute('fid') || + ol.xml.getAttributeNS(node, 'http://www.opengis.net/gml', 'id'); + var values = {}, geometryName; + for (n = node.firstElementChild; !goog.isNull(n); + n = n.nextElementSibling) { + // Assume attribute elements have one child node and that the child + // is a text node. Otherwise assume it is a geometry node. + if (n.childNodes.length === 0 || + (n.childNodes.length === 1 && + n.firstChild.nodeType === 3)) { + var value = ol.xml.getAllTextContent(n, false); + if (goog.string.isEmpty(value)) { + value = undefined; + } + values[ol.xml.getLocalName(n)] = value; + } else { + geometryName = ol.xml.getLocalName(n); + values[geometryName] = ol.format.GML.readGeometry_(n, objectStack); + } + } + var feature = new ol.Feature(values); + if (goog.isDef(geometryName)) { + feature.setGeometryName(geometryName); + } + if (fid) { + feature.setId(fid); + } + return feature; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.Point|undefined} Point. + */ +ol.format.GML.readPoint_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Point'); + var flatCoordinates = + ol.format.GML.readFlatCoordinatesFromNode_(node, objectStack); + if (goog.isDefAndNotNull(flatCoordinates)) { + var point = new ol.geom.Point(null); + goog.asserts.assert(flatCoordinates.length == 3); + point.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return point; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.MultiPoint|undefined} MultiPoint. + */ +ol.format.GML.readMultiPoint_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'MultiPoint'); + var coordinates = ol.xml.pushParseAndPop( + /** @type {Array.>} */ ([]), + ol.format.GML.MULTIPOINT_PARSERS_, node, objectStack); + if (goog.isDef(coordinates)) { + return new ol.geom.MultiPoint(coordinates); + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.MultiLineString|undefined} MultiLineString. + */ +ol.format.GML.readMultiLineString_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'MultiLineString'); + var lineStrings = ol.xml.pushParseAndPop( + /** @type {Array.} */ ([]), + ol.format.GML.MULTILINESTRING_PARSERS_, node, objectStack); + if (goog.isDef(lineStrings)) { + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setLineStrings(lineStrings); + return multiLineString; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.MultiLineString|undefined} MultiLineString. + */ +ol.format.GML.readMultiCurve_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'MultiCurve'); + var lineStrings = ol.xml.pushParseAndPop( + /** @type {Array.} */ ([]), + ol.format.GML.MULTICURVE_PARSERS_, node, objectStack); + if (goog.isDef(lineStrings)) { + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setLineStrings(lineStrings); + return multiLineString; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.MultiPolygon|undefined} MultiPolygon. + */ +ol.format.GML.readMultiSurface_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'MultiSurface'); + var polygons = ol.xml.pushParseAndPop( + /** @type {Array.} */ ([]), + ol.format.GML.MULTISURFACE_PARSERS_, node, objectStack); + if (goog.isDef(polygons)) { + var multiPolygon = new ol.geom.MultiPolygon(null); + multiPolygon.setPolygons(polygons); + return multiPolygon; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.MultiPolygon|undefined} MultiPolygon. + */ +ol.format.GML.readMultiPolygon_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'MultiPolygon'); + var polygons = ol.xml.pushParseAndPop( + /** @type {Array.} */ ([]), + ol.format.GML.MULTIPOLYGON_PARSERS_, node, objectStack); + if (goog.isDef(polygons)) { + var multiPolygon = new ol.geom.MultiPolygon(null); + multiPolygon.setPolygons(polygons); + return multiPolygon; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GML.pointMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'pointMember' || + node.localName == 'pointMembers'); + ol.xml.parse(ol.format.GML.POINTMEMBER_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GML.lineStringMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'lineStringMember' || + node.localName == 'lineStringMembers'); + ol.xml.parse(ol.format.GML.LINESTRINGMEMBER_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GML.curveMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'curveMember' || + node.localName == 'curveMembers'); + ol.xml.parse(ol.format.GML.CURVEMEMBER_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GML.surfaceMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'surfaceMember' || + node.localName == 'surfaceMembers'); + ol.xml.parse(ol.format.GML.SURFACEMEMBER_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GML.polygonMemberParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'polygonMember' || + node.localName == 'polygonMembers'); + ol.xml.parse(ol.format.GML.POLYGONMEMBER_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.LineString|undefined} LineString. + */ +ol.format.GML.readLineString_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'LineString'); + var flatCoordinates = + ol.format.GML.readFlatCoordinatesFromNode_(node, objectStack); + if (goog.isDefAndNotNull(flatCoordinates)) { + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return lineString; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.<(Array.)>|undefined} flat coordinates. + */ +ol.format.GML.readPatch_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'patches'); + return ol.xml.pushParseAndPop( + /** @type {Array.>} */ ([null]), + ol.format.GML.PATCHES_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.|undefined} flat coordinates. + */ +ol.format.GML.readSegment_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'segments'); + return ol.xml.pushParseAndPop( + /** @type {Array.} */ ([null]), + ol.format.GML.SEGMENTS_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.<(Array.)>|undefined} flat coordinates. + */ +ol.format.GML.readPolygonPatch_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'PolygonPatch'); + return ol.xml.pushParseAndPop( + /** @type {Array.>} */ ([null]), + ol.format.GML.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.|undefined} flat coordinates. + */ +ol.format.GML.readLineStringSegment_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'LineStringSegment'); + return ol.xml.pushParseAndPop( + /** @type {Array.} */ ([null]), + ol.format.GML.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GML.interiorParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'interior'); + var flatLinearRing = ol.xml.pushParseAndPop( + /** @type {Array.|undefined} */ (undefined), + ol.format.GML.RING_PARSERS_, node, objectStack); + if (goog.isDef(flatLinearRing)) { + var flatLinearRings = /** @type {Array.>} */ + (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(flatLinearRings)); + goog.asserts.assert(flatLinearRings.length > 0); + flatLinearRings.push(flatLinearRing); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GML.exteriorParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'exterior'); + var flatLinearRing = ol.xml.pushParseAndPop( + /** @type {Array.|undefined} */ (undefined), + ol.format.GML.RING_PARSERS_, node, objectStack); + if (goog.isDef(flatLinearRing)) { + var flatLinearRings = /** @type {Array.>} */ + (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(flatLinearRings)); + goog.asserts.assert(flatLinearRings.length > 0); + flatLinearRings[0] = flatLinearRing; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.|undefined} LinearRing flat coordinates. + */ +ol.format.GML.readFlatLinearRing_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'LinearRing'); + var ring = ol.xml.pushParseAndPop(/** @type {Array.} */(null), + ol.format.GML.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack); + if (goog.isDefAndNotNull(ring)) { + return ring; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.LinearRing|undefined} LinearRing. + */ +ol.format.GML.readLinearRing_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'LinearRing'); + var flatCoordinates = + ol.format.GML.readFlatCoordinatesFromNode_(node, objectStack); + if (goog.isDef(flatCoordinates)) { + var ring = new ol.geom.LinearRing(null); + ring.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return ring; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.Polygon|undefined} Polygon. + */ +ol.format.GML.readPolygon_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Polygon'); + var flatLinearRings = ol.xml.pushParseAndPop( + /** @type {Array.>} */ ([null]), + ol.format.GML.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack); + if (goog.isDef(flatLinearRings) && + !goog.isNull(flatLinearRings[0])) { + var polygon = new ol.geom.Polygon(null); + var flatCoordinates = flatLinearRings[0]; + var ends = [flatCoordinates.length]; + var i, ii; + for (i = 1, ii = flatLinearRings.length; i < ii; ++i) { + goog.array.extend(flatCoordinates, flatLinearRings[i]); + ends.push(flatCoordinates.length); + } + polygon.setFlatCoordinates( + ol.geom.GeometryLayout.XYZ, flatCoordinates, ends); + return polygon; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.Polygon|undefined} Polygon. + */ +ol.format.GML.readSurface_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Surface'); + var flatLinearRings = ol.xml.pushParseAndPop( + /** @type {Array.>} */ ([null]), + ol.format.GML.SURFACE_PARSERS_, node, objectStack); + if (goog.isDef(flatLinearRings) && + !goog.isNull(flatLinearRings[0])) { + var polygon = new ol.geom.Polygon(null); + var flatCoordinates = flatLinearRings[0]; + var ends = [flatCoordinates.length]; + var i, ii; + for (i = 1, ii = flatLinearRings.length; i < ii; ++i) { + goog.array.extend(flatCoordinates, flatLinearRings[i]); + ends.push(flatCoordinates.length); + } + polygon.setFlatCoordinates( + ol.geom.GeometryLayout.XYZ, flatCoordinates, ends); + return polygon; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.LineString|undefined} LineString. + */ +ol.format.GML.readCurve_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Curve'); + var flatCoordinates = ol.xml.pushParseAndPop( + /** @type {Array.} */ ([null]), + ol.format.GML.CURVE_PARSERS_, node, objectStack); + if (goog.isDef(flatCoordinates)) { + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return lineString; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.Extent|undefined} Envelope. + */ +ol.format.GML.readEnvelope_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Envelope'); + var flatCoordinates = ol.xml.pushParseAndPop( + /** @type {Array.} */ ([null]), + ol.format.GML.ENVELOPE_PARSERS_, node, objectStack); + return ol.extent.createOrUpdate(flatCoordinates[1][0], + flatCoordinates[1][1], flatCoordinates[2][0], + flatCoordinates[2][1]); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.} Flat coordinates. + */ +ol.format.GML.readFlatCoordinatesFromNode_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + return /** @type {Array.} */ (ol.xml.pushParseAndPop( + null, + ol.format.GML.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack)); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.|undefined} Flat coordinates. + */ +ol.format.GML.readFlatPos_ = function(node, objectStack) { + var s = ol.xml.getAllTextContent(node, false).replace(/^\s*|\s*$/g, ''); + var flatCoordinates = goog.array.map(s.split(/\s+/), parseFloat); + var context = objectStack[0]; + goog.asserts.assert(goog.isObject(context)); + var containerSrs = goog.object.get(context, 'srsName'); + var axisOrientation = 'enu'; + if (!goog.isNull(containerSrs)) { + var proj = ol.proj.get(containerSrs); + axisOrientation = proj.getAxisOrientation(); + } + if (axisOrientation === 'neu') { + flatCoordinates = flatCoordinates.reverse(); + } + var len = flatCoordinates.length; + if (len == 2) { + flatCoordinates.push(0); + } + if (len === 0) { + return undefined; + } + return flatCoordinates; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.|undefined} Flat coordinates. + */ +ol.format.GML.readFlatPosList_ = function(node, objectStack) { + var s = ol.xml.getAllTextContent(node, false).replace(/^\s*|\s*$/g, ''); + var context = objectStack[0]; + goog.asserts.assert(goog.isObject(context)); + var containerSrs = goog.object.get(context, 'srsName'); + var containerDimension = node.parentNode.getAttribute('srsDimension'); + var axisOrientation = 'enu'; + if (!goog.isNull(containerSrs)) { + var proj = ol.proj.get(containerSrs); + axisOrientation = proj.getAxisOrientation(); + } + var coords = s.split(/\s+/); + // The "dimension" attribute is from the GML 3.0.1 spec. + var dim = 2; + if (!goog.isNull(node.getAttribute('srsDimension'))) { + dim = ol.format.XSD.readNonNegativeIntegerString( + node.getAttribute('srsDimension')); + } else if (!goog.isNull(node.getAttribute('dimension'))) { + dim = ol.format.XSD.readNonNegativeIntegerString( + node.getAttribute('dimension')); + } else if (!goog.isNull(containerDimension)) { + dim = ol.format.XSD.readNonNegativeIntegerString(containerDimension); + } + var x, y, z; + var flatCoordinates = []; + for (var i = 0, ii = coords.length; i < ii; i += dim) { + x = parseFloat(coords[i]); + y = parseFloat(coords[i + 1]); + z = (dim === 3) ? parseFloat(coords[i + 2]) : 0; + if (axisOrientation.substr(0, 2) === 'en') { + flatCoordinates.push(x, y, z); + } else { + flatCoordinates.push(y, x, z); + } + } + return flatCoordinates; +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.GEOMETRY_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'Point': ol.xml.makeReplacer(ol.format.GML.readPoint_), + 'MultiPoint': ol.xml.makeReplacer(ol.format.GML.readMultiPoint_), + 'LineString': ol.xml.makeReplacer(ol.format.GML.readLineString_), + 'MultiLineString': ol.xml.makeReplacer( + ol.format.GML.readMultiLineString_), + 'LinearRing' : ol.xml.makeReplacer(ol.format.GML.readLinearRing_), + 'Polygon': ol.xml.makeReplacer(ol.format.GML.readPolygon_), + 'MultiPolygon': ol.xml.makeReplacer(ol.format.GML.readMultiPolygon_), + 'Surface': ol.xml.makeReplacer(ol.format.GML.readSurface_), + 'MultiSurface': ol.xml.makeReplacer(ol.format.GML.readMultiSurface_), + 'Curve': ol.xml.makeReplacer(ol.format.GML.readCurve_), + 'MultiCurve': ol.xml.makeReplacer(ol.format.GML.readMultiCurve_), + 'Envelope': ol.xml.makeReplacer(ol.format.GML.readEnvelope_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.GEOMETRY_FLAT_COORDINATES_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'pos': ol.xml.makeReplacer(ol.format.GML.readFlatPos_), + 'posList': ol.xml.makeReplacer(ol.format.GML.readFlatPosList_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.FLAT_LINEAR_RINGS_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'interior': ol.format.GML.interiorParser_, + 'exterior': ol.format.GML.exteriorParser_ + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.MULTIPOINT_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'pointMember': ol.xml.makeArrayPusher(ol.format.GML.pointMemberParser_), + 'pointMembers': ol.xml.makeArrayPusher(ol.format.GML.pointMemberParser_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.MULTILINESTRING_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'lineStringMember': ol.xml.makeArrayPusher( + ol.format.GML.lineStringMemberParser_), + 'lineStringMembers': ol.xml.makeArrayPusher( + ol.format.GML.lineStringMemberParser_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.MULTICURVE_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'curveMember': ol.xml.makeArrayPusher( + ol.format.GML.curveMemberParser_), + 'curveMembers': ol.xml.makeArrayPusher( + ol.format.GML.curveMemberParser_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.MULTISURFACE_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'surfaceMember': ol.xml.makeArrayPusher( + ol.format.GML.surfaceMemberParser_), + 'surfaceMembers': ol.xml.makeArrayPusher( + ol.format.GML.surfaceMemberParser_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.MULTIPOLYGON_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'polygonMember': ol.xml.makeArrayPusher( + ol.format.GML.polygonMemberParser_), + 'polygonMembers': ol.xml.makeArrayPusher( + ol.format.GML.polygonMemberParser_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.POINTMEMBER_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'Point': ol.xml.makeArrayPusher( + ol.format.GML.readFlatCoordinatesFromNode_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.LINESTRINGMEMBER_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'LineString': ol.xml.makeArrayPusher( + ol.format.GML.readLineString_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.CURVEMEMBER_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'LineString': ol.xml.makeArrayPusher(ol.format.GML.readLineString_), + 'Curve': ol.xml.makeArrayPusher(ol.format.GML.readCurve_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.SURFACEMEMBER_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'Polygon': ol.xml.makeArrayPusher(ol.format.GML.readPolygon_), + 'Surface': ol.xml.makeArrayPusher(ol.format.GML.readSurface_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.POLYGONMEMBER_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'Polygon': ol.xml.makeArrayPusher( + ol.format.GML.readPolygon_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.SURFACE_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'patches': ol.xml.makeReplacer(ol.format.GML.readPatch_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.CURVE_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'segments': ol.xml.makeReplacer(ol.format.GML.readSegment_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.ENVELOPE_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'lowerCorner': ol.xml.makeArrayPusher(ol.format.GML.readFlatPosList_), + 'upperCorner': ol.xml.makeArrayPusher(ol.format.GML.readFlatPosList_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.PATCHES_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'PolygonPatch': ol.xml.makeReplacer(ol.format.GML.readPolygonPatch_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.SEGMENTS_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'LineStringSegment': ol.xml.makeReplacer( + ol.format.GML.readLineStringSegment_) + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML.RING_PARSERS_ = { + 'http://www.opengis.net/gml' : { + 'LinearRing': ol.xml.makeReplacer(ol.format.GML.readFlatLinearRing_) + } +}; + + +/** + * @inheritDoc + */ +ol.format.GML.prototype.readGeometryFromNode = function(node) { + var geometry = ol.format.GML.readGeometry_(node, [{}]); + return (goog.isDef(geometry)) ? geometry : null; +}; + + +/** + * @inheritDoc + */ +ol.format.GML.prototype.readFeaturesFromNode = function(node) { + var objectStack = [{ + 'featureType': this.featureType_, + 'featureNS': this.featureNS_ + }]; + return ol.format.GML.readFeatures_(node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Point} value Point geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writePos_ = function(node, value, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + var axisOrientation = 'enu'; + if (goog.isDefAndNotNull(srsName)) { + axisOrientation = ol.proj.get(srsName).getAxisOrientation(); + } + var point = value.getCoordinates(); + var coords; + // only 2d for simple features profile + if (axisOrientation.substr(0, 2) === 'en') { + coords = (point[0] + ' ' + point[1]); + } else { + coords = (point[1] + ' ' + point[0]); + } + ol.format.XSD.writeStringTextNode(node, coords); +}; + + +/** + * @param {Array.} point Point geometry. + * @param {string=} opt_srsName Optional srsName + * @return {string} + * @private + */ +ol.format.GML.getCoords_ = function(point, opt_srsName) { + var axisOrientation = 'enu'; + if (goog.isDefAndNotNull(opt_srsName)) { + axisOrientation = ol.proj.get(opt_srsName).getAxisOrientation(); + } + return ((axisOrientation.substr(0, 2) === 'en') ? + point[0] + ' ' + point[1] : + point[1] + ' ' + point[0]); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LineString|ol.geom.LinearRing} value Geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writePosList_ = function(node, value, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + // only 2d for simple features profile + var points = value.getCoordinates(); + var len = points.length; + var parts = new Array(len); + var point; + for (var i = 0; i < len; ++i) { + point = points[i]; + parts[i] = ol.format.GML.getCoords_(point, srsName); + } + ol.format.XSD.writeStringTextNode(node, parts.join(' ')); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Point} geometry Point geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writePoint_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + if (goog.isDefAndNotNull(srsName)) { + node.setAttribute('srsName', srsName); + } + var pos = ol.xml.createElementNS(node.namespaceURI, 'pos'); + node.appendChild(pos); + ol.format.GML.writePos_(pos, geometry, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LinearRing} geometry LinearRing geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeLinearRing_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + if (goog.isDefAndNotNull(srsName)) { + node.setAttribute('srsName', srsName); + } + var posList = ol.xml.createElementNS(node.namespaceURI, 'posList'); + node.appendChild(posList); + ol.format.GML.writePosList_(posList, geometry, objectStack); +}; + + +/** + * @param {*} value Value. + * @param {Array.<*>} objectStack Object stack. + * @param {string=} opt_nodeName Node name. + * @return {Node} Node. + * @private + */ +ol.format.GML.RING_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { + var context = objectStack[objectStack.length - 1]; + var parentNode = context.node; + goog.asserts.assert(goog.isObject(context)); + var exteriorWritten = goog.object.get(context, 'exteriorWritten'); + if (!goog.isDef(exteriorWritten)) { + goog.object.set(context, 'exteriorWritten', true); + } + return ol.xml.createElementNS(parentNode.namespaceURI, + goog.isDef(exteriorWritten) ? 'interior' : 'exterior'); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Polygon} geometry Polygon geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeSurfaceOrPolygon_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + if (node.nodeName !== 'PolygonPatch' && goog.isDefAndNotNull(srsName)) { + node.setAttribute('srsName', srsName); + } + if (node.nodeName === 'Polygon' || node.nodeName === 'PolygonPatch') { + var rings = geometry.getLinearRings(); + ol.xml.pushSerializeAndPop( + {node: node, srsName: srsName}, + ol.format.GML.RING_SERIALIZERS_, ol.format.GML.RING_NODE_FACTORY_, + rings, objectStack); + } else if (node.nodeName === 'Surface') { + var patches = ol.xml.createElementNS(node.namespaceURI, 'patches'); + node.appendChild(patches); + ol.format.GML.writeSurfacePatches_(patches, geometry, objectStack); + } +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LineString} geometry LineString geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeCurveOrLineString_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + if (node.nodeName !== 'LineStringSegment' && goog.isDefAndNotNull(srsName)) { + node.setAttribute('srsName', srsName); + } + if (node.nodeName === 'LineString' || node.nodeName === 'LineStringSegment') { + var posList = ol.xml.createElementNS(node.namespaceURI, 'posList'); + node.appendChild(posList); + ol.format.GML.writePosList_(posList, geometry, objectStack); + } else if (node.nodeName === 'Curve') { + var segments = ol.xml.createElementNS(node.namespaceURI, 'segments'); + node.appendChild(segments); + ol.format.GML.writeCurveSegments_(segments, geometry, objectStack); + } +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.MultiPolygon} geometry MultiPolygon geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeMultiSurfaceOrPolygon_ = function(node, geometry, + objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + var surface = goog.object.get(context, 'surface'); + if (goog.isDefAndNotNull(srsName)) { + node.setAttribute('srsName', srsName); + } + var polygons = geometry.getPolygons(); + ol.xml.pushSerializeAndPop({node: node, srsName: srsName, surface: surface}, + ol.format.GML.SURFACEORPOLYGONMEMBER_SERIALIZERS_, + ol.format.GML.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, polygons, + objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.MultiPoint} geometry MultiPoint geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeMultiPoint_ = function(node, geometry, + objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + if (goog.isDefAndNotNull(srsName)) { + node.setAttribute('srsName', srsName); + } + var points = geometry.getPoints(); + ol.xml.pushSerializeAndPop({node: node, srsName: srsName}, + ol.format.GML.POINTMEMBER_SERIALIZERS_, + ol.xml.makeSimpleNodeFactory('pointMember'), points, + objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.MultiLineString} geometry MultiLineString geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeMultiCurveOrLineString_ = function(node, geometry, + objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + var curve = goog.object.get(context, 'curve'); + if (goog.isDefAndNotNull(srsName)) { + node.setAttribute('srsName', srsName); + } + var lines = geometry.getLineStrings(); + ol.xml.pushSerializeAndPop({node: node, srsName: srsName, curve: curve}, + ol.format.GML.LINESTRINGORCURVEMEMBER_SERIALIZERS_, + ol.format.GML.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, lines, + objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LinearRing} ring LinearRing geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeRing_ = function(node, ring, objectStack) { + var linearRing = ol.xml.createElementNS(node.namespaceURI, 'LinearRing'); + node.appendChild(linearRing); + ol.format.GML.writeLinearRing_(linearRing, ring, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Polygon} polygon Polygon geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeSurfaceOrPolygonMember_ = function(node, polygon, + objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var child = ol.format.GML.GEOMETRY_NODE_FACTORY_(polygon, objectStack); + if (goog.isDef(child)) { + node.appendChild(child); + ol.format.GML.writeSurfaceOrPolygon_(child, polygon, objectStack); + } +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Point} point Point geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writePointMember_ = function(node, point, objectStack) { + var child = ol.xml.createElementNS(node.namespaceURI, 'Point'); + node.appendChild(child); + ol.format.GML.writePoint_(child, point, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LineString} line LineString geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeLineStringOrCurveMember_ = function(node, line, + objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var child = ol.format.GML.GEOMETRY_NODE_FACTORY_(line, objectStack); + if (goog.isDef(child)) { + node.appendChild(child); + ol.format.GML.writeCurveOrLineString_(child, line, objectStack); + } +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Polygon} polygon Polygon geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeSurfacePatches_ = function(node, polygon, objectStack) { + var child = ol.xml.createElementNS(node.namespaceURI, 'PolygonPatch'); + node.appendChild(child); + ol.format.GML.writeSurfaceOrPolygon_(child, polygon, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LineString} line LineString geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeCurveSegments_ = function(node, line, objectStack) { + var child = ol.xml.createElementNS(node.namespaceURI, 'LineStringSegment'); + node.appendChild(child); + ol.format.GML.writeCurveOrLineString_(child, line, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeGeometry_ = function(node, geometry, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var item = goog.object.clone(context); + item.node = node; + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ + (item), ol.format.GML.GEOMETRY_SERIALIZERS_, + ol.format.GML.GEOMETRY_NODE_FACTORY_, [geometry], objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.Feature} feature Feature. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeFeature_ = function(node, feature, objectStack) { + var fid = feature.getId(); + if (goog.isDef(fid)) { + node.setAttribute('fid', fid); + } + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var featureNS = goog.object.get(context, 'featureNS'); + var geometryName = feature.getGeometryName(); + if (!goog.isDef(context.serializers)) { + context.serializers = {}; + context.serializers[featureNS] = {}; + } + var properties = feature.getProperties(); + var keys = [], values = []; + for (var key in properties) { + keys.push(key); + values.push(properties[key]); + if (key == geometryName) { + if (!(key in context.serializers[featureNS])) { + context.serializers[featureNS][key] = ol.xml.makeChildAppender( + ol.format.GML.writeGeometry_); + } + } else { + if (!(key in context.serializers[featureNS])) { + context.serializers[featureNS][key] = ol.xml.makeChildAppender( + ol.format.XSD.writeStringTextNode); + } + } + } + var item = goog.object.clone(context); + item.node = node; + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ + (item), context.serializers, + ol.xml.OBJECT_PROPERTY_NODE_FACTORY, + values, + objectStack, keys); +}; + + +/** + * @param {Node} node Node. + * @param {Array.} features Features. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML.writeFeatureMembers_ = function(node, features, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var featureType = goog.object.get(context, 'featureType'); + var featureNS = goog.object.get(context, 'featureNS'); + var serializers = {}; + serializers[featureNS] = {}; + serializers[featureNS][featureType] = ol.xml.makeChildAppender( + ol.format.GML.writeFeature_); + var item = goog.object.clone(context); + item.node = node; + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ + (item), + serializers, + ol.xml.makeSimpleNodeFactory(featureType, featureNS), features, + objectStack); +}; + + +/** + * @type {Object.>} + * @private + */ +ol.format.GML.SURFACEORPOLYGONMEMBER_SERIALIZERS_ = { + 'http://www.opengis.net/gml': { + 'surfaceMember': ol.xml.makeChildAppender( + ol.format.GML.writeSurfaceOrPolygonMember_), + 'polygonMember': ol.xml.makeChildAppender( + ol.format.GML.writeSurfaceOrPolygonMember_) + } +}; + + +/** + * @type {Object.>} + * @private + */ +ol.format.GML.POINTMEMBER_SERIALIZERS_ = { + 'http://www.opengis.net/gml': { + 'pointMember': ol.xml.makeChildAppender(ol.format.GML.writePointMember_) + } +}; + + +/** + * @type {Object.>} + * @private + */ +ol.format.GML.LINESTRINGORCURVEMEMBER_SERIALIZERS_ = { + 'http://www.opengis.net/gml': { + 'lineStringMember': ol.xml.makeChildAppender( + ol.format.GML.writeLineStringOrCurveMember_), + 'curveMember': ol.xml.makeChildAppender( + ol.format.GML.writeLineStringOrCurveMember_) + } +}; + + +/** + * @type {Object.>} + * @private + */ +ol.format.GML.RING_SERIALIZERS_ = { + 'http://www.opengis.net/gml': { + 'exterior': ol.xml.makeChildAppender(ol.format.GML.writeRing_), + 'interior': ol.xml.makeChildAppender(ol.format.GML.writeRing_) + } +}; + + +/** + * @type {Object.>} + * @private + */ +ol.format.GML.GEOMETRY_SERIALIZERS_ = { + 'http://www.opengis.net/gml': { + 'Curve': ol.xml.makeChildAppender(ol.format.GML.writeCurveOrLineString_), + 'MultiCurve': ol.xml.makeChildAppender( + ol.format.GML.writeMultiCurveOrLineString_), + 'Point': ol.xml.makeChildAppender(ol.format.GML.writePoint_), + 'MultiPoint': ol.xml.makeChildAppender(ol.format.GML.writeMultiPoint_), + 'LineString': ol.xml.makeChildAppender( + ol.format.GML.writeCurveOrLineString_), + 'MultiLineString': ol.xml.makeChildAppender( + ol.format.GML.writeMultiCurveOrLineString_), + 'LinearRing': ol.xml.makeChildAppender(ol.format.GML.writeLinearRing_), + 'Polygon': ol.xml.makeChildAppender(ol.format.GML.writeSurfaceOrPolygon_), + 'MultiPolygon': ol.xml.makeChildAppender( + ol.format.GML.writeMultiSurfaceOrPolygon_), + 'Surface': ol.xml.makeChildAppender(ol.format.GML.writeSurfaceOrPolygon_), + 'MultiSurface': ol.xml.makeChildAppender( + ol.format.GML.writeMultiSurfaceOrPolygon_) + } +}; + + +/** + * @const + * @type {Object.} + * @private + */ +ol.format.GML.MULTIGEOMETRY_TO_MEMBER_NODENAME_ = { + 'MultiLineString': 'lineStringMember', + 'MultiCurve': 'curveMember', + 'MultiPolygon': 'polygonMember', + 'MultiSurface': 'surfaceMember' +}; + + +/** + * @const + * @param {*} value Value. + * @param {Array.<*>} objectStack Object stack. + * @param {string=} opt_nodeName Node name. + * @return {Node|undefined} Node. + * @private + */ +ol.format.GML.MULTIGEOMETRY_MEMBER_NODE_FACTORY_ = function(value, + objectStack, opt_nodeName) { + var parentNode = objectStack[objectStack.length - 1].node; + goog.asserts.assert(ol.xml.isNode(parentNode)); + return ol.xml.createElementNS('http://www.opengis.net/gml', + ol.format.GML.MULTIGEOMETRY_TO_MEMBER_NODENAME_[parentNode.nodeName]); +}; + + +/** + * @const + * @param {*} value Value. + * @param {Array.<*>} objectStack Object stack. + * @param {string=} opt_nodeName Node name. + * @return {Node|undefined} Node. + * @private + */ +ol.format.GML.GEOMETRY_NODE_FACTORY_ = function(value, objectStack, + opt_nodeName) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var multiSurface = goog.object.get(context, 'multiSurface'); + var surface = goog.object.get(context, 'surface'); + var curve = goog.object.get(context, 'curve'); + var multiCurve = goog.object.get(context, 'multiCurve'); + goog.asserts.assertInstanceof(value, ol.geom.Geometry); + var parentNode = objectStack[objectStack.length - 1].node; + goog.asserts.assert(ol.xml.isNode(parentNode)); + var nodeName = value.getType(); + if (nodeName === 'MultiPolygon' && multiSurface === true) { + nodeName = 'MultiSurface'; + } else if (nodeName === 'Polygon' && surface === true) { + nodeName = 'Surface'; + } else if (nodeName === 'LineString' && curve === true) { + nodeName = 'Curve'; + } else if (nodeName === 'MultiLineString' && multiCurve === true) { + nodeName = 'MultiCurve'; + } + return ol.xml.createElementNS('http://www.opengis.net/gml', + nodeName); +}; + + +/** + * @inheritDoc + */ +ol.format.GML.prototype.writeGeometryNode = function(geometry) { + var geom = ol.xml.createElementNS('http://www.opengis.net/gml', 'geom'); + var context = {node: geom, srsName: this.srsName_, + curve: this.curve_, surface: this.surface_, + multiSurface: this.multiSurface_, multiCurve: this.multiCurve_}; + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ + (context), ol.format.GML.GEOMETRY_SERIALIZERS_, + ol.format.GML.GEOMETRY_NODE_FACTORY_, [geometry], []); + return geom; +}; + + +/** + * @inheritDoc + */ +ol.format.GML.prototype.writeFeaturesNode = function(features) { + var node = ol.xml.createElementNS('http://www.opengis.net/gml', + 'featureMembers'); + ol.xml.setAttributeNS(node, 'http://www.w3.org/2001/XMLSchema-instance', + 'xsi:schemaLocation', this.schemaLocation_); + var context = { + srsName: this.srsName_, + curve: this.curve_, + surface: this.surface_, + multiSurface: this.multiSurface_, + multiCurve: this.multiCurve_, + featureNS: this.featureNS_, + featureType: this.featureType_ + }; + ol.format.GML.writeFeatureMembers_(node, features, [context]); + return node; +}; diff --git a/float-no-zero/ol/ol/format/gpxformat.exports b/float-no-zero/ol/ol/format/gpxformat.exports new file mode 100644 index 0000000000..82582fd4ac --- /dev/null +++ b/float-no-zero/ol/ol/format/gpxformat.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.format.GPX +@exportProperty ol.format.GPX.prototype.readFeature +@exportProperty ol.format.GPX.prototype.readFeatures diff --git a/float-no-zero/ol/ol/format/gpxformat.js b/float-no-zero/ol/ol/format/gpxformat.js new file mode 100644 index 0000000000..9217c15719 --- /dev/null +++ b/float-no-zero/ol/ol/format/gpxformat.js @@ -0,0 +1,783 @@ +goog.provide('ol.format.GPX'); +goog.provide('ol.format.GPX.V1_1'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom.NodeType'); +goog.require('goog.object'); +goog.require('ol.Feature'); +goog.require('ol.format.XMLFeature'); +goog.require('ol.format.XSD'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.Point'); +goog.require('ol.proj'); +goog.require('ol.xml'); + + + +/** + * @constructor + * @extends {ol.format.XMLFeature} + * @todo stability experimental + */ +ol.format.GPX = function() { + goog.base(this); +}; +goog.inherits(ol.format.GPX, ol.format.XMLFeature); + + +/** + * @const + * @private + * @type {Array.} + */ +ol.format.GPX.NAMESPACE_URIS_ = [ + null, + 'http://www.topografix.com/GPX/1/0', + 'http://www.topografix.com/GPX/1/1' +]; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {Node} node Node. + * @param {Object} values Values. + * @private + * @return {Array.} Flat coordinates. + */ +ol.format.GPX.appendCoordinate_ = function(flatCoordinates, node, values) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + flatCoordinates.push( + parseFloat(node.getAttribute('lon')), + parseFloat(node.getAttribute('lat'))); + if (goog.object.containsKey(values, 'ele')) { + flatCoordinates.push( + /** @type {number} */ (goog.object.get(values, 'ele'))); + goog.object.remove(values, 'ele'); + } else { + flatCoordinates.push(0); + } + if (goog.object.containsKey(values, 'time')) { + flatCoordinates.push( + /** @type {number} */ (goog.object.get(values, 'time'))); + goog.object.remove(values, 'time'); + } else { + flatCoordinates.push(0); + } + return flatCoordinates; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.parseLink_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'link'); + var values = /** @type {Object} */ (objectStack[objectStack.length - 1]); + var href = node.getAttribute('href'); + if (!goog.isNull(href)) { + goog.object.set(values, 'link', href); + } + ol.xml.parse(ol.format.GPX.LINK_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.parseRtePt_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'rtept'); + var values = ol.xml.pushParseAndPop( + {}, ol.format.GPX.RTEPT_PARSERS_, node, objectStack); + if (goog.isDef(values)) { + var rteValues = /** @type {Object} */ (objectStack[objectStack.length - 1]); + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(rteValues, 'flatCoordinates')); + ol.format.GPX.appendCoordinate_(flatCoordinates, node, values); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.parseTrkPt_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'trkpt'); + var values = ol.xml.pushParseAndPop( + {}, ol.format.GPX.TRKPT_PARSERS_, node, objectStack); + if (goog.isDef(values)) { + var trkValues = /** @type {Object} */ (objectStack[objectStack.length - 1]); + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(trkValues, 'flatCoordinates')); + ol.format.GPX.appendCoordinate_(flatCoordinates, node, values); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.parseTrkSeg_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'trkseg'); + var values = /** @type {Object} */ (objectStack[objectStack.length - 1]); + ol.xml.parse(ol.format.GPX.TRKSEG_PARSERS_, node, objectStack); + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(values, 'flatCoordinates')); + var ends = /** @type {Array.} */ (goog.object.get(values, 'ends')); + ends.push(flatCoordinates.length); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.Feature|undefined} Track. + */ +ol.format.GPX.readRte_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'rte'); + var values = ol.xml.pushParseAndPop({ + 'flatCoordinates': [] + }, ol.format.GPX.RTE_PARSERS_, node, objectStack); + if (!goog.isDef(values)) { + return undefined; + } + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(values, 'flatCoordinates')); + goog.object.remove(values, 'flatCoordinates'); + var geometry = new ol.geom.LineString(null); + geometry.setFlatCoordinates(ol.geom.GeometryLayout.XYZM, flatCoordinates); + var feature = new ol.Feature(geometry); + feature.setValues(values); + return feature; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.Feature|undefined} Track. + */ +ol.format.GPX.readTrk_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'trk'); + var values = ol.xml.pushParseAndPop({ + 'flatCoordinates': [], + 'ends': [] + }, ol.format.GPX.TRK_PARSERS_, node, objectStack); + if (!goog.isDef(values)) { + return undefined; + } + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(values, 'flatCoordinates')); + goog.object.remove(values, 'flatCoordinates'); + var ends = /** @type {Array.} */ (goog.object.get(values, 'ends')); + goog.object.remove(values, 'ends'); + var geometry = new ol.geom.MultiLineString(null); + geometry.setFlatCoordinates( + ol.geom.GeometryLayout.XYZM, flatCoordinates, ends); + var feature = new ol.Feature(geometry); + feature.setValues(values); + return feature; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.Feature|undefined} Waypoint. + */ +ol.format.GPX.readWpt_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'wpt'); + var values = ol.xml.pushParseAndPop( + {}, ol.format.GPX.WPT_PARSERS_, node, objectStack); + if (!goog.isDef(values)) { + return undefined; + } + var coordinates = ol.format.GPX.appendCoordinate_([], node, values); + var geometry = new ol.geom.Point( + coordinates, ol.geom.GeometryLayout.XYZM); + var feature = new ol.Feature(geometry); + feature.setValues(values); + return feature; +}; + + +/** + * @const + * @type {Object.): (ol.Feature|undefined)>} + * @private + */ +ol.format.GPX.FEATURE_READER_ = { + 'rte': ol.format.GPX.readRte_, + 'trk': ol.format.GPX.readTrk_, + 'wpt': ol.format.GPX.readWpt_ +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.GPX_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'rte': ol.xml.makeArrayPusher(ol.format.GPX.readRte_), + 'trk': ol.xml.makeArrayPusher(ol.format.GPX.readTrk_), + 'wpt': ol.xml.makeArrayPusher(ol.format.GPX.readWpt_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.LINK_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'text': + ol.xml.makeObjectPropertySetter(ol.format.XSD.readString, 'linkText'), + 'type': + ol.xml.makeObjectPropertySetter(ol.format.XSD.readString, 'linkType') + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.RTE_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'cmt': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'desc': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'src': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'link': ol.format.GPX.parseLink_, + 'number': + ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger), + 'type': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'rtept': ol.format.GPX.parseRtePt_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.RTEPT_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'ele': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'time': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.TRK_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'cmt': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'desc': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'src': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'link': ol.format.GPX.parseLink_, + 'number': + ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger), + 'type': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'trkseg': ol.format.GPX.parseTrkSeg_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.TRKSEG_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'trkpt': ol.format.GPX.parseTrkPt_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.TRKPT_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'ele': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'time': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.WPT_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'ele': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'time': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime), + 'magvar': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'geoidheight': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'cmt': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'desc': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'src': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'link': ol.format.GPX.parseLink_, + 'sym': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'type': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'fix': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'sat': ol.xml.makeObjectPropertySetter( + ol.format.XSD.readNonNegativeInteger), + 'hdop': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'vdop': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'pdop': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'ageofdgpsdata': + ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'dgpsid': + ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger) + }); + + +/** + * @inheritDoc + */ +ol.format.GPX.prototype.readFeatureFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if (goog.array.indexOf(ol.format.GPX.NAMESPACE_URIS_, node.namespaceURI) == + -1) { + return null; + } + var featureReader = ol.format.GPX.FEATURE_READER_[node.localName]; + if (!goog.isDef(featureReader)) { + return null; + } + var feature = featureReader(node, []); + if (!goog.isDef(feature)) { + return null; + } + return feature; +}; + + +/** + * @inheritDoc + */ +ol.format.GPX.prototype.readFeaturesFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if (goog.array.indexOf(ol.format.GPX.NAMESPACE_URIS_, node.namespaceURI) == + -1) { + return []; + } + if (node.localName == 'gpx') { + var features = ol.xml.pushParseAndPop( + /** @type {Array.} */ ([]), ol.format.GPX.GPX_PARSERS_, + node, []); + if (goog.isDef(features)) { + return features; + } else { + return []; + } + } + return []; +}; + + +/** + * @inheritDoc + */ +ol.format.GPX.prototype.readProjectionFromDocument = function(doc) { + return ol.proj.get('EPSG:4326'); +}; + + +/** + * @inheritDoc + */ +ol.format.GPX.prototype.readProjectionFromNode = function(node) { + return ol.proj.get('EPSG:4326'); +}; + + +/** + * @param {Node} node Node. + * @param {string} value Value for the link's `href` attribute. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GPX.writeLink_ = function(node, value, objectStack) { + node.setAttribute('href', value); + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var properties = goog.object.get(context, 'properties'); + var link = [ + goog.object.get(properties, 'linkText'), + goog.object.get(properties, 'linkType') + ]; + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ ({node: node}), + ol.format.GPX.LINK_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY, + link, objectStack, ol.format.GPX.LINK_SEQUENCE_); +}; + + +/** + * @param {Node} node Node. + * @param {ol.Coordinate} coordinate Coordinate. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.writeWptType_ = function(node, coordinate, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var parentNode = context.node; + goog.asserts.assert(ol.xml.isNode(parentNode)); + var namespaceURI = parentNode.namespaceURI; + var properties = goog.object.get(context, 'properties'); + //FIXME Projection handling + ol.xml.setAttributeNS(node, null, 'lat', coordinate[1]); + ol.xml.setAttributeNS(node, null, 'lon', coordinate[0]); + var geometryLayout = goog.object.get(context, 'geometryLayout'); + switch (geometryLayout) { + case ol.geom.GeometryLayout.XYZM: + if (coordinate[3] !== 0) { + goog.object.set(properties, 'time', coordinate[3]); + } + case ol.geom.GeometryLayout.XYZ: + if (coordinate[2] !== 0) { + goog.object.set(properties, 'ele', coordinate[2]); + } + break; + case ol.geom.GeometryLayout.XYM: + if (coordinate[2] !== 0) { + goog.object.set(properties, 'time', coordinate[2]); + } + } + var orderedKeys = ol.format.GPX.WPT_TYPE_SEQUENCE_[namespaceURI]; + var values = ol.xml.makeSequence(properties, orderedKeys); + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ + ({node: node, 'properties': properties}), + ol.format.GPX.WPT_TYPE_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY, + values, objectStack, orderedKeys); +}; + + +/** + * @param {Node} node Node. + * @param {ol.Feature} feature Feature. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.writeRte_ = function(node, feature, objectStack) { + var properties = feature.getProperties(); + var context = {node: node, 'properties': properties}; + var geometry = feature.getGeometry(); + if (goog.isDef(geometry)) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + goog.object.set(context, 'geometryLayout', geometry.getLayout()); + goog.object.set(properties, 'rtept', geometry.getCoordinates()); + } + var parentNode = objectStack[objectStack.length - 1].node; + var orderedKeys = ol.format.GPX.RTE_SEQUENCE_[parentNode.namespaceURI]; + var values = ol.xml.makeSequence(properties, orderedKeys); + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ (context), + ol.format.GPX.RTE_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY, + values, objectStack, orderedKeys); +}; + + +/** + * @param {Node} node Node. + * @param {ol.Feature} feature Feature. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.writeTrk_ = function(node, feature, objectStack) { + var properties = feature.getProperties(); + var context = {node: node, 'properties': properties}; + var geometry = feature.getGeometry(); + if (goog.isDef(geometry)) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString); + goog.object.set(properties, 'trkseg', geometry.getLineStrings()); + } + var parentNode = objectStack[objectStack.length - 1].node; + var orderedKeys = ol.format.GPX.TRK_SEQUENCE_[parentNode.namespaceURI]; + var values = ol.xml.makeSequence(properties, orderedKeys); + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ (context), + ol.format.GPX.TRK_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY, + values, objectStack, orderedKeys); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LineString} lineString LineString. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.writeTrkSeg_ = function(node, lineString, objectStack) { + var context = {node: node, 'geometryLayout': lineString.getLayout(), + 'properties': {}}; + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ (context), + ol.format.GPX.TRKSEG_SERIALIZERS_, ol.format.GPX.TRKSEG_NODE_FACTORY_, + lineString.getCoordinates(), objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {ol.Feature} feature Feature. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.writeWpt_ = function(node, feature, objectStack) { + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + goog.object.set(context, 'properties', feature.getProperties()); + var geometry = feature.getGeometry(); + if (goog.isDef(geometry)) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + goog.object.set(context, 'geometryLayout', geometry.getLayout()); + ol.format.GPX.writeWptType_(node, geometry.getCoordinates(), objectStack); + } +}; + + +/** + * @const + * @type {Array.} + * @private + */ +ol.format.GPX.LINK_SEQUENCE_ = ['text', 'type']; + + +/** + * @type {Object.>} + * @private + */ +ol.format.GPX.LINK_SERIALIZERS_ = ol.xml.makeStructureNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'text': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'type': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.RTE_SEQUENCE_ = ol.xml.makeStructureNS( + ol.format.GPX.NAMESPACE_URIS_, [ + 'name', 'cmt', 'desc', 'src', 'link', 'number', 'type', 'rtept' + ]); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.RTE_SERIALIZERS_ = ol.xml.makeStructureNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'name': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'cmt': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'desc': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'src': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'link': ol.xml.makeChildAppender(ol.format.GPX.writeLink_), + 'number': ol.xml.makeChildAppender( + ol.format.XSD.writeNonNegativeIntegerTextNode), + 'type': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'rtept': ol.xml.makeArraySerializer(ol.xml.makeChildAppender( + ol.format.GPX.writeWptType_)) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.TRK_SEQUENCE_ = ol.xml.makeStructureNS( + ol.format.GPX.NAMESPACE_URIS_, [ + 'name', 'cmt', 'desc', 'src', 'link', 'number', 'type', 'trkseg' + ]); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.TRK_SERIALIZERS_ = ol.xml.makeStructureNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'name': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'cmt': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'desc': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'src': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'link': ol.xml.makeChildAppender(ol.format.GPX.writeLink_), + 'number': ol.xml.makeChildAppender( + ol.format.XSD.writeNonNegativeIntegerTextNode), + 'type': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'trkseg': ol.xml.makeArraySerializer(ol.xml.makeChildAppender( + ol.format.GPX.writeTrkSeg_)) + }); + + +/** + * @const + * @param {*} value Value. + * @param {Array.<*>} objectStack Object stack. + * @param {string=} opt_nodeName Node name. + * @return {Node|undefined} Node. + * @private + */ +ol.format.GPX.TRKSEG_NODE_FACTORY_ = ol.xml.makeSimpleNodeFactory('trkpt'); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.TRKSEG_SERIALIZERS_ = ol.xml.makeStructureNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'trkpt': ol.xml.makeChildAppender(ol.format.GPX.writeWptType_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.WPT_TYPE_SEQUENCE_ = ol.xml.makeStructureNS( + ol.format.GPX.NAMESPACE_URIS_, [ + 'ele', 'time', 'magvar', 'geoidheight', 'name', 'cmt', 'desc', 'src', + 'link', 'sym', 'type', 'fix', 'sat', 'hdop', 'vdop', 'pdop', + 'ageofdgpsdata', 'dgpsid' + ]); + + +/** + * @type {Object.>} + * @private + */ +ol.format.GPX.WPT_TYPE_SERIALIZERS_ = ol.xml.makeStructureNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'ele': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), + 'time': ol.xml.makeChildAppender(ol.format.XSD.writeDateTimeTextNode), + 'magvar': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), + 'geoidheight': ol.xml.makeChildAppender( + ol.format.XSD.writeDecimalTextNode), + 'name': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'cmt': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'desc': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'src': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'link': ol.xml.makeChildAppender(ol.format.GPX.writeLink_), + 'sym': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'type': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'fix': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode), + 'sat': ol.xml.makeChildAppender( + ol.format.XSD.writeNonNegativeIntegerTextNode), + 'hdop': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), + 'vdop': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), + 'pdop': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode), + 'ageofdgpsdata': ol.xml.makeChildAppender( + ol.format.XSD.writeDecimalTextNode), + 'dgpsid': ol.xml.makeChildAppender( + ol.format.XSD.writeNonNegativeIntegerTextNode) + }); + + +/** + * @const + * @type {Object.} + * @private + */ +ol.format.GPX.GEOMETRY_TYPE_TO_NODENAME_ = { + 'Point': 'wpt', + 'LineString': 'rte', + 'MultiLineString': 'trk' +}; + + +/** + * @const + * @param {*} value Value. + * @param {Array.<*>} objectStack Object stack. + * @param {string=} opt_nodeName Node name. + * @return {Node|undefined} Node. + * @private + */ +ol.format.GPX.GPX_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { + goog.asserts.assertInstanceof(value, ol.Feature); + var geometry = value.getGeometry(); + if (goog.isDef(geometry)) { + var parentNode = objectStack[objectStack.length - 1].node; + goog.asserts.assert(ol.xml.isNode(parentNode)); + return ol.xml.createElementNS(parentNode.namespaceURI, + ol.format.GPX.GEOMETRY_TYPE_TO_NODENAME_[geometry.getType()]); + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.GPX_SERIALIZERS_ = ol.xml.makeStructureNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'rte': ol.xml.makeChildAppender(ol.format.GPX.writeRte_), + 'trk': ol.xml.makeChildAppender(ol.format.GPX.writeTrk_), + 'wpt': ol.xml.makeChildAppender(ol.format.GPX.writeWpt_) + }); + + + +/** + * @constructor + * @extends {ol.format.GPX} + * @todo stability experimental + */ +ol.format.GPX.V1_1 = function() { + goog.base(this); +}; +goog.inherits(ol.format.GPX.V1_1, ol.format.GPX); + + +/** + * @inheritDoc + */ +ol.format.GPX.V1_1.prototype.writeFeaturesNode = function(features) { + //FIXME Serialize metadata + var gpx = ol.xml.createElementNS('http://www.topografix.com/GPX/1/1', 'gpx'); + ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ + ({node: gpx}), ol.format.GPX.GPX_SERIALIZERS_, + ol.format.GPX.GPX_NODE_FACTORY_, features, []); + return gpx; +}; diff --git a/float-no-zero/ol/ol/format/igcformat.exports b/float-no-zero/ol/ol/format/igcformat.exports new file mode 100644 index 0000000000..f5faa5c4fb --- /dev/null +++ b/float-no-zero/ol/ol/format/igcformat.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.format.IGC +@exportProperty ol.format.IGC.prototype.readFeature +@exportProperty ol.format.IGC.prototype.readFeatures diff --git a/float-no-zero/ol/ol/format/igcformat.js b/float-no-zero/ol/ol/format/igcformat.js new file mode 100644 index 0000000000..449abe3e39 --- /dev/null +++ b/float-no-zero/ol/ol/format/igcformat.js @@ -0,0 +1,177 @@ +goog.provide('ol.format.IGC'); +goog.provide('ol.format.IGCZ'); + +goog.require('goog.asserts'); +goog.require('goog.string'); +goog.require('goog.string.newlines'); +goog.require('ol.Feature'); +goog.require('ol.format.TextFeature'); +goog.require('ol.geom.LineString'); +goog.require('ol.proj'); + + +/** + * @enum {string} + */ +ol.format.IGCZ = { + BAROMETRIC: 'barometric', + GPS: 'gps', + NONE: 'none' +}; + + + +/** + * @constructor + * @extends {ol.format.TextFeature} + * @param {olx.format.IGCOptions=} opt_options Options. + * @todo stability experimental + */ +ol.format.IGC = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + /** + * @private + * @type {ol.format.IGCZ} + */ + this.altitudeMode_ = goog.isDef(options.altitudeMode) ? + options.altitudeMode : ol.format.IGCZ.NONE; + +}; +goog.inherits(ol.format.IGC, ol.format.TextFeature); + + +/** + * @const + * @type {Array.} + * @private + */ +ol.format.IGC.EXTENSIONS_ = ['.igc']; + + +/** + * @const + * @type {RegExp} + * @private + */ +ol.format.IGC.B_RECORD_RE_ = + /^B(\d{2})(\d{2})(\d{2})(\d{2})(\d{5})([NS])(\d{3})(\d{5})([EW])([AV])(\d{5})(\d{5})/; + + +/** + * @const + * @type {RegExp} + * @private + */ +ol.format.IGC.H_RECORD_RE_ = /^H.([A-Z]{3}).*?:(.*)/; + + +/** + * @const + * @type {RegExp} + * @private + */ +ol.format.IGC.HFDTE_RECORD_RE_ = /^HFDTE(\d{2})(\d{2})(\d{2})/; + + +/** + * @inheritDoc + */ +ol.format.IGC.prototype.getExtensions = function() { + return ol.format.IGC.EXTENSIONS_; +}; + + +/** + * @inheritDoc + */ +ol.format.IGC.prototype.readFeatureFromText = function(text) { + var altitudeMode = this.altitudeMode_; + var lines = goog.string.newlines.splitLines(text); + /** @type {Object.} */ + var properties = {}; + var flatCoordinates = []; + var year = 2000; + var month = 0; + var day = 1; + var i, ii; + for (i = 0, ii = lines.length; i < ii; ++i) { + var line = lines[i]; + var m; + if (line.charAt(0) == 'B') { + m = ol.format.IGC.B_RECORD_RE_.exec(line); + if (m) { + var hour = parseInt(m[1], 10); + var minute = parseInt(m[2], 10); + var second = parseInt(m[3], 10); + var y = parseInt(m[4], 10) + parseInt(m[5], 10) / 60000; + if (m[6] == 'S') { + y = -y; + } + var x = parseInt(m[7], 10) + parseInt(m[8], 10) / 60000; + if (m[9] == 'W') { + x = -x; + } + flatCoordinates.push(x, y); + if (altitudeMode != ol.format.IGCZ.NONE) { + var z; + if (altitudeMode == ol.format.IGCZ.GPS) { + z = parseInt(m[11], 10); + } else if (altitudeMode == ol.format.IGCZ.BAROMETRIC) { + z = parseInt(m[12], 10); + } else { + goog.asserts.fail(); + z = 0; + } + flatCoordinates.push(z); + } + var dateTime = Date.UTC(year, month, day, hour, minute, second); + flatCoordinates.push(dateTime / 1000); + } + } else if (line.charAt(0) == 'H') { + m = ol.format.IGC.HFDTE_RECORD_RE_.exec(line); + if (m) { + day = parseInt(m[1], 10); + month = parseInt(m[2], 10) - 1; + year = 2000 + parseInt(m[3], 10); + } else { + m = ol.format.IGC.H_RECORD_RE_.exec(line); + if (m) { + properties[m[1]] = goog.string.trim(m[2]); + m = ol.format.IGC.HFDTE_RECORD_RE_.exec(line); + } + } + } + } + var lineString = new ol.geom.LineString(null); + var layout = altitudeMode == ol.format.IGCZ.NONE ? + ol.geom.GeometryLayout.XYM : ol.geom.GeometryLayout.XYZM; + lineString.setFlatCoordinates(layout, flatCoordinates); + var feature = new ol.Feature(lineString); + feature.setValues(properties); + return feature; +}; + + +/** + * @inheritDoc + */ +ol.format.IGC.prototype.readFeaturesFromText = function(text) { + var feature = this.readFeatureFromText(text); + if (!goog.isNull(feature)) { + return [feature]; + } else { + return []; + } +}; + + +/** + * @inheritDoc + */ +ol.format.IGC.prototype.readProjectionFromText = function(text) { + return ol.proj.get('EPSG:4326'); +}; diff --git a/float-no-zero/ol/ol/format/jsonfeatureformat.js b/float-no-zero/ol/ol/format/jsonfeatureformat.js new file mode 100644 index 0000000000..9e2e3f9417 --- /dev/null +++ b/float-no-zero/ol/ol/format/jsonfeatureformat.js @@ -0,0 +1,155 @@ +goog.provide('ol.format.JSONFeature'); + +goog.require('goog.asserts'); +goog.require('goog.json'); +goog.require('ol.format.Feature'); +goog.require('ol.format.FormatType'); + + + +/** + * @constructor + * @extends {ol.format.Feature} + */ +ol.format.JSONFeature = function() { + goog.base(this); +}; +goog.inherits(ol.format.JSONFeature, ol.format.Feature); + + +/** + * @param {Document|Node|Object|string} source Source. + * @private + * @return {Object} Object. + */ +ol.format.JSONFeature.prototype.getObject_ = function(source) { + if (goog.isObject(source)) { + return source; + } else if (goog.isString(source)) { + var object = goog.json.parse(source); + return goog.isDef(object) ? object : null; + } else { + goog.asserts.fail(); + return null; + } +}; + + +/** + * @inheritDoc + */ +ol.format.JSONFeature.prototype.getType = function() { + return ol.format.FormatType.JSON; +}; + + +/** + * @inheritDoc + */ +ol.format.JSONFeature.prototype.readFeature = function(source) { + return this.readFeatureFromObject(this.getObject_(source)); +}; + + +/** + * @inheritDoc + */ +ol.format.JSONFeature.prototype.readFeatures = function(source) { + return this.readFeaturesFromObject(this.getObject_(source)); +}; + + +/** + * @param {Object} object Object. + * @protected + * @return {ol.Feature} Feature. + */ +ol.format.JSONFeature.prototype.readFeatureFromObject = goog.abstractMethod; + + +/** + * @param {Object} object Object. + * @protected + * @return {Array.} Features. + */ +ol.format.JSONFeature.prototype.readFeaturesFromObject = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.JSONFeature.prototype.readGeometry = function(source) { + return this.readGeometryFromObject(this.getObject_(source)); +}; + + +/** + * @param {Object} object Object. + * @protected + * @return {ol.geom.Geometry} Geometry. + */ +ol.format.JSONFeature.prototype.readGeometryFromObject = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.JSONFeature.prototype.readProjection = function(source) { + return this.readProjectionFromObject(this.getObject_(source)); +}; + + +/** + * @param {Object} object Object. + * @protected + * @return {ol.proj.Projection} Projection. + */ +ol.format.JSONFeature.prototype.readProjectionFromObject = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.JSONFeature.prototype.writeFeature = function(feature) { + return this.writeFeatureObject(feature); +}; + + +/** + * @param {ol.Feature} feature Feature. + * @protected + * @return {Object} Object. + */ +ol.format.JSONFeature.prototype.writeFeatureObject = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.JSONFeature.prototype.writeFeatures = function(features) { + return this.writeFeaturesObject(features); +}; + + +/** + * @param {Array.} features Features. + * @protected + * @return {Object} Object. + */ +ol.format.JSONFeature.prototype.writeFeaturesObject = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.JSONFeature.prototype.writeGeometry = function(geometry) { + return this.writeGeometryObject(geometry); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @protected + * @return {Object} Object. + */ +ol.format.JSONFeature.prototype.writeGeometryObject = goog.abstractMethod; diff --git a/float-no-zero/ol/ol/format/kmlformat.exports b/float-no-zero/ol/ol/format/kmlformat.exports new file mode 100644 index 0000000000..72929f6fd4 --- /dev/null +++ b/float-no-zero/ol/ol/format/kmlformat.exports @@ -0,0 +1,6 @@ +@exportSymbol ol.format.KML +@exportProperty ol.format.KML.prototype.readFeature +@exportProperty ol.format.KML.prototype.readFeatures +@exportProperty ol.format.KML.prototype.readGeometry +@exportProperty ol.format.KML.prototype.readName +@exportProperty ol.format.KML.prototype.readProjection diff --git a/float-no-zero/ol/ol/format/kmlformat.js b/float-no-zero/ol/ol/format/kmlformat.js new file mode 100644 index 0000000000..b6d73fbb56 --- /dev/null +++ b/float-no-zero/ol/ol/format/kmlformat.js @@ -0,0 +1,1589 @@ +// FIXME http://earth.google.com/kml/1.0 namespace? +// FIXME why does node.getAttribute return an unknown type? +// FIXME text + +goog.provide('ol.format.KML'); + +goog.require('goog.Uri'); +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom.NodeType'); +goog.require('goog.math'); +goog.require('goog.object'); +goog.require('goog.string'); +goog.require('ol.Feature'); +goog.require('ol.feature'); +goog.require('ol.format.XMLFeature'); +goog.require('ol.format.XSD'); +goog.require('ol.geom.GeometryCollection'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.MultiPoint'); +goog.require('ol.geom.MultiPolygon'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.Polygon'); +goog.require('ol.proj'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Icon'); +goog.require('ol.style.IconAnchorOrigin'); +goog.require('ol.style.IconAnchorUnits'); +goog.require('ol.style.Image'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); +goog.require('ol.xml'); + + +/** + * @typedef {{x: number, xunits: (ol.style.IconAnchorUnits|undefined), + * y: number, yunits: (ol.style.IconAnchorUnits|undefined)}} + */ +ol.format.KMLVec2_; + + +/** + * @typedef {{flatCoordinates: Array., + * whens: Array.}} + */ +ol.format.KMLGxTrackObject_; + + + +/** + * @constructor + * @extends {ol.format.XMLFeature} + * @param {olx.format.KMLOptions=} opt_options Options. + * @todo stability experimental + */ +ol.format.KML = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + var defaultStyle = goog.isDef(options.defaultStyle) ? + options.defaultStyle : ol.format.KML.DEFAULT_STYLE_ARRAY_; + + /** @type {Object.|string)>} */ + var sharedStyles = {}; + + var findStyle = + /** + * @param {Array.|string|undefined} styleValue Style + * value. + * @return {Array.} Style. + */ + function(styleValue) { + if (goog.isArray(styleValue)) { + return styleValue; + } else if (goog.isString(styleValue)) { + // KML files in the wild occasionally forget the leading `#` on styleUrls + // defined in the same document. Add a leading `#` if it enables to find + // a style. + if (!(styleValue in sharedStyles) && ('#' + styleValue in sharedStyles)) { + styleValue = '#' + styleValue; + } + return findStyle(sharedStyles[styleValue]); + } else { + return defaultStyle; + } + }; + + /** + * @private + * @type {Object.|string)>} + */ + this.sharedStyles_ = sharedStyles; + + /** + * @private + * @type {ol.feature.FeatureStyleFunction} + */ + this.featureStyleFunction_ = + /** + * @param {number} resolution Resolution. + * @return {Array.} Style. + * @this {ol.Feature} + */ + function(resolution) { + var style = /** @type {Array.|undefined} */ + (this.get('Style')); + if (goog.isDef(style)) { + return style; + } + var styleUrl = /** @type {string|undefined} */ (this.get('styleUrl')); + if (goog.isDef(styleUrl)) { + return findStyle(styleUrl); + } + return defaultStyle; + }; + +}; +goog.inherits(ol.format.KML, ol.format.XMLFeature); + + +/** + * @const + * @type {Array.} + * @private + */ +ol.format.KML.EXTENSIONS_ = ['.kml']; + + +/** + * @const + * @type {Array.} + * @private + */ +ol.format.KML.GX_NAMESPACE_URIS_ = [ + 'http://www.google.com/kml/ext/2.2' +]; + + +/** + * @const + * @type {Array.} + * @private + */ +ol.format.KML.NAMESPACE_URIS_ = [ + null, + 'http://earth.google.com/kml/2.0', + 'http://earth.google.com/kml/2.1', + 'http://earth.google.com/kml/2.2', + 'http://www.opengis.net/kml/2.2' +]; + + +/** + * @const + * @type {ol.Color} + * @private + */ +ol.format.KML.DEFAULT_COLOR_ = [255, 255, 255, 1]; + + +/** + * @const + * @type {ol.style.Fill} + * @private + */ +ol.format.KML.DEFAULT_FILL_STYLE_ = new ol.style.Fill({ + color: ol.format.KML.DEFAULT_COLOR_ +}); + + +/** + * @const + * @type {ol.Size} + * @private + */ +ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_ = [2, 20]; // FIXME maybe [8, 32] ? + + +/** + * @const + * @type {ol.style.IconAnchorUnits} + * @private + */ +ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_ = + ol.style.IconAnchorUnits.PIXELS; + + +/** + * @const + * @type {ol.style.IconAnchorUnits} + * @private + */ +ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_Y_UNITS_ = + ol.style.IconAnchorUnits.PIXELS; + + +/** + * @const + * @type {ol.Size} + * @private + */ +ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_ = [32, 32]; + + +/** + * @const + * @type {string} + * @private + */ +ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_ = + 'https://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png'; + + +/** + * @const + * @type {ol.style.Image} + * @private + */ +ol.format.KML.DEFAULT_IMAGE_STYLE_ = new ol.style.Icon({ + anchor: ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_, + anchorXUnits: ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_, + anchorYUnits: ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_Y_UNITS_, + crossOrigin: 'anonymous', + rotation: 0, + scale: 1, + size: ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_, + src: ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_ +}); + + +/** + * @const + * @type {ol.style.Stroke} + * @private + */ +ol.format.KML.DEFAULT_STROKE_STYLE_ = new ol.style.Stroke({ + color: ol.format.KML.DEFAULT_COLOR_, + width: 1 +}); + + +/** + * @const + * @type {ol.style.Style} + * @private + */ +ol.format.KML.DEFAULT_STYLE_ = new ol.style.Style({ + fill: ol.format.KML.DEFAULT_FILL_STYLE_, + image: ol.format.KML.DEFAULT_IMAGE_STYLE_, + text: null, // FIXME + stroke: ol.format.KML.DEFAULT_STROKE_STYLE_, + zIndex: 0 +}); + + +/** + * @const + * @type {Array.} + * @private + */ +ol.format.KML.DEFAULT_STYLE_ARRAY_ = [ol.format.KML.DEFAULT_STYLE_]; + + +/** + * @const + * @type {Object.} + * @private + */ +ol.format.KML.ICON_ANCHOR_UNITS_MAP_ = { + 'fraction': ol.style.IconAnchorUnits.FRACTION, + 'pixels': ol.style.IconAnchorUnits.PIXELS +}; + + +/** + * @param {Node} node Node. + * @private + * @return {ol.Color|undefined} Color. + */ +ol.format.KML.readColor_ = function(node) { + var s = ol.xml.getAllTextContent(node, false); + // The KML specification states that colors should not include a leading `#` + // but we tolerate them. + var m = /^\s*#?\s*([0-9A-Fa-f]{8})\s*$/.exec(s); + if (m) { + var hexColor = m[1]; + return [ + parseInt(hexColor.substr(6, 2), 16), + parseInt(hexColor.substr(4, 2), 16), + parseInt(hexColor.substr(2, 2), 16), + parseInt(hexColor.substr(0, 2), 16) / 255 + ]; + + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @private + * @return {Array.|undefined} Flat coordinates. + */ +ol.format.KML.readFlatCoordinates_ = function(node) { + var s = ol.xml.getAllTextContent(node, false); + var flatCoordinates = []; + // The KML specification states that coordinate tuples should not include + // spaces, but we tolerate them. + var re = + /^\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)\s*,\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)(?:\s*,\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?))?\s*/i; + var m; + while ((m = re.exec(s))) { + var x = parseFloat(m[1]); + var y = parseFloat(m[2]); + var z = m[3] ? parseFloat(m[3]) : 0; + flatCoordinates.push(x, y, z); + s = s.substr(m[0].length); + } + if (s !== '') { + return undefined; + } + return flatCoordinates; +}; + + +/** + * @param {Node} node Node. + * @private + * @return {string|undefined} Style URL. + */ +ol.format.KML.readStyleUrl_ = function(node) { + var s = goog.string.trim(ol.xml.getAllTextContent(node, false)); + if (goog.isDefAndNotNull(node.baseURI)) { + return goog.Uri.resolve(node.baseURI, s).toString(); + } else { + return s; + } + +}; + + +/** + * @param {Node} node Node. + * @private + * @return {string} URI. + */ +ol.format.KML.readURI_ = function(node) { + var s = ol.xml.getAllTextContent(node, false); + if (goog.isDefAndNotNull(node.baseURI)) { + return goog.Uri.resolve(node.baseURI, goog.string.trim(s)).toString(); + } else { + return goog.string.trim(s); + } +}; + + +/** + * @param {Node} node Node. + * @private + * @return {ol.format.KMLVec2_} Vec2. + */ +ol.format.KML.readVec2_ = function(node) { + var xunits = node.getAttribute('xunits'); + var yunits = node.getAttribute('yunits'); + return { + x: parseFloat(node.getAttribute('x')), + xunits: ol.format.KML.ICON_ANCHOR_UNITS_MAP_[xunits], + y: parseFloat(node.getAttribute('y')), + yunits: ol.format.KML.ICON_ANCHOR_UNITS_MAP_[yunits] + }; +}; + + +/** + * @param {Node} node Node. + * @private + * @return {number|undefined} Scale. + */ +ol.format.KML.readScale_ = function(node) { + var number = ol.format.XSD.readDecimal(node); + if (goog.isDef(number)) { + return Math.sqrt(number); + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.|string|undefined} StyleMap. + */ +ol.format.KML.readStyleMapValue_ = function(node, objectStack) { + return ol.xml.pushParseAndPop( + /** @type {Array.|string|undefined} */ (undefined), + ol.format.KML.STYLE_MAP_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.IconStyleParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'IconStyle'); + // FIXME gx:x + // FIXME gx:y + // FIXME gx:w + // FIXME gx:h + // FIXME refreshMode + // FIXME refreshInterval + // FIXME viewRefreshTime + // FIXME viewBoundScale + // FIXME viewFormat + // FIXME httpQuery + var object = ol.xml.pushParseAndPop( + {}, ol.format.KML.ICON_STYLE_PARSERS_, node, objectStack); + if (!goog.isDef(object)) { + return; + } + var styleObject = /** @type {Object} */ (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isObject(styleObject)); + var IconObject = /** @type {Object} */ (goog.object.get(object, 'Icon', {})); + var src; + var href = /** @type {string|undefined} */ + (goog.object.get(IconObject, 'href')); + if (goog.isDef(href)) { + src = href; + } else { + src = ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_; + } + var anchor, anchorXUnits, anchorYUnits; + var hotSpot = /** @type {ol.format.KMLVec2_|undefined} */ + (goog.object.get(object, 'hotSpot')); + if (goog.isDef(hotSpot)) { + anchor = [hotSpot.x, hotSpot.y]; + anchorXUnits = hotSpot.xunits; + anchorYUnits = hotSpot.yunits; + } else if (src === ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_) { + anchor = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_; + anchorXUnits = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_; + anchorYUnits = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_Y_UNITS_; + } else if (/^http:\/\/maps\.(?:google|gstatic)\.com\//.test(src)) { + anchor = [0.5, 1]; + anchorXUnits = ol.style.IconAnchorUnits.FRACTION; + anchorYUnits = ol.style.IconAnchorUnits.FRACTION; + } + + var rotation; + var heading = /** @type {number|undefined} */ + (goog.object.get(object, 'heading')); + if (goog.isDef(heading)) { + rotation = goog.math.toRadians(heading); + } + + var scale = /** @type {number|undefined} */ + (goog.object.get(object, 'scale')); + var size; + if (src == ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_) { + size = ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_; + } + + var imageStyle = new ol.style.Icon({ + anchor: anchor, + anchorOrigin: ol.style.IconAnchorOrigin.TOP_LEFT, + anchorXUnits: anchorXUnits, + anchorYUnits: anchorYUnits, + crossOrigin: 'anonymous', // FIXME should this be configurable? + rotation: rotation, + scale: scale, + size: size, + src: src + }); + goog.object.set(styleObject, 'imageStyle', imageStyle); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.LineStyleParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'LineStyle'); + // FIXME colorMode + // FIXME gx:outerColor + // FIXME gx:outerWidth + // FIXME gx:physicalWidth + // FIXME gx:labelVisibility + var object = ol.xml.pushParseAndPop( + {}, ol.format.KML.LINE_STYLE_PARSERS_, node, objectStack); + if (!goog.isDef(object)) { + return; + } + var styleObject = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(styleObject)); + var strokeStyle = new ol.style.Stroke({ + color: /** @type {ol.Color} */ + (goog.object.get(object, 'color', ol.format.KML.DEFAULT_COLOR_)), + width: /** @type {number} */ (goog.object.get(object, 'width', 1)) + }); + goog.object.set(styleObject, 'strokeStyle', strokeStyle); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.PolyStyleParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'PolyStyle'); + // FIXME colorMode + var object = ol.xml.pushParseAndPop( + {}, ol.format.KML.POLY_STYLE_PARSERS_, node, objectStack); + if (!goog.isDef(object)) { + return; + } + var styleObject = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(styleObject)); + var fillStyle = new ol.style.Fill({ + color: /** @type {ol.Color} */ + (goog.object.get(object, 'color', ol.format.KML.DEFAULT_COLOR_)) + }); + goog.object.set(styleObject, 'fillStyle', fillStyle); + var fill = /** @type {boolean|undefined} */ (goog.object.get(object, 'fill')); + if (goog.isDef(fill)) { + goog.object.set(styleObject, 'fill', fill); + } + var outline = + /** @type {boolean|undefined} */ (goog.object.get(object, 'outline')); + if (goog.isDef(outline)) { + goog.object.set(styleObject, 'outline', outline); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.} LinearRing flat coordinates. + */ +ol.format.KML.readFlatLinearRing_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'LinearRing'); + return /** @type {Array.} */ (ol.xml.pushParseAndPop( + null, ol.format.KML.FLAT_LINEAR_RING_PARSERS_, node, objectStack)); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.gxCoordParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(goog.array.indexOf( + ol.format.KML.GX_NAMESPACE_URIS_, node.namespaceURI) != -1); + goog.asserts.assert(node.localName == 'coord'); + var gxTrackObject = /** @type {ol.format.KMLGxTrackObject_} */ + (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isObject(gxTrackObject)); + var flatCoordinates = gxTrackObject.flatCoordinates; + var s = ol.xml.getAllTextContent(node, false); + var re = + /^\s*([+\-]?\d+(?:\.\d*)?(?:e[+\-]?\d*)?)\s+([+\-]?\d+(?:\.\d*)?(?:e[+\-]?\d*)?)\s+([+\-]?\d+(?:\.\d*)?(?:e[+\-]?\d*)?)\s*$/i; + var m = re.exec(s); + if (m) { + var x = parseFloat(m[1]); + var y = parseFloat(m[2]); + var z = parseFloat(m[3]); + flatCoordinates.push(x, y, z, 0); + } else { + flatCoordinates.push(0, 0, 0, 0); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.MultiLineString|undefined} MultiLineString. + */ +ol.format.KML.readGxMultiTrack_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(goog.array.indexOf( + ol.format.KML.GX_NAMESPACE_URIS_, node.namespaceURI) != -1); + goog.asserts.assert(node.localName == 'MultiTrack'); + var lineStrings = ol.xml.pushParseAndPop( + /** @type {Array.} */ ([]), + ol.format.KML.GX_MULTITRACK_GEOMETRY_PARSERS_, node, objectStack); + if (!goog.isDef(lineStrings)) { + return undefined; + } + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setLineStrings(lineStrings); + return multiLineString; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.LineString|undefined} LineString. + */ +ol.format.KML.readGxTrack_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(goog.array.indexOf( + ol.format.KML.GX_NAMESPACE_URIS_, node.namespaceURI) != -1); + goog.asserts.assert(node.localName == 'Track'); + var gxTrackObject = ol.xml.pushParseAndPop( + /** @type {ol.format.KMLGxTrackObject_} */ ({ + flatCoordinates: [], + whens: [] + }), ol.format.KML.GX_TRACK_PARSERS_, node, objectStack); + if (!goog.isDef(gxTrackObject)) { + return undefined; + } + var flatCoordinates = gxTrackObject.flatCoordinates; + var whens = gxTrackObject.whens; + goog.asserts.assert(flatCoordinates.length / 4 == whens.length); + var i, ii; + for (i = 0, ii = Math.min(flatCoordinates.length, whens.length); i < ii; + ++i) { + flatCoordinates[4 * i + 3] = whens[i]; + } + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZM, flatCoordinates); + return lineString; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Object} Icon object. + */ +ol.format.KML.readIcon_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Icon'); + var iconObject = ol.xml.pushParseAndPop( + {}, ol.format.KML.ICON_PARSERS_, node, objectStack); + if (goog.isDef(iconObject)) { + return iconObject; + } else { + return null; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.} Flat coordinates. + */ +ol.format.KML.readFlatCoordinatesFromNode_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + return /** @type {Array.} */ (ol.xml.pushParseAndPop(null, + ol.format.KML.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack)); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.LineString|undefined} LineString. + */ +ol.format.KML.readLineString_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'LineString'); + var flatCoordinates = + ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack); + if (goog.isDef(flatCoordinates)) { + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return lineString; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.Polygon|undefined} Polygon. + */ +ol.format.KML.readLinearRing_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'LinearRing'); + var flatCoordinates = + ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack); + if (goog.isDef(flatCoordinates)) { + var polygon = new ol.geom.Polygon(null); + polygon.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates, + [flatCoordinates.length]); + return polygon; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.Geometry} Geometry. + */ +ol.format.KML.readMultiGeometry_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'MultiGeometry'); + var geometries = ol.xml.pushParseAndPop( + /** @type {Array.} */ ([]), + ol.format.KML.MULTI_GEOMETRY_PARSERS_, node, objectStack); + if (!goog.isDef(geometries)) { + return null; + } + if (geometries.length === 0) { + return new ol.geom.GeometryCollection(geometries); + } + var homogeneous = true; + var type = geometries[0].getType(); + var geometry, i, ii; + for (i = 1, ii = geometries.length; i < ii; ++i) { + geometry = geometries[i]; + if (geometry.getType() != type) { + homogeneous = false; + break; + } + } + if (homogeneous) { + /** @type {ol.geom.GeometryLayout} */ + var layout; + /** @type {Array.} */ + var flatCoordinates; + if (type == ol.geom.GeometryType.POINT) { + var point = geometries[0]; + goog.asserts.assertInstanceof(point, ol.geom.Point); + layout = point.getLayout(); + flatCoordinates = point.getFlatCoordinates(); + for (i = 1, ii = geometries.length; i < ii; ++i) { + geometry = geometries[i]; + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + goog.asserts.assert(geometry.getLayout() == layout); + goog.array.extend(flatCoordinates, geometry.getFlatCoordinates()); + } + var multiPoint = new ol.geom.MultiPoint(null); + multiPoint.setFlatCoordinates(layout, flatCoordinates); + return multiPoint; + } else if (type == ol.geom.GeometryType.LINE_STRING) { + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setLineStrings(geometries); + return multiLineString; + } else if (type == ol.geom.GeometryType.POLYGON) { + var multiPolygon = new ol.geom.MultiPolygon(null); + multiPolygon.setPolygons(geometries); + return multiPolygon; + } else if (type == ol.geom.GeometryType.GEOMETRY_COLLECTION) { + return new ol.geom.GeometryCollection(geometries); + } else { + goog.asserts.fail(); + return null; + } + } else { + return new ol.geom.GeometryCollection(geometries); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.Point|undefined} Point. + */ +ol.format.KML.readPoint_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Point'); + var flatCoordinates = + ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack); + if (goog.isDefAndNotNull(flatCoordinates)) { + var point = new ol.geom.Point(null); + goog.asserts.assert(flatCoordinates.length == 3); + point.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates); + return point; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.geom.Polygon|undefined} Polygon. + */ +ol.format.KML.readPolygon_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Polygon'); + var flatLinearRings = ol.xml.pushParseAndPop( + /** @type {Array.>} */ ([null]), + ol.format.KML.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack); + if (goog.isDefAndNotNull(flatLinearRings) && + !goog.isNull(flatLinearRings[0])) { + var polygon = new ol.geom.Polygon(null); + var flatCoordinates = flatLinearRings[0]; + var ends = [flatCoordinates.length]; + var i, ii; + for (i = 1, ii = flatLinearRings.length; i < ii; ++i) { + goog.array.extend(flatCoordinates, flatLinearRings[i]); + ends.push(flatCoordinates.length); + } + polygon.setFlatCoordinates( + ol.geom.GeometryLayout.XYZ, flatCoordinates, ends); + return polygon; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.} Style. + */ +ol.format.KML.readStyle_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Style'); + var styleObject = ol.xml.pushParseAndPop( + {}, ol.format.KML.STYLE_PARSERS_, node, objectStack); + if (!goog.isDef(styleObject)) { + return null; + } + var fillStyle = /** @type {ol.style.Fill} */ (goog.object.get( + styleObject, 'fillStyle', ol.format.KML.DEFAULT_FILL_STYLE_)); + var fill = /** @type {boolean|undefined} */ + (goog.object.get(styleObject, 'fill')); + if (goog.isDef(fill) && !fill) { + fillStyle = null; + } + var imageStyle = /** @type {ol.style.Image} */ (goog.object.get( + styleObject, 'imageStyle', ol.format.KML.DEFAULT_IMAGE_STYLE_)); + var strokeStyle = /** @type {ol.style.Stroke} */ (goog.object.get( + styleObject, 'strokeStyle', ol.format.KML.DEFAULT_STROKE_STYLE_)); + var outline = /** @type {boolean|undefined} */ + (goog.object.get(styleObject, 'outline')); + if (goog.isDef(outline) && !outline) { + strokeStyle = null; + } + return [new ol.style.Style({ + fill: fillStyle, + image: imageStyle, + stroke: strokeStyle, + text: null, // FIXME + zIndex: undefined // FIXME + })]; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.DataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Data'); + var name = node.getAttribute('name'); + if (!goog.isNull(name)) { + var data = ol.xml.pushParseAndPop( + undefined, ol.format.KML.DATA_PARSERS_, node, objectStack); + if (goog.isDef(data)) { + var featureObject = + /** @type {Object} */ (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isObject(featureObject)); + goog.object.set(featureObject, name, data); + } + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.ExtendedDataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'ExtendedData'); + ol.xml.parse(ol.format.KML.EXTENDED_DATA_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.PairDataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Pair'); + var pairObject = ol.xml.pushParseAndPop( + {}, ol.format.KML.PAIR_PARSERS_, node, objectStack); + if (!goog.isDef(pairObject)) { + return; + } + var key = /** @type {string|undefined} */ + (goog.object.get(pairObject, 'key')); + if (goog.isDef(key) && key == 'normal') { + var styleUrl = /** @type {string|undefined} */ + (goog.object.get(pairObject, 'styleUrl')); + if (goog.isDef(styleUrl)) { + objectStack[objectStack.length - 1] = styleUrl; + } + var Style = /** @type {ol.style.Style} */ + (goog.object.get(pairObject, 'Style')); + if (goog.isDef(Style)) { + objectStack[objectStack.length - 1] = Style; + } + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.PlacemarkStyleMapParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'StyleMap'); + var styleMapValue = ol.format.KML.readStyleMapValue_(node, objectStack); + if (!goog.isDef(styleMapValue)) { + return; + } + var placemarkObject = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(placemarkObject)); + if (goog.isArray(styleMapValue)) { + goog.object.set(placemarkObject, 'Style', styleMapValue); + } else if (goog.isString(styleMapValue)) { + goog.object.set(placemarkObject, 'styleUrl', styleMapValue); + } else { + goog.asserts.fail(); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.SchemaDataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'SchemaData'); + ol.xml.parse(ol.format.KML.SCHEMA_DATA_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.SimpleDataParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'SimpleData'); + var name = node.getAttribute('name'); + if (!goog.isNull(name)) { + var data = ol.format.XSD.readString(node); + var featureObject = + /** @type {Object} */ (objectStack[objectStack.length - 1]); + goog.object.set(featureObject, name, data); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.innerBoundaryIsParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'innerBoundaryIs'); + var flatLinearRing = ol.xml.pushParseAndPop( + /** @type {Array.|undefined} */ (undefined), + ol.format.KML.INNER_BOUNDARY_IS_PARSERS_, node, objectStack); + if (goog.isDef(flatLinearRing)) { + var flatLinearRings = /** @type {Array.>} */ + (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(flatLinearRings)); + goog.asserts.assert(flatLinearRings.length > 0); + flatLinearRings.push(flatLinearRing); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.outerBoundaryIsParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'outerBoundaryIs'); + var flatLinearRing = ol.xml.pushParseAndPop( + /** @type {Array.|undefined} */ (undefined), + ol.format.KML.OUTER_BOUNDARY_IS_PARSERS_, node, objectStack); + if (goog.isDef(flatLinearRing)) { + var flatLinearRings = /** @type {Array.>} */ + (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(flatLinearRings)); + goog.asserts.assert(flatLinearRings.length > 0); + flatLinearRings[0] = flatLinearRing; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.whenParser_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'when'); + var gxTrackObject = /** @type {ol.format.KMLGxTrackObject_} */ + (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isObject(gxTrackObject)); + var whens = gxTrackObject.whens; + var s = ol.xml.getAllTextContent(node, false); + var re = + /^\s*(\d{4})($|-(\d{2})($|-(\d{2})($|T(\d{2}):(\d{2}):(\d{2})(Z|(?:([+\-])(\d{2})(?::(\d{2}))?)))))\s*$/; + var m = re.exec(s); + if (m) { + var year = parseInt(m[1], 10); + var month = goog.isDef(m[3]) ? parseInt(m[3], 10) - 1 : 0; + var day = goog.isDef(m[5]) ? parseInt(m[5], 10) : 1; + var hour = goog.isDef(m[7]) ? parseInt(m[7], 10) : 0; + var minute = goog.isDef(m[8]) ? parseInt(m[8], 10) : 0; + var second = goog.isDef(m[9]) ? parseInt(m[9], 10) : 0; + var when = Date.UTC(year, month, day, hour, minute, second); + if (goog.isDef(m[10]) && m[10] != 'Z') { + var sign = m[11] == '-' ? -1 : 1; + when += sign * 60 * parseInt(m[12], 10); + if (goog.isDef(m[13])) { + when += sign * 60 * 60 * parseInt(m[13], 10); + } + } + whens.push(when); + } else { + whens.push(0); + } +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.DATA_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'value': ol.xml.makeReplacer(ol.format.XSD.readString) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.EXTENDED_DATA_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'Data': ol.format.KML.DataParser_, + 'SchemaData': ol.format.KML.SchemaDataParser_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.FLAT_LINEAR_RING_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'coordinates': ol.xml.makeReplacer(ol.format.KML.readFlatCoordinates_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.FLAT_LINEAR_RINGS_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'innerBoundaryIs': ol.format.KML.innerBoundaryIsParser_, + 'outerBoundaryIs': ol.format.KML.outerBoundaryIsParser_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.GX_TRACK_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'when': ol.format.KML.whenParser_ + }, ol.xml.makeParsersNS( + ol.format.KML.GX_NAMESPACE_URIS_, { + 'coord': ol.format.KML.gxCoordParser_ + })); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.GEOMETRY_FLAT_COORDINATES_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'coordinates': ol.xml.makeReplacer(ol.format.KML.readFlatCoordinates_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.ICON_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'href': ol.xml.makeObjectPropertySetter(ol.format.KML.readURI_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.ICON_STYLE_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'Icon': ol.xml.makeObjectPropertySetter(ol.format.KML.readIcon_), + 'heading': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'hotSpot': ol.xml.makeObjectPropertySetter(ol.format.KML.readVec2_), + 'scale': ol.xml.makeObjectPropertySetter(ol.format.KML.readScale_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.INNER_BOUNDARY_IS_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'LinearRing': ol.xml.makeReplacer(ol.format.KML.readFlatLinearRing_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.LINE_STYLE_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'color': ol.xml.makeObjectPropertySetter(ol.format.KML.readColor_), + 'width': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.MULTI_GEOMETRY_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'LineString': ol.xml.makeArrayPusher(ol.format.KML.readLineString_), + 'LinearRing': ol.xml.makeArrayPusher(ol.format.KML.readLinearRing_), + 'MultiGeometry': ol.xml.makeArrayPusher(ol.format.KML.readMultiGeometry_), + 'Point': ol.xml.makeArrayPusher(ol.format.KML.readPoint_), + 'Polygon': ol.xml.makeArrayPusher(ol.format.KML.readPolygon_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.GX_MULTITRACK_GEOMETRY_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.GX_NAMESPACE_URIS_, { + 'Track': ol.xml.makeArrayPusher(ol.format.KML.readGxTrack_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.OUTER_BOUNDARY_IS_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'LinearRing': ol.xml.makeReplacer(ol.format.KML.readFlatLinearRing_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.PAIR_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'Style': ol.xml.makeObjectPropertySetter(ol.format.KML.readStyle_), + 'key': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'styleUrl': ol.xml.makeObjectPropertySetter(ol.format.KML.readStyleUrl_) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.PLACEMARK_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'ExtendedData': ol.format.KML.ExtendedDataParser_, + 'MultiGeometry': ol.xml.makeObjectPropertySetter( + ol.format.KML.readMultiGeometry_, 'geometry'), + 'LineString': ol.xml.makeObjectPropertySetter( + ol.format.KML.readLineString_, 'geometry'), + 'LinearRing': ol.xml.makeObjectPropertySetter( + ol.format.KML.readLinearRing_, 'geometry'), + 'Point': ol.xml.makeObjectPropertySetter( + ol.format.KML.readPoint_, 'geometry'), + 'Polygon': ol.xml.makeObjectPropertySetter( + ol.format.KML.readPolygon_, 'geometry'), + 'Style': ol.xml.makeObjectPropertySetter(ol.format.KML.readStyle_), + 'StyleMap': ol.format.KML.PlacemarkStyleMapParser_, + 'address': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'description': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'open': ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean), + 'phoneNumber': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString), + 'styleUrl': ol.xml.makeObjectPropertySetter(ol.format.KML.readURI_), + 'visibility': ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean) + }, ol.xml.makeParsersNS( + ol.format.KML.GX_NAMESPACE_URIS_, { + 'MultiTrack': ol.xml.makeObjectPropertySetter( + ol.format.KML.readGxMultiTrack_, 'geometry'), + 'Track': ol.xml.makeObjectPropertySetter( + ol.format.KML.readGxTrack_, 'geometry') + } + )); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.POLY_STYLE_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'color': ol.xml.makeObjectPropertySetter(ol.format.KML.readColor_), + 'fill': ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean), + 'outline': ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.SCHEMA_DATA_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'SimpleData': ol.format.KML.SimpleDataParser_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.STYLE_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'IconStyle': ol.format.KML.IconStyleParser_, + 'LineStyle': ol.format.KML.LineStyleParser_, + 'PolyStyle': ol.format.KML.PolyStyleParser_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.KML.STYLE_MAP_PARSERS_ = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'Pair': ol.format.KML.PairDataParser_ + }); + + +/** + * @inheritDoc + */ +ol.format.KML.prototype.getExtensions = function() { + return ol.format.KML.EXTENSIONS_; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {Array.|undefined} Features. + */ +ol.format.KML.prototype.readDocumentOrFolder_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + var localName = ol.xml.getLocalName(node); + goog.asserts.assert(localName == 'Document' || localName == 'Folder'); + // FIXME use scope somehow + var parsersNS = ol.xml.makeParsersNS( + ol.format.KML.NAMESPACE_URIS_, { + 'Folder': ol.xml.makeArrayExtender(this.readDocumentOrFolder_, this), + 'Placemark': ol.xml.makeArrayPusher(this.readPlacemark_, this), + 'Style': goog.bind(this.readSharedStyle_, this), + 'StyleMap': goog.bind(this.readSharedStyleMap_, this) + }); + var features = ol.xml.pushParseAndPop(/** @type {Array.} */ ([]), + parsersNS, node, objectStack, this); + if (goog.isDef(features)) { + return features; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.Feature|undefined} Feature. + */ +ol.format.KML.prototype.readPlacemark_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Placemark'); + var object = ol.xml.pushParseAndPop({'geometry': null}, + ol.format.KML.PLACEMARK_PARSERS_, node, objectStack); + if (!goog.isDef(object)) { + return undefined; + } + var feature = new ol.Feature(); + var id = node.getAttribute('id'); + if (!goog.isNull(id)) { + feature.setId(id); + } + feature.setValues(object); + feature.setStyle(this.featureStyleFunction_); + return feature; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.prototype.readSharedStyle_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'Style'); + var id = node.getAttribute('id'); + if (!goog.isNull(id)) { + var style = ol.format.KML.readStyle_(node, objectStack); + if (goog.isDef(style)) { + var styleUri; + if (goog.isDefAndNotNull(node.baseURI)) { + styleUri = goog.Uri.resolve(node.baseURI, '#' + id).toString(); + } else { + styleUri = '#' + id; + } + this.sharedStyles_[styleUri] = style; + } + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.KML.prototype.readSharedStyleMap_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'StyleMap'); + var id = node.getAttribute('id'); + if (goog.isNull(id)) { + return; + } + var styleMapValue = ol.format.KML.readStyleMapValue_(node, objectStack); + if (!goog.isDef(styleMapValue)) { + return; + } + var styleUri; + if (goog.isDefAndNotNull(node.baseURI)) { + styleUri = goog.Uri.resolve(node.baseURI, '#' + id).toString(); + } else { + styleUri = '#' + id; + } + this.sharedStyles_[styleUri] = styleMapValue; +}; + + +/** + * @inheritDoc + */ +ol.format.KML.prototype.readFeatureFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if (goog.array.indexOf(ol.format.KML.NAMESPACE_URIS_, node.namespaceURI) == + -1) { + return null; + } + goog.asserts.assert(node.localName == 'Placemark'); + var feature = this.readPlacemark_(node, []); + if (goog.isDef(feature)) { + return feature; + } else { + return null; + } +}; + + +/** + * @inheritDoc + */ +ol.format.KML.prototype.readFeaturesFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if (goog.array.indexOf(ol.format.KML.NAMESPACE_URIS_, node.namespaceURI) == + -1) { + return []; + } + var features; + var localName = ol.xml.getLocalName(node); + if (localName == 'Document' || localName == 'Folder') { + features = this.readDocumentOrFolder_(node, []); + if (goog.isDef(features)) { + return features; + } else { + return []; + } + } else if (localName == 'Placemark') { + var feature = this.readPlacemark_(node, []); + if (goog.isDef(feature)) { + return [feature]; + } else { + return []; + } + } else if (localName == 'kml') { + features = []; + var n; + for (n = node.firstElementChild; !goog.isNull(n); + n = n.nextElementSibling) { + var fs = this.readFeaturesFromNode(n); + if (goog.isDef(fs)) { + goog.array.extend(features, fs); + } + } + return features; + } else { + return []; + } +}; + + +/** + * @param {Document|Node|string} source Souce. + * @return {string|undefined} Name. + * @todo stability experimental + */ +ol.format.KML.prototype.readName = function(source) { + if (ol.xml.isDocument(source)) { + return this.readNameFromDocument(/** @type {Document} */ (source)); + } else if (ol.xml.isNode(source)) { + return this.readNameFromNode(/** @type {Node} */ (source)); + } else if (goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readNameFromDocument(doc); + } else { + goog.asserts.fail(); + return undefined; + } +}; + + +/** + * @param {Document} doc Document. + * @return {string|undefined} Name. + */ +ol.format.KML.prototype.readNameFromDocument = function(doc) { + var n; + for (n = doc.firstChild; !goog.isNull(n); n = n.nextSibling) { + if (n.nodeType == goog.dom.NodeType.ELEMENT) { + var name = this.readNameFromNode(n); + if (goog.isDef(name)) { + return name; + } + } + } + return undefined; +}; + + +/** + * @param {Node} node Node. + * @return {string|undefined} Name. + */ +ol.format.KML.prototype.readNameFromNode = function(node) { + var n; + for (n = node.firstElementChild; !goog.isNull(n); n = n.nextElementSibling) { + if (goog.array.indexOf(ol.format.KML.NAMESPACE_URIS_, + n.namespaceURI) != -1 && + n.localName == 'name') { + return ol.format.XSD.readString(n); + } + } + for (n = node.firstElementChild; !goog.isNull(n); n = n.nextElementSibling) { + var localName = ol.xml.getLocalName(n); + if (goog.array.indexOf(ol.format.KML.NAMESPACE_URIS_, + n.namespaceURI) != -1 && + (localName == 'Document' || + localName == 'Folder' || + localName == 'Placemark' || + localName == 'kml')) { + var name = this.readNameFromNode(n); + if (goog.isDef(name)) { + return name; + } + } + } + return undefined; +}; + + +/** + * @inheritDoc + */ +ol.format.KML.prototype.readProjectionFromDocument = function(doc) { + return ol.proj.get('EPSG:4326'); +}; + + +/** + * @inheritDoc + */ +ol.format.KML.prototype.readProjectionFromNode = function(node) { + return ol.proj.get('EPSG:4326'); +}; diff --git a/float-no-zero/ol/ol/format/osmxmlformat.js b/float-no-zero/ol/ol/format/osmxmlformat.js new file mode 100644 index 0000000000..3b7278a093 --- /dev/null +++ b/float-no-zero/ol/ol/format/osmxmlformat.js @@ -0,0 +1,213 @@ +// FIXME add typedef for stack state objects +goog.provide('ol.format.OSMXML'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom.NodeType'); +goog.require('goog.object'); +goog.require('ol.Feature'); +goog.require('ol.format.XMLFeature'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.Polygon'); +goog.require('ol.proj'); +goog.require('ol.xml'); + + + +/** + * @constructor + * @extends {ol.format.XMLFeature} + */ +ol.format.OSMXML = function() { + goog.base(this); +}; +goog.inherits(ol.format.OSMXML, ol.format.XMLFeature); + + +/** + * @const + * @type {Array.} + * @private + */ +ol.format.OSMXML.EXTENSIONS_ = ['.osm']; + + +/** + * @inheritDoc + */ +ol.format.OSMXML.prototype.getExtensions = function() { + return ol.format.OSMXML.EXTENSIONS_; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.OSMXML.readNode_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'node'); + var state = /** @type {Object} */ (objectStack[objectStack.length - 1]); + var id = node.getAttribute('id'); + var coordinates = /** @type {Array.} */ ([ + parseFloat(node.getAttribute('lon')), + parseFloat(node.getAttribute('lat')) + ]); + goog.object.set(state.nodes, id, coordinates); + + var values = ol.xml.pushParseAndPop({ + tags: {} + }, ol.format.OSMXML.NODE_PARSERS_, node, objectStack); + if (!goog.object.isEmpty(values.tags)) { + var geometry = new ol.geom.Point(coordinates); + var feature = new ol.Feature(geometry); + feature.setId(id); + feature.setValues(values.tags); + state.features.push(feature); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.OSMXML.readWay_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'way'); + var id = node.getAttribute('id'); + var values = ol.xml.pushParseAndPop({ + ndrefs: [], + tags: {} + }, ol.format.OSMXML.WAY_PARSERS_, node, objectStack); + var state = /** @type {Object} */ (objectStack[objectStack.length - 1]); + var flatCoordinates = /** @type {Array.} */ ([]); + for (var i = 0, ii = values.ndrefs.length; i < ii; i++) { + var point = goog.object.get(state.nodes, values.ndrefs[i]); + goog.array.extend(flatCoordinates, point); + } + var geometry; + if (values.ndrefs[0] == values.ndrefs[values.ndrefs.length - 1]) { + // closed way + geometry = new ol.geom.Polygon(null); + geometry.setFlatCoordinates(ol.geom.GeometryLayout.XY, flatCoordinates, + [flatCoordinates.length]); + } else { + geometry = new ol.geom.LineString(null); + geometry.setFlatCoordinates(ol.geom.GeometryLayout.XY, flatCoordinates); + } + var feature = new ol.Feature(geometry); + feature.setId(id); + feature.setValues(values.tags); + state.features.push(feature); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.Feature|undefined} Track. + */ +ol.format.OSMXML.readNd_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'nd'); + var values = /** @type {Object} */ (objectStack[objectStack.length - 1]); + values.ndrefs.push(node.getAttribute('ref')); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + * @return {ol.Feature|undefined} Track. + */ +ol.format.OSMXML.readTag_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'tag'); + var values = /** @type {Object} */ (objectStack[objectStack.length - 1]); + goog.object.set(values.tags, node.getAttribute('k'), node.getAttribute('v')); +}; + + +/** + * @const + * @private + * @type {Array.} + */ +ol.format.OSMXML.NAMESPACE_URIS_ = [ + null +]; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.OSMXML.WAY_PARSERS_ = ol.xml.makeParsersNS( + ol.format.OSMXML.NAMESPACE_URIS_, { + 'nd': ol.format.OSMXML.readNd_, + 'tag': ol.format.OSMXML.readTag_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.OSMXML.PARSERS_ = ol.xml.makeParsersNS( + ol.format.OSMXML.NAMESPACE_URIS_, { + 'node': ol.format.OSMXML.readNode_, + 'way': ol.format.OSMXML.readWay_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.OSMXML.NODE_PARSERS_ = ol.xml.makeParsersNS( + ol.format.OSMXML.NAMESPACE_URIS_, { + 'tag': ol.format.OSMXML.readTag_ + }); + + +/** + * @inheritDoc + */ +ol.format.OSMXML.prototype.readFeaturesFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if (node.localName == 'osm') { + var state = ol.xml.pushParseAndPop({ + nodes: {}, + features: [] + }, ol.format.OSMXML.PARSERS_, node, []); + if (goog.isDef(state.features)) { + return state.features; + } + } + return []; +}; + + +/** + * @inheritDoc + */ +ol.format.OSMXML.prototype.readProjectionFromDocument = function(doc) { + return ol.proj.get('EPSG:4326'); +}; + + +/** + * @inheritDoc + */ +ol.format.OSMXML.prototype.readProjectionFromNode = function(node) { + return ol.proj.get('EPSG:4326'); +}; diff --git a/float-no-zero/ol/ol/format/polylineformat.js b/float-no-zero/ol/ol/format/polylineformat.js new file mode 100644 index 0000000000..a376e827ec --- /dev/null +++ b/float-no-zero/ol/ol/format/polylineformat.js @@ -0,0 +1,327 @@ +goog.provide('ol.format.Polyline'); + +goog.require('goog.asserts'); +goog.require('ol.Feature'); +goog.require('ol.format.TextFeature'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.flat'); +goog.require('ol.proj'); + + + +/** + * @constructor + * @extends {ol.format.TextFeature} + */ +ol.format.Polyline = function() { + goog.base(this); +}; +goog.inherits(ol.format.Polyline, ol.format.TextFeature); + + +/** + * Encode a list of coordinates in a flat array and return an encoded string + * + * Attention: This function will modify the passed array! + * + * @param {Array.} flatPoints A flat array of coordinates. + * @param {number=} opt_dimension The dimension of the coordinates in the array. + * @return {string} The encoded string. + */ +ol.format.Polyline.encodeFlatCoordinates = function(flatPoints, opt_dimension) { + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + return ol.format.Polyline.encodeDeltas(flatPoints, dimension); +}; + + +/** + * Decode a list of coordinates from an encoded string into a flat array + * + * @param {string} encoded An encoded string. + * @param {number=} opt_dimension The dimension of the coordinates in the + * encoded string. + * @return {Array.} A flat array of coordinates. + */ +ol.format.Polyline.decodeFlatCoordinates = function(encoded, opt_dimension) { + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + return ol.format.Polyline.decodeDeltas(encoded, dimension); +}; + + +/** + * Encode a list of n-dimensional points and return an encoded string + * + * Attention: This function will modify the passed array! + * + * @param {Array.} numbers A list of n-dimensional points. + * @param {number} dimension The dimension of the points in the list. + * @param {number=} opt_factor The factor by which the numbers will be + * multiplied. The remaining decimal places will get rounded away. + * Default is `1e5`. + * @return {string} The encoded string. + */ +ol.format.Polyline.encodeDeltas = function(numbers, dimension, opt_factor) { + var factor = goog.isDef(opt_factor) ? opt_factor : 1e5; + var d; + + var lastNumbers = new Array(dimension); + for (d = 0; d < dimension; ++d) { + lastNumbers[d] = 0; + } + + var i, ii; + for (i = 0, ii = numbers.length; i < ii;) { + for (d = 0; d < dimension; ++d, ++i) { + var num = numbers[i]; + var delta = num - lastNumbers[d]; + lastNumbers[d] = num; + + numbers[i] = delta; + } + } + + return ol.format.Polyline.encodeFloats(numbers, factor); +}; + + +/** + * Decode a list of n-dimensional points from an encoded string + * + * @param {string} encoded An encoded string. + * @param {number} dimension The dimension of the points in the encoded string. + * @param {number=} opt_factor The factor by which the resulting numbers will + * be divided. Default is `1e5`. + * @return {Array.} A list of n-dimensional points. + */ +ol.format.Polyline.decodeDeltas = function(encoded, dimension, opt_factor) { + var factor = goog.isDef(opt_factor) ? opt_factor : 1e5; + var d; + + /** @type {Array.} */ + var lastNumbers = new Array(dimension); + for (d = 0; d < dimension; ++d) { + lastNumbers[d] = 0; + } + + var numbers = ol.format.Polyline.decodeFloats(encoded, factor); + + var i, ii; + for (i = 0, ii = numbers.length; i < ii;) { + for (d = 0; d < dimension; ++d, ++i) { + lastNumbers[d] += numbers[i]; + + numbers[i] = lastNumbers[d]; + } + } + + return numbers; +}; + + +/** + * Encode a list of floating point numbers and return an encoded string + * + * Attention: This function will modify the passed array! + * + * @param {Array.} numbers A list of floating point numbers. + * @param {number=} opt_factor The factor by which the numbers will be + * multiplied. The remaining decimal places will get rounded away. + * Default is `1e5`. + * @return {string} The encoded string. + */ +ol.format.Polyline.encodeFloats = function(numbers, opt_factor) { + var factor = goog.isDef(opt_factor) ? opt_factor : 1e5; + + var i, ii; + for (i = 0, ii = numbers.length; i < ii; ++i) { + numbers[i] = Math.round(numbers[i] * factor); + } + + return ol.format.Polyline.encodeSignedIntegers(numbers); +}; + + +/** + * Decode a list of floating point numbers from an encoded string + * + * @param {string} encoded An encoded string. + * @param {number=} opt_factor The factor by which the result will be divided. + * Default is `1e5`. + * @return {Array.} A list of floating point numbers. + */ +ol.format.Polyline.decodeFloats = function(encoded, opt_factor) { + var factor = goog.isDef(opt_factor) ? opt_factor : 1e5; + var numbers = ol.format.Polyline.decodeSignedIntegers(encoded); + var i, ii; + for (i = 0, ii = numbers.length; i < ii; ++i) { + numbers[i] /= factor; + } + return numbers; +}; + + +/** + * Encode a list of signed integers and return an encoded string + * + * Attention: This function will modify the passed array! + * + * @param {Array.} numbers A list of signed integers. + * @return {string} The encoded string. + */ +ol.format.Polyline.encodeSignedIntegers = function(numbers) { + var i, ii; + for (i = 0, ii = numbers.length; i < ii; ++i) { + var num = numbers[i]; + numbers[i] = (num < 0) ? ~(num << 1) : (num << 1); + } + return ol.format.Polyline.encodeUnsignedIntegers(numbers); +}; + + +/** + * Decode a list of signed integers from an encoded string + * + * @param {string} encoded An encoded string. + * @return {Array.} A list of signed integers. + */ +ol.format.Polyline.decodeSignedIntegers = function(encoded) { + var numbers = ol.format.Polyline.decodeUnsignedIntegers(encoded); + var i, ii; + for (i = 0, ii = numbers.length; i < ii; ++i) { + var num = numbers[i]; + numbers[i] = (num & 1) ? ~(num >> 1) : (num >> 1); + } + return numbers; +}; + + +/** + * Encode a list of unsigned integers and return an encoded string + * + * @param {Array.} numbers A list of unsigned integers. + * @return {string} The encoded string. + */ +ol.format.Polyline.encodeUnsignedIntegers = function(numbers) { + var encoded = ''; + var i, ii; + for (i = 0, ii = numbers.length; i < ii; ++i) { + encoded += ol.format.Polyline.encodeUnsignedInteger(numbers[i]); + } + return encoded; +}; + + +/** + * Decode a list of unsigned integers from an encoded string + * + * @param {string} encoded An encoded string. + * @return {Array.} A list of unsigned integers. + */ +ol.format.Polyline.decodeUnsignedIntegers = function(encoded) { + var numbers = []; + var current = 0; + var shift = 0; + var i, ii; + for (i = 0, ii = encoded.length; i < ii; ++i) { + var b = encoded.charCodeAt(i) - 63; + current |= (b & 0x1f) << shift; + if (b < 0x20) { + numbers.push(current); + current = 0; + shift = 0; + } else { + shift += 5; + } + } + return numbers; +}; + + +/** + * Encode one single unsigned integer and return an encoded string + * + * @param {number} num Unsigned integer that should be encoded. + * @return {string} The encoded string. + */ +ol.format.Polyline.encodeUnsignedInteger = function(num) { + var value, encoded = ''; + while (num >= 0x20) { + value = (0x20 | (num & 0x1f)) + 63; + encoded += String.fromCharCode(value); + num >>= 5; + } + value = num + 63; + encoded += String.fromCharCode(value); + return encoded; +}; + + +/** + * @inheritDoc + */ +ol.format.Polyline.prototype.readFeatureFromText = function(text) { + var geometry = this.readGeometryFromText(text); + return new ol.Feature(geometry); +}; + + +/** + * @inheritDoc + */ +ol.format.Polyline.prototype.readFeaturesFromText = function(text) { + var feature = this.readFeatureFromText(text); + return [feature]; +}; + + +/** + * @inheritDoc + */ +ol.format.Polyline.prototype.readGeometryFromText = function(text) { + var flatCoordinates = ol.format.Polyline.decodeFlatCoordinates(text, 2); + var coordinates = ol.geom.flat.inflateCoordinates( + flatCoordinates, 0, flatCoordinates.length, 2); + return new ol.geom.LineString(coordinates); +}; + + +/** + * @inheritDoc + */ +ol.format.Polyline.prototype.readProjectionFromText = function(text) { + return ol.proj.get('EPSG:4326'); +}; + + +/** + * @inheritDoc + */ +ol.format.Polyline.prototype.writeFeatureText = function(feature) { + var geometry = feature.getGeometry(); + if (goog.isDefAndNotNull(geometry)) { + return this.writeGeometryText(geometry); + } else { + goog.asserts.fail(); + return ''; + } +}; + + +/** + * @inheritDoc + */ +ol.format.Polyline.prototype.writeFeaturesText = function(features) { + goog.asserts.assert(features.length == 1); + return this.writeFeatureText(features[0]); +}; + + +/** + * @inheritDoc + */ +ol.format.Polyline.prototype.writeGeometryText = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + var flatCoordinates = geometry.getFlatCoordinates(); + var stride = geometry.getStride(); + return ol.format.Polyline.encodeFlatCoordinates(flatCoordinates, stride); +}; diff --git a/float-no-zero/ol/ol/format/textfeatureformat.js b/float-no-zero/ol/ol/format/textfeatureformat.js new file mode 100644 index 0000000000..eea4cb5322 --- /dev/null +++ b/float-no-zero/ol/ol/format/textfeatureformat.js @@ -0,0 +1,151 @@ +goog.provide('ol.format.TextFeature'); + +goog.require('goog.asserts'); +goog.require('ol.format.Feature'); +goog.require('ol.format.FormatType'); + + + +/** + * @constructor + * @extends {ol.format.Feature} + */ +ol.format.TextFeature = function() { + goog.base(this); +}; +goog.inherits(ol.format.TextFeature, ol.format.Feature); + + +/** + * @param {Document|Node|Object|string} source Source. + * @private + * @return {string} Text. + */ +ol.format.TextFeature.prototype.getText_ = function(source) { + if (goog.isString(source)) { + return source; + } else { + goog.asserts.fail(); + return ''; + } +}; + + +/** + * @inheritDoc + */ +ol.format.TextFeature.prototype.getType = function() { + return ol.format.FormatType.TEXT; +}; + + +/** + * @inheritDoc + */ +ol.format.TextFeature.prototype.readFeature = function(source) { + return this.readFeatureFromText(this.getText_(source)); +}; + + +/** + * @param {string} text Text. + * @protected + * @return {ol.Feature} Feature. + */ +ol.format.TextFeature.prototype.readFeatureFromText = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.TextFeature.prototype.readFeatures = function(source) { + return this.readFeaturesFromText(this.getText_(source)); +}; + + +/** + * @param {string} text Text. + * @protected + * @return {Array.} Features. + */ +ol.format.TextFeature.prototype.readFeaturesFromText = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.TextFeature.prototype.readGeometry = function(source) { + return this.readGeometryFromText(this.getText_(source)); +}; + + +/** + * @param {string} text Text. + * @protected + * @return {ol.geom.Geometry} Geometry. + */ +ol.format.TextFeature.prototype.readGeometryFromText = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.TextFeature.prototype.readProjection = function(source) { + return this.readProjectionFromText(this.getText_(source)); +}; + + +/** + * @param {string} text Text. + * @protected + * @return {ol.proj.Projection} Projection. + */ +ol.format.TextFeature.prototype.readProjectionFromText = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.TextFeature.prototype.writeFeature = function(feature) { + return this.writeFeatureText(feature); +}; + + +/** + * @param {ol.Feature} feature Features. + * @protected + * @return {string} Text. + */ +ol.format.TextFeature.prototype.writeFeatureText = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.TextFeature.prototype.writeFeatures = function(features) { + return this.writeFeaturesText(features); +}; + + +/** + * @param {Array.} features Features. + * @protected + * @return {string} Text. + */ +ol.format.TextFeature.prototype.writeFeaturesText = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.TextFeature.prototype.writeGeometry = function(geometry) { + return this.writeGeometryText(geometry); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @protected + * @return {string} Text. + */ +ol.format.TextFeature.prototype.writeGeometryText = goog.abstractMethod; diff --git a/float-no-zero/ol/ol/format/topojsonformat.exports b/float-no-zero/ol/ol/format/topojsonformat.exports new file mode 100644 index 0000000000..367c42efb8 --- /dev/null +++ b/float-no-zero/ol/ol/format/topojsonformat.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.format.TopoJSON +@exportProperty ol.format.TopoJSON.prototype.readFeatures +@exportProperty ol.format.TopoJSON.prototype.readProjection diff --git a/float-no-zero/ol/ol/format/topojsonformat.js b/float-no-zero/ol/ol/format/topojsonformat.js new file mode 100644 index 0000000000..3095cf7078 --- /dev/null +++ b/float-no-zero/ol/ol/format/topojsonformat.js @@ -0,0 +1,386 @@ +goog.provide('ol.format.TopoJSON'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.object'); +goog.require('ol.Feature'); +goog.require('ol.format.JSONFeature'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.MultiPoint'); +goog.require('ol.geom.MultiPolygon'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.Polygon'); +goog.require('ol.proj'); + + + +/** + * @constructor + * @extends {ol.format.JSONFeature} + * @param {olx.format.TopoJSONOptions=} opt_options Options. + * @todo stability experimental + */ +ol.format.TopoJSON = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + /** + * @private + * @type {ol.proj.Projection} + */ + this.defaultProjection_ = + ol.proj.get(options.defaultProjection || 'EPSG:4326'); + +}; +goog.inherits(ol.format.TopoJSON, ol.format.JSONFeature); + + +/** + * @const {Array.} + * @private + */ +ol.format.TopoJSON.EXTENSIONS_ = ['.topojson']; + + +/** + * Concatenate arcs into a coordinate array. + * @param {Array.} indices Indices of arcs to concatenate. Negative + * values indicate arcs need to be reversed. + * @param {Array.>} arcs Array of arcs (already + * transformed). + * @return {Array.>} Coordinates array. + * @private + */ +ol.format.TopoJSON.concatenateArcs_ = function(indices, arcs) { + var coordinates = []; + var index, arc; + var i, ii; + var j, jj; + for (i = 0, ii = indices.length; i < ii; ++i) { + index = indices[i]; + if (i > 0) { + // splicing together arcs, discard last point + coordinates.pop(); + } + if (index >= 0) { + // forward arc + arc = arcs[index]; + } else { + // reverse arc + arc = arcs[~index].slice().reverse(); + } + coordinates.push.apply(coordinates, arc); + } + // provide fresh copies of coordinate arrays + for (j = 0, jj = coordinates.length; j < jj; ++j) { + coordinates[j] = coordinates[j].slice(); + } + return coordinates; +}; + + +/** + * Create a point from a TopoJSON geometry object. + * + * @param {TopoJSONGeometry} object TopoJSON object. + * @param {Array.} scale Scale for each dimension. + * @param {Array.} translate Translation for each dimension. + * @return {ol.geom.Point} Geometry. + * @private + */ +ol.format.TopoJSON.readPointGeometry_ = + function(object, scale, translate) { + var coordinates = object.coordinates; + if (goog.isDef(scale) && goog.isDef(translate)) { + ol.format.TopoJSON.transformVertex_(coordinates, scale, translate); + } + return new ol.geom.Point(coordinates); +}; + + +/** + * Create a multi-point from a TopoJSON geometry object. + * + * @param {TopoJSONGeometry} object TopoJSON object. + * @param {Array.} scale Scale for each dimension. + * @param {Array.} translate Translation for each dimension. + * @return {ol.geom.MultiPoint} Geometry. + * @private + */ +ol.format.TopoJSON.readMultiPointGeometry_ = function(object, scale, + translate) { + var coordinates = object.coordinates; + var i, ii; + if (goog.isDef(scale) && goog.isDef(translate)) { + for (i = 0, ii = coordinates.length; i < ii; ++i) { + ol.format.TopoJSON.transformVertex_(coordinates[i], scale, translate); + } + } + return new ol.geom.MultiPoint(coordinates); +}; + + +/** + * Create a linestring from a TopoJSON geometry object. + * + * @param {TopoJSONGeometry} object TopoJSON object. + * @param {Array.>} arcs Array of arcs. + * @return {ol.geom.LineString} Geometry. + * @private + */ +ol.format.TopoJSON.readLineStringGeometry_ = function(object, arcs) { + var coordinates = ol.format.TopoJSON.concatenateArcs_(object.arcs, arcs); + return new ol.geom.LineString(goog.array.flatten(coordinates)); +}; + + +/** + * Create a multi-linestring from a TopoJSON geometry object. + * + * @param {TopoJSONGeometry} object TopoJSON object. + * @param {Array.>} arcs Array of arcs. + * @return {ol.geom.MultiLineString} Geometry. + * @private + */ +ol.format.TopoJSON.readMultiLineStringGeometry_ = function(object, arcs) { + var coordinates = []; + var i, ii; + for (i = 0, ii = object.arcs.length; i < ii; ++i) { + coordinates[i] = ol.format.TopoJSON.concatenateArcs_(object.arcs[i], arcs); + } + return new ol.geom.MultiLineString(coordinates); +}; + + +/** + * Create a polygon from a TopoJSON geometry object. + * + * @param {TopoJSONGeometry} object TopoJSON object. + * @param {Array.>} arcs Array of arcs. + * @return {ol.geom.Polygon} Geometry. + * @private + */ +ol.format.TopoJSON.readPolygonGeometry_ = function(object, arcs) { + var coordinates = []; + var i, ii; + for (i = 0, ii = object.arcs.length; i < ii; ++i) { + coordinates[i] = ol.format.TopoJSON.concatenateArcs_(object.arcs[i], arcs); + } + return new ol.geom.Polygon(coordinates); +}; + + +/** + * Create a multi-polygon from a TopoJSON geometry object. + * + * @param {TopoJSONGeometry} object TopoJSON object. + * @param {Array.>} arcs Array of arcs. + * @return {ol.geom.MultiPolygon} Geometry. + * @private + */ +ol.format.TopoJSON.readMultiPolygonGeometry_ = function(object, arcs) { + var coordinates = []; + var polyArray, ringCoords, j, jj; + var i, ii; + for (i = 0, ii = object.arcs.length; i < ii; ++i) { + // for each polygon + polyArray = object.arcs[i]; + ringCoords = []; + for (j = 0, jj = polyArray.length; j < jj; ++j) { + // for each ring + ringCoords[j] = ol.format.TopoJSON.concatenateArcs_(polyArray[j], arcs); + } + coordinates[i] = ringCoords; + } + return new ol.geom.MultiPolygon(coordinates); +}; + + +/** + * @inheritDoc + */ +ol.format.TopoJSON.prototype.getExtensions = function() { + return ol.format.TopoJSON.EXTENSIONS_; +}; + + +/** + * Create features from a TopoJSON GeometryCollection object. + * + * @param {TopoJSONGeometryCollection} collection TopoJSON Geometry + * object. + * @param {Array.>} arcs Array of arcs. + * @param {Array.} scale Scale for each dimension. + * @param {Array.} translate Translation for each dimension. + * @return {Array.} Array of features. + * @private + */ +ol.format.TopoJSON.readFeaturesFromGeometryCollection_ = function( + collection, arcs, scale, translate) { + var geometries = collection.geometries; + var features = []; + var i, ii; + for (i = 0, ii = geometries.length; i < ii; ++i) { + features[i] = ol.format.TopoJSON.readFeatureFromGeometry_( + geometries[i], arcs, scale, translate); + } + return features; +}; + + +/** + * Create a feature from a TopoJSON geometry object. + * + * @param {TopoJSONGeometry} object TopoJSON geometry object. + * @param {Array.>} arcs Array of arcs. + * @param {Array.} scale Scale for each dimension. + * @param {Array.} translate Translation for each dimension. + * @return {ol.Feature} Feature. + * @private + */ +ol.format.TopoJSON.readFeatureFromGeometry_ = function(object, arcs, + scale, translate) { + var geometry; + var type = object.type; + var geometryReader = ol.format.TopoJSON.GEOMETRY_READERS_[type]; + goog.asserts.assert(goog.isDef(geometryReader)); + if ((type === 'Point') || (type === 'MultiPoint')) { + geometry = geometryReader(object, scale, translate); + } else { + geometry = geometryReader(object, arcs); + } + var feature = new ol.Feature(); + feature.setGeometry(geometry); + if (goog.isDef(object.id)) { + feature.setId(object.id); + } + if (goog.isDef(object.properties)) { + feature.setValues(object.properties); + } + return feature; +}; + + +/** + * @inheritDoc + */ +ol.format.TopoJSON.prototype.readFeaturesFromObject = function(object) { + if (object.type == 'Topology') { + var topoJSONTopology = /** @type {TopoJSONTopology} */ (object); + var transform, scale = null, translate = null; + if (goog.isDef(topoJSONTopology.transform)) { + transform = /** @type {TopoJSONTransform} */ + (topoJSONTopology.transform); + scale = transform.scale; + translate = transform.translate; + } + var arcs = topoJSONTopology.arcs; + if (goog.isDef(transform)) { + ol.format.TopoJSON.transformArcs_(arcs, scale, translate); + } + /** @type {Array.} */ + var features = []; + var topoJSONFeatures = goog.object.getValues(topoJSONTopology.objects); + var i, ii; + var feature; + for (i = 0, ii = topoJSONFeatures.length; i < ii; ++i) { + if (topoJSONFeatures[i].type === 'GeometryCollection') { + feature = /** @type {TopoJSONGeometryCollection} */ + (topoJSONFeatures[i]); + features.push.apply(features, + ol.format.TopoJSON.readFeaturesFromGeometryCollection_( + feature, arcs, scale, translate)); + } else { + feature = /** @type {TopoJSONGeometry} */ + (topoJSONFeatures[i]); + features.push(ol.format.TopoJSON.readFeatureFromGeometry_( + feature, arcs, scale, translate)); + } + } + return features; + } else { + return []; + } +}; + + +/** + * Apply a linear transform to array of arcs. The provided array of arcs is + * modified in place. + * + * @param {Array.>} arcs Array of arcs. + * @param {Array.} scale Scale for each dimension. + * @param {Array.} translate Translation for each dimension. + * @private + */ +ol.format.TopoJSON.transformArcs_ = function(arcs, scale, translate) { + var i, ii; + for (i = 0, ii = arcs.length; i < ii; ++i) { + ol.format.TopoJSON.transformArc_(arcs[i], scale, translate); + } +}; + + +/** + * Apply a linear transform to an arc. The provided arc is modified in place. + * + * @param {Array.} arc Arc. + * @param {Array.} scale Scale for each dimension. + * @param {Array.} translate Translation for each dimension. + * @private + */ +ol.format.TopoJSON.transformArc_ = function(arc, scale, translate) { + var x = 0; + var y = 0; + var vertex; + var i, ii; + for (i = 0, ii = arc.length; i < ii; ++i) { + vertex = arc[i]; + x += vertex[0]; + y += vertex[1]; + vertex[0] = x; + vertex[1] = y; + ol.format.TopoJSON.transformVertex_(vertex, scale, translate); + } +}; + + +/** + * Apply a linear transform to a vertex. The provided vertex is modified in + * place. + * + * @param {ol.Coordinate} vertex Vertex. + * @param {Array.} scale Scale for each dimension. + * @param {Array.} translate Translation for each dimension. + * @private + */ +ol.format.TopoJSON.transformVertex_ = function(vertex, scale, translate) { + vertex[0] = vertex[0] * scale[0] + translate[0]; + vertex[1] = vertex[1] * scale[1] + translate[1]; +}; + + +/** + * @inheritDoc + */ +ol.format.TopoJSON.prototype.readProjection = function(object) { + return this.defaultProjection_; +}; + + +/** + * @const + * @private + * @type {Object.} + */ +ol.format.TopoJSON.GEOMETRY_READERS_ = { + 'Point': ol.format.TopoJSON.readPointGeometry_, + 'LineString': ol.format.TopoJSON.readLineStringGeometry_, + 'Polygon': ol.format.TopoJSON.readPolygonGeometry_, + 'MultiPoint': ol.format.TopoJSON.readMultiPointGeometry_, + 'MultiLineString': ol.format.TopoJSON.readMultiLineStringGeometry_, + 'MultiPolygon': ol.format.TopoJSON.readMultiPolygonGeometry_ +}; diff --git a/float-no-zero/ol/ol/format/xmlfeatureformat.js b/float-no-zero/ol/ol/format/xmlfeatureformat.js new file mode 100644 index 0000000000..443484da42 --- /dev/null +++ b/float-no-zero/ol/ol/format/xmlfeatureformat.js @@ -0,0 +1,226 @@ +goog.provide('ol.format.XMLFeature'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom.NodeType'); +goog.require('ol.format.Feature'); +goog.require('ol.format.FormatType'); +goog.require('ol.xml'); + + + +/** + * @constructor + * @extends {ol.format.Feature} + */ +ol.format.XMLFeature = function() { + goog.base(this); +}; +goog.inherits(ol.format.XMLFeature, ol.format.Feature); + + +/** + * @inheritDoc + */ +ol.format.XMLFeature.prototype.getType = function() { + return ol.format.FormatType.XML; +}; + + +/** + * @inheritDoc + */ +ol.format.XMLFeature.prototype.readFeature = function(source) { + if (ol.xml.isDocument(source)) { + return this.readFeatureFromDocument(/** @type {Document} */ (source)); + } else if (ol.xml.isNode(source)) { + return this.readFeatureFromNode(/** @type {Node} */ (source)); + } else if (goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readFeatureFromDocument(doc); + } else { + goog.asserts.fail(); + return null; + } +}; + + +/** + * @param {Document} doc Document. + * @return {ol.Feature} Feature. + */ +ol.format.XMLFeature.prototype.readFeatureFromDocument = function(doc) { + var features = this.readFeaturesFromDocument(doc); + if (features.length > 0) { + return features[0]; + } else { + return null; + } +}; + + +/** + * @param {Node} node Node. + * @return {ol.Feature} Feature. + */ +ol.format.XMLFeature.prototype.readFeatureFromNode = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.XMLFeature.prototype.readFeatures = function(source) { + if (ol.xml.isDocument(source)) { + return this.readFeaturesFromDocument(/** @type {Document} */ (source)); + } else if (ol.xml.isNode(source)) { + return this.readFeaturesFromNode(/** @type {Node} */ (source)); + } else if (goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readFeaturesFromDocument(doc); + } else { + goog.asserts.fail(); + return []; + } +}; + + +/** + * @param {Document} doc Document. + * @protected + * @return {Array.} Features. + */ +ol.format.XMLFeature.prototype.readFeaturesFromDocument = function(doc) { + /** @type {Array.} */ + var features = []; + var n; + for (n = doc.firstChild; !goog.isNull(n); n = n.nextSibling) { + if (n.nodeType == goog.dom.NodeType.ELEMENT) { + goog.array.extend(features, this.readFeaturesFromNode(n)); + } + } + return features; +}; + + +/** + * @param {Node} node Node. + * @protected + * @return {Array.} Features. + */ +ol.format.XMLFeature.prototype.readFeaturesFromNode = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.XMLFeature.prototype.readGeometry = function(source) { + if (ol.xml.isDocument(source)) { + return this.readGeometryFromDocument(/** @type {Document} */ (source)); + } else if (ol.xml.isNode(source)) { + return this.readGeometryFromNode(/** @type {Node} */ (source)); + } else if (goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readGeometryFromDocument(doc); + } else { + goog.asserts.fail(); + return null; + } +}; + + +/** + * @param {Document} doc Document. + * @protected + * @return {ol.geom.Geometry} Geometry. + */ +ol.format.XMLFeature.prototype.readGeometryFromDocument = goog.abstractMethod; + + +/** + * @param {Node} node Node. + * @protected + * @return {ol.geom.Geometry} Geometry. + */ +ol.format.XMLFeature.prototype.readGeometryFromNode = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.XMLFeature.prototype.readProjection = function(source) { + if (ol.xml.isDocument(source)) { + return this.readProjectionFromDocument(/** @type {Document} */ (source)); + } else if (ol.xml.isNode(source)) { + return this.readProjectionFromNode(/** @type {Node} */ (source)); + } else if (goog.isString(source)) { + var doc = ol.xml.load(source); + return this.readProjectionFromDocument(doc); + } else { + goog.asserts.fail(); + return null; + } +}; + + +/** + * @param {Document} doc Document. + * @protected + * @return {ol.proj.Projection} Projection. + */ +ol.format.XMLFeature.prototype.readProjectionFromDocument = goog.abstractMethod; + + +/** + * @param {Node} node Node. + * @protected + * @return {ol.proj.Projection} Projection. + */ +ol.format.XMLFeature.prototype.readProjectionFromNode = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.XMLFeature.prototype.writeFeature = function(feature) { + return this.writeFeatureNode(feature); +}; + + +/** + * @param {ol.Feature} feature Feature. + * @protected + * @return {Node} Node. + */ +ol.format.XMLFeature.prototype.writeFeatureNode = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.XMLFeature.prototype.writeFeatures = function(features) { + return this.writeFeaturesNode(features); +}; + + +/** + * @param {Array.} features Features. + * @protected + * @return {Node} Node. + */ +ol.format.XMLFeature.prototype.writeFeaturesNode = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.format.XMLFeature.prototype.writeGeometry = function(geometry) { + return this.writeGeometryNode(geometry); +}; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @protected + * @return {Node} Node. + */ +ol.format.XMLFeature.prototype.writeGeometryNode = goog.abstractMethod; diff --git a/float-no-zero/ol/ol/format/xsdformat.js b/float-no-zero/ol/ol/format/xsdformat.js new file mode 100644 index 0000000000..f60fa4cc4f --- /dev/null +++ b/float-no-zero/ol/ol/format/xsdformat.js @@ -0,0 +1,174 @@ +goog.provide('ol.format.XSD'); + +goog.require('goog.asserts'); +goog.require('goog.string'); +goog.require('ol.xml'); + + +/** + * @const + * @type {string} + */ +ol.format.XSD.NAMESPACE_URI = 'http://www.w3.org/2001/XMLSchema'; + + +/** + * @param {Node} node Node. + * @return {boolean|undefined} Boolean. + */ +ol.format.XSD.readBoolean = function(node) { + var s = ol.xml.getAllTextContent(node, false); + return ol.format.XSD.readBooleanString(s); +}; + + +/** + * @param {string} string String. + * @return {boolean|undefined} Boolean. + */ +ol.format.XSD.readBooleanString = function(string) { + var m = /^\s*(true|1)|(false|0)\s*$/.exec(string); + if (m) { + return goog.isDef(m[1]) || false; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @return {number|undefined} DateTime in seconds. + */ +ol.format.XSD.readDateTime = function(node) { + var s = ol.xml.getAllTextContent(node, false); + var re = + /^\s*(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(Z|(?:([+\-])(\d{2})(?::(\d{2}))?))\s*$/; + var m = re.exec(s); + if (m) { + var year = parseInt(m[1], 10); + var month = parseInt(m[2], 10) - 1; + var day = parseInt(m[3], 10); + var hour = parseInt(m[4], 10); + var minute = parseInt(m[5], 10); + var second = parseInt(m[6], 10); + var dateTime = Date.UTC(year, month, day, hour, minute, second) / 1000; + if (m[7] != 'Z') { + var sign = m[8] == '-' ? -1 : 1; + dateTime += sign * 60 * parseInt(m[9], 10); + if (goog.isDef(m[10])) { + dateTime += sign * 60 * 60 * parseInt(m[10], 10); + } + } + return dateTime; + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @return {number|undefined} Decimal. + */ +ol.format.XSD.readDecimal = function(node) { + var s = ol.xml.getAllTextContent(node, false); + return ol.format.XSD.readDecimalString(s); +}; + + +/** + * @param {string} string String. + * @return {number|undefined} Decimal. + */ +ol.format.XSD.readDecimalString = function(string) { + // FIXME check spec + var m = /^\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)\s*$/i.exec(string); + if (m) { + return parseFloat(m[1]); + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @return {number|undefined} Non negative integer. + */ +ol.format.XSD.readNonNegativeInteger = function(node) { + var s = ol.xml.getAllTextContent(node, false); + return ol.format.XSD.readNonNegativeIntegerString(s); +}; + + +/** + * @param {string} string String. + * @return {number|undefined} Non negative integer. + */ +ol.format.XSD.readNonNegativeIntegerString = function(string) { + var m = /^\s*(\d+)\s*$/.exec(string); + if (m) { + return parseInt(m[1], 10); + } else { + return undefined; + } +}; + + +/** + * @param {Node} node Node. + * @return {string|undefined} String. + */ +ol.format.XSD.readString = function(node) { + var s = ol.xml.getAllTextContent(node, false); + return goog.string.trim(s); +}; + + +/** + * @param {Node} node Node to append a TextNode with the dateTime to. + * @param {number} dateTime DateTime in seconds. + */ +ol.format.XSD.writeDateTimeTextNode = function(node, dateTime) { + var date = new Date(dateTime * 1000); + var string = date.getUTCFullYear() + '-' + + goog.string.padNumber(date.getUTCMonth() + 1, 2) + '-' + + goog.string.padNumber(date.getUTCDate(), 2) + 'T' + + goog.string.padNumber(date.getUTCHours(), 2) + ':' + + goog.string.padNumber(date.getUTCMinutes(), 2) + ':' + + goog.string.padNumber(date.getUTCSeconds(), 2) + 'Z'; + node.appendChild(ol.xml.DOCUMENT.createTextNode(string)); +}; + + +/** + * @param {Node} node Node to append a TextNode with the decimal to. + * @param {number} decimal Decimal. + */ +ol.format.XSD.writeDecimalTextNode = function(node, decimal) { + var string = decimal.toPrecision(); + node.appendChild(ol.xml.DOCUMENT.createTextNode(string)); +}; + + +/** + * @param {Node} node Node to append a TextNode with the decimal to. + * @param {number} nonNegativeInteger Non negative integer. + */ +ol.format.XSD.writeNonNegativeIntegerTextNode = + function(node, nonNegativeInteger) { + goog.asserts.assert(nonNegativeInteger >= 0); + goog.asserts.assert(nonNegativeInteger == (nonNegativeInteger | 0)); + var string = nonNegativeInteger.toString(); + node.appendChild(ol.xml.DOCUMENT.createTextNode(string)); +}; + + +/** + * @param {Node} node Node to append a TextNode with the string to. + * @param {string} string String. + */ +ol.format.XSD.writeStringTextNode = function(node, string) { + node.appendChild(ol.xml.DOCUMENT.createTextNode(string)); +}; diff --git a/float-no-zero/ol/ol/framestate.js b/float-no-zero/ol/ol/framestate.js new file mode 100644 index 0000000000..23bfee5234 --- /dev/null +++ b/float-no-zero/ol/ol/framestate.js @@ -0,0 +1,52 @@ +// FIXME add view3DState +// FIXME factor out common code between usedTiles and wantedTiles + +goog.provide('ol.FrameState'); +goog.provide('ol.PostRenderFunction'); +goog.provide('ol.PreRenderFunction'); + +goog.require('goog.vec.Mat4'); +goog.require('ol.Attribution'); +goog.require('ol.Extent'); +goog.require('ol.Size'); +goog.require('ol.TileQueue'); +goog.require('ol.TileRange'); +goog.require('ol.View2DState'); +goog.require('ol.layer.Layer'); +goog.require('ol.layer.LayerState'); + + +/** + * @typedef {{animate: boolean, + * attributions: Object., + * coordinateToPixelMatrix: goog.vec.Mat4.Number, + * extent: (null|ol.Extent), + * focus: ol.Coordinate, + * index: number, + * layersArray: Array., + * layerStates: Object., + * logos: Object., + * pixelRatio: number, + * pixelToCoordinateMatrix: goog.vec.Mat4.Number, + * postRenderFunctions: Array., + * size: ol.Size, + * tileQueue: ol.TileQueue, + * time: number, + * usedTiles: Object.>, + * view2DState: ol.View2DState, + * viewHints: Array., + * wantedTiles: Object.>}} + */ +ol.FrameState; + + +/** + * @typedef {function(ol.Map, ?ol.FrameState): boolean} + */ +ol.PostRenderFunction; + + +/** + * @typedef {function(ol.Map, ?ol.FrameState): boolean} + */ +ol.PreRenderFunction; diff --git a/float-no-zero/ol/ol/geolocation.exports b/float-no-zero/ol/ol/geolocation.exports new file mode 100644 index 0000000000..adc26edc01 --- /dev/null +++ b/float-no-zero/ol/ol/geolocation.exports @@ -0,0 +1 @@ +@exportSymbol ol.Geolocation diff --git a/float-no-zero/ol/ol/geolocation.js b/float-no-zero/ol/ol/geolocation.js new file mode 100644 index 0000000000..cc489b1b9e --- /dev/null +++ b/float-no-zero/ol/ol/geolocation.js @@ -0,0 +1,373 @@ +// FIXME handle geolocation not supported + +goog.provide('ol.Geolocation'); +goog.provide('ol.GeolocationProperty'); + +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.math'); +goog.require('ol.BrowserFeature'); +goog.require('ol.Coordinate'); +goog.require('ol.Object'); +goog.require('ol.proj'); + + +/** + * @enum {string} + */ +ol.GeolocationProperty = { + ACCURACY: 'accuracy', + ALTITUDE: 'altitude', + ALTITUDE_ACCURACY: 'altitudeAccuracy', + HEADING: 'heading', + POSITION: 'position', + PROJECTION: 'projection', + SPEED: 'speed', + TRACKING: 'tracking', + TRACKING_OPTIONS: 'trackingOptions' +}; + + + +/** + * Helper class for providing HTML5 Geolocation capabilities. + * The [Geolocation API](http://dev.w3.org/geo/api/spec-source.html) + * is used to locate a user's position. + * + * Example: + * + * var geolocation = new ol.Geolocation(); + * // take the projection to use from the map's view + * geolocation.bindTo('projection', map.getView()); + * // listen to changes in position + * geolocation.on('change:position', function(evt) { + * window.console.log(geolocation.getPosition()); + * }); + * + * @constructor + * @extends {ol.Object} + * @param {olx.GeolocationOptions=} opt_options Options. + * @todo stability experimental + * @todo observable accuracy {number} readonly the accuracy of the position + * measurement in meters + * @todo observable altitude {number} readonly the altitude of the position in + * meters above mean sea level + * @todo observable altitudeAccuracy {number} readonly the accuracy of the + * altitude measurement in meters + * @todo observable heading {number} readonly the heading of the device in + * radians from north + * @todo observable position {ol.Coordinate} readonly the current position of + * the device reported in the current projection + * @todo observable projection {ol.proj.Projection} readonly the projection to + * report the position in + * @todo observable speed {number} readonly the instantaneous speed of the + * device in meters per second + * @todo observable tracking {number} track the device's position. + * @todo observable trackingOptions {GeolocationPositionOptions} PositionOptions + * as defined by the HTML5 Geolocation spec at + * http://dev.w3.org/geo/api/spec-source.html + */ +ol.Geolocation = function(opt_options) { + + goog.base(this); + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * The unprojected (EPSG:4326) device position. + * @private + * @type {ol.Coordinate} + */ + this.position_ = null; + + /** + * @private + * @type {ol.TransformFunction} + */ + this.transform_ = ol.proj.identityTransform; + + /** + * @private + * @type {number|undefined} + */ + this.watchId_ = undefined; + + goog.events.listen( + this, ol.Object.getChangeEventType(ol.GeolocationProperty.PROJECTION), + this.handleProjectionChanged_, false, this); + goog.events.listen( + this, ol.Object.getChangeEventType(ol.GeolocationProperty.TRACKING), + this.handleTrackingChanged_, false, this); + + if (goog.isDef(options.projection)) { + this.setProjection(ol.proj.get(options.projection)); + } + if (goog.isDef(options.trackingOptions)) { + this.setTrackingOptions(options.trackingOptions); + } + + this.setTracking(goog.isDef(options.tracking) ? options.tracking : false); + +}; +goog.inherits(ol.Geolocation, ol.Object); + + +/** + * @inheritDoc + */ +ol.Geolocation.prototype.disposeInternal = function() { + this.setTracking(false); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @private + */ +ol.Geolocation.prototype.handleProjectionChanged_ = function() { + var projection = this.getProjection(); + if (goog.isDefAndNotNull(projection)) { + this.transform_ = ol.proj.getTransformFromProjections( + ol.proj.get('EPSG:4326'), projection); + if (!goog.isNull(this.position_)) { + this.set( + ol.GeolocationProperty.POSITION, this.transform_(this.position_)); + } + } +}; + + +/** + * @private + */ +ol.Geolocation.prototype.handleTrackingChanged_ = function() { + if (ol.BrowserFeature.HAS_GEOLOCATION) { + var tracking = this.getTracking(); + if (tracking && !goog.isDef(this.watchId_)) { + this.watchId_ = goog.global.navigator.geolocation.watchPosition( + goog.bind(this.positionChange_, this), + goog.bind(this.positionError_, this), + this.getTrackingOptions()); + } else if (!tracking && goog.isDef(this.watchId_)) { + goog.global.navigator.geolocation.clearWatch(this.watchId_); + this.watchId_ = undefined; + } + } +}; + + +/** + * @private + * @param {GeolocationPosition} position position event. + */ +ol.Geolocation.prototype.positionChange_ = function(position) { + var coords = position.coords; + this.set(ol.GeolocationProperty.ACCURACY, coords.accuracy); + this.set(ol.GeolocationProperty.ALTITUDE, + goog.isNull(coords.altitude) ? undefined : coords.altitude); + this.set(ol.GeolocationProperty.ALTITUDE_ACCURACY, + goog.isNull(coords.altitudeAccuracy) ? + undefined : coords.altitudeAccuracy); + this.set(ol.GeolocationProperty.HEADING, goog.isNull(coords.heading) ? + undefined : goog.math.toRadians(coords.heading)); + if (goog.isNull(this.position_)) { + this.position_ = [coords.longitude, coords.latitude]; + } else { + this.position_[0] = coords.longitude; + this.position_[1] = coords.latitude; + } + this.set(ol.GeolocationProperty.POSITION, this.transform_(this.position_)); + this.set(ol.GeolocationProperty.SPEED, + goog.isNull(coords.speed) ? undefined : coords.speed); +}; + + +/** + * @private + * @param {GeolocationPositionError} error error object. + */ +ol.Geolocation.prototype.positionError_ = function(error) { + error.type = goog.events.EventType.ERROR; + this.dispatchEvent(error); +}; + + +/** + * Get the accuracy of the position in meters. + * @return {number|undefined} Position accuracy in meters. + * @todo stability experimental + */ +ol.Geolocation.prototype.getAccuracy = function() { + return /** @type {number|undefined} */ ( + this.get(ol.GeolocationProperty.ACCURACY)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getAccuracy', + ol.Geolocation.prototype.getAccuracy); + + +/** + * Get the altitude associated with the position. + * @return {number|undefined} The altitude in meters above the mean sea level. + * @todo stability experimental + */ +ol.Geolocation.prototype.getAltitude = function() { + return /** @type {number|undefined} */ ( + this.get(ol.GeolocationProperty.ALTITUDE)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getAltitude', + ol.Geolocation.prototype.getAltitude); + + +/** + * Get the altitude accuracy of the position. + * @return {number|undefined} Altitude accuracy in meters. + * @todo stability experimental + */ +ol.Geolocation.prototype.getAltitudeAccuracy = function() { + return /** @type {number|undefined} */ ( + this.get(ol.GeolocationProperty.ALTITUDE_ACCURACY)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getAltitudeAccuracy', + ol.Geolocation.prototype.getAltitudeAccuracy); + + +/** + * Get the heading as radians clockwise from North. + * @return {number|undefined} Heading. + * @todo stability experimental + */ +ol.Geolocation.prototype.getHeading = function() { + return /** @type {number|undefined} */ ( + this.get(ol.GeolocationProperty.HEADING)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getHeading', + ol.Geolocation.prototype.getHeading); + + +/** + * Get the position of the device. + * @return {ol.Coordinate|undefined} position. + * @todo stability experimental + */ +ol.Geolocation.prototype.getPosition = function() { + return /** @type {ol.Coordinate|undefined} */ ( + this.get(ol.GeolocationProperty.POSITION)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getPosition', + ol.Geolocation.prototype.getPosition); + + +/** + * Get the projection associated with the position. + * @return {ol.proj.Projection|undefined} projection. + * @todo stability experimental + */ +ol.Geolocation.prototype.getProjection = function() { + return /** @type {ol.proj.Projection|undefined} */ ( + this.get(ol.GeolocationProperty.PROJECTION)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getProjection', + ol.Geolocation.prototype.getProjection); + + +/** + * Get the speed in meters per second. + * @return {number|undefined} Speed. + * @todo stability experimental + */ +ol.Geolocation.prototype.getSpeed = function() { + return /** @type {number|undefined} */ ( + this.get(ol.GeolocationProperty.SPEED)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getSpeed', + ol.Geolocation.prototype.getSpeed); + + +/** + * Are we tracking the user's position? + * @return {boolean} tracking. + * @todo stability experimental + */ +ol.Geolocation.prototype.getTracking = function() { + return /** @type {boolean} */ ( + this.get(ol.GeolocationProperty.TRACKING)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getTracking', + ol.Geolocation.prototype.getTracking); + + +/** + * Get the tracking options. + * @see http://www.w3.org/TR/geolocation-API/#position-options + * @return {GeolocationPositionOptions|undefined} HTML 5 Gelocation + * tracking options. + * @todo stability experimental + */ +ol.Geolocation.prototype.getTrackingOptions = function() { + return /** @type {GeolocationPositionOptions|undefined} */ ( + this.get(ol.GeolocationProperty.TRACKING_OPTIONS)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getTrackingOptions', + ol.Geolocation.prototype.getTrackingOptions); + + +/** + * Set the projection to use for transforming the coordinates. + * @param {ol.proj.Projection} projection Projection. + * @todo stability experimental + */ +ol.Geolocation.prototype.setProjection = function(projection) { + this.set(ol.GeolocationProperty.PROJECTION, projection); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'setProjection', + ol.Geolocation.prototype.setProjection); + + +/** + * Enable/disable tracking. + * @param {boolean} tracking Enable or disable tracking. + * @todo stability experimental + */ +ol.Geolocation.prototype.setTracking = function(tracking) { + this.set(ol.GeolocationProperty.TRACKING, tracking); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'setTracking', + ol.Geolocation.prototype.setTracking); + + +/** + * Set the tracking options. + * @see http://www.w3.org/TR/geolocation-API/#position-options + * @param {GeolocationPositionOptions} options HTML 5 Geolocation + * tracking options. + * @todo stability experimental + */ +ol.Geolocation.prototype.setTrackingOptions = function(options) { + this.set(ol.GeolocationProperty.TRACKING_OPTIONS, options); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'setTrackingOptions', + ol.Geolocation.prototype.setTrackingOptions); diff --git a/float-no-zero/ol/ol/geom/circle.exports b/float-no-zero/ol/ol/geom/circle.exports new file mode 100644 index 0000000000..e08d6f83be --- /dev/null +++ b/float-no-zero/ol/ol/geom/circle.exports @@ -0,0 +1,11 @@ +@exportSymbol ol.geom.Circle +@exportProperty ol.geom.Circle.prototype.clone +@exportProperty ol.geom.Circle.prototype.getCenter +@exportProperty ol.geom.Circle.prototype.getExtent +@exportProperty ol.geom.Circle.prototype.getRadius +@exportProperty ol.geom.Circle.prototype.getSimplifiedGeometry +@exportProperty ol.geom.Circle.prototype.getType +@exportProperty ol.geom.Circle.prototype.setCenter +@exportProperty ol.geom.Circle.prototype.setCenterAndRadius +@exportProperty ol.geom.Circle.prototype.setRadius +@exportProperty ol.geom.Circle.prototype.transform diff --git a/float-no-zero/ol/ol/geom/circle.js b/float-no-zero/ol/ol/geom/circle.js new file mode 100644 index 0000000000..94d4293deb --- /dev/null +++ b/float-no-zero/ol/ol/geom/circle.js @@ -0,0 +1,215 @@ +goog.provide('ol.geom.Circle'); + +goog.require('goog.asserts'); +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.SimpleGeometry'); +goog.require('ol.geom.flat'); + + + +/** + * @constructor + * @extends {ol.geom.SimpleGeometry} + * @param {ol.geom.RawPoint} center Center. + * @param {number=} opt_radius Radius. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.Circle = function(center, opt_radius, opt_layout) { + goog.base(this); + var radius = goog.isDef(opt_radius) ? opt_radius : 0; + this.setCenterAndRadius(center, radius, opt_layout); +}; +goog.inherits(ol.geom.Circle, ol.geom.SimpleGeometry); + + +/** + * @inheritDoc + */ +ol.geom.Circle.prototype.clone = function() { + var circle = new ol.geom.Circle(null); + circle.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return circle; +}; + + +/** + * @inheritDoc + */ +ol.geom.Circle.prototype.closestPointXY = + function(x, y, closestPoint, minSquaredDistance) { + var flatCoordinates = this.flatCoordinates; + var dx = x - flatCoordinates[0]; + var dy = y - flatCoordinates[1]; + var squaredDistance = dx * dx + dy * dy; + if (squaredDistance < minSquaredDistance) { + var i; + if (squaredDistance === 0) { + for (i = 0; i < this.stride; ++i) { + closestPoint[i] = flatCoordinates[i]; + } + } else { + var delta = this.getRadius() / Math.sqrt(squaredDistance); + closestPoint[0] = flatCoordinates[0] + delta * dx; + closestPoint[1] = flatCoordinates[1] + delta * dy; + for (i = 2; i < this.stride; ++i) { + closestPoint[i] = flatCoordinates[i]; + } + } + closestPoint.length = this.stride; + return squaredDistance; + } else { + return minSquaredDistance; + } +}; + + +/** + * @inheritDoc + */ +ol.geom.Circle.prototype.containsXY = function(x, y) { + var flatCoordinates = this.flatCoordinates; + var dx = x - flatCoordinates[0]; + var dy = y - flatCoordinates[1]; + return dx * dx + dy * dy <= this.getRadiusSquared_(); +}; + + +/** + * @return {ol.geom.RawPoint} Center. + * @todo stability experimental + */ +ol.geom.Circle.prototype.getCenter = function() { + return this.flatCoordinates.slice(0, this.stride); +}; + + +/** + * @inheritDoc + */ +ol.geom.Circle.prototype.getExtent = function(opt_extent) { + if (this.extentRevision != this.getRevision()) { + var flatCoordinates = this.flatCoordinates; + var radius = flatCoordinates[this.stride] - flatCoordinates[0]; + this.extent = ol.extent.createOrUpdate( + flatCoordinates[0] - radius, flatCoordinates[1] - radius, + flatCoordinates[0] + radius, flatCoordinates[1] + radius, + this.extent); + this.extentRevision = this.getRevision(); + } + goog.asserts.assert(goog.isDef(this.extent)); + return ol.extent.returnOrUpdate(this.extent, opt_extent); +}; + + +/** + * @return {number} Radius. + * @todo stability experimental + */ +ol.geom.Circle.prototype.getRadius = function() { + return Math.sqrt(this.getRadiusSquared_()); +}; + + +/** + * @private + * @return {number} Radius squared. + */ +ol.geom.Circle.prototype.getRadiusSquared_ = function() { + var dx = this.flatCoordinates[this.stride] - this.flatCoordinates[0]; + var dy = this.flatCoordinates[this.stride + 1] - this.flatCoordinates[1]; + return dx * dx + dy * dy; +}; + + +/** + * @inheritDoc + */ +ol.geom.Circle.prototype.getSimplifiedGeometry = function(squaredTolerance) { + return this; +}; + + +/** + * @inheritDoc + */ +ol.geom.Circle.prototype.getType = function() { + return ol.geom.GeometryType.CIRCLE; +}; + + +/** + * @param {ol.geom.RawPoint} center Center. + * @todo stability experimental + */ +ol.geom.Circle.prototype.setCenter = function(center) { + var stride = this.stride; + goog.asserts.assert(center.length == stride); + var radius = this.flatCoordinates[stride] - this.flatCoordinates[0]; + var flatCoordinates = center.slice(); + flatCoordinates[stride] = flatCoordinates[0] + radius; + var i; + for (i = 1; i < stride; ++i) { + flatCoordinates[stride + i] = center[i]; + } + this.setFlatCoordinates(this.layout, flatCoordinates); +}; + + +/** + * @param {ol.geom.RawPoint} center Center. + * @param {number} radius Radius. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.Circle.prototype.setCenterAndRadius = + function(center, radius, opt_layout) { + if (goog.isNull(center)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null); + } else { + this.setLayout(opt_layout, center, 0); + if (goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = []; + } + /** @type {Array.} */ + var flatCoordinates = this.flatCoordinates; + var offset = ol.geom.flat.deflateCoordinate( + flatCoordinates, 0, center, this.stride); + flatCoordinates[offset++] = flatCoordinates[0] + radius; + var i, ii; + for (i = 1, ii = this.stride; i < ii; ++i) { + flatCoordinates[offset++] = flatCoordinates[i]; + } + flatCoordinates.length = offset; + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @param {Array.} flatCoordinates Flat coordinates. + */ +ol.geom.Circle.prototype.setFlatCoordinates = + function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent(); +}; + + +/** + * @param {number} radius Radius. + * @todo stability experimental + */ +ol.geom.Circle.prototype.setRadius = function(radius) { + goog.asserts.assert(!goog.isNull(this.flatCoordinates)); + this.flatCoordinates[this.stride] = this.flatCoordinates[0] + radius; + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol.geom.Circle.prototype.transform = goog.abstractMethod; diff --git a/float-no-zero/ol/ol/geom/closestgeom.js b/float-no-zero/ol/ol/geom/closestgeom.js new file mode 100644 index 0000000000..0084a0d6f6 --- /dev/null +++ b/float-no-zero/ol/ol/geom/closestgeom.js @@ -0,0 +1,219 @@ +// FIXME find better names for these functions + +goog.provide('ol.geom.closest'); + +goog.require('goog.asserts'); +goog.require('ol.geom.flat'); + + +/** + * Return the squared of the largest distance between any pair of consecutive + * coordinates. + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} maxSquaredDelta Max squared delta. + * @return {number} Max squared delta. + */ +ol.geom.closest.getMaxSquaredDelta = + function(flatCoordinates, offset, end, stride, maxSquaredDelta) { + var x1 = flatCoordinates[offset]; + var y1 = flatCoordinates[offset + 1]; + for (offset += stride; offset < end; offset += stride) { + var x2 = flatCoordinates[offset]; + var y2 = flatCoordinates[offset + 1]; + var squaredDelta = ol.geom.flat.squaredDistance(x1, y1, x2, y2); + if (squaredDelta > maxSquaredDelta) { + maxSquaredDelta = squaredDelta; + } + x1 = x2; + y1 = y2; + } + return maxSquaredDelta; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @param {number} maxSquaredDelta Max squared delta. + * @return {number} Max squared delta. + */ +ol.geom.closest.getsMaxSquaredDelta = + function(flatCoordinates, offset, ends, stride, maxSquaredDelta) { + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + maxSquaredDelta = ol.geom.closest.getMaxSquaredDelta( + flatCoordinates, offset, end, stride, maxSquaredDelta); + offset = end; + } + return maxSquaredDelta; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @param {number} maxSquaredDelta Max squared delta. + * @return {number} Max squared delta. + */ +ol.geom.closest.getssMaxSquaredDelta = + function(flatCoordinates, offset, endss, stride, maxSquaredDelta) { + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + maxSquaredDelta = ol.geom.closest.getsMaxSquaredDelta( + flatCoordinates, offset, ends, stride, maxSquaredDelta); + offset = ends[ends.length - 1]; + } + return maxSquaredDelta; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} maxDelta Max delta. + * @param {boolean} isRing Is ring. + * @param {number} x X. + * @param {number} y Y. + * @param {Array.} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @param {Array.=} opt_tmpPoint Temporary point object. + * @return {number} Minimum squared distance. + */ +ol.geom.closest.getClosestPoint = function(flatCoordinates, offset, end, stride, + maxDelta, isRing, x, y, closestPoint, minSquaredDistance, opt_tmpPoint) { + if (offset == end) { + return minSquaredDistance; + } + var i, squaredDistance; + if (maxDelta === 0) { + // All points are identical, so just test the first point. + squaredDistance = ol.geom.flat.squaredDistance( + x, y, flatCoordinates[offset], flatCoordinates[offset + 1]); + if (squaredDistance < minSquaredDistance) { + for (i = 0; i < stride; ++i) { + closestPoint[i] = flatCoordinates[offset + i]; + } + closestPoint.length = stride; + return squaredDistance; + } else { + return minSquaredDistance; + } + } + goog.asserts.assert(maxDelta > 0); + var tmpPoint = goog.isDef(opt_tmpPoint) ? opt_tmpPoint : [NaN, NaN]; + var index = offset + stride; + while (index < end) { + ol.geom.flat.closestPoint( + flatCoordinates, index - stride, index, stride, x, y, tmpPoint); + squaredDistance = ol.geom.flat.squaredDistance( + x, y, tmpPoint[0], tmpPoint[1]); + if (squaredDistance < minSquaredDistance) { + minSquaredDistance = squaredDistance; + for (i = 0; i < stride; ++i) { + closestPoint[i] = tmpPoint[i]; + } + closestPoint.length = stride; + index += stride; + } else { + // Skip ahead multiple points, because we know that all the skipped + // points cannot be any closer than the closest point we have found so + // far. We know this because we know how close the current point is, how + // close the closest point we have found so far is, and the maximum + // distance between consecutive points. For example, if we're currently + // at distance 10, the best we've found so far is 3, and that the maximum + // distance between consecutive points is 2, then we'll need to skip at + // least (10 - 3) / 2 == 3 (rounded down) points to have any chance of + // finding a closer point. We use Math.max(..., 1) to ensure that we + // always advance at least one point, to avoid an infinite loop. + index += stride * Math.max( + ((Math.sqrt(squaredDistance) - + Math.sqrt(minSquaredDistance)) / maxDelta) | 0, 1); + } + } + if (isRing) { + // Check the closing segment. + ol.geom.flat.closestPoint( + flatCoordinates, end - stride, offset, stride, x, y, tmpPoint); + squaredDistance = ol.geom.flat.squaredDistance( + x, y, tmpPoint[0], tmpPoint[1]); + if (squaredDistance < minSquaredDistance) { + minSquaredDistance = squaredDistance; + for (i = 0; i < stride; ++i) { + closestPoint[i] = tmpPoint[i]; + } + closestPoint.length = stride; + } + } + return minSquaredDistance; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @param {number} maxDelta Max delta. + * @param {boolean} isRing Is ring. + * @param {number} x X. + * @param {number} y Y. + * @param {Array.} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @param {Array.=} opt_tmpPoint Temporary point object. + * @return {number} Minimum squared distance. + */ +ol.geom.closest.getsClosestPoint = function(flatCoordinates, offset, ends, + stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, + opt_tmpPoint) { + var tmpPoint = goog.isDef(opt_tmpPoint) ? opt_tmpPoint : [NaN, NaN]; + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + minSquaredDistance = ol.geom.closest.getClosestPoint( + flatCoordinates, offset, end, stride, + maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint); + offset = end; + } + return minSquaredDistance; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @param {number} maxDelta Max delta. + * @param {boolean} isRing Is ring. + * @param {number} x X. + * @param {number} y Y. + * @param {Array.} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @param {Array.=} opt_tmpPoint Temporary point object. + * @return {number} Minimum squared distance. + */ +ol.geom.closest.getssClosestPoint = function(flatCoordinates, offset, endss, + stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, + opt_tmpPoint) { + var tmpPoint = goog.isDef(opt_tmpPoint) ? opt_tmpPoint : [NaN, NaN]; + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + minSquaredDistance = ol.geom.closest.getsClosestPoint( + flatCoordinates, offset, ends, stride, + maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint); + offset = ends[ends.length - 1]; + } + return minSquaredDistance; +}; diff --git a/float-no-zero/ol/ol/geom/flatgeom.js b/float-no-zero/ol/ol/geom/flatgeom.js new file mode 100644 index 0000000000..c463be099f --- /dev/null +++ b/float-no-zero/ol/ol/geom/flatgeom.js @@ -0,0 +1,933 @@ +goog.provide('ol.geom.flat'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.math'); +goog.require('goog.vec.Mat4'); +goog.require('ol.extent'); + + +/** + * Returns the point on the 2D line segment flatCoordinates[offset1] to + * flatCoordinates[offset2] that is closest to the point (x, y). Extra + * dimensions are linearly interpolated. + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset1 Offset 1. + * @param {number} offset2 Offset 2. + * @param {number} stride Stride. + * @param {number} x X. + * @param {number} y Y. + * @param {Array.} closestPoint Closest point. + */ +ol.geom.flat.closestPoint = + function(flatCoordinates, offset1, offset2, stride, x, y, closestPoint) { + var x1 = flatCoordinates[offset1]; + var y1 = flatCoordinates[offset1 + 1]; + var dx = flatCoordinates[offset2] - x1; + var dy = flatCoordinates[offset2 + 1] - y1; + var i, offset; + if (dx === 0 && dy === 0) { + offset = offset1; + } else { + var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy); + if (t > 1) { + offset = offset2; + } else if (t > 0) { + for (i = 0; i < stride; ++i) { + closestPoint[i] = goog.math.lerp(flatCoordinates[offset1 + i], + flatCoordinates[offset2 + i], t); + } + closestPoint.length = stride; + return; + } else { + offset = offset1; + } + } + for (i = 0; i < stride; ++i) { + closestPoint[i] = flatCoordinates[offset + i]; + } + closestPoint.length = stride; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {ol.Coordinate} coordinate Coordinate. + * @param {number} stride Stride. + * @return {number} offset Offset. + */ +ol.geom.flat.deflateCoordinate = + function(flatCoordinates, offset, coordinate, stride) { + goog.asserts.assert(coordinate.length == stride); + var i, ii; + for (i = 0, ii = coordinate.length; i < ii; ++i) { + flatCoordinates[offset++] = coordinate[i]; + } + return offset; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} coordinates Coordinates. + * @param {number} stride Stride. + * @return {number} offset Offset. + */ +ol.geom.flat.deflateCoordinates = + function(flatCoordinates, offset, coordinates, stride) { + var i, ii; + for (i = 0, ii = coordinates.length; i < ii; ++i) { + var coordinate = coordinates[i]; + goog.asserts.assert(coordinate.length == stride); + var j; + for (j = 0; j < stride; ++j) { + flatCoordinates[offset++] = coordinate[j]; + } + } + return offset; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} coordinatess Coordinatess. + * @param {number} stride Stride. + * @param {Array.=} opt_ends Ends. + * @return {Array.} Ends. + */ +ol.geom.flat.deflateCoordinatess = + function(flatCoordinates, offset, coordinatess, stride, opt_ends) { + var ends = goog.isDef(opt_ends) ? opt_ends : []; + var i = 0; + var j, jj; + for (j = 0, jj = coordinatess.length; j < jj; ++j) { + var end = ol.geom.flat.deflateCoordinates( + flatCoordinates, offset, coordinatess[j], stride); + ends[i++] = end; + offset = end; + } + ends.length = i; + return ends; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>>} coordinatesss Coordinatesss. + * @param {number} stride Stride. + * @param {Array.>=} opt_endss Endss. + * @return {Array.>} Endss. + */ +ol.geom.flat.deflateCoordinatesss = + function(flatCoordinates, offset, coordinatesss, stride, opt_endss) { + var endss = goog.isDef(opt_endss) ? opt_endss : []; + var i = 0; + var j, jj; + for (j = 0, jj = coordinatesss.length; j < jj; ++j) { + var ends = ol.geom.flat.deflateCoordinatess( + flatCoordinates, offset, coordinatesss[j], stride, endss[i]); + endss[i++] = ends; + offset = ends[ends.length - 1]; + } + endss.length = i; + return endss; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {Array.=} opt_dest Destination. + * @param {number=} opt_destOffset Destination offset. + * @return {Array.} Flat coordinates. + */ +ol.geom.flat.flipXY = + function(flatCoordinates, offset, end, stride, opt_dest, opt_destOffset) { + var dest, destOffset; + if (goog.isDef(opt_dest)) { + dest = opt_dest; + destOffset = goog.isDef(opt_destOffset) ? opt_destOffset : 0; + } else { + goog.asserts.assert(!goog.isDef(opt_destOffset)); + dest = []; + destOffset = 0; + } + var j, k; + for (j = offset; j < end; ) { + var x = flatCoordinates[j++]; + dest[destOffset++] = flatCoordinates[j++]; + dest[destOffset++] = x; + for (k = 2; k < stride; ++k) { + dest[destOffset++] = flatCoordinates[j++]; + } + } + dest.length = destOffset; + return dest; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {Array.=} opt_coordinates Coordinates. + * @return {Array.} Coordinates. + */ +ol.geom.flat.inflateCoordinates = + function(flatCoordinates, offset, end, stride, opt_coordinates) { + var coordinates = goog.isDef(opt_coordinates) ? opt_coordinates : []; + var i = 0; + var j; + for (j = offset; j < end; j += stride) { + coordinates[i++] = flatCoordinates.slice(j, j + stride); + } + coordinates.length = i; + return coordinates; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @param {Array.>=} opt_coordinatess Coordinatess. + * @return {Array.>} Coordinatess. + */ +ol.geom.flat.inflateCoordinatess = + function(flatCoordinates, offset, ends, stride, opt_coordinatess) { + var coordinatess = goog.isDef(opt_coordinatess) ? opt_coordinatess : []; + var i = 0; + var j, jj; + for (j = 0, jj = ends.length; j < jj; ++j) { + var end = ends[j]; + coordinatess[i++] = ol.geom.flat.inflateCoordinates( + flatCoordinates, offset, end, stride, coordinatess[i]); + offset = end; + } + coordinatess.length = i; + return coordinatess; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @param {Array.>>=} opt_coordinatesss + * Coordinatesss. + * @return {Array.>>} Coordinatesss. + */ +ol.geom.flat.inflateCoordinatesss = + function(flatCoordinates, offset, endss, stride, opt_coordinatesss) { + var coordinatesss = goog.isDef(opt_coordinatesss) ? opt_coordinatesss : []; + var i = 0; + var j, jj; + for (j = 0, jj = endss.length; j < jj; ++j) { + var ends = endss[j]; + coordinatesss[i++] = ol.geom.flat.inflateCoordinatess( + flatCoordinates, offset, ends, stride, coordinatesss[i]); + offset = ends[ends.length - 1]; + } + coordinatesss.length = i; + return coordinatesss; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} fraction Fraction. + * @param {Array.=} opt_dest Destination. + * @return {Array.} Destination. + */ +ol.geom.flat.lineStringInterpolate = + function(flatCoordinates, offset, end, stride, fraction, opt_dest) { + // FIXME interpolate extra dimensions + goog.asserts.assert(0 <= fraction && fraction <= 1); + var pointX = NaN; + var pointY = NaN; + var n = (end - offset) / stride; + if (n === 0) { + goog.asserts.fail(); + } else if (n == 1) { + pointX = flatCoordinates[offset]; + pointY = flatCoordinates[offset + 1]; + } else if (n == 2) { + pointX = (1 - fraction) * flatCoordinates[offset] + + fraction * flatCoordinates[offset + stride]; + pointY = (1 - fraction) * flatCoordinates[offset + 1] + + fraction * flatCoordinates[offset + stride + 1]; + } else { + var x1 = flatCoordinates[offset]; + var y1 = flatCoordinates[offset + 1]; + var length = 0; + var cumulativeLengths = [0]; + var i; + for (i = offset + stride; i < end; i += stride) { + var x2 = flatCoordinates[i]; + var y2 = flatCoordinates[i + 1]; + length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + cumulativeLengths.push(length); + x1 = x2; + y1 = y2; + } + var target = fraction * length; + var index = goog.array.binarySearch(cumulativeLengths, target); + if (index < 0) { + var t = (target - cumulativeLengths[-index - 2]) / + (cumulativeLengths[-index - 1] - cumulativeLengths[-index - 2]); + var o = offset + (-index - 2) * stride; + pointX = (1 - t) * flatCoordinates[o] + t * flatCoordinates[o + stride]; + pointY = (1 - t) * flatCoordinates[o + 1] + + t * flatCoordinates[o + stride + 1]; + } else { + pointX = flatCoordinates[offset + index * stride]; + pointY = flatCoordinates[offset + index * stride + 1]; + } + } + if (goog.isDefAndNotNull(opt_dest)) { + opt_dest.push(pointX, pointY); + return opt_dest; + } else { + return [pointX, pointY]; + } +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} m M. + * @param {boolean} extrapolate Extrapolate. + * @return {ol.Coordinate} Coordinate. + */ +ol.geom.flat.lineStringCoordinateAtM = + function(flatCoordinates, offset, end, stride, m, extrapolate) { + if (end == offset) { + return null; + } + var coordinate; + if (m < flatCoordinates[offset + stride - 1]) { + if (extrapolate) { + coordinate = flatCoordinates.slice(offset, offset + stride); + coordinate[stride - 1] = m; + return coordinate; + } else { + return null; + } + } else if (flatCoordinates[end - 1] < m) { + if (extrapolate) { + coordinate = flatCoordinates.slice(end - stride, end); + coordinate[stride - 1] = m; + return coordinate; + } else { + return null; + } + } + // FIXME use O(1) search + if (m == flatCoordinates[offset + stride - 1]) { + return flatCoordinates.slice(offset, offset + stride); + } + var lo = offset / stride; + var hi = end / stride; + while (lo < hi) { + var mid = (lo + hi) >> 1; + if (m < flatCoordinates[(mid + 1) * stride - 1]) { + hi = mid; + } else { + lo = mid + 1; + } + } + var m0 = flatCoordinates[lo * stride - 1]; + if (m == m0) { + return flatCoordinates.slice((lo - 1) * stride, (lo - 1) * stride + stride); + } + var m1 = flatCoordinates[(lo + 1) * stride - 1]; + goog.asserts.assert(m0 < m); + goog.asserts.assert(m <= m1); + var t = (m - m0) / (m1 - m0); + coordinate = []; + var i; + for (i = 0; i < stride - 1; ++i) { + coordinate.push((1 - t) * flatCoordinates[(lo - 1) * stride + i] + + t * flatCoordinates[lo * stride + i]); + } + coordinate.push(m); + goog.asserts.assert(coordinate.length == stride); + return coordinate; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @param {number} m M. + * @param {boolean} extrapolate Extrapolate. + * @param {boolean} interpolate Interpolate. + * @return {ol.Coordinate} Coordinate. + */ +ol.geom.flat.lineStringsCoordinateAtM = function( + flatCoordinates, offset, ends, stride, m, extrapolate, interpolate) { + if (interpolate) { + return ol.geom.flat.lineStringCoordinateAtM( + flatCoordinates, offset, ends[ends.length - 1], stride, m, extrapolate); + } + var coordinate; + if (m < flatCoordinates[stride - 1]) { + if (extrapolate) { + coordinate = flatCoordinates.slice(0, stride); + coordinate[stride - 1] = m; + return coordinate; + } else { + return null; + } + } + if (flatCoordinates[flatCoordinates.length - 1] < m) { + if (extrapolate) { + coordinate = flatCoordinates.slice(flatCoordinates.length - stride); + coordinate[stride - 1] = m; + return coordinate; + } else { + return null; + } + } + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + if (offset == end) { + continue; + } + if (m < flatCoordinates[offset + stride - 1]) { + return null; + } else if (m <= flatCoordinates[end - 1]) { + return ol.geom.flat.lineStringCoordinateAtM( + flatCoordinates, offset, end, stride, m, false); + } + offset = end; + } + goog.asserts.fail(); + return null; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @return {number} Length. + */ +ol.geom.flat.lineStringLength = function(flatCoordinates, offset, end, stride) { + var x1 = flatCoordinates[offset]; + var y1 = flatCoordinates[offset + 1]; + var length = 0; + var i; + for (i = offset + stride; i < end; i += stride) { + var x2 = flatCoordinates[i]; + var y2 = flatCoordinates[i + 1]; + length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + x1 = x2; + y1 = y2; + } + return length; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @return {number} Area. + */ +ol.geom.flat.linearRingArea = function(flatCoordinates, offset, end, stride) { + var twiceArea = 0; + var x1 = flatCoordinates[end - stride]; + var y1 = flatCoordinates[end - stride + 1]; + for (; offset < end; offset += stride) { + var x2 = flatCoordinates[offset]; + var y2 = flatCoordinates[offset + 1]; + twiceArea += y1 * x2 - x1 * y2; + x1 = x2; + y1 = y2; + } + return twiceArea / 2; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + */ +ol.geom.flat.linearRingContainsXY = + function(flatCoordinates, offset, end, stride, x, y) { + // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html + var contains = false; + var x1 = flatCoordinates[end - stride]; + var y1 = flatCoordinates[end - stride + 1]; + for (; offset < end; offset += stride) { + var x2 = flatCoordinates[offset]; + var y2 = flatCoordinates[offset + 1]; + var intersect = ((y1 > y) != (y2 > y)) && + (x < (x2 - x1) * (y - y1) / (y2 - y1) + x1); + if (intersect) { + contains = !contains; + } + x1 = x2; + y1 = y2; + } + return contains; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @return {boolean} Is clockwise. + */ +ol.geom.flat.linearRingIsClockwise = + function(flatCoordinates, offset, end, stride) { + // http://tinyurl.com/clockwise-method + // https://github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrlinearring.cpp + var edge = 0; + var x1 = flatCoordinates[end - stride]; + var y1 = flatCoordinates[end - stride + 1]; + for (; offset < end; offset += stride) { + var x2 = flatCoordinates[offset]; + var y2 = flatCoordinates[offset + 1]; + edge += (x2 - x1) * (y2 + y1); + x1 = x2; + y1 = y2; + } + return edge > 0; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @return {number} Perimeter. + */ +ol.geom.flat.linearRingPerimeter = + function(flatCoordinates, offset, end, stride) { + var perimeter = + ol.geom.flat.lineStringLength(flatCoordinates, offset, end, stride); + var dx = flatCoordinates[end - stride] - flatCoordinates[offset]; + var dy = flatCoordinates[end - stride + 1] - flatCoordinates[offset + 1]; + perimeter += Math.sqrt(dx * dx + dy * dy); + return perimeter; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @return {number} Area. + */ +ol.geom.flat.linearRingsArea = function(flatCoordinates, offset, ends, stride) { + var area = 0; + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + area += ol.geom.flat.linearRingArea(flatCoordinates, offset, end, stride); + offset = end; + } + return area; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + */ +ol.geom.flat.linearRingsContainsXY = + function(flatCoordinates, offset, ends, stride, x, y) { + goog.asserts.assert(ends.length > 0); + if (ends.length === 0) { + return false; + } + if (!ol.geom.flat.linearRingContainsXY( + flatCoordinates, offset, ends[0], stride, x, y)) { + return false; + } + var i, ii; + for (i = 1, ii = ends.length; i < ii; ++i) { + if (ol.geom.flat.linearRingContainsXY( + flatCoordinates, ends[i - 1], ends[i], stride, x, y)) { + return false; + } + } + return true; +}; + + +/** + * Calculates a point that is likely to lie in the interior of the linear rings. + * Inspired by JTS's com.vividsolutions.jts.geom.Geometry#getInteriorPoint. + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @param {Array.} flatCenters Flat centers. + * @param {number} flatCentersOffset Flat center offset. + * @param {Array.=} opt_dest Destination. + * @return {Array.} Destination. + */ +ol.geom.flat.linearRingsGetInteriorPoint = function(flatCoordinates, offset, + ends, stride, flatCenters, flatCentersOffset, opt_dest) { + var i, ii, x, x1, x2, y1, y2; + var y = flatCenters[flatCentersOffset + 1]; + /** @type {Array.} */ + var intersections = []; + // Calculate intersections with the horizontal line + var end = ends[0]; + x1 = flatCoordinates[end - stride]; + y1 = flatCoordinates[end - stride + 1]; + for (i = offset; i < end; i += stride) { + x2 = flatCoordinates[i]; + y2 = flatCoordinates[i + 1]; + if ((y <= y1 && y2 <= y) || (y1 <= y && y <= y2)) { + x = (y - y1) / (y2 - y1) * (x2 - x1) + x1; + intersections.push(x); + } + x1 = x2; + y1 = y2; + } + // Find the longest segment of the horizontal line that has its center point + // inside the linear ring. + var pointX = NaN; + var maxSegmentLength = -Infinity; + intersections.sort(); + x1 = intersections[0]; + for (i = 1, ii = intersections.length; i < ii; ++i) { + x2 = intersections[i]; + var segmentLength = Math.abs(x2 - x1); + if (segmentLength > maxSegmentLength) { + x = (x1 + x2) / 2; + if (ol.geom.flat.linearRingsContainsXY( + flatCoordinates, offset, ends, stride, x, y)) { + pointX = x; + maxSegmentLength = segmentLength; + } + } + x1 = x2; + } + if (isNaN(pointX)) { + // There is no horizontal line that has its center point inside the linear + // ring. Use the center of the the linear ring's extent. + pointX = flatCenters[flatCentersOffset]; + } + if (goog.isDef(opt_dest)) { + opt_dest.push(pointX, y); + return opt_dest; + } else { + return [pointX, y]; + } +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @return {boolean} `true` if all rings are correctly oriented, `false` + * otherwise. + */ +ol.geom.flat.linearRingsAreOriented = + function(flatCoordinates, offset, ends, stride) { + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + var isClockwise = ol.geom.flat.linearRingIsClockwise( + flatCoordinates, offset, end, stride); + if (i === 0 ? !isClockwise : isClockwise) { + return false; + } + offset = end; + } + return true; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @return {boolean} `true` if all rings are correctly oriented, `false` + * otherwise. + */ +ol.geom.flat.linearRingssAreOriented = + function(flatCoordinates, offset, endss, stride) { + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + if (!ol.geom.flat.linearRingsAreOriented( + flatCoordinates, offset, endss[i], stride)) { + return false; + } + } + return true; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @return {number} Area. + */ +ol.geom.flat.linearRingssArea = + function(flatCoordinates, offset, endss, stride) { + var area = 0; + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + area += ol.geom.flat.linearRingsArea(flatCoordinates, offset, ends, stride); + offset = ends[ends.length - 1]; + } + return area; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + */ +ol.geom.flat.linearRingssContainsXY = + function(flatCoordinates, offset, endss, stride, x, y) { + goog.asserts.assert(endss.length > 0); + if (endss.length === 0) { + return false; + } + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + if (ol.geom.flat.linearRingsContainsXY( + flatCoordinates, offset, ends, stride, x, y)) { + return true; + } + offset = ends[ends.length - 1]; + } + return false; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @param {Array.} flatCenters Flat centers. + * @return {Array.} Interior points. + */ +ol.geom.flat.linearRingssGetInteriorPoints = + function(flatCoordinates, offset, endss, stride, flatCenters) { + goog.asserts.assert(2 * endss.length == flatCenters.length); + var interiorPoints = []; + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + interiorPoints = ol.geom.flat.linearRingsGetInteriorPoint(flatCoordinates, + offset, ends, stride, flatCenters, 2 * i, interiorPoints); + offset = ends[ends.length - 1]; + } + return interiorPoints; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @return {Array.} Flat centers. + */ +ol.geom.flat.linearRingssGetFlatCenters = + function(flatCoordinates, offset, endss, stride) { + var flatCenters = []; + var i, ii; + var extent = ol.extent.createEmpty(); + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + extent = ol.extent.createOrUpdateFromFlatCoordinates( + flatCoordinates, offset, ends[0], stride); + flatCenters.push((extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2); + offset = ends[ends.length - 1]; + } + return flatCenters; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @return {number} End. + */ +ol.geom.flat.orientLinearRings = + function(flatCoordinates, offset, ends, stride) { + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + var isClockwise = ol.geom.flat.linearRingIsClockwise( + flatCoordinates, offset, end, stride); + var reverse = i === 0 ? !isClockwise : isClockwise; + if (reverse) { + ol.geom.flat.reverseCoordinates(flatCoordinates, offset, end, stride); + } + offset = end; + } + return offset; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @return {number} End. + */ +ol.geom.flat.orientLinearRingss = + function(flatCoordinates, offset, endss, stride) { + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + offset = ol.geom.flat.orientLinearRings( + flatCoordinates, offset, endss[i], stride); + } + return offset; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + */ +ol.geom.flat.reverseCoordinates = + function(flatCoordinates, offset, end, stride) { + while (offset < end - stride) { + var i; + for (i = 0; i < stride; ++i) { + var tmp = flatCoordinates[offset + i]; + flatCoordinates[offset + i] = flatCoordinates[end - stride + i]; + flatCoordinates[end - stride + i] = tmp; + } + offset += stride; + end -= stride; + } +}; + + +/** + * Returns the square of the closest distance between the point (x, y) and the + * line segment (x1, y1) to (x2, y2). + * @param {number} x X. + * @param {number} y Y. + * @param {number} x1 X1. + * @param {number} y1 Y1. + * @param {number} x2 X2. + * @param {number} y2 Y2. + * @return {number} Squared distance. + */ +ol.geom.flat.squaredSegmentDistance = function(x, y, x1, y1, x2, y2) { + var dx = x2 - x1; + var dy = y2 - y1; + if (dx !== 0 || dy !== 0) { + var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy); + if (t > 1) { + x1 = x2; + y1 = y2; + } else if (t > 0) { + x1 += dx * t; + y1 += dy * t; + } + } + return ol.geom.flat.squaredDistance(x, y, x1, y1); +}; + + +/** + * Returns the square of the distance between the points (x1, y1) and (x2, y2). + * @param {number} x1 X1. + * @param {number} y1 Y1. + * @param {number} x2 X2. + * @param {number} y2 Y2. + * @return {number} Squared distance. + */ +ol.geom.flat.squaredDistance = function(x1, y1, x2, y2) { + var dx = x2 - x1; + var dy = y2 - y1; + return dx * dx + dy * dy; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} stride Stride. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {Array.=} opt_dest Destination. + * @return {Array.} Transformed coordinates. + */ +ol.geom.flat.transform2D = + function(flatCoordinates, stride, transform, opt_dest) { + var m00 = goog.vec.Mat4.getElement(transform, 0, 0); + var m10 = goog.vec.Mat4.getElement(transform, 1, 0); + var m01 = goog.vec.Mat4.getElement(transform, 0, 1); + var m11 = goog.vec.Mat4.getElement(transform, 1, 1); + var m03 = goog.vec.Mat4.getElement(transform, 0, 3); + var m13 = goog.vec.Mat4.getElement(transform, 1, 3); + var dest = goog.isDef(opt_dest) ? opt_dest : []; + var i = 0; + var j, jj; + for (j = 0, jj = flatCoordinates.length; j < jj; j += stride) { + var x = flatCoordinates[j]; + var y = flatCoordinates[j + 1]; + dest[i++] = m00 * x + m01 * y + m03; + dest[i++] = m10 * x + m11 * y + m13; + } + if (goog.isDef(opt_dest) && dest.length != i) { + dest.length = i; + } + return dest; +}; diff --git a/float-no-zero/ol/ol/geom/geom.jsdoc b/float-no-zero/ol/ol/geom/geom.jsdoc new file mode 100644 index 0000000000..1a947e51f3 --- /dev/null +++ b/float-no-zero/ol/ol/geom/geom.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.geom + */ diff --git a/float-no-zero/ol/ol/geom/geometry.exports b/float-no-zero/ol/ol/geom/geometry.exports new file mode 100644 index 0000000000..4c332d46de --- /dev/null +++ b/float-no-zero/ol/ol/geom/geometry.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.geom.Geometry +@exportProperty ol.geom.Geometry.prototype.getClosestPoint +@exportProperty ol.geom.Geometry.prototype.getType diff --git a/float-no-zero/ol/ol/geom/geometry.js b/float-no-zero/ol/ol/geom/geometry.js new file mode 100644 index 0000000000..0cf308b55f --- /dev/null +++ b/float-no-zero/ol/ol/geom/geometry.js @@ -0,0 +1,198 @@ +goog.provide('ol.geom.Geometry'); +goog.provide('ol.geom.GeometryType'); + +goog.require('goog.asserts'); +goog.require('goog.functions'); +goog.require('ol.Observable'); + + +/** + * @enum {string} + */ +ol.geom.GeometryType = { + POINT: 'Point', + LINE_STRING: 'LineString', + LINEAR_RING: 'LinearRing', + POLYGON: 'Polygon', + MULTI_POINT: 'MultiPoint', + MULTI_LINE_STRING: 'MultiLineString', + MULTI_POLYGON: 'MultiPolygon', + GEOMETRY_COLLECTION: 'GeometryCollection', + CIRCLE: 'Circle' +}; + + +/** + * @enum {string} + */ +ol.geom.GeometryLayout = { + XY: 'XY', + XYZ: 'XYZ', + XYM: 'XYM', + XYZM: 'XYZM' +}; + + + +/** + * @constructor + * @extends {ol.Observable} + * @todo stability experimental + */ +ol.geom.Geometry = function() { + + goog.base(this); + + /** + * @protected + * @type {ol.Extent|undefined} + */ + this.extent = undefined; + + /** + * @protected + * @type {number} + */ + this.extentRevision = -1; + + /** + * @protected + * @type {Object.} + */ + this.simplifiedGeometryCache = {}; + + /** + * @protected + * @type {number} + */ + this.simplifiedGeometryMaxMinSquaredTolerance = 0; + + /** + * @protected + * @type {number} + */ + this.simplifiedGeometryRevision = 0; + +}; +goog.inherits(ol.geom.Geometry, ol.Observable); + + +/** + * @return {ol.geom.Geometry} Clone. + * @todo stability experimental + */ +ol.geom.Geometry.prototype.clone = goog.abstractMethod; + + +/** + * @param {number} x X. + * @param {number} y Y. + * @param {ol.Coordinate} closestPoint Closest point. + * @param {number} minSquaredDistance Minimum squared distance. + * @return {number} Minimum squared distance. + */ +ol.geom.Geometry.prototype.closestPointXY = goog.abstractMethod; + + +/** + * @param {ol.Coordinate} point Point. + * @param {ol.Coordinate=} opt_closestPoint Closest point. + * @return {ol.Coordinate} Closest point. + * @todo stability experimental + */ +ol.geom.Geometry.prototype.getClosestPoint = function(point, opt_closestPoint) { + var closestPoint = goog.isDef(opt_closestPoint) ? + opt_closestPoint : [NaN, NaN]; + this.closestPointXY(point[0], point[1], closestPoint, Infinity); + return closestPoint; +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @return {boolean} Contains coordinate. + * @todo stability experimental + */ +ol.geom.Geometry.prototype.containsCoordinate = function(coordinate) { + return this.containsXY(coordinate[0], coordinate[1]); +}; + + +/** + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + */ +ol.geom.Geometry.prototype.containsXY = goog.functions.FALSE; + + +/** + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} extent Extent. + * @todo stability experimental + */ +ol.geom.Geometry.prototype.getExtent = goog.abstractMethod; + + +/** + * @param {number} squaredTolerance Squared tolerance. + * @return {ol.geom.Geometry} Simplified geometry. + */ +ol.geom.Geometry.prototype.getSimplifiedGeometry = goog.abstractMethod; + + +/** + * @return {ol.geom.GeometryType} Geometry type. + * @todo stability experimental + */ +ol.geom.Geometry.prototype.getType = goog.abstractMethod; + + +/** + * @param {ol.TransformFunction} transformFn Transform. + * @todo stability experimental + */ +ol.geom.Geometry.prototype.transform = goog.abstractMethod; + + +/** + * @typedef {ol.Coordinate} + */ +ol.geom.RawPoint; + + +/** + * @typedef {Array.} + */ +ol.geom.RawLineString; + + +/** + * @typedef {Array.} + * + */ +ol.geom.RawLinearRing; + + +/** + * @typedef {Array.} + */ +ol.geom.RawPolygon; + + +/** + * @typedef {Array.} + */ +ol.geom.RawMultiPoint; + + +/** + * @typedef {Array.} + */ +ol.geom.RawMultiLineString; + + +/** + * @typedef {Array.} + */ +ol.geom.RawMultiPolygon; diff --git a/float-no-zero/ol/ol/geom/geometrycollection.exports b/float-no-zero/ol/ol/geom/geometrycollection.exports new file mode 100644 index 0000000000..103ce2c40f --- /dev/null +++ b/float-no-zero/ol/ol/geom/geometrycollection.exports @@ -0,0 +1,7 @@ +@exportSymbol ol.geom.GeometryCollection +@exportProperty ol.geom.GeometryCollection.prototype.clone +@exportProperty ol.geom.GeometryCollection.prototype.getExtent +@exportProperty ol.geom.GeometryCollection.prototype.getGeometries +@exportProperty ol.geom.GeometryCollection.prototype.getSimplifiedGeometry +@exportProperty ol.geom.GeometryCollection.prototype.getType +@exportProperty ol.geom.GeometryCollection.prototype.setGeometries diff --git a/float-no-zero/ol/ol/geom/geometrycollection.js b/float-no-zero/ol/ol/geom/geometrycollection.js new file mode 100644 index 0000000000..12b8f5a0b5 --- /dev/null +++ b/float-no-zero/ol/ol/geom/geometrycollection.js @@ -0,0 +1,263 @@ +goog.provide('ol.geom.GeometryCollection'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.object'); +goog.require('ol.extent'); +goog.require('ol.geom.Geometry'); +goog.require('ol.geom.GeometryType'); + + + +/** + * @constructor + * @extends {ol.geom.Geometry} + * @param {Array.=} opt_geometries Geometries. + * @todo stability experimental + */ +ol.geom.GeometryCollection = function(opt_geometries) { + + goog.base(this); + + /** + * @private + * @type {Array.} + */ + this.geometries_ = goog.isDef(opt_geometries) ? opt_geometries : null; + + this.listenGeometriesChange_(); +}; +goog.inherits(ol.geom.GeometryCollection, ol.geom.Geometry); + + +/** + * @param {Array.} geometries Geometries. + * @private + * @return {Array.} Cloned geometries. + */ +ol.geom.GeometryCollection.cloneGeometries_ = function(geometries) { + var clonedGeometries = []; + var i, ii; + for (i = 0, ii = geometries.length; i < ii; ++i) { + clonedGeometries.push(geometries[i].clone()); + } + return clonedGeometries; +}; + + +/** + * @private + */ +ol.geom.GeometryCollection.prototype.unlistenGeometriesChange_ = function() { + var i, ii; + if (goog.isNull(this.geometries_)) { + return; + } + for (i = 0, ii = this.geometries_.length; i < ii; ++i) { + goog.events.unlisten( + this.geometries_[i], goog.events.EventType.CHANGE, + this.dispatchChangeEvent, false, this); + } +}; + + +/** + * @private + */ +ol.geom.GeometryCollection.prototype.listenGeometriesChange_ = function() { + var i, ii; + if (goog.isNull(this.geometries_)) { + return; + } + for (i = 0, ii = this.geometries_.length; i < ii; ++i) { + goog.events.listen( + this.geometries_[i], goog.events.EventType.CHANGE, + this.dispatchChangeEvent, false, this); + } +}; + + +/** + * @inheritDoc + */ +ol.geom.GeometryCollection.prototype.clone = function() { + var geometryCollection = new ol.geom.GeometryCollection(null); + geometryCollection.setGeometries(this.geometries_); + return geometryCollection; +}; + + +/** + * @inheritDoc + */ +ol.geom.GeometryCollection.prototype.closestPointXY = + function(x, y, closestPoint, minSquaredDistance) { + if (minSquaredDistance < + ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance; + } + var geometries = this.geometries_; + var i, ii; + for (i = 0, ii = geometries.length; i < ii; ++i) { + minSquaredDistance = geometries[i].closestPointXY( + x, y, closestPoint, minSquaredDistance); + } + return minSquaredDistance; +}; + + +/** + * @inheritDoc + */ +ol.geom.GeometryCollection.prototype.containsXY = function(x, y) { + var geometries = this.geometries_; + var i, ii; + for (i = 0, ii = geometries.length; i < ii; ++i) { + if (geometries[i].containsXY(x, y)) { + return true; + } + } + return false; +}; + + +/** + * @inheritDoc + */ +ol.geom.GeometryCollection.prototype.getExtent = function(opt_extent) { + if (this.extentRevision != this.getRevision()) { + var extent = ol.extent.createOrUpdateEmpty(this.extent); + var geometries = this.geometries_; + var i, ii; + for (i = 0, ii = geometries.length; i < ii; ++i) { + ol.extent.extend(extent, geometries[i].getExtent()); + } + this.extent = extent; + this.extentRevision = this.getRevision(); + } + goog.asserts.assert(goog.isDef(this.extent)); + return ol.extent.returnOrUpdate(this.extent, opt_extent); +}; + + +/** + * @return {Array.} Geometries. + * @todo stability experimental + */ +ol.geom.GeometryCollection.prototype.getGeometries = function() { + return ol.geom.GeometryCollection.cloneGeometries_(this.geometries_); +}; + + +/** + * @return {Array.} Geometries. + */ +ol.geom.GeometryCollection.prototype.getGeometriesArray = function() { + return this.geometries_; +}; + + +/** + * @inheritDoc + */ +ol.geom.GeometryCollection.prototype.getSimplifiedGeometry = + function(squaredTolerance) { + if (this.simplifiedGeometryRevision != this.getRevision()) { + goog.object.clear(this.simplifiedGeometryCache); + this.simplifiedGeometryMaxMinSquaredTolerance = 0; + this.simplifiedGeometryRevision = this.getRevision(); + } + if (squaredTolerance < 0 || + (this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && + squaredTolerance < this.simplifiedGeometryMaxMinSquaredTolerance)) { + return this; + } + var key = squaredTolerance.toString(); + if (this.simplifiedGeometryCache.hasOwnProperty(key)) { + return this.simplifiedGeometryCache[key]; + } else { + var simplifiedGeometries = []; + var geometries = this.geometries_; + var simplified = false; + var i, ii; + for (i = 0, ii = geometries.length; i < ii; ++i) { + var geometry = geometries[i]; + var simplifiedGeometry = geometry.getSimplifiedGeometry(squaredTolerance); + simplifiedGeometries.push(simplifiedGeometry); + if (simplifiedGeometry !== geometry) { + simplified = true; + } + } + if (simplified) { + var simplifiedGeometryCollection = new ol.geom.GeometryCollection(null); + simplifiedGeometryCollection.setGeometriesArray(simplifiedGeometries); + this.simplifiedGeometryCache[key] = simplifiedGeometryCollection; + return simplifiedGeometryCollection; + } else { + this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance; + return this; + } + } +}; + + +/** + * @inheritDoc + */ +ol.geom.GeometryCollection.prototype.getType = function() { + return ol.geom.GeometryType.GEOMETRY_COLLECTION; +}; + + +/** + * @return {boolean} Is empty. + * @todo stability experimental + */ +ol.geom.GeometryCollection.prototype.isEmpty = function() { + return goog.array.isEmpty(this.geometries_); +}; + + +/** + * @param {Array.} geometries Geometries. + * @todo stability experimental + */ +ol.geom.GeometryCollection.prototype.setGeometries = function(geometries) { + this.setGeometriesArray( + ol.geom.GeometryCollection.cloneGeometries_(geometries)); +}; + + +/** + * @param {Array.} geometries Geometries. + */ +ol.geom.GeometryCollection.prototype.setGeometriesArray = function(geometries) { + this.unlistenGeometriesChange_(); + this.geometries_ = geometries; + this.listenGeometriesChange_(); + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol.geom.GeometryCollection.prototype.transform = function(transformFn) { + var geometries = this.geometries_; + var i, ii; + for (i = 0, ii = geometries.length; i < ii; ++i) { + geometries[i].transform(transformFn); + } + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol.geom.GeometryCollection.prototype.disposeInternal = function() { + this.unlistenGeometriesChange_(); + goog.base(this, 'disposeInternal'); +}; diff --git a/float-no-zero/ol/ol/geom/linearring.exports b/float-no-zero/ol/ol/geom/linearring.exports new file mode 100644 index 0000000000..568949b1bb --- /dev/null +++ b/float-no-zero/ol/ol/geom/linearring.exports @@ -0,0 +1,6 @@ +@exportSymbol ol.geom.LinearRing +@exportProperty ol.geom.LinearRing.prototype.clone +@exportProperty ol.geom.LinearRing.prototype.getArea +@exportProperty ol.geom.LinearRing.prototype.getCoordinates +@exportProperty ol.geom.LinearRing.prototype.getType +@exportProperty ol.geom.LinearRing.prototype.setCoordinates diff --git a/float-no-zero/ol/ol/geom/linearring.js b/float-no-zero/ol/ol/geom/linearring.js new file mode 100644 index 0000000000..92d1ec19e1 --- /dev/null +++ b/float-no-zero/ol/ol/geom/linearring.js @@ -0,0 +1,144 @@ +goog.provide('ol.geom.LinearRing'); + +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.SimpleGeometry'); +goog.require('ol.geom.closest'); +goog.require('ol.geom.flat'); +goog.require('ol.geom.simplify'); + + + +/** + * @constructor + * @extends {ol.geom.SimpleGeometry} + * @param {ol.geom.RawLinearRing} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.LinearRing = function(coordinates, opt_layout) { + + goog.base(this); + + /** + * @private + * @type {number} + */ + this.maxDelta_ = -1; + + /** + * @private + * @type {number} + */ + this.maxDeltaRevision_ = -1; + + this.setCoordinates(coordinates, opt_layout); + +}; +goog.inherits(ol.geom.LinearRing, ol.geom.SimpleGeometry); + + +/** + * @inheritDoc + */ +ol.geom.LinearRing.prototype.clone = function() { + var linearRing = new ol.geom.LinearRing(null); + linearRing.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return linearRing; +}; + + +/** + * @inheritDoc + */ +ol.geom.LinearRing.prototype.closestPointXY = + function(x, y, closestPoint, minSquaredDistance) { + if (minSquaredDistance < + ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance; + } + if (this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getMaxSquaredDelta( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision(); + } + return ol.geom.closest.getClosestPoint( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, + this.maxDelta_, true, x, y, closestPoint, minSquaredDistance); +}; + + +/** + * @return {number} Area. + * @todo stability experimental + */ +ol.geom.LinearRing.prototype.getArea = function() { + return ol.geom.flat.linearRingArea( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); +}; + + +/** + * @return {ol.geom.RawLinearRing} Coordinates. + * @todo stability experimental + */ +ol.geom.LinearRing.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinates( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); +}; + + +/** + * @inheritDoc + */ +ol.geom.LinearRing.prototype.getSimplifiedGeometryInternal = + function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.douglasPeucker( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, + squaredTolerance, simplifiedFlatCoordinates, 0); + var simplifiedLinearRing = new ol.geom.LinearRing(null); + simplifiedLinearRing.setFlatCoordinates( + ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates); + return simplifiedLinearRing; +}; + + +/** + * @inheritDoc + */ +ol.geom.LinearRing.prototype.getType = function() { + return ol.geom.GeometryType.LINEAR_RING; +}; + + +/** + * @param {ol.geom.RawLinearRing} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.LinearRing.prototype.setCoordinates = + function(coordinates, opt_layout) { + if (goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null); + } else { + this.setLayout(opt_layout, coordinates, 1); + if (goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = []; + } + this.flatCoordinates.length = ol.geom.flat.deflateCoordinates( + this.flatCoordinates, 0, coordinates, this.stride); + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @param {Array.} flatCoordinates Flat coordinates. + */ +ol.geom.LinearRing.prototype.setFlatCoordinates = + function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent(); +}; diff --git a/float-no-zero/ol/ol/geom/linestring.exports b/float-no-zero/ol/ol/geom/linestring.exports new file mode 100644 index 0000000000..f5c50bdf5c --- /dev/null +++ b/float-no-zero/ol/ol/geom/linestring.exports @@ -0,0 +1,7 @@ +@exportSymbol ol.geom.LineString +@exportProperty ol.geom.LineString.prototype.clone +@exportProperty ol.geom.LineString.prototype.getCoordinateAtM +@exportProperty ol.geom.LineString.prototype.getCoordinates +@exportProperty ol.geom.LineString.prototype.getLength +@exportProperty ol.geom.LineString.prototype.getType +@exportProperty ol.geom.LineString.prototype.setCoordinates diff --git a/float-no-zero/ol/ol/geom/linestring.js b/float-no-zero/ol/ol/geom/linestring.js new file mode 100644 index 0000000000..989c9c88bb --- /dev/null +++ b/float-no-zero/ol/ol/geom/linestring.js @@ -0,0 +1,194 @@ +goog.provide('ol.geom.LineString'); + +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.SimpleGeometry'); +goog.require('ol.geom.closest'); +goog.require('ol.geom.flat'); +goog.require('ol.geom.simplify'); + + + +/** + * @constructor + * @extends {ol.geom.SimpleGeometry} + * @param {ol.geom.RawLineString} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.LineString = function(coordinates, opt_layout) { + + goog.base(this); + + /** + * @private + * @type {ol.Coordinate} + */ + this.flatMidpoint_ = null; + + /** + * @private + * @type {number} + */ + this.flatMidpointRevision_ = -1; + + /** + * @private + * @type {number} + */ + this.maxDelta_ = -1; + + /** + * @private + * @type {number} + */ + this.maxDeltaRevision_ = -1; + + this.setCoordinates(coordinates, opt_layout); + +}; +goog.inherits(ol.geom.LineString, ol.geom.SimpleGeometry); + + +/** + * @inheritDoc + */ +ol.geom.LineString.prototype.clone = function() { + var lineString = new ol.geom.LineString(null); + lineString.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return lineString; +}; + + +/** + * @inheritDoc + */ +ol.geom.LineString.prototype.closestPointXY = + function(x, y, closestPoint, minSquaredDistance) { + if (minSquaredDistance < + ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance; + } + if (this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getMaxSquaredDelta( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision(); + } + return ol.geom.closest.getClosestPoint( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, + this.maxDelta_, false, x, y, closestPoint, minSquaredDistance); +}; + + +/** + * Returns the coordinate at `m` using linear interpolation, or `null` if no + * such coordinate exists. + * + * `opt_extrapolate` controls extrapolation beyond the range of Ms in the + * MultiLineString. If `opt_extrapolate` is `true` then Ms less than the first + * M will return the first coordinate and Ms greater than the last M will + * return the last coordinate. + * + * @param {number} m M. + * @param {boolean=} opt_extrapolate Extrapolate. + * @return {ol.Coordinate} Coordinate. + */ +ol.geom.LineString.prototype.getCoordinateAtM = function(m, opt_extrapolate) { + if (this.layout != ol.geom.GeometryLayout.XYM && + this.layout != ol.geom.GeometryLayout.XYZM) { + return null; + } + var extrapolate = goog.isDef(opt_extrapolate) ? opt_extrapolate : false; + return ol.geom.flat.lineStringCoordinateAtM(this.flatCoordinates, 0, + this.flatCoordinates.length, this.stride, m, extrapolate); +}; + + +/** + * @return {ol.geom.RawLineString} Coordinates. + * @todo stability experimental + */ +ol.geom.LineString.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinates( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); +}; + + +/** + * @return {number} Length. + * @todo stability experimental + */ +ol.geom.LineString.prototype.getLength = function() { + return ol.geom.flat.lineStringLength( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); +}; + + +/** + * @return {Array.} Flat midpoint. + */ +ol.geom.LineString.prototype.getFlatMidpoint = function() { + if (this.flatMidpointRevision_ != this.getRevision()) { + this.flatMidpoint_ = ol.geom.flat.lineStringInterpolate( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, + 0.5, this.flatMidpoint_); + this.flatMidpointRevision_ = this.getRevision(); + } + return this.flatMidpoint_; +}; + + +/** + * @inheritDoc + */ +ol.geom.LineString.prototype.getSimplifiedGeometryInternal = + function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.douglasPeucker( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, + squaredTolerance, simplifiedFlatCoordinates, 0); + var simplifiedLineString = new ol.geom.LineString(null); + simplifiedLineString.setFlatCoordinates( + ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates); + return simplifiedLineString; +}; + + +/** + * @inheritDoc + */ +ol.geom.LineString.prototype.getType = function() { + return ol.geom.GeometryType.LINE_STRING; +}; + + +/** + * @param {ol.geom.RawLineString} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.LineString.prototype.setCoordinates = + function(coordinates, opt_layout) { + if (goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null); + } else { + this.setLayout(opt_layout, coordinates, 1); + if (goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = []; + } + this.flatCoordinates.length = ol.geom.flat.deflateCoordinates( + this.flatCoordinates, 0, coordinates, this.stride); + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @param {Array.} flatCoordinates Flat coordinates. + */ +ol.geom.LineString.prototype.setFlatCoordinates = + function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent(); +}; diff --git a/float-no-zero/ol/ol/geom/multilinestring.exports b/float-no-zero/ol/ol/geom/multilinestring.exports new file mode 100644 index 0000000000..23b3e5987e --- /dev/null +++ b/float-no-zero/ol/ol/geom/multilinestring.exports @@ -0,0 +1,7 @@ +@exportSymbol ol.geom.MultiLineString +@exportProperty ol.geom.MultiLineString.prototype.clone +@exportProperty ol.geom.MultiLineString.prototype.getCoordinateAtM +@exportProperty ol.geom.MultiLineString.prototype.getCoordinates +@exportProperty ol.geom.MultiLineString.prototype.getLineStrings +@exportProperty ol.geom.MultiLineString.prototype.getType +@exportProperty ol.geom.MultiLineString.prototype.setCoordinates diff --git a/float-no-zero/ol/ol/geom/multilinestring.js b/float-no-zero/ol/ol/geom/multilinestring.js new file mode 100644 index 0000000000..b096e2fe65 --- /dev/null +++ b/float-no-zero/ol/ol/geom/multilinestring.js @@ -0,0 +1,252 @@ +goog.provide('ol.geom.MultiLineString'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.SimpleGeometry'); +goog.require('ol.geom.closest'); +goog.require('ol.geom.flat'); +goog.require('ol.geom.simplify'); + + + +/** + * @constructor + * @extends {ol.geom.SimpleGeometry} + * @param {ol.geom.RawMultiLineString} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.MultiLineString = function(coordinates, opt_layout) { + + goog.base(this); + + /** + * @type {Array.} + * @private + */ + this.ends_ = []; + + /** + * @private + * @type {number} + */ + this.maxDelta_ = -1; + + /** + * @private + * @type {number} + */ + this.maxDeltaRevision_ = -1; + + this.setCoordinates(coordinates, opt_layout); + +}; +goog.inherits(ol.geom.MultiLineString, ol.geom.SimpleGeometry); + + +/** + * @inheritDoc + */ +ol.geom.MultiLineString.prototype.clone = function() { + var multiLineString = new ol.geom.MultiLineString(null); + multiLineString.setFlatCoordinates( + this.layout, this.flatCoordinates.slice(), this.ends_.slice()); + return multiLineString; +}; + + +/** + * @inheritDoc + */ +ol.geom.MultiLineString.prototype.closestPointXY = + function(x, y, closestPoint, minSquaredDistance) { + if (minSquaredDistance < + ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance; + } + if (this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getsMaxSquaredDelta( + this.flatCoordinates, 0, this.ends_, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision(); + } + return ol.geom.closest.getsClosestPoint( + this.flatCoordinates, 0, this.ends_, this.stride, + this.maxDelta_, false, x, y, closestPoint, minSquaredDistance); +}; + + +/** + * Returns the coordinate at `m` using linear interpolation, or `null` if no + * such coordinate exists. + * + * `opt_extrapolate` controls extrapolation beyond the range of Ms in the + * MultiLineString. If `opt_extrapolate` is `true` then Ms less than the first + * M will return the first coordinate and Ms greater than the last M will + * return the last coordinate. + * + * `opt_interpolate` controls interpolation between consecutive LineStrings + * within the MultiLineString. If `opt_interpolate` is `true` the coordinates + * will be linearly interpolated between the last coordinate of one LineString + * and the first coordinate of the next LineString. If `opt_interpolate` is + * `false` then the function will return `null` for Ms falling between + * LineStrings. + * + * @param {number} m M. + * @param {boolean=} opt_extrapolate Extrapolate. + * @param {boolean=} opt_interpolate Interpolate. + * @return {ol.Coordinate} Coordinate. + */ +ol.geom.MultiLineString.prototype.getCoordinateAtM = + function(m, opt_extrapolate, opt_interpolate) { + if ((this.layout != ol.geom.GeometryLayout.XYM && + this.layout != ol.geom.GeometryLayout.XYZM) || + this.flatCoordinates.length === 0) { + return null; + } + var extrapolate = goog.isDef(opt_extrapolate) ? opt_extrapolate : false; + var interpolate = goog.isDef(opt_interpolate) ? opt_interpolate : false; + return ol.geom.flat.lineStringsCoordinateAtM(this.flatCoordinates, 0, + this.ends_, this.stride, m, extrapolate, interpolate); +}; + + +/** + * @return {ol.geom.RawMultiLineString} Coordinates. + * @todo stability experimental + */ +ol.geom.MultiLineString.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinatess( + this.flatCoordinates, 0, this.ends_, this.stride); +}; + + +/** + * @return {Array.} Ends. + */ +ol.geom.MultiLineString.prototype.getEnds = function() { + return this.ends_; +}; + + +/** + * @return {Array.} LineStrings. + * @todo stability experimental + */ +ol.geom.MultiLineString.prototype.getLineStrings = function() { + // FIXME we should construct the line strings from the flat coordinates + var coordinates = this.getCoordinates(); + var lineStrings = []; + var i, ii; + for (i = 0, ii = coordinates.length; i < ii; ++i) { + lineStrings.push(new ol.geom.LineString(coordinates[i])); + } + return lineStrings; +}; + + +/** + * @return {Array.} Flat midpoints. + */ +ol.geom.MultiLineString.prototype.getFlatMidpoints = function() { + var midpoints = []; + var flatCoordinates = this.flatCoordinates; + var offset = 0; + var ends = this.ends_; + var stride = this.stride; + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + var midpoint = ol.geom.flat.lineStringInterpolate( + flatCoordinates, offset, end, stride, 0.5); + goog.array.extend(midpoints, midpoint); + offset = end; + } + return midpoints; +}; + + +/** + * @inheritDoc + */ +ol.geom.MultiLineString.prototype.getSimplifiedGeometryInternal = + function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + var simplifiedEnds = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.douglasPeuckers( + this.flatCoordinates, 0, this.ends_, this.stride, squaredTolerance, + simplifiedFlatCoordinates, 0, simplifiedEnds); + var simplifiedMultiLineString = new ol.geom.MultiLineString(null); + simplifiedMultiLineString.setFlatCoordinates( + ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEnds); + return simplifiedMultiLineString; +}; + + +/** + * @inheritDoc + */ +ol.geom.MultiLineString.prototype.getType = function() { + return ol.geom.GeometryType.MULTI_LINE_STRING; +}; + + +/** + * @param {ol.geom.RawMultiLineString} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.MultiLineString.prototype.setCoordinates = + function(coordinates, opt_layout) { + if (goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.ends_); + } else { + this.setLayout(opt_layout, coordinates, 2); + if (goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = []; + } + var ends = ol.geom.flat.deflateCoordinatess( + this.flatCoordinates, 0, coordinates, this.stride, this.ends_); + this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1]; + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @param {Array.} flatCoordinates Flat coordinates. + * @param {Array.} ends Ends. + */ +ol.geom.MultiLineString.prototype.setFlatCoordinates = + function(layout, flatCoordinates, ends) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.ends_ = ends; + this.dispatchChangeEvent(); +}; + + +/** + * @param {Array.} lineStrings LineStrings. + * @todo stability experimental + */ +ol.geom.MultiLineString.prototype.setLineStrings = function(lineStrings) { + var layout = ol.geom.GeometryLayout.XY; + var flatCoordinates = []; + var ends = []; + var i, ii; + for (i = 0, ii = lineStrings.length; i < ii; ++i) { + var lineString = lineStrings[i]; + if (i === 0) { + layout = lineString.getLayout(); + } else { + // FIXME better handle the case of non-matching layouts + goog.asserts.assert(lineString.getLayout() == layout); + } + goog.array.extend(flatCoordinates, lineString.getFlatCoordinates()); + ends.push(flatCoordinates.length); + } + this.setFlatCoordinates(layout, flatCoordinates, ends); +}; diff --git a/float-no-zero/ol/ol/geom/multipoint.exports b/float-no-zero/ol/ol/geom/multipoint.exports new file mode 100644 index 0000000000..97dff56f42 --- /dev/null +++ b/float-no-zero/ol/ol/geom/multipoint.exports @@ -0,0 +1,6 @@ +@exportSymbol ol.geom.MultiPoint +@exportProperty ol.geom.MultiPoint.prototype.clone +@exportProperty ol.geom.MultiPoint.prototype.getCoordinates +@exportProperty ol.geom.MultiPoint.prototype.getPoints +@exportProperty ol.geom.MultiPoint.prototype.getType +@exportProperty ol.geom.MultiPoint.prototype.setCoordinates diff --git a/float-no-zero/ol/ol/geom/multipoint.js b/float-no-zero/ol/ol/geom/multipoint.js new file mode 100644 index 0000000000..ad1d767e7a --- /dev/null +++ b/float-no-zero/ol/ol/geom/multipoint.js @@ -0,0 +1,125 @@ +goog.provide('ol.geom.MultiPoint'); + +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.SimpleGeometry'); +goog.require('ol.geom.flat'); + + + +/** + * @constructor + * @extends {ol.geom.SimpleGeometry} + * @param {ol.geom.RawMultiPoint} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.MultiPoint = function(coordinates, opt_layout) { + goog.base(this); + this.setCoordinates(coordinates, opt_layout); +}; +goog.inherits(ol.geom.MultiPoint, ol.geom.SimpleGeometry); + + +/** + * @inheritDoc + */ +ol.geom.MultiPoint.prototype.clone = function() { + var multiPoint = new ol.geom.MultiPoint(null); + multiPoint.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return multiPoint; +}; + + +/** + * @inheritDoc + */ +ol.geom.MultiPoint.prototype.closestPointXY = + function(x, y, closestPoint, minSquaredDistance) { + if (minSquaredDistance < + ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance; + } + var flatCoordinates = this.flatCoordinates; + var stride = this.stride; + var i, ii, j; + for (i = 0, ii = flatCoordinates.length; i < ii; i += stride) { + var squaredDistance = ol.geom.flat.squaredDistance( + x, y, flatCoordinates[i], flatCoordinates[i + 1]); + if (squaredDistance < minSquaredDistance) { + minSquaredDistance = squaredDistance; + for (j = 0; j < stride; ++j) { + closestPoint[j] = flatCoordinates[i + j]; + } + closestPoint.length = stride; + } + } + return minSquaredDistance; +}; + + +/** + * @return {ol.geom.RawMultiPoint} Coordinates. + * @todo stability experimental + */ +ol.geom.MultiPoint.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinates( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); +}; + + +/** + * @return {Array.} Points. + * @todo stability experimental + */ +ol.geom.MultiPoint.prototype.getPoints = function() { + // FIXME we should construct the points from the flat coordinates + var coordinates = this.getCoordinates(); + var points = []; + var i, ii; + for (i = 0, ii = coordinates.length; i < ii; ++i) { + points.push(new ol.geom.Point(coordinates[i])); + } + return points; +}; + + +/** + * @inheritDoc + */ +ol.geom.MultiPoint.prototype.getType = function() { + return ol.geom.GeometryType.MULTI_POINT; +}; + + +/** + * @param {ol.geom.RawMultiPoint} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.MultiPoint.prototype.setCoordinates = + function(coordinates, opt_layout) { + if (goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null); + } else { + this.setLayout(opt_layout, coordinates, 1); + if (goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = []; + } + this.flatCoordinates.length = ol.geom.flat.deflateCoordinates( + this.flatCoordinates, 0, coordinates, this.stride); + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @param {Array.} flatCoordinates Flat coordinates. + */ +ol.geom.MultiPoint.prototype.setFlatCoordinates = + function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent(); +}; diff --git a/float-no-zero/ol/ol/geom/multipolygon.exports b/float-no-zero/ol/ol/geom/multipolygon.exports new file mode 100644 index 0000000000..07d0d094b8 --- /dev/null +++ b/float-no-zero/ol/ol/geom/multipolygon.exports @@ -0,0 +1,8 @@ +@exportSymbol ol.geom.MultiPolygon +@exportProperty ol.geom.MultiPolygon.prototype.clone +@exportProperty ol.geom.MultiPolygon.prototype.getArea +@exportProperty ol.geom.MultiPolygon.prototype.getCoordinates +@exportProperty ol.geom.MultiPolygon.prototype.getInteriorPoints +@exportProperty ol.geom.MultiPolygon.prototype.getPolygons +@exportProperty ol.geom.MultiPolygon.prototype.getType +@exportProperty ol.geom.MultiPolygon.prototype.setCoordinates diff --git a/float-no-zero/ol/ol/geom/multipolygon.js b/float-no-zero/ol/ol/geom/multipolygon.js new file mode 100644 index 0000000000..4b8db45894 --- /dev/null +++ b/float-no-zero/ol/ol/geom/multipolygon.js @@ -0,0 +1,304 @@ +goog.provide('ol.geom.MultiPolygon'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.MultiPoint'); +goog.require('ol.geom.Polygon'); +goog.require('ol.geom.SimpleGeometry'); +goog.require('ol.geom.closest'); +goog.require('ol.geom.flat'); +goog.require('ol.geom.simplify'); + + + +/** + * @constructor + * @extends {ol.geom.SimpleGeometry} + * @param {ol.geom.RawMultiPolygon} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.MultiPolygon = function(coordinates, opt_layout) { + + goog.base(this); + + /** + * @type {Array.>} + * @private + */ + this.endss_ = []; + + /** + * @private + * @type {number} + */ + this.flatInteriorPointsRevision_ = -1; + + /** + * @private + * @type {Array.} + */ + this.flatInteriorPoints_ = null; + + /** + * @private + * @type {number} + */ + this.maxDelta_ = -1; + + /** + * @private + * @type {number} + */ + this.maxDeltaRevision_ = -1; + + /** + * @private + * @type {number} + */ + this.orientedRevision_ = -1; + + /** + * @private + * @type {Array.} + */ + this.orientedFlatCoordinates_ = null; + + this.setCoordinates(coordinates, opt_layout); + +}; +goog.inherits(ol.geom.MultiPolygon, ol.geom.SimpleGeometry); + + +/** + * @inheritDoc + */ +ol.geom.MultiPolygon.prototype.clone = function() { + var multiPolygon = new ol.geom.MultiPolygon(null); + multiPolygon.setFlatCoordinates( + this.layout, this.flatCoordinates.slice(), this.endss_.slice()); + return multiPolygon; +}; + + +/** + * @inheritDoc + */ +ol.geom.MultiPolygon.prototype.closestPointXY = + function(x, y, closestPoint, minSquaredDistance) { + if (minSquaredDistance < + ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance; + } + if (this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getssMaxSquaredDelta( + this.flatCoordinates, 0, this.endss_, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision(); + } + return ol.geom.closest.getssClosestPoint( + this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, + this.maxDelta_, true, x, y, closestPoint, minSquaredDistance); +}; + + +/** + * @inheritDoc + */ +ol.geom.MultiPolygon.prototype.containsXY = function(x, y) { + return ol.geom.flat.linearRingssContainsXY( + this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, x, y); +}; + + +/** + * @return {number} Area. + * @todo stability experimental + */ +ol.geom.MultiPolygon.prototype.getArea = function() { + return ol.geom.flat.linearRingssArea( + this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride); +}; + + +/** + * @return {ol.geom.RawMultiPolygon} Coordinates. + * @todo stability experimental + */ +ol.geom.MultiPolygon.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinatesss( + this.flatCoordinates, 0, this.endss_, this.stride); +}; + + +/** + * @return {Array.>} Endss. + */ +ol.geom.MultiPolygon.prototype.getEndss = function() { + return this.endss_; +}; + + +/** + * @return {Array.} Flat interior points. + */ +ol.geom.MultiPolygon.prototype.getFlatInteriorPoints = function() { + if (this.flatInteriorPointsRevision_ != this.getRevision()) { + var flatCenters = ol.geom.flat.linearRingssGetFlatCenters( + this.flatCoordinates, 0, this.endss_, this.stride); + this.flatInteriorPoints_ = ol.geom.flat.linearRingssGetInteriorPoints( + this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, + flatCenters); + this.flatInteriorPointsRevision_ = this.getRevision(); + } + return this.flatInteriorPoints_; +}; + + +/** + * @return {ol.geom.MultiPoint} Interior points. + */ +ol.geom.MultiPolygon.prototype.getInteriorPoints = function() { + var interiorPoints = new ol.geom.MultiPoint(null); + interiorPoints.setFlatCoordinates(ol.geom.GeometryLayout.XY, + this.getFlatInteriorPoints().slice()); + return interiorPoints; +}; + + +/** + * @return {Array.} Oriented flat coordinates. + */ +ol.geom.MultiPolygon.prototype.getOrientedFlatCoordinates = function() { + if (this.orientedRevision_ != this.getRevision()) { + var flatCoordinates = this.flatCoordinates; + if (ol.geom.flat.linearRingssAreOriented( + flatCoordinates, 0, this.endss_, this.stride)) { + this.orientedFlatCoordinates_ = flatCoordinates; + } else { + this.orientedFlatCoordinates_ = flatCoordinates.slice(); + this.orientedFlatCoordinates_.length = ol.geom.flat.orientLinearRingss( + this.orientedFlatCoordinates_, 0, this.endss_, this.stride); + } + this.orientedRevision_ = this.getRevision(); + } + return this.orientedFlatCoordinates_; +}; + + +/** + * @inheritDoc + */ +ol.geom.MultiPolygon.prototype.getSimplifiedGeometryInternal = + function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + var simplifiedEndss = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.quantizess( + this.flatCoordinates, 0, this.endss_, this.stride, + Math.sqrt(squaredTolerance), + simplifiedFlatCoordinates, 0, simplifiedEndss); + var simplifiedMultiPolygon = new ol.geom.MultiPolygon(null); + simplifiedMultiPolygon.setFlatCoordinates( + ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEndss); + return simplifiedMultiPolygon; +}; + + +/** + * @return {Array.} Polygons. + * @todo stability experimental + */ +ol.geom.MultiPolygon.prototype.getPolygons = function() { + var layout = this.layout; + var flatCoordinates = this.flatCoordinates; + var endss = this.endss_; + var polygons = []; + var offset = 0; + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + var end = ends[ends.length - 1]; + var polygon = new ol.geom.Polygon(null); + polygon.setFlatCoordinates( + layout, flatCoordinates.slice(offset, end), ends.slice()); + polygons.push(polygon); + offset = end; + } + return polygons; +}; + + +/** + * @inheritDoc + */ +ol.geom.MultiPolygon.prototype.getType = function() { + return ol.geom.GeometryType.MULTI_POLYGON; +}; + + +/** + * @param {ol.geom.RawMultiPolygon} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.MultiPolygon.prototype.setCoordinates = + function(coordinates, opt_layout) { + if (goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.endss_); + } else { + this.setLayout(opt_layout, coordinates, 3); + if (goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = []; + } + var endss = ol.geom.flat.deflateCoordinatesss( + this.flatCoordinates, 0, coordinates, this.stride, this.endss_); + var lastEnds = endss[endss.length - 1]; + this.flatCoordinates.length = lastEnds.length === 0 ? + 0 : lastEnds[lastEnds.length - 1]; + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @param {Array.} flatCoordinates Flat coordinates. + * @param {Array.>} endss Endss. + */ +ol.geom.MultiPolygon.prototype.setFlatCoordinates = + function(layout, flatCoordinates, endss) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.endss_ = endss; + this.dispatchChangeEvent(); +}; + + +/** + * @param {Array.} polygons Polygons. + * @todo stability experimental + */ +ol.geom.MultiPolygon.prototype.setPolygons = function(polygons) { + var layout = ol.geom.GeometryLayout.XY; + var flatCoordinates = []; + var endss = []; + var i, ii, ends; + for (i = 0, ii = polygons.length; i < ii; ++i) { + var polygon = polygons[i]; + if (i === 0) { + layout = polygon.getLayout(); + } else { + // FIXME better handle the case of non-matching layouts + goog.asserts.assert(polygon.getLayout() == layout); + } + var offset = flatCoordinates.length; + ends = polygon.getEnds(); + var j, jj; + for (j = 0, jj = ends.length; j < jj; ++j) { + ends[j] += offset; + } + goog.array.extend(flatCoordinates, polygon.getFlatCoordinates()); + endss.push(ends); + } + this.setFlatCoordinates(layout, flatCoordinates, endss); +}; diff --git a/float-no-zero/ol/ol/geom/point.exports b/float-no-zero/ol/ol/geom/point.exports new file mode 100644 index 0000000000..f48a3b7a4d --- /dev/null +++ b/float-no-zero/ol/ol/geom/point.exports @@ -0,0 +1,5 @@ +@exportSymbol ol.geom.Point +@exportProperty ol.geom.Point.prototype.clone +@exportProperty ol.geom.Point.prototype.getCoordinates +@exportProperty ol.geom.Point.prototype.getType +@exportProperty ol.geom.Point.prototype.setCoordinates diff --git a/float-no-zero/ol/ol/geom/point.js b/float-no-zero/ol/ol/geom/point.js new file mode 100644 index 0000000000..3e32ef01cb --- /dev/null +++ b/float-no-zero/ol/ol/geom/point.js @@ -0,0 +1,115 @@ +goog.provide('ol.geom.Point'); + +goog.require('goog.asserts'); +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.SimpleGeometry'); +goog.require('ol.geom.flat'); + + + +/** + * @constructor + * @extends {ol.geom.SimpleGeometry} + * @param {ol.geom.RawPoint} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.Point = function(coordinates, opt_layout) { + goog.base(this); + this.setCoordinates(coordinates, opt_layout); +}; +goog.inherits(ol.geom.Point, ol.geom.SimpleGeometry); + + +/** + * @inheritDoc + */ +ol.geom.Point.prototype.clone = function() { + var point = new ol.geom.Point(null); + point.setFlatCoordinates(this.layout, this.flatCoordinates.slice()); + return point; +}; + + +/** + * @inheritDoc + */ +ol.geom.Point.prototype.closestPointXY = + function(x, y, closestPoint, minSquaredDistance) { + var flatCoordinates = this.flatCoordinates; + var squaredDistance = ol.geom.flat.squaredDistance( + x, y, flatCoordinates[0], flatCoordinates[1]); + if (squaredDistance < minSquaredDistance) { + var stride = this.stride; + var i; + for (i = 0; i < stride; ++i) { + closestPoint[i] = flatCoordinates[i]; + } + closestPoint.length = stride; + return squaredDistance; + } else { + return minSquaredDistance; + } +}; + + +/** + * @return {ol.geom.RawPoint} Coordinates. + * @todo stability experimental + */ +ol.geom.Point.prototype.getCoordinates = function() { + return this.flatCoordinates.slice(); +}; + + +/** + * @inheritDoc + */ +ol.geom.Point.prototype.getExtent = function(opt_extent) { + if (this.extentRevision != this.getRevision()) { + this.extent = ol.extent.createOrUpdateFromCoordinate( + this.flatCoordinates, this.extent); + this.extentRevision = this.getRevision(); + } + goog.asserts.assert(goog.isDef(this.extent)); + return ol.extent.returnOrUpdate(this.extent, opt_extent); +}; + + +/** + * @inheritDoc + */ +ol.geom.Point.prototype.getType = function() { + return ol.geom.GeometryType.POINT; +}; + + +/** + * @param {ol.geom.RawPoint} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.Point.prototype.setCoordinates = function(coordinates, opt_layout) { + if (goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null); + } else { + this.setLayout(opt_layout, coordinates, 0); + if (goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = []; + } + this.flatCoordinates.length = ol.geom.flat.deflateCoordinate( + this.flatCoordinates, 0, coordinates, this.stride); + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @param {Array.} flatCoordinates Flat coordinates. + */ +ol.geom.Point.prototype.setFlatCoordinates = function(layout, flatCoordinates) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.dispatchChangeEvent(); +}; diff --git a/float-no-zero/ol/ol/geom/polygon.exports b/float-no-zero/ol/ol/geom/polygon.exports new file mode 100644 index 0000000000..7500491823 --- /dev/null +++ b/float-no-zero/ol/ol/geom/polygon.exports @@ -0,0 +1,8 @@ +@exportSymbol ol.geom.Polygon +@exportProperty ol.geom.Polygon.prototype.clone +@exportProperty ol.geom.Polygon.prototype.getArea +@exportProperty ol.geom.Polygon.prototype.getCoordinates +@exportProperty ol.geom.Polygon.prototype.getInteriorPoint +@exportProperty ol.geom.Polygon.prototype.getLinearRings +@exportProperty ol.geom.Polygon.prototype.getType +@exportProperty ol.geom.Polygon.prototype.setCoordinates diff --git a/float-no-zero/ol/ol/geom/polygon.js b/float-no-zero/ol/ol/geom/polygon.js new file mode 100644 index 0000000000..667a121e43 --- /dev/null +++ b/float-no-zero/ol/ol/geom/polygon.js @@ -0,0 +1,263 @@ +goog.provide('ol.geom.Polygon'); + +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.LinearRing'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.SimpleGeometry'); +goog.require('ol.geom.closest'); +goog.require('ol.geom.flat'); +goog.require('ol.geom.simplify'); + + + +/** + * @constructor + * @extends {ol.geom.SimpleGeometry} + * @param {ol.geom.RawPolygon} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.Polygon = function(coordinates, opt_layout) { + + goog.base(this); + + /** + * @type {Array.} + * @private + */ + this.ends_ = []; + + /** + * @private + * @type {number} + */ + this.flatInteriorPointRevision_ = -1; + + /** + * @private + * @type {ol.Coordinate} + */ + this.flatInteriorPoint_ = null; + + /** + * @private + * @type {number} + */ + this.maxDelta_ = -1; + + /** + * @private + * @type {number} + */ + this.maxDeltaRevision_ = -1; + + /** + * @private + * @type {number} + */ + this.orientedRevision_ = -1; + + /** + * @private + * @type {Array.} + */ + this.orientedFlatCoordinates_ = null; + + this.setCoordinates(coordinates, opt_layout); + +}; +goog.inherits(ol.geom.Polygon, ol.geom.SimpleGeometry); + + +/** + * @inheritDoc + */ +ol.geom.Polygon.prototype.clone = function() { + var polygon = new ol.geom.Polygon(null); + polygon.setFlatCoordinates( + this.layout, this.flatCoordinates.slice(), this.ends_.slice()); + return polygon; +}; + + +/** + * @inheritDoc + */ +ol.geom.Polygon.prototype.closestPointXY = + function(x, y, closestPoint, minSquaredDistance) { + if (minSquaredDistance < + ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) { + return minSquaredDistance; + } + if (this.maxDeltaRevision_ != this.getRevision()) { + this.maxDelta_ = Math.sqrt(ol.geom.closest.getsMaxSquaredDelta( + this.flatCoordinates, 0, this.ends_, this.stride, 0)); + this.maxDeltaRevision_ = this.getRevision(); + } + return ol.geom.closest.getsClosestPoint( + this.flatCoordinates, 0, this.ends_, this.stride, + this.maxDelta_, true, x, y, closestPoint, minSquaredDistance); +}; + + +/** + * @inheritDoc + */ +ol.geom.Polygon.prototype.containsXY = function(x, y) { + return ol.geom.flat.linearRingsContainsXY( + this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, x, y); +}; + + +/** + * @return {number} Area. + * @todo stability experimental + */ +ol.geom.Polygon.prototype.getArea = function() { + return ol.geom.flat.linearRingsArea( + this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride); +}; + + +/** + * @return {ol.geom.RawPolygon} Coordinates. + * @todo stability experimental + */ +ol.geom.Polygon.prototype.getCoordinates = function() { + return ol.geom.flat.inflateCoordinatess( + this.flatCoordinates, 0, this.ends_, this.stride); +}; + + +/** + * @return {Array.} Ends. + */ +ol.geom.Polygon.prototype.getEnds = function() { + return this.ends_; +}; + + +/** + * @return {Array.} Interior point. + */ +ol.geom.Polygon.prototype.getFlatInteriorPoint = function() { + if (this.flatInteriorPointRevision_ != this.getRevision()) { + var flatCenter = ol.extent.getCenter(this.getExtent()); + this.flatInteriorPoint_ = ol.geom.flat.linearRingsGetInteriorPoint( + this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, + flatCenter, 0); + this.flatInteriorPointRevision_ = this.getRevision(); + } + return this.flatInteriorPoint_; +}; + + +/** + * @return {ol.geom.Point} Interior point. + */ +ol.geom.Polygon.prototype.getInteriorPoint = function() { + return new ol.geom.Point(this.getFlatInteriorPoint()); +}; + + +/** + * @return {Array.} Linear rings. + * @todo stability experimental + */ +ol.geom.Polygon.prototype.getLinearRings = function() { + var layout = this.layout; + var flatCoordinates = this.flatCoordinates; + var ends = this.ends_; + var linearRings = []; + var offset = 0; + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + var linearRing = new ol.geom.LinearRing(null); + linearRing.setFlatCoordinates(layout, flatCoordinates.slice(offset, end)); + linearRings.push(linearRing); + offset = end; + } + return linearRings; +}; + + +/** + * @return {Array.} Oriented flat coordinates. + */ +ol.geom.Polygon.prototype.getOrientedFlatCoordinates = function() { + if (this.orientedRevision_ != this.getRevision()) { + var flatCoordinates = this.flatCoordinates; + if (ol.geom.flat.linearRingsAreOriented( + flatCoordinates, 0, this.ends_, this.stride)) { + this.orientedFlatCoordinates_ = flatCoordinates; + } else { + this.orientedFlatCoordinates_ = flatCoordinates.slice(); + this.orientedFlatCoordinates_.length = ol.geom.flat.orientLinearRings( + this.orientedFlatCoordinates_, 0, this.ends_, this.stride); + } + this.orientedRevision_ = this.getRevision(); + } + return this.orientedFlatCoordinates_; +}; + + +/** + * @inheritDoc + */ +ol.geom.Polygon.prototype.getSimplifiedGeometryInternal = + function(squaredTolerance) { + var simplifiedFlatCoordinates = []; + var simplifiedEnds = []; + simplifiedFlatCoordinates.length = ol.geom.simplify.quantizes( + this.flatCoordinates, 0, this.ends_, this.stride, + Math.sqrt(squaredTolerance), + simplifiedFlatCoordinates, 0, simplifiedEnds); + var simplifiedPolygon = new ol.geom.Polygon(null); + simplifiedPolygon.setFlatCoordinates( + ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEnds); + return simplifiedPolygon; +}; + + +/** + * @inheritDoc + */ +ol.geom.Polygon.prototype.getType = function() { + return ol.geom.GeometryType.POLYGON; +}; + + +/** + * @param {ol.geom.RawPolygon} coordinates Coordinates. + * @param {ol.geom.GeometryLayout=} opt_layout Layout. + * @todo stability experimental + */ +ol.geom.Polygon.prototype.setCoordinates = function(coordinates, opt_layout) { + if (goog.isNull(coordinates)) { + this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.ends_); + } else { + this.setLayout(opt_layout, coordinates, 2); + if (goog.isNull(this.flatCoordinates)) { + this.flatCoordinates = []; + } + var ends = ol.geom.flat.deflateCoordinatess( + this.flatCoordinates, 0, coordinates, this.stride, this.ends_); + this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1]; + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @param {Array.} flatCoordinates Flat coordinates. + * @param {Array.} ends Ends. + */ +ol.geom.Polygon.prototype.setFlatCoordinates = + function(layout, flatCoordinates, ends) { + this.setFlatCoordinatesInternal(layout, flatCoordinates); + this.ends_ = ends; + this.dispatchChangeEvent(); +}; diff --git a/float-no-zero/ol/ol/geom/simplegeometry.exports b/float-no-zero/ol/ol/geom/simplegeometry.exports new file mode 100644 index 0000000000..9ba0b04b69 --- /dev/null +++ b/float-no-zero/ol/ol/geom/simplegeometry.exports @@ -0,0 +1,7 @@ +@exportSymbol ol.geom.SimpleGeometry +@exportProperty ol.geom.SimpleGeometry.prototype.getExtent +@exportProperty ol.geom.SimpleGeometry.prototype.getFirstCoordinate +@exportProperty ol.geom.SimpleGeometry.prototype.getLastCoordinate +@exportProperty ol.geom.SimpleGeometry.prototype.getLayout +@exportProperty ol.geom.SimpleGeometry.prototype.getSimplifiedGeometry +@exportProperty ol.geom.SimpleGeometry.prototype.transform diff --git a/float-no-zero/ol/ol/geom/simplegeometry.js b/float-no-zero/ol/ol/geom/simplegeometry.js new file mode 100644 index 0000000000..879a84f2e9 --- /dev/null +++ b/float-no-zero/ol/ol/geom/simplegeometry.js @@ -0,0 +1,266 @@ +goog.provide('ol.geom.SimpleGeometry'); + +goog.require('goog.asserts'); +goog.require('goog.functions'); +goog.require('goog.object'); +goog.require('ol.extent'); +goog.require('ol.geom.Geometry'); +goog.require('ol.geom.flat'); + + + +/** + * @constructor + * @extends {ol.geom.Geometry} + * @todo stability experimental + */ +ol.geom.SimpleGeometry = function() { + + goog.base(this); + + /** + * @protected + * @type {ol.geom.GeometryLayout} + */ + this.layout = ol.geom.GeometryLayout.XY; + + /** + * @protected + * @type {number} + */ + this.stride = 2; + + /** + * @protected + * @type {Array.} + */ + this.flatCoordinates = null; + +}; +goog.inherits(ol.geom.SimpleGeometry, ol.geom.Geometry); + + +/** + * @param {number} stride Stride. + * @private + * @return {ol.geom.GeometryLayout} layout Layout. + */ +ol.geom.SimpleGeometry.getLayoutForStride_ = function(stride) { + if (stride == 2) { + return ol.geom.GeometryLayout.XY; + } else if (stride == 3) { + return ol.geom.GeometryLayout.XYZ; + } else if (stride == 4) { + return ol.geom.GeometryLayout.XYZM; + } else { + throw new Error('unsupported stride: ' + stride); + } +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @private + * @return {number} Stride. + */ +ol.geom.SimpleGeometry.getStrideForLayout_ = function(layout) { + if (layout == ol.geom.GeometryLayout.XY) { + return 2; + } else if (layout == ol.geom.GeometryLayout.XYZ) { + return 3; + } else if (layout == ol.geom.GeometryLayout.XYM) { + return 3; + } else if (layout == ol.geom.GeometryLayout.XYZM) { + return 4; + } else { + throw new Error('unsupported layout: ' + layout); + } +}; + + +/** + * @inheritDoc + */ +ol.geom.SimpleGeometry.prototype.containsXY = goog.functions.FALSE; + + +/** + * @inheritDoc + */ +ol.geom.SimpleGeometry.prototype.getExtent = function(opt_extent) { + if (this.extentRevision != this.getRevision()) { + this.extent = ol.extent.createOrUpdateFromFlatCoordinates( + this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, + this.extent); + this.extentRevision = this.getRevision(); + } + goog.asserts.assert(goog.isDef(this.extent)); + return ol.extent.returnOrUpdate(this.extent, opt_extent); +}; + + +/** + * @return {ol.Coordinate} First coordinate. + */ +ol.geom.SimpleGeometry.prototype.getFirstCoordinate = function() { + return this.flatCoordinates.slice(0, this.stride); +}; + + +/** + * @return {Array.} Flat coordinates. + */ +ol.geom.SimpleGeometry.prototype.getFlatCoordinates = function() { + return this.flatCoordinates; +}; + + +/** + * @return {ol.Coordinate} Last point. + */ +ol.geom.SimpleGeometry.prototype.getLastCoordinate = function() { + return this.flatCoordinates.slice(this.flatCoordinates.length - this.stride); +}; + + +/** + * @return {ol.geom.GeometryLayout} Layout. + * @todo stability experimental + */ +ol.geom.SimpleGeometry.prototype.getLayout = function() { + return this.layout; +}; + + +/** + * @inheritDoc + */ +ol.geom.SimpleGeometry.prototype.getSimplifiedGeometry = + function(squaredTolerance) { + if (this.simplifiedGeometryRevision != this.getRevision()) { + goog.object.clear(this.simplifiedGeometryCache); + this.simplifiedGeometryMaxMinSquaredTolerance = 0; + this.simplifiedGeometryRevision = this.getRevision(); + } + // If squaredTolerance is negative or if we know that simplification will not + // have any effect then just return this. + if (squaredTolerance < 0 || + (this.simplifiedGeometryMaxMinSquaredTolerance !== 0 && + squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance)) { + return this; + } + var key = squaredTolerance.toString(); + if (this.simplifiedGeometryCache.hasOwnProperty(key)) { + return this.simplifiedGeometryCache[key]; + } else { + var simplifiedGeometry = + this.getSimplifiedGeometryInternal(squaredTolerance); + var simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates(); + if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) { + this.simplifiedGeometryCache[key] = simplifiedGeometry; + return simplifiedGeometry; + } else { + // Simplification did not actually remove any coordinates. We now know + // that any calls to getSimplifiedGeometry with a squaredTolerance less + // than or equal to the current squaredTolerance will also not have any + // effect. This allows us to short circuit simplification (saving CPU + // cycles) and prevents the cache of simplified geometries from filling + // up with useless identical copies of this geometry (saving memory). + this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance; + return this; + } + } +}; + + +/** + * @param {number} squaredTolerance Squared tolerance. + * @return {ol.geom.SimpleGeometry} Simplified geometry. + * @protected + */ +ol.geom.SimpleGeometry.prototype.getSimplifiedGeometryInternal = + function(squaredTolerance) { + return this; +}; + + +/** + * @return {number} Stride. + */ +ol.geom.SimpleGeometry.prototype.getStride = function() { + return this.stride; +}; + + +/** + * @param {ol.geom.GeometryLayout} layout Layout. + * @param {Array.} flatCoordinates Flat coordinates. + * @protected + */ +ol.geom.SimpleGeometry.prototype.setFlatCoordinatesInternal = + function(layout, flatCoordinates) { + this.stride = ol.geom.SimpleGeometry.getStrideForLayout_(layout); + this.layout = layout; + this.flatCoordinates = flatCoordinates; +}; + + +/** + * @param {ol.geom.GeometryLayout|undefined} layout Layout. + * @param {Array} coordinates Coordinates. + * @param {number} nesting Nesting. + * @protected + */ +ol.geom.SimpleGeometry.prototype.setLayout = + function(layout, coordinates, nesting) { + /** @type {number} */ + var stride; + if (goog.isDef(layout)) { + stride = ol.geom.SimpleGeometry.getStrideForLayout_(layout); + } else { + var i; + for (i = 0; i < nesting; ++i) { + if (coordinates.length === 0) { + this.layout = ol.geom.GeometryLayout.XY; + this.stride = 2; + return; + } else { + coordinates = /** @type {Array} */ (coordinates[0]); + } + } + stride = (/** @type {Array} */ (coordinates)).length; + layout = ol.geom.SimpleGeometry.getLayoutForStride_(stride); + } + this.layout = layout; + this.stride = stride; +}; + + +/** + * @inheritDoc + */ +ol.geom.SimpleGeometry.prototype.transform = function(transformFn) { + if (!goog.isNull(this.flatCoordinates)) { + transformFn(this.flatCoordinates, this.flatCoordinates, this.stride); + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {ol.geom.SimpleGeometry} simpleGeometry Simple geometry. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {Array.=} opt_dest Destination. + * @return {Array.} Transformed flat coordinates. + */ +ol.geom.transformSimpleGeometry2D = + function(simpleGeometry, transform, opt_dest) { + var flatCoordinates = simpleGeometry.getFlatCoordinates(); + if (goog.isNull(flatCoordinates)) { + return null; + } else { + var stride = simpleGeometry.getStride(); + return ol.geom.flat.transform2D( + flatCoordinates, stride, transform, opt_dest); + } +}; diff --git a/float-no-zero/ol/ol/geom/simplifygeom.js b/float-no-zero/ol/ol/geom/simplifygeom.js new file mode 100644 index 0000000000..1e361ae3e5 --- /dev/null +++ b/float-no-zero/ol/ol/geom/simplifygeom.js @@ -0,0 +1,400 @@ +// Based on simplify-js https://github.com/mourner/simplify-js +// Copyright (c) 2012, Vladimir Agafonkin +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +goog.provide('ol.geom.simplify'); + +goog.require('ol.geom.flat'); + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} squaredTolerance Squared tolerance. + * @param {boolean} highQuality Highest quality. + * @param {Array.=} opt_simplifiedFlatCoordinates Simplified flat + * coordinates. + * @return {Array.} Simplified line string. + */ +ol.geom.simplify.lineString = function(flatCoordinates, offset, end, stride, + squaredTolerance, highQuality, opt_simplifiedFlatCoordinates) { + var simplifiedFlatCoordinates = goog.isDef(opt_simplifiedFlatCoordinates) ? + opt_simplifiedFlatCoordinates : []; + if (!highQuality) { + end = ol.geom.simplify.radialDistance(flatCoordinates, offset, end, + stride, squaredTolerance, + simplifiedFlatCoordinates, 0); + flatCoordinates = simplifiedFlatCoordinates; + offset = 0; + stride = 2; + } + simplifiedFlatCoordinates.length = ol.geom.simplify.douglasPeucker( + flatCoordinates, offset, end, stride, squaredTolerance, + simplifiedFlatCoordinates, 0); + return simplifiedFlatCoordinates; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} squaredTolerance Squared tolerance. + * @param {Array.} simplifiedFlatCoordinates Simplified flat + * coordinates. + * @param {number} simplifiedOffset Simplified offset. + * @return {number} Simplified offset. + */ +ol.geom.simplify.douglasPeucker = function(flatCoordinates, offset, end, + stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) { + var n = (end - offset) / stride; + if (n < 3) { + for (; offset < end; offset += stride) { + simplifiedFlatCoordinates[simplifiedOffset++] = + flatCoordinates[offset]; + simplifiedFlatCoordinates[simplifiedOffset++] = + flatCoordinates[offset + 1]; + } + return simplifiedOffset; + } + /** @type {Array.} */ + var markers = new Array(n); + markers[0] = 1; + markers[n - 1] = 1; + /** @type {Array.} */ + var stack = [offset, end - stride]; + var index = 0; + var i; + while (stack.length > 0) { + var last = stack.pop(); + var first = stack.pop(); + var maxSquaredDistance = 0; + var x1 = flatCoordinates[first]; + var y1 = flatCoordinates[first + 1]; + var x2 = flatCoordinates[last]; + var y2 = flatCoordinates[last + 1]; + for (i = first + stride; i < last; i += stride) { + var x = flatCoordinates[i]; + var y = flatCoordinates[i + 1]; + var squaredDistance = ol.geom.flat.squaredSegmentDistance( + x, y, x1, y1, x2, y2); + if (squaredDistance > maxSquaredDistance) { + index = i; + maxSquaredDistance = squaredDistance; + } + } + if (maxSquaredDistance > squaredTolerance) { + markers[(index - offset) / stride] = 1; + if (first + stride < index) { + stack.push(first, index); + } + if (index + stride < last) { + stack.push(index, last); + } + } + } + for (i = 0; i < n; ++i) { + if (markers[i]) { + simplifiedFlatCoordinates[simplifiedOffset++] = + flatCoordinates[offset + i * stride]; + simplifiedFlatCoordinates[simplifiedOffset++] = + flatCoordinates[offset + i * stride + 1]; + } + } + return simplifiedOffset; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @param {number} squaredTolerance Squared tolerance. + * @param {Array.} simplifiedFlatCoordinates Simplified flat + * coordinates. + * @param {number} simplifiedOffset Simplified offset. + * @param {Array.} simplifiedEnds Simplified ends. + * @return {number} Simplified offset. + */ +ol.geom.simplify.douglasPeuckers = function(flatCoordinates, offset, + ends, stride, squaredTolerance, simplifiedFlatCoordinates, + simplifiedOffset, simplifiedEnds) { + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + simplifiedOffset = ol.geom.simplify.douglasPeucker( + flatCoordinates, offset, end, stride, squaredTolerance, + simplifiedFlatCoordinates, simplifiedOffset); + simplifiedEnds.push(simplifiedOffset); + offset = end; + } + return simplifiedOffset; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @param {number} squaredTolerance Squared tolerance. + * @param {Array.} simplifiedFlatCoordinates Simplified flat + * coordinates. + * @param {number} simplifiedOffset Simplified offset. + * @param {Array.>} simplifiedEndss Simplified endss. + * @return {number} Simplified offset. + */ +ol.geom.simplify.douglasPeuckerss = function( + flatCoordinates, offset, endss, stride, squaredTolerance, + simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) { + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + var simplifiedEnds = []; + simplifiedOffset = ol.geom.simplify.douglasPeuckers( + flatCoordinates, offset, ends, stride, squaredTolerance, + simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds); + simplifiedEndss.push(simplifiedEnds); + offset = ends[ends.length - 1]; + } + return simplifiedOffset; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} squaredTolerance Squared tolerance. + * @param {Array.} simplifiedFlatCoordinates Simplified flat + * coordinates. + * @param {number} simplifiedOffset Simplified offset. + * @return {number} Simplified offset. + */ +ol.geom.simplify.radialDistance = function(flatCoordinates, offset, end, + stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) { + if (end <= offset + stride) { + // zero or one point, no simplification possible, so copy and return + for (; offset < end; offset += stride) { + simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset]; + simplifiedFlatCoordinates[simplifiedOffset++] = + flatCoordinates[offset + 1]; + } + return simplifiedOffset; + } + var x1 = flatCoordinates[offset]; + var y1 = flatCoordinates[offset + 1]; + // copy first point + simplifiedFlatCoordinates[simplifiedOffset++] = x1; + simplifiedFlatCoordinates[simplifiedOffset++] = y1; + var x2 = x1; + var y2 = y1; + for (offset += stride; offset < end; offset += stride) { + x2 = flatCoordinates[offset]; + y2 = flatCoordinates[offset + 1]; + if (ol.geom.flat.squaredDistance(x1, y1, x2, y2) > squaredTolerance) { + // copy point at offset + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2; + x1 = x2; + y1 = y2; + } + } + if (x2 != x1 || y2 != y1) { + // copy last point + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2; + } + return simplifiedOffset; +}; + + +/** + * @param {number} value Value. + * @param {number} tolerance Squared tolerance. + * @return {number} Rounded value. + */ +ol.geom.simplify.snap = function(value, tolerance) { + return tolerance * Math.round(value / tolerance); +}; + + +/** + * Simplifies a line string using an algorithm designed by Tim Schaub. + * Coordinates are snapped to the nearest value in a virtual grid and + * consecutive duplicate coordinates are discarded. This effectively preserves + * topology as the simplification of any subsection of a line string is + * independent of the rest of the line string. This means that, for examples, + * the common edge between two polygons will be simplified to the same line + * string independently in both polygons. This implementation uses a single + * pass over the coordinates and eliminates intermediate collinear points. + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} tolerance Squared tolerance. + * @param {Array.} simplifiedFlatCoordinates Simplified flat + * coordinates. + * @param {number} simplifiedOffset Simplified offset. + * @return {number} Simplified offset. + */ +ol.geom.simplify.quantize = function(flatCoordinates, offset, end, stride, + tolerance, simplifiedFlatCoordinates, simplifiedOffset) { + // do nothing if the line is empty + if (offset == end) { + return simplifiedOffset; + } + // snap the first coordinate (P1) + var x1 = ol.geom.simplify.snap(flatCoordinates[offset], tolerance); + var y1 = ol.geom.simplify.snap(flatCoordinates[offset + 1], tolerance); + offset += stride; + // add the first coordinate to the output + simplifiedFlatCoordinates[simplifiedOffset++] = x1; + simplifiedFlatCoordinates[simplifiedOffset++] = y1; + // find the next coordinate that does not snap to the same value as the first + // coordinate (P2) + var x2, y2; + do { + x2 = ol.geom.simplify.snap(flatCoordinates[offset], tolerance); + y2 = ol.geom.simplify.snap(flatCoordinates[offset + 1], tolerance); + offset += stride; + if (offset == end) { + // all coordinates snap to the same value, the line collapses to a point + // push the last snapped value anyway to ensure that the output contains + // at least two points + // FIXME should we really return at least two points anyway? + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2; + return simplifiedOffset; + } + } while (x2 == x1 && y2 == y1); + while (offset < end) { + var x3, y3; + // snap the next coordinate (P3) + x3 = ol.geom.simplify.snap(flatCoordinates[offset], tolerance); + y3 = ol.geom.simplify.snap(flatCoordinates[offset + 1], tolerance); + offset += stride; + // skip P3 if it is equal to P2 + if (x3 == x2 && y3 == y2) { + continue; + } + // calculate the delta between P1 and P2 + var dx1 = x2 - x1; + var dy1 = y2 - y1; + // calculate the delta between P3 and P1 + var dx2 = x3 - x1; + var dy2 = y3 - y1; + // if P1, P2, and P3 are colinear and P3 is further from P1 than P2 is from + // P1 in the same direction then P2 is on the straight line between P1 and + // P3 + if ((dx1 * dy2 == dy1 * dx2) && + ((dx1 < 0 && dx2 < dx1) || dx1 == dx2 || (dx1 > 0 && dx2 > dx1)) && + ((dy1 < 0 && dy2 < dy1) || dy1 == dy2 || (dy1 > 0 && dy2 > dy1))) { + // discard P2 and set P2 = P3 + x2 = x3; + y2 = y3; + continue; + } + // either P1, P2, and P3 are not colinear, or they are colinear but P3 is + // between P3 and P1 or on the opposite half of the line to P2. add P2, + // and continue with P1 = P2 and P2 = P3 + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2; + x1 = x2; + y1 = y2; + x2 = x3; + y2 = y3; + } + // add the last point (P2) + simplifiedFlatCoordinates[simplifiedOffset++] = x2; + simplifiedFlatCoordinates[simplifiedOffset++] = y2; + return simplifiedOffset; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @param {number} tolerance Squared tolerance. + * @param {Array.} simplifiedFlatCoordinates Simplified flat + * coordinates. + * @param {number} simplifiedOffset Simplified offset. + * @param {Array.} simplifiedEnds Simplified ends. + * @return {number} Simplified offset. + */ +ol.geom.simplify.quantizes = function( + flatCoordinates, offset, ends, stride, + tolerance, + simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) { + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + simplifiedOffset = ol.geom.simplify.quantize( + flatCoordinates, offset, end, stride, + tolerance, + simplifiedFlatCoordinates, simplifiedOffset); + simplifiedEnds.push(simplifiedOffset); + offset = end; + } + return simplifiedOffset; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @param {number} tolerance Squared tolerance. + * @param {Array.} simplifiedFlatCoordinates Simplified flat + * coordinates. + * @param {number} simplifiedOffset Simplified offset. + * @param {Array.>} simplifiedEndss Simplified endss. + * @return {number} Simplified offset. + */ +ol.geom.simplify.quantizess = function( + flatCoordinates, offset, endss, stride, + tolerance, + simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) { + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + var simplifiedEnds = []; + simplifiedOffset = ol.geom.simplify.quantizes( + flatCoordinates, offset, ends, stride, + tolerance, + simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds); + simplifiedEndss.push(simplifiedEnds); + offset = ends[ends.length - 1]; + } + return simplifiedOffset; +}; diff --git a/float-no-zero/ol/ol/image.js b/float-no-zero/ol/ol/image.js new file mode 100644 index 0000000000..963e4bdff8 --- /dev/null +++ b/float-no-zero/ol/ol/image.js @@ -0,0 +1,139 @@ +goog.provide('ol.Image'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.object'); +goog.require('ol.ImageBase'); +goog.require('ol.ImageState'); + + + +/** + * @constructor + * @extends {ol.ImageBase} + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {Array.} attributions Attributions. + * @param {string} src Image source URI. + * @param {?string} crossOrigin Cross origin. + */ +ol.Image = + function(extent, resolution, pixelRatio, attributions, src, crossOrigin) { + + goog.base(this, extent, resolution, pixelRatio, ol.ImageState.IDLE, + attributions); + + /** + * @private + * @type {string} + */ + this.src_ = src; + + /** + * @private + * @type {Image} + */ + this.image_ = new Image(); + if (!goog.isNull(crossOrigin)) { + this.image_.crossOrigin = crossOrigin; + } + + /** + * @private + * @type {Object.} + */ + this.imageByContext_ = {}; + + /** + * @private + * @type {Array.} + */ + this.imageListenerKeys_ = null; + + /** + * @protected + * @type {ol.ImageState} + */ + this.state = ol.ImageState.IDLE; +}; +goog.inherits(ol.Image, ol.ImageBase); + + +/** + * @param {Object=} opt_context Object. + * @return {HTMLCanvasElement|Image|HTMLVideoElement} Image. + */ +ol.Image.prototype.getImageElement = function(opt_context) { + if (goog.isDef(opt_context)) { + var image; + var key = goog.getUid(opt_context); + if (key in this.imageByContext_) { + return this.imageByContext_[key]; + } else if (goog.object.isEmpty(this.imageByContext_)) { + image = this.image_; + } else { + image = /** @type {Image} */ (this.image_.cloneNode(false)); + } + this.imageByContext_[key] = image; + return image; + } else { + return this.image_; + } +}; + + +/** + * Tracks loading or read errors. + * + * @private + */ +ol.Image.prototype.handleImageError_ = function() { + this.state = ol.ImageState.ERROR; + this.unlistenImage_(); + this.dispatchChangeEvent(); +}; + + +/** + * Tracks successful image load. + * + * @private + */ +ol.Image.prototype.handleImageLoad_ = function() { + this.state = ol.ImageState.LOADED; + this.unlistenImage_(); + this.dispatchChangeEvent(); +}; + + +/** + * Load not yet loaded URI. + */ +ol.Image.prototype.load = function() { + if (this.state == ol.ImageState.IDLE) { + this.state = ol.ImageState.LOADING; + goog.asserts.assert(goog.isNull(this.imageListenerKeys_)); + this.imageListenerKeys_ = [ + goog.events.listenOnce(this.image_, goog.events.EventType.ERROR, + this.handleImageError_, false, this), + goog.events.listenOnce(this.image_, goog.events.EventType.LOAD, + this.handleImageLoad_, false, this) + ]; + this.image_.src = this.src_; + } +}; + + +/** + * Discards event handlers which listen for load completion or errors. + * + * @private + */ +ol.Image.prototype.unlistenImage_ = function() { + goog.asserts.assert(!goog.isNull(this.imageListenerKeys_)); + goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey); + this.imageListenerKeys_ = null; +}; diff --git a/float-no-zero/ol/ol/imagebase.js b/float-no-zero/ol/ol/imagebase.js new file mode 100644 index 0000000000..8924be9a5f --- /dev/null +++ b/float-no-zero/ol/ol/imagebase.js @@ -0,0 +1,127 @@ +goog.provide('ol.ImageBase'); +goog.provide('ol.ImageState'); + +goog.require('goog.events.EventTarget'); +goog.require('goog.events.EventType'); +goog.require('ol.Attribution'); +goog.require('ol.Extent'); + + +/** + * @enum {number} + */ +ol.ImageState = { + IDLE: 0, + LOADING: 1, + LOADED: 2, + ERROR: 3 +}; + + + +/** + * @constructor + * @extends {goog.events.EventTarget} + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.ImageState} state State. + * @param {Array.} attributions Attributions. + */ +ol.ImageBase = function(extent, resolution, pixelRatio, state, attributions) { + + goog.base(this); + + /** + * @private + * @type {Array.} + */ + this.attributions_ = attributions; + + /** + * @private + * @type {ol.Extent} + */ + this.extent_ = extent; + + /** + * @private + * @type {number} + */ + this.pixelRatio_ = pixelRatio; + + /** + * @private + * @type {number} + */ + this.resolution_ = resolution; + + /** + * @protected + * @type {ol.ImageState} + */ + this.state = state; + +}; +goog.inherits(ol.ImageBase, goog.events.EventTarget); + + +/** + * @protected + */ +ol.ImageBase.prototype.dispatchChangeEvent = function() { + this.dispatchEvent(goog.events.EventType.CHANGE); +}; + + +/** + * @return {Array.} Attributions. + */ +ol.ImageBase.prototype.getAttributions = function() { + return this.attributions_; +}; + + +/** + * @return {ol.Extent} Extent. + */ +ol.ImageBase.prototype.getExtent = function() { + return this.extent_; +}; + + +/** + * @param {Object=} opt_context Object. + * @return {HTMLCanvasElement|Image|HTMLVideoElement} Image. + */ +ol.ImageBase.prototype.getImageElement = goog.abstractMethod; + + +/** + * @return {number} PixelRatio. + */ +ol.ImageBase.prototype.getPixelRatio = function() { + return this.pixelRatio_; +}; + + +/** + * @return {number} Resolution. + */ +ol.ImageBase.prototype.getResolution = function() { + return this.resolution_; +}; + + +/** + * @return {ol.ImageState} State. + */ +ol.ImageBase.prototype.getState = function() { + return this.state; +}; + + +/** + * Load not yet loaded URI. + */ +ol.ImageBase.prototype.load = goog.abstractMethod; diff --git a/float-no-zero/ol/ol/imagecanvas.js b/float-no-zero/ol/ol/imagecanvas.js new file mode 100644 index 0000000000..3cd7ac9f2b --- /dev/null +++ b/float-no-zero/ol/ol/imagecanvas.js @@ -0,0 +1,38 @@ +goog.provide('ol.ImageCanvas'); + +goog.require('ol.ImageBase'); +goog.require('ol.ImageState'); + + + +/** + * @constructor + * @extends {ol.ImageBase} + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {Array.} attributions Attributions. + * @param {HTMLCanvasElement} canvas Canvas. + */ +ol.ImageCanvas = function(extent, resolution, pixelRatio, attributions, + canvas) { + + goog.base(this, extent, resolution, pixelRatio, ol.ImageState.LOADED, + attributions); + + /** + * @private + * @type {HTMLCanvasElement} + */ + this.canvas_ = canvas; + +}; +goog.inherits(ol.ImageCanvas, ol.ImageBase); + + +/** + * @inheritDoc + */ +ol.ImageCanvas.prototype.getImageElement = function(opt_context) { + return this.canvas_; +}; diff --git a/float-no-zero/ol/ol/imagetile.exports b/float-no-zero/ol/ol/imagetile.exports new file mode 100644 index 0000000000..25d191acba --- /dev/null +++ b/float-no-zero/ol/ol/imagetile.exports @@ -0,0 +1 @@ +@exportProperty ol.ImageTile.prototype.getImage diff --git a/float-no-zero/ol/ol/imagetile.js b/float-no-zero/ol/ol/imagetile.js new file mode 100644 index 0000000000..1fa5c9b866 --- /dev/null +++ b/float-no-zero/ol/ol/imagetile.js @@ -0,0 +1,160 @@ +goog.provide('ol.ImageTile'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.object'); +goog.require('ol.Tile'); +goog.require('ol.TileCoord'); +goog.require('ol.TileLoadFunctionType'); +goog.require('ol.TileState'); + + + +/** + * @constructor + * @extends {ol.Tile} + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.TileState} state State. + * @param {string} src Image source URI. + * @param {?string} crossOrigin Cross origin. + * @param {ol.TileLoadFunctionType} tileLoadFunction Tile load function. + * @todo stability experimental + */ +ol.ImageTile = + function(tileCoord, state, src, crossOrigin, tileLoadFunction) { + + goog.base(this, tileCoord, state); + + /** + * Image URI + * + * @private + * @type {string} + */ + this.src_ = src; + + /** + * @private + * @type {Image} + */ + this.image_ = new Image(); + if (!goog.isNull(crossOrigin)) { + this.image_.crossOrigin = crossOrigin; + } + + /** + * @private + * @type {Object.} + */ + this.imageByContext_ = {}; + + /** + * @private + * @type {Array.} + */ + this.imageListenerKeys_ = null; + + /** + * @private + * @type {ol.TileLoadFunctionType} + */ + this.tileLoadFunction_ = tileLoadFunction; + +}; +goog.inherits(ol.ImageTile, ol.Tile); + + +/** + * @inheritDoc + * @todo stability experimental + */ +ol.ImageTile.prototype.getImage = function(opt_context) { + if (goog.isDef(opt_context)) { + var image; + var key = goog.getUid(opt_context); + if (key in this.imageByContext_) { + return this.imageByContext_[key]; + } else if (goog.object.isEmpty(this.imageByContext_)) { + image = this.image_; + } else { + image = /** @type {Image} */ (this.image_.cloneNode(false)); + } + this.imageByContext_[key] = image; + return image; + } else { + return this.image_; + } +}; + + +/** + * @inheritDoc + */ +ol.ImageTile.prototype.getKey = function() { + return this.src_; +}; + + +/** + * Tracks loading or read errors. + * + * @private + */ +ol.ImageTile.prototype.handleImageError_ = function() { + this.state = ol.TileState.ERROR; + this.unlistenImage_(); + this.dispatchChangeEvent(); +}; + + +/** + * Tracks successful image load. + * + * @private + */ +ol.ImageTile.prototype.handleImageLoad_ = function() { + if (!goog.isDef(this.image_.naturalWidth)) { + this.image_.naturalWidth = this.image_.width; + this.image_.naturalHeight = this.image_.height; + } + + if (this.image_.naturalWidth && this.image_.naturalHeight) { + this.state = ol.TileState.LOADED; + } else { + this.state = ol.TileState.EMPTY; + } + this.unlistenImage_(); + this.dispatchChangeEvent(); +}; + + +/** + * Load not yet loaded URI. + */ +ol.ImageTile.prototype.load = function() { + if (this.state == ol.TileState.IDLE) { + this.state = ol.TileState.LOADING; + goog.asserts.assert(goog.isNull(this.imageListenerKeys_)); + this.imageListenerKeys_ = [ + goog.events.listenOnce(this.image_, goog.events.EventType.ERROR, + this.handleImageError_, false, this), + goog.events.listenOnce(this.image_, goog.events.EventType.LOAD, + this.handleImageLoad_, false, this) + ]; + this.tileLoadFunction_(this, this.src_); + } +}; + + +/** + * Discards event handlers which listen for load completion or errors. + * + * @private + */ +ol.ImageTile.prototype.unlistenImage_ = function() { + goog.asserts.assert(!goog.isNull(this.imageListenerKeys_)); + goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey); + this.imageListenerKeys_ = null; +}; diff --git a/float-no-zero/ol/ol/imageurlfunction.js b/float-no-zero/ol/ol/imageurlfunction.js new file mode 100644 index 0000000000..fe52c718c0 --- /dev/null +++ b/float-no-zero/ol/ol/imageurlfunction.js @@ -0,0 +1,46 @@ +goog.provide('ol.ImageUrlFunction'); +goog.provide('ol.ImageUrlFunctionType'); + +goog.require('ol.Size'); + + +/** + * @typedef {function(this:ol.source.Image, ol.Extent, ol.Size, + * ol.proj.Projection): (string|undefined)} + */ +ol.ImageUrlFunctionType; + + +/** + * @param {string} baseUrl Base URL (may have query data). + * @param {Object.} params to encode in the URL. + * @param {function(string, Object., ol.Extent, ol.Size, + * ol.proj.Projection): (string|undefined)} paramsFunction params function. + * @return {ol.ImageUrlFunctionType} Image URL function. + */ +ol.ImageUrlFunction.createFromParamsFunction = + function(baseUrl, params, paramsFunction) { + return ( + /** + * @this {ol.source.Image} + * @param {ol.Extent} extent Extent. + * @param {ol.Size} size Size. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} URL. + */ + function(extent, size, projection) { + return paramsFunction(baseUrl, params, extent, size, projection); + }); +}; + + +/** + * @this {ol.source.Image} + * @param {ol.Extent} extent Extent. + * @param {ol.Size} size Size. + * @return {string|undefined} Image URL. + */ +ol.ImageUrlFunction.nullImageUrlFunction = + function(extent, size) { + return undefined; +}; diff --git a/float-no-zero/ol/ol/interaction/doubleclickzoom.exports b/float-no-zero/ol/ol/interaction/doubleclickzoom.exports new file mode 100644 index 0000000000..796868f1f1 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/doubleclickzoom.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.DoubleClickZoom diff --git a/float-no-zero/ol/ol/interaction/doubleclickzoominteraction.js b/float-no-zero/ol/ol/interaction/doubleclickzoominteraction.js new file mode 100644 index 0000000000..e5b019de33 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/doubleclickzoominteraction.js @@ -0,0 +1,61 @@ +// FIXME works for View2D only + +goog.provide('ol.interaction.DoubleClickZoom'); + +goog.require('goog.asserts'); +goog.require('ol.MapBrowserEvent'); +goog.require('ol.MapBrowserEvent.EventType'); +goog.require('ol.interaction.Interaction'); + + + +/** + * Allows the user to zoom by double-clicking on the map. + * + * @constructor + * @extends {ol.interaction.Interaction} + * @param {olx.interaction.DoubleClickZoomOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.DoubleClickZoom = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {number} + */ + this.delta_ = goog.isDef(options.delta) ? options.delta : 1; + + goog.base(this); + + /** + * @private + * @type {number} + */ + this.duration_ = goog.isDef(options.duration) ? options.duration : 250; + +}; +goog.inherits(ol.interaction.DoubleClickZoom, ol.interaction.Interaction); + + +/** + * @inheritDoc + */ +ol.interaction.DoubleClickZoom.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + var stopEvent = false; + var browserEvent = mapBrowserEvent.browserEvent; + if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DBLCLICK) { + var map = mapBrowserEvent.map; + var anchor = mapBrowserEvent.coordinate; + var delta = browserEvent.shiftKey ? -this.delta_ : this.delta_; + // FIXME works for View2D only + var view = map.getView().getView2D(); + ol.interaction.Interaction.zoomByDelta( + map, view, delta, anchor, this.duration_); + mapBrowserEvent.preventDefault(); + stopEvent = true; + } + return !stopEvent; +}; diff --git a/float-no-zero/ol/ol/interaction/draganddropinteraction.exports b/float-no-zero/ol/ol/interaction/draganddropinteraction.exports new file mode 100644 index 0000000000..50e9fef9e3 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/draganddropinteraction.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.DragAndDrop diff --git a/float-no-zero/ol/ol/interaction/draganddropinteraction.js b/float-no-zero/ol/ol/interaction/draganddropinteraction.js new file mode 100644 index 0000000000..7af957e4ee --- /dev/null +++ b/float-no-zero/ol/ol/interaction/draganddropinteraction.js @@ -0,0 +1,208 @@ +// FIXME should handle all geo-referenced data, not just vector data + +goog.provide('ol.interaction.DragAndDrop'); +goog.provide('ol.interaction.DragAndDropEvent'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.Event'); +goog.require('goog.events.FileDropHandler'); +goog.require('goog.events.FileDropHandler.EventType'); +goog.require('goog.fs.FileReader'); +goog.require('goog.functions'); +goog.require('ol.interaction.Interaction'); +goog.require('ol.proj'); + + + +/** + * @constructor + * @extends {ol.interaction.Interaction} + * @param {olx.interaction.DragAndDropOptions=} opt_options Options. + */ +ol.interaction.DragAndDrop = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + /** + * @private + * @type {Array.} + */ + this.formatConstructors_ = goog.isDef(options.formatConstructors) ? + options.formatConstructors : []; + + /** + * @private + * @type {ol.proj.Projection} + */ + this.reprojectTo_ = goog.isDef(options.reprojectTo) ? + ol.proj.get(options.reprojectTo) : null; + + /** + * @private + * @type {goog.events.FileDropHandler} + */ + this.fileDropHandler_ = null; + + /** + * @private + * @type {goog.events.Key|undefined} + */ + this.dropListenKey_ = undefined; + +}; +goog.inherits(ol.interaction.DragAndDrop, ol.interaction.Interaction); + + +/** + * @inheritDoc + */ +ol.interaction.DragAndDrop.prototype.disposeInternal = function() { + if (goog.isDef(this.dropListenKey_)) { + goog.events.unlistenByKey(this.dropListenKey_); + } + goog.base(this, 'disposeInternal'); +}; + + +/** + * @param {goog.events.BrowserEvent} event Event. + * @private + */ +ol.interaction.DragAndDrop.prototype.handleDrop_ = function(event) { + var files = event.getBrowserEvent().dataTransfer.files; + var i, ii; + for (i = 0, ii = files.length; i < ii; ++i) { + // The empty string param is a workaround for + // https://code.google.com/p/closure-library/issues/detail?id=524 + var reader = goog.fs.FileReader.readAsText(files[i], ''); + reader.addCallback(this.handleResult_, this); + } +}; + + +/** + * @param {string} result Result. + * @private + */ +ol.interaction.DragAndDrop.prototype.handleResult_ = function(result) { + var map = this.getMap(); + goog.asserts.assert(!goog.isNull(map)); + var projection = this.reprojectTo_; + if (goog.isNull(projection)) { + var view = map.getView(); + goog.asserts.assert(goog.isDef(view)); + projection = view.getView2D().getProjection(); + goog.asserts.assert(goog.isDef(projection)); + } + var formatConstructors = this.formatConstructors_; + var features = []; + var i, ii; + for (i = 0, ii = formatConstructors.length; i < ii; ++i) { + var formatConstructor = formatConstructors[i]; + var format = new formatConstructor(); + var readFeatures = this.tryReadFeatures_(format, result); + if (!goog.isNull(readFeatures)) { + var featureProjection = format.readProjection(result); + var transform = ol.proj.getTransform(featureProjection, projection); + var j, jj; + for (j = 0, jj = readFeatures.length; j < jj; ++j) { + var feature = readFeatures[j]; + var geometry = feature.getGeometry(); + if (!goog.isNull(geometry)) { + geometry.transform(transform); + } + features.push(feature); + } + } + } + this.dispatchEvent( + new ol.interaction.DragAndDropEvent( + ol.interaction.DragAndDropEventType.ADD_FEATURES, this, features, + projection)); +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragAndDrop.prototype.handleMapBrowserEvent = + goog.functions.TRUE; + + +/** + * @inheritDoc + */ +ol.interaction.DragAndDrop.prototype.setMap = function(map) { + if (goog.isDef(this.dropListenKey_)) { + goog.events.unlistenByKey(this.dropListenKey_); + this.dropListenKey_ = undefined; + } + if (!goog.isNull(this.fileDropHandler_)) { + goog.dispose(this.fileDropHandler_); + this.fileDropHandler_ = null; + } + goog.asserts.assert(!goog.isDef(this.dropListenKey_)); + goog.base(this, 'setMap', map); + if (!goog.isNull(map)) { + this.fileDropHandler_ = new goog.events.FileDropHandler(map.getViewport()); + this.dropListenKey_ = goog.events.listen( + this.fileDropHandler_, goog.events.FileDropHandler.EventType.DROP, + this.handleDrop_, false, this); + } +}; + + +/** + * @param {ol.format.Feature} format Format. + * @param {string} text Text. + * @private + * @return {Array.} Features. + */ +ol.interaction.DragAndDrop.prototype.tryReadFeatures_ = function(format, text) { + try { + return format.readFeatures(text); + } catch (e) { + return null; + } +}; + + +/** + * @enum {string} + */ +ol.interaction.DragAndDropEventType = { + ADD_FEATURES: 'addfeatures' +}; + + + +/** + * @constructor + * @extends {goog.events.Event} + * @implements {oli.interaction.DragAndDropEvent} + * @param {ol.interaction.DragAndDropEventType} type Type. + * @param {Object=} opt_target Target. + * @param {Array.=} opt_features Features. + * @param {ol.proj.Projection=} opt_projection Projection. + */ +ol.interaction.DragAndDropEvent = + function(type, opt_target, opt_features, opt_projection) { + + goog.base(this, type, opt_target); + + /** + * @type {Array.|undefined} + */ + this.features = opt_features; + + /** + * @type {ol.proj.Projection|undefined} + */ + this.projection = opt_projection; + +}; +goog.inherits(ol.interaction.DragAndDropEvent, goog.events.Event); diff --git a/float-no-zero/ol/ol/interaction/dragboxinteraction.exports b/float-no-zero/ol/ol/interaction/dragboxinteraction.exports new file mode 100644 index 0000000000..7b578e067a --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragboxinteraction.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.interaction.DragBox +@exportProperty ol.interaction.DragBox.prototype.getGeometry diff --git a/float-no-zero/ol/ol/interaction/dragboxinteraction.js b/float-no-zero/ol/ol/interaction/dragboxinteraction.js new file mode 100644 index 0000000000..f12f1c2f7c --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragboxinteraction.js @@ -0,0 +1,160 @@ +// FIXME draw drag box +// FIXME works for View2D only + +goog.provide('ol.DragBoxEvent'); +goog.provide('ol.interaction.DragBox'); + +goog.require('goog.asserts'); +goog.require('goog.events.Event'); +goog.require('ol.events.ConditionType'); +goog.require('ol.events.condition'); +goog.require('ol.interaction.Drag'); +goog.require('ol.render.Box'); + + +/** + * @define {number} Hysterisis pixels. + */ +ol.DRAG_BOX_HYSTERESIS_PIXELS = 8; + + +/** + * @const + * @type {number} + */ +ol.DRAG_BOX_HYSTERESIS_PIXELS_SQUARED = + ol.DRAG_BOX_HYSTERESIS_PIXELS * + ol.DRAG_BOX_HYSTERESIS_PIXELS; + + +/** + * @enum {string} + */ +ol.DragBoxEventType = { + BOXSTART: 'boxstart', + BOXEND: 'boxend' +}; + + + +/** + * Object representing a dragbox event. + * + * @param {string} type The event type. + * @param {ol.Coordinate} coordinate The event coordinate. + * @extends {goog.events.Event} + * @constructor + * @implements {oli.DragBoxEvent} + */ +ol.DragBoxEvent = function(type, coordinate) { + goog.base(this, type); + + /** + * The coordinate of the drag event. + * @const + * @type {ol.Coordinate} + */ + this.coordinate = coordinate; + +}; +goog.inherits(ol.DragBoxEvent, goog.events.Event); + + + +/** + * @constructor + * @extends {ol.interaction.Drag} + * @param {olx.interaction.DragBoxOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.DragBox = function(opt_options) { + + goog.base(this); + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.style.Style} + */ + var style = goog.isDef(options.style) ? options.style : null; + + /** + * @type {ol.render.Box} + * @private + */ + this.box_ = new ol.render.Box(style); + + /** + * @type {ol.Pixel} + * @private + */ + this.startPixel_ = null; + + /** + * @private + * @type {ol.events.ConditionType} + */ + this.condition_ = goog.isDef(options.condition) ? + options.condition : ol.events.condition.always; + +}; +goog.inherits(ol.interaction.DragBox, ol.interaction.Drag); + + +/** + * @inheritDoc + */ +ol.interaction.DragBox.prototype.handleDrag = function(mapBrowserEvent) { + this.box_.setPixels(this.startPixel_, mapBrowserEvent.pixel); +}; + + +/** + * Returns geometry of last drawn box. + * @return {ol.geom.Geometry} Geometry. + */ +ol.interaction.DragBox.prototype.getGeometry = function() { + return this.box_.getGeometry(); +}; + + +/** + * To be overriden by child classes. + * @protected + */ +ol.interaction.DragBox.prototype.onBoxEnd = goog.nullFunction; + + +/** + * @inheritDoc + */ +ol.interaction.DragBox.prototype.handleDragEnd = + function(mapBrowserEvent) { + this.box_.setMap(null); + if (this.deltaX * this.deltaX + this.deltaY * this.deltaY >= + ol.DRAG_BOX_HYSTERESIS_PIXELS_SQUARED) { + this.onBoxEnd(mapBrowserEvent); + this.dispatchEvent(new ol.DragBoxEvent(ol.DragBoxEventType.BOXEND, + mapBrowserEvent.coordinate)); + } +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragBox.prototype.handleDragStart = + function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + if (browserEvent.isMouseActionButton() && this.condition_(mapBrowserEvent)) { + this.startPixel_ = mapBrowserEvent.pixel; + this.box_.setMap(mapBrowserEvent.map); + this.box_.setPixels(this.startPixel_, this.startPixel_); + this.dispatchEvent(new ol.DragBoxEvent(ol.DragBoxEventType.BOXSTART, + mapBrowserEvent.coordinate)); + return true; + } else { + return false; + } +}; diff --git a/float-no-zero/ol/ol/interaction/draginteraction.js b/float-no-zero/ol/ol/interaction/draginteraction.js new file mode 100644 index 0000000000..1ed4480374 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/draginteraction.js @@ -0,0 +1,145 @@ +goog.provide('ol.interaction.Drag'); + +goog.require('goog.asserts'); +goog.require('goog.events.BrowserEvent'); +goog.require('goog.functions'); +goog.require('ol.Coordinate'); +goog.require('ol.MapBrowserEvent'); +goog.require('ol.MapBrowserEvent.EventType'); +goog.require('ol.interaction.Interaction'); + + + +/** + * Base class for interactions that drag the map. + * @constructor + * @extends {ol.interaction.Interaction} + */ +ol.interaction.Drag = function() { + + goog.base(this); + + /** + * @private + * @type {boolean} + */ + this.dragging_ = false; + + /** + * @type {number} + */ + this.startX = 0; + + /** + * @type {number} + */ + this.startY = 0; + + /** + * @type {number} + */ + this.deltaX = 0; + + /** + * @type {number} + */ + this.deltaY = 0; + + /** + * @type {ol.Coordinate} + */ + this.startCenter = null; + + /** + * @type {ol.Coordinate} + */ + this.startCoordinate = null; + +}; +goog.inherits(ol.interaction.Drag, ol.interaction.Interaction); + + +/** + * @return {boolean} Whether we're dragging. + */ +ol.interaction.Drag.prototype.getDragging = function() { + return this.dragging_; +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @protected + */ +ol.interaction.Drag.prototype.handleDrag = goog.nullFunction; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @protected + */ +ol.interaction.Drag.prototype.handleDragEnd = goog.nullFunction; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @protected + * @return {boolean} Capture dragging. + */ +ol.interaction.Drag.prototype.handleDragStart = goog.functions.FALSE; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @protected + */ +ol.interaction.Drag.prototype.handleDown = goog.nullFunction; + + +/** + * @inheritDoc + */ +ol.interaction.Drag.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + if (!map.isDef()) { + return true; + } + var stopEvent = false; + var view = map.getView(); + var browserEvent = mapBrowserEvent.browserEvent; + if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DOWN) { + goog.asserts.assertInstanceof(browserEvent, goog.events.BrowserEvent); + this.handleDown(mapBrowserEvent); + } + if (this.dragging_) { + if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DRAG) { + goog.asserts.assertInstanceof(browserEvent, goog.events.BrowserEvent); + this.deltaX = browserEvent.clientX - this.startX; + this.deltaY = browserEvent.clientY - this.startY; + this.handleDrag(mapBrowserEvent); + } else if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DRAGEND) { + goog.asserts.assertInstanceof(browserEvent, goog.events.BrowserEvent); + this.deltaX = browserEvent.clientX - this.startX; + this.deltaY = browserEvent.clientY - this.startY; + this.dragging_ = false; + this.handleDragEnd(mapBrowserEvent); + } + } else if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DRAGSTART) { + goog.asserts.assertInstanceof(browserEvent, goog.events.BrowserEvent); + var view2DState = view.getView2D().getView2DState(); + this.startX = browserEvent.clientX; + this.startY = browserEvent.clientY; + this.deltaX = 0; + this.deltaY = 0; + this.startCenter = view2DState.center; + this.startCoordinate = mapBrowserEvent.coordinate; + var handled = this.handleDragStart(mapBrowserEvent); + if (handled) { + this.dragging_ = true; + mapBrowserEvent.preventDefault(); + stopEvent = true; + } + } + return !stopEvent; +}; diff --git a/float-no-zero/ol/ol/interaction/dragpan.exports b/float-no-zero/ol/ol/interaction/dragpan.exports new file mode 100644 index 0000000000..dbc71bf21a --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragpan.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.DragPan diff --git a/float-no-zero/ol/ol/interaction/dragpaninteraction.js b/float-no-zero/ol/ol/interaction/dragpaninteraction.js new file mode 100644 index 0000000000..27c9521d6a --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragpaninteraction.js @@ -0,0 +1,146 @@ +// FIXME works for View2D only + +goog.provide('ol.interaction.DragPan'); + +goog.require('goog.asserts'); +goog.require('ol.Kinetic'); +goog.require('ol.PreRenderFunction'); +goog.require('ol.View2D'); +goog.require('ol.ViewHint'); +goog.require('ol.coordinate'); +goog.require('ol.events.ConditionType'); +goog.require('ol.events.condition'); +goog.require('ol.interaction.Drag'); + + + +/** + * Allows the user to pan the map by clickng and dragging. + * @constructor + * @extends {ol.interaction.Drag} + * @param {olx.interaction.DragPanOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.DragPan = function(opt_options) { + + goog.base(this); + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.events.ConditionType} + */ + this.condition_ = goog.isDef(options.condition) ? + options.condition : ol.events.condition.noModifierKeys; + + /** + * @private + * @type {ol.Kinetic|undefined} + */ + this.kinetic_ = options.kinetic; + + /** + * @private + * @type {?ol.PreRenderFunction} + */ + this.kineticPreRenderFn_ = null; + +}; +goog.inherits(ol.interaction.DragPan, ol.interaction.Drag); + + +/** + * @inheritDoc + */ +ol.interaction.DragPan.prototype.handleDrag = function(mapBrowserEvent) { + if (this.kinetic_) { + this.kinetic_.update( + mapBrowserEvent.browserEvent.clientX, + mapBrowserEvent.browserEvent.clientY); + } + var map = mapBrowserEvent.map; + // FIXME works for View2D only + var view = map.getView(); + goog.asserts.assertInstanceof(view, ol.View2D); + var view2DState = view.getView2DState(); + var newCenter = [ + -view2DState.resolution * this.deltaX, + view2DState.resolution * this.deltaY + ]; + ol.coordinate.rotate(newCenter, view2DState.rotation); + ol.coordinate.add(newCenter, this.startCenter); + newCenter = view.constrainCenter(newCenter); + map.render(); + view.setCenter(newCenter); +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragPan.prototype.handleDragEnd = function(mapBrowserEvent) { + + // FIXME works for View2D only + + var map = mapBrowserEvent.map; + var view = map.getView(); + view.setHint(ol.ViewHint.INTERACTING, -1); + + if (this.kinetic_ && this.kinetic_.end()) { + var view2D = view.getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + var view2DState = view2D.getView2DState(); + var distance = this.kinetic_.getDistance(); + var angle = this.kinetic_.getAngle(); + this.kineticPreRenderFn_ = this.kinetic_.pan(view2DState.center); + map.beforeRender(this.kineticPreRenderFn_); + + var centerpx = map.getPixelFromCoordinate(view2DState.center); + var dest = map.getCoordinateFromPixel([ + centerpx[0] - distance * Math.cos(angle), + centerpx[1] - distance * Math.sin(angle) + ]); + dest = view2D.constrainCenter(dest); + view2D.setCenter(dest); + } + map.render(); +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + if (browserEvent.isMouseActionButton() && this.condition_(mapBrowserEvent)) { + if (this.kinetic_) { + this.kinetic_.begin(); + this.kinetic_.update(browserEvent.clientX, browserEvent.clientY); + } + var map = mapBrowserEvent.map; + map.getView().setHint(ol.ViewHint.INTERACTING, 1); + map.render(); + return true; + } else { + return false; + } +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragPan.prototype.handleDown = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + // FIXME works for View2D only + var view = map.getView(); + goog.asserts.assertInstanceof(view, ol.View2D); + goog.asserts.assert(!goog.isNull(mapBrowserEvent.frameState)); + if (!goog.isNull(this.kineticPreRenderFn_) && + map.removePreRenderFunction(this.kineticPreRenderFn_)) { + map.render(); + view.setCenter(mapBrowserEvent.frameState.view2DState.center); + this.kineticPreRenderFn_ = null; + } +}; diff --git a/float-no-zero/ol/ol/interaction/dragrotate.exports b/float-no-zero/ol/ol/interaction/dragrotate.exports new file mode 100644 index 0000000000..b17241c644 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragrotate.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.DragRotate diff --git a/float-no-zero/ol/ol/interaction/dragrotateandzoom.exports b/float-no-zero/ol/ol/interaction/dragrotateandzoom.exports new file mode 100644 index 0000000000..f39bc1cf2a --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragrotateandzoom.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.DragRotateAndZoom diff --git a/float-no-zero/ol/ol/interaction/dragrotateandzoominteraction.js b/float-no-zero/ol/ol/interaction/dragrotateandzoominteraction.js new file mode 100644 index 0000000000..0d5f095365 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragrotateandzoominteraction.js @@ -0,0 +1,135 @@ +// FIXME works for View2D only + +goog.provide('ol.interaction.DragRotateAndZoom'); + +goog.require('goog.asserts'); +goog.require('goog.math.Vec2'); +goog.require('ol.ViewHint'); +goog.require('ol.events.ConditionType'); +goog.require('ol.events.condition'); +goog.require('ol.interaction.Drag'); +goog.require('ol.interaction.Interaction'); + + +/** + * @define {number} Animation duration. + */ +ol.interaction.DRAGROTATEANDZOOM_ANIMATION_DURATION = 400; + + + +/** + * Allows the user to zoom and rotate the map by clicking and dragging + * on the map. By default, this interaction is limited to when the shift + * key is held down. + * + * This interaction is not included in the default interactions. + * @constructor + * @extends {ol.interaction.Drag} + * @param {olx.interaction.DragRotateAndZoomOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.DragRotateAndZoom = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + /** + * @private + * @type {ol.events.ConditionType} + */ + this.condition_ = goog.isDef(options.condition) ? + options.condition : ol.events.condition.shiftKeyOnly; + + /** + * @private + * @type {number|undefined} + */ + this.lastAngle_ = undefined; + + /** + * @private + * @type {number|undefined} + */ + this.lastMagnitude_ = undefined; + + /** + * @private + * @type {number} + */ + this.lastScaleDelta_ = 0; + +}; +goog.inherits(ol.interaction.DragRotateAndZoom, ol.interaction.Drag); + + +/** + * @inheritDoc + */ +ol.interaction.DragRotateAndZoom.prototype.handleDrag = + function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var size = map.getSize(); + var offset = mapBrowserEvent.pixel; + var delta = new goog.math.Vec2( + offset[0] - size[0] / 2, + size[1] / 2 - offset[1]); + var theta = Math.atan2(delta.y, delta.x); + var magnitude = delta.magnitude(); + // FIXME works for View2D only + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + map.render(); + if (goog.isDef(this.lastAngle_)) { + var angleDelta = theta - this.lastAngle_; + ol.interaction.Interaction.rotateWithoutConstraints( + map, view, view2DState.rotation - angleDelta); + } + this.lastAngle_ = theta; + if (goog.isDef(this.lastMagnitude_)) { + var resolution = this.lastMagnitude_ * (view2DState.resolution / magnitude); + ol.interaction.Interaction.zoomWithoutConstraints(map, view, resolution); + } + if (goog.isDef(this.lastMagnitude_)) { + this.lastScaleDelta_ = this.lastMagnitude_ / magnitude; + } + this.lastMagnitude_ = magnitude; +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragRotateAndZoom.prototype.handleDragEnd = + function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + // FIXME works for View2D only + var view = map.getView(); + view.setHint(ol.ViewHint.INTERACTING, -1); + var view2D = view.getView2D(); + var view2DState = view2D.getView2DState(); + var direction = this.lastScaleDelta_ - 1; + ol.interaction.Interaction.rotate(map, view2D, view2DState.rotation); + ol.interaction.Interaction.zoom(map, view2D, view2DState.resolution, + undefined, ol.interaction.DRAGROTATEANDZOOM_ANIMATION_DURATION, + direction); + this.lastScaleDelta_ = 0; + return true; +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragRotateAndZoom.prototype.handleDragStart = + function(mapBrowserEvent) { + if (this.condition_(mapBrowserEvent)) { + mapBrowserEvent.map.getView().setHint(ol.ViewHint.INTERACTING, 1); + this.lastAngle_ = undefined; + this.lastMagnitude_ = undefined; + return true; + } else { + return false; + } +}; diff --git a/float-no-zero/ol/ol/interaction/dragrotateinteraction.js b/float-no-zero/ol/ol/interaction/dragrotateinteraction.js new file mode 100644 index 0000000000..e82c72a2ce --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragrotateinteraction.js @@ -0,0 +1,101 @@ +goog.provide('ol.interaction.DragRotate'); + +goog.require('goog.asserts'); +goog.require('ol.ViewHint'); +goog.require('ol.events.ConditionType'); +goog.require('ol.events.condition'); +goog.require('ol.interaction.Drag'); +goog.require('ol.interaction.Interaction'); + + +/** + * @define {number} Animation duration. + */ +ol.interaction.DRAGROTATE_ANIMATION_DURATION = 250; + + + +/** + * Allows the user to rotate the map by clicking and dragging on the map, + * normally combined with an {@link ol.events.condition} that limits + * it to when the alt and shift keys are held down. + * @constructor + * @extends {ol.interaction.Drag} + * @param {olx.interaction.DragRotateOptions=} opt_options Options. + */ +ol.interaction.DragRotate = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + /** + * @private + * @type {ol.events.ConditionType} + */ + this.condition_ = goog.isDef(options.condition) ? + options.condition : ol.events.condition.altShiftKeysOnly; + + /** + * @private + * @type {number|undefined} + */ + this.lastAngle_ = undefined; + +}; +goog.inherits(ol.interaction.DragRotate, ol.interaction.Drag); + + +/** + * @inheritDoc + */ +ol.interaction.DragRotate.prototype.handleDrag = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var size = map.getSize(); + var offset = mapBrowserEvent.pixel; + var theta = + Math.atan2(size[1] / 2 - offset[1], offset[0] - size[0] / 2); + if (goog.isDef(this.lastAngle_)) { + var delta = theta - this.lastAngle_; + // FIXME works for View2D only + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + map.render(); + ol.interaction.Interaction.rotateWithoutConstraints( + map, view, view2DState.rotation - delta); + } + this.lastAngle_ = theta; +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragRotate.prototype.handleDragEnd = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + // FIXME works for View2D only + var view = map.getView(); + view.setHint(ol.ViewHint.INTERACTING, -1); + var view2D = view.getView2D(); + var view2DState = view2D.getView2DState(); + ol.interaction.Interaction.rotate(map, view2D, view2DState.rotation, + undefined, ol.interaction.DRAGROTATE_ANIMATION_DURATION); +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragRotate.prototype.handleDragStart = + function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + if (browserEvent.isMouseActionButton() && this.condition_(mapBrowserEvent)) { + var map = mapBrowserEvent.map; + map.getView().setHint(ol.ViewHint.INTERACTING, 1); + map.render(); + this.lastAngle_ = undefined; + return true; + } else { + return false; + } +}; diff --git a/float-no-zero/ol/ol/interaction/dragzoominteraction.exports b/float-no-zero/ol/ol/interaction/dragzoominteraction.exports new file mode 100644 index 0000000000..204afabe7e --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragzoominteraction.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.DragZoom diff --git a/float-no-zero/ol/ol/interaction/dragzoominteraction.js b/float-no-zero/ol/ol/interaction/dragzoominteraction.js new file mode 100644 index 0000000000..3955158a15 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/dragzoominteraction.js @@ -0,0 +1,66 @@ +goog.provide('ol.interaction.DragZoom'); + +goog.require('goog.asserts'); +goog.require('ol.events.condition'); +goog.require('ol.extent'); +goog.require('ol.interaction.DragBox'); +goog.require('ol.interaction.Interaction'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); + + +/** + * @define {number} Animation duration. + */ +ol.interaction.DRAGZOOM_ANIMATION_DURATION = 200; + + + +/** + * Allows the user to zoom the map by clicking and dragging on the map, + * normally combined with an {@link ol.events.condition} that limits + * it to when the shift key is held down. + * @constructor + * @extends {ol.interaction.DragBox} + * @param {olx.interaction.DragZoomOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.DragZoom = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + + var condition = goog.isDef(options.condition) ? + options.condition : ol.events.condition.shiftKeyOnly; + + /** + * @private + * @type {ol.style.Style} + */ + var style = goog.isDef(options.style) ? + options.style : new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [0, 0, 255, 1] + }) + }); + + goog.base(this, { + condition: condition, + style: style + }); + +}; +goog.inherits(ol.interaction.DragZoom, ol.interaction.DragBox); + + +/** + * @inheritDoc + */ +ol.interaction.DragZoom.prototype.onBoxEnd = function() { + // FIXME works for View2D only + var map = this.getMap(); + var view = map.getView().getView2D(); + var extent = this.getGeometry().getExtent(); + var center = ol.extent.getCenter(extent); + ol.interaction.Interaction.zoom(map, view, + view.getResolutionForExtent(extent, map.getSize()), + center, ol.interaction.DRAGZOOM_ANIMATION_DURATION); +}; diff --git a/float-no-zero/ol/ol/interaction/drawinteraction.exports b/float-no-zero/ol/ol/interaction/drawinteraction.exports new file mode 100644 index 0000000000..890ae0f515 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/drawinteraction.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.Draw diff --git a/float-no-zero/ol/ol/interaction/drawinteraction.js b/float-no-zero/ol/ol/interaction/drawinteraction.js new file mode 100644 index 0000000000..5c972ac8ae --- /dev/null +++ b/float-no-zero/ol/ol/interaction/drawinteraction.js @@ -0,0 +1,570 @@ +goog.provide('ol.DrawEvent'); +goog.provide('ol.interaction.Draw'); + +goog.require('goog.asserts'); +goog.require('goog.events.Event'); +goog.require('ol.Collection'); +goog.require('ol.Coordinate'); +goog.require('ol.Feature'); +goog.require('ol.FeatureOverlay'); +goog.require('ol.Map'); +goog.require('ol.MapBrowserEvent'); +goog.require('ol.MapBrowserEvent.EventType'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.MultiPoint'); +goog.require('ol.geom.MultiPolygon'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.Polygon'); +goog.require('ol.interaction.Interaction'); +goog.require('ol.source.Vector'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); + + +/** + * @enum {string} + */ +ol.DrawEventType = { + DRAWSTART: 'drawstart', + DRAWEND: 'drawend' +}; + + + +/** + * @constructor + * @extends {goog.events.Event} + * @implements {oli.DrawEvent} + * @param {ol.DrawEventType} type Type. + * @param {ol.Feature} feature The feature drawn. + */ +ol.DrawEvent = function(type, feature) { + + goog.base(this, type); + + /** + * @type {ol.Feature} + */ + this.feature = feature; + +}; +goog.inherits(ol.DrawEvent, goog.events.Event); + + + +/** + * Interaction that allows drawing geometries + * @constructor + * @extends {ol.interaction.Interaction} + * @param {olx.interaction.DrawOptions} options Options. + * @todo stability experimental + */ +ol.interaction.Draw = function(options) { + + goog.base(this); + + /** + * Target source for drawn features. + * @type {ol.source.Vector} + * @private + */ + this.source_ = goog.isDef(options.source) ? options.source : null; + + /** + * Target collection for drawn features. + * @type {ol.Collection} + * @private + */ + this.features_ = goog.isDef(options.features) ? options.features : null; + + /** + * Pixel distance for snapping. + * @type {number} + * @private + */ + this.snapTolerance_ = goog.isDef(options.snapTolerance) ? + options.snapTolerance : 12; + + /** + * The number of points that must be drawn before a polygon ring can be + * finished. The default is 3. + * @type {number} + * @private + */ + this.minPointsPerRing_ = goog.isDef(options.minPointsPerRing) ? + options.minPointsPerRing : 3; + + /** + * Geometry type. + * @type {ol.geom.GeometryType} + * @private + */ + this.type_ = options.type; + + /** + * Drawing mode (derived from geometry type. + * @type {ol.interaction.DrawMode} + * @private + */ + this.mode_ = ol.interaction.Draw.getMode_(this.type_); + + /** + * Finish coordinate for the feature (first point for polygons, last point for + * linestrings). + * @type {ol.Coordinate} + * @private + */ + this.finishCoordinate_ = null; + + /** + * Sketch feature. + * @type {ol.Feature} + * @private + */ + this.sketchFeature_ = null; + + /** + * Sketch point. + * @type {ol.Feature} + * @private + */ + this.sketchPoint_ = null; + + /** + * Sketch line. Used when drawing polygon. + * @type {ol.Feature} + * @private + */ + this.sketchLine_ = null; + + /** + * Sketch polygon. Used when drawing polygon. + * @type {ol.geom.RawPolygon} + * @private + */ + this.sketchRawPolygon_ = null; + + /** + * Squared tolerance for handling click events. If the squared distance + * between a down and click event is greater than this tolerance, click events + * will not be handled. + * @type {number} + * @private + */ + this.squaredClickTolerance_ = 4; + + /** + * Draw overlay where are sketch features are drawn. + * @type {ol.FeatureOverlay} + * @private + */ + this.overlay_ = new ol.FeatureOverlay({ + style: goog.isDef(options.style) ? + options.style : ol.interaction.Draw.getDefaultStyleFunction() + }); + +}; +goog.inherits(ol.interaction.Draw, ol.interaction.Interaction); + + +/** + * @return {ol.feature.StyleFunction} Styles. + */ +ol.interaction.Draw.getDefaultStyleFunction = function() { + /** @type {Object.>} */ + var styles = {}; + styles[ol.geom.GeometryType.POLYGON] = [ + new ol.style.Style({ + fill: new ol.style.Fill({ + color: [255, 255, 255, 0.5] + }) + }) + ]; + styles[ol.geom.GeometryType.MULTI_POLYGON] = + styles[ol.geom.GeometryType.POLYGON]; + + styles[ol.geom.GeometryType.LINE_STRING] = [ + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [255, 255, 255, 1], + width: 5 + }) + }), + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [0, 153, 255, 1], + width: 3 + }) + }) + ]; + styles[ol.geom.GeometryType.MULTI_LINE_STRING] = + styles[ol.geom.GeometryType.LINE_STRING]; + + styles[ol.geom.GeometryType.POINT] = [ + new ol.style.Style({ + image: new ol.style.Circle({ + radius: 7, + fill: new ol.style.Fill({ + color: [0, 153, 255, 1] + }), + stroke: new ol.style.Stroke({ + color: [255, 255, 255, 0.75], + width: 1.5 + }) + }), + zIndex: 100000 + }) + ]; + styles[ol.geom.GeometryType.MULTI_POINT] = + styles[ol.geom.GeometryType.POINT]; + + return function(feature, resolution) { + return styles[feature.getGeometry().getType()]; + }; +}; + + +/** + * @inheritDoc + */ +ol.interaction.Draw.prototype.setMap = function(map) { + if (goog.isNull(map)) { + // removing from a map, clean up + this.abortDrawing_(); + } + this.overlay_.setMap(map); + goog.base(this, 'setMap', map); +}; + + +/** + * @inheritDoc + */ +ol.interaction.Draw.prototype.handleMapBrowserEvent = function(event) { + var map = event.map; + if (!map.isDef()) { + return true; + } + var pass = true; + if (event.type === ol.MapBrowserEvent.EventType.CLICK) { + pass = this.handleClick_(event); + } else if (event.type === ol.MapBrowserEvent.EventType.MOUSEMOVE) { + pass = this.handleMove_(event); + } else if (event.type === ol.MapBrowserEvent.EventType.DBLCLICK) { + pass = false; + } + return pass; +}; + + +/** + * Handle click events. + * @param {ol.MapBrowserEvent} event A click event. + * @return {boolean} Pass the event to other interactions. + * @private + */ +ol.interaction.Draw.prototype.handleClick_ = function(event) { + var downPx = event.map.getEventPixel(event.target.getDown()); + var clickPx = event.pixel; + var dx = downPx[0] - clickPx[0]; + var dy = downPx[1] - clickPx[1]; + var squaredDistance = dx * dx + dy * dy; + var pass = true; + if (squaredDistance <= this.squaredClickTolerance_) { + if (goog.isNull(this.finishCoordinate_)) { + this.startDrawing_(event); + } else if (this.mode_ === ol.interaction.DrawMode.POINT || + this.atFinish_(event)) { + this.finishDrawing_(event); + } else { + this.addToDrawing_(event); + } + pass = false; + } + return pass; +}; + + +/** + * Handle mousemove events. + * @param {ol.MapBrowserEvent} event A mousemove event. + * @return {boolean} Pass the event to other interactions. + * @private + */ +ol.interaction.Draw.prototype.handleMove_ = function(event) { + if (this.mode_ === ol.interaction.DrawMode.POINT && + goog.isNull(this.finishCoordinate_)) { + this.startDrawing_(event); + } else if (!goog.isNull(this.finishCoordinate_)) { + this.modifyDrawing_(event); + } + return true; +}; + + +/** + * Determine if an event is within the snapping tolerance of the start coord. + * @param {ol.MapBrowserEvent} event Event. + * @return {boolean} The event is within the snapping tolerance of the start. + * @private + */ +ol.interaction.Draw.prototype.atFinish_ = function(event) { + var at = false; + if (!goog.isNull(this.sketchFeature_)) { + var geometry = this.sketchFeature_.getGeometry(); + var potentiallyDone = false; + var potentiallyFinishCoordinates = [this.finishCoordinate_]; + if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + potentiallyDone = geometry.getCoordinates().length > 2; + } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + potentiallyDone = geometry.getCoordinates()[0].length > + this.minPointsPerRing_; + potentiallyFinishCoordinates = [this.sketchRawPolygon_[0][0], + this.sketchRawPolygon_[0][this.sketchRawPolygon_[0].length - 2]]; + } + if (potentiallyDone) { + var map = event.map; + for (var i = 0, ii = potentiallyFinishCoordinates.length; i < ii; i++) { + var finishCoordinate = potentiallyFinishCoordinates[i]; + var finishPixel = map.getPixelFromCoordinate(finishCoordinate); + var pixel = event.pixel; + var dx = pixel[0] - finishPixel[0]; + var dy = pixel[1] - finishPixel[1]; + at = Math.sqrt(dx * dx + dy * dy) <= this.snapTolerance_; + if (at) { + this.finishCoordinate_ = finishCoordinate; + break; + } + } + } + } + return at; +}; + + +/** + * Start the drawing. + * @param {ol.MapBrowserEvent} event Event. + * @private + */ +ol.interaction.Draw.prototype.startDrawing_ = function(event) { + var start = event.coordinate; + this.finishCoordinate_ = start; + var geometry; + if (this.mode_ === ol.interaction.DrawMode.POINT) { + geometry = new ol.geom.Point(start.slice()); + } else { + this.sketchPoint_ = new ol.Feature(new ol.geom.Point(start.slice())); + + if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + geometry = new ol.geom.LineString([start.slice(), start.slice()]); + } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { + this.sketchLine_ = new ol.Feature(new ol.geom.LineString([start.slice(), + start.slice()])); + this.sketchRawPolygon_ = [[start.slice(), start.slice()]]; + geometry = new ol.geom.Polygon(this.sketchRawPolygon_); + } + } + goog.asserts.assert(goog.isDef(geometry)); + this.sketchFeature_ = new ol.Feature(geometry); + this.updateSketchFeatures_(); + this.dispatchEvent(new ol.DrawEvent(ol.DrawEventType.DRAWSTART, + this.sketchFeature_)); +}; + + +/** + * Modify the drawing. + * @param {ol.MapBrowserEvent} event Event. + * @private + */ +ol.interaction.Draw.prototype.modifyDrawing_ = function(event) { + var coordinate = event.coordinate; + var geometry = this.sketchFeature_.getGeometry(); + var coordinates, last; + if (this.mode_ === ol.interaction.DrawMode.POINT) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + last = geometry.getCoordinates(); + last[0] = coordinate[0]; + last[1] = coordinate[1]; + geometry.setCoordinates(last); + } else { + if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + coordinates = geometry.getCoordinates(); + } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + coordinates = this.sketchRawPolygon_[0]; + } + if (this.atFinish_(event)) { + // snap to finish + coordinate = this.finishCoordinate_.slice(); + } + var sketchPointGeom = this.sketchPoint_.getGeometry(); + goog.asserts.assertInstanceof(sketchPointGeom, ol.geom.Point); + sketchPointGeom.setCoordinates(coordinate); + last = coordinates[coordinates.length - 1]; + last[0] = coordinate[0]; + last[1] = coordinate[1]; + if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + geometry.setCoordinates(coordinates); + } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { + var sketchLineGeom = this.sketchLine_.getGeometry(); + goog.asserts.assertInstanceof(sketchLineGeom, ol.geom.LineString); + sketchLineGeom.setCoordinates(coordinates); + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + geometry.setCoordinates(this.sketchRawPolygon_); + } + } + this.updateSketchFeatures_(); +}; + + +/** + * Add a new coordinate to the drawing. + * @param {ol.MapBrowserEvent} event Event. + * @private + */ +ol.interaction.Draw.prototype.addToDrawing_ = function(event) { + var coordinate = event.coordinate; + var geometry = this.sketchFeature_.getGeometry(); + var coordinates, last; + if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + this.finishCoordinate_ = coordinate.slice(); + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + coordinates = geometry.getCoordinates(); + coordinates.push(coordinate.slice()); + geometry.setCoordinates(coordinates); + } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { + this.sketchRawPolygon_[0].push(coordinate.slice()); + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + geometry.setCoordinates(this.sketchRawPolygon_); + } + this.updateSketchFeatures_(); +}; + + +/** + * Stop drawing and add the sketch feature to the target layer. + * @param {ol.MapBrowserEvent} event Event. + * @private + */ +ol.interaction.Draw.prototype.finishDrawing_ = function(event) { + var sketchFeature = this.abortDrawing_(); + goog.asserts.assert(!goog.isNull(sketchFeature)); + var coordinates; + var geometry = sketchFeature.getGeometry(); + if (this.mode_ === ol.interaction.DrawMode.POINT) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + coordinates = geometry.getCoordinates(); + } else if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + coordinates = geometry.getCoordinates(); + // remove the redundant last point + coordinates.pop(); + geometry.setCoordinates(coordinates); + } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + // When we finish drawing a polygon on the last point, + // the last coordinate is duplicated as for LineString + // we force the replacement by the first point + this.sketchRawPolygon_[0].pop(); + this.sketchRawPolygon_[0].push(this.sketchRawPolygon_[0][0]); + geometry.setCoordinates(this.sketchRawPolygon_); + coordinates = geometry.getCoordinates(); + } + + // cast multi-part geometries + if (this.type_ === ol.geom.GeometryType.MULTI_POINT) { + sketchFeature.setGeometry(new ol.geom.MultiPoint([coordinates])); + } else if (this.type_ === ol.geom.GeometryType.MULTI_LINE_STRING) { + sketchFeature.setGeometry(new ol.geom.MultiLineString([coordinates])); + } else if (this.type_ === ol.geom.GeometryType.MULTI_POLYGON) { + sketchFeature.setGeometry(new ol.geom.MultiPolygon([coordinates])); + } + + if (!goog.isNull(this.features_)) { + this.features_.push(sketchFeature); + } + if (!goog.isNull(this.source_)) { + this.source_.addFeature(sketchFeature); + } + this.dispatchEvent(new ol.DrawEvent(ol.DrawEventType.DRAWEND, sketchFeature)); +}; + + +/** + * Stop drawing without adding the sketch feature to the target layer. + * @return {ol.Feature} The sketch feature (or null if none). + * @private + */ +ol.interaction.Draw.prototype.abortDrawing_ = function() { + this.finishCoordinate_ = null; + var sketchFeature = this.sketchFeature_; + if (!goog.isNull(sketchFeature)) { + this.sketchFeature_ = null; + this.sketchPoint_ = null; + this.sketchLine_ = null; + this.overlay_.getFeatures().clear(); + } + return sketchFeature; +}; + + +/** + * Redraw the skecth features. + * @private + */ +ol.interaction.Draw.prototype.updateSketchFeatures_ = function() { + var sketchFeatures = [this.sketchFeature_]; + if (!goog.isNull(this.sketchLine_)) { + sketchFeatures.push(this.sketchLine_); + } + if (!goog.isNull(this.sketchPoint_)) { + sketchFeatures.push(this.sketchPoint_); + } + this.overlay_.setFeatures(new ol.Collection(sketchFeatures)); +}; + + +/** + * Get the drawing mode. The mode for mult-part geometries is the same as for + * their single-part cousins. + * @param {ol.geom.GeometryType} type Geometry type. + * @return {ol.interaction.DrawMode} Drawing mode. + * @private + */ +ol.interaction.Draw.getMode_ = function(type) { + var mode; + if (type === ol.geom.GeometryType.POINT || + type === ol.geom.GeometryType.MULTI_POINT) { + mode = ol.interaction.DrawMode.POINT; + } else if (type === ol.geom.GeometryType.LINE_STRING || + type === ol.geom.GeometryType.MULTI_LINE_STRING) { + mode = ol.interaction.DrawMode.LINE_STRING; + } else if (type === ol.geom.GeometryType.POLYGON || + type === ol.geom.GeometryType.MULTI_POLYGON) { + mode = ol.interaction.DrawMode.POLYGON; + } + goog.asserts.assert(goog.isDef(mode)); + return mode; +}; + + +/** + * Draw mode. This collapses multi-part geometry types with their single-part + * cousins. + * @enum {string} + */ +ol.interaction.DrawMode = { + POINT: 'Point', + LINE_STRING: 'LineString', + POLYGON: 'Polygon' +}; diff --git a/float-no-zero/ol/ol/interaction/interaction.js b/float-no-zero/ol/ol/interaction/interaction.js new file mode 100644 index 0000000000..dbc57deee1 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/interaction.js @@ -0,0 +1,216 @@ +// FIXME factor out key precondition (shift et. al) + +goog.provide('ol.interaction.Interaction'); + +goog.require('goog.asserts'); +goog.require('ol.MapBrowserEvent'); +goog.require('ol.Observable'); +goog.require('ol.View2D'); +goog.require('ol.animation'); +goog.require('ol.easing'); + + + +/** + * @constructor + * @extends {ol.Observable} + */ +ol.interaction.Interaction = function() { + goog.base(this); + + /** + * @private + * @type {ol.Map} + */ + this.map_ = null; + +}; +goog.inherits(ol.interaction.Interaction, ol.Observable); + + +/** + * Get the map associated with this interaction. + * @return {ol.Map} Map. + */ +ol.interaction.Interaction.prototype.getMap = function() { + return this.map_; +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @return {boolean} Whether the map browser event should continue + * through the chain of interactions. false means stop, true + * means continue. + */ +ol.interaction.Interaction.prototype.handleMapBrowserEvent = + goog.abstractMethod; + + +/** + * Remove the interaction from its current map and attach it to the new map. + * Subclasses may set up event handlers to get notified about changes to + * the map here. + * @param {ol.Map} map Map. + */ +ol.interaction.Interaction.prototype.setMap = function(map) { + this.map_ = map; +}; + + +/** + * @param {ol.Map} map Map. + * @param {ol.IView2D} view View. + * @param {ol.Coordinate} delta Delta. + * @param {number=} opt_duration Duration. + */ +ol.interaction.Interaction.pan = function( + map, view, delta, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + var currentCenter = view.getCenter(); + if (goog.isDef(currentCenter)) { + if (goog.isDef(opt_duration) && opt_duration > 0) { + map.beforeRender(ol.animation.pan({ + source: currentCenter, + duration: opt_duration, + easing: ol.easing.linear + })); + } + var center = view.constrainCenter( + [currentCenter[0] + delta[0], currentCenter[1] + delta[1]]); + view.setCenter(center); + } +}; + + +/** + * @param {ol.Map} map Map. + * @param {ol.IView2D} view View. + * @param {number|undefined} rotation Rotation. + * @param {ol.Coordinate=} opt_anchor Anchor coordinate. + * @param {number=} opt_duration Duration. + */ +ol.interaction.Interaction.rotate = + function(map, view, rotation, opt_anchor, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + rotation = view.constrainRotation(rotation, 0); + ol.interaction.Interaction.rotateWithoutConstraints( + map, view, rotation, opt_anchor, opt_duration); +}; + + +/** + * @param {ol.Map} map Map. + * @param {ol.IView2D} view View. + * @param {number|undefined} rotation Rotation. + * @param {ol.Coordinate=} opt_anchor Anchor coordinate. + * @param {number=} opt_duration Duration. + */ +ol.interaction.Interaction.rotateWithoutConstraints = + function(map, view, rotation, opt_anchor, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + if (goog.isDefAndNotNull(rotation)) { + var currentRotation = view.getRotation(); + var currentCenter = view.getCenter(); + if (goog.isDef(currentRotation) && goog.isDef(currentCenter) && + goog.isDef(opt_duration) && opt_duration > 0) { + map.beforeRender(ol.animation.rotate({ + rotation: currentRotation, + duration: opt_duration, + easing: ol.easing.easeOut + })); + if (goog.isDef(opt_anchor)) { + map.beforeRender(ol.animation.pan({ + source: currentCenter, + duration: opt_duration, + easing: ol.easing.easeOut + })); + } + } + goog.asserts.assertInstanceof(view, ol.View2D); + if (goog.isDefAndNotNull(opt_anchor)) { + var center = view.calculateCenterRotate(rotation, opt_anchor); + view.setCenter(center); + } + view.setRotation(rotation); + } +}; + + +/** + * @param {ol.Map} map Map. + * @param {ol.IView2D} view View. + * @param {number|undefined} resolution Resolution to go to. + * @param {ol.Coordinate=} opt_anchor Anchor coordinate. + * @param {number=} opt_duration Duration. + * @param {number=} opt_direction Zooming direction; > 0 indicates + * zooming out, in which case the constraints system will select + * the largest nearest resolution; < 0 indicates zooming in, in + * which case the constraints system will select the smallest + * nearest resolution; == 0 indicates that the zooming direction + * is unknown/not relevant, in which case the constraints system + * will select the nearest resolution. If not defined 0 is + * assumed. + */ +ol.interaction.Interaction.zoom = + function(map, view, resolution, opt_anchor, opt_duration, opt_direction) { + goog.asserts.assertInstanceof(view, ol.View2D); + resolution = view.constrainResolution(resolution, 0, opt_direction); + ol.interaction.Interaction.zoomWithoutConstraints( + map, view, resolution, opt_anchor, opt_duration); +}; + + +/** + * @param {ol.Map} map Map. + * @param {ol.IView2D} view View. + * @param {number} delta Delta from previous zoom level. + * @param {ol.Coordinate=} opt_anchor Anchor coordinate. + * @param {number=} opt_duration Duration. + */ +ol.interaction.Interaction.zoomByDelta = + function(map, view, delta, opt_anchor, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + var currentResolution = view.getResolution(); + var resolution = view.constrainResolution(currentResolution, delta, 0); + ol.interaction.Interaction.zoomWithoutConstraints( + map, view, resolution, opt_anchor, opt_duration); +}; + + +/** + * @param {ol.Map} map Map. + * @param {ol.IView2D} view View. + * @param {number|undefined} resolution Resolution to go to. + * @param {ol.Coordinate=} opt_anchor Anchor coordinate. + * @param {number=} opt_duration Duration. + */ +ol.interaction.Interaction.zoomWithoutConstraints = + function(map, view, resolution, opt_anchor, opt_duration) { + goog.asserts.assertInstanceof(view, ol.View2D); + if (goog.isDefAndNotNull(resolution)) { + var currentResolution = view.getResolution(); + var currentCenter = view.getCenter(); + if (goog.isDef(currentResolution) && goog.isDef(currentCenter) && + goog.isDef(opt_duration) && opt_duration > 0) { + map.beforeRender(ol.animation.zoom({ + resolution: currentResolution, + duration: opt_duration, + easing: ol.easing.easeOut + })); + if (goog.isDef(opt_anchor)) { + map.beforeRender(ol.animation.pan({ + source: currentCenter, + duration: opt_duration, + easing: ol.easing.easeOut + })); + } + } + goog.asserts.assertInstanceof(view, ol.View2D); + if (goog.isDefAndNotNull(opt_anchor)) { + var center = view.calculateCenterZoom(resolution, opt_anchor); + view.setCenter(center); + } + view.setResolution(resolution); + } +}; diff --git a/float-no-zero/ol/ol/interaction/interaction.jsdoc b/float-no-zero/ol/ol/interaction/interaction.jsdoc new file mode 100644 index 0000000000..6da0d140d4 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/interaction.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.interaction + */ diff --git a/float-no-zero/ol/ol/interaction/interactiondefaults.exports b/float-no-zero/ol/ol/interaction/interactiondefaults.exports new file mode 100644 index 0000000000..6a928864a2 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/interactiondefaults.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.defaults diff --git a/float-no-zero/ol/ol/interaction/interactiondefaults.js b/float-no-zero/ol/ol/interaction/interactiondefaults.js new file mode 100644 index 0000000000..32b4e5569c --- /dev/null +++ b/float-no-zero/ol/ol/interaction/interactiondefaults.js @@ -0,0 +1,110 @@ +goog.provide('ol.interaction'); + +goog.require('ol.Collection'); +goog.require('ol.Kinetic'); +goog.require('ol.interaction.DoubleClickZoom'); +goog.require('ol.interaction.DragPan'); +goog.require('ol.interaction.DragRotate'); +goog.require('ol.interaction.DragZoom'); +goog.require('ol.interaction.KeyboardPan'); +goog.require('ol.interaction.KeyboardZoom'); +goog.require('ol.interaction.MouseWheelZoom'); +goog.require('ol.interaction.TouchPan'); +goog.require('ol.interaction.TouchRotate'); +goog.require('ol.interaction.TouchZoom'); + + +/** + * This method is a convenience method to create a set of interactions + * to be used with an {@link ol.Map}. Specific interactions can be excluded by + * setting the appropriate option to false in the constructor options, + * but the order of the interactions is fixed. If you want to specify a + * different order for interactions, you will need to create your own + * {@link ol.interaction} instances and insert them into an + * {@link ol.Collection} in the order you want before creating your ol.Map + * instance. + * @param {olx.interaction.DefaultsOptions=} opt_options Defaults options. + * @return {ol.Collection} A collection of interactions to be used with + * the ol.Map constructor's interactions option. + * @todo stability experimental + */ +ol.interaction.defaults = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + var interactions = new ol.Collection(); + + var kinetic = new ol.Kinetic(-0.005, 0.05, 100); + + var altShiftDragRotate = goog.isDef(options.altShiftDragRotate) ? + options.altShiftDragRotate : true; + if (altShiftDragRotate) { + interactions.push(new ol.interaction.DragRotate()); + } + + var doubleClickZoom = goog.isDef(options.doubleClickZoom) ? + options.doubleClickZoom : true; + if (doubleClickZoom) { + interactions.push(new ol.interaction.DoubleClickZoom({ + delta: options.zoomDelta, + duration: options.zoomDuration + })); + } + + var touchPan = goog.isDef(options.touchPan) ? + options.touchPan : true; + if (touchPan) { + interactions.push(new ol.interaction.TouchPan({ + kinetic: kinetic + })); + } + + var touchRotate = goog.isDef(options.touchRotate) ? + options.touchRotate : true; + if (touchRotate) { + interactions.push(new ol.interaction.TouchRotate()); + } + + var touchZoom = goog.isDef(options.touchZoom) ? + options.touchZoom : true; + if (touchZoom) { + interactions.push(new ol.interaction.TouchZoom({ + duration: options.zoomDuration + })); + } + + var dragPan = goog.isDef(options.dragPan) ? + options.dragPan : true; + if (dragPan) { + interactions.push(new ol.interaction.DragPan({ + kinetic: kinetic + })); + } + + var keyboard = goog.isDef(options.keyboard) ? + options.keyboard : true; + if (keyboard) { + interactions.push(new ol.interaction.KeyboardPan()); + interactions.push(new ol.interaction.KeyboardZoom({ + delta: options.zoomDelta, + duration: options.zoomDuration + })); + } + + var mouseWheelZoom = goog.isDef(options.mouseWheelZoom) ? + options.mouseWheelZoom : true; + if (mouseWheelZoom) { + interactions.push(new ol.interaction.MouseWheelZoom({ + duration: options.zoomDuration + })); + } + + var shiftDragZoom = goog.isDef(options.shiftDragZoom) ? + options.shiftDragZoom : true; + if (shiftDragZoom) { + interactions.push(new ol.interaction.DragZoom()); + } + + return interactions; + +}; diff --git a/float-no-zero/ol/ol/interaction/keyboardpan.exports b/float-no-zero/ol/ol/interaction/keyboardpan.exports new file mode 100644 index 0000000000..a09f837004 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/keyboardpan.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.KeyboardPan diff --git a/float-no-zero/ol/ol/interaction/keyboardpaninteraction.js b/float-no-zero/ol/ol/interaction/keyboardpaninteraction.js new file mode 100644 index 0000000000..d609846e43 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/keyboardpaninteraction.js @@ -0,0 +1,102 @@ +// FIXME works for View2D only + +goog.provide('ol.interaction.KeyboardPan'); + +goog.require('goog.asserts'); +goog.require('goog.events.KeyCodes'); +goog.require('goog.events.KeyHandler.EventType'); +goog.require('goog.functions'); +goog.require('ol.View2D'); +goog.require('ol.coordinate'); +goog.require('ol.events.ConditionType'); +goog.require('ol.events.condition'); +goog.require('ol.interaction.Interaction'); + + +/** + * @define {number} Pan duration. + */ +ol.interaction.KEYBOARD_PAN_DURATION = 100; + + + +/** + * Allows the user to pan the map using keyboard arrows. + * Note that, although this interaction is by default included in maps, + * the keys can only be used when browser focus is on the element to which + * the keyboard events are attached. By default, this is the map div, + * though you can change this with the `keyboardTargetElement` in + * {@link ol.Map}. `document` never loses focus but, for any other element, + * focus will have to be on, and returned to, this element if the keys are to + * function. + * See also {@link ol.interaction.KeyboardZoom}. + * @constructor + * @extends {ol.interaction.Interaction} + * @param {olx.interaction.KeyboardPanOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.KeyboardPan = function(opt_options) { + + goog.base(this); + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.events.ConditionType} + */ + this.condition_ = goog.isDef(options.condition) ? options.condition : + goog.functions.and(ol.events.condition.noModifierKeys, + ol.events.condition.targetNotEditable); + + /** + * @private + * @type {number} + */ + this.pixelDelta_ = goog.isDef(options.pixelDelta) ? options.pixelDelta : 128; + +}; +goog.inherits(ol.interaction.KeyboardPan, ol.interaction.Interaction); + + +/** + * @inheritDoc + */ +ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + var stopEvent = false; + if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { + var keyEvent = /** @type {goog.events.KeyEvent} */ + (mapBrowserEvent.browserEvent); + var keyCode = keyEvent.keyCode; + if (this.condition_(mapBrowserEvent) && + (keyCode == goog.events.KeyCodes.DOWN || + keyCode == goog.events.KeyCodes.LEFT || + keyCode == goog.events.KeyCodes.RIGHT || + keyCode == goog.events.KeyCodes.UP)) { + var map = mapBrowserEvent.map; + // FIXME works for View2D only + var view = map.getView(); + goog.asserts.assertInstanceof(view, ol.View2D); + var view2DState = view.getView2DState(); + var mapUnitsDelta = view2DState.resolution * this.pixelDelta_; + var deltaX = 0, deltaY = 0; + if (keyCode == goog.events.KeyCodes.DOWN) { + deltaY = -mapUnitsDelta; + } else if (keyCode == goog.events.KeyCodes.LEFT) { + deltaX = -mapUnitsDelta; + } else if (keyCode == goog.events.KeyCodes.RIGHT) { + deltaX = mapUnitsDelta; + } else { + deltaY = mapUnitsDelta; + } + var delta = [deltaX, deltaY]; + ol.coordinate.rotate(delta, view2DState.rotation); + ol.interaction.Interaction.pan( + map, view, delta, ol.interaction.KEYBOARD_PAN_DURATION); + mapBrowserEvent.preventDefault(); + stopEvent = true; + } + } + return !stopEvent; +}; diff --git a/float-no-zero/ol/ol/interaction/keyboardzoom.exports b/float-no-zero/ol/ol/interaction/keyboardzoom.exports new file mode 100644 index 0000000000..01a6a9d315 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/keyboardzoom.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.KeyboardZoom diff --git a/float-no-zero/ol/ol/interaction/keyboardzoominteraction.js b/float-no-zero/ol/ol/interaction/keyboardzoominteraction.js new file mode 100644 index 0000000000..b0b452284b --- /dev/null +++ b/float-no-zero/ol/ol/interaction/keyboardzoominteraction.js @@ -0,0 +1,81 @@ +// FIXME works for View2D only + +goog.provide('ol.interaction.KeyboardZoom'); + +goog.require('goog.asserts'); +goog.require('goog.events.KeyHandler.EventType'); +goog.require('ol.events.ConditionType'); +goog.require('ol.events.condition'); +goog.require('ol.interaction.Interaction'); + + + +/** + * Allows the user to zoom the map using keyboard + and -. + * Note that, although this interaction is by default included in maps, + * the keys can only be used when browser focus is on the element to which + * the keyboard events are attached. By default, this is the map div, + * though you can change this with the `keyboardTargetElement` in + * {@link ol.Map}. `document` never loses focus but, for any other element, + * focus will have to be on, and returned to, this element if the keys are to + * function. + * See also {@link ol.interaction.KeyboardPan}. + * @constructor + * @param {olx.interaction.KeyboardZoomOptions=} opt_options Options. + * @extends {ol.interaction.Interaction} + * @todo stability experimental + */ +ol.interaction.KeyboardZoom = function(opt_options) { + + goog.base(this); + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.events.ConditionType} + */ + this.condition_ = goog.isDef(options.condition) ? options.condition : + ol.events.condition.targetNotEditable; + + /** + * @private + * @type {number} + */ + this.delta_ = goog.isDef(options.delta) ? options.delta : 1; + + /** + * @private + * @type {number} + */ + this.duration_ = goog.isDef(options.duration) ? options.duration : 100; + +}; +goog.inherits(ol.interaction.KeyboardZoom, ol.interaction.Interaction); + + +/** + * @inheritDoc + */ +ol.interaction.KeyboardZoom.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + var stopEvent = false; + if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { + var keyEvent = /** @type {goog.events.KeyEvent} */ + (mapBrowserEvent.browserEvent); + var charCode = keyEvent.charCode; + if (this.condition_(mapBrowserEvent) && + (charCode == '+'.charCodeAt(0) || charCode == '-'.charCodeAt(0))) { + var map = mapBrowserEvent.map; + var delta = (charCode == '+'.charCodeAt(0)) ? this.delta_ : -this.delta_; + map.render(); + // FIXME works for View2D only + var view = map.getView().getView2D(); + ol.interaction.Interaction.zoomByDelta( + map, view, delta, undefined, this.duration_); + mapBrowserEvent.preventDefault(); + stopEvent = true; + } + } + return !stopEvent; +}; diff --git a/float-no-zero/ol/ol/interaction/modifyinteraction.exports b/float-no-zero/ol/ol/interaction/modifyinteraction.exports new file mode 100644 index 0000000000..60378a3759 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/modifyinteraction.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.Modify diff --git a/float-no-zero/ol/ol/interaction/modifyinteraction.js b/float-no-zero/ol/ol/interaction/modifyinteraction.js new file mode 100644 index 0000000000..6296fc8748 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/modifyinteraction.js @@ -0,0 +1,633 @@ +goog.provide('ol.interaction.Modify'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('ol.Collection'); +goog.require('ol.CollectionEventType'); +goog.require('ol.Feature'); +goog.require('ol.FeatureOverlay'); +goog.require('ol.MapBrowserEvent.EventType'); +goog.require('ol.ViewHint'); +goog.require('ol.coordinate'); +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.MultiPoint'); +goog.require('ol.geom.MultiPolygon'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.Polygon'); +goog.require('ol.interaction.Drag'); +goog.require('ol.structs.RBush'); + + +/** + * @typedef {{feature: ol.Feature, + * geometry: ol.geom.Geometry, + * index: (number|undefined), + * segment: Array.}} + */ +ol.interaction.SegmentDataType; + + + +/** + * @constructor + * @extends {ol.interaction.Drag} + * @param {olx.interaction.ModifyOptions} options Options. + */ +ol.interaction.Modify = function(options) { + + goog.base(this); + + + /** + * Editing vertex. + * @type {ol.Feature} + * @private + */ + this.vertexFeature_ = null; + + /** + * Segments intersecting {@link this.vertexFeature_} by segment uid. + * @type {Object.} + * @private + */ + this.vertexSegments_ = null; + + /** + * @type {boolean} + * @private + */ + this.modifiable_ = false; + + /** + * @type {ol.Pixel} + * @private + */ + this.lastPixel_ = null; + + /** + * Segment RTree for each layer + * @type {Object.<*, ol.structs.RBush>} + * @private + */ + this.rBush_ = null; + + /** + * @type {number} + * @private + */ + this.pixelTolerance_ = goog.isDef(options.pixelTolerance) ? + options.pixelTolerance : 20; + + /** + * @type {Array} + * @private + */ + this.dragSegments_ = null; + + /** + * Draw overlay where are sketch features are drawn. + * @type {ol.FeatureOverlay} + * @private + */ + this.overlay_ = new ol.FeatureOverlay({ + style: options.style + }); + + /** + * @type {ol.Collection} + * @private + */ + this.features_ = options.features; + + goog.events.listen(this.features_, ol.CollectionEventType.ADD, + this.addFeature_, false, this); + goog.events.listen(this.features_, ol.CollectionEventType.REMOVE, + this.removeFeature_, false, this); + + /** + * @const + * @private + * @type {Object. } + */ + this.SEGMENT_WRITERS_ = { + 'Point': this.writePointGeometry_, + 'LineString': this.writeLineStringGeometry_, + 'LinearRing': this.writeLineStringGeometry_, + 'Polygon': this.writePolygonGeometry_, + 'MultiPoint': this.writeMultiPointGeometry_, + 'MultiLineString': this.writeMultiLineStringGeometry_, + 'MultiPolygon': this.writeMultiPolygonGeometry_, + 'GeometryCollection': this.writeGeometryCollectionGeometry_ + }; + +}; +goog.inherits(ol.interaction.Modify, ol.interaction.Drag); + + +/** + * @inheritDoc + */ +ol.interaction.Modify.prototype.setMap = function(map) { + if (!goog.isNull(map)) { + if (goog.isNull(this.rBush_)) { + this.rBush_ = new ol.structs.RBush(); + } + } else { + // removing from a map, clean up + this.rBush_ = null; + } + + this.overlay_.setMap(map); + goog.base(this, 'setMap', map); +}; + + +/** + * @param {ol.CollectionEvent} evt Event. + * @private + */ +ol.interaction.Modify.prototype.addFeature_ = function(evt) { + var feature = evt.element; + goog.asserts.assertInstanceof(feature, ol.Feature); + var geometry = feature.getGeometry(); + if (goog.isDef(this.SEGMENT_WRITERS_[geometry.getType()])) { + this.SEGMENT_WRITERS_[geometry.getType()].call(this, feature, geometry); + } + this.handleMouseAtPixel_(this.lastPixel_, this.getMap()); +}; + + +/** + * @param {ol.Feature} feature Feature + * @param {ol.geom.Point} geometry Geometry. + * @private + */ +ol.interaction.Modify.prototype.writePointGeometry_ = + function(feature, geometry) { + var coordinates = geometry.getCoordinates(); + var segmentData = /** @type {ol.interaction.SegmentDataType} */ ({ + feature: feature, + geometry: geometry, + segment: [coordinates, coordinates] + }); + this.rBush_.insert(geometry.getExtent(), segmentData); +}; + + +/** + * @param {ol.Feature} feature Feature + * @param {ol.geom.MultiPoint} geometry Geometry. + * @private + */ +ol.interaction.Modify.prototype.writeMultiPointGeometry_ = + function(feature, geometry) { + var points = geometry.getCoordinates(); + var coordinates, i, ii, segmentData; + for (i = 0, ii = points.length; i < ii; ++i) { + coordinates = points[i]; + segmentData = /** @type {ol.interaction.SegmentDataType} */ ({ + feature: feature, + geometry: geometry, + depth: [i], + index: i, + segment: [coordinates, coordinates] + }); + this.rBush_.insert(geometry.getExtent(), segmentData); + } +}; + + +/** + * @param {ol.Feature} feature Feature + * @param {ol.geom.LineString} geometry Geometry. + * @private + */ +ol.interaction.Modify.prototype.writeLineStringGeometry_ = + function(feature, geometry) { + var coordinates = geometry.getCoordinates(); + var i, ii, segment, segmentData; + for (i = 0, ii = coordinates.length - 1; i < ii; ++i) { + segment = coordinates.slice(i, i + 2); + segmentData = /** @type {ol.interaction.SegmentDataType} */ ({ + feature: feature, + geometry: geometry, + index: i, + segment: segment + }); + this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData); + } +}; + + +/** + * @param {ol.Feature} feature Feature + * @param {ol.geom.MultiLineString} geometry Geometry. + * @private + */ +ol.interaction.Modify.prototype.writeMultiLineStringGeometry_ = + function(feature, geometry) { + var lines = geometry.getCoordinates(); + var coordinates, i, ii, j, jj, segment, segmentData; + for (j = 0, jj = lines.length; j < jj; ++j) { + coordinates = lines[j]; + for (i = 0, ii = coordinates.length - 1; i < ii; ++i) { + segment = coordinates.slice(i, i + 2); + segmentData = /** @type {ol.interaction.SegmentDataType} */ ({ + feature: feature, + geometry: geometry, + depth: [j], + index: i, + segment: segment + }); + this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData); + } + } +}; + + +/** + * @param {ol.Feature} feature Feature + * @param {ol.geom.Polygon} geometry Geometry. + * @private + */ +ol.interaction.Modify.prototype.writePolygonGeometry_ = + function(feature, geometry) { + var rings = geometry.getCoordinates(); + var coordinates = rings[0]; + var i, ii, segment, segmentData; + for (i = 0, ii = coordinates.length - 1; i < ii; ++i) { + segment = coordinates.slice(i, i + 2); + segmentData = /** @type {ol.interaction.SegmentDataType} */ ({ + feature: feature, + geometry: geometry, + index: i, + segment: segment + }); + this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData); + } +}; + + +/** + * @param {ol.Feature} feature Feature + * @param {ol.geom.MultiPolygon} geometry Geometry. + * @private + */ +ol.interaction.Modify.prototype.writeMultiPolygonGeometry_ = + function(feature, geometry) { + var polygons = geometry.getCoordinates(); + var coordinates, i, ii, j, jj, segment, segmentData; + for (j = 0, jj = polygons.length; j < jj; ++j) { + coordinates = polygons[j][0]; + for (i = 0, ii = coordinates.length - 1; i < ii; ++i) { + segment = coordinates.slice(i, i + 2); + segmentData = /** @type {ol.interaction.SegmentDataType} */ ({ + feature: feature, + geometry: geometry, + depth: [j], + index: i, + segment: segment + }); + this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData); + } + } +}; + + +/** + * @param {ol.Feature} feature Feature + * @param {ol.geom.GeometryCollection} geometry Geometry. + * @private + */ +ol.interaction.Modify.prototype.writeGeometryCollectionGeometry_ = + function(feature, geometry) { + var i, geometries = geometry.getGeometriesArray(); + for (i = 0; i < geometries.length; ++i) { + this.SEGMENT_WRITERS_[geometries[i].getType()].call( + this, feature, geometries[i]); + } +}; + + +/** + * @param {ol.CollectionEvent} evt Event. + * @private + */ +ol.interaction.Modify.prototype.removeFeature_ = function(evt) { + var feature = evt.element; + var rBush = this.rBush_; + var i, nodesToRemove = []; + rBush.forEachInExtent(feature.getGeometry().getExtent(), function(node) { + if (feature === node.feature) { + nodesToRemove.push(node); + } + }); + for (i = nodesToRemove.length - 1; i >= 0; --i) { + rBush.remove(nodesToRemove[i]); + } + // There remains only vertexFeature… + if (!goog.isNull(this.vertexFeature_) && + this.features_.getLength() === 0) { + this.overlay_.removeFeature(this.vertexFeature_); + this.vertexFeature_ = null; + } +}; + + +/** + * @param {ol.Coordinate} coordinates Coordinates. + * @return {ol.Feature} Vertex feature. + * @private + */ +ol.interaction.Modify.prototype.createOrUpdateVertexFeature_ = + function(coordinates) { + var vertexFeature = this.vertexFeature_; + if (goog.isNull(vertexFeature)) { + vertexFeature = new ol.Feature(new ol.geom.Point(coordinates)); + this.vertexFeature_ = vertexFeature; + this.overlay_.addFeature(vertexFeature); + } else { + var geometry = /** @type {ol.geom.Point} */ (vertexFeature.getGeometry()); + geometry.setCoordinates(coordinates); + } + return vertexFeature; +}; + + +/** + * @inheritDoc + */ +ol.interaction.Modify.prototype.handleDragStart = function(evt) { + this.dragSegments_ = []; + var vertexFeature = this.vertexFeature_; + if (!goog.isNull(vertexFeature)) { + var insertVertices = []; + var geometry = /** @type {ol.geom.Point} */ (vertexFeature.getGeometry()); + var vertex = geometry.getCoordinates(); + var vertexExtent = ol.extent.boundingExtent([vertex]); + var segmentDataMatches = []; + this.rBush_.forEachInExtent(vertexExtent, + function(segmentData) { + segmentDataMatches.push(segmentData); + }); + var distinctFeatures = {}; + for (var i = 0, ii = segmentDataMatches.length; i < ii; ++i) { + var segmentDataMatch = segmentDataMatches[i]; + var segment = segmentDataMatch.segment; + if (!(goog.getUid(segmentDataMatch.feature) in distinctFeatures)) { + var feature = segmentDataMatch.feature; + distinctFeatures[goog.getUid(feature)] = true; + } + if (ol.coordinate.equals(segment[0], vertex)) { + this.dragSegments_.push([segmentDataMatch, 0]); + } else if (ol.coordinate.equals(segment[1], vertex)) { + this.dragSegments_.push([segmentDataMatch, 1]); + } else if (goog.getUid(segment) in this.vertexSegments_) { + insertVertices.push([segmentDataMatch, vertex]); + } + } + for (i = insertVertices.length - 1; i >= 0; --i) { + this.insertVertex_.apply(this, insertVertices[i]); + } + } + return this.modifiable_; +}; + + +/** + * @inheritDoc + */ +ol.interaction.Modify.prototype.handleDrag = function(evt) { + var vertex = evt.coordinate; + for (var i = 0, ii = this.dragSegments_.length; i < ii; ++i) { + var dragSegment = this.dragSegments_[i]; + var segmentData = dragSegment[0]; + var depth = segmentData.depth; + var geometry = segmentData.geometry; + var coordinates = geometry.getCoordinates(); + var segment = segmentData.segment; + var index = dragSegment[1]; + + switch (geometry.getType()) { + case ol.geom.GeometryType.POINT: + coordinates = vertex; + segment[0] = segment[1] = vertex; + break; + case ol.geom.GeometryType.MULTI_POINT: + coordinates[segmentData.index] = vertex; + segment[0] = segment[1] = vertex; + break; + case ol.geom.GeometryType.LINE_STRING: + coordinates[segmentData.index + index] = vertex; + segment[index] = vertex; + break; + case ol.geom.GeometryType.MULTI_LINE_STRING: + coordinates[depth[0]][segmentData.index + index] = vertex; + segment[index] = vertex; + break; + case ol.geom.GeometryType.POLYGON: + coordinates[0][segmentData.index + index] = vertex; + segment[index] = vertex; + break; + case ol.geom.GeometryType.MULTI_POLYGON: + coordinates[depth[0]][0][segmentData.index + index] = vertex; + segment[index] = vertex; + break; + } + + geometry.setCoordinates(coordinates); + var newBounds = ol.extent.boundingExtent(segment); + this.createOrUpdateVertexFeature_(vertex); + this.rBush_.remove(segmentData); + this.rBush_.insert(newBounds, segmentData); + } +}; + + +/** + * @inheritDoc + */ +ol.interaction.Modify.prototype.handleDragEnd = function(evt) { + var segmentData; + for (var i = this.dragSegments_.length - 1; i >= 0; --i) { + segmentData = this.dragSegments_[i][0]; + this.rBush_.update(ol.extent.boundingExtent(segmentData.segment), + segmentData); + } +}; + + +/** + * @inheritDoc + */ +ol.interaction.Modify.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + if (!mapBrowserEvent.map.getView().getHints()[ol.ViewHint.INTERACTING] && + !this.getDragging() && + mapBrowserEvent.type == ol.MapBrowserEvent.EventType.MOUSEMOVE) { + this.handleMouseMove_(mapBrowserEvent); + } + goog.base(this, 'handleMapBrowserEvent', mapBrowserEvent); + return !this.modifiable_; +}; + + +/** + * @param {ol.MapBrowserEvent} evt Event. + * @private + */ +ol.interaction.Modify.prototype.handleMouseMove_ = function(evt) { + this.lastPixel_ = evt.pixel; + this.handleMouseAtPixel_(evt.pixel, evt.map); +}; + + +/** + * @param {ol.Pixel} pixel Pixel + * @param {ol.Map} map Map. + * @private + */ +ol.interaction.Modify.prototype.handleMouseAtPixel_ = function(pixel, map) { + var pixelCoordinate = map.getCoordinateFromPixel(pixel); + var sortByDistance = function(a, b) { + return ol.coordinate.squaredDistanceToSegment(pixelCoordinate, a.segment) - + ol.coordinate.squaredDistanceToSegment(pixelCoordinate, b.segment); + }; + + var lowerLeft = map.getCoordinateFromPixel( + [pixel[0] - this.pixelTolerance_, pixel[1] + this.pixelTolerance_]); + var upperRight = map.getCoordinateFromPixel( + [pixel[0] + this.pixelTolerance_, pixel[1] - this.pixelTolerance_]); + var box = ol.extent.boundingExtent([lowerLeft, upperRight]); + + this.modifiable_ = false; + var rBush = this.rBush_; + var nodes = rBush.getInExtent(box); + if (nodes.length > 0) { + nodes.sort(sortByDistance); + var node = nodes[0]; + var closestSegment = node.segment; + var vertex = (ol.coordinate.closestOnSegment(pixelCoordinate, + closestSegment)); + var vertexPixel = map.getPixelFromCoordinate(vertex); + if (Math.sqrt(ol.coordinate.squaredDistance(pixel, vertexPixel)) <= + this.pixelTolerance_) { + var pixel1 = map.getPixelFromCoordinate(closestSegment[0]); + var pixel2 = map.getPixelFromCoordinate(closestSegment[1]); + var squaredDist1 = ol.coordinate.squaredDistance(vertexPixel, pixel1); + var squaredDist2 = ol.coordinate.squaredDistance(vertexPixel, pixel2); + var dist = Math.sqrt(Math.min(squaredDist1, squaredDist2)); + if (dist <= 10) { + vertex = squaredDist1 > squaredDist2 ? + closestSegment[1] : closestSegment[0]; + } + this.createOrUpdateVertexFeature_(vertex); + var vertexSegments = {}; + vertexSegments[goog.getUid(closestSegment)] = true; + var segment; + for (var i = 1, ii = nodes.length; i < ii; ++i) { + segment = nodes[i].segment; + if ((ol.coordinate.equals(closestSegment[0], segment[0]) && + ol.coordinate.equals(closestSegment[1], segment[1]) || + (ol.coordinate.equals(closestSegment[0], segment[1]) && + ol.coordinate.equals(closestSegment[1], segment[0])))) { + vertexSegments[goog.getUid(segment)] = true; + } else { + break; + } + } + this.vertexSegments_ = vertexSegments; + this.modifiable_ = true; + return; + } + } + if (!goog.isNull(this.vertexFeature_)) { + this.overlay_.removeFeature(this.vertexFeature_); + this.vertexFeature_ = null; + } +}; + + +/** + * @param {ol.interaction.SegmentDataType} segmentData Segment data. + * @param {ol.Coordinate} vertex Vertex. + * @private + */ +ol.interaction.Modify.prototype.insertVertex_ = function(segmentData, vertex) { + var segment = segmentData.segment; + var feature = segmentData.feature; + var geometry = segmentData.geometry; + var depth = segmentData.depth; + var index = segmentData.index; + var coordinates; + + switch (geometry.getType()) { + case ol.geom.GeometryType.MULTI_LINE_STRING: + goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString); + coordinates = geometry.getCoordinates(); + coordinates[depth[0]].splice(index + 1, 0, vertex); + break; + case ol.geom.GeometryType.POLYGON: + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + coordinates = geometry.getCoordinates(); + coordinates[0].splice(index + 1, 0, vertex); + break; + case ol.geom.GeometryType.MULTI_POLYGON: + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon); + coordinates = geometry.getCoordinates(); + coordinates[depth[0]][0].splice(index + 1, 0, vertex); + break; + case ol.geom.GeometryType.LINE_STRING: + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + coordinates = geometry.getCoordinates(); + coordinates.splice(index + 1, 0, vertex); + break; + default: + return; + } + + geometry.setCoordinates(coordinates); + var rTree = this.rBush_; + goog.asserts.assert(goog.isDef(segment)); + rTree.remove(segmentData); + var uid = goog.getUid(feature); + var segmentDataMatches = []; + this.rBush_.forEachInExtent(geometry.getExtent(), + function(segmentData) { + if (goog.getUid(segmentData.feature) === uid) { + segmentDataMatches.push(segmentData); + } + }); + for (var i = 0, ii = segmentDataMatches.length; i < ii; ++i) { + var segmentDataMatch = segmentDataMatches[i]; + if (segmentDataMatch.geometry === geometry && + segmentDataMatch.index > index) { + ++segmentDataMatch.index; + } + } + var newSegmentData = /** @type {ol.interaction.SegmentDataType} */ ({ + segment: [segment[0], vertex], + feature: feature, + geometry: geometry, + depth: depth, + index: index + }); + rTree.insert(ol.extent.boundingExtent(newSegmentData.segment), + newSegmentData); + this.dragSegments_.push([newSegmentData, 1]); + + var newSegmentData2 = /** @type {ol.interaction.SegmentDataType} */ ({ + segment: [vertex, segment[1]], + feature: feature, + geometry: geometry, + depth: depth, + index: index + 1 + }); + rTree.insert(ol.extent.boundingExtent(newSegmentData2.segment), + newSegmentData2); + this.dragSegments_.push([newSegmentData2, 0]); +}; diff --git a/float-no-zero/ol/ol/interaction/mousewheelzoom.exports b/float-no-zero/ol/ol/interaction/mousewheelzoom.exports new file mode 100644 index 0000000000..bd6f492da3 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/mousewheelzoom.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.MouseWheelZoom diff --git a/float-no-zero/ol/ol/interaction/mousewheelzoominteraction.js b/float-no-zero/ol/ol/interaction/mousewheelzoominteraction.js new file mode 100644 index 0000000000..956c82d315 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/mousewheelzoominteraction.js @@ -0,0 +1,125 @@ +// FIXME works for View2D only + +goog.provide('ol.interaction.MouseWheelZoom'); + +goog.require('goog.asserts'); +goog.require('goog.events.MouseWheelEvent'); +goog.require('goog.events.MouseWheelHandler.EventType'); +goog.require('goog.math'); +goog.require('ol.Coordinate'); +goog.require('ol.interaction.Interaction'); + + +/** + * @define {number} Maximum delta. + */ +ol.interaction.MOUSEWHEELZOOM_MAXDELTA = 1; + + +/** + * @define {number} Timeout duration. + */ +ol.interaction.MOUSEWHEELZOOM_TIMEOUT_DURATION = 80; + + + +/** + * Allows the user to zoom the map by scrolling the mouse wheel. + * @constructor + * @extends {ol.interaction.Interaction} + * @param {olx.interaction.MouseWheelZoomOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.MouseWheelZoom = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + /** + * @private + * @type {number} + */ + this.delta_ = 0; + + /** + * @private + * @type {number} + */ + this.duration_ = goog.isDef(options.duration) ? options.duration : 250; + + /** + * @private + * @type {?ol.Coordinate} + */ + this.lastAnchor_ = null; + + /** + * @private + * @type {number|undefined} + */ + this.startTime_ = undefined; + + /** + * @private + * @type {number|undefined} + */ + this.timeoutId_ = undefined; + +}; +goog.inherits(ol.interaction.MouseWheelZoom, ol.interaction.Interaction); + + +/** + * @inheritDoc + */ +ol.interaction.MouseWheelZoom.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + var stopEvent = false; + if (mapBrowserEvent.type == + goog.events.MouseWheelHandler.EventType.MOUSEWHEEL) { + var map = mapBrowserEvent.map; + var mouseWheelEvent = mapBrowserEvent.browserEvent; + goog.asserts.assertInstanceof(mouseWheelEvent, goog.events.MouseWheelEvent); + + this.lastAnchor_ = mapBrowserEvent.coordinate; + this.delta_ += mouseWheelEvent.deltaY / 3; + + if (!goog.isDef(this.startTime_)) { + this.startTime_ = goog.now(); + } + + var duration = ol.interaction.MOUSEWHEELZOOM_TIMEOUT_DURATION; + var timeLeft = Math.max(duration - (goog.now() - this.startTime_), 0); + + goog.global.clearTimeout(this.timeoutId_); + this.timeoutId_ = goog.global.setTimeout( + goog.bind(this.doZoom_, this, map), timeLeft); + + mapBrowserEvent.preventDefault(); + stopEvent = true; + } + return !stopEvent; +}; + + +/** + * @private + * @param {ol.Map} map Map. + */ +ol.interaction.MouseWheelZoom.prototype.doZoom_ = function(map) { + var maxDelta = ol.interaction.MOUSEWHEELZOOM_MAXDELTA; + var delta = goog.math.clamp(this.delta_, -maxDelta, maxDelta); + + // FIXME works for View2D only + var view = map.getView().getView2D(); + + map.render(); + ol.interaction.Interaction.zoomByDelta(map, view, -delta, this.lastAnchor_, + this.duration_); + + this.delta_ = 0; + this.lastAnchor_ = null; + this.startTime_ = undefined; + this.timeoutId_ = undefined; +}; diff --git a/float-no-zero/ol/ol/interaction/selectinteraction.exports b/float-no-zero/ol/ol/interaction/selectinteraction.exports new file mode 100644 index 0000000000..eeccc7e10a --- /dev/null +++ b/float-no-zero/ol/ol/interaction/selectinteraction.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.interaction.Select +@exportProperty ol.interaction.Select.prototype.getFeatures +@exportProperty ol.interaction.Select.prototype.setMap diff --git a/float-no-zero/ol/ol/interaction/selectinteraction.js b/float-no-zero/ol/ol/interaction/selectinteraction.js new file mode 100644 index 0000000000..4c9e85d63b --- /dev/null +++ b/float-no-zero/ol/ol/interaction/selectinteraction.js @@ -0,0 +1,148 @@ +goog.provide('ol.interaction.Select'); + +goog.require('goog.array'); +goog.require('goog.functions'); +goog.require('ol.FeatureOverlay'); +goog.require('ol.events.condition'); +goog.require('ol.interaction.Interaction'); + + + +/** + * @constructor + * @extends {ol.interaction.Interaction} + * @param {olx.interaction.SelectOptions} options Options. + * @todo stability experimental + */ +ol.interaction.Select = function(options) { + + goog.base(this); + + /** + * @private + * @type {ol.events.ConditionType} + */ + this.condition_ = goog.isDef(options.condition) ? + options.condition : ol.events.condition.singleClick; + + /** + * @private + * @type {ol.events.ConditionType} + */ + this.addCondition_ = goog.isDef(options.addCondition) ? + options.addCondition : ol.events.condition.shiftKeyOnly; + + var layerFilter; + if (goog.isDef(options.layerFilter)) { + layerFilter = options.layerFilter; + } else if (goog.isDef(options.layer)) { + var layer = options.layer; + layerFilter = + /** + * @param {ol.layer.Layer} l Layer. + * @return {boolean} Include. + */ + function(l) { + return l === layer; + }; + } else if (goog.isDef(options.layers)) { + var layers = options.layers; + layerFilter = + /** + * @param {ol.layer.Layer} layer Layer. + * @return {boolean} Include. + */ + function(layer) { + return goog.array.indexOf(layers, layer) != -1; + }; + } else { + layerFilter = goog.functions.TRUE; + } + + /** + * @private + * @type {function(ol.layer.Layer): boolean} + */ + this.layerFilter_ = layerFilter; + + /** + * @private + * @type {ol.FeatureOverlay} + */ + this.featureOverlay_ = new ol.FeatureOverlay({ + style: options.style + }); + +}; +goog.inherits(ol.interaction.Select, ol.interaction.Interaction); + + +/** + * @return {ol.Collection} Features collection. + * @todo stability experimental + */ +ol.interaction.Select.prototype.getFeatures = function() { + return this.featureOverlay_.getFeatures(); +}; + + +/** + * @inheritDoc + */ +ol.interaction.Select.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + if (!this.condition_(mapBrowserEvent)) { + return true; + } + var add = this.addCondition_(mapBrowserEvent); + var map = mapBrowserEvent.map; + var features = this.featureOverlay_.getFeatures(); + if (add) { + map.forEachFeatureAtPixel(mapBrowserEvent.pixel, + /** + * @param {ol.Feature} feature Feature. + * @param {ol.layer.Layer} layer Layer. + */ + function(feature, layer) { + if (goog.array.indexOf(features.getArray(), feature) == -1) { + features.push(feature); + } + }, undefined, this.layerFilter_); + } else { + /** @type {ol.Feature|undefined} */ + var feature = map.forEachFeatureAtPixel(mapBrowserEvent.pixel, + /** + * @param {ol.Feature} feature Feature. + * @param {ol.layer.Layer} layer Layer. + */ + function(feature, layer) { + return feature; + }, undefined, this.layerFilter_); + if (goog.isDef(feature)) { + if (features.getLength() == 1) { + if (features.getAt(0) !== feature) { + features.setAt(0, feature); + } + } else { + if (features.getLength() != 1) { + features.clear(); + } + features.push(feature); + } + } else { + if (features.getLength() !== 0) { + features.clear(); + } + } + } + return false; +}; + + +/** + * @inheritDoc + */ +ol.interaction.Select.prototype.setMap = function(map) { + goog.base(this, 'setMap', map); + this.featureOverlay_.setMap(map); +}; diff --git a/float-no-zero/ol/ol/interaction/touchinteraction.js b/float-no-zero/ol/ol/interaction/touchinteraction.js new file mode 100644 index 0000000000..987cbb4e29 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/touchinteraction.js @@ -0,0 +1,151 @@ + +goog.provide('ol.interaction.Touch'); + +goog.require('goog.asserts'); +goog.require('goog.functions'); +goog.require('goog.object'); +goog.require('ol.MapBrowserEvent'); +goog.require('ol.MapBrowserEvent.EventType'); +goog.require('ol.Pixel'); +goog.require('ol.ViewHint'); +goog.require('ol.interaction.Interaction'); + + + +/** + * Base class for touch interactions. + * @constructor + * @extends {ol.interaction.Interaction} + */ +ol.interaction.Touch = function() { + + goog.base(this); + + /** + * @type {boolean} + * @private + */ + this.handled_ = false; + + /** + * @type {Object} + * @private + */ + this.trackedTouches_ = {}; + + /** + * @type {Array.} + * @protected + */ + this.targetTouches = []; + +}; +goog.inherits(ol.interaction.Touch, ol.interaction.Interaction); + + +/** + * @param {Array.} touches TouchEvents. + * @return {ol.Pixel} Centroid pixel. + */ +ol.interaction.Touch.centroid = function(touches) { + var length = touches.length; + var clientX = 0; + var clientY = 0; + for (var i = 0; i < length; i++) { + clientX += touches[i].clientX; + clientY += touches[i].clientY; + } + return [clientX / length, clientY / length]; +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @return {boolean} Whether the event is a touchstart, touchmove + * or touchend event. + * @private + */ +ol.interaction.Touch.isTouchEvent_ = function(mapBrowserEvent) { + var type = mapBrowserEvent.type; + return ( + type === ol.MapBrowserEvent.EventType.TOUCHSTART || + type === ol.MapBrowserEvent.EventType.TOUCHMOVE || + type === ol.MapBrowserEvent.EventType.TOUCHEND); +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @private + */ +ol.interaction.Touch.prototype.updateTrackedTouches_ = + function(mapBrowserEvent) { + if (ol.interaction.Touch.isTouchEvent_(mapBrowserEvent)) { + var event = mapBrowserEvent.originalEvent; + if (goog.isDef(event.targetTouches)) { + // W3C touch events + this.targetTouches = event.targetTouches; + } else if (goog.isDef(event.pointerId)) { + // IE pointer event + if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHEND) { + delete this.trackedTouches_[event.pointerId]; + } else { + this.trackedTouches_[event.pointerId] = event; + } + this.targetTouches = goog.object.getValues(this.trackedTouches_); + } else { + goog.asserts.fail('unknown touch event model'); + } + } +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @protected + */ +ol.interaction.Touch.prototype.handleTouchMove = goog.nullFunction; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @protected + * @return {boolean} Capture dragging. + */ +ol.interaction.Touch.prototype.handleTouchEnd = goog.functions.FALSE; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @protected + * @return {boolean} Capture dragging. + */ +ol.interaction.Touch.prototype.handleTouchStart = goog.functions.FALSE; + + +/** + * @inheritDoc + */ +ol.interaction.Touch.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + var view = mapBrowserEvent.map.getView(); + this.updateTrackedTouches_(mapBrowserEvent); + if (this.handled_) { + if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHMOVE) { + this.handleTouchMove(mapBrowserEvent); + } else if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHEND) { + this.handled_ = this.handleTouchEnd(mapBrowserEvent); + if (!this.handled_) { + view.setHint(ol.ViewHint.INTERACTING, -1); + } + } + } + if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHSTART) { + var handled = this.handleTouchStart(mapBrowserEvent); + if (!this.handled_ && handled) { + view.setHint(ol.ViewHint.INTERACTING, 1); + } + this.handled_ = handled; + } + return true; +}; diff --git a/float-no-zero/ol/ol/interaction/touchpan.exports b/float-no-zero/ol/ol/interaction/touchpan.exports new file mode 100644 index 0000000000..e50ab8ec1c --- /dev/null +++ b/float-no-zero/ol/ol/interaction/touchpan.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.TouchPan diff --git a/float-no-zero/ol/ol/interaction/touchpaninteraction.js b/float-no-zero/ol/ol/interaction/touchpaninteraction.js new file mode 100644 index 0000000000..53dd8fdfb9 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/touchpaninteraction.js @@ -0,0 +1,142 @@ +// FIXME works for View2D only +goog.provide('ol.interaction.TouchPan'); + +goog.require('goog.asserts'); +goog.require('ol.Kinetic'); +goog.require('ol.Pixel'); +goog.require('ol.PreRenderFunction'); +goog.require('ol.View2D'); +goog.require('ol.coordinate'); +goog.require('ol.interaction.Touch'); + + + +/** + * Allows the user to pan the map by touching and dragging + * on a touch screen. + * @constructor + * @extends {ol.interaction.Touch} + * @param {olx.interaction.TouchPanOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.TouchPan = function(opt_options) { + + goog.base(this); + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.Kinetic|undefined} + */ + this.kinetic_ = options.kinetic; + + /** + * @private + * @type {?ol.PreRenderFunction} + */ + this.kineticPreRenderFn_ = null; + + /** + * @type {ol.Pixel} + */ + this.lastCentroid = null; + + /** + * @private + * @type {boolean} + */ + this.noKinetic_ = false; + +}; +goog.inherits(ol.interaction.TouchPan, ol.interaction.Touch); + + +/** + * @inheritDoc + */ +ol.interaction.TouchPan.prototype.handleTouchMove = function(mapBrowserEvent) { + goog.asserts.assert(this.targetTouches.length >= 1); + var centroid = ol.interaction.Touch.centroid(this.targetTouches); + if (!goog.isNull(this.lastCentroid)) { + if (this.kinetic_) { + this.kinetic_.update(centroid[0], centroid[1]); + } + var deltaX = this.lastCentroid[0] - centroid[0]; + var deltaY = centroid[1] - this.lastCentroid[1]; + var map = mapBrowserEvent.map; + var view2D = map.getView().getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + var view2DState = view2D.getView2DState(); + var center = [deltaX, deltaY]; + ol.coordinate.scale(center, view2DState.resolution); + ol.coordinate.rotate(center, view2DState.rotation); + ol.coordinate.add(center, view2DState.center); + center = view2D.constrainCenter(center); + map.render(); + view2D.setCenter(center); + } + this.lastCentroid = centroid; +}; + + +/** + * @inheritDoc + */ +ol.interaction.TouchPan.prototype.handleTouchEnd = + function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var view2D = map.getView().getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + if (this.targetTouches.length === 0) { + if (!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) { + var distance = this.kinetic_.getDistance(); + var angle = this.kinetic_.getAngle(); + var center = view2D.getCenter(); + goog.asserts.assert(goog.isDef(center)); + this.kineticPreRenderFn_ = this.kinetic_.pan(center); + map.beforeRender(this.kineticPreRenderFn_); + var centerpx = map.getPixelFromCoordinate(center); + var dest = map.getCoordinateFromPixel([ + centerpx[0] - distance * Math.cos(angle), + centerpx[1] - distance * Math.sin(angle) + ]); + dest = view2D.constrainCenter(dest); + view2D.setCenter(dest); + } + map.render(); + return false; + } else { + this.lastCentroid = null; + return true; + } +}; + + +/** + * @inheritDoc + */ +ol.interaction.TouchPan.prototype.handleTouchStart = + function(mapBrowserEvent) { + if (this.targetTouches.length > 0) { + var map = mapBrowserEvent.map; + var view2D = map.getView().getView2D(); + goog.asserts.assertInstanceof(view2D, ol.View2D); + this.lastCentroid = null; + map.render(); + if (!goog.isNull(this.kineticPreRenderFn_) && + map.removePreRenderFunction(this.kineticPreRenderFn_)) { + view2D.setCenter(mapBrowserEvent.frameState.view2DState.center); + this.kineticPreRenderFn_ = null; + } + if (this.kinetic_) { + this.kinetic_.begin(); + } + // No kinetic as soon as more than one fingers on the screen is + // detected. This is to prevent nasty pans after pinch. + this.noKinetic_ = this.targetTouches.length > 1; + return true; + } else { + return false; + } +}; diff --git a/float-no-zero/ol/ol/interaction/touchrotate.exports b/float-no-zero/ol/ol/interaction/touchrotate.exports new file mode 100644 index 0000000000..b7045b88ab --- /dev/null +++ b/float-no-zero/ol/ol/interaction/touchrotate.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.TouchRotate diff --git a/float-no-zero/ol/ol/interaction/touchrotateinteraction.js b/float-no-zero/ol/ol/interaction/touchrotateinteraction.js new file mode 100644 index 0000000000..af99eb3feb --- /dev/null +++ b/float-no-zero/ol/ol/interaction/touchrotateinteraction.js @@ -0,0 +1,155 @@ +// FIXME works for View2D only + +goog.provide('ol.interaction.TouchRotate'); + +goog.require('goog.asserts'); +goog.require('goog.style'); +goog.require('ol.Coordinate'); +goog.require('ol.interaction.Interaction'); +goog.require('ol.interaction.Touch'); + + +/** + * @define {number} Animation duration. + */ +ol.interaction.TOUCHROTATE_ANIMATION_DURATION = 250; + + + +/** + * Allows the user to rotate the map by twisting with two fingers + * on a touch screen. + * @constructor + * @extends {ol.interaction.Touch} + * @param {olx.interaction.TouchRotateOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.TouchRotate = function(opt_options) { + + goog.base(this); + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.Coordinate} + */ + this.anchor_ = null; + + /** + * @private + * @type {number|undefined} + */ + this.lastAngle_ = undefined; + + /** + * @private + * @type {boolean} + */ + this.rotating_ = false; + + /** + * @private + * @type {number} + */ + this.rotationDelta_ = 0.0; + + /** + * @private + * @type {number} + */ + this.threshold_ = goog.isDef(options.threshold) ? options.threshold : 0.3; + +}; +goog.inherits(ol.interaction.TouchRotate, ol.interaction.Touch); + + +/** + * @inheritDoc + */ +ol.interaction.TouchRotate.prototype.handleTouchMove = + function(mapBrowserEvent) { + goog.asserts.assert(this.targetTouches.length >= 2); + var rotationDelta = 0.0; + + var touch0 = this.targetTouches[0]; + var touch1 = this.targetTouches[1]; + + // angle between touches + var angle = Math.atan2( + touch1.clientY - touch0.clientY, + touch1.clientX - touch0.clientX); + + if (goog.isDef(this.lastAngle_)) { + var delta = angle - this.lastAngle_; + this.rotationDelta_ += delta; + if (!this.rotating_ && + Math.abs(this.rotationDelta_) > this.threshold_) { + this.rotating_ = true; + } + rotationDelta = delta; + } + this.lastAngle_ = angle; + + var map = mapBrowserEvent.map; + + // rotate anchor point. + // FIXME: should be the intersection point between the lines: + // touch0,touch1 and previousTouch0,previousTouch1 + var viewportPosition = goog.style.getClientPosition(map.getViewport()); + var centroid = ol.interaction.Touch.centroid(this.targetTouches); + centroid[0] -= viewportPosition.x; + centroid[1] -= viewportPosition.y; + this.anchor_ = map.getCoordinateFromPixel(centroid); + + // rotate + if (this.rotating_) { + // FIXME works for View2D only + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + map.render(); + ol.interaction.Interaction.rotateWithoutConstraints(map, view, + view2DState.rotation + rotationDelta, this.anchor_); + } +}; + + +/** + * @inheritDoc + */ +ol.interaction.TouchRotate.prototype.handleTouchEnd = + function(mapBrowserEvent) { + if (this.targetTouches.length < 2) { + var map = mapBrowserEvent.map; + // FIXME works for View2D only + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + if (this.rotating_) { + ol.interaction.Interaction.rotate( + map, view, view2DState.rotation, this.anchor_, + ol.interaction.TOUCHROTATE_ANIMATION_DURATION); + } + return false; + } else { + return true; + } +}; + + +/** + * @inheritDoc + */ +ol.interaction.TouchRotate.prototype.handleTouchStart = + function(mapBrowserEvent) { + if (this.targetTouches.length >= 2) { + var map = mapBrowserEvent.map; + this.anchor_ = null; + this.lastAngle_ = undefined; + this.rotating_ = false; + this.rotationDelta_ = 0.0; + map.render(); + return true; + } else { + return false; + } +}; diff --git a/float-no-zero/ol/ol/interaction/touchzoom.exports b/float-no-zero/ol/ol/interaction/touchzoom.exports new file mode 100644 index 0000000000..0e62f50746 --- /dev/null +++ b/float-no-zero/ol/ol/interaction/touchzoom.exports @@ -0,0 +1 @@ +@exportSymbol ol.interaction.TouchZoom diff --git a/float-no-zero/ol/ol/interaction/touchzoominteraction.js b/float-no-zero/ol/ol/interaction/touchzoominteraction.js new file mode 100644 index 0000000000..0ee00db57f --- /dev/null +++ b/float-no-zero/ol/ol/interaction/touchzoominteraction.js @@ -0,0 +1,137 @@ +// FIXME works for View2D only + +goog.provide('ol.interaction.TouchZoom'); + +goog.require('goog.asserts'); +goog.require('goog.style'); +goog.require('ol.Coordinate'); +goog.require('ol.interaction.Interaction'); +goog.require('ol.interaction.Touch'); + + + +/** + * Allows the user to zoom the map by pinching with two fingers + * on a touch screen. + * @constructor + * @extends {ol.interaction.Touch} + * @param {olx.interaction.TouchZoomOptions=} opt_options Options. + * @todo stability experimental + */ +ol.interaction.TouchZoom = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + /** + * @private + * @type {ol.Coordinate} + */ + this.anchor_ = null; + + /** + * @private + * @type {number} + */ + this.duration_ = goog.isDef(options.duration) ? options.duration : 400; + + /** + * @private + * @type {number|undefined} + */ + this.lastDistance_ = undefined; + + /** + * @private + * @type {number} + */ + this.lastScaleDelta_ = 1; + +}; +goog.inherits(ol.interaction.TouchZoom, ol.interaction.Touch); + + +/** + * @inheritDoc + */ +ol.interaction.TouchZoom.prototype.handleTouchMove = + function(mapBrowserEvent) { + goog.asserts.assert(this.targetTouches.length >= 2); + var scaleDelta = 1.0; + + var touch0 = this.targetTouches[0]; + var touch1 = this.targetTouches[1]; + var dx = touch0.clientX - touch1.clientX; + var dy = touch0.clientY - touch1.clientY; + + // distance between touches + var distance = Math.sqrt(dx * dx + dy * dy); + + if (goog.isDef(this.lastDistance_)) { + scaleDelta = this.lastDistance_ / distance; + } + this.lastDistance_ = distance; + if (scaleDelta != 1.0) { + this.lastScaleDelta_ = scaleDelta; + } + + var map = mapBrowserEvent.map; + // FIXME works for View2D only + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + + // scale anchor point. + var viewportPosition = goog.style.getClientPosition(map.getViewport()); + var centroid = ol.interaction.Touch.centroid(this.targetTouches); + centroid[0] -= viewportPosition.x; + centroid[1] -= viewportPosition.y; + this.anchor_ = map.getCoordinateFromPixel(centroid); + + // scale, bypass the resolution constraint + map.render(); + ol.interaction.Interaction.zoomWithoutConstraints( + map, view, view2DState.resolution * scaleDelta, this.anchor_); + +}; + + +/** + * @inheritDoc + */ +ol.interaction.TouchZoom.prototype.handleTouchEnd = + function(mapBrowserEvent) { + if (this.targetTouches.length < 2) { + var map = mapBrowserEvent.map; + // FIXME works for View2D only + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + // Zoom to final resolution, with an animation, and provide a + // direction not to zoom out/in if user was pinching in/out. + // Direction is > 0 if pinching out, and < 0 if pinching in. + var direction = this.lastScaleDelta_ - 1; + ol.interaction.Interaction.zoom(map, view, view2DState.resolution, + this.anchor_, this.duration_, direction); + return false; + } else { + return true; + } +}; + + +/** + * @inheritDoc + */ +ol.interaction.TouchZoom.prototype.handleTouchStart = + function(mapBrowserEvent) { + if (this.targetTouches.length >= 2) { + var map = mapBrowserEvent.map; + this.anchor_ = null; + this.lastDistance_ = undefined; + this.lastScaleDelta_ = 1; + map.render(); + return true; + } else { + return false; + } +}; diff --git a/float-no-zero/ol/ol/iview.js b/float-no-zero/ol/ol/iview.js new file mode 100644 index 0000000000..37d828d3e2 --- /dev/null +++ b/float-no-zero/ol/ol/iview.js @@ -0,0 +1,34 @@ +goog.provide('ol.IView'); + +goog.require('ol.IView2D'); +goog.require('ol.IView3D'); + + + +/** + * Interface for views. + * @interface + */ +ol.IView = function() { +}; + + +/** + * @return {ol.IView2D} View2D. + */ +ol.IView.prototype.getView2D = function() { +}; + + +/** + * @return {ol.IView3D} View3D. + */ +ol.IView.prototype.getView3D = function() { +}; + + +/** + * @return {boolean} Is defined. + */ +ol.IView.prototype.isDef = function() { +}; diff --git a/float-no-zero/ol/ol/iview2d.js b/float-no-zero/ol/ol/iview2d.js new file mode 100644 index 0000000000..0969e6d696 --- /dev/null +++ b/float-no-zero/ol/ol/iview2d.js @@ -0,0 +1,68 @@ +goog.provide('ol.IView2D'); +goog.provide('ol.View2DState'); + +goog.require('ol.Coordinate'); + + +/** + * @typedef {{center: ol.Coordinate, + * projection: ol.proj.Projection, + * resolution: number, + * rotation: number}} + */ +ol.View2DState; + + + +/** + * Interface for views. + * @interface + */ +ol.IView2D = function() { +}; + + +/** + * @return {ol.Coordinate|undefined} Map center. + * @todo stability experimental + */ +ol.IView2D.prototype.getCenter = function() { +}; + + +/** + * @return {ol.proj.Projection|undefined} Map projection. + * @todo stability experimental + */ +ol.IView2D.prototype.getProjection = function() { +}; + + +/** + * @return {number|undefined} Map resolution. + * @todo stability experimental + */ +ol.IView2D.prototype.getResolution = function() { +}; + + +/** + * @return {number|undefined} Map rotation. + * @todo stability experimental + */ +ol.IView2D.prototype.getRotation = function() { +}; + + +/** + * @return {ol.View2DState} View2D state. + */ +ol.IView2D.prototype.getView2DState = function() { +}; + + +/** + * @return {boolean} Is defined. + */ +ol.IView2D.prototype.isDef = function() { +}; diff --git a/float-no-zero/ol/ol/iview3d.js b/float-no-zero/ol/ol/iview3d.js new file mode 100644 index 0000000000..b54f7d7e42 --- /dev/null +++ b/float-no-zero/ol/ol/iview3d.js @@ -0,0 +1,17 @@ +goog.provide('ol.IView3D'); + + + +/** + * Interface for views. + * @interface + */ +ol.IView3D = function() { +}; + + +/** + * @return {boolean} Is defined. + */ +ol.IView3D.prototype.isDef = function() { +}; diff --git a/float-no-zero/ol/ol/kinetic.exports b/float-no-zero/ol/ol/kinetic.exports new file mode 100644 index 0000000000..aa3f543286 --- /dev/null +++ b/float-no-zero/ol/ol/kinetic.exports @@ -0,0 +1 @@ +@exportSymbol ol.Kinetic diff --git a/float-no-zero/ol/ol/kinetic.js b/float-no-zero/ol/ol/kinetic.js new file mode 100644 index 0000000000..56833aed1b --- /dev/null +++ b/float-no-zero/ol/ol/kinetic.js @@ -0,0 +1,152 @@ + +goog.provide('ol.Kinetic'); + +goog.require('ol.Coordinate'); +goog.require('ol.PreRenderFunction'); +goog.require('ol.animation'); + + + +/** + * @constructor + * @param {number} decay Rate of decay (must be negative). + * @param {number} minVelocity Minimum velocity (pixels/millisecond). + * @param {number} delay Delay to consider to calculate the kinetic + * initial values (milliseconds). + * @struct + * @todo stability experimental + */ +ol.Kinetic = function(decay, minVelocity, delay) { + + /** + * @private + * @type {number} + */ + this.decay_ = decay; + + /** + * @private + * @type {number} + */ + this.minVelocity_ = minVelocity; + + /** + * @private + * @type {number} + */ + this.delay_ = delay; + + /** + * @private + * @type {Array.} + */ + this.points_ = []; + + /** + * @private + * @type {number} + */ + this.angle_ = 0; + + /** + * @private + * @type {number} + */ + this.initialVelocity_ = 0; +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.Kinetic.prototype.begin = function() { + this.points_.length = 0; + this.angle_ = 0; + this.initialVelocity_ = 0; +}; + + +/** + * @param {number} x X. + * @param {number} y Y. + */ +ol.Kinetic.prototype.update = function(x, y) { + this.points_.push(x, y, goog.now()); +}; + + +/** + * @return {boolean} Whether we should do kinetic animation. + */ +ol.Kinetic.prototype.end = function() { + var delay = goog.now() - this.delay_; + var lastIndex = this.points_.length - 3; + if (this.points_[lastIndex + 2] < delay) { + // the user stopped panning before releasing the map + return false; + } + var firstIndex = lastIndex - 3; + while (firstIndex >= 0 && this.points_[firstIndex + 2] > delay) { + firstIndex -= 3; + } + if (firstIndex >= 0) { + var duration = this.points_[lastIndex + 2] - this.points_[firstIndex + 2]; + var dx = this.points_[lastIndex] - this.points_[firstIndex]; + var dy = this.points_[lastIndex + 1] - this.points_[firstIndex + 1]; + this.angle_ = Math.atan2(dy, dx); + this.initialVelocity_ = Math.sqrt(dx * dx + dy * dy) / duration; + return this.initialVelocity_ > this.minVelocity_; + } + return false; +}; + + +/** + * @param {ol.Coordinate} source Source coordinate for the animation. + * @return {ol.PreRenderFunction} Pre-render function for kinetic animation. + */ +ol.Kinetic.prototype.pan = function(source) { + var decay = this.decay_; + var initialVelocity = this.initialVelocity_; + var minVelocity = this.minVelocity_; + var duration = this.getDuration_(); + var easingFunction = ( + /** + * @param {number} t T. + * @return {number} Easing. + */ + function(t) { + return initialVelocity * (Math.exp((decay * t) * duration) - 1) / + (minVelocity - initialVelocity); + }); + return ol.animation.pan({ + source: source, + duration: duration, + easing: easingFunction + }); +}; + + +/** + * @private + * @return {number} Duration of animation (milliseconds). + */ +ol.Kinetic.prototype.getDuration_ = function() { + return Math.log(this.minVelocity_ / this.initialVelocity_) / this.decay_; +}; + + +/** + * @return {number} Total distance travelled (pixels). + */ +ol.Kinetic.prototype.getDistance = function() { + return (this.minVelocity_ - this.initialVelocity_) / this.decay_; +}; + + +/** + * @return {number} Angle of the kinetic panning animation (radians). + */ +ol.Kinetic.prototype.getAngle = function() { + return this.angle_; +}; diff --git a/float-no-zero/ol/ol/layer/heatmaplayer.exports b/float-no-zero/ol/ol/layer/heatmaplayer.exports new file mode 100644 index 0000000000..be2de928b7 --- /dev/null +++ b/float-no-zero/ol/ol/layer/heatmaplayer.exports @@ -0,0 +1 @@ +@exportSymbol ol.layer.Heatmap diff --git a/float-no-zero/ol/ol/layer/heatmaplayer.js b/float-no-zero/ol/ol/layer/heatmaplayer.js new file mode 100644 index 0000000000..c0a567c1bd --- /dev/null +++ b/float-no-zero/ol/ol/layer/heatmaplayer.js @@ -0,0 +1,195 @@ +// FIXME feature weight property +goog.provide('ol.layer.Heatmap'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('ol.Object'); +goog.require('ol.layer.Vector'); +goog.require('ol.render.EventType'); +goog.require('ol.style.Icon'); +goog.require('ol.style.Style'); + + +/** + * @enum {string} + */ +ol.layer.HeatmapLayerProperty = { + GRADIENT: 'gradient' +}; + + + +/** + * @constructor + * @extends {ol.layer.Vector} + * @param {olx.layer.HeatmapOptions=} opt_options Options. + * @todo stability experimental + */ +ol.layer.Heatmap = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, /** @type {olx.layer.VectorOptions} */ (options)); + + /** + * @private + * @type {Uint8ClampedArray} + */ + this.gradient_ = null; + + goog.events.listen(this, + ol.Object.getChangeEventType(ol.layer.HeatmapLayerProperty.GRADIENT), + this.handleGradientChanged_, false, this); + + this.setGradient(goog.isDef(options.gradient) ? + options.gradient : ol.layer.Heatmap.DEFAULT_GRADIENT); + + var radius = goog.isDef(options.radius) ? options.radius : 8; + var blur = goog.isDef(options.blur) ? options.blur : 15; + var shadow = goog.isDef(options.shadow) ? options.shadow : 250; + + var style = new ol.style.Style({ + image: ol.layer.Heatmap.createIcon_(radius, blur, shadow) + }); + + // FIXME: styles are immutable + // /** + // * @param {ol.Feature} feature + // * @param {number} resolution + // * @return {number} weight + // */ + // var weightFunction = function(feature, resolution) { + // var weight = /** @type {number} */ (feature.get('weight')); + // return goog.isDef(weight) ? weight : 1; + // }; + // + // var styleArray = [style]; + // this.setStyle(function(feature, resolution) { + // var image = style.getImage(); + // image.setOpacity(weightFunction(feature, resolution)); + // return styleArray; + // }); + + this.setStyle(style); + + goog.events.listen(this, ol.render.EventType.RENDER, + this.handleRender_, false, this); + +}; +goog.inherits(ol.layer.Heatmap, ol.layer.Vector); + + +/** + * @const + * @type {Array.} + */ +ol.layer.Heatmap.DEFAULT_GRADIENT = ['#00f', '#0ff', '#0f0', '#ff0', '#f00']; + + +/** + * @param {Array.} colors + * @return {Uint8ClampedArray} + * @private + */ +ol.layer.Heatmap.createGradient_ = function(colors) { + var canvas = goog.dom.createElement(goog.dom.TagName.CANVAS); + var context = canvas.getContext('2d'); + var width = 1; + var height = 256; + canvas.width = width; + canvas.height = height; + + var gradient = context.createLinearGradient(0, 0, width, height); + var step = 1 / colors.length; + for (var i = 0, ii = colors.length; i < ii; ++i) { + gradient.addColorStop(i * step, colors[i]); + } + + context.fillStyle = gradient; + context.fillRect(0, 0, width, height); + + return context.getImageData(0, 0, width, height).data; +}; + + +/** + * @param {number} radius Radius size in pixel. + * @param {number} blur Blur size in pixel. + * @param {number} shadow Shadow offset size in pixel. + * @return {ol.style.Icon} icon + * @private + */ +ol.layer.Heatmap.createIcon_ = function(radius, blur, shadow) { + var canvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + var context = canvas.getContext('2d'); + var halfSize = radius + blur + 1; + canvas.width = canvas.height = halfSize * 2; + context.shadowOffsetX = context.shadowOffsetY = shadow; + context.shadowBlur = blur; + context.shadowColor = '#000'; + context.beginPath(); + var center = halfSize - shadow; + context.arc(center, center, radius, 0, Math.PI * 2, true); + context.fill(); + return new ol.style.Icon({ + src: canvas.toDataURL() + }); +}; + + +/** + * @return {Array.} Colors. + */ +ol.layer.Heatmap.prototype.getGradient = function() { + return /** @type {Array.} */ ( + this.get(ol.layer.HeatmapLayerProperty.GRADIENT)); +}; +goog.exportProperty( + ol.layer.Heatmap.prototype, + 'getGradient', + ol.layer.Heatmap.prototype.getGradient); + + +/** + * @private + */ +ol.layer.Heatmap.prototype.handleGradientChanged_ = function() { + this.gradient_ = ol.layer.Heatmap.createGradient_(this.getGradient()); +}; + + +/** + * @param {ol.render.Event} event Post compose event + * @private + */ +ol.layer.Heatmap.prototype.handleRender_ = function(event) { + goog.asserts.assert(event.type == ol.render.EventType.RENDER); + var context = event.context; + var canvas = context.canvas; + var image = context.getImageData(0, 0, canvas.width, canvas.height); + var view8 = image.data; + var i, ii, alpha, offset; + for (i = 0, ii = view8.length; i < ii; i += 4) { + alpha = view8[i + 3] * 4; + if (alpha) { + view8[i] = this.gradient_[alpha]; + view8[i + 1] = this.gradient_[alpha + 1]; + view8[i + 2] = this.gradient_[alpha + 2]; + } + } + context.putImageData(image, 0, 0); +}; + + +/** + * @param {Array.} colors Gradient. + */ +ol.layer.Heatmap.prototype.setGradient = function(colors) { + this.set(ol.layer.HeatmapLayerProperty.GRADIENT, colors); +}; +goog.exportProperty( + ol.layer.Heatmap.prototype, + 'setGradient', + ol.layer.Heatmap.prototype.setGradient); diff --git a/float-no-zero/ol/ol/layer/imagelayer.exports b/float-no-zero/ol/ol/layer/imagelayer.exports new file mode 100644 index 0000000000..0027269144 --- /dev/null +++ b/float-no-zero/ol/ol/layer/imagelayer.exports @@ -0,0 +1 @@ +@exportSymbol ol.layer.Image diff --git a/float-no-zero/ol/ol/layer/imagelayer.js b/float-no-zero/ol/ol/layer/imagelayer.js new file mode 100644 index 0000000000..9f8d1bf4e3 --- /dev/null +++ b/float-no-zero/ol/ol/layer/imagelayer.js @@ -0,0 +1,16 @@ +goog.provide('ol.layer.Image'); + +goog.require('ol.layer.Layer'); + + + +/** + * @constructor + * @extends {ol.layer.Layer} + * @param {olx.layer.LayerOptions} options Layer options. + * @todo stability experimental + */ +ol.layer.Image = function(options) { + goog.base(this, options); +}; +goog.inherits(ol.layer.Image, ol.layer.Layer); diff --git a/float-no-zero/ol/ol/layer/layer.exports b/float-no-zero/ol/ol/layer/layer.exports new file mode 100644 index 0000000000..1bc8b440a7 --- /dev/null +++ b/float-no-zero/ol/ol/layer/layer.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.layer.Layer +@exportProperty ol.layer.Layer.prototype.getSource diff --git a/float-no-zero/ol/ol/layer/layer.js b/float-no-zero/ol/ol/layer/layer.js new file mode 100644 index 0000000000..4ab377a0a4 --- /dev/null +++ b/float-no-zero/ol/ol/layer/layer.js @@ -0,0 +1,93 @@ +goog.provide('ol.layer.Layer'); + +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.object'); +goog.require('ol.layer.Base'); +goog.require('ol.source.Source'); + + + +/** + * @constructor + * @extends {ol.layer.Base} + * @param {olx.layer.LayerOptions} options Layer options. + * @todo stability experimental + * @todo observable brightness {number} the brightness of the layer + * @todo observable contrast {number} the contrast of the layer + * @todo observable hue {number} the hue of the layer + * @todo observable opacity {number} the opacity of the layer + * @todo observable saturation {number} the saturation of the layer + * @todo observable visible {boolean} the visiblity of the layer + * @todo observable maxResolution {number} the maximum resolution of the layer + * @todo observable minResolution {number} the minimum resolution of the layer + */ +ol.layer.Layer = function(options) { + + var baseOptions = goog.object.clone(options); + delete baseOptions.source; + + goog.base(this, /** @type {olx.layer.LayerOptions} */ (baseOptions)); + + /** + * @private + * @type {ol.source.Source} + */ + this.source_ = options.source; + + goog.events.listen(this.source_, goog.events.EventType.CHANGE, + this.handleSourceChange_, false, this); + +}; +goog.inherits(ol.layer.Layer, ol.layer.Base); + + +/** + * @inheritDoc + */ +ol.layer.Layer.prototype.getLayersArray = function(opt_array) { + var array = (goog.isDef(opt_array)) ? opt_array : []; + array.push(this); + return array; +}; + + +/** + * @inheritDoc + */ +ol.layer.Layer.prototype.getLayerStatesArray = function(opt_obj) { + var obj = (goog.isDef(opt_obj)) ? opt_obj : { + layers: [], + layerStates: [] + }; + goog.asserts.assert(obj.layers.length === obj.layerStates.length); + obj.layers.push(this); + obj.layerStates.push(this.getLayerState()); + return obj; +}; + + +/** + * @return {ol.source.Source} Source. + * @todo stability experimental + */ +ol.layer.Layer.prototype.getSource = function() { + return this.source_; +}; + + +/** + * @inheritDoc + */ +ol.layer.Layer.prototype.getSourceState = function() { + return this.getSource().getState(); +}; + + +/** + * @private + */ +ol.layer.Layer.prototype.handleSourceChange_ = function() { + this.dispatchChangeEvent(); +}; diff --git a/float-no-zero/ol/ol/layer/layer.jsdoc b/float-no-zero/ol/ol/layer/layer.jsdoc new file mode 100644 index 0000000000..29e9851de5 --- /dev/null +++ b/float-no-zero/ol/ol/layer/layer.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.layer + */ diff --git a/float-no-zero/ol/ol/layer/layerbase.js b/float-no-zero/ol/ol/layer/layerbase.js new file mode 100644 index 0000000000..46bc1b7d2c --- /dev/null +++ b/float-no-zero/ol/ol/layer/layerbase.js @@ -0,0 +1,355 @@ +goog.provide('ol.layer.Base'); +goog.provide('ol.layer.LayerProperty'); +goog.provide('ol.layer.LayerState'); + +goog.require('goog.events'); +goog.require('goog.math'); +goog.require('goog.object'); +goog.require('ol.Object'); +goog.require('ol.source.State'); + + +/** + * @enum {string} + */ +ol.layer.LayerProperty = { + BRIGHTNESS: 'brightness', + CONTRAST: 'contrast', + HUE: 'hue', + OPACITY: 'opacity', + SATURATION: 'saturation', + VISIBLE: 'visible', + MAX_RESOLUTION: 'maxResolution', + MIN_RESOLUTION: 'minResolution' +}; + + +/** + * @typedef {{brightness: number, + * contrast: number, + * hue: number, + * opacity: number, + * saturation: number, + * sourceState: ol.source.State, + * visible: boolean, + * maxResolution: number, + * minResolution: number}} + */ +ol.layer.LayerState; + + + +/** + * @constructor + * @extends {ol.Object} + * @param {olx.layer.BaseOptions} options Layer options. + */ +ol.layer.Base = function(options) { + + goog.base(this); + + var values = goog.object.clone(options); + + /** @type {number} */ + values.brightness = goog.isDef(values.brightness) ? values.brightness : 0; + /** @type {number} */ + values.contrast = goog.isDef(values.contrast) ? values.contrast : 1; + /** @type {number} */ + values.hue = goog.isDef(values.hue) ? values.hue : 0; + /** @type {number} */ + values.opacity = goog.isDef(values.opacity) ? values.opacity : 1; + /** @type {number} */ + values.saturation = goog.isDef(values.saturation) ? values.saturation : 1; + /** @type {boolean} */ + values.visible = goog.isDef(values.visible) ? values.visible : true; + /** @type {number} */ + values.maxResolution = goog.isDef(values.maxResolution) ? + values.maxResolution : Infinity; + /** @type {number} */ + values.minResolution = goog.isDef(values.minResolution) ? + values.minResolution : 0; + + this.setValues(values); +}; +goog.inherits(ol.layer.Base, ol.Object); + + +/** + * @return {number|undefined} Brightness. + */ +ol.layer.Base.prototype.getBrightness = function() { + return /** @type {number|undefined} */ ( + this.get(ol.layer.LayerProperty.BRIGHTNESS)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getBrightness', + ol.layer.Base.prototype.getBrightness); + + +/** + * @return {number|undefined} Contrast. + */ +ol.layer.Base.prototype.getContrast = function() { + return /** @type {number|undefined} */ ( + this.get(ol.layer.LayerProperty.CONTRAST)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getContrast', + ol.layer.Base.prototype.getContrast); + + +/** + * @return {number|undefined} Hue. + */ +ol.layer.Base.prototype.getHue = function() { + return /** @type {number|undefined} */ (this.get(ol.layer.LayerProperty.HUE)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getHue', + ol.layer.Base.prototype.getHue); + + +/** + * @return {ol.layer.LayerState} Layer state. + */ +ol.layer.Base.prototype.getLayerState = function() { + var brightness = this.getBrightness(); + var contrast = this.getContrast(); + var hue = this.getHue(); + var opacity = this.getOpacity(); + var saturation = this.getSaturation(); + var sourceState = this.getSourceState(); + var visible = this.getVisible(); + var maxResolution = this.getMaxResolution(); + var minResolution = this.getMinResolution(); + return { + brightness: goog.isDef(brightness) ? goog.math.clamp(brightness, -1, 1) : 0, + contrast: goog.isDef(contrast) ? Math.max(contrast, 0) : 1, + hue: goog.isDef(hue) ? hue : 0, + opacity: goog.isDef(opacity) ? goog.math.clamp(opacity, 0, 1) : 1, + saturation: goog.isDef(saturation) ? Math.max(saturation, 0) : 1, + sourceState: sourceState, + visible: goog.isDef(visible) ? !!visible : true, + maxResolution: goog.isDef(maxResolution) ? maxResolution : Infinity, + minResolution: goog.isDef(minResolution) ? Math.max(minResolution, 0) : 0 + }; +}; + + +/** + * @param {Array.=} opt_array Array of layers (to be + * modified in place). + * @return {Array.} Array of layers. + */ +ol.layer.Base.prototype.getLayersArray = goog.abstractMethod; + + +/** + * @param {{ + * layers: Array., + * layerStates: Array.}=} opt_obj Object that store + * both the layers and the layerStates (to be modified in place). + * @return {{ + * layers: Array., + * layerStates: Array.}} Object that store both the + * layers and the layerStates. + */ +ol.layer.Base.prototype.getLayerStatesArray = goog.abstractMethod; + + +/** + * @return {number|undefined} MaxResolution. + */ +ol.layer.Base.prototype.getMaxResolution = function() { + return /** @type {number|undefined} */ ( + this.get(ol.layer.LayerProperty.MAX_RESOLUTION)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getMaxResolution', + ol.layer.Base.prototype.getMaxResolution); + + +/** + * @return {number|undefined} MinResolution. + */ +ol.layer.Base.prototype.getMinResolution = function() { + return /** @type {number|undefined} */ ( + this.get(ol.layer.LayerProperty.MIN_RESOLUTION)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getMinResolution', + ol.layer.Base.prototype.getMinResolution); + + +/** + * @return {number|undefined} Opacity. + */ +ol.layer.Base.prototype.getOpacity = function() { + return /** @type {number|undefined} */ ( + this.get(ol.layer.LayerProperty.OPACITY)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getOpacity', + ol.layer.Base.prototype.getOpacity); + + +/** + * @return {number|undefined} Saturation. + */ +ol.layer.Base.prototype.getSaturation = function() { + return /** @type {number|undefined} */ ( + this.get(ol.layer.LayerProperty.SATURATION)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getSaturation', + ol.layer.Base.prototype.getSaturation); + + +/** + * @return {ol.source.State} Source state. + */ +ol.layer.Base.prototype.getSourceState = goog.abstractMethod; + + +/** + * @return {boolean|undefined} Visible. + */ +ol.layer.Base.prototype.getVisible = function() { + return /** @type {boolean|undefined} */ ( + this.get(ol.layer.LayerProperty.VISIBLE)); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'getVisible', + ol.layer.Base.prototype.getVisible); + + +/** + * Adjust the layer brightness. A value of -1 will render the layer completely + * black. A value of 0 will leave the brightness unchanged. A value of 1 will + * render the layer completely white. Other values are linear multipliers on + * the effect (values are clamped between -1 and 1). + * + * The filter effects draft [1] says the brightness function is supposed to + * render 0 black, 1 unchanged, and all other values as a linear multiplier. + * + * The current WebKit implementation clamps values between -1 (black) and 1 + * (white) [2]. There is a bug open to change the filter effect spec [3]. + * + * TODO: revisit this if the spec is still unmodified before we release + * + * [1] https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html + * [2] https://github.com/WebKit/webkit/commit/8f4765e569 + * [3] https://www.w3.org/Bugs/Public/show_bug.cgi?id=15647 + * + * @param {number|undefined} brightness Brightness. + */ +ol.layer.Base.prototype.setBrightness = function(brightness) { + this.set(ol.layer.LayerProperty.BRIGHTNESS, brightness); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setBrightness', + ol.layer.Base.prototype.setBrightness); + + +/** + * Adjust the layer contrast. A value of 0 will render the layer completely + * grey. A value of 1 will leave the contrast unchanged. Other values are + * linear multipliers on the effect (and values over 1 are permitted). + * + * @param {number|undefined} contrast Contrast. + */ +ol.layer.Base.prototype.setContrast = function(contrast) { + this.set(ol.layer.LayerProperty.CONTRAST, contrast); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setContrast', + ol.layer.Base.prototype.setContrast); + + +/** + * Apply a hue-rotation to the layer. A value of 0 will leave the hue + * unchanged. Other values are radians around the color circle. + * @param {number|undefined} hue Hue. + */ +ol.layer.Base.prototype.setHue = function(hue) { + this.set(ol.layer.LayerProperty.HUE, hue); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setHue', + ol.layer.Base.prototype.setHue); + + +/** + * @param {number|undefined} maxResolution MaxResolution. + */ +ol.layer.Base.prototype.setMaxResolution = function(maxResolution) { + this.set(ol.layer.LayerProperty.MAX_RESOLUTION, maxResolution); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setMaxResolution', + ol.layer.Base.prototype.setMaxResolution); + + +/** + * @param {number|undefined} minResolution MinResolution. + */ +ol.layer.Base.prototype.setMinResolution = function(minResolution) { + this.set(ol.layer.LayerProperty.MIN_RESOLUTION, minResolution); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setMinResolution', + ol.layer.Base.prototype.setMinResolution); + + +/** + * @param {number|undefined} opacity Opacity. + */ +ol.layer.Base.prototype.setOpacity = function(opacity) { + this.set(ol.layer.LayerProperty.OPACITY, opacity); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setOpacity', + ol.layer.Base.prototype.setOpacity); + + +/** + * Adjust layer saturation. A value of 0 will render the layer completely + * unsaturated. A value of 1 will leave the saturation unchanged. Other + * values are linear multipliers of the effect (and values over 1 are + * permitted). + * + * @param {number|undefined} saturation Saturation. + */ +ol.layer.Base.prototype.setSaturation = function(saturation) { + this.set(ol.layer.LayerProperty.SATURATION, saturation); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setSaturation', + ol.layer.Base.prototype.setSaturation); + + +/** + * @param {boolean|undefined} visible Visible. + */ +ol.layer.Base.prototype.setVisible = function(visible) { + this.set(ol.layer.LayerProperty.VISIBLE, visible); +}; +goog.exportProperty( + ol.layer.Base.prototype, + 'setVisible', + ol.layer.Base.prototype.setVisible); diff --git a/float-no-zero/ol/ol/layer/layergroup.exports b/float-no-zero/ol/ol/layer/layergroup.exports new file mode 100644 index 0000000000..54bd439663 --- /dev/null +++ b/float-no-zero/ol/ol/layer/layergroup.exports @@ -0,0 +1 @@ +@exportSymbol ol.layer.Group diff --git a/float-no-zero/ol/ol/layer/layergroup.js b/float-no-zero/ol/ol/layer/layergroup.js new file mode 100644 index 0000000000..390cff2c0b --- /dev/null +++ b/float-no-zero/ol/ol/layer/layergroup.js @@ -0,0 +1,224 @@ +goog.provide('ol.layer.Group'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.math'); +goog.require('goog.object'); +goog.require('ol.Collection'); +goog.require('ol.CollectionEvent'); +goog.require('ol.CollectionEventType'); +goog.require('ol.Object'); +goog.require('ol.ObjectEventType'); +goog.require('ol.layer.Base'); +goog.require('ol.source.State'); + + +/** + * @enum {string} + */ +ol.layer.GroupProperty = { + LAYERS: 'layers' +}; + + + +/** + * @constructor + * @extends {ol.layer.Base} + * @param {olx.layer.GroupOptions=} opt_options Layer options. + * @todo stability experimental + * @todo observable layers {ol.Collection} collection of layers that are part + * of this group + */ +ol.layer.Group = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + var baseOptions = /** @type {olx.layer.GroupOptions} */ + (goog.object.clone(options)); + delete baseOptions.layers; + + var layers = options.layers; + + goog.base(this, baseOptions); + + /** + * @private + * @type {Object.} + */ + this.listenerKeys_ = null; + + goog.events.listen(this, + ol.Object.getChangeEventType(ol.layer.GroupProperty.LAYERS), + this.handleLayersChanged_, false, this); + + if (goog.isDef(layers)) { + if (goog.isArray(layers)) { + layers = new ol.Collection(goog.array.clone(layers)); + } else { + goog.asserts.assertInstanceof(layers, ol.Collection); + layers = layers; + } + } else { + layers = new ol.Collection(); + } + + this.setLayers(layers); + +}; +goog.inherits(ol.layer.Group, ol.layer.Base); + + +/** + * @private + */ +ol.layer.Group.prototype.handleLayerChange_ = function() { + if (this.getVisible()) { + this.dispatchChangeEvent(); + } +}; + + +/** + * @param {goog.events.Event} event Event. + * @private + */ +ol.layer.Group.prototype.handleLayersChanged_ = function(event) { + if (!goog.isNull(this.listenerKeys_)) { + goog.array.forEach( + goog.object.getValues(this.listenerKeys_), goog.events.unlistenByKey); + this.listenerKeys_ = null; + } + + var layers = this.getLayers(); + if (goog.isDefAndNotNull(layers)) { + this.listenerKeys_ = { + 'add': goog.events.listen(layers, ol.CollectionEventType.ADD, + this.handleLayersAdd_, false, this), + 'remove': goog.events.listen(layers, ol.CollectionEventType.REMOVE, + this.handleLayersRemove_, false, this) + }; + + var layersArray = layers.getArray(); + var i, ii, layer; + for (i = 0, ii = layersArray.length; i < ii; i++) { + layer = layersArray[i]; + this.listenerKeys_[goog.getUid(layer).toString()] = + goog.events.listen(layer, + [ol.ObjectEventType.PROPERTYCHANGE, goog.events.EventType.CHANGE], + this.handleLayerChange_, false, this); + } + } + + this.dispatchChangeEvent(); +}; + + +/** + * @param {ol.CollectionEvent} collectionEvent Collection event. + * @private + */ +ol.layer.Group.prototype.handleLayersAdd_ = function(collectionEvent) { + var layer = /** @type {ol.layer.Base} */ (collectionEvent.element); + this.listenerKeys_[goog.getUid(layer).toString()] = goog.events.listen( + layer, [ol.ObjectEventType.PROPERTYCHANGE, goog.events.EventType.CHANGE], + this.handleLayerChange_, false, this); + this.dispatchChangeEvent(); +}; + + +/** + * @param {ol.CollectionEvent} collectionEvent Collection event. + * @private + */ +ol.layer.Group.prototype.handleLayersRemove_ = function(collectionEvent) { + var layer = /** @type {ol.layer.Base} */ (collectionEvent.element); + var key = goog.getUid(layer).toString(); + goog.events.unlistenByKey(this.listenerKeys_[key]); + delete this.listenerKeys_[key]; + this.dispatchChangeEvent(); +}; + + +/** + * @return {ol.Collection|undefined} Collection of layers. + * @todo stability experimental + */ +ol.layer.Group.prototype.getLayers = function() { + return /** @type {ol.Collection|undefined} */ (this.get( + ol.layer.GroupProperty.LAYERS)); +}; +goog.exportProperty( + ol.layer.Group.prototype, + 'getLayers', + ol.layer.Group.prototype.getLayers); + + +/** + * @param {ol.Collection|undefined} layers Collection of layers. + * @todo stability experimental + */ +ol.layer.Group.prototype.setLayers = function(layers) { + this.set(ol.layer.GroupProperty.LAYERS, layers); +}; +goog.exportProperty( + ol.layer.Group.prototype, + 'setLayers', + ol.layer.Group.prototype.setLayers); + + +/** + * @inheritDoc + */ +ol.layer.Group.prototype.getLayersArray = function(opt_array) { + var array = (goog.isDef(opt_array)) ? opt_array : []; + this.getLayers().forEach(function(layer) { + layer.getLayersArray(array); + }); + return array; +}; + + +/** + * @inheritDoc + */ +ol.layer.Group.prototype.getLayerStatesArray = function(opt_obj) { + var obj = (goog.isDef(opt_obj)) ? opt_obj : { + layers: [], + layerStates: [] + }; + goog.asserts.assert(obj.layers.length === obj.layerStates.length); + var pos = obj.layers.length; + + this.getLayers().forEach(function(layer) { + layer.getLayerStatesArray(obj); + }); + + var ownLayerState = this.getLayerState(); + var i, ii, layerState; + for (i = pos, ii = obj.layerStates.length; i < ii; i++) { + layerState = obj.layerStates[i]; + layerState.brightness = goog.math.clamp( + layerState.brightness + ownLayerState.brightness, -1, 1); + layerState.contrast *= ownLayerState.contrast; + layerState.hue += ownLayerState.hue; + layerState.opacity *= ownLayerState.opacity; + layerState.saturation *= ownLayerState.saturation; + layerState.visible = layerState.visible && ownLayerState.visible; + layerState.maxResolution = Math.min( + layerState.maxResolution, ownLayerState.maxResolution); + layerState.minResolution = Math.max( + layerState.minResolution, ownLayerState.minResolution); + } + + return obj; +}; + + +/** + * @inheritDoc + */ +ol.layer.Group.prototype.getSourceState = function() { + return ol.source.State.READY; +}; diff --git a/float-no-zero/ol/ol/layer/tilelayer.exports b/float-no-zero/ol/ol/layer/tilelayer.exports new file mode 100644 index 0000000000..941be6ffc8 --- /dev/null +++ b/float-no-zero/ol/ol/layer/tilelayer.exports @@ -0,0 +1 @@ +@exportSymbol ol.layer.Tile diff --git a/float-no-zero/ol/ol/layer/tilelayer.js b/float-no-zero/ol/ol/layer/tilelayer.js new file mode 100644 index 0000000000..6f97bf72ce --- /dev/null +++ b/float-no-zero/ol/ol/layer/tilelayer.js @@ -0,0 +1,83 @@ +goog.provide('ol.layer.Tile'); + +goog.require('ol.layer.Layer'); + + +/** + * @enum {string} + */ +ol.layer.TileProperty = { + PRELOAD: 'preload', + USE_INTERIM_TILES_ON_ERROR: 'useInterimTilesOnError' +}; + + + +/** + * @constructor + * @extends {ol.layer.Layer} + * @param {olx.layer.TileOptions} options Tile layer options. + * @todo stability experimental + * @todo observable preload {number} the level to preload tiles up to + */ +ol.layer.Tile = function(options) { + goog.base(this, options); + +}; +goog.inherits(ol.layer.Tile, ol.layer.Layer); + + +/** + * @return {number|undefined} Preload. + * @todo stability experimental + */ +ol.layer.Tile.prototype.getPreload = function() { + return /** @type {number|undefined} */ ( + this.get(ol.layer.TileProperty.PRELOAD)); +}; +goog.exportProperty( + ol.layer.Tile.prototype, + 'getPreload', + ol.layer.Tile.prototype.getPreload); + + +/** + * @param {number} preload Preload. + * @todo stability experimental + */ +ol.layer.Tile.prototype.setPreload = function(preload) { + this.set(ol.layer.TileProperty.PRELOAD, preload); +}; +goog.exportProperty( + ol.layer.Tile.prototype, + 'setPreload', + ol.layer.Tile.prototype.setPreload); + + +/** + * @return {boolean|undefined} Use interim tiles on error. + * @todo stability experimental + */ +ol.layer.Tile.prototype.getUseInterimTilesOnError = function() { + return /** @type {boolean|undefined} */ ( + this.get(ol.layer.TileProperty.USE_INTERIM_TILES_ON_ERROR)); +}; +goog.exportProperty( + ol.layer.Tile.prototype, + 'getUseInterimTilesOnError', + ol.layer.Tile.prototype.getUseInterimTilesOnError); + + +/** + * @param {boolean|undefined} useInterimTilesOnError Use interim tiles on error. + * @todo stability experimental + */ +ol.layer.Tile.prototype.setUseInterimTilesOnError = + function(useInterimTilesOnError) { + this.set( + ol.layer.TileProperty.USE_INTERIM_TILES_ON_ERROR, useInterimTilesOnError); +}; +goog.exportProperty( + ol.layer.Tile.prototype, + 'setUseInterimTilesOnError', + ol.layer.Tile.prototype.setUseInterimTilesOnError); diff --git a/float-no-zero/ol/ol/layer/vectorlayer.exports b/float-no-zero/ol/ol/layer/vectorlayer.exports new file mode 100644 index 0000000000..be493b810d --- /dev/null +++ b/float-no-zero/ol/ol/layer/vectorlayer.exports @@ -0,0 +1,4 @@ +@exportSymbol ol.layer.Vector +@exportProperty ol.layer.Vector.prototype.getStyle +@exportProperty ol.layer.Vector.prototype.getStyleFunction +@exportProperty ol.layer.Vector.prototype.setStyle diff --git a/float-no-zero/ol/ol/layer/vectorlayer.js b/float-no-zero/ol/ol/layer/vectorlayer.js new file mode 100644 index 0000000000..9fe1f28092 --- /dev/null +++ b/float-no-zero/ol/ol/layer/vectorlayer.js @@ -0,0 +1,118 @@ +goog.provide('ol.layer.Vector'); + +goog.require('goog.object'); +goog.require('ol.feature'); +goog.require('ol.layer.Layer'); + + +/** + * @enum {string} + */ +ol.layer.VectorProperty = { + RENDER_GEOMETRY_FUNCTIONS: 'renderGeometryFunctions' +}; + + + +/** + * @constructor + * @extends {ol.layer.Layer} + * @param {olx.layer.VectorOptions=} opt_options Options. + * @todo stability experimental + */ +ol.layer.Vector = function(opt_options) { + + var options = goog.isDef(opt_options) ? + opt_options : /** @type {olx.layer.VectorOptions} */ ({}); + + var baseOptions = goog.object.clone(options); + + delete baseOptions.style; + goog.base(this, /** @type {olx.layer.LayerOptions} */ (baseOptions)); + + /** + * User provided style. + * @type {ol.style.Style|Array.|ol.feature.StyleFunction} + * @private + */ + this.style_ = null; + + /** + * Style function for use within the library. + * @type {ol.feature.StyleFunction|undefined} + * @private + */ + this.styleFunction_ = undefined; + + if (goog.isDef(options.style)) { + this.setStyle(options.style); + } + +}; +goog.inherits(ol.layer.Vector, ol.layer.Layer); + + +/** + * @return {ol.Collection|undefined} Render geometry functions. + * @todo stability experimental + */ +ol.layer.Vector.prototype.getRenderGeometryFunctions = function() { + return /** @type {ol.Collection|undefined} */ ( + this.get(ol.layer.VectorProperty.RENDER_GEOMETRY_FUNCTIONS)); +}; +goog.exportProperty( + ol.layer.Vector.prototype, + 'getRenderGeometryFunctions', + ol.layer.Vector.prototype.getRenderGeometryFunctions); + + +/** + * Get the style for features. This returns whatever was passed to the `style` + * option at construction or to the `setStyle` method. + * @return {ol.style.Style|Array.|ol.feature.StyleFunction} + * Layer style. + */ +ol.layer.Vector.prototype.getStyle = function() { + return this.style_; +}; + + +/** + * Get the style function. + * @return {ol.feature.StyleFunction|undefined} Layer style function. + * @todo stability experimental + */ +ol.layer.Vector.prototype.getStyleFunction = function() { + return this.styleFunction_; +}; + + +/** + * @param {ol.Collection|undefined} renderGeometryFunctions Render geometry + * functions. + * @todo stability experimental + */ +ol.layer.Vector.prototype.setRenderGeometryFunctions = + function(renderGeometryFunctions) { + this.set(ol.layer.VectorProperty.RENDER_GEOMETRY_FUNCTIONS, + renderGeometryFunctions); +}; +goog.exportProperty( + ol.layer.Vector.prototype, + 'setRenderGeometryFunctions', + ol.layer.Vector.prototype.setRenderGeometryFunctions); + + +/** + * Set the style for features. This can be a single style object, an array + * of styles, or a function that takes a feature and resolution and returns + * an array of styles. + * @param {ol.style.Style|Array.|ol.feature.StyleFunction} style + * Layer style. + * @todo stability experimental + */ +ol.layer.Vector.prototype.setStyle = function(style) { + this.style_ = style; + this.styleFunction_ = ol.feature.createStyleFunction(style); + this.dispatchChangeEvent(); +}; diff --git a/float-no-zero/ol/ol/map.exports b/float-no-zero/ol/ol/map.exports new file mode 100644 index 0000000000..53dcfd0a63 --- /dev/null +++ b/float-no-zero/ol/ol/map.exports @@ -0,0 +1,23 @@ +@exportSymbol ol.Map +@exportProperty ol.Map.prototype.addControl +@exportProperty ol.Map.prototype.addInteraction +@exportProperty ol.Map.prototype.addLayer +@exportProperty ol.Map.prototype.addOverlay +@exportProperty ol.Map.prototype.beforeRender +@exportProperty ol.Map.prototype.forEachFeatureAtPixel +@exportProperty ol.Map.prototype.getControls +@exportProperty ol.Map.prototype.getCoordinateFromPixel +@exportProperty ol.Map.prototype.getEventCoordinate +@exportProperty ol.Map.prototype.getEventPixel +@exportProperty ol.Map.prototype.getInteractions +@exportProperty ol.Map.prototype.getLayers +@exportProperty ol.Map.prototype.getOverlays +@exportProperty ol.Map.prototype.getPixelFromCoordinate +@exportProperty ol.Map.prototype.getViewport +@exportProperty ol.Map.prototype.removeControl +@exportProperty ol.Map.prototype.removeInteraction +@exportProperty ol.Map.prototype.removeLayer +@exportProperty ol.Map.prototype.removeOverlay +@exportProperty ol.Map.prototype.render +@exportProperty ol.Map.prototype.renderSync +@exportProperty ol.Map.prototype.updateSize diff --git a/float-no-zero/ol/ol/map.js b/float-no-zero/ol/ol/map.js new file mode 100644 index 0000000000..54829e887c --- /dev/null +++ b/float-no-zero/ol/ol/map.js @@ -0,0 +1,1472 @@ +// FIXME recheck layer/map projection compatability when projection changes +// FIXME layer renderers should skip when they can't reproject +// FIXME add tilt and height? + +goog.provide('ol.Map'); +goog.provide('ol.MapProperty'); +goog.provide('ol.RendererHint'); + +goog.require('goog.Uri.QueryData'); +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.async.AnimationDelay'); +goog.require('goog.async.nextTick'); +goog.require('goog.debug.Console'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.dom.ViewportSizeMonitor'); +goog.require('goog.events'); +goog.require('goog.events.BrowserEvent'); +goog.require('goog.events.Event'); +goog.require('goog.events.EventType'); +goog.require('goog.events.KeyHandler'); +goog.require('goog.events.KeyHandler.EventType'); +goog.require('goog.events.MouseWheelHandler'); +goog.require('goog.events.MouseWheelHandler.EventType'); +goog.require('goog.log'); +goog.require('goog.log.Level'); +goog.require('goog.object'); +goog.require('goog.style'); +goog.require('goog.vec.Mat4'); +goog.require('ol.BrowserFeature'); +goog.require('ol.Collection'); +goog.require('ol.CollectionEventType'); +goog.require('ol.FrameState'); +goog.require('ol.IView'); +goog.require('ol.MapBrowserEvent'); +goog.require('ol.MapBrowserEvent.EventType'); +goog.require('ol.MapBrowserEventHandler'); +goog.require('ol.MapEvent'); +goog.require('ol.MapEventType'); +goog.require('ol.Object'); +goog.require('ol.ObjectEvent'); +goog.require('ol.ObjectEventType'); +goog.require('ol.Pixel'); +goog.require('ol.PostRenderFunction'); +goog.require('ol.PreRenderFunction'); +goog.require('ol.Size'); +goog.require('ol.Tile'); +goog.require('ol.TileQueue'); +goog.require('ol.View'); +goog.require('ol.View2D'); +goog.require('ol.ViewHint'); +goog.require('ol.control'); +goog.require('ol.extent'); +goog.require('ol.interaction'); +goog.require('ol.layer.Base'); +goog.require('ol.layer.Group'); +goog.require('ol.proj'); +goog.require('ol.proj.common'); +goog.require('ol.renderer.Map'); +goog.require('ol.renderer.canvas.Map'); +goog.require('ol.renderer.dom.Map'); +goog.require('ol.renderer.webgl.Map'); +goog.require('ol.structs.PriorityQueue'); +goog.require('ol.vec.Mat4'); + + +/** + * @const + * @type {string} + */ +ol.OL3_URL = 'http://ol3js.org/'; + + +/** + * @const + * @type {string} + */ +ol.OL3_LOGO_URL = 'data:image/png;base64,' + + 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBI' + + 'WXMAAAHGAAABxgEXwfpGAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAA' + + 'AhNQTFRF////AP//AICAgP//AFVVQECA////K1VVSbbbYL/fJ05idsTYJFtbbcjbJllmZszW' + + 'WMTOIFhoHlNiZszTa9DdUcHNHlNlV8XRIVdiasrUHlZjIVZjaMnVH1RlIFRkH1RkH1ZlasvY' + + 'asvXVsPQH1VkacnVa8vWIVZjIFRjVMPQa8rXIVVkXsXRsNveIFVkIFZlIVVj3eDeh6GmbMvX' + + 'H1ZkIFRka8rWbMvXIFVkIFVjIFVkbMvWH1VjbMvWIFVlbcvWIFVla8vVIFVkbMvWbMvVH1Vk' + + 'bMvWIFVlbcvWIFVkbcvVbMvWjNPbIFVkU8LPwMzNIFVkbczWIFVkbsvWbMvXIFVkRnB8bcvW' + + '2+TkW8XRIFVkIlZlJVloJlpoKlxrLl9tMmJwOWd0Omh1RXF8TneCT3iDUHiDU8LPVMLPVcLP' + + 'VcPQVsPPVsPQV8PQWMTQWsTQW8TQXMXSXsXRX4SNX8bSYMfTYcfTYsfTY8jUZcfSZsnUaIqT' + + 'acrVasrVa8jTa8rWbI2VbMvWbcvWdJObdcvUdszUd8vVeJaee87Yfc3WgJyjhqGnitDYjaar' + + 'ldPZnrK2oNbborW5o9bbo9fbpLa6q9ndrL3ArtndscDDutzfu8fJwN7gwt7gxc/QyuHhy+Hi' + + 'zeHi0NfX0+Pj19zb1+Tj2uXk29/e3uLg3+Lh3+bl4uXj4ufl4+fl5Ofl5ufl5ujm5+jmySDn' + + 'BAAAAFp0Uk5TAAECAgMEBAYHCA0NDg4UGRogIiMmKSssLzU7PkJJT1JTVFliY2hrdHZ3foSF' + + 'hYeJjY2QkpugqbG1tre5w8zQ09XY3uXn6+zx8vT09vf4+Pj5+fr6/P39/f3+gz7SsAAAAVVJ' + + 'REFUOMtjYKA7EBDnwCPLrObS1BRiLoJLnte6CQy8FLHLCzs2QUG4FjZ5GbcmBDDjxJBXDWxC' + + 'Brb8aM4zbkIDzpLYnAcE9VXlJSWlZRU13koIeW57mGx5XjoMZEUqwxWYQaQbSzLSkYGfKFSe' + + '0QMsX5WbjgY0YS4MBplemI4BdGBW+DQ11eZiymfqQuXZIjqwyadPNoSZ4L+0FVM6e+oGI6g8' + + 'a9iKNT3o8kVzNkzRg5lgl7p4wyRUL9Yt2jAxVh6mQCogae6GmflI8p0r13VFWTHBQ0rWPW7a' + + 'hgWVcPm+9cuLoyy4kCJDzCm6d8PSFoh0zvQNC5OjDJhQopPPJqph1doJBUD5tnkbZiUEqaCn' + + 'B3bTqLTFG1bPn71kw4b+GFdpLElKIzRxxgYgWNYc5SCENVHKeUaltHdXx0dZ8uBI1hJ2UUDg' + + 'q82CM2MwKeibqAvSO7MCABq0wXEPiqWEAAAAAElFTkSuQmCC'; + + +/** + * @enum {string} + * @todo stability experimental + */ +ol.RendererHint = { + CANVAS: 'canvas', + DOM: 'dom', + WEBGL: 'webgl' +}; + + +/** + * @type {Array.} + */ +ol.DEFAULT_RENDERER_HINTS = [ + ol.RendererHint.WEBGL, + ol.RendererHint.CANVAS, + ol.RendererHint.DOM +]; + + +/** + * @enum {string} + */ +ol.MapProperty = { + LAYERGROUP: 'layergroup', + SIZE: 'size', + TARGET: 'target', + VIEW: 'view' +}; + + + +/** + * @class + * The map is the core component of OpenLayers. In its minimal configuration it + * needs a view, one or more layers, and a target container: + * + * var map = new ol.Map({ + * view: new ol.View2D({ + * center: [0, 0], + * zoom: 1 + * }), + * layers: [ + * new ol.layer.Tile({ + * source: new ol.source.MapQuestOSM() + * }) + * ], + * target: 'map' + * }); + * + * The above snippet creates a map with a MapQuest OSM layer on a 2D view and + * renders it to a DOM element with the id `map`. + * + * @constructor + * @extends {ol.Object} + * @param {olx.MapOptions} options Map options. + * @todo stability experimental + * @todo observable layergroup {ol.layer.LayerGroup} a layer group containing + * the layers in this map. + * @todo observable size {ol.Size} the size in pixels of the map in the DOM + * @todo observable target {string|Element} the Element or id of the Element + * that the map is rendered in. + * @todo observable view {ol.IView} the view that controls this map + */ +ol.Map = function(options) { + + goog.base(this); + + var optionsInternal = ol.Map.createOptionsInternal(options); + + /** + * @private + * @type {number} + */ + this.pixelRatio_ = goog.isDef(options.pixelRatio) ? + options.pixelRatio : ol.BrowserFeature.DEVICE_PIXEL_RATIO; + + /** + * @private + * @type {boolean} + */ + this.ol3Logo_ = optionsInternal.ol3Logo; + + /** + * @private + * @type {goog.async.AnimationDelay} + */ + this.animationDelay_ = + new goog.async.AnimationDelay(this.renderFrame_, undefined, this); + this.registerDisposable(this.animationDelay_); + + /** + * @private + * @type {goog.vec.Mat4.Number} + */ + this.coordinateToPixelMatrix_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {goog.vec.Mat4.Number} + */ + this.pixelToCoordinateMatrix_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {number} + */ + this.frameIndex_ = 0; + + /** + * @private + * @type {?ol.FrameState} + */ + this.frameState_ = null; + + /** + * @private + * @type {goog.events.Key} + */ + this.viewPropertyListenerKey_ = null; + + /** + * @private + * @type {Array.} + */ + this.layerGroupPropertyListenerKeys_ = null; + + /** + * @private + * @type {Element} + */ + this.viewport_ = goog.dom.createDom(goog.dom.TagName.DIV, 'ol-viewport'); + this.viewport_.style.position = 'relative'; + this.viewport_.style.overflow = 'hidden'; + this.viewport_.style.width = '100%'; + this.viewport_.style.height = '100%'; + // prevent page zoom on IE >= 10 browsers + this.viewport_.style.msTouchAction = 'none'; + if (ol.BrowserFeature.HAS_TOUCH) { + this.viewport_.className = 'ol-touch'; + } + + /** + * @private + * @type {Element} + */ + this.overlayContainer_ = goog.dom.createDom(goog.dom.TagName.DIV, + 'ol-overlaycontainer'); + goog.dom.appendChild(this.viewport_, this.overlayContainer_); + + /** + * @private + * @type {Element} + */ + this.overlayContainerStopEvent_ = goog.dom.createDom(goog.dom.TagName.DIV, + 'ol-overlaycontainer-stopevent'); + goog.events.listen(this.overlayContainerStopEvent_, [ + goog.events.EventType.CLICK, + goog.events.EventType.DBLCLICK, + goog.events.EventType.MOUSEDOWN, + goog.events.EventType.TOUCHSTART, + goog.events.EventType.MSPOINTERDOWN + ], goog.events.Event.stopPropagation); + goog.dom.appendChild(this.viewport_, this.overlayContainerStopEvent_); + + var mapBrowserEventHandler = new ol.MapBrowserEventHandler(this); + goog.events.listen(mapBrowserEventHandler, + goog.object.getValues(ol.MapBrowserEvent.EventType), + this.handleMapBrowserEvent, false, this); + this.registerDisposable(mapBrowserEventHandler); + + /** + * @private + * @type {Element|Document} + */ + this.keyboardEventTarget_ = optionsInternal.keyboardEventTarget; + + /** + * @private + * @type {goog.events.KeyHandler} + */ + this.keyHandler_ = new goog.events.KeyHandler(); + goog.events.listen(this.keyHandler_, goog.events.KeyHandler.EventType.KEY, + this.handleBrowserEvent, false, this); + this.registerDisposable(this.keyHandler_); + + var mouseWheelHandler = new goog.events.MouseWheelHandler(this.viewport_); + goog.events.listen(mouseWheelHandler, + goog.events.MouseWheelHandler.EventType.MOUSEWHEEL, + this.handleBrowserEvent, false, this); + this.registerDisposable(mouseWheelHandler); + + /** + * @type {ol.Collection} + * @private + */ + this.controls_ = optionsInternal.controls; + + /** + * @type {olx.DeviceOptions} + * @private + */ + this.deviceOptions_ = optionsInternal.deviceOptions; + + /** + * @type {ol.Collection} + * @private + */ + this.interactions_ = optionsInternal.interactions; + + /** + * @type {ol.Collection} + * @private + */ + this.overlays_ = optionsInternal.overlays; + + /** + * @type {ol.renderer.Map} + * @private + */ + this.renderer_ = + new optionsInternal.rendererConstructor(this.viewport_, this); + this.registerDisposable(this.renderer_); + + /** + * @private + */ + this.viewportSizeMonitor_ = new goog.dom.ViewportSizeMonitor(); + + goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE, + this.updateSize, false, this); + + /** + * @private + * @type {ol.Coordinate} + */ + this.focus_ = null; + + /** + * @private + * @type {Array.} + */ + this.preRenderFunctions_ = []; + + /** + * @private + * @type {Array.} + */ + this.postRenderFunctions_ = []; + + /** + * @private + * @type {ol.TileQueue} + */ + this.tileQueue_ = new ol.TileQueue( + goog.bind(this.getTilePriority, this), + goog.bind(this.handleTileChange_, this)); + + goog.events.listen( + this, ol.Object.getChangeEventType(ol.MapProperty.LAYERGROUP), + this.handleLayerGroupChanged_, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.VIEW), + this.handleViewChanged_, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.SIZE), + this.handleSizeChanged_, false, this); + goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.TARGET), + this.handleTargetChanged_, false, this); + + // setValues will trigger the rendering of the map if the map + // is "defined" already. + this.setValues(optionsInternal.values); + + this.controls_.forEach( + /** + * @param {ol.control.Control} control Control. + * @this {ol.Map} + */ + function(control) { + control.setMap(this); + }, this); + + goog.events.listen(this.controls_, ol.CollectionEventType.ADD, + /** + * @param {ol.CollectionEvent} event Collection event. + */ + function(event) { + event.element.setMap(this); + }, false, this); + + goog.events.listen(this.controls_, ol.CollectionEventType.REMOVE, + /** + * @param {ol.CollectionEvent} event Collection event. + */ + function(event) { + event.element.setMap(null); + }, false, this); + + this.interactions_.forEach( + /** + * @param {ol.interaction.Interaction} interaction Interaction. + * @this {ol.Map} + */ + function(interaction) { + interaction.setMap(this); + }, this); + + goog.events.listen(this.interactions_, ol.CollectionEventType.ADD, + /** + * @param {ol.CollectionEvent} event Collection event. + */ + function(event) { + event.element.setMap(this); + }, false, this); + + goog.events.listen(this.interactions_, ol.CollectionEventType.REMOVE, + /** + * @param {ol.CollectionEvent} event Collection event. + */ + function(event) { + event.element.setMap(null); + }, false, this); + + this.overlays_.forEach( + /** + * @param {ol.Overlay} overlay Overlay. + * @this {ol.Map} + */ + function(overlay) { + overlay.setMap(this); + }, this); + + goog.events.listen(this.overlays_, ol.CollectionEventType.ADD, + /** + * @param {ol.CollectionEvent} event Collection event. + */ + function(event) { + event.element.setMap(this); + }, false, this); + + goog.events.listen(this.overlays_, ol.CollectionEventType.REMOVE, + /** + * @param {ol.CollectionEvent} event Collection event. + */ + function(event) { + event.element.setMap(null); + }, false, this); + +}; +goog.inherits(ol.Map, ol.Object); + + +/** + * Add the given control to the map. + * @param {ol.control.Control} control Control. + * @todo stability experimental + */ +ol.Map.prototype.addControl = function(control) { + var controls = this.getControls(); + goog.asserts.assert(goog.isDef(controls)); + controls.push(control); +}; + + +/** + * Add the given interaction to the map. + * @param {ol.interaction.Interaction} interaction Interaction to add. + */ +ol.Map.prototype.addInteraction = function(interaction) { + var interactions = this.getInteractions(); + goog.asserts.assert(goog.isDef(interactions)); + interactions.push(interaction); +}; + + +/** + * Adds the given layer to the top of this map. + * @param {ol.layer.Base} layer Layer. + * @todo stability experimental + */ +ol.Map.prototype.addLayer = function(layer) { + var layers = this.getLayerGroup().getLayers(); + goog.asserts.assert(goog.isDef(layers)); + layers.push(layer); +}; + + +/** + * Add the given overlay to the map. + * @param {ol.Overlay} overlay Overlay. + * @todo stability experimental + */ +ol.Map.prototype.addOverlay = function(overlay) { + var overlays = this.getOverlays(); + goog.asserts.assert(goog.isDef(overlays)); + overlays.push(overlay); +}; + + +/** + * Add functions to be called before rendering. This can be used for attaching + * animations before updating the map's view. The {@link ol.animation} + * namespace provides several static methods for creating prerender functions. + * @param {...ol.PreRenderFunction} var_args Any number of pre-render functions. + * @todo stability experimental + */ +ol.Map.prototype.beforeRender = function(var_args) { + this.render(); + Array.prototype.push.apply(this.preRenderFunctions_, arguments); +}; + + +/** + * @param {ol.PreRenderFunction} preRenderFunction Pre-render function. + * @return {boolean} Whether the preRenderFunction has been found and removed. + */ +ol.Map.prototype.removePreRenderFunction = function(preRenderFunction) { + return goog.array.remove(this.preRenderFunctions_, preRenderFunction); +}; + + +/** + * + * @inheritDoc + */ +ol.Map.prototype.disposeInternal = function() { + goog.dom.removeNode(this.viewport_); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @param {ol.Pixel} pixel Pixel. + * @param {function(this: S, ol.Feature, ol.layer.Layer): T} callback Feature + * callback. + * @param {S=} opt_this Value to use as `this` when executing `callback`. + * @param {function(this: U, ol.layer.Layer): boolean=} opt_layerFilter Layer + * filter function, only layers which are visible and for which this + * function returns `true` will be tested for features. By default, all + * visible layers will be tested. + * @param {U=} opt_this2 Value to use as `this` when executing `layerFilter`. + * @return {T|undefined} Callback result. + * @template S,T,U + */ +ol.Map.prototype.forEachFeatureAtPixel = + function(pixel, callback, opt_this, opt_layerFilter, opt_this2) { + if (goog.isNull(this.frameState_)) { + return; + } + var coordinate = this.getCoordinateFromPixel(pixel); + var thisArg = goog.isDef(opt_this) ? opt_this : null; + var layerFilter = goog.isDef(opt_layerFilter) ? + opt_layerFilter : goog.functions.TRUE; + var thisArg2 = goog.isDef(opt_this2) ? opt_this2 : null; + return this.renderer_.forEachFeatureAtPixel( + coordinate, this.frameState_, callback, thisArg, + layerFilter, thisArg2); +}; + + +/** + * Returns the geographical coordinate for a browser event. + * @param {Event} event Event. + * @return {ol.Coordinate} Coordinate. + * @todo stability experimental + */ +ol.Map.prototype.getEventCoordinate = function(event) { + return this.getCoordinateFromPixel(this.getEventPixel(event)); +}; + + +/** + * Returns the map pixel position for a browser event. + * @param {Event} event Event. + * @return {ol.Pixel} Pixel. + * @todo stability experimental + */ +ol.Map.prototype.getEventPixel = function(event) { + // goog.style.getRelativePosition is based on event.targetTouches, + // but touchend and touchcancel events have no targetTouches when + // the last finger is removed from the screen. + // So we ourselves compute the position of touch events. + // See https://code.google.com/p/closure-library/issues/detail?id=588 + if (goog.isDef(event.changedTouches)) { + var touch = event.changedTouches.item(0); + var viewportPosition = goog.style.getClientPosition(this.viewport_); + return [ + touch.clientX - viewportPosition.x, + touch.clientY - viewportPosition.y + ]; + } else { + var eventPosition = goog.style.getRelativePosition(event, this.viewport_); + return [eventPosition.x, eventPosition.y]; + } +}; + + +/** + * Get the target in which this map is rendered. + * Note that this returns what is entered as an option or in setTarget: + * if that was an element, it returns an element; if a string, it returns that. + * @return {Element|string|undefined} Target. + * @todo stability experimental + */ +ol.Map.prototype.getTarget = function() { + return /** @type {Element|string|undefined} */ ( + this.get(ol.MapProperty.TARGET)); +}; +goog.exportProperty( + ol.Map.prototype, + 'getTarget', + ol.Map.prototype.getTarget); + + +/** + * @param {ol.Pixel} pixel Pixel. + * @return {ol.Coordinate} Coordinate. + */ +ol.Map.prototype.getCoordinateFromPixel = function(pixel) { + var frameState = this.frameState_; + if (goog.isNull(frameState)) { + return null; + } else { + var vec2 = pixel.slice(); + return ol.vec.Mat4.multVec2(frameState.pixelToCoordinateMatrix, vec2, vec2); + } +}; + + +/** + * @return {ol.Collection} Controls. + * @todo stability experimental + */ +ol.Map.prototype.getControls = function() { + return this.controls_; +}; + + +/** + * @return {ol.Collection} Overlays. + * @todo stability experimental + */ +ol.Map.prototype.getOverlays = function() { + return this.overlays_; +}; + + +/** + * Gets the collection of + * {@link ol.interaction|ol.interaction.Interaction} instances + * associated with this map. Modifying this collection + * changes the interactions associated with the map. + * + * Interactions are used for e.g. pan, zoom and rotate. + * @return {ol.Collection} Interactions. + * @todo stability experimental + */ +ol.Map.prototype.getInteractions = function() { + return this.interactions_; +}; + + +/** + * Get the layergroup associated with this map. + * @return {ol.layer.Group} LayerGroup. + * @todo stability experimental + */ +ol.Map.prototype.getLayerGroup = function() { + return /** @type {ol.layer.Group} */ ( + this.get(ol.MapProperty.LAYERGROUP)); +}; +goog.exportProperty( + ol.Map.prototype, + 'getLayerGroup', + ol.Map.prototype.getLayerGroup); + + +/** + * Get the collection of layers associated with this map. + * @return {ol.Collection|undefined} Layers. + * @todo stability experimental + */ +ol.Map.prototype.getLayers = function() { + var layerGroup = this.getLayerGroup(); + if (goog.isDef(layerGroup)) { + return layerGroup.getLayers(); + } else { + return undefined; + } +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol.Pixel} Pixel. + */ +ol.Map.prototype.getPixelFromCoordinate = function(coordinate) { + var frameState = this.frameState_; + if (goog.isNull(frameState)) { + return null; + } else { + var vec2 = coordinate.slice(0, 2); + return ol.vec.Mat4.multVec2(frameState.coordinateToPixelMatrix, vec2, vec2); + } +}; + + +/** + * Get the size of this map. + * @return {ol.Size|undefined} Size. + * @todo stability experimental + */ +ol.Map.prototype.getSize = function() { + return /** @type {ol.Size|undefined} */ (this.get(ol.MapProperty.SIZE)); +}; +goog.exportProperty( + ol.Map.prototype, + 'getSize', + ol.Map.prototype.getSize); + + +/** + * Get the view associated with this map. This can be a 2D or 3D view. A 2D + * view manages properties such as center and resolution. + * @return {ol.View|undefined} View. + * @todo stability experimental + */ +ol.Map.prototype.getView = function() { + return /** @type {ol.View} */ (this.get(ol.MapProperty.VIEW)); +}; +goog.exportProperty( + ol.Map.prototype, + 'getView', + ol.Map.prototype.getView); + + +/** + * @return {Element} Viewport. + * @todo stability experimental + */ +ol.Map.prototype.getViewport = function() { + return this.viewport_; +}; + + +/** + * @return {Element} The map's overlay container. Elements added to this + * container will let mousedown and touchstart events through to the map, so + * clicks and gestures on an overlay will trigger MapBrowserEvent events. + */ +ol.Map.prototype.getOverlayContainer = function() { + return this.overlayContainer_; +}; + + +/** + * @return {Element} The map's overlay container. Elements added to this + * container won't let mousedown and touchstart events through to the map, so + * clicks and gestures on an overlay don't trigger any MapBrowserEvent. + */ +ol.Map.prototype.getOverlayContainerStopEvent = function() { + return this.overlayContainerStopEvent_; +}; + + +/** + * @param {ol.Tile} tile Tile. + * @param {string} tileSourceKey Tile source key. + * @param {ol.Coordinate} tileCenter Tile center. + * @param {number} tileResolution Tile resolution. + * @return {number} Tile priority. + */ +ol.Map.prototype.getTilePriority = + function(tile, tileSourceKey, tileCenter, tileResolution) { + // Filter out tiles at higher zoom levels than the current zoom level, or that + // are outside the visible extent. + var frameState = this.frameState_; + if (goog.isNull(frameState) || !(tileSourceKey in frameState.wantedTiles)) { + return ol.structs.PriorityQueue.DROP; + } + var coordKey = tile.tileCoord.toString(); + if (!frameState.wantedTiles[tileSourceKey][coordKey]) { + return ol.structs.PriorityQueue.DROP; + } + // Prioritize the highest zoom level tiles closest to the focus. + // Tiles at higher zoom levels are prioritized using Math.log(tileResolution). + // Within a zoom level, tiles are prioritized by the distance in pixels + // between the center of the tile and the focus. The factor of 65536 means + // that the prioritization should behave as desired for tiles up to + // 65536 * Math.log(2) = 45426 pixels from the focus. + var deltaX = tileCenter[0] - frameState.focus[0]; + var deltaY = tileCenter[1] - frameState.focus[1]; + return 65536 * Math.log(tileResolution) + + Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution; +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @param {string=} opt_type Type. + */ +ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) { + var type = opt_type || browserEvent.type; + var mapBrowserEvent = new ol.MapBrowserEvent(type, this, browserEvent); + this.handleMapBrowserEvent(mapBrowserEvent); +}; + + +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent The event to handle. + */ +ol.Map.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + if (goog.isNull(this.frameState_)) { + // With no view defined, we cannot translate pixels into geographical + // coordinates so interactions cannot be used. + return; + } + this.focus_ = mapBrowserEvent.coordinate; + mapBrowserEvent.frameState = this.frameState_; + var interactions = this.getInteractions(); + var interactionsArray = /** @type {Array.} */ + (interactions.getArray()); + var i; + if (this.dispatchEvent(mapBrowserEvent) !== false) { + for (i = interactionsArray.length - 1; i >= 0; i--) { + var interaction = interactionsArray[i]; + var cont = interaction.handleMapBrowserEvent(mapBrowserEvent); + if (!cont) { + break; + } + } + } +}; + + +/** + * @protected + */ +ol.Map.prototype.handlePostRender = function() { + + var frameState = this.frameState_; + + // Manage the tile queue + // Image loads are expensive and a limited resource, so try to use them + // efficiently: + // * When the view is static we allow a large number of parallel tile loads + // to complete the frame as quickly as possible. + // * When animating or interacting, image loads can cause janks, so we reduce + // the maximum number of loads per frame and limit the number of parallel + // tile loads to remain reactive to view changes and to reduce the chance of + // loading tiles that will quickly disappear from view. + var tileQueue = this.tileQueue_; + if (!tileQueue.isEmpty()) { + var maxTotalLoading = 16; + var maxNewLoads = maxTotalLoading; + var tileSourceCount = 0; + if (!goog.isNull(frameState)) { + var hints = frameState.viewHints; + var deviceOptions = this.deviceOptions_; + if (hints[ol.ViewHint.ANIMATING]) { + maxTotalLoading = deviceOptions.loadTilesWhileAnimating === false ? + 0 : 8; + maxNewLoads = 2; + } + if (hints[ol.ViewHint.INTERACTING]) { + maxTotalLoading = deviceOptions.loadTilesWhileInteracting === false ? + 0 : 8; + maxNewLoads = 2; + } + tileSourceCount = goog.object.getCount(frameState.wantedTiles); + } + maxTotalLoading *= tileSourceCount; + maxNewLoads *= tileSourceCount; + if (tileQueue.getTilesLoading() < maxTotalLoading) { + tileQueue.reprioritize(); // FIXME only call if view has changed + tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads); + } + } + + var postRenderFunctions = this.postRenderFunctions_; + var i, ii; + for (i = 0, ii = postRenderFunctions.length; i < ii; ++i) { + postRenderFunctions[i](this, frameState); + } + postRenderFunctions.length = 0; +}; + + +/** + * @private + */ +ol.Map.prototype.handleSizeChanged_ = function() { + this.render(); +}; + + +/** + * @private + */ +ol.Map.prototype.handleTargetChanged_ = function() { + // target may be undefined, null, a string or an Element. + // If it's a string we convert it to an Element before proceeding. + // If it's not now an Element we remove the viewport from the DOM. + // If it's an Element we append the viewport element to it. + + var target = this.getTarget(); + + /** + * @type {Element} + */ + var targetElement = goog.isDef(target) ? + goog.dom.getElement(target) : null; + + this.keyHandler_.detach(); + + if (goog.isNull(targetElement)) { + goog.dom.removeNode(this.viewport_); + } else { + goog.dom.appendChild(targetElement, this.viewport_); + + var keyboardEventTarget = goog.isNull(this.keyboardEventTarget_) ? + targetElement : this.keyboardEventTarget_; + this.keyHandler_.attach(keyboardEventTarget); + } + + this.updateSize(); + // updateSize calls setSize, so no need to call this.render + // ourselves here. +}; + + +/** + * @private + */ +ol.Map.prototype.handleTileChange_ = function() { + this.render(); +}; + + +/** + * @private + */ +ol.Map.prototype.handleViewPropertyChanged_ = function() { + this.render(); +}; + + +/** + * @private + */ +ol.Map.prototype.handleViewChanged_ = function() { + if (!goog.isNull(this.viewPropertyListenerKey_)) { + goog.events.unlistenByKey(this.viewPropertyListenerKey_); + this.viewPropertyListenerKey_ = null; + } + var view = this.getView(); + if (goog.isDefAndNotNull(view)) { + this.viewPropertyListenerKey_ = goog.events.listen( + view, ol.ObjectEventType.PROPERTYCHANGE, + this.handleViewPropertyChanged_, false, this); + } + this.render(); +}; + + +/** + * @param {goog.events.Event} event Event. + * @private + */ +ol.Map.prototype.handleLayerGroupMemberChanged_ = function(event) { + goog.asserts.assertInstanceof(event, goog.events.Event); + this.render(); +}; + + +/** + * @param {ol.ObjectEvent} event Event. + * @private + */ +ol.Map.prototype.handleLayerGroupPropertyChanged_ = function(event) { + goog.asserts.assertInstanceof(event, ol.ObjectEvent); + this.render(); +}; + + +/** + * @private + */ +ol.Map.prototype.handleLayerGroupChanged_ = function() { + if (!goog.isNull(this.layerGroupPropertyListenerKeys_)) { + var length = this.layerGroupPropertyListenerKeys_.length; + for (var i = 0; i < length; ++i) { + goog.events.unlistenByKey(this.layerGroupPropertyListenerKeys_[i]); + } + this.layerGroupPropertyListenerKeys_ = null; + } + var layerGroup = this.getLayerGroup(); + if (goog.isDefAndNotNull(layerGroup)) { + this.layerGroupPropertyListenerKeys_ = [ + goog.events.listen( + layerGroup, ol.ObjectEventType.PROPERTYCHANGE, + this.handleLayerGroupPropertyChanged_, false, this), + goog.events.listen( + layerGroup, goog.events.EventType.CHANGE, + this.handleLayerGroupMemberChanged_, false, this) + ]; + } + this.render(); +}; + + +/** + * Returns `true` if the map is defined, `false` otherwise. The map is defined + * if it is contained in `document`, visible, has non-zero height and width, and + * has a defined view. + * @return {boolean} Is defined. + */ +ol.Map.prototype.isDef = function() { + if (!goog.dom.contains(document, this.viewport_)) { + return false; + } + if (!goog.style.isElementShown(this.viewport_)) { + return false; + } + var size = this.getSize(); + if (!goog.isDefAndNotNull(size) || size[0] <= 0 || size[1] <= 0) { + return false; + } + var view = this.getView(); + if (!goog.isDef(view) || !view.isDef()) { + return false; + } + return true; +}; + + +/** + * @return {boolean} Is rendered. + */ +ol.Map.prototype.isRendered = function() { + return !goog.isNull(this.frameState_); +}; + + +/** + * Render. + */ +ol.Map.prototype.renderSync = function() { + this.animationDelay_.fire(); +}; + + +/** + * Request that renderFrame_ be called some time in the future. + */ +ol.Map.prototype.render = function() { + if (!this.animationDelay_.isActive()) { + this.animationDelay_.start(); + } +}; + + +/** + * Remove the given control from the map. + * @param {ol.control.Control} control Control. + * @return {ol.control.Control|undefined} The removed control of undefined + * if the control was not found. + * @todo stability experimental + */ +ol.Map.prototype.removeControl = function(control) { + var controls = this.getControls(); + goog.asserts.assert(goog.isDef(controls)); + if (goog.isDef(controls.remove(control))) { + return control; + } + return undefined; +}; + + +/** + * Remove the given interaction from the map. + * @param {ol.interaction.Interaction} interaction Interaction to remove. + * @return {ol.interaction.Interaction|undefined} The removed interaction (or + * undefined if the interaction was not found). + */ +ol.Map.prototype.removeInteraction = function(interaction) { + var removed; + var interactions = this.getInteractions(); + goog.asserts.assert(goog.isDef(interactions)); + if (goog.isDef(interactions.remove(interaction))) { + removed = interaction; + } + return removed; +}; + + +/** + * Removes the given layer from the map. + * @param {ol.layer.Base} layer Layer. + * @return {ol.layer.Base|undefined} The removed layer or undefined if the + * layer was not found. + * @todo stability experimental + */ +ol.Map.prototype.removeLayer = function(layer) { + var layers = this.getLayerGroup().getLayers(); + goog.asserts.assert(goog.isDef(layers)); + return /** @type {ol.layer.Base|undefined} */ (layers.remove(layer)); +}; + + +/** + * Remove the given overlay from the map. + * @param {ol.Overlay} overlay Overlay. + * @return {ol.Overlay|undefined} The removed overlay of undefined + * if the overlay was not found. + * @todo stability experimental + */ +ol.Map.prototype.removeOverlay = function(overlay) { + var overlays = this.getOverlays(); + goog.asserts.assert(goog.isDef(overlays)); + if (goog.isDef(overlays.remove(overlay))) { + return overlay; + } + return undefined; +}; + + +/** + * @param {number} time Time. + * @private + */ +ol.Map.prototype.renderFrame_ = function(time) { + + var i, ii, view2DState; + + /** + * Check whether a size has non-zero width and height. Note that this + * function is here because the compiler doesn't recognize that size is + * defined in the frameState assignment below when the same code is inline in + * the condition below. The compiler inlines this function itself, so the + * resulting code is the same. + * + * @param {ol.Size} size The size to test. + * @return {boolean} Has non-zero width and height. + */ + function hasArea(size) { + return size[0] > 0 && size[1] > 0; + } + + var size = this.getSize(); + var view = this.getView(); + var view2D = goog.isDef(view) ? this.getView().getView2D() : undefined; + /** @type {?ol.FrameState} */ + var frameState = null; + if (goog.isDef(size) && hasArea(size) && + goog.isDef(view2D) && view2D.isDef()) { + var viewHints = view.getHints(); + var obj = this.getLayerGroup().getLayerStatesArray(); + var layersArray = obj.layers; + var layerStatesArray = obj.layerStates; + var layerStates = {}; + var layer; + for (i = 0, ii = layersArray.length; i < ii; ++i) { + layer = layersArray[i]; + layerStates[goog.getUid(layer)] = layerStatesArray[i]; + } + view2DState = view2D.getView2DState(); + frameState = { + animate: false, + attributions: {}, + coordinateToPixelMatrix: this.coordinateToPixelMatrix_, + extent: null, + focus: goog.isNull(this.focus_) ? view2DState.center : this.focus_, + index: this.frameIndex_++, + layersArray: layersArray, + layerStates: layerStates, + logos: {}, + pixelRatio: this.pixelRatio_, + pixelToCoordinateMatrix: this.pixelToCoordinateMatrix_, + postRenderFunctions: [], + size: size, + tileQueue: this.tileQueue_, + time: time, + usedTiles: {}, + view2DState: view2DState, + viewHints: viewHints, + wantedTiles: {} + }; + if (this.ol3Logo_) { + frameState.logos[ol.OL3_LOGO_URL] = ol.OL3_URL; + } + } + + var preRenderFunctions = this.preRenderFunctions_; + var n = 0, preRenderFunction; + for (i = 0, ii = preRenderFunctions.length; i < ii; ++i) { + preRenderFunction = preRenderFunctions[i]; + if (preRenderFunction(this, frameState)) { + preRenderFunctions[n++] = preRenderFunction; + } + } + preRenderFunctions.length = n; + + if (!goog.isNull(frameState)) { + // FIXME works for View2D only + frameState.extent = ol.extent.getForView2DAndSize(view2DState.center, + view2DState.resolution, view2DState.rotation, frameState.size); + } + + this.frameState_ = frameState; + this.renderer_.renderFrame(frameState); + + if (!goog.isNull(frameState)) { + if (frameState.animate) { + this.render(); + } + Array.prototype.push.apply( + this.postRenderFunctions_, frameState.postRenderFunctions); + + var idle = this.preRenderFunctions_.length == 0 && + !frameState.animate && + !frameState.viewHints[ol.ViewHint.ANIMATING] && + !frameState.viewHints[ol.ViewHint.INTERACTING]; + + if (idle) { + this.dispatchEvent(new ol.MapEvent(ol.MapEventType.MOVEEND, this)); + } + } + + this.dispatchEvent( + new ol.MapEvent(ol.MapEventType.POSTRENDER, this, frameState)); + + goog.async.nextTick(this.handlePostRender, this); + +}; + + +/** + * Sets the layergroup of this map. + * @param {ol.layer.Group} layerGroup Layergroup. + * @todo stability experimental + */ +ol.Map.prototype.setLayerGroup = function(layerGroup) { + this.set(ol.MapProperty.LAYERGROUP, layerGroup); +}; +goog.exportProperty( + ol.Map.prototype, + 'setLayerGroup', + ol.Map.prototype.setLayerGroup); + + +/** + * Set the size of this map. + * @param {ol.Size|undefined} size Size. + * @todo stability experimental + */ +ol.Map.prototype.setSize = function(size) { + this.set(ol.MapProperty.SIZE, size); +}; +goog.exportProperty( + ol.Map.prototype, + 'setSize', + ol.Map.prototype.setSize); + + +/** + * Set the target element to render this map into. + * @param {Element|string|undefined} target Target. + * @todo stability experimental + */ +ol.Map.prototype.setTarget = function(target) { + this.set(ol.MapProperty.TARGET, target); +}; +goog.exportProperty( + ol.Map.prototype, + 'setTarget', + ol.Map.prototype.setTarget); + + +/** + * Set the view for this map. + * @param {ol.IView} view View. + * @todo stability experimental + */ +ol.Map.prototype.setView = function(view) { + this.set(ol.MapProperty.VIEW, view); +}; +goog.exportProperty( + ol.Map.prototype, + 'setView', + ol.Map.prototype.setView); + + +/** + * Force a recalculation of the map viewport size. This should be called when + * third-party code changes the size of the map viewport. + * @todo stability experimental + */ +ol.Map.prototype.updateSize = function() { + var target = this.getTarget(); + + /** + * @type {Element} + */ + var targetElement = goog.isDef(target) ? + goog.dom.getElement(target) : null; + + if (goog.isNull(targetElement)) { + this.setSize(undefined); + } else { + var size = goog.style.getContentBoxSize(targetElement); + this.setSize([size.width, size.height]); + } +}; + + +/** + * @typedef {{controls: ol.Collection, + * deviceOptions: olx.DeviceOptions, + * interactions: ol.Collection, + * keyboardEventTarget: (Element|Document), + * ol3Logo: boolean, + * overlays: ol.Collection, + * rendererConstructor: + * function(new: ol.renderer.Map, Element, ol.Map), + * values: Object.}} + */ +ol.MapOptionsInternal; + + +/** + * @param {olx.MapOptions} options Map options. + * @return {ol.MapOptionsInternal} Internal map options. + */ +ol.Map.createOptionsInternal = function(options) { + + /** + * @type {Element|Document} + */ + var keyboardEventTarget = null; + if (goog.isDef(options.keyboardEventTarget)) { + // cannot use goog.dom.getElement because its argument cannot be + // of type Document + keyboardEventTarget = goog.isString(options.keyboardEventTarget) ? + document.getElementById(options.keyboardEventTarget) : + options.keyboardEventTarget; + } + + /** + * @type {Object.} + */ + var values = {}; + + var ol3Logo = goog.isDef(options.ol3Logo) ? options.ol3Logo : true; + + var layerGroup = (options.layers instanceof ol.layer.Group) ? + options.layers : new ol.layer.Group({layers: options.layers}); + values[ol.MapProperty.LAYERGROUP] = layerGroup; + + values[ol.MapProperty.TARGET] = options.target; + + values[ol.MapProperty.VIEW] = goog.isDef(options.view) ? + options.view : new ol.View2D(); + + /** + * @type {function(new: ol.renderer.Map, Element, ol.Map)} + */ + var rendererConstructor = ol.renderer.Map; + + /** + * @type {Array.} + */ + var rendererHints; + if (goog.isDef(options.renderer)) { + if (goog.isArray(options.renderer)) { + rendererHints = options.renderer; + } else if (goog.isString(options.renderer)) { + rendererHints = [options.renderer]; + } else { + goog.asserts.fail('Incorrect format for renderer option'); + } + } else { + rendererHints = ol.DEFAULT_RENDERER_HINTS; + } + + var i, ii; + for (i = 0, ii = rendererHints.length; i < ii; ++i) { + /** @type {ol.RendererHint} */ + var rendererHint = rendererHints[i]; + if (ol.ENABLE_CANVAS && rendererHint == ol.RendererHint.CANVAS) { + if (ol.BrowserFeature.HAS_CANVAS) { + rendererConstructor = ol.renderer.canvas.Map; + break; + } + } else if (ol.ENABLE_DOM && rendererHint == ol.RendererHint.DOM) { + if (ol.BrowserFeature.HAS_DOM) { + rendererConstructor = ol.renderer.dom.Map; + break; + } + } else if (ol.ENABLE_WEBGL && rendererHint == ol.RendererHint.WEBGL) { + if (ol.BrowserFeature.HAS_WEBGL) { + rendererConstructor = ol.renderer.webgl.Map; + break; + } + } + } + + var controls; + if (goog.isDef(options.controls)) { + if (goog.isArray(options.controls)) { + controls = new ol.Collection(goog.array.clone(options.controls)); + } else { + goog.asserts.assertInstanceof(options.controls, ol.Collection); + controls = options.controls; + } + } else { + controls = ol.control.defaults(); + } + + var deviceOptions = goog.isDef(options.deviceOptions) ? + options.deviceOptions : /** @type {olx.DeviceOptions} */ ({}); + + var interactions; + if (goog.isDef(options.interactions)) { + if (goog.isArray(options.interactions)) { + interactions = new ol.Collection(goog.array.clone(options.interactions)); + } else { + goog.asserts.assertInstanceof(options.interactions, ol.Collection); + interactions = options.interactions; + } + } else { + interactions = ol.interaction.defaults(); + } + + var overlays; + if (goog.isDef(options.overlays)) { + if (goog.isArray(options.overlays)) { + overlays = new ol.Collection(goog.array.clone(options.overlays)); + } else { + goog.asserts.assertInstanceof(options.overlays, ol.Collection); + overlays = options.overlays; + } + } else { + overlays = new ol.Collection(); + } + + return { + controls: controls, + deviceOptions: deviceOptions, + interactions: interactions, + keyboardEventTarget: keyboardEventTarget, + ol3Logo: ol3Logo, + overlays: overlays, + rendererConstructor: rendererConstructor, + values: values + }; + +}; + + +ol.proj.common.add(); + + +if (goog.DEBUG) { + (function() { + goog.debug.Console.autoInstall(); + var logger = goog.log.getLogger('ol'); + logger.setLevel(goog.log.Level.FINEST); + })(); +} diff --git a/float-no-zero/ol/ol/mapbrowserevent.exports b/float-no-zero/ol/ol/mapbrowserevent.exports new file mode 100644 index 0000000000..0ad1d2a276 --- /dev/null +++ b/float-no-zero/ol/ol/mapbrowserevent.exports @@ -0,0 +1,2 @@ +@exportProperty ol.MapBrowserEvent.prototype.preventDefault +@exportProperty ol.MapBrowserEvent.prototype.stopPropagation diff --git a/float-no-zero/ol/ol/mapbrowserevent.js b/float-no-zero/ol/ol/mapbrowserevent.js new file mode 100644 index 0000000000..326505f967 --- /dev/null +++ b/float-no-zero/ol/ol/mapbrowserevent.js @@ -0,0 +1,515 @@ +goog.provide('ol.MapBrowserEvent'); +goog.provide('ol.MapBrowserEvent.EventType'); +goog.provide('ol.MapBrowserEventHandler'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.BrowserEvent'); +goog.require('goog.events.EventTarget'); +goog.require('goog.events.EventType'); +goog.require('goog.object'); +goog.require('ol.Coordinate'); +goog.require('ol.FrameState'); +goog.require('ol.MapEvent'); +goog.require('ol.Pixel'); + + + +/** + * @constructor + * @extends {ol.MapEvent} + * @implements {oli.MapBrowserEvent} + * @param {string} type Event type. + * @param {ol.Map} map Map. + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @param {?ol.FrameState=} opt_frameState Frame state. + * @todo stability experimental + */ +ol.MapBrowserEvent = function(type, map, browserEvent, opt_frameState) { + + goog.base(this, type, map, opt_frameState); + + /** + * @const + * @type {goog.events.BrowserEvent} + */ + this.browserEvent = browserEvent; + + /** + * @const + * @type {Event} + */ + this.originalEvent = browserEvent.getBrowserEvent(); + + /** + * @type {ol.Coordinate} + */ + this.coordinate = map.getEventCoordinate(this.originalEvent); + + /** + * @type {ol.Pixel} + */ + this.pixel = map.getEventPixel(this.originalEvent); + +}; +goog.inherits(ol.MapBrowserEvent, ol.MapEvent); + + +/** + * Prevents the default browser action. + * @see https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault + * @override + * @todo stability experimental + */ +ol.MapBrowserEvent.prototype.preventDefault = function() { + goog.base(this, 'preventDefault'); + this.browserEvent.preventDefault(); +}; + + +/** + * Prevents further propagation of the current event. + * @see https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation + * @override + * @todo stability experimental + */ +ol.MapBrowserEvent.prototype.stopPropagation = function() { + goog.base(this, 'stopPropagation'); + this.browserEvent.stopPropagation(); +}; + + + +/** + * @param {ol.Map} map The map with the viewport to listen to events on. + * @constructor + * @extends {goog.events.EventTarget} + */ +ol.MapBrowserEventHandler = function(map) { + + goog.base(this); + + /** + * This is the element that we will listen to the real events on. + * @type {ol.Map} + * @private + */ + this.map_ = map; + + /** + * @type {number} + * @private + */ + this.clickTimeoutId_ = 0; + + /** + * @type {boolean} + * @private + */ + this.dragged_ = false; + + /** + * @type {Array.} + * @private + */ + this.dragListenerKeys_ = null; + + /** + * @type {goog.events.Key} + * @private + */ + this.mousedownListenerKey_ = null; + + /** + * @type {goog.events.Key} + * @private + */ + this.pointerdownListenerKey_ = null; + + /** + * @type {goog.events.Key} + * @private + */ + this.touchstartListenerKey_ = null; + + if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + /** + * @type {goog.events.Key} + * @private + */ + this.ieDblclickListenerKey_ = null; + } + + /** + * @type {goog.events.BrowserEvent} + * @private + */ + this.down_ = null; + + var element = this.map_.getViewport(); + + this.relayedListenerKeys_ = [ + goog.events.listen(element, + goog.events.EventType.MOUSEMOVE, + this.relayEvent_, false, this), + goog.events.listen(element, + goog.events.EventType.CLICK, + this.relayEvent_, false, this) + ]; + + this.mousedownListenerKey_ = goog.events.listen(element, + goog.events.EventType.MOUSEDOWN, + this.handleMouseDown_, false, this); + + this.pointerdownListenerKey_ = goog.events.listen(element, + goog.events.EventType.MSPOINTERDOWN, + this.handlePointerDown_, false, this); + + this.touchstartListenerKey_ = goog.events.listen(element, + goog.events.EventType.TOUCHSTART, + this.handleTouchStart_, false, this); + + if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + this.ieDblclickListenerKey_ = goog.events.listen(element, + goog.events.EventType.DBLCLICK, this.emulateClick_, false, this); + } +}; +goog.inherits(ol.MapBrowserEventHandler, goog.events.EventTarget); + + +/** + * Get the last "down" type event. This will be set on mousedown, + * touchstart, and pointerdown. + * @return {goog.events.BrowserEvent} The most recent "down" type event (or null + * if none have occurred). + */ +ol.MapBrowserEventHandler.prototype.getDown = function() { + return this.down_; +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.emulateClick_ = function(browserEvent) { + if (this.clickTimeoutId_ !== 0) { + // double-click + goog.global.clearTimeout(this.clickTimeoutId_); + this.clickTimeoutId_ = 0; + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.DBLCLICK, this.map_, browserEvent); + this.dispatchEvent(newEvent); + } else { + // click + + if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + // In IE 7-8, referring to the original event object after the current + // call stack causes "member not found" exceptions, such as in the timeout + // we use here. + var ev = /** @type {Event} */ ( + goog.object.clone(browserEvent.getBrowserEvent())); + this.clickTimeoutId_ = goog.global.setTimeout(goog.bind(function() { + this.clickTimeoutId_ = 0; + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.SINGLECLICK, this.map_, + new goog.events.BrowserEvent(ev, browserEvent.currentTarget)); + this.dispatchEvent(newEvent); + }, this), 250); + } else { + this.clickTimeoutId_ = goog.global.setTimeout(goog.bind(function() { + this.clickTimeoutId_ = 0; + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.SINGLECLICK, this.map_, browserEvent); + this.dispatchEvent(newEvent); + }, this), 250); + } + } +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.handleMouseUp_ = function(browserEvent) { + if (this.down_) { + goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey); + this.dragListenerKeys_ = null; + if (this.dragged_) { + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.DRAGEND, this.map_, browserEvent); + this.dispatchEvent(newEvent); + } else if (browserEvent.isMouseActionButton()) { + this.emulateClick_(browserEvent); + } + } +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.handleMouseDown_ = function(browserEvent) { + if (!goog.isNull(this.pointerdownListenerKey_)) { + // mouse device detected - unregister the pointerdown and touchstart + // listeners + goog.events.unlistenByKey(this.pointerdownListenerKey_); + this.pointerdownListenerKey_ = null; + + goog.asserts.assert(!goog.isNull(this.touchstartListenerKey_)); + goog.events.unlistenByKey(this.touchstartListenerKey_); + this.touchstartListenerKey_ = null; + } + + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.DOWN, this.map_, browserEvent); + this.dispatchEvent(newEvent); + this.down_ = browserEvent; + this.dragged_ = false; + this.dragListenerKeys_ = [ + goog.events.listen(goog.global.document, goog.events.EventType.MOUSEMOVE, + this.handleMouseMove_, false, this), + goog.events.listen(goog.global.document, goog.events.EventType.MOUSEUP, + this.handleMouseUp_, false, this) + ]; + // prevent browser image dragging with the dom renderer + browserEvent.preventDefault(); +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.handleMouseMove_ = function(browserEvent) { + var newEvent; + if (!this.dragged_) { + this.dragged_ = true; + newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.DRAGSTART, this.map_, this.down_); + this.dispatchEvent(newEvent); + } + newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.DRAG, this.map_, browserEvent); + this.dispatchEvent(newEvent); +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.handlePointerDown_ = + function(browserEvent) { + if (!goog.isNull(this.mousedownListenerKey_)) { + // pointer device detected - unregister the mousedown and touchstart + // listeners + goog.events.unlistenByKey(this.mousedownListenerKey_); + this.mousedownListenerKey_ = null; + + goog.asserts.assert(!goog.isNull(this.touchstartListenerKey_)); + goog.events.unlistenByKey(this.touchstartListenerKey_); + this.touchstartListenerKey_ = null; + } + + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.TOUCHSTART, this.map_, browserEvent); + this.dispatchEvent(newEvent); + + this.down_ = browserEvent; + this.dragged_ = false; + this.dragListenerKeys_ = [ + goog.events.listen(goog.global.document, + goog.events.EventType.MSPOINTERMOVE, + this.handlePointerMove_, false, this), + goog.events.listen(goog.global.document, goog.events.EventType.MSPOINTERUP, + this.handlePointerUp_, false, this) + ]; + + // FIXME check if/when this is necessary + // prevent context menu + browserEvent.preventDefault(); +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.handlePointerMove_ = + function(browserEvent) { + // Fix IE10 on windows Surface : When you tap the tablet, it triggers + // multiple pointermove events between pointerdown and pointerup with + // the exact same coordinates of the pointerdown event. To avoid a + // 'false' touchmove event to be dispatched , we test if the pointer + // effectively moved. + if (browserEvent.clientX != this.down_.clientX || + browserEvent.clientY != this.down_.clientY) { + this.dragged_ = true; + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.TOUCHMOVE, this.map_, browserEvent); + this.dispatchEvent(newEvent); + } +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.handlePointerUp_ = function(browserEvent) { + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.TOUCHEND, this.map_, browserEvent); + this.dispatchEvent(newEvent); + goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey); + + // We emulate click event on left mouse button click, touch contact, and pen + // contact. isMouseActionButton returns true in these cases (evt.button is set + // to 0). + // See http://www.w3.org/TR/pointerevents/#button-states . + if (!this.dragged_ && browserEvent.isMouseActionButton()) { + goog.asserts.assert(!goog.isNull(this.down_)); + this.emulateClick_(this.down_); + } +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.handleTouchStart_ = function(browserEvent) { + if (!goog.isNull(this.mousedownListenerKey_)) { + // touch device detected - unregister the mousedown and pointerdown + // listeners + goog.events.unlistenByKey(this.mousedownListenerKey_); + this.mousedownListenerKey_ = null; + + goog.asserts.assert(!goog.isNull(this.pointerdownListenerKey_)); + goog.events.unlistenByKey(this.pointerdownListenerKey_); + this.pointerdownListenerKey_ = null; + } + + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.TOUCHSTART, this.map_, browserEvent); + this.dispatchEvent(newEvent); + + this.down_ = browserEvent; + this.dragged_ = false; + + if (goog.isNull(this.dragListenerKeys_)) { + this.dragListenerKeys_ = [ + goog.events.listen(goog.global.document, goog.events.EventType.TOUCHMOVE, + this.handleTouchMove_, false, this), + goog.events.listen(goog.global.document, goog.events.EventType.TOUCHEND, + this.handleTouchEnd_, false, this) + ]; + } + + // FIXME check if/when this is necessary + browserEvent.preventDefault(); +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.handleTouchMove_ = function(browserEvent) { + this.dragged_ = true; + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.TOUCHMOVE, this.map_, browserEvent); + this.dispatchEvent(newEvent); + + // Some native android browser triggers mousemove events during small period + // of time. See: https://code.google.com/p/android/issues/detail?id=5491 or + // https://code.google.com/p/android/issues/detail?id=19827 + // ex: Galaxy Tab P3110 + Android 4.1.1 + browserEvent.preventDefault(); +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.handleTouchEnd_ = function(browserEvent) { + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.TOUCHEND, this.map_, browserEvent); + this.dispatchEvent(newEvent); + if (browserEvent.getBrowserEvent().targetTouches.length === 0) { + goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey); + this.dragListenerKeys_ = null; + } + if (!this.dragged_) { + goog.asserts.assert(!goog.isNull(this.down_)); + this.emulateClick_(this.down_); + } +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.MapBrowserEventHandler.prototype.disposeInternal = function() { + if (!goog.isNull(this.relayedListenerKeys_)) { + goog.array.forEach(this.relayedListenerKeys_, goog.events.unlistenByKey); + this.relayedListenerKeys_ = null; + } + if (!goog.isNull(this.mousedownListenerKey_)) { + goog.events.unlistenByKey(this.mousedownListenerKey_); + this.mousedownListenerKey_ = null; + } + if (!goog.isNull(this.pointerdownListenerKey_)) { + goog.events.unlistenByKey(this.pointerdownListenerKey_); + this.pointerdownListenerKey_ = null; + } + if (!goog.isNull(this.touchstartListenerKey_)) { + goog.events.unlistenByKey(this.touchstartListenerKey_); + this.touchstartListenerKey_ = null; + } + if (!goog.isNull(this.dragListenerKeys_)) { + goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey); + this.dragListenerKeys_ = null; + } + if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE && + !goog.isNull(this.ieDblclickListenerKey_)) { + goog.events.unlistenByKey(this.ieDblclickListenerKey_); + this.ieDblclickListenerKey_ = null; + } + goog.base(this, 'disposeInternal'); +}; + + +/** + * Wrap and relay a browser event. Note that this requires that the type + * string for the MapBrowserEvent matches the BrowserEvent type. + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @private + */ +ol.MapBrowserEventHandler.prototype.relayEvent_ = function(browserEvent) { + this.dispatchEvent(new ol.MapBrowserEvent( + browserEvent.type, this.map_, browserEvent)); +}; + + +/** + * Constants for event names. + * @enum {string} + */ +ol.MapBrowserEvent.EventType = { + CLICK: goog.events.EventType.CLICK, + DBLCLICK: goog.events.EventType.DBLCLICK, + MOUSEMOVE: goog.events.EventType.MOUSEMOVE, + DOWN: 'down', + DRAGSTART: 'dragstart', + DRAG: 'drag', + DRAGEND: 'dragend', + SINGLECLICK: 'singleclick', + TOUCHSTART: goog.events.EventType.TOUCHSTART, + TOUCHMOVE: goog.events.EventType.TOUCHMOVE, + TOUCHEND: goog.events.EventType.TOUCHEND +}; diff --git a/float-no-zero/ol/ol/mapevent.js b/float-no-zero/ol/ol/mapevent.js new file mode 100644 index 0000000000..3629fb4936 --- /dev/null +++ b/float-no-zero/ol/ol/mapevent.js @@ -0,0 +1,40 @@ +goog.provide('ol.MapEvent'); +goog.provide('ol.MapEventType'); + +goog.require('goog.events.Event'); +goog.require('ol.FrameState'); + + +/** + * @enum {string} + */ +ol.MapEventType = { + POSTRENDER: 'postrender', + MOVEEND: 'moveend' +}; + + + +/** + * @constructor + * @extends {goog.events.Event} + * @param {string} type Event type. + * @param {ol.Map} map Map. + * @param {?ol.FrameState=} opt_frameState Frame state. + */ +ol.MapEvent = function(type, map, opt_frameState) { + + goog.base(this, type); + + /** + * @type {ol.Map} + */ + this.map = map; + + /** + * @type {?ol.FrameState} + */ + this.frameState = goog.isDef(opt_frameState) ? opt_frameState : null; + +}; +goog.inherits(ol.MapEvent, goog.events.Event); diff --git a/float-no-zero/ol/ol/math.js b/float-no-zero/ol/ol/math.js new file mode 100644 index 0000000000..14ffd2977a --- /dev/null +++ b/float-no-zero/ol/ol/math.js @@ -0,0 +1,69 @@ +goog.provide('ol.math'); + +goog.require('goog.asserts'); + + +/** + * @param {number} x X. + * @return {number} Hyperbolic cosine of x. + */ +ol.math.cosh = function(x) { + return (Math.exp(x) + Math.exp(-x)) / 2; +}; + + +/** + * @param {number} x X. + * @return {number} Hyperbolic cotangent of x. + */ +ol.math.coth = function(x) { + var expMinusTwoX = Math.exp(-2 * x); + return (1 + expMinusTwoX) / (1 - expMinusTwoX); +}; + + +/** + * @param {number} x X. + * @return {number} Hyperbolic cosecant of x. + */ +ol.math.csch = function(x) { + return 2 / (Math.exp(x) - Math.exp(-x)); +}; + + +/** + * @param {number} x X. + * @return {number} The smallest power of two greater than or equal to x. + */ +ol.math.roundUpToPowerOfTwo = function(x) { + goog.asserts.assert(0 < x); + return Math.pow(2, Math.ceil(Math.log(x) / Math.LN2)); +}; + + +/** + * @param {number} x X. + * @return {number} Hyperbolic secant of x. + */ +ol.math.sech = function(x) { + return 2 / (Math.exp(x) + Math.exp(-x)); +}; + + +/** + * @param {number} x X. + * @return {number} Hyperbolic sine of x. + */ +ol.math.sinh = function(x) { + return (Math.exp(x) - Math.exp(-x)) / 2; +}; + + +/** + * @param {number} x X. + * @return {number} Hyperbolic tangent of x. + */ +ol.math.tanh = function(x) { + var expMinusTwoX = Math.exp(-2 * x); + return (1 - expMinusTwoX) / (1 + expMinusTwoX); +}; diff --git a/float-no-zero/ol/ol/object.exports b/float-no-zero/ol/ol/object.exports new file mode 100644 index 0000000000..89426170a5 --- /dev/null +++ b/float-no-zero/ol/ol/object.exports @@ -0,0 +1,9 @@ +@exportSymbol ol.Object +@exportProperty ol.Object.prototype.bindTo +@exportProperty ol.Object.prototype.get +@exportProperty ol.Object.prototype.getProperties +@exportProperty ol.Object.prototype.notify +@exportProperty ol.Object.prototype.set +@exportProperty ol.Object.prototype.setValues +@exportProperty ol.Object.prototype.unbind +@exportProperty ol.Object.prototype.unbindAll diff --git a/float-no-zero/ol/ol/object.js b/float-no-zero/ol/ol/object.js new file mode 100644 index 0000000000..59f8f54f88 --- /dev/null +++ b/float-no-zero/ol/ol/object.js @@ -0,0 +1,470 @@ + +/** + * An implementation of Google Maps' MVCObject. + * @see https://developers.google.com/maps/articles/mvcfun + * @see https://developers.google.com/maps/documentation/javascript/reference + */ + +goog.provide('ol.Object'); +goog.provide('ol.ObjectEvent'); +goog.provide('ol.ObjectEventType'); + +goog.require('goog.array'); +goog.require('goog.events'); +goog.require('goog.events.Event'); +goog.require('goog.functions'); +goog.require('goog.object'); +goog.require('ol.Observable'); + + +/** + * @enum {string} + */ +ol.ObjectEventType = { + BEFOREPROPERTYCHANGE: 'beforepropertychange', + PROPERTYCHANGE: 'propertychange' +}; + + + +/** + * Object representing a property change event. + * + * @param {string} type The event type. + * @param {string} key The property name. + * @extends {goog.events.Event} + * @implements {oli.ObjectEvent} + * @constructor + */ +ol.ObjectEvent = function(type, key) { + goog.base(this, type); + + /** + * The name of the property whose value is changing. + * @type {string} + */ + this.key = key; + +}; +goog.inherits(ol.ObjectEvent, goog.events.Event); + + + +/** + * @constructor + * @param {ol.Object} target + * @param {string} key + * @todo stability experimental + */ +ol.ObjectAccessor = function(target, key) { + + /** + * @type {ol.Object} + */ + this.target = target; + + /** + * @type {string} + */ + this.key = key; + + /** + * @type {function(?): ?} + */ + this.from = goog.functions.identity; + + /** + * @type {function(?): ?} + */ + this.to = goog.functions.identity; +}; + + +/** + * @param {function(?): ?} from A function that transforms the source value + * before it is set to the target. + * @param {function(?): ?} to A function that transforms the target value + * before it is set to the source. + */ +ol.ObjectAccessor.prototype.transform = function(from, to) { + this.from = from; + this.to = to; + + this.target.notify(this.key); +}; + + + +/** + * Base class implementing KVO (Key Value Observing). + * @constructor + * @extends {ol.Observable} + * @param {Object.=} opt_values Values. + * @todo stability experimental + */ +ol.Object = function(opt_values) { + goog.base(this); + + /** + * @private + * @type {Object.} + */ + this.values_ = {}; + + /** + * @private + * @type {Object.} + */ + this.accessors_ = {}; + + /** + * Lookup of beforechange listener keys. + * @type {Object.} + * @private + */ + this.beforeChangeListeners_ = {}; + + /** + * @private + * @type {Object.} + */ + this.listeners_ = {}; + + if (goog.isDef(opt_values)) { + this.setValues(opt_values); + } +}; +goog.inherits(ol.Object, ol.Observable); + + +/** + * @private + * @type {Object.} + */ +ol.Object.changeEventTypeCache_ = {}; + + +/** + * @private + * @type {Object.} + */ +ol.Object.getterNameCache_ = {}; + + +/** + * @private + * @type {Object.} + */ +ol.Object.setterNameCache_ = {}; + + +/** + * @param {string} str String. + * @return {string} Capitalized string. + */ +ol.Object.capitalize = function(str) { + return str.substr(0, 1).toUpperCase() + str.substr(1); +}; + + +/** + * @param {string} key Key name. + * @return {string} Change name. + */ +ol.Object.getChangeEventType = function(key) { + return ol.Object.changeEventTypeCache_.hasOwnProperty(key) ? + ol.Object.changeEventTypeCache_[key] : + (ol.Object.changeEventTypeCache_[key] = 'change:' + key.toLowerCase()); +}; + + +/** + * @param {string} key String. + * @return {string} Getter name. + */ +ol.Object.getGetterName = function(key) { + return ol.Object.getterNameCache_.hasOwnProperty(key) ? + ol.Object.getterNameCache_[key] : + (ol.Object.getterNameCache_[key] = 'get' + ol.Object.capitalize(key)); +}; + + +/** + * @param {string} key String. + * @return {string} Setter name. + */ +ol.Object.getSetterName = function(key) { + return ol.Object.setterNameCache_.hasOwnProperty(key) ? + ol.Object.setterNameCache_[key] : + (ol.Object.setterNameCache_[key] = 'set' + ol.Object.capitalize(key)); +}; + + +/** + * The bindTo method allows you to set up a two-way binding between a + * `source` and `target` object. The method returns an + * ol.ObjectAccessor with a transform method that lets you transform + * values on the way from the source to the target and on the way back. + * + * For example, if you had two map views (sourceView and targetView) + * and you wanted the target view to have double the resolution of the + * source view, you could transform the resolution on the way to and + * from the target with the following: + * + * sourceView.bindTo('resolution', targetView) + * .transform( + * function(sourceResolution) { + * // from sourceView.resolution to targetView.resolution + * return 2 * sourceResolution; + * }, + * function(targetResolution) { + * // from targetView.resolution to sourceView.resolution + * return targetResolution / 2; + * } + * ); + * + * @param {string} key Key name. + * @param {ol.Object} target Target. + * @param {string=} opt_targetKey Target key. + * @return {ol.ObjectAccessor} + * @todo stability experimental + */ +ol.Object.prototype.bindTo = function(key, target, opt_targetKey) { + var targetKey = opt_targetKey || key; + this.unbind(key); + + // listen for change:targetkey events + var eventType = ol.Object.getChangeEventType(targetKey); + this.listeners_[key] = goog.events.listen(target, eventType, + /** + * @this {ol.Object} + */ + function() { + this.notifyInternal_(key); + }, undefined, this); + + // listen for beforechange events and relay if key matches + this.beforeChangeListeners_[key] = goog.events.listen(target, + ol.ObjectEventType.BEFOREPROPERTYCHANGE, + this.createBeforeChangeListener_(key, targetKey), + undefined, this); + + var accessor = new ol.ObjectAccessor(target, targetKey); + this.accessors_[key] = accessor; + this.notifyInternal_(key); + return accessor; +}; + + +/** + * Create a listener for beforechange events on a target object. This listener + * will relay events on this object if the event key matches the provided target + * key. + * @param {string} key The key on this object whose value will be changing. + * @param {string} targetKey The key on the target object. + * @return {function(this: ol.Object, ol.ObjectEvent)} Listener. + * @private + */ +ol.Object.prototype.createBeforeChangeListener_ = function(key, targetKey) { + /** + * Conditionally relay beforechange events if event key matches target key. + * @param {ol.ObjectEvent} event The beforechange event from the target. + * @this {ol.Object} + */ + return function(event) { + if (event.key === targetKey) { + this.dispatchEvent( + new ol.ObjectEvent(ol.ObjectEventType.BEFOREPROPERTYCHANGE, key)); + } + }; +}; + + +/** + * Gets a value. + * @param {string} key Key name. + * @return {*} Value. + * @todo stability experimental + */ +ol.Object.prototype.get = function(key) { + var value; + var accessors = this.accessors_; + if (accessors.hasOwnProperty(key)) { + var accessor = accessors[key]; + var target = accessor.target; + var targetKey = accessor.key; + var getterName = ol.Object.getGetterName(targetKey); + var getter = /** @type {function(): *|undefined} */ + (goog.object.get(target, getterName)); + if (goog.isDef(getter)) { + value = getter.call(target); + } else { + value = target.get(targetKey); + } + value = accessor.to(value); + } else if (this.values_.hasOwnProperty(key)) { + value = this.values_[key]; + } + return value; +}; + + +/** + * Get a list of object property names. + * @return {Array.} List of property names. + */ +ol.Object.prototype.getKeys = function() { + var accessors = this.accessors_; + var keysObject; + if (goog.object.isEmpty(this.values_)) { + if (goog.object.isEmpty(accessors)) { + return []; + } else { + keysObject = accessors; + } + } else { + if (goog.object.isEmpty(accessors)) { + keysObject = this.values_; + } else { + keysObject = {}; + var key; + for (key in this.values_) { + keysObject[key] = true; + } + for (key in accessors) { + keysObject[key] = true; + } + } + } + return goog.object.getKeys(keysObject); +}; + + +/** + * Get an object of all property names and values. + * @return {Object.} Object. + * @todo stability experimental + */ +ol.Object.prototype.getProperties = function() { + var properties = {}; + var key; + for (key in this.values_) { + properties[key] = this.values_[key]; + } + for (key in this.accessors_) { + properties[key] = this.get(key); + } + return properties; +}; + + +/** + * Notify all observers of a change on this property. This notifies both + * objects that are bound to the object's property as well as the object + * that it is bound to. + * @param {string} key Key name. + * @todo stability experimental + */ +ol.Object.prototype.notify = function(key) { + var accessors = this.accessors_; + if (accessors.hasOwnProperty(key)) { + var accessor = accessors[key]; + var target = accessor.target; + var targetKey = accessor.key; + target.notify(targetKey); + } else { + this.notifyInternal_(key); + } +}; + + +/** + * @param {string} key Key name. + * @private + */ +ol.Object.prototype.notifyInternal_ = function(key) { + var eventType = ol.Object.getChangeEventType(key); + this.dispatchEvent(eventType); + this.dispatchEvent( + new ol.ObjectEvent(ol.ObjectEventType.PROPERTYCHANGE, key)); +}; + + +/** + * Sets a value. + * @param {string} key Key name. + * @param {*} value Value. + * @todo stability experimental + */ +ol.Object.prototype.set = function(key, value) { + this.dispatchEvent( + new ol.ObjectEvent(ol.ObjectEventType.BEFOREPROPERTYCHANGE, key)); + var accessors = this.accessors_; + if (accessors.hasOwnProperty(key)) { + var accessor = accessors[key]; + var target = accessor.target; + var targetKey = accessor.key; + value = accessor.from(value); + var setterName = ol.Object.getSetterName(targetKey); + var setter = /** @type {function(*)|undefined} */ + (goog.object.get(target, setterName)); + if (goog.isDef(setter)) { + setter.call(target, value); + } else { + target.set(targetKey, value); + } + } else { + this.values_[key] = value; + this.notifyInternal_(key); + } +}; + + +/** + * Sets a collection of key-value pairs. + * @param {Object.} values Values. + * @todo stability experimental + */ +ol.Object.prototype.setValues = function(values) { + var key; + for (key in values) { + this.set(key, values[key]); + } +}; + + +/** + * Removes a binding. Unbinding will set the unbound property to the current + * value. The object will not be notified, as the value has not changed. + * @param {string} key Key name. + * @todo stability experimental + */ +ol.Object.prototype.unbind = function(key) { + var listeners = this.listeners_; + var listener = listeners[key]; + if (listener) { + delete listeners[key]; + goog.events.unlistenByKey(listener); + var value = this.get(key); + delete this.accessors_[key]; + this.values_[key] = value; + } + + // unregister any beforechange listener + var listenerKey = this.beforeChangeListeners_[key]; + if (listenerKey) { + goog.events.unlistenByKey(listenerKey); + delete this.beforeChangeListeners_[key]; + } +}; + + +/** + * Removes all bindings. + * @todo stability experimental + */ +ol.Object.prototype.unbindAll = function() { + for (var key in this.listeners_) { + this.unbind(key); + } +}; diff --git a/float-no-zero/ol/ol/observable.exports b/float-no-zero/ol/ol/observable.exports new file mode 100644 index 0000000000..cd9d88898b --- /dev/null +++ b/float-no-zero/ol/ol/observable.exports @@ -0,0 +1,6 @@ +@exportSymbol ol.Observable +@exportProperty ol.Observable.prototype.dispatchChangeEvent +@exportProperty ol.Observable.prototype.on +@exportProperty ol.Observable.prototype.once +@exportProperty ol.Observable.prototype.un +@exportProperty ol.Observable.prototype.unByKey diff --git a/float-no-zero/ol/ol/observable.js b/float-no-zero/ol/ol/observable.js new file mode 100644 index 0000000000..1d6431ac08 --- /dev/null +++ b/float-no-zero/ol/ol/observable.js @@ -0,0 +1,95 @@ +goog.provide('ol.Observable'); + +goog.require('goog.events'); +goog.require('goog.events.EventTarget'); +goog.require('goog.events.EventType'); + + + +/** + * An event target providing convenient methods for listener registration + * and unregistration. + * @constructor + * @extends {goog.events.EventTarget} + * @suppress {checkStructDictInheritance} + * @struct + * @todo stability experimental + */ +ol.Observable = function() { + + goog.base(this); + + /** + * @private + * @type {number} + */ + this.revision_ = 0; + +}; +goog.inherits(ol.Observable, goog.events.EventTarget); + + +/** + * @todo stability experimental + */ +ol.Observable.prototype.dispatchChangeEvent = function() { + ++this.revision_; + this.dispatchEvent(goog.events.EventType.CHANGE); +}; + + +/** + * @return {number} Revision. + * @todo stability experimental + */ +ol.Observable.prototype.getRevision = function() { + return this.revision_; +}; + + +/** + * Listen for a certain type of event. + * @param {string|Array.} type The event type or array of event types. + * @param {function(?): ?} listener The listener function. + * @param {Object=} opt_this The object to use as `this` in `listener`. + * @return {goog.events.Key} Unique key for the listener. + * @todo stability experimental + */ +ol.Observable.prototype.on = function(type, listener, opt_this) { + return goog.events.listen(this, type, listener, false, opt_this); +}; + + +/** + * Listen once for a certain type of event. + * @param {string|Array.} type The event type or array of event types. + * @param {function(?): ?} listener The listener function. + * @param {Object=} opt_this The object to use as `this` in `listener`. + * @return {goog.events.Key} Unique key for the listener. + * @todo stability experimental + */ +ol.Observable.prototype.once = function(type, listener, opt_this) { + return goog.events.listenOnce(this, type, listener, false, opt_this); +}; + + +/** + * Unlisten for a certain type of event. + * @param {string|Array.} type The event type or array of event types. + * @param {function(?): ?} listener The listener function. + * @param {Object=} opt_this The object to use as `this` in `listener`. + * @todo stability experimental + */ +ol.Observable.prototype.un = function(type, listener, opt_this) { + goog.events.unlisten(this, type, listener, false, opt_this); +}; + + +/** + * Removes an event listener using the key returned by `on()` or `once()`. + * @param {goog.events.Key} key Key. + * @todo stability experimental + */ +ol.Observable.prototype.unByKey = function(key) { + goog.events.unlistenByKey(key); +}; diff --git a/float-no-zero/ol/ol/ol.exports b/float-no-zero/ol/ol/ol.exports new file mode 100644 index 0000000000..e6371ba44b --- /dev/null +++ b/float-no-zero/ol/ol/ol.exports @@ -0,0 +1 @@ +@exportSymbol ol.inherits diff --git a/float-no-zero/ol/ol/ol.js b/float-no-zero/ol/ol/ol.js new file mode 100644 index 0000000000..6a7e7312e6 --- /dev/null +++ b/float-no-zero/ol/ol/ol.js @@ -0,0 +1,15 @@ +goog.provide('ol'); + + +/** + * ol.inherits is an alias to the goog.inherits function. It is exported + * for use in non-compiled application code. See ol.exports. + * + * FIXME: We use a new line to fake the linter. Without the new line the + * linter complains with: + * + * "Missing newline between constructor and goog.inherits" + * @todo stability experimental + */ +ol.inherits = + goog.inherits; diff --git a/float-no-zero/ol/ol/overlay.exports b/float-no-zero/ol/ol/overlay.exports new file mode 100644 index 0000000000..c2ce24085b --- /dev/null +++ b/float-no-zero/ol/ol/overlay.exports @@ -0,0 +1 @@ +@exportSymbol ol.Overlay diff --git a/float-no-zero/ol/ol/overlay.js b/float-no-zero/ol/ol/overlay.js new file mode 100644 index 0000000000..c2221ee7f2 --- /dev/null +++ b/float-no-zero/ol/ol/overlay.js @@ -0,0 +1,400 @@ +goog.provide('ol.Overlay'); +goog.provide('ol.OverlayPositioning'); +goog.provide('ol.OverlayProperty'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.style'); +goog.require('ol.Coordinate'); +goog.require('ol.Map'); +goog.require('ol.MapEventType'); +goog.require('ol.Object'); + + +/** + * @enum {string} + */ +ol.OverlayProperty = { + ELEMENT: 'element', + MAP: 'map', + POSITION: 'position', + POSITIONING: 'positioning' +}; + + +/** + * @enum {string} + * @todo stability experimental + */ +ol.OverlayPositioning = { + BOTTOM_LEFT: 'bottom-left', + BOTTOM_CENTER: 'bottom-center', + BOTTOM_RIGHT: 'bottom-right', + CENTER_LEFT: 'center-left', + CENTER_CENTER: 'center-center', + CENTER_RIGHT: 'center-right', + TOP_LEFT: 'top-left', + TOP_CENTER: 'top-center', + TOP_RIGHT: 'top-right' +}; + + + +/** + * An element to show on top of the map, such as for a popup. + * + * Example: + * + * var popup = new ol.Overlay({ + * element: document.getElementById('popup') + * }); + * popup.setPosition(coordinate); + * map.addOverlay(popup); + * + * @constructor + * @extends {ol.Object} + * @param {olx.OverlayOptions} options Overlay options. + * @todo stability experimental + * @todo observable element {Element} the Element containing the overlay + * @todo observable map {ol.Map} the map that the overlay is part of + * @todo observable position {ol.Coordinate} the spatial point that the overlay + * is anchored at + * @todo observable positioning {ol.OverlayPositioning} how the overlay is + * positioned relative to its point on the map + */ +ol.Overlay = function(options) { + + goog.base(this); + + /** + * @private + * @type {boolean} + */ + this.insertFirst_ = goog.isDef(options.insertFirst) ? + options.insertFirst : true; + + /** + * @private + * @type {boolean} + */ + this.stopEvent_ = goog.isDef(options.stopEvent) ? options.stopEvent : true; + + /** + * @private + * @type {Element} + */ + this.element_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.element_.style.position = 'absolute'; + + /** + * @private + * @type {{bottom_: string, + * left_: string, + * right_: string, + * top_: string, + * visible: boolean}} + */ + this.rendered_ = { + bottom_: '', + left_: '', + right_: '', + top_: '', + visible: true + }; + + /** + * @private + * @type {goog.events.Key} + */ + this.mapPostrenderListenerKey_ = null; + + goog.events.listen( + this, ol.Object.getChangeEventType(ol.OverlayProperty.ELEMENT), + this.handleElementChanged, false, this); + + goog.events.listen( + this, ol.Object.getChangeEventType(ol.OverlayProperty.MAP), + this.handleMapChanged, false, this); + + goog.events.listen( + this, ol.Object.getChangeEventType(ol.OverlayProperty.POSITION), + this.handlePositionChanged, false, this); + + goog.events.listen( + this, + ol.Object.getChangeEventType(ol.OverlayProperty.POSITIONING), + this.handlePositioningChanged, false, this); + + if (goog.isDef(options.element)) { + this.setElement(options.element); + } + if (goog.isDef(options.position)) { + this.setPosition(options.position); + } + if (goog.isDef(options.positioning)) { + this.setPositioning( + /** @type {ol.OverlayPositioning} */ (options.positioning)); + } + +}; +goog.inherits(ol.Overlay, ol.Object); + + +/** + * Get the DOM element of this overlay. + * @return {Element|undefined} Element. + * @todo stability experimental + */ +ol.Overlay.prototype.getElement = function() { + return /** @type {Element|undefined} */ ( + this.get(ol.OverlayProperty.ELEMENT)); +}; +goog.exportProperty( + ol.Overlay.prototype, + 'getElement', + ol.Overlay.prototype.getElement); + + +/** + * Get the map associated with this overlay. + * @return {ol.Map|undefined} Map. + * @todo stability experimental + */ +ol.Overlay.prototype.getMap = function() { + return /** @type {ol.Map|undefined} */ ( + this.get(ol.OverlayProperty.MAP)); +}; +goog.exportProperty( + ol.Overlay.prototype, + 'getMap', + ol.Overlay.prototype.getMap); + + +/** + * Get the current position of this overlay. + * @return {ol.Coordinate|undefined} Position. + * @todo stability experimental + */ +ol.Overlay.prototype.getPosition = function() { + return /** @type {ol.Coordinate|undefined} */ ( + this.get(ol.OverlayProperty.POSITION)); +}; +goog.exportProperty( + ol.Overlay.prototype, + 'getPosition', + ol.Overlay.prototype.getPosition); + + +/** + * Get the current positioning of this overlay. + * @return {ol.OverlayPositioning|undefined} Positioning. + * @todo stability experimental + */ +ol.Overlay.prototype.getPositioning = function() { + return /** @type {ol.OverlayPositioning|undefined} */ ( + this.get(ol.OverlayProperty.POSITIONING)); +}; +goog.exportProperty( + ol.Overlay.prototype, + 'getPositioning', + ol.Overlay.prototype.getPositioning); + + +/** + * @protected + */ +ol.Overlay.prototype.handleElementChanged = function() { + goog.dom.removeChildren(this.element_); + var element = this.getElement(); + if (goog.isDefAndNotNull(element)) { + goog.dom.append(/** @type {!Node} */ (this.element_), element); + } +}; + + +/** + * @protected + */ +ol.Overlay.prototype.handleMapChanged = function() { + if (!goog.isNull(this.mapPostrenderListenerKey_)) { + goog.dom.removeNode(this.element_); + goog.events.unlistenByKey(this.mapPostrenderListenerKey_); + this.mapPostrenderListenerKey_ = null; + } + var map = this.getMap(); + if (goog.isDefAndNotNull(map)) { + this.mapPostrenderListenerKey_ = goog.events.listen(map, + ol.MapEventType.POSTRENDER, this.handleMapPostrender, false, this); + this.updatePixelPosition_(); + var container = this.stopEvent_ ? + map.getOverlayContainerStopEvent() : map.getOverlayContainer(); + if (this.insertFirst_) { + goog.dom.insertChildAt(/** @type {!Element} */ ( + container), this.element_, 0); + } else { + goog.dom.append(/** @type {!Node} */ (container), this.element_); + } + } +}; + + +/** + * @protected + */ +ol.Overlay.prototype.handleMapPostrender = function() { + this.updatePixelPosition_(); +}; + + +/** + * @protected + */ +ol.Overlay.prototype.handlePositionChanged = function() { + this.updatePixelPosition_(); +}; + + +/** + * @protected + */ +ol.Overlay.prototype.handlePositioningChanged = function() { + this.updatePixelPosition_(); +}; + + +/** + * Set the DOM element to be associated with this overlay. + * @param {Element|undefined} element Element. + * @todo stability experimental + */ +ol.Overlay.prototype.setElement = function(element) { + this.set(ol.OverlayProperty.ELEMENT, element); +}; +goog.exportProperty( + ol.Overlay.prototype, + 'setElement', + ol.Overlay.prototype.setElement); + + +/** + * Set the map to be associated with this overlay. + * @param {ol.Map|undefined} map Map. + * @todo stability experimental + */ +ol.Overlay.prototype.setMap = function(map) { + this.set(ol.OverlayProperty.MAP, map); +}; +goog.exportProperty( + ol.Overlay.prototype, + 'setMap', + ol.Overlay.prototype.setMap); + + +/** + * Set the position for this overlay. + * @param {ol.Coordinate|undefined} position Position. + * @todo stability experimental + */ +ol.Overlay.prototype.setPosition = function(position) { + this.set(ol.OverlayProperty.POSITION, position); +}; +goog.exportProperty( + ol.Overlay.prototype, + 'setPosition', + ol.Overlay.prototype.setPosition); + + +/** + * Set the positioning for this overlay. + * @param {ol.OverlayPositioning|undefined} positioning Positioning. + * @todo stability experimental + */ +ol.Overlay.prototype.setPositioning = function(positioning) { + this.set(ol.OverlayProperty.POSITIONING, positioning); +}; +goog.exportProperty( + ol.Overlay.prototype, + 'setPositioning', + ol.Overlay.prototype.setPositioning); + + +/** + * @private + */ +ol.Overlay.prototype.updatePixelPosition_ = function() { + + var map = this.getMap(); + var position = this.getPosition(); + if (!goog.isDef(map) || !map.isRendered() || !goog.isDef(position)) { + if (this.rendered_.visible) { + goog.style.setElementShown(this.element_, false); + this.rendered_.visible = false; + } + return; + } + + var pixel = map.getPixelFromCoordinate(position); + goog.asserts.assert(!goog.isNull(pixel)); + var mapSize = map.getSize(); + goog.asserts.assert(goog.isDef(mapSize)); + var style = this.element_.style; + var positioning = this.getPositioning(); + if (positioning == ol.OverlayPositioning.BOTTOM_RIGHT || + positioning == ol.OverlayPositioning.CENTER_RIGHT || + positioning == ol.OverlayPositioning.TOP_RIGHT) { + if (this.rendered_.left_ !== '') { + this.rendered_.left_ = style.left = ''; + } + var right = Math.round(mapSize[0] - pixel[0]) + 'px'; + if (this.rendered_.right_ != right) { + this.rendered_.right_ = style.right = right; + } + } else { + if (this.rendered_.right_ !== '') { + this.rendered_.right_ = style.right = ''; + } + var offsetX = 0; + if (positioning == ol.OverlayPositioning.BOTTOM_CENTER || + positioning == ol.OverlayPositioning.CENTER_CENTER || + positioning == ol.OverlayPositioning.TOP_CENTER) { + offsetX = goog.style.getSize(this.element_).width / 2; + } + var left = Math.round(pixel[0] - offsetX) + 'px'; + if (this.rendered_.left_ != left) { + this.rendered_.left_ = style.left = left; + } + } + if (positioning == ol.OverlayPositioning.BOTTOM_LEFT || + positioning == ol.OverlayPositioning.BOTTOM_CENTER || + positioning == ol.OverlayPositioning.BOTTOM_RIGHT) { + if (this.rendered_.top_ !== '') { + this.rendered_.top_ = style.top = ''; + } + var bottom = Math.round(mapSize[1] - pixel[1]) + 'px'; + if (this.rendered_.bottom_ != bottom) { + this.rendered_.bottom_ = style.bottom = bottom; + } + } else { + if (this.rendered_.bottom_ !== '') { + this.rendered_.bottom_ = style.bottom = ''; + } + var offsetY = 0; + if (positioning == ol.OverlayPositioning.CENTER_LEFT || + positioning == ol.OverlayPositioning.CENTER_CENTER || + positioning == ol.OverlayPositioning.CENTER_RIGHT) { + offsetY = goog.style.getSize(this.element_).height / 2; + } + var top = Math.round(pixel[1] - offsetY) + 'px'; + if (this.rendered_.top_ != top) { + this.rendered_.top_ = style.top = top; + } + } + + if (!this.rendered_.visible) { + goog.style.setElementShown(this.element_, true); + this.rendered_.visible = true; + } + +}; diff --git a/float-no-zero/ol/ol/parser/ogc/exceptionreportparser.js b/float-no-zero/ol/ol/parser/ogc/exceptionreportparser.js new file mode 100644 index 0000000000..606e96f26a --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/exceptionreportparser.js @@ -0,0 +1,96 @@ +goog.provide('ol.parser.ogc.ExceptionReport'); +goog.require('goog.dom.xml'); +goog.require('ol.parser.XML'); + + + +/** + * @constructor + * @extends {ol.parser.XML} + */ +ol.parser.ogc.ExceptionReport = function() { + var exceptionReader = function(node, exceptionReport) { + var exception = { + code: node.getAttribute('exceptionCode'), + locator: node.getAttribute('locator'), + texts: [] + }; + exceptionReport.exceptions.push(exception); + this.readChildNodes(node, exception); + }; + var exceptionTextReader = function(node, exception) { + var text = this.getChildValue(node); + exception.texts.push(text); + }; + this.readers = { + 'http://www.opengis.net/ogc': { + 'ServiceExceptionReport': function(node, obj) { + obj['exceptionReport'] = {}; + obj['exceptionReport']['exceptions'] = []; + this.readChildNodes(node, obj['exceptionReport']); + }, + 'ServiceException': function(node, exceptionReport) { + var exception = {}; + exception['code'] = node.getAttribute('code'); + exception['locator'] = node.getAttribute('locator'); + exception['text'] = this.getChildValue(node); + exceptionReport['exceptions'].push(exception); + } + }, + 'http://www.opengis.net/ows': { + 'ExceptionReport': function(node, obj) { + obj.success = false; + obj.exceptionReport = { + version: node.getAttribute('version'), + language: node.getAttribute('language'), + exceptions: [] + }; + this.readChildNodes(node, obj.exceptionReport); + }, + 'Exception': function(node, exceptionReport) { + exceptionReader.apply(this, arguments); + }, + 'ExceptionText': function(node, exception) { + exceptionTextReader.apply(this, arguments); + } + }, + 'http://www.opengis.net/ows/1.1': { + 'ExceptionReport': function(node, obj) { + obj.exceptionReport = { + version: node.getAttribute('version'), + language: node.getAttribute('xml:lang'), + exceptions: [] + }; + this.readChildNodes(node, obj.exceptionReport); + }, + 'Exception': function(node, exceptionReport) { + exceptionReader.apply(this, arguments); + }, + 'ExceptionText': function(node, exception) { + exceptionTextReader.apply(this, arguments); + } + } + }; + goog.base(this); +}; +goog.inherits(ol.parser.ogc.ExceptionReport, ol.parser.XML); + + +/** + * Read OGC exception report data from a string, and return an object with + * information about the exceptions. + * + * @param {string|Document} data to read/parse. + * @return {Object} Information about the exceptions that occurred. + */ +ol.parser.ogc.ExceptionReport.prototype.read = function(data) { + if (goog.isString(data)) { + data = goog.dom.xml.loadXml(data); + } + var exceptionInfo = {}; + exceptionInfo['exceptionReport'] = null; + if (data) { + this.readChildNodes(data, exceptionInfo); + } + return exceptionInfo; +}; diff --git a/float-no-zero/ol/ol/parser/ogc/versionedparser.js b/float-no-zero/ol/ol/parser/ogc/versionedparser.js new file mode 100644 index 0000000000..2685b66e93 --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/versionedparser.js @@ -0,0 +1,121 @@ +goog.provide('ol.parser.ogc.Versioned'); +goog.require('goog.dom.xml'); +goog.require('ol.parser.ogc.ExceptionReport'); + + + +/** + * @constructor + * @param {Object=} opt_options Options which will be set on this object. + */ +ol.parser.ogc.Versioned = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + this.options = options; + this.defaultVersion = options.defaultVersion || null; + this.version = options.version; + this.profile = options.profile; + if (goog.isDef(options.allowFallback)) { + this.allowFallback = options.allowFallback; + } else { + this.allowFallback = false; + } + if (goog.isDef(options.stringifyOutput)) { + this.stringifyOutput = options.stringifyOutput; + } else { + this.stringifyOutput = false; + } +}; + + +/** + * @param {Element} root root element. + * @param {Object=} opt_options optional configuration object. + * @return {string} the version to use. + */ +ol.parser.ogc.Versioned.prototype.getVersion = function(root, opt_options) { + var version; + // read + if (root) { + version = this.version; + if (!version) { + version = root.getAttribute('version'); + if (!version) { + version = this.defaultVersion; + } + } + } else { + // write + version = (opt_options && opt_options.version) || + this.version || this.defaultVersion; + } + return version; +}; + + +/** + * @param {string} version the version to use. + * @return {Object} the parser to use. + */ +ol.parser.ogc.Versioned.prototype.getParser = function(version) { + version = version || this.defaultVersion; + var profile = this.profile ? '_' + this.profile : ''; + if (!this.parser || this.parser.VERSION != version) { + var format = this.parsers['v' + version.replace(/\./g, '_') + profile]; + if (!format) { + if (profile !== '' && this.allowFallback) { + // fallback to the non-profiled version of the parser + profile = ''; + format = this.parsers['v' + version.replace(/\./g, '_') + profile]; + } + if (!format) { + throw 'Can\'t find a parser for version ' + + version + profile; + } + } + this.parser = new format(this.options); + } + return this.parser; +}; + + +/** + * Write a document. + * + * @param {Object} obj An object representing the document. + * @param {Object=} opt_options Optional configuration object. + * @return {Element|string} the XML created. + */ +ol.parser.ogc.Versioned.prototype.write = function(obj, opt_options) { + var version = this.getVersion(null, opt_options); + this.parser = this.getParser(version); + var root = this.parser.write(obj, opt_options); + if (this.stringifyOutput === false) { + return root; + } else { + return goog.dom.xml.serialize(root); + } +}; + + +/** + * @param {string|Document} data Data to read. + * @param {Object=} opt_options Options for the reader. + * @return {Object} An object representing the document. + */ +ol.parser.ogc.Versioned.prototype.read = function(data, opt_options) { + if (goog.isString(data)) { + data = goog.dom.xml.loadXml(data); + } + var root = data.documentElement; + var version = this.getVersion(root); + this.parser = this.getParser(version); + var obj = this.parser.read(data, opt_options); + var errorProperty = this.parser.errorProperty || null; + if (errorProperty !== null && obj[errorProperty] === undefined) { + // an error must have happened, so parse it and report back + var format = new ol.parser.ogc.ExceptionReport(); + obj.error = format.read(data); + } + obj.version = version; + return obj; +}; diff --git a/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser.exports b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser.exports new file mode 100644 index 0000000000..2552ec6664 --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.parser.ogc.WMSCapabilities +@exportProperty ol.parser.ogc.WMSCapabilities.prototype.read diff --git a/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser.js b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser.js new file mode 100644 index 0000000000..b2e699c8af --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser.js @@ -0,0 +1,69 @@ +goog.provide('ol.parser.ogc.WMSCapabilities'); +goog.require('ol.parser.ogc.Versioned'); +goog.require('ol.parser.ogc.WMSCapabilities_v1_0_0'); +goog.require('ol.parser.ogc.WMSCapabilities_v1_1_0'); +goog.require('ol.parser.ogc.WMSCapabilities_v1_1_1'); +goog.require('ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC'); +goog.require('ol.parser.ogc.WMSCapabilities_v1_3_0'); + + +/** + * @define {boolean} Whether to enable WMS Capabilities version 1.0.0. + */ +ol.ENABLE_WMSCAPS_1_0_0 = false; + + +/** + * @define {boolean} Whether to enable WMS Capabilities version 1.1.0. + */ +ol.ENABLE_WMSCAPS_1_1_0 = true; + + +/** + * @define {boolean} Whether to enable WMS Capabilities version 1.1.1. + */ +ol.ENABLE_WMSCAPS_1_1_1 = true; + + +/** + * @define {boolean} Whether to enable WMS Capabilities version 1.3.0. + */ +ol.ENABLE_WMSCAPS_1_3_0 = true; + + +/** + * @define {boolean} Whether to enable WMS Capabilities version 1.1.1. + * WMSC profile. + */ +ol.ENABLE_WMSCAPS_1_1_1_WMSC = true; + + + +/** + * @constructor + * @param {Object=} opt_options Options which will be set on this object. + * @extends {ol.parser.ogc.Versioned} + * @todo stability experimental + */ +ol.parser.ogc.WMSCapabilities = function(opt_options) { + opt_options = opt_options || {}; + opt_options['defaultVersion'] = '1.1.1'; + this.parsers = {}; + if (ol.ENABLE_WMSCAPS_1_0_0) { + this.parsers['v1_0_0'] = ol.parser.ogc.WMSCapabilities_v1_0_0; + } + if (ol.ENABLE_WMSCAPS_1_1_0) { + this.parsers['v1_1_0'] = ol.parser.ogc.WMSCapabilities_v1_1_0; + } + if (ol.ENABLE_WMSCAPS_1_1_1) { + this.parsers['v1_1_1'] = ol.parser.ogc.WMSCapabilities_v1_1_1; + } + if (ol.ENABLE_WMSCAPS_1_1_1_WMSC) { + this.parsers['v1_1_1_WMSC'] = ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC; + } + if (ol.ENABLE_WMSCAPS_1_3_0) { + this.parsers['v1_3_0'] = ol.parser.ogc.WMSCapabilities_v1_3_0; + } + goog.base(this, opt_options); +}; +goog.inherits(ol.parser.ogc.WMSCapabilities, ol.parser.ogc.Versioned); diff --git a/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1.js b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1.js new file mode 100644 index 0000000000..55ed0c5a07 --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1.js @@ -0,0 +1,317 @@ +goog.provide('ol.parser.ogc.WMSCapabilities_v1'); +goog.require('goog.dom.xml'); +goog.require('goog.object'); +goog.require('ol.parser.XML'); + + + +/** + * Read [WMS](http://www.opengeospatial.org/standards/wms) capabilities + * + * @constructor + * @extends {ol.parser.XML} + */ +ol.parser.ogc.WMSCapabilities_v1 = function() { + this.defaultNamespaceURI = 'http://www.opengis.net/wms'; + this.errorProperty = 'service'; + this.readers = { + 'http://www.opengis.net/wms': { + 'Service': function(node, obj) { + obj['service'] = {}; + this.readChildNodes(node, obj['service']); + }, + 'Name': function(node, obj) { + obj['name'] = this.getChildValue(node); + }, + 'Title': function(node, obj) { + obj['title'] = this.getChildValue(node); + }, + 'Abstract': function(node, obj) { + obj['abstract'] = this.getChildValue(node); + }, + 'BoundingBox': function(node, obj) { + var bbox = {}; + bbox['bbox'] = [ + parseFloat(node.getAttribute('minx')), + parseFloat(node.getAttribute('miny')), + parseFloat(node.getAttribute('maxx')), + parseFloat(node.getAttribute('maxy')) + ]; + var res = { + x: parseFloat(node.getAttribute('resx')), + y: parseFloat(node.getAttribute('resy')) + }; + if (! (isNaN(res.x) && isNaN(res.y))) { + bbox['res'] = res; + } + // return the bbox so that descendant classes can set the + // CRS and SRS and add it to the obj + return bbox; + }, + 'OnlineResource': function(node, obj) { + obj['href'] = this.getAttributeNS(node, 'http://www.w3.org/1999/xlink', + 'href'); + }, + 'ContactInformation': function(node, obj) { + obj['contactInformation'] = {}; + this.readChildNodes(node, obj['contactInformation']); + }, + 'ContactPersonPrimary': function(node, obj) { + obj['personPrimary'] = {}; + this.readChildNodes(node, obj['personPrimary']); + }, + 'ContactPerson': function(node, obj) { + obj['person'] = this.getChildValue(node); + }, + 'ContactOrganization': function(node, obj) { + obj['organization'] = this.getChildValue(node); + }, + 'ContactPosition': function(node, obj) { + obj['position'] = this.getChildValue(node); + }, + 'ContactAddress': function(node, obj) { + obj['contactAddress'] = {}; + this.readChildNodes(node, obj['contactAddress']); + }, + 'AddressType': function(node, obj) { + obj['type'] = this.getChildValue(node); + }, + 'Address': function(node, obj) { + obj['address'] = this.getChildValue(node); + }, + 'City': function(node, obj) { + obj['city'] = this.getChildValue(node); + }, + 'StateOrProvince': function(node, obj) { + obj['stateOrProvince'] = this.getChildValue(node); + }, + 'PostCode': function(node, obj) { + obj['postcode'] = this.getChildValue(node); + }, + 'Country': function(node, obj) { + obj['country'] = this.getChildValue(node); + }, + 'ContactVoiceTelephone': function(node, obj) { + obj['phone'] = this.getChildValue(node); + }, + 'ContactFacsimileTelephone': function(node, obj) { + obj['fax'] = this.getChildValue(node); + }, + 'ContactElectronicMailAddress': function(node, obj) { + obj['email'] = this.getChildValue(node); + }, + 'Fees': function(node, obj) { + var fees = this.getChildValue(node); + if (fees && fees.toLowerCase() != 'none') { + obj['fees'] = fees; + } + }, + 'AccessConstraints': function(node, obj) { + var constraints = this.getChildValue(node); + if (constraints && constraints.toLowerCase() != 'none') { + obj['accessConstraints'] = constraints; + } + }, + 'Capability': function(node, obj) { + obj['capability'] = {}; + obj['capability']['nestedLayers'] = []; + obj['capability']['layers'] = []; + this.readChildNodes(node, obj['capability']); + }, + 'Request': function(node, obj) { + obj['request'] = {}; + this.readChildNodes(node, obj['request']); + }, + 'GetCapabilities': function(node, obj) { + obj['getcapabilities'] = {}; + obj['getcapabilities']['formats'] = []; + this.readChildNodes(node, obj['getcapabilities']); + }, + 'Format': function(node, obj) { + if (goog.isArray(obj['formats'])) { + obj['formats'].push(this.getChildValue(node)); + } else { + obj['format'] = this.getChildValue(node); + } + }, + 'DCPType': function(node, obj) { + this.readChildNodes(node, obj); + }, + 'HTTP': function(node, obj) { + this.readChildNodes(node, obj); + }, + 'Get': function(node, obj) { + obj['get'] = {}; + this.readChildNodes(node, obj['get']); + }, + 'Post': function(node, obj) { + obj['post'] = {}; + this.readChildNodes(node, obj['post']); + }, + 'GetMap': function(node, obj) { + obj['getmap'] = {}; + obj['getmap']['formats'] = []; + this.readChildNodes(node, obj['getmap']); + }, + 'GetFeatureInfo': function(node, obj) { + obj['getfeatureinfo'] = {}; + obj['getfeatureinfo']['formats'] = []; + this.readChildNodes(node, obj['getfeatureinfo']); + }, + 'Exception': function(node, obj) { + obj['exception'] = {}; + obj['exception']['formats'] = []; + this.readChildNodes(node, obj['exception']); + }, + 'Layer': function(node, obj) { + var parentLayer, capability; + if (obj['capability']) { + capability = obj['capability']; + parentLayer = obj; + } else { + capability = obj; + } + var attrNode = node.getAttributeNode('queryable'); + var queryable = (attrNode && attrNode.specified) ? + node.getAttribute('queryable') : null; + attrNode = node.getAttributeNode('cascaded'); + var cascaded = (attrNode && attrNode.specified) ? + node.getAttribute('cascaded') : null; + attrNode = node.getAttributeNode('opaque'); + var opaque = (attrNode && attrNode.specified) ? + node.getAttribute('opaque') : null; + var noSubsets = node.getAttribute('noSubsets'); + var fixedWidth = node.getAttribute('fixedWidth'); + var fixedHeight = node.getAttribute('fixedHeight'); + var parent = parentLayer || {}; + var layer = { + 'nestedLayers': [], + 'styles': parentLayer ? [].concat(parentLayer['styles']) : [], + 'srs': {}, + 'metadataURLs': [], + 'bbox': {}, + 'llbbox': parent['llbbox'], + 'dimensions': {}, + 'authorityURLs': {}, + 'identifiers': {}, + 'keywords': [], + 'queryable': (queryable && queryable !== '') ? + (queryable === '1' || queryable === 'true') : + (parent['queryable'] || false), + 'cascaded': (cascaded !== null) ? parseInt(cascaded, 10) : + (parent['cascaded'] || 0), + 'opaque': opaque ? + (opaque === '1' || opaque === 'true') : + (parent['opaque'] || false), + 'noSubsets': (noSubsets !== null) ? + (noSubsets === '1' || noSubsets === 'true') : + (parent['noSubsets'] || false), + 'fixedWidth': (fixedWidth !== null) ? + parseInt(fixedWidth, 10) : (parent['fixedWidth'] || 0), + 'fixedHeight': (fixedHeight !== null) ? + parseInt(fixedHeight, 10) : (parent['fixedHeight'] || 0), + 'minScale': parent['minScale'], + 'maxScale': parent['maxScale'], + 'attribution': parent['attribution'] + }; + if (parentLayer) { + goog.object.extend(layer['srs'], parent['srs']); + goog.object.extend(layer['bbox'], parent['bbox']); + goog.object.extend(layer['dimensions'], parent['dimensions']); + goog.object.extend(layer['authorityURLs'], parent['authorityURLs']); + } + obj['nestedLayers'].push(layer); + layer['capability'] = capability; + this.readChildNodes(node, layer); + delete layer['capability']; + if (layer['name']) { + var parts = layer['name'].split(':'), + request = capability['request'], + gfi = request['getfeatureinfo']; + if (parts.length > 0) { + layer['prefix'] = parts[0]; + } + capability['layers'].push(layer); + if (!goog.isDef(layer['formats'])) { + layer['formats'] = request['getmap']['formats']; + } + if (!goog.isDef(layer['infoFormats']) && gfi) { + layer['infoFormats'] = gfi['formats']; + } + } + }, + 'Attribution': function(node, obj) { + obj['attribution'] = {}; + this.readChildNodes(node, obj['attribution']); + }, + 'LogoURL': function(node, obj) { + obj['logo'] = { + 'width': node.getAttribute('width'), + 'height': node.getAttribute('height') + }; + this.readChildNodes(node, obj['logo']); + }, + 'Style': function(node, obj) { + var style = {}; + obj['styles'].push(style); + this.readChildNodes(node, style); + }, + 'LegendURL': function(node, obj) { + var legend = { + 'width': node.getAttribute('width'), + 'height': node.getAttribute('height') + }; + obj['legend'] = legend; + this.readChildNodes(node, legend); + }, + 'MetadataURL': function(node, obj) { + var metadataURL = {'type': node.getAttribute('type')}; + obj['metadataURLs'].push(metadataURL); + this.readChildNodes(node, metadataURL); + }, + 'DataURL': function(node, obj) { + obj['dataURL'] = {}; + this.readChildNodes(node, obj['dataURL']); + }, + 'FeatureListURL': function(node, obj) { + obj['featureListURL'] = {}; + this.readChildNodes(node, obj['featureListURL']); + }, + 'AuthorityURL': function(node, obj) { + var name = node.getAttribute('name'); + var authority = {}; + this.readChildNodes(node, authority); + obj['authorityURLs'][name] = authority['href']; + }, + 'Identifier': function(node, obj) { + var authority = node.getAttribute('authority'); + obj['identifiers'][authority] = this.getChildValue(node); + }, + 'KeywordList': function(node, obj) { + this.readChildNodes(node, obj); + }, + 'SRS': function(node, obj) { + obj['srs'][this.getChildValue(node)] = true; + } + } + }; + goog.base(this); +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1, ol.parser.XML); + + +/** + * @param {string|Document|Element} data Data to read. + * @return {Object} An object representing the document. + */ +ol.parser.ogc.WMSCapabilities_v1.prototype.read = function(data) { + if (goog.isString(data)) { + data = goog.dom.xml.loadXml(data); + } + if (data && data.nodeType == 9) { + data = data.documentElement; + } + var obj = {}; + this.readNode(data, obj); + return obj; +}; diff --git a/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_0_0.js b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_0_0.js new file mode 100644 index 0000000000..3053a2ad8b --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_0_0.js @@ -0,0 +1,66 @@ +goog.provide('ol.parser.ogc.WMSCapabilities_v1_0_0'); + +goog.require('goog.object'); +goog.require('goog.string'); +goog.require('ol.parser.ogc.WMSCapabilities_v1_1_0'); + + + +/** + * Read [WMS](http://www.opengeospatial.org/standards/wms) capabilities + * version 1.0.0 + * + * @constructor + * @extends {ol.parser.ogc.WMSCapabilities_v1_1_0} + */ +ol.parser.ogc.WMSCapabilities_v1_0_0 = function() { + goog.base(this); + this.version = '1.0.0'; + goog.object.extend(this.readers['http://www.opengis.net/wms'], { + 'Format': function(node, obj) { + for (var i = 0, ii = node.childNodes.length; i < ii; i++) { + var child = node.childNodes[i]; + var local = child.localName || child.nodeName.split(':').pop(); + if (goog.isArray(obj['formats'])) { + obj['formats'].push(local); + } else { + obj['format'] = local; + } + } + }, + 'Keywords': function(node, obj) { + if (!goog.isDef(obj['keywords'])) { + obj['keywords'] = []; + } + var keywords = this.getChildValue(node).split(/ +/); + for (var i = 0, ii = keywords.length; i < ii; ++i) { + if (!goog.string.isEmpty(keywords[i])) { + obj['keywords'].push({'value': keywords[i]}); + } + } + }, + 'OnlineResource': function(node, obj) { + obj['href'] = this.getChildValue(node); + }, + 'Get': function(node, obj) { + obj['get'] = {'href': node.getAttribute('onlineResource')}; + }, + 'Post': function(node, obj) { + obj['post'] = {'href': node.getAttribute('onlineResource')}; + }, + 'Map': function(node, obj) { + var reader = this.readers[this.defaultNamespaceURI]['GetMap']; + reader.apply(this, arguments); + }, + 'Capabilities': function(node, obj) { + var reader = this.readers[this.defaultNamespaceURI]['GetCapabilities']; + reader.apply(this, arguments); + }, + 'FeatureInfo': function(node, obj) { + var reader = this.readers[this.defaultNamespaceURI]['GetFeatureInfo']; + reader.apply(this, arguments); + } + }); +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_0_0, + ol.parser.ogc.WMSCapabilities_v1_1_0); diff --git a/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1.js b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1.js new file mode 100644 index 0000000000..b367cfa339 --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1.js @@ -0,0 +1,101 @@ +goog.provide('ol.parser.ogc.WMSCapabilities_v1_1'); + +goog.require('goog.object'); +goog.require('ol.parser.ogc.WMSCapabilities_v1'); + + + +/** + * @constructor + * @extends {ol.parser.ogc.WMSCapabilities_v1} + */ +ol.parser.ogc.WMSCapabilities_v1_1 = function() { + goog.base(this); + var bboxreader = this.readers['http://www.opengis.net/wms']['BoundingBox']; + goog.object.extend(this.readers['http://www.opengis.net/wms'], { + 'WMT_MS_Capabilities': function(node, obj) { + this.readChildNodes(node, obj); + }, + 'Keyword': function(node, obj) { + if (obj['keywords']) { + obj['keywords'].push({'value': this.getChildValue(node)}); + } + }, + 'DescribeLayer': function(node, obj) { + obj['describelayer'] = {'formats': []}; + this.readChildNodes(node, obj['describelayer']); + }, + 'GetLegendGraphic': function(node, obj) { + obj['getlegendgraphic'] = {'formats': []}; + this.readChildNodes(node, obj['getlegendgraphic']); + }, + 'GetStyles': function(node, obj) { + obj['getstyles'] = {'formats': []}; + this.readChildNodes(node, obj['getstyles']); + }, + 'PutStyles': function(node, obj) { + obj['putstyles'] = {'formats': []}; + this.readChildNodes(node, obj['putstyles']); + }, + 'UserDefinedSymbolization': function(node, obj) { + var userSymbols = { + 'supportSLD': parseInt(node.getAttribute('SupportSLD'), 10) == 1, + 'userLayer': parseInt(node.getAttribute('UserLayer'), 10) == 1, + 'userStyle': parseInt(node.getAttribute('UserStyle'), 10) == 1, + 'remoteWFS': parseInt(node.getAttribute('RemoteWFS'), 10) == 1 + }; + obj['userSymbols'] = userSymbols; + }, + 'LatLonBoundingBox': function(node, obj) { + obj['llbbox'] = [ + parseFloat(node.getAttribute('minx')), + parseFloat(node.getAttribute('miny')), + parseFloat(node.getAttribute('maxx')), + parseFloat(node.getAttribute('maxy')) + ]; + }, + 'BoundingBox': function(node, obj) { + var bbox = bboxreader.apply(this, arguments); + bbox['srs'] = node.getAttribute('SRS'); + obj['bbox'][bbox['srs']] = bbox; + }, + 'ScaleHint': function(node, obj) { + var min = parseFloat(node.getAttribute('min')); + var max = parseFloat(node.getAttribute('max')); + var rad2 = Math.pow(2, 0.5); + var dpi = (25.4 / 0.28); + var ipm = 39.37; + if (min !== 0) { + obj['maxScale'] = parseFloat((min / rad2) * ipm * dpi); + } + if (max != Infinity) { + obj['minScale'] = parseFloat((max / rad2) * ipm * dpi); + } + }, + 'Dimension': function(node, obj) { + var name = node.getAttribute('name').toLowerCase(); + var dim = { + 'name': name, + 'units': node.getAttribute('units'), + 'unitsymbol': node.getAttribute('unitSymbol') + }; + obj['dimensions'][dim.name] = dim; + }, + 'Extent': function(node, obj) { + var name = node.getAttribute('name').toLowerCase(); + if (name in obj['dimensions']) { + var extent = obj['dimensions'][name]; + extent['nearestVal'] = + node.getAttribute('nearestValue') === '1'; + extent['multipleVal'] = + node.getAttribute('multipleValues') === '1'; + extent['current'] = node.getAttribute('current') === '1'; + extent['default'] = node.getAttribute('default') || ''; + var values = this.getChildValue(node); + extent['values'] = values.split(','); + } + } + }); +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1, + ol.parser.ogc.WMSCapabilities_v1); diff --git a/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_0.js b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_0.js new file mode 100644 index 0000000000..018d3cb78f --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_0.js @@ -0,0 +1,29 @@ +goog.provide('ol.parser.ogc.WMSCapabilities_v1_1_0'); + +goog.require('goog.object'); +goog.require('ol.parser.ogc.WMSCapabilities_v1_1'); + + + +/** + * Read [WMS](http://www.opengeospatial.org/standards/wms) capabilities + * version 1.1.0 + * + * @constructor + * @extends {ol.parser.ogc.WMSCapabilities_v1_1} + */ +ol.parser.ogc.WMSCapabilities_v1_1_0 = function() { + goog.base(this); + this.version = '1.1.0'; + goog.object.extend(this.readers['http://www.opengis.net/wms'], { + 'SRS': function(node, obj) { + var srs = this.getChildValue(node); + var values = srs.split(/ +/); + for (var i = 0, ii = values.length; i < ii; i++) { + obj['srs'][values[i]] = true; + } + } + }); +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1_0, + ol.parser.ogc.WMSCapabilities_v1_1); diff --git a/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_1.js b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_1.js new file mode 100644 index 0000000000..6dd29470da --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_1.js @@ -0,0 +1,25 @@ +goog.provide('ol.parser.ogc.WMSCapabilities_v1_1_1'); + +goog.require('goog.object'); +goog.require('ol.parser.ogc.WMSCapabilities_v1_1'); + + + +/** + * Read [WMS](http://www.opengeospatial.org/standards/wms) capabilities + * version 1.1.1 + * + * @constructor + * @extends {ol.parser.ogc.WMSCapabilities_v1_1} + */ +ol.parser.ogc.WMSCapabilities_v1_1_1 = function() { + goog.base(this); + this.version = '1.1.1'; + goog.object.extend(this.readers['http://www.opengis.net/wms'], { + 'SRS': function(node, obj) { + obj['srs'][this.getChildValue(node)] = true; + } + }); +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1_1, + ol.parser.ogc.WMSCapabilities_v1_1); diff --git a/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_1_WMSC.js b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_1_WMSC.js new file mode 100644 index 0000000000..3b665c8bd4 --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_1_1_WMSC.js @@ -0,0 +1,48 @@ +goog.provide('ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC'); + +goog.require('goog.object'); +goog.require('ol.parser.ogc.WMSCapabilities_v1_1_1'); + + + +/** + * @constructor + * @extends {ol.parser.ogc.WMSCapabilities_v1_1_1} + */ +ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC = function() { + goog.base(this); + this.profile = 'WMSC'; + goog.object.extend(this.readers['http://www.opengis.net/wms'], { + 'VendorSpecificCapabilities': function(node, obj) { + obj['vendorSpecific'] = {'tileSets': []}; + this.readChildNodes(node, obj['vendorSpecific']); + }, + 'TileSet': function(node, vendorSpecific) { + var tileset = {'srs': {}, 'bbox': {}, 'resolutions': []}; + this.readChildNodes(node, tileset); + vendorSpecific.tileSets.push(tileset); + }, + 'Resolutions': function(node, tileset) { + var res = this.getChildValue(node).split(' '); + for (var i = 0, ii = res.length; i < ii; i++) { + if (res[i] !== '') { + tileset['resolutions'].push(parseFloat(res[i])); + } + } + }, + 'Width': function(node, tileset) { + tileset['width'] = parseInt(this.getChildValue(node), 10); + }, + 'Height': function(node, tileset) { + tileset['height'] = parseInt(this.getChildValue(node), 10); + }, + 'Layers': function(node, tileset) { + tileset['layers'] = this.getChildValue(node); + }, + 'Styles': function(node, tileset) { + tileset['styles'] = this.getChildValue(node); + } + }); +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC, + ol.parser.ogc.WMSCapabilities_v1_1_1); diff --git a/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_3_0.js b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_3_0.js new file mode 100644 index 0000000000..fc6a79c685 --- /dev/null +++ b/float-no-zero/ol/ol/parser/ogc/wmscapabilitiesparser_v1_3_0.js @@ -0,0 +1,114 @@ +goog.provide('ol.parser.ogc.WMSCapabilities_v1_3_0'); + +goog.require('goog.object'); +goog.require('ol.parser.ogc.WMSCapabilities_v1'); + + + +/** + * Read [WMS](http://www.opengeospatial.org/standards/wms) capabilities + * version 1.3.0 + * + * @constructor + * @extends {ol.parser.ogc.WMSCapabilities_v1} + */ +ol.parser.ogc.WMSCapabilities_v1_3_0 = function() { + goog.base(this); + var bboxreader = this.readers['http://www.opengis.net/wms']['BoundingBox']; + goog.object.extend(this.readers['http://www.opengis.net/wms'], { + 'WMS_Capabilities': function(node, obj) { + this.readChildNodes(node, obj); + }, + 'LayerLimit': function(node, obj) { + obj['layerLimit'] = parseInt(this.getChildValue(node), 10); + }, + 'MaxWidth': function(node, obj) { + obj['maxWidth'] = parseInt(this.getChildValue(node), 10); + }, + 'MaxHeight': function(node, obj) { + obj['maxHeight'] = parseInt(this.getChildValue(node), 10); + }, + 'BoundingBox': function(node, obj) { + var bbox = bboxreader.apply(this, arguments); + bbox['srs'] = node.getAttribute('CRS'); + obj['bbox'][bbox['srs']] = bbox; + }, + 'CRS': function(node, obj) { + // CRS is the synonym of SRS + this.readers['http://www.opengis.net/wms']['SRS'].apply(this, arguments); + }, + 'EX_GeographicBoundingBox': function(node, obj) { + // replacement of LatLonBoundingBox + obj['llbbox'] = []; + this.readChildNodes(node, obj['llbbox']); + }, + 'westBoundLongitude': function(node, obj) { + obj[0] = this.getChildValue(node); + }, + 'eastBoundLongitude': function(node, obj) { + obj[2] = this.getChildValue(node); + }, + 'southBoundLatitude': function(node, obj) { + obj[1] = this.getChildValue(node); + }, + 'northBoundLatitude': function(node, obj) { + obj[3] = this.getChildValue(node); + }, + 'MinScaleDenominator': function(node, obj) { + obj['maxScale'] = parseFloat(this.getChildValue(node)).toPrecision(16); + }, + 'MaxScaleDenominator': function(node, obj) { + obj['minScale'] = parseFloat(this.getChildValue(node)).toPrecision(16); + }, + 'Dimension': function(node, obj) { + // dimension has extra attributes: default, multipleValues, + // nearestValue, current which used to be part of Extent. It now + // also contains the values. + var name = node.getAttribute('name').toLowerCase(); + var dim = { + 'name': name, + 'units': node.getAttribute('units'), + 'unitsymbol': node.getAttribute('unitSymbol'), + 'nearestVal': node.getAttribute('nearestValue') === '1', + 'multipleVal': node.getAttribute('multipleValues') === '1', + 'default': node.getAttribute('default') || '', + 'current': node.getAttribute('current') === '1', + 'values': this.getChildValue(node).split(',') + }; + // Theoretically there can be more dimensions with the same + // name, but with a different unit. Until we meet such a case, + // let's just keep the same structure as the WMS 1.1 + // GetCapabilities parser uses. We will store the last + // one encountered. + obj['dimensions'][dim['name']] = dim; + }, + 'Keyword': function(node, obj) { + var keyword = {'value': this.getChildValue(node), + 'vocabulary': node.getAttribute('vocabulary')}; + if (obj['keywords']) { + obj['keywords'].push(keyword); + } + } + }); + this.readers['sld'] = { + 'UserDefinedSymbolization': function(node, obj) { + var readers = this.readers['http://www.opengis.net/wms']; + readers.UserDefinedSymbolization.apply(this, arguments); + // add the two extra attributes + var value = node.getAttribute('InlineFeature'); + obj['userSymbols']['inlineFeature'] = parseInt(value, 10) == 1; + value = node.getAttribute('RemoteWCS'); + obj['userSymbols']['remoteWCS'] = parseInt(value, 10) == 1; + }, + 'DescribeLayer': function(node, obj) { + var readers = this.readers['http://www.opengis.net/wms']; + readers.DescribeLayer.apply(this, arguments); + }, + 'GetLegendGraphic': function(node, obj) { + var readers = this.readers['http://www.opengis.net/wms']; + readers.GetLegendGraphic.apply(this, arguments); + } + }; +}; +goog.inherits(ol.parser.ogc.WMSCapabilities_v1_3_0, + ol.parser.ogc.WMSCapabilities_v1); diff --git a/float-no-zero/ol/ol/parser/parser.js b/float-no-zero/ol/ol/parser/parser.js new file mode 100644 index 0000000000..bf79f729a6 --- /dev/null +++ b/float-no-zero/ol/ol/parser/parser.js @@ -0,0 +1,9 @@ +goog.provide('ol.parser.Parser'); + + + +/** + * @constructor + * @todo stability experimental + */ +ol.parser.Parser = function() {}; diff --git a/float-no-zero/ol/ol/parser/xmlparser.js b/float-no-zero/ol/ol/parser/xmlparser.js new file mode 100644 index 0000000000..a531e276eb --- /dev/null +++ b/float-no-zero/ol/ol/parser/xmlparser.js @@ -0,0 +1,296 @@ +goog.provide('ol.parser.XML'); + +goog.require('goog.dom.xml'); +goog.require('ol.parser.Parser'); + + + +/** + * @constructor + * @extends {ol.parser.Parser} + * @todo stability experimental + */ +ol.parser.XML = function() { + if (goog.global.ActiveXObject) { + this.xmldom = new ActiveXObject('Microsoft.XMLDOM'); + } + this.regExes = { + trimSpace: (/^\s*|\s*$/g), + removeSpace: (/\s*/g), + splitSpace: (/\s+/), + trimComma: (/\s*,\s*/g) + }; +}; +goog.inherits(ol.parser.XML, ol.parser.Parser); + + +/** + * Shorthand for applying one of the named readers given the node + * namespace and local name. Readers take two args (node, obj) and + * generally extend or modify the second. + * + * @param {Element|Document} node The node to be read (required). + * @param {Object} obj The object to be modified (optional). + * @return {Object} The input object, modified (or a new one if none was + * provided). + */ +ol.parser.XML.prototype.readNode = function(node, obj) { + if (!obj) { + obj = {}; + } + var group = this.readers[node.namespaceURI] || + this.readers[this.defaultNamespaceURI]; + if (group) { + var local = node.localName || node.nodeName.split(':').pop(); + var reader = group[local] || group['*']; + if (reader) { + reader.apply(this, [node, obj]); + } + } + return obj; +}; + + +/** + * Shorthand for applying the named readers to all children of a node. + * For each child of type 1 (element), is called. + * + * @param {Element|Document} node The node to be read (required). + * @param {Object} obj The object to be modified (optional). + * @return {Object} The input object, modified. + */ +ol.parser.XML.prototype.readChildNodes = function(node, obj) { + if (!obj) { + obj = {}; + } + var children = node.childNodes; + var child; + for (var i = 0, len = children.length; i < len; ++i) { + child = children[i]; + if (child.nodeType == 1) { + this.readNode(child, obj); + } + } + return obj; +}; + + +/** + * Get the textual value of the node if it exists, or return an + * optional default string. Returns an empty string if no first child + * exists and no default value is supplied. + * + * @param {Element} node The element used to look for a first child value. + * @param {string} def Optional string to return in the event that no + * first child value exists. + * @return {string} The value of the first child of the given node. + */ +ol.parser.XML.prototype.getChildValue = function(node, def) { + var value = def || ''; + if (node) { + for (var child = node.firstChild; child; child = child.nextSibling) { + switch (child.nodeType) { + case 3: // text node + case 4: // cdata section + value += child.nodeValue; + break; + default: + break; + } + } + } + return value; +}; + + +/** + * Get an attribute node given the namespace URI and local name. + * + * @param {Element} node Node on which to search for attribute nodes. + * @param {string} uri Namespace URI. + * @param {string} name Local name of the attribute (without the prefix). + * @return {?Element} An attribute node or null if none found. + */ +ol.parser.XML.prototype.getAttributeNodeNS = function(node, uri, name) { + var attributeNode = null; + if (node.getAttributeNodeNS) { + attributeNode = node.getAttributeNodeNS(uri, name); + } else { + var attributes = node.attributes; + var potentialNode, fullName; + for (var i = 0, len = attributes.length; i < len; ++i) { + potentialNode = attributes[i]; + if (potentialNode.namespaceURI == uri) { + fullName = (potentialNode.prefix) ? + (potentialNode.prefix + ':' + name) : name; + if (fullName == potentialNode.nodeName) { + attributeNode = potentialNode; + break; + } + } + } + } + return attributeNode; +}; + + +/** + * Get an attribute value given the namespace URI and local name. + * + * @param {Element} node Node on which to search for an attribute. + * @param {string} uri Namespace URI. + * @param {string} name Local name of the attribute (without the prefix). + * @return {string} An attribute value or and empty string if none found. + */ +ol.parser.XML.prototype.getAttributeNS = function(node, uri, name) { + var attributeValue = ''; + if (node.getAttributeNS) { + attributeValue = node.getAttributeNS(uri, name) || ''; + } else { + var attributeNode = this.getAttributeNodeNS(node, uri, name); + if (attributeNode) { + attributeValue = attributeNode.nodeValue; + } + } + return attributeValue; +}; + + +/** + * Create a new element with namespace. This node can be appended to + * another node with the standard node.appendChild method. For + * cross-browser support, this method must be used instead of + * document.createElementNS. + * + * @param {string} name The qualified name of the element (prefix:localname). + * @param {string=} opt_uri Namespace URI for the element. + * @return {Element} A DOM element with namespace. + */ +ol.parser.XML.prototype.createElementNS = function(name, opt_uri) { + var uri = opt_uri ? opt_uri : this.defaultNamespaceURI; + var element; + if (this.xmldom) { + element = this.xmldom.createNode(1, name, uri); + } else { + element = document.createElementNS(uri, name); + } + return element; +}; + + +/** + * Shorthand for applying one of the named writers and appending the + * results to a node. + * + * @param {string} name The name of a node to generate. Only use a local name. + * @param {Object|string|number} obj Structure containing data for the writer. + * @param {?string=} opt_uri The name space uri to which the node + * belongs. + * @param {Element=} opt_parent Result will be appended to this node. If no + * parent is supplied, the node will not be appended to anything. + * @return {?Element} The child node. + */ +ol.parser.XML.prototype.writeNode = function(name, obj, opt_uri, opt_parent) { + var child = null; + if (goog.isDef(this.writers)) { + var uri = opt_uri ? opt_uri : this.defaultNamespaceURI; + child = this.writers[uri][name].apply(this, [obj]); + if (opt_parent && child) { + opt_parent.appendChild(child); + } + } + return child; +}; + + +/** + * Create a text node. This node can be appended to another node with + * the standard node.appendChild method. For cross-browser support, + * this method must be used instead of document.createTextNode. + * + * @param {string} text The text of the node. + * @return {Element} A DOM text node. + */ +ol.parser.XML.prototype.createTextNode = function(text) { + var node; + if (this.xmldom) { + node = this.xmldom.createTextNode(text); + } else { + node = document.createTextNode(text); + } + return node; +}; + + +/** + * Adds a new attribute or changes the value of an attribute with the given + * namespace and name. + * + * @param {Element} node Element node on which to set the attribute. + * @param {string} uri Namespace URI for the attribute. + * @param {string} name Qualified name (prefix:localname) for the attribute. + * @param {string} value Attribute value. + */ +ol.parser.XML.prototype.setAttributeNS = function(node, uri, name, value) { + if (node.setAttributeNS) { + node.setAttributeNS(uri, name, value); + } else { + if (this.xmldom) { + if (uri) { + var attribute = node.ownerDocument.createNode( + 2, name, uri); + attribute.nodeValue = value; + node.setAttributeNode(attribute); + } else { + node.setAttribute(name, value); + } + } else { + throw new Error('setAttributeNS not implemented'); + } + } +}; + + +/** + * Serializes a node. + * + * @param {Element} node Element node to serialize. + * @return {string} The serialized XML string. + */ +ol.parser.XML.prototype.serialize = function(node) { + if (this.xmldom) { + return node.xml; + } else if (node.nodeType == 1) { + // Add nodes to a document before serializing. Everything else + // is serialized as is. This is also needed to get all namespaces + // defined in some browsers such as Chrome (xmlns attributes). + var doc = document.implementation.createDocument('', '', null); + if (doc.importNode) { + doc.appendChild(doc.importNode(node, true)); + } else { + doc.appendChild(node); + } + return goog.dom.xml.serialize(doc); + } else { + return goog.dom.xml.serialize(node); + } +}; + + +/** + * Create a document fragment node that can be appended to another node + * created by createElementNS. This will call + * document.createDocumentFragment outside of IE. In IE, the ActiveX + * object's createDocumentFragment method is used. + * + * @return {Element} A document fragment. + */ +ol.parser.XML.prototype.createDocumentFragment = function() { + var element; + if (this.xmldom) { + element = this.xmldom.createDocumentFragment(); + } else { + element = document.createDocumentFragment(); + } + return element; +}; diff --git a/float-no-zero/ol/ol/pixel.js b/float-no-zero/ol/ol/pixel.js new file mode 100644 index 0000000000..40c8a11da8 --- /dev/null +++ b/float-no-zero/ol/ol/pixel.js @@ -0,0 +1,7 @@ +goog.provide('ol.Pixel'); + + +/** + * @typedef {Array.} + */ +ol.Pixel; diff --git a/float-no-zero/ol/ol/proj/chprojection.js b/float-no-zero/ol/ol/proj/chprojection.js new file mode 100644 index 0000000000..50b5fd3818 --- /dev/null +++ b/float-no-zero/ol/ol/proj/chprojection.js @@ -0,0 +1,468 @@ +goog.provide('ol.proj.CH'); +goog.provide('ol.proj.EPSG2056'); +goog.provide('ol.proj.EPSG21781'); + +goog.require('goog.asserts'); +goog.require('goog.math'); +goog.require('ol.ellipsoid.BESSEL1841'); +goog.require('ol.proj'); +goog.require('ol.proj.EPSG4326'); +goog.require('ol.proj.Projection'); +goog.require('ol.proj.Units'); + + + +/** + * Internal base class for Swiss grid projections. + * @constructor + * @extends {ol.proj.Projection} + * @param {{code: string, extent: ol.Extent}} options Options. + */ +ol.proj.CH = function(options) { + goog.base(this, { + code: options.code, + extent: options.extent, + global: false, + units: ol.proj.Units.METERS + }); +}; +goog.inherits(ol.proj.CH, ol.proj.Projection); + + +/** + * @const + * @type {number} + */ +ol.proj.CH.PHI0 = goog.math.toRadians((3600 * 46 + 60 * 57 + 8.66) / 3600); + + +/** + * @const + * @type {number} + */ +ol.proj.CH.LAMBDA0 = goog.math.toRadians((3600 * 7 + 60 * 26 + 22.5) / 3600); + + +/** + * @const + * @type {ol.Ellipsoid} + */ +ol.proj.CH.ELLIPSOID = ol.ellipsoid.BESSEL1841; + + +/** + * @const + * @type {number} + */ +ol.proj.CH.COS_PHI0 = Math.cos(ol.proj.CH.PHI0); + + +/** + * @const + * @type {number} + */ +ol.proj.CH.SIN_PHI0 = Math.sin(ol.proj.CH.PHI0); + + +/** + * @const + * @type {number} + */ +ol.proj.CH.R = ol.proj.CH.ELLIPSOID.a * Math.sqrt(1 - + ol.proj.CH.ELLIPSOID.eSquared) / (1 - ol.proj.CH.ELLIPSOID.eSquared * + ol.proj.CH.SIN_PHI0 * ol.proj.CH.SIN_PHI0); + + +/** + * @const + * @type {number} + */ +ol.proj.CH.ALPHA = Math.sqrt(1 + + ol.proj.CH.ELLIPSOID.eSquared * Math.pow(ol.proj.CH.COS_PHI0, 4) / + (1 - ol.proj.CH.ELLIPSOID.eSquared)); + + +/** + * @const + * @type {number} + */ +ol.proj.CH.SIN_B0 = ol.proj.CH.SIN_PHI0 / ol.proj.CH.ALPHA; + + +/** + * @const + * @type {number} + */ +ol.proj.CH.B0 = Math.asin(ol.proj.CH.SIN_B0); + + +/** + * @const + * @type {number} + */ +ol.proj.CH.COS_B0 = Math.cos(ol.proj.CH.B0); +// FIXME should we use Math.sqrt(1 - ol.proj.CH.SIN_B0 * ol.proj.CH.SIN_B0) ? + + +/** + * @const + * @type {number} + */ +ol.proj.CH.K = Math.log(Math.tan(Math.PI / 4 + ol.proj.CH.B0 / 2)) - + ol.proj.CH.ALPHA * Math.log(Math.tan(Math.PI / 4 + ol.proj.CH.PHI0 / 2)) + + ol.proj.CH.ALPHA * ol.proj.CH.ELLIPSOID.e * Math.log( + (1 + ol.proj.CH.ELLIPSOID.e * ol.proj.CH.SIN_PHI0) / + (1 - ol.proj.CH.ELLIPSOID.e * ol.proj.CH.SIN_PHI0)) / 2; + + +/** + * Add EPSG:2056 and EPSG:21781 projections, and transformations between them. + */ +ol.proj.CH.add = function() { + ol.proj.EPSG2056.add(); + ol.proj.EPSG21781.add(); + var epsg2056 = ol.proj.get('EPSG:2056'); + var epsg21781 = ol.proj.get('EPSG:21781'); + ol.proj.addTransform(epsg2056, epsg21781, + goog.partial(ol.proj.CH.translate_, -2000000, -1000000)); + ol.proj.addTransform(epsg21781, epsg2056, + goog.partial(ol.proj.CH.translate_, 2000000, 1000000)); +}; + + +/** + * Transformation from EPSG:4326 to EPSG:2056/EPSG:21781. + * + * This uses an approximation that is accurate to about 1m. + * + * @see http://www.swisstopo.admin.ch/internet/swisstopo/en/home/products/software/products/skripts.html + * + * @param {number} offsetY Y offset. + * @param {number} offsetX X offset. + * @param {Array.} input Input array of coordinate values. + * @param {Array.=} opt_output Output array of coordinate values. + * @param {number=} opt_dimension Dimension (default is `2`). + * @private + * @return {Array.} Output array of coordinate values. + */ +ol.proj.CH.fromEPSG4326Approximate_ = + function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if (goog.isDef(opt_output)) { + output = opt_output; + } else { + if (dimension > 2) { + output = input.slice(); + } else { + output = new Array(n); + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var auxLat, auxLon, i; + for (i = 0; i < n; i += dimension) { + auxLat = 36 * input[i + 1] / 100 - 16.902866; + auxLon = 36 * input[i] / 100 - 2.67825; + output[i] = offsetY + 72.37 + + 211455.93 * auxLon - + 10938.51 * auxLon * auxLat - + 0.36 * auxLon * auxLat * auxLat - + 44.54 * auxLon * auxLon * auxLon; + output[i + 1] = offsetX + 147.07 + + 308807.95 * auxLat + + 3745.25 * auxLon * auxLon + + 76.63 * auxLat * auxLat - + 194.56 * auxLon * auxLon * auxLat + + 119.79 * auxLat * auxLat * auxLat; + } + return output; +}; + + +/** + * Transformation from EPSG:4326 to EPSG:2056/EPSG:21781. + * + * @see http://www.swisstopo.admin.ch/internet/swisstopo/en/home/topics/survey/sys/refsys/projections.html + * + * @param {number} offsetY Y offset. + * @param {number} offsetX X offset. + * @param {Array.} input Input array of coordinate values. + * @param {Array.=} opt_output Output array of coordinate values. + * @param {number=} opt_dimension Dimension (default is `2`). + * @private + * @return {Array.} Output array of coordinate values. + */ +ol.proj.CH.fromEPSG4326Rigorous_ = + function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if (goog.isDef(opt_output)) { + output = opt_output; + } else { + if (dimension > 2) { + output = input.slice(); + } else { + output = new Array(n); + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var b, bBar, eSinPhi, i, l, lambda, lBar, phi, s; + for (i = 0; i < n; i += dimension) { + lambda = goog.math.toRadians(input[i]); + phi = goog.math.toRadians(input[i + 1]); + eSinPhi = ol.proj.CH.ELLIPSOID.e * Math.sin(phi); + s = ol.proj.CH.ALPHA * Math.log(Math.tan(Math.PI / 4 + phi / 2)) - + ol.proj.CH.ALPHA * ol.proj.CH.ELLIPSOID.e * Math.log( + (1 + eSinPhi) / (1 - eSinPhi)) / 2 + ol.proj.CH.K; + b = 2 * (Math.atan(Math.exp(s)) - Math.PI / 4); + l = ol.proj.CH.ALPHA * (lambda - ol.proj.CH.LAMBDA0); + lBar = Math.atan2(Math.sin(l), + ol.proj.CH.SIN_B0 * Math.tan(b) + ol.proj.CH.COS_B0 * Math.cos(l)); + bBar = Math.asin(ol.proj.CH.COS_B0 * Math.sin(b) - + ol.proj.CH.SIN_B0 * Math.cos(b) * Math.cos(l)); + output[i] = offsetY + ol.proj.CH.R * lBar; + output[i + 1] = offsetX + ol.proj.CH.R * + Math.log((1 + Math.sin(bBar)) / (1 - Math.sin(bBar))) / 2; + } + return output; +}; + + +/** + * Transformation from EPSG:2056/EPSG:21781 to EPSG:4326. + * + * This uses an approximation that is accurate to about 1m. + * + * @see http://www.swisstopo.admin.ch/internet/swisstopo/en/home/products/software/products/skripts.html + * + * @param {number} offsetY Y offset. + * @param {number} offsetX X offset. + * @param {Array.} input Input array of coordinate values. + * @param {Array.=} opt_output Output array of coordinate values. + * @param {number=} opt_dimension Dimension (default is `2`). + * @private + * @return {Array.} Output array of coordinate values. + */ +ol.proj.CH.toEPSG4326Approximate_ = + function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if (goog.isDef(opt_output)) { + output = opt_output; + } else { + if (dimension > 2) { + output = input.slice(); + } else { + output = new Array(n); + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var auxX, auxY, i; + for (i = 0; i < n; i += dimension) { + auxY = (input[i] - offsetY) / 1000000; + auxX = (input[i + 1] - offsetX) / 1000000; + output[i] = 100 * (2.6779094 + + 4.728982 * auxY + + 0.791484 * auxY * auxX + + 0.1306 * auxY * auxX * auxX - + 0.0436 * auxY * auxY * auxY) / 36; + output[i + 1] = 100 * (16.9023892 + + 3.238272 * auxX - + 0.270978 * auxY * auxY - + 0.002528 * auxX * auxX - + 0.0447 * auxY * auxY * auxX - + 0.014 * auxX * auxX * auxX) / 36; + } + return output; +}; + + +/** + * Transformation from EPSG:2056/EPSG:21781 to EPSG:4326. + * + * @see http://www.swisstopo.admin.ch/internet/swisstopo/en/home/topics/survey/sys/refsys/projections.html + * + * @param {number} offsetY Y offset. + * @param {number} offsetX X offset. + * @param {Array.} input Input array of coordinate values. + * @param {Array.=} opt_output Output array of coordinate values. + * @param {number=} opt_dimension Dimension (default is `2`). + * @private + * @return {Array.} Output array of coordinate values. + */ +ol.proj.CH.toEPSG4326Rigorous_ = + function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if (goog.isDef(opt_output)) { + output = opt_output; + } else { + if (dimension > 2) { + output = input.slice(); + } else { + output = new Array(n); + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var b, bBar, eSinPhi, i, iterations, l, lambda, lastPhi, lBar, phi, s, x, y; + for (i = 0; i < n; i += dimension) { + y = input[i] - offsetY; + x = input[i + 1] - offsetX; + lBar = y / ol.proj.CH.R; + bBar = 2 * (Math.atan(Math.exp(x / ol.proj.CH.R)) - Math.PI / 4); + b = Math.asin(ol.proj.CH.COS_B0 * Math.sin(bBar) + + ol.proj.CH.SIN_B0 * Math.cos(bBar) * Math.cos(lBar)); + l = Math.atan2(Math.sin(lBar), ol.proj.CH.COS_B0 * Math.cos(lBar) - + ol.proj.CH.SIN_B0 * Math.tan(bBar)); + lambda = ol.proj.CH.LAMBDA0 + l / ol.proj.CH.ALPHA; + lastPhi = phi = b; + // Empirically, about 18 iterations are required for 1e-7 radian accuracy + for (iterations = 20; iterations > 0; --iterations) { + s = (Math.log(Math.tan(Math.PI / 4 + b / 2)) - + ol.proj.CH.K) / ol.proj.CH.ALPHA + + ol.proj.CH.ELLIPSOID.e * Math.log(Math.tan(Math.PI / 4 + + Math.asin(ol.proj.CH.ELLIPSOID.e * Math.sin(phi)) / 2)); + phi = 2 * Math.atan(Math.exp(s)) - Math.PI / 2; + if (Math.abs(phi - lastPhi) < 1e-7) { + break; + } + lastPhi = phi; + } + goog.asserts.assert(iterations !== 0); + output[i] = goog.math.toDegrees(lambda); + output[i + 1] = goog.math.toDegrees(phi); + } + return output; +}; + + +/** + * Transformation between EPSG:2056 and EPSG:21781. + * + * Currently a simple offset is used. This is accurate to within 3m. + * + * @param {number} offsetY Y offset. + * @param {number} offsetX X offset. + * @param {Array.} input Input array of coordinate values. + * @param {Array.=} opt_output Output array of coordinate values. + * @param {number=} opt_dimension Dimension (default is `2`). + * @private + * @return {Array.} Output array of coordinate values. + */ +ol.proj.CH.translate_ = + function(offsetY, offsetX, input, opt_output, opt_dimension) { + var n = input.length; + var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; + var output; + if (goog.isDef(opt_output)) { + output = opt_output; + } else { + if (dimension > 2) { + output = input.slice(); + } else { + output = new Array(n); + } + } + goog.asserts.assert(dimension >= 2); + goog.asserts.assert(output.length % dimension === 0); + var i; + for (i = 0; i < n; i += dimension) { + output[i] = input[i] + offsetY; + output[i + 1] = input[i + 1] + offsetX; + } + return output; +}; + + +/** + * @inheritDoc + */ +ol.proj.CH.prototype.getPointResolution = function(resolution, point) { + return resolution; +}; + + + +/** + * The EPSG:2056 projection, also known as LV95 (CH1903+). + * @constructor + * @extends {ol.proj.CH} + */ +ol.proj.EPSG2056 = function() { + goog.base(this, { + code: 'EPSG:2056', + extent: ol.proj.EPSG2056.EXTENT + }); +}; +goog.inherits(ol.proj.EPSG2056, ol.proj.CH); + + +/** + * @const + * @type {ol.Extent} + */ +ol.proj.EPSG2056.EXTENT = + [2485869.5728, 1076443.1884, 2837076.5648, 1299941.7864]; + + +/** + * Add the EPSG:2056 projection and transformations to and from EPSG:4326. + */ +ol.proj.EPSG2056.add = function() { + ol.proj.addEquivalentProjections(ol.proj.EPSG4326.PROJECTIONS); + var epsg2056 = new ol.proj.EPSG2056(); + ol.proj.addProjection(epsg2056); + ol.proj.addEquivalentTransforms( + ol.proj.EPSG4326.PROJECTIONS, + [epsg2056], + goog.partial(ol.proj.CH.fromEPSG4326Rigorous_, 2600000, 1200000), + goog.partial(ol.proj.CH.toEPSG4326Rigorous_, 2600000, 1200000)); +}; + + + +/** + * The EPSG:21781 projection, also known as LV03 (CH1903). + * @constructor + * @extends {ol.proj.CH} + */ +ol.proj.EPSG21781 = function() { + goog.base(this, { + code: 'EPSG:21781', + extent: ol.proj.EPSG21781.EXTENT + }); +}; +goog.inherits(ol.proj.EPSG21781, ol.proj.CH); + + +/** + * @const + * @type {ol.Extent} + */ +ol.proj.EPSG21781.EXTENT = [ + 485869.5728, 76443.1884, + 837076.5648, 299941.7864 +]; + + +/** + * Add the EPSG:21781 projection and transformations to and from EPSG:4326. + */ +ol.proj.EPSG21781.add = function() { + ol.proj.addEquivalentProjections(ol.proj.EPSG4326.PROJECTIONS); + var epsg21781 = new ol.proj.EPSG21781(); + ol.proj.addProjection(epsg21781); + ol.proj.addEquivalentTransforms( + ol.proj.EPSG4326.PROJECTIONS, + [epsg21781], + goog.partial(ol.proj.CH.fromEPSG4326Rigorous_, 600000, 200000), + goog.partial(ol.proj.CH.toEPSG4326Rigorous_, 600000, 200000)); +}; diff --git a/float-no-zero/ol/ol/proj/common.js b/float-no-zero/ol/ol/proj/common.js new file mode 100644 index 0000000000..00965a28e6 --- /dev/null +++ b/float-no-zero/ol/ol/proj/common.js @@ -0,0 +1,23 @@ +goog.provide('ol.proj.common'); + +goog.require('ol.proj'); +goog.require('ol.proj.EPSG3857'); +goog.require('ol.proj.EPSG4326'); + + +/** + * FIXME empty description for jsdoc + */ +ol.proj.common.add = function() { + // Add transformations that don't alter coordinates to convert within set of + // projections with equal meaning. + ol.proj.addEquivalentProjections(ol.proj.EPSG3857.PROJECTIONS); + ol.proj.addEquivalentProjections(ol.proj.EPSG4326.PROJECTIONS); + // Add transformations to convert EPSG:4326 like coordinates to EPSG:3857 like + // coordinates and back. + ol.proj.addEquivalentTransforms( + ol.proj.EPSG4326.PROJECTIONS, + ol.proj.EPSG3857.PROJECTIONS, + ol.proj.EPSG3857.fromEPSG4326, + ol.proj.EPSG3857.toEPSG4326); +}; diff --git a/float-no-zero/ol/ol/proj/epsg3857projection.js b/float-no-zero/ol/ol/proj/epsg3857projection.js new file mode 100644 index 0000000000..1137e4a343 --- /dev/null +++ b/float-no-zero/ol/ol/proj/epsg3857projection.js @@ -0,0 +1,144 @@ +goog.provide('ol.proj.EPSG3857'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('ol.math'); +goog.require('ol.proj'); +goog.require('ol.proj.Projection'); +goog.require('ol.proj.Units'); + + + +/** + * @constructor + * @extends {ol.proj.Projection} + * @param {string} code Code. + */ +ol.proj.EPSG3857 = function(code) { + goog.base(this, { + code: code, + units: ol.proj.Units.METERS, + extent: ol.proj.EPSG3857.EXTENT, + global: true + }); +}; +goog.inherits(ol.proj.EPSG3857, ol.proj.Projection); + + +/** + * @const + * @type {number} + */ +ol.proj.EPSG3857.RADIUS = 6378137; + + +/** + * @const + * @type {number} + */ +ol.proj.EPSG3857.HALF_SIZE = Math.PI * ol.proj.EPSG3857.RADIUS; + + +/** + * @const + * @type {ol.Extent} + */ +ol.proj.EPSG3857.EXTENT = [ + -ol.proj.EPSG3857.HALF_SIZE, -ol.proj.EPSG3857.HALF_SIZE, + ol.proj.EPSG3857.HALF_SIZE, ol.proj.EPSG3857.HALF_SIZE +]; + + +/** + * Lists several projection codes with the same meaning as EPSG:3857. + * + * @type {Array.} + */ +ol.proj.EPSG3857.CODES = [ + 'EPSG:3857', + 'EPSG:102100', + 'EPSG:102113', + 'EPSG:900913', + 'urn:ogc:def:crs:EPSG:6.18:3:3857' +]; + + +/** + * Projections equal to EPSG:3857. + * + * @const + * @type {Array.} + */ +ol.proj.EPSG3857.PROJECTIONS = goog.array.map( + ol.proj.EPSG3857.CODES, + function(code) { + return new ol.proj.EPSG3857(code); + }); + + +/** + * Transformation from EPSG:4326 to EPSG:3857. + * + * @param {Array.} input Input array of coordinate values. + * @param {Array.=} opt_output Output array of coordinate values. + * @param {number=} opt_dimension Dimension (default is `2`). + * @return {Array.} Output array of coordinate values. + */ +ol.proj.EPSG3857.fromEPSG4326 = function(input, opt_output, opt_dimension) { + var length = input.length, + dimension = opt_dimension > 1 ? opt_dimension : 2, + output = opt_output; + if (!goog.isDef(output)) { + if (dimension > 2) { + // preserve values beyond second dimension + output = input.slice(); + } else { + output = new Array(length); + } + } + goog.asserts.assert(output.length % dimension === 0); + for (var i = 0; i < length; i += dimension) { + output[i] = ol.proj.EPSG3857.RADIUS * Math.PI * input[i] / 180; + output[i + 1] = ol.proj.EPSG3857.RADIUS * + Math.log(Math.tan(Math.PI * (input[i + 1] + 90) / 360)); + } + return output; +}; + + +/** + * Transformation from EPSG:3857 to EPSG:4326. + * + * @param {Array.} input Input array of coordinate values. + * @param {Array.=} opt_output Output array of coordinate values. + * @param {number=} opt_dimension Dimension (default is `2`). + * @return {Array.} Output array of coordinate values. + */ +ol.proj.EPSG3857.toEPSG4326 = function(input, opt_output, opt_dimension) { + var length = input.length, + dimension = opt_dimension > 1 ? opt_dimension : 2, + output = opt_output; + if (!goog.isDef(output)) { + if (dimension > 2) { + // preserve values beyond second dimension + output = input.slice(); + } else { + output = new Array(length); + } + } + goog.asserts.assert(output.length % dimension === 0); + for (var i = 0; i < length; i += dimension) { + output[i] = 180 * input[i] / (ol.proj.EPSG3857.RADIUS * Math.PI); + output[i + 1] = 360 * Math.atan( + Math.exp(input[i + 1] / ol.proj.EPSG3857.RADIUS)) / Math.PI - 90; + } + return output; +}; + + +/** + * @inheritDoc + */ +ol.proj.EPSG3857.prototype.getPointResolution = function(resolution, point) { + return resolution / ol.math.cosh(point[1] / ol.proj.EPSG3857.RADIUS); +}; diff --git a/float-no-zero/ol/ol/proj/epsg4326projection.js b/float-no-zero/ol/ol/proj/epsg4326projection.js new file mode 100644 index 0000000000..3f291ef5f1 --- /dev/null +++ b/float-no-zero/ol/ol/proj/epsg4326projection.js @@ -0,0 +1,58 @@ +goog.provide('ol.proj.EPSG4326'); + +goog.require('ol.proj'); +goog.require('ol.proj.Projection'); +goog.require('ol.proj.Units'); + + + +/** + * @constructor + * @extends {ol.proj.Projection} + * @param {string} code Code. + * @param {string=} opt_axisOrientation Axis orientation. + */ +ol.proj.EPSG4326 = function(code, opt_axisOrientation) { + goog.base(this, { + code: code, + units: ol.proj.Units.DEGREES, + extent: ol.proj.EPSG4326.EXTENT, + axisOrientation: opt_axisOrientation, + global: true + }); +}; +goog.inherits(ol.proj.EPSG4326, ol.proj.Projection); + + +/** + * Extent of the EPSG:4326 projection which is the whole world. + * + * @const + * @type {ol.Extent} + */ +ol.proj.EPSG4326.EXTENT = [-180, -90, 180, 90]; + + +/** + * Projections equal to EPSG:4326. + * + * @const + * @type {Array.} + */ +ol.proj.EPSG4326.PROJECTIONS = [ + new ol.proj.EPSG4326('CRS:84'), + new ol.proj.EPSG4326('EPSG:4326', 'neu'), + new ol.proj.EPSG4326('urn:ogc:def:crs:EPSG:6.6:4326', 'neu'), + new ol.proj.EPSG4326('urn:ogc:def:crs:OGC:1.3:CRS84'), + new ol.proj.EPSG4326('urn:ogc:def:crs:OGC:2:84'), + new ol.proj.EPSG4326('http://www.opengis.net/gml/srs/epsg.xml#4326', 'neu'), + new ol.proj.EPSG4326('urn:x-ogc:def:crs:EPSG:4326', 'neu') +]; + + +/** + * @inheritDoc + */ +ol.proj.EPSG4326.prototype.getPointResolution = function(resolution, point) { + return resolution; +}; diff --git a/float-no-zero/ol/ol/proj/proj.exports b/float-no-zero/ol/ol/proj/proj.exports new file mode 100644 index 0000000000..e78ec36f9a --- /dev/null +++ b/float-no-zero/ol/ol/proj/proj.exports @@ -0,0 +1,16 @@ +@exportSymbol ol.proj.Projection +@exportProperty ol.proj.Projection.prototype.getCode +@exportProperty ol.proj.Projection.prototype.getExtent +@exportProperty ol.proj.Projection.prototype.getUnits + +@exportSymbol ol.proj.addProjection +@exportSymbol ol.proj.get +@exportSymbol ol.proj.getTransform +@exportSymbol ol.proj.getTransformFromProjections +@exportSymbol ol.proj.transform +@exportSymbol ol.proj.transformWithProjections +@exportSymbol ol.proj.configureProj4jsProjection + +@exportSymbol ol.proj.common.add + +@exportSymbol ol.proj.METERS_PER_UNIT diff --git a/float-no-zero/ol/ol/proj/proj.js b/float-no-zero/ol/ol/proj/proj.js new file mode 100644 index 0000000000..bf3ddc3882 --- /dev/null +++ b/float-no-zero/ol/ol/proj/proj.js @@ -0,0 +1,725 @@ +goog.provide('ol.proj'); +goog.provide('ol.proj.METERS_PER_UNIT'); +goog.provide('ol.proj.Projection'); +goog.provide('ol.proj.ProjectionLike'); +goog.provide('ol.proj.Units'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.object'); +goog.require('ol.Extent'); +goog.require('ol.TransformFunction'); +goog.require('ol.sphere.NORMAL'); + + +/** + * @define {boolean} Enable Proj4js. + */ +ol.ENABLE_PROJ4JS = true; + + +/** + * Have Proj4js. + * @const + * @type {boolean} + */ +ol.HAVE_PROJ4JS = ol.ENABLE_PROJ4JS && typeof Proj4js == 'object'; + + +/** + * A projection as {@link ol.proj.Projection}, SRS identifier string or + * undefined. + * @typedef {ol.proj.Projection|string|undefined} ol.proj.ProjectionLike + * @todo stability experimental + */ +ol.proj.ProjectionLike; + + +/** + * @enum {string} + * @todo stability experimental + */ +ol.proj.Units = { + DEGREES: 'degrees', + FEET: 'ft', + METERS: 'm', + PIXELS: 'pixels' +}; + + +/** + * Meters per unit lookup table. + * @const + * @type {Object.} + */ +ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] = + 2 * Math.PI * ol.sphere.NORMAL.radius / 360; +ol.proj.METERS_PER_UNIT[ol.proj.Units.FEET] = 0.3048; +ol.proj.METERS_PER_UNIT[ol.proj.Units.METERS] = 1; + + + +/** + * @constructor + * @param {olx.ProjectionOptions} options Projection options. + * @struct + * @todo stability experimental + */ +ol.proj.Projection = function(options) { + + /** + * @private + * @type {string} + */ + this.code_ = options.code; + + /** + * @private + * @type {ol.proj.Units} + */ + this.units_ = /** @type {ol.proj.Units} */ (options.units); + + /** + * @private + * @type {ol.Extent} + */ + this.extent_ = goog.isDef(options.extent) ? options.extent : null; + + /** + * @private + * @type {string} + */ + this.axisOrientation_ = goog.isDef(options.axisOrientation) ? + options.axisOrientation : 'enu'; + + /** + * @private + * @type {boolean} + */ + this.global_ = goog.isDef(options.global) ? options.global : false; + + /** + * @private + * @type {ol.tilegrid.TileGrid} + */ + this.defaultTileGrid_ = null; + +}; + + +/** + * Get the code for this projection, e.g. 'EPSG:4326'. + * @return {string} Code. + */ +ol.proj.Projection.prototype.getCode = function() { + return this.code_; +}; + + +/** + * Get the validity extent for this projection. + * @return {ol.Extent} Extent. + */ +ol.proj.Projection.prototype.getExtent = function() { + return this.extent_; +}; + + +/** + * Get the resolution of the point in degrees. For projections with degrees as + * the unit this will simply return the provided resolution. For other + * projections the point resolution is estimated by transforming the center + * pixel to EPSG:4326, measuring its width and height on the normal sphere, + * and taking the average of the width and height. + * @param {number} resolution Resolution. + * @param {ol.Coordinate} point Point. + * @return {number} Point resolution. + */ +ol.proj.Projection.prototype.getPointResolution = goog.abstractMethod; + + +/** + * Get the units of this projection. + * @return {ol.proj.Units} Units. + */ +ol.proj.Projection.prototype.getUnits = function() { + return this.units_; +}; + + +/** + * Get the amount of meters per unit of this projection. If the projection is + * not configured with a units identifier, the return is `undefined`. + * @return {number|undefined} Meters. + */ +ol.proj.Projection.prototype.getMetersPerUnit = function() { + return ol.proj.METERS_PER_UNIT[this.units_]; +}; + + +/** + * Get the axis orientation of this projection. + * Example values are: + * enu - the default easting, northing, elevation. + * neu - northing, easting, up - useful for "lat/long" geographic coordinates, + * or south orientated transverse mercator. + * wnu - westing, northing, up - some planetary coordinate systems have + * "west positive" coordinate systems + * @return {string} Axis orientation. + */ +ol.proj.Projection.prototype.getAxisOrientation = function() { + return this.axisOrientation_; +}; + + +/** + * Is this projection a global projection which spans the whole world? + * @return {boolean} Wether the projection is global. + */ +ol.proj.Projection.prototype.isGlobal = function() { + return this.global_; +}; + + +/** + * @return {ol.tilegrid.TileGrid} The default tile grid. + */ +ol.proj.Projection.prototype.getDefaultTileGrid = function() { + return this.defaultTileGrid_; +}; + + +/** + * @param {ol.tilegrid.TileGrid} tileGrid The default tile grid. + */ +ol.proj.Projection.prototype.setDefaultTileGrid = function(tileGrid) { + this.defaultTileGrid_ = tileGrid; +}; + + + +/** + * @constructor + * @extends {ol.proj.Projection} + * @param {Proj4js.Proj} proj4jsProj Proj4js projection. + * @param {olx.Proj4jsProjectionOptions} options Proj4js projection options. + * @private + * @struct + */ +ol.Proj4jsProjection_ = function(proj4jsProj, options) { + + var units = /** @type {ol.proj.Units} */ (proj4jsProj.units); + + var config = /** @type {olx.ProjectionOptions} */ ({ + units: units, + axisOrientation: proj4jsProj.axis + }); + goog.object.extend(config, options); + + goog.base(this, config); + + /** + * @private + * @type {Proj4js.Proj} + */ + this.proj4jsProj_ = proj4jsProj; + + /** + * @private + * @type {?ol.TransformFunction} + */ + this.toEPSG4326_ = null; + +}; +goog.inherits(ol.Proj4jsProjection_, ol.proj.Projection); + + +/** + * @inheritDoc + */ +ol.Proj4jsProjection_.prototype.getMetersPerUnit = function() { + var metersPerUnit = this.proj4jsProj_.to_meter; + if (!goog.isDef(metersPerUnit)) { + metersPerUnit = ol.proj.METERS_PER_UNIT[this.units_]; + } + return metersPerUnit; +}; + + +/** + * @inheritDoc + */ +ol.Proj4jsProjection_.prototype.getPointResolution = + function(resolution, point) { + if (this.getUnits() == ol.proj.Units.DEGREES) { + return resolution; + } else { + // Estimate point resolution by transforming the center pixel to EPSG:4326, + // measuring its width and height on the normal sphere, and taking the + // average of the width and height. + if (goog.isNull(this.toEPSG4326_)) { + this.toEPSG4326_ = ol.proj.getTransformFromProjections( + this, ol.proj.getProj4jsProjectionFromCode_({ + code: 'EPSG:4326', + extent: null + })); + } + var vertices = [ + point[0] - resolution / 2, point[1], + point[0] + resolution / 2, point[1], + point[0], point[1] - resolution / 2, + point[0], point[1] + resolution / 2 + ]; + vertices = this.toEPSG4326_(vertices, vertices, 2); + var width = ol.sphere.NORMAL.haversineDistance( + vertices.slice(0, 2), vertices.slice(2, 4)); + var height = ol.sphere.NORMAL.haversineDistance( + vertices.slice(4, 6), vertices.slice(6, 8)); + var pointResolution = (width + height) / 2; + if (this.getUnits() == ol.proj.Units.FEET) { + // The radius of the normal sphere is defined in meters, so we must + // convert back to feet. + pointResolution /= 0.3048; + } + return pointResolution; + } +}; + + +/** + * @return {Proj4js.Proj} Proj4js projection. + */ +ol.Proj4jsProjection_.prototype.getProj4jsProj = function() { + return this.proj4jsProj_; +}; + + +/** + * @private + * @type {Object.} + */ +ol.proj.proj4jsProjections_ = {}; + + +/** + * @private + * @type {Object.} + */ +ol.proj.projections_ = {}; + + +/** + * @private + * @type {Object.>} + */ +ol.proj.transforms_ = {}; + + +/** + * Registers transformation functions that don't alter coordinates. Those allow + * to transform between projections with equal meaning. + * + * @param {Array.} projections Projections. + */ +ol.proj.addEquivalentProjections = function(projections) { + ol.proj.addProjections(projections); + goog.array.forEach(projections, function(source) { + goog.array.forEach(projections, function(destination) { + if (source !== destination) { + ol.proj.addTransform(source, destination, ol.proj.cloneTransform); + } + }); + }); +}; + + +/** + * Registers transformation functions to convert coordinates in any projection + * in projection1 to any projection in projection2. + * + * @param {Array.} projections1 Projections with equal + * meaning. + * @param {Array.} projections2 Projections with equal + * meaning. + * @param {ol.TransformFunction} forwardTransform Transformation from any + * projection in projection1 to any projection in projection2. + * @param {ol.TransformFunction} inverseTransform Transform from any projection + * in projection2 to any projection in projection1.. + */ +ol.proj.addEquivalentTransforms = + function(projections1, projections2, forwardTransform, inverseTransform) { + goog.array.forEach(projections1, function(projection1) { + goog.array.forEach(projections2, function(projection2) { + ol.proj.addTransform(projection1, projection2, forwardTransform); + ol.proj.addTransform(projection2, projection1, inverseTransform); + }); + }); +}; + + +/** + * @param {ol.Proj4jsProjection_} proj4jsProjection Proj4js projection. + * @private + */ +ol.proj.addProj4jsProjection_ = function(proj4jsProjection) { + var proj4jsProjections = ol.proj.proj4jsProjections_; + var code = proj4jsProjection.getCode(); + goog.asserts.assert(!goog.object.containsKey(proj4jsProjections, code)); + proj4jsProjections[code] = proj4jsProjection; +}; + + +/** + * @param {ol.proj.Projection} projection Projection. + * @todo stability experimental + */ +ol.proj.addProjection = function(projection) { + var projections = ol.proj.projections_; + var code = projection.getCode(); + projections[code] = projection; + ol.proj.addTransform(projection, projection, ol.proj.cloneTransform); +}; + + +/** + * @param {Array.} projections Projections. + */ +ol.proj.addProjections = function(projections) { + goog.array.forEach(projections, function(projection) { + ol.proj.addProjection(projection); + }); +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.proj.clearAllProjections = function() { + if (ol.ENABLE_PROJ4JS) { + ol.proj.proj4jsProjections_ = {}; + } + ol.proj.projections_ = {}; + ol.proj.transforms_ = {}; +}; + + +/** + * @param {ol.proj.Projection|string|undefined} projection Projection. + * @param {string} defaultCode Default code. + * @return {ol.proj.Projection} Projection. + */ +ol.proj.createProjection = function(projection, defaultCode) { + if (!goog.isDefAndNotNull(projection)) { + return ol.proj.get(defaultCode); + } else if (goog.isString(projection)) { + return ol.proj.get(projection); + } else { + goog.asserts.assertInstanceof(projection, ol.proj.Projection); + return projection; + } +}; + + +/** + * Registers a conversion function to convert coordinates from the source + * projection to the destination projection. + * + * @param {ol.proj.Projection} source Source. + * @param {ol.proj.Projection} destination Destination. + * @param {ol.TransformFunction} transformFn Transform. + */ +ol.proj.addTransform = function(source, destination, transformFn) { + var sourceCode = source.getCode(); + var destinationCode = destination.getCode(); + var transforms = ol.proj.transforms_; + if (!goog.object.containsKey(transforms, sourceCode)) { + transforms[sourceCode] = {}; + } + transforms[sourceCode][destinationCode] = transformFn; +}; + + +/** + * Unregisters the conversion function to convert coordinates from the source + * projection to the destination projection. This method is used to clean up + * cached transforms during testing. + * + * @param {ol.proj.Projection} source Source projection. + * @param {ol.proj.Projection} destination Destination projection. + * @return {ol.TransformFunction} transformFn The unregistered transform. + */ +ol.proj.removeTransform = function(source, destination) { + var sourceCode = source.getCode(); + var destinationCode = destination.getCode(); + var transforms = ol.proj.transforms_; + goog.asserts.assert(sourceCode in transforms); + goog.asserts.assert(destinationCode in transforms[sourceCode]); + var transform = transforms[sourceCode][destinationCode]; + delete transforms[sourceCode][destinationCode]; + var keys = goog.object.getKeys(transforms[sourceCode]); + if (keys.length === 0) { + delete transforms[sourceCode]; + } + return transform; +}; + + +/** + * @param {ol.proj.ProjectionLike} projectionLike Either a code string which is + * a combination of authority and identifier such as "EPSG:4326", or an + * existing projection object, or undefined. + * @return {ol.proj.Projection} Projection. + * @todo stability experimental + */ +ol.proj.get = function(projectionLike) { + var projection; + if (projectionLike instanceof ol.proj.Projection) { + projection = projectionLike; + } else if (goog.isString(projectionLike)) { + var code = projectionLike; + projection = ol.proj.projections_[code]; + if (ol.HAVE_PROJ4JS && !goog.isDef(projection)) { + projection = ol.proj.getProj4jsProjectionFromCode_({ + code: code, + extent: null + }); + } + if (!goog.isDef(projection)) { + goog.asserts.assert(goog.isDef(projection)); + projection = null; + } + } else { + projection = null; + } + return projection; +}; + + +/** + * @param {olx.Proj4jsProjectionOptions} options Proj4js projection options. + * @private + * @return {ol.Proj4jsProjection_} Proj4js projection. + */ +ol.proj.getProj4jsProjectionFromCode_ = function(options) { + var code = options.code; + var proj4jsProjections = ol.proj.proj4jsProjections_; + var proj4jsProjection = proj4jsProjections[code]; + if (!goog.isDef(proj4jsProjection)) { + var proj4jsProj = new Proj4js.Proj(code); + var srsCode = proj4jsProj.srsCode; + proj4jsProjection = proj4jsProjections[srsCode]; + if (!goog.isDef(proj4jsProjection)) { + var config = /** @type {olx.Proj4jsProjectionOptions} */ + (goog.object.clone(options)); + config.code = srsCode; + proj4jsProjection = new ol.Proj4jsProjection_(proj4jsProj, config); + proj4jsProjections[srsCode] = proj4jsProjection; + } + proj4jsProjections[code] = proj4jsProjection; + } + return proj4jsProjection; +}; + + +/** + * Checks if two projections are the same, that is every coordinate in one + * projection does represent the same geographic point as the same coordinate in + * the other projection. + * + * @param {ol.proj.Projection} projection1 Projection 1. + * @param {ol.proj.Projection} projection2 Projection 2. + * @return {boolean} Equivalent. + */ +ol.proj.equivalent = function(projection1, projection2) { + if (projection1 === projection2) { + return true; + } else if (projection1.getUnits() != projection2.getUnits()) { + return false; + } else { + var transformFn = ol.proj.getTransformFromProjections( + projection1, projection2); + return transformFn === ol.proj.cloneTransform; + } +}; + + +/** + * Given the projection-like objects this method searches for a transformation + * function to convert a coordinates array from the source projection to the + * destination projection. + * + * @param {ol.proj.ProjectionLike} source Source. + * @param {ol.proj.ProjectionLike} destination Destination. + * @return {ol.TransformFunction} Transform. + * @todo stability experimental + */ +ol.proj.getTransform = function(source, destination) { + var sourceProjection = ol.proj.get(source); + var destinationProjection = ol.proj.get(destination); + return ol.proj.getTransformFromProjections( + sourceProjection, destinationProjection); +}; + + +/** + * Searches a function that can be used to convert coordinates from the source + * projection to the destination projection. + * + * @param {ol.proj.Projection} sourceProjection Source projection. + * @param {ol.proj.Projection} destinationProjection Destination projection. + * @return {ol.TransformFunction} Transform. + * @todo stability experimental + */ +ol.proj.getTransformFromProjections = + function(sourceProjection, destinationProjection) { + var transforms = ol.proj.transforms_; + var sourceCode = sourceProjection.getCode(); + var destinationCode = destinationProjection.getCode(); + var transform; + if (goog.object.containsKey(transforms, sourceCode) && + goog.object.containsKey(transforms[sourceCode], destinationCode)) { + transform = transforms[sourceCode][destinationCode]; + } + if (ol.HAVE_PROJ4JS && !goog.isDef(transform)) { + var proj4jsSource; + if (sourceProjection instanceof ol.Proj4jsProjection_) { + proj4jsSource = sourceProjection; + } else { + proj4jsSource = + ol.proj.getProj4jsProjectionFromCode_({ + code: sourceCode, + extent: null + }); + } + var sourceProj4jsProj = proj4jsSource.getProj4jsProj(); + var proj4jsDestination; + if (destinationProjection instanceof ol.Proj4jsProjection_) { + proj4jsDestination = destinationProjection; + } else { + proj4jsDestination = + ol.proj.getProj4jsProjectionFromCode_({ + code: destinationCode, + extent: null + }); + } + var destinationProj4jsProj = proj4jsDestination.getProj4jsProj(); + transform = + /** + * @param {Array.} input Input coordinate values. + * @param {Array.=} opt_output Output array of coordinates. + * @param {number=} opt_dimension Dimension. + * @return {Array.} Output coordinate values. + */ + function(input, opt_output, opt_dimension) { + var length = input.length, + dimension = opt_dimension > 1 ? opt_dimension : 2, + output = opt_output; + if (!goog.isDef(output)) { + if (dimension > 2) { + // preserve values beyond second dimension + output = input.slice(); + } else { + output = new Array(length); + } + } + goog.asserts.assert(output.length % dimension === 0); + var proj4jsPoint; + for (var i = 0; i < length; i += dimension) { + proj4jsPoint = new Proj4js.Point(input[i], input[i + 1]); + proj4jsPoint = Proj4js.transform( + sourceProj4jsProj, destinationProj4jsProj, proj4jsPoint); + output[i] = proj4jsPoint.x; + output[i + 1] = proj4jsPoint.y; + } + return output; + }; + ol.proj.addTransform(sourceProjection, destinationProjection, transform); + } + if (!goog.isDef(transform)) { + goog.asserts.assert(goog.isDef(transform)); + transform = ol.proj.identityTransform; + } + return transform; +}; + + +/** + * @param {Array.} input Input coordinate array. + * @param {Array.=} opt_output Output array of coordinate values. + * @param {number=} opt_dimension Dimension. + * @return {Array.} Input coordinate array (same array as input). + */ +ol.proj.identityTransform = function(input, opt_output, opt_dimension) { + if (goog.isDef(opt_output) && input !== opt_output) { + // TODO: consider making this a warning instead + goog.asserts.fail('This should not be used internally.'); + for (var i = 0, ii = input.length; i < ii; ++i) { + opt_output[i] = input[i]; + } + input = opt_output; + } + return input; +}; + + +/** + * @param {Array.} input Input coordinate array. + * @param {Array.=} opt_output Output array of coordinate values. + * @param {number=} opt_dimension Dimension. + * @return {Array.} Output coordinate array (new array, same coordinate + * values). + */ +ol.proj.cloneTransform = function(input, opt_output, opt_dimension) { + var output; + if (goog.isDef(opt_output)) { + for (var i = 0, ii = input.length; i < ii; ++i) { + opt_output[i] = input[i]; + } + output = opt_output; + } else { + output = input.slice(); + } + return output; +}; + + +/** + * @param {ol.Coordinate} point Point. + * @param {ol.proj.ProjectionLike} source Source. + * @param {ol.proj.ProjectionLike} destination Destination. + * @return {ol.Coordinate} Point. + * @todo stability experimental + */ +ol.proj.transform = function(point, source, destination) { + var transformFn = ol.proj.getTransform(source, destination); + return transformFn(point); +}; + + +/** + * Transforms the given point to the destination projection. + * + * @param {ol.Coordinate} point Point. + * @param {ol.proj.Projection} sourceProjection Source projection. + * @param {ol.proj.Projection} destinationProjection Destination projection. + * @return {ol.Coordinate} Point. + * @todo stability experimental + */ +ol.proj.transformWithProjections = + function(point, sourceProjection, destinationProjection) { + var transformFn = ol.proj.getTransformFromProjections( + sourceProjection, destinationProjection); + return transformFn(point); +}; + + +/** + * @param {olx.Proj4jsProjectionOptions} options Proj4js projection options. + * @return {ol.proj.Projection} Proj4js projection. + * @todo stability experimental + */ +ol.proj.configureProj4jsProjection = function(options) { + goog.asserts.assert(!goog.object.containsKey( + ol.proj.proj4jsProjections_, options.code)); + return ol.proj.getProj4jsProjectionFromCode_(options); +}; diff --git a/float-no-zero/ol/ol/proj/proj.jsdoc b/float-no-zero/ol/ol/proj/proj.jsdoc new file mode 100644 index 0000000000..2b4b835bfa --- /dev/null +++ b/float-no-zero/ol/ol/proj/proj.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.proj + */ diff --git a/float-no-zero/ol/ol/render/box.js b/float-no-zero/ol/ol/render/box.js new file mode 100644 index 0000000000..87a1ec7d83 --- /dev/null +++ b/float-no-zero/ol/ol/render/box.js @@ -0,0 +1,160 @@ +// FIXME add rotation + +goog.provide('ol.render.Box'); + +goog.require('goog.Disposable'); +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('ol.geom.Polygon'); +goog.require('ol.render.EventType'); + + + +/** + * @constructor + * @extends {goog.Disposable} + * @param {ol.style.Style} style Style. + */ +ol.render.Box = function(style) { + + /** + * @private + * @type {ol.Map} + */ + this.map_ = null; + + /** + * @private + * @type {goog.events.Key} + */ + this.postComposeListenerKey_ = null; + + /** + * @private + * @type {ol.Pixel} + */ + this.startPixel_ = null; + + /** + * @private + * @type {ol.Pixel} + */ + this.endPixel_ = null; + + /** + * @private + * @type {ol.geom.Polygon} + */ + this.geometry_ = null; + + /** + * @private + * @type {ol.style.Style} + */ + this.style_ = style; + +}; +goog.inherits(ol.render.Box, goog.Disposable); + + +/** + * @private + * @return {ol.geom.Polygon} Geometry. + */ +ol.render.Box.prototype.createGeometry_ = function() { + goog.asserts.assert(!goog.isNull(this.startPixel_)); + goog.asserts.assert(!goog.isNull(this.endPixel_)); + goog.asserts.assert(!goog.isNull(this.map_)); + var startPixel = this.startPixel_; + var endPixel = this.endPixel_; + var pixels = [ + startPixel, + [startPixel[0], endPixel[1]], + endPixel, + [endPixel[0], startPixel[1]] + ]; + var coordinates = goog.array.map(pixels, + this.map_.getCoordinateFromPixel, this.map_); + // close the polygon + coordinates[4] = coordinates[0].slice(); + return new ol.geom.Polygon([coordinates]); +}; + + +/** + * @inheritDoc + */ +ol.render.Box.prototype.disposeInternal = function() { + this.setMap(null); +}; + + +/** + * @param {ol.render.Event} event Event. + * @private + */ +ol.render.Box.prototype.handleMapPostCompose_ = function(event) { + var geometry = this.geometry_; + goog.asserts.assert(!goog.isNull(geometry)); + var style = this.style_; + goog.asserts.assert(!goog.isNull(style)); + // use drawAsync(Infinity) to draw above everything + event.vectorContext.drawAsync(Infinity, function(render) { + render.setFillStrokeStyle(style.getFill(), style.getStroke()); + render.setTextStyle(style.getText()); + render.drawPolygonGeometry(geometry, null); + }); +}; + + +/** + * @return {ol.geom.Polygon} Geometry. + */ +ol.render.Box.prototype.getGeometry = function() { + return this.geometry_; +}; + + +/** + * @private + */ +ol.render.Box.prototype.requestMapRenderFrame_ = function() { + if (!goog.isNull(this.map_) && + !goog.isNull(this.startPixel_) && + !goog.isNull(this.endPixel_)) { + this.map_.render(); + } +}; + + +/** + * @param {ol.Map} map Map. + */ +ol.render.Box.prototype.setMap = function(map) { + if (!goog.isNull(this.postComposeListenerKey_)) { + goog.events.unlistenByKey(this.postComposeListenerKey_); + this.postComposeListenerKey_ = null; + this.map_.render(); + this.map_ = null; + } + this.map_ = map; + if (!goog.isNull(this.map_)) { + this.postComposeListenerKey_ = goog.events.listen( + map, ol.render.EventType.POSTCOMPOSE, this.handleMapPostCompose_, false, + this); + this.requestMapRenderFrame_(); + } +}; + + +/** + * @param {ol.Pixel} startPixel Start pixel. + * @param {ol.Pixel} endPixel End pixel. + */ +ol.render.Box.prototype.setPixels = function(startPixel, endPixel) { + this.startPixel_ = startPixel; + this.endPixel_ = endPixel; + this.geometry_ = this.createGeometry_(); + this.requestMapRenderFrame_(); +}; diff --git a/float-no-zero/ol/ol/render/canvas/canvas.js b/float-no-zero/ol/ol/render/canvas/canvas.js new file mode 100644 index 0000000000..0fec04de99 --- /dev/null +++ b/float-no-zero/ol/ol/render/canvas/canvas.js @@ -0,0 +1,98 @@ +goog.provide('ol.render.canvas'); + +goog.require('ol.color'); + + +/** + * @typedef {{fillStyle: string}} + */ +ol.render.canvas.FillState; + + +/** + * @typedef {{lineCap: string, + * lineDash: Array., + * lineJoin: string, + * lineWidth: number, + * miterLimit: number, + * strokeStyle: string}} + */ +ol.render.canvas.StrokeState; + + +/** + * @typedef {{font: string, + * textAlign: string, + * textBaseline: string}} + */ +ol.render.canvas.TextState; + + +/** + * @const + * @type {string} + */ +ol.render.canvas.defaultFont = '10px sans-serif'; + + +/** + * @const + * @type {ol.Color} + */ +ol.render.canvas.defaultFillStyle = ol.color.fromString('black'); + + +/** + * @const + * @type {string} + */ +ol.render.canvas.defaultLineCap = 'round'; + + +/** + * @const + * @type {Array.} + */ +ol.render.canvas.defaultLineDash = []; + + +/** + * @const + * @type {string} + */ +ol.render.canvas.defaultLineJoin = 'round'; + + +/** + * @const + * @type {number} + */ +ol.render.canvas.defaultMiterLimit = 10; + + +/** + * @const + * @type {ol.Color} + */ +ol.render.canvas.defaultStrokeStyle = [0, 0, 0, 1]; + + +/** + * @const + * @type {string} + */ +ol.render.canvas.defaultTextAlign = 'center'; + + +/** + * @const + * @type {string} + */ +ol.render.canvas.defaultTextBaseline = 'middle'; + + +/** + * @const + * @type {number} + */ +ol.render.canvas.defaultLineWidth = 1; diff --git a/float-no-zero/ol/ol/render/canvas/canvasimmediate.exports b/float-no-zero/ol/ol/render/canvas/canvasimmediate.exports new file mode 100644 index 0000000000..8654add64a --- /dev/null +++ b/float-no-zero/ol/ol/render/canvas/canvasimmediate.exports @@ -0,0 +1,12 @@ +@exportProperty ol.render.canvas.Immediate.prototype.drawAsync +@exportProperty ol.render.canvas.Immediate.prototype.drawCircleGeometry +@exportProperty ol.render.canvas.Immediate.prototype.drawFeature +@exportProperty ol.render.canvas.Immediate.prototype.drawLineStringGeometry +@exportProperty ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry +@exportProperty ol.render.canvas.Immediate.prototype.drawMultiPointGeometry +@exportProperty ol.render.canvas.Immediate.prototype.drawMultiPointGeometry +@exportProperty ol.render.canvas.Immediate.prototype.drawPointGeometry +@exportProperty ol.render.canvas.Immediate.prototype.drawPolygonGeometry +@exportProperty ol.render.canvas.Immediate.prototype.setFillStrokeStyle +@exportProperty ol.render.canvas.Immediate.prototype.setImageStyle +@exportProperty ol.render.canvas.Immediate.prototype.setTextStyle diff --git a/float-no-zero/ol/ol/render/canvas/canvasimmediate.js b/float-no-zero/ol/ol/render/canvas/canvasimmediate.js new file mode 100644 index 0000000000..933724d370 --- /dev/null +++ b/float-no-zero/ol/ol/render/canvas/canvasimmediate.js @@ -0,0 +1,907 @@ +// FIXME test, especially polygons with holes and multipolygons +// FIXME need to handle large thick features (where pixel size matters) +// FIXME add offset and end to ol.geom.flat.transform2D? + +goog.provide('ol.render.canvas.Immediate'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.object'); +goog.require('goog.vec.Mat4'); +goog.require('ol.BrowserFeature'); +goog.require('ol.color'); +goog.require('ol.extent'); +goog.require('ol.geom.flat'); +goog.require('ol.render.IVectorContext'); +goog.require('ol.render.canvas'); +goog.require('ol.vec.Mat4'); + + + +/** + * @constructor + * @implements {ol.render.IVectorContext} + * @param {CanvasRenderingContext2D} context Context. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.Extent} extent Extent. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {number} viewRotation View rotation. + * @struct + */ +ol.render.canvas.Immediate = + function(context, pixelRatio, extent, transform, viewRotation) { + + /** + * @private + * @type {Object.>} + */ + this.callbacksByZIndex_ = {}; + + /** + * @private + * @type {CanvasRenderingContext2D} + */ + this.context_ = context; + + /** + * @private + * @type {number} + */ + this.pixelRatio_ = pixelRatio; + + /** + * @private + * @type {ol.Extent} + */ + this.extent_ = extent; + + /** + * @private + * @type {goog.vec.Mat4.Number} + */ + this.transform_ = transform; + + /** + * @private + * @type {number} + */ + this.viewRotation_ = viewRotation; + + /** + * @private + * @type {?ol.render.canvas.FillState} + */ + this.contextFillState_ = null; + + /** + * @private + * @type {?ol.render.canvas.StrokeState} + */ + this.contextStrokeState_ = null; + + /** + * @private + * @type {?ol.render.canvas.TextState} + */ + this.contextTextState_ = null; + + /** + * @private + * @type {?ol.render.canvas.FillState} + */ + this.fillState_ = null; + + /** + * @private + * @type {?ol.render.canvas.StrokeState} + */ + this.strokeState_ = null; + + /** + * @private + * @type {HTMLCanvasElement|HTMLVideoElement|Image} + */ + this.image_ = null; + + /** + * @private + * @type {number} + */ + this.imageAnchorX_ = 0; + + /** + * @private + * @type {number} + */ + this.imageAnchorY_ = 0; + + /** + * @private + * @type {number} + */ + this.imageHeight_ = 0; + + /** + * @private + * @type {number} + */ + this.imageOpacity_ = 0; + + /** + * @private + * @type {boolean} + */ + this.imageRotateWithView_ = false; + + /** + * @private + * @type {number} + */ + this.imageRotation_ = 0; + + /** + * @private + * @type {number} + */ + this.imageScale_ = 0; + + /** + * @private + * @type {boolean} + */ + this.imageSnapToPixel_ = false; + + /** + * @private + * @type {number} + */ + this.imageWidth_ = 0; + + /** + * @private + * @type {string} + */ + this.text_ = ''; + + /** + * @private + * @type {number} + */ + this.textRotation_ = 0; + + /** + * @private + * @type {number} + */ + this.textScale_ = 0; + + /** + * @private + * @type {?ol.render.canvas.FillState} + */ + this.textFillState_ = null; + + /** + * @private + * @type {?ol.render.canvas.StrokeState} + */ + this.textStrokeState_ = null; + + /** + * @private + * @type {?ol.render.canvas.TextState} + */ + this.textState_ = null; + + /** + * @private + * @type {Array.} + */ + this.pixelCoordinates_ = []; + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.tmpLocalTransform_ = goog.vec.Mat4.createNumber(); + +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @private + */ +ol.render.canvas.Immediate.prototype.drawImages_ = + function(flatCoordinates, offset, end, stride) { + if (goog.isNull(this.image_)) { + return; + } + goog.asserts.assert(offset === 0); + goog.asserts.assert(end == flatCoordinates.length); + var pixelCoordinates = ol.geom.flat.transform2D( + flatCoordinates, 2, this.transform_, this.pixelCoordinates_); + var context = this.context_; + var localTransform = this.tmpLocalTransform_; + var alpha = context.globalAlpha; + if (this.imageOpacity_ != 1) { + context.globalAlpha = alpha * this.imageOpacity_; + } + var rotation = this.imageRotation_; + if (this.imageRotateWithView_) { + rotation += this.viewRotation_; + } + var i, ii; + for (i = 0, ii = pixelCoordinates.length; i < ii; i += 2) { + var x = pixelCoordinates[i] - this.imageAnchorX_; + var y = pixelCoordinates[i + 1] - this.imageAnchorY_; + if (this.imageSnapToPixel_) { + x = (x + 0.5) | 0; + y = (y + 0.5) | 0; + } + if (rotation !== 0 || this.imageScale_ != 1) { + var centerX = x + this.imageAnchorX_; + var centerY = y + this.imageAnchorY_; + ol.vec.Mat4.makeTransform2D(localTransform, + centerX, centerY, this.imageScale_, this.imageScale_, + rotation, -centerX, -centerY); + context.setTransform( + goog.vec.Mat4.getElement(localTransform, 0, 0), + goog.vec.Mat4.getElement(localTransform, 1, 0), + goog.vec.Mat4.getElement(localTransform, 0, 1), + goog.vec.Mat4.getElement(localTransform, 1, 1), + goog.vec.Mat4.getElement(localTransform, 0, 3), + goog.vec.Mat4.getElement(localTransform, 1, 3)); + } + context.drawImage(this.image_, x, y, this.imageWidth_, this.imageHeight_); + } + if (rotation !== 0 || this.imageScale_ != 1) { + context.setTransform(1, 0, 0, 1, 0, 0); + } + if (this.imageOpacity_ != 1) { + context.globalAlpha = alpha; + } +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @private + */ +ol.render.canvas.Immediate.prototype.drawText_ = + function(flatCoordinates, offset, end, stride) { + if (goog.isNull(this.textState_) || this.text_ === '') { + return; + } + if (!goog.isNull(this.textFillState_)) { + this.setContextFillState_(this.textFillState_); + } + if (!goog.isNull(this.textStrokeState_)) { + this.setContextStrokeState_(this.textStrokeState_); + } + this.setContextTextState_(this.textState_); + goog.asserts.assert(offset === 0); + goog.asserts.assert(end == flatCoordinates.length); + var pixelCoordinates = ol.geom.flat.transform2D( + flatCoordinates, stride, this.transform_, this.pixelCoordinates_); + var context = this.context_; + for (; offset < end; offset += stride) { + var x = pixelCoordinates[offset]; + var y = pixelCoordinates[offset + 1]; + if (this.textRotation_ !== 0 || this.textScale_ != 1) { + var localTransform = ol.vec.Mat4.makeTransform2D(this.tmpLocalTransform_, + x, y, this.textScale_, this.textScale_, this.textRotation_, -x, -y); + context.setTransform( + goog.vec.Mat4.getElement(localTransform, 0, 0), + goog.vec.Mat4.getElement(localTransform, 1, 0), + goog.vec.Mat4.getElement(localTransform, 0, 1), + goog.vec.Mat4.getElement(localTransform, 1, 1), + goog.vec.Mat4.getElement(localTransform, 0, 3), + goog.vec.Mat4.getElement(localTransform, 1, 3)); + } + if (!goog.isNull(this.textStrokeState_)) { + context.strokeText(this.text_, x, y); + } + if (!goog.isNull(this.textFillState_)) { + context.fillText(this.text_, x, y); + } + } + if (this.textRotation_ !== 0 || this.textScale_ != 1) { + context.setTransform(1, 0, 0, 1, 0, 0); + } +}; + + +/** + * @param {Array.} pixelCoordinates Pixel coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {boolean} close Close. + * @private + * @return {number} end End. + */ +ol.render.canvas.Immediate.prototype.moveToLineTo_ = + function(pixelCoordinates, offset, end, close) { + var context = this.context_; + context.moveTo(pixelCoordinates[offset], pixelCoordinates[offset + 1]); + var i; + for (i = offset + 2; i < end; i += 2) { + context.lineTo(pixelCoordinates[i], pixelCoordinates[i + 1]); + } + if (close) { + context.lineTo(pixelCoordinates[offset], pixelCoordinates[offset + 1]); + } + return end; +}; + + +/** + * @param {Array.} pixelCoordinates Pixel coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @private + * @return {number} End. + */ +ol.render.canvas.Immediate.prototype.drawRings_ = + function(pixelCoordinates, offset, ends) { + var context = this.context_; + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + offset = this.moveToLineTo_(pixelCoordinates, offset, ends[i], true); + context.closePath(); // FIXME is this needed here? + } + return offset; +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawAsync = function(zIndex, callback) { + var zIndexKey = zIndex.toString(); + var callbacks = this.callbacksByZIndex_[zIndexKey]; + if (goog.isDef(callbacks)) { + callbacks.push(callback); + } else { + this.callbacksByZIndex_[zIndexKey] = [callback]; + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawCircleGeometry = + function(circleGeometry, data) { + if (!ol.extent.intersects(this.extent_, circleGeometry.getExtent())) { + return; + } + if (!goog.isNull(this.fillState_) || !goog.isNull(this.strokeState_)) { + if (!goog.isNull(this.fillState_)) { + this.setContextFillState_(this.fillState_); + } + if (!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_); + } + var pixelCoordinates = ol.geom.transformSimpleGeometry2D( + circleGeometry, this.transform_, this.pixelCoordinates_); + var dx = pixelCoordinates[2] - pixelCoordinates[0]; + var dy = pixelCoordinates[3] - pixelCoordinates[1]; + var radius = Math.sqrt(dx * dx + dy * dy); + var context = this.context_; + context.beginPath(); + context.arc( + pixelCoordinates[0], pixelCoordinates[1], radius, 0, 2 * Math.PI); + if (!goog.isNull(this.fillState_)) { + context.fill(); + } + if (!goog.isNull(this.strokeState_)) { + context.stroke(); + } + } + if (this.text_ !== '') { + this.drawText_(circleGeometry.getCenter(), 0, 2, 2); + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawFeature = function(feature, style) { + var geometry = feature.getGeometry(); + if (goog.isNull(geometry) || + !ol.extent.intersects(this.extent_, geometry.getExtent())) { + return; + } + var zIndex = style.getZIndex(); + if (!goog.isDef(zIndex)) { + zIndex = 0; + } + this.drawAsync(zIndex, function(render) { + render.setFillStrokeStyle(style.getFill(), style.getStroke()); + render.setImageStyle(style.getImage()); + render.setTextStyle(style.getText()); + var renderGeometry = + ol.render.canvas.Immediate.GEOMETRY_RENDERES_[geometry.getType()]; + goog.asserts.assert(goog.isDef(renderGeometry)); + renderGeometry.call(render, geometry, null); + }); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawGeometryCollectionGeometry = + function(geometryCollectionGeometry, data) { + var geometries = geometryCollectionGeometry.getGeometriesArray(); + var i, ii; + for (i = 0, ii = geometries.length; i < ii; ++i) { + var geometry = geometries[i]; + var geometryRenderer = + ol.render.canvas.Immediate.GEOMETRY_RENDERES_[geometry.getType()]; + goog.asserts.assert(goog.isDef(geometryRenderer)); + geometryRenderer.call(this, geometry, data); + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawPointGeometry = + function(pointGeometry, data) { + var flatCoordinates = pointGeometry.getFlatCoordinates(); + var stride = pointGeometry.getStride(); + if (!goog.isNull(this.image_)) { + this.drawImages_(flatCoordinates, 0, flatCoordinates.length, stride); + } + if (this.text_ !== '') { + this.drawText_(flatCoordinates, 0, flatCoordinates.length, stride); + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawMultiPointGeometry = + function(multiPointGeometry, data) { + var flatCoordinates = multiPointGeometry.getFlatCoordinates(); + var stride = multiPointGeometry.getStride(); + if (!goog.isNull(this.image_)) { + this.drawImages_(flatCoordinates, 0, flatCoordinates.length, stride); + } + if (this.text_ !== '') { + this.drawText_(flatCoordinates, 0, flatCoordinates.length, stride); + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawLineStringGeometry = + function(lineStringGeometry, data) { + if (!ol.extent.intersects(this.extent_, lineStringGeometry.getExtent())) { + return; + } + if (!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_); + var pixelCoordinates = ol.geom.transformSimpleGeometry2D( + lineStringGeometry, this.transform_, this.pixelCoordinates_); + var context = this.context_; + context.beginPath(); + this.moveToLineTo_(pixelCoordinates, 0, pixelCoordinates.length, false); + context.stroke(); + } + if (this.text_ !== '') { + var flatMidpoint = lineStringGeometry.getFlatMidpoint(); + this.drawText_(flatMidpoint, 0, 2, 2); + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry = + function(multiLineStringGeometry, data) { + var geometryExtent = multiLineStringGeometry.getExtent(); + if (!ol.extent.intersects(this.extent_, geometryExtent)) { + return; + } + var pixelCoordinates; + if (!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_); + pixelCoordinates = ol.geom.transformSimpleGeometry2D( + multiLineStringGeometry, this.transform_, this.pixelCoordinates_); + var context = this.context_; + context.beginPath(); + var ends = multiLineStringGeometry.getEnds(); + var offset = 0; + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + offset = this.moveToLineTo_(pixelCoordinates, offset, ends[i], false); + } + context.stroke(); + } + if (this.text_ !== '') { + var flatMidpoints = multiLineStringGeometry.getFlatMidpoints(); + this.drawText_(flatMidpoints, 0, flatMidpoints.length, 2); + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawPolygonGeometry = + function(polygonGeometry, data) { + if (!ol.extent.intersects(this.extent_, polygonGeometry.getExtent())) { + return; + } + var pixelCoordinates; + if (!goog.isNull(this.strokeState_) || !goog.isNull(this.fillState_)) { + if (!goog.isNull(this.fillState_)) { + this.setContextFillState_(this.fillState_); + } + if (!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_); + } + pixelCoordinates = ol.geom.transformSimpleGeometry2D( + polygonGeometry, this.transform_, this.pixelCoordinates_); + var context = this.context_; + context.beginPath(); + this.drawRings_(pixelCoordinates, 0, polygonGeometry.getEnds()); + if (!goog.isNull(this.fillState_)) { + context.fill(); + } + if (!goog.isNull(this.strokeState_)) { + context.stroke(); + } + } + if (this.text_ !== '') { + var flatInteriorPoint = polygonGeometry.getFlatInteriorPoint(); + this.drawText_(flatInteriorPoint, 0, 2, 2); + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry = + function(multiPolygonGeometry, data) { + if (!ol.extent.intersects(this.extent_, multiPolygonGeometry.getExtent())) { + return; + } + var pixelCoordinates; + if (!goog.isNull(this.strokeState_) || !goog.isNull(this.fillState_)) { + if (!goog.isNull(this.fillState_)) { + this.setContextFillState_(this.fillState_); + } + if (!goog.isNull(this.strokeState_)) { + this.setContextStrokeState_(this.strokeState_); + } + pixelCoordinates = ol.geom.transformSimpleGeometry2D( + multiPolygonGeometry, this.transform_, this.pixelCoordinates_); + var context = this.context_; + var endss = multiPolygonGeometry.getEndss(); + var offset = 0; + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + context.beginPath(); + offset = this.drawRings_(pixelCoordinates, offset, ends); + if (!goog.isNull(this.fillState_)) { + context.fill(); + } + if (!goog.isNull(this.strokeState_)) { + context.stroke(); + } + } + } + if (this.text_ !== '') { + var flatInteriorPoints = multiPolygonGeometry.getFlatInteriorPoints(); + this.drawText_(flatInteriorPoints, 0, flatInteriorPoints.length, 2); + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.drawText = goog.abstractMethod; + + +/** + * FIXME: empty description for jsdoc + */ +ol.render.canvas.Immediate.prototype.flush = function() { + /** @type {Array.} */ + var zs = goog.array.map(goog.object.getKeys(this.callbacksByZIndex_), Number); + goog.array.sort(zs); + var i, ii, callbacks, j, jj; + for (i = 0, ii = zs.length; i < ii; ++i) { + callbacks = this.callbacksByZIndex_[zs[i].toString()]; + for (j = 0, jj = callbacks.length; j < jj; ++j) { + callbacks[j](this); + } + } +}; + + +/** + * @param {ol.render.canvas.FillState} fillState Fill state. + * @private + */ +ol.render.canvas.Immediate.prototype.setContextFillState_ = + function(fillState) { + var context = this.context_; + var contextFillState = this.contextFillState_; + if (goog.isNull(contextFillState)) { + context.fillStyle = fillState.fillStyle; + this.contextFillState_ = { + fillStyle: fillState.fillStyle + }; + } else { + if (contextFillState.fillStyle != fillState.fillStyle) { + contextFillState.fillStyle = context.fillStyle = fillState.fillStyle; + } + } +}; + + +/** + * @param {ol.render.canvas.StrokeState} strokeState Stroke state. + * @private + */ +ol.render.canvas.Immediate.prototype.setContextStrokeState_ = + function(strokeState) { + var context = this.context_; + var contextStrokeState = this.contextStrokeState_; + if (goog.isNull(contextStrokeState)) { + context.lineCap = strokeState.lineCap; + if (ol.BrowserFeature.HAS_CANVAS_LINE_DASH) { + context.setLineDash(strokeState.lineDash); + } + context.lineJoin = strokeState.lineJoin; + context.lineWidth = strokeState.lineWidth; + context.miterLimit = strokeState.miterLimit; + context.strokeStyle = strokeState.strokeStyle; + this.contextStrokeState_ = { + lineCap: strokeState.lineCap, + lineDash: strokeState.lineDash, + lineJoin: strokeState.lineJoin, + lineWidth: strokeState.lineWidth, + miterLimit: strokeState.miterLimit, + strokeStyle: strokeState.strokeStyle + }; + } else { + if (contextStrokeState.lineCap != strokeState.lineCap) { + contextStrokeState.lineCap = context.lineCap = strokeState.lineCap; + } + if (ol.BrowserFeature.HAS_CANVAS_LINE_DASH) { + if (!goog.array.equals( + contextStrokeState.lineDash, strokeState.lineDash)) { + context.setLineDash(contextStrokeState.lineDash = strokeState.lineDash); + } + } + if (contextStrokeState.lineJoin != strokeState.lineJoin) { + contextStrokeState.lineJoin = context.lineJoin = strokeState.lineJoin; + } + if (contextStrokeState.lineWidth != strokeState.lineWidth) { + contextStrokeState.lineWidth = context.lineWidth = strokeState.lineWidth; + } + if (contextStrokeState.miterLimit != strokeState.miterLimit) { + contextStrokeState.miterLimit = context.miterLimit = + strokeState.miterLimit; + } + if (contextStrokeState.strokeStyle != strokeState.strokeStyle) { + contextStrokeState.strokeStyle = context.strokeStyle = + strokeState.strokeStyle; + } + } +}; + + +/** + * @param {ol.render.canvas.TextState} textState Text state. + * @private + */ +ol.render.canvas.Immediate.prototype.setContextTextState_ = + function(textState) { + var context = this.context_; + var contextTextState = this.contextTextState_; + if (goog.isNull(contextTextState)) { + context.font = textState.font; + context.textAlign = textState.textAlign; + context.textBaseline = textState.textBaseline; + this.contextTextState_ = { + font: textState.font, + textAlign: textState.textAlign, + textBaseline: textState.textBaseline + }; + } else { + if (contextTextState.font != textState.font) { + contextTextState.font = context.font = textState.font; + } + if (contextTextState.textAlign != textState.textAlign) { + contextTextState.textAlign = context.textAlign = textState.textAlign; + } + if (contextTextState.textBaseline != textState.textBaseline) { + contextTextState.textBaseline = context.textBaseline = + textState.textBaseline; + } + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.setFillStrokeStyle = + function(fillStyle, strokeStyle) { + if (goog.isNull(fillStyle)) { + this.fillState_ = null; + } else { + var fillStyleColor = fillStyle.getColor(); + this.fillState_ = { + fillStyle: ol.color.asString(!goog.isNull(fillStyleColor) ? + fillStyleColor : ol.render.canvas.defaultFillStyle) + }; + } + if (goog.isNull(strokeStyle)) { + this.strokeState_ = null; + } else { + var strokeStyleColor = strokeStyle.getColor(); + var strokeStyleLineCap = strokeStyle.getLineCap(); + var strokeStyleLineDash = strokeStyle.getLineDash(); + var strokeStyleLineJoin = strokeStyle.getLineJoin(); + var strokeStyleWidth = strokeStyle.getWidth(); + var strokeStyleMiterLimit = strokeStyle.getMiterLimit(); + this.strokeState_ = { + lineCap: goog.isDef(strokeStyleLineCap) ? + strokeStyleLineCap : ol.render.canvas.defaultLineCap, + lineDash: goog.isDefAndNotNull(strokeStyleLineDash) ? + strokeStyleLineDash : ol.render.canvas.defaultLineDash, + lineJoin: goog.isDef(strokeStyleLineJoin) ? + strokeStyleLineJoin : ol.render.canvas.defaultLineJoin, + lineWidth: this.pixelRatio_ * (goog.isDef(strokeStyleWidth) ? + strokeStyleWidth : ol.render.canvas.defaultLineWidth), + miterLimit: goog.isDef(strokeStyleMiterLimit) ? + strokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit, + strokeStyle: ol.color.asString(!goog.isNull(strokeStyleColor) ? + strokeStyleColor : ol.render.canvas.defaultStrokeStyle) + }; + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.setImageStyle = function(imageStyle) { + if (goog.isNull(imageStyle)) { + this.image_ = null; + } else { + var imageAnchor = imageStyle.getAnchor(); + // FIXME pixel ratio + var imageImage = imageStyle.getImage(1); + var imageOpacity = imageStyle.getOpacity(); + var imageRotateWithView = imageStyle.getRotateWithView(); + var imageRotation = imageStyle.getRotation(); + var imageScale = imageStyle.getScale(); + var imageSize = imageStyle.getSize(); + var imageSnapToPixel = imageStyle.getSnapToPixel(); + goog.asserts.assert(!goog.isNull(imageAnchor)); + goog.asserts.assert(!goog.isNull(imageImage)); + goog.asserts.assert(!goog.isNull(imageSize)); + this.imageAnchorX_ = imageAnchor[0]; + this.imageAnchorY_ = imageAnchor[1]; + this.imageHeight_ = imageSize[1]; + this.image_ = imageImage; + this.imageOpacity_ = goog.isDef(imageOpacity) ? imageOpacity : 1; + this.imageRotateWithView_ = goog.isDef(imageRotateWithView) ? + imageRotateWithView : false; + this.imageRotation_ = goog.isDef(imageRotation) ? imageRotation : 0; + this.imageScale_ = goog.isDef(imageScale) ? imageScale : 1; + this.imageSnapToPixel_ = goog.isDef(imageSnapToPixel) ? + imageSnapToPixel : false; + this.imageWidth_ = imageSize[0]; + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Immediate.prototype.setTextStyle = function(textStyle) { + if (goog.isNull(textStyle)) { + this.text_ = ''; + } else { + var textFillStyle = textStyle.getFill(); + if (goog.isNull(textFillStyle)) { + this.textFillState_ = null; + } else { + var textFillStyleColor = textFillStyle.getColor(); + this.textFillState_ = { + fillStyle: ol.color.asString(!goog.isNull(textFillStyleColor) ? + textFillStyleColor : ol.render.canvas.defaultFillStyle) + }; + } + var textStrokeStyle = textStyle.getStroke(); + if (goog.isNull(textStrokeStyle)) { + this.textStrokeState_ = null; + } else { + var textStrokeStyleColor = textStrokeStyle.getColor(); + var textStrokeStyleLineCap = textStrokeStyle.getLineCap(); + var textStrokeStyleLineDash = textStrokeStyle.getLineDash(); + var textStrokeStyleLineJoin = textStrokeStyle.getLineJoin(); + var textStrokeStyleWidth = textStrokeStyle.getWidth(); + var textStrokeStyleMiterLimit = textStrokeStyle.getMiterLimit(); + this.textStrokeState_ = { + lineCap: goog.isDef(textStrokeStyleLineCap) ? + textStrokeStyleLineCap : ol.render.canvas.defaultLineCap, + lineDash: goog.isDefAndNotNull(textStrokeStyleLineDash) ? + textStrokeStyleLineDash : ol.render.canvas.defaultLineDash, + lineJoin: goog.isDef(textStrokeStyleLineJoin) ? + textStrokeStyleLineJoin : ol.render.canvas.defaultLineJoin, + lineWidth: this.pixelRatio_ * (goog.isDef(textStrokeStyleWidth) ? + textStrokeStyleWidth : ol.render.canvas.defaultLineWidth), + miterLimit: goog.isDef(textStrokeStyleMiterLimit) ? + textStrokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit, + strokeStyle: ol.color.asString(!goog.isNull(textStrokeStyleColor) ? + textStrokeStyleColor : ol.render.canvas.defaultStrokeStyle) + }; + } + var textFont = textStyle.getFont(); + var textRotation = textStyle.getRotation(); + var textScale = textStyle.getScale(); + var textText = textStyle.getText(); + var textTextAlign = textStyle.getTextAlign(); + var textTextBaseline = textStyle.getTextBaseline(); + this.textState_ = { + font: goog.isDef(textFont) ? + textFont : ol.render.canvas.defaultFont, + textAlign: goog.isDef(textTextAlign) ? + textTextAlign : ol.render.canvas.defaultTextAlign, + textBaseline: goog.isDef(textTextBaseline) ? + textTextBaseline : ol.render.canvas.defaultTextBaseline + }; + this.text_ = goog.isDef(textText) ? textText : ''; + this.textRotation_ = goog.isDef(textRotation) ? textRotation : 0; + this.textScale_ = this.pixelRatio_ * (goog.isDef(textScale) ? + textScale : 1); + } +}; + + +/** + * @const + * @private + * @type {Object.} + */ +ol.render.canvas.Immediate.GEOMETRY_RENDERES_ = { + 'Point': ol.render.canvas.Immediate.prototype.drawPointGeometry, + 'LineString': ol.render.canvas.Immediate.prototype.drawLineStringGeometry, + 'Polygon': ol.render.canvas.Immediate.prototype.drawPolygonGeometry, + 'MultiPoint': ol.render.canvas.Immediate.prototype.drawMultiPointGeometry, + 'MultiLineString': + ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry, + 'MultiPolygon': ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry, + 'GeometryCollection': + ol.render.canvas.Immediate.prototype.drawGeometryCollectionGeometry, + 'Circle': ol.render.canvas.Immediate.prototype.drawCircleGeometry +}; diff --git a/float-no-zero/ol/ol/render/canvas/canvasreplay.js b/float-no-zero/ol/ol/render/canvas/canvasreplay.js new file mode 100644 index 0000000000..15fef376c8 --- /dev/null +++ b/float-no-zero/ol/ol/render/canvas/canvasreplay.js @@ -0,0 +1,1961 @@ +// FIXME decide default snapToPixel behaviour +// FIXME add option to apply snapToPixel to all coordinates? +// FIXME can eliminate empty set styles and strokes (when all geoms skipped) + +goog.provide('ol.render.canvas.ReplayGroup'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.object'); +goog.require('goog.vec.Mat4'); +goog.require('ol.BrowserFeature'); +goog.require('ol.array'); +goog.require('ol.color'); +goog.require('ol.extent'); +goog.require('ol.extent.Relationship'); +goog.require('ol.geom.flat'); +goog.require('ol.geom.simplify'); +goog.require('ol.render.IReplayGroup'); +goog.require('ol.render.IVectorContext'); +goog.require('ol.render.canvas'); +goog.require('ol.vec.Mat4'); + + +/** + * @enum {number} + */ +ol.render.canvas.Instruction = { + BEGIN_GEOMETRY: 0, + BEGIN_PATH: 1, + CIRCLE: 2, + CLOSE_PATH: 3, + DRAW_IMAGE: 4, + DRAW_TEXT: 5, + END_GEOMETRY: 6, + FILL: 7, + MOVE_TO_LINE_TO: 8, + SET_FILL_STYLE: 9, + SET_STROKE_STYLE: 10, + SET_TEXT_STYLE: 11, + STROKE: 12 +}; + + + +/** + * @constructor + * @implements {ol.render.IVectorContext} + * @param {number} tolerance Tolerance. + * @param {ol.Extent} maxExtent Maximum extent. + * @protected + * @struct + */ +ol.render.canvas.Replay = function(tolerance, maxExtent) { + + /** + * @protected + * @type {number} + */ + this.tolerance = tolerance; + + /** + * @protected + * @type {ol.Extent} + */ + this.maxExtent = maxExtent; + + /** + * @private + * @type {Array.<*>} + */ + this.beginGeometryInstruction1_ = null; + + /** + * @private + * @type {Array.<*>} + */ + this.beginGeometryInstruction2_ = null; + + /** + * @protected + * @type {Array.<*>} + */ + this.instructions = []; + + /** + * @protected + * @type {Array.} + */ + this.coordinates = []; + + /** + * @private + * @type {goog.vec.Mat4.Number} + */ + this.renderedTransform_ = goog.vec.Mat4.createNumber(); + + /** + * @protected + * @type {Array.<*>} + */ + this.hitDetectionInstructions = []; + + /** + * @private + * @type {Array.} + */ + this.pixelCoordinates_ = []; + + /** + * @private + * @type {ol.Extent} + */ + this.extent_ = ol.extent.createEmpty(); + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.tmpLocalTransform_ = goog.vec.Mat4.createNumber(); + +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {boolean} close Close. + * @protected + * @return {number} My end. + */ +ol.render.canvas.Replay.prototype.appendFlatCoordinates = + function(flatCoordinates, offset, end, stride, close) { + + var myEnd = this.coordinates.length; + var extent = this.maxExtent; + var lastCoord = [flatCoordinates[offset], flatCoordinates[offset + 1]]; + var nextCoord = [NaN, NaN]; + var skipped = true; + + var i, lastRel, nextRel; + for (i = offset + stride; i < end; i += stride) { + nextCoord[0] = flatCoordinates[i]; + nextCoord[1] = flatCoordinates[i + 1]; + nextRel = ol.extent.coordinateRelationship(extent, nextCoord); + if (nextRel !== lastRel) { + if (skipped) { + this.coordinates[myEnd++] = lastCoord[0]; + this.coordinates[myEnd++] = lastCoord[1]; + } + this.coordinates[myEnd++] = nextCoord[0]; + this.coordinates[myEnd++] = nextCoord[1]; + skipped = false; + } else if (nextRel === ol.extent.Relationship.INTERSECTING) { + this.coordinates[myEnd++] = nextCoord[0]; + this.coordinates[myEnd++] = nextCoord[1]; + skipped = false; + } else { + skipped = true; + } + lastCoord[0] = nextCoord[0]; + lastCoord[1] = nextCoord[1]; + lastRel = nextRel; + } + + if (close) { + this.coordinates[myEnd++] = flatCoordinates[offset]; + this.coordinates[myEnd++] = flatCoordinates[offset + 1]; + } + return myEnd; +}; + + +/** + * @protected + * @param {ol.geom.Geometry} geometry Geometry. + */ +ol.render.canvas.Replay.prototype.beginGeometry = function(geometry) { + this.beginGeometryInstruction1_ = + [ol.render.canvas.Instruction.BEGIN_GEOMETRY, geometry, 0]; + this.instructions.push(this.beginGeometryInstruction1_); + this.beginGeometryInstruction2_ = + [ol.render.canvas.Instruction.BEGIN_GEOMETRY, geometry, 0]; + this.hitDetectionInstructions.push(this.beginGeometryInstruction2_); +}; + + +/** + * @private + * @param {CanvasRenderingContext2D} context Context. + * @param {number} pixelRatio Pixel ratio. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {number} viewRotation View rotation. + * @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render + * geometry function. + * @param {Array.<*>} instructions Instructions array. + * @param {function(ol.geom.Geometry, Object): T|undefined} geometryCallback + * Geometry callback. + * @return {T|undefined} Callback result. + * @template T + */ +ol.render.canvas.Replay.prototype.replay_ = function( + context, pixelRatio, transform, viewRotation, renderGeometryFunction, + instructions, geometryCallback) { + /** @type {Array.} */ + var pixelCoordinates; + if (ol.vec.Mat4.equals2D(transform, this.renderedTransform_)) { + pixelCoordinates = this.pixelCoordinates_; + } else { + pixelCoordinates = ol.geom.flat.transform2D( + this.coordinates, 2, transform, this.pixelCoordinates_); + goog.vec.Mat4.setFromArray(this.renderedTransform_, transform); + goog.asserts.assert(pixelCoordinates === this.pixelCoordinates_); + } + var i = 0; // instruction index + var ii = instructions.length; // end of instructions + var d = 0; // data index + var dd; // end of per-instruction data + var localTransform = this.tmpLocalTransform_; + while (i < ii) { + var instruction = instructions[i]; + var type = /** @type {ol.render.canvas.Instruction} */ (instruction[0]); + var fill, geometry, stroke, text, x, y; + switch (type) { + case ol.render.canvas.Instruction.BEGIN_GEOMETRY: + geometry = /** @type {ol.geom.Geometry} */ (instruction[1]); + if (renderGeometryFunction(geometry)) { + ++i; + } else { + i = /** @type {number} */ (instruction[2]); + } + break; + case ol.render.canvas.Instruction.BEGIN_PATH: + context.beginPath(); + ++i; + break; + case ol.render.canvas.Instruction.CIRCLE: + var x1 = pixelCoordinates[d]; + var y1 = pixelCoordinates[d + 1]; + var x2 = pixelCoordinates[d + 2]; + var y2 = pixelCoordinates[d + 3]; + var dx = x2 - x1; + var dy = y2 - y1; + var r = Math.sqrt(dx * dx + dy * dy); + context.arc(x1, y1, r, 0, 2 * Math.PI, true); + d += 4; + ++i; + break; + case ol.render.canvas.Instruction.CLOSE_PATH: + context.closePath(); + ++i; + break; + case ol.render.canvas.Instruction.DRAW_IMAGE: + goog.asserts.assert(goog.isNumber(instruction[1])); + d = /** @type {number} */ (instruction[1]); + goog.asserts.assert(goog.isNumber(instruction[2])); + dd = /** @type {number} */ (instruction[2]); + var image = /** @type {HTMLCanvasElement|HTMLVideoElement|Image} */ + (instruction[3]); + // Remaining arguments in DRAW_IMAGE are in alphabetical order + var anchorX = /** @type {number} */ (instruction[4]) * pixelRatio; + var anchorY = /** @type {number} */ (instruction[5]) * pixelRatio; + var height = /** @type {number} */ (instruction[6]) * pixelRatio; + var opacity = /** @type {number} */ (instruction[7]); + var rotateWithView = /** @type {boolean} */ (instruction[8]); + var rotation = /** @type {number} */ (instruction[9]); + var scale = /** @type {number} */ (instruction[10]); + var snapToPixel = /** @type {boolean|undefined} */ (instruction[11]); + var width = /** @type {number} */ (instruction[12]) * pixelRatio; + if (rotateWithView) { + rotation += viewRotation; + } + for (; d < dd; d += 2) { + x = pixelCoordinates[d] - anchorX; + y = pixelCoordinates[d + 1] - anchorY; + if (snapToPixel) { + x = (x + 0.5) | 0; + y = (y + 0.5) | 0; + } + if (scale != 1 || rotation !== 0) { + var centerX = x + anchorX; + var centerY = y + anchorY; + ol.vec.Mat4.makeTransform2D( + localTransform, centerX, centerY, scale, scale, + rotation, -centerX, -centerY); + context.setTransform( + goog.vec.Mat4.getElement(localTransform, 0, 0), + goog.vec.Mat4.getElement(localTransform, 1, 0), + goog.vec.Mat4.getElement(localTransform, 0, 1), + goog.vec.Mat4.getElement(localTransform, 1, 1), + goog.vec.Mat4.getElement(localTransform, 0, 3), + goog.vec.Mat4.getElement(localTransform, 1, 3)); + } + var alpha = context.globalAlpha; + if (opacity != 1) { + context.globalAlpha = alpha * opacity; + } + + context.drawImage(image, x, y, width, height); + + if (opacity != 1) { + context.globalAlpha = alpha; + } + if (scale != 1 || rotation !== 0) { + context.setTransform(1, 0, 0, 1, 0, 0); + } + } + ++i; + break; + case ol.render.canvas.Instruction.DRAW_TEXT: + goog.asserts.assert(goog.isNumber(instruction[1])); + d = /** @type {number} */ (instruction[1]); + goog.asserts.assert(goog.isNumber(instruction[2])); + dd = /** @type {number} */ (instruction[2]); + goog.asserts.assert(goog.isString(instruction[3])); + text = /** @type {string} */ (instruction[3]); + goog.asserts.assert(goog.isNumber(instruction[4])); + rotation = /** @type {number} */ (instruction[4]); + goog.asserts.assert(goog.isNumber(instruction[5])); + scale = /** @type {number} */ (instruction[5]) * pixelRatio; + goog.asserts.assert(goog.isBoolean(instruction[6])); + fill = /** @type {boolean} */ (instruction[6]); + goog.asserts.assert(goog.isBoolean(instruction[7])); + stroke = /** @type {boolean} */ (instruction[7]); + for (; d < dd; d += 2) { + x = pixelCoordinates[d]; + y = pixelCoordinates[d + 1]; + if (scale != 1 || rotation !== 0) { + ol.vec.Mat4.makeTransform2D( + localTransform, x, y, scale, scale, rotation, -x, -y); + context.setTransform( + goog.vec.Mat4.getElement(localTransform, 0, 0), + goog.vec.Mat4.getElement(localTransform, 1, 0), + goog.vec.Mat4.getElement(localTransform, 0, 1), + goog.vec.Mat4.getElement(localTransform, 1, 1), + goog.vec.Mat4.getElement(localTransform, 0, 3), + goog.vec.Mat4.getElement(localTransform, 1, 3)); + } + if (stroke) { + context.strokeText(text, x, y); + } + if (fill) { + context.fillText(text, x, y); + } + if (scale != 1 || rotation !== 0) { + context.setTransform(1, 0, 0, 1, 0, 0); + } + } + ++i; + break; + case ol.render.canvas.Instruction.END_GEOMETRY: + if (goog.isDef(geometryCallback)) { + geometry = /** @type {ol.geom.Geometry} */ (instruction[1]); + var data = /** @type {Object} */ (instruction[2]); + var result = geometryCallback(geometry, data); + if (result) { + return result; + } + } + ++i; + break; + case ol.render.canvas.Instruction.FILL: + context.fill(); + ++i; + break; + case ol.render.canvas.Instruction.MOVE_TO_LINE_TO: + goog.asserts.assert(goog.isNumber(instruction[1])); + d = /** @type {number} */ (instruction[1]); + goog.asserts.assert(goog.isNumber(instruction[2])); + dd = /** @type {number} */ (instruction[2]); + context.moveTo(pixelCoordinates[d], pixelCoordinates[d + 1]); + for (d += 2; d < dd; d += 2) { + context.lineTo(pixelCoordinates[d], pixelCoordinates[d + 1]); + } + ++i; + break; + case ol.render.canvas.Instruction.SET_FILL_STYLE: + goog.asserts.assert(goog.isString(instruction[1])); + context.fillStyle = /** @type {string} */ (instruction[1]); + ++i; + break; + case ol.render.canvas.Instruction.SET_STROKE_STYLE: + goog.asserts.assert(goog.isString(instruction[1])); + goog.asserts.assert(goog.isNumber(instruction[2])); + goog.asserts.assert(goog.isString(instruction[3])); + goog.asserts.assert(goog.isString(instruction[4])); + goog.asserts.assert(goog.isNumber(instruction[5])); + goog.asserts.assert(!goog.isNull(instruction[6])); + context.strokeStyle = /** @type {string} */ (instruction[1]); + context.lineWidth = /** @type {number} */ (instruction[2]) * pixelRatio; + context.lineCap = /** @type {string} */ (instruction[3]); + context.lineJoin = /** @type {string} */ (instruction[4]); + context.miterLimit = /** @type {number} */ (instruction[5]); + if (ol.BrowserFeature.HAS_CANVAS_LINE_DASH) { + context.setLineDash(/** @type {Array.} */ (instruction[6])); + } + ++i; + break; + case ol.render.canvas.Instruction.SET_TEXT_STYLE: + goog.asserts.assert(goog.isString(instruction[1])); + goog.asserts.assert(goog.isString(instruction[2])); + goog.asserts.assert(goog.isString(instruction[3])); + context.font = /** @type {string} */ (instruction[1]); + context.textAlign = /** @type {string} */ (instruction[2]); + context.textBaseline = /** @type {string} */ (instruction[3]); + ++i; + break; + case ol.render.canvas.Instruction.STROKE: + context.stroke(); + ++i; + break; + default: + goog.asserts.fail(); + ++i; // consume the instruction anyway, to avoid an infinite loop + break; + } + } + // assert that all instructions were consumed + goog.asserts.assert(i == instructions.length); + return undefined; +}; + + +/** + * @param {CanvasRenderingContext2D} context Context. + * @param {number} pixelRatio Pixel ratio. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {number} viewRotation View rotation. + * @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render + * geometry function. + * @return {T|undefined} Callback result. + * @template T + */ +ol.render.canvas.Replay.prototype.replay = function( + context, pixelRatio, transform, viewRotation, renderGeometryFunction) { + var instructions = this.instructions; + return this.replay_(context, pixelRatio, transform, viewRotation, + renderGeometryFunction, instructions, undefined); +}; + + +/** + * @param {CanvasRenderingContext2D} context Context. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {number} viewRotation View rotation. + * @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render + * geometry function. + * @param {function(ol.geom.Geometry, Object): T=} opt_geometryCallback + * Geometry callback. + * @return {T|undefined} Callback result. + * @template T + */ +ol.render.canvas.Replay.prototype.replayHitDetection = function( + context, transform, viewRotation, renderGeometryFunction, + opt_geometryCallback) { + var instructions = this.hitDetectionInstructions; + return this.replay_(context, 1, transform, viewRotation, + renderGeometryFunction, instructions, opt_geometryCallback); +}; + + +/** + * @private + */ +ol.render.canvas.Replay.prototype.reverseHitDetectionInstructions_ = + function() { + var hitDetectionInstructions = this.hitDetectionInstructions; + // step 1 - reverse array + hitDetectionInstructions.reverse(); + // step 2 - reverse instructions within geometry blocks + var i; + var n = hitDetectionInstructions.length; + var instruction; + var type; + var begin = -1; + for (i = 0; i < n; ++i) { + instruction = hitDetectionInstructions[i]; + type = /** @type {ol.render.canvas.Instruction} */ (instruction[0]); + if (type == ol.render.canvas.Instruction.END_GEOMETRY) { + goog.asserts.assert(begin == -1); + begin = i; + } else if (type == ol.render.canvas.Instruction.BEGIN_GEOMETRY) { + goog.asserts.assert(begin >= 0); + ol.array.reverseSubArray(this.hitDetectionInstructions, begin, i); + begin = -1; + } + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawAsync = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawCircleGeometry = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawFeature = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawGeometryCollectionGeometry = + goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawLineStringGeometry = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawMultiLineStringGeometry = + goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawPointGeometry = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawMultiPointGeometry = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawPolygonGeometry = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawMultiPolygonGeometry = + goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.drawText = goog.abstractMethod; + + +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @param {Object} data Opaque data object. + */ +ol.render.canvas.Replay.prototype.endGeometry = + function(geometry, data) { + goog.asserts.assert(!goog.isNull(this.beginGeometryInstruction1_)); + this.beginGeometryInstruction1_[2] = this.instructions.length; + this.beginGeometryInstruction1_ = null; + goog.asserts.assert(!goog.isNull(this.beginGeometryInstruction2_)); + this.beginGeometryInstruction2_[2] = this.hitDetectionInstructions.length; + this.beginGeometryInstruction2_ = null; + var endGeometryInstruction = + [ol.render.canvas.Instruction.END_GEOMETRY, geometry, data]; + this.instructions.push(endGeometryInstruction); + this.hitDetectionInstructions.push(endGeometryInstruction); +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.render.canvas.Replay.prototype.finish = goog.nullFunction; + + +/** + * @return {ol.Extent} Extent. + */ +ol.render.canvas.Replay.prototype.getExtent = function() { + return this.extent_; +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.setFillStrokeStyle = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.setImageStyle = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.render.canvas.Replay.prototype.setTextStyle = goog.abstractMethod; + + + +/** + * @constructor + * @extends {ol.render.canvas.Replay} + * @param {number} tolerance Tolerance. + * @param {ol.Extent} maxExtent Maximum extent. + * @protected + * @struct + */ +ol.render.canvas.ImageReplay = function(tolerance, maxExtent) { + + goog.base(this, tolerance, maxExtent); + + /** + * @private + * @type {HTMLCanvasElement|HTMLVideoElement|Image} + */ + this.hitDetectionImage_ = null; + + /** + * @private + * @type {HTMLCanvasElement|HTMLVideoElement|Image} + */ + this.image_ = null; + + /** + * @private + * @type {number|undefined} + */ + this.anchorX_ = undefined; + + /** + * @private + * @type {number|undefined} + */ + this.anchorY_ = undefined; + + /** + * @private + * @type {number|undefined} + */ + this.height_ = undefined; + + /** + * @private + * @type {number|undefined} + */ + this.opacity_ = undefined; + + /** + * @private + * @type {boolean|undefined} + */ + this.rotateWithView_ = undefined; + + /** + * @private + * @type {number|undefined} + */ + this.rotation_ = undefined; + + /** + * @private + * @type {number|undefined} + */ + this.scale_ = undefined; + + /** + * @private + * @type {boolean|undefined} + */ + this.snapToPixel_ = undefined; + + /** + * @private + * @type {number|undefined} + */ + this.width_ = undefined; + +}; +goog.inherits(ol.render.canvas.ImageReplay, ol.render.canvas.Replay); + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @private + * @return {number} My end. + */ +ol.render.canvas.ImageReplay.prototype.drawCoordinates_ = + function(flatCoordinates, offset, end, stride) { + return this.appendFlatCoordinates( + flatCoordinates, offset, end, stride, false); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.ImageReplay.prototype.drawPointGeometry = + function(pointGeometry, data) { + if (goog.isNull(this.image_)) { + return; + } + goog.asserts.assert(goog.isDef(this.anchorX_)); + goog.asserts.assert(goog.isDef(this.anchorY_)); + goog.asserts.assert(goog.isDef(this.height_)); + goog.asserts.assert(goog.isDef(this.opacity_)); + goog.asserts.assert(goog.isDef(this.rotateWithView_)); + goog.asserts.assert(goog.isDef(this.rotation_)); + goog.asserts.assert(goog.isDef(this.scale_)); + goog.asserts.assert(goog.isDef(this.width_)); + ol.extent.extend(this.extent_, pointGeometry.getExtent()); + this.beginGeometry(pointGeometry); + var flatCoordinates = pointGeometry.getFlatCoordinates(); + var stride = pointGeometry.getStride(); + var myBegin = this.coordinates.length; + var myEnd = this.drawCoordinates_( + flatCoordinates, 0, flatCoordinates.length, stride); + this.instructions.push([ + ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.image_, + // Remaining arguments to DRAW_IMAGE are in alphabetical order + this.anchorX_, this.anchorY_, this.height_, this.opacity_, + this.rotateWithView_, this.rotation_, this.scale_, this.snapToPixel_, + this.width_ + ]); + this.hitDetectionInstructions.push([ + ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, + this.hitDetectionImage_, + // Remaining arguments to DRAW_IMAGE are in alphabetical order + this.anchorX_, this.anchorY_, this.height_, this.opacity_, + this.rotateWithView_, this.rotation_, this.scale_, this.snapToPixel_, + this.width_ + ]); + this.endGeometry(pointGeometry, data); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.ImageReplay.prototype.drawMultiPointGeometry = + function(multiPointGeometry, data) { + if (goog.isNull(this.image_)) { + return; + } + goog.asserts.assert(goog.isDef(this.anchorX_)); + goog.asserts.assert(goog.isDef(this.anchorY_)); + goog.asserts.assert(goog.isDef(this.height_)); + goog.asserts.assert(goog.isDef(this.opacity_)); + goog.asserts.assert(goog.isDef(this.rotateWithView_)); + goog.asserts.assert(goog.isDef(this.rotation_)); + goog.asserts.assert(goog.isDef(this.scale_)); + goog.asserts.assert(goog.isDef(this.width_)); + ol.extent.extend(this.extent_, multiPointGeometry.getExtent()); + this.beginGeometry(multiPointGeometry); + var flatCoordinates = multiPointGeometry.getFlatCoordinates(); + var stride = multiPointGeometry.getStride(); + var myBegin = this.coordinates.length; + var myEnd = this.drawCoordinates_( + flatCoordinates, 0, flatCoordinates.length, stride); + this.instructions.push([ + ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.image_, + // Remaining arguments to DRAW_IMAGE are in alphabetical order + this.anchorX_, this.anchorY_, this.height_, this.opacity_, + this.rotateWithView_, this.rotation_, this.scale_, this.snapToPixel_, + this.width_ + ]); + this.hitDetectionInstructions.push([ + ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, + this.hitDetectionImage_, + // Remaining arguments to DRAW_IMAGE are in alphabetical order + this.anchorX_, this.anchorY_, this.height_, this.opacity_, + this.rotateWithView_, this.rotation_, this.scale_, this.snapToPixel_, + this.width_ + ]); + this.endGeometry(multiPointGeometry, data); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.ImageReplay.prototype.finish = function() { + this.reverseHitDetectionInstructions_(); + // FIXME this doesn't really protect us against further calls to draw*Geometry + this.anchorX_ = undefined; + this.anchorY_ = undefined; + this.hitDetectionImage_ = null; + this.image_ = null; + this.height_ = undefined; + this.scale_ = undefined; + this.opacity_ = undefined; + this.rotateWithView_ = undefined; + this.rotation_ = undefined; + this.snapToPixel_ = undefined; + this.width_ = undefined; +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.ImageReplay.prototype.setImageStyle = function(imageStyle) { + goog.asserts.assert(!goog.isNull(imageStyle)); + var anchor = imageStyle.getAnchor(); + goog.asserts.assert(!goog.isNull(anchor)); + var size = imageStyle.getSize(); + goog.asserts.assert(!goog.isNull(size)); + var hitDetectionImage = imageStyle.getHitDetectionImage(1); + goog.asserts.assert(!goog.isNull(hitDetectionImage)); + var image = imageStyle.getImage(1); + goog.asserts.assert(!goog.isNull(image)); + this.anchorX_ = anchor[0]; + this.anchorY_ = anchor[1]; + this.hitDetectionImage_ = hitDetectionImage; + this.image_ = image; + this.height_ = size[1]; + this.opacity_ = imageStyle.getOpacity(); + this.rotateWithView_ = imageStyle.getRotateWithView(); + this.rotation_ = imageStyle.getRotation(); + this.scale_ = imageStyle.getScale(); + this.snapToPixel_ = imageStyle.getSnapToPixel(); + this.width_ = size[0]; +}; + + + +/** + * @constructor + * @extends {ol.render.canvas.Replay} + * @param {number} tolerance Tolerance. + * @param {ol.Extent} maxExtent Maximum extent. + * @protected + * @struct + */ +ol.render.canvas.LineStringReplay = function(tolerance, maxExtent) { + + goog.base(this, tolerance, maxExtent); + + /** + * @private + * @type {{currentStrokeStyle: (string|undefined), + * currentLineCap: (string|undefined), + * currentLineDash: Array., + * currentLineJoin: (string|undefined), + * currentLineWidth: (number|undefined), + * currentMiterLimit: (number|undefined), + * lastStroke: number, + * strokeStyle: (string|undefined), + * lineCap: (string|undefined), + * lineDash: Array., + * lineJoin: (string|undefined), + * lineWidth: (number|undefined), + * miterLimit: (number|undefined)}|null} + */ + this.state_ = { + currentStrokeStyle: undefined, + currentLineCap: undefined, + currentLineDash: null, + currentLineJoin: undefined, + currentLineWidth: undefined, + currentMiterLimit: undefined, + lastStroke: 0, + strokeStyle: undefined, + lineCap: undefined, + lineDash: null, + lineJoin: undefined, + lineWidth: undefined, + miterLimit: undefined + }; + +}; +goog.inherits(ol.render.canvas.LineStringReplay, ol.render.canvas.Replay); + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @private + * @return {number} end. + */ +ol.render.canvas.LineStringReplay.prototype.drawFlatCoordinates_ = + function(flatCoordinates, offset, end, stride) { + var myBegin = this.coordinates.length; + var myEnd = this.appendFlatCoordinates( + flatCoordinates, offset, end, stride, false); + var moveToLineToInstruction = + [ol.render.canvas.Instruction.MOVE_TO_LINE_TO, myBegin, myEnd]; + this.instructions.push(moveToLineToInstruction); + this.hitDetectionInstructions.push(moveToLineToInstruction); + return end; +}; + + +/** + * @private + */ +ol.render.canvas.LineStringReplay.prototype.setStrokeStyle_ = function() { + var state = this.state_; + var strokeStyle = state.strokeStyle; + var lineCap = state.lineCap; + var lineDash = state.lineDash; + var lineJoin = state.lineJoin; + var lineWidth = state.lineWidth; + var miterLimit = state.miterLimit; + goog.asserts.assert(goog.isDef(strokeStyle)); + goog.asserts.assert(goog.isDef(lineCap)); + goog.asserts.assert(!goog.isNull(lineDash)); + goog.asserts.assert(goog.isDef(lineJoin)); + goog.asserts.assert(goog.isDef(lineWidth)); + goog.asserts.assert(goog.isDef(miterLimit)); + if (state.currentStrokeStyle != strokeStyle || + state.currentLineCap != lineCap || + !goog.array.equals(state.currentLineDash, lineDash) || + state.currentLineJoin != lineJoin || + state.currentLineWidth != lineWidth || + state.currentMiterLimit != miterLimit) { + if (state.lastStroke != this.coordinates.length) { + this.instructions.push( + [ol.render.canvas.Instruction.STROKE]); + state.lastStroke = this.coordinates.length; + } + this.instructions.push( + [ol.render.canvas.Instruction.SET_STROKE_STYLE, + strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash], + [ol.render.canvas.Instruction.BEGIN_PATH]); + state.currentStrokeStyle = strokeStyle; + state.currentLineCap = lineCap; + state.currentLineDash = lineDash; + state.currentLineJoin = lineJoin; + state.currentLineWidth = lineWidth; + state.currentMiterLimit = miterLimit; + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.LineStringReplay.prototype.drawLineStringGeometry = + function(lineStringGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var strokeStyle = state.strokeStyle; + var lineWidth = state.lineWidth; + if (!goog.isDef(strokeStyle) || !goog.isDef(lineWidth)) { + return; + } + ol.extent.extend(this.extent_, lineStringGeometry.getExtent()); + this.setStrokeStyle_(); + this.beginGeometry(lineStringGeometry); + this.hitDetectionInstructions.push( + [ol.render.canvas.Instruction.SET_STROKE_STYLE, + state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, + state.miterLimit, state.lineDash], + [ol.render.canvas.Instruction.BEGIN_PATH]); + var flatCoordinates = lineStringGeometry.getFlatCoordinates(); + var stride = lineStringGeometry.getStride(); + this.drawFlatCoordinates_( + flatCoordinates, 0, flatCoordinates.length, stride); + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.STROKE]); + this.endGeometry(lineStringGeometry, data); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.LineStringReplay.prototype.drawMultiLineStringGeometry = + function(multiLineStringGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var strokeStyle = state.strokeStyle; + var lineWidth = state.lineWidth; + if (!goog.isDef(strokeStyle) || !goog.isDef(lineWidth)) { + return; + } + ol.extent.extend(this.extent_, multiLineStringGeometry.getExtent()); + this.setStrokeStyle_(); + this.beginGeometry(multiLineStringGeometry); + this.hitDetectionInstructions.push( + [ol.render.canvas.Instruction.SET_STROKE_STYLE, + state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, + state.miterLimit, state.lineDash], + [ol.render.canvas.Instruction.BEGIN_PATH]); + var ends = multiLineStringGeometry.getEnds(); + var flatCoordinates = multiLineStringGeometry.getFlatCoordinates(); + var stride = multiLineStringGeometry.getStride(); + var offset = 0; + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + offset = this.drawFlatCoordinates_( + flatCoordinates, offset, ends[i], stride); + } + this.hitDetectionInstructions.push([ol.render.canvas.Instruction.STROKE]); + this.endGeometry(multiLineStringGeometry, data); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.LineStringReplay.prototype.finish = function() { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + if (state.lastStroke != this.coordinates.length) { + this.instructions.push([ol.render.canvas.Instruction.STROKE]); + } + this.reverseHitDetectionInstructions_(); + this.state_ = null; +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.LineStringReplay.prototype.setFillStrokeStyle = + function(fillStyle, strokeStyle) { + goog.asserts.assert(!goog.isNull(this.state_)); + goog.asserts.assert(goog.isNull(fillStyle)); + goog.asserts.assert(!goog.isNull(strokeStyle)); + var strokeStyleColor = strokeStyle.getColor(); + this.state_.strokeStyle = ol.color.asString(!goog.isNull(strokeStyleColor) ? + strokeStyleColor : ol.render.canvas.defaultStrokeStyle); + var strokeStyleLineCap = strokeStyle.getLineCap(); + this.state_.lineCap = goog.isDef(strokeStyleLineCap) ? + strokeStyleLineCap : ol.render.canvas.defaultLineCap; + var strokeStyleLineDash = strokeStyle.getLineDash(); + this.state_.lineDash = !goog.isNull(strokeStyleLineDash) ? + strokeStyleLineDash : ol.render.canvas.defaultLineDash; + var strokeStyleLineJoin = strokeStyle.getLineJoin(); + this.state_.lineJoin = goog.isDef(strokeStyleLineJoin) ? + strokeStyleLineJoin : ol.render.canvas.defaultLineJoin; + var strokeStyleWidth = strokeStyle.getWidth(); + this.state_.lineWidth = goog.isDef(strokeStyleWidth) ? + strokeStyleWidth : ol.render.canvas.defaultLineWidth; + var strokeStyleMiterLimit = strokeStyle.getMiterLimit(); + this.state_.miterLimit = goog.isDef(strokeStyleMiterLimit) ? + strokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit; +}; + + + +/** + * @constructor + * @extends {ol.render.canvas.Replay} + * @param {number} tolerance Tolerance. + * @param {ol.Extent} maxExtent Maximum extent. + * @protected + * @struct + */ +ol.render.canvas.PolygonReplay = function(tolerance, maxExtent) { + + goog.base(this, tolerance, maxExtent); + + /** + * @private + * @type {{currentFillStyle: (string|undefined), + * currentStrokeStyle: (string|undefined), + * currentLineCap: (string|undefined), + * currentLineDash: Array., + * currentLineJoin: (string|undefined), + * currentLineWidth: (number|undefined), + * currentMiterLimit: (number|undefined), + * fillStyle: (string|undefined), + * strokeStyle: (string|undefined), + * lineCap: (string|undefined), + * lineDash: Array., + * lineJoin: (string|undefined), + * lineWidth: (number|undefined), + * miterLimit: (number|undefined)}|null} + */ + this.state_ = { + currentFillStyle: undefined, + currentStrokeStyle: undefined, + currentLineCap: undefined, + currentLineDash: null, + currentLineJoin: undefined, + currentLineWidth: undefined, + currentMiterLimit: undefined, + fillStyle: undefined, + strokeStyle: undefined, + lineCap: undefined, + lineDash: null, + lineJoin: undefined, + lineWidth: undefined, + miterLimit: undefined + }; + +}; +goog.inherits(ol.render.canvas.PolygonReplay, ol.render.canvas.Replay); + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @private + * @return {number} End. + */ +ol.render.canvas.PolygonReplay.prototype.drawFlatCoordinatess_ = + function(flatCoordinates, offset, ends, stride) { + var state = this.state_; + var beginPathInstruction = [ol.render.canvas.Instruction.BEGIN_PATH]; + this.instructions.push(beginPathInstruction); + this.hitDetectionInstructions.push(beginPathInstruction); + var i, ii; + for (i = 0, ii = ends.length; i < ii; ++i) { + var end = ends[i]; + var myBegin = this.coordinates.length; + var myEnd = this.appendFlatCoordinates( + flatCoordinates, offset, end, stride, true); + var moveToLineToInstruction = + [ol.render.canvas.Instruction.MOVE_TO_LINE_TO, myBegin, myEnd]; + var closePathInstruction = [ol.render.canvas.Instruction.CLOSE_PATH]; + this.instructions.push(moveToLineToInstruction, closePathInstruction); + this.hitDetectionInstructions.push(moveToLineToInstruction, + closePathInstruction); + offset = end; + } + // FIXME is it quicker to fill and stroke each polygon individually, + // FIXME or all polygons together? + var fillInstruction = [ol.render.canvas.Instruction.FILL]; + this.hitDetectionInstructions.push(fillInstruction); + if (goog.isDef(state.fillStyle)) { + this.instructions.push(fillInstruction); + } + if (goog.isDef(state.strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)); + var strokeInstruction = [ol.render.canvas.Instruction.STROKE]; + this.instructions.push(strokeInstruction); + this.hitDetectionInstructions.push(strokeInstruction); + } + return offset; +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.PolygonReplay.prototype.drawCircleGeometry = + function(circleGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var fillStyle = state.fillStyle; + var strokeStyle = state.strokeStyle; + if (!goog.isDef(fillStyle) && !goog.isDef(strokeStyle)) { + return; + } + if (goog.isDef(strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)); + } + ol.extent.extend(this.extent_, circleGeometry.getExtent()); + this.setFillStrokeStyles_(); + this.beginGeometry(circleGeometry); + // always fill the circle for hit detection + this.hitDetectionInstructions.push( + [ol.render.canvas.Instruction.SET_FILL_STYLE, + ol.color.asString(ol.render.canvas.defaultFillStyle)]); + if (goog.isDef(state.strokeStyle)) { + this.hitDetectionInstructions.push( + [ol.render.canvas.Instruction.SET_STROKE_STYLE, + state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, + state.miterLimit, state.lineDash]); + } + var flatCoordinates = circleGeometry.getFlatCoordinates(); + var stride = circleGeometry.getStride(); + this.appendFlatCoordinates( + flatCoordinates, 0, flatCoordinates.length, stride, false); + var beginPathInstruction = [ol.render.canvas.Instruction.BEGIN_PATH]; + var circleInstruction = [ol.render.canvas.Instruction.CIRCLE]; + this.instructions.push(beginPathInstruction, circleInstruction); + this.hitDetectionInstructions.push(beginPathInstruction, circleInstruction); + this.endGeometry(circleGeometry, data); + var fillInstruction = [ol.render.canvas.Instruction.FILL]; + this.hitDetectionInstructions.push(fillInstruction); + if (goog.isDef(state.fillStyle)) { + this.instructions.push(fillInstruction); + } + if (goog.isDef(state.strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)); + var strokeInstruction = [ol.render.canvas.Instruction.STROKE]; + this.instructions.push(strokeInstruction); + this.hitDetectionInstructions.push(strokeInstruction); + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.PolygonReplay.prototype.drawPolygonGeometry = + function(polygonGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var fillStyle = state.fillStyle; + var strokeStyle = state.strokeStyle; + if (!goog.isDef(fillStyle) && !goog.isDef(strokeStyle)) { + return; + } + if (goog.isDef(strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)); + } + ol.extent.extend(this.extent_, polygonGeometry.getExtent()); + this.setFillStrokeStyles_(); + this.beginGeometry(polygonGeometry); + // always fill the polygon for hit detection + this.hitDetectionInstructions.push( + [ol.render.canvas.Instruction.SET_FILL_STYLE, + ol.color.asString(ol.render.canvas.defaultFillStyle)]); + if (goog.isDef(state.strokeStyle)) { + this.hitDetectionInstructions.push( + [ol.render.canvas.Instruction.SET_STROKE_STYLE, + state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, + state.miterLimit, state.lineDash]); + } + var ends = polygonGeometry.getEnds(); + var flatCoordinates = polygonGeometry.getOrientedFlatCoordinates(); + var stride = polygonGeometry.getStride(); + this.drawFlatCoordinatess_(flatCoordinates, 0, ends, stride); + this.endGeometry(polygonGeometry, data); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.PolygonReplay.prototype.drawMultiPolygonGeometry = + function(multiPolygonGeometry, data) { + var state = this.state_; + goog.asserts.assert(!goog.isNull(state)); + var fillStyle = state.fillStyle; + var strokeStyle = state.strokeStyle; + if (!goog.isDef(fillStyle) && !goog.isDef(strokeStyle)) { + return; + } + if (goog.isDef(strokeStyle)) { + goog.asserts.assert(goog.isDef(state.lineWidth)); + } + ol.extent.extend(this.extent_, multiPolygonGeometry.getExtent()); + this.setFillStrokeStyles_(); + this.beginGeometry(multiPolygonGeometry); + // always fill the multi-polygon for hit detection + this.hitDetectionInstructions.push( + [ol.render.canvas.Instruction.SET_FILL_STYLE, + ol.color.asString(ol.render.canvas.defaultFillStyle)]); + if (goog.isDef(state.strokeStyle)) { + this.hitDetectionInstructions.push( + [ol.render.canvas.Instruction.SET_STROKE_STYLE, + state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, + state.miterLimit, state.lineDash]); + } + var endss = multiPolygonGeometry.getEndss(); + var flatCoordinates = multiPolygonGeometry.getOrientedFlatCoordinates(); + var stride = multiPolygonGeometry.getStride(); + var offset = 0; + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + offset = this.drawFlatCoordinatess_( + flatCoordinates, offset, endss[i], stride); + } + this.endGeometry(multiPolygonGeometry, data); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.PolygonReplay.prototype.finish = function() { + goog.asserts.assert(!goog.isNull(this.state_)); + this.reverseHitDetectionInstructions_(); + this.state_ = null; + // We want to preserve topology when drawing polygons. Polygons are + // simplified using quantization and point elimination. However, we might + // have received a mix of quantized and non-quantized geometries, so ensure + // that all are quantized by quantizing all coordinates in the batch. + var tolerance = this.tolerance; + if (tolerance !== 0) { + var coordinates = this.coordinates; + var i, ii; + for (i = 0, ii = coordinates.length; i < ii; ++i) { + coordinates[i] = ol.geom.simplify.snap(coordinates[i], tolerance); + } + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyle = + function(fillStyle, strokeStyle) { + goog.asserts.assert(!goog.isNull(this.state_)); + goog.asserts.assert(!goog.isNull(fillStyle) || !goog.isNull(strokeStyle)); + var state = this.state_; + if (!goog.isNull(fillStyle)) { + var fillStyleColor = fillStyle.getColor(); + state.fillStyle = ol.color.asString(!goog.isNull(fillStyleColor) ? + fillStyleColor : ol.render.canvas.defaultFillStyle); + } else { + state.fillStyle = undefined; + } + if (!goog.isNull(strokeStyle)) { + var strokeStyleColor = strokeStyle.getColor(); + state.strokeStyle = ol.color.asString(!goog.isNull(strokeStyleColor) ? + strokeStyleColor : ol.render.canvas.defaultStrokeStyle); + var strokeStyleLineCap = strokeStyle.getLineCap(); + state.lineCap = goog.isDef(strokeStyleLineCap) ? + strokeStyleLineCap : ol.render.canvas.defaultLineCap; + var strokeStyleLineDash = strokeStyle.getLineDash(); + state.lineDash = !goog.isNull(strokeStyleLineDash) ? + strokeStyleLineDash.slice() : ol.render.canvas.defaultLineDash; + var strokeStyleLineJoin = strokeStyle.getLineJoin(); + state.lineJoin = goog.isDef(strokeStyleLineJoin) ? + strokeStyleLineJoin : ol.render.canvas.defaultLineJoin; + var strokeStyleWidth = strokeStyle.getWidth(); + state.lineWidth = goog.isDef(strokeStyleWidth) ? + strokeStyleWidth : ol.render.canvas.defaultLineWidth; + var strokeStyleMiterLimit = strokeStyle.getMiterLimit(); + state.miterLimit = goog.isDef(strokeStyleMiterLimit) ? + strokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit; + } else { + state.strokeStyle = undefined; + state.lineCap = undefined; + state.lineDash = null; + state.lineJoin = undefined; + state.lineWidth = undefined; + state.miterLimit = undefined; + } +}; + + +/** + * @private + */ +ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyles_ = function() { + var state = this.state_; + var fillStyle = state.fillStyle; + var strokeStyle = state.strokeStyle; + var lineCap = state.lineCap; + var lineDash = state.lineDash; + var lineJoin = state.lineJoin; + var lineWidth = state.lineWidth; + var miterLimit = state.miterLimit; + if (goog.isDef(fillStyle) && state.currentFillStyle != fillStyle) { + this.instructions.push( + [ol.render.canvas.Instruction.SET_FILL_STYLE, fillStyle]); + state.currentFillStyle = state.fillStyle; + } + if (goog.isDef(strokeStyle)) { + goog.asserts.assert(goog.isDef(lineCap)); + goog.asserts.assert(!goog.isNull(lineDash)); + goog.asserts.assert(goog.isDef(lineJoin)); + goog.asserts.assert(goog.isDef(lineWidth)); + goog.asserts.assert(goog.isDef(miterLimit)); + if (state.currentStrokeStyle != strokeStyle || + state.currentLineCap != lineCap || + state.currentLineDash != lineDash || + state.currentLineJoin != lineJoin || + state.currentLineWidth != lineWidth || + state.currentMiterLimit != miterLimit) { + this.instructions.push( + [ol.render.canvas.Instruction.SET_STROKE_STYLE, + strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash]); + state.currentStrokeStyle = strokeStyle; + state.currentLineCap = lineCap; + state.currentLineDash = lineDash; + state.currentLineJoin = lineJoin; + state.currentLineWidth = lineWidth; + state.currentMiterLimit = miterLimit; + } + } +}; + + + +/** + * @constructor + * @extends {ol.render.canvas.Replay} + * @param {number} tolerance Tolerance. + * @param {ol.Extent} maxExtent Maximum extent. + * @protected + * @struct + */ +ol.render.canvas.TextReplay = function(tolerance, maxExtent) { + + goog.base(this, tolerance, maxExtent); + + /** + * @private + * @type {?ol.render.canvas.FillState} + */ + this.replayFillState_ = null; + + /** + * @private + * @type {?ol.render.canvas.StrokeState} + */ + this.replayStrokeState_ = null; + + /** + * @private + * @type {?ol.render.canvas.TextState} + */ + this.replayTextState_ = null; + + /** + * @private + * @type {string} + */ + this.text_ = ''; + + /** + * @private + * @type {number} + */ + this.textRotation_ = 0; + + /** + * @private + * @type {number} + */ + this.textScale_ = 0; + + /** + * @private + * @type {?ol.render.canvas.FillState} + */ + this.textFillState_ = null; + + /** + * @private + * @type {?ol.render.canvas.StrokeState} + */ + this.textStrokeState_ = null; + + /** + * @private + * @type {?ol.render.canvas.TextState} + */ + this.textState_ = null; + +}; +goog.inherits(ol.render.canvas.TextReplay, ol.render.canvas.Replay); + + +/** + * @inheritDoc + */ +ol.render.canvas.TextReplay.prototype.drawText = + function(flatCoordinates, offset, end, stride, geometry, data) { + if (this.text_ === '' || + goog.isNull(this.textState_) || + (goog.isNull(this.textFillState_) && + goog.isNull(this.textStrokeState_))) { + return; + } + ol.extent.extendFlatCoordinates( + this.extent_, flatCoordinates, offset, end, stride); + if (!goog.isNull(this.textFillState_)) { + this.setReplayFillState_(this.textFillState_); + } + if (!goog.isNull(this.textStrokeState_)) { + this.setReplayStrokeState_(this.textStrokeState_); + } + this.setReplayTextState_(this.textState_); + this.beginGeometry(geometry); + var myBegin = this.coordinates.length; + var myEnd = + this.appendFlatCoordinates(flatCoordinates, offset, end, stride, false); + var fill = !goog.isNull(this.textFillState_); + var stroke = !goog.isNull(this.textStrokeState_); + var drawTextInstruction = [ + ol.render.canvas.Instruction.DRAW_TEXT, myBegin, myEnd, this.text_, + this.textRotation_, this.textScale_, fill, stroke]; + this.instructions.push(drawTextInstruction); + this.hitDetectionInstructions.push(drawTextInstruction); + this.endGeometry(geometry, data); +}; + + +/** + * @param {ol.render.canvas.FillState} fillState Fill state. + * @private + */ +ol.render.canvas.TextReplay.prototype.setReplayFillState_ = + function(fillState) { + var replayFillState = this.replayFillState_; + if (!goog.isNull(replayFillState) && + replayFillState.fillStyle == fillState.fillStyle) { + return; + } + var setFillStyleInstruction = + [ol.render.canvas.Instruction.SET_FILL_STYLE, fillState.fillStyle]; + this.instructions.push(setFillStyleInstruction); + this.hitDetectionInstructions.push(setFillStyleInstruction); + if (goog.isNull(replayFillState)) { + this.replayFillState_ = { + fillStyle: fillState.fillStyle + }; + } else { + replayFillState.fillStyle = fillState.fillStyle; + } +}; + + +/** + * @param {ol.render.canvas.StrokeState} strokeState Stroke state. + * @private + */ +ol.render.canvas.TextReplay.prototype.setReplayStrokeState_ = + function(strokeState) { + var replayStrokeState = this.replayStrokeState_; + if (!goog.isNull(replayStrokeState) && + replayStrokeState.lineCap == strokeState.lineCap && + replayStrokeState.lineDash == strokeState.lineDash && + replayStrokeState.lineJoin == strokeState.lineJoin && + replayStrokeState.lineWidth == strokeState.lineWidth && + replayStrokeState.miterLimit == strokeState.miterLimit && + replayStrokeState.strokeStyle == strokeState.strokeStyle) { + return; + } + var setStrokeStyleInstruction = [ + ol.render.canvas.Instruction.SET_STROKE_STYLE, strokeState.strokeStyle, + strokeState.lineWidth, strokeState.lineCap, strokeState.lineJoin, + strokeState.miterLimit, strokeState.lineDash + ]; + this.instructions.push(setStrokeStyleInstruction); + this.hitDetectionInstructions.push(setStrokeStyleInstruction); + if (goog.isNull(replayStrokeState)) { + this.replayStrokeState_ = { + lineCap: strokeState.lineCap, + lineDash: strokeState.lineDash, + lineJoin: strokeState.lineJoin, + lineWidth: strokeState.lineWidth, + miterLimit: strokeState.miterLimit, + strokeStyle: strokeState.strokeStyle + }; + } else { + replayStrokeState.lineCap = strokeState.lineCap; + replayStrokeState.lineDash = strokeState.lineDash; + replayStrokeState.lineJoin = strokeState.lineJoin; + replayStrokeState.lineWidth = strokeState.lineWidth; + replayStrokeState.miterLimit = strokeState.miterLimit; + replayStrokeState.strokeStyle = strokeState.strokeStyle; + } +}; + + +/** + * @param {ol.render.canvas.TextState} textState Text state. + * @private + */ +ol.render.canvas.TextReplay.prototype.setReplayTextState_ = + function(textState) { + var replayTextState = this.replayTextState_; + if (!goog.isNull(replayTextState) && + replayTextState.font == textState.font && + replayTextState.textAlign == textState.textAlign && + replayTextState.textBaseline == textState.textBaseline) { + return; + } + var setTextStyleInstruction = [ol.render.canvas.Instruction.SET_TEXT_STYLE, + textState.font, textState.textAlign, textState.textBaseline]; + this.instructions.push(setTextStyleInstruction); + this.hitDetectionInstructions.push(setTextStyleInstruction); + if (goog.isNull(replayTextState)) { + this.replayTextState_ = { + font: textState.font, + textAlign: textState.textAlign, + textBaseline: textState.textBaseline + }; + } else { + replayTextState.font = textState.font; + replayTextState.textAlign = textState.textAlign; + replayTextState.textBaseline = textState.textBaseline; + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.TextReplay.prototype.setTextStyle = function(textStyle) { + if (goog.isNull(textStyle)) { + this.text_ = ''; + } else { + var textFillStyle = textStyle.getFill(); + if (goog.isNull(textFillStyle)) { + this.textFillState_ = null; + } else { + var textFillStyleColor = textFillStyle.getColor(); + var fillStyle = ol.color.asString(!goog.isNull(textFillStyleColor) ? + textFillStyleColor : ol.render.canvas.defaultFillStyle); + if (goog.isNull(this.textFillState_)) { + this.textFillState_ = { + fillStyle: fillStyle + }; + } else { + var textFillState = this.textFillState_; + textFillState.fillStyle = fillStyle; + } + } + var textStrokeStyle = textStyle.getStroke(); + if (goog.isNull(textStrokeStyle)) { + this.textStrokeState_ = null; + } else { + var textStrokeStyleColor = textStrokeStyle.getColor(); + var textStrokeStyleLineCap = textStrokeStyle.getLineCap(); + var textStrokeStyleLineDash = textStrokeStyle.getLineDash(); + var textStrokeStyleLineJoin = textStrokeStyle.getLineJoin(); + var textStrokeStyleWidth = textStrokeStyle.getWidth(); + var textStrokeStyleMiterLimit = textStrokeStyle.getMiterLimit(); + var lineCap = goog.isDef(textStrokeStyleLineCap) ? + textStrokeStyleLineCap : ol.render.canvas.defaultLineCap; + var lineDash = goog.isDefAndNotNull(textStrokeStyleLineDash) ? + textStrokeStyleLineDash.slice() : ol.render.canvas.defaultLineDash; + var lineJoin = goog.isDef(textStrokeStyleLineJoin) ? + textStrokeStyleLineJoin : ol.render.canvas.defaultLineJoin; + var lineWidth = goog.isDef(textStrokeStyleWidth) ? + textStrokeStyleWidth : ol.render.canvas.defaultLineWidth; + var miterLimit = goog.isDef(textStrokeStyleMiterLimit) ? + textStrokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit; + var strokeStyle = ol.color.asString(!goog.isNull(textStrokeStyleColor) ? + textStrokeStyleColor : ol.render.canvas.defaultStrokeStyle); + if (goog.isNull(this.textStrokeState_)) { + this.textStrokeState_ = { + lineCap: lineCap, + lineDash: lineDash, + lineJoin: lineJoin, + lineWidth: lineWidth, + miterLimit: miterLimit, + strokeStyle: strokeStyle + }; + } else { + var textStrokeState = this.textStrokeState_; + textStrokeState.lineCap = lineCap; + textStrokeState.lineDash = lineDash; + textStrokeState.lineJoin = lineJoin; + textStrokeState.lineWidth = lineWidth; + textStrokeState.miterLimit = miterLimit; + textStrokeState.strokeStyle = strokeStyle; + } + } + var textFont = textStyle.getFont(); + var textRotation = textStyle.getRotation(); + var textScale = textStyle.getScale(); + var textText = textStyle.getText(); + var textTextAlign = textStyle.getTextAlign(); + var textTextBaseline = textStyle.getTextBaseline(); + var font = goog.isDef(textFont) ? + textFont : ol.render.canvas.defaultFont; + var textAlign = goog.isDef(textTextAlign) ? + textTextAlign : ol.render.canvas.defaultTextAlign; + var textBaseline = goog.isDef(textTextBaseline) ? + textTextBaseline : ol.render.canvas.defaultTextBaseline; + if (goog.isNull(this.textState_)) { + this.textState_ = { + font: font, + textAlign: textAlign, + textBaseline: textBaseline + }; + } else { + var textState = this.textState_; + textState.font = font; + textState.textAlign = textAlign; + textState.textBaseline = textBaseline; + } + this.text_ = goog.isDef(textText) ? textText : ''; + this.textRotation_ = goog.isDef(textRotation) ? textRotation : 0; + this.textScale_ = goog.isDef(textScale) ? textScale : 1; + } +}; + + + +/** + * @constructor + * @implements {ol.render.IReplayGroup} + * @param {number} tolerance Tolerance. + * @param {ol.Extent} maxExtent Max extent. + * @struct + */ +ol.render.canvas.ReplayGroup = function(tolerance, maxExtent) { + + /** + * @private + * @type {number} + */ + this.tolerance_ = tolerance; + + /** + * @private + * @type {ol.Extent} + */ + this.maxExtent_ = maxExtent; + + /** + * @private + * @type {Object.>} + */ + this.replaysByZIndex_ = {}; + + /** + * @type {HTMLCanvasElement} + */ + var hitDetectionCanvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + hitDetectionCanvas.width = 1; + hitDetectionCanvas.height = 1; + + /** + * @private + * @type {CanvasRenderingContext2D} + */ + this.hitDetectionContext_ = /** @type {CanvasRenderingContext2D} */ + (hitDetectionCanvas.getContext('2d')); + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.hitDetectionTransform_ = goog.vec.Mat4.createNumber(); + +}; + + +/** + * @param {CanvasRenderingContext2D} context Context. + * @param {ol.Extent} extent Extent. + * @param {number} pixelRatio Pixel ratio. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {number} viewRotation View rotation. + * @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render + * geometry function. + * @return {T|undefined} Callback result. + * @template T + */ +ol.render.canvas.ReplayGroup.prototype.replay = function(context, extent, + pixelRatio, transform, viewRotation, renderGeometryFunction) { + /** @type {Array.} */ + var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); + goog.array.sort(zs); + return this.replay_(zs, context, extent, pixelRatio, transform, + viewRotation, renderGeometryFunction); +}; + + +/** + * @private + * @param {Array.} zs Z-indices array. + * @param {CanvasRenderingContext2D} context Context. + * @param {ol.Extent} extent Extent. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {number} viewRotation View rotation. + * @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render + * geometry function. + * @param {function(ol.geom.Geometry, Object): T} geometryCallback Geometry + * callback. + * @return {T|undefined} Callback result. + * @template T + */ +ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function( + zs, context, extent, transform, viewRotation, renderGeometryFunction, + geometryCallback) { + var i, ii, replays, replayType, replay, result; + for (i = 0, ii = zs.length; i < ii; ++i) { + replays = this.replaysByZIndex_[zs[i].toString()]; + for (replayType in replays) { + replay = replays[replayType]; + if (ol.extent.intersects(extent, replay.getExtent())) { + result = replay.replayHitDetection(context, transform, viewRotation, + renderGeometryFunction, geometryCallback); + if (result) { + return result; + } + } + } + } + return undefined; +}; + + +/** + * @private + * @param {Array.} zs Z-indices array. + * @param {CanvasRenderingContext2D} context Context. + * @param {ol.Extent} extent Extent. + * @param {number} pixelRatio Pixel ratio. + * @param {goog.vec.Mat4.Number} transform Transform. + * @param {number} viewRotation View rotation. + * @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render + * geometry function. + * @return {T|undefined} Callback result. + * @template T + */ +ol.render.canvas.ReplayGroup.prototype.replay_ = function( + zs, context, extent, pixelRatio, transform, viewRotation, + renderGeometryFunction) { + + var maxExtent = this.maxExtent_; + var minX = maxExtent[0]; + var minY = maxExtent[1]; + var maxX = maxExtent[2]; + var maxY = maxExtent[3]; + var flatClipCoords = ol.geom.flat.transform2D( + [minX, minY, minX, maxY, maxX, maxY, maxX, minY], 2, transform); + context.save(); + context.beginPath(); + context.moveTo(flatClipCoords[0], flatClipCoords[1]); + context.lineTo(flatClipCoords[2], flatClipCoords[3]); + context.lineTo(flatClipCoords[4], flatClipCoords[5]); + context.lineTo(flatClipCoords[6], flatClipCoords[7]); + context.closePath(); + context.clip(); + + var i, ii, j, jj, replays, replayType, replay, result; + for (i = 0, ii = zs.length; i < ii; ++i) { + replays = this.replaysByZIndex_[zs[i].toString()]; + for (j = 0, jj = ol.render.REPLAY_ORDER.length; j < jj; ++j) { + replay = replays[ol.render.REPLAY_ORDER[j]]; + if (goog.isDef(replay) && + ol.extent.intersects(extent, replay.getExtent())) { + result = replay.replay(context, pixelRatio, transform, viewRotation, + renderGeometryFunction); + if (result) { + return result; + } + } + } + } + + context.restore(); + return undefined; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {number} rotation Rotation. + * @param {ol.Coordinate} coordinate Coordinate. + * @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render + * geometry function. + * @param {function(ol.geom.Geometry, Object): T} callback Geometry callback. + * @return {T|undefined} Callback result. + * @template T + */ +ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function( + extent, resolution, rotation, coordinate, + renderGeometryFunction, callback) { + + var transform = this.hitDetectionTransform_; + ol.vec.Mat4.makeTransform2D(transform, 0.5, 0.5, + 1 / resolution, -1 / resolution, -rotation, + -coordinate[0], -coordinate[1]); + + /** @type {Array.} */ + var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); + goog.array.sort(zs, function(a, b) { return b - a; }); + + var context = this.hitDetectionContext_; + context.clearRect(0, 0, 1, 1); + + return this.replayHitDetection_(zs, context, extent, transform, + rotation, renderGeometryFunction, + /** + * @param {ol.geom.Geometry} geometry Geometry. + * @param {Object} data Opaque data object. + * @return {?} Callback result. + */ + function(geometry, data) { + var imageData = context.getImageData(0, 0, 1, 1).data; + if (imageData[3] > 0) { + var result = callback(geometry, data); + if (result) { + return result; + } + context.clearRect(0, 0, 1, 1); + } + }); +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.ReplayGroup.prototype.finish = function() { + var zKey; + for (zKey in this.replaysByZIndex_) { + var replays = this.replaysByZIndex_[zKey]; + var replayKey; + for (replayKey in replays) { + replays[replayKey].finish(); + } + } +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.ReplayGroup.prototype.getReplay = + function(zIndex, replayType) { + var zIndexKey = goog.isDef(zIndex) ? zIndex.toString() : '0'; + var replays = this.replaysByZIndex_[zIndexKey]; + if (!goog.isDef(replays)) { + replays = {}; + this.replaysByZIndex_[zIndexKey] = replays; + } + var replay = replays[replayType]; + if (!goog.isDef(replay)) { + var Constructor = ol.render.canvas.BATCH_CONSTRUCTORS_[replayType]; + goog.asserts.assert(goog.isDef(Constructor)); + replay = new Constructor(this.tolerance_, this.maxExtent_); + replays[replayType] = replay; + } + return replay; +}; + + +/** + * @inheritDoc + */ +ol.render.canvas.ReplayGroup.prototype.isEmpty = function() { + return goog.object.isEmpty(this.replaysByZIndex_); +}; + + +/** + * @const + * @private + * @type {Object.} + */ +ol.render.canvas.BATCH_CONSTRUCTORS_ = { + 'Image': ol.render.canvas.ImageReplay, + 'LineString': ol.render.canvas.LineStringReplay, + 'Polygon': ol.render.canvas.PolygonReplay, + 'Text': ol.render.canvas.TextReplay +}; diff --git a/float-no-zero/ol/ol/render/ireplay.js b/float-no-zero/ol/ol/render/ireplay.js new file mode 100644 index 0000000000..3f4d7c122a --- /dev/null +++ b/float-no-zero/ol/ol/render/ireplay.js @@ -0,0 +1,58 @@ +goog.provide('ol.render.IReplayGroup'); + +goog.require('goog.functions'); +goog.require('ol.render.IVectorContext'); + + +/** + * @enum {string} + */ +ol.render.ReplayType = { + IMAGE: 'Image', + LINE_STRING: 'LineString', + POLYGON: 'Polygon', + TEXT: 'Text' +}; + + +/** + * @const + * @type {Array.} + */ +ol.render.REPLAY_ORDER = [ + ol.render.ReplayType.POLYGON, + ol.render.ReplayType.LINE_STRING, + ol.render.ReplayType.IMAGE, + ol.render.ReplayType.TEXT +]; + + + +/** + * @interface + */ +ol.render.IReplayGroup = function() { +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.render.IReplayGroup.prototype.finish = function() { +}; + + +/** + * @param {number|undefined} zIndex Z index. + * @param {ol.render.ReplayType} replayType Replay type. + * @return {ol.render.IVectorContext} Replay. + */ +ol.render.IReplayGroup.prototype.getReplay = function(zIndex, replayType) { +}; + + +/** + * @return {boolean} Is empty. + */ +ol.render.IReplayGroup.prototype.isEmpty = function() { +}; diff --git a/float-no-zero/ol/ol/render/ivectorcontext.js b/float-no-zero/ol/ol/render/ivectorcontext.js new file mode 100644 index 0000000000..4a39a9974c --- /dev/null +++ b/float-no-zero/ol/ol/render/ivectorcontext.js @@ -0,0 +1,152 @@ +// FIXME remove trailing "Geometry" in method names + +goog.provide('ol.render.IVectorContext'); + + + +/** + * @interface + * @todo stability experimental + */ +ol.render.IVectorContext = function() { +}; + + +/** + * @param {number} zIndex Z index. + * @param {function(ol.render.canvas.Immediate)} callback Callback. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawAsync = function(zIndex, callback) { +}; + + +/** + * @param {ol.geom.Circle} circleGeometry Circle geometry. + * @param {Object} data Opaque data object, + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawCircleGeometry = + function(circleGeometry, data) { +}; + + +/** + * @param {ol.Feature} feature Feature. + * @param {ol.style.Style} style Style. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawFeature = function(feature, style) { +}; + + +/** + * @param {ol.geom.GeometryCollection} geometryCollectionGeometry Geometry + * collection. + * @param {Object} data Opaque data object. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawGeometryCollectionGeometry = + function(geometryCollectionGeometry, data) { +}; + + +/** + * @param {ol.geom.Point} pointGeometry Point geometry. + * @param {Object} data Opaque data object. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawPointGeometry = + function(pointGeometry, data) { +}; + + +/** + * @param {ol.geom.LineString} lineStringGeometry Line string geometry. + * @param {Object} data Opaque data object. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawLineStringGeometry = + function(lineStringGeometry, data) { +}; + + +/** + * @param {ol.geom.MultiLineString} multiLineStringGeometry + * MultiLineString geometry. + * @param {Object} data Opaque data object. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawMultiLineStringGeometry = + function(multiLineStringGeometry, data) { +}; + + +/** + * @param {ol.geom.MultiPoint} multiPointGeometry MultiPoint geometry. + * @param {Object} data Opaque data object. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawMultiPointGeometry = + function(multiPointGeometry, data) { +}; + + +/** + * @param {ol.geom.MultiPolygon} multiPolygonGeometry MultiPolygon geometry. + * @param {Object} data Opaque data object. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawMultiPolygonGeometry = + function(multiPolygonGeometry, data) { +}; + + +/** + * @param {ol.geom.Polygon} polygonGeometry Polygon geometry. + * @param {Object} data Opaque data object. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawPolygonGeometry = + function(polygonGeometry, data) { +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {Object} data Opaque data object. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.drawText = + function(flatCoordinates, offset, end, stride, geometry, data) { +}; + + +/** + * @param {ol.style.Fill} fillStyle Fill style. + * @param {ol.style.Stroke} strokeStyle Stroke style. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.setFillStrokeStyle = + function(fillStyle, strokeStyle) { +}; + + +/** + * @param {ol.style.Image} imageStyle Image style. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.setImageStyle = function(imageStyle) { +}; + + +/** + * @param {ol.style.Text} textStyle Text style. + * @todo stability experimental + */ +ol.render.IVectorContext.prototype.setTextStyle = function(textStyle) { +}; diff --git a/float-no-zero/ol/ol/render/renderevent.js b/float-no-zero/ol/ol/render/renderevent.js new file mode 100644 index 0000000000..ec708db511 --- /dev/null +++ b/float-no-zero/ol/ol/render/renderevent.js @@ -0,0 +1,57 @@ +goog.provide('ol.render.Event'); +goog.provide('ol.render.EventType'); + +goog.require('goog.events.Event'); +goog.require('ol.render.IVectorContext'); + + +/** + * @enum {string} + */ +ol.render.EventType = { + POSTCOMPOSE: 'postcompose', + PRECOMPOSE: 'precompose', + RENDER: 'render' +}; + + + +/** + * @constructor + * @extends {goog.events.Event} + * @implements {oli.render.Event} + * @param {ol.render.EventType} type Type. + * @param {Object=} opt_target Target. + * @param {ol.render.IVectorContext=} opt_vectorContext Vector context. + * @param {ol.FrameState=} opt_frameState Frame state. + * @param {?CanvasRenderingContext2D=} opt_context Context. + * @param {?ol.webgl.Context=} opt_glContext WebGL Context. + */ +ol.render.Event = function( + type, opt_target, opt_vectorContext, opt_frameState, opt_context, + opt_glContext) { + + goog.base(this, type, opt_target); + + /** + * @type {ol.render.IVectorContext|undefined} + */ + this.vectorContext = opt_vectorContext; + + /** + * @type {ol.FrameState|undefined} + */ + this.frameState = opt_frameState; + + /** + * @type {CanvasRenderingContext2D|null|undefined} + */ + this.context = opt_context; + + /** + * @type {ol.webgl.Context|null|undefined} + */ + this.glContext = opt_glContext; + +}; +goog.inherits(ol.render.Event, goog.events.Event); diff --git a/float-no-zero/ol/ol/render/vector.js b/float-no-zero/ol/ol/render/vector.js new file mode 100644 index 0000000000..7010dbe714 --- /dev/null +++ b/float-no-zero/ol/ol/render/vector.js @@ -0,0 +1,317 @@ +goog.provide('ol.renderer.vector'); + +goog.require('goog.asserts'); +goog.require('ol.geom.Circle'); +goog.require('ol.geom.GeometryCollection'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.MultiPoint'); +goog.require('ol.geom.MultiPolygon'); +goog.require('ol.geom.Point'); +goog.require('ol.geom.Polygon'); +goog.require('ol.render.IReplayGroup'); +goog.require('ol.style.ImageState'); +goog.require('ol.style.Style'); + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {ol.style.Style} style Style. + * @param {Object} data Opaque data object. + * @private + */ +ol.renderer.vector.renderCircleGeometry_ = + function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.Circle); + var fillStyle = style.getFill(); + var strokeStyle = style.getStroke(); + if (!goog.isNull(fillStyle) || !goog.isNull(strokeStyle)) { + var polygonReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.POLYGON); + polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle); + polygonReplay.drawCircleGeometry(geometry, data); + } + var textStyle = style.getText(); + if (!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + textReplay.drawText(geometry.getCenter(), 0, 2, 2, geometry, data); + } +}; + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.Feature} feature Feature. + * @param {ol.style.Style} style Style. + * @param {number} squaredTolerance Squared tolerance. + * @param {Object} data Opaque data object. + * @param {function(this: T, goog.events.Event)} listener Listener function. + * @param {T} thisArg Value to use as `this` when executing `listener`. + * @return {boolean} `true` if style is loading. + * @template T + */ +ol.renderer.vector.renderFeature = function( + replayGroup, feature, style, squaredTolerance, data, listener, thisArg) { + var loading = false; + var imageStyle, imageState; + imageStyle = style.getImage(); + if (goog.isNull(imageStyle)) { + ol.renderer.vector.renderFeature_( + replayGroup, feature, style, squaredTolerance, data); + } else { + imageState = imageStyle.getImageState(); + if (imageState == ol.style.ImageState.LOADED || + imageState == ol.style.ImageState.ERROR) { + imageStyle.unlistenImageChange(listener, thisArg); + if (imageState == ol.style.ImageState.LOADED) { + ol.renderer.vector.renderFeature_( + replayGroup, feature, style, squaredTolerance, data); + } + } else { + if (imageState == ol.style.ImageState.IDLE) { + imageStyle.load(); + } + imageState = imageStyle.getImageState(); + goog.asserts.assert(imageState == ol.style.ImageState.LOADING); + imageStyle.listenImageChange(listener, thisArg); + loading = true; + } + } + return loading; +}; + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.Feature} feature Feature. + * @param {ol.style.Style} style Style. + * @param {number} squaredTolerance Squared tolerance. + * @param {Object} data Opaque data object. + * @private + */ +ol.renderer.vector.renderFeature_ = function( + replayGroup, feature, style, squaredTolerance, data) { + var geometry = feature.getGeometry(); + if (goog.isNull(geometry)) { + return; + } + var simplifiedGeometry = geometry.getSimplifiedGeometry(squaredTolerance); + var geometryRenderer = + ol.renderer.vector.GEOMETRY_RENDERERS_[simplifiedGeometry.getType()]; + goog.asserts.assert(goog.isDef(geometryRenderer)); + geometryRenderer(replayGroup, simplifiedGeometry, style, data); +}; + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {ol.style.Style} style Style. + * @param {Object} data Opaque data object. + * @private + */ +ol.renderer.vector.renderGeometryCollectionGeometry_ = + function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.GeometryCollection); + var geometries = geometry.getGeometriesArray(); + var i, ii; + for (i = 0, ii = geometries.length; i < ii; ++i) { + var geometryRenderer = + ol.renderer.vector.GEOMETRY_RENDERERS_[geometries[i].getType()]; + goog.asserts.assert(goog.isDef(geometryRenderer)); + geometryRenderer(replayGroup, geometries[i], style, data); + } +}; + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {ol.style.Style} style Style. + * @param {Object} data Opaque data object. + * @private + */ +ol.renderer.vector.renderLineStringGeometry_ = + function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.LineString); + var strokeStyle = style.getStroke(); + if (!goog.isNull(strokeStyle)) { + var lineStringReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.LINE_STRING); + lineStringReplay.setFillStrokeStyle(null, strokeStyle); + lineStringReplay.drawLineStringGeometry(geometry, data); + } + var textStyle = style.getText(); + if (!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + textReplay.drawText(geometry.getFlatMidpoint(), 0, 2, 2, geometry, data); + } +}; + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {ol.style.Style} style Style. + * @param {Object} data Opaque data object. + * @private + */ +ol.renderer.vector.renderMultiLineStringGeometry_ = + function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString); + var strokeStyle = style.getStroke(); + if (!goog.isNull(strokeStyle)) { + var lineStringReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.LINE_STRING); + lineStringReplay.setFillStrokeStyle(null, strokeStyle); + lineStringReplay.drawMultiLineStringGeometry(geometry, data); + } + var textStyle = style.getText(); + if (!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + var flatMidpointCoordinates = geometry.getFlatMidpoints(); + textReplay.drawText(flatMidpointCoordinates, 0, + flatMidpointCoordinates.length, 2, geometry, data); + } +}; + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {ol.style.Style} style Style. + * @param {Object} data Opaque data object. + * @private + */ +ol.renderer.vector.renderMultiPolygonGeometry_ = + function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon); + var fillStyle = style.getFill(); + var strokeStyle = style.getStroke(); + if (!goog.isNull(strokeStyle) || !goog.isNull(fillStyle)) { + var polygonReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.POLYGON); + polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle); + polygonReplay.drawMultiPolygonGeometry(geometry, data); + } + var textStyle = style.getText(); + if (!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + var flatInteriorPointCoordinates = geometry.getFlatInteriorPoints(); + textReplay.drawText(flatInteriorPointCoordinates, 0, + flatInteriorPointCoordinates.length, 2, geometry, data); + } +}; + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {ol.style.Style} style Style. + * @param {Object} data Opaque data object. + * @private + */ +ol.renderer.vector.renderPointGeometry_ = + function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.Point); + var imageStyle = style.getImage(); + if (!goog.isNull(imageStyle)) { + var imageReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.IMAGE); + imageReplay.setImageStyle(imageStyle); + imageReplay.drawPointGeometry(geometry, data); + } + var textStyle = style.getText(); + if (!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + textReplay.drawText(geometry.getCoordinates(), 0, 2, 2, geometry, data); + } +}; + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {ol.style.Style} style Style. + * @param {Object} data Opaque data object. + * @private + */ +ol.renderer.vector.renderMultiPointGeometry_ = + function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.MultiPoint); + var imageStyle = style.getImage(); + if (!goog.isNull(imageStyle)) { + var imageReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.IMAGE); + imageReplay.setImageStyle(imageStyle); + imageReplay.drawMultiPointGeometry(geometry, data); + } + var textStyle = style.getText(); + if (!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + var flatCoordinates = geometry.getFlatCoordinates(); + textReplay.drawText(flatCoordinates, 0, flatCoordinates.length, + geometry.getStride(), geometry, data); + } +}; + + +/** + * @param {ol.render.IReplayGroup} replayGroup Replay group. + * @param {ol.geom.Geometry} geometry Geometry. + * @param {ol.style.Style} style Style. + * @param {Object} data Opaque data object. + * @private + */ +ol.renderer.vector.renderPolygonGeometry_ = + function(replayGroup, geometry, style, data) { + goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); + var fillStyle = style.getFill(); + var strokeStyle = style.getStroke(); + if (!goog.isNull(fillStyle) || !goog.isNull(strokeStyle)) { + var polygonReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.POLYGON); + polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle); + polygonReplay.drawPolygonGeometry(geometry, data); + } + var textStyle = style.getText(); + if (!goog.isNull(textStyle)) { + var textReplay = replayGroup.getReplay( + style.getZIndex(), ol.render.ReplayType.TEXT); + textReplay.setTextStyle(textStyle); + textReplay.drawText( + geometry.getFlatInteriorPoint(), 0, 2, 2, geometry, data); + } +}; + + +/** + * @const + * @private + * @type {Object.} + */ +ol.renderer.vector.GEOMETRY_RENDERERS_ = { + 'Point': ol.renderer.vector.renderPointGeometry_, + 'LineString': ol.renderer.vector.renderLineStringGeometry_, + 'Polygon': ol.renderer.vector.renderPolygonGeometry_, + 'MultiPoint': ol.renderer.vector.renderMultiPointGeometry_, + 'MultiLineString': ol.renderer.vector.renderMultiLineStringGeometry_, + 'MultiPolygon': ol.renderer.vector.renderMultiPolygonGeometry_, + 'GeometryCollection': ol.renderer.vector.renderGeometryCollectionGeometry_, + 'Circle': ol.renderer.vector.renderCircleGeometry_ +}; diff --git a/float-no-zero/ol/ol/render/webgl/webglimmediate.js b/float-no-zero/ol/ol/render/webgl/webglimmediate.js new file mode 100644 index 0000000000..375b0c96cf --- /dev/null +++ b/float-no-zero/ol/ol/render/webgl/webglimmediate.js @@ -0,0 +1,121 @@ +goog.provide('ol.render.webgl.Immediate'); + + + +/** + * @constructor + * @implements {ol.render.IVectorContext} + * @param {ol.webgl.Context} context Context. + * @param {number} pixelRatio Pixel ratio. + * @struct + */ +ol.render.webgl.Immediate = function(context, pixelRatio) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawAsync = function(zIndex, callback) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawCircleGeometry = + function(circleGeometry, data) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawFeature = function(feature, style) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawGeometryCollectionGeometry = + function(geometryCollectionGeometry, data) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawPointGeometry = + function(pointGeometry, data) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawLineStringGeometry = + function(lineStringGeometry, data) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawMultiLineStringGeometry = + function(multiLineStringGeometry, data) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawMultiPointGeometry = + function(multiPointGeometry, data) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawMultiPolygonGeometry = + function(multiPolygonGeometry, data) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawPolygonGeometry = + function(polygonGeometry, data) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.drawText = + function(flatCoordinates, offset, end, stride, geometry, data) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.setFillStrokeStyle = + function(fillStyle, strokeStyle) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.setImageStyle = function(imageStyle) { +}; + + +/** + * @inheritDoc + */ +ol.render.webgl.Immediate.prototype.setTextStyle = function(textStyle) { +}; diff --git a/float-no-zero/ol/ol/renderer/canvas/canvasimagelayerrenderer.js b/float-no-zero/ol/ol/renderer/canvas/canvasimagelayerrenderer.js new file mode 100644 index 0000000000..a7cff40d4c --- /dev/null +++ b/float-no-zero/ol/ol/renderer/canvas/canvasimagelayerrenderer.js @@ -0,0 +1,136 @@ +goog.provide('ol.renderer.canvas.ImageLayer'); + +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.vec.Mat4'); +goog.require('ol.ImageBase'); +goog.require('ol.ImageState'); +goog.require('ol.ViewHint'); +goog.require('ol.layer.Image'); +goog.require('ol.renderer.Map'); +goog.require('ol.renderer.canvas.Layer'); +goog.require('ol.source.Image'); +goog.require('ol.vec.Mat4'); + + + +/** + * @constructor + * @extends {ol.renderer.canvas.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Image} imageLayer Single image layer. + */ +ol.renderer.canvas.ImageLayer = function(mapRenderer, imageLayer) { + + goog.base(this, mapRenderer, imageLayer); + + /** + * @private + * @type {?ol.ImageBase} + */ + this.image_ = null; + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.imageTransform_ = goog.vec.Mat4.createNumber(); + +}; +goog.inherits(ol.renderer.canvas.ImageLayer, ol.renderer.canvas.Layer); + + +/** + * @inheritDoc + */ +ol.renderer.canvas.ImageLayer.prototype.forEachFeatureAtPixel = + function(coordinate, frameState, callback, thisArg) { + var layer = this.getLayer(); + var source = layer.getSource(); + goog.asserts.assertInstanceof(source, ol.source.Image); + var extent = frameState.extent; + var resolution = frameState.view2DState.resolution; + var rotation = frameState.view2DState.rotation; + return source.forEachFeatureAtPixel(extent, resolution, rotation, coordinate, + /** + * @param {ol.Feature} feature Feature. + * @return {?} Callback result. + */ + function(feature) { + return callback.call(thisArg, feature, layer); + }); +}; + + +/** + * @inheritDoc + */ +ol.renderer.canvas.ImageLayer.prototype.getImage = function() { + return goog.isNull(this.image_) ? + null : this.image_.getImageElement(); +}; + + +/** + * @inheritDoc + */ +ol.renderer.canvas.ImageLayer.prototype.getImageTransform = function() { + return this.imageTransform_; +}; + + +/** + * @inheritDoc + */ +ol.renderer.canvas.ImageLayer.prototype.prepareFrame = + function(frameState, layerState) { + + var pixelRatio = frameState.pixelRatio; + var view2DState = frameState.view2DState; + var viewCenter = view2DState.center; + var viewResolution = view2DState.resolution; + var viewRotation = view2DState.rotation; + + var image; + var imageLayer = this.getLayer(); + goog.asserts.assertInstanceof(imageLayer, ol.layer.Image); + var imageSource = imageLayer.getSource(); + goog.asserts.assertInstanceof(imageSource, ol.source.Image); + + var hints = frameState.viewHints; + + if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) { + image = imageSource.getImage( + frameState.extent, viewResolution, pixelRatio, view2DState.projection); + if (!goog.isNull(image)) { + var imageState = image.getState(); + if (imageState == ol.ImageState.IDLE) { + goog.events.listenOnce(image, goog.events.EventType.CHANGE, + this.handleImageChange, false, this); + image.load(); + } else if (imageState == ol.ImageState.LOADED) { + this.image_ = image; + } + } + } + + if (!goog.isNull(this.image_)) { + image = this.image_; + var imageExtent = image.getExtent(); + var imageResolution = image.getResolution(); + var imagePixelRatio = image.getPixelRatio(); + var scale = pixelRatio * imageResolution / + (viewResolution * imagePixelRatio); + ol.vec.Mat4.makeTransform2D(this.imageTransform_, + pixelRatio * frameState.size[0] / 2, + pixelRatio * frameState.size[1] / 2, + scale, scale, + viewRotation, + imagePixelRatio * (imageExtent[0] - viewCenter[0]) / imageResolution, + imagePixelRatio * (viewCenter[1] - imageExtent[3]) / imageResolution); + this.updateAttributions(frameState.attributions, image.getAttributions()); + this.updateLogos(frameState, imageSource); + } + +}; diff --git a/float-no-zero/ol/ol/renderer/canvas/canvaslayerrenderer.js b/float-no-zero/ol/ol/renderer/canvas/canvaslayerrenderer.js new file mode 100644 index 0000000000..27f4b7d56f --- /dev/null +++ b/float-no-zero/ol/ol/renderer/canvas/canvaslayerrenderer.js @@ -0,0 +1,165 @@ +goog.provide('ol.renderer.canvas.Layer'); + +goog.require('goog.vec.Mat4'); +goog.require('ol.layer.Layer'); +goog.require('ol.render.Event'); +goog.require('ol.render.EventType'); +goog.require('ol.render.canvas.Immediate'); +goog.require('ol.renderer.Layer'); +goog.require('ol.vec.Mat4'); + + + +/** + * @constructor + * @extends {ol.renderer.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Layer} layer Layer. + */ +ol.renderer.canvas.Layer = function(mapRenderer, layer) { + + goog.base(this, mapRenderer, layer); + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.transform_ = goog.vec.Mat4.createNumber(); + +}; +goog.inherits(ol.renderer.canvas.Layer, ol.renderer.Layer); + + +/** + * @param {ol.FrameState} frameState Frame state. + * @param {ol.layer.LayerState} layerState Layer state. + * @param {CanvasRenderingContext2D} context Context. + */ +ol.renderer.canvas.Layer.prototype.composeFrame = + function(frameState, layerState, context) { + + this.dispatchPreComposeEvent(context, frameState); + + var image = this.getImage(); + if (!goog.isNull(image)) { + var imageTransform = this.getImageTransform(); + context.globalAlpha = layerState.opacity; + + // for performance reasons, context.setTransform is only used + // when the view is rotated. see http://jsperf.com/canvas-transform + if (frameState.view2DState.rotation === 0) { + var dx = goog.vec.Mat4.getElement(imageTransform, 0, 3); + var dy = goog.vec.Mat4.getElement(imageTransform, 1, 3); + var dw = image.width * goog.vec.Mat4.getElement(imageTransform, 0, 0); + var dh = image.height * goog.vec.Mat4.getElement(imageTransform, 1, 1); + context.drawImage(image, 0, 0, +image.width, +image.height, + Math.round(dx), Math.round(dy), Math.round(dw), Math.round(dh)); + } else { + context.setTransform( + goog.vec.Mat4.getElement(imageTransform, 0, 0), + goog.vec.Mat4.getElement(imageTransform, 1, 0), + goog.vec.Mat4.getElement(imageTransform, 0, 1), + goog.vec.Mat4.getElement(imageTransform, 1, 1), + goog.vec.Mat4.getElement(imageTransform, 0, 3), + goog.vec.Mat4.getElement(imageTransform, 1, 3)); + context.drawImage(image, 0, 0); + context.setTransform(1, 0, 0, 1, 0, 0); + } + } + + this.dispatchPostComposeEvent(context, frameState); + +}; + + +/** + * @param {ol.render.EventType} type Event type. + * @param {CanvasRenderingContext2D} context Context. + * @param {ol.FrameState} frameState Frame state. + * @param {goog.vec.Mat4.Number=} opt_transform Transform. + * @private + */ +ol.renderer.canvas.Layer.prototype.dispatchComposeEvent_ = + function(type, context, frameState, opt_transform) { + var layer = this.getLayer(); + if (layer.hasListener(type)) { + var transform = goog.isDef(opt_transform) ? + opt_transform : this.getTransform(frameState); + var render = new ol.render.canvas.Immediate( + context, frameState.pixelRatio, frameState.extent, transform, + frameState.view2DState.rotation); + var composeEvent = new ol.render.Event(type, layer, render, frameState, + context, null); + layer.dispatchEvent(composeEvent); + render.flush(); + } +}; + + +/** + * @param {CanvasRenderingContext2D} context Context. + * @param {ol.FrameState} frameState Frame state. + * @param {goog.vec.Mat4.Number=} opt_transform Transform. + * @protected + */ +ol.renderer.canvas.Layer.prototype.dispatchPostComposeEvent = + function(context, frameState, opt_transform) { + this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, context, + frameState, opt_transform); +}; + + +/** + * @param {CanvasRenderingContext2D} context Context. + * @param {ol.FrameState} frameState Frame state. + * @param {goog.vec.Mat4.Number=} opt_transform Transform. + * @protected + */ +ol.renderer.canvas.Layer.prototype.dispatchPreComposeEvent = + function(context, frameState, opt_transform) { + this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, context, + frameState, opt_transform); +}; + + +/** + * @param {CanvasRenderingContext2D} context Context. + * @param {ol.FrameState} frameState Frame state. + * @param {goog.vec.Mat4.Number=} opt_transform Transform. + * @protected + */ +ol.renderer.canvas.Layer.prototype.dispatchRenderEvent = + function(context, frameState, opt_transform) { + this.dispatchComposeEvent_(ol.render.EventType.RENDER, context, + frameState, opt_transform); +}; + + +/** + * @return {HTMLCanvasElement|HTMLVideoElement|Image} Canvas. + */ +ol.renderer.canvas.Layer.prototype.getImage = goog.abstractMethod; + + +/** + * @return {!goog.vec.Mat4.Number} Image transform. + */ +ol.renderer.canvas.Layer.prototype.getImageTransform = goog.abstractMethod; + + +/** + * @param {ol.FrameState} frameState Frame state. + * @protected + * @return {!goog.vec.Mat4.Number} Transform. + */ +ol.renderer.canvas.Layer.prototype.getTransform = function(frameState) { + var view2DState = frameState.view2DState; + var pixelRatio = frameState.pixelRatio; + return ol.vec.Mat4.makeTransform2D(this.transform_, + pixelRatio * frameState.size[0] / 2, + pixelRatio * frameState.size[1] / 2, + pixelRatio / view2DState.resolution, + -pixelRatio / view2DState.resolution, + -view2DState.rotation, + -view2DState.center[0], -view2DState.center[1]); +}; diff --git a/float-no-zero/ol/ol/renderer/canvas/canvasmaprenderer.js b/float-no-zero/ol/ol/renderer/canvas/canvasmaprenderer.js new file mode 100644 index 0000000000..793b692658 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/canvas/canvasmaprenderer.js @@ -0,0 +1,183 @@ +// FIXME offset panning + +goog.provide('ol.renderer.canvas.Map'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.style'); +goog.require('goog.vec.Mat4'); +goog.require('ol.css'); +goog.require('ol.layer.Image'); +goog.require('ol.layer.Tile'); +goog.require('ol.layer.Vector'); +goog.require('ol.render.Event'); +goog.require('ol.render.EventType'); +goog.require('ol.render.canvas.Immediate'); +goog.require('ol.renderer.Map'); +goog.require('ol.renderer.canvas.ImageLayer'); +goog.require('ol.renderer.canvas.Layer'); +goog.require('ol.renderer.canvas.TileLayer'); +goog.require('ol.renderer.canvas.VectorLayer'); +goog.require('ol.source.State'); +goog.require('ol.vec.Mat4'); + + + +/** + * @constructor + * @extends {ol.renderer.Map} + * @param {Element} container Container. + * @param {ol.Map} map Map. + */ +ol.renderer.canvas.Map = function(container, map) { + + goog.base(this, container, map); + + /** + * @private + * @type {HTMLCanvasElement} + */ + this.canvas_ = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + this.canvas_.style.width = '100%'; + this.canvas_.style.height = '100%'; + this.canvas_.className = ol.css.CLASS_UNSELECTABLE; + goog.dom.insertChildAt(container, this.canvas_, 0); + + /** + * @private + * @type {boolean} + */ + this.renderedVisible_ = true; + + /** + * @private + * @type {CanvasRenderingContext2D} + */ + this.context_ = /** @type {CanvasRenderingContext2D} */ + (this.canvas_.getContext('2d')); + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.transform_ = goog.vec.Mat4.createNumber(); + +}; +goog.inherits(ol.renderer.canvas.Map, ol.renderer.Map); + + +/** + * @inheritDoc + */ +ol.renderer.canvas.Map.prototype.createLayerRenderer = function(layer) { + if (ol.ENABLE_IMAGE && layer instanceof ol.layer.Image) { + return new ol.renderer.canvas.ImageLayer(this, layer); + } else if (ol.ENABLE_TILE && layer instanceof ol.layer.Tile) { + return new ol.renderer.canvas.TileLayer(this, layer); + } else if (ol.ENABLE_VECTOR && layer instanceof ol.layer.Vector) { + return new ol.renderer.canvas.VectorLayer(this, layer); + } else { + goog.asserts.fail(); + return null; + } +}; + + +/** + * @param {ol.render.EventType} type Event type. + * @param {ol.FrameState} frameState Frame state. + * @private + */ +ol.renderer.canvas.Map.prototype.dispatchComposeEvent_ = + function(type, frameState) { + var map = this.getMap(); + var context = this.context_; + if (map.hasListener(type)) { + var view2DState = frameState.view2DState; + var pixelRatio = frameState.pixelRatio; + ol.vec.Mat4.makeTransform2D(this.transform_, + this.canvas_.width / 2, + this.canvas_.height / 2, + pixelRatio / view2DState.resolution, + -pixelRatio / view2DState.resolution, + -view2DState.rotation, + -view2DState.center[0], -view2DState.center[1]); + var render = new ol.render.canvas.Immediate(context, pixelRatio, + frameState.extent, this.transform_, view2DState.rotation); + var composeEvent = new ol.render.Event(type, map, render, frameState, + context, null); + map.dispatchEvent(composeEvent); + render.flush(); + } +}; + + +/** + * @param {ol.layer.Layer} layer Layer. + * @return {ol.renderer.canvas.Layer} Canvas layer renderer. + */ +ol.renderer.canvas.Map.prototype.getCanvasLayerRenderer = function(layer) { + var layerRenderer = this.getLayerRenderer(layer); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.canvas.Layer); + return /** @type {ol.renderer.canvas.Layer} */ (layerRenderer); +}; + + +/** + * @inheritDoc + */ +ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) { + + if (goog.isNull(frameState)) { + if (this.renderedVisible_) { + goog.style.setElementShown(this.canvas_, false); + this.renderedVisible_ = false; + } + return; + } + + var context = this.context_; + var width = frameState.size[0] * frameState.pixelRatio; + var height = frameState.size[1] * frameState.pixelRatio; + if (this.canvas_.width != width || this.canvas_.height != height) { + this.canvas_.width = width; + this.canvas_.height = height; + } else { + context.clearRect(0, 0, this.canvas_.width, this.canvas_.height); + } + + this.calculateMatrices2D(frameState); + + this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, frameState); + + var layerStates = frameState.layerStates; + var layersArray = frameState.layersArray; + var viewResolution = frameState.view2DState.resolution; + var i, ii, layer, layerRenderer, layerState; + for (i = 0, ii = layersArray.length; i < ii; ++i) { + layer = layersArray[i]; + layerRenderer = this.getLayerRenderer(layer); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.canvas.Layer); + layerState = layerStates[goog.getUid(layer)]; + if (!layerState.visible || + layerState.sourceState != ol.source.State.READY || + viewResolution >= layerState.maxResolution || + viewResolution < layerState.minResolution) { + continue; + } + layerRenderer.prepareFrame(frameState, layerState); + layerRenderer.composeFrame(frameState, layerState, context); + } + + this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState); + + if (!this.renderedVisible_) { + goog.style.setElementShown(this.canvas_, true); + this.renderedVisible_ = true; + } + + this.scheduleRemoveUnusedLayerRenderers(frameState); + this.scheduleExpireIconCache(frameState); +}; diff --git a/float-no-zero/ol/ol/renderer/canvas/canvastilelayerrenderer.js b/float-no-zero/ol/ol/renderer/canvas/canvastilelayerrenderer.js new file mode 100644 index 0000000000..3f09c089be --- /dev/null +++ b/float-no-zero/ol/ol/renderer/canvas/canvastilelayerrenderer.js @@ -0,0 +1,401 @@ +// FIXME find correct globalCompositeOperation +// FIXME optimize :-) + +goog.provide('ol.renderer.canvas.TileLayer'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.object'); +goog.require('goog.vec.Mat4'); +goog.require('ol.Size'); +goog.require('ol.Tile'); +goog.require('ol.TileCoord'); +goog.require('ol.TileRange'); +goog.require('ol.TileState'); +goog.require('ol.extent'); +goog.require('ol.layer.Tile'); +goog.require('ol.renderer.Map'); +goog.require('ol.renderer.canvas.Layer'); +goog.require('ol.source.Tile'); +goog.require('ol.vec.Mat4'); + + + +/** + * @constructor + * @extends {ol.renderer.canvas.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Tile} tileLayer Tile layer. + */ +ol.renderer.canvas.TileLayer = function(mapRenderer, tileLayer) { + + goog.base(this, mapRenderer, tileLayer); + + /** + * @private + * @type {HTMLCanvasElement} + */ + this.canvas_ = null; + + /** + * @private + * @type {ol.Size} + */ + this.canvasSize_ = null; + + /** + * @private + * @type {CanvasRenderingContext2D} + */ + this.context_ = null; + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.imageTransform_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {number} + */ + this.renderedCanvasZ_ = NaN; + + /** + * @private + * @type {ol.TileRange} + */ + this.renderedCanvasTileRange_ = null; + + /** + * @private + * @type {Array.} + */ + this.renderedTiles_ = null; + +}; +goog.inherits(ol.renderer.canvas.TileLayer, ol.renderer.canvas.Layer); + + +/** + * @inheritDoc + */ +ol.renderer.canvas.TileLayer.prototype.getImage = function() { + return this.canvas_; +}; + + +/** + * @inheritDoc + */ +ol.renderer.canvas.TileLayer.prototype.getImageTransform = function() { + return this.imageTransform_; +}; + + +/** + * @inheritDoc + */ +ol.renderer.canvas.TileLayer.prototype.prepareFrame = + function(frameState, layerState) { + + // + // Warning! You're entering a dangerous zone! + // + // The canvas tile layer renderering is highly optimized, hence + // the complexity of this function. For best performance we try + // to minimize the number of pixels to update on the canvas. This + // includes: + // + // - Only drawing pixels that will be visible. + // - Not re-drawing pixels/tiles that are already correct. + // - Minimizing calls to clearRect. + // - Never shrink the canvas. Just make it bigger when necessary. + // Re-sizing the canvas also clears it, which further means + // re-creating it (expensive). + // + // The various steps performed by this functions: + // + // - Create a canvas element if none has been created yet. + // + // - Make the canvas bigger if it's too small. Note that we never shrink + // the canvas, we just make it bigger when necessary, when rotating for + // example. Note also that the canvas always contains a whole number + // of tiles. + // + // - Invalidate the canvas tile range (renderedCanvasTileRange_ = null) + // if (1) the canvas has been enlarged, or (2) the zoom level changes, + // or (3) the canvas tile range doesn't contain the required tile + // range. This canvas tile range invalidation thing is related to + // an optimization where we attempt to redraw as few pixels as + // possible on each prepareFrame call. + // + // - If the canvas tile range has been invalidated we reset + // renderedCanvasTileRange_ and reset the renderedTiles_ array. + // The renderedTiles_ array is the structure used to determine + // the canvas pixels that need not be redrawn from one prepareFrame + // call to another. It records while tile has been rendered at + // which position in the canvas. + // + // - We then determine the tiles to draw on the canvas. Tiles for + // the target resolution may not be loaded yet. In that case we + // use low-resolution/interim tiles if loaded already. And, if + // for a non-yet-loaded tile we haven't found a corresponding + // low-resolution tile we indicate that the pixels for that + // tile must be cleared on the canvas. Note: determining the + // interim tiles is based on tile extents instead of tile + // coords, this is to be able to handler irregular tile grids. + // + // - We're now ready to render. We start by calling clearRect + // for the tiles that aren't loaded yet and are not fully covered + // by a low-resolution tile (if they're loaded, we'll draw them; + // if they're fully covered by a low-resolution tile then there's + // no need to clear). We then render the tiles "back to front", + // i.e. starting with the low-resolution tiles. + // + // - After rendering some bookkeeping is performed (updateUsedTiles, + // etc.). manageTilePyramid is what enqueue tiles in the tile + // queue for loading. + // + // - The last step involves updating the image transform matrix, + // which will be used by the map renderer for the final + // composition and positioning. + // + + var pixelRatio = frameState.pixelRatio; + var view2DState = frameState.view2DState; + var projection = view2DState.projection; + + var tileLayer = this.getLayer(); + goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile); + var tileSource = tileLayer.getSource(); + goog.asserts.assertInstanceof(tileSource, ol.source.Tile); + var tileGrid = tileSource.getTileGridForProjection(projection); + var tileGutter = tileSource.getGutter(); + var z = tileGrid.getZForResolution(view2DState.resolution); + var tilePixelSize = + tileSource.getTilePixelSize(z, frameState.pixelRatio, projection); + var tilePixelRatio = tilePixelSize / tileGrid.getTileSize(z); + var tileResolution = tileGrid.getResolution(z); + var tilePixelResolution = tileResolution / tilePixelRatio; + var center = view2DState.center; + var extent; + if (tileResolution == view2DState.resolution) { + center = this.snapCenterToPixel(center, tileResolution, frameState.size); + extent = ol.extent.getForView2DAndSize( + center, tileResolution, view2DState.rotation, frameState.size); + } else { + extent = frameState.extent; + } + var tileRange = tileGrid.getTileRangeForExtentAndResolution( + extent, tileResolution); + + var canvasWidth = tilePixelSize * tileRange.getWidth(); + var canvasHeight = tilePixelSize * tileRange.getHeight(); + + var canvas, context; + if (goog.isNull(this.canvas_)) { + goog.asserts.assert(goog.isNull(this.canvasSize_)); + goog.asserts.assert(goog.isNull(this.context_)); + goog.asserts.assert(goog.isNull(this.renderedCanvasTileRange_)); + canvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas.width = canvasWidth; + canvas.height = canvasHeight; + context = /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d')); + this.canvas_ = canvas; + this.canvasSize_ = [canvasWidth, canvasHeight]; + this.context_ = context; + } else { + goog.asserts.assert(!goog.isNull(this.canvasSize_)); + goog.asserts.assert(!goog.isNull(this.context_)); + canvas = this.canvas_; + context = this.context_; + if (this.canvasSize_[0] < canvasWidth || + this.canvasSize_[1] < canvasHeight) { + // Canvas is too small, make it bigger + canvas.width = canvasWidth; + canvas.height = canvasHeight; + this.canvasSize_ = [canvasWidth, canvasHeight]; + this.renderedCanvasTileRange_ = null; + } else { + canvasWidth = this.canvasSize_[0]; + canvasHeight = this.canvasSize_[1]; + if (z != this.renderedCanvasZ_ || + !this.renderedCanvasTileRange_.containsTileRange(tileRange)) { + this.renderedCanvasTileRange_ = null; + } + } + } + + var canvasTileRange, canvasTileRangeWidth, minX, minY; + if (goog.isNull(this.renderedCanvasTileRange_)) { + canvasTileRangeWidth = canvasWidth / tilePixelSize; + var canvasTileRangeHeight = canvasHeight / tilePixelSize; + minX = tileRange.minX - + Math.floor((canvasTileRangeWidth - tileRange.getWidth()) / 2); + minY = tileRange.minY - + Math.floor((canvasTileRangeHeight - tileRange.getHeight()) / 2); + this.renderedCanvasZ_ = z; + this.renderedCanvasTileRange_ = new ol.TileRange( + minX, minX + canvasTileRangeWidth - 1, + minY, minY + canvasTileRangeHeight - 1); + this.renderedTiles_ = + new Array(canvasTileRangeWidth * canvasTileRangeHeight); + canvasTileRange = this.renderedCanvasTileRange_; + } else { + canvasTileRange = this.renderedCanvasTileRange_; + canvasTileRangeWidth = canvasTileRange.getWidth(); + } + + goog.asserts.assert(canvasTileRange.containsTileRange(tileRange)); + + /** + * @type {Object.>} + */ + var tilesToDrawByZ = {}; + tilesToDrawByZ[z] = {}; + /** @type {Array.} */ + var tilesToClear = []; + + var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { + return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED; + }, tileSource, pixelRatio, projection); + var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, + tilesToDrawByZ, getTileIfLoaded); + + var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError(); + if (!goog.isDef(useInterimTilesOnError)) { + useInterimTilesOnError = true; + } + + var tmpExtent = ol.extent.createEmpty(); + var tmpTileRange = new ol.TileRange(0, 0, 0, 0); + var childTileRange, fullyLoaded, tile, tileState, x, y; + for (x = tileRange.minX; x <= tileRange.maxX; ++x) { + for (y = tileRange.minY; y <= tileRange.maxY; ++y) { + + tile = tileSource.getTile(z, x, y, pixelRatio, projection); + tileState = tile.getState(); + if (tileState == ol.TileState.LOADED || + tileState == ol.TileState.EMPTY || + (tileState == ol.TileState.ERROR && !useInterimTilesOnError)) { + tilesToDrawByZ[z][tile.tileCoord.toString()] = tile; + continue; + } + + fullyLoaded = tileGrid.forEachTileCoordParentTileRange( + tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent); + if (!fullyLoaded) { + // FIXME we do not need to clear the tile if it is fully covered by its + // children + tilesToClear.push(tile); + childTileRange = tileGrid.getTileCoordChildTileRange( + tile.tileCoord, tmpTileRange, tmpExtent); + if (!goog.isNull(childTileRange)) { + findLoadedTiles(z + 1, childTileRange); + } + } + + } + } + + var i, ii; + for (i = 0, ii = tilesToClear.length; i < ii; ++i) { + tile = tilesToClear[i]; + x = tilePixelSize * (tile.tileCoord.x - canvasTileRange.minX); + y = tilePixelSize * (canvasTileRange.maxY - tile.tileCoord.y); + context.clearRect(x, y, tilePixelSize, tilePixelSize); + } + + /** @type {Array.} */ + var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number); + goog.array.sort(zs); + var opaque = tileSource.getOpaque(); + var origin = ol.extent.getTopLeft(tileGrid.getTileCoordExtent( + new ol.TileCoord(z, canvasTileRange.minX, canvasTileRange.maxY), + tmpExtent)); + var currentZ, index, scale, tileCoordKey, tileExtent, tilesToDraw; + var ix, iy, interimTileExtent, interimTileRange, maxX, maxY; + var height, width; + for (i = 0, ii = zs.length; i < ii; ++i) { + currentZ = zs[i]; + tilePixelSize = + tileSource.getTilePixelSize(currentZ, pixelRatio, projection); + tilesToDraw = tilesToDrawByZ[currentZ]; + if (currentZ == z) { + for (tileCoordKey in tilesToDraw) { + tile = tilesToDraw[tileCoordKey]; + index = + (tile.tileCoord.y - canvasTileRange.minY) * canvasTileRangeWidth + + (tile.tileCoord.x - canvasTileRange.minX); + if (this.renderedTiles_[index] != tile) { + x = tilePixelSize * (tile.tileCoord.x - canvasTileRange.minX); + y = tilePixelSize * (canvasTileRange.maxY - tile.tileCoord.y); + tileState = tile.getState(); + if (tileState == ol.TileState.EMPTY || + (tileState == ol.TileState.ERROR && !useInterimTilesOnError) || + !opaque) { + context.clearRect(x, y, tilePixelSize, tilePixelSize); + } + if (tileState == ol.TileState.LOADED) { + context.drawImage(tile.getImage(), + tileGutter, tileGutter, tilePixelSize, tilePixelSize, + x, y, tilePixelSize, tilePixelSize); + } + this.renderedTiles_[index] = tile; + } + } + } else { + scale = tileGrid.getResolution(currentZ) / tileResolution; + for (tileCoordKey in tilesToDraw) { + tile = tilesToDraw[tileCoordKey]; + tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent); + x = (tileExtent[0] - origin[0]) / tilePixelResolution; + y = (origin[1] - tileExtent[3]) / tilePixelResolution; + width = scale * tilePixelSize; + height = scale * tilePixelSize; + tileState = tile.getState(); + if (tileState == ol.TileState.EMPTY || !opaque) { + context.clearRect(x, y, width, height); + } + if (tileState == ol.TileState.LOADED) { + context.drawImage(tile.getImage(), + tileGutter, tileGutter, tilePixelSize, tilePixelSize, + x, y, width, height); + } + interimTileRange = + tileGrid.getTileRangeForExtentAndZ(tileExtent, z, tmpTileRange); + minX = Math.max(interimTileRange.minX, canvasTileRange.minX); + maxX = Math.min(interimTileRange.maxX, canvasTileRange.maxX); + minY = Math.max(interimTileRange.minY, canvasTileRange.minY); + maxY = Math.min(interimTileRange.maxY, canvasTileRange.maxY); + for (ix = minX; ix <= maxX; ++ix) { + for (iy = minY; iy <= maxY; ++iy) { + index = (iy - canvasTileRange.minY) * canvasTileRangeWidth + + (ix - canvasTileRange.minX); + this.renderedTiles_[index] = undefined; + } + } + } + } + } + + this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); + this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio, + projection, extent, z, tileLayer.getPreload()); + this.scheduleExpireCache(frameState, tileSource); + this.updateLogos(frameState, tileSource); + + ol.vec.Mat4.makeTransform2D(this.imageTransform_, + pixelRatio * frameState.size[0] / 2, + pixelRatio * frameState.size[1] / 2, + pixelRatio * tilePixelResolution / view2DState.resolution, + pixelRatio * tilePixelResolution / view2DState.resolution, + view2DState.rotation, + (origin[0] - center[0]) / tilePixelResolution, + (center[1] - origin[1]) / tilePixelResolution); + +}; diff --git a/float-no-zero/ol/ol/renderer/canvas/canvasvectorlayerrenderer.js b/float-no-zero/ol/ol/renderer/canvas/canvasvectorlayerrenderer.js new file mode 100644 index 0000000000..cf6715b075 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -0,0 +1,290 @@ +goog.provide('ol.renderer.canvas.VectorLayer'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.functions'); +goog.require('ol.ViewHint'); +goog.require('ol.extent'); +goog.require('ol.feature'); +goog.require('ol.layer.Vector'); +goog.require('ol.render.EventType'); +goog.require('ol.render.canvas.ReplayGroup'); +goog.require('ol.renderer.canvas.Layer'); +goog.require('ol.renderer.vector'); +goog.require('ol.source.Vector'); + + + +/** + * @constructor + * @extends {ol.renderer.canvas.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Vector} vectorLayer Vector layer. + */ +ol.renderer.canvas.VectorLayer = function(mapRenderer, vectorLayer) { + + goog.base(this, mapRenderer, vectorLayer); + + /** + * @private + * @type {boolean} + */ + this.dirty_ = false; + + /** + * @private + * @type {number} + */ + this.renderedRevision_ = -1; + + /** + * @private + * @type {number} + */ + this.renderedResolution_ = NaN; + + /** + * @private + * @type {ol.Extent} + */ + this.renderedExtent_ = ol.extent.createEmpty(); + + /** + * @private + * @type {ol.render.canvas.ReplayGroup} + */ + this.replayGroup_ = null; + + /** + * @type {HTMLCanvasElement} + */ + var canvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + + /** + * @private + * @type {CanvasRenderingContext2D} + */ + this.context_ = /** @type {CanvasRenderingContext2D} */ + (canvas.getContext('2d')); + +}; +goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer); + + +/** + * @inheritDoc + */ +ol.renderer.canvas.VectorLayer.prototype.composeFrame = + function(frameState, layerState, context) { + + var transform = this.getTransform(frameState); + + this.dispatchPreComposeEvent(context, frameState, transform); + + var replayGroup = this.replayGroup_; + if (!goog.isNull(replayGroup) && !replayGroup.isEmpty()) { + var layer = this.getLayer(); + var replayContext; + if (layer.hasListener(ol.render.EventType.RENDER)) { + // resize and clear + this.context_.canvas.width = context.canvas.width; + this.context_.canvas.height = context.canvas.height; + replayContext = this.context_; + } else { + replayContext = context; + } + var renderGeometryFunction = this.getRenderGeometryFunction_(); + goog.asserts.assert(goog.isFunction(renderGeometryFunction)); + replayContext.globalAlpha = layerState.opacity; + replayGroup.replay( + replayContext, frameState.extent, frameState.pixelRatio, transform, + frameState.view2DState.rotation, renderGeometryFunction); + + if (replayContext != context) { + this.dispatchRenderEvent(replayContext, frameState, transform); + context.drawImage(replayContext.canvas, 0, 0); + } + } + + this.dispatchPostComposeEvent(context, frameState, transform); + +}; + + +/** + * @inheritDoc + */ +ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtPixel = + function(coordinate, frameState, callback, thisArg) { + if (goog.isNull(this.replayGroup_)) { + return undefined; + } else { + var extent = frameState.extent; + var resolution = frameState.view2DState.resolution; + var rotation = frameState.view2DState.rotation; + var layer = this.getLayer(); + var renderGeometryFunction = this.getRenderGeometryFunction_(); + goog.asserts.assert(goog.isFunction(renderGeometryFunction)); + return this.replayGroup_.forEachGeometryAtPixel(extent, resolution, + rotation, coordinate, renderGeometryFunction, + /** + * @param {ol.geom.Geometry} geometry Geometry. + * @param {Object} data Data. + * @return {?} Callback result. + */ + function(geometry, data) { + var feature = /** @type {ol.Feature} */ (data); + goog.asserts.assert(goog.isDef(feature)); + return callback.call(thisArg, feature, layer); + }); + } +}; + + +/** + * @private + * @return {function(ol.geom.Geometry): boolean} Render geometry function. + */ +ol.renderer.canvas.VectorLayer.prototype.getRenderGeometryFunction_ = + function() { + var vectorLayer = this.getLayer(); + goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector); + var renderGeometryFunctions = vectorLayer.getRenderGeometryFunctions(); + if (!goog.isDef(renderGeometryFunctions)) { + return goog.functions.TRUE; + } + var renderGeometryFunctionsArray = renderGeometryFunctions.getArray(); + switch (renderGeometryFunctionsArray.length) { + case 0: + return goog.functions.TRUE; + case 1: + return renderGeometryFunctionsArray[0]; + default: + return ( + /** + * @param {ol.geom.Geometry} geometry Geometry. + * @return {boolean} Render geometry. + */ + function(geometry) { + var i, ii; + for (i = 0, ii = renderGeometryFunctionsArray.length; i < ii; ++i) { + if (!renderGeometryFunctionsArray[i](geometry)) { + return false; + } + } + return true; + }); + } +}; + + +/** + * Handle changes in image style state. + * @param {goog.events.Event} event Image style change event. + * @private + */ +ol.renderer.canvas.VectorLayer.prototype.handleImageChange_ = + function(event) { + this.renderIfReadyAndVisible(); +}; + + +/** + * @inheritDoc + */ +ol.renderer.canvas.VectorLayer.prototype.prepareFrame = + function(frameState, layerState) { + + var vectorLayer = this.getLayer(); + goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector); + var vectorSource = vectorLayer.getSource(); + goog.asserts.assertInstanceof(vectorSource, ol.source.Vector); + + this.updateAttributions( + frameState.attributions, vectorSource.getAttributions()); + this.updateLogos(frameState, vectorSource); + + if (!this.dirty_ && (frameState.viewHints[ol.ViewHint.ANIMATING] || + frameState.viewHints[ol.ViewHint.INTERACTING])) { + return; + } + + var frameStateExtent = frameState.extent; + var frameStateResolution = frameState.view2DState.resolution; + var pixelRatio = frameState.pixelRatio; + var vectorLayerRevision = vectorLayer.getRevision(); + + if (!this.dirty_ && + this.renderedResolution_ == frameStateResolution && + this.renderedRevision_ == vectorLayerRevision && + ol.extent.containsExtent(this.renderedExtent_, frameStateExtent)) { + return; + } + + var extent = this.renderedExtent_; + var xBuffer = ol.extent.getWidth(frameStateExtent) / 4; + var yBuffer = ol.extent.getHeight(frameStateExtent) / 4; + extent[0] = frameStateExtent[0] - xBuffer; + extent[1] = frameStateExtent[1] - yBuffer; + extent[2] = frameStateExtent[2] + xBuffer; + extent[3] = frameStateExtent[3] + yBuffer; + + // FIXME dispose of old replayGroup in post render + goog.dispose(this.replayGroup_); + this.replayGroup_ = null; + + this.dirty_ = false; + + var styleFunction = vectorLayer.getStyleFunction(); + if (!goog.isDef(styleFunction)) { + styleFunction = ol.feature.defaultStyleFunction; + } + var tolerance = frameStateResolution / (2 * pixelRatio); + var replayGroup = new ol.render.canvas.ReplayGroup(tolerance, extent); + vectorSource.forEachFeatureInExtent(extent, + /** + * @param {ol.Feature} feature Feature. + */ + function(feature) { + var dirty = + this.renderFeature(feature, frameStateResolution, pixelRatio, + styleFunction, replayGroup); + this.dirty_ = this.dirty_ || dirty; + }, this); + replayGroup.finish(); + + this.renderedResolution_ = frameStateResolution; + this.renderedRevision_ = vectorLayerRevision; + this.replayGroup_ = replayGroup; + +}; + + +/** + * @param {ol.Feature} feature Feature. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.feature.StyleFunction} styleFunction Style function. + * @param {ol.render.canvas.ReplayGroup} replayGroup Replay group. + * @return {boolean} `true` if an image is loading. + */ +ol.renderer.canvas.VectorLayer.prototype.renderFeature = + function(feature, resolution, pixelRatio, styleFunction, replayGroup) { + var styles = styleFunction(feature, resolution); + if (!goog.isDefAndNotNull(styles)) { + return false; + } + // simplify to a tolerance of half a device pixel + var squaredTolerance = + resolution * resolution / (4 * pixelRatio * pixelRatio); + var i, ii, loading = false; + for (i = 0, ii = styles.length; i < ii; ++i) { + loading = ol.renderer.vector.renderFeature( + replayGroup, feature, styles[i], squaredTolerance, feature, + this.handleImageChange_, this) || loading; + } + return loading; +}; diff --git a/float-no-zero/ol/ol/renderer/dom/domimagelayerrenderer.js b/float-no-zero/ol/ol/renderer/dom/domimagelayerrenderer.js new file mode 100644 index 0000000000..5dd4bab463 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/dom/domimagelayerrenderer.js @@ -0,0 +1,143 @@ +goog.provide('ol.renderer.dom.ImageLayer'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.vec.Mat4'); +goog.require('ol.ImageBase'); +goog.require('ol.ImageState'); +goog.require('ol.ViewHint'); +goog.require('ol.dom'); +goog.require('ol.layer.Image'); +goog.require('ol.renderer.dom.Layer'); +goog.require('ol.source.Image'); +goog.require('ol.vec.Mat4'); + + + +/** + * @constructor + * @extends {ol.renderer.dom.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Image} imageLayer Image layer. + */ +ol.renderer.dom.ImageLayer = function(mapRenderer, imageLayer) { + var target = goog.dom.createElement(goog.dom.TagName.DIV); + target.style.position = 'absolute'; + + goog.base(this, mapRenderer, imageLayer, target); + + /** + * The last rendered image. + * @private + * @type {?ol.ImageBase} + */ + this.image_ = null; + + /** + * @private + * @type {goog.vec.Mat4.Number} + */ + this.transform_ = goog.vec.Mat4.createNumberIdentity(); + +}; +goog.inherits(ol.renderer.dom.ImageLayer, ol.renderer.dom.Layer); + + +/** + * @inheritDoc + */ +ol.renderer.dom.ImageLayer.prototype.forEachFeatureAtPixel = + function(coordinate, frameState, callback, thisArg) { + var layer = this.getLayer(); + var source = layer.getSource(); + goog.asserts.assertInstanceof(source, ol.source.Image); + var extent = frameState.extent; + var resolution = frameState.view2DState.resolution; + var rotation = frameState.view2DState.rotation; + return source.forEachFeatureAtPixel(extent, resolution, rotation, coordinate, + /** + * @param {ol.Feature} feature Feature. + * @return {?} Callback result. + */ + function(feature) { + return callback.call(thisArg, feature, layer); + }); +}; + + +/** + * @inheritDoc + */ +ol.renderer.dom.ImageLayer.prototype.prepareFrame = + function(frameState, layerState) { + + var view2DState = frameState.view2DState; + var viewCenter = view2DState.center; + var viewResolution = view2DState.resolution; + var viewRotation = view2DState.rotation; + + var image = this.image_; + var imageLayer = this.getLayer(); + goog.asserts.assertInstanceof(imageLayer, ol.layer.Image); + var imageSource = imageLayer.getSource(); + goog.asserts.assertInstanceof(imageSource, ol.source.Image); + + var hints = frameState.viewHints; + + if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) { + var image_ = imageSource.getImage(frameState.extent, viewResolution, + frameState.pixelRatio, view2DState.projection); + if (!goog.isNull(image_)) { + var imageState = image_.getState(); + if (imageState == ol.ImageState.IDLE) { + goog.events.listenOnce(image_, goog.events.EventType.CHANGE, + this.handleImageChange, false, this); + image_.load(); + } else if (imageState == ol.ImageState.LOADED) { + image = image_; + } + } + } + + if (!goog.isNull(image)) { + var imageExtent = image.getExtent(); + var imageResolution = image.getResolution(); + var transform = goog.vec.Mat4.createNumber(); + ol.vec.Mat4.makeTransform2D(transform, + frameState.size[0] / 2, frameState.size[1] / 2, + imageResolution / viewResolution, imageResolution / viewResolution, + viewRotation, + (imageExtent[0] - viewCenter[0]) / imageResolution, + (viewCenter[1] - imageExtent[3]) / imageResolution); + if (image != this.image_) { + var imageElement = image.getImageElement(this); + // Bootstrap sets the style max-width: 100% for all images, which breaks + // prevents the image from being displayed in FireFox. Workaround by + // overriding the max-width style. + imageElement.style.maxWidth = 'none'; + imageElement.style.position = 'absolute'; + goog.dom.removeChildren(this.target); + goog.dom.appendChild(this.target, imageElement); + this.image_ = image; + } + this.setTransform_(transform); + this.updateAttributions(frameState.attributions, image.getAttributions()); + this.updateLogos(frameState, imageSource); + } + +}; + + +/** + * @param {goog.vec.Mat4.Number} transform Transform. + * @private + */ +ol.renderer.dom.ImageLayer.prototype.setTransform_ = function(transform) { + if (!ol.vec.Mat4.equals2D(transform, this.transform_)) { + ol.dom.transformElement2D(this.target, transform, 6); + goog.vec.Mat4.setFromArray(this.transform_, transform); + } +}; diff --git a/float-no-zero/ol/ol/renderer/dom/domlayerrenderer.js b/float-no-zero/ol/ol/renderer/dom/domlayerrenderer.js new file mode 100644 index 0000000000..e42c6f3fc1 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/dom/domlayerrenderer.js @@ -0,0 +1,35 @@ +goog.provide('ol.renderer.dom.Layer'); + +goog.require('goog.dom'); +goog.require('ol.layer.Layer'); +goog.require('ol.renderer.Layer'); + + + +/** + * @constructor + * @extends {ol.renderer.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Layer} layer Layer. + * @param {!Element} target Target. + */ +ol.renderer.dom.Layer = function(mapRenderer, layer, target) { + + goog.base(this, mapRenderer, layer); + + /** + * @type {!Element} + * @protected + */ + this.target = target; + +}; +goog.inherits(ol.renderer.dom.Layer, ol.renderer.Layer); + + +/** + * @return {!Element} Target. + */ +ol.renderer.dom.Layer.prototype.getTarget = function() { + return this.target; +}; diff --git a/float-no-zero/ol/ol/renderer/dom/dommaprenderer.js b/float-no-zero/ol/ol/renderer/dom/dommaprenderer.js new file mode 100644 index 0000000000..0eaa8410bb --- /dev/null +++ b/float-no-zero/ol/ol/renderer/dom/dommaprenderer.js @@ -0,0 +1,153 @@ +goog.provide('ol.renderer.dom.Map'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.functions'); +goog.require('goog.style'); +goog.require('ol.css'); +goog.require('ol.layer.Image'); +goog.require('ol.layer.Tile'); +goog.require('ol.renderer.Map'); +goog.require('ol.renderer.dom.ImageLayer'); +goog.require('ol.renderer.dom.Layer'); +goog.require('ol.renderer.dom.TileLayer'); +goog.require('ol.source.State'); + + + +/** + * @constructor + * @extends {ol.renderer.Map} + * @param {Element} container Container. + * @param {ol.Map} map Map. + */ +ol.renderer.dom.Map = function(container, map) { + + goog.base(this, container, map); + + /** + * @type {!Element} + * @private + */ + this.layersPane_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.layersPane_.className = ol.css.CLASS_UNSELECTABLE; + var style = this.layersPane_.style; + style.position = 'absolute'; + style.width = '100%'; + style.height = '100%'; + + // in IE < 9, we need to return false from ondragstart to cancel the default + // behavior of dragging images, which is interfering with the custom handler + // in the Drag interaction subclasses + if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + this.layersPane_.ondragstart = goog.functions.FALSE; + this.layersPane_.onselectstart = goog.functions.FALSE; + } + + goog.dom.insertChildAt(container, this.layersPane_, 0); + + /** + * @private + * @type {boolean} + */ + this.renderedVisible_ = true; + +}; +goog.inherits(ol.renderer.dom.Map, ol.renderer.Map); + + +/** + * @inheritDoc + */ +ol.renderer.dom.Map.prototype.createLayerRenderer = function(layer) { + var layerRenderer; + if (ol.ENABLE_IMAGE && layer instanceof ol.layer.Image) { + layerRenderer = new ol.renderer.dom.ImageLayer(this, layer); + } else if (ol.ENABLE_TILE && layer instanceof ol.layer.Tile) { + layerRenderer = new ol.renderer.dom.TileLayer(this, layer); + } else { + goog.asserts.fail(); + return null; + } + return layerRenderer; +}; + + +/** + * @inheritDoc + */ +ol.renderer.dom.Map.prototype.renderFrame = function(frameState) { + + if (goog.isNull(frameState)) { + if (this.renderedVisible_) { + goog.style.setElementShown(this.layersPane_, false); + this.renderedVisible_ = false; + } + return; + } + + /** + * @this {ol.renderer.dom.Map} + * @param {Element} elem + * @param {number} i + */ + var addChild; + + // appendChild is actually more performant than insertBefore + // in IE 7 and 8. http://jsperf.com/reattaching-dom-nodes + if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + addChild = + /** + * @this {ol.renderer.dom.Map} + * @param {Element} elem + */ ( + function(elem) { + goog.dom.appendChild(this.layersPane_, elem); + }); + } else { + addChild = + /** + * @this {ol.renderer.dom.Map} + * @param {Element} elem + * @param {number} i + */ ( + function(elem, i) { + goog.dom.insertChildAt(this.layersPane_, elem, i); + }); + } + + var layerStates = frameState.layerStates; + var layersArray = frameState.layersArray; + var i, ii, layer, layerRenderer, layerState; + for (i = 0, ii = layersArray.length; i < ii; ++i) { + layer = layersArray[i]; + layerRenderer = /** @type {ol.renderer.dom.Layer} */ ( + this.getLayerRenderer(layer)); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.dom.Layer); + addChild.call(this, layerRenderer.getTarget(), i); + layerState = frameState.layerStates[goog.getUid(layer)]; + if (layerState.sourceState == ol.source.State.READY) { + layerRenderer.prepareFrame(frameState, layerState); + } + } + + var layerKey; + for (layerKey in this.getLayerRenderers()) { + if (!(layerKey in layerStates)) { + layerRenderer = this.getLayerRendererByKey(layerKey); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.dom.Layer); + goog.dom.removeNode(layerRenderer.getTarget()); + } + } + + if (!this.renderedVisible_) { + goog.style.setElementShown(this.layersPane_, true); + this.renderedVisible_ = true; + } + + this.calculateMatrices2D(frameState); + this.scheduleRemoveUnusedLayerRenderers(frameState); + this.scheduleExpireIconCache(frameState); + +}; diff --git a/float-no-zero/ol/ol/renderer/dom/domtilelayerrenderer.js b/float-no-zero/ol/ol/renderer/dom/domtilelayerrenderer.js new file mode 100644 index 0000000000..439fa0e145 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/dom/domtilelayerrenderer.js @@ -0,0 +1,463 @@ +// FIXME probably need to reset TileLayerZ if offsets get too large +// FIXME when zooming out, preserve higher Z divs to avoid white flash + +goog.provide('ol.renderer.dom.TileLayer'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.object'); +goog.require('goog.style'); +goog.require('goog.vec.Mat4'); +goog.require('ol.Coordinate'); +goog.require('ol.Tile'); +goog.require('ol.TileCoord'); +goog.require('ol.TileRange'); +goog.require('ol.TileState'); +goog.require('ol.ViewHint'); +goog.require('ol.dom'); +goog.require('ol.dom.BrowserFeature'); +goog.require('ol.extent'); +goog.require('ol.layer.Tile'); +goog.require('ol.renderer.dom.Layer'); +goog.require('ol.source.Tile'); +goog.require('ol.tilegrid.TileGrid'); +goog.require('ol.vec.Mat4'); + + + +/** + * @constructor + * @extends {ol.renderer.dom.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Tile} tileLayer Tile layer. + */ +ol.renderer.dom.TileLayer = function(mapRenderer, tileLayer) { + + var target = goog.dom.createElement(goog.dom.TagName.DIV); + target.style.position = 'absolute'; + + // Needed for IE7-8 to render a transformed element correctly + if (ol.dom.BrowserFeature.USE_MS_MATRIX_TRANSFORM) { + target.style.width = '100%'; + target.style.height = '100%'; + } + + goog.base(this, mapRenderer, tileLayer, target); + + /** + * @private + * @type {boolean} + */ + this.renderedVisible_ = true; + + /** + * @private + * @type {number} + */ + this.renderedOpacity_ = 1; + + /** + * @private + * @type {number} + */ + this.renderedRevision_ = 0; + + /** + * @private + * @type {Object.} + */ + this.tileLayerZs_ = {}; + +}; +goog.inherits(ol.renderer.dom.TileLayer, ol.renderer.dom.Layer); + + +/** + * @inheritDoc + */ +ol.renderer.dom.TileLayer.prototype.prepareFrame = + function(frameState, layerState) { + + if (!layerState.visible) { + if (this.renderedVisible_) { + goog.style.setElementShown(this.target, false); + this.renderedVisible_ = false; + } + return; + } + + var pixelRatio = frameState.pixelRatio; + var view2DState = frameState.view2DState; + var projection = view2DState.projection; + + var tileLayer = this.getLayer(); + goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile); + var tileSource = tileLayer.getSource(); + goog.asserts.assertInstanceof(tileSource, ol.source.Tile); + var tileGrid = tileSource.getTileGridForProjection(projection); + var tileGutter = tileSource.getGutter(); + var z = tileGrid.getZForResolution(view2DState.resolution); + var tileResolution = tileGrid.getResolution(z); + var center = view2DState.center; + var extent; + if (tileResolution == view2DState.resolution) { + center = this.snapCenterToPixel(center, tileResolution, frameState.size); + extent = ol.extent.getForView2DAndSize( + center, tileResolution, view2DState.rotation, frameState.size); + } else { + extent = frameState.extent; + } + var tileRange = tileGrid.getTileRangeForExtentAndResolution( + extent, tileResolution); + + /** @type {Object.>} */ + var tilesToDrawByZ = {}; + tilesToDrawByZ[z] = {}; + + var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { + return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED; + }, tileSource, pixelRatio, projection); + var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, + tilesToDrawByZ, getTileIfLoaded); + + var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError(); + if (!goog.isDef(useInterimTilesOnError)) { + useInterimTilesOnError = true; + } + + var tmpExtent = ol.extent.createEmpty(); + var tmpTileRange = new ol.TileRange(0, 0, 0, 0); + var childTileRange, fullyLoaded, tile, tileState, x, y; + for (x = tileRange.minX; x <= tileRange.maxX; ++x) { + for (y = tileRange.minY; y <= tileRange.maxY; ++y) { + + tile = tileSource.getTile(z, x, y, pixelRatio, projection); + tileState = tile.getState(); + if (tileState == ol.TileState.LOADED) { + tilesToDrawByZ[z][tile.tileCoord.toString()] = tile; + continue; + } else if (tileState == ol.TileState.EMPTY || + (tileState == ol.TileState.ERROR && + !useInterimTilesOnError)) { + continue; + } + + fullyLoaded = tileGrid.forEachTileCoordParentTileRange( + tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent); + if (!fullyLoaded) { + childTileRange = tileGrid.getTileCoordChildTileRange( + tile.tileCoord, tmpTileRange, tmpExtent); + if (!goog.isNull(childTileRange)) { + findLoadedTiles(z + 1, childTileRange); + } + } + + } + + } + + // If the tile source revision changes, we destroy the existing DOM structure + // so that a new one will be created. It would be more efficient to modify + // the existing structure. + var tileLayerZ, tileLayerZKey; + if (this.renderedRevision_ != tileSource.getRevision()) { + for (tileLayerZKey in this.tileLayerZs_) { + tileLayerZ = this.tileLayerZs_[+tileLayerZKey]; + goog.dom.removeNode(tileLayerZ.target); + } + this.tileLayerZs_ = {}; + this.renderedRevision_ = tileSource.getRevision(); + } + + /** @type {Array.} */ + var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number); + goog.array.sort(zs); + + /** @type {Object.} */ + var newTileLayerZKeys = {}; + + var iz, iziz, tileCoordKey, tileCoordOrigin, tilesToDraw; + for (iz = 0, iziz = zs.length; iz < iziz; ++iz) { + tileLayerZKey = zs[iz]; + if (tileLayerZKey in this.tileLayerZs_) { + tileLayerZ = this.tileLayerZs_[tileLayerZKey]; + } else { + tileCoordOrigin = + tileGrid.getTileCoordForCoordAndZ(center, tileLayerZKey); + tileLayerZ = new ol.renderer.dom.TileLayerZ_(tileGrid, tileCoordOrigin); + newTileLayerZKeys[tileLayerZKey] = true; + this.tileLayerZs_[tileLayerZKey] = tileLayerZ; + } + tilesToDraw = tilesToDrawByZ[tileLayerZKey]; + for (tileCoordKey in tilesToDraw) { + tileLayerZ.addTile(tilesToDraw[tileCoordKey], tileGutter); + } + tileLayerZ.finalizeAddTiles(); + } + + /** @type {Array.} */ + var tileLayerZKeys = + goog.array.map(goog.object.getKeys(this.tileLayerZs_), Number); + goog.array.sort(tileLayerZKeys); + + var i, ii, j, origin, resolution; + var transform = goog.vec.Mat4.createNumber(); + for (i = 0, ii = tileLayerZKeys.length; i < ii; ++i) { + tileLayerZKey = tileLayerZKeys[i]; + tileLayerZ = this.tileLayerZs_[tileLayerZKey]; + if (!(tileLayerZKey in tilesToDrawByZ)) { + goog.dom.removeNode(tileLayerZ.target); + delete this.tileLayerZs_[tileLayerZKey]; + continue; + } + resolution = tileLayerZ.getResolution(); + origin = tileLayerZ.getOrigin(); + ol.vec.Mat4.makeTransform2D(transform, + frameState.size[0] / 2, frameState.size[1] / 2, + resolution / view2DState.resolution, + resolution / view2DState.resolution, + view2DState.rotation, + (origin[0] - center[0]) / resolution, + (center[1] - origin[1]) / resolution); + tileLayerZ.setTransform(transform); + if (tileLayerZKey in newTileLayerZKeys) { + for (j = tileLayerZKey - 1; j >= 0; --j) { + if (j in this.tileLayerZs_) { + goog.dom.insertSiblingAfter( + tileLayerZ.target, this.tileLayerZs_[j].target); + break; + } + } + if (j < 0) { + goog.dom.insertChildAt(this.target, tileLayerZ.target, 0); + } + } else { + if (!frameState.viewHints[ol.ViewHint.ANIMATING] && + !frameState.viewHints[ol.ViewHint.INTERACTING]) { + tileLayerZ.removeTilesOutsideExtent(extent, tmpTileRange); + } + } + } + + if (layerState.opacity != this.renderedOpacity_) { + ol.dom.setOpacity(this.target, layerState.opacity); + this.renderedOpacity_ = layerState.opacity; + } + + if (layerState.visible && !this.renderedVisible_) { + goog.style.setElementShown(this.target, true); + this.renderedVisible_ = true; + } + + this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); + this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio, + projection, extent, z, tileLayer.getPreload()); + this.scheduleExpireCache(frameState, tileSource); + this.updateLogos(frameState, tileSource); + +}; + + + +/** + * @constructor + * @private + * @param {ol.tilegrid.TileGrid} tileGrid Tile grid. + * @param {ol.TileCoord} tileCoordOrigin Tile coord origin. + */ +ol.renderer.dom.TileLayerZ_ = function(tileGrid, tileCoordOrigin) { + + /** + * @type {!Element} + */ + this.target = goog.dom.createElement(goog.dom.TagName.DIV); + this.target.style.position = 'absolute'; + this.target.style.width = '100%'; + this.target.style.height = '100%'; + + if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + /** + * Needed due to issues with IE7-8 clipping of transformed elements + * Solution is to translate separately from the scaled/rotated elements + * @private + * @type {!Element} + */ + this.translateTarget_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.translateTarget_.style.position = 'absolute'; + this.translateTarget_.style.width = '100%'; + this.translateTarget_.style.height = '100%'; + + goog.dom.appendChild(this.target, this.translateTarget_); + } + + /** + * @private + * @type {ol.tilegrid.TileGrid} + */ + this.tileGrid_ = tileGrid; + + /** + * @private + * @type {ol.TileCoord} + */ + this.tileCoordOrigin_ = tileCoordOrigin; + + /** + * @private + * @type {ol.Coordinate} + */ + this.origin_ = + ol.extent.getTopLeft(tileGrid.getTileCoordExtent(tileCoordOrigin)); + + /** + * @private + * @type {number} + */ + this.resolution_ = tileGrid.getResolution(tileCoordOrigin.z); + + /** + * @private + * @type {Object.} + */ + this.tiles_ = {}; + + /** + * @private + * @type {DocumentFragment} + */ + this.documentFragment_ = null; + + /** + * @private + * @type {goog.vec.Mat4.Number} + */ + this.transform_ = goog.vec.Mat4.createNumberIdentity(); + +}; + + +/** + * @param {ol.Tile} tile Tile. + * @param {number} tileGutter Tile gutter. + */ +ol.renderer.dom.TileLayerZ_.prototype.addTile = function(tile, tileGutter) { + var tileCoord = tile.tileCoord; + goog.asserts.assert(tileCoord.z == this.tileCoordOrigin_.z); + var tileCoordKey = tileCoord.toString(); + if (tileCoordKey in this.tiles_) { + return; + } + var tileSize = this.tileGrid_.getTileSize(tileCoord.z); + var image = tile.getImage(this); + var imageStyle = image.style; + // Bootstrap sets the style max-width: 100% for all images, which + // prevents the tile from being displayed in FireFox. Workaround + // by overriding the max-width style. + imageStyle.maxWidth = 'none'; + var tileElement; + var tileElementStyle; + if (tileGutter > 0) { + tileElement = goog.dom.createElement(goog.dom.TagName.DIV); + tileElementStyle = tileElement.style; + tileElementStyle.overflow = 'hidden'; + tileElementStyle.width = tileSize + 'px'; + tileElementStyle.height = tileSize + 'px'; + imageStyle.position = 'absolute'; + imageStyle.left = -tileGutter + 'px'; + imageStyle.top = -tileGutter + 'px'; + imageStyle.width = (tileSize + 2 * tileGutter) + 'px'; + imageStyle.height = (tileSize + 2 * tileGutter) + 'px'; + goog.dom.appendChild(tileElement, image); + } else { + imageStyle.width = tileSize + 'px'; + imageStyle.height = tileSize + 'px'; + tileElement = image; + tileElementStyle = imageStyle; + } + tileElementStyle.position = 'absolute'; + tileElementStyle.left = + ((tileCoord.x - this.tileCoordOrigin_.x) * tileSize) + 'px'; + tileElementStyle.top = + ((this.tileCoordOrigin_.y - tileCoord.y) * tileSize) + 'px'; + if (goog.isNull(this.documentFragment_)) { + this.documentFragment_ = document.createDocumentFragment(); + } + goog.dom.appendChild(this.documentFragment_, tileElement); + this.tiles_[tileCoordKey] = tile; +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.renderer.dom.TileLayerZ_.prototype.finalizeAddTiles = function() { + if (!goog.isNull(this.documentFragment_)) { + if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + goog.dom.appendChild(this.translateTarget_, this.documentFragment_); + } else { + goog.dom.appendChild(this.target, this.documentFragment_); + } + this.documentFragment_ = null; + } +}; + + +/** + * @return {ol.Coordinate} Origin. + */ +ol.renderer.dom.TileLayerZ_.prototype.getOrigin = function() { + return this.origin_; +}; + + +/** + * @return {number} Resolution. + */ +ol.renderer.dom.TileLayerZ_.prototype.getResolution = function() { + return this.resolution_; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object. + */ +ol.renderer.dom.TileLayerZ_.prototype.removeTilesOutsideExtent = + function(extent, opt_tileRange) { + var tileRange = this.tileGrid_.getTileRangeForExtentAndZ( + extent, this.tileCoordOrigin_.z, opt_tileRange); + /** @type {Array.} */ + var tilesToRemove = []; + var tile, tileCoordKey; + for (tileCoordKey in this.tiles_) { + tile = this.tiles_[tileCoordKey]; + if (!tileRange.contains(tile.tileCoord)) { + tilesToRemove.push(tile); + } + } + var i, ii; + for (i = 0, ii = tilesToRemove.length; i < ii; ++i) { + tile = tilesToRemove[i]; + tileCoordKey = tile.tileCoord.toString(); + goog.dom.removeNode(tile.getImage(this)); + delete this.tiles_[tileCoordKey]; + } +}; + + +/** + * @param {goog.vec.Mat4.Number} transform Transform. + */ +ol.renderer.dom.TileLayerZ_.prototype.setTransform = function(transform) { + if (!ol.vec.Mat4.equals2D(transform, this.transform_)) { + if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) { + ol.dom.transformElement2D(this.target, transform, 6, + this.translateTarget_); + } else { + ol.dom.transformElement2D(this.target, transform, 6); + } + goog.vec.Mat4.setFromArray(this.transform_, transform); + } +}; diff --git a/float-no-zero/ol/ol/renderer/layerrenderer.js b/float-no-zero/ol/ol/renderer/layerrenderer.js new file mode 100644 index 0000000000..cdfcb001d2 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/layerrenderer.js @@ -0,0 +1,296 @@ +goog.provide('ol.renderer.Layer'); + +goog.require('goog.Disposable'); +goog.require('ol.FrameState'); +goog.require('ol.Image'); +goog.require('ol.ImageState'); +goog.require('ol.Tile'); +goog.require('ol.TileRange'); +goog.require('ol.TileState'); +goog.require('ol.layer.Layer'); +goog.require('ol.layer.LayerState'); +goog.require('ol.source.Source'); +goog.require('ol.source.State'); +goog.require('ol.source.Tile'); + + + +/** + * @constructor + * @extends {goog.Disposable} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Layer} layer Layer. + * @suppress {checkStructDictInheritance} + * @struct + */ +ol.renderer.Layer = function(mapRenderer, layer) { + + goog.base(this); + + /** + * @private + * @type {ol.renderer.Map} + */ + this.mapRenderer_ = mapRenderer; + + /** + * @private + * @type {ol.layer.Layer} + */ + this.layer_ = layer; + + +}; +goog.inherits(ol.renderer.Layer, goog.Disposable); + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @param {ol.FrameState} frameState Frame state. + * @param {function(this: S, ol.Feature, ol.layer.Layer): T} callback Feature + * callback. + * @param {S} thisArg Value to use as `this` when executing `callback`. + * @return {T|undefined} Callback result. + * @template S,T + */ +ol.renderer.Layer.prototype.forEachFeatureAtPixel = goog.nullFunction; + + +/** + * @protected + * @return {ol.layer.Layer} Layer. + */ +ol.renderer.Layer.prototype.getLayer = function() { + return this.layer_; +}; + + +/** + * @protected + * @return {ol.Map} Map. + */ +ol.renderer.Layer.prototype.getMap = function() { + return this.mapRenderer_.getMap(); +}; + + +/** + * @protected + * @return {ol.renderer.Map} Map renderer. + */ +ol.renderer.Layer.prototype.getMapRenderer = function() { + return this.mapRenderer_; +}; + + +/** + * Handle changes in image state. + * @param {goog.events.Event} event Image change event. + * @protected + */ +ol.renderer.Layer.prototype.handleImageChange = function(event) { + var image = /** @type {ol.Image} */ (event.target); + if (image.getState() === ol.ImageState.LOADED) { + this.renderIfReadyAndVisible(); + } +}; + + +/** + * @param {ol.FrameState} frameState Frame state. + * @param {ol.layer.LayerState} layerState Layer state. + */ +ol.renderer.Layer.prototype.prepareFrame = goog.abstractMethod; + + +/** + * @protected + */ +ol.renderer.Layer.prototype.renderIfReadyAndVisible = function() { + var layer = this.getLayer(); + if (layer.getVisible() && layer.getSourceState() == ol.source.State.READY) { + this.getMap().render(); + } +}; + + +/** + * @param {ol.FrameState} frameState Frame state. + * @param {ol.source.Tile} tileSource Tile source. + * @protected + */ +ol.renderer.Layer.prototype.scheduleExpireCache = + function(frameState, tileSource) { + if (tileSource.canExpireCache()) { + frameState.postRenderFunctions.push( + goog.partial( + /** + * @param {ol.source.Tile} tileSource Tile source. + * @param {ol.Map} map Map. + * @param {ol.FrameState} frameState Frame state. + */ + function(tileSource, map, frameState) { + var tileSourceKey = goog.getUid(tileSource).toString(); + tileSource.expireCache(frameState.usedTiles[tileSourceKey]); + }, tileSource)); + } +}; + + +/** + * @param {Object.} attributionsSet Attributions + * set (target). + * @param {Array.} attributions Attributions (source). + * @protected + */ +ol.renderer.Layer.prototype.updateAttributions = + function(attributionsSet, attributions) { + if (goog.isDefAndNotNull(attributions)) { + var attribution, i, ii; + for (i = 0, ii = attributions.length; i < ii; ++i) { + attribution = attributions[i]; + attributionsSet[goog.getUid(attribution).toString()] = attribution; + } + } +}; + + +/** + * @param {ol.FrameState} frameState Frame state. + * @param {ol.source.Source} source Source. + * @protected + */ +ol.renderer.Layer.prototype.updateLogos = function(frameState, source) { + var logo = source.getLogo(); + if (goog.isDef(logo)) { + frameState.logos[logo] = ''; + } +}; + + +/** + * @param {Object.>} usedTiles Used tiles. + * @param {ol.source.Tile} tileSource Tile source. + * @param {number} z Z. + * @param {ol.TileRange} tileRange Tile range. + * @protected + */ +ol.renderer.Layer.prototype.updateUsedTiles = + function(usedTiles, tileSource, z, tileRange) { + // FIXME should we use tilesToDrawByZ instead? + var tileSourceKey = goog.getUid(tileSource).toString(); + var zKey = z.toString(); + if (tileSourceKey in usedTiles) { + if (zKey in usedTiles[tileSourceKey]) { + usedTiles[tileSourceKey][zKey].extend(tileRange); + } else { + usedTiles[tileSourceKey][zKey] = tileRange; + } + } else { + usedTiles[tileSourceKey] = {}; + usedTiles[tileSourceKey][zKey] = tileRange; + } +}; + + +/** + * @param {function(ol.Tile): boolean} isLoadedFunction Function to + * determine if the tile is loaded. + * @param {ol.source.Tile} tileSource Tile source. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @protected + * @return {function(number, number, number): ol.Tile} Returns a tile if it is + * loaded. + */ +ol.renderer.Layer.prototype.createGetTileIfLoadedFunction = + function(isLoadedFunction, tileSource, pixelRatio, projection) { + return ( + /** + * @param {number} z Z. + * @param {number} x X. + * @param {number} y Y. + * @return {ol.Tile} Tile. + */ + function(z, x, y) { + var tile = tileSource.getTile(z, x, y, pixelRatio, projection); + return isLoadedFunction(tile) ? tile : null; + }); +}; + + +/** + * @param {ol.Coordinate} center Center. + * @param {number} resolution Resolution. + * @param {ol.Size} size Size. + * @protected + * @return {ol.Coordinate} Snapped center. + */ +ol.renderer.Layer.prototype.snapCenterToPixel = + function(center, resolution, size) { + return [ + resolution * (Math.round(center[0] / resolution) + (size[0] % 2) / 2), + resolution * (Math.round(center[1] / resolution) + (size[1] % 2) / 2) + ]; +}; + + +/** + * Manage tile pyramid. + * This function performs a number of functions related to the tiles at the + * current zoom and lower zoom levels: + * - registers idle tiles in frameState.wantedTiles so that they are not + * discarded by the tile queue + * - enqueues missing tiles + * @param {ol.FrameState} frameState Frame state. + * @param {ol.source.Tile} tileSource Tile source. + * @param {ol.tilegrid.TileGrid} tileGrid Tile grid. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @param {ol.Extent} extent Extent. + * @param {number} currentZ Current Z. + * @param {number|undefined} preload Load low resolution tiles up to 'preload' + * levels. + * @param {function(this: T, ol.Tile)=} opt_tileCallback Tile callback. + * @param {T=} opt_this Object to use as `this` in `opt_tileCallback`. + * @protected + * @template T + */ +ol.renderer.Layer.prototype.manageTilePyramid = function( + frameState, tileSource, tileGrid, pixelRatio, projection, extent, + currentZ, preload, opt_tileCallback, opt_this) { + var tileSourceKey = goog.getUid(tileSource).toString(); + if (!(tileSourceKey in frameState.wantedTiles)) { + frameState.wantedTiles[tileSourceKey] = {}; + } + var wantedTiles = frameState.wantedTiles[tileSourceKey]; + var tileQueue = frameState.tileQueue; + var minZoom = tileGrid.getMinZoom(); + var tile, tileRange, tileResolution, x, y, z; + if (!goog.isDef(preload)) { + preload = 0; + } + for (z = currentZ; z >= minZoom; --z) { + tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); + tileResolution = tileGrid.getResolution(z); + for (x = tileRange.minX; x <= tileRange.maxX; ++x) { + for (y = tileRange.minY; y <= tileRange.maxY; ++y) { + if (currentZ - z <= preload) { + tile = tileSource.getTile(z, x, y, pixelRatio, projection); + if (tile.getState() == ol.TileState.IDLE) { + wantedTiles[tile.tileCoord.toString()] = true; + if (!tileQueue.isKeyQueued(tile.getKey())) { + tileQueue.enqueue([tile, tileSourceKey, + tileGrid.getTileCoordCenter(tile.tileCoord), tileResolution]); + } + } + if (goog.isDef(opt_tileCallback)) { + opt_tileCallback.call(opt_this, tile); + } + } else { + tileSource.useTile(z, x, y); + } + } + } + } +}; diff --git a/float-no-zero/ol/ol/renderer/maprenderer.js b/float-no-zero/ol/ol/renderer/maprenderer.js new file mode 100644 index 0000000000..519ac52a65 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/maprenderer.js @@ -0,0 +1,229 @@ +goog.provide('ol.renderer.Map'); + +goog.require('goog.Disposable'); +goog.require('goog.asserts'); +goog.require('goog.dispose'); +goog.require('goog.object'); +goog.require('goog.vec.Mat4'); +goog.require('ol.FrameState'); +goog.require('ol.layer.Layer'); +goog.require('ol.renderer.Layer'); +goog.require('ol.style.IconImageCache'); +goog.require('ol.vec.Mat4'); + + + +/** + * @constructor + * @extends {goog.Disposable} + * @param {Element} container Container. + * @param {ol.Map} map Map. + * @suppress {checkStructDictInheritance} + * @struct + */ +ol.renderer.Map = function(container, map) { + + goog.base(this); + + /** + * @private + * @type {ol.Map} + */ + this.map_ = map; + + /** + * @private + * @type {Object.} + */ + this.layerRenderers_ = {}; + +}; +goog.inherits(ol.renderer.Map, goog.Disposable); + + +/** + * @param {ol.FrameState} frameState FrameState. + * @protected + */ +ol.renderer.Map.prototype.calculateMatrices2D = function(frameState) { + var view2DState = frameState.view2DState; + var coordinateToPixelMatrix = frameState.coordinateToPixelMatrix; + goog.asserts.assert(!goog.isNull(coordinateToPixelMatrix)); + ol.vec.Mat4.makeTransform2D(coordinateToPixelMatrix, + frameState.size[0] / 2, frameState.size[1] / 2, + 1 / view2DState.resolution, -1 / view2DState.resolution, + -view2DState.rotation, + -view2DState.center[0], -view2DState.center[1]); + var inverted = goog.vec.Mat4.invert( + coordinateToPixelMatrix, frameState.pixelToCoordinateMatrix); + goog.asserts.assert(inverted); +}; + + +/** + * @param {ol.layer.Layer} layer Layer. + * @protected + * @return {ol.renderer.Layer} layerRenderer Layer renderer. + */ +ol.renderer.Map.prototype.createLayerRenderer = function(layer) { + return new ol.renderer.Layer(this, layer); +}; + + +/** + * @inheritDoc + */ +ol.renderer.Map.prototype.disposeInternal = function() { + goog.object.forEach(this.layerRenderers_, function(layerRenderer) { + goog.dispose(layerRenderer); + }); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @param {ol.FrameState} frameState FrameState. + * @param {function(this: S, ol.Feature, ol.layer.Layer): T} callback Feature + * callback. + * @param {S} thisArg Value to use as `this` when executing `callback`. + * @param {function(this: U, ol.layer.Layer): boolean} layerFilter Layer filter + * function, only layers which are visible and for which this function + * returns `true` will be tested for features. By default, all visible + * layers will be tested. + * @param {U} thisArg2 Value to use as `this` when executing `layerFilter`. + * @return {T|undefined} Callback result. + * @template S,T,U + */ +ol.renderer.Map.prototype.forEachFeatureAtPixel = + function(coordinate, frameState, callback, thisArg, + layerFilter, thisArg2) { + var layersArray = this.map_.getLayerGroup().getLayersArray(); + var i; + for (i = layersArray.length - 1; i >= 0; --i) { + var layer = layersArray[i]; + if (layer.getVisible() && layerFilter.call(thisArg2, layer)) { + var layerRenderer = this.getLayerRenderer(layer); + var result = layerRenderer.forEachFeatureAtPixel( + coordinate, frameState, callback, thisArg); + if (result) { + return result; + } + } + } + return undefined; +}; + + +/** + * @param {ol.layer.Layer} layer Layer. + * @protected + * @return {ol.renderer.Layer} Layer renderer. + */ +ol.renderer.Map.prototype.getLayerRenderer = function(layer) { + var layerKey = goog.getUid(layer).toString(); + if (layerKey in this.layerRenderers_) { + return this.layerRenderers_[layerKey]; + } else { + var layerRenderer = this.createLayerRenderer(layer); + this.layerRenderers_[layerKey] = layerRenderer; + return layerRenderer; + } +}; + + +/** + * @param {string} layerKey Layer key. + * @protected + * @return {ol.renderer.Layer} Layer renderer. + */ +ol.renderer.Map.prototype.getLayerRendererByKey = function(layerKey) { + goog.asserts.assert(layerKey in this.layerRenderers_); + return this.layerRenderers_[layerKey]; +}; + + +/** + * @protected + * @return {Object.} Layer renderers. + */ +ol.renderer.Map.prototype.getLayerRenderers = function() { + return this.layerRenderers_; +}; + + +/** + * @return {ol.Map} Map. + */ +ol.renderer.Map.prototype.getMap = function() { + return this.map_; +}; + + +/** + * @param {string} layerKey Layer key. + * @return {ol.renderer.Layer} Layer renderer. + * @private + */ +ol.renderer.Map.prototype.removeLayerRendererByKey_ = function(layerKey) { + goog.asserts.assert(layerKey in this.layerRenderers_); + var layerRenderer = this.layerRenderers_[layerKey]; + delete this.layerRenderers_[layerKey]; + return layerRenderer; +}; + + +/** + * Render. + * @param {?ol.FrameState} frameState Frame state. + */ +ol.renderer.Map.prototype.renderFrame = goog.nullFunction; + + +/** + * @param {ol.Map} map Map. + * @param {ol.FrameState} frameState Frame state. + * @private + */ +ol.renderer.Map.prototype.removeUnusedLayerRenderers_ = + function(map, frameState) { + var layerKey; + for (layerKey in this.layerRenderers_) { + if (goog.isNull(frameState) || !(layerKey in frameState.layerStates)) { + goog.dispose(this.removeLayerRendererByKey_(layerKey)); + } + } +}; + + +/** + * @param {ol.FrameState} frameState Frame state. + * @protected + */ +ol.renderer.Map.prototype.scheduleExpireIconCache = function(frameState) { + frameState.postRenderFunctions.push( + /** + * @param {ol.Map} map Map. + * @param {ol.FrameState} frameState Frame state. + */ + function(map, frameState) { + ol.style.IconImageCache.getInstance().expire(); + }); +}; + + +/** + * @param {!ol.FrameState} frameState Frame state. + * @protected + */ +ol.renderer.Map.prototype.scheduleRemoveUnusedLayerRenderers = + function(frameState) { + var layerKey; + for (layerKey in this.layerRenderers_) { + if (!(layerKey in frameState.layerStates)) { + frameState.postRenderFunctions.push( + goog.bind(this.removeUnusedLayerRenderers_, this)); + return; + } + } +}; diff --git a/float-no-zero/ol/ol/renderer/webgl/webglimagelayerrenderer.js b/float-no-zero/ol/ol/renderer/webgl/webglimagelayerrenderer.js new file mode 100644 index 0000000000..e2ea1e0503 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webglimagelayerrenderer.js @@ -0,0 +1,202 @@ +goog.provide('ol.renderer.webgl.ImageLayer'); + +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.vec.Mat4'); +goog.require('goog.webgl'); +goog.require('ol.Coordinate'); +goog.require('ol.Extent'); +goog.require('ol.ImageBase'); +goog.require('ol.ImageState'); +goog.require('ol.ViewHint'); +goog.require('ol.layer.Image'); +goog.require('ol.renderer.webgl.Layer'); +goog.require('ol.source.Image'); + + + +/** + * @constructor + * @extends {ol.renderer.webgl.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Image} imageLayer Tile layer. + */ +ol.renderer.webgl.ImageLayer = function(mapRenderer, imageLayer) { + + goog.base(this, mapRenderer, imageLayer); + + /** + * The last rendered image. + * @private + * @type {?ol.ImageBase} + */ + this.image_ = null; + +}; +goog.inherits(ol.renderer.webgl.ImageLayer, ol.renderer.webgl.Layer); + + +/** + * @param {ol.ImageBase} image Image. + * @private + * @return {WebGLTexture} Texture. + */ +ol.renderer.webgl.ImageLayer.prototype.createTexture_ = function(image) { + + // We meet the conditions to work with non-power of two textures. + // http://www.khronos.org/webgl/wiki/WebGL_and_OpenGL_Differences#Non-Power_of_Two_Texture_Support + // http://learningwebgl.com/blog/?p=2101 + + var imageElement = image.getImageElement(); + var gl = this.getWebGLMapRenderer().getGL(); + + var texture = gl.createTexture(); + + gl.bindTexture(goog.webgl.TEXTURE_2D, texture); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, + goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, imageElement); + + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_S, + goog.webgl.CLAMP_TO_EDGE); + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_T, + goog.webgl.CLAMP_TO_EDGE); + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, goog.webgl.LINEAR); + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, goog.webgl.LINEAR); + + return texture; +}; + + +/** + * @inheritDoc + */ +ol.renderer.webgl.ImageLayer.prototype.forEachFeatureAtPixel = + function(coordinate, frameState, callback, thisArg) { + var layer = this.getLayer(); + var source = layer.getSource(); + goog.asserts.assertInstanceof(source, ol.source.Image); + var extent = frameState.extent; + var resolution = frameState.view2DState.resolution; + var rotation = frameState.view2DState.rotation; + return source.forEachFeatureAtPixel(extent, resolution, rotation, coordinate, + /** + * @param {ol.Feature} feature Feature. + * @return {?} Callback result. + */ + function(feature) { + return callback.call(thisArg, feature, layer); + }); +}; + + +/** + * @inheritDoc + */ +ol.renderer.webgl.ImageLayer.prototype.prepareFrame = + function(frameState, layerState) { + + var gl = this.getWebGLMapRenderer().getGL(); + + var view2DState = frameState.view2DState; + var viewCenter = view2DState.center; + var viewResolution = view2DState.resolution; + var viewRotation = view2DState.rotation; + + var image = this.image_; + var texture = this.texture; + var imageLayer = this.getLayer(); + goog.asserts.assertInstanceof(imageLayer, ol.layer.Image); + var imageSource = imageLayer.getSource(); + goog.asserts.assertInstanceof(imageSource, ol.source.Image); + + var hints = frameState.viewHints; + + if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING]) { + var image_ = imageSource.getImage(frameState.extent, viewResolution, + frameState.pixelRatio, view2DState.projection); + if (!goog.isNull(image_)) { + var imageState = image_.getState(); + if (imageState == ol.ImageState.IDLE) { + goog.events.listenOnce(image_, goog.events.EventType.CHANGE, + this.handleImageChange, false, this); + image_.load(); + } else if (imageState == ol.ImageState.LOADED) { + image = image_; + texture = this.createTexture_(image_); + if (!goog.isNull(this.texture)) { + frameState.postRenderFunctions.push( + goog.partial( + /** + * @param {WebGLRenderingContext} gl GL. + * @param {WebGLTexture} texture Texture. + */ + function(gl, texture) { + if (!gl.isContextLost()) { + gl.deleteTexture(texture); + } + }, gl, this.texture)); + } + } + } + } + + if (!goog.isNull(image)) { + goog.asserts.assert(!goog.isNull(texture)); + + var canvas = this.getWebGLMapRenderer().getContext().getCanvas(); + + this.updateProjectionMatrix_(canvas.width, canvas.height, + viewCenter, viewResolution, viewRotation, image.getExtent()); + + // Translate and scale to flip the Y coord. + var texCoordMatrix = this.texCoordMatrix; + goog.vec.Mat4.makeIdentity(texCoordMatrix); + goog.vec.Mat4.scale(texCoordMatrix, 1, -1, 1); + goog.vec.Mat4.translate(texCoordMatrix, 0, -1, 0); + + this.image_ = image; + this.texture = texture; + + this.updateAttributions(frameState.attributions, image.getAttributions()); + this.updateLogos(frameState, imageSource); + } +}; + + +/** + * @param {number} canvasWidth Canvas width. + * @param {number} canvasHeight Canvas height. + * @param {ol.Coordinate} viewCenter View center. + * @param {number} viewResolution View resolution. + * @param {number} viewRotation View rotation. + * @param {ol.Extent} imageExtent Image extent. + * @private + */ +ol.renderer.webgl.ImageLayer.prototype.updateProjectionMatrix_ = + function(canvasWidth, canvasHeight, viewCenter, + viewResolution, viewRotation, imageExtent) { + + var canvasExtentWidth = canvasWidth * viewResolution; + var canvasExtentHeight = canvasHeight * viewResolution; + + var projectionMatrix = this.projectionMatrix; + goog.vec.Mat4.makeIdentity(projectionMatrix); + goog.vec.Mat4.scale(projectionMatrix, + 2 / canvasExtentWidth, 2 / canvasExtentHeight, 1); + goog.vec.Mat4.rotateZ(projectionMatrix, -viewRotation); + goog.vec.Mat4.translate(projectionMatrix, + imageExtent[0] - viewCenter[0], + imageExtent[1] - viewCenter[1], + 0); + goog.vec.Mat4.scale(projectionMatrix, + (imageExtent[2] - imageExtent[0]) / 2, + (imageExtent[3] - imageExtent[1]) / 2, + 1); + goog.vec.Mat4.translate(projectionMatrix, 1, 1, 0); + +}; diff --git a/float-no-zero/ol/ol/renderer/webgl/webgllayerrenderer.js b/float-no-zero/ol/ol/renderer/webgl/webgllayerrenderer.js new file mode 100644 index 0000000000..34d2cf8a7d --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webgllayerrenderer.js @@ -0,0 +1,289 @@ +goog.provide('ol.renderer.webgl.Layer'); + +goog.require('goog.vec.Mat4'); +goog.require('goog.webgl'); +goog.require('ol.FrameState'); +goog.require('ol.color.Matrix'); +goog.require('ol.layer.Layer'); +goog.require('ol.render.Event'); +goog.require('ol.render.EventType'); +goog.require('ol.render.webgl.Immediate'); +goog.require('ol.renderer.Layer'); +goog.require('ol.renderer.webgl.map.shader.Color'); +goog.require('ol.renderer.webgl.map.shader.Default'); +goog.require('ol.structs.Buffer'); + + + +/** + * @constructor + * @extends {ol.renderer.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Layer} layer Layer. + */ +ol.renderer.webgl.Layer = function(mapRenderer, layer) { + + goog.base(this, mapRenderer, layer); + + /** + * @private + * @type {ol.structs.Buffer} + */ + this.arrayBuffer_ = new ol.structs.Buffer([ + -1, -1, 0, 0, + 1, -1, 1, 0, + -1, 1, 0, 1, + 1, 1, 1, 1 + ]); + + /** + * @protected + * @type {WebGLTexture} + */ + this.texture = null; + + /** + * @protected + * @type {WebGLFramebuffer} + */ + this.framebuffer = null; + + /** + * @protected + * @type {number|undefined} + */ + this.framebufferDimension = undefined; + + /** + * @protected + * @type {!goog.vec.Mat4.Number} + */ + this.texCoordMatrix = goog.vec.Mat4.createNumber(); + + /** + * @protected + * @type {!goog.vec.Mat4.Number} + */ + this.projectionMatrix = goog.vec.Mat4.createNumberIdentity(); + + /** + * @private + * @type {ol.color.Matrix} + */ + this.colorMatrix_ = new ol.color.Matrix(); + + /** + * @private + * @type {ol.renderer.webgl.map.shader.Color.Locations} + */ + this.colorLocations_ = null; + + /** + * @private + * @type {ol.renderer.webgl.map.shader.Default.Locations} + */ + this.defaultLocations_ = null; + +}; +goog.inherits(ol.renderer.webgl.Layer, ol.renderer.Layer); + + +/** + * @param {ol.FrameState} frameState Frame state. + * @param {number} framebufferDimension Framebuffer dimension. + * @protected + */ +ol.renderer.webgl.Layer.prototype.bindFramebuffer = + function(frameState, framebufferDimension) { + + var mapRenderer = this.getWebGLMapRenderer(); + var gl = mapRenderer.getGL(); + + if (!goog.isDef(this.framebufferDimension) || + this.framebufferDimension != framebufferDimension) { + + frameState.postRenderFunctions.push( + goog.partial( + /** + * @param {WebGLRenderingContext} gl GL. + * @param {WebGLFramebuffer} framebuffer Framebuffer. + * @param {WebGLTexture} texture Texture. + */ + function(gl, framebuffer, texture) { + if (!gl.isContextLost()) { + gl.deleteFramebuffer(framebuffer); + gl.deleteTexture(texture); + } + }, gl, this.framebuffer, this.texture)); + + var texture = gl.createTexture(); + gl.bindTexture(goog.webgl.TEXTURE_2D, texture); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, + framebufferDimension, framebufferDimension, 0, goog.webgl.RGBA, + goog.webgl.UNSIGNED_BYTE, null); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, + goog.webgl.LINEAR); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, + goog.webgl.LINEAR); + + var framebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer); + gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER, + goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0); + + this.texture = texture; + this.framebuffer = framebuffer; + this.framebufferDimension = framebufferDimension; + + } else { + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer); + } + +}; + + +/** + * @param {ol.FrameState} frameState Frame state. + * @param {ol.layer.LayerState} layerState Layer state. + * @param {ol.webgl.Context} context Context. + */ +ol.renderer.webgl.Layer.prototype.composeFrame = + function(frameState, layerState, context) { + + this.dispatchComposeEvent_( + ol.render.EventType.PRECOMPOSE, context, frameState); + + context.bindBuffer(goog.webgl.ARRAY_BUFFER, this.arrayBuffer_); + + var gl = context.getGL(); + + var useColor = + layerState.brightness || + layerState.contrast != 1 || + layerState.hue || + layerState.saturation != 1; + + var fragmentShader, vertexShader; + if (useColor) { + fragmentShader = ol.renderer.webgl.map.shader.ColorFragment.getInstance(); + vertexShader = ol.renderer.webgl.map.shader.ColorVertex.getInstance(); + } else { + fragmentShader = + ol.renderer.webgl.map.shader.DefaultFragment.getInstance(); + vertexShader = ol.renderer.webgl.map.shader.DefaultVertex.getInstance(); + } + + var program = context.getProgram(fragmentShader, vertexShader); + + // FIXME colorLocations_ and defaultLocations_ should be shared somehow + var locations; + if (useColor) { + if (goog.isNull(this.colorLocations_)) { + locations = + new ol.renderer.webgl.map.shader.Color.Locations(gl, program); + this.colorLocations_ = locations; + } else { + locations = this.colorLocations_; + } + } else { + if (goog.isNull(this.defaultLocations_)) { + locations = + new ol.renderer.webgl.map.shader.Default.Locations(gl, program); + this.defaultLocations_ = locations; + } else { + locations = this.defaultLocations_; + } + } + + if (context.useProgram(program)) { + gl.enableVertexAttribArray(locations.a_position); + gl.vertexAttribPointer( + locations.a_position, 2, goog.webgl.FLOAT, false, 16, 0); + gl.enableVertexAttribArray(locations.a_texCoord); + gl.vertexAttribPointer( + locations.a_texCoord, 2, goog.webgl.FLOAT, false, 16, 8); + gl.uniform1i(locations.u_texture, 0); + } + + gl.uniformMatrix4fv( + locations.u_texCoordMatrix, false, this.getTexCoordMatrix()); + gl.uniformMatrix4fv(locations.u_projectionMatrix, false, + this.getProjectionMatrix()); + if (useColor) { + gl.uniformMatrix4fv(locations.u_colorMatrix, false, + this.colorMatrix_.getMatrix( + layerState.brightness, + layerState.contrast, + layerState.hue, + layerState.saturation + )); + } + gl.uniform1f(locations.u_opacity, layerState.opacity); + gl.bindTexture(goog.webgl.TEXTURE_2D, this.getTexture()); + gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); + + this.dispatchComposeEvent_( + ol.render.EventType.POSTCOMPOSE, context, frameState); + +}; + + +/** + * @param {ol.render.EventType} type Event type. + * @param {ol.webgl.Context} context WebGL context. + * @param {ol.FrameState} frameState Frame state. + * @private + */ +ol.renderer.webgl.Layer.prototype.dispatchComposeEvent_ = + function(type, context, frameState) { + var layer = this.getLayer(); + if (layer.hasListener(type)) { + var render = new ol.render.webgl.Immediate(context, frameState.pixelRatio); + var composeEvent = new ol.render.Event( + type, layer, render, frameState, null, context); + layer.dispatchEvent(composeEvent); + } +}; + + +/** + * @protected + * @return {ol.renderer.webgl.Map} MapRenderer. + */ +ol.renderer.webgl.Layer.prototype.getWebGLMapRenderer = function() { + return /** @type {ol.renderer.webgl.Map} */ (this.getMapRenderer()); +}; + + +/** + * @return {!goog.vec.Mat4.Number} Matrix. + */ +ol.renderer.webgl.Layer.prototype.getTexCoordMatrix = function() { + return this.texCoordMatrix; +}; + + +/** + * @return {WebGLTexture} Texture. + */ +ol.renderer.webgl.Layer.prototype.getTexture = function() { + return this.texture; +}; + + +/** + * @return {!goog.vec.Mat4.Number} Matrix. + */ +ol.renderer.webgl.Layer.prototype.getProjectionMatrix = function() { + return this.projectionMatrix; +}; + + +/** + * Handle webglcontextlost. + */ +ol.renderer.webgl.Layer.prototype.handleWebGLContextLost = function() { + this.texture = null; + this.framebuffer = null; + this.framebufferDimension = undefined; +}; diff --git a/float-no-zero/ol/ol/renderer/webgl/webglmapcolor.glsl b/float-no-zero/ol/ol/renderer/webgl/webglmapcolor.glsl new file mode 100644 index 0000000000..4ed15cd954 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webglmapcolor.glsl @@ -0,0 +1,32 @@ +//! NAMESPACE=ol.renderer.webgl.map.shader.Color +//! CLASS=ol.renderer.webgl.map.shader.Color + + +//! COMMON +varying vec2 v_texCoord; + + +//! VERTEX +attribute vec2 a_position; +attribute vec2 a_texCoord; + +uniform mat4 u_texCoordMatrix; +uniform mat4 u_projectionMatrix; + +void main(void) { + gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.); + v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st; +} + + +//! FRAGMENT +// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp +uniform mat4 u_colorMatrix; +uniform float u_opacity; +uniform sampler2D u_texture; + +void main(void) { + vec4 texColor = texture2D(u_texture, v_texCoord); + gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb; + gl_FragColor.a = texColor.a * u_opacity; +} diff --git a/float-no-zero/ol/ol/renderer/webgl/webglmapcolorshader.js b/float-no-zero/ol/ol/renderer/webgl/webglmapcolorshader.js new file mode 100644 index 0000000000..eeff8162d2 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webglmapcolorshader.js @@ -0,0 +1,129 @@ +// This file is automatically generated, do not edit +goog.provide('ol.renderer.webgl.map.shader.Color'); + +goog.require('ol.webgl.shader'); + + + +/** + * @constructor + * @extends {ol.webgl.shader.Fragment} + * @struct + */ +ol.renderer.webgl.map.shader.ColorFragment = function() { + goog.base(this, ol.renderer.webgl.map.shader.ColorFragment.SOURCE); +}; +goog.inherits(ol.renderer.webgl.map.shader.ColorFragment, ol.webgl.shader.Fragment); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.ColorFragment); + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.ColorFragment.DEBUG_SOURCE = 'precision mediump float;\nvarying vec2 v_texCoord;\n\n\n// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp\nuniform mat4 u_colorMatrix;\nuniform float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n vec4 texColor = texture2D(u_texture, v_texCoord);\n gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;\n gl_FragColor.a = texColor.a * u_opacity;\n}\n'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.ColorFragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform mat4 f;uniform float g;uniform sampler2D h;void main(void){vec4 texColor=texture2D(h,a);gl_FragColor.rgb=(f*vec4(texColor.rgb,1.)).rgb;gl_FragColor.a=texColor.a*g;}'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.ColorFragment.SOURCE = goog.DEBUG ? + ol.renderer.webgl.map.shader.ColorFragment.DEBUG_SOURCE : + ol.renderer.webgl.map.shader.ColorFragment.OPTIMIZED_SOURCE; + + + +/** + * @constructor + * @extends {ol.webgl.shader.Vertex} + * @struct + */ +ol.renderer.webgl.map.shader.ColorVertex = function() { + goog.base(this, ol.renderer.webgl.map.shader.ColorVertex.SOURCE); +}; +goog.inherits(ol.renderer.webgl.map.shader.ColorVertex, ol.webgl.shader.Vertex); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.ColorVertex); + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.ColorVertex.DEBUG_SOURCE = 'varying vec2 v_texCoord;\n\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\n\nuniform mat4 u_texCoordMatrix;\nuniform mat4 u_projectionMatrix;\n\nvoid main(void) {\n gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);\n v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;\n}\n\n\n'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.ColorVertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 b;attribute vec2 c;uniform mat4 d;uniform mat4 e;void main(void){gl_Position=e*vec4(b,0.,1.);a=(d*vec4(c,0.,1.)).st;}'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.ColorVertex.SOURCE = goog.DEBUG ? + ol.renderer.webgl.map.shader.ColorVertex.DEBUG_SOURCE : + ol.renderer.webgl.map.shader.ColorVertex.OPTIMIZED_SOURCE; + + + +/** + * @constructor + * @param {WebGLRenderingContext} gl GL. + * @param {WebGLProgram} program Program. + * @struct + */ +ol.renderer.webgl.map.shader.Color.Locations = function(gl, program) { + + /** + * @type {WebGLUniformLocation} + */ + this.u_colorMatrix = gl.getUniformLocation( + program, goog.DEBUG ? 'u_colorMatrix' : 'f'); + + /** + * @type {WebGLUniformLocation} + */ + this.u_opacity = gl.getUniformLocation( + program, goog.DEBUG ? 'u_opacity' : 'g'); + + /** + * @type {WebGLUniformLocation} + */ + this.u_projectionMatrix = gl.getUniformLocation( + program, goog.DEBUG ? 'u_projectionMatrix' : 'e'); + + /** + * @type {WebGLUniformLocation} + */ + this.u_texCoordMatrix = gl.getUniformLocation( + program, goog.DEBUG ? 'u_texCoordMatrix' : 'd'); + + /** + * @type {WebGLUniformLocation} + */ + this.u_texture = gl.getUniformLocation( + program, goog.DEBUG ? 'u_texture' : 'h'); + + /** + * @type {number} + */ + this.a_position = gl.getAttribLocation( + program, goog.DEBUG ? 'a_position' : 'b'); + + /** + * @type {number} + */ + this.a_texCoord = gl.getAttribLocation( + program, goog.DEBUG ? 'a_texCoord' : 'c'); +}; diff --git a/float-no-zero/ol/ol/renderer/webgl/webglmapdefault.glsl b/float-no-zero/ol/ol/renderer/webgl/webglmapdefault.glsl new file mode 100644 index 0000000000..b07838dc3b --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webglmapdefault.glsl @@ -0,0 +1,30 @@ +//! NAMESPACE=ol.renderer.webgl.map.shader.Default +//! CLASS=ol.renderer.webgl.map.shader.Default + + +//! COMMON +varying vec2 v_texCoord; + + +//! VERTEX +attribute vec2 a_position; +attribute vec2 a_texCoord; + +uniform mat4 u_texCoordMatrix; +uniform mat4 u_projectionMatrix; + +void main(void) { + gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.); + v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st; +} + + +//! FRAGMENT +uniform float u_opacity; +uniform sampler2D u_texture; + +void main(void) { + vec4 texColor = texture2D(u_texture, v_texCoord); + gl_FragColor.rgb = texColor.rgb; + gl_FragColor.a = texColor.a * u_opacity; +} diff --git a/float-no-zero/ol/ol/renderer/webgl/webglmapdefaultshader.js b/float-no-zero/ol/ol/renderer/webgl/webglmapdefaultshader.js new file mode 100644 index 0000000000..47aff44a22 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webglmapdefaultshader.js @@ -0,0 +1,123 @@ +// This file is automatically generated, do not edit +goog.provide('ol.renderer.webgl.map.shader.Default'); + +goog.require('ol.webgl.shader'); + + + +/** + * @constructor + * @extends {ol.webgl.shader.Fragment} + * @struct + */ +ol.renderer.webgl.map.shader.DefaultFragment = function() { + goog.base(this, ol.renderer.webgl.map.shader.DefaultFragment.SOURCE); +}; +goog.inherits(ol.renderer.webgl.map.shader.DefaultFragment, ol.webgl.shader.Fragment); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.DefaultFragment); + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.DefaultFragment.DEBUG_SOURCE = 'precision mediump float;\nvarying vec2 v_texCoord;\n\n\nuniform float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n vec4 texColor = texture2D(u_texture, v_texCoord);\n gl_FragColor.rgb = texColor.rgb;\n gl_FragColor.a = texColor.a * u_opacity;\n}\n'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.DefaultFragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform float f;uniform sampler2D g;void main(void){vec4 texColor=texture2D(g,a);gl_FragColor.rgb=texColor.rgb;gl_FragColor.a=texColor.a*f;}'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.DefaultFragment.SOURCE = goog.DEBUG ? + ol.renderer.webgl.map.shader.DefaultFragment.DEBUG_SOURCE : + ol.renderer.webgl.map.shader.DefaultFragment.OPTIMIZED_SOURCE; + + + +/** + * @constructor + * @extends {ol.webgl.shader.Vertex} + * @struct + */ +ol.renderer.webgl.map.shader.DefaultVertex = function() { + goog.base(this, ol.renderer.webgl.map.shader.DefaultVertex.SOURCE); +}; +goog.inherits(ol.renderer.webgl.map.shader.DefaultVertex, ol.webgl.shader.Vertex); +goog.addSingletonGetter(ol.renderer.webgl.map.shader.DefaultVertex); + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.DefaultVertex.DEBUG_SOURCE = 'varying vec2 v_texCoord;\n\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\n\nuniform mat4 u_texCoordMatrix;\nuniform mat4 u_projectionMatrix;\n\nvoid main(void) {\n gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);\n v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;\n}\n\n\n'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.DefaultVertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 b;attribute vec2 c;uniform mat4 d;uniform mat4 e;void main(void){gl_Position=e*vec4(b,0.,1.);a=(d*vec4(c,0.,1.)).st;}'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.map.shader.DefaultVertex.SOURCE = goog.DEBUG ? + ol.renderer.webgl.map.shader.DefaultVertex.DEBUG_SOURCE : + ol.renderer.webgl.map.shader.DefaultVertex.OPTIMIZED_SOURCE; + + + +/** + * @constructor + * @param {WebGLRenderingContext} gl GL. + * @param {WebGLProgram} program Program. + * @struct + */ +ol.renderer.webgl.map.shader.Default.Locations = function(gl, program) { + + /** + * @type {WebGLUniformLocation} + */ + this.u_opacity = gl.getUniformLocation( + program, goog.DEBUG ? 'u_opacity' : 'f'); + + /** + * @type {WebGLUniformLocation} + */ + this.u_projectionMatrix = gl.getUniformLocation( + program, goog.DEBUG ? 'u_projectionMatrix' : 'e'); + + /** + * @type {WebGLUniformLocation} + */ + this.u_texCoordMatrix = gl.getUniformLocation( + program, goog.DEBUG ? 'u_texCoordMatrix' : 'd'); + + /** + * @type {WebGLUniformLocation} + */ + this.u_texture = gl.getUniformLocation( + program, goog.DEBUG ? 'u_texture' : 'g'); + + /** + * @type {number} + */ + this.a_position = gl.getAttribLocation( + program, goog.DEBUG ? 'a_position' : 'b'); + + /** + * @type {number} + */ + this.a_texCoord = gl.getAttribLocation( + program, goog.DEBUG ? 'a_texCoord' : 'c'); +}; diff --git a/float-no-zero/ol/ol/renderer/webgl/webglmaprenderer.js b/float-no-zero/ol/ol/renderer/webgl/webglmaprenderer.js new file mode 100644 index 0000000000..9eba422d21 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webglmaprenderer.js @@ -0,0 +1,522 @@ +// FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE) + +goog.provide('ol.renderer.webgl.Map'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.Event'); +goog.require('goog.log'); +goog.require('goog.log.Logger'); +goog.require('goog.object'); +goog.require('goog.style'); +goog.require('goog.webgl'); +goog.require('ol.FrameState'); +goog.require('ol.Tile'); +goog.require('ol.css'); +goog.require('ol.layer.Image'); +goog.require('ol.layer.Tile'); +goog.require('ol.render.Event'); +goog.require('ol.render.EventType'); +goog.require('ol.render.webgl.Immediate'); +goog.require('ol.renderer.Map'); +goog.require('ol.renderer.webgl.ImageLayer'); +goog.require('ol.renderer.webgl.Layer'); +goog.require('ol.renderer.webgl.TileLayer'); +goog.require('ol.source.State'); +goog.require('ol.structs.LRUCache'); +goog.require('ol.structs.PriorityQueue'); +goog.require('ol.webgl'); +goog.require('ol.webgl.Context'); +goog.require('ol.webgl.WebGLContextEventType'); + + +/** + * @define {number} Texture cache high water mark. + */ +ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK = 1024; + + +/** + * @typedef {{magFilter: number, minFilter: number, texture: WebGLTexture}} + */ +ol.renderer.webgl.TextureCacheEntry; + + + +/** + * @constructor + * @extends {ol.renderer.Map} + * @param {Element} container Container. + * @param {ol.Map} map Map. + */ +ol.renderer.webgl.Map = function(container, map) { + + goog.base(this, container, map); + + /** + * @private + * @type {HTMLCanvasElement} + */ + this.canvas_ = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + this.canvas_.style.width = '100%'; + this.canvas_.style.height = '100%'; + this.canvas_.className = ol.css.CLASS_UNSELECTABLE; + goog.dom.insertChildAt(container, this.canvas_, 0); + + /** + * @private + * @type {HTMLCanvasElement} + */ + this.clipTileCanvas_ = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + + /** + * @private + * @type {number} + */ + this.clipTileCanvasSize_ = 0; + + /** + * @private + * @type {CanvasRenderingContext2D} + */ + this.clipTileContext_ = /** @type {CanvasRenderingContext2D} */ + (this.clipTileCanvas_.getContext('2d')); + + /** + * @private + * @type {boolean} + */ + this.renderedVisible_ = true; + + /** + * @private + * @type {WebGLRenderingContext} + */ + this.gl_ = ol.webgl.getContext(this.canvas_, { + antialias: true, + depth: false, + failIfMajorPerformanceCaveat: true, + preserveDrawingBuffer: false, + stencil: true + }); + goog.asserts.assert(!goog.isNull(this.gl_)); + + /** + * @private + * @type {ol.webgl.Context} + */ + this.context_ = new ol.webgl.Context(this.canvas_, this.gl_); + + goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.LOST, + this.handleWebGLContextLost, false, this); + goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.RESTORED, + this.handleWebGLContextRestored, false, this); + + /** + * @private + * @type {ol.structs.LRUCache} + */ + this.textureCache_ = new ol.structs.LRUCache(); + + /** + * @private + * @type {ol.Coordinate} + */ + this.focus_ = null; + + /** + * @private + * @type {ol.structs.PriorityQueue.} + */ + this.tileTextureQueue_ = new ol.structs.PriorityQueue( + /** + * @param {Array.<*>} element Element. + * @return {number} Priority. + */ + goog.bind( + /** + * @param {Array.<*>} element Element. + * @return {number} Priority. + * @this {ol.renderer.webgl.Map} + */ + function(element) { + var tileCenter = /** @type {ol.Coordinate} */ (element[1]); + var tileResolution = /** @type {number} */ (element[2]); + var deltaX = tileCenter[0] - this.focus_[0]; + var deltaY = tileCenter[1] - this.focus_[1]; + return 65536 * Math.log(tileResolution) + + Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution; + }, this), + /** + * @param {Array} element Element. + * @return {string} Key. + */ + function(element) { + return /** @type {ol.Tile} */ (element[0]).getKey(); + }); + + /** + * @private + * @type {ol.PostRenderFunction} + */ + this.loadNextTileTexture_ = goog.bind( + function(map, frameState) { + if (!this.tileTextureQueue_.isEmpty()) { + this.tileTextureQueue_.reprioritize(); + var element = this.tileTextureQueue_.dequeue(); + var tile = /** @type {ol.Tile} */ (element[0]); + var tileSize = /** @type {number} */ (element[3]); + var tileGutter = /** @type {number} */ (element[4]); + this.bindTileTexture( + tile, tileSize, tileGutter, goog.webgl.LINEAR, goog.webgl.LINEAR); + } + }, this); + + /** + * @private + * @type {number} + */ + this.textureCacheFrameMarkerCount_ = 0; + + this.initializeGL_(); + +}; +goog.inherits(ol.renderer.webgl.Map, ol.renderer.Map); + + +/** + * @param {ol.Tile} tile Tile. + * @param {number} tileSize Tile size. + * @param {number} tileGutter Tile gutter. + * @param {number} magFilter Mag filter. + * @param {number} minFilter Min filter. + */ +ol.renderer.webgl.Map.prototype.bindTileTexture = + function(tile, tileSize, tileGutter, magFilter, minFilter) { + var gl = this.getGL(); + var tileKey = tile.getKey(); + if (this.textureCache_.containsKey(tileKey)) { + var textureCacheEntry = /** @type {ol.renderer.webgl.TextureCacheEntry} */ + (this.textureCache_.get(tileKey)); + gl.bindTexture(goog.webgl.TEXTURE_2D, textureCacheEntry.texture); + if (textureCacheEntry.magFilter != magFilter) { + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, magFilter); + textureCacheEntry.magFilter = magFilter; + } + if (textureCacheEntry.minFilter != minFilter) { + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, minFilter); + textureCacheEntry.minFilter = minFilter; + } + } else { + var texture = gl.createTexture(); + gl.bindTexture(goog.webgl.TEXTURE_2D, texture); + if (tileGutter > 0) { + var clipTileCanvas = this.clipTileCanvas_; + var clipTileContext = this.clipTileContext_; + if (this.clipTileCanvasSize_ != tileSize) { + clipTileCanvas.width = tileSize; + clipTileCanvas.height = tileSize; + this.clipTileCanvasSize_ = tileSize; + } else { + clipTileContext.clearRect(0, 0, tileSize, tileSize); + } + clipTileContext.drawImage(tile.getImage(), tileGutter, tileGutter, + tileSize, tileSize, 0, 0, tileSize, tileSize); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, + goog.webgl.RGBA, goog.webgl.RGBA, + goog.webgl.UNSIGNED_BYTE, clipTileCanvas); + } else { + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, + goog.webgl.RGBA, goog.webgl.RGBA, + goog.webgl.UNSIGNED_BYTE, tile.getImage()); + } + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, magFilter); + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, minFilter); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_S, + goog.webgl.CLAMP_TO_EDGE); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_T, + goog.webgl.CLAMP_TO_EDGE); + this.textureCache_.set(tileKey, { + texture: texture, + magFilter: magFilter, + minFilter: minFilter + }); + } +}; + + +/** + * @inheritDoc + */ +ol.renderer.webgl.Map.prototype.createLayerRenderer = function(layer) { + if (ol.ENABLE_IMAGE && layer instanceof ol.layer.Image) { + return new ol.renderer.webgl.ImageLayer(this, layer); + } else if (ol.ENABLE_TILE && layer instanceof ol.layer.Tile) { + return new ol.renderer.webgl.TileLayer(this, layer); + } else { + goog.asserts.fail(); + return null; + } +}; + + +/** + * @param {ol.render.EventType} type Event type. + * @param {ol.FrameState} frameState Frame state. + * @private + */ +ol.renderer.webgl.Map.prototype.dispatchComposeEvent_ = + function(type, frameState) { + var map = this.getMap(); + if (map.hasListener(type)) { + var context = this.getContext(); + var render = new ol.render.webgl.Immediate(context, frameState.pixelRatio); + var composeEvent = new ol.render.Event( + type, map, render, frameState, null, context); + map.dispatchEvent(composeEvent); + } +}; + + +/** + * @inheritDoc + */ +ol.renderer.webgl.Map.prototype.disposeInternal = function() { + var gl = this.getGL(); + if (!gl.isContextLost()) { + this.textureCache_.forEach( + /** + * @param {ol.renderer.webgl.TextureCacheEntry} textureCacheEntry + * Texture cache entry. + */ + function(textureCacheEntry) { + if (!goog.isNull(textureCacheEntry)) { + gl.deleteTexture(textureCacheEntry.texture); + } + }); + } + goog.dispose(this.context_); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @param {ol.Map} map Map. + * @param {ol.FrameState} frameState Frame state. + * @private + */ +ol.renderer.webgl.Map.prototype.expireCache_ = function(map, frameState) { + var gl = this.getGL(); + var textureCacheEntry; + while (this.textureCache_.getCount() - this.textureCacheFrameMarkerCount_ > + ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK) { + textureCacheEntry = /** @type {?ol.renderer.webgl.TextureCacheEntry} */ + (this.textureCache_.peekLast()); + if (goog.isNull(textureCacheEntry)) { + if (+this.textureCache_.peekLastKey() == frameState.index) { + break; + } else { + --this.textureCacheFrameMarkerCount_; + } + } else { + gl.deleteTexture(textureCacheEntry.texture); + } + this.textureCache_.pop(); + } +}; + + +/** + * @return {ol.webgl.Context} + */ +ol.renderer.webgl.Map.prototype.getContext = function() { + return this.context_; +}; + + +/** + * @return {WebGLRenderingContext} GL. + */ +ol.renderer.webgl.Map.prototype.getGL = function() { + return this.gl_; +}; + + +/** + * @return {ol.structs.PriorityQueue.} Tile texture queue. + */ +ol.renderer.webgl.Map.prototype.getTileTextureQueue = function() { + return this.tileTextureQueue_; +}; + + +/** + * @param {goog.events.Event} event Event. + * @protected + */ +ol.renderer.webgl.Map.prototype.handleWebGLContextLost = function(event) { + event.preventDefault(); + this.textureCache_.clear(); + this.textureCacheFrameMarkerCount_ = 0; + goog.object.forEach(this.getLayerRenderers(), + /** + * @param {ol.renderer.Layer} layerRenderer Layer renderer. + * @param {string} key Key. + * @param {Object.} object Object. + */ + function(layerRenderer, key, object) { + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer); + var webGLLayerRenderer = /** @type {ol.renderer.webgl.Layer} */ + (layerRenderer); + webGLLayerRenderer.handleWebGLContextLost(); + }); +}; + + +/** + * @protected + */ +ol.renderer.webgl.Map.prototype.handleWebGLContextRestored = function() { + this.initializeGL_(); + this.getMap().render(); +}; + + +/** + * @private + */ +ol.renderer.webgl.Map.prototype.initializeGL_ = function() { + var gl = this.gl_; + gl.activeTexture(goog.webgl.TEXTURE0); + gl.blendFuncSeparate( + goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA, + goog.webgl.ONE, goog.webgl.ONE_MINUS_SRC_ALPHA); + gl.disable(goog.webgl.CULL_FACE); + gl.disable(goog.webgl.DEPTH_TEST); + gl.disable(goog.webgl.SCISSOR_TEST); + gl.disable(goog.webgl.STENCIL_TEST); +}; + + +/** + * @param {ol.Tile} tile Tile. + * @return {boolean} Is tile texture loaded. + */ +ol.renderer.webgl.Map.prototype.isTileTextureLoaded = function(tile) { + return this.textureCache_.containsKey(tile.getKey()); +}; + + +/** + * @private + * @type {goog.log.Logger} + */ +ol.renderer.webgl.Map.prototype.logger_ = + goog.log.getLogger('ol.renderer.webgl.Map'); + + +/** + * @inheritDoc + */ +ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) { + + var context = this.getContext(); + var gl = this.getGL(); + + if (gl.isContextLost()) { + return false; + } + + if (goog.isNull(frameState)) { + if (this.renderedVisible_) { + goog.style.setElementShown(this.canvas_, false); + this.renderedVisible_ = false; + } + return false; + } + + this.focus_ = frameState.focus; + + this.textureCache_.set((-frameState.index).toString(), null); + ++this.textureCacheFrameMarkerCount_; + + /** @type {Array.} */ + var layersToDraw = []; + var layersArray = frameState.layersArray; + var viewResolution = frameState.view2DState.resolution; + var i, ii, layer, layerRenderer, layerState; + for (i = 0, ii = layersArray.length; i < ii; ++i) { + layer = layersArray[i]; + layerState = frameState.layerStates[goog.getUid(layer)]; + if (layerState.visible && + layerState.sourceState == ol.source.State.READY && + viewResolution < layerState.maxResolution && + viewResolution >= layerState.minResolution) { + layersToDraw.push(layer); + } + } + + for (i = 0, ii = layersToDraw.length; i < ii; ++i) { + layer = layersToDraw[i]; + layerRenderer = this.getLayerRenderer(layer); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer); + layerState = frameState.layerStates[goog.getUid(layer)]; + layerRenderer.prepareFrame(frameState, layerState); + } + + var width = frameState.size[0] * frameState.pixelRatio; + var height = frameState.size[1] * frameState.pixelRatio; + if (this.canvas_.width != width || this.canvas_.height != height) { + this.canvas_.width = width; + this.canvas_.height = height; + } + + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, null); + + gl.clearColor(0, 0, 0, 0); + gl.clear(goog.webgl.COLOR_BUFFER_BIT); + gl.enable(goog.webgl.BLEND); + gl.viewport(0, 0, this.canvas_.width, this.canvas_.height); + + this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, frameState); + + for (i = 0, ii = layersToDraw.length; i < ii; ++i) { + layer = layersToDraw[i]; + layerState = frameState.layerStates[goog.getUid(layer)]; + layerRenderer = this.getLayerRenderer(layer); + goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer); + layerRenderer.composeFrame(frameState, layerState, context); + } + + if (!this.renderedVisible_) { + goog.style.setElementShown(this.canvas_, true); + this.renderedVisible_ = true; + } + + this.calculateMatrices2D(frameState); + + if (this.textureCache_.getCount() - this.textureCacheFrameMarkerCount_ > + ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK) { + frameState.postRenderFunctions.push(goog.bind(this.expireCache_, this)); + } + + if (!this.tileTextureQueue_.isEmpty()) { + frameState.postRenderFunctions.push(this.loadNextTileTexture_); + frameState.animate = true; + } + + this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState); + + this.scheduleRemoveUnusedLayerRenderers(frameState); + this.scheduleExpireIconCache(frameState); + +}; diff --git a/float-no-zero/ol/ol/renderer/webgl/webgltilelayer.glsl b/float-no-zero/ol/ol/renderer/webgl/webgltilelayer.glsl new file mode 100644 index 0000000000..5262f97c26 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webgltilelayer.glsl @@ -0,0 +1,25 @@ +//! NAMESPACE=ol.renderer.webgl.tilelayer.shader +//! CLASS=ol.renderer.webgl.tilelayer.shader. + + +//! COMMON +varying vec2 v_texCoord; + + +//! VERTEX +attribute vec2 a_position; +attribute vec2 a_texCoord; +uniform vec4 u_tileOffset; + +void main(void) { + gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.); + v_texCoord = a_texCoord; +} + + +//! FRAGMENT +uniform sampler2D u_texture; + +void main(void) { + gl_FragColor = texture2D(u_texture, v_texCoord); +} diff --git a/float-no-zero/ol/ol/renderer/webgl/webgltilelayerrenderer.js b/float-no-zero/ol/ol/renderer/webgl/webgltilelayerrenderer.js new file mode 100644 index 0000000000..de21054637 --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webgltilelayerrenderer.js @@ -0,0 +1,327 @@ +// FIXME large resolutions lead to too large framebuffers :-( +// FIXME animated shaders! check in redraw + +goog.provide('ol.renderer.webgl.TileLayer'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.object'); +goog.require('goog.vec.Mat4'); +goog.require('goog.vec.Vec4'); +goog.require('goog.webgl'); +goog.require('ol.Tile'); +goog.require('ol.TileRange'); +goog.require('ol.TileState'); +goog.require('ol.extent'); +goog.require('ol.layer.Tile'); +goog.require('ol.math'); +goog.require('ol.renderer.webgl.Layer'); +goog.require('ol.renderer.webgl.tilelayer.shader'); +goog.require('ol.source.Tile'); +goog.require('ol.structs.Buffer'); + + + +/** + * @constructor + * @extends {ol.renderer.webgl.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Tile} tileLayer Tile layer. + */ +ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) { + + goog.base(this, mapRenderer, tileLayer); + + /** + * @private + * @type {ol.webgl.shader.Fragment} + */ + this.fragmentShader_ = + ol.renderer.webgl.tilelayer.shader.Fragment.getInstance(); + + /** + * @private + * @type {ol.webgl.shader.Vertex} + */ + this.vertexShader_ = ol.renderer.webgl.tilelayer.shader.Vertex.getInstance(); + + /** + * @private + * @type {ol.renderer.webgl.tilelayer.shader.Locations} + */ + this.locations_ = null; + + /** + * @private + * @type {ol.structs.Buffer} + */ + this.renderArrayBuffer_ = new ol.structs.Buffer([ + 0, 0, 0, 1, + 1, 0, 1, 1, + 0, 1, 0, 0, + 1, 1, 1, 0 + ]); + + /** + * @private + * @type {ol.TileRange} + */ + this.renderedTileRange_ = null; + + /** + * @private + * @type {ol.Extent} + */ + this.renderedFramebufferExtent_ = null; + + /** + * @private + * @type {number} + */ + this.renderedRevision_ = -1; + +}; +goog.inherits(ol.renderer.webgl.TileLayer, ol.renderer.webgl.Layer); + + +/** + * @inheritDoc + */ +ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() { + var mapRenderer = this.getWebGLMapRenderer(); + var context = mapRenderer.getContext(); + context.deleteBuffer(this.renderArrayBuffer_); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @inheritDoc + */ +ol.renderer.webgl.TileLayer.prototype.handleWebGLContextLost = function() { + goog.base(this, 'handleWebGLContextLost'); + this.locations_ = null; +}; + + +/** + * @inheritDoc + */ +ol.renderer.webgl.TileLayer.prototype.prepareFrame = + function(frameState, layerState) { + + var mapRenderer = this.getWebGLMapRenderer(); + var context = mapRenderer.getContext(); + var gl = mapRenderer.getGL(); + + var view2DState = frameState.view2DState; + var projection = view2DState.projection; + + var tileLayer = this.getLayer(); + goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile); + var tileSource = tileLayer.getSource(); + goog.asserts.assertInstanceof(tileSource, ol.source.Tile); + var tileGrid = tileSource.getTileGridForProjection(projection); + var z = tileGrid.getZForResolution(view2DState.resolution); + var tileResolution = tileGrid.getResolution(z); + + var tilePixelSize = + tileSource.getTilePixelSize(z, frameState.pixelRatio, projection); + var pixelRatio = tilePixelSize / tileGrid.getTileSize(z); + var tilePixelResolution = tileResolution / pixelRatio; + var tileGutter = tileSource.getGutter(); + + var center = view2DState.center; + var extent; + if (tileResolution == view2DState.resolution) { + center = this.snapCenterToPixel(center, tileResolution, frameState.size); + extent = ol.extent.getForView2DAndSize( + center, tileResolution, view2DState.rotation, frameState.size); + } else { + extent = frameState.extent; + } + var tileRange = tileGrid.getTileRangeForExtentAndResolution( + extent, tileResolution); + + var framebufferExtent; + if (!goog.isNull(this.renderedTileRange_) && + this.renderedTileRange_.equals(tileRange) && + this.renderedRevision_ == tileSource.getRevision()) { + framebufferExtent = this.renderedFramebufferExtent_; + } else { + + var tileRangeSize = tileRange.getSize(); + + var maxDimension = Math.max( + tileRangeSize[0] * tilePixelSize, tileRangeSize[1] * tilePixelSize); + var framebufferDimension = ol.math.roundUpToPowerOfTwo(maxDimension); + var framebufferExtentDimension = tilePixelResolution * framebufferDimension; + var origin = tileGrid.getOrigin(z); + var minX = origin[0] + tileRange.minX * tilePixelSize * tilePixelResolution; + var minY = origin[1] + tileRange.minY * tilePixelSize * tilePixelResolution; + framebufferExtent = [ + minX, minY, + minX + framebufferExtentDimension, minY + framebufferExtentDimension + ]; + + this.bindFramebuffer(frameState, framebufferDimension); + gl.viewport(0, 0, framebufferDimension, framebufferDimension); + + gl.clearColor(0, 0, 0, 0); + gl.clear(goog.webgl.COLOR_BUFFER_BIT); + gl.disable(goog.webgl.BLEND); + + var program = context.getProgram(this.fragmentShader_, this.vertexShader_); + context.useProgram(program); + if (goog.isNull(this.locations_)) { + this.locations_ = + new ol.renderer.webgl.tilelayer.shader.Locations(gl, program); + } + + context.bindBuffer(goog.webgl.ARRAY_BUFFER, this.renderArrayBuffer_); + gl.enableVertexAttribArray(this.locations_.a_position); + gl.vertexAttribPointer( + this.locations_.a_position, 2, goog.webgl.FLOAT, false, 16, 0); + gl.enableVertexAttribArray(this.locations_.a_texCoord); + gl.vertexAttribPointer( + this.locations_.a_texCoord, 2, goog.webgl.FLOAT, false, 16, 8); + gl.uniform1i(this.locations_.u_texture, 0); + + /** + * @type {Object.>} + */ + var tilesToDrawByZ = {}; + tilesToDrawByZ[z] = {}; + + var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { + return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED && + mapRenderer.isTileTextureLoaded(tile); + }, tileSource, pixelRatio, projection); + var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, + tilesToDrawByZ, getTileIfLoaded); + + var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError(); + if (!goog.isDef(useInterimTilesOnError)) { + useInterimTilesOnError = true; + } + + var allTilesLoaded = true; + var tmpExtent = ol.extent.createEmpty(); + var tmpTileRange = new ol.TileRange(0, 0, 0, 0); + var childTileRange, fullyLoaded, tile, tileState, x, y; + for (x = tileRange.minX; x <= tileRange.maxX; ++x) { + for (y = tileRange.minY; y <= tileRange.maxY; ++y) { + + tile = tileSource.getTile(z, x, y, pixelRatio, projection); + tileState = tile.getState(); + if (tileState == ol.TileState.LOADED) { + if (mapRenderer.isTileTextureLoaded(tile)) { + tilesToDrawByZ[z][tile.tileCoord.toString()] = tile; + continue; + } + } else if (tileState == ol.TileState.EMPTY || + (tileState == ol.TileState.ERROR && + !useInterimTilesOnError)) { + continue; + } + + allTilesLoaded = false; + fullyLoaded = tileGrid.forEachTileCoordParentTileRange( + tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent); + if (!fullyLoaded) { + childTileRange = tileGrid.getTileCoordChildTileRange( + tile.tileCoord, tmpTileRange, tmpExtent); + if (!goog.isNull(childTileRange)) { + findLoadedTiles(z + 1, childTileRange); + } + } + + } + + } + + /** @type {Array.} */ + var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number); + goog.array.sort(zs); + var u_tileOffset = goog.vec.Vec4.createFloat32(); + var i, ii, sx, sy, tileExtent, tileKey, tilesToDraw, tx, ty; + for (i = 0, ii = zs.length; i < ii; ++i) { + tilesToDraw = tilesToDrawByZ[zs[i]]; + for (tileKey in tilesToDraw) { + tile = tilesToDraw[tileKey]; + tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent); + sx = 2 * (tileExtent[2] - tileExtent[0]) / + framebufferExtentDimension; + sy = 2 * (tileExtent[3] - tileExtent[1]) / + framebufferExtentDimension; + tx = 2 * (tileExtent[0] - framebufferExtent[0]) / + framebufferExtentDimension - 1; + ty = 2 * (tileExtent[1] - framebufferExtent[1]) / + framebufferExtentDimension - 1; + goog.vec.Vec4.setFromValues(u_tileOffset, sx, sy, tx, ty); + gl.uniform4fv(this.locations_.u_tileOffset, u_tileOffset); + mapRenderer.bindTileTexture(tile, tilePixelSize, + tileGutter * pixelRatio, goog.webgl.LINEAR, goog.webgl.LINEAR); + gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); + } + } + + if (allTilesLoaded) { + this.renderedTileRange_ = tileRange; + this.renderedFramebufferExtent_ = framebufferExtent; + this.renderedRevision_ = tileSource.getRevision(); + } else { + this.renderedTileRange_ = null; + this.renderedFramebufferExtent_ = null; + this.renderedRevision_ = -1; + frameState.animate = true; + } + + } + + this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); + var tileTextureQueue = mapRenderer.getTileTextureQueue(); + this.manageTilePyramid( + frameState, tileSource, tileGrid, pixelRatio, projection, extent, z, + tileLayer.getPreload(), + /** + * @param {ol.Tile} tile Tile. + */ + function(tile) { + if (tile.getState() == ol.TileState.LOADED && + !mapRenderer.isTileTextureLoaded(tile) && + !tileTextureQueue.isKeyQueued(tile.getKey())) { + tileTextureQueue.enqueue([ + tile, + tileGrid.getTileCoordCenter(tile.tileCoord), + tileGrid.getResolution(tile.tileCoord.z), + tilePixelSize, tileGutter * pixelRatio + ]); + } + }, this); + this.scheduleExpireCache(frameState, tileSource); + this.updateLogos(frameState, tileSource); + + var texCoordMatrix = this.texCoordMatrix; + goog.vec.Mat4.makeIdentity(texCoordMatrix); + goog.vec.Mat4.translate(texCoordMatrix, + (center[0] - framebufferExtent[0]) / + (framebufferExtent[2] - framebufferExtent[0]), + (center[1] - framebufferExtent[1]) / + (framebufferExtent[3] - framebufferExtent[1]), + 0); + if (view2DState.rotation !== 0) { + goog.vec.Mat4.rotateZ(texCoordMatrix, view2DState.rotation); + } + goog.vec.Mat4.scale(texCoordMatrix, + frameState.size[0] * view2DState.resolution / + (framebufferExtent[2] - framebufferExtent[0]), + frameState.size[1] * view2DState.resolution / + (framebufferExtent[3] - framebufferExtent[1]), + 1); + goog.vec.Mat4.translate(texCoordMatrix, + -0.5, + -0.5, + 0); + +}; diff --git a/float-no-zero/ol/ol/renderer/webgl/webgltilelayershader.js b/float-no-zero/ol/ol/renderer/webgl/webgltilelayershader.js new file mode 100644 index 0000000000..6cbb58103b --- /dev/null +++ b/float-no-zero/ol/ol/renderer/webgl/webgltilelayershader.js @@ -0,0 +1,111 @@ +// This file is automatically generated, do not edit +goog.provide('ol.renderer.webgl.tilelayer.shader'); + +goog.require('ol.webgl.shader'); + + + +/** + * @constructor + * @extends {ol.webgl.shader.Fragment} + * @struct + */ +ol.renderer.webgl.tilelayer.shader.Fragment = function() { + goog.base(this, ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE); +}; +goog.inherits(ol.renderer.webgl.tilelayer.shader.Fragment, ol.webgl.shader.Fragment); +goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Fragment); + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\nvarying vec2 v_texCoord;\n\n\nuniform sampler2D u_texture;\n\nvoid main(void) {\n gl_FragColor = texture2D(u_texture, v_texCoord);\n}\n'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform sampler2D e;void main(void){gl_FragColor=texture2D(e,a);}'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE = goog.DEBUG ? + ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE : + ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE; + + + +/** + * @constructor + * @extends {ol.webgl.shader.Vertex} + * @struct + */ +ol.renderer.webgl.tilelayer.shader.Vertex = function() { + goog.base(this, ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE); +}; +goog.inherits(ol.renderer.webgl.tilelayer.shader.Vertex, ol.webgl.shader.Vertex); +goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Vertex); + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE = 'varying vec2 v_texCoord;\n\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\nuniform vec4 u_tileOffset;\n\nvoid main(void) {\n gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);\n v_texCoord = a_texCoord;\n}\n\n\n'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 b;attribute vec2 c;uniform vec4 d;void main(void){gl_Position=vec4(b*d.xy+d.zw,0.,1.);a=c;}'; + + +/** + * @const + * @type {string} + */ +ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE = goog.DEBUG ? + ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE : + ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE; + + + +/** + * @constructor + * @param {WebGLRenderingContext} gl GL. + * @param {WebGLProgram} program Program. + * @struct + */ +ol.renderer.webgl.tilelayer.shader.Locations = function(gl, program) { + + /** + * @type {WebGLUniformLocation} + */ + this.u_texture = gl.getUniformLocation( + program, goog.DEBUG ? 'u_texture' : 'e'); + + /** + * @type {WebGLUniformLocation} + */ + this.u_tileOffset = gl.getUniformLocation( + program, goog.DEBUG ? 'u_tileOffset' : 'd'); + + /** + * @type {number} + */ + this.a_position = gl.getAttribLocation( + program, goog.DEBUG ? 'a_position' : 'b'); + + /** + * @type {number} + */ + this.a_texCoord = gl.getAttribLocation( + program, goog.DEBUG ? 'a_texCoord' : 'c'); +}; diff --git a/float-no-zero/ol/ol/resolutionconstraint.js b/float-no-zero/ol/ol/resolutionconstraint.js new file mode 100644 index 0000000000..a90162d6b5 --- /dev/null +++ b/float-no-zero/ol/ol/resolutionconstraint.js @@ -0,0 +1,76 @@ +goog.provide('ol.ResolutionConstraint'); +goog.provide('ol.ResolutionConstraintType'); + +goog.require('goog.math'); +goog.require('ol.array'); + + +/** + * @typedef {function((number|undefined), number, number): (number|undefined)} + */ +ol.ResolutionConstraintType; + + +/** + * @param {Array.} resolutions Resolutions. + * @return {ol.ResolutionConstraintType} Zoom function. + */ +ol.ResolutionConstraint.createSnapToResolutions = + function(resolutions) { + return ( + /** + * @param {number|undefined} resolution Resolution. + * @param {number} delta Delta. + * @param {number} direction Direction. + * @return {number|undefined} Resolution. + */ + function(resolution, delta, direction) { + if (goog.isDef(resolution)) { + var z = + ol.array.linearFindNearest(resolutions, resolution, direction); + z = goog.math.clamp(z + delta, 0, resolutions.length - 1); + return resolutions[z]; + } else { + return undefined; + } + }); +}; + + +/** + * @param {number} power Power. + * @param {number} maxResolution Maximum resolution. + * @param {number=} opt_maxLevel Maximum level. + * @return {ol.ResolutionConstraintType} Zoom function. + */ +ol.ResolutionConstraint.createSnapToPower = + function(power, maxResolution, opt_maxLevel) { + return ( + /** + * @param {number|undefined} resolution Resolution. + * @param {number} delta Delta. + * @param {number} direction Direction. + * @return {number|undefined} Resolution. + */ + function(resolution, delta, direction) { + if (goog.isDef(resolution)) { + var offset; + if (direction > 0) { + offset = 0; + } else if (direction < 0) { + offset = 1; + } else { + offset = 0.5; + } + var oldLevel = Math.floor( + Math.log(maxResolution / resolution) / Math.log(power) + offset); + var newLevel = Math.max(oldLevel + delta, 0); + if (goog.isDef(opt_maxLevel)) { + newLevel = Math.min(newLevel, opt_maxLevel); + } + return maxResolution / Math.pow(power, newLevel); + } else { + return undefined; + } + }); +}; diff --git a/float-no-zero/ol/ol/rotationconstraint.js b/float-no-zero/ol/ol/rotationconstraint.js new file mode 100644 index 0000000000..fc73600f4e --- /dev/null +++ b/float-no-zero/ol/ol/rotationconstraint.js @@ -0,0 +1,87 @@ +goog.provide('ol.RotationConstraint'); +goog.provide('ol.RotationConstraintType'); + +goog.require('goog.math'); + + +/** + * @typedef {function((number|undefined), number): (number|undefined)} + */ +ol.RotationConstraintType; + + +/** + * @param {number|undefined} rotation Rotation. + * @param {number} delta Delta. + * @return {number|undefined} Rotation. + */ +ol.RotationConstraint.disable = function(rotation, delta) { + if (goog.isDef(rotation)) { + return 0; + } else { + return undefined; + } +}; + + +/** + * @param {number|undefined} rotation Rotation. + * @param {number} delta Delta. + * @return {number|undefined} Rotation. + */ +ol.RotationConstraint.none = function(rotation, delta) { + if (goog.isDef(rotation)) { + return rotation + delta; + } else { + return undefined; + } +}; + + +/** + * @param {number} n N. + * @return {ol.RotationConstraintType} Rotation constraint. + */ +ol.RotationConstraint.createSnapToN = function(n) { + var theta = 2 * Math.PI / n; + return ( + /** + * @param {number|undefined} rotation Rotation. + * @param {number} delta Delta. + * @return {number|undefined} Rotation. + */ + function(rotation, delta) { + if (goog.isDef(rotation)) { + rotation = Math.floor((rotation + delta) / theta + 0.5) * theta; + return rotation; + } else { + return undefined; + } + }); +}; + + +/** + * @param {number=} opt_tolerance Tolerance. + * @return {ol.RotationConstraintType} Rotation constraint. + */ +ol.RotationConstraint.createSnapToZero = function(opt_tolerance) { + var tolerance = opt_tolerance || goog.math.toRadians(5); + return ( + /** + * @param {number|undefined} rotation Rotation. + * @param {number} delta Delta. + * @return {number|undefined} Rotation. + */ + function(rotation, delta) { + if (goog.isDef(rotation)) { + if (Math.abs(rotation + delta) <= tolerance) { + return 0; + } else { + return rotation + delta; + } + } else { + return undefined; + } + }); +}; diff --git a/float-no-zero/ol/ol/size.js b/float-no-zero/ol/ol/size.js new file mode 100644 index 0000000000..f4305b8046 --- /dev/null +++ b/float-no-zero/ol/ol/size.js @@ -0,0 +1,21 @@ +goog.provide('ol.Size'); +goog.provide('ol.size'); + + +/** + * An array of numbers representing a size: `[width, height]`. + * @typedef {Array.} ol.Size + * @todo stability experimental + */ +ol.Size; + + +/** + * Compares sizes for equality. + * @param {ol.Size} a Size. + * @param {ol.Size} b Size. + * @return {boolean} Equals. + */ +ol.size.equals = function(a, b) { + return a[0] == b[0] && a[1] == b[1]; +}; diff --git a/float-no-zero/ol/ol/source.jsdoc b/float-no-zero/ol/ol/source.jsdoc new file mode 100644 index 0000000000..7c86502e0e --- /dev/null +++ b/float-no-zero/ol/ol/source.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.source + */ diff --git a/float-no-zero/ol/ol/source/bingmapssource.exports b/float-no-zero/ol/ol/source/bingmapssource.exports new file mode 100644 index 0000000000..5f7481f7c9 --- /dev/null +++ b/float-no-zero/ol/ol/source/bingmapssource.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.source.BingMaps +@exportProperty ol.source.BingMaps.TOS_ATTRIBUTION diff --git a/float-no-zero/ol/ol/source/bingmapssource.js b/float-no-zero/ol/ol/source/bingmapssource.js new file mode 100644 index 0000000000..c060ee88e1 --- /dev/null +++ b/float-no-zero/ol/ol/source/bingmapssource.js @@ -0,0 +1,159 @@ +goog.provide('ol.source.BingMaps'); + +goog.require('goog.Uri'); +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.net.Jsonp'); +goog.require('ol.Attribution'); +goog.require('ol.TileRange'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.extent'); +goog.require('ol.proj'); +goog.require('ol.source.State'); +goog.require('ol.source.TileImage'); +goog.require('ol.tilegrid.XYZ'); + + + +/** + * @constructor + * @extends {ol.source.TileImage} + * @param {olx.source.BingMapsOptions} options Bing Maps options. + * @todo stability experimental + */ +ol.source.BingMaps = function(options) { + + goog.base(this, { + crossOrigin: 'anonymous', + opaque: true, + projection: ol.proj.get('EPSG:3857'), + state: ol.source.State.LOADING, + tileLoadFunction: options.tileLoadFunction + }); + + /** + * @private + * @type {string} + */ + this.culture_ = goog.isDef(options.culture) ? options.culture : 'en-us'; + + var uri = new goog.Uri( + '//dev.virtualearth.net/REST/v1/Imagery/Metadata/' + options.imagerySet); + var jsonp = new goog.net.Jsonp(uri, 'jsonp'); + jsonp.send({ + 'include': 'ImageryProviders', + 'key': options.key + }, goog.bind(this.handleImageryMetadataResponse, this)); + +}; +goog.inherits(ol.source.BingMaps, ol.source.TileImage); + + +/** + * @const + * @type {ol.Attribution} + */ +ol.source.BingMaps.TOS_ATTRIBUTION = new ol.Attribution({ + html: '' + + 'Terms of Use' +}); + + +/** + * @param {BingMapsImageryMetadataResponse} response Response. + */ +ol.source.BingMaps.prototype.handleImageryMetadataResponse = + function(response) { + + if (response.statusCode != 200 || + response.statusDescription != 'OK' || + response.authenticationResultCode != 'ValidCredentials' || + response.resourceSets.length != 1 || + response.resourceSets[0].resources.length != 1) { + this.setState(ol.source.State.ERROR); + return; + } + + var brandLogoUri = response.brandLogoUri; + //var copyright = response.copyright; // FIXME do we need to display this? + var resource = response.resourceSets[0].resources[0]; + + goog.asserts.assert(resource.imageWidth == resource.imageHeight); + var tileGrid = new ol.tilegrid.XYZ({ + minZoom: resource.zoomMin, + maxZoom: resource.zoomMax, + tileSize: resource.imageWidth + }); + this.tileGrid = tileGrid; + + var culture = this.culture_; + this.tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + tileGrid.createTileCoordTransform(), + ol.TileUrlFunction.createFromTileUrlFunctions( + goog.array.map( + resource.imageUrlSubdomains, + function(subdomain) { + var imageUrl = resource.imageUrl + .replace('{subdomain}', subdomain) + .replace('{culture}', culture); + return ( + /** + * @this {ol.source.BingMaps} + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} Tile URL. + */ + function(tileCoord, pixelRatio, projection) { + goog.asserts.assert(ol.proj.equivalent( + projection, this.getProjection())); + if (goog.isNull(tileCoord)) { + return undefined; + } else { + return imageUrl.replace( + '{quadkey}', tileCoord.quadKey()); + } + }); + }))); + + if (resource.imageryProviders) { + var transform = ol.proj.getTransformFromProjections( + ol.proj.get('EPSG:4326'), this.getProjection()); + + var attributions = goog.array.map( + resource.imageryProviders, + function(imageryProvider) { + var html = imageryProvider.attribution; + /** @type {Object.>} */ + var tileRanges = {}; + goog.array.forEach( + imageryProvider.coverageAreas, + function(coverageArea) { + var minZ = coverageArea.zoomMin; + var maxZ = coverageArea.zoomMax; + var bbox = coverageArea.bbox; + var epsg4326Extent = [bbox[1], bbox[0], bbox[3], bbox[2]]; + var extent = ol.extent.transform(epsg4326Extent, transform); + var tileRange, z, zKey; + for (z = minZ; z <= maxZ; ++z) { + zKey = z.toString(); + tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); + if (zKey in tileRanges) { + tileRanges[zKey].push(tileRange); + } else { + tileRanges[zKey] = [tileRange]; + } + } + }); + return new ol.Attribution({html: html, tileRanges: tileRanges}); + }); + attributions.push(ol.source.BingMaps.TOS_ATTRIBUTION); + this.setAttributions(attributions); + } + + this.setLogo(brandLogoUri); + + this.setState(ol.source.State.READY); + +}; diff --git a/float-no-zero/ol/ol/source/debugtilesource.exports b/float-no-zero/ol/ol/source/debugtilesource.exports new file mode 100644 index 0000000000..35fcf0c02e --- /dev/null +++ b/float-no-zero/ol/ol/source/debugtilesource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.TileDebug diff --git a/float-no-zero/ol/ol/source/debugtilesource.js b/float-no-zero/ol/ol/source/debugtilesource.js new file mode 100644 index 0000000000..3bc6f69fd3 --- /dev/null +++ b/float-no-zero/ol/ol/source/debugtilesource.js @@ -0,0 +1,137 @@ +goog.provide('ol.source.TileDebug'); + +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('ol.Tile'); +goog.require('ol.TileCache'); +goog.require('ol.TileCoord'); +goog.require('ol.TileState'); +goog.require('ol.source.Tile'); +goog.require('ol.tilegrid.TileGrid'); + + + +/** + * @constructor + * @extends {ol.Tile} + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.tilegrid.TileGrid} tileGrid Tile grid. + * @private + */ +ol.DebugTile_ = function(tileCoord, tileGrid) { + + goog.base(this, tileCoord, ol.TileState.LOADED); + + /** + * @private + * @type {ol.TileCoord} + */ + this.tileCoord_ = tileCoord; + + /** + * @private + * @type {number} + */ + this.tileSize_ = tileGrid.getTileSize(tileCoord.z); + + /** + * @private + * @type {Object.} + */ + this.canvasByContext_ = {}; + +}; +goog.inherits(ol.DebugTile_, ol.Tile); + + +/** + * @inheritDoc + */ +ol.DebugTile_.prototype.getImage = function(opt_context) { + var key = goog.isDef(opt_context) ? goog.getUid(opt_context) : -1; + if (key in this.canvasByContext_) { + return this.canvasByContext_[key]; + } else { + + var tileSize = this.tileSize_; + + var canvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas.width = tileSize; + canvas.height = tileSize; + + var context = /** @type {CanvasRenderingContext2D} */ + (canvas.getContext('2d')); + + context.strokeStyle = 'black'; + context.strokeRect(0.5, 0.5, tileSize + 0.5, tileSize + 0.5); + + context.fillStyle = 'black'; + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.font = '24px sans-serif'; + context.fillText( + this.tileCoord_.toString(), tileSize / 2, tileSize / 2); + + this.canvasByContext_[key] = canvas; + return canvas; + + } +}; + + + +/** + * @constructor + * @extends {ol.source.Tile} + * @param {olx.source.TileDebugOptions} options Debug tile options. + * @todo stability experimental + */ +ol.source.TileDebug = function(options) { + + goog.base(this, { + extent: options.extent, + opaque: false, + projection: options.projection, + tileGrid: options.tileGrid + }); + + /** + * @private + * @type {ol.TileCache} + */ + this.tileCache_ = new ol.TileCache(); + +}; +goog.inherits(ol.source.TileDebug, ol.source.Tile); + + +/** + * @inheritDoc + */ +ol.source.TileDebug.prototype.canExpireCache = function() { + return this.tileCache_.canExpireCache(); +}; + + +/** + * @inheritDoc + */ +ol.source.TileDebug.prototype.expireCache = function(usedTiles) { + this.tileCache_.expireCache(usedTiles); +}; + + +/** + * @inheritDoc + */ +ol.source.TileDebug.prototype.getTile = function(z, x, y) { + var tileCoordKey = this.getKeyZXY(z, x, y); + if (this.tileCache_.containsKey(tileCoordKey)) { + return /** @type {!ol.DebugTile_} */ (this.tileCache_.get(tileCoordKey)); + } else { + var tile = new ol.DebugTile_(new ol.TileCoord(z, x, y), this.tileGrid); + this.tileCache_.set(tileCoordKey, tile); + return tile; + } +}; diff --git a/float-no-zero/ol/ol/source/geojsonsource.exports b/float-no-zero/ol/ol/source/geojsonsource.exports new file mode 100644 index 0000000000..52f49004f2 --- /dev/null +++ b/float-no-zero/ol/ol/source/geojsonsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.GeoJSON diff --git a/float-no-zero/ol/ol/source/geojsonsource.js b/float-no-zero/ol/ol/source/geojsonsource.js new file mode 100644 index 0000000000..67aa42b4ca --- /dev/null +++ b/float-no-zero/ol/ol/source/geojsonsource.js @@ -0,0 +1,33 @@ +goog.provide('ol.source.GeoJSON'); + +goog.require('ol.format.GeoJSON'); +goog.require('ol.source.VectorFile'); + + + +/** + * @constructor + * @extends {ol.source.VectorFile} + * @param {olx.source.GeoJSONOptions=} opt_options Options. + * @todo stability experimental + */ +ol.source.GeoJSON = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, { + attributions: options.attributions, + extent: options.extent, + format: new ol.format.GeoJSON({ + defaultProjection: options.defaultProjection + }), + logo: options.logo, + object: options.object, + projection: options.projection, + text: options.text, + url: options.url, + urls: options.urls + }); + +}; +goog.inherits(ol.source.GeoJSON, ol.source.VectorFile); diff --git a/float-no-zero/ol/ol/source/gpxsource.exports b/float-no-zero/ol/ol/source/gpxsource.exports new file mode 100644 index 0000000000..0dfabb47be --- /dev/null +++ b/float-no-zero/ol/ol/source/gpxsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.GPX diff --git a/float-no-zero/ol/ol/source/gpxsource.js b/float-no-zero/ol/ol/source/gpxsource.js new file mode 100644 index 0000000000..5edd1e1a6f --- /dev/null +++ b/float-no-zero/ol/ol/source/gpxsource.js @@ -0,0 +1,32 @@ +goog.provide('ol.source.GPX'); + +goog.require('ol.format.GPX'); +goog.require('ol.source.VectorFile'); + + + +/** + * @constructor + * @extends {ol.source.VectorFile} + * @param {olx.source.GPXOptions=} opt_options Options. + * @todo stability experimental + */ +ol.source.GPX = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, { + attributions: options.attributions, + doc: options.doc, + extent: options.extent, + format: new ol.format.GPX(), + logo: options.logo, + node: options.node, + projection: options.projection, + text: options.text, + url: options.url, + urls: options.urls + }); + +}; +goog.inherits(ol.source.GPX, ol.source.VectorFile); diff --git a/float-no-zero/ol/ol/source/igcsource.exports b/float-no-zero/ol/ol/source/igcsource.exports new file mode 100644 index 0000000000..6d4292225e --- /dev/null +++ b/float-no-zero/ol/ol/source/igcsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.IGC diff --git a/float-no-zero/ol/ol/source/igcsource.js b/float-no-zero/ol/ol/source/igcsource.js new file mode 100644 index 0000000000..3548e139e7 --- /dev/null +++ b/float-no-zero/ol/ol/source/igcsource.js @@ -0,0 +1,29 @@ +goog.provide('ol.source.IGC'); + +goog.require('ol.format.IGC'); +goog.require('ol.source.VectorFile'); + + + +/** + * @constructor + * @extends {ol.source.VectorFile} + * @param {olx.source.IGCOptions=} opt_options Options. + * @todo stability experimental + */ +ol.source.IGC = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, { + format: new ol.format.IGC({ + altitudeMode: options.altitudeMode + }), + projection: options.projection, + text: options.text, + url: options.url, + urls: options.urls + }); + +}; +goog.inherits(ol.source.IGC, ol.source.VectorFile); diff --git a/float-no-zero/ol/ol/source/imagecanvassource.exports b/float-no-zero/ol/ol/source/imagecanvassource.exports new file mode 100644 index 0000000000..280f37c7f2 --- /dev/null +++ b/float-no-zero/ol/ol/source/imagecanvassource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.ImageCanvas diff --git a/float-no-zero/ol/ol/source/imagecanvassource.js b/float-no-zero/ol/ol/source/imagecanvassource.js new file mode 100644 index 0000000000..33d5a9a0fe --- /dev/null +++ b/float-no-zero/ol/ol/source/imagecanvassource.js @@ -0,0 +1,88 @@ +goog.provide('ol.source.ImageCanvas'); + +goog.require('ol.CanvasFunctionType'); +goog.require('ol.ImageCanvas'); +goog.require('ol.extent'); +goog.require('ol.source.Image'); + + + +/** + * @constructor + * @extends {ol.source.Image} + * @param {olx.source.ImageCanvasOptions} options + * @todo stability experimental + */ +ol.source.ImageCanvas = function(options) { + + goog.base(this, { + attributions: options.attributions, + extent: options.extent, + logo: options.logo, + projection: options.projection, + resolutions: options.resolutions, + state: options.state + }); + + /** + * @private + * @type {ol.CanvasFunctionType} + */ + this.canvasFunction_ = options.canvasFunction; + + /** + * @private + * @type {ol.ImageCanvas} + */ + this.canvas_ = null; + + /** + * @private + * @type {number} + */ + this.renderedRevision_ = 0; + + /** + * @private + * @type {number} + */ + this.ratio_ = goog.isDef(options.ratio) ? + options.ratio : 1.5; + +}; +goog.inherits(ol.source.ImageCanvas, ol.source.Image); + + +/** + * @inheritDoc + */ +ol.source.ImageCanvas.prototype.getImage = + function(extent, resolution, pixelRatio, projection) { + resolution = this.findNearestResolution(resolution); + + var canvas = this.canvas_; + if (!goog.isNull(canvas) && + this.renderedRevision_ == this.getRevision() && + canvas.getResolution() == resolution && + canvas.getPixelRatio() == pixelRatio && + ol.extent.containsExtent(canvas.getExtent(), extent)) { + return canvas; + } + + extent = extent.slice(); + ol.extent.scaleFromCenter(extent, this.ratio_); + var width = (extent[2] - extent[0]) / resolution; + var height = (extent[3] - extent[1]) / resolution; + var size = [width * pixelRatio, height * pixelRatio]; + + var canvasElement = this.canvasFunction_( + extent, resolution, pixelRatio, size, projection); + if (!goog.isNull(canvasElement)) { + canvas = new ol.ImageCanvas(extent, resolution, pixelRatio, + this.getAttributions(), canvasElement); + } + this.canvas_ = canvas; + this.renderedRevision_ = this.getRevision(); + + return canvas; +}; diff --git a/float-no-zero/ol/ol/source/imagesource.js b/float-no-zero/ol/ol/source/imagesource.js new file mode 100644 index 0000000000..4e8ea558d3 --- /dev/null +++ b/float-no-zero/ol/ol/source/imagesource.js @@ -0,0 +1,86 @@ +goog.provide('ol.source.Image'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('ol.Attribution'); +goog.require('ol.Extent'); +goog.require('ol.Image'); +goog.require('ol.array'); +goog.require('ol.source.Source'); + + +/** + * @typedef {{attributions: (Array.|undefined), + * extent: (null|ol.Extent|undefined), + * logo: (string|undefined), + * projection: ol.proj.ProjectionLike, + * resolutions: (Array.|undefined), + * state: (ol.source.State|string|undefined)}} + */ +ol.source.ImageOptions; + + + +/** + * @constructor + * @extends {ol.source.Source} + * @param {ol.source.ImageOptions} options Single image source options. + * @todo stability experimental + */ +ol.source.Image = function(options) { + + goog.base(this, { + attributions: options.attributions, + extent: options.extent, + logo: options.logo, + projection: options.projection, + state: options.state + }); + + /** + * @private + * @type {Array.} + */ + this.resolutions_ = goog.isDef(options.resolutions) ? + options.resolutions : null; + goog.asserts.assert(goog.isNull(this.resolutions_) || + goog.array.isSorted(this.resolutions_, + function(a, b) { + return b - a; + }, true)); + +}; +goog.inherits(ol.source.Image, ol.source.Source); + + +/** + * @return {Array.} Resolutions. + */ +ol.source.Image.prototype.getResolutions = function() { + return this.resolutions_; +}; + + +/** + * @protected + * @param {number} resolution Resolution. + * @return {number} Resolution. + */ +ol.source.Image.prototype.findNearestResolution = + function(resolution) { + if (!goog.isNull(this.resolutions_)) { + var idx = ol.array.linearFindNearest(this.resolutions_, resolution, 0); + resolution = this.resolutions_[idx]; + } + return resolution; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {ol.ImageBase} Single image. + */ +ol.source.Image.prototype.getImage = goog.abstractMethod; diff --git a/float-no-zero/ol/ol/source/imagestaticsource.exports b/float-no-zero/ol/ol/source/imagestaticsource.exports new file mode 100644 index 0000000000..b07c04a34a --- /dev/null +++ b/float-no-zero/ol/ol/source/imagestaticsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.ImageStatic diff --git a/float-no-zero/ol/ol/source/imagestaticsource.js b/float-no-zero/ol/ol/source/imagestaticsource.js new file mode 100644 index 0000000000..52d9052570 --- /dev/null +++ b/float-no-zero/ol/ol/source/imagestaticsource.js @@ -0,0 +1,56 @@ +goog.provide('ol.source.ImageStatic'); + +goog.require('ol.Image'); +goog.require('ol.extent'); +goog.require('ol.proj'); +goog.require('ol.source.Image'); + + + +/** + * @constructor + * @extends {ol.source.Image} + * @param {olx.source.ImageStaticOptions} options Options. + * @todo stability experimental + */ +ol.source.ImageStatic = function(options) { + + var attributions = goog.isDef(options.attributions) ? + options.attributions : null; + var crossOrigin = goog.isDef(options.crossOrigin) ? + options.crossOrigin : null; + var imageExtent = options.imageExtent; + var imageSize = options.imageSize; + var imageResolution = (imageExtent[3] - imageExtent[1]) / imageSize[1]; + var imageUrl = options.url; + var projection = ol.proj.get(options.projection); + + goog.base(this, { + attributions: attributions, + extent: options.extent, + logo: options.logo, + projection: projection, + resolutions: [imageResolution] + }); + + /** + * @private + * @type {ol.Image} + */ + this.image_ = new ol.Image(imageExtent, imageResolution, 1, attributions, + imageUrl, crossOrigin); + +}; +goog.inherits(ol.source.ImageStatic, ol.source.Image); + + +/** + * @inheritDoc + */ +ol.source.ImageStatic.prototype.getImage = + function(extent, resolution, pixelRatio, projection) { + if (ol.extent.intersects(extent, this.image_.getExtent())) { + return this.image_; + } + return null; +}; diff --git a/float-no-zero/ol/ol/source/imagevectorsource.exports b/float-no-zero/ol/ol/source/imagevectorsource.exports new file mode 100644 index 0000000000..17ff190f77 --- /dev/null +++ b/float-no-zero/ol/ol/source/imagevectorsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.ImageVector diff --git a/float-no-zero/ol/ol/source/imagevectorsource.js b/float-no-zero/ol/ol/source/imagevectorsource.js new file mode 100644 index 0000000000..16861f4bfc --- /dev/null +++ b/float-no-zero/ol/ol/source/imagevectorsource.js @@ -0,0 +1,237 @@ +goog.provide('ol.source.ImageVector'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.vec.Mat4'); +goog.require('ol.extent'); +goog.require('ol.feature'); +goog.require('ol.render.canvas.ReplayGroup'); +goog.require('ol.renderer.vector'); +goog.require('ol.source.ImageCanvas'); +goog.require('ol.source.Vector'); +goog.require('ol.vec.Mat4'); + + + +/** + * An image source whose images are canvas elements into which vector features + * read from a vector source (`ol.source.Vector`) are drawn. An + * `ol.source.ImageVector` object is to be used as the `source` of an image + * layer (`ol.layer.Image`). Image layers are rotated, scaled, and translated, + * as opposed to being re-rendered, during animations and interactions. So, like + * any other image layer, an image layer configured with an + * `ol.source.ImageVector` will exhibit this behaviour. This is in contrast to a + * vector layer, where vector features are re-drawn during animations and + * interactions. + * + * @constructor + * @extends {ol.source.ImageCanvas} + * @param {olx.source.ImageVectorOptions} options Options. + * @todo stability experimental + */ +ol.source.ImageVector = function(options) { + + /** + * @private + * @type {ol.source.Vector} + */ + this.source_ = options.source; + + /** + * @private + * @type {!ol.feature.StyleFunction} + */ + this.styleFunction_ = goog.isDef(options.style) ? + ol.feature.createStyleFunction(options.style) : + ol.feature.defaultStyleFunction; + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.transform_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {HTMLCanvasElement} + */ + this.canvasElement_ = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + + /** + * @private + * @type {CanvasRenderingContext2D} + */ + this.canvasContext_ = /** @type {CanvasRenderingContext2D} */ + (this.canvasElement_.getContext('2d')); + + /** + * @private + * @type {ol.Size} + */ + this.canvasSize_ = [0, 0]; + + /** + * @private + * @type {ol.render.canvas.ReplayGroup} + */ + this.replayGroup_ = null; + + goog.base(this, { + attributions: options.attributions, + canvasFunction: goog.bind(this.canvasFunctionInternal_, this), + extent: options.extent, + logo: options.logo, + projection: options.projection, + ratio: options.ratio, + resolutions: options.resolutions, + state: this.source_.getState() + }); + + goog.events.listen(this.source_, goog.events.EventType.CHANGE, + this.handleSourceChange_, undefined, this); + +}; +goog.inherits(ol.source.ImageVector, ol.source.ImageCanvas); + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.Size} size Size. + * @param {ol.proj.Projection} projection Projection; + * @return {HTMLCanvasElement} Canvas element. + * @private + */ +ol.source.ImageVector.prototype.canvasFunctionInternal_ = + function(extent, resolution, pixelRatio, size, projection) { + + var tolerance = resolution / (2 * pixelRatio); + var replayGroup = new ol.render.canvas.ReplayGroup(tolerance, extent); + + var loading = false; + this.source_.forEachFeatureInExtent(extent, + /** + * @param {ol.Feature} feature Feature. + */ + function(feature) { + loading = loading || + this.renderFeature_(feature, resolution, pixelRatio, replayGroup); + }, this); + replayGroup.finish(); + + if (loading) { + return null; + } + + if (this.canvasSize_[0] != size[0] || this.canvasSize_[1] != size[1]) { + this.canvasElement_.width = size[0]; + this.canvasElement_.height = size[1]; + this.canvasSize_[0] = size[0]; + this.canvasSize_[1] = size[1]; + } else { + this.canvasContext_.clearRect(0, 0, size[0], size[1]); + } + + var transform = this.getTransform_(ol.extent.getCenter(extent), + resolution, pixelRatio, size); + replayGroup.replay(this.canvasContext_, extent, pixelRatio, transform, 0, + goog.functions.TRUE); + + this.replayGroup_ = replayGroup; + + return this.canvasElement_; +}; + + +/** + * @inheritDoc + */ +ol.source.ImageVector.prototype.forEachFeatureAtPixel = + function(extent, resolution, rotation, coordinate, callback) { + if (goog.isNull(this.replayGroup_)) { + return undefined; + } else { + return this.replayGroup_.forEachGeometryAtPixel( + extent, resolution, 0, coordinate, goog.functions.TRUE, + /** + * @param {ol.geom.Geometry} geometry Geometry. + * @param {Object} data Data. + * @return {?} Callback result. + */ + function(geometry, data) { + var feature = /** @type {ol.Feature} */ (data); + return callback(feature); + }); + } +}; + + +/** + * @param {ol.Coordinate} center Center. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.Size} size Size. + * @return {!goog.vec.Mat4.Number} Transform. + * @private + */ +ol.source.ImageVector.prototype.getTransform_ = + function(center, resolution, pixelRatio, size) { + return ol.vec.Mat4.makeTransform2D(this.transform_, + size[0] / 2, size[1] / 2, + pixelRatio / resolution, -pixelRatio / resolution, + 0, + -center[0], -center[1]); +}; + + +/** + * Handle changes in image style state. + * @param {goog.events.Event} event Image style change event. + * @private + */ +ol.source.ImageVector.prototype.handleImageChange_ = + function(event) { + this.dispatchChangeEvent(); +}; + + +/** + * @private + */ +ol.source.ImageVector.prototype.handleSourceChange_ = function() { + // setState will trigger a CHANGE event, so we always rely + // change events by calling setState. + this.setState(this.source_.getState()); +}; + + +/** + * @param {ol.Feature} feature Feature. + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.render.canvas.ReplayGroup} replayGroup Replay group. + * @return {boolean} `true` if an image is loading. + * @private + */ +ol.source.ImageVector.prototype.renderFeature_ = + function(feature, resolution, pixelRatio, replayGroup) { + var styles = this.styleFunction_(feature, resolution); + if (!goog.isDefAndNotNull(styles)) { + return false; + } + // simplify to a tolerance of half a device pixel + var squaredTolerance = + resolution * resolution / (4 * pixelRatio * pixelRatio); + var i, ii, loading = false; + for (i = 0, ii = styles.length; i < ii; ++i) { + loading = ol.renderer.vector.renderFeature( + replayGroup, feature, styles[i], squaredTolerance, feature, + this.handleImageChange_, this) || loading; + } + return loading; +}; diff --git a/float-no-zero/ol/ol/source/imagewmssource.exports b/float-no-zero/ol/ol/source/imagewmssource.exports new file mode 100644 index 0000000000..eb78668cdf --- /dev/null +++ b/float-no-zero/ol/ol/source/imagewmssource.exports @@ -0,0 +1,5 @@ +@exportSymbol ol.source.ImageWMS +@exportProperty ol.source.ImageWMS.prototype.getGetFeatureInfoUrl +@exportProperty ol.source.ImageWMS.prototype.getParams +@exportProperty ol.source.ImageWMS.prototype.setUrl +@exportProperty ol.source.ImageWMS.prototype.updateParams diff --git a/float-no-zero/ol/ol/source/imagewmssource.js b/float-no-zero/ol/ol/source/imagewmssource.js new file mode 100644 index 0000000000..fbff7861d6 --- /dev/null +++ b/float-no-zero/ol/ol/source/imagewmssource.js @@ -0,0 +1,344 @@ +// FIXME cannot be shared between maps with different projections + +goog.provide('ol.source.ImageWMS'); + +goog.require('goog.asserts'); +goog.require('goog.object'); +goog.require('goog.string'); +goog.require('goog.uri.utils'); +goog.require('ol.Image'); +goog.require('ol.extent'); +goog.require('ol.proj'); +goog.require('ol.source.Image'); +goog.require('ol.source.wms'); +goog.require('ol.source.wms.ServerType'); + + + +/** + * @constructor + * @extends {ol.source.Image} + * @param {olx.source.ImageWMSOptions=} opt_options Options. + * @todo stability experimental + */ +ol.source.ImageWMS = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, { + attributions: options.attributions, + extent: options.extent, + logo: options.logo, + projection: options.projection, + resolutions: options.resolutions + }); + + /** + * @private + * @type {?string} + */ + this.crossOrigin_ = + goog.isDef(options.crossOrigin) ? options.crossOrigin : null; + + /** + * @private + * @type {string|undefined} + */ + this.url_ = options.url; + + /** + * @private + * @type {Object} + */ + this.params_ = options.params; + + /** + * @private + * @type {boolean} + */ + this.v13_ = true; + this.updateV13_(); + + /** + * @private + * @type {ol.source.wms.ServerType|undefined} + */ + this.serverType_ = + /** @type {ol.source.wms.ServerType|undefined} */ (options.serverType); + + /** + * @private + * @type {boolean} + */ + this.hidpi_ = goog.isDef(options.hidpi) ? options.hidpi : true; + + /** + * @private + * @type {ol.Image} + */ + this.image_ = null; + + /** + * @private + * @type {ol.Size} + */ + this.imageSize_ = [0, 0]; + + /** + * @private + * @type {ol.proj.Projection} + */ + this.renderedProjection_ = null; + + /** + * @private + * @type {number} + */ + this.renderedResolution_ = NaN; + + /** + * @private + * @type {number} + */ + this.renderedRevision_ = 0; + + /** + * @private + * @type {number} + */ + this.ratio_ = goog.isDef(options.ratio) ? options.ratio : 1.5; + +}; +goog.inherits(ol.source.ImageWMS, ol.source.Image); + + +/** + * Return the GetFeatureInfo URL for the passed coordinate, resolution, and + * projection. Return `undefined` if the GetFeatureInfo URL cannot be + * constructed. + * @param {ol.Coordinate} coordinate Coordinate. + * @param {number} resolution Resolution. + * @param {ol.proj.Projection} projection Projection. + * @param {!Object} params GetFeatureInfo params. `INFO_FORMAT` at least should + * be provided. If `QUERY_LAYERS` is not provided then the layers specified + * in the `LAYERS` parameter will be used. `VERSION` should not be + * specified here. + * @return {string|undefined} GetFeatureInfo URL. + */ +ol.source.ImageWMS.prototype.getGetFeatureInfoUrl = + function(coordinate, resolution, projection, params) { + + goog.asserts.assert(!('VERSION' in params)); + + if (!goog.isDef(this.url_) || goog.isNull(this.image_)) { + return undefined; + } + + goog.asserts.assert(this.imageSize_[0] !== 0 && + this.imageSize_[1] !== 0); + goog.asserts.assert(!isNaN(this.renderedResolution_)); + goog.asserts.assert(!goog.isNull(this.renderedProjection_)); + + if (resolution != this.renderedResolution_ || + !ol.proj.equivalent(projection, this.renderedProjection_)) { + return undefined; + } + + var extent = this.image_.getExtent(); + var pixelRatio = this.image_.getPixelRatio(); + + var baseParams = { + 'SERVICE': 'WMS', + 'VERSION': ol.source.wms.DEFAULT_VERSION, + 'REQUEST': 'GetFeatureInfo', + 'FORMAT': 'image/png', + 'TRANSPARENT': true, + 'QUERY_LAYERS': goog.object.get(this.params_, 'LAYERS') + }; + goog.object.extend(baseParams, this.params_, params); + + var imageResolution = resolution / pixelRatio; + + var x = Math.floor((coordinate[0] - extent[0]) / imageResolution); + var y = Math.floor((extent[3] - coordinate[1]) / imageResolution); + goog.object.set(baseParams, this.v13_ ? 'I' : 'X', x); + goog.object.set(baseParams, this.v13_ ? 'J' : 'Y', y); + + return this.getRequestUrl_(extent, this.imageSize_, pixelRatio, projection, + baseParams); +}; + + +/** + * Get the user-provided params, i.e. those passed to the constructor through + * the "params" option, and possibly updated using the updateParams method. + * @return {Object} Params. + */ +ol.source.ImageWMS.prototype.getParams = function() { + return this.params_; +}; + + +/** + * @inheritDoc + */ +ol.source.ImageWMS.prototype.getImage = + function(extent, resolution, pixelRatio, projection) { + + if (!goog.isDef(this.url_)) { + return null; + } + + resolution = this.findNearestResolution(resolution); + + if (pixelRatio != 1 && (!this.hidpi_ || !goog.isDef(this.serverType_))) { + pixelRatio = 1; + } + + var image = this.image_; + if (!goog.isNull(image) && + this.renderedRevision_ == this.getRevision() && + image.getResolution() == resolution && + image.getPixelRatio() == pixelRatio && + ol.extent.containsExtent(image.getExtent(), extent)) { + return image; + } + + var params = { + 'SERVICE': 'WMS', + 'VERSION': ol.source.wms.DEFAULT_VERSION, + 'REQUEST': 'GetMap', + 'FORMAT': 'image/png', + 'TRANSPARENT': true + }; + goog.object.extend(params, this.params_); + + extent = extent.slice(); + var centerX = (extent[0] + extent[2]) / 2; + var centerY = (extent[1] + extent[3]) / 2; + if (this.ratio_ != 1) { + var halfWidth = this.ratio_ * (extent[2] - extent[0]) / 2; + var halfHeight = this.ratio_ * (extent[3] - extent[1]) / 2; + extent[0] = centerX - halfWidth; + extent[1] = centerY - halfHeight; + extent[2] = centerX + halfWidth; + extent[3] = centerY + halfHeight; + } + + var imageResolution = resolution / pixelRatio; + + // Compute an integer width and height. + var width = Math.ceil((extent[2] - extent[0]) / imageResolution); + var height = Math.ceil((extent[3] - extent[1]) / imageResolution); + + // Modify the extent to match the integer width and height. + extent[0] = centerX - imageResolution * width / 2; + extent[2] = centerX + imageResolution * width / 2; + extent[1] = centerY - imageResolution * height / 2; + extent[3] = centerY + imageResolution * height / 2; + + this.imageSize_[0] = width; + this.imageSize_[1] = height; + + var url = this.getRequestUrl_(extent, this.imageSize_, pixelRatio, + projection, params); + + this.image_ = new ol.Image(extent, resolution, pixelRatio, + this.getAttributions(), url, this.crossOrigin_); + + this.renderedProjection_ = projection; + this.renderedResolution_ = resolution; + this.renderedRevision_ = this.getRevision(); + + return this.image_; + +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {ol.Size} size Size. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @param {Object} params Params. + * @return {string} Request URL. + * @private + */ +ol.source.ImageWMS.prototype.getRequestUrl_ = + function(extent, size, pixelRatio, projection, params) { + + goog.asserts.assert(goog.isDef(this.url_)); + + params[this.v13_ ? 'CRS' : 'SRS'] = projection.getCode(); + + if (!('STYLES' in this.params_)) { + goog.object.set(params, 'STYLES', new String('')); + } + + if (pixelRatio != 1) { + switch (this.serverType_) { + case ol.source.wms.ServerType.GEOSERVER: + var dpi = (90 * pixelRatio + 0.5) | 0; + goog.object.set(params, 'FORMAT_OPTIONS', 'dpi:' + dpi); + break; + case ol.source.wms.ServerType.MAPSERVER: + goog.object.set(params, 'MAP_RESOLUTION', 90 * pixelRatio); + break; + case ol.source.wms.ServerType.CARMENTA_SERVER: + case ol.source.wms.ServerType.QGIS: + goog.object.set(params, 'DPI', 90 * pixelRatio); + break; + default: + goog.asserts.fail(); + break; + } + } + + goog.object.set(params, 'WIDTH', size[0]); + goog.object.set(params, 'HEIGHT', size[1]); + + var axisOrientation = projection.getAxisOrientation(); + var bbox; + if (this.v13_ && axisOrientation.substr(0, 2) == 'ne') { + bbox = [extent[1], extent[0], extent[3], extent[2]]; + } else { + bbox = extent; + } + goog.object.set(params, 'BBOX', bbox.join(',')); + + return goog.uri.utils.appendParamsFromMap(this.url_, params); +}; + + +/** + * @param {string|undefined} url URL. + */ +ol.source.ImageWMS.prototype.setUrl = function(url) { + if (url != this.url_) { + this.url_ = url; + this.image_ = null; + this.dispatchChangeEvent(); + } +}; + + +/** + * Update the user-provided params. + * @param {Object} params Params. + */ +ol.source.ImageWMS.prototype.updateParams = function(params) { + goog.object.extend(this.params_, params); + this.updateV13_(); + this.image_ = null; + this.dispatchChangeEvent(); +}; + + +/** + * @private + */ +ol.source.ImageWMS.prototype.updateV13_ = function() { + var version = + goog.object.get(this.params_, 'VERSION', ol.source.wms.DEFAULT_VERSION); + this.v13_ = goog.string.compareVersions(version, '1.3') >= 0; +}; diff --git a/float-no-zero/ol/ol/source/kmlsource.exports b/float-no-zero/ol/ol/source/kmlsource.exports new file mode 100644 index 0000000000..45c5580867 --- /dev/null +++ b/float-no-zero/ol/ol/source/kmlsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.KML diff --git a/float-no-zero/ol/ol/source/kmlsource.js b/float-no-zero/ol/ol/source/kmlsource.js new file mode 100644 index 0000000000..501b84b15c --- /dev/null +++ b/float-no-zero/ol/ol/source/kmlsource.js @@ -0,0 +1,34 @@ +goog.provide('ol.source.KML'); + +goog.require('ol.format.KML'); +goog.require('ol.source.VectorFile'); + + + +/** + * @constructor + * @extends {ol.source.VectorFile} + * @param {olx.source.KMLOptions=} opt_options Options. + * @todo stability experimental + */ +ol.source.KML = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, { + attributions: options.attributions, + doc: options.doc, + extent: options.extent, + format: new ol.format.KML({ + defaultStyle: options.defaultStyle + }), + logo: options.logo, + node: options.node, + projection: options.projection, + text: options.text, + url: options.url, + urls: options.urls + }); + +}; +goog.inherits(ol.source.KML, ol.source.VectorFile); diff --git a/float-no-zero/ol/ol/source/mapguidesource.exports b/float-no-zero/ol/ol/source/mapguidesource.exports new file mode 100644 index 0000000000..c386f721e0 --- /dev/null +++ b/float-no-zero/ol/ol/source/mapguidesource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.MapGuide diff --git a/float-no-zero/ol/ol/source/mapguidesource.js b/float-no-zero/ol/ol/source/mapguidesource.js new file mode 100644 index 0000000000..449e0adaa0 --- /dev/null +++ b/float-no-zero/ol/ol/source/mapguidesource.js @@ -0,0 +1,176 @@ +goog.provide('ol.source.MapGuide'); + +goog.require('goog.object'); +goog.require('goog.uri.utils'); +goog.require('ol.Image'); +goog.require('ol.ImageUrlFunction'); +goog.require('ol.extent'); +goog.require('ol.source.Image'); + + + +/** + * @constructor + * @extends {ol.source.Image} + * @param {olx.source.MapGuideOptions} options Options. + */ +ol.source.MapGuide = function(options) { + + goog.base(this, { + extent: options.extent, + projection: options.projection, + resolutions: options.resolutions + }); + + /** + * @private + * @type {?string} + */ + this.crossOrigin_ = + goog.isDef(options.crossOrigin) ? options.crossOrigin : null; + + /** + * @private + * @type {number} + */ + this.displayDpi_ = goog.isDef(options.displayDpi) ? + options.displayDpi : 96; + + var imageUrlFunction; + if (goog.isDef(options.url)) { + var params = goog.isDef(options.params) ? options.params : {}; + imageUrlFunction = ol.ImageUrlFunction.createFromParamsFunction( + options.url, params, goog.bind(this.getUrl, this)); + } else { + imageUrlFunction = ol.ImageUrlFunction.nullImageUrlFunction; + } + + /** + * @private + * @type {ol.ImageUrlFunctionType} + */ + this.imageUrlFunction_ = imageUrlFunction; + + /** + * @private + * @type {boolean} + */ + this.hidpi_ = goog.isDef(options.hidpi) ? options.hidpi : true; + + /** + * @private + * @type {number} + */ + this.metersPerUnit_ = goog.isDef(options.metersPerUnit) ? + options.metersPerUnit : 1; + + /** + * @private + * @type {number} + */ + this.ratio_ = goog.isDef(options.ratio) ? options.ratio : 1; + + /** + * @private + * @type {boolean} + */ + this.useOverlay_ = goog.isDef(options.useOverlay) ? + options.useOverlay : false; + + /** + * @private + * @type {ol.Image} + */ + this.image_ = null; + +}; +goog.inherits(ol.source.MapGuide, ol.source.Image); + + +/** + * @inheritDoc + */ +ol.source.MapGuide.prototype.getImage = + function(extent, resolution, pixelRatio, projection) { + resolution = this.findNearestResolution(resolution); + pixelRatio = this.hidpi_ ? pixelRatio : 1; + + var image = this.image_; + if (!goog.isNull(image) && + image.getResolution() == resolution && + image.getPixelRatio() == pixelRatio && + ol.extent.containsExtent(image.getExtent(), extent)) { + return image; + } + + if (this.ratio_ != 1) { + extent = extent.slice(); + ol.extent.scaleFromCenter(extent, this.ratio_); + } + var width = (extent[2] - extent[0]) / resolution; + var height = (extent[3] - extent[1]) / resolution; + var size = [width * pixelRatio, height * pixelRatio]; + + var imageUrl = this.imageUrlFunction_(extent, size, projection); + if (goog.isDef(imageUrl)) { + image = new ol.Image(extent, resolution, pixelRatio, + this.getAttributions(), imageUrl, this.crossOrigin_); + } else { + image = null; + } + this.image_ = image; + + return image; +}; + + +/** + * @param {ol.Extent} extent The map extents. + * @param {ol.Size} size the viewport size. + * @param {number} metersPerUnit The meters-per-unit value. + * @param {number} dpi The display resolution. + * @return {number} The computed map scale. + */ +ol.source.MapGuide.getScale = function(extent, size, metersPerUnit, dpi) { + var mcsW = ol.extent.getWidth(extent); + var mcsH = ol.extent.getHeight(extent); + var devW = size[0]; + var devH = size[1]; + var mpp = 0.0254 / dpi; + if (devH * mcsW > devW * mcsH) { + return mcsW * metersPerUnit / (devW * mpp); // width limited + } else { + return mcsH * metersPerUnit / (devH * mpp); // height limited + } +}; + + +/** + * @param {string} baseUrl The mapagent url. + * @param {Object.} params Request parameters. + * @param {ol.Extent} extent Extent. + * @param {ol.Size} size Size. + * @param {ol.proj.Projection} projection Projection. + * @return {string} The mapagent map image request URL. + */ +ol.source.MapGuide.prototype.getUrl = + function(baseUrl, params, extent, size, projection) { + var scale = ol.source.MapGuide.getScale(extent, size, + this.metersPerUnit_, this.displayDpi_); + var center = ol.extent.getCenter(extent); + var baseParams = { + 'OPERATION': this.useOverlay_ ? 'GETDYNAMICMAPOVERLAYIMAGE' : 'GETMAPIMAGE', + 'VERSION': '2.0.0', + 'LOCALE': 'en', + 'CLIENTAGENT': 'ol.source.MapGuide source', + 'CLIP': '1', + 'SETDISPLAYDPI': this.displayDpi_, + 'SETDISPLAYWIDTH': Math.round(size[0]), + 'SETDISPLAYHEIGHT': Math.round(size[1]), + 'SETVIEWSCALE': scale, + 'SETVIEWCENTERX': center[0], + 'SETVIEWCENTERY': center[1] + }; + goog.object.extend(baseParams, params); + return goog.uri.utils.appendParamsFromMap(baseUrl, baseParams); +}; diff --git a/float-no-zero/ol/ol/source/mapquestsource.exports b/float-no-zero/ol/ol/source/mapquestsource.exports new file mode 100644 index 0000000000..cef1c0dcaf --- /dev/null +++ b/float-no-zero/ol/ol/source/mapquestsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.MapQuest diff --git a/float-no-zero/ol/ol/source/mapquestsource.js b/float-no-zero/ol/ol/source/mapquestsource.js new file mode 100644 index 0000000000..f0fcfc8259 --- /dev/null +++ b/float-no-zero/ol/ol/source/mapquestsource.js @@ -0,0 +1,78 @@ +goog.provide('ol.source.MapQuest'); + +goog.require('goog.asserts'); +goog.require('ol.Attribution'); +goog.require('ol.source.OSM'); +goog.require('ol.source.XYZ'); + + + +/** + * @constructor + * @extends {ol.source.XYZ} + * @param {olx.source.MapQuestOptions=} opt_options MapQuest options. + * @todo stability experimental + */ +ol.source.MapQuest = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.asserts.assert(options.layer in ol.source.MapQuestConfig); + + var layerConfig = ol.source.MapQuestConfig[options.layer]; + + var url = '//otile{1-4}.mqcdn.com/tiles/1.0.0/' + + options.layer + '/{z}/{x}/{y}.jpg'; + + goog.base(this, { + attributions: layerConfig.attributions, + crossOrigin: 'anonymous', + logo: '//developer.mapquest.com/content/osm/mq_logo.png', + maxZoom: layerConfig.maxZoom, + opaque: true, + tileLoadFunction: options.tileLoadFunction, + url: url + }); + +}; +goog.inherits(ol.source.MapQuest, ol.source.XYZ); + + +/** + * @const + * @type {ol.Attribution} + */ +ol.source.MapQuest.TILE_ATTRIBUTION = new ol.Attribution({ + html: 'Tiles Courtesy of ' + + 'MapQuest' +}); + + +/** + * @type {Object.)}>} + */ +ol.source.MapQuestConfig = { + 'osm': { + maxZoom: 28, + attributions: [ + ol.source.MapQuest.TILE_ATTRIBUTION, + ol.source.OSM.DATA_ATTRIBUTION + ] + }, + 'sat': { + maxZoom: 18, + attributions: [ + ol.source.MapQuest.TILE_ATTRIBUTION, + new ol.Attribution({ + html: 'Portions Courtesy NASA/JPL-Caltech and ' + + 'U.S. Depart. of Agriculture, Farm Service Agency' + }) + ] + }, + 'hyb': { + maxZoom: 18, + attributions: [ + ol.source.MapQuest.TILE_ATTRIBUTION, + ol.source.OSM.DATA_ATTRIBUTION + ] + } +}; diff --git a/float-no-zero/ol/ol/source/osmsource.exports b/float-no-zero/ol/ol/source/osmsource.exports new file mode 100644 index 0000000000..989472d69e --- /dev/null +++ b/float-no-zero/ol/ol/source/osmsource.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.source.OSM +@exportProperty ol.source.OSM.DATA_ATTRIBUTION +@exportProperty ol.source.OSM.TILE_ATTRIBUTION diff --git a/float-no-zero/ol/ol/source/osmsource.js b/float-no-zero/ol/ol/source/osmsource.js new file mode 100644 index 0000000000..4fe96661d3 --- /dev/null +++ b/float-no-zero/ol/ol/source/osmsource.js @@ -0,0 +1,75 @@ +goog.provide('ol.source.OSM'); + +goog.require('ol.Attribution'); +goog.require('ol.source.XYZ'); + + + +/** + * @constructor + * @extends {ol.source.XYZ} + * @param {olx.source.OSMOptions=} opt_options Open Street Map options. + * @todo stability experimental + */ +ol.source.OSM = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + var attributions; + if (goog.isDef(options.attributions)) { + attributions = options.attributions; + } else { + attributions = ol.source.OSM.ATTRIBUTIONS; + } + + var crossOrigin = goog.isDef(options.crossOrigin) ? + options.crossOrigin : 'anonymous'; + + var url = goog.isDef(options.url) ? + options.url : '//{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'; + + goog.base(this, { + attributions: attributions, + crossOrigin: crossOrigin, + opaque: true, + maxZoom: options.maxZoom, + tileLoadFunction: options.tileLoadFunction, + url: url + }); + +}; +goog.inherits(ol.source.OSM, ol.source.XYZ); + + +/** + * @const + * @type {ol.Attribution} + */ +ol.source.OSM.DATA_ATTRIBUTION = new ol.Attribution({ + html: 'Data © ' + + 'OpenStreetMap ' + + 'contributors, ' + + 'ODbL' +}); + + +/** + * @const + * @type {ol.Attribution} + */ +ol.source.OSM.TILE_ATTRIBUTION = new ol.Attribution({ + html: 'Tiles © ' + + 'OpenStreetMap ' + + 'contributors, ' + + 'CC BY-SA' +}); + + +/** + * @const + * @type {Array.} + */ +ol.source.OSM.ATTRIBUTIONS = [ + ol.source.OSM.TILE_ATTRIBUTION, + ol.source.OSM.DATA_ATTRIBUTION +]; diff --git a/float-no-zero/ol/ol/source/osmxmlsource.exports b/float-no-zero/ol/ol/source/osmxmlsource.exports new file mode 100644 index 0000000000..880127d254 --- /dev/null +++ b/float-no-zero/ol/ol/source/osmxmlsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.OSMXML diff --git a/float-no-zero/ol/ol/source/osmxmlsource.js b/float-no-zero/ol/ol/source/osmxmlsource.js new file mode 100644 index 0000000000..48353beda5 --- /dev/null +++ b/float-no-zero/ol/ol/source/osmxmlsource.js @@ -0,0 +1,31 @@ +goog.provide('ol.source.OSMXML'); + +goog.require('ol.format.OSMXML'); +goog.require('ol.source.VectorFile'); + + + +/** + * @constructor + * @extends {ol.source.VectorFile} + * @param {olx.source.OSMXMLOptions=} opt_options Options. + */ +ol.source.OSMXML = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, { + attributions: options.attributions, + doc: options.doc, + extent: options.extent, + format: new ol.format.OSMXML(), + logo: options.logo, + node: options.node, + projection: options.projection, + reprojectTo: options.reprojectTo, + text: options.text, + url: options.url + }); + +}; +goog.inherits(ol.source.OSMXML, ol.source.VectorFile); diff --git a/float-no-zero/ol/ol/source/source.exports b/float-no-zero/ol/ol/source/source.exports new file mode 100644 index 0000000000..1d3863d0f3 --- /dev/null +++ b/float-no-zero/ol/ol/source/source.exports @@ -0,0 +1,2 @@ +@exportProperty ol.source.Source.prototype.getExtent +@exportProperty ol.source.Source.prototype.getState diff --git a/float-no-zero/ol/ol/source/source.js b/float-no-zero/ol/ol/source/source.js new file mode 100644 index 0000000000..c9039bbbf7 --- /dev/null +++ b/float-no-zero/ol/ol/source/source.js @@ -0,0 +1,179 @@ +goog.provide('ol.source.Source'); +goog.provide('ol.source.State'); + +goog.require('goog.events.EventType'); +goog.require('ol.Attribution'); +goog.require('ol.Extent'); +goog.require('ol.Observable'); +goog.require('ol.proj'); + + +/** + * @enum {number} + */ +ol.source.State = { + LOADING: 0, + READY: 1, + ERROR: 2 +}; + + +/** + * @typedef {{attributions: (Array.|undefined), + * extent: (ol.Extent|undefined), + * logo: (string|undefined), + * projection: ol.proj.ProjectionLike, + * state: (ol.source.State|string|undefined)}} + * @todo stability experimental + */ +ol.source.SourceOptions; + + + +/** + * @constructor + * @extends {ol.Observable} + * @param {ol.source.SourceOptions} options Source options. + * @todo stability experimental + */ +ol.source.Source = function(options) { + + goog.base(this); + + /** + * @private + * @type {ol.proj.Projection} + */ + this.projection_ = ol.proj.get(options.projection); + + /** + * @private + * @type {ol.Extent} + */ + this.extent_ = goog.isDef(options.extent) ? + options.extent : goog.isDef(options.projection) ? + this.projection_.getExtent() : null; + + /** + * @private + * @type {Array.} + */ + this.attributions_ = goog.isDef(options.attributions) ? + options.attributions : null; + + /** + * @private + * @type {string|undefined} + */ + this.logo_ = options.logo; + + /** + * @private + * @type {ol.source.State} + */ + this.state_ = goog.isDef(options.state) ? + /** @type {ol.source.State} */ (options.state) : ol.source.State.READY; + +}; +goog.inherits(ol.source.Source, ol.Observable); + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {number} rotation Rotation. + * @param {ol.Coordinate} coordinate Coordinate. + * @param {function(ol.Feature): T} callback Feature callback. + * @return {T|undefined} Callback result. + * @template T + */ +ol.source.Source.prototype.forEachFeatureAtPixel = + goog.nullFunction; + + +/** + * @return {Array.} Attributions. + */ +ol.source.Source.prototype.getAttributions = function() { + return this.attributions_; +}; + + +/** + * @return {ol.Extent} Extent. + */ +ol.source.Source.prototype.getExtent = function() { + return this.extent_; +}; + + +/** + * @return {string|undefined} Logo. + */ +ol.source.Source.prototype.getLogo = function() { + return this.logo_; +}; + + +/** + * @return {ol.proj.Projection} Projection. + */ +ol.source.Source.prototype.getProjection = function() { + return this.projection_; +}; + + +/** + * @return {Array.|undefined} Resolutions. + */ +ol.source.Source.prototype.getResolutions = goog.abstractMethod; + + +/** + * @return {ol.source.State} State. + */ +ol.source.Source.prototype.getState = function() { + return this.state_; +}; + + +/** + * @param {Array.} attributions Attributions. + */ +ol.source.Source.prototype.setAttributions = function(attributions) { + this.attributions_ = attributions; +}; + + +/** + * @param {ol.Extent} extent Extent. + */ +ol.source.Source.prototype.setExtent = function(extent) { + this.extent_ = extent; +}; + + +/** + * @param {string|undefined} logo Logo. + */ +ol.source.Source.prototype.setLogo = function(logo) { + this.logo_ = logo; +}; + + +/** + * @param {ol.source.State} state State. + * @protected + */ +ol.source.Source.prototype.setState = function(state) { + this.state_ = state; + this.dispatchChangeEvent(); +}; + + +/** + * @param {ol.proj.Projection} projection Projetion. + */ +ol.source.Source.prototype.setProjection = function(projection) { + this.projection_ = projection; +}; diff --git a/float-no-zero/ol/ol/source/stamensource.exports b/float-no-zero/ol/ol/source/stamensource.exports new file mode 100644 index 0000000000..697330485e --- /dev/null +++ b/float-no-zero/ol/ol/source/stamensource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.Stamen diff --git a/float-no-zero/ol/ol/source/stamensource.js b/float-no-zero/ol/ol/source/stamensource.js new file mode 100644 index 0000000000..3e8fa7177f --- /dev/null +++ b/float-no-zero/ol/ol/source/stamensource.js @@ -0,0 +1,126 @@ +goog.provide('ol.source.Stamen'); + +goog.require('goog.asserts'); +goog.require('ol.Attribution'); +goog.require('ol.source.OSM'); +goog.require('ol.source.XYZ'); + + +/** + * @type {Object.} + */ +ol.source.StamenLayerConfig = { + 'terrain': { + extension: 'jpg', + opaque: true + }, + 'terrain-background': { + extension: 'jpg', + opaque: true + }, + 'terrain-labels': { + extension: 'png', + opaque: false + }, + 'terrain-lines': { + extension: 'png', + opaque: false + }, + 'toner-background': { + extension: 'png', + opaque: true + }, + 'toner': { + extension: 'png', + opaque: true + }, + 'toner-hybrid': { + extension: 'png', + opaque: false + }, + 'toner-labels': { + extension: 'png', + opaque: false + }, + 'toner-lines': { + extension: 'png', + opaque: false + }, + 'toner-lite': { + extension: 'png', + opaque: true + }, + 'watercolor': { + extension: 'jpg', + opaque: true + } +}; + + +/** + * @type {Object.} + */ +ol.source.StamenProviderConfig = { + 'terrain': { + minZoom: 4, + maxZoom: 18 + }, + 'toner': { + minZoom: 0, + maxZoom: 20 + }, + 'watercolor': { + minZoom: 3, + maxZoom: 16 + } +}; + + + +/** + * @constructor + * @extends {ol.source.XYZ} + * @param {olx.source.StamenOptions} options Stamen options. + * @todo stability experimental + */ +ol.source.Stamen = function(options) { + + var i = options.layer.indexOf('-'); + var provider = i == -1 ? options.layer : options.layer.slice(0, i); + goog.asserts.assert(provider in ol.source.StamenProviderConfig); + var providerConfig = ol.source.StamenProviderConfig[provider]; + + goog.asserts.assert(options.layer in ol.source.StamenLayerConfig); + var layerConfig = ol.source.StamenLayerConfig[options.layer]; + + var url = goog.isDef(options.url) ? options.url : + '//{a-d}.tile.stamen.com/' + options.layer + '/{z}/{x}/{y}.' + + layerConfig.extension; + + goog.base(this, { + attributions: ol.source.Stamen.ATTRIBUTIONS, + crossOrigin: 'anonymous', + maxZoom: providerConfig.maxZoom, + // FIXME uncomment the following when tilegrid supports minZoom + //minZoom: providerConfig.minZoom, + opaque: layerConfig.opaque, + tileLoadFunction: options.tileLoadFunction, + url: url + }); + +}; +goog.inherits(ol.source.Stamen, ol.source.XYZ); + + +/** + * @const + * @type {Array.} + */ +ol.source.Stamen.ATTRIBUTIONS = [ + new ol.Attribution({ + html: 'Map tiles by Stamen Design, ' + + 'under CC BY' + + ' 3.0.' + }), + ol.source.OSM.DATA_ATTRIBUTION +]; diff --git a/float-no-zero/ol/ol/source/tileimagesource.js b/float-no-zero/ol/ol/source/tileimagesource.js new file mode 100644 index 0000000000..fe255e2cee --- /dev/null +++ b/float-no-zero/ol/ol/source/tileimagesource.js @@ -0,0 +1,164 @@ +goog.provide('ol.source.TileImage'); + +goog.require('goog.asserts'); +goog.require('ol.Attribution'); +goog.require('ol.Extent'); +goog.require('ol.ImageTile'); +goog.require('ol.Tile'); +goog.require('ol.TileCache'); +goog.require('ol.TileCoord'); +goog.require('ol.TileLoadFunctionType'); +goog.require('ol.TileState'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.TileUrlFunctionType'); +goog.require('ol.source.Tile'); +goog.require('ol.tilegrid.TileGrid'); + + +/** + * @typedef {{attributions: (Array.|undefined), + * crossOrigin: (null|string|undefined), + * extent: (ol.Extent|undefined), + * logo: (string|undefined), + * opaque: (boolean|undefined), + * projection: ol.proj.ProjectionLike, + * tileClass: (function(new: ol.ImageTile, ol.TileCoord, + * ol.TileState, string, ?string, + * ol.TileLoadFunctionType)|undefined), + * tileGrid: (ol.tilegrid.TileGrid|undefined), + * tileLoadFunction: (ol.TileLoadFunctionType|undefined), + * tileUrlFunction: (ol.TileUrlFunctionType|undefined)}} + * @todo stability experimental + */ +ol.source.TileImageOptions; + + + +/** + * @constructor + * @extends {ol.source.Tile} + * @param {ol.source.TileImageOptions} options Image tile options. + * @todo stability experimental + */ +ol.source.TileImage = function(options) { + + goog.base(this, { + attributions: options.attributions, + extent: options.extent, + logo: options.logo, + opaque: options.opaque, + projection: options.projection, + tileGrid: options.tileGrid + }); + + /** + * @protected + * @type {ol.TileUrlFunctionType} + */ + this.tileUrlFunction = goog.isDef(options.tileUrlFunction) ? + options.tileUrlFunction : + ol.TileUrlFunction.nullTileUrlFunction; + + /** + * @protected + * @type {?string} + */ + this.crossOrigin = + goog.isDef(options.crossOrigin) ? options.crossOrigin : null; + + /** + * @protected + * @type {ol.TileCache} + */ + this.tileCache = new ol.TileCache(); + + /** + * @protected + * @type {ol.TileLoadFunctionType} + */ + this.tileLoadFunction = goog.isDef(options.tileLoadFunction) ? + options.tileLoadFunction : ol.source.TileImage.defaultTileLoadFunction; + + /** + * @protected + * @type {function(new: ol.ImageTile, ol.TileCoord, ol.TileState, string, + * ?string, ol.TileLoadFunctionType)} + */ + this.tileClass = goog.isDef(options.tileClass) ? + options.tileClass : ol.ImageTile; + +}; +goog.inherits(ol.source.TileImage, ol.source.Tile); + + +/** + * @param {ol.ImageTile} imageTile Image tile. + * @param {string} src Source. + */ +ol.source.TileImage.defaultTileLoadFunction = function(imageTile, src) { + imageTile.getImage().src = src; +}; + + +/** + * @inheritDoc + */ +ol.source.TileImage.prototype.canExpireCache = function() { + return this.tileCache.canExpireCache(); +}; + + +/** + * @inheritDoc + */ +ol.source.TileImage.prototype.expireCache = function(usedTiles) { + this.tileCache.expireCache(usedTiles); +}; + + +/** + * @inheritDoc + */ +ol.source.TileImage.prototype.getTile = + function(z, x, y, pixelRatio, projection) { + var tileCoordKey = this.getKeyZXY(z, x, y); + if (this.tileCache.containsKey(tileCoordKey)) { + return /** @type {!ol.Tile} */ (this.tileCache.get(tileCoordKey)); + } else { + goog.asserts.assert(projection); + var tileCoord = new ol.TileCoord(z, x, y); + var tileUrl = this.tileUrlFunction(tileCoord, pixelRatio, projection); + var tile = new this.tileClass( + tileCoord, + goog.isDef(tileUrl) ? ol.TileState.IDLE : ol.TileState.EMPTY, + goog.isDef(tileUrl) ? tileUrl : '', + this.crossOrigin, + this.tileLoadFunction); + this.tileCache.set(tileCoordKey, tile); + return tile; + } +}; + + +/** + * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function. + */ +ol.source.TileImage.prototype.setTileUrlFunction = function(tileUrlFunction) { + // FIXME It should be possible to be more intelligent and avoid clearing the + // FIXME cache. The tile URL function would need to be incorporated into the + // FIXME cache key somehow. + this.tileCache.clear(); + this.tileUrlFunction = tileUrlFunction; + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol.source.TileImage.prototype.useTile = function(z, x, y) { + var tileCoordKey = this.getKeyZXY(z, x, y); + if (this.tileCache.containsKey(tileCoordKey)) { + this.tileCache.get(tileCoordKey); + } +}; diff --git a/float-no-zero/ol/ol/source/tilejsonsource.exports b/float-no-zero/ol/ol/source/tilejsonsource.exports new file mode 100644 index 0000000000..56b3f56285 --- /dev/null +++ b/float-no-zero/ol/ol/source/tilejsonsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.TileJSON diff --git a/float-no-zero/ol/ol/source/tilejsonsource.js b/float-no-zero/ol/ol/source/tilejsonsource.js new file mode 100644 index 0000000000..2f3768d1d3 --- /dev/null +++ b/float-no-zero/ol/ol/source/tilejsonsource.js @@ -0,0 +1,120 @@ +// FIXME add some error checking +// FIXME check order of async callbacks + +/** + * @see http://mapbox.com/developers/api/ + */ + +goog.provide('ol.source.TileJSON'); +goog.provide('ol.tilejson'); + +goog.require('goog.asserts'); +goog.require('goog.net.jsloader'); +goog.require('ol.Attribution'); +goog.require('ol.TileRange'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.extent'); +goog.require('ol.proj'); +goog.require('ol.source.State'); +goog.require('ol.source.TileImage'); +goog.require('ol.tilegrid.XYZ'); + + +/** + * @private + * @type {Array.} + */ +ol.tilejson.grids_ = []; + + +/** + * @param {TileJSON} tileJSON Tile JSON. + */ +var grid = function(tileJSON) { + ol.tilejson.grids_.push(tileJSON); +}; +goog.exportSymbol('grid', grid); + + + +/** + * @constructor + * @extends {ol.source.TileImage} + * @param {olx.source.TileJSONOptions} options TileJSON options. + * @todo stability experimental + */ +ol.source.TileJSON = function(options) { + + goog.base(this, { + crossOrigin: options.crossOrigin, + projection: ol.proj.get('EPSG:3857'), + state: ol.source.State.LOADING, + tileLoadFunction: options.tileLoadFunction + }); + + /** + * @private + * @type {!goog.async.Deferred} + */ + this.deferred_ = goog.net.jsloader.load(options.url, {cleanupWhenDone: true}); + this.deferred_.addCallback(this.handleTileJSONResponse, this); + +}; +goog.inherits(ol.source.TileJSON, ol.source.TileImage); + + +/** + * @protected + */ +ol.source.TileJSON.prototype.handleTileJSONResponse = function() { + var tileJSON = ol.tilejson.grids_.pop(); + + var epsg4326Projection = ol.proj.get('EPSG:4326'); + + var extent; + if (goog.isDef(tileJSON.bounds)) { + var transform = ol.proj.getTransformFromProjections( + epsg4326Projection, this.getProjection()); + extent = ol.extent.transform(tileJSON.bounds, transform); + this.setExtent(extent); + } + + if (goog.isDef(tileJSON.scheme)) { + goog.asserts.assert(tileJSON.scheme == 'xyz'); + } + var minZoom = tileJSON.minzoom || 0; + var maxZoom = tileJSON.maxzoom || 22; + var tileGrid = new ol.tilegrid.XYZ({ + maxZoom: maxZoom, + minZoom: minZoom + }); + this.tileGrid = tileGrid; + + this.tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + tileGrid.createTileCoordTransform({ + extent: extent + }), + ol.TileUrlFunction.createFromTemplates(tileJSON.tiles)); + + if (goog.isDef(tileJSON.attribution)) { + var attributionExtent = goog.isDef(extent) ? + extent : epsg4326Projection.getExtent(); + /** @type {Object.>} */ + var tileRanges = {}; + var z, zKey; + for (z = minZoom; z <= maxZoom; ++z) { + zKey = z.toString(); + tileRanges[zKey] = + [tileGrid.getTileRangeForExtentAndZ(attributionExtent, z)]; + } + this.setAttributions([ + new ol.Attribution({ + html: tileJSON.attribution, + tileRanges: tileRanges + }) + ]); + } + + this.setState(ol.source.State.READY); + +}; diff --git a/float-no-zero/ol/ol/source/tilesource.exports b/float-no-zero/ol/ol/source/tilesource.exports new file mode 100644 index 0000000000..fe7587ebea --- /dev/null +++ b/float-no-zero/ol/ol/source/tilesource.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.source.Tile +@exportProperty ol.source.Tile.prototype.getTileGrid diff --git a/float-no-zero/ol/ol/source/tilesource.js b/float-no-zero/ol/ol/source/tilesource.js new file mode 100644 index 0000000000..732ab63d2f --- /dev/null +++ b/float-no-zero/ol/ol/source/tilesource.js @@ -0,0 +1,194 @@ +goog.provide('ol.source.Tile'); +goog.provide('ol.source.TileOptions'); + +goog.require('goog.functions'); +goog.require('ol.Attribution'); +goog.require('ol.Extent'); +goog.require('ol.Tile'); +goog.require('ol.TileCoord'); +goog.require('ol.TileRange'); +goog.require('ol.source.Source'); +goog.require('ol.tilegrid.TileGrid'); + + +/** + * @typedef {{attributions: (Array.|undefined), + * extent: (ol.Extent|undefined), + * logo: (string|undefined), + * opaque: (boolean|undefined), + * projection: ol.proj.ProjectionLike, + * tileGrid: (ol.tilegrid.TileGrid|undefined)}} + * @todo stability experimental + */ +ol.source.TileOptions; + + + +/** + * @constructor + * @extends {ol.source.Source} + * @param {ol.source.TileOptions} options Tile source options. + * @todo stability experimental + */ +ol.source.Tile = function(options) { + + goog.base(this, { + attributions: options.attributions, + extent: options.extent, + logo: options.logo, + projection: options.projection + }); + + /** + * @private + * @type {boolean} + */ + this.opaque_ = goog.isDef(options.opaque) ? options.opaque : false; + + /** + * @protected + * @type {ol.tilegrid.TileGrid} + */ + this.tileGrid = goog.isDef(options.tileGrid) ? options.tileGrid : null; + +}; +goog.inherits(ol.source.Tile, ol.source.Source); + + +/** + * @return {boolean} Can expire cache. + */ +ol.source.Tile.prototype.canExpireCache = goog.functions.FALSE; + + +/** + * @param {Object.} usedTiles Used tiles. + */ +ol.source.Tile.prototype.expireCache = goog.abstractMethod; + + +/** + * Look for loaded tiles over a given tile range and zoom level. Adds + * properties to the provided lookup representing key/tile pairs for already + * loaded tiles. + * + * @param {Object.>} loadedTilesByZ A lookup of + * loaded tiles by zoom level. + * @param {function(number, number, number): ol.Tile} getTileIfLoaded A function + * that returns the tile only if it is fully loaded. + * @param {number} z Zoom level. + * @param {ol.TileRange} tileRange Tile range. + * @return {boolean} The tile range is fully covered with loaded tiles. + */ +ol.source.Tile.prototype.findLoadedTiles = function(loadedTilesByZ, + getTileIfLoaded, z, tileRange) { + // FIXME this could be more efficient about filling partial holes + var fullyCovered = true; + var tile, tileCoordKey, x, y; + for (x = tileRange.minX; x <= tileRange.maxX; ++x) { + for (y = tileRange.minY; y <= tileRange.maxY; ++y) { + tileCoordKey = this.getKeyZXY(z, x, y); + if (loadedTilesByZ[z] && loadedTilesByZ[z][tileCoordKey]) { + continue; + } + tile = getTileIfLoaded(z, x, y); + if (!goog.isNull(tile)) { + if (!loadedTilesByZ[z]) { + loadedTilesByZ[z] = {}; + } + loadedTilesByZ[z][tileCoordKey] = tile; + } else { + fullyCovered = false; + } + } + } + return fullyCovered; +}; + + +/** + * @return {number} Gutter. + */ +ol.source.Tile.prototype.getGutter = function() { + return 0; +}; + + +/** + * @param {number} z Z. + * @param {number} x X. + * @param {number} y Y. + * @return {string} Key. + * @protected + */ +ol.source.Tile.prototype.getKeyZXY = ol.TileCoord.getKeyZXY; + + +/** + * @return {boolean} Opaque. + */ +ol.source.Tile.prototype.getOpaque = function() { + return this.opaque_; +}; + + +/** + * @inheritDoc + */ +ol.source.Tile.prototype.getResolutions = function() { + return this.tileGrid.getResolutions(); +}; + + +/** + * @param {number} z Tile coordinate z. + * @param {number} x Tile coordinate x. + * @param {number} y Tile coordinate y. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection=} opt_projection Projection. + * @return {!ol.Tile} Tile. + */ +ol.source.Tile.prototype.getTile = goog.abstractMethod; + + +/** + * @return {ol.tilegrid.TileGrid} Tile grid. + */ +ol.source.Tile.prototype.getTileGrid = function() { + return this.tileGrid; +}; + + +/** + * @param {ol.proj.Projection} projection Projection. + * @return {ol.tilegrid.TileGrid} Tile grid. + */ +ol.source.Tile.prototype.getTileGridForProjection = function(projection) { + if (goog.isNull(this.tileGrid)) { + return ol.tilegrid.getForProjection(projection); + } else { + return this.tileGrid; + } +}; + + +/** + * @param {number} z Z. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {number} Tile size. + */ +ol.source.Tile.prototype.getTilePixelSize = + function(z, pixelRatio, projection) { + var tileGrid = this.getTileGridForProjection(projection); + return tileGrid.getTileSize(z); +}; + + +/** + * Marks a tile coord as being used, without triggering a load. + * @param {number} z Tile coordinate z. + * @param {number} x Tile coordinate x. + * @param {number} y Tile coordinate y. + */ +ol.source.Tile.prototype.useTile = goog.nullFunction; diff --git a/float-no-zero/ol/ol/source/tilewmssource.exports b/float-no-zero/ol/ol/source/tilewmssource.exports new file mode 100644 index 0000000000..9da9856159 --- /dev/null +++ b/float-no-zero/ol/ol/source/tilewmssource.exports @@ -0,0 +1,4 @@ +@exportSymbol ol.source.TileWMS +@exportProperty ol.source.TileWMS.prototype.getGetFeatureInfoUrl +@exportProperty ol.source.TileWMS.prototype.getParams +@exportProperty ol.source.TileWMS.prototype.updateParams diff --git a/float-no-zero/ol/ol/source/tilewmssource.js b/float-no-zero/ol/ol/source/tilewmssource.js new file mode 100644 index 0000000000..9a3a927f93 --- /dev/null +++ b/float-no-zero/ol/ol/source/tilewmssource.js @@ -0,0 +1,397 @@ +// FIXME add minZoom support +// FIXME add date line wrap (tile coord transform) +// FIXME cannot be shared between maps with different projections + +goog.provide('ol.source.TileWMS'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.math'); +goog.require('goog.object'); +goog.require('goog.string'); +goog.require('goog.uri.utils'); +goog.require('ol.TileCoord'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.extent'); +goog.require('ol.source.TileImage'); +goog.require('ol.source.wms'); +goog.require('ol.source.wms.ServerType'); + + + +/** + * @constructor + * @extends {ol.source.TileImage} + * @param {olx.source.TileWMSOptions=} opt_options Tile WMS options. + * @todo stability experimental + */ +ol.source.TileWMS = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + var params = goog.isDef(options.params) ? options.params : {}; + + var transparent = goog.object.get(params, 'TRANSPARENT', true); + + goog.base(this, { + attributions: options.attributions, + crossOrigin: options.crossOrigin, + extent: options.extent, + logo: options.logo, + opaque: !transparent, + projection: options.projection, + tileGrid: options.tileGrid, + tileLoadFunction: options.tileLoadFunction, + tileUrlFunction: goog.bind(this.tileUrlFunction_, this) + }); + + var urls = options.urls; + if (!goog.isDef(urls) && goog.isDef(options.url)) { + urls = ol.TileUrlFunction.expandUrl(options.url); + } + + /** + * @private + * @type {Array.|undefined} + */ + this.urls_ = urls; + + /** + * @private + * @type {number} + */ + this.gutter_ = goog.isDef(options.gutter) ? options.gutter : 0; + + /** + * @private + * @type {Object} + */ + this.params_ = params; + + /** + * @private + * @type {number} + */ + this.pixelRatio_ = NaN; + + /** + * @private + * @type {boolean} + */ + this.v13_ = true; + + /** + * @private + * @type {ol.source.wms.ServerType|undefined} + */ + this.serverType_ = + /** @type {ol.source.wms.ServerType|undefined} */ (options.serverType); + + /** + * @private + * @type {boolean} + */ + this.hidpi_ = goog.isDef(options.hidpi) ? options.hidpi : true; + + /** + * @private + * @type {string} + */ + this.coordKeyPrefix_ = ''; + this.resetCoordKeyPrefix_(); + + /** + * @private + * @type {ol.Extent} + */ + this.tmpExtent_ = ol.extent.createEmpty(); + + this.updateV13_(); + +}; +goog.inherits(ol.source.TileWMS, ol.source.TileImage); + + +/** + * Return the GetFeatureInfo URL for the passed coordinate, resolution, and + * projection. Return `undefined` if the GetFeatureInfo URL cannot be + * constructed. + * @param {ol.Coordinate} coordinate Coordinate. + * @param {number} resolution Resolution. + * @param {ol.proj.Projection} projection Projection. + * @param {!Object} params GetFeatureInfo params. `INFO_FORMAT` at least should + * be provided. If `QUERY_LAYERS` is not provided then the layers specified + * in the `LAYERS` parameter will be used. `VERSION` should not be + * specified here. + * @return {string|undefined} GetFeatureInfo URL. + */ +ol.source.TileWMS.prototype.getGetFeatureInfoUrl = + function(coordinate, resolution, projection, params) { + + goog.asserts.assert(!('VERSION' in params)); + + var pixelRatio = this.pixelRatio_; + if (isNaN(this.pixelRatio_)) { + return undefined; + } + + var tileGrid = this.getTileGrid(); + if (goog.isNull(tileGrid)) { + tileGrid = this.getTileGridForProjection(projection); + } + + var tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, resolution); + + if (tileGrid.getResolutions().length <= tileCoord.z) { + return undefined; + } + + var tileResolution = tileGrid.getResolution(tileCoord.z); + var tileExtent = tileGrid.getTileCoordExtent( + tileCoord, this.tmpExtent_); + var tileSize = tileGrid.getTileSize(tileCoord.z); + + var gutter = this.gutter_; + if (gutter !== 0) { + tileSize += 2 * gutter; + tileExtent = ol.extent.buffer(tileExtent, + tileResolution * gutter, tileExtent); + } + if (pixelRatio != 1) { + tileSize = (tileSize * pixelRatio + 0.5) | 0; + } + + var baseParams = { + 'SERVICE': 'WMS', + 'VERSION': ol.source.wms.DEFAULT_VERSION, + 'REQUEST': 'GetFeatureInfo', + 'FORMAT': 'image/png', + 'TRANSPARENT': true, + 'QUERY_LAYERS': goog.object.get(this.params_, 'LAYERS') + }; + goog.object.extend(baseParams, this.params_, params); + + var x = Math.floor((coordinate[0] - tileExtent[0]) / + (tileResolution / pixelRatio)); + var y = Math.floor((tileExtent[3] - coordinate[1]) / + (tileResolution / pixelRatio)); + + goog.object.set(baseParams, this.v13_ ? 'I' : 'X', x); + goog.object.set(baseParams, this.v13_ ? 'J' : 'Y', y); + + return this.getRequestUrl_(tileCoord, tileSize, tileExtent, + pixelRatio, projection, baseParams); +}; + + +/** + * @inheritDoc + */ +ol.source.TileWMS.prototype.getGutter = function() { + return this.gutter_; +}; + + +/** + * @inheritDoc + */ +ol.source.TileWMS.prototype.getKeyZXY = function(z, x, y) { + return this.coordKeyPrefix_ + goog.base(this, 'getKeyZXY', z, x, y); +}; + + +/** + * Get the user-provided params, i.e. those passed to the constructor through + * the "params" option, and possibly updated using the updateParams method. + * @return {Object} Params. + * @todo stability experimental + */ +ol.source.TileWMS.prototype.getParams = function() { + return this.params_; +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {number} tileSize Tile size. + * @param {ol.Extent} tileExtent Tile extent. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @param {Object} params Params. + * @return {string|undefined} Request URL. + * @private + */ +ol.source.TileWMS.prototype.getRequestUrl_ = + function(tileCoord, tileSize, tileExtent, + pixelRatio, projection, params) { + + var urls = this.urls_; + if (!goog.isDef(urls) || goog.array.isEmpty(urls)) { + return undefined; + } + + goog.object.set(params, 'WIDTH', tileSize); + goog.object.set(params, 'HEIGHT', tileSize); + + params[this.v13_ ? 'CRS' : 'SRS'] = projection.getCode(); + + if (!('STYLES' in this.params_)) { + goog.object.set(params, 'STYLES', new String('')); + } + + if (pixelRatio != 1) { + switch (this.serverType_) { + case ol.source.wms.ServerType.GEOSERVER: + var dpi = (90 * pixelRatio + 0.5) | 0; + goog.object.set(params, 'FORMAT_OPTIONS', 'dpi:' + dpi); + break; + case ol.source.wms.ServerType.MAPSERVER: + goog.object.set(params, 'MAP_RESOLUTION', 90 * pixelRatio); + break; + case ol.source.wms.ServerType.CARMENTA_SERVER: + case ol.source.wms.ServerType.QGIS: + goog.object.set(params, 'DPI', 90 * pixelRatio); + break; + default: + goog.asserts.fail(); + break; + } + } + + var axisOrientation = projection.getAxisOrientation(); + var bbox = tileExtent; + if (this.v13_ && axisOrientation.substr(0, 2) == 'ne') { + var tmp; + tmp = tileExtent[0]; + bbox[0] = tileExtent[1]; + bbox[1] = tmp; + tmp = tileExtent[2]; + bbox[2] = tileExtent[3]; + bbox[3] = tmp; + } + goog.object.set(params, 'BBOX', bbox.join(',')); + + var url; + if (urls.length == 1) { + url = urls[0]; + } else { + var index = goog.math.modulo(tileCoord.hash(), this.urls_.length); + url = urls[index]; + } + return goog.uri.utils.appendParamsFromMap(url, params); +}; + + +/** + * @param {number} z Z. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {number} Size. + */ +ol.source.TileWMS.prototype.getTilePixelSize = + function(z, pixelRatio, projection) { + var tileSize = goog.base(this, 'getTilePixelSize', z, pixelRatio, projection); + if (pixelRatio == 1 || !this.hidpi_ || !goog.isDef(this.serverType_)) { + return tileSize; + } else { + return (tileSize * pixelRatio + 0.5) | 0; + } +}; + + +/** + * @private + */ +ol.source.TileWMS.prototype.resetCoordKeyPrefix_ = function() { + var i = 0; + var res = []; + for (var key in this.params_) { + res[i++] = key + '-' + this.params_[key]; + } + this.coordKeyPrefix_ = res.join('/'); +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} Tile URL. + * @private + */ +ol.source.TileWMS.prototype.tileUrlFunction_ = + function(tileCoord, pixelRatio, projection) { + + var tileGrid = this.getTileGrid(); + if (goog.isNull(tileGrid)) { + tileGrid = this.getTileGridForProjection(projection); + } + + if (tileGrid.getResolutions().length <= tileCoord.z) { + return undefined; + } + + if (pixelRatio != 1 && (!this.hidpi_ || !goog.isDef(this.serverType_))) { + pixelRatio = 1; + } + + var tileResolution = tileGrid.getResolution(tileCoord.z); + var tileExtent = tileGrid.getTileCoordExtent( + tileCoord, this.tmpExtent_); + var tileSize = tileGrid.getTileSize(tileCoord.z); + + var gutter = this.gutter_; + if (gutter !== 0) { + tileSize += 2 * gutter; + tileExtent = ol.extent.buffer(tileExtent, + tileResolution * gutter, tileExtent); + } + + var extent = this.getExtent(); + if (!goog.isNull(extent) && (!ol.extent.intersects(tileExtent, extent) || + ol.extent.touches(tileExtent, extent))) { + return undefined; + } + + if (pixelRatio != 1) { + tileSize = (tileSize * pixelRatio + 0.5) | 0; + } + + var baseParams = { + 'SERVICE': 'WMS', + 'VERSION': ol.source.wms.DEFAULT_VERSION, + 'REQUEST': 'GetMap', + 'FORMAT': 'image/png', + 'TRANSPARENT': true + }; + goog.object.extend(baseParams, this.params_); + + this.pixelRatio_ = pixelRatio; + + return this.getRequestUrl_(tileCoord, tileSize, tileExtent, + pixelRatio, projection, baseParams); +}; + + +/** + * Update the user-provided params. + * @param {Object} params Params. + * @todo stability experimental + */ +ol.source.TileWMS.prototype.updateParams = function(params) { + goog.object.extend(this.params_, params); + this.resetCoordKeyPrefix_(); + this.updateV13_(); + this.dispatchChangeEvent(); +}; + + +/** + * @private + */ +ol.source.TileWMS.prototype.updateV13_ = function() { + var version = + goog.object.get(this.params_, 'VERSION', ol.source.wms.DEFAULT_VERSION); + this.v13_ = goog.string.compareVersions(version, '1.3') >= 0; +}; diff --git a/float-no-zero/ol/ol/source/topojsonsource.exports b/float-no-zero/ol/ol/source/topojsonsource.exports new file mode 100644 index 0000000000..d56afa819e --- /dev/null +++ b/float-no-zero/ol/ol/source/topojsonsource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.TopoJSON diff --git a/float-no-zero/ol/ol/source/topojsonsource.js b/float-no-zero/ol/ol/source/topojsonsource.js new file mode 100644 index 0000000000..29aff2dadb --- /dev/null +++ b/float-no-zero/ol/ol/source/topojsonsource.js @@ -0,0 +1,32 @@ +goog.provide('ol.source.TopoJSON'); + +goog.require('ol.format.TopoJSON'); +goog.require('ol.source.VectorFile'); + + + +/** + * @constructor + * @extends {ol.source.VectorFile} + * @param {olx.source.TopoJSONOptions=} opt_options Options. + * @todo stability experimental + */ +ol.source.TopoJSON = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, { + attributions: options.attributions, + extent: options.extent, + format: new ol.format.TopoJSON({ + defaultProjection: options.defaultProjection + }), + logo: options.logo, + object: options.object, + projection: options.projection, + text: options.text, + url: options.url + }); + +}; +goog.inherits(ol.source.TopoJSON, ol.source.VectorFile); diff --git a/float-no-zero/ol/ol/source/vectorfilesource.exports b/float-no-zero/ol/ol/source/vectorfilesource.exports new file mode 100644 index 0000000000..acd6140571 --- /dev/null +++ b/float-no-zero/ol/ol/source/vectorfilesource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.VectorFile diff --git a/float-no-zero/ol/ol/source/vectorfilesource.js b/float-no-zero/ol/ol/source/vectorfilesource.js new file mode 100644 index 0000000000..d003037170 --- /dev/null +++ b/float-no-zero/ol/ol/source/vectorfilesource.js @@ -0,0 +1,167 @@ +// FIXME consider delaying feature reading so projection can be provided by +// consumer (e.g. the view) + +goog.provide('ol.source.VectorFile'); + +goog.require('goog.asserts'); +goog.require('goog.dispose'); +goog.require('goog.events'); +goog.require('goog.net.EventType'); +goog.require('goog.net.XhrIo'); +goog.require('goog.net.XhrIo.ResponseType'); +goog.require('goog.userAgent'); +goog.require('ol.BrowserFeature'); +goog.require('ol.format.FormatType'); +goog.require('ol.proj'); +goog.require('ol.source.State'); +goog.require('ol.source.Vector'); +goog.require('ol.xml'); + + + +/** + * @constructor + * @extends {ol.source.Vector} + * @param {olx.source.VectorFileOptions=} opt_options Options. + * @todo stability experimental + */ +ol.source.VectorFile = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, { + attributions: options.attributions, + extent: options.extent, + logo: options.logo, + projection: options.projection + }); + + /** + * @type {ol.format.Feature} + * @protected + */ + this.format = options.format; + + if (goog.isDef(options.doc)) { + this.readFeatures_(options.doc); + } + + if (goog.isDef(options.node)) { + this.readFeatures_(options.node); + } + + if (goog.isDef(options.object)) { + this.readFeatures_(options.object); + } + + if (goog.isDef(options.text)) { + this.readFeatures_(options.text); + } + + if (goog.isDef(options.arrayBuffer)) { + this.readFeatures_(options.arrayBuffer); + } + + if (goog.isDef(options.url) || goog.isDef(options.urls)) { + this.setState(ol.source.State.LOADING); + + var type = this.format.getType(); + var responseType; + if (type == ol.format.FormatType.BINARY && + ol.BrowserFeature.HAS_ARRAY_BUFFER) { + responseType = goog.net.XhrIo.ResponseType.ARRAY_BUFFER; + } else { + responseType = goog.net.XhrIo.ResponseType.TEXT; + } + var xhrIo; + if (goog.isDef(options.url)) { + xhrIo = new goog.net.XhrIo(); + xhrIo.setResponseType(responseType); + goog.events.listen(xhrIo, goog.net.EventType.COMPLETE, + goog.bind(this.handleXhrIo_, this)); + xhrIo.send(options.url); + } + if (goog.isDef(options.urls)) { + var urls = options.urls; + var i, ii; + for (i = 0, ii = urls.length; i < ii; ++i) { + xhrIo = new goog.net.XhrIo(); + xhrIo.setResponseType(responseType); + goog.events.listen(xhrIo, goog.net.EventType.COMPLETE, + goog.bind(this.handleXhrIo_, this)); + xhrIo.send(urls[i]); + } + } + } + +}; +goog.inherits(ol.source.VectorFile, ol.source.Vector); + + +/** + * @param {Event} event Event. + * @private + */ +ol.source.VectorFile.prototype.handleXhrIo_ = function(event) { + var xhrIo = event.target; + goog.asserts.assertInstanceof(xhrIo, goog.net.XhrIo); + if (xhrIo.isSuccess()) { + var type = this.format.getType(); + /** @type {ArrayBuffer|Document|Node|Object|string|undefined} */ + var source; + if (type == ol.format.FormatType.BINARY && + ol.BrowserFeature.HAS_ARRAY_BUFFER) { + source = xhrIo.getResponse(); + goog.asserts.assertInstanceof(source, ArrayBuffer); + } else if (type == ol.format.FormatType.JSON) { + source = xhrIo.getResponseJson(); + } else if (type == ol.format.FormatType.TEXT) { + source = xhrIo.getResponseText(); + } else if (type == ol.format.FormatType.XML) { + if (!goog.userAgent.IE) { + source = xhrIo.getResponseXml(); + } + if (!goog.isDefAndNotNull(source)) { + source = ol.xml.load(xhrIo.getResponseText()); + } + } else { + goog.asserts.fail(); + } + goog.dispose(xhrIo); + if (goog.isDefAndNotNull(source)) { + this.readFeatures_(source); + } else { + this.setState(ol.source.State.ERROR); + goog.asserts.fail(); + } + } else { + this.setState(ol.source.State.ERROR); + } +}; + + +/** + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @private + */ +ol.source.VectorFile.prototype.readFeatures_ = function(source) { + var format = this.format; + var features = format.readFeatures(source); + var featureProjection = format.readProjection(source); + var projection = this.getProjection(); + if (!goog.isNull(projection)) { + if (!ol.proj.equivalent(featureProjection, projection)) { + var transform = ol.proj.getTransform(featureProjection, projection); + var i, ii; + for (i = 0, ii = features.length; i < ii; ++i) { + var feature = features[i]; + var geometry = feature.getGeometry(); + if (!goog.isNull(geometry)) { + geometry.transform(transform); + } + } + } + } + this.addFeaturesInternal(features); + this.setState(ol.source.State.READY); +}; diff --git a/float-no-zero/ol/ol/source/vectorsource.exports b/float-no-zero/ol/ol/source/vectorsource.exports new file mode 100644 index 0000000000..467542675a --- /dev/null +++ b/float-no-zero/ol/ol/source/vectorsource.exports @@ -0,0 +1,10 @@ +@exportSymbol ol.source.Vector +@exportProperty ol.source.Vector.prototype.addFeature +@exportProperty ol.source.Vector.prototype.addFeatures +@exportProperty ol.source.Vector.prototype.forEachFeature +@exportProperty ol.source.Vector.prototype.forEachFeatureInExtent +@exportProperty ol.source.Vector.prototype.getFeatures +@exportProperty ol.source.Vector.prototype.getFeaturesAtCoordinate +@exportProperty ol.source.Vector.prototype.getClosestFeatureToCoordinate +@exportProperty ol.source.Vector.prototype.getExtent +@exportProperty ol.source.Vector.prototype.removeFeature diff --git a/float-no-zero/ol/ol/source/vectorsource.js b/float-no-zero/ol/ol/source/vectorsource.js new file mode 100644 index 0000000000..6d25fe1660 --- /dev/null +++ b/float-no-zero/ol/ol/source/vectorsource.js @@ -0,0 +1,372 @@ +// FIXME bulk feature upload - suppress events +// FIXME put features in an ol.Collection +// FIXME make change-detection more refined (notably, geometry hint) + +goog.provide('ol.source.Vector'); +goog.provide('ol.source.VectorEvent'); +goog.provide('ol.source.VectorEventType'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.Event'); +goog.require('goog.events.EventType'); +goog.require('goog.object'); +goog.require('ol.source.Source'); +goog.require('ol.structs.RBush'); + + +/** + * @enum {string} + */ +ol.source.VectorEventType = { + ADDFEATURE: 'addfeature', + REMOVEFEATURE: 'removefeature' +}; + + + +/** + * @constructor + * @extends {ol.source.Source} + * @param {olx.source.VectorOptions=} opt_options Vector source options. + * @todo stability experimental + */ +ol.source.Vector = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this, { + attributions: options.attributions, + extent: options.extent, + logo: options.logo, + projection: options.projection, + state: options.state + }); + + /** + * @private + * @type {ol.structs.RBush.} + */ + this.rBush_ = new ol.structs.RBush(); + + /** + * @private + * @type {Object.} + */ + this.nullGeometryFeatures_ = {}; + + /** + * @private + * @type {Object.} + */ + this.featureChangeKeys_ = {}; + + if (goog.isDef(options.features)) { + this.addFeaturesInternal(options.features); + } + +}; +goog.inherits(ol.source.Vector, ol.source.Source); + + +/** + * @param {ol.Feature} feature Feature. + * @todo stability experimental + */ +ol.source.Vector.prototype.addFeature = function(feature) { + this.addFeatureInternal(feature); + this.dispatchChangeEvent(); +}; + + +/** + * Add a feature without firing a `change` event. + * @param {ol.Feature} feature Feature. + * @protected + */ +ol.source.Vector.prototype.addFeatureInternal = function(feature) { + var featureKey = goog.getUid(feature).toString(); + goog.asserts.assert(!(featureKey in this.featureChangeKeys_)); + this.featureChangeKeys_[featureKey] = goog.events.listen(feature, + goog.events.EventType.CHANGE, this.handleFeatureChange_, false, this); + var geometry = feature.getGeometry(); + if (goog.isNull(geometry)) { + this.nullGeometryFeatures_[goog.getUid(feature).toString()] = feature; + } else { + var extent = geometry.getExtent(); + this.rBush_.insert(extent, feature); + } + this.dispatchEvent( + new ol.source.VectorEvent(ol.source.VectorEventType.ADDFEATURE, feature)); +}; + + +/** + * @param {Array.} features Features. + * @todo stability experimental + */ +ol.source.Vector.prototype.addFeatures = function(features) { + this.addFeaturesInternal(features); + this.dispatchChangeEvent(); +}; + + +/** + * Add features without firing a `change` event. + * @param {Array.} features Features. + * @protected + */ +ol.source.Vector.prototype.addFeaturesInternal = function(features) { + // FIXME use R-Bush bulk load when available + var i, ii; + for (i = 0, ii = features.length; i < ii; ++i) { + this.addFeatureInternal(features[i]); + } +}; + + +/** + * @todo stability experimental + */ +ol.source.Vector.prototype.clear = function() { + this.rBush_.forEach(this.removeFeatureInternal, this); + this.rBush_.clear(); + goog.object.forEach( + this.nullGeometryFeatures_, this.removeFeatureInternal, this); + goog.object.clear(this.nullGeometryFeatures_); + goog.asserts.assert(goog.object.isEmpty(this.featureChangeKeys_)); + this.dispatchChangeEvent(); +}; + + +/** + * @param {function(this: T, ol.Feature): S} f Callback. + * @param {T=} opt_this The object to use as `this` in `f`. + * @return {S|undefined} + * @template T,S + * @todo stability experimental + */ +ol.source.Vector.prototype.forEachFeature = function(f, opt_this) { + return this.rBush_.forEach(f, opt_this); +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @param {function(this: T, ol.Feature): S} f Callback. + * @param {T=} opt_this The object to use as `this` in `f`. + * @return {S|undefined} + * @template T,S + * @todo stability experimental + */ +ol.source.Vector.prototype.forEachFeatureAtCoordinate = + function(coordinate, f, opt_this) { + var extent = [coordinate[0], coordinate[1], coordinate[0], coordinate[1]]; + return this.forEachFeatureInExtent(extent, function(feature) { + var geometry = feature.getGeometry(); + goog.asserts.assert(!goog.isNull(geometry)); + if (geometry.containsCoordinate(coordinate)) { + return f.call(opt_this, feature); + } else { + return undefined; + } + }); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {function(this: T, ol.Feature): S} f Callback. + * @param {T=} opt_this The object to use as `this` in `f`. + * @return {S|undefined} + * @template T,S + * @todo stability experimental + */ +ol.source.Vector.prototype.forEachFeatureInExtent = + function(extent, f, opt_this) { + return this.rBush_.forEachInExtent(extent, f, opt_this); +}; + + +/** + * @return {Array.} Features. + * @todo stability experimental + */ +ol.source.Vector.prototype.getFeatures = function() { + var features = this.rBush_.getAll(); + if (!goog.object.isEmpty(this.nullGeometryFeatures_)) { + goog.array.extend( + features, goog.object.getValues(this.nullGeometryFeatures_)); + } + return features; +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @return {Array.} Features. + * @todo stability experimental + */ +ol.source.Vector.prototype.getFeaturesAtCoordinate = function(coordinate) { + var features = []; + this.forEachFeatureAtCoordinate(coordinate, function(feature) { + features.push(feature); + }); + return features; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {Array.} Features. + * @todo stability experimental + */ +ol.source.Vector.prototype.getFeaturesInExtent = function(extent) { + return this.rBush_.getInExtent(extent); +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol.Feature} Closest feature. + * @todo stability experimental + */ +ol.source.Vector.prototype.getClosestFeatureToCoordinate = + function(coordinate) { + // Find the closest feature using branch and bound. We start searching an + // infinite extent, and find the distance from the first feature found. This + // becomes the closest feature. We then compute a smaller extent which any + // closer feature must intersect. We continue searching with this smaller + // extent, trying to find a closer feature. Every time we find a closer + // feature, we update the extent being searched so that any even closer + // feature must intersect it. We continue until we run out of features. + var x = coordinate[0]; + var y = coordinate[1]; + var closestFeature = null; + var closestPoint = [NaN, NaN]; + var minSquaredDistance = Infinity; + var extent = [-Infinity, -Infinity, Infinity, Infinity]; + this.rBush_.forEachInExtent(extent, + /** + * @param {ol.Feature} feature Feature. + */ + function(feature) { + var geometry = feature.getGeometry(); + goog.asserts.assert(!goog.isNull(geometry)); + var previousMinSquaredDistance = minSquaredDistance; + minSquaredDistance = geometry.closestPointXY( + x, y, closestPoint, minSquaredDistance); + if (minSquaredDistance < previousMinSquaredDistance) { + closestFeature = feature; + // This is sneaky. Reduce the extent that it is currently being + // searched while the R-Tree traversal using this same extent object + // is still in progress. This is safe because the new extent is + // strictly contained by the old extent. + var minDistance = Math.sqrt(minSquaredDistance); + extent[0] = x - minDistance; + extent[1] = y - minDistance; + extent[2] = x + minDistance; + extent[3] = y + minDistance; + } + }); + return closestFeature; +}; + + +/** + * @return {ol.Extent} Extent. + * @todo stability experimental + */ +ol.source.Vector.prototype.getExtent = function() { + return this.rBush_.getExtent(); +}; + + +/** + * @param {goog.events.Event} event Event. + * @private + */ +ol.source.Vector.prototype.handleFeatureChange_ = function(event) { + var feature = /** @type {ol.Feature} */ (event.target); + var featureKey = goog.getUid(feature).toString(); + var geometry = feature.getGeometry(); + if (goog.isNull(geometry)) { + if (!(featureKey in this.nullGeometryFeatures_)) { + this.rBush_.remove(feature); + this.nullGeometryFeatures_[featureKey] = feature; + } + } else { + var extent = geometry.getExtent(); + if (featureKey in this.nullGeometryFeatures_) { + delete this.nullGeometryFeatures_[featureKey]; + this.rBush_.insert(extent, feature); + } else { + this.rBush_.update(extent, feature); + } + } + this.dispatchChangeEvent(); +}; + + +/** + * @return {boolean} Is empty. + * @todo stability experimental + */ +ol.source.Vector.prototype.isEmpty = function() { + return this.rBush_.isEmpty() && + goog.object.isEmpty(this.nullGeometryFeatures_); +}; + + +/** + * @param {ol.Feature} feature Feature. + * @todo stability experimental + */ +ol.source.Vector.prototype.removeFeature = function(feature) { + var featureKey = goog.getUid(feature).toString(); + if (featureKey in this.nullGeometryFeatures_) { + delete this.nullGeometryFeatures_[featureKey]; + } else { + this.rBush_.remove(feature); + } + this.removeFeatureInternal(feature); + this.dispatchChangeEvent(); +}; + + +/** + * Remove feature without firing a `change` event. + * @param {ol.Feature} feature Feature. + * @protected + */ +ol.source.Vector.prototype.removeFeatureInternal = function(feature) { + var featureKey = goog.getUid(feature).toString(); + goog.asserts.assert(featureKey in this.featureChangeKeys_); + goog.events.unlistenByKey(this.featureChangeKeys_[featureKey]); + delete this.featureChangeKeys_[featureKey]; + this.dispatchEvent(new ol.source.VectorEvent( + ol.source.VectorEventType.REMOVEFEATURE, feature)); +}; + + + +/** + * @constructor + * @extends {goog.events.Event} + * @implements {oli.source.VectorEvent} + * @param {string} type Type. + * @param {ol.Feature=} opt_feature Feature. + * @todo stability experimental + */ +ol.source.VectorEvent = function(type, opt_feature) { + + goog.base(this, type); + + /** + * @type {ol.Feature|undefined} + */ + this.feature = opt_feature; + +}; +goog.inherits(ol.source.VectorEvent, goog.events.Event); diff --git a/float-no-zero/ol/ol/source/wmssource.js b/float-no-zero/ol/ol/source/wmssource.js new file mode 100644 index 0000000000..1c19281272 --- /dev/null +++ b/float-no-zero/ol/ol/source/wmssource.js @@ -0,0 +1,19 @@ +goog.provide('ol.source.wms'); +goog.provide('ol.source.wms.ServerType'); + + +/** + * @define {string} WMS default version. + */ +ol.source.wms.DEFAULT_VERSION = '1.3.0'; + + +/** + * @enum {string} + */ +ol.source.wms.ServerType = { + CARMENTA_SERVER: 'carmentaserver', + GEOSERVER: 'geoserver', + MAPSERVER: 'mapserver', + QGIS: 'qgis' +}; diff --git a/float-no-zero/ol/ol/source/wmtssource.exports b/float-no-zero/ol/ol/source/wmtssource.exports new file mode 100644 index 0000000000..a81ed65df0 --- /dev/null +++ b/float-no-zero/ol/ol/source/wmtssource.exports @@ -0,0 +1,4 @@ +@exportSymbol ol.source.WMTS +@exportProperty ol.source.WMTS.prototype.getDimensions +@exportProperty ol.source.WMTS.prototype.updateDimensions +@exportSymbol ol.source.WMTS.optionsFromCapabilities diff --git a/float-no-zero/ol/ol/source/wmtssource.js b/float-no-zero/ol/ol/source/wmtssource.js new file mode 100644 index 0000000000..bd0d7c514b --- /dev/null +++ b/float-no-zero/ol/ol/source/wmtssource.js @@ -0,0 +1,331 @@ +goog.provide('ol.source.WMTS'); +goog.provide('ol.source.WMTSRequestEncoding'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.math'); +goog.require('goog.object'); +goog.require('goog.uri.utils'); +goog.require('ol.TileCoord'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.TileUrlFunctionType'); +goog.require('ol.extent'); +goog.require('ol.proj'); +goog.require('ol.source.TileImage'); +goog.require('ol.tilegrid.WMTS'); + + +/** + * @enum {string} + */ +ol.source.WMTSRequestEncoding = { + KVP: 'KVP', // see spec §8 + REST: 'REST' // see spec §10 +}; + + + +/** + * @constructor + * @extends {ol.source.TileImage} + * @param {olx.source.WMTSOptions} options WMTS options. + * @todo stability experimental + */ +ol.source.WMTS = function(options) { + + // TODO: add support for TileMatrixLimits + + var version = goog.isDef(options.version) ? options.version : '1.0.0'; + var format = goog.isDef(options.format) ? options.format : 'image/jpeg'; + + /** + * @private + * @type {Object} + */ + this.dimensions_ = options.dimensions || {}; + + /** + * @private + * @type {string} + */ + this.coordKeyPrefix_ = ''; + this.resetCoordKeyPrefix_(); + + // FIXME: should we guess this requestEncoding from options.url(s) + // structure? that would mean KVP only if a template is not provided. + var requestEncoding = goog.isDef(options.requestEncoding) ? + options.requestEncoding : ol.source.WMTSRequestEncoding.KVP; + + // FIXME: should we create a default tileGrid? + // we could issue a getCapabilities xhr to retrieve missing configuration + var tileGrid = options.tileGrid; + + var context = { + 'Layer': options.layer, + 'style': options.style, + 'Style': options.style, + 'TileMatrixSet': options.matrixSet + }; + + if (requestEncoding == ol.source.WMTSRequestEncoding.KVP) { + goog.object.extend(context, { + 'Service': 'WMTS', + 'Request': 'GetTile', + 'Version': version, + 'Format': format + }); + } + + /** + * @param {string} template Template. + * @return {ol.TileUrlFunctionType} Tile URL function. + */ + function createFromWMTSTemplate(template) { + + // TODO: we may want to create our own appendParams function so that params + // order conforms to wmts spec guidance, and so that we can avoid to escape + // special template params + + template = (requestEncoding == ol.source.WMTSRequestEncoding.KVP) ? + goog.uri.utils.appendParamsFromMap(template, context) : + template.replace(/\{(\w+?)\}/g, function(m, p) { + return (p in context) ? context[p] : m; + }); + + return ( + /** + * @this {ol.source.WMTS} + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} Tile URL. + */ + function(tileCoord, pixelRatio, projection) { + if (goog.isNull(tileCoord)) { + return undefined; + } else { + var localContext = { + 'TileMatrix': tileGrid.getMatrixId(tileCoord.z), + 'TileCol': tileCoord.x, + 'TileRow': tileCoord.y + }; + goog.object.extend(localContext, this.dimensions_); + var url = template; + if (requestEncoding == ol.source.WMTSRequestEncoding.KVP) { + url = goog.uri.utils.appendParamsFromMap(url, localContext); + } else { + url = url.replace(/\{(\w+?)\}/g, function(m, p) { + return localContext[p]; + }); + } + return url; + } + }); + } + + var tileUrlFunction = ol.TileUrlFunction.nullTileUrlFunction; + var urls = options.urls; + if (!goog.isDef(urls) && goog.isDef(options.url)) { + urls = ol.TileUrlFunction.expandUrl(options.url); + } + if (goog.isDef(urls)) { + tileUrlFunction = ol.TileUrlFunction.createFromTileUrlFunctions( + goog.array.map(urls, createFromWMTSTemplate)); + } + + var tmpExtent = ol.extent.createEmpty(); + var tmpTileCoord = new ol.TileCoord(0, 0, 0); + tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + /** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.proj.Projection} projection Projection. + * @param {ol.TileCoord=} opt_tileCoord Tile coordinate. + * @return {ol.TileCoord} Tile coordinate. + */ + function(tileCoord, projection, opt_tileCoord) { + var tileGrid = this.getTileGrid(); + goog.asserts.assert(!goog.isNull(tileGrid)); + if (tileGrid.getResolutions().length <= tileCoord.z) { + return null; + } + var x = tileCoord.x; + var y = -tileCoord.y - 1; + var tileExtent = tileGrid.getTileCoordExtent(tileCoord); + var projectionExtent = projection.getExtent(); + var extent = goog.isDef(options.extent) ? + options.extent : projectionExtent; + + if (!goog.isNull(extent) && projection.isGlobal() && + extent[0] === projectionExtent[0] && + extent[2] === projectionExtent[2]) { + var numCols = Math.ceil( + (extent[2] - extent[0]) / + (tileExtent[2] - tileExtent[0])); + x = goog.math.modulo(x, numCols); + tmpTileCoord.z = tileCoord.z; + tmpTileCoord.x = x; + tmpTileCoord.y = tileCoord.y; + tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord, tmpExtent); + } + if (!ol.extent.intersects(tileExtent, extent) || + ol.extent.touches(tileExtent, extent)) { + return null; + } + return new ol.TileCoord(tileCoord.z, x, y); + }, + tileUrlFunction); + + goog.base(this, { + attributions: options.attributions, + crossOrigin: options.crossOrigin, + extent: options.extent, + logo: options.logo, + projection: options.projection, + tileGrid: tileGrid, + tileLoadFunction: options.tileLoadFunction, + tileUrlFunction: tileUrlFunction + }); + +}; +goog.inherits(ol.source.WMTS, ol.source.TileImage); + + +/** + * Get the dimensions, i.e. those passed to the constructor through the + * "dimensions" option, and possibly updated using the updateDimensions + * method. + * @return {Object} Dimensions. + * @todo stability experimental + */ +ol.source.WMTS.prototype.getDimensions = function() { + return this.dimensions_; +}; + + +/** + * @inheritDoc + */ +ol.source.WMTS.prototype.getKeyZXY = function(z, x, y) { + return this.coordKeyPrefix_ + goog.base(this, 'getKeyZXY', z, x, y); +}; + + +/** + * @private + */ +ol.source.WMTS.prototype.resetCoordKeyPrefix_ = function() { + var i = 0; + var res = []; + for (var key in this.dimensions_) { + res[i++] = key + '-' + this.dimensions_[key]; + } + this.coordKeyPrefix_ = res.join('/'); +}; + + +/** + * Update the dimensions. + * @param {Object} dimensions Dimensions. + * @todo stability experimental + */ +ol.source.WMTS.prototype.updateDimensions = function(dimensions) { + goog.object.extend(this.dimensions_, dimensions); + this.resetCoordKeyPrefix_(); + this.dispatchChangeEvent(); +}; + + +/** + * @param {Object} wmtsCap An object representing the capabilities document. + * @param {string} layer The layer identifier. + * @return {olx.source.WMTSOptions} WMTS source options object. + * @todo stability experimental + */ +ol.source.WMTS.optionsFromCapabilities = function(wmtsCap, layer) { + + // TODO: add support for TileMatrixLimits + + var layers = wmtsCap['contents']['layers']; + var l = goog.array.find(layers, function(elt, index, array) { + return elt['identifier'] == layer; + }); + goog.asserts.assert(!goog.isNull(l)); + goog.asserts.assert(l['tileMatrixSetLinks'].length > 0); + var matrixSet = /** @type {string} */ + (l['tileMatrixSetLinks'][0]['tileMatrixSet']); + var format = /** @type {string} */ (l['formats'][0]); + var idx = goog.array.findIndex(l['styles'], function(elt, index, array) { + return elt['isDefault']; + }); + if (idx < 0) { + idx = 0; + } + var style = /** @type {string} */ (l['styles'][idx]['identifier']); + + var dimensions = {}; + goog.array.forEach(l['dimensions'], function(elt, index, array) { + var key = elt['identifier']; + var value = elt['default']; + if (goog.isDef(value)) { + goog.asserts.assert(goog.array.indexOf(elt['values'], value) >= 0); + } else { + value = elt['values'][0]; + } + goog.asserts.assert(goog.isDef(value)); + dimensions[key] = value; + }); + + var matrixSets = wmtsCap['contents']['tileMatrixSets']; + goog.asserts.assert(matrixSet in matrixSets); + var matrixSetObj = matrixSets[matrixSet]; + + var tileGrid = ol.tilegrid.WMTS.createFromCapabilitiesMatrixSet( + matrixSetObj); + + var projection = ol.proj.get(matrixSetObj['supportedCRS']); + + var gets = wmtsCap['operationsMetadata']['GetTile']['dcp']['http']['get']; + var encodings = goog.object.getKeys( + gets[0]['constraints']['GetEncoding']['allowedValues']); + goog.asserts.assert(encodings.length > 0); + + var urls; + var requestEncoding; + switch (encodings[0]) { + case 'REST': + case 'RESTful': + // The OGC documentation is not clear if we should use REST or RESTful, + // ArcGis use RESTful, and OpenLayers use REST. + requestEncoding = ol.source.WMTSRequestEncoding.REST; + goog.asserts.assert(l['resourceUrls'].hasOwnProperty('tile')); + goog.asserts.assert(l['resourceUrls']['tile'].hasOwnProperty(format)); + urls = /** @type {Array.} */ + (l['resourceUrls']['tile'][format]); + break; + case 'KVP': + requestEncoding = ol.source.WMTSRequestEncoding.KVP; + urls = []; + goog.array.forEach(gets, function(elt, index, array) { + if (elt['constraints']['GetEncoding']['allowedValues'].hasOwnProperty( + ol.source.WMTSRequestEncoding.KVP)) { + urls.push(/** @type {string} */ (elt['url'])); + } + }); + goog.asserts.assert(urls.length > 0); + break; + default: + goog.asserts.fail(); + } + + return { + urls: urls, + layer: layer, + matrixSet: matrixSet, + format: format, + projection: projection, + requestEncoding: requestEncoding, + tileGrid: tileGrid, + style: style, + dimensions: dimensions + }; +}; diff --git a/float-no-zero/ol/ol/source/xyzsource.exports b/float-no-zero/ol/ol/source/xyzsource.exports new file mode 100644 index 0000000000..3968a05264 --- /dev/null +++ b/float-no-zero/ol/ol/source/xyzsource.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.source.XYZ +@exportProperty ol.source.XYZ.prototype.setUrl diff --git a/float-no-zero/ol/ol/source/xyzsource.js b/float-no-zero/ol/ol/source/xyzsource.js new file mode 100644 index 0000000000..b41ff92de5 --- /dev/null +++ b/float-no-zero/ol/ol/source/xyzsource.js @@ -0,0 +1,84 @@ +goog.provide('ol.source.XYZ'); + +goog.require('ol.Attribution'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.TileUrlFunctionType'); +goog.require('ol.proj'); +goog.require('ol.source.TileImage'); +goog.require('ol.tilegrid.XYZ'); + + + +/** + * @constructor + * @extends {ol.source.TileImage} + * @param {olx.source.XYZOptions} options XYZ options. + * @todo stability experimental + */ +ol.source.XYZ = function(options) { + + var projection = options.projection || ol.proj.get('EPSG:3857'); + + var maxZoom = goog.isDef(options.maxZoom) ? options.maxZoom : 18; + + var tileGrid = new ol.tilegrid.XYZ({ + maxZoom: maxZoom + }); + + goog.base(this, { + attributions: options.attributions, + crossOrigin: options.crossOrigin, + extent: options.extent, + logo: options.logo, + projection: projection, + tileGrid: tileGrid, + tileLoadFunction: options.tileLoadFunction, + tileUrlFunction: ol.TileUrlFunction.nullTileUrlFunction + }); + + /** + * @private + * @type {ol.TileCoordTransformType} + */ + this.tileCoordTransform_ = tileGrid.createTileCoordTransform({ + extent: options.extent + }); + + if (goog.isDef(options.tileUrlFunction)) { + this.setTileUrlFunction(options.tileUrlFunction); + } else if (goog.isDef(options.urls)) { + this.setUrls(options.urls); + } else if (goog.isDef(options.url)) { + this.setUrl(options.url); + } + +}; +goog.inherits(ol.source.XYZ, ol.source.TileImage); + + +/** + * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function. + */ +ol.source.XYZ.prototype.setTileUrlFunction = function(tileUrlFunction) { + goog.base(this, 'setTileUrlFunction', + ol.TileUrlFunction.withTileCoordTransform( + this.tileCoordTransform_, tileUrlFunction)); +}; + + +/** + * @param {string} url URL. + * @todo stability experimental + */ +ol.source.XYZ.prototype.setUrl = function(url) { + this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates( + ol.TileUrlFunction.expandUrl(url))); +}; + + +/** + * @param {Array.} urls URLs. + */ +ol.source.XYZ.prototype.setUrls = function(urls) { + this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates(urls)); +}; diff --git a/float-no-zero/ol/ol/source/zoomifysource.exports b/float-no-zero/ol/ol/source/zoomifysource.exports new file mode 100644 index 0000000000..38f7c1657b --- /dev/null +++ b/float-no-zero/ol/ol/source/zoomifysource.exports @@ -0,0 +1 @@ +@exportSymbol ol.source.Zoomify diff --git a/float-no-zero/ol/ol/source/zoomifysource.js b/float-no-zero/ol/ol/source/zoomifysource.js new file mode 100644 index 0000000000..45cc6febdf --- /dev/null +++ b/float-no-zero/ol/ol/source/zoomifysource.js @@ -0,0 +1,184 @@ +goog.provide('ol.source.Zoomify'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('ol.ImageTile'); +goog.require('ol.TileCoord'); +goog.require('ol.TileState'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.proj'); +goog.require('ol.source.TileImage'); +goog.require('ol.tilegrid.Zoomify'); + + +/** + * @enum {string} + */ +ol.source.ZoomifyTierSizeCalculation = { + DEFAULT: 'default', + TRUNCATED: 'truncated' +}; + + + +/** + * @constructor + * @extends {ol.source.TileImage} + * @param {olx.source.ZoomifyOptions=} opt_options Options. + * @todo stability experimental + */ +ol.source.Zoomify = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + var size = options.size; + var tierSizeCalculation = goog.isDef(options.tierSizeCalculation) ? + options.tierSizeCalculation : + ol.source.ZoomifyTierSizeCalculation.DEFAULT; + + var imageWidth = size[0]; + var imageHeight = size[1]; + var tierSizeInTiles = []; + var tileSize = ol.DEFAULT_TILE_SIZE; + + switch (tierSizeCalculation) { + case ol.source.ZoomifyTierSizeCalculation.DEFAULT: + while (imageWidth > tileSize || imageHeight > tileSize) { + tierSizeInTiles.push([ + Math.ceil(imageWidth / tileSize), + Math.ceil(imageHeight / tileSize) + ]); + tileSize += tileSize; + } + break; + case ol.source.ZoomifyTierSizeCalculation.TRUNCATED: + var width = imageWidth; + var height = imageHeight; + while (width > tileSize || height > tileSize) { + tierSizeInTiles.push([ + Math.ceil(width / tileSize), + Math.ceil(height / tileSize) + ]); + width >>= 1; + height >>= 1; + } + break; + default: + goog.asserts.fail(); + break; + } + + tierSizeInTiles.push([1, 1]); + tierSizeInTiles.reverse(); + + var resolutions = [1]; + var tileCountUpToTier = [0]; + var i, ii; + for (i = 1, ii = tierSizeInTiles.length; i < ii; i++) { + resolutions.push(1 << i); + tileCountUpToTier.push( + tierSizeInTiles[i - 1][0] * tierSizeInTiles[i - 1][1] + + tileCountUpToTier[i - 1] + ); + } + resolutions.reverse(); + + var tileGrid = new ol.tilegrid.Zoomify({ + resolutions: resolutions + }); + + var url = options.url; + var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + tileGrid.createTileCoordTransform({extent: [0, 0, size[0], size[1]]}), + /** + * @this {ol.source.TileImage} + * @param {ol.TileCoord} tileCoord Tile Coordinate. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} Tile URL. + */ + function(tileCoord, pixelRatio, projection) { + if (goog.isNull(tileCoord)) { + return undefined; + } else { + var tileIndex = tileCoord.x + + tileCoord.y * tierSizeInTiles[tileCoord.z][0] + + tileCountUpToTier[tileCoord.z]; + var tileGroup = (tileIndex / ol.DEFAULT_TILE_SIZE) | 0; + return url + 'TileGroup' + tileGroup + '/' + + tileCoord.z + '-' + tileCoord.x + '-' + tileCoord.y + '.jpg'; + } + }); + + goog.base(this, { + attributions: options.attributions, + crossOrigin: options.crossOrigin, + logo: options.logo, + tileClass: ol.source.ZoomifyTile_, + tileGrid: tileGrid, + tileUrlFunction: tileUrlFunction + }); + +}; +goog.inherits(ol.source.Zoomify, ol.source.TileImage); + + + +/** + * @constructor + * @extends {ol.ImageTile} + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.TileState} state State. + * @param {string} src Image source URI. + * @param {?string} crossOrigin Cross origin. + * @param {ol.TileLoadFunctionType} tileLoadFunction Tile load function. + * @private + */ +ol.source.ZoomifyTile_ = function( + tileCoord, state, src, crossOrigin, tileLoadFunction) { + + goog.base(this, tileCoord, state, src, crossOrigin, tileLoadFunction); + + /** + * @private + * @type {Object.} + */ + this.zoomifyImageByContext_ = {}; + +}; +goog.inherits(ol.source.ZoomifyTile_, ol.ImageTile); + + +/** + * @inheritDoc + */ +ol.source.ZoomifyTile_.prototype.getImage = function(opt_context) { + var key = goog.isDef(opt_context) ? goog.getUid(opt_context).toString() : ''; + if (key in this.zoomifyImageByContext_) { + return this.zoomifyImageByContext_[key]; + } else { + var image = goog.base(this, 'getImage', opt_context); + if (this.state == ol.TileState.LOADED) { + if (image.width == ol.DEFAULT_TILE_SIZE && + image.height == ol.DEFAULT_TILE_SIZE) { + this.zoomifyImageByContext_[key] = image; + return image; + } else { + var canvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas.width = ol.DEFAULT_TILE_SIZE; + canvas.height = ol.DEFAULT_TILE_SIZE; + var context = /** @type {CanvasRenderingContext2D} */ + (canvas.getContext('2d')); + context.drawImage(image, 0, 0); + this.zoomifyImageByContext_[key] = canvas; + return canvas; + } + } else { + return image; + } + } +}; diff --git a/float-no-zero/ol/ol/sphere/normal.js b/float-no-zero/ol/ol/sphere/normal.js new file mode 100644 index 0000000000..70e6f8e165 --- /dev/null +++ b/float-no-zero/ol/ol/sphere/normal.js @@ -0,0 +1,11 @@ +goog.provide('ol.sphere.NORMAL'); + +goog.require('ol.Sphere'); + + +/** + * The normal sphere. + * @const + * @type {ol.Sphere} + */ +ol.sphere.NORMAL = new ol.Sphere(6370997); diff --git a/float-no-zero/ol/ol/sphere/sphere.js b/float-no-zero/ol/ol/sphere/sphere.js new file mode 100644 index 0000000000..825d843263 --- /dev/null +++ b/float-no-zero/ol/ol/sphere/sphere.js @@ -0,0 +1,187 @@ +/** + * @license + * Latitude/longitude spherical geodesy formulae taken from + * http://www.movable-type.co.uk/scripts/latlong.html + * Licenced under CC-BY-3.0. + */ + +// FIXME add intersection of two paths given start points and bearings +// FIXME add rhumb lines + +goog.provide('ol.Sphere'); + +goog.require('goog.math'); + + + +/** + * @constructor + * @param {number} radius Radius. + */ +ol.Sphere = function(radius) { + + /** + * @type {number} + */ + this.radius = radius; + +}; + + +/** + * Returns the distance from c1 to c2 using the spherical law of cosines. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 2. + * @return {number} Spherical law of cosines distance. + */ +ol.Sphere.prototype.cosineDistance = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + return this.radius * Math.acos( + Math.sin(lat1) * Math.sin(lat2) + + Math.cos(lat1) * Math.cos(lat2) * Math.cos(deltaLon)); +}; + + +/** + * Returns the distance of c3 from the great circle path defined by c1 and c2. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 2. + * @param {ol.Coordinate} c3 Coordinate 3. + * @return {number} Cross-track distance. + */ +ol.Sphere.prototype.crossTrackDistance = function(c1, c2, c3) { + var d13 = this.cosineDistance(c1, c2); + var theta12 = goog.math.toRadians(this.initialBearing(c1, c2)); + var theta13 = goog.math.toRadians(this.initialBearing(c1, c3)); + return this.radius * + Math.asin(Math.sin(d13 / this.radius) * Math.sin(theta13 - theta12)); +}; + + +/** + * Returns the distance from c1 to c2 using Pythagoras's theorem on an + * equirectangular projection. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 2. + * @return {number} Equirectangular distance. + */ +ol.Sphere.prototype.equirectangularDistance = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + var x = deltaLon * Math.cos((lat1 + lat2) / 2); + var y = lat2 - lat1; + return this.radius * Math.sqrt(x * x + y * y); +}; + + +/** + * Returns the final bearing from c1 to c2. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 2. + * @return {number} Initial bearing. + */ +ol.Sphere.prototype.finalBearing = function(c1, c2) { + return (this.initialBearing(c2, c1) + 180) % 360; +}; + + +/** + * Returns the distance from c1 to c2 using the haversine formula. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 2. + * @return {number} Haversine distance. + */ +ol.Sphere.prototype.haversineDistance = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLatBy2 = (lat2 - lat1) / 2; + var deltaLonBy2 = goog.math.toRadians(c2[0] - c1[0]) / 2; + var a = Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) + + Math.sin(deltaLonBy2) * Math.sin(deltaLonBy2) * + Math.cos(lat1) * Math.cos(lat2); + return 2 * this.radius * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); +}; + + +/** + * Returns the initial bearing from c1 to c2. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 2. + * @return {number} Initial bearing. + */ +ol.Sphere.prototype.initialBearing = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + var y = Math.sin(deltaLon) * Math.cos(lat2); + var x = Math.cos(lat1) * Math.sin(lat2) - + Math.sin(lat1) * Math.cos(lat2) * Math.cos(deltaLon); + return goog.math.toDegrees(Math.atan2(y, x)); +}; + + +/** + * Returns the maximum latitude of the great circle defined by bearing and + * latitude. + * + * @param {number} bearing Bearing. + * @param {number} latitude Latitude. + * @return {number} Maximum latitude. + */ +ol.Sphere.prototype.maximumLatitude = function(bearing, latitude) { + return Math.cos(Math.abs(Math.sin(goog.math.toRadians(bearing)) * + Math.cos(goog.math.toRadians(latitude)))); +}; + + +/** + * Returns the midpoint between c1 and c2. + * + * @param {ol.Coordinate} c1 Coordinate 1. + * @param {ol.Coordinate} c2 Coordinate 2. + * @return {ol.Coordinate} Midpoint. + */ +ol.Sphere.prototype.midpoint = function(c1, c2) { + var lat1 = goog.math.toRadians(c1[1]); + var lat2 = goog.math.toRadians(c2[1]); + var lon1 = goog.math.toRadians(c1[0]); + var deltaLon = goog.math.toRadians(c2[0] - c1[0]); + var Bx = Math.cos(lat2) * Math.cos(deltaLon); + var By = Math.cos(lat2) * Math.sin(deltaLon); + var cosLat1PlusBx = Math.cos(lat1) + Bx; + var lat = Math.atan2(Math.sin(lat1) + Math.sin(lat2), + Math.sqrt(cosLat1PlusBx * cosLat1PlusBx + By * By)); + var lon = lon1 + Math.atan2(By, cosLat1PlusBx); + return [goog.math.toDegrees(lon), goog.math.toDegrees(lat)]; +}; + + +/** + * Returns the coordinate at the given distance and bearing from c. + * + * @param {ol.Coordinate} c1 Coordinate. + * @param {number} distance Distance. + * @param {number} bearing Bearing. + * @return {ol.Coordinate} Coordinate. + */ +ol.Sphere.prototype.offset = function(c1, distance, bearing) { + var lat1 = goog.math.toRadians(c1[1]); + var lon1 = goog.math.toRadians(c1[0]); + var dByR = distance / this.radius; + var lat = Math.asin( + Math.sin(lat1) * Math.cos(dByR) + + Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing)); + var lon = lon1 + Math.atan2( + Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1), + Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat)); + return [goog.math.toDegrees(lon), goog.math.toDegrees(lat)]; +}; diff --git a/float-no-zero/ol/ol/sphere/wgs84sphere.js b/float-no-zero/ol/ol/sphere/wgs84sphere.js new file mode 100644 index 0000000000..19624fd6b2 --- /dev/null +++ b/float-no-zero/ol/ol/sphere/wgs84sphere.js @@ -0,0 +1,11 @@ +goog.provide('ol.sphere.WGS84'); + +goog.require('ol.Sphere'); + + +/** + * A sphere with radius equal to the semi-major axis of the WGS84 ellipsoid. + * @const + * @type {ol.Sphere} + */ +ol.sphere.WGS84 = new ol.Sphere(6378137); diff --git a/float-no-zero/ol/ol/structs/buffer.js b/float-no-zero/ol/ol/structs/buffer.js new file mode 100644 index 0000000000..cace303348 --- /dev/null +++ b/float-no-zero/ol/ol/structs/buffer.js @@ -0,0 +1,263 @@ +goog.provide('ol.structs.Buffer'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.webgl'); +goog.require('ol.structs.IntegerSet'); + + +/** + * @enum {number} + */ +ol.structs.BufferUsage = { + STATIC_DRAW: goog.webgl.STATIC_DRAW, + STREAM_DRAW: goog.webgl.STREAM_DRAW, + DYNAMIC_DRAW: goog.webgl.DYNAMIC_DRAW +}; + + +/** + * @define {boolean} Replace unused entries with NaNs. + */ +ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS = goog.DEBUG; + + + +/** + * @constructor + * @param {Array.=} opt_arr Array. + * @param {number=} opt_used Used. + * @param {number=} opt_usage Usage. + * @struct + * @todo stability experimental + */ +ol.structs.Buffer = function(opt_arr, opt_used, opt_usage) { + + /** + * @private + * @type {Array.} + */ + this.arr_ = goog.isDef(opt_arr) ? opt_arr : []; + + /** + * @private + * @type {Array.} + */ + this.dirtySets_ = []; + + /** + * @private + * @type {ol.structs.IntegerSet} + */ + this.freeSet_ = new ol.structs.IntegerSet(); + + var used = goog.isDef(opt_used) ? opt_used : this.arr_.length; + if (used < this.arr_.length) { + this.freeSet_.addRange(used, this.arr_.length); + } + if (ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS) { + var arr = this.arr_; + var n = arr.length; + var i; + for (i = used; i < n; ++i) { + arr[i] = NaN; + } + } + + /** + * @private + * @type {?Float32Array} + */ + this.split32_ = null; + + /** + * @private + * @type {ol.structs.IntegerSet} + */ + this.split32DirtySet_ = null; + + /** + * @private + * @type {number} + */ + this.usage_ = goog.isDef(opt_usage) ? + opt_usage : ol.structs.BufferUsage.STATIC_DRAW; + +}; + + +/** + * @param {number} size Size. + * @return {number} Offset. + */ +ol.structs.Buffer.prototype.allocate = function(size) { + goog.asserts.assert(size > 0); + var offset = this.freeSet_.findRange(size); + goog.asserts.assert(offset != -1); // FIXME + this.freeSet_.removeRange(offset, offset + size); + return offset; +}; + + +/** + * @param {Array.} values Values. + * @return {number} Offset. + */ +ol.structs.Buffer.prototype.add = function(values) { + var size = values.length; + var offset = this.allocate(size); + var i; + for (i = 0; i < size; ++i) { + this.arr_[offset + i] = values[i]; + } + this.markDirty(size, offset); + return offset; +}; + + +/** + * @param {ol.structs.IntegerSet} dirtySet Dirty set. + */ +ol.structs.Buffer.prototype.addDirtySet = function(dirtySet) { + goog.asserts.assert(!goog.array.contains(this.dirtySets_, dirtySet)); + this.dirtySets_.push(dirtySet); +}; + + +/** + * @param {function(this: T, number, number)} f Callback. + * @param {T=} opt_this The object to use as `this` in `f`. + * @template T + */ +ol.structs.Buffer.prototype.forEachRange = function(f, opt_this) { + if (this.arr_.length !== 0) { + this.freeSet_.forEachRangeInverted(0, this.arr_.length, f, opt_this); + } +}; + + +/** + * @return {Array.} Array. + */ +ol.structs.Buffer.prototype.getArray = function() { + return this.arr_; +}; + + +/** + * @return {number} Count. + */ +ol.structs.Buffer.prototype.getCount = function() { + return this.arr_.length - this.freeSet_.getSize(); +}; + + +/** + * @return {ol.structs.IntegerSet} Free set. + */ +ol.structs.Buffer.prototype.getFreeSet = function() { + return this.freeSet_; +}; + + +/** + * Returns a Float32Array twice the length of the buffer containing each value + * split into two 32-bit floating point values that, when added together, + * approximate the original value. Even indicies contain the high bits, odd + * indicies contain the low bits. + * @see http://blogs.agi.com/insight3d/index.php/2008/09/03/precisions-precisions/ + * @return {Float32Array} Split. + */ +ol.structs.Buffer.prototype.getSplit32 = function() { + var arr = this.arr_; + var n = arr.length; + if (goog.isNull(this.split32DirtySet_)) { + this.split32DirtySet_ = new ol.structs.IntegerSet([0, n]); + this.addDirtySet(this.split32DirtySet_); + } + if (goog.isNull(this.split32_)) { + this.split32_ = new Float32Array(2 * n); + } + var split32 = this.split32_; + this.split32DirtySet_.forEachRange(function(start, stop) { + var doubleHigh, i, j, value; + for (i = start, j = 2 * start; i < stop; ++i, j += 2) { + value = arr[i]; + if (value < 0) { + doubleHigh = 65536 * Math.floor(-value / 65536); + split32[j] = -doubleHigh; + split32[j + 1] = value + doubleHigh; + } else { + doubleHigh = 65536 * Math.floor(value / 65536); + split32[j] = doubleHigh; + split32[j + 1] = value - doubleHigh; + } + } + }); + this.split32DirtySet_.clear(); + return this.split32_; +}; + + +/** + * @return {number} Usage. + */ +ol.structs.Buffer.prototype.getUsage = function() { + return this.usage_; +}; + + +/** + * @param {number} size Size. + * @param {number} offset Offset. + */ +ol.structs.Buffer.prototype.markDirty = function(size, offset) { + var i, ii; + for (i = 0, ii = this.dirtySets_.length; i < ii; ++i) { + this.dirtySets_[i].addRange(offset, offset + size); + } +}; + + +/** + * @param {number} size Size. + * @param {number} offset Offset. + */ +ol.structs.Buffer.prototype.remove = function(size, offset) { + var i, ii; + this.freeSet_.addRange(offset, offset + size); + for (i = 0, ii = this.dirtySets_.length; i < ii; ++i) { + this.dirtySets_[i].removeRange(offset, offset + size); + } + if (ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS) { + var arr = this.arr_; + for (i = 0; i < size; ++i) { + arr[offset + i] = NaN; + } + } +}; + + +/** + * @param {ol.structs.IntegerSet} dirtySet Dirty set. + */ +ol.structs.Buffer.prototype.removeDirtySet = function(dirtySet) { + var removed = goog.array.remove(this.dirtySets_, dirtySet); + goog.asserts.assert(removed); +}; + + +/** + * @param {Array.} values Values. + * @param {number} offset Offset. + */ +ol.structs.Buffer.prototype.set = function(values, offset) { + var arr = this.arr_; + var n = values.length; + goog.asserts.assert(0 <= offset && offset + n <= arr.length); + var i; + for (i = 0; i < n; ++i) { + arr[offset + i] = values[i]; + } + this.markDirty(n, offset); +}; diff --git a/float-no-zero/ol/ol/structs/integerset.js b/float-no-zero/ol/ol/structs/integerset.js new file mode 100644 index 0000000000..de716c6842 --- /dev/null +++ b/float-no-zero/ol/ol/structs/integerset.js @@ -0,0 +1,330 @@ +goog.provide('ol.structs.IntegerSet'); + +goog.require('goog.asserts'); + + + +/** + * A set of integers represented as a set of integer ranges. + * This implementation is designed for the case when the number of distinct + * integer ranges is small. + * @constructor + * @struct + * @param {Array.=} opt_arr Array. + */ +ol.structs.IntegerSet = function(opt_arr) { + + /** + * @private + * @type {Array.} + */ + this.arr_ = goog.isDef(opt_arr) ? opt_arr : []; + + if (goog.DEBUG) { + this.assertValid(); + } + +}; + + +/** + * @param {number} addStart Start. + * @param {number} addStop Stop. + */ +ol.structs.IntegerSet.prototype.addRange = function(addStart, addStop) { + goog.asserts.assert(addStart <= addStop); + if (addStart == addStop) { + return; + } + var arr = this.arr_; + var n = arr.length; + var i; + for (i = 0; i < n; i += 2) { + if (addStart <= arr[i]) { + // FIXME check if splice is really needed + arr.splice(i, 0, addStart, addStop); + this.compactRanges_(); + return; + } + } + arr.push(addStart, addStop); + this.compactRanges_(); +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.structs.IntegerSet.prototype.assertValid = function() { + var arr = this.arr_; + var n = arr.length; + goog.asserts.assert(n % 2 === 0); + var i; + for (i = 1; i < n; ++i) { + goog.asserts.assert(arr[i] > arr[i - 1]); + } +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.structs.IntegerSet.prototype.clear = function() { + this.arr_.length = 0; +}; + + +/** + * @private + */ +ol.structs.IntegerSet.prototype.compactRanges_ = function() { + var arr = this.arr_; + var n = arr.length; + var rangeIndex = 0; + var i; + for (i = 0; i < n; i += 2) { + if (arr[i] == arr[i + 1]) { + // pass + } else if (rangeIndex > 0 && + arr[rangeIndex - 2] <= arr[i] && + arr[i] <= arr[rangeIndex - 1]) { + arr[rangeIndex - 1] = Math.max(arr[rangeIndex - 1], arr[i + 1]); + } else { + arr[rangeIndex++] = arr[i]; + arr[rangeIndex++] = arr[i + 1]; + } + } + arr.length = rangeIndex; +}; + + +/** + * Finds the start of smallest range that is at least of length minSize, or -1 + * if no such range exists. + * @param {number} minSize Minimum size. + * @return {number} Index. + */ +ol.structs.IntegerSet.prototype.findRange = function(minSize) { + goog.asserts.assert(minSize > 0); + var arr = this.arr_; + var n = arr.length; + var bestIndex = -1; + var bestSize, i, size; + for (i = 0; i < n; i += 2) { + size = arr[i + 1] - arr[i]; + if (size == minSize) { + return arr[i]; + } else if (size > minSize && (bestIndex == -1 || size < bestSize)) { + bestIndex = arr[i]; + bestSize = size; + } + } + return bestIndex; +}; + + +/** + * Calls f with each integer range. + * @param {function(this: T, number, number)} f Callback. + * @param {T=} opt_this The object to use as `this` in `f`. + * @template T + */ +ol.structs.IntegerSet.prototype.forEachRange = function(f, opt_this) { + var arr = this.arr_; + var n = arr.length; + var i; + for (i = 0; i < n; i += 2) { + f.call(opt_this, arr[i], arr[i + 1]); + } +}; + + +/** + * Calls f with each integer range not in [start, stop) - 'this'. + * @param {number} start Start. + * @param {number} stop Stop. + * @param {function(this: T, number, number)} f Callback. + * @param {T=} opt_this The object to use as `this` in `f`. + * @template T + */ +ol.structs.IntegerSet.prototype.forEachRangeInverted = + function(start, stop, f, opt_this) { + goog.asserts.assert(start < stop); + var arr = this.arr_; + var n = arr.length; + if (n === 0) { + f.call(opt_this, start, stop); + } else { + if (start < arr[0]) { + f.call(opt_this, start, arr[0]); + } + var i; + for (i = 1; i < n - 1; i += 2) { + f.call(opt_this, arr[i], arr[i + 1]); + } + if (arr[n - 1] < stop) { + f.call(opt_this, arr[n - 1], stop); + } + } +}; + + +/** + * @return {Array.} Array. + */ +ol.structs.IntegerSet.prototype.getArray = function() { + return this.arr_; +}; + + +/** + * Returns the first element in the set, or -1 if the set is empty. + * @return {number} Start. + */ +ol.structs.IntegerSet.prototype.getFirst = function() { + return this.arr_.length === 0 ? -1 : this.arr_[0]; +}; + + +/** + * Returns the first integer after the last element in the set, or -1 if the + * set is empty. + * @return {number} Last. + */ +ol.structs.IntegerSet.prototype.getLast = function() { + var n = this.arr_.length; + return n === 0 ? -1 : this.arr_[n - 1]; +}; + + +/** + * Returns the number of integers in the set. + * @return {number} Size. + */ +ol.structs.IntegerSet.prototype.getSize = function() { + var arr = this.arr_; + var n = arr.length; + var size = 0; + var i; + for (i = 0; i < n; i += 2) { + size += arr[i + 1] - arr[i]; + } + return size; +}; + + +/** + * @param {number} start Start. + * @param {number} stop Stop. + * @return {boolean} Intersects range. + */ +ol.structs.IntegerSet.prototype.intersectsRange = function(start, stop) { + goog.asserts.assert(start <= stop); + if (start == stop) { + return false; + } else { + var arr = this.arr_; + var n = arr.length; + var i = 0; + for (i = 0; i < n; i += 2) { + if (arr[i] <= start && start < arr[i + 1] || + arr[i] < stop && stop - 1 < arr[i + 1] || + start < arr[i] && arr[i + 1] <= stop) { + return true; + } + } + return false; + } +}; + + +/** + * @return {boolean} Is empty. + */ +ol.structs.IntegerSet.prototype.isEmpty = function() { + return this.arr_.length === 0; +}; + + +/** + * @return {Array.} Array. + */ +ol.structs.IntegerSet.prototype.pack = function() { + return this.arr_; +}; + + +/** + * @param {number} removeStart Start. + * @param {number} removeStop Stop. + */ +ol.structs.IntegerSet.prototype.removeRange = + function(removeStart, removeStop) { + // FIXME this could be more efficient + goog.asserts.assert(removeStart <= removeStop); + var arr = this.arr_; + var n = arr.length; + var i; + for (i = 0; i < n; i += 2) { + if (removeStop < arr[i] || arr[i + 1] < removeStart) { + continue; + } else if (arr[i] > removeStop) { + break; + } + if (removeStart < arr[i]) { + if (removeStop == arr[i]) { + break; + } else if (removeStop < arr[i + 1]) { + arr[i] = Math.max(arr[i], removeStop); + break; + } else { + arr.splice(i, 2); + i -= 2; + n -= 2; + } + } else if (removeStart == arr[i]) { + if (removeStop < arr[i + 1]) { + arr[i] = removeStop; + break; + } else if (removeStop == arr[i + 1]) { + arr.splice(i, 2); + break; + } else { + arr.splice(i, 2); + i -= 2; + n -= 2; + } + } else { + if (removeStop < arr[i + 1]) { + arr.splice(i, 2, arr[i], removeStart, removeStop, arr[i + 1]); + break; + } else if (removeStop == arr[i + 1]) { + arr[i + 1] = removeStart; + break; + } else { + arr[i + 1] = removeStart; + } + } + } + this.compactRanges_(); +}; + + +if (goog.DEBUG) { + + /** + * @return {string} String. + */ + ol.structs.IntegerSet.prototype.toString = function() { + var arr = this.arr_; + var n = arr.length; + var result = new Array(n / 2); + var resultIndex = 0; + var i; + for (i = 0; i < n; i += 2) { + result[resultIndex++] = arr[i] + '-' + arr[i + 1]; + } + return result.join(', '); + }; + +} diff --git a/float-no-zero/ol/ol/structs/lrucache.js b/float-no-zero/ol/ol/structs/lrucache.js new file mode 100644 index 0000000000..e5fecc8d2e --- /dev/null +++ b/float-no-zero/ol/ol/structs/lrucache.js @@ -0,0 +1,248 @@ +goog.provide('ol.structs.LRUCache'); + +goog.require('goog.asserts'); +goog.require('goog.object'); + + + +/** + * Implements a Least-Recently-Used cache where the keys do not conflict with + * Object's properties (e.g. 'hasOwnProperty' is not allowed as a key). Expiring + * items from the cache is the responsibility of the user. + * @constructor + * @struct + * @template T + */ +ol.structs.LRUCache = function() { + + /** + * @private + * @type {number} + */ + this.count_ = 0; + + /** + * @private + * @type {Object.} + */ + this.entries_ = {}; + + /** + * @private + * @type {?ol.structs.LRUCacheEntry} + */ + this.oldest_ = null; + + /** + * @private + * @type {?ol.structs.LRUCacheEntry} + */ + this.newest_ = null; + +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.structs.LRUCache.prototype.assertValid = function() { + if (this.count_ === 0) { + goog.asserts.assert(goog.object.isEmpty(this.entries_)); + goog.asserts.assert(goog.isNull(this.oldest_)); + goog.asserts.assert(goog.isNull(this.newest_)); + } else { + goog.asserts.assert(goog.object.getCount(this.entries_) == this.count_); + goog.asserts.assert(!goog.isNull(this.oldest_)); + goog.asserts.assert(goog.isNull(this.oldest_.older)); + goog.asserts.assert(!goog.isNull(this.newest_)); + goog.asserts.assert(goog.isNull(this.newest_.newer)); + var i, entry; + var older = null; + i = 0; + for (entry = this.oldest_; !goog.isNull(entry); entry = entry.newer) { + goog.asserts.assert(entry.older === older); + older = entry; + ++i; + } + goog.asserts.assert(i == this.count_); + var newer = null; + i = 0; + for (entry = this.newest_; !goog.isNull(entry); entry = entry.older) { + goog.asserts.assert(entry.newer === newer); + newer = entry; + ++i; + } + goog.asserts.assert(i == this.count_); + } +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.structs.LRUCache.prototype.clear = function() { + this.count_ = 0; + this.entries_ = {}; + this.oldest_ = null; + this.newest_ = null; +}; + + +/** + * @param {string} key Key. + * @return {boolean} Contains key. + */ +ol.structs.LRUCache.prototype.containsKey = function(key) { + return this.entries_.hasOwnProperty(key); +}; + + +/** + * @param {function(this: S, T, string, ol.structs.LRUCache): ?} f The function + * to call for every entry from the oldest to the newer. This function takes + * 3 arguments (the entry value, the entry key and the LRUCache object). + * The return value is ignored. + * @param {S=} opt_this The object to use as `this` in `f`. + * @template S + */ +ol.structs.LRUCache.prototype.forEach = function(f, opt_this) { + var entry = this.oldest_; + while (!goog.isNull(entry)) { + f.call(opt_this, entry.value_, entry.key_, this); + entry = entry.newer; + } +}; + + +/** + * @param {string} key Key. + * @return {T} Value. + */ +ol.structs.LRUCache.prototype.get = function(key) { + var entry = this.entries_[key]; + goog.asserts.assert(goog.isDef(entry)); + if (entry === this.newest_) { + return entry.value_; + } else if (entry === this.oldest_) { + this.oldest_ = this.oldest_.newer; + this.oldest_.older = null; + } else { + entry.newer.older = entry.older; + entry.older.newer = entry.newer; + } + entry.newer = null; + entry.older = this.newest_; + this.newest_.newer = entry; + this.newest_ = entry; + return entry.value_; +}; + + +/** + * @return {number} Count. + */ +ol.structs.LRUCache.prototype.getCount = function() { + return this.count_; +}; + + +/** + * @return {Array.} Keys. + */ +ol.structs.LRUCache.prototype.getKeys = function() { + var keys = new Array(this.count_); + var i = 0; + var entry; + for (entry = this.newest_; !goog.isNull(entry); entry = entry.older) { + keys[i++] = entry.key_; + } + goog.asserts.assert(i == this.count_); + return keys; +}; + + +/** + * @return {Array} Values. + */ +ol.structs.LRUCache.prototype.getValues = function() { + var values = new Array(this.count_); + var i = 0; + var entry; + for (entry = this.newest_; !goog.isNull(entry); entry = entry.older) { + values[i++] = entry.value_; + } + goog.asserts.assert(i == this.count_); + return values; +}; + + +/** + * @return {T} Last value. + */ +ol.structs.LRUCache.prototype.peekLast = function() { + goog.asserts.assert(!goog.isNull(this.oldest_)); + return this.oldest_.value_; +}; + + +/** + * @return {string} Last key. + */ +ol.structs.LRUCache.prototype.peekLastKey = function() { + goog.asserts.assert(!goog.isNull(this.oldest_)); + return this.oldest_.key_; +}; + + +/** + * @return {T} value Value. + */ +ol.structs.LRUCache.prototype.pop = function() { + goog.asserts.assert(!goog.isNull(this.oldest_)); + goog.asserts.assert(!goog.isNull(this.newest_)); + var entry = this.oldest_; + goog.asserts.assert(entry.key_ in this.entries_); + delete this.entries_[entry.key_]; + if (!goog.isNull(entry.newer)) { + entry.newer.older = null; + } + this.oldest_ = entry.newer; + if (goog.isNull(this.oldest_)) { + this.newest_ = null; + } + --this.count_; + return entry.value_; +}; + + +/** + * @param {string} key Key. + * @param {T} value Value. + */ +ol.structs.LRUCache.prototype.set = function(key, value) { + goog.asserts.assert(!(key in {})); + goog.asserts.assert(!(key in this.entries_)); + var entry = { + key_: key, + newer: null, + older: this.newest_, + value_: value + }; + if (goog.isNull(this.newest_)) { + this.oldest_ = entry; + } else { + this.newest_.newer = entry; + } + this.newest_ = entry; + this.entries_[key] = entry; + ++this.count_; +}; + + +/** + * @typedef {{key_: string, + * newer: ol.structs.LRUCacheEntry, + * older: ol.structs.LRUCacheEntry, + * value_: *}} + */ +ol.structs.LRUCacheEntry; diff --git a/float-no-zero/ol/ol/structs/priorityqueue.js b/float-no-zero/ol/ol/structs/priorityqueue.js new file mode 100644 index 0000000000..714c59dd64 --- /dev/null +++ b/float-no-zero/ol/ol/structs/priorityqueue.js @@ -0,0 +1,291 @@ +goog.provide('ol.structs.PriorityQueue'); + +goog.require('goog.asserts'); +goog.require('goog.object'); + + + +/** + * Priority queue. + * + * The implementation is inspired from the Closure Library's Heap class and + * Python's heapq module. + * + * @see http://closure-library.googlecode.com/svn/docs/closure_goog_structs_heap.js.source.html + * @see http://hg.python.org/cpython/file/2.7/Lib/heapq.py + * + * @constructor + * @param {function(T): number} priorityFunction Priority function. + * @param {function(T): string} keyFunction Key function. + * @struct + * @template T + */ +ol.structs.PriorityQueue = function(priorityFunction, keyFunction) { + + /** + * @type {function(T): number} + * @private + */ + this.priorityFunction_ = priorityFunction; + + /** + * @type {function(T): string} + * @private + */ + this.keyFunction_ = keyFunction; + + /** + * @type {Array.} + * @private + */ + this.elements_ = []; + + /** + * @type {Array.} + * @private + */ + this.priorities_ = []; + + /** + * @type {Object.} + * @private + */ + this.queuedElements_ = {}; + +}; + + +/** + * @const + * @type {number} + */ +ol.structs.PriorityQueue.DROP = Infinity; + + +/** + * FIXME empty desciption for jsdoc + */ +ol.structs.PriorityQueue.prototype.assertValid = function() { + var elements = this.elements_; + var priorities = this.priorities_; + var n = elements.length; + goog.asserts.assert(priorities.length == n); + var i, priority; + for (i = 0; i < (n >> 1) - 1; ++i) { + priority = priorities[i]; + goog.asserts.assert(priority <= priorities[this.getLeftChildIndex_(i)]); + goog.asserts.assert(priority <= priorities[this.getRightChildIndex_(i)]); + } +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.structs.PriorityQueue.prototype.clear = function() { + this.elements_.length = 0; + this.priorities_.length = 0; + goog.object.clear(this.queuedElements_); +}; + + +/** + * Remove and return the highest-priority element. O(log N). + * @return {T} Element. + */ +ol.structs.PriorityQueue.prototype.dequeue = function() { + var elements = this.elements_; + goog.asserts.assert(elements.length > 0); + var priorities = this.priorities_; + var element = elements[0]; + if (elements.length == 1) { + elements.length = 0; + priorities.length = 0; + } else { + elements[0] = elements.pop(); + priorities[0] = priorities.pop(); + this.siftUp_(0); + } + var elementKey = this.keyFunction_(element); + goog.asserts.assert(elementKey in this.queuedElements_); + delete this.queuedElements_[elementKey]; + return element; +}; + + +/** + * Enqueue an element. O(log N). + * @param {T} element Element. + */ +ol.structs.PriorityQueue.prototype.enqueue = function(element) { + goog.asserts.assert(!(this.keyFunction_(element) in this.queuedElements_)); + var priority = this.priorityFunction_(element); + if (priority != ol.structs.PriorityQueue.DROP) { + this.elements_.push(element); + this.priorities_.push(priority); + this.queuedElements_[this.keyFunction_(element)] = true; + this.siftDown_(0, this.elements_.length - 1); + } +}; + + +/** + * @return {number} Count. + */ +ol.structs.PriorityQueue.prototype.getCount = function() { + return this.elements_.length; +}; + + +/** + * Gets the index of the left child of the node at the given index. + * @param {number} index The index of the node to get the left child for. + * @return {number} The index of the left child. + * @private + */ +ol.structs.PriorityQueue.prototype.getLeftChildIndex_ = function(index) { + return index * 2 + 1; +}; + + +/** + * Gets the index of the right child of the node at the given index. + * @param {number} index The index of the node to get the right child for. + * @return {number} The index of the right child. + * @private + */ +ol.structs.PriorityQueue.prototype.getRightChildIndex_ = function(index) { + return index * 2 + 2; +}; + + +/** + * Gets the index of the parent of the node at the given index. + * @param {number} index The index of the node to get the parent for. + * @return {number} The index of the parent. + * @private + */ +ol.structs.PriorityQueue.prototype.getParentIndex_ = function(index) { + return (index - 1) >> 1; +}; + + +/** + * Make this a heap. O(N). + * @private + */ +ol.structs.PriorityQueue.prototype.heapify_ = function() { + var i; + for (i = (this.elements_.length >> 1) - 1; i >= 0; i--) { + this.siftUp_(i); + } +}; + + +/** + * @return {boolean} Is empty. + */ +ol.structs.PriorityQueue.prototype.isEmpty = function() { + return this.elements_.length === 0; +}; + + +/** + * @param {string} key Key. + * @return {boolean} Is key queued. + */ +ol.structs.PriorityQueue.prototype.isKeyQueued = function(key) { + return key in this.queuedElements_; +}; + + +/** + * @param {T} element Element. + * @return {boolean} Is queued. + */ +ol.structs.PriorityQueue.prototype.isQueued = function(element) { + return this.isKeyQueued(this.keyFunction_(element)); +}; + + +/** + * @param {number} index The index of the node to move down. + * @private + */ +ol.structs.PriorityQueue.prototype.siftUp_ = function(index) { + var elements = this.elements_; + var priorities = this.priorities_; + var count = elements.length; + var element = elements[index]; + var priority = priorities[index]; + var startIndex = index; + + while (index < (count >> 1)) { + var lIndex = this.getLeftChildIndex_(index); + var rIndex = this.getRightChildIndex_(index); + + var smallerChildIndex = rIndex < count && + priorities[rIndex] < priorities[lIndex] ? + rIndex : lIndex; + + elements[index] = elements[smallerChildIndex]; + priorities[index] = priorities[smallerChildIndex]; + index = smallerChildIndex; + } + + elements[index] = element; + priorities[index] = priority; + this.siftDown_(startIndex, index); +}; + + +/** + * @param {number} startIndex The index of the root. + * @param {number} index The index of the node to move up. + * @private + */ +ol.structs.PriorityQueue.prototype.siftDown_ = function(startIndex, index) { + var elements = this.elements_; + var priorities = this.priorities_; + var element = elements[index]; + var priority = priorities[index]; + + while (index > startIndex) { + var parentIndex = this.getParentIndex_(index); + if (priorities[parentIndex] > priority) { + elements[index] = elements[parentIndex]; + priorities[index] = priorities[parentIndex]; + index = parentIndex; + } else { + break; + } + } + elements[index] = element; + priorities[index] = priority; +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.structs.PriorityQueue.prototype.reprioritize = function() { + var priorityFunction = this.priorityFunction_; + var elements = this.elements_; + var priorities = this.priorities_; + var index = 0; + var n = elements.length; + var element, i, priority; + for (i = 0; i < n; ++i) { + element = elements[i]; + priority = priorityFunction(element); + if (priority == ol.structs.PriorityQueue.DROP) { + delete this.queuedElements_[this.keyFunction_(element)]; + } else { + priorities[index] = priority; + elements[index++] = element; + } + } + elements.length = index; + priorities.length = index; + this.heapify_(); +}; diff --git a/float-no-zero/ol/ol/structs/rbush.js b/float-no-zero/ol/ol/structs/rbush.js new file mode 100644 index 0000000000..4012576c4b --- /dev/null +++ b/float-no-zero/ol/ol/structs/rbush.js @@ -0,0 +1,723 @@ +// Based on rbush https://github.com/mourner/rbush +// Copyright (c) 2013 Vladimir Agafonkin +// +// 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. + +// FIXME bulk inserts +// FIXME is level argument needed to insert_? + +goog.provide('ol.structs.RBush'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.object'); +goog.require('ol.extent'); + + + +/** + * @constructor + * @param {ol.Extent} extent Extent. + * @param {number} height Height. + * @param {Array.>} children Children. + * @param {?T} value Value. + * @struct + * @template T + */ +ol.structs.RBushNode = function(extent, height, children, value) { + + if (height === 0) { + goog.asserts.assert(goog.isNull(children)); + goog.asserts.assert(!goog.isNull(value)); + } else { + goog.asserts.assert(!goog.isNull(children)); + goog.asserts.assert(goog.isNull(value)); + } + + /** + * @type {ol.Extent} + */ + this.extent = extent; + + /** + * @type {number} + */ + this.height = height; + + /** + * @type {Array.>} + */ + this.children = children; + + /** + * @type {?T} + */ + this.value = value; + +}; + + +/** + * @param {ol.structs.RBushNode.} node1 Node 1. + * @param {ol.structs.RBushNode.} node2 Node 2. + * @return {number} Compare minimum X. + * @template T + */ +ol.structs.RBushNode.compareMinX = function(node1, node2) { + return node1.extent[0] - node2.extent[0]; +}; + + +/** + * @param {ol.structs.RBushNode.} node1 Node 1. + * @param {ol.structs.RBushNode.} node2 Node 2. + * @return {number} Compare minimum Y. + * @template T + */ +ol.structs.RBushNode.compareMinY = function(node1, node2) { + return node1.extent[1] - node2.extent[1]; +}; + + +/** + * @param {number} maxEntries Max entries. + */ +ol.structs.RBushNode.prototype.assertValid = function(maxEntries) { + if (this.height === 0) { + goog.asserts.assert(goog.isNull(this.children)); + goog.asserts.assert(!goog.isNull(this.value)); + } else { + goog.asserts.assert(!goog.isNull(this.children)); + goog.asserts.assert(goog.isNull(this.value)); + goog.asserts.assert(this.children.length <= maxEntries); + var i, ii; + for (i = 0, ii = this.children.length; i < ii; ++i) { + var child = this.children[i]; + goog.asserts.assert(ol.extent.containsExtent(this.extent, child.extent)); + child.assertValid(maxEntries); + } + } +}; + + +/** + * @param {number} start Start. + * @param {number} stop Stop. + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.structs.RBushNode.prototype.getChildrenExtent = + function(start, stop, opt_extent) { + goog.asserts.assert(!this.isLeaf()); + var children = this.children; + var extent = ol.extent.createOrUpdateEmpty(opt_extent); + var i; + for (i = start; i < stop; ++i) { + ol.extent.extend(extent, children[i].extent); + } + return extent; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {T} value Value. + * @param {Array.>} path Path. + * @return {boolean} Removed. + */ +ol.structs.RBushNode.prototype.remove = function(extent, value, path) { + var children = this.children; + var ii = children.length; + var child, i; + if (this.height == 1) { + for (i = 0; i < ii; ++i) { + child = children[i]; + if (child.value === value) { + goog.array.removeAt(children, i); + return true; + } + } + } else { + goog.asserts.assert(this.height > 1); + for (i = 0; i < ii; ++i) { + child = children[i]; + if (ol.extent.containsExtent(child.extent, extent)) { + path.push(child); + if (child.remove(extent, value, path)) { + return true; + } + path.pop(); + } + } + } + return false; +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.structs.RBushNode.prototype.updateExtent = function() { + goog.asserts.assert(!this.isLeaf()); + var extent = ol.extent.createOrUpdateEmpty(this.extent); + var children = this.children; + var i, ii; + for (i = 0, ii = children.length; i < ii; ++i) { + ol.extent.extend(extent, children[i].extent); + } +}; + + +/** + * @return {boolean} Is leaf. + */ +ol.structs.RBushNode.prototype.isLeaf = function() { + return goog.isNull(this.children); +}; + + + +/** + * @constructor + * @param {number=} opt_maxEntries Max entries. + * @see https://github.com/mourner/rbush + * @struct + * @template T + */ +ol.structs.RBush = function(opt_maxEntries) { + + /** + * @private + * @type {number} + */ + this.maxEntries_ = + Math.max(4, goog.isDef(opt_maxEntries) ? opt_maxEntries : 9); + + /** + * @private + * @type {number} + */ + this.minEntries_ = Math.max(2, Math.ceil(0.4 * this.maxEntries_)); + + /** + * @private + * @type {ol.structs.RBushNode.} + */ + this.root_ = new ol.structs.RBushNode(ol.extent.createEmpty(), 1, [], null); + + /** + * @private + * @type {Object.} + */ + this.valueExtent_ = {}; + + if (goog.DEBUG) { + /** + * @private + * @type {number} + */ + this.readers_ = 0; + } + +}; + + +/** + * @param {ol.structs.RBushNode.} node Node. + * @param {function(ol.structs.RBushNode., ol.structs.RBushNode.): number} + * compare Compare. + * @private + * @return {number} All distance margin. + */ +ol.structs.RBush.prototype.allDistMargin_ = function(node, compare) { + var children = node.children; + var m = this.minEntries_; + var M = children.length; + var i; + goog.array.sort(children, compare); + var leftExtent = node.getChildrenExtent(0, m); + var rightExtent = node.getChildrenExtent(M - m, M); + var margin = + ol.extent.getMargin(leftExtent) + ol.extent.getMargin(rightExtent); + for (i = m; i < M - m; ++i) { + ol.extent.extend(leftExtent, children[i].extent); + margin += ol.extent.getMargin(leftExtent); + } + for (i = M - m - 1; i >= m; --i) { + ol.extent.extend(rightExtent, children[i].extent); + margin += ol.extent.getMargin(rightExtent); + } + return margin; +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.structs.RBush.prototype.assertValid = function() { + this.root_.assertValid(this.maxEntries_); +}; + + +/** + * @param {ol.structs.RBushNode.} node Node. + * @private + */ +ol.structs.RBush.prototype.chooseSplitAxis_ = function(node) { + var xMargin = this.allDistMargin_(node, ol.structs.RBushNode.compareMinX); + var yMargin = this.allDistMargin_(node, ol.structs.RBushNode.compareMinY); + if (xMargin < yMargin) { + goog.array.sort(node.children, ol.structs.RBushNode.compareMinX); + } +}; + + +/** + * @param {ol.structs.RBushNode.} node Node. + * @private + * @return {number} Split index. + */ +ol.structs.RBush.prototype.chooseSplitIndex_ = function(node) { + var children = node.children; + var m = this.minEntries_; + var M = children.length; + var minOverlap = Infinity; + var minArea = Infinity; + var extent1 = ol.extent.createEmpty(); + var extent2 = ol.extent.createEmpty(); + var index = 0; + var i; + for (i = m; i <= M - m; ++i) { + extent1 = node.getChildrenExtent(0, i, extent1); + extent2 = node.getChildrenExtent(i, M, extent2); + var overlap = ol.extent.getIntersectionArea(extent1, extent2); + var area = ol.extent.getArea(extent1) + ol.extent.getArea(extent2); + if (overlap < minOverlap) { + minOverlap = overlap; + minArea = Math.min(area, minArea); + index = i; + } else if (overlap == minOverlap && area < minArea) { + minArea = area; + index = i; + } + } + return index; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {ol.structs.RBushNode.} node Node. + * @param {number} level Level. + * @param {Array.>} path Path. + * @private + * @return {ol.structs.RBushNode.} Node. + */ +ol.structs.RBush.prototype.chooseSubtree_ = + function(extent, node, level, path) { + while (!node.isLeaf() && path.length - 1 != level) { + var minArea = Infinity; + var minEnlargement = Infinity; + var children = node.children; + var bestChild = null; + var i, ii; + for (i = 0, ii = children.length; i < ii; ++i) { + var child = children[i]; + var area = ol.extent.getArea(child.extent); + var enlargement = ol.extent.getEnlargedArea(child.extent, extent) - area; + if (enlargement < minEnlargement) { + minEnlargement = enlargement; + minArea = Math.min(area, minArea); + bestChild = child; + } else if (enlargement == minEnlargement && area < minArea) { + minArea = area; + bestChild = child; + } + } + goog.asserts.assert(!goog.isNull(bestChild)); + node = bestChild; + path.push(node); + } + return node; +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.structs.RBush.prototype.clear = function() { + var node = this.root_; + node.extent = ol.extent.createOrUpdateEmpty(this.root_.extent); + node.height = 1; + node.children.length = 0; + node.value = null; + goog.object.clear(this.valueExtent_); +}; + + +/** + * @param {Array.>} path Path. + * @private + */ +ol.structs.RBush.prototype.condense_ = function(path) { + var i; + for (i = path.length - 1; i >= 0; --i) { + var node = path[i]; + if (node.children.length === 0) { + if (i > 0) { + goog.array.remove(path[i - 1].children, node); + } else { + this.clear(); + } + } else { + node.updateExtent(); + } + } +}; + + +/** + * Calls a callback function with each node in the tree. Inside the callback, + * no tree modifications (insert, update, remove) can be made. + * @param {function(this: S, T): *} callback Callback. + * @param {S=} opt_this The object to use as `this` in `callback`. + * @return {*} Callback return value. + * @template S + */ +ol.structs.RBush.prototype.forEach = function(callback, opt_this) { + if (goog.DEBUG) { + ++this.readers_; + try { + return this.forEach_(this.root_, callback, opt_this); + } finally { + --this.readers_; + } + } else { + return this.forEach_(this.root_, callback, opt_this); + } +}; + + +/** + * @param {ol.structs.RBushNode.} node Node. + * @param {function(this: S, T): *} callback Callback. + * @param {S=} opt_this The object to use as `this` in `callback`. + * @private + * @return {*} Callback return value. + * @template S + */ +ol.structs.RBush.prototype.forEach_ = function(node, callback, opt_this) { + goog.asserts.assert(!node.isLeaf()); + /** @type {Array.>} */ + var toVisit = [node]; + var children, i, ii, result; + while (toVisit.length > 0) { + node = toVisit.pop(); + children = node.children; + if (node.height == 1) { + for (i = 0, ii = children.length; i < ii; ++i) { + result = callback.call(opt_this, children[i].value); + if (result) { + return result; + } + } + } else { + toVisit.push.apply(toVisit, children); + } + } +}; + + +/** + * Calls a callback function with each node in the provided extent. Inside the + * callback, no tree modifications (insert, update, remove) can be made. + * @param {ol.Extent} extent Extent. + * @param {function(this: S, T): *} callback Callback. + * @param {S=} opt_this The object to use as `this` in `callback`. + * @return {*} Callback return value. + * @template S + */ +ol.structs.RBush.prototype.forEachInExtent = + function(extent, callback, opt_this) { + if (goog.DEBUG) { + ++this.readers_; + try { + return this.forEachInExtent_(extent, callback, opt_this); + } finally { + --this.readers_; + } + } else { + return this.forEachInExtent_(extent, callback, opt_this); + } +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {function(this: S, T): *} callback Callback. + * @param {S=} opt_this The object to use as `this` in `callback`. + * @private + * @return {*} Callback return value. + * @template S + */ +ol.structs.RBush.prototype.forEachInExtent_ = + function(extent, callback, opt_this) { + /** @type {Array.>} */ + var toVisit = [this.root_]; + var result; + while (toVisit.length > 0) { + var node = toVisit.pop(); + if (ol.extent.intersects(extent, node.extent)) { + if (node.isLeaf()) { + result = callback.call(opt_this, node.value); + if (result) { + return result; + } + } else if (ol.extent.containsExtent(extent, node.extent)) { + result = this.forEach_(node, callback, opt_this); + if (result) { + return result; + } + } else { + toVisit.push.apply(toVisit, node.children); + } + } + } + return undefined; +}; + + +/** + * @param {function(this: S, ol.structs.RBushNode.): *} callback Callback. + * @param {S=} opt_this The object to use as `this` in `callback`. + * @return {*} Callback return value. + * @template S + */ +ol.structs.RBush.prototype.forEachNode = function(callback, opt_this) { + /** @type {Array.>} */ + var toVisit = [this.root_]; + while (toVisit.length > 0) { + var node = toVisit.pop(); + var result = callback.call(opt_this, node); + if (result) { + return result; + } + if (!node.isLeaf()) { + toVisit.push.apply(toVisit, node.children); + } + } + return undefined; +}; + + +/** + * @return {Array.} All. + */ +ol.structs.RBush.prototype.getAll = function() { + var values = []; + this.forEach( + /** + * @param {T} value Value. + */ + function(value) { + values.push(value); + }); + return values; +}; + + +/** + * @param {ol.Extent} extent Extent. + * @return {Array.} All in extent. + */ +ol.structs.RBush.prototype.getInExtent = function(extent) { + var values = []; + this.forEachInExtent(extent, + /** + * @param {T} value Value. + */ + function(value) { + values.push(value); + }); + return values; +}; + + +/** + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.structs.RBush.prototype.getExtent = function(opt_extent) { + return ol.extent.returnOrUpdate(this.root_.extent, opt_extent); +}; + + +/** + * @param {T} value Value. + * @private + * @return {string} Key. + */ +ol.structs.RBush.prototype.getKey_ = function(value) { + goog.asserts.assert(goog.isObject(value)); + return goog.getUid(value).toString(); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {T} value Value. + */ +ol.structs.RBush.prototype.insert = function(extent, value) { + if (goog.DEBUG && this.readers_) { + throw new Error('cannot insert value while reading'); + } + var key = this.getKey_(value); + goog.asserts.assert(!this.valueExtent_.hasOwnProperty(key)); + this.insert_(extent, value, this.root_.height - 1); + this.valueExtent_[key] = ol.extent.clone(extent); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {T} value Value. + * @param {number} level Level. + * @private + * @return {ol.structs.RBushNode.} Node. + */ +ol.structs.RBush.prototype.insert_ = function(extent, value, level) { + /** @type {Array.>} */ + var path = [this.root_]; + var node = this.chooseSubtree_(extent, this.root_, level, path); + node.children.push(new ol.structs.RBushNode(extent, 0, null, value)); + ol.extent.extend(node.extent, extent); + var i; + for (i = path.length - 1; i >= 0; --i) { + if (path[i].children.length > this.maxEntries_) { + this.split_(path, i); + } else { + break; + } + } + for (; i >= 0; --i) { + ol.extent.extend(path[i].extent, extent); + } + return node; +}; + + +/** + * @return {boolean} Is empty. + */ +ol.structs.RBush.prototype.isEmpty = function() { + return this.root_.children.length === 0; +}; + + +/** + * @param {T} value Value. + * @return {boolean} Removed. + */ +ol.structs.RBush.prototype.remove = function(value) { + if (goog.DEBUG && this.readers_) { + throw new Error('cannot remove value while reading'); + } + var key = this.getKey_(value); + goog.asserts.assert(this.valueExtent_.hasOwnProperty(key)); + var extent = this.valueExtent_[key]; + delete this.valueExtent_[key]; + return this.remove_(extent, value); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {T} value Value. + * @private + * @return {boolean} Removed. + */ +ol.structs.RBush.prototype.remove_ = function(extent, value) { + var root = this.root_; + var path = [root]; + var removed = root.remove(extent, value, path); + if (removed) { + this.condense_(path); + } else { + goog.asserts.assert(path.length == 1); + goog.asserts.assert(path[0] === root); + } + return removed; +}; + + +/** + * @param {Array.>} path Path. + * @param {number} level Level. + * @private + */ +ol.structs.RBush.prototype.split_ = function(path, level) { + var node = path[level]; + this.chooseSplitAxis_(node); + var splitIndex = this.chooseSplitIndex_(node); + // FIXME too few arguments to splice here + var newChildren = node.children.splice(splitIndex); + var newNode = new ol.structs.RBushNode( + ol.extent.createEmpty(), node.height, newChildren, null); + node.updateExtent(); + newNode.updateExtent(); + if (level) { + path[level - 1].children.push(newNode); + } else { + this.splitRoot_(node, newNode); + } +}; + + +/** + * @param {ol.structs.RBushNode.} node1 Node 1. + * @param {ol.structs.RBushNode.} node2 Node 2. + * @private + */ +ol.structs.RBush.prototype.splitRoot_ = function(node1, node2) { + goog.asserts.assert(node1 === this.root_); + var height = node1.height + 1; + var extent = ol.extent.extend(node1.extent.slice(), node2.extent); + var children = [node1, node2]; + this.root_ = new ol.structs.RBushNode(extent, height, children, null); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {T} value Value. + */ +ol.structs.RBush.prototype.update = function(extent, value) { + if (goog.DEBUG && this.readers_) { + throw new Error('cannot update value while reading'); + } + var key = this.getKey_(value); + var currentExtent = this.valueExtent_[key]; + goog.asserts.assert(goog.isDef(currentExtent)); + if (!ol.extent.equals(currentExtent, extent)) { + var removed = this.remove_(currentExtent, value); + goog.asserts.assert(removed); + this.insert_(extent, value, this.root_.height - 1); + this.valueExtent_[key] = ol.extent.clone(extent, currentExtent); + } +}; diff --git a/float-no-zero/ol/ol/style/circlestyle.exports b/float-no-zero/ol/ol/style/circlestyle.exports new file mode 100644 index 0000000000..fd4ebd1f1b --- /dev/null +++ b/float-no-zero/ol/ol/style/circlestyle.exports @@ -0,0 +1,7 @@ +@exportSymbol ol.style.Circle +@exportProperty ol.style.Circle.prototype.getAnchor +@exportProperty ol.style.Circle.prototype.getFill +@exportProperty ol.style.Circle.prototype.getImage +@exportProperty ol.style.Circle.prototype.getRadius +@exportProperty ol.style.Circle.prototype.getSize +@exportProperty ol.style.Circle.prototype.getStroke diff --git a/float-no-zero/ol/ol/style/circlestyle.js b/float-no-zero/ol/ol/style/circlestyle.js new file mode 100644 index 0000000000..91647681db --- /dev/null +++ b/float-no-zero/ol/ol/style/circlestyle.js @@ -0,0 +1,230 @@ +// FIXME decide default value for snapToPixel + +goog.provide('ol.style.Circle'); + +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('ol.color'); +goog.require('ol.render.canvas'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Image'); +goog.require('ol.style.ImageState'); +goog.require('ol.style.Stroke'); + + + +/** + * @constructor + * @param {olx.style.CircleOptions=} opt_options Options. + * @extends {ol.style.Image} + * @todo stability experimental + */ +ol.style.Circle = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {HTMLCanvasElement} + */ + this.canvas_ = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + + /** + * @private + * @type {HTMLCanvasElement} + */ + this.hitDetectionCanvas_ = null; + + /** + * @private + * @type {ol.style.Fill} + */ + this.fill_ = goog.isDef(options.fill) ? options.fill : null; + + /** + * @private + * @type {number} + */ + this.radius_ = options.radius; + + /** + * @private + * @type {ol.style.Stroke} + */ + this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null; + + var size = this.render_(); + + /** + * @private + * @type {Array.} + */ + this.anchor_ = [size / 2, size / 2]; + + /** + * @private + * @type {ol.Size} + */ + this.size_ = [size, size]; + + goog.base(this, { + opacity: 1, + rotateWithView: false, + rotation: 0, + scale: 1, + snapToPixel: undefined + }); + +}; +goog.inherits(ol.style.Circle, ol.style.Image); + + +/** + * @inheritDoc + */ +ol.style.Circle.prototype.getAnchor = function() { + return this.anchor_; +}; + + +/** + * @return {ol.style.Fill} Fill style. + */ +ol.style.Circle.prototype.getFill = function() { + return this.fill_; +}; + + +/** + * @inheritDoc + */ +ol.style.Circle.prototype.getHitDetectionImage = function(pixelRatio) { + return this.hitDetectionCanvas_; +}; + + +/** + * @inheritDoc + */ +ol.style.Circle.prototype.getImage = function(pixelRatio) { + return this.canvas_; +}; + + +/** + * @inheritDoc + */ +ol.style.Circle.prototype.getImageState = function() { + return ol.style.ImageState.LOADED; +}; + + +/** + * @return {number} Radius. + */ +ol.style.Circle.prototype.getRadius = function() { + return this.radius_; +}; + + +/** + * @inheritDoc + */ +ol.style.Circle.prototype.getSize = function() { + return this.size_; +}; + + +/** + * @return {ol.style.Stroke} Stroke style. + */ +ol.style.Circle.prototype.getStroke = function() { + return this.stroke_; +}; + + +/** + * @inheritDoc + */ +ol.style.Circle.prototype.listenImageChange = goog.nullFunction; + + +/** + * @inheritDoc + */ +ol.style.Circle.prototype.load = goog.nullFunction; + + +/** + * @inheritDoc + */ +ol.style.Circle.prototype.unlistenImageChange = goog.nullFunction; + + +/** + * @private + * @return {number} Size. + */ +ol.style.Circle.prototype.render_ = function() { + var canvas = this.canvas_; + var strokeStyle, strokeWidth; + + if (goog.isNull(this.stroke_)) { + strokeWidth = 0; + } else { + strokeStyle = ol.color.asString(this.stroke_.getColor()); + strokeWidth = this.stroke_.getWidth(); + if (!goog.isDef(strokeWidth)) { + strokeWidth = ol.render.canvas.defaultLineWidth; + } + } + + var size = 2 * (this.radius_ + strokeWidth) + 1; + + // draw the circle on the canvas + + canvas.height = size; + canvas.width = size; + + var context = /** @type {CanvasRenderingContext2D} */ + (canvas.getContext('2d')); + context.arc(size / 2, size / 2, this.radius_, 0, 2 * Math.PI, true); + + if (!goog.isNull(this.fill_)) { + context.fillStyle = ol.color.asString(this.fill_.getColor()); + context.fill(); + } + if (!goog.isNull(this.stroke_)) { + context.strokeStyle = strokeStyle; + context.lineWidth = strokeWidth; + context.stroke(); + } + + // deal with the hit detection canvas + + if (!goog.isNull(this.fill_)) { + this.hitDetectionCanvas_ = canvas; + } else { + this.hitDetectionCanvas_ = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas = this.hitDetectionCanvas_; + + canvas.height = size; + canvas.width = size; + + context = /** @type {CanvasRenderingContext2D} */ + (canvas.getContext('2d')); + context.arc(size / 2, size / 2, this.radius_, 0, 2 * Math.PI, true); + + context.fillStyle = ol.render.canvas.defaultFillStyle; + context.fill(); + if (!goog.isNull(this.stroke_)) { + context.strokeStyle = strokeStyle; + context.lineWidth = strokeWidth; + context.stroke(); + } + } + + return size; +}; diff --git a/float-no-zero/ol/ol/style/fillstyle.exports b/float-no-zero/ol/ol/style/fillstyle.exports new file mode 100644 index 0000000000..81bb520fc8 --- /dev/null +++ b/float-no-zero/ol/ol/style/fillstyle.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.style.Fill +@exportProperty ol.style.Fill.prototype.getColor diff --git a/float-no-zero/ol/ol/style/fillstyle.js b/float-no-zero/ol/ol/style/fillstyle.js new file mode 100644 index 0000000000..25f59b0be0 --- /dev/null +++ b/float-no-zero/ol/ol/style/fillstyle.js @@ -0,0 +1,28 @@ +goog.provide('ol.style.Fill'); + +goog.require('ol.color'); + + + +/** + * @constructor + * @param {olx.style.FillOptions=} opt_options Options. + */ +ol.style.Fill = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.Color|string} + */ + this.color_ = goog.isDef(options.color) ? options.color : null; +}; + + +/** + * @return {ol.Color|string} Color. + */ +ol.style.Fill.prototype.getColor = function() { + return this.color_; +}; diff --git a/float-no-zero/ol/ol/style/iconstyle.exports b/float-no-zero/ol/ol/style/iconstyle.exports new file mode 100644 index 0000000000..5b7d6c6d77 --- /dev/null +++ b/float-no-zero/ol/ol/style/iconstyle.exports @@ -0,0 +1,5 @@ +@exportSymbol ol.style.Icon +@exportProperty ol.style.Icon.prototype.getAnchor +@exportProperty ol.style.Icon.prototype.getImage +@exportProperty ol.style.Icon.prototype.getSize +@exportProperty ol.style.Icon.prototype.getSrc diff --git a/float-no-zero/ol/ol/style/iconstyle.js b/float-no-zero/ol/ol/style/iconstyle.js new file mode 100644 index 0000000000..3fa3033849 --- /dev/null +++ b/float-no-zero/ol/ol/style/iconstyle.js @@ -0,0 +1,539 @@ +// FIXME decide default value for snapToPixel + +goog.provide('ol.style.Icon'); +goog.provide('ol.style.IconAnchorOrigin'); +goog.provide('ol.style.IconAnchorUnits'); +goog.provide('ol.style.IconImageCache'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.EventTarget'); +goog.require('goog.events.EventType'); +goog.require('ol.style.Image'); +goog.require('ol.style.ImageState'); + + +/** + * @enum {string} + */ +ol.style.IconAnchorOrigin = { + BOTTOM_LEFT: 'bottom-left', + BOTTOM_RIGHT: 'bottom-right', + TOP_LEFT: 'top-left', + TOP_RIGHT: 'top-right' +}; + + +/** + * @enum {string} + */ +ol.style.IconAnchorUnits = { + FRACTION: 'fraction', + PIXELS: 'pixels' +}; + + + +/** + * @constructor + * @param {olx.style.IconOptions=} opt_options Options. + * @extends {ol.style.Image} + */ +ol.style.Icon = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {Array.} + */ + this.anchor_ = goog.isDef(options.anchor) ? options.anchor : [0.5, 0.5]; + + /** + * @private + * @type {ol.style.IconAnchorOrigin} + */ + this.anchorOrigin_ = goog.isDef(options.anchorOrigin) ? + options.anchorOrigin : ol.style.IconAnchorOrigin.TOP_LEFT; + + /** + * @private + * @type {ol.style.IconAnchorUnits} + */ + this.anchorXUnits_ = goog.isDef(options.anchorXUnits) ? + options.anchorXUnits : ol.style.IconAnchorUnits.FRACTION; + + /** + * @private + * @type {ol.style.IconAnchorUnits} + */ + this.anchorYUnits_ = goog.isDef(options.anchorYUnits) ? + options.anchorYUnits : ol.style.IconAnchorUnits.FRACTION; + + /** + * @type {?string} + */ + var crossOrigin = + goog.isDef(options.crossOrigin) ? options.crossOrigin : null; + + /** + * @private + * @type {ol.style.IconImage_} + */ + this.iconImage_ = ol.style.IconImage_.get(options.src, crossOrigin); + + /** + * @private + * @type {ol.Size} + */ + this.size_ = goog.isDef(options.size) ? options.size : null; + + /** + * @type {number} + */ + var opacity = goog.isDef(options.opacity) ? options.opacity : 1; + + /** + * @type {boolean} + */ + var rotateWithView = goog.isDef(options.rotateWithView) ? + options.rotateWithView : false; + + /** + * @type {number} + */ + var rotation = goog.isDef(options.rotation) ? options.rotation : 0; + + /** + * @type {number} + */ + var scale = goog.isDef(options.scale) ? options.scale : 1; + + goog.base(this, { + opacity: opacity, + rotation: rotation, + scale: scale, + snapToPixel: undefined, + rotateWithView: rotateWithView + }); + +}; +goog.inherits(ol.style.Icon, ol.style.Image); + + +/** + * @inheritDoc + */ +ol.style.Icon.prototype.getAnchor = function() { + var anchor = this.anchor_; + var size = this.getSize(); + if (this.anchorXUnits_ == ol.style.IconAnchorUnits.FRACTION || + this.anchorYUnits_ == ol.style.IconAnchorUnits.FRACTION) { + if (goog.isNull(size)) { + return null; + } + anchor = this.anchor_.slice(); + if (this.anchorXUnits_ == ol.style.IconAnchorUnits.FRACTION) { + anchor[0] *= size[0]; + } + if (this.anchorYUnits_ == ol.style.IconAnchorUnits.FRACTION) { + anchor[1] *= size[1]; + } + } + + if (this.anchorOrigin_ != ol.style.IconAnchorOrigin.TOP_LEFT) { + if (goog.isNull(size)) { + return null; + } + if (anchor === this.anchor_) { + anchor = this.anchor_.slice(); + } + if (this.anchorOrigin_ == ol.style.IconAnchorOrigin.TOP_RIGHT || + this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_RIGHT) { + anchor[0] = -anchor[0] + size[0]; + } + if (this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_LEFT || + this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_RIGHT) { + anchor[1] += size[1]; + } + } + return anchor; +}; + + +/** + * @inheritDoc + */ +ol.style.Icon.prototype.getImage = function(pixelRatio) { + return this.iconImage_.getImage(pixelRatio); +}; + + +/** + * @inheritDoc + */ +ol.style.Icon.prototype.getImageState = function() { + return this.iconImage_.getImageState(); +}; + + +/** + * @inheritDoc + */ +ol.style.Icon.prototype.getHitDetectionImage = function(pixelRatio) { + return this.iconImage_.getHitDetectionImage(pixelRatio); +}; + + +/** + * @return {string|undefined} Image src. + */ +ol.style.Icon.prototype.getSrc = function() { + return this.iconImage_.getSrc(); +}; + + +/** + * @inheritDoc + */ +ol.style.Icon.prototype.getSize = function() { + return goog.isNull(this.size_) ? this.iconImage_.getSize() : this.size_; +}; + + +/** + * @inheritDoc + */ +ol.style.Icon.prototype.listenImageChange = function(listener, thisArg) { + return goog.events.listen(this.iconImage_, goog.events.EventType.CHANGE, + listener, false, thisArg); +}; + + +/** + * Load not yet loaded URI. + */ +ol.style.Icon.prototype.load = function() { + this.iconImage_.load(); +}; + + +/** + * @inheritDoc + */ +ol.style.Icon.prototype.unlistenImageChange = function(listener, thisArg) { + goog.events.unlisten(this.iconImage_, goog.events.EventType.CHANGE, + listener, false, thisArg); +}; + + + +/** + * @constructor + * @param {string} src Src. + * @param {?string} crossOrigin Cross origin. + * @extends {goog.events.EventTarget} + * @private + */ +ol.style.IconImage_ = function(src, crossOrigin) { + + goog.base(this); + + /** + * @private + * @type {Image|HTMLCanvasElement} + */ + this.hitDetectionImage_ = null; + + /** + * @private + * @type {Image} + */ + this.image_ = new Image(); + + if (!goog.isNull(crossOrigin)) { + this.image_.crossOrigin = crossOrigin; + } + + /** + * @private + * @type {Array.} + */ + this.imageListenerKeys_ = null; + + /** + * @private + * @type {ol.style.ImageState} + */ + this.imageState_ = ol.style.ImageState.IDLE; + + /** + * @private + * @type {ol.Size} + */ + this.size_ = null; + + /** + * @private + * @type {string} + */ + this.src_ = src; + + /** + * @private + * @type {boolean} + */ + this.tainting_ = false; + +}; +goog.inherits(ol.style.IconImage_, goog.events.EventTarget); + + +/** + * @param {string} src Src. + * @param {?string} crossOrigin Cross origin. + * @return {ol.style.IconImage_} Icon image. + */ +ol.style.IconImage_.get = function(src, crossOrigin) { + var iconImageCache = ol.style.IconImageCache.getInstance(); + var iconImage = iconImageCache.get(src, crossOrigin); + if (goog.isNull(iconImage)) { + iconImage = new ol.style.IconImage_(src, crossOrigin); + iconImageCache.set(src, crossOrigin, iconImage); + } + return iconImage; +}; + + +/** + * @private + */ +ol.style.IconImage_.prototype.determineTainting_ = function() { + var canvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + canvas.width = 1; + canvas.height = 1; + var context = /** @type {CanvasRenderingContext2D} */ + (canvas.getContext('2d')); + context.drawImage(this.image_, 0, 0); + try { + context.getImageData(0, 0, 1, 1); + } catch (e) { + this.tainting_ = true; + } +}; + + +/** + * @private + */ +ol.style.IconImage_.prototype.dispatchChangeEvent_ = function() { + this.dispatchEvent(goog.events.EventType.CHANGE); +}; + + +/** + * @private + */ +ol.style.IconImage_.prototype.handleImageError_ = function() { + this.imageState_ = ol.style.ImageState.ERROR; + this.unlistenImage_(); + this.dispatchChangeEvent_(); +}; + + +/** + * @private + */ +ol.style.IconImage_.prototype.handleImageLoad_ = function() { + this.imageState_ = ol.style.ImageState.LOADED; + this.size_ = [this.image_.width, this.image_.height]; + this.unlistenImage_(); + this.determineTainting_(); + this.dispatchChangeEvent_(); +}; + + +/** + * @param {number} pixelRatio Pixel ratio. + * @return {Image} Image element. + */ +ol.style.IconImage_.prototype.getImage = function(pixelRatio) { + return this.image_; +}; + + +/** + * @return {ol.style.ImageState} Image state. + */ +ol.style.IconImage_.prototype.getImageState = function() { + return this.imageState_; +}; + + +/** + * @param {number} pixelRatio Pixel ratio. + * @return {Image|HTMLCanvasElement} Image element. + */ +ol.style.IconImage_.prototype.getHitDetectionImage = function(pixelRatio) { + if (goog.isNull(this.hitDetectionImage_)) { + if (this.tainting_) { + var canvas = /** @type {HTMLCanvasElement} */ + (goog.dom.createElement(goog.dom.TagName.CANVAS)); + var width = this.size_[0]; + var height = this.size_[1]; + canvas.width = width; + canvas.height = height; + var context = /** @type {CanvasRenderingContext2D} */ + (canvas.getContext('2d')); + context.fillRect(0, 0, width, height); + this.hitDetectionImage_ = canvas; + } else { + this.hitDetectionImage_ = this.image_; + } + } + return this.hitDetectionImage_; +}; + + +/** + * @return {ol.Size} Image size. + */ +ol.style.IconImage_.prototype.getSize = function() { + return this.size_; +}; + + +/** + * @return {string|undefined} Image src. + */ +ol.style.IconImage_.prototype.getSrc = function() { + return this.src_; +}; + + +/** + * Load not yet loaded URI. + */ +ol.style.IconImage_.prototype.load = function() { + if (this.imageState_ == ol.style.ImageState.IDLE) { + goog.asserts.assert(goog.isDef(this.src_)); + goog.asserts.assert(goog.isNull(this.imageListenerKeys_)); + this.imageState_ = ol.style.ImageState.LOADING; + this.imageListenerKeys_ = [ + goog.events.listenOnce(this.image_, goog.events.EventType.ERROR, + this.handleImageError_, false, this), + goog.events.listenOnce(this.image_, goog.events.EventType.LOAD, + this.handleImageLoad_, false, this) + ]; + try { + this.image_.src = this.src_; + } catch (e) { + this.handleImageError_(); + } + } +}; + + +/** + * Discards event handlers which listen for load completion or errors. + * + * @private + */ +ol.style.IconImage_.prototype.unlistenImage_ = function() { + goog.asserts.assert(!goog.isNull(this.imageListenerKeys_)); + goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey); + this.imageListenerKeys_ = null; +}; + + + +/** + * @constructor + */ +ol.style.IconImageCache = function() { + + /** + * @type {Object.} + * @private + */ + this.cache_ = {}; + + /** + * @type {number} + * @private + */ + this.cacheSize_ = 0; + + /** + * @const + * @type {number} + * @private + */ + this.maxCacheSize_ = 32; +}; +goog.addSingletonGetter(ol.style.IconImageCache); + + +/** + * @param {string} src Src. + * @param {?string} crossOrigin Cross origin. + * @return {string} Cache key. + */ +ol.style.IconImageCache.getKey = function(src, crossOrigin) { + goog.asserts.assert(goog.isDef(crossOrigin)); + return crossOrigin + ':' + src; +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.style.IconImageCache.prototype.clear = function() { + this.cache_ = {}; + this.cacheSize_ = 0; +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.style.IconImageCache.prototype.expire = function() { + if (this.cacheSize_ > this.maxCacheSize_) { + var i = 0; + var key, iconImage; + for (key in this.cache_) { + iconImage = this.cache_[key]; + if ((i++ & 3) === 0 && !goog.events.hasListener(iconImage)) { + delete this.cache_[key]; + --this.cacheSize_; + } + } + } +}; + + +/** + * @param {string} src Src. + * @param {?string} crossOrigin Cross origin. + * @return {ol.style.IconImage_} Icon image. + */ +ol.style.IconImageCache.prototype.get = function(src, crossOrigin) { + var key = ol.style.IconImageCache.getKey(src, crossOrigin); + return key in this.cache_ ? this.cache_[key] : null; +}; + + +/** + * @param {string} src Src. + * @param {?string} crossOrigin Cross origin. + * @param {ol.style.IconImage_} iconImage Icon image. + */ +ol.style.IconImageCache.prototype.set = function(src, crossOrigin, iconImage) { + var key = ol.style.IconImageCache.getKey(src, crossOrigin); + this.cache_[key] = iconImage; + ++this.cacheSize_; +}; diff --git a/float-no-zero/ol/ol/style/imagestyle.exports b/float-no-zero/ol/ol/style/imagestyle.exports new file mode 100644 index 0000000000..67498d3ed8 --- /dev/null +++ b/float-no-zero/ol/ol/style/imagestyle.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.style.Image +@exportProperty ol.style.Image.prototype.getRotation +@exportProperty ol.style.Image.prototype.getScale diff --git a/float-no-zero/ol/ol/style/imagestyle.js b/float-no-zero/ol/ol/style/imagestyle.js new file mode 100644 index 0000000000..9b0411a22f --- /dev/null +++ b/float-no-zero/ol/ol/style/imagestyle.js @@ -0,0 +1,160 @@ +goog.provide('ol.style.Image'); +goog.provide('ol.style.ImageState'); + +goog.require('goog.array'); + + +/** + * @enum {number} + */ +ol.style.ImageState = { + IDLE: 0, + LOADING: 1, + LOADED: 2, + ERROR: 3 +}; + + +/** + * @typedef {{opacity: number, + * rotateWithView: boolean, + * rotation: number, + * scale: number, + * snapToPixel: (boolean|undefined)}} + */ +ol.style.ImageOptions; + + + +/** + * @constructor + * @param {ol.style.ImageOptions} options Options. + */ +ol.style.Image = function(options) { + + /** + * @private + * @type {number} + */ + this.opacity_ = options.opacity; + + /** + * @private + * @type {boolean} + */ + this.rotateWithView_ = options.rotateWithView; + + /** + * @private + * @type {number} + */ + this.rotation_ = options.rotation; + + /** + * @private + * @type {number} + */ + this.scale_ = options.scale; + + /** + * @private + * @type {boolean|undefined} + */ + this.snapToPixel_ = options.snapToPixel; + +}; + + +/** + * @return {number} Opacity. + */ +ol.style.Image.prototype.getOpacity = function() { + return this.opacity_; +}; + + +/** + * @return {boolean} Rotate with map. + */ +ol.style.Image.prototype.getRotateWithView = function() { + return this.rotateWithView_; +}; + + +/** + * @return {number} Rotation. + */ +ol.style.Image.prototype.getRotation = function() { + return this.rotation_; +}; + + +/** + * @return {number} Scale. + */ +ol.style.Image.prototype.getScale = function() { + return this.scale_; +}; + + +/** + * @return {boolean|undefined} Snap to pixel? + */ +ol.style.Image.prototype.getSnapToPixel = function() { + return this.snapToPixel_; +}; + + +/** + * @return {Array.} Anchor. + */ +ol.style.Image.prototype.getAnchor = goog.abstractMethod; + + +/** + * @param {number} pixelRatio Pixel ratio. + * @return {HTMLCanvasElement|HTMLVideoElement|Image} Image element. + */ +ol.style.Image.prototype.getImage = goog.abstractMethod; + + +/** + * @return {ol.style.ImageState} Image state. + */ +ol.style.Image.prototype.getImageState = goog.abstractMethod; + + +/** + * @param {number} pixelRatio Pixel ratio. + * @return {HTMLCanvasElement|HTMLVideoElement|Image} Image element. + */ +ol.style.Image.prototype.getHitDetectionImage = goog.abstractMethod; + + +/** + * @return {ol.Size} Size. + */ +ol.style.Image.prototype.getSize = goog.abstractMethod; + + +/** + * @param {function(this: T, goog.events.Event)} listener Listener function. + * @param {T} thisArg Value to use as `this` when executing `listener`. + * @return {goog.events.Key|undefined} Listener key. + * @template T + */ +ol.style.Image.prototype.listenImageChange = goog.abstractMethod; + + +/** + * Load not yet loaded URI. + */ +ol.style.Image.prototype.load = goog.abstractMethod; + + +/** + * @param {function(this: T, goog.events.Event)} listener Listener function. + * @param {T} thisArg Value to use as `this` when executing `listener`. + * @template T + */ +ol.style.Image.prototype.unlistenImageChange = goog.abstractMethod; diff --git a/float-no-zero/ol/ol/style/strokestyle.exports b/float-no-zero/ol/ol/style/strokestyle.exports new file mode 100644 index 0000000000..3e2060e9d8 --- /dev/null +++ b/float-no-zero/ol/ol/style/strokestyle.exports @@ -0,0 +1,7 @@ +@exportSymbol ol.style.Stroke +@exportProperty ol.style.Stroke.prototype.getColor +@exportProperty ol.style.Stroke.prototype.getLineCap +@exportProperty ol.style.Stroke.prototype.getLineDash +@exportProperty ol.style.Stroke.prototype.getLineJoin +@exportProperty ol.style.Stroke.prototype.getMiterLimit +@exportProperty ol.style.Stroke.prototype.getWidth diff --git a/float-no-zero/ol/ol/style/strokestyle.js b/float-no-zero/ol/ol/style/strokestyle.js new file mode 100644 index 0000000000..08bbeab522 --- /dev/null +++ b/float-no-zero/ol/ol/style/strokestyle.js @@ -0,0 +1,98 @@ +goog.provide('ol.style.Stroke'); + +goog.require('ol.color'); + + + +/** + * @constructor + * @param {olx.style.StrokeOptions=} opt_options Options. + */ +ol.style.Stroke = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.Color|string} + */ + this.color_ = goog.isDef(options.color) ? options.color : null; + + /** + * @private + * @type {string|undefined} + */ + this.lineCap_ = options.lineCap; + + /** + * @private + * @type {Array.} + */ + this.lineDash_ = goog.isDef(options.lineDash) ? options.lineDash : null; + + /** + * @private + * @type {string|undefined} + */ + this.lineJoin_ = options.lineJoin; + + /** + * @private + * @type {number|undefined} + */ + this.miterLimit_ = options.miterLimit; + + /** + * @private + * @type {number|undefined} + */ + this.width_ = options.width; +}; + + +/** + * @return {ol.Color|string} Color. + */ +ol.style.Stroke.prototype.getColor = function() { + return this.color_; +}; + + +/** + * @return {string|undefined} Line cap. + */ +ol.style.Stroke.prototype.getLineCap = function() { + return this.lineCap_; +}; + + +/** + * @return {Array.} Line dash. + */ +ol.style.Stroke.prototype.getLineDash = function() { + return this.lineDash_; +}; + + +/** + * @return {string|undefined} Line join. + */ +ol.style.Stroke.prototype.getLineJoin = function() { + return this.lineJoin_; +}; + + +/** + * @return {number|undefined} Miter limit. + */ +ol.style.Stroke.prototype.getMiterLimit = function() { + return this.miterLimit_; +}; + + +/** + * @return {number|undefined} Width. + */ +ol.style.Stroke.prototype.getWidth = function() { + return this.width_; +}; diff --git a/float-no-zero/ol/ol/style/style.exports b/float-no-zero/ol/ol/style/style.exports new file mode 100644 index 0000000000..94767397d0 --- /dev/null +++ b/float-no-zero/ol/ol/style/style.exports @@ -0,0 +1,6 @@ +@exportSymbol ol.style.Style +@exportProperty ol.style.Style.prototype.getFill +@exportProperty ol.style.Style.prototype.getImage +@exportProperty ol.style.Style.prototype.getStroke +@exportProperty ol.style.Style.prototype.getText +@exportProperty ol.style.Style.prototype.getZIndex diff --git a/float-no-zero/ol/ol/style/style.js b/float-no-zero/ol/ol/style/style.js new file mode 100644 index 0000000000..2016ee3f54 --- /dev/null +++ b/float-no-zero/ol/ol/style/style.js @@ -0,0 +1,87 @@ +goog.provide('ol.style.Style'); + +goog.require('ol.style.Fill'); +goog.require('ol.style.Image'); + + + +/** + * @constructor + * @param {olx.style.StyleOptions=} opt_options Style options. + * @todo stability experimental + */ +ol.style.Style = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {ol.style.Fill} + */ + this.fill_ = goog.isDef(options.fill) ? options.fill : null; + + /** + * @private + * @type {ol.style.Image} + */ + this.image_ = goog.isDef(options.image) ? options.image : null; + + /** + * @private + * @type {ol.style.Stroke} + */ + this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null; + + /** + * @private + * @type {ol.style.Text} + */ + this.text_ = goog.isDef(options.text) ? options.text : null; + + /** + * @private + * @type {number|undefined} + */ + this.zIndex_ = options.zIndex; + +}; + + +/** + * @return {ol.style.Fill} Fill style. + */ +ol.style.Style.prototype.getFill = function() { + return this.fill_; +}; + + +/** + * @return {ol.style.Image} Image style. + */ +ol.style.Style.prototype.getImage = function() { + return this.image_; +}; + + +/** + * @return {ol.style.Stroke} Stroke style. + */ +ol.style.Style.prototype.getStroke = function() { + return this.stroke_; +}; + + +/** + * @return {ol.style.Text} Text style. + */ +ol.style.Style.prototype.getText = function() { + return this.text_; +}; + + +/** + * @return {number|undefined} ZIndex. + */ +ol.style.Style.prototype.getZIndex = function() { + return this.zIndex_; +}; diff --git a/float-no-zero/ol/ol/style/textstyle.exports b/float-no-zero/ol/ol/style/textstyle.exports new file mode 100644 index 0000000000..2dc53b5f5d --- /dev/null +++ b/float-no-zero/ol/ol/style/textstyle.exports @@ -0,0 +1,9 @@ +@exportSymbol ol.style.Text +@exportProperty ol.style.Text.prototype.getFill +@exportProperty ol.style.Text.prototype.getFont +@exportProperty ol.style.Text.prototype.getRotation +@exportProperty ol.style.Text.prototype.getScale +@exportProperty ol.style.Text.prototype.getStroke +@exportProperty ol.style.Text.prototype.getText +@exportProperty ol.style.Text.prototype.getTextAlign +@exportProperty ol.style.Text.prototype.getTextBaseline diff --git a/float-no-zero/ol/ol/style/textstyle.js b/float-no-zero/ol/ol/style/textstyle.js new file mode 100644 index 0000000000..d6b2cecbd1 --- /dev/null +++ b/float-no-zero/ol/ol/style/textstyle.js @@ -0,0 +1,124 @@ +goog.provide('ol.style.Text'); + + + +/** + * @constructor + * @param {olx.style.TextOptions=} opt_options Options. + */ +ol.style.Text = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {string|undefined} + */ + this.font_ = options.font; + + /** + * @private + * @type {number|undefined} + */ + this.rotation_ = options.rotation; + + /** + * @private + * @type {number|undefined} + */ + this.scale_ = options.scale; + + /** + * @private + * @type {string|undefined} + */ + this.text_ = options.text; + + /** + * @private + * @type {string|undefined} + */ + this.textAlign_ = options.textAlign; + + /** + * @private + * @type {string|undefined} + */ + this.textBaseline_ = options.textBaseline; + + /** + * @private + * @type {ol.style.Fill} + */ + this.fill_ = goog.isDef(options.fill) ? options.fill : null; + + /** + * @private + * @type {ol.style.Stroke} + */ + this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null; +}; + + +/** + * @return {string|undefined} Font. + */ +ol.style.Text.prototype.getFont = function() { + return this.font_; +}; + + +/** + * @return {ol.style.Fill} Fill style. + */ +ol.style.Text.prototype.getFill = function() { + return this.fill_; +}; + + +/** + * @return {number|undefined} Rotation. + */ +ol.style.Text.prototype.getRotation = function() { + return this.rotation_; +}; + + +/** + * @return {number|undefined} Scale. + */ +ol.style.Text.prototype.getScale = function() { + return this.scale_; +}; + + +/** + * @return {ol.style.Stroke} Stroke style. + */ +ol.style.Text.prototype.getStroke = function() { + return this.stroke_; +}; + + +/** + * @return {string|undefined} Text. + */ +ol.style.Text.prototype.getText = function() { + return this.text_; +}; + + +/** + * @return {string|undefined} Text align. + */ +ol.style.Text.prototype.getTextAlign = function() { + return this.textAlign_; +}; + + +/** + * @return {string|undefined} Text baseline. + */ +ol.style.Text.prototype.getTextBaseline = function() { + return this.textBaseline_; +}; diff --git a/float-no-zero/ol/ol/tile.exports b/float-no-zero/ol/ol/tile.exports new file mode 100644 index 0000000000..33b1b0fdc8 --- /dev/null +++ b/float-no-zero/ol/ol/tile.exports @@ -0,0 +1 @@ +@exportProperty ol.Tile.prototype.getTileCoord diff --git a/float-no-zero/ol/ol/tile.js b/float-no-zero/ol/ol/tile.js new file mode 100644 index 0000000000..610150083e --- /dev/null +++ b/float-no-zero/ol/ol/tile.js @@ -0,0 +1,93 @@ +// FIXME should inQueue be private? + +goog.provide('ol.Tile'); +goog.provide('ol.TileState'); + +goog.require('goog.events'); +goog.require('goog.events.EventTarget'); +goog.require('goog.events.EventType'); +goog.require('ol.TileCoord'); + + +/** + * @enum {number} + */ +ol.TileState = { + IDLE: 0, + LOADING: 1, + LOADED: 2, + ERROR: 3, + EMPTY: 4 +}; + + + +/** + * @constructor + * @extends {goog.events.EventTarget} + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.TileState} state State. + */ +ol.Tile = function(tileCoord, state) { + + goog.base(this); + + /** + * @type {ol.TileCoord} + */ + this.tileCoord = tileCoord; + + /** + * @protected + * @type {ol.TileState} + */ + this.state = state; + +}; +goog.inherits(ol.Tile, goog.events.EventTarget); + + +/** + * @protected + */ +ol.Tile.prototype.dispatchChangeEvent = function() { + this.dispatchEvent(goog.events.EventType.CHANGE); +}; + + +/** + * @param {Object=} opt_context Object. + * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image. + */ +ol.Tile.prototype.getImage = goog.abstractMethod; + + +/** + * @return {string} Key. + */ +ol.Tile.prototype.getKey = function() { + return goog.getUid(this).toString(); +}; + + +/** + * @return {ol.TileCoord} + * @todo stability experimental + */ +ol.Tile.prototype.getTileCoord = function() { + return this.tileCoord; +}; + + +/** + * @return {ol.TileState} State. + */ +ol.Tile.prototype.getState = function() { + return this.state; +}; + + +/** + * FIXME empty description for jsdoc + */ +ol.Tile.prototype.load = goog.abstractMethod; diff --git a/float-no-zero/ol/ol/tilecache.js b/float-no-zero/ol/ol/tilecache.js new file mode 100644 index 0000000000..643ed75ce9 --- /dev/null +++ b/float-no-zero/ol/ol/tilecache.js @@ -0,0 +1,78 @@ +goog.provide('ol.TileCache'); + +goog.require('goog.asserts'); +goog.require('ol.Tile'); +goog.require('ol.TileCoord'); +goog.require('ol.TileRange'); +goog.require('ol.structs.LRUCache'); + + +/** + * @define {number} Default high water mark. + */ +ol.DEFAULT_TILE_CACHE_HIGH_WATER_MARK = 2048; + + + +/** + * @constructor + * @extends {ol.structs.LRUCache.} + * @param {number=} opt_highWaterMark High water mark. + * @struct + */ +ol.TileCache = function(opt_highWaterMark) { + + goog.base(this); + + /** + * @private + * @type {number} + */ + this.highWaterMark_ = goog.isDef(opt_highWaterMark) ? + opt_highWaterMark : ol.DEFAULT_TILE_CACHE_HIGH_WATER_MARK; + +}; +goog.inherits(ol.TileCache, ol.structs.LRUCache); + + +/** + * @return {boolean} Can expire cache. + */ +ol.TileCache.prototype.canExpireCache = function() { + return this.getCount() > this.highWaterMark_; +}; + + +/** + * @param {Object.} usedTiles Used tiles. + */ +ol.TileCache.prototype.expireCache = function(usedTiles) { + var tile, zKey; + while (this.canExpireCache()) { + tile = /** @type {ol.Tile} */ (this.peekLast()); + zKey = tile.tileCoord.z.toString(); + if (zKey in usedTiles && usedTiles[zKey].contains(tile.tileCoord)) { + break; + } else { + this.pop(); + } + } +}; + + +/** + * Remove a tile range from the cache, e.g. to invalidate tiles. + * @param {ol.TileRange} tileRange The tile range to prune. + */ +ol.TileCache.prototype.pruneTileRange = function(tileRange) { + var i = this.getCount(), + key; + while (i--) { + key = this.peekLastKey(); + if (tileRange.contains(ol.TileCoord.createFromString(key))) { + this.pop(); + } else { + this.get(key); + } + } +}; diff --git a/float-no-zero/ol/ol/tilecoord.exports b/float-no-zero/ol/ol/tilecoord.exports new file mode 100644 index 0000000000..1719d37b9b --- /dev/null +++ b/float-no-zero/ol/ol/tilecoord.exports @@ -0,0 +1 @@ +@exportProperty ol.TileCoord.prototype.getZXY diff --git a/float-no-zero/ol/ol/tilecoord.js b/float-no-zero/ol/ol/tilecoord.js new file mode 100644 index 0000000000..013cc5af2c --- /dev/null +++ b/float-no-zero/ol/ol/tilecoord.js @@ -0,0 +1,170 @@ +goog.provide('ol.TileCoord'); + +goog.require('goog.array'); +goog.require('goog.asserts'); + + +/** + * @enum {number} + */ +ol.QuadKeyCharCode = { + ZERO: '0'.charCodeAt(0), + ONE: '1'.charCodeAt(0), + TWO: '2'.charCodeAt(0), + THREE: '3'.charCodeAt(0) +}; + + + +/** + * @constructor + * @param {number} z Zoom level. + * @param {number} x X. + * @param {number} y Y. + * @struct + */ +ol.TileCoord = function(z, x, y) { + + /** + * Zoom level. + * @type {number} + */ + this.z = z; + + /** + * @type {number} + */ + this.x = x; + + /** + * @type {number} + */ + this.y = y; + +}; + + +/** + * @param {string} quadKey Quad key. + * @return {ol.TileCoord} Tile coordinate. + */ +ol.TileCoord.createFromQuadKey = function(quadKey) { + var z = quadKey.length, x = 0, y = 0; + var mask = 1 << (z - 1); + var i; + for (i = 0; i < z; ++i) { + switch (quadKey.charCodeAt(i)) { + case ol.QuadKeyCharCode.ONE: + x += mask; + break; + case ol.QuadKeyCharCode.TWO: + y += mask; + break; + case ol.QuadKeyCharCode.THREE: + x += mask; + y += mask; + break; + } + mask >>= 1; + } + return new ol.TileCoord(z, x, y); +}; + + +/** + * @param {string} str String that follows pattern “z/x/y” where x, y and z are + * numbers. + * @return {ol.TileCoord} Tile coord. + */ +ol.TileCoord.createFromString = function(str) { + var v = str.split('/'); + v = goog.array.map(v, function(e, i, a) { + return parseInt(e, 10); + }); + return new ol.TileCoord(v[0], v[1], v[2]); +}; + + +/** + * @param {number} z Z. + * @param {number} x X. + * @param {number} y Y. + * @param {ol.TileCoord|undefined} tileCoord Tile coordinate. + * @return {ol.TileCoord} Tile coordinate. + */ +ol.TileCoord.createOrUpdate = function(z, x, y, tileCoord) { + if (goog.isDef(tileCoord)) { + tileCoord.z = z; + tileCoord.x = x; + tileCoord.y = y; + return tileCoord; + } else { + return new ol.TileCoord(z, x, y); + } +}; + + +/** + * @param {number} z Z. + * @param {number} x X. + * @param {number} y Y. + * @return {string} Key. + */ +ol.TileCoord.getKeyZXY = function(z, x, y) { + return z + '/' + x + '/' + y; +}; + + +/** + * @param {Array.=} opt_result Optional array to reuse. + * @return {Array.} Array of z, x, y. + */ +ol.TileCoord.prototype.getZXY = function(opt_result) { + if (goog.isDef(opt_result)) { + goog.asserts.assert(opt_result.length == 3); + opt_result[0] = this.z; + opt_result[1] = this.x; + opt_result[2] = this.y; + return opt_result; + } else { + return [this.z, this.x, this.y]; + } +}; + + +/** + * @return {number} Hash. + */ +ol.TileCoord.prototype.hash = function() { + return (this.x << this.z) + this.y; +}; + + +/** + * @return {string} Quad key. + */ +ol.TileCoord.prototype.quadKey = function() { + var digits = new Array(this.z); + var mask = 1 << (this.z - 1); + var i, charCode; + for (i = 0; i < this.z; ++i) { + charCode = ol.QuadKeyCharCode.ZERO; + if (this.x & mask) { + charCode += 1; + } + if (this.y & mask) { + charCode += 2; + } + digits[i] = String.fromCharCode(charCode); + mask >>= 1; + } + return digits.join(''); +}; + + +/** + * @return {string} String. + */ +ol.TileCoord.prototype.toString = function() { + return ol.TileCoord.getKeyZXY(this.z, this.x, this.y); +}; diff --git a/float-no-zero/ol/ol/tilegrid.jsdoc b/float-no-zero/ol/ol/tilegrid.jsdoc new file mode 100644 index 0000000000..5f6ed64aaa --- /dev/null +++ b/float-no-zero/ol/ol/tilegrid.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.tilegrid + */ diff --git a/float-no-zero/ol/ol/tilegrid/tilegrid.exports b/float-no-zero/ol/ol/tilegrid/tilegrid.exports new file mode 100644 index 0000000000..5e1039d79f --- /dev/null +++ b/float-no-zero/ol/ol/tilegrid/tilegrid.exports @@ -0,0 +1,5 @@ +@exportSymbol ol.tilegrid.TileGrid +@exportProperty ol.tilegrid.TileGrid.prototype.getMinZoom +@exportProperty ol.tilegrid.TileGrid.prototype.getOrigin +@exportProperty ol.tilegrid.TileGrid.prototype.getResolutions +@exportProperty ol.tilegrid.TileGrid.prototype.getTileSize diff --git a/float-no-zero/ol/ol/tilegrid/tilegrid.js b/float-no-zero/ol/ol/tilegrid/tilegrid.js new file mode 100644 index 0000000000..ac547c42b3 --- /dev/null +++ b/float-no-zero/ol/ol/tilegrid/tilegrid.js @@ -0,0 +1,439 @@ +goog.provide('ol.tilegrid.TileGrid'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('ol.Coordinate'); +goog.require('ol.TileCoord'); +goog.require('ol.TileRange'); +goog.require('ol.array'); +goog.require('ol.extent'); +goog.require('ol.proj.METERS_PER_UNIT'); +goog.require('ol.proj.Projection'); +goog.require('ol.proj.Units'); + + +/** + * @define {number} Default tile size. + */ +ol.DEFAULT_TILE_SIZE = 256; + + +/** + * @define {number} Default maximum zoom for default tile grids. + */ +ol.DEFAULT_MAX_ZOOM = 42; + + + +/** + * @constructor + * @param {olx.tilegrid.TileGridOptions} options Tile grid options. + * @struct + * @todo stability experimental + */ +ol.tilegrid.TileGrid = function(options) { + + /** + * @protected + * @type {number} + */ + this.minZoom = goog.isDef(options.minZoom) ? options.minZoom : 0; + + /** + * @private + * @type {!Array.} + */ + this.resolutions_ = options.resolutions; + goog.asserts.assert(goog.array.isSorted(this.resolutions_, function(a, b) { + return b - a; + }, true)); + + /** + * @protected + * @type {number} + */ + this.maxZoom = this.resolutions_.length - 1; + + /** + * @private + * @type {ol.Coordinate} + */ + this.origin_ = goog.isDef(options.origin) ? options.origin : null; + + /** + * @private + * @type {Array.} + */ + this.origins_ = null; + if (goog.isDef(options.origins)) { + this.origins_ = options.origins; + goog.asserts.assert(this.origins_.length == this.maxZoom + 1); + } + goog.asserts.assert( + (goog.isNull(this.origin_) && !goog.isNull(this.origins_)) || + (!goog.isNull(this.origin_) && goog.isNull(this.origins_))); + + /** + * @private + * @type {Array.} + */ + this.tileSizes_ = null; + if (goog.isDef(options.tileSizes)) { + this.tileSizes_ = options.tileSizes; + goog.asserts.assert(this.tileSizes_.length == this.maxZoom + 1); + } + + /** + * @private + * @type {number|undefined} + */ + this.tileSize_ = goog.isDef(options.tileSize) ? + options.tileSize : + goog.isNull(this.tileSizes_) ? ol.DEFAULT_TILE_SIZE : undefined; + goog.asserts.assert( + (!goog.isDef(this.tileSize_) && !goog.isNull(this.tileSizes_)) || + (goog.isDef(this.tileSize_) && goog.isNull(this.tileSizes_))); + +}; + + +/** + * @private + * @type {ol.TileCoord} + */ +ol.tilegrid.TileGrid.tmpTileCoord_ = new ol.TileCoord(0, 0, 0); + + +/** + * @param {{extent: (ol.Extent|undefined), + * wrapX: (boolean|undefined)}=} opt_options Options. + * @return {function(ol.TileCoord, ol.proj.Projection, ol.TileCoord=): + * ol.TileCoord} Tile coordinate transform. + */ +ol.tilegrid.TileGrid.prototype.createTileCoordTransform = goog.abstractMethod; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {function(this: T, number, ol.TileRange): boolean} callback Callback. + * @param {T=} opt_this The object to use as `this` in `callback`. + * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object. + * @param {ol.Extent=} opt_extent Temporary ol.Extent object. + * @return {boolean} Callback succeeded. + * @template T + */ +ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange = + function(tileCoord, callback, opt_this, opt_tileRange, opt_extent) { + var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent); + var z = tileCoord.z - 1; + while (z >= this.minZoom) { + if (callback.call(opt_this, z, + this.getTileRangeForExtentAndZ(tileCoordExtent, z, opt_tileRange))) { + return true; + } + --z; + } + return false; +}; + + +/** + * @return {number} Max zoom. + * @todo stability experimental + */ +ol.tilegrid.TileGrid.prototype.getMaxZoom = function() { + return this.maxZoom; +}; + + +/** + * @return {number} Min zoom. + * @todo stability experimental + */ +ol.tilegrid.TileGrid.prototype.getMinZoom = function() { + return this.minZoom; +}; + + +/** + * @param {number} z Z. + * @return {ol.Coordinate} Origin. + * @todo stability experimental + */ +ol.tilegrid.TileGrid.prototype.getOrigin = function(z) { + if (!goog.isNull(this.origin_)) { + return this.origin_; + } else { + goog.asserts.assert(!goog.isNull(this.origins_)); + goog.asserts.assert(this.minZoom <= z && z <= this.maxZoom); + return this.origins_[z]; + } +}; + + +/** + * @param {number} z Z. + * @return {number} Resolution. + */ +ol.tilegrid.TileGrid.prototype.getResolution = function(z) { + goog.asserts.assert(this.minZoom <= z && z <= this.maxZoom); + return this.resolutions_[z]; +}; + + +/** + * @return {Array.} Resolutions. + * @todo stability experimental + */ +ol.tilegrid.TileGrid.prototype.getResolutions = function() { + return this.resolutions_; +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object. + * @param {ol.Extent=} opt_extent Temporary ol.Extent object. + * @return {ol.TileRange} Tile range. + */ +ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange = + function(tileCoord, opt_tileRange, opt_extent) { + if (tileCoord.z < this.maxZoom) { + var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent); + return this.getTileRangeForExtentAndZ( + tileCoordExtent, tileCoord.z + 1, opt_tileRange); + } else { + return null; + } +}; + + +/** + * @param {number} z Z. + * @param {ol.TileRange} tileRange Tile range. + * @param {ol.Extent=} opt_extent Temporary ol.Extent object. + * @return {ol.Extent} Extent. + */ +ol.tilegrid.TileGrid.prototype.getTileRangeExtent = + function(z, tileRange, opt_extent) { + var origin = this.getOrigin(z); + var resolution = this.getResolution(z); + var tileSize = this.getTileSize(z); + var minX = origin[0] + tileRange.minX * tileSize * resolution; + var maxX = origin[0] + (tileRange.maxX + 1) * tileSize * resolution; + var minY = origin[1] + tileRange.minY * tileSize * resolution; + var maxY = origin[1] + (tileRange.maxY + 1) * tileSize * resolution; + return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @param {ol.TileRange=} opt_tileRange Temporary tile range object. + * @return {ol.TileRange} Tile range. + */ +ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndResolution = + function(extent, resolution, opt_tileRange) { + var tileCoord = ol.tilegrid.TileGrid.tmpTileCoord_; + this.getTileCoordForXYAndResolution_( + extent[0], extent[1], resolution, false, tileCoord); + var minX = tileCoord.x; + var minY = tileCoord.y; + this.getTileCoordForXYAndResolution_( + extent[2], extent[3], resolution, true, tileCoord); + return ol.TileRange.createOrUpdate( + minX, tileCoord.x, minY, tileCoord.y, opt_tileRange); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} z Z. + * @param {ol.TileRange=} opt_tileRange Temporary tile range object. + * @return {ol.TileRange} Tile range. + */ +ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndZ = + function(extent, z, opt_tileRange) { + var resolution = this.getResolution(z); + return this.getTileRangeForExtentAndResolution( + extent, resolution, opt_tileRange); +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {ol.Coordinate} Tile center. + */ +ol.tilegrid.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { + var origin = this.getOrigin(tileCoord.z); + var resolution = this.getResolution(tileCoord.z); + var tileSize = this.getTileSize(tileCoord.z); + return [ + origin[0] + (tileCoord.x + 0.5) * tileSize * resolution, + origin[1] + (tileCoord.y + 0.5) * tileSize * resolution + ]; +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.Extent=} opt_extent Temporary extent object. + * @return {ol.Extent} Extent. + */ +ol.tilegrid.TileGrid.prototype.getTileCoordExtent = + function(tileCoord, opt_extent) { + var origin = this.getOrigin(tileCoord.z); + var resolution = this.getResolution(tileCoord.z); + var tileSize = this.getTileSize(tileCoord.z); + var minX = origin[0] + tileCoord.x * tileSize * resolution; + var minY = origin[1] + tileCoord.y * tileSize * resolution; + var maxX = minX + tileSize * resolution; + var maxY = minY + tileSize * resolution; + return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent); +}; + + +/** + * Get the tile coordinate for the given map coordinate and resolution. This + * method considers that coordinates that intersect tile boundaries should be + * assigned the higher tile coordinate. + * + * @param {ol.Coordinate} coordinate Coordinate. + * @param {number} resolution Resolution. + * @param {ol.TileCoord=} opt_tileCoord Destination ol.TileCoord object. + * @return {ol.TileCoord} Tile coordinate. + */ +ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndResolution = function( + coordinate, resolution, opt_tileCoord) { + return this.getTileCoordForXYAndResolution_( + coordinate[0], coordinate[1], resolution, false, opt_tileCoord); +}; + + +/** + * @param {number} x X. + * @param {number} y Y. + * @param {number} resolution Resolution. + * @param {boolean} reverseIntersectionPolicy Instead of letting edge + * intersections go to the higher tile coordinate, let edge intersections + * go to the lower tile coordinate. + * @param {ol.TileCoord=} opt_tileCoord Temporary ol.TileCoord object. + * @return {ol.TileCoord} Tile coordinate. + * @private + */ +ol.tilegrid.TileGrid.prototype.getTileCoordForXYAndResolution_ = function( + x, y, resolution, reverseIntersectionPolicy, opt_tileCoord) { + var z = this.getZForResolution(resolution); + var scale = resolution / this.getResolution(z); + var origin = this.getOrigin(z); + var tileSize = this.getTileSize(z); + + var tileCoordX = scale * (x - origin[0]) / (resolution * tileSize); + var tileCoordY = scale * (y - origin[1]) / (resolution * tileSize); + + if (reverseIntersectionPolicy) { + tileCoordX = Math.ceil(tileCoordX) - 1; + tileCoordY = Math.ceil(tileCoordY) - 1; + } else { + tileCoordX = Math.floor(tileCoordX); + tileCoordY = Math.floor(tileCoordY); + } + + return ol.TileCoord.createOrUpdate(z, tileCoordX, tileCoordY, opt_tileCoord); +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @param {number} z Z. + * @param {ol.TileCoord=} opt_tileCoord Destination ol.TileCoord object. + * @return {ol.TileCoord} Tile coordinate. + */ +ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndZ = + function(coordinate, z, opt_tileCoord) { + var resolution = this.getResolution(z); + return this.getTileCoordForXYAndResolution_( + coordinate[0], coordinate[1], resolution, false, opt_tileCoord); +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {number} Tile resolution. + */ +ol.tilegrid.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { + goog.asserts.assert( + this.minZoom <= tileCoord.z && tileCoord.z <= this.maxZoom); + return this.resolutions_[tileCoord.z]; +}; + + +/** + * @param {number} z Z. + * @return {number} Tile size. + * @todo stability experimental + */ +ol.tilegrid.TileGrid.prototype.getTileSize = function(z) { + if (goog.isDef(this.tileSize_)) { + return this.tileSize_; + } else { + goog.asserts.assert(!goog.isNull(this.tileSizes_)); + goog.asserts.assert(this.minZoom <= z && z <= this.maxZoom); + return this.tileSizes_[z]; + } +}; + + +/** + * @param {number} resolution Resolution. + * @return {number} Z. + */ +ol.tilegrid.TileGrid.prototype.getZForResolution = function(resolution) { + return ol.array.linearFindNearest(this.resolutions_, resolution, 0); +}; + + +/** + * @param {ol.proj.Projection} projection Projection. + * @return {ol.tilegrid.TileGrid} Default tile grid for the passed projection. + */ +ol.tilegrid.getForProjection = function(projection) { + var tileGrid = projection.getDefaultTileGrid(); + if (goog.isNull(tileGrid)) { + tileGrid = ol.tilegrid.createForProjection(projection); + projection.setDefaultTileGrid(tileGrid); + } + return tileGrid; +}; + + +/** + * @param {ol.proj.Projection} projection Projection. + * @param {number=} opt_maxZoom Maximum zoom level. + * @param {number=} opt_tileSize Tile size. + * @return {ol.tilegrid.TileGrid} TileGrid instance. + */ +ol.tilegrid.createForProjection = + function(projection, opt_maxZoom, opt_tileSize) { + var projectionExtent = projection.getExtent(); + var size = goog.isNull(projectionExtent) ? + 360 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] / + projection.getMetersPerUnit() : + Math.max(projectionExtent[2] - projectionExtent[0], + projectionExtent[3] - projectionExtent[1]); + var maxZoom = goog.isDef(opt_maxZoom) ? + opt_maxZoom : ol.DEFAULT_MAX_ZOOM; + var tileSize = goog.isDef(opt_tileSize) ? opt_tileSize : ol.DEFAULT_TILE_SIZE; + var resolutions = new Array(maxZoom + 1); + var maxResolution = size / tileSize; + for (var z = 0, zz = resolutions.length; z < zz; ++z) { + resolutions[z] = maxResolution / Math.pow(2, z); + } + return new ol.tilegrid.TileGrid({ + origin: goog.isNull(projectionExtent) ? [0, 0] : + ol.extent.getBottomLeft(projectionExtent), + resolutions: resolutions, + tileSize: tileSize + }); +}; diff --git a/float-no-zero/ol/ol/tilegrid/wmtstilegrid.exports b/float-no-zero/ol/ol/tilegrid/wmtstilegrid.exports new file mode 100644 index 0000000000..654b18d9c8 --- /dev/null +++ b/float-no-zero/ol/ol/tilegrid/wmtstilegrid.exports @@ -0,0 +1,2 @@ +@exportSymbol ol.tilegrid.WMTS +@exportProperty ol.tilegrid.WMTS.prototype.getMatrixIds diff --git a/float-no-zero/ol/ol/tilegrid/wmtstilegrid.js b/float-no-zero/ol/ol/tilegrid/wmtstilegrid.js new file mode 100644 index 0000000000..5c4ad79de6 --- /dev/null +++ b/float-no-zero/ol/ol/tilegrid/wmtstilegrid.js @@ -0,0 +1,110 @@ +goog.provide('ol.tilegrid.WMTS'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('ol.proj'); +goog.require('ol.tilegrid.TileGrid'); + + + +/** + * @constructor + * @extends {ol.tilegrid.TileGrid} + * @param {olx.tilegrid.WMTSOptions} options WMTS options. + * @struct + * @todo stability experimental + */ +ol.tilegrid.WMTS = function(options) { + + goog.asserts.assert( + options.resolutions.length == options.matrixIds.length); + + /** + * @private + * @type {!Array.} + */ + this.matrixIds_ = options.matrixIds; + // FIXME: should the matrixIds become optionnal? + + goog.base(this, { + origin: options.origin, + origins: options.origins, + resolutions: options.resolutions, + tileSize: options.tileSize, + tileSizes: options.tileSizes + }); + +}; +goog.inherits(ol.tilegrid.WMTS, ol.tilegrid.TileGrid); + + +/** + * @param {number} z Z. + * @return {string} MatrixId.. + */ +ol.tilegrid.WMTS.prototype.getMatrixId = function(z) { + goog.asserts.assert(0 <= z && z < this.matrixIds_.length); + return this.matrixIds_[z]; +}; + + +/** + * @return {Array.} MatrixIds. + * @todo stability experimental + */ +ol.tilegrid.WMTS.prototype.getMatrixIds = function() { + return this.matrixIds_; +}; + + +/** + * @param {Object} matrixSet An object representing a matrixSet in the + * capabilities document. + * @return {ol.tilegrid.WMTS} WMTS tileGrid instance. + */ +ol.tilegrid.WMTS.createFromCapabilitiesMatrixSet = + function(matrixSet) { + + /** @type {!Array.} */ + var resolutions = []; + /** @type {!Array.} */ + var matrixIds = []; + /** @type {!Array.} */ + var origins = []; + /** @type {!Array.} */ + var tileSizes = []; + + var supportedCRSPropName = 'supportedCRS'; + var matrixIdsPropName = 'matrixIds'; + var identifierPropName = 'identifier'; + var scaleDenominatorPropName = 'scaleDenominator'; + var topLeftCornerPropName = 'topLeftCorner'; + var tileWidthPropName = 'tileWidth'; + var tileHeightPropName = 'tileHeight'; + + var projection = ol.proj.get(matrixSet[supportedCRSPropName]); + var metersPerUnit = projection.getMetersPerUnit(); + + goog.array.sort(matrixSet[matrixIdsPropName], function(a, b) { + return b[scaleDenominatorPropName] - a[scaleDenominatorPropName]; + }); + + goog.array.forEach(matrixSet[matrixIdsPropName], + function(elt, index, array) { + matrixIds.push(elt[identifierPropName]); + origins.push(elt[topLeftCornerPropName]); + resolutions.push(elt[scaleDenominatorPropName] * 0.28E-3 / + metersPerUnit); + var tileWidth = elt[tileWidthPropName]; + var tileHeight = elt[tileHeightPropName]; + goog.asserts.assert(tileWidth == tileHeight); + tileSizes.push(tileWidth); + }); + + return new ol.tilegrid.WMTS({ + origins: origins, + resolutions: resolutions, + matrixIds: matrixIds, + tileSizes: tileSizes + }); +}; diff --git a/float-no-zero/ol/ol/tilegrid/xyztilegrid.exports b/float-no-zero/ol/ol/tilegrid/xyztilegrid.exports new file mode 100644 index 0000000000..f05509aca9 --- /dev/null +++ b/float-no-zero/ol/ol/tilegrid/xyztilegrid.exports @@ -0,0 +1 @@ +@exportSymbol ol.tilegrid.XYZ diff --git a/float-no-zero/ol/ol/tilegrid/xyztilegrid.js b/float-no-zero/ol/ol/tilegrid/xyztilegrid.js new file mode 100644 index 0000000000..d3bdd82d6b --- /dev/null +++ b/float-no-zero/ol/ol/tilegrid/xyztilegrid.js @@ -0,0 +1,129 @@ +goog.provide('ol.tilegrid.XYZ'); + +goog.require('goog.math'); +goog.require('ol.TileCoord'); +goog.require('ol.TileRange'); +goog.require('ol.proj'); +goog.require('ol.proj.EPSG3857'); +goog.require('ol.tilegrid.TileGrid'); + + + +/** + * @constructor + * @extends {ol.tilegrid.TileGrid} + * @param {olx.tilegrid.XYZOptions} options XYZ options. + * @struct + * @todo stability experimental + */ +ol.tilegrid.XYZ = function(options) { + + var resolutions = new Array(options.maxZoom + 1); + var z; + var size = 2 * ol.proj.EPSG3857.HALF_SIZE / ol.DEFAULT_TILE_SIZE; + for (z = 0; z <= options.maxZoom; ++z) { + resolutions[z] = size / Math.pow(2, z); + } + + goog.base(this, { + minZoom: options.minZoom, + origin: [-ol.proj.EPSG3857.HALF_SIZE, ol.proj.EPSG3857.HALF_SIZE], + resolutions: resolutions, + tileSize: ol.DEFAULT_TILE_SIZE + }); + +}; +goog.inherits(ol.tilegrid.XYZ, ol.tilegrid.TileGrid); + + +/** + * @inheritDoc + */ +ol.tilegrid.XYZ.prototype.createTileCoordTransform = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var minZ = this.minZoom; + var maxZ = this.maxZoom; + var wrapX = goog.isDef(options.wrapX) ? options.wrapX : true; + var tmpTileCoord = new ol.TileCoord(0, 0, 0); + /** @type {Array.} */ + var tileRangeByZ = null; + if (goog.isDef(options.extent)) { + tileRangeByZ = new Array(maxZ + 1); + var z; + for (z = 0; z <= maxZ; ++z) { + if (z < minZ) { + tileRangeByZ[z] = null; + } else { + tileRangeByZ[z] = this.getTileRangeForExtentAndZ(options.extent, z); + } + } + } + return ( + /** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.proj.Projection} projection Projection. + * @param {ol.TileCoord=} opt_tileCoord Destination tile coordinate. + * @return {ol.TileCoord} Tile coordinate. + */ + function(tileCoord, projection, opt_tileCoord) { + var z = tileCoord.z; + if (z < minZ || maxZ < z) { + return null; + } + var n = Math.pow(2, z); + var x = tileCoord.x; + if (wrapX) { + x = goog.math.modulo(x, n); + } else if (x < 0 || n <= x) { + return null; + } + var y = tileCoord.y; + if (y < -n || -1 < y) { + return null; + } + if (!goog.isNull(tileRangeByZ)) { + tmpTileCoord.z = z; + tmpTileCoord.x = x; + tmpTileCoord.y = y; + if (!tileRangeByZ[z].contains(tmpTileCoord)) { + return null; + } + } + return ol.TileCoord.createOrUpdate(z, x, -y - 1, opt_tileCoord); + }); +}; + + +/** + * @inheritDoc + */ +ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange = + function(tileCoord, opt_tileRange) { + if (tileCoord.z < this.maxZoom) { + return ol.TileRange.createOrUpdate( + 2 * tileCoord.x, 2 * (tileCoord.x + 1), + 2 * tileCoord.y, 2 * (tileCoord.y + 1), + opt_tileRange); + } else { + return null; + } +}; + + +/** + * @inheritDoc + */ +ol.tilegrid.XYZ.prototype.forEachTileCoordParentTileRange = + function(tileCoord, callback, opt_this, opt_tileRange) { + var tileRange = ol.TileRange.createOrUpdate( + 0, tileCoord.x, 0, tileCoord.y, opt_tileRange); + var z; + for (z = tileCoord.z - 1; z >= this.minZoom; --z) { + tileRange.minX = tileRange.maxX >>= 1; + tileRange.minY = tileRange.maxY >>= 1; + if (callback.call(opt_this, z, tileRange)) { + return true; + } + } + return false; +}; diff --git a/float-no-zero/ol/ol/tilegrid/zoomifytilegrid.exports b/float-no-zero/ol/ol/tilegrid/zoomifytilegrid.exports new file mode 100644 index 0000000000..afbfc424a2 --- /dev/null +++ b/float-no-zero/ol/ol/tilegrid/zoomifytilegrid.exports @@ -0,0 +1 @@ +@exportSymbol ol.tilegrid.Zoomify diff --git a/float-no-zero/ol/ol/tilegrid/zoomifytilegrid.js b/float-no-zero/ol/ol/tilegrid/zoomifytilegrid.js new file mode 100644 index 0000000000..6bf221c8fd --- /dev/null +++ b/float-no-zero/ol/ol/tilegrid/zoomifytilegrid.js @@ -0,0 +1,79 @@ +goog.provide('ol.tilegrid.Zoomify'); + +goog.require('goog.math'); +goog.require('ol.TileCoord'); +goog.require('ol.proj'); +goog.require('ol.tilegrid.TileGrid'); + + + +/** + * @constructor + * @extends {ol.tilegrid.TileGrid} + * @param {olx.tilegrid.ZoomifyOptions=} opt_options Options. + * @todo stability experimental + */ +ol.tilegrid.Zoomify = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : options; + goog.base(this, { + origin: [0, 0], + resolutions: options.resolutions + }); + +}; +goog.inherits(ol.tilegrid.Zoomify, ol.tilegrid.TileGrid); + + +/** + * @inheritDoc + */ +ol.tilegrid.Zoomify.prototype.createTileCoordTransform = function(opt_options) { + var options = goog.isDef(opt_options) ? opt_options : {}; + var minZ = this.minZoom; + var maxZ = this.maxZoom; + var tmpTileCoord = new ol.TileCoord(0, 0, 0); + /** @type {Array.} */ + var tileRangeByZ = null; + if (goog.isDef(options.extent)) { + tileRangeByZ = new Array(maxZ + 1); + var z; + for (z = 0; z <= maxZ; ++z) { + if (z < minZ) { + tileRangeByZ[z] = null; + } else { + tileRangeByZ[z] = this.getTileRangeForExtentAndZ(options.extent, z); + } + } + } + return ( + /** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.proj.Projection} projection Projection. + * @param {ol.TileCoord=} opt_tileCoord Destination tile coordinate. + * @return {ol.TileCoord} Tile coordinate. + */ + function(tileCoord, projection, opt_tileCoord) { + var z = tileCoord.z; + if (z < minZ || maxZ < z) { + return null; + } + var n = Math.pow(2, z); + var x = tileCoord.x; + if (x < 0 || n <= x) { + return null; + } + var y = tileCoord.y; + if (y < -n || -1 < y) { + return null; + } + if (!goog.isNull(tileRangeByZ)) { + tmpTileCoord.z = z; + tmpTileCoord.x = x; + tmpTileCoord.y = -y - 1; + if (!tileRangeByZ[z].contains(tmpTileCoord)) { + return null; + } + } + return ol.TileCoord.createOrUpdate(z, x, -y - 1, opt_tileCoord); + }); +}; diff --git a/float-no-zero/ol/ol/tileloadfunction.js b/float-no-zero/ol/ol/tileloadfunction.js new file mode 100644 index 0000000000..9524830044 --- /dev/null +++ b/float-no-zero/ol/ol/tileloadfunction.js @@ -0,0 +1,11 @@ +goog.provide('ol.TileLoadFunctionType'); + + +/** + * A function that takes an {@link ol.ImageTile} for the image tile and a + * `{string}` for the src as arguments. + * + * @typedef {function(ol.ImageTile, string)} + * @todo stability experimental + */ +ol.TileLoadFunctionType; diff --git a/float-no-zero/ol/ol/tilequeue.js b/float-no-zero/ol/ol/tilequeue.js new file mode 100644 index 0000000000..e0426a5cb4 --- /dev/null +++ b/float-no-zero/ol/ol/tilequeue.js @@ -0,0 +1,94 @@ +goog.provide('ol.TilePriorityFunction'); +goog.provide('ol.TileQueue'); + +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('ol.Coordinate'); +goog.require('ol.Tile'); +goog.require('ol.structs.PriorityQueue'); + + +/** + * @typedef {function(ol.Tile, string, ol.Coordinate, number): number} + */ +ol.TilePriorityFunction; + + + +/** + * @constructor + * @extends {ol.structs.PriorityQueue.} + * @param {ol.TilePriorityFunction} tilePriorityFunction + * Tile priority function. + * @param {function(): ?} tileChangeCallback + * Function called on each tile change event. + * @struct + */ +ol.TileQueue = function(tilePriorityFunction, tileChangeCallback) { + + goog.base( + this, + /** + * @param {Array} element Element. + * @return {number} Priority. + */ + function(element) { + return tilePriorityFunction.apply(null, element); + }, + /** + * @param {Array} element Element. + * @return {string} Key. + */ + function(element) { + return /** @type {ol.Tile} */ (element[0]).getKey(); + }); + + /** + * @private + * @type {function(): ?} + */ + this.tileChangeCallback_ = tileChangeCallback; + + /** + * @private + * @type {number} + */ + this.tilesLoading_ = 0; + +}; +goog.inherits(ol.TileQueue, ol.structs.PriorityQueue); + + +/** + * @return {number} Number of tiles loading. + */ +ol.TileQueue.prototype.getTilesLoading = function() { + return this.tilesLoading_; +}; + + +/** + * @protected + */ +ol.TileQueue.prototype.handleTileChange = function() { + --this.tilesLoading_; + this.tileChangeCallback_(); +}; + + +/** + * @param {number} maxTotalLoading Maximum number tiles to load simultaneously. + * @param {number} maxNewLoads Maximum number of new tiles to load. + */ +ol.TileQueue.prototype.loadMoreTiles = function(maxTotalLoading, maxNewLoads) { + var newLoads = Math.min( + maxTotalLoading - this.getTilesLoading(), maxNewLoads, this.getCount()); + var i, tile; + for (i = 0; i < newLoads; ++i) { + tile = /** @type {ol.Tile} */ (this.dequeue()[0]); + goog.events.listenOnce(tile, goog.events.EventType.CHANGE, + this.handleTileChange, false, this); + tile.load(); + } + this.tilesLoading_ += newLoads; +}; diff --git a/float-no-zero/ol/ol/tilerange.js b/float-no-zero/ol/ol/tilerange.js new file mode 100644 index 0000000000..f2ef5d3245 --- /dev/null +++ b/float-no-zero/ol/ol/tilerange.js @@ -0,0 +1,169 @@ +goog.provide('ol.TileRange'); + +goog.require('goog.asserts'); +goog.require('ol.Size'); +goog.require('ol.TileCoord'); + + + +/** + * A representation of a contiguous block of tiles. A tile range is specified + * by its min/max tile coordinates and is inclusive of coordinates. + * + * @constructor + * @param {number} minX Minimum X. + * @param {number} maxX Maximum X. + * @param {number} minY Minimum Y. + * @param {number} maxY Maximum Y. + * @struct + */ +ol.TileRange = function(minX, maxX, minY, maxY) { + + /** + * @type {number} + */ + this.minX = minX; + + /** + * @type {number} + */ + this.maxX = maxX; + + /** + * @type {number} + */ + this.minY = minY; + + /** + * @type {number} + */ + this.maxY = maxY; + +}; + + +/** + * @param {...ol.TileCoord} var_args Tile coordinates. + * @return {!ol.TileRange} Bounding tile box. + */ +ol.TileRange.boundingTileRange = function(var_args) { + var tileCoord0 = /** @type {ol.TileCoord} */ (arguments[0]); + var tileRange = new ol.TileRange(tileCoord0.x, tileCoord0.x, + tileCoord0.y, tileCoord0.y); + var i, ii, tileCoord; + for (i = 1, ii = arguments.length; i < ii; ++i) { + tileCoord = /** @type {ol.TileCoord} */ (arguments[i]); + goog.asserts.assert(tileCoord.z == tileCoord0.z); + tileRange.minX = Math.min(tileRange.minX, tileCoord.x); + tileRange.maxX = Math.max(tileRange.maxX, tileCoord.x); + tileRange.minY = Math.min(tileRange.minY, tileCoord.y); + tileRange.maxY = Math.max(tileRange.maxY, tileCoord.y); + } + return tileRange; +}; + + +/** + * @param {number} minX Minimum X. + * @param {number} maxX Maximum X. + * @param {number} minY Minimum Y. + * @param {number} maxY Maximum Y. + * @param {ol.TileRange|undefined} tileRange TileRange. + * @return {ol.TileRange} Tile range. + */ +ol.TileRange.createOrUpdate = function(minX, maxX, minY, maxY, tileRange) { + if (goog.isDef(tileRange)) { + tileRange.minX = minX; + tileRange.maxX = maxX; + tileRange.minY = minY; + tileRange.maxY = maxY; + return tileRange; + } else { + return new ol.TileRange(minX, maxX, minY, maxY); + } +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {boolean} Contains tile coordinate. + */ +ol.TileRange.prototype.contains = function(tileCoord) { + return this.minX <= tileCoord.x && tileCoord.x <= this.maxX && + this.minY <= tileCoord.y && tileCoord.y <= this.maxY; +}; + + +/** + * @param {ol.TileRange} tileRange Tile range. + * @return {boolean} Contains. + */ +ol.TileRange.prototype.containsTileRange = function(tileRange) { + return this.minX <= tileRange.minX && tileRange.maxX <= this.maxX && + this.minY <= tileRange.minY && tileRange.maxY <= this.maxY; +}; + + +/** + * @param {ol.TileRange} tileRange Tile range. + * @return {boolean} Equals. + */ +ol.TileRange.prototype.equals = function(tileRange) { + return this.minX == tileRange.minX && this.minY == tileRange.minY && + this.maxX == tileRange.maxX && this.maxY == tileRange.maxY; +}; + + +/** + * @param {ol.TileRange} tileRange Tile range. + */ +ol.TileRange.prototype.extend = function(tileRange) { + if (tileRange.minX < this.minX) { + this.minX = tileRange.minX; + } + if (tileRange.maxX > this.maxX) { + this.maxX = tileRange.maxX; + } + if (tileRange.minY < this.minY) { + this.minY = tileRange.minY; + } + if (tileRange.maxY > this.maxY) { + this.maxY = tileRange.maxY; + } +}; + + +/** + * @return {number} Height. + */ +ol.TileRange.prototype.getHeight = function() { + return this.maxY - this.minY + 1; +}; + + +/** + * @return {ol.Size} Size. + */ +ol.TileRange.prototype.getSize = function() { + return [this.getWidth(), this.getHeight()]; +}; + + +/** + * @return {number} Width. + */ +ol.TileRange.prototype.getWidth = function() { + return this.maxX - this.minX + 1; +}; + + +/** + * @param {ol.TileRange} tileRange Tile range. + * @return {boolean} Intersects. + */ +ol.TileRange.prototype.intersects = function(tileRange) { + return this.minX <= tileRange.maxX && + this.maxX >= tileRange.minX && + this.minY <= tileRange.maxY && + this.maxY >= tileRange.minY; +}; diff --git a/float-no-zero/ol/ol/tileurlfunction.js b/float-no-zero/ol/ol/tileurlfunction.js new file mode 100644 index 0000000000..0626f0ec80 --- /dev/null +++ b/float-no-zero/ol/ol/tileurlfunction.js @@ -0,0 +1,155 @@ +goog.provide('ol.TileUrlFunction'); +goog.provide('ol.TileUrlFunctionType'); + +goog.require('goog.array'); +goog.require('goog.math'); +goog.require('ol.TileCoord'); + + +/** + * A function that takes an {@link ol.TileCoord} for the tile coordinate, + * a `{number}` representing the pixel ratio and an {@link ol.proj.Projection} + * for the projection as arguments and returns a `{string}` or + * undefined representing the tile URL. The this keyword inside the function + * references the {@link ol.source.TileImage}. + * + * @typedef {function(this: ol.source.TileImage, ol.TileCoord, + * number, ol.proj.Projection): (string|undefined)} + * @todo stability experimental + */ +ol.TileUrlFunctionType; + + +/** + * @typedef {function(ol.TileCoord, ol.proj.Projection, ol.TileCoord=): + * ol.TileCoord} + */ +ol.TileCoordTransformType; + + +/** + * @param {string} template Template. + * @return {ol.TileUrlFunctionType} Tile URL function. + */ +ol.TileUrlFunction.createFromTemplate = function(template) { + return ( + /** + * @this {ol.source.TileImage} + * @param {ol.TileCoord} tileCoord Tile Coordinate. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} Tile URL. + */ + function(tileCoord, pixelRatio, projection) { + if (goog.isNull(tileCoord)) { + return undefined; + } else { + return template.replace('{z}', tileCoord.z.toString()) + .replace('{x}', tileCoord.x.toString()) + .replace('{y}', tileCoord.y.toString()); + } + }); +}; + + +/** + * @param {Array.} templates Templates. + * @return {ol.TileUrlFunctionType} Tile URL function. + */ +ol.TileUrlFunction.createFromTemplates = function(templates) { + return ol.TileUrlFunction.createFromTileUrlFunctions( + goog.array.map(templates, ol.TileUrlFunction.createFromTemplate)); +}; + + +/** + * @param {Array.} tileUrlFunctions Tile URL Functions. + * @return {ol.TileUrlFunctionType} Tile URL function. + */ +ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { + if (tileUrlFunctions.length === 1) { + return tileUrlFunctions[0]; + } + return ( + /** + * @this {ol.source.TileImage} + * @param {ol.TileCoord} tileCoord Tile Coordinate. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} Tile URL. + */ + function(tileCoord, pixelRatio, projection) { + if (goog.isNull(tileCoord)) { + return undefined; + } else { + var index = + goog.math.modulo(tileCoord.hash(), tileUrlFunctions.length); + return tileUrlFunctions[index].call( + this, tileCoord, pixelRatio, projection); + } + }); +}; + + +/** + * @this {ol.source.TileImage} + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} Tile URL. + */ +ol.TileUrlFunction.nullTileUrlFunction = + function(tileCoord, pixelRatio, projection) { + return undefined; +}; + + +/** + * @param {ol.TileCoordTransformType} transformFn Transform function. + * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function. + * @return {ol.TileUrlFunctionType} Tile URL function. + */ +ol.TileUrlFunction.withTileCoordTransform = + function(transformFn, tileUrlFunction) { + var tmpTileCoord = new ol.TileCoord(0, 0, 0); + return ( + /** + * @this {ol.source.TileImage} + * @param {ol.TileCoord} tileCoord Tile Coordinate. + * @param {number} pixelRatio Pixel ratio. + * @param {ol.proj.Projection} projection Projection. + * @return {string|undefined} Tile URL. + */ + function(tileCoord, pixelRatio, projection) { + if (goog.isNull(tileCoord)) { + return undefined; + } else { + return tileUrlFunction.call( + this, + transformFn.call(this, tileCoord, projection, tmpTileCoord), + pixelRatio, + projection); + } + }); +}; + + +/** + * @param {string} url URL. + * @return {Array.} Array of urls. + */ +ol.TileUrlFunction.expandUrl = function(url) { + var urls = []; + var match = /\{(\d)-(\d)\}/.exec(url) || /\{([a-z])-([a-z])\}/.exec(url); + if (match) { + var startCharCode = match[1].charCodeAt(0); + var stopCharCode = match[2].charCodeAt(0); + var charCode; + for (charCode = startCharCode; charCode <= stopCharCode; ++charCode) { + urls.push(url.replace(match[0], String.fromCharCode(charCode))); + } + } else { + urls.push(url); + } + return urls; +}; diff --git a/float-no-zero/ol/ol/transformfunction.js b/float-no-zero/ol/ol/transformfunction.js new file mode 100644 index 0000000000..3bf13896ec --- /dev/null +++ b/float-no-zero/ol/ol/transformfunction.js @@ -0,0 +1,13 @@ +goog.provide('ol.TransformFunction'); + + +/** + * A transform function accepts an array of input coordinate values, an optional + * output array, and an optional dimension (default should be 2). The function + * transforms the input coordinate values, populates the output array, and + * returns the output array. + * + * @typedef {function(Array., Array.=, number=): Array.} + * @todo stability experimental + */ +ol.TransformFunction; diff --git a/float-no-zero/ol/ol/vec/mat4.js b/float-no-zero/ol/ol/vec/mat4.js new file mode 100644 index 0000000000..54e7df7e71 --- /dev/null +++ b/float-no-zero/ol/ol/vec/mat4.js @@ -0,0 +1,82 @@ +goog.provide('ol.vec.Mat4'); + +goog.require('goog.vec.Mat4'); + + +/** + * @param {!goog.vec.Mat4.Number} mat Matrix. + * @param {number} translateX1 Translate X1. + * @param {number} translateY1 Translate Y1. + * @param {number} scaleX Scale X. + * @param {number} scaleY Scale Y. + * @param {number} rotation Rotation. + * @param {number} translateX2 Translate X2. + * @param {number} translateY2 Translate Y2. + * @return {!goog.vec.Mat4.Number} Matrix. + */ +ol.vec.Mat4.makeTransform2D = function(mat, translateX1, translateY1, + scaleX, scaleY, rotation, translateX2, translateY2) { + goog.vec.Mat4.makeIdentity(mat); + if (translateX1 !== 0 || translateY1 !== 0) { + goog.vec.Mat4.translate(mat, translateX1, translateY1, 0); + } + if (scaleX != 1 || scaleY != 1) { + goog.vec.Mat4.scale(mat, scaleX, scaleY, 1); + } + if (rotation !== 0) { + goog.vec.Mat4.rotateZ(mat, rotation); + } + if (translateX2 !== 0 || translateY2 !== 0) { + goog.vec.Mat4.translate(mat, translateX2, translateY2, 0); + } + return mat; +}; + + +/** + * Returns true if mat1 and mat2 represent the same 2D transformation. + * @param {goog.vec.Mat4.Number} mat1 Matrix 1. + * @param {goog.vec.Mat4.Number} mat2 Matrix 2. + * @return {boolean} Equal 2D. + */ +ol.vec.Mat4.equals2D = function(mat1, mat2) { + return ( + goog.vec.Mat4.getElement(mat1, 0, 0) == + goog.vec.Mat4.getElement(mat2, 0, 0) && + goog.vec.Mat4.getElement(mat1, 1, 0) == + goog.vec.Mat4.getElement(mat2, 1, 0) && + goog.vec.Mat4.getElement(mat1, 0, 1) == + goog.vec.Mat4.getElement(mat2, 0, 1) && + goog.vec.Mat4.getElement(mat1, 1, 1) == + goog.vec.Mat4.getElement(mat2, 1, 1) && + goog.vec.Mat4.getElement(mat1, 0, 3) == + goog.vec.Mat4.getElement(mat2, 0, 3) && + goog.vec.Mat4.getElement(mat1, 1, 3) == + goog.vec.Mat4.getElement(mat2, 1, 3)); +}; + + +/** + * Transforms the given vector with the given matrix storing the resulting, + * transformed vector into resultVec. The input vector is multiplied against the + * upper 2x4 matrix omitting the projective component. + * + * @param {goog.vec.Mat4.Number} mat The matrix supplying the transformation. + * @param {Array.} vec The 3 element vector to transform. + * @param {Array.} resultVec The 3 element vector to receive the results + * (may be vec). + * @return {Array.} return resultVec so that operations can be + * chained together. + */ +ol.vec.Mat4.multVec2 = function(mat, vec, resultVec) { + var m00 = goog.vec.Mat4.getElement(mat, 0, 0); + var m10 = goog.vec.Mat4.getElement(mat, 1, 0); + var m01 = goog.vec.Mat4.getElement(mat, 0, 1); + var m11 = goog.vec.Mat4.getElement(mat, 1, 1); + var m03 = goog.vec.Mat4.getElement(mat, 0, 3); + var m13 = goog.vec.Mat4.getElement(mat, 1, 3); + var x = vec[0], y = vec[1]; + resultVec[0] = m00 * x + m01 * y + m03; + resultVec[1] = m10 * x + m11 * y + m13; + return resultVec; +}; diff --git a/float-no-zero/ol/ol/view.js b/float-no-zero/ol/ol/view.js new file mode 100644 index 0000000000..ffee86ba59 --- /dev/null +++ b/float-no-zero/ol/ol/view.js @@ -0,0 +1,87 @@ +goog.provide('ol.View'); +goog.provide('ol.ViewHint'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('ol.IView'); +goog.require('ol.Object'); + + +/** + * @enum {number} + */ +ol.ViewHint = { + ANIMATING: 0, + INTERACTING: 1 +}; + + + +/** + * @constructor + * @implements {ol.IView} + * @extends {ol.Object} + */ +ol.View = function() { + + goog.base(this); + + /** + * @private + * @type {Array.} + */ + this.hints_ = [0, 0]; + +}; +goog.inherits(ol.View, ol.Object); + + +/** + * @return {Array.} Hint. + */ +ol.View.prototype.getHints = function() { + return goog.array.clone(this.hints_); +}; + + +/** + * @inheritDoc + */ +ol.View.prototype.getView2D = function() { + // FIXME for some reason, we can't use goog.abstractMethod here + goog.asserts.fail(); + return null; +}; + + +/** + * @inheritDoc + */ +ol.View.prototype.getView3D = function() { + // FIXME for some reason, we can't use goog.abstractMethod here + goog.asserts.fail(); + return null; +}; + + +/** + * @inheritDoc + */ +ol.View.prototype.isDef = function() { + // FIXME for some reason, we can't use goog.abstractMethod here + goog.asserts.fail(); + return false; +}; + + +/** + * @param {ol.ViewHint} hint Hint. + * @param {number} delta Delta. + * @return {number} New value. + */ +ol.View.prototype.setHint = function(hint, delta) { + goog.asserts.assert(0 <= hint && hint < this.hints_.length); + this.hints_[hint] += delta; + goog.asserts.assert(this.hints_[hint] >= 0); + return this.hints_[hint]; +}; diff --git a/float-no-zero/ol/ol/view2d.exports b/float-no-zero/ol/ol/view2d.exports new file mode 100644 index 0000000000..85318dd373 --- /dev/null +++ b/float-no-zero/ol/ol/view2d.exports @@ -0,0 +1,8 @@ +@exportSymbol ol.View2D +@exportProperty ol.View2D.prototype.calculateExtent +@exportProperty ol.View2D.prototype.constrainResolution +@exportProperty ol.View2D.prototype.constrainRotation +@exportProperty ol.View2D.prototype.fitExtent +@exportProperty ol.View2D.prototype.getView2D +@exportProperty ol.View2D.prototype.getZoom +@exportProperty ol.View2D.prototype.setZoom diff --git a/float-no-zero/ol/ol/view2d.js b/float-no-zero/ol/ol/view2d.js new file mode 100644 index 0000000000..c11764adaa --- /dev/null +++ b/float-no-zero/ol/ol/view2d.js @@ -0,0 +1,594 @@ +// FIXME getView3D has not return type + +goog.provide('ol.View2D'); +goog.provide('ol.View2DProperty'); + +goog.require('goog.asserts'); +goog.require('ol.CenterConstraint'); +goog.require('ol.Constraints'); +goog.require('ol.IView2D'); +goog.require('ol.IView3D'); +goog.require('ol.ResolutionConstraint'); +goog.require('ol.RotationConstraint'); +goog.require('ol.RotationConstraintType'); +goog.require('ol.Size'); +goog.require('ol.View'); +goog.require('ol.coordinate'); +goog.require('ol.extent'); +goog.require('ol.proj'); +goog.require('ol.proj.METERS_PER_UNIT'); +goog.require('ol.proj.Projection'); +goog.require('ol.proj.Units'); + + +/** + * @enum {string} + * @todo stability experimental + */ +ol.View2DProperty = { + CENTER: 'center', + PROJECTION: 'projection', + RESOLUTION: 'resolution', + ROTATION: 'rotation' +}; + + + +/** + * @class + * An ol.View2D object represents a simple 2D view of the map. + * + * This is the object to act upon to change the center, resolution, + * and rotation of the map. + * + * ### The view states + * + * An `ol.View2D` is determined by three states: `center`, `resolution`, + * and `rotation`. To each state corresponds a getter and a setter. E.g. + * `getCenter` and `setCenter` for the `center` state. + * + * An `ol.View2D` has a `projection`. The projection determines the + * coordinate system of the center, and its units determine the units of the + * resolution (projection units per pixel). The default projection is + * Spherical Mercator (EPSG:3857). + * + * ### The constraints + * + * `setCenter`, `setResolution` and `setRotation` can be used to change the + * states of the view. Any value can be passed to the setters. And the value + * that is passed to a setter will effectively be the value set in the view, + * and returned by the corresponding getter. + * + * But an `ol.View2D` object also has a *resolution constraint* and a + * *rotation constraint*. There's currently no *center constraint*, but + * this may change in the future. + * + * As said above no constraints are applied when the setters are used to set + * new states for the view. Applying constraints is done explicitly through + * the use of the `constrain*` functions (`constrainResolution` and + * `constrainRotation`). + * + * The main users of the constraints are the interactions and the + * controls. For example, double-clicking on the map changes the view to + * the "next" resolution. And releasing the fingers after pinch-zooming + * snaps to the closest resolution (with an animation). + * + * So the *resolution constraint* snaps to specific resolutions. It is + * determined by the following options: `resolutions`, `maxResolution`, + * `maxZoom`, and `zoomFactor`. If `resolutions` is set, the other three + * options are ignored. See {@link ol.View2DOptions} for more information. + * + * The *rotation constaint* is currently not configurable. It snaps the + * rotation value to zero when approaching the horizontal. + * + * @constructor + * @implements {ol.IView2D} + * @implements {ol.IView3D} + * @extends {ol.View} + * @param {olx.View2DOptions=} opt_options View2D options. + * @todo stability experimental + * @todo observable center {ol.Coordinate} the center of the view + * @todo observable projection {ol.proj.Projection} the projection of the view + * @todo observable resolution {number} the resolution of the view + * @todo observable rotation {number} the rotation of the view + */ +ol.View2D = function(opt_options) { + goog.base(this); + var options = opt_options || {}; + + /** + * @type {Object.} + */ + var values = {}; + values[ol.View2DProperty.CENTER] = goog.isDef(options.center) ? + options.center : null; + values[ol.View2DProperty.PROJECTION] = ol.proj.createProjection( + options.projection, 'EPSG:3857'); + + var resolutionConstraintInfo = ol.View2D.createResolutionConstraint_( + options); + + /** + * @private + * @type {number} + */ + this.maxResolution_ = resolutionConstraintInfo.maxResolution; + + /** + * @private + * @type {number} + */ + this.minResolution_ = resolutionConstraintInfo.minResolution; + + var centerConstraint = ol.View2D.createCenterConstraint_(options); + var resolutionConstraint = resolutionConstraintInfo.constraint; + var rotationConstraint = ol.View2D.createRotationConstraint_(options); + + /** + * @private + * @type {ol.Constraints} + */ + this.constraints_ = new ol.Constraints( + centerConstraint, resolutionConstraint, rotationConstraint); + + if (goog.isDef(options.resolution)) { + values[ol.View2DProperty.RESOLUTION] = options.resolution; + } else if (goog.isDef(options.zoom)) { + values[ol.View2DProperty.RESOLUTION] = this.constrainResolution( + this.maxResolution_, options.zoom); + } + values[ol.View2DProperty.ROTATION] = + goog.isDef(options.rotation) ? options.rotation : 0; + this.setValues(values); +}; +goog.inherits(ol.View2D, ol.View); + + +/** + * @param {number} rotation Target rotation. + * @param {ol.Coordinate} anchor Rotation anchor. + * @return {ol.Coordinate|undefined} Center for rotation and anchor. + */ +ol.View2D.prototype.calculateCenterRotate = function(rotation, anchor) { + var center; + var currentCenter = this.getCenter(); + if (goog.isDef(currentCenter)) { + center = [currentCenter[0] - anchor[0], currentCenter[1] - anchor[1]]; + ol.coordinate.rotate(center, rotation - this.getRotation()); + ol.coordinate.add(center, anchor); + } + return center; +}; + + +/** + * @param {number} resolution Target resolution. + * @param {ol.Coordinate} anchor Zoom anchor. + * @return {ol.Coordinate|undefined} Center for resolution and anchor. + */ +ol.View2D.prototype.calculateCenterZoom = function(resolution, anchor) { + var center; + var currentCenter = this.getCenter(); + var currentResolution = this.getResolution(); + if (goog.isDef(currentCenter) && goog.isDef(currentResolution)) { + var x = anchor[0] - + resolution * (anchor[0] - currentCenter[0]) / currentResolution; + var y = anchor[1] - + resolution * (anchor[1] - currentCenter[1]) / currentResolution; + center = [x, y]; + } + return center; +}; + + +/** + * @param {ol.Coordinate|undefined} center Center. + * @return {ol.Coordinate|undefined} Constrained center. + */ +ol.View2D.prototype.constrainCenter = function(center) { + return this.constraints_.center(center); +}; + + +/** + * Get the constrained the resolution of this view. + * @param {number|undefined} resolution Resolution. + * @param {number=} opt_delta Delta. Default is `0`. + * @param {number=} opt_direction Direction. Default is `0`. + * @return {number|undefined} Constrained resolution. + * @todo stability experimental + */ +ol.View2D.prototype.constrainResolution = function( + resolution, opt_delta, opt_direction) { + var delta = opt_delta || 0; + var direction = opt_direction || 0; + return this.constraints_.resolution(resolution, delta, direction); +}; + + +/** + * Get the constrained rotation of this view. + * @param {number|undefined} rotation Rotation. + * @param {number=} opt_delta Delta. Default is `0`. + * @return {number|undefined} Constrained rotation. + * @todo stability experimental + */ +ol.View2D.prototype.constrainRotation = function(rotation, opt_delta) { + var delta = opt_delta || 0; + return this.constraints_.rotation(rotation, delta); +}; + + +/** + * @inheritDoc + */ +ol.View2D.prototype.getCenter = function() { + return /** @type {ol.Coordinate|undefined} */ ( + this.get(ol.View2DProperty.CENTER)); +}; +goog.exportProperty( + ol.View2D.prototype, + 'getCenter', + ol.View2D.prototype.getCenter); + + +/** + * Calculate the extent for the given size in pixels, based on the current + * resolution and the current center. + * @param {ol.Size} size Box pixel size. + * @return {ol.Extent} Extent. + * @todo stability experimental + */ +ol.View2D.prototype.calculateExtent = function(size) { + goog.asserts.assert(this.isDef()); + var center = this.getCenter(); + var resolution = this.getResolution(); + var minX = center[0] - resolution * size[0] / 2; + var maxX = center[0] + resolution * size[0] / 2; + var minY = center[1] - resolution * size[1] / 2; + var maxY = center[1] + resolution * size[1] / 2; + return [minX, minY, maxX, maxY]; +}; + + +/** + * @inheritDoc + */ +ol.View2D.prototype.getProjection = function() { + return /** @type {ol.proj.Projection|undefined} */ ( + this.get(ol.View2DProperty.PROJECTION)); +}; +goog.exportProperty( + ol.View2D.prototype, + 'getProjection', + ol.View2D.prototype.getProjection); + + +/** + * @inheritDoc + */ +ol.View2D.prototype.getResolution = function() { + return /** @type {number|undefined} */ ( + this.get(ol.View2DProperty.RESOLUTION)); +}; +goog.exportProperty( + ol.View2D.prototype, + 'getResolution', + ol.View2D.prototype.getResolution); + + +/** + * @param {ol.Extent} extent Extent. + * @param {ol.Size} size Box pixel size. + * @return {number} Resolution. + */ +ol.View2D.prototype.getResolutionForExtent = function(extent, size) { + var xResolution = (extent[2] - extent[0]) / size[0]; + var yResolution = (extent[3] - extent[1]) / size[1]; + return Math.max(xResolution, yResolution); +}; + + +/** + * Return a function that returns a value between 0 and 1 for a + * resolution. Exponential scaling is assumed. + * @param {number=} opt_power Power. + * @return {function(number): number} Resolution for value function. + */ +ol.View2D.prototype.getResolutionForValueFunction = function(opt_power) { + var power = opt_power || 2; + var maxResolution = this.maxResolution_; + var minResolution = this.minResolution_; + var max = Math.log(maxResolution / minResolution) / Math.log(power); + return ( + /** + * @param {number} value Value. + * @return {number} Resolution. + */ + function(value) { + var resolution = maxResolution / Math.pow(power, value * max); + goog.asserts.assert(resolution >= minResolution && + resolution <= maxResolution); + return resolution; + }); +}; + + +/** + * @inheritDoc + */ +ol.View2D.prototype.getRotation = function() { + return /** @type {number|undefined} */ (this.get(ol.View2DProperty.ROTATION)); +}; +goog.exportProperty( + ol.View2D.prototype, + 'getRotation', + ol.View2D.prototype.getRotation); + + +/** + * Return a function that returns a resolution for a value between + * 0 and 1. Exponential scaling is assumed. + * @param {number=} opt_power Power. + * @return {function(number): number} Value for resolution function. + */ +ol.View2D.prototype.getValueForResolutionFunction = function(opt_power) { + var power = opt_power || 2; + var maxResolution = this.maxResolution_; + var minResolution = this.minResolution_; + var max = Math.log(maxResolution / minResolution) / Math.log(power); + return ( + /** + * @param {number} resolution Resolution. + * @return {number} Value. + */ + function(resolution) { + var value = + (Math.log(maxResolution / resolution) / Math.log(power)) / max; + goog.asserts.assert(value >= 0 && value <= 1); + return value; + }); +}; + + +/** + * @inheritDoc + */ +ol.View2D.prototype.getView2D = function() { + return this; +}; + + +/** + * @inheritDoc + */ +ol.View2D.prototype.getView2DState = function() { + goog.asserts.assert(this.isDef()); + var center = /** @type {ol.Coordinate} */ (this.getCenter()); + var projection = this.getProjection(); + var resolution = /** @type {number} */ (this.getResolution()); + var rotation = this.getRotation(); + return { + center: center.slice(), + projection: goog.isDef(projection) ? projection : null, + resolution: resolution, + rotation: goog.isDef(rotation) ? rotation : 0 + }; +}; + + +/** + * FIXME return type + */ +ol.View2D.prototype.getView3D = function() { +}; + + +/** + * Get the current zoom level. Return undefined if the current + * resolution is undefined or not a "constrained resolution". + * @return {number|undefined} Zoom. + * @todo stability experimental + */ +ol.View2D.prototype.getZoom = function() { + var zoom; + var resolution = this.getResolution(); + + if (goog.isDef(resolution)) { + var res, z = 0; + do { + res = this.constrainResolution(this.maxResolution_, z); + if (res == resolution) { + zoom = z; + break; + } + ++z; + } while (res > this.minResolution_); + } + + return zoom; +}; + + +/** + * Fit the given extent based on the given map size. + * @param {ol.Extent} extent Extent. + * @param {ol.Size} size Box pixel size. + * @todo stability experimental + */ +ol.View2D.prototype.fitExtent = function(extent, size) { + if (!ol.extent.isEmpty(extent)) { + this.setCenter(ol.extent.getCenter(extent)); + var resolution = this.getResolutionForExtent(extent, size); + var constrainedResolution = this.constrainResolution(resolution, 0, 0); + if (constrainedResolution < resolution) { + constrainedResolution = + this.constrainResolution(constrainedResolution, -1, 0); + } + this.setResolution(constrainedResolution); + } +}; + + +/** + * @return {boolean} Is defined. + */ +ol.View2D.prototype.isDef = function() { + return goog.isDefAndNotNull(this.getCenter()) && + goog.isDef(this.getResolution()); +}; + + +/** + * Set the center of the current view. + * @param {ol.Coordinate|undefined} center Center. + * @todo stability experimental + */ +ol.View2D.prototype.setCenter = function(center) { + this.set(ol.View2DProperty.CENTER, center); +}; +goog.exportProperty( + ol.View2D.prototype, + 'setCenter', + ol.View2D.prototype.setCenter); + + +/** + * Set the projection of this view. + * Warning! This code is not yet implemented. Function should not be used. + * @param {ol.proj.Projection|undefined} projection Projection. + * @todo stability experimental + */ +ol.View2D.prototype.setProjection = function(projection) { + this.set(ol.View2DProperty.PROJECTION, projection); +}; +goog.exportProperty( + ol.View2D.prototype, + 'setProjection', + ol.View2D.prototype.setProjection); + + +/** + * Set the resolution for this view. + * @param {number|undefined} resolution Resolution. + * @todo stability experimental + */ +ol.View2D.prototype.setResolution = function(resolution) { + this.set(ol.View2DProperty.RESOLUTION, resolution); +}; +goog.exportProperty( + ol.View2D.prototype, + 'setResolution', + ol.View2D.prototype.setResolution); + + +/** + * Set the rotation for this view. + * @param {number|undefined} rotation Rotation. + * @todo stability experimental + */ +ol.View2D.prototype.setRotation = function(rotation) { + this.set(ol.View2DProperty.ROTATION, rotation); +}; +goog.exportProperty( + ol.View2D.prototype, + 'setRotation', + ol.View2D.prototype.setRotation); + + +/** + * Zoom to a specific zoom level. + * @param {number} zoom Zoom level. + * @todo stability experimental + */ +ol.View2D.prototype.setZoom = function(zoom) { + var resolution = this.constrainResolution(this.maxResolution_, zoom, 0); + this.setResolution(resolution); +}; + + +/** + * @param {olx.View2DOptions} options View2D options. + * @private + * @return {ol.CenterConstraintType} + */ +ol.View2D.createCenterConstraint_ = function(options) { + if (goog.isDef(options.extent)) { + return ol.CenterConstraint.createExtent(options.extent); + } else { + return ol.CenterConstraint.none; + } +}; + + +/** + * @private + * @param {olx.View2DOptions} options View2D options. + * @return {{constraint: ol.ResolutionConstraintType, maxResolution: number, + * minResolution: number}} + */ +ol.View2D.createResolutionConstraint_ = function(options) { + var resolutionConstraint; + var maxResolution; + var minResolution; + if (goog.isDef(options.resolutions)) { + var resolutions = options.resolutions; + maxResolution = resolutions[0]; + minResolution = resolutions[resolutions.length - 1]; + resolutionConstraint = ol.ResolutionConstraint.createSnapToResolutions( + resolutions); + } else { + maxResolution = options.maxResolution; + if (!goog.isDef(maxResolution)) { + var projection = options.projection; + var projectionExtent = ol.proj.createProjection(projection, 'EPSG:3857') + .getExtent(); + var size = goog.isNull(projectionExtent) ? + // use an extent that can fit the whole world if need be + 360 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] / + ol.proj.METERS_PER_UNIT[projection.getUnits()] : + Math.max(projectionExtent[2] - projectionExtent[0], + projectionExtent[3] - projectionExtent[1]); + maxResolution = size / ol.DEFAULT_TILE_SIZE; + } + var maxZoom = options.maxZoom; + if (!goog.isDef(maxZoom)) { + maxZoom = 28; + } + var zoomFactor = options.zoomFactor; + if (!goog.isDef(zoomFactor)) { + zoomFactor = 2; + } + minResolution = maxResolution / Math.pow(zoomFactor, maxZoom); + resolutionConstraint = ol.ResolutionConstraint.createSnapToPower( + zoomFactor, maxResolution, maxZoom); + } + return {constraint: resolutionConstraint, maxResolution: maxResolution, + minResolution: minResolution}; +}; + + +/** + * @private + * @param {olx.View2DOptions} options View2D options. + * @return {ol.RotationConstraintType} Rotation constraint. + */ +ol.View2D.createRotationConstraint_ = function(options) { + var enableRotation = goog.isDef(options.enableRotation) ? + options.enableRotation : true; + if (enableRotation) { + var constrainRotation = options.constrainRotation; + if (!goog.isDef(constrainRotation) || constrainRotation === true) { + return ol.RotationConstraint.createSnapToZero(); + } else if (constrainRotation === false) { + return ol.RotationConstraint.none; + } else if (goog.isNumber(constrainRotation)) { + return ol.RotationConstraint.createSnapToN(constrainRotation); + } else { + goog.asserts.fail(); + return ol.RotationConstraint.none; + } + } else { + return ol.RotationConstraint.disable; + } +}; diff --git a/float-no-zero/ol/ol/webgl/context.exports b/float-no-zero/ol/ol/webgl/context.exports new file mode 100644 index 0000000000..60a3eea651 --- /dev/null +++ b/float-no-zero/ol/ol/webgl/context.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.webgl.Context +@exportProperty ol.webgl.Context.prototype.getGL +@exportProperty ol.webgl.Context.prototype.useProgram diff --git a/float-no-zero/ol/ol/webgl/context.js b/float-no-zero/ol/ol/webgl/context.js new file mode 100644 index 0000000000..bca86a5dc2 --- /dev/null +++ b/float-no-zero/ol/ol/webgl/context.js @@ -0,0 +1,266 @@ +goog.provide('ol.webgl.Context'); + +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.log'); +goog.require('goog.object'); +goog.require('ol.structs.Buffer'); +goog.require('ol.structs.IntegerSet'); +goog.require('ol.webgl.WebGLContextEventType'); + + +/** + * @typedef {{buf: ol.structs.Buffer, + * buffer: WebGLBuffer, + * dirtySet: ol.structs.IntegerSet}} + */ +ol.webgl.BufferCacheEntry; + + + +/** + * @constructor + * @extends {goog.events.EventTarget} + * @param {HTMLCanvasElement} canvas Canvas. + * @param {WebGLRenderingContext} gl GL. + */ +ol.webgl.Context = function(canvas, gl) { + + /** + * @private + * @type {HTMLCanvasElement} + */ + this.canvas_ = canvas; + + /** + * @private + * @type {WebGLRenderingContext} + */ + this.gl_ = gl; + + /** + * @private + * @type {Object.} + */ + this.bufferCache_ = {}; + + /** + * @private + * @type {Object.} + */ + this.shaderCache_ = {}; + + /** + * @private + * @type {Object.} + */ + this.programCache_ = {}; + + /** + * @private + * @type {WebGLProgram} + */ + this.currentProgram_ = null; + + goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.LOST, + this.handleWebGLContextLost, false, this); + goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.RESTORED, + this.handleWebGLContextRestored, false, this); + +}; + + +/** + * @param {number} target Target. + * @param {ol.structs.Buffer} buf Buffer. + */ +ol.webgl.Context.prototype.bindBuffer = function(target, buf) { + var gl = this.getGL(); + var arr = buf.getArray(); + var bufferKey = goog.getUid(buf); + if (bufferKey in this.bufferCache_) { + var bufferCacheEntry = this.bufferCache_[bufferKey]; + gl.bindBuffer(target, bufferCacheEntry.buffer); + bufferCacheEntry.dirtySet.forEachRange(function(start, stop) { + // FIXME check if slice is really efficient here + var slice = arr.slice(start, stop); + gl.bufferSubData( + target, + start, + target == goog.webgl.ARRAY_BUFFER ? + new Float32Array(slice) : + new Uint16Array(slice)); + }); + bufferCacheEntry.dirtySet.clear(); + } else { + var buffer = gl.createBuffer(); + gl.bindBuffer(target, buffer); + gl.bufferData( + target, + target == goog.webgl.ARRAY_BUFFER ? + new Float32Array(arr) : new Uint16Array(arr), + buf.getUsage()); + var dirtySet = new ol.structs.IntegerSet(); + buf.addDirtySet(dirtySet); + this.bufferCache_[bufferKey] = { + buf: buf, + buffer: buffer, + dirtySet: dirtySet + }; + } +}; + + +/** + * @param {ol.structs.Buffer} buf Buffer. + */ +ol.webgl.Context.prototype.deleteBuffer = function(buf) { + var gl = this.getGL(); + var bufferKey = goog.getUid(buf); + goog.asserts.assert(bufferKey in this.bufferCache_); + var bufferCacheEntry = this.bufferCache_[bufferKey]; + bufferCacheEntry.buf.removeDirtySet(bufferCacheEntry.dirtySet); + if (!gl.isContextLost()) { + gl.deleteBuffer(bufferCacheEntry.buffer); + } + delete this.bufferCache_[bufferKey]; +}; + + +/** + * @inheritDoc + */ +ol.webgl.Context.prototype.disposeInternal = function() { + goog.object.forEach(this.bufferCache_, function(bufferCacheEntry) { + bufferCacheEntry.buf.removeDirtySet(bufferCacheEntry.dirtySet); + }); + var gl = this.getGL(); + if (!gl.isContextLost()) { + goog.object.forEach(this.bufferCache_, function(bufferCacheEntry) { + gl.deleteBuffer(bufferCacheEntry.buffer); + }); + goog.object.forEach(this.programCache_, function(program) { + gl.deleteProgram(program); + }); + goog.object.forEach(this.shaderCache_, function(shader) { + gl.deleteShader(shader); + }); + } +}; + + +/** + * @return {HTMLCanvasElement} Canvas. + */ +ol.webgl.Context.prototype.getCanvas = function() { + return this.canvas_; +}; + + +/** + * @return {WebGLRenderingContext} GL. + */ +ol.webgl.Context.prototype.getGL = function() { + return this.gl_; +}; + + +/** + * @param {ol.webgl.Shader} shaderObject Shader object. + * @return {WebGLShader} Shader. + */ +ol.webgl.Context.prototype.getShader = function(shaderObject) { + var shaderKey = goog.getUid(shaderObject); + if (shaderKey in this.shaderCache_) { + return this.shaderCache_[shaderKey]; + } else { + var gl = this.getGL(); + var shader = gl.createShader(shaderObject.getType()); + gl.shaderSource(shader, shaderObject.getSource()); + gl.compileShader(shader); + if (goog.DEBUG) { + if (!gl.getShaderParameter(shader, goog.webgl.COMPILE_STATUS) && + !gl.isContextLost()) { + goog.log.error(this.logger_, gl.getShaderInfoLog(shader)); + } + } + goog.asserts.assert( + gl.getShaderParameter(shader, goog.webgl.COMPILE_STATUS) || + gl.isContextLost()); + this.shaderCache_[shaderKey] = shader; + return shader; + } +}; + + +/** + * @param {ol.webgl.shader.Fragment} fragmentShaderObject Fragment shader. + * @param {ol.webgl.shader.Vertex} vertexShaderObject Vertex shader. + * @return {WebGLProgram} Program. + */ +ol.webgl.Context.prototype.getProgram = function( + fragmentShaderObject, vertexShaderObject) { + var programKey = + goog.getUid(fragmentShaderObject) + '/' + goog.getUid(vertexShaderObject); + if (programKey in this.programCache_) { + return this.programCache_[programKey]; + } else { + var gl = this.getGL(); + var program = gl.createProgram(); + gl.attachShader(program, this.getShader(fragmentShaderObject)); + gl.attachShader(program, this.getShader(vertexShaderObject)); + gl.linkProgram(program); + if (goog.DEBUG) { + if (!gl.getProgramParameter(program, goog.webgl.LINK_STATUS) && + !gl.isContextLost()) { + goog.log.error(this.logger_, gl.getProgramInfoLog(program)); + } + } + goog.asserts.assert( + gl.getProgramParameter(program, goog.webgl.LINK_STATUS) || + gl.isContextLost()); + this.programCache_[programKey] = program; + return program; + } +}; + + +/** + * FIXME empy description for jsdoc + */ +ol.webgl.Context.prototype.handleWebGLContextLost = function() { + goog.object.clear(this.bufferCache_); + goog.object.clear(this.shaderCache_); + goog.object.clear(this.programCache_); + this.currentProgram_ = null; +}; + + +/** + * FIXME empy description for jsdoc + */ +ol.webgl.Context.prototype.handleWebGLContextRestored = function() { +}; + + +/** + * @param {WebGLProgram} program Program. + * @return {boolean} Changed. + */ +ol.webgl.Context.prototype.useProgram = function(program) { + if (program == this.currentProgram_) { + return false; + } else { + var gl = this.getGL(); + gl.useProgram(program); + this.currentProgram_ = program; + return true; + } +}; + + +/** + * @private + * @type {goog.log.Logger} + */ +ol.webgl.Context.prototype.logger_ = goog.log.getLogger('ol.webgl.Context'); diff --git a/float-no-zero/ol/ol/webgl/shader.js b/float-no-zero/ol/ol/webgl/shader.js new file mode 100644 index 0000000000..f9a2271724 --- /dev/null +++ b/float-no-zero/ol/ol/webgl/shader.js @@ -0,0 +1,84 @@ +goog.provide('ol.webgl.shader'); + +goog.require('goog.functions'); +goog.require('goog.webgl'); +goog.require('ol.webgl'); + + + +/** + * @constructor + * @param {string} source Source. + * @struct + */ +ol.webgl.Shader = function(source) { + + /** + * @private + * @type {string} + */ + this.source_ = source; + +}; + + +/** + * @return {number} Type. + */ +ol.webgl.Shader.prototype.getType = goog.abstractMethod; + + +/** + * @return {string} Source. + */ +ol.webgl.Shader.prototype.getSource = function() { + return this.source_; +}; + + +/** + * @return {boolean} Is animated? + */ +ol.webgl.Shader.prototype.isAnimated = goog.functions.FALSE; + + + +/** + * @constructor + * @extends {ol.webgl.Shader} + * @param {string} source Source. + * @struct + */ +ol.webgl.shader.Fragment = function(source) { + goog.base(this, source); +}; +goog.inherits(ol.webgl.shader.Fragment, ol.webgl.Shader); + + +/** + * @inheritDoc + */ +ol.webgl.shader.Fragment.prototype.getType = function() { + return goog.webgl.FRAGMENT_SHADER; +}; + + + +/** + * @constructor + * @extends {ol.webgl.Shader} + * @param {string} source Source. + * @struct + */ +ol.webgl.shader.Vertex = function(source) { + goog.base(this, source); +}; +goog.inherits(ol.webgl.shader.Vertex, ol.webgl.Shader); + + +/** + * @inheritDoc + */ +ol.webgl.shader.Vertex.prototype.getType = function() { + return goog.webgl.VERTEX_SHADER; +}; diff --git a/float-no-zero/ol/ol/webgl/shader.mustache b/float-no-zero/ol/ol/webgl/shader.mustache new file mode 100644 index 0000000000..ed62dc9718 --- /dev/null +++ b/float-no-zero/ol/ol/webgl/shader.mustache @@ -0,0 +1,103 @@ +// This file is automatically generated, do not edit +goog.provide('{{namespace}}'); + +goog.require('ol.webgl.shader'); + + + +/** + * @constructor + * @extends {ol.webgl.shader.Fragment} + * @struct + */ +{{className}}Fragment = function() { + goog.base(this, {{className}}Fragment.SOURCE); +}; +goog.inherits({{className}}Fragment, ol.webgl.shader.Fragment); +goog.addSingletonGetter({{className}}Fragment); + + +/** + * @const + * @type {string} + */ +{{className}}Fragment.DEBUG_SOURCE = 'precision mediump float;\n{{{getOriginalFragmentSource}}}'; + + +/** + * @const + * @type {string} + */ +{{className}}Fragment.OPTIMIZED_SOURCE = 'precision mediump float;{{{getFragmentSource}}}'; + + +/** + * @const + * @type {string} + */ +{{className}}Fragment.SOURCE = goog.DEBUG ? + {{className}}Fragment.DEBUG_SOURCE : + {{className}}Fragment.OPTIMIZED_SOURCE; + + + +/** + * @constructor + * @extends {ol.webgl.shader.Vertex} + * @struct + */ +{{className}}Vertex = function() { + goog.base(this, {{className}}Vertex.SOURCE); +}; +goog.inherits({{className}}Vertex, ol.webgl.shader.Vertex); +goog.addSingletonGetter({{className}}Vertex); + + +/** + * @const + * @type {string} + */ +{{className}}Vertex.DEBUG_SOURCE = '{{{getOriginalVertexSource}}}'; + + +/** + * @const + * @type {string} + */ +{{className}}Vertex.OPTIMIZED_SOURCE = '{{{getVertexSource}}}'; + + +/** + * @const + * @type {string} + */ +{{className}}Vertex.SOURCE = goog.DEBUG ? + {{className}}Vertex.DEBUG_SOURCE : + {{className}}Vertex.OPTIMIZED_SOURCE; + + + +/** + * @constructor + * @param {WebGLRenderingContext} gl GL. + * @param {WebGLProgram} program Program. + * @struct + */ +{{namespace}}.Locations = function(gl, program) { +{{#getUniforms}} + + /** + * @type {WebGLUniformLocation} + */ + this.{{originalName}} = gl.getUniformLocation( + program, goog.DEBUG ? '{{originalName}}' : '{{shortName}}'); +{{/getUniforms}} +{{#getAttributes}} + + /** + * @type {number} + */ + this.{{originalName}} = gl.getAttribLocation( + program, goog.DEBUG ? '{{originalName}}' : '{{shortName}}'); +{{/getAttributes}} +}; diff --git a/float-no-zero/ol/ol/webgl/webgl.js b/float-no-zero/ol/ol/webgl/webgl.js new file mode 100644 index 0000000000..6b39a1edc7 --- /dev/null +++ b/float-no-zero/ol/ol/webgl/webgl.js @@ -0,0 +1,44 @@ +goog.provide('ol.webgl'); +goog.provide('ol.webgl.WebGLContextEventType'); + + +/** + * @const + * @private + * @type {Array.} + */ +ol.webgl.CONTEXT_IDS_ = [ + 'experimental-webgl', + 'webgl', + 'webkit-3d', + 'moz-webgl' +]; + + +/** + * @enum {string} + */ +ol.webgl.WebGLContextEventType = { + LOST: 'webglcontextlost', + RESTORED: 'webglcontextrestored' +}; + + +/** + * @param {HTMLCanvasElement} canvas Canvas. + * @param {Object=} opt_attributes Attributes. + * @return {WebGLRenderingContext} WebGL rendering context. + */ +ol.webgl.getContext = function(canvas, opt_attributes) { + var context, i, ii = ol.webgl.CONTEXT_IDS_.length; + for (i = 0; i < ii; ++i) { + try { + context = canvas.getContext(ol.webgl.CONTEXT_IDS_[i], opt_attributes); + if (!goog.isNull(context)) { + return /** @type {!WebGLRenderingContext} */ (context); + } + } catch (e) { + } + } + return null; +}; diff --git a/float-no-zero/ol/ol/xml.js b/float-no-zero/ol/ol/xml.js new file mode 100644 index 0000000000..89d0042ed3 --- /dev/null +++ b/float-no-zero/ol/ol/xml.js @@ -0,0 +1,710 @@ +// FIXME Remove ol.xml.makeParsersNS, and use ol.xml.makeStructureNS instead. + +goog.provide('ol.xml'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.xml'); +goog.require('goog.object'); +goog.require('goog.userAgent'); + + +/** + * When using {@link ol.xml.makeChildAppender} or + * {@link ol.xml.makeSimpleNodeFactory}, the top `objectStack` item needs to + * have this structure. + * @typedef {{node:Node}} + */ +ol.xml.NodeStackItem; + + +/** + * @typedef {function(Node, Array.<*>)} + */ +ol.xml.Parser; + + +/** + * @typedef {function(Node, *, Array.<*>)} + */ +ol.xml.Serializer; + + +/** + * This document should be used when creating nodes for XML serializations. This + * document is also used by {@link ol.xml.createElementNS} and + * {@link ol.xml.setAttributeNS} + * @const + * @type {Document} + */ +ol.xml.DOCUMENT = goog.dom.xml.createDocument(); + + +/** + * @param {string} namespaceURI Namespace URI. + * @param {string} qualifiedName Qualified name. + * @return {Node} Node. + * @private + */ +ol.xml.createElementNS_ = function(namespaceURI, qualifiedName) { + return ol.xml.DOCUMENT.createElementNS(namespaceURI, qualifiedName); +}; + + +/** + * @param {string} namespaceURI Namespace URI. + * @param {string} qualifiedName Qualified name. + * @return {Node} Node. + * @private + */ +ol.xml.createElementNSActiveX_ = function(namespaceURI, qualifiedName) { + if (goog.isNull(namespaceURI)) { + namespaceURI = ''; + } + return ol.xml.DOCUMENT.createNode(1, qualifiedName, namespaceURI); +}; + + +/** + * @param {string} namespaceURI Namespace URI. + * @param {string} qualifiedName Qualified name. + * @return {Node} Node. + */ +ol.xml.createElementNS = + (document.implementation && document.implementation.createDocument) ? + ol.xml.createElementNS_ : ol.xml.createElementNSActiveX_; + + +/** + * @param {Node} node Node. + * @param {boolean} normalizeWhitespace Normalize whitespace. + * @return {string} All text content. + */ +ol.xml.getAllTextContent = function(node, normalizeWhitespace) { + return ol.xml.getAllTextContent_(node, normalizeWhitespace, []).join(''); +}; + + +/** + * @param {Node} node Node. + * @param {boolean} normalizeWhitespace Normalize whitespace. + * @param {Array.} accumulator Accumulator. + * @private + * @return {Array.} Accumulator. + */ +ol.xml.getAllTextContent_ = function(node, normalizeWhitespace, accumulator) { + if (node.nodeType == goog.dom.NodeType.CDATA_SECTION || + node.nodeType == goog.dom.NodeType.TEXT) { + if (normalizeWhitespace) { + // FIXME understand why goog.dom.getTextContent_ uses String here + accumulator.push(String(node.nodeValue).replace(/(\r\n|\r|\n)/g, '')); + } else { + accumulator.push(node.nodeValue); + } + } else { + var n; + for (n = node.firstChild; !goog.isNull(n); n = n.nextSibling) { + ol.xml.getAllTextContent_(n, normalizeWhitespace, accumulator); + } + } + return accumulator; +}; + + +/** + * @param {Node} node Node. + * @private + * @return {string} Local name. + */ +ol.xml.getLocalName_ = function(node) { + return node.localName; +}; + + +/** + * @param {Node} node Node. + * @private + * @return {string} Local name. + */ +ol.xml.getLocalNameIE_ = function(node) { + var localName = node.localName; + if (goog.isDef(localName)) { + return localName; + } + var baseName = node.baseName; + goog.asserts.assert(goog.isDefAndNotNull(baseName)); + return baseName; +}; + + +/** + * @param {Node} node Node. + * @return {string} Local name. + */ +ol.xml.getLocalName = goog.userAgent.IE ? + ol.xml.getLocalNameIE_ : ol.xml.getLocalName_; + + +/** + * @param {?} value Value. + * @private + * @return {boolean} Is document. + */ +ol.xml.isDocument_ = function(value) { + return value instanceof Document; +}; + + +/** + * @param {?} value Value. + * @private + * @return {boolean} Is document. + */ +ol.xml.isDocumentIE_ = function(value) { + return goog.isObject(value) && value.nodeType == goog.dom.NodeType.DOCUMENT; +}; + + +/** + * @param {?} value Value. + * @return {boolean} Is document. + */ +ol.xml.isDocument = goog.userAgent.IE ? + ol.xml.isDocumentIE_ : ol.xml.isDocument_; + + +/** + * @param {?} value Value. + * @private + * @return {boolean} Is node. + */ +ol.xml.isNode_ = function(value) { + return value instanceof Node; +}; + + +/** + * @param {?} value Value. + * @private + * @return {boolean} Is node. + */ +ol.xml.isNodeIE_ = function(value) { + return goog.isObject(value) && goog.isDef(value.nodeType); +}; + + +/** + * @param {?} value Value. + * @return {boolean} Is node. + */ +ol.xml.isNode = goog.userAgent.IE ? ol.xml.isNodeIE_ : ol.xml.isNode_; + + +/** + * @param {Node} node Node. + * @param {?string} namespaceURI Namespace URI. + * @param {string} name Attribute name. + * @return {string} Value + * @private + */ +ol.xml.getAttributeNS_ = function(node, namespaceURI, name) { + return node.getAttributeNS(namespaceURI, name) || ''; +}; + + +/** + * @param {Node} node Node. + * @param {?string} namespaceURI Namespace URI. + * @param {string} name Attribute name. + * @return {string} Value + * @private + */ +ol.xml.getAttributeNSActiveX_ = function(node, namespaceURI, name) { + var attributeValue = ''; + var attributeNode = ol.xml.getAttributeNodeNS(node, namespaceURI, name); + if (goog.isDef(attributeNode)) { + attributeValue = attributeNode.nodeValue; + } + return attributeValue; +}; + + +/** + * @param {Node} node Node. + * @param {?string} namespaceURI Namespace URI. + * @param {string} name Attribute name. + * @return {string} Value + */ +ol.xml.getAttributeNS = + (document.implementation && document.implementation.createDocument) ? + ol.xml.getAttributeNS_ : ol.xml.getAttributeNSActiveX_; + + +/** + * @param {Node} node Node. + * @param {?string} namespaceURI Namespace URI. + * @param {string} name Attribute name. + * @return {?Node} Attribute node or null if none found. + * @private + */ +ol.xml.getAttributeNodeNS_ = function(node, namespaceURI, name) { + return node.getAttributeNodeNS(namespaceURI, name); +}; + + +/** + * @param {Node} node Node. + * @param {?string} namespaceURI Namespace URI. + * @param {string} name Attribute name. + * @return {?Node} Attribute node or null if none found. + * @private + */ +ol.xml.getAttributeNodeNSActiveX_ = function(node, namespaceURI, name) { + var attributeNode = null; + var attributes = node.attributes; + var potentialNode, fullName; + for (var i = 0, len = attributes.length; i < len; ++i) { + potentialNode = attributes[i]; + if (potentialNode.namespaceURI == namespaceURI) { + fullName = (potentialNode.prefix) ? + (potentialNode.prefix + ':' + name) : name; + if (fullName == potentialNode.nodeName) { + attributeNode = potentialNode; + break; + } + } + } + return attributeNode; +}; + + +/** + * @param {Node} node Node. + * @param {?string} namespaceURI Namespace URI. + * @param {string} name Attribute name. + * @return {?Node} Attribute node or null if none found. + */ +ol.xml.getAttributeNodeNS = + (document.implementation && document.implementation.createDocument) ? + ol.xml.getAttributeNodeNS_ : ol.xml.getAttributeNodeNSActiveX_; + + +/** + * @param {Node} node Node. + * @param {?string} namespaceURI Namespace URI. + * @param {string} name Attribute name. + * @param {string|number} value Value. + * @private + */ +ol.xml.setAttributeNS_ = function(node, namespaceURI, name, value) { + node.setAttributeNS(namespaceURI, name, value); +}; + + +/** + * @param {Node} node Node. + * @param {?string} namespaceURI Namespace URI. + * @param {string} name Attribute name. + * @param {string|number} value Value. + * @private + */ +ol.xml.setAttributeNSActiveX_ = function(node, namespaceURI, name, value) { + if (!goog.isNull(namespaceURI)) { + var attribute = node.ownerDocument.createNode(2, name, namespaceURI); + attribute.nodeValue = value; + node.setAttributeNode(attribute); + } else { + node.setAttribute(name, value); + } +}; + + +/** + * @param {Node} node Node. + * @param {?string} namespaceURI Namespace URI. + * @param {string} name Attribute name. + * @param {string|number} value Value. + */ +ol.xml.setAttributeNS = + (document.implementation && document.implementation.createDocument) ? + ol.xml.setAttributeNS_ : ol.xml.setAttributeNSActiveX_; + + +/** + * @param {string} xml XML. + * @return {Document} Document. + */ +ol.xml.load = function(xml) { + return new DOMParser().parseFromString(xml, 'application/xml'); +}; + + +/** + * @param {function(this: T, Node, Array.<*>): (Array.<*>|undefined)} + * valueReader Value reader. + * @param {T=} opt_this The object to use as `this` in `valueReader`. + * @return {ol.xml.Parser} Parser. + * @template T + */ +ol.xml.makeArrayExtender = function(valueReader, opt_this) { + return ( + /** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + */ + function(node, objectStack) { + var value = valueReader.call(opt_this, node, objectStack); + if (goog.isDef(value)) { + goog.asserts.assert(goog.isArray(value)); + var array = /** @type {Array.<*>} */ + (objectStack[objectStack.length - 1]); + goog.asserts.assert(goog.isArray(array)); + goog.array.extend(array, value); + } + }); +}; + + +/** + * @param {function(this: T, Node, Array.<*>): *} valueReader Value reader. + * @param {T=} opt_this The object to use as `this` in `valueReader`. + * @return {ol.xml.Parser} Parser. + * @template T + */ +ol.xml.makeArrayPusher = function(valueReader, opt_this) { + return ( + /** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + */ + function(node, objectStack) { + var value = valueReader.call(opt_this, node, objectStack); + if (goog.isDef(value)) { + var array = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isArray(array)); + array.push(value); + } + }); +}; + + +/** + * @param {function(this: T, Node, Array.<*>): *} valueReader Value reader. + * @param {T=} opt_this The object to use as `this` in `valueReader`. + * @return {ol.xml.Parser} Parser. + * @template T + */ +ol.xml.makeReplacer = function(valueReader, opt_this) { + return ( + /** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + */ + function(node, objectStack) { + var value = valueReader.call(opt_this, node, objectStack); + if (goog.isDef(value)) { + objectStack[objectStack.length - 1] = value; + } + }); +}; + + +/** + * @param {function(this: T, Node, Array.<*>): *} valueReader Value reader. + * @param {string=} opt_property Property. + * @param {T=} opt_this The object to use as `this` in `valueReader`. + * @return {ol.xml.Parser} Parser. + * @template T + */ +ol.xml.makeObjectPropertySetter = + function(valueReader, opt_property, opt_this) { + goog.asserts.assert(goog.isDef(valueReader)); + return ( + /** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + */ + function(node, objectStack) { + var value = valueReader.call(opt_this, node, objectStack); + if (goog.isDef(value)) { + var object = /** @type {Object} */ + (objectStack[objectStack.length - 1]); + var property = goog.isDef(opt_property) ? + opt_property : node.localName; + goog.asserts.assert(goog.isObject(object)); + goog.object.set(object, property, value); + } + }); +}; + + +/** + * @param {Array.} namespaceURIs Namespace URIs. + * @param {Object.} parsers Parsers. + * @param {Object.>=} opt_parsersNS + * ParsersNS. + * @return {Object.>} Parsers NS. + */ +ol.xml.makeParsersNS = function(namespaceURIs, parsers, opt_parsersNS) { + return /** @type {Object.>} */ ( + ol.xml.makeStructureNS(namespaceURIs, parsers, opt_parsersNS)); +}; + + +/** + * Creates a serializer that appends nodes written by its `nodeWriter` to its + * designated parent. The parent is the `node` of the + * {@link ol.xml.NodeStackItem} at the top of the `objectStack`. + * @param {function(this: T, Node, V, Array.<*>)} + * nodeWriter Node writer. + * @param {T=} opt_this The object to use as `this` in `nodeWriter`. + * @return {ol.xml.Serializer} Serializer. + * @template T, V + */ +ol.xml.makeChildAppender = function(nodeWriter, opt_this) { + return function(node, value, objectStack) { + nodeWriter.call(opt_this, node, value, objectStack); + var parent = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(parent)); + var parentNode = parent.node; + goog.asserts.assert(ol.xml.isNode(parentNode) || + ol.xml.isDocument(parentNode)); + parentNode.appendChild(node); + }; +}; + + +/** + * Creates a serializer that calls the provided `nodeWriter` from + * {@link ol.xml.serialize}. This can be used by the parent writer to have the + * 'nodeWriter' called with an array of values when the `nodeWriter` was + * designed to serialize a single item. An example would be a LineString + * geometry writer, which could be reused for writing MultiLineString + * geometries. + * @param {function(this: T, Node, V, Array.<*>)} + * nodeWriter Node writer. + * @param {T=} opt_this The object to use as `this` in `nodeWriter`. + * @return {ol.xml.Serializer} Serializer. + * @template T, V + */ +ol.xml.makeArraySerializer = function(nodeWriter, opt_this) { + var serializersNS, nodeFactory; + return function(node, value, objectStack) { + if (!goog.isDef(serializersNS)) { + serializersNS = {}; + var serializers = {}; + goog.object.set(serializers, node.localName, nodeWriter); + goog.object.set(serializersNS, node.namespaceURI, serializers); + nodeFactory = ol.xml.makeSimpleNodeFactory(node.localName); + } + ol.xml.serialize(serializersNS, nodeFactory, value, objectStack); + }; +}; + + +/** + * Creates a node factory which can use the `opt_keys` passed to + * {@link ol.xml.serialize} or {@link ol.xml.pushSerializeAndPop} as node names, + * or a fixed node name. The namespace of the created nodes can either be fixed, + * or the parent namespace will be used. + * @param {string=} opt_nodeName Fixed node name which will be used for all + * created nodes. If not provided, the 3rd argument to the resulting node + * factory needs to be provided and will be the nodeName. + * @param {string=} opt_namespaceURI Fixed namespace URI which will be used for + * all created nodes. If not provided, the namespace of the parent node will + * be used. + * @return {function(*, Array.<*>, string=): (Node|undefined)} Node factory. + */ +ol.xml.makeSimpleNodeFactory = function(opt_nodeName, opt_namespaceURI) { + var fixedNodeName = opt_nodeName; + return ( + /** + * @param {*} value Value. + * @param {Array.<*>} objectStack Object stack. + * @param {string=} opt_nodeName Node name. + * @return {Node} Node. + */ + function(value, objectStack, opt_nodeName) { + var context = objectStack[objectStack.length - 1]; + var node = context.node; + goog.asserts.assert(ol.xml.isNode(node) || ol.xml.isDocument(node)); + var nodeName = fixedNodeName; + if (!goog.isDef(nodeName)) { + nodeName = opt_nodeName; + } + var namespaceURI = opt_namespaceURI; + if (!goog.isDef(opt_namespaceURI)) { + namespaceURI = node.namespaceURI; + } + goog.asserts.assert(goog.isDef(nodeName)); + return ol.xml.createElementNS(namespaceURI, nodeName); + } + ); +}; + + +/** + * A node factory that creates a node using the parent's `namespaceURI` and the + * `nodeName` passed by {@link ol.xml.serialize} or + * {@link ol.xml.pushSerializeAndPop} to the node factory. + * @const + * @type {function(*, Array.<*>, string=): (Node|undefined)} + */ +ol.xml.OBJECT_PROPERTY_NODE_FACTORY = ol.xml.makeSimpleNodeFactory(); + + +/** + * Creates an array of `values` to be used with {@link ol.xml.serialize} or + * {@link ol.xml.pushSerializeAndPop}, where `orderedKeys` has to be provided as + * `opt_key` argument. + * @param {Object.} object Key-value pairs for the sequence. Keys can + * be a subset of the `orderedKeys`. + * @param {Array.} orderedKeys Keys in the order of the sequence. + * @return {Array.} Values in the order of the sequence. The resulting array + * has the same length as the `orderedKeys` array. Values that are not + * present in `object` will be `undefined` in the resulting array. + * @template V + */ +ol.xml.makeSequence = function(object, orderedKeys) { + var length = orderedKeys.length; + var sequence = new Array(length); + for (var i = 0; i < length; ++i) { + sequence[i] = object[orderedKeys[i]]; + } + return sequence; +}; + + +/** + * Creates a namespaced structure, using the same values for each namespace. + * This can be used as a starting point for versioned parsers, when only a few + * values are version specific. + * @param {Array.} namespaceURIs Namespace URIs. + * @param {T} structure Structure. + * @param {Object.=} opt_structureNS Namespaced structure to add to. + * @return {Object.} Namespaced structure. + * @template T + */ +ol.xml.makeStructureNS = function(namespaceURIs, structure, opt_structureNS) { + /** + * @type {Object.} + */ + var structureNS = goog.isDef(opt_structureNS) ? opt_structureNS : {}; + var i, ii; + for (i = 0, ii = namespaceURIs.length; i < ii; ++i) { + structureNS[namespaceURIs[i]] = structure; + } + return structureNS; +}; + + +/** + * @param {Object.>} parsersNS + * Parsers by namespace. + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @param {*=} opt_this The object to use as `this`. + */ +ol.xml.parse = function(parsersNS, node, objectStack, opt_this) { + var n; + for (n = node.firstElementChild; !goog.isNull(n); n = n.nextElementSibling) { + var parsers = parsersNS[n.namespaceURI]; + if (goog.isDef(parsers)) { + var parser = parsers[n.localName]; + if (goog.isDef(parser)) { + parser.call(opt_this, n, objectStack); + } + } + } +}; + + +/** + * @param {T} object Object. + * @param {Object.>} parsersNS + * Parsers by namespace. + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @param {*=} opt_this The object to use as `this`. + * @return {T|undefined} Object. + * @template T + */ +ol.xml.pushParseAndPop = function( + object, parsersNS, node, objectStack, opt_this) { + objectStack.push(object); + ol.xml.parse(parsersNS, node, objectStack, opt_this); + return objectStack.pop(); +}; + + +/** + * Walks through an array of `values` and calls a serializer for each value. + * @param {Object.>} serializersNS + * Namespaced serializers. + * @param {function(this: T, *, Array.<*>, (string|undefined)): (Node|undefined)} nodeFactory + * Node factory. The `nodeFactory` creates the node whose namespace and name + * will be used to choose a node writer from `serializersNS`. This + * separation allows us to decide what kind of node to create, depending on + * the value we want to serialize. An example for this would be different + * geometry writers based on the geometry type. + * @param {Array.<*>} values Values to serialize. An example would be an array + * of {@link ol.Feature} instances. + * @param {Array.<*>} objectStack Node stack. + * @param {Array.=} opt_keys Keys of the `values`. Will be passed to the + * `nodeFactory`. This is used for serializing object literals where the + * node name relates to the property key. The array length of `opt_keys` has + * to match the length of `values`. For serializing a sequence, `opt_keys` + * determines the order of the sequence. + * @param {T=} opt_this The object to use as `this` for the node factory and + * serializers. + * @template T + */ +ol.xml.serialize = function( + serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this) { + var length = (goog.isDef(opt_keys) ? opt_keys : values).length; + var value, node; + for (var i = 0; i < length; ++i) { + value = values[i]; + if (goog.isDef(value)) { + node = nodeFactory.call(opt_this, value, objectStack, + goog.isDef(opt_keys) ? opt_keys[i] : undefined); + if (goog.isDef(node)) { + serializersNS[node.namespaceURI][node.localName] + .call(opt_this, node, value, objectStack); + } + } + } +}; + + +/** + * @param {O} object Object. + * @param {Object.>} serializersNS + * Namespaced serializers. + * @param {function(this: T, *, Array.<*>, (string|undefined)): (Node|undefined)} nodeFactory + * Node factory. The `nodeFactory` creates the node whose namespace and name + * will be used to choose a node writer from `serializersNS`. This + * separation allows us to decide what kind of node to create, depending on + * the value we want to serialize. An example for this would be different + * geometry writers based on the geometry type. + * @param {Array.<*>} values Values to serialize. An example would be an array + * of {@link ol.Feature} instances. + * @param {Array.<*>} objectStack Node stack. + * @param {Array.=} opt_keys Keys of the `values`. Will be passed to the + * `nodeFactory`. This is used for serializing object literals where the + * node name relates to the property key. The array length of `opt_keys` has + * to match the length of `values`. For serializing a sequence, `opt_keys` + * determines the order of the sequence. + * @param {T=} opt_this The object to use as `this` for the node factory and + * serializers. + * @return {O|undefined} Object. + * @template O, T + */ +ol.xml.pushSerializeAndPop = function(object, + serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this) { + objectStack.push(object); + ol.xml.serialize( + serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this); + return objectStack.pop(); +}; diff --git a/float-no-zero/resources/bootstrap/css/bootstrap-responsive.css b/float-no-zero/resources/bootstrap/css/bootstrap-responsive.css new file mode 100644 index 0000000000..fcd72f7a77 --- /dev/null +++ b/float-no-zero/resources/bootstrap/css/bootstrap-responsive.css @@ -0,0 +1,1109 @@ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/float-no-zero/resources/bootstrap/css/bootstrap-responsive.min.css b/float-no-zero/resources/bootstrap/css/bootstrap-responsive.min.css new file mode 100644 index 0000000000..d1b7f4b0b8 --- /dev/null +++ b/float-no-zero/resources/bootstrap/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/float-no-zero/resources/bootstrap/css/bootstrap.css b/float-no-zero/resources/bootstrap/css/bootstrap.css new file mode 100644 index 0000000000..2f56af33f3 --- /dev/null +++ b/float-no-zero/resources/bootstrap/css/bootstrap.css @@ -0,0 +1,6158 @@ +/*! + * Bootstrap v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover, +a.text-success:focus { + color: #356635; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #dff0d8; +} + +.table tbody tr.error > td { + background-color: #f2dede; +} + +.table tbody tr.warning > td { + background-color: #fcf8e3; +} + +.table tbody tr.info > td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/float-no-zero/resources/bootstrap/css/bootstrap.min.css b/float-no-zero/resources/bootstrap/css/bootstrap.min.css new file mode 100644 index 0000000000..c10c7f417f --- /dev/null +++ b/float-no-zero/resources/bootstrap/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/float-no-zero/resources/bootstrap/img/glyphicons-halflings-white.png b/float-no-zero/resources/bootstrap/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 zcmZvC1yGz#v+m*$LXcp=A$ZWB0fL7wNbp_U*$~{_gL`my3oP#L!5tQYy99Ta`+g_q zKlj|KJ2f@c)ARJx{q*bbkhN_!|Wn*Vos8{TEhUT@5e;_WJsIMMcG5%>DiS&dv_N`4@J0cnAQ-#>RjZ z00W5t&tJ^l-QC*ST1-p~00u^9XJ=AUl7oW-;2a+x2k__T=grN{+1c4XK0ZL~^z^i$ zp&>vEhr@4fZWb380S18T&!0cQ3IKpHF)?v=b_NIm0Q>vwY7D0baZ)n z31Fa5sELUQARIVaU0nqf0XzT+fB_63aA;@<$l~wse|mcA;^G1TmX?-)e)jkGPfkuA z92@|!<>h5S_4f8QP-JRq>d&7)^Yin8l7K8gED$&_FaV?gY+wLjpoW%~7NDe=nHfMG z5DO3j{R9kv5GbssrUpO)OyvVrlx>u0UKD0i;Dpm5S5dY16(DL5l{ixz|mhJU@&-OWCTb7_%}8-fE(P~+XIRO zJU|wp1|S>|J3KrLcz^+v1f&BDpd>&MAaibR4#5A_4(MucZwG9E1h4@u0P@C8;oo+g zIVj7kfJi{oV~E(NZ*h(@^-(Q(C`Psb3KZ{N;^GB(a8NE*Vwc715!9 zr-H4Ao|T_c6+VT_JH9H+P3>iXSt!a$F`>s`jn`w9GZ_~B!{0soaiV|O_c^R2aWa%}O3jUE)WO=pa zs~_Wz08z|ieY5A%$@FcBF9^!1a}m5ks@7gjn;67N>}S~Hrm`4sM5Hh`q7&5-N{|31 z6x1{ol7BnskoViZ0GqbLa#kW`Z)VCjt1MysKg|rT zi!?s##Ck>8c zpi|>$lGlw#@yMNi&V4`6OBGJ(H&7lqLlcTQ&1zWriG_fL>BnFcr~?;E93{M-xIozQ zO=EHQ#+?<}%@wbWWv23#!V70h9MOuUVaU>3kpTvYfc|LBw?&b*89~Gc9i&8tlT#kF ztpbZoAzkdB+UTy=tx%L3Z4)I{zY(Kb)eg{InobSJmNwPZt$14aS-uc4eKuY8h$dtfyxu^a%zA)>fYI&)@ZXky?^{5>xSC?;w4r&td6vBdi%vHm4=XJH!3yL3?Ep+T5aU_>i;yr_XGq zxZfCzUU@GvnoIk+_Nd`aky>S&H!b*{A%L>?*XPAgWL(Vf(k7qUS}>Zn=U(ZfcOc{B z3*tOHH@t5Ub5D~#N7!Fxx}P2)sy{vE_l(R7$aW&CX>c|&HY+7};vUIietK%}!phrCuh+;C@1usp;XLU<8Gq8P!rEI3ieg#W$!= zQcZr{hp>8sF?k&Yl0?B84OneiQxef-4TEFrq3O~JAZR}yEJHA|Xkqd49tR&8oq{zP zY@>J^HBV*(gJvJZc_0VFN7Sx?H7#75E3#?N8Z!C+_f53YU}pyggxx1?wQi5Yb-_`I`_V*SMx5+*P^b=ec5RON-k1cIlsBLk}(HiaJyab0`CI zo0{=1_LO$~oE2%Tl_}KURuX<`+mQN_sTdM&* zkFf!Xtl^e^gTy6ON=&gTn6)$JHQq2)33R@_!#9?BLNq-Wi{U|rVX7Vny$l6#+SZ@KvQt@VYb%<9JfapI^b9j=wa+Tqb4ei;8c5 z&1>Uz@lVFv6T4Z*YU$r4G`g=91lSeA<=GRZ!*KTWKDPR}NPUW%peCUj`Ix_LDq!8| zMH-V`Pv!a~QkTL||L@cqiTz)*G-0=ytr1KqTuFPan9y4gYD5>PleK`NZB$ev@W%t= zkp)_=lBUTLZJpAtZg;pjI;7r2y|26-N7&a(hX|`1YNM9N8{>8JAuv}hp1v`3JHT-=5lbXpbMq7X~2J5Kl zh7tyU`_AusMFZ{ej9D;Uyy;SQ!4nwgSnngsYBwdS&EO3NS*o04)*juAYl;57c2Ly0(DEZ8IY?zSph-kyxu+D`tt@oU{32J#I{vmy=#0ySPK zA+i(A3yl)qmTz*$dZi#y9FS;$;h%bY+;StNx{_R56Otq+?pGe^T^{5d7Gs&?`_r`8 zD&dzOA|j8@3A&FR5U3*eQNBf<4^4W_iS_()*8b4aaUzfk2 zzIcMWSEjm;EPZPk{j{1>oXd}pXAj!NaRm8{Sjz!D=~q3WJ@vmt6ND_?HI~|wUS1j5 z9!S1MKr7%nxoJ3k`GB^7yV~*{n~O~n6($~x5Bu{7s|JyXbAyKI4+tO(zZYMslK;Zc zzeHGVl{`iP@jfSKq>R;{+djJ9n%$%EL()Uw+sykjNQdflkJZSjqV_QDWivbZS~S{K zkE@T^Jcv)Dfm93!mf$XYnCT--_A$zo9MOkPB6&diM8MwOfV?+ApNv`moV@nqn>&lv zYbN1-M|jc~sG|yLN^1R2=`+1ih3jCshg`iP&mY$GMTcY^W^T`WOCX!{-KHmZ#GiRH zYl{|+KLn5!PCLtBy~9i}`#d^gCDDx$+GQb~uc;V#K3OgbbOG0j5{BRG-si%Bo{@lB zGIt+Ain8^C`!*S0d0OSWVO+Z89}}O8aFTZ>p&k}2gGCV zh#<$gswePFxWGT$4DC^8@84_e*^KT74?7n8!$8cg=sL$OlKr&HMh@Rr5%*Wr!xoOl zo7jItnj-xYgVTX)H1=A2bD(tleEH57#V{xAeW_ezISg5OC zg=k>hOLA^urTH_e6*vSYRqCm$J{xo}-x3@HH;bsHD1Z`Pzvsn}%cvfw%Q(}h`Dgtb z0_J^niUmoCM5$*f)6}}qi(u;cPgxfyeVaaVmOsG<)5`6tzU4wyhF;k|~|x>7-2hXpVBpc5k{L4M`Wbe6Q?tr^*B z`Y*>6*&R#~%JlBIitlZ^qGe3s21~h3U|&k%%jeMM;6!~UH|+0+<5V-_zDqZQN79?n?!Aj!Nj`YMO9?j>uqI9-Tex+nJD z%e0#Yca6(zqGUR|KITa?9x-#C0!JKJHO(+fy@1!B$%ZwJwncQW7vGYv?~!^`#L~Um zOL++>4qmqW`0Chc0T23G8|vO)tK=Z2`gvS4*qpqhIJCEv9i&&$09VO8YOz|oZ+ubd zNXVdLc&p=KsSgtmIPLN69P7xYkYQ1vJ?u1g)T!6Ru`k2wkdj*wDC)VryGu2=yb0?F z>q~~e>KZ0d_#7f3UgV%9MY1}vMgF{B8yfE{HL*pMyhYF)WDZ^^3vS8F zGlOhs%g_~pS3=WQ#494@jAXwOtr^Y|TnQ5zki>qRG)(oPY*f}U_=ip_{qB0!%w7~G zWE!P4p3khyW-JJnE>eECuYfI?^d366Shq!Wm#x&jAo>=HdCllE$>DPO0N;y#4G)D2y#B@5=N=+F%Xo2n{gKcPcK2!hP*^WSXl+ut; zyLvVoY>VL{H%Kd9^i~lsb8j4>$EllrparEOJNT?Ym>vJa$(P^tOG)5aVb_5w^*&M0 zYOJ`I`}9}UoSnYg#E(&yyK(tqr^@n}qU2H2DhkK-`2He% zgXr_4kpXoQHxAO9S`wEdmqGU4j=1JdG!OixdqB4PPP6RXA}>GM zumruUUH|ZG2$bBj)Qluj&uB=dRb)?^qomw?Z$X%#D+Q*O97eHrgVB2*mR$bFBU`*} zIem?dM)i}raTFDn@5^caxE^XFXVhBePmH9fqcTi`TLaXiueH=@06sl}>F%}h9H_e9 z>^O?LxM1EjX}NVppaO@NNQr=AtHcH-BU{yBT_vejJ#J)l^cl69Z7$sk`82Zyw7Wxt z=~J?hZm{f@W}|96FUJfy65Gk8?^{^yjhOahUMCNNpt5DJw}ZKH7b!bGiFY9y6OY&T z_N)?Jj(MuLTN36ZCJ6I5Xy7uVlrb$o*Z%=-)kPo9s?<^Yqz~!Z* z_mP8(unFq65XSi!$@YtieSQ!<7IEOaA9VkKI?lA`*(nURvfKL8cX}-+~uw9|_5)uC2`ZHcaeX7L8aG6Ghleg@F9aG%X$#g6^yP5apnB>YTz&EfS{q z9UVfSyEIczebC)qlVu5cOoMzS_jrC|)rQlAzK7sfiW0`M8mVIohazPE9Jzn*qPt%6 zZL8RELY@L09B83@Be;x5V-IHnn$}{RAT#<2JA%ttlk#^(%u}CGze|1JY5MPhbfnYG zIw%$XfBmA-<_pKLpGKwbRF$#P;@_)ech#>vj25sv25VM$ouo)?BXdRcO{)*OwTw)G zv43W~T6ekBMtUD%5Bm>`^Ltv!w4~65N!Ut5twl!Agrzyq4O2Fi3pUMtCU~>9gt_=h-f% z;1&OuSu?A_sJvIvQ+dZNo3?m1%b1+s&UAx?8sUHEe_sB7zkm4R%6)<@oYB_i5>3Ip zIA+?jVdX|zL{)?TGpx+=Ta>G80}0}Ax+722$XFNJsC1gcH56{8B)*)eU#r~HrC&}` z|EWW92&;6y;3}!L5zXa385@?-D%>dSvyK;?jqU2t_R3wvBW;$!j45uQ7tyEIQva;Db}r&bR3kqNSh)Q_$MJ#Uj3Gj1F;)sO|%6z#@<+ zi{pbYsYS#u`X$Nf($OS+lhw>xgjos1OnF^$-I$u;qhJswhH~p|ab*nO>zBrtb0ndn zxV0uh!LN`&xckTP+JW}gznSpU492)u+`f{9Yr)js`NmfYH#Wdtradc0TnKNz@Su!e zu$9}G_=ku;%4xk}eXl>)KgpuT>_<`Ud(A^a++K&pm3LbN;gI}ku@YVrA%FJBZ5$;m zobR8}OLtW4-i+qPPLS-(7<>M{)rhiPoi@?&vDeVq5%fmZk=mDdRV>Pb-l7pP1y6|J z8I>sF+TypKV=_^NwBU^>4JJq<*14GLfM2*XQzYdlqqjnE)gZsPW^E@mp&ww* zW9i>XL=uwLVZ9pO*8K>t>vdL~Ek_NUL$?LQi5sc#1Q-f6-ywKcIT8Kw?C(_3pbR`e|)%9S-({if|E+hR2W!&qfQ&UiF^I!|M#xhdWsenv^wpKCBiuxXbnp85`{i|;BM?Ba`lqTA zyRm=UWJl&E{8JzYDHFu>*Z10-?#A8D|5jW9Ho0*CAs0fAy~MqbwYuOq9jjt9*nuHI zbDwKvh)5Ir$r!fS5|;?Dt>V+@F*v8=TJJF)TdnC#Mk>+tGDGCw;A~^PC`gUt*<(|i zB{{g{`uFehu`$fm4)&k7`u{xIV)yvA(%5SxX9MS80p2EKnLtCZ>tlX>*Z6nd&6-Mv$5rHD*db;&IBK3KH&M<+ArlGXDRdX1VVO4)&R$f4NxXI>GBh zSv|h>5GDAI(4E`@F?EnW zS>#c&Gw6~_XL`qQG4bK`W*>hek4LX*efn6|_MY+rXkNyAuu?NxS%L7~9tD3cn7&p( zCtfqe6sjB&Q-Vs7BP5+%;#Gk};4xtwU!KY0XXbmkUy$kR9)!~?*v)qw00!+Yg^#H> zc#8*z6zZo>+(bud?K<*!QO4ehiTCK&PD4G&n)Tr9X_3r-we z?fI+}-G~Yn93gI6F{}Dw_SC*FLZ)5(85zp4%uubtD)J)UELLkvGk4#tw&Tussa)mTD$R2&O~{ zCI3>fr-!-b@EGRI%g0L8UU%%u_<;e9439JNV;4KSxd|78v+I+8^rmMf3f40Jb}wEszROD?xBZu>Ll3;sUIoNxDK3|j3*sam2tC@@e$ z^!;+AK>efeBJB%ALsQ{uFui)oDoq()2USi?n=6C3#eetz?wPswc={I<8x=(8lE4EIsUfyGNZ{|KYn1IR|=E==f z(;!A5(-2y^2xRFCSPqzHAZn5RCN_bp22T(KEtjA(rFZ%>a4@STrHZflxKoqe9Z4@^ zM*scx_y73?Q{vt6?~WEl?2q*;@8 z3M*&@%l)SQmXkcUm)d@GT2#JdzhfSAP9|n#C;$E8X|pwD!r#X?0P>0ZisQ~TNqupW z*lUY~+ikD`vQb?@SAWX#r*Y+;=_|oacL$2CL$^(mV}aKO77pg}O+-=T1oLBT5sL2i z42Qth2+0@C`c+*D0*5!qy26sis<9a7>LN2{z%Qj49t z=L@x`4$ALHb*3COHoT?5S_c(Hs}g!V>W^=6Q0}zaubkDn)(lTax0+!+%B}9Vqw6{H zvL|BRM`O<@;eVi1DzM!tXtBrA20Ce@^Jz|>%X-t`vi-%WweXCh_LhI#bUg2*pcP~R z*RuTUzBKLXO~~uMd&o$v3@d0shHfUjC6c539PE6rF&;Ufa(Rw@K1*m7?f5)t`MjH0 z)_V(cajV5Am>f!kWcI@5rE8t6$S>5M=k=aRZROH6fA^jJp~2NlR4;Q2>L$7F#RT#9 z>4@1RhWG`Khy>P2j1Yx^BBL{S`niMaxlSWV-JBU0-T9zZ%>7mR3l$~QV$({o0;jTI ze5=cN^!Bc2bT|BcojXp~K#2cM>OTe*cM{Kg-j*CkiW)EGQot^}s;cy8_1_@JA0Whq zlrNr+R;Efa+`6N)s5rH*|E)nYZ3uqkk2C(E7@A|3YI`ozP~9Lexx#*1(r8luq+YPk z{J}c$s` zPM35Fx(YWB3Z5IYnN+L_4|jaR(5iWJi2~l&xy}aU7kW?o-V*6Av2wyZTG!E2KSW2* zGRLQkQU;Oz##ie-Z4fI)WSRxn$(ZcD;TL+;^r=a4(G~H3ZhK$lSXZj?cvyY8%d9JM zzc3#pD^W_QnWy#rx#;c&N@sqHhrnHRmj#i;s%zLm6SE(n&BWpd&f7>XnjV}OlZntI70fq%8~9<7 zMYaw`E-rp49-oC1N_uZTo)Cu%RR2QWdHpzQIcNsoDp`3xfP+`gI?tVQZ4X={qU?(n zV>0ASES^Xuc;9JBji{)RnFL(Lez;8XbB1uWaMp@p?7xhXk6V#!6B@aP4Rz7-K%a>i z?fvf}va_DGUXlI#4--`A3qK7J?-HwnG7O~H2;zR~RLW)_^#La!=}+>KW#anZ{|^D3 B7G?kd literal 0 HcmV?d00001 diff --git a/float-no-zero/resources/bootstrap/img/glyphicons-halflings.png b/float-no-zero/resources/bootstrap/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 zcma*OWmH^Ivn@*S;K3nSf_t!#;0f+&pm7Po8`nk}2q8f5;M%x$SdAkd9FAvlc$ zx660V9e3Ox@4WZ^?7jZ%QFGU-T~%||Ug4iK6bbQY@zBuF2$hxOw9wF=A)nUSxR_5@ zEX>HBryGrjyuOFFv$Y4<+|3H@gQfEqD<)+}a~mryD|1U9*I_FOG&F%+Ww{SJ-V2BR zjt<81Ek$}Yb*95D4RS0HCps|uLyovt;P05hchQb-u2bzLtmog&f2}1VlNhxXV);S9 zM2buBg~!q9PtF)&KGRgf3#z7B(hm5WlNClaCWFs!-P!4-u*u5+=+D|ZE9e`KvhTHT zJBnLwGM%!u&vlE%1ytJ=!xt~y_YkFLQb6bS!E+s8l7PiPGSt9xrmg?LV&&SL?J~cI zS(e9TF1?SGyh+M_p@o1dyWu7o7_6p;N6hO!;4~ z2B`I;y`;$ZdtBpvK5%oQ^p4eR2L)BH>B$FQeC*t)c`L71gXHPUa|vyu`Bnz)H$ZcXGve(}XvR!+*8a>BLV;+ryG1kt0=)ytl zNJxFUN{V7P?#|Cp85QTa@(*Q3%K-R(Pkv1N8YU*(d(Y}9?PQ(j;NzWoEVWRD-~H$=f>j9~PN^BM2okI(gY-&_&BCV6RP&I$FnSEM3d=0fCxbxA6~l>54-upTrw zYgX@%m>jsSGi`0cQt6b8cX~+02IghVlNblR7eI;0ps}mpWUcxty1yG56C5rh%ep(X z?)#2d?C<4t-KLc*EAn>>M8%HvC1TyBSoPNg(4id~H8JwO#I)Bf;N*y6ai6K9_bA`4 z_g9(-R;qyH&6I$`b42v|0V3Z8IXN*p*8g$gE98+JpXNY+jXxU0zsR^W$#V=KP z3AEFp@OL}WqwOfsV<)A^UTF4&HF1vQecz?LWE@p^Z2){=KEC_3Iopx_eS42>DeiDG zWMXGbYfG~W7C8s@@m<_?#Gqk;!&)_Key@^0xJxrJahv{B&{^!>TV7TEDZlP|$=ZCz zmX=ZWtt4QZKx**)lQQoW8y-XLiOQy#T`2t}p6l*S`68ojyH@UXJ-b~@tN`WpjF z%7%Yzv807gsO!v=!(2uR)16!&U5~VPrPHtGzUU?2w(b1Xchq}(5Ed^G|SD7IG+kvgyVksU) z(0R)SW1V(>&q2nM%Z!C9=;pTg!(8pPSc%H01urXmQI6Gi^dkYCYfu6b4^tW))b^U+ z$2K&iOgN_OU7n#GC2jgiXU{caO5hZt0(>k+c^(r><#m|#J^s?zA6pi;^#*rp&;aqL zRcZi0Q4HhVX3$ybclxo4FFJW*`IV`)Bj_L3rQe?5{wLJh168Ve1jZv+f1D}f0S$N= zm4i|9cEWz&C9~ZI3q*gwWH^<6sBWuphgy@S3Qy?MJiL>gwd|E<2h9-$3;gT9V~S6r z)cAcmE0KXOwDA5eJ02-75d~f?3;n7a9d_xPBJaO;Z)#@s7gk5$Qn(Fc^w@9c5W0zY z59is0?Mt^@Rolcn{4%)Ioat(kxQH6}hIykSA)zht=9F_W*D#<}N(k&&;k;&gKkWIL z0Of*sP=X(Uyu$Pw;?F@?j{}=>{aSHFcii#78FC^6JGrg-)!)MV4AKz>pXnhVgTgx8 z1&5Y=>|8RGA6++FrSy=__k_imx|z-EI@foKi>tK0Hq2LetjUotCgk2QFXaej!BWYL zJc{fv(&qA7UUJ|AXLc5z*_NW#yWzKtl(c8mEW{A>5Hj^gfZ^HC9lQNQ?RowXjmuCj4!!54Us1=hY z0{@-phvC}yls!PmA~_z>Y&n&IW9FQcj}9(OLO-t^NN$c0o}YksCUWt|DV(MJB%%Sr zdf}8!9ylU2TW!=T{?)g-ojAMKc>3pW;KiZ7f0;&g)k}K^#HBhE5ot)%oxq$*$W@b# zg4p<Ou`ME|Kd1WHK@8 zzLD+0(NHWa`B{em3Ye?@aVsEi>y#0XVZfaFuq#;X5C3{*ikRx7UY4FF{ZtNHNO?A_ z#Q?hwRv~D8fPEc%B5E-ZMI&TAmikl||EERumQCRh7p;)>fdZMxvKq;ky0}7IjhJph zW*uuu*(Y6)S;Od--8uR^R#sb$cmFCnPcj9PPCWhPN;n`i1Q#Qn>ii z{WR|0>8F`vf&#E(c2NsoH=I7Cd-FV|%(7a`i}gZw4N~QFFG2WtS^H%@c?%9UZ+kez z;PwGgg_r6V>Kn5n(nZ40P4qMyrCP3bDkJp@hp6&X3>gzC>=f@Hsen<%I~7W+x@}b> z0}Et*vx_50-q@PIV=(3&Tbm}}QRo*FP2@)A#XX-8jYspIhah`9ukPBr)$8>Tmtg&R z?JBoH17?+1@Y@r>anoKPQ}F8o9?vhcG79Cjv^V6ct709VOQwg{c0Q#rBSsSmK3Q;O zBpNihl3S0_IGVE)^`#94#j~$;7+u870yWiV$@={|GrBmuz4b)*bCOPkaN0{6$MvazOEBxFdKZDlbVvv{8_*kJ zfE6C`4&Kkz<5u%dEdStd85-5UHG5IOWbo8i9azgg#zw-(P1AA049hddAB*UdG3Vn0 zX`OgM+EM|<+KhJ<=k?z~WA5waVj?T9eBdfJGebVifBKS1u<$#vl^BvSg)xsnT5Aw_ZY#}v*LXO#htB>f}x3qDdDHoFeb zAq7;0CW;XJ`d&G*9V)@H&739DpfWYzdQt+Kx_E1K#Cg1EMtFa8eQRk_JuUdHD*2;W zR~XFnl!L2A?48O;_iqCVr1oxEXvOIiN_9CUVTZs3C~P+11}ebyTRLACiJuMIG#`xP zKlC|E(S@QvN+%pBc6vPiQS8KgQAUh75C0a2xcPQDD$}*bM&z~g8+=9ltmkT$;c;s z5_=8%i0H^fEAOQbHXf0;?DN5z-5+1 zDxj50yYkz4ox9p$HbZ|H?8ukAbLE^P$@h}L%i6QVcY>)i!w=hkv2zvrduut%!8>6b zcus3bh1w~L804EZ*s96?GB&F7c5?m?|t$-tp2rKMy>F*=4;w*jW}^;8v`st&8)c; z2Ct2{)?S(Z;@_mjAEjb8x=qAQvx=}S6l9?~H?PmP`-xu;ME*B8sm|!h@BX4>u(xg_ zIHmQzp4Tgf*J}Y=8STR5_s)GKcmgV!$JKTg@LO402{{Wrg>#D4-L%vjmtJ4r?p&$F!o-BOf7ej~ z6)BuK^^g1b#(E>$s`t3i13{6-mmSp7{;QkeG5v}GAN&lM2lQT$@(aQCcFP(%UyZbF z#$HLTqGT^@F#A29b0HqiJsRJAlh8kngU`BDI6 zJUE~&!cQ*&f95Ot$#mxU5+*^$qg_DWNdfu+1irglB7yDglzH()2!@#rpu)^3S8weW z_FE$=j^GTY*|5SH95O8o8W9FluYwB=2PwtbW|JG6kcV^dMVmX(wG+Otj;E$%gfu^K z!t~<3??8=()WQSycsBKy24>NjRtuZ>zxJIED;YXaUz$@0z4rl+TW zWxmvM$%4jYIpO>j5k1t1&}1VKM~s!eLsCVQ`TTjn3JRXZD~>GM z$-IT~(Y)flNqDkC%DfbxaV9?QuWCV&-U1yzrV@0jRhE;)ZO0=r-{s@W?HOFbRHDDV zq;eLo+wOW;nI|#mNf(J?RImB9{YSO2Y`9825Lz#u4(nk3)RGv3X8B(A$TsontJ8L! z9JP^eWxtKC?G8^xAZa1HECx*rp35s!^%;&@Jyk)NexVc)@U4$^X1Dag6`WKs|(HhZ#rzO2KEw3xh~-0<;|zcs0L>OcO#YYX{SN8m6`9pp+ zQG@q$I)T?aoe#AoR@%om_#z=c@ych!bj~lV13Qi-xg$i$hXEAB#l=t7QWENGbma4L zbBf*X*4oNYZUd_;1{Ln_ZeAwQv4z?n9$eoxJeI?lU9^!AB2Y~AwOSq67dT9ADZ)s@ zCRYS7W$Zpkdx$3T>7$I%3EI2ik~m!f7&$Djpt6kZqDWZJ-G{*_eXs*B8$1R4+I}Kf zqniwCI64r;>h2Lu{0c(#Atn)%E8&)=0S4BMhq9$`vu|Ct;^ur~gL`bD>J@l)P$q_A zO7b3HGOUG`vgH{}&&AgrFy%K^>? z>wf**coZ2vdSDcNYSm~dZ(vk6&m6bVKmVgrx-X<>{QzA!)2*L+HLTQz$e8UcB&Djq zl)-%s$ZtUN-R!4ZiG=L0#_P=BbUyH+YPmFl_ogkkQ$=s@T1v}rNnZ^eMaqJ|quc+6 z*ygceDOrldsL30w`H;rNu+IjlS+G~p&0SawXCA1+D zC%cZtjUkLNq%FadtHE?O(yQTP486A{1x<{krq#rpauNQaeyhM3*i0%tBpQHQo-u)x z{0{&KS`>}vf2_}b160XZO2$b)cyrHq7ZSeiSbRvaxnKUH{Q`-P(nL&^fcF2){vhN- zbX&WEjP7?b4A%0y6n_=m%l00uZ+}mCYO(!x?j$+O$*TqoD_Q5EoyDJ?w?^UIa491H zE}87(bR`X;@u#3Qy~9wWdWQIg1`cXrk$x9=ccR|RY1~%{fAJ@uq@J3e872x0v$hmv ze_KcL(wM|n0EOp;t{hKoohYyDmYO;!`7^Lx;0k=PWPGZpI>V5qYlzjSL_(%|mud50 z7#{p97s`U|Sn$WYF>-i{i4`kzlrV6a<}=72q2sAT7Zh{>P%*6B;Zl;~0xWymt10Mo zl5{bmR(wJefJpNGK=fSRP|mpCI-)Nf6?Pv==FcFmpSwF1%CTOucV{yqxSyx4Zws3O z8hr5Uyd%ezIO7?PnEO0T%af#KOiXD$e?V&OX-B|ZX-YsgSs%sv-6U+sLPuz{D4bq| zpd&|o5tNCmpT>(uIbRf?8c}d3IpOb3sn6>_dr*26R#ev<_~vi)wleW$PX|5)$_ z+_|=pi(0D(AB_sjQ;sQQSM&AWqzDO1@NHw;C9cPdXRKRI#@nUW)CgFxzQ1nyd!+h& zcjU!U=&u|>@}R(9D$%lu2TlV>@I2-n@fCr5PrZNVyKWR7hm zWjoy^p7v8m#$qN0K#8jT- zq`mSirDZDa1Jxm;Rg3rAPhC)LcI4@-RvKT+@9&KsR3b0_0zuM!Fg7u>oF>3bzOxZPU&$ab$Z9@ zY)f7pKh22I7ZykL{YsdjcqeN++=0a}elQM-4;Q)(`Ep3|VFHqnXOh14`!Bus& z9w%*EWK6AiAM{s$6~SEQS;A>ey$#`7)khZvamem{P?>k)5&7Sl&&NXKk}o!%vd;-! zpo2p-_h^b$DNBO>{h4JdGB=D>fvGIYN8v&XsfxU~VaefL?q} z3ekM?iOKkCzQHkBkhg=hD!@&(L}FcHKoa zbZ7)H1C|lHjwEb@tu=n^OvdHOo7o+W`0-y3KdP#bb~wM=Vr_gyoEq|#B?$&d$tals ziIs-&7isBpvS|CjC|7C&3I0SE?~`a%g~$PI%;au^cUp@ER3?mn-|vyu!$7MV6(uvt z+CcGuM(Ku2&G0tcRCo7#D$Dirfqef2qPOE5I)oCGzmR5G!o#Q~(k~)c=LpIfrhHQk zeAva6MilEifE7rgP1M7AyWmLOXK}i8?=z2;N=no)`IGm#y%aGE>-FN zyXCp0Sln{IsfOBuCdE*#@CQof%jzuU*jkR*Su3?5t}F(#g0BD0Zzu|1MDes8U7f9; z$JBg|mqTXt`muZ8=Z`3wx$uizZG_7>GI7tcfOHW`C2bKxNOR)XAwRkLOaHS4xwlH4 zDpU29#6wLXI;H?0Se`SRa&I_QmI{zo7p%uveBZ0KZKd9H6@U?YGArbfm)D*^5=&Rp z`k{35?Z5GbZnv>z@NmJ%+sx=1WanWg)8r}C_>EGR8mk(NR$pW<-l8OTU^_u3M@gwS z7}GGa1)`z5G|DZirw;FB@VhH7Dq*0qc=|9lLe{w2#`g+_nt>_%o<~9(VZe=zI*SSz4w43-_o>4E4`M@NPKTWZuQJs)?KXbWp1M zimd5F;?AP(LWcaI-^Sl{`~>tmxsQB9Y$Xi*{Zr#py_+I$vx7@NY`S?HFfS!hUiz$a z{>!&e1(16T!Om)m)&k1W#*d#GslD^4!TwiF2WjFBvi=Ms!ADT)ArEW6zfVuIXcXVk z>AHjPADW+mJzY`_Ieq(s?jbk4iD2Rb8*V3t6?I+E06(K8H!!xnDzO%GB;Z$N-{M|B zeT`jo%9)s%op*XZKDd6*)-^lWO{#RaIGFdBH+;XXjI(8RxpBc~azG1H^2v7c^bkFE zZCVPE+E*Q=FSe8Vm&6|^3ki{9~qafiMAf7i4APZg>b%&5>nT@pHH z%O*pOv(77?ZiT{W zBibx}Q12tRc7Py1NcZTp`Q4ey%T_nj@1WKg5Fz_Rjl4wlJQj)rtp8yL3r!Shy zvZvnmh!tH4T6Js-?vI0<-rzzl{mgT*S0d_7^AU_8gBg^03o-J=p(1o6kww2hx|!%T z-jqp}m^G*W?$!R#M%Ef?&2jYxmx+lXWZszpI4d$pUN`(S)|*c^CgdwY>Fa>> zgGBJhwe8y#Xd*q0=@SLEgPF>+Qe4?%E*v{a`||luZ~&dqMBrRfJ{SDMaJ!s_;cSJp zSqZHXIdc@@XteNySUZs^9SG7xK`8=NBNM)fRVOjw)D^)w%L2OPkTQ$Tel-J)GD3=YXy+F4in(ILy*A3m@3o73uv?JC}Q>f zrY&8SWmesiba0|3X-jmlMT3 z*ST|_U@O=i*sM_*48G)dgXqlwoFp5G6qSM3&%_f_*n!PiT>?cNI)fAUkA{qWnqdMi+aNK_yVQ&lx4UZknAc9FIzVk% zo6JmFH~c{_tK!gt4+o2>)zoP{sR}!!vfRjI=13!z5}ijMFQ4a4?QIg-BE4T6!#%?d&L;`j5=a`4is>U;%@Rd~ zXC~H7eGQhhYWhMPWf9znDbYIgwud(6$W3e>$W4$~d%qoJ z+JE`1g$qJ%>b|z*xCKenmpV$0pM=Gl-Y*LT8K+P)2X#;XYEFF4mRbc~jj?DM@(1e`nL=F4Syv)TKIePQUz)bZ?Bi3@G@HO$Aps1DvDGkYF50O$_welu^cL7;vPiMGho74$;4fDqKbE{U zd1h{;LfM#Fb|Z&uH~Rm_J)R~Vy4b;1?tW_A)Iz#S_=F|~pISaVkCnQ0&u%Yz%o#|! zS-TSg87LUfFSs{tTuM3$!06ZzH&MFtG)X-l7>3)V?Txuj2HyG*5u;EY2_5vU0ujA? zHXh5G%6e3y7v?AjhyX79pnRBVr}RmPmtrxoB7lkxEzChX^(vKd+sLh?SBic=Q)5nA zdz7Mw3_iA>;T^_Kl~?1|5t%GZ;ki_+i>Q~Q1EVdKZ)$Sh3LM@ea&D~{2HOG++7*wF zAC6jW4>fa~!Vp5+$Z{<)Qxb|{unMgCv2)@%3j=7)Zc%U<^i|SAF88s!A^+Xs!OASYT%7;Jx?olg_6NFP1475N z#0s<@E~FI}#LNQ{?B1;t+N$2k*`K$Hxb%#8tRQi*Z#No0J}Pl;HWb){l7{A8(pu#@ zfE-OTvEreoz1+p`9sUI%Y{e5L-oTP_^NkgpYhZjp&ykinnW;(fu1;ttpSsgYM8ABX4dHe_HxU+%M(D=~) zYM}XUJ5guZ;=_ZcOsC`_{CiU$zN3$+x&5C`vX-V3`8&RjlBs^rf00MNYZW+jCd~7N z%{jJuUUwY(M`8$`B>K&_48!Li682ZaRknMgQ3~dnlp8C?__!P2z@=Auv;T^$yrsNy zCARmaA@^Yo2sS%2$`031-+h9KMZsIHfB>s@}>Y(z988e!`%4=EDoAQ0kbk>+lCoK60Mx9P!~I zlq~wf7kcm_NFImt3ZYlE(b3O1K^QWiFb$V^a2Jlwvm(!XYx<`i@ZMS3UwFt{;x+-v zhx{m=m;4dgvkKp5{*lfSN3o^keSpp9{hlXj%=}e_7Ou{Yiw(J@NXuh*;pL6@$HsfB zh?v+r^cp@jQ4EspC#RqpwPY(}_SS$wZ{S959`C25777&sgtNh%XTCo9VHJC-G z;;wi9{-iv+ETiY;K9qvlEc04f;ZnUP>cUL_T*ms``EtGoP^B#Q>n2dSrbAg8a>*Lg zd0EJ^=tdW~7fbcLFsqryFEcy*-8!?;n%;F+8i{eZyCDaiYxghr z$8k>L|2&-!lhvuVdk!r-kpSFl`5F5d4DJr%M4-qOy3gdmQbqF1=aBtRM7)c_Ae?$b8 zQg4c8*KQ{XJmL)1c7#0Yn0#PTMEs4-IHPjkn0!=;JdhMXqzMLeh`yOylXROP- zl#z3+fwM9l3%VN(6R77ua*uI9%hO7l7{+Hcbr(peh;afUK?B4EC09J{-u{mv)+u#? zdKVBCPt`eU@IzL)OXA`Ebu`Xp?u0m%h&X41}FNfnJ*g1!1wcbbpo%F4x!-#R9ft!8{5`Ho}04?FI#Kg zL|k`tF1t_`ywdy8(wnTut>HND(qNnq%Sq=AvvZbXnLx|mJhi!*&lwG2g|edBdVgLy zjvVTKHAx(+&P;P#2Xobo7_RttUi)Nllc}}hX>|N?-u5g7VJ-NNdwYcaOG?NK=5)}` zMtOL;o|i0mSKm(UI_7BL_^6HnVOTkuPI6y@ZLR(H?c1cr-_ouSLp{5!bx^DiKd*Yb z{K78Ci&Twup zTKm)ioN|wcYy%Qnwb)IzbH>W!;Ah5Zdm_jRY`+VRJ2 zhkspZ9hbK3iQD91A$d!0*-1i#%x81|s+SPRmD}d~<1p6!A13(!vABP2kNgqEG z?AMgl^P+iRoIY(9@_I?n1829lGvAsRnHwS~|5vD2+Zi53j<5N4wNn0{q>>jF9*bI) zL$kMXM-awNOElF>{?Jr^tOz1glbwaD-M0OKOlTeW3C!1ZyxRbB>8JDof(O&R1bh%3x#>y2~<>OXO#IIedH0Q`(&&?eo-c~ z>*Ah#3~09unym~UC-UFqqI>{dmUD$Y4@evG#ORLI*{ZM)Jl=e1it!XzY($S3V zLG!Y6fCjE>x6r@5FG1n|8ompSZaJ>9)q6jqU;XxCQk9zV(?C9+i*>w z21+KYt1gXX&0`x3E)hS7I5}snbBzox9C@Xzcr|{B8Hw;SY1$}&BoYKXH^hpjW-RgJ z-Fb}tannKCv>y~^`r|(1Q9;+sZlYf3XPSX|^gR01UFtu$B*R;$sPZdIZShRr>|b@J z;#G{EdoY+O;REEjQ}X7_YzWLO+Ey3>a_KDe1CjSe| z6arqcEZ)CX!8r(si`dqbF$uu&pnf^Np{1f*TdJ`r2;@SaZ z#hb4xlaCA@Pwqj#LlUEe5L{I$k(Zj$d3(~)u(F%&xb8={N9hKxlZIO1ABsM{Mt|)2 zJ^t9Id;?%4PfR4&Ph9B9cFK~@tG3wlFW-0fXZS_L4U*EiAA%+`h%q2^6BCC;t0iO4V=s4Qug{M|iDV@s zC7|ef-dxiR7T&Mpre!%hiUhHM%3Qxi$Lzw6&(Tvlx9QA_7LhYq<(o~=Y>3ka-zrQa zhGpfFK@)#)rtfz61w35^sN1=IFw&Oc!Nah+8@qhJ0UEGr;JplaxOGI82OVqZHsqfX ze1}r{jy;G?&}Da}a7>SCDsFDuzuseeCKof|Dz2BPsP8? zY;a)Tkr2P~0^2BeO?wnzF_Ul-ekY=-w26VnU%U3f19Z-pj&2 z4J_a|o4Dci+MO)mPQIM>kdPG1xydiR9@#8m zh27D7GF{p|a{8({Q-Pr-;#jV{2zHR>lGoFtIfIpoMo?exuQyX_A;;l0AP4!)JEM$EwMInZkj+8*IHP4vKRd zKx_l-i*>A*C@{u%ct`y~s6MWAfO{@FPIX&sg8H{GMDc{4M3%$@c8&RAlw0-R<4DO3 trJqdc$mBpWeznn?E0M$F`|3v=`3%T2A17h;rxP7$%JLd=6(2u;`(N3pt&so# literal 0 HcmV?d00001 diff --git a/float-no-zero/resources/bootstrap/js/bootstrap.js b/float-no-zero/resources/bootstrap/js/bootstrap.js new file mode 100644 index 0000000000..c298ee42e3 --- /dev/null +++ b/float-no-zero/resources/bootstrap/js/bootstrap.js @@ -0,0 +1,2276 @@ +/* =================================================== + * bootstrap-transition.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.jQuery);/* ========================================================== + * bootstrap-alert.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery);/* ============================================================ + * bootstrap-button.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.jQuery);/* ========================================================== + * bootstrap-carousel.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.jQuery);/* ============================================================= + * bootstrap-collapse.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.jQuery);/* ============================================================ + * bootstrap-dropdown.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + $parent.toggleClass('open') + } + + $this.focus() + + return false + } + + , keydown: function (e) { + var $this + , $items + , $active + , $parent + , isActive + , index + + if (!/(38|40|27)/.test(e.keyCode)) return + + $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + if (!isActive || (isActive && e.keyCode == 27)) { + if (e.which == 27) $parent.find(toggle).focus() + return $this.click() + } + + $items = $('[role=menu] li:not(.divider):visible a', $parent) + + if (!$items.length) return + + index = $items.index($items.filter(':focus')) + + if (e.keyCode == 38 && index > 0) index-- // up + if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items + .eq(index) + .focus() + } + + } + + function clearMenus() { + $(toggle).each(function () { + getParent($(this)).removeClass('open') + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = selector && $(selector) + + if (!$parent || !$parent.length) $parent = $this.parent() + + return $parent + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.dropdown + + $.fn.dropdown = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* DROPDOWN NO CONFLICT + * ==================== */ + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(document) + .on('click.dropdown.data-api', clearMenus) + .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.dropdown-menu', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) + .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) + +}(window.jQuery); +/* ========================================================= + * bootstrap-modal.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#modals + * ========================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + this.options.remote && this.$element.find('.modal-body').load(this.options.remote) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element.show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : + that.$element.focus().trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal() + } + + , enforceFocus: function () { + var that = this + $(document).on('focusin.modal', function (e) { + if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { + that.$element.focus() + } + }) + } + + , escape: function () { + var that = this + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + } + + , hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + that.hideModal() + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + that.hideModal() + }) + } + + , hideModal: function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.removeBackdrop() + that.$element.trigger('hidden') + }) + } + + , removeBackdrop: function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + , backdrop: function (callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('